Comparison with Frameworks - joeylking/agent-runtime GitHub Wiki
Comparison with Frameworks
This page is for someone deciding whether to build on this runtime or on a general agent framework. It describes differences in design, not in quality.
What frameworks optimize for
Most agent frameworks make it fast to compose prompts, chain calls, orchestrate several agents, add memory and retrieval, and switch providers. Their loop is flexible and the controls are typically options: a callback that can veto a call, a maximum iteration count, a human-in-the-loop node that suspends a graph.
What this runtime optimizes for
The controls are the product and the loop is minimal.
| Concern | Typical framework | agent-runtime |
|---|---|---|
| Who decides whether a tool runs | the model, sometimes a callback | the policy, always, after schema validation, with the model having no handle to it |
| Pausing for a human | in-process suspension, sometimes serialized | a durable row with a hash over the exact request; any later process can decide and resume |
| Re-execution after approval | the model may be asked again | only the recorded request executes, and only if policy still agrees |
| Limits | iteration counts, sometimes token budgets | steps, failures, loops, calls, tokens, cost, active time, elapsed time, approval expiry, enforced before the action |
| Audit | logging and tracing hooks | an append-only event log committed with the state |
| Crash recovery | checkpointing of the graph state | interrupted steps with consumer reconciliation; side effects never re-run by the runtime |
| Testing | mocks of the provider | a scripted agent and scripted, recording, and replaying models; the whole loop runs without a provider |
| Tools from an MCP server | registered as the server describes them, annotations included | an operator classifies each one, the tool set is pinned by schema and description, and the same policy, limits, and log apply |
| Scope | orchestration, prompts, memory, providers, UI | the loop and its controls, plus the plumbing two consumers proved they had to write anyway |
When to use a framework instead
When the task is mostly prompt engineering and composition, when the tools are harmless, when a human is in the chat loop anyway, or when several agents must coordinate. This runtime has no orchestration, no prompt machinery, and no memory, and adds them only when a consumer demonstrates the need.
What it does now have is the plumbing around the loop that every consumer wrote for itself: adapters for Ollama, OpenAI-compatible endpoints, and the Claude API, each a separate module; a renderer from recorded steps to messages; an MCP adapter; an operator command; trace and read models. That is not a provider abstraction and not a framework — there is no layer that translates between providers, no prompt template, and nothing that composes agents — but it does mean the comparison is no longer "a framework gives you the adapters and this does not". See Provider Adapters and MCP Tools.
When to use this
When the agent reads untrusted input and takes actions with consequences, when a human must approve specific actions out of band and possibly days later, when the record of what happened has to be complete and trustworthy, and when the behaviour has to be testable without a model.
Using both
Nothing prevents a framework from being the agent: implement Decide by calling into it and returning its chosen tool call. The runtime's controls then apply regardless of what produced the decision. Since v0.4.0 there is a second way, for a loop you would rather not hand over: keep the loop, and have it propose each action to a Gate, which validates, applies policy, pauses on a hash-bound approval, executes the tool, and records it. The gate runs the tool itself, so a tool is registered with it and not left in the loop's own code. For an MCP host in any language, MCP Proxy does the same in front of the host's MCP tools, with the limits on what it can govern stated first.