Every vendor ships a good agentic CLI and a subscription that makes it cheap to run. None of them talk to each other. Pick one and you are married to its models, its rate limits and its outages.
omni owns the conversation instead. Claude Code, Codex and Antigravity become interchangeable engines underneath a single Python object, driven by the subscriptions you already pay for rather than API keys. Zero runtime dependencies. You bring the CLIs.
Subagents, MCP and memory files switch off from the command line. Seeding is a file write. Model changes go over the stdin control channel, so re-tuning never restarts anything.
Runs against a CODEX_HOME of its own holding two things: a link to your real auth.json and a near-empty config. History arrives by thread/inject_items.
No flag for MCP, none for subagents, and no way to seed. omni folds prior conversation into the front of the next message, so catching up costs one turn rather than two.
Raise the dial mid-run and the next turn can land on a different vendor's model, with everything that came before already in its head. Coming back is cheaper still: the provider resumes its own session and is told only what it missed.
This is a real run, not a mock. Three facts, three vendors, one session id.
~/.omni/sessions/{id}.jsonl is the source of truth, and it is the event log — the same objects your handlers see, appended in order. Alongside it, omni remembers each provider's own session and how far up the log it has already seen, so arriving somewhere replays only the part it missed.
Providers do not share tools, so a tool the destination does not have is rendered as text that reads as what happened. The structured original stays in the log, which is why going back to Gemini replays Gemini's own session and the brackets never happened. Preserved, not lossy.
Reasoning is the one thing that never travels. It is signed or encrypted per vendor and cannot be replayed anywhere else, so omni records that the model thought and throws the content away — including out of your logs.
Every model the three CLIs can run is plotted by its GDPval-AA v2 Elo — blind pairwise judging of real economically valuable work, anchored so a human expert scores 1000 — against the dollars it measurably cost to earn that score.
Only the left edge of that graph becomes a dial. A model earns a level if nothing else is both better and cheaper. Level 10 is the top of the edge, and the dial walks down-left from there, so a step down is always a real saving and never a sideways move.
Level 4 is worth staring at. GPT-5.6 Luna at max effort scores within 15% of the top of the board for 66 times less money, which is why everything between it and Opus 5 falls off the edge entirely.
There is one dial per set of providers, because losing a vendor puts models back on the dial that another vendor's were shadowing. omni asks this site for the dial matching the providers it has and caches it for an hour. The dial is editable — add a model, and every install picks it up on its next refresh.
Everything omni has to say arrives as one Event. The same objects go to your handlers, to your logs, and onto disk — so the session file is the event log, and there is never a second schema to learn.
Handlers run on one thread, in the order things actually happened. A handler that raises is reported and stepped over — it cannot take the run down with it.
This is the rule the whole design hangs off. Intelligence, providers, prompts and session swaps are recorded the moment you ask for them and applied at the next turn boundary, once the running tool has finished. A model never changes underneath itself.
A message sent while a turn is running is injected rather than queued behind it: the provider picks it up at the next safe point. Either way send returns immediately and is safe from any thread, so whether you drive omni from a while loop, asyncio or a message bus is entirely your business.
A short list, because the things a tool refuses to do tell you more than the things it claims.
disable_subagents() and disable_mcp() have no equivalent there, so omni logs that it ignored you rather than quietly doing nothing.