mirror of
https://github.com/tinyhumansai/openhuman.git
synced 2026-07-30 15:03:57 +00:00
67 lines
3.7 KiB
Markdown
67 lines
3.7 KiB
Markdown
# RLM — Language-Based Workflows (Rhai/`.ragsh`) Integration Plan
|
||
|
||
**Goal:** expose TinyAgents' Rhai-backed REPL language (the `.ragsh` / RLM /
|
||
CodeAct surface, gated behind the `repl` cargo feature in
|
||
`vendor/tinyagents/Cargo.toml`) as a **first-class `rlm` tool** in the
|
||
OpenHuman Rust core, so the orchestrator agent can *write its own workflow
|
||
scripts* — fan-out over subagents, batched tool/model calls, loops,
|
||
conditionals — and execute them deterministically, similar to Claude Code
|
||
Workflows and Recursive Language Models (RLMs).
|
||
|
||
## Why
|
||
|
||
Today the orchestrator composes work through fixed primitives:
|
||
`spawn_subagent`, `spawn_parallel_agents`, `run_workflow` (WORKFLOW.md
|
||
bundles), and typed tinyflows graphs. None of these let the model express
|
||
*ad-hoc control flow* — "spawn N readers, dedupe their findings, verify each
|
||
survivor with 3 refuters, loop until dry". The `.ragsh` session in TinyAgents
|
||
is exactly that surface: a sandboxed, policy-bounded scripting engine whose
|
||
only host access is capability functions (`model_query`, `tool_call`,
|
||
`agent_query`, batched variants), with fail-closed limits on operations,
|
||
wall-clock time, output bytes, call counts, and recursion depth.
|
||
|
||
## Architecture summary
|
||
|
||
```
|
||
Orchestrator model turn
|
||
└─ rlm tool call { script, session_id?, timeout_secs?, limits? }
|
||
└─ src/openhuman/rlm/ (new domain)
|
||
├─ session manager (persistent ReplSession per rlm session_id)
|
||
├─ capability bridge (openhuman Tools/Subagents/Provider →
|
||
│ tinyagents CapabilityRegistry)
|
||
├─ policy mapping (autonomy tier + SecurityPolicy → ReplPolicy)
|
||
├─ progress bridge (ReplCallRecord / EventSink → AgentProgress
|
||
│ + DomainEvent bus)
|
||
└─ tinyagents::ReplSession::eval_cell (spawn_blocking)
|
||
└─ rhai engine — model_query / tool_call / agent_query /
|
||
*_batched / emit / answer (fail-closed ReplPolicy)
|
||
```
|
||
|
||
Two repos change:
|
||
|
||
1. **`vendor/tinyagents`** (submodule, separate PR against
|
||
`tinyhumansai/tinyagents`): host-embedding gaps — external cancellation
|
||
flag, live capability-call events on the `EventSink`, async-embedding
|
||
documentation. Branch: `feat/repl-host-embedding`.
|
||
2. **`openhuman`** (one gigantic PR against `tinyhumansai/openhuman`): the
|
||
`repl` feature flag, the new `src/openhuman/rlm/` domain, the `rlm` tool,
|
||
prompt/docs surfacing, and tests. Branch: `feat/rlm-language-workflows`,
|
||
including the submodule pointer bump once the tinyagents PR lands.
|
||
|
||
## Phases
|
||
|
||
| Phase | File | Deliverable |
|
||
| ----- | ---- | ----------- |
|
||
| 1 | [phase-1-research.md](phase-1-research.md) | Research findings: what tinyagents `repl` provides, what openhuman provides, the gaps |
|
||
| 2 | [phase-2-tinyagents.md](phase-2-tinyagents.md) | TinyAgents-side changes (cancellation, live events) — separate PR |
|
||
| 3 | [phase-3-rlm-domain.md](phase-3-rlm-domain.md) | `src/openhuman/rlm/` domain: sessions, capability bridge, policy |
|
||
| 4 | [phase-4-rlm-tool.md](phase-4-rlm-tool.md) | First-class `rlm` tool: schema, registration, prompt surfacing |
|
||
| 5 | [phase-5-hardening.md](phase-5-hardening.md) | Error handling, timeouts, cancellation, limits, observability |
|
||
| 6 | [phase-6-tests.md](phase-6-tests.md) | Tests (written last): unit, timeout/cancel/limit, RPC E2E |
|
||
| 7 | [phase-7-delivery.md](phase-7-delivery.md) | PR strategy: tinyagents PR + one gigantic openhuman PR |
|
||
|
||
Tests are deliberately the **final implementation phase** (per the feature
|
||
brief): phases 3–5 land the behavior with verbose debug logging; phase 6
|
||
back-fills unit and E2E coverage to the ≥80% changed-line gate before the PR
|
||
is opened.
|