mirror of
https://github.com/tinyhumansai/openhuman.git
synced 2026-07-29 22:14:27 +00:00
70 lines
3.2 KiB
Markdown
70 lines
3.2 KiB
Markdown
# Phase 2 — TinyAgents-side changes (separate PR)
|
|
|
|
Branch: `feat/repl-host-embedding` in `vendor/tinyagents` (repo
|
|
`tinyhumansai/tinyagents`). Raised as its **own PR**; the openhuman PR bumps
|
|
the submodule pointer to the merged commit.
|
|
|
|
Scope is intentionally minimal — only the host-embedding gaps identified in
|
|
Phase 1 that cannot be worked around from openhuman.
|
|
|
|
## 2.1 External cancellation (`ReplCancelFlag`)
|
|
|
|
**Problem:** a running cell can only be stopped by its wall-clock timeout.
|
|
OpenHuman needs to abort an in-flight RLM cell when the user cancels a run
|
|
(`workflows::run_log::cancel_run`) or the agent turn aborts.
|
|
|
|
**Change:** add a shared cancellation flag to the session:
|
|
|
|
- `repl/session/types.rs`: `pub struct ReplCancelFlag(Arc<AtomicBool>)` with
|
|
`new() / cancel(&self) / is_cancelled(&self)`. Cheap `Clone`.
|
|
- `ReplSession::with_cancel_flag(flag)` stores it; `CellBuffers` carries it
|
|
alongside `deadline`.
|
|
- Enforcement mirrors the deadline's two points, fail-closed:
|
|
- the engine `on_progress` hook terminates the script with a
|
|
`CANCELLED_TOKEN` sentinel → mapped to a new
|
|
`TinyAgentsError::Cancelled` in `eval_cell`;
|
|
- `bridge_block_on_raw` polls the flag in its timer race (tick the select
|
|
with a short-interval timer when a flag is armed) so a blocked
|
|
model/tool/agent call is dropped promptly on cancel.
|
|
- New error variant `TinyAgentsError::Cancelled(String)` in `src/error.rs`.
|
|
|
|
## 2.2 Live capability-call events on the `EventSink`
|
|
|
|
**Problem:** `ReplResult.calls` is only available after the cell completes;
|
|
long fan-outs look frozen in the UI.
|
|
|
|
**Change:** in `builtins/`, emit a typed event on `HostContext.events`
|
|
(the existing `EventSink` shared with the run context) at capability-call
|
|
start and completion — `AgentEvent::Custom`-style records carrying
|
|
`{session_id, kind: model|tool|agent|emit, name, elapsed?}`. The host
|
|
(openhuman) subscribes an `EventListener` and forwards to its own progress
|
|
sink. No new public types beyond what the event enum already supports; if
|
|
`AgentEvent` lacks a suitable variant, add `AgentEvent::ReplCall
|
|
{ record: ReplCallRecord, phase: Started|Completed }` behind the `repl`
|
|
feature.
|
|
|
|
## 2.3 Async-embedding documentation
|
|
|
|
Document at the `eval_cell` API surface (rustdoc + module README) that the
|
|
method blocks internally (`futures::executor::block_on`) and must be driven
|
|
via `spawn_blocking`/dedicated thread from async hosts. This is currently
|
|
only discoverable by reading `builtins/mod.rs`.
|
|
|
|
## 2.4 Tests (in tinyagents, alongside the changes)
|
|
|
|
TinyAgents' own convention requires tests with every behavior change, so
|
|
this crate does **not** defer them:
|
|
|
|
- cancel flag set before `eval_cell` → `Cancelled` without starting;
|
|
- cancel mid-script-loop → terminated promptly (`on_progress` path);
|
|
- cancel during a hanging capability future → dropped promptly
|
|
(`bridge_block_on` path);
|
|
- events observed on the `EventSink` for `model_query`/`tool_call` start +
|
|
completion with a `ScriptedModel`/`FakeTool`.
|
|
|
|
## Acceptance
|
|
|
|
`cargo fmt --check && cargo clippy --all-targets -- -D warnings &&
|
|
cargo test --features repl` green in `vendor/tinyagents`; PR opened against
|
|
`tinyhumansai/tinyagents` with the summary + commands run.
|