Read intent. Shape the DAG.
- IntentParser
- TaskDecomposer
- DAGPlanner
- ScopeNegotiator
The agent system inside exAI is not one giant prompt. It is twenty-six small, sharp specialists — typed inputs, typed outputs, declared effects — moving across a deterministic bus.
A planner that only plans. A test runner that only runs tests. A rollback operator that only knows how to revert. Each agent is replay-safe, receipted, cancellable. The orchestrator composes them; reviewers read the trail like a ledger, not a transcript.
Specialists, not generalists. Twenty-six agents across seven categories. The orchestrator composes them into a typed DAG; reviewers can name every node and predict its blast radius. Generalist prompts do not survive a Fortune 100 audit.
Read intent. Shape the DAG.
Write code. Write schema. Write tests.
Prove it green before it lands.
Self-heal until the gate opens.
Make the artifact reviewable.
Receipts the auditor wants.
Land it. Watch it. Roll back if it slips.
Every agent declares input, output, effects. The bus refuses to dispatch anything that does not parse. A run is a directed graph of contracts — schedulable at plan-time, replayable byte-for-byte, receipted at every hop.
A contract names what an agent will read, what it will return, and what it will touch. The orchestrator type-checks the graph before any VM warms. Models change, prompts change — the seam between agents does not.
export const TestRunner = defineAgent({ name: "TestRunner", category: "verification", input: z.object({ shards: z.number() { output: z.object({ pass: z.number(), fail: z.number() }), effects: ["vm.dispatch", "ledger.write"], capability: 0.97, run: async (ctx, { shards }) => { const r = await ctx.bus.fanOut(shards); return { pass: r.pass, fail: r.fail }; }, });
Each agent carries a per-task capability score and a measured P50 latency. The router uses both — under a cost ceiling — to pick a model the agent will reach for. Scores update on every receipt.
Your domain has agents the catalog will not ship — a claims router, a SAP migrator, a regulator-specific evidence packer. Register them on the same typed bus as the 26. Same contract, same receipts, same replay.
Define an agent in TypeScript. Declare its input, output, and the effects it touches. The bus refuses to dispatch anything the contract does not name. The orchestrator schedules custom agents the same way it schedules the catalog — replayable, receipted, auditable.
import { registerAgent, z } from "@exai/sdk"; registerAgent({ name: "ClaimsRouter", input: z.object({ claim_id: z.string(), policy: z.enum(["auto", "home"]), }), output: z.object({ adjuster: z.string() }), effects: ["hr.read", "audit.write"], run: async (ctx, input) => { const a = await ctx.tools.hr .onCallFor(input.policy); return { adjuster: a.id }; },});
Generic over input and output. Compile-time guarantee that the bus only sees the shape it agreed to.
Inputs parsed before run. Outputs parsed before return. Bad data fails closed at the boundary.
Custom agents sit on the same NATS bus as the 26. Signed envelopes. Bring your own runtime.
Deterministic by contract. Side-effects routed through a ledger so the run is rewindable.
The agent system is the part of exAI Agentic OS that survives the audit. Typed contracts, deterministic bus, replayable runs. Bring a monorepo migration, a compliance sweep, an internal portal. The bus will dispatch.