The loop
Multi-round generate-and-dispatch with iteration, time, and cost guardrails, parallel and background tool calls, and failure containment that returns usage and partial output.
Open-source agent harness · as a service
nvoken runs the whole agent turn for your app — streaming, checkpoints, durable waits, human-in-the-loop — while your app stays the source of truth. No agent runtime to provision, sync, or migrate.
Works with Anthropic · OpenAI · Google · Grok · Mistral · Ollama
The problem
And the features a harness needs are not obvious up front — you discover them one incident at a time. Months later you have thousands of lines of plumbing, and an experience that still falls short of what users expect from Claude Code and the ChatGPT and Claude apps.
The contract
Your app composes the agent spec from its own database and sends it with the input. nvoken resolves or creates the Session and admits the work durably — an API disconnect, process loss, or deploy can't erase what was accepted.
The answer is one read away: GET /v1/invocations/{id}/result.
Send Accept: text/event-stream to stream the same Invocation. Disconnecting never affects execution.
{
"agent_key": "support-triage",
"session_key": "thread-8813",
"idempotency_key": "thread-8813:message-7",
"input": "why was I charged twice?",
"spec": {
"instructions": "You are a billing support agent…",
"model": { "provider": "anthropic", "id": "claude-sonnet-5" }
}
}{
"invocation_id": "invk_…",
"status": "queued",
"deadline_at": "2026-07-23T16:30:00Z"
}The boundary
A multi-tenant app can't treat agents as fixed config — instructions, tools, and models vary by tenant, plan, and user. Register those into a runtime and every variation becomes a record to provision, every change a migration. nvoken avoids this by design.
Composed from your database on every invocation.
Nothing to register, sync, or migrate.
Depth
The distance between a working demo and an experience users actually like is a long list of features teams discover one at a time. nvoken covers them, built on Dive.
Multi-round generate-and-dispatch with iteration, time, and cost guardrails, parallel and background tool calls, and failure containment that returns usage and partial output.
Builtin, signed callback, and recoverable host tools with stable call IDs. Annotations, previews, live output, and rich text / image / audio results.
Suspend and resume for approvals or auth, an allow/ask/deny permission engine, lifecycle hooks, cancellation, steering, and ask-the-user mid-task.
Ordered history resolved by your session key, admission that survives crashes and deploys, a single-writer lease, and streams that reconnect without duplicating events.
Typed system reminders with authority tiers, mid-loop context injection, token-threshold compaction, and automatic prompt-cache breakpoints.
Anthropic, OpenAI, Google, Grok, Mistral, Ollama, and OpenRouter behind one interface — thinking signatures, tool-call IDs, and results round-trip, so a Session isn't welded to a vendor.
Normalized per-invocation usage for rebilling, cost tracking priced by a per-model registry, and OpenTelemetry GenAI spans across the turn, each model call, and each tool call.
How it compares
Once agents are wired into your product, where the runtime runs and who owns your state are expensive to change. Compare on those. Only nvoken passes both.
| Project | Runs on | Fully open source | Your app owns state |
|---|---|---|---|
| nvoken | anywhere with a binary + Postgres | ✓ | ✓ |
| Claude Managed Agents | Anthropic's cloud only | — | — |
| AWS Bedrock AgentCore | AWS only | — | — |
| Cloudflare Agents | Cloudflare only | — | — |
| Vercel Open Agents | Vercel only | — | — |
| kagent | any Kubernetes cluster | ✓ | — |
| Letta | your infra or Letta Cloud | ✓ | — |
Bring-your-own-key and Apache-2.0 end to end. Runs on a laptop, your cloud account, or an air-gapped network.
One binary plus Postgres. The first durable slice is live and the contract is being figured out in the open.
Early development, openly so. The design isn't set, so feedback right now genuinely changes it — open an issue.