15 KiB
TinyAgents SDK Gaps
This document lists TinyAgents SDK features that are missing or only partially available from the perspective of migrating OpenHuman's Rust agent core onto TinyAgents.
Scope:
- Original source baseline: local TinyAgents checkout at
6f898fb. - Refresh note: TinyAgents 1.3.0 was re-verified from the published crate source. Several older "missing" items are now shipped in 1.2.0-1.3.0: tool policy metadata, recoverable unknown-tool calls, reasoning/tool-call stream deltas, orchestration task stores, budget reservation/reconciliation, ordered parallel map/reduce, sub-agent steering/task controls, workspace isolation hooks, and middleware control outcomes. The backlog below keeps only the residual OpenHuman migration pressure and SDK surface gaps.
- OpenHuman evidence:
src/openhuman/tinyagents/*,src/openhuman/agent/*,src/openhuman/cost/*, andsrc/openhuman/tokenjuice/*. - This is not the OpenHuman migration plan. That plan lives in
docs/tinyagents-migration-spec.md. - Items here are upstream TinyAgents implementation candidates.
- Tests should follow each migrated surface; only broad end-to-end parity suites should wait for the final cutover.
Executive Summary
TinyAgents already has strong primitives for harness runs, graph execution, middleware, event streams, model profiles, usage/cost accounting, checkpointers, policy metadata, recoverable tool-call behavior, workspace isolation, and sub-agent orchestration. The biggest remaining gaps are now narrower: OpenHuman adapter migration, transcript/session migration, richer replay and redaction rules, model/provider catalog integration, registry diagnostics, and a few still-missing SDK fields.
OpenHuman can migrate more of src/openhuman/agent/ by adopting the newer
TinyAgents surfaces and filling the remaining gaps:
- A free-form metadata map on
ToolSchemafor model-visible schema annotations; SDK-owned enforcement metadata now lives inToolPolicy. - A reasoning field on the middleware-facing
harness::model::ModelDelta;AgentEvent::ModelDeltaalready carries nestedMessageDelta.reasoning. - A one-time migration path from old OpenHuman
session_raw/*.jsonland Markdown transcripts into TinyAgents store/journal/status records. - Production replay rules over TinyAgents stores/status: redaction, cursors, backfill, cancellation, and OpenHuman controller compatibility.
- Storage compatibility options for SQLite users that already own a connection, schema, or native sqlite patch policy.
- A
root_run_idfield on harnessRunConfig; lineage exists in graph and observability records, but not on the harness config itself. - A money/USD field on
Usage; token usage and cost totals remain separate. - Provider/model catalog metadata that can drive preflight, fallback, and reconciliation.
- Conformance suites for providers, tools, middleware, graph stores, and checkpointers.
Backlog
1. Rich Tool Policy Metadata
Status: shipped in 1.3.0; residual schema metadata gap remains.
TinyAgents now has SDK-owned ToolPolicy, ToolSideEffects, ToolRuntime,
ToolAccess, WorkspaceAccess, SandboxMode, Tool::policy, registry policy
snapshots, and ToolPolicyMiddleware. Strict policy can fail closed on
unclassified tools, enforce sandbox and result-byte requirements, and keep plain
ToolSchema as the model-visible projection.
Residual:
ToolSchemastill has no free-form metadata map for model-visible schema annotations or app-specific hints. UseToolPolicyfor enforcement metadata and keep this as the remaining SDK shape gap.- OpenHuman still needs to map domain tool registry metadata into
Tool::policysnapshots before deleting adapter-local policy plumbing.
2. Recoverable Unknown Tool Calls
Status: shipped in 1.3.0.
TinyAgents now has UnknownToolPolicy::{Fail, ReturnToolError, Rewrite} and
emits AgentEvent::UnknownToolCall with the original requested name and
arguments. This distinguishes "tool not found" from "tool executed and failed"
and lets a run keep going so the model can correct itself.
OpenHuman follow-up:
- Replace the adapter-local
__openhuman_unknown_tool__sentinel withUnknownToolPolicyonce the surrounding compatibility surface is migrated.
3. Reasoning And Tool-Argument Streaming
Status: shipped in 1.3.0; residual middleware event-shape gap remains.
TinyAgents MessageDelta now carries provider-neutral text, reasoning, and
tool_call channels, and AgentEvent::ModelDelta carries the delta with an
explicit run_id and call_id.
Residual:
- The middleware-facing
harness::model::ModelDeltastill has noreasoningfield, and the agent loop drops reasoning when converting stream items into that middleware shape. Event consumers can read reasoning fromAgentEvent::ModelDelta.delta.reasoning. - OpenHuman still needs to route provider reasoning/tool-argument deltas through the TinyAgents stream before deleting UI-specific forwarding shims.
4. Durable Orchestration Task Store
Status: shipped as SDK primitives in 1.3.0; OpenHuman migration remains.
TinyAgents now has TaskStore, InMemoryTaskStore, JsonlTaskStore,
OrchestrationTaskRecord, lifecycle transitions, cancel/kill outcomes,
filters, graph/harness status with lineage, graph::subagent_node, and
graph::subgraph.
OpenHuman follow-up:
- Map durable sub-agent session rows and worker-thread records into TinyAgents task/status/journal records while preserving controller compatibility.
- Retire bespoke task status/tombstone persistence in
running_subagents.rsonly after restart/replay behavior is projected through the SDK records.
5. SQLite Storage Compatibility
Status: partially present.
TinyAgents 1.3 has SqliteCheckpointer, from_connection, and schema_sql,
and OpenHuman now enables the sqlite feature by aligning both Cargo worlds on
rusqlite 0.40 / libsqlite3-sys 0.38. The remaining gap is not feature
enablement or basic schema access; it is ownership. OpenHuman still patches the
sqlite crates locally for the current toolchain, owns existing session/checkpoint
tables through SqlRunLedgerCheckpointer, and needs a clean way to adopt or
bridge SDK checkpoint storage without surrendering dependency or schema control.
Implement one or more OpenHuman compatibility paths:
- Provide a version-flexible storage layer, possibly via
sqlxor a separate crate feature matrix. - Expose a small
CheckpointStorepersistence trait belowCheckpointer. - Add an adapter/cutover path that can project OpenHuman run-ledger checkpoints into SDK checkpoint storage without breaking existing resume semantics.
Acceptance criteria:
- Applications that already own SQLite can use TinyAgents durable checkpoints without native-link conflicts.
- OpenHuman can replace
SqlRunLedgerCheckpointerwith an SDK-supported adapter or a thin schema integration. - Storage features remain opt-in and keep the default crate dependency-light.
6. Production Event And Status Journals
Status: partially present.
TinyAgents has HarnessEventJournal, StoreEventJournal, HarnessStatusStore,
and HarnessRunStatus. OpenHuman still bridges TinyAgents events into its own
progress system, cost tracker, run ledger, and UI status stream.
Implement:
- Durable event journals with cursors, replay windows, filters, compaction, and redaction hooks.
- Status stores with parent/root lineage, thread-scoped listing, phase details, active tool/model call ids, usage totals, cost totals, and terminal summaries.
- Event filters for UI surfaces: text stream only, tool timeline, cost updates, graph lifecycle, errors, task lifecycle.
- Redaction policies for prompts, tool args, tool results, PII, secrets, and provider payloads.
- Stable event ids and offset semantics across process restarts.
Acceptance criteria:
- A UI can attach late and reconstruct a run without subscribing at start time.
- A supervisor can query every active descendant of a root run.
- OpenHuman event bridges become mostly format adapters, not state owners.
7. Cost, Usage, And Budget Enforcement
Status: shipped in 1.3.0; residual money field gap remains.
TinyAgents now has Usage, UsageTotals, CostTotals,
BudgetLimits.max_cached_input_tokens, budget middleware, and
AgentEvent::{BudgetReserved, BudgetReconciled, BudgetWarning, BudgetExceeded}.
The SDK can preflight, reserve, enforce, and reconcile token budgets.
Residual:
Usagestill has no USD/money field. Token usage and money remain separate (Usage/UsageTotalsvs.CostTotals), so OpenHuman cost UI still needs a projection that joins token usage with pricing/cost records.
8. Model Catalog And Provider Resolution
Status: partially present.
TinyAgents has ModelProfile, including provider, model, modalities, tool
calling, streaming, structured output, reasoning, and token windows. OpenHuman
still has provider catalog logic and local model capability inference that drive
fallback, token budgeting, and routing.
Implement:
- SDK-owned model catalog snapshots with provider, model id, display name, lifecycle status, context windows, modalities, streaming support, reasoning, structured-output support, and pricing keys.
- Capability-driven model resolution: required capabilities, fallback chains, local/cloud preferences, and provider health.
- Runtime profile discovery hooks for local models.
- Pricing table integration that maps
ModelProfiletoCostTotals.
Acceptance criteria:
- Model selection can be expressed in TinyAgents policy instead of OpenHuman-only routing code.
- Fallback can reject models that lack required tool, vision, structured-output, context-window, or reasoning capabilities.
- Token budgeting can use the resolved model's real context window.
9. Dynamic Tool Exposure And Allowlist Policy
Status: partially present.
TinyAgents can run with a provided tool registry, but OpenHuman needs per-agent, per-tier, per-sub-agent, and per-task allowlists. Tool visibility depends on security tier, workspace roots, parent/child delegation policy, model capabilities, and whether the run is background or interactive.
Implement:
- A tool selection middleware that receives run context, agent identity, task kind, parent policy, and model profile.
- Allowlist/denylist composition with explicit inheritance rules.
- Explainable exposure decisions for audit/debugging.
- Fail-closed behavior when policy metadata is missing.
Acceptance criteria:
- Sub-agents inherit only the tools they are allowed to call.
- Tool exposure decisions are visible in run events or observations.
- OpenHuman can remove adapter-local allowlist enforcement from most call paths.
10. Graph Fanout And Parallel Agent Ergonomics
Status: map/reduce helper shipped in 1.2.1-1.3.0; OpenHuman builder migration remains.
TinyAgents now has ordered map_reduce, FailurePolicy, ParallelOptions,
max concurrency, per-item timeout, total timeout, and cooperative cancellation.
OpenHuman council runs and spawn_parallel_agents can use this helper directly.
Residual:
- The higher-level parallel-agent builder remains OpenHuman-specific policy
glue: task validation,
Senddispatch shape, result envelopes, usage/cost merging, and ownership/worktree policy adapters.
11. Sub-Agent Steering, Waiting, And Reuse
Status: SDK primitives shipped in 1.3.0; OpenHuman lifecycle projection remains.
TinyAgents now has sub-agent sessions/tools, steering, task stores, cancel/kill control outcomes, graph/harness lineage, and reusable child-run primitives.
OpenHuman follow-up:
- Project existing detached run tracking, wait handles, user-facing
cancellation, early-exit handling, and parent-child progress aggregation onto
TinyAgents task/status records before reducing
running_subagents.rs.
12. Workspace Isolation And Sandbox Hooks
Status: shipped in 1.3.0; OpenHuman policy integration remains.
TinyAgents now has WorkspaceDescriptor, WorkspaceIsolation,
SharedRootWorkspace, sandbox descriptors, ToolExecutionContext.workspace,
and WorkspaceDescriptor::enforce(path, events) which emits
AgentEvent::WorkspaceViolation and fails closed when a path leaves the allowed
roots.
OpenHuman follow-up:
- Implement OpenHuman's action-root, trusted-root, internal-workspace, worktree,
sandbox, and command-tier policy as a
WorkspaceIsolationprovider and tool middleware projection.
13. Middleware Control Outcomes
Status: shipped in 1.3.0.
TinyAgents now has MiddlewareControl::{StopWithFinal, Interrupt},
RunContext::request_control, precedence handling via
MiddlewareControl::precedence(), stable kind() labels, and
AgentEvent::ControlApplied so control decisions are visible in journals.
OpenHuman follow-up:
- Route early-exit tools and budget stop hooks through
MiddlewareControlbefore deleting adapter-local steering side channels.
15. Registry Diagnostics And Introspection
Status: partially present.
TinyAgents has registry primitives. OpenHuman still needs richer diagnostics for duplicate components, alias resolution, component health, model/provider/tool capabilities, and event listener wiring.
Implement:
- Registry snapshot export with models, tools, middleware, graph nodes, checkpointers, task stores, event listeners, and aliases.
- Duplicate and shadowing diagnostics.
- Health/status probes for registered providers and stores.
- Machine-readable component dependency graph.
- Optional DOT/JSON graph export for runtime components, not only graph nodes.
Acceptance criteria:
- A CLI or UI can show exactly what TinyAgents components are active.
- Registry failures are actionable without inspecting app-specific logs.
- OpenHuman dead-code audits can map old modules to SDK-owned registry entries.
17. Storage And Graph Conformance
Status: partially present.
TinyAgents 1.3 includes storage conformance coverage for built-in checkpointers and task stores, including SQLite under the feature. Durable OpenHuman adapters and fuller graph behavior are still hard to migrate safely without shared contract coverage.
Implement:
- Checkpointer conformance for OpenHuman adapters and caller-supplied stores.
- TaskStore conformance for lifecycle transitions, filters, cancellation, timeout, kill, restart/replay, and concurrent writes.
- Graph conformance for
Send, reducers, interrupts, resume, max concurrency, dynamic routing, fanout failure policy, and deterministic result collection.
Acceptance criteria:
- Storage adapters can be swapped without changing graph behavior.
- Durable interrupt/resume semantics are proven across backends.
- Parallel-agent helpers have regression tests for order, failure, timeout, and cancellation.
Implementation Order
- Define API contracts for tool policy, unknown-tool handling, streaming delta channels, durable task storage, storage adapters, and control outcomes.
- Implement the lowest-level data types and traits behind non-breaking defaults.
- Add in-memory implementations first.
- Add durable stores and compatibility adapters second.
- Add middleware helpers and high-level graph helpers.
- Migrate OpenHuman adapters to the new SDK surfaces.
- Remove OpenHuman-specific compatibility shims once the SDK behavior is equivalent.
- Implement conformance and regression tests last.