Change the model path, not the agent.
Codex, Claude Code, and any OpenAI-compatible client keep speaking their own wire format. Point them at the local AgentNotify router and it resolves a provider and model, translates when the wires differ, retries a cooling target, and records what happened — off until you switch it on.
Your agent
POST /router/v1/responses
model: "fast"
AgentNotify router
Resolves the selector, translates the wire only when the upstream speaks a different one.
Targets, in order
Ledger row
combo/fast → deepseek/deepseek-chat · 2 attempts · 200 · in 4,180 · out 612 · no prompt stored
The agent asks for “fast” on the Responses wire. The router checks its own key.
3
wire formats accepted
1
loopback entry point
0
prompts stored in the ledger
A router, not a proxy you forget about.
Every behaviour is explicit, reversible, and visible in the web interface.
127.0.0.1 under its own key, separate from the notification API token. Nothing routes until you enable it.Resolve, translate, send, record.
- 1AdmitThe router authenticates the request with its own key and applies the same bounded body limits as the notification API.
- 2ResolveA model selector becomes a concrete provider and model: an exact upstream, a unique alias, a combo, or a smart-switching group across providers that expose the same model.
- 3TranslateIf the client wire and the upstream wire differ, the request is normalised and the response is reframed for the client. Same-wire traffic is passed through untouched.
- 4RecordEach physical attempt is appended to the local ledger, and the visible row keeps the redacted route trace so a surprising answer can be explained.
what the router accepts
model: "fast"
resolve combo/fast
├─ opencode-go/kimi-k3 cooling
├─ deepseek/deepseek-chat served
└─ codex-plan/gpt-5.1-mini standby
wire responses → chat
usage reported · 4,792 tokens
ledger 1 row · no prompt storedYour traffic goes where you point it.
Routing sends request content to the upstream provider you selected — that is the point of a router, and it is stated plainly rather than buried. Notification history, credentials, and non-router traffic never take part. Subscription-based integrations are labelled unofficial and stay opt-in.