OMA Open Multi-Agent Runtime
A self-hosted agent runtime for durable human approvals and offline-verifiable run records.
- Source repo
- open-multi-agent/open-multi-agent
- Stars
- ★ 7k
- Last updated
- 1d ago
- License
- MIT
- Primary language
- TypeScript
- FA score
- 55/100 · Major gaps
At a glance
- How it runs
- Works with
- Universal · cross-platformCodex · Claude Code · OpenAI API · Claude API
- Cost
- Free software; you pay for model usage
- Setup effort
- Low · running in minutes
- You'll need
- Typical use
- A backend team that requires human authorization before file writes or shell commands can suspend consequential calls and resume them after a service restart.
- Not a fit if
- Teams that want a hosted control plane or vendor cloud account
- Teams pinned to Node.js versions older than 20 or unwilling to track LTS
- Teams whose approval store lacks atomic compare-and-set semantics
- Source review
- 55/100 · Major gaps
What does this agent do, and when should you use it?
OMA is an MIT-licensed, self-hosted TypeScript agent runtime delivered primarily through the @open-multi-agent/core library, without an OMA account or hosted control plane. It exposes runAgent(), runTasks(), and runTeam() for single-agent execution, explicit pipelines, and coordinator-planned multi-agent task graphs. The runtime can call hosted providers, local model servers, OpenAI-compatible endpoints, Vercel AI SDK providers, and external coding agents connected through process or ACP backends. Plans, task dispatches, and consequential tool calls can suspend for durable approval and later resume from checkpointed state. A journal can capture model-visible blocks, tool calls and results, and context rewrites, while verifyRun() checks their provenance offline and byte for byte. The repository also includes an offline Run Viewer, an optional @open-multi-agent/otel adapter, and the create-oma-app scaffolder, making it most relevant to teams that need to own their model credentials, deployment boundary, approvals, and audit evidence.
Developers create agents or teams with OpenMultiAgent, then use runAgent() for one agent, runTasks() for a predefined pipeline, or runTeam() to turn a goal into a task graph with assignees and dependencies. In runTeam(), one model call creates task specifications, a deterministic scheduler executes them, and a second model call produces the final response from completed task outputs; the coordinator is not consulted during execution. Configured agents can invoke tools, while plan, dispatch, or tool-call gates may return suspend. Each durable approval request is stored beside its checkpoint and bound by SHA-256 to exactly what the reviewer saw. Decisions are atomic and first-wins; altered requests and stores lacking compare-and-set fail closed. With a journal backend attached, OMA records model-visible blocks, tool calls, results, and context rewrites; verifyRun() cold-reads the record and checks whether each block can be reproduced byte for byte from its named source event. Results can expose task statuses, assignees, dependencies, token usage, pending approvals, governance receipts, and traces for the offline Run Viewer.
- A backend team that requires human authorization before file writes or shell commands can suspend consequential calls and resume them after a service restart.
- A regulated organization can declare required roles and independent review, then assess the actual role order and dependency edges from an execution receipt.
- A team operating inside a restricted network can connect Ollama, vLLM, llama-server, or another OpenAI-compatible endpoint and enforce an offline or allowlist egress policy.
- TypeScript developers prototyping pull-request review, security analysis, or teaching workflows can select a starter and run the deterministic no-key demo through
create-oma-app. - Automation developers with a known workflow can use
runTasks(), while teams that need runtime decomposition can letrunTeam()construct and schedule the graph. - Operations or compliance teams that need inspectable context lineage can retain run journals and use
verifyRun()for offline, byte-level verification.
How do you install or deploy this agent?
OMA requires Node.js 20 or newer. Production deployments should use a currently maintained Node.js LTS release. Node.js 20 is retained only as a migration window and is scheduled for removal in the next major release, no earlier than 2026-10-31.
Scaffold a starter application:
npm create oma-app@latest my-omaIn an interactive terminal, the scaffolder selects a starter and runtime, installs dependencies, and launches a deterministic local demo. That demo needs no API key and makes no model request.
To add OMA to an existing backend:
npm install @open-multi-agent/coreFor the documented OpenAI example, provide credentials:
export OPENAI_API_KEY="your-api-key"Other hosted providers, local servers, OpenAI-compatible endpoints, and AI SDK providers require their corresponding credentials or baseURL configuration.
How do you use this agent?
This example creates a team that suspends consequential tool calls and stores its checkpoint in a local file:
import { FileStore, OpenMultiAgent } from '@open-multi-agent/core'
const oma = new OpenMultiAgent({
defaultProvider: 'openai',
defaultModel: 'gpt-5.4',
onToolCall: ({ consequential }) => (consequential ? { action: 'suspend' } : { action: 'allow' }),
})
const team = oma.createTeam('ops', {
name: 'ops',
agents: [{ name: 'operator', systemPrompt: 'Reconcile overdue invoices.', toolPreset: 'readwrite' }],
})
const result = await oma.runTeam(team, 'Find overdue invoices and draft the reminders.', {
checkpoint: { store: new FileStore('./.oma/run.json') },
})When result.status?.code is suspended, the host application must present and decide the entries in result.pendingApprovals; each entry is bound to the exact content shown to the reviewer. Use runTasks() when the graph is already known, or runAgent() for a single agent. When journaling is enabled, use verifyRun() to validate the saved run offline.
What are this agent's strengths and limitations?
- Approval requests survive restarts, are SHA-256-bound to reviewer-visible content, and fail closed on tampering or missing compare-and-set semantics.
- Offline verification covers model-visible blocks, tool calls, results, and context rewrites while distinguishing failure from an inconclusive evicted window.
- There is no OMA telemetry or hosted control plane; deployments can use their own keys, cloud models, local models, or OpenAI-compatible endpoints.
- One runtime covers single agents, explicit pipelines, and dynamically planned task graphs, with an offline Run Viewer and optional OpenTelemetry export.
- Governance receipts can check roles, ordering, dependencies, and independent review without exposing agent output text to the evaluator.
- Adopters need Node.js 20 or newer, should track a maintained LTS for production, and face a documented future migration away from Node.js 20.
runTeam()uses additional model calls for planning and final synthesis, adding coordination and model cost compared withrunTasks()when the workflow is already known.- Durable approval requires storage with atomic compare-and-set behavior; an unsuitable store fails closed and must be addressed in production integration.
- Journal verification proves reproducible content lineage, not that the underlying journal file was never edited.
- The egress policy does not cover process and ACP backends, so organizations using external-agent execution must govern those boundaries separately.
How does this agent compare with similar options?
runAgent() targets a single agent, runTasks() fits deterministic workflows whose task graph is already known, and runTeam() adds model-driven planning for goals that must be decomposed at runtime. Compared with a hosted control-plane approach, OMA is explicitly a self-hosted library with local checkpoints and an offline viewer; teams needing centralized telemetry can add @open-multi-agent/otel and send traces to their existing OpenTelemetry stack.
Key facts side by side with the most closely related agents.
| Agent | Source review | Form / cost | Stars | Updated | Language | Full support on |
|---|---|---|---|---|---|---|
| OMA Open Multi-Agent Runtime This agent | 55 · Major gaps | CLIFree + model costs | ★ 7k | 1d ago | TypeScript | Codex · Claude Code · OpenAI API · Claude API |
| AgentScope 2.0 | 70 · Some gaps | Library / SDKFree + model costs | ★ 35k | 2d ago | Python | OpenAI API · Claude API |
| Selectools | 65 · Some gaps | Library / SDKFree + model costs | ★ 11 | 3d ago | Python | OpenAI API · Claude API |
| Pi Jev Semantic Router | 80 · Good | Agent plugin / skillFree + model costs | ★ 72 | 8d ago | TypeScript | — |
How does FollowAgents rate this agent?
Why each dimension lost points
Evidence shows default-deny tools, per-call gating, approval and suspension mechanisms, and privacy controls, but sensitive data handling details are insufficient, dependency security not fully demonstrated, and publisher identity unverified.
Code and tests show retries, timeouts, loop detection, budget limits, and clear failure messages, but dependency availability not fully verified.
Documentation clearly defines target audience and scenarios, capability boundaries are clear, triggers are precise, and environment fit is good.
Information architecture is clear, installation notes are detailed, examples are abundant, but known limitations and changelog are insufficient, and maintenance responsibility is unclear.
Output usability is high, marginal value is evident, but cost-benefit analysis is insufficient.
Claims have some supporting evidence, but lack independent source verification, and fact-inference separation is unclear.
- Publisher identity is unverified; assess supply chain risks carefully.
- Sensitive data handling details are insufficient; further review needed.
- Dependency security not fully demonstrated; check dependency list.
Recent releases
Latest entries from the project's GitHub Releases. Notes are quoted from upstream as written, not rewritten or tested by FollowAgents.
-
Release notes excerpt
Breaking changes This release ships as a minor version, so a caller on a ^1.x range receives it without an explicit upgrade step. A project that pins zod below 3.25, code that uses object-only members of taskProfileSchema or gatePolicySchema, and a coordinator plan over the new size caps can stop working after the upgrade. The individual entries are under Changed below. …View on GitHub ↗ -
Release notes excerpt
Breaking changes This release ships as a minor version, so a caller on a ^1.x range receives it without an explicit upgrade step. A caller that passes malformed task metadata or disables thinking on MiniMax-M3.1-Flash still installs, then fails when the code runs. The individual entries are under Changed and Fixed below. …View on GitHub ↗ -
Release notes excerpt
Fixed - Symlink loops and chains longer than the kernel's link limit now fail the sandbox check with a Too many levels of symbolic links error. Earlier versions also failed these writes, with the filesystem error instead. - A symlink target that ends in a separator or . must now name an existing directory, as the kernel requires. On macOS, earlier versions resolved such a link to the file of that name, so file_write overwrote it. Security …View on GitHub ↗
FAQ
Does OMA require OpenAI or another cloud model?
baseURL.Can I evaluate it without an API key?
npm create oma-app@latest my-oma can run a deterministic local demo driven by scripted model responses, with no API key and no model request.Will a pending approval disappear after a restart?
Does offline verification prove that nobody edited the journal file?
verifyRun() checks whether each block is reproducible byte for byte from its named source event, establishing content lineage. The project explicitly limits that claim and does not prove the file was never edited.