OMA Open Multi-Agent Runtime

A self-hosted agent runtime for durable human approvals and offline-verifiable run records.

Stars
★ 7k
Last updated
1d ago
License
MIT
Primary language
TypeScript

At a glance

How it runs
CLILibrary / SDKFramework
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
Node.js 20 or newerA maintained Node.js LTS release for productionLocal filesystem
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

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.

  1. A backend team that requires human authorization before file writes or shell commands can suspend consequential calls and resume them after a service restart.
  2. A regulated organization can declare required roles and independent review, then assess the actual role order and dependency edges from an execution receipt.
  3. 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.
  4. 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.
  5. Automation developers with a known workflow can use runTasks(), while teams that need runtime decomposition can let runTeam() construct and schedule the graph.
  6. 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-oma

In 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/core

For 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?

Pros
  • 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.
Limitations
  • 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 with runTasks() 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?

FollowAgents source review · FARS-2.1
Major gaps
55/ 100 5-point scale 2.8 / 5
This review covers the source as of Aug 09, 2026. The project has shipped 13 stable release(s) since, which have not been re-reviewed. The score and verdict describe the reviewed version only. Recent releases ↓
Trust 16/29
Reliability 8/14
Adaptability 12/18
Convention 9/18
Effectiveness 7/13
Verifiability 3/8
Why each dimension lost points
Trust16 / 29 · 2.8/5

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.

Reliability8 / 14 · 2.9/5

Code and tests show retries, timeouts, loop detection, budget limits, and clear failure messages, but dependency availability not fully verified.

Adaptability12 / 18 · 3.3/5

Documentation clearly defines target audience and scenarios, capability boundaries are clear, triggers are precise, and environment fit is good.

Convention9 / 18 · 2.5/5

Information architecture is clear, installation notes are detailed, examples are abundant, but known limitations and changelog are insufficient, and maintenance responsibility is unclear.

Effectiveness7 / 13 · 2.7/5

Output usability is high, marginal value is evident, but cost-benefit analysis is insufficient.

Verifiability3 / 8 · 1.9/5

Claims have some supporting evidence, but lack independent source verification, and fact-inference separation is unclear.

Risks and how to mitigate them
  • 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.
Evidence confidence: Low Reviewed Aug 09, 2026 Reviewed revision f14708b30857 New commits since this review; the score may not cover them
See the full review method →

Recent releases

Latest entries from the project's GitHub Releases. Notes are quoted from upstream as written, not rewritten or tested by FollowAgents.

  1. v1.23.0
    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 ↗
  2. v1.22.0
    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 ↗
  3. v1.21.3
    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?
No. The documented adapters include Anthropic, OpenAI, Azure OpenAI, Bedrock, Gemini, Grok, Copilot, and several Chinese providers. Ollama, vLLM, llama-server, and other OpenAI-compatible endpoints can be used through baseURL.
Can I evaluate it without an API key?
Yes. 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?
Not when checkpoint storage is configured. The run and its pending approval request are stored durably and can resume from the same bound content after restart.
Does offline verification prove that nobody edited the journal file?
No. 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.
Does the runtime send telemetry to OMA?
No. The project states that it has no telemetry, account, or hosted control plane and makes no analytics, license, update, or phone-home requests. Connections to configured model providers still depend on your provider and egress settings.
View on GitHub ↗ Install ↓

Compare agents like this one

The same FARS review applied across the shortlist this agent qualifies for.

Related agents