You already pay for three AI models
This picks the right one, and shows its work.
Every request goes to the model that earned it, or the cheapest one on a genuine tie. One OpenAI-compatible endpoint in front of the models you already pay for: Agent Mystro reads each request, works out what kind of work it is, and sends it to the model that wins that kind of work, by blind test rather than reputation.
The model that writes the best email is not the model that writes the best code, and the gaps are not small. On pages and interfaces, one model won eight of 10. One model usually gets picked, and used for everything.
Then it learns yours. Every blind pick you make bends the routing toward your taste, until the routing is not ours but yours.
An Epiphani Studio service · Bring your own provider keys · We never resell inference · Free to 1M tokens
{ "messages": [{ "role": "user",
"content": "Draft a note to a new supplier." }] }
// no model named, so it routes
The habit
You are paying for three, and using one.
Teams holding live keys from Anthropic, OpenAI, and Google tend to settle into one routine within a week of wiring them up. One model gets chosen, and then everything goes to it: the front-end component, the support reply, the market research question, the invoice arithmetic, the PDF extraction. Not because anyone decided that model was best at all five. Because switching by task means conditional logic, an evaluation harness nobody has time to build, and model strings hardcoded in a dozen places.
That default carries a measurable penalty. A clean interface layout rewards strict structural syntax. Cold outreach copy rewards control over tone and pacing. These are different skills, and the models are not equally good at them. Send both to the same endpoint and the output drops wherever that provider happens to be weak, quietly, on every request, forever.
Blind testing shows the size of it. In battery b2, one expert judge scored 10 briefs for pages and interfaces with the outputs shuffled, stripped of provenance tells, and decoded against an offline key afterwards. GPT won eight of 10. Gemini won one, and Claude won one. Battery b1 ran the same method over 10 cold-drafting briefs: Gemini won five, the Claude-to-GPT chain won three, Claude won two, and GPT won none at all.
One judge over 10 briefs per battery is not a population study, and the limits section says so plainly. But a model that takes eight of 10 interface briefs and none of 10 drafting briefs is not a rounding error, and a static default means accepting the weaker answer every time the task moves. The keys are already paid for. The capacity is already there. What is missing is the decision about which one gets the work.
How it routes
Four moves, on every call.
What kind of work is this?
A deterministic scorer names the task: cold drafting, a reply, a page, code, live research. It runs in under a millisecond, costs nothing, makes no network call, and hands back every signal that fired.
Who has earned that work?
Each measured task type carries Bradley-Terry strengths built from blind head-to-heads; where no battery exists yet, the prior is weak and the response says so. The request goes to the strongest arm you hold a key for, with the confidence stated rather than implied.
Whose taste decides?
Ask for a taste check and you get two answers with the labels off. Your pick takes one gradient step. After about six picks your taste outweighs the population default. Disagree by pinning an arm and that teaches it too.
Did the routing pay?
Switching models can throw away a warm prompt cache, so we weigh that before moving a request, and only let it win when quality is a coin flip. Ask /v1/gain and it reports what routing bought you, including when it cost more.
Watch it decide
Pick a request. See where it goes, and why.
These are the real classifier signals, the real batteries, and the real routing rules. The outputs are illustrative, not live model calls.
The evidence
The defaults are measured, and here they are.
Every routing default came from a blind battery, outputs shuffled and stripped of provenance tells, judged blind, then decoded against an offline key: 10 briefs each, except battery b10's six documents. The machine-readable version lives at /capabilities.
| Task | Battery | Result | Default |
|---|---|---|---|
| Cold drafting | b1, 10 briefs | Gemini 5 · chain 3 · Claude 2 · GPT 0 | Gemini |
| Replies | b7, 10 briefs | chain 6 · Gemini 4 · solo arms 0 | Claude→GPT chain |
| Pages and interfaces | b2, 10 briefs | GPT 8 · Gemini 1 · Claude 1 | GPT |
| Live research | b8, 10 briefs | Claude 5 · GPT 3 · Gemini 2 | Claude |
| Finance arithmetic | b5, 10 briefs | Every arm 10/10 on accuracy | UNROUTED goes to cheapest |
| Document extraction | b10, 6 documents | GPT 30/30 · Gemini 30/30 · Claude 29/30 | UNROUTED goes to cheapest |
Two of these say do nothing, and that is the point. Where blind testing found no separation we route on cost and tell you so, rather than inventing a preference we cannot defend.
Everyday moments
Six requests, and where each one lands.
When you draft a note to a new supplier
The scorer reads an imperative draft with no quoted thread and names the task cold drafting, in under a millisecond, with no network call. The request goes to Gemini, because battery b1 put Gemini at five wins of 10, the Claude-to-GPT chain at three, Claude at two, and GPT at none. The response tells you which signals fired and how confident the call was.
When you answer a thread already in flight
A quoted message changes the task. The classifier names it a reply, and the request goes to the Claude-to-GPT chain, which took six of 10 briefs in battery b7 against Gemini's four, with both solo arms at zero. Mirroring a sender is a different job from starting a conversation, and the blind picks say so.
When you ask for a landing page
Markup, layout, and styling constraints read as a page or interface, and the request goes to GPT on the strength of battery b2, where it took eight of 10 briefs with Gemini and Claude on one each. This is the widest measured gap in the set, and it is the one that costs the most to get wrong by habit.
When the answer has to be current
A question that needs today's sources is live research, and it goes to Claude, which took five of 10 briefs in battery b8 against GPT's three and Gemini's two. Narrower than the interface result, and stated as narrow: the confidence figure in the response is lower to match.
When you check the arithmetic on an invoice
Battery b5 put every arm at 10 out of 10 on accuracy, so finance arithmetic is deliberately unrouted and the request goes to the cheapest arm you hold a key for. Where blind testing found no separation, inventing a preference would be dishonest and expensive. Document extraction sits in the same bucket after battery b10: GPT 30 of 30, Gemini 30 of 30, Claude 29 of 30.
When you disagree with any of it
Send the x-mystro-pin header and you get the arm you named. The disagreement is recorded and moves your routing toward that choice at about a third of the weight of a blind pick, because a pin is sighted and a blind pick is not. Nothing here is a black box you have to accept.
How Agent Mystro compares
A learned router, next to the aggregators and the gateways.
Three different products get called the same thing. An aggregator sells catalogue breadth: hundreds of models behind one connection. A gateway sells operations: failover, response caching, guardrails, and log collection. A learned router sells the decision itself, which model gets which work. Agent Mystro is the third one, and it reaches three providers rather than hundreds.
So the honest routing advice comes first. If you need niche open weights across a broad catalogue, OpenRouter is the better tool. If your prompts may not leave your own infrastructure, LiteLLM self-hosts and runs air-gapped and Agent Mystro does not, because the population prior is learned across customers and an isolated instance would ship frozen. If you need automatic failover, response caching, guardrails, or redaction today, Portkey and LiteLLM ship all four and Cloudflare ships caching and rate limiting, and we ship none of them yet.
What is left is the part the comparison above shows nobody else matching. The routing keeps learning from your own blind picks, one online gradient step each, blended against the population prior by Bayesian shrinkage at kappa 6, so your taste and the population weigh equally at six picks and yours dominates after. Every decision comes back line by line: the task type, the signals that fired, the battery behind the default, how much of the call was your own vector, whether a warm cache was weighed, and the confidence. The defaults are published with the tallies that produced them. And the routing fee is not a share of your tokens: you keep paying the providers directly, at their prices, and we take none of it.
| Capability | Agent Mystro | Not Diamond | OpenRouter | Portkey | LiteLLM | Cloudflare AI Gateway |
|---|---|---|---|---|---|---|
| Learns continuously from your own blind picks | Yes | Trains per tenant on uploaded datasets | No | No | No | No |
| Returns the routing decision line by line | Yes | No | No | Logs the call, not the decision | Logs the call, not the decision | Logs the call, not the decision |
| Publishes the blind evidence behind each default | Yes, with the tallies | No | Not applicable | Not applicable | Not applicable | Not applicable |
| Share taken of your token spend | 0%; $0.20 per million past 5 million on Pro | $0.05 per million tokens routed | 5% on bring-your-own-key use after the first 1 million requests each month | 0%, subscription | 0%, self-hosted | 5% on credits bought through unified billing |
| Providers reachable | Three | Multiple | Hundreds of models | Broad | Over 100 providers | Broad |
| Self-hosted or air-gapped | No, by design | No | No | Yes, open source, no request limit | Yes, and runs air-gapped | No |
| Failover, response caching, guardrails, redaction | Not yet | Not the product | Partial | Yes | Yes | Caching and rate limiting, free |
| Log retention and observability depth | Request ids, counts, and enum values only | Not published | Dashboard | 100,000 recorded logs a month on Production | Yours, you host it | 10 million logs per gateway on Workers paid |
| Price to start | $0 a month, 1 million tokens routed; Pro $19 a month | Pay as you go, then Enterprise on request | Free to 1 million bring-your-own-key requests a month | Free Developer plan, 10,000 logs a month; Production $49 a month | Free to self-host; Enterprise quoted by sales | Free core features with a Cloudflare account |
Every figure above was read from the vendor's own pricing or documentation page in July 2026 and links from the sentences below. Not Diamond publishes $0.05 per million tokens routed on pay as you go, with an Enterprise plan it does not price publicly. OpenRouter takes no markup on inference and charges 5.5% with a $0.80 minimum on credit purchases, plus 5% on bring-your-own-key use past the first 1 million requests a month. Portkey lists a free self-hosted open-source tier, a free Developer plan at 10,000 recorded logs a month, and Production at $49 a month for 100,000 logs plus $9 for each further 100,000. LiteLLM is free to self-host, reaches over 100 providers, runs air-gapped, and quotes Enterprise privately. Cloudflare AI Gateway gives its core features away, charges 5% on credits bought through its Unified Billing, and caps persistent logs at 100,000 on the free Workers plan and 10 million per gateway on paid. Martian, which built one of the first model routers on $9 million of funding, now describes itself on its own homepage as researchers working on understanding machine intelligence, and publishes neither a router product nor a price, so it is named here rather than scored. Capabilities change; corrections are welcome at hello@epiphani.studio.
Quickstart
Point any OpenAI client at it.
Bring your own provider keys. We charge for routing and never resell inference, so your token spend stays exactly where it already is.
# 1. Create an account. The key is shown once. curl -X POST https://agentmystro.com/v1/account # 2. Add a provider key. We verify it before storing it, encrypted. curl -X POST https://agentmystro.com/v1/keys \ -H "Authorization: Bearer $MYSTRO_KEY" \ -d '{"provider":"anthropic","api_key":"sk-ant-..."}' # 3. Call it like OpenAI. Leave the model out and let it route. curl https://agentmystro.com/v1/chat/completions \ -H "Authorization: Bearer $MYSTRO_KEY" \ -d '{"messages":[{"role":"user","content":"Draft a note to a new supplier."}]}'
The response carries a mystro block: the task type it decided on, the signals that fired, the battery behind the default, how much of the call was your own taste, whether a cache was weighed, and how confident it actually was.
Pricing
Nineteen dollars a month, and we add nothing to your token bill.
You pay Anthropic, OpenAI, and Google directly, at their prices. We take no percentage of it. Routing can still change what you pay them, and /v1/gain reports it either way.
Prove the routing on your own traffic.
- 1 million tokens routed each month
- Population defaults from the blind batteries
- The full explainability payload
- Spend caps and cost estimates
The routing becomes yours.
- 5 million tokens routed, then $0.20 per million
- The taste engine: your blind picks decide
- Override learning when you pin an arm
- Cache affinity, so switching never quietly costs you
- The gain report at
/v1/gain
The free tier runs on population defaults only. That is the honest split: it proves the routing works on your traffic, and the part you pay for is the routing becoming yours.
Straight answers
The questions worth asking first.
Do you see my prompts?+
They pass through to your provider and are not retained. Request logs hold ids, counts and enum values, and there is no field in the log record that can carry your text. Cache affinity stores a 12-byte digest of a repeated prefix, never the prefix.
What happens to my API keys?+
Encrypted with AES-256-GCM under a per-customer key derived from a secret held in Worker Secrets, and verified against the provider before they are stored, so a typo fails immediately rather than inside your production traffic. Delete the account and they are gone.
What if I disagree with where it routed something?+
Pin an arm with the x-mystro-pin header and you get that arm. The disagreement is also recorded and moves the routing toward your choice, at about a third of the weight of a blind pick, because a pin is sighted and a blind pick is not.
Does routing between models break prompt caching?+
It can, which is why we weigh it. If another arm holds a live cache for the repeated part of your request, and the quality question is close to a coin flip, the request stays where the cache is and the response says so. When one arm is the clear winner, quality wins and we tell you the cache was passed over.
How do I know the routing is worth paying for?+
Ask /v1/gain. It reports what your traffic cost against what the same traffic would have cost sent entirely to the strongest general-purpose arm, the split by arm, and how often your own blind picks agreed with the routing. It reports honestly when routing cost more.
Why only three providers?+
Because a routing claim is only as strong as the blind evidence behind each arm, and we will not run batteries against a catalogue of 300 models. If breadth matters more to you than measured routing, OpenRouter or LiteLLM is the better tool and we would rather say so.
Privacy
What happens to your prompts, and to your keys.
Your prompts pass through to your own provider account and are not retained. The request log holds identifiers, counts, and enum values, and there is no field in the log record that can carry your text, which is a property of the schema rather than a policy anyone has to remember. Cache affinity needs to know whether a repeated prefix is still warm somewhere, so it stores a 12-byte digest of that prefix and never the prefix itself.
Your provider keys are encrypted with Advanced Encryption Standard 256-bit Galois/Counter Mode ("AES-256-GCM"), under a key derived for your account alone by an HMAC (Hash-based Message Authentication Code)-based Extract-and-Expand Key Derivation Function ("HKDF") from a master secret that lives in Cloudflare Worker Secrets and never in the repository. A key is verified against the provider before it is stored, so a typo fails in the moment you paste it rather than inside your production traffic three days later. Delete the account and the keys go with it.
That design has a cost, and it is worth stating rather than discovering. Rotating the master secret makes every stored provider key undecryptable. That is deliberate, and it means a rotation asks every customer to add their keys again. We would rather tell you that now than have it arrive as a surprise on a Tuesday.
Model versions are never stored. The rungs (opus, flagship, pro, flash) resolve to concrete model ids at call time by asking each provider what exists, cached for 24 hours, and they degrade to a date-stamped pin only when that discovery fails. When it does, the response carries a model_drift note saying so, and GET /v1/routing/health shows per provider which answers were live and which were pinned. A router that quietly called a retired model would be worse than one that says it had to guess.
Agent Mystro keeps no copy of your prompts. Per-account, it keeps your encrypted provider keys, your taste vector, your blind picks, and your spend against the cap, alongside the request-log identifiers and cache digest described above. That is what makes the routing yours rather than ours, and together, it is the whole of what is held.
What this does not do yet
The limits, in the same breath as the claims.
- One judge, 10 briefs per battery, six documents for battery b10. That beats an unmeasured guess and it is not a population study.
- Code and general reasoning have no dedicated battery. Their priors are weak, and every response says so.
- Priors refresh when a battery is re-run, not continuously. Models ship monthly, so a prior can age between runs.
- No automatic provider failover, response caching, guardrails, or personally identifiable information (PII) redaction yet. Portkey and LiteLLM ship all four today, and Cloudflare ships caching and rate limiting.
- No self-hosted build, and that is a design consequence: the population prior is learned across customers, so an isolated instance would ship frozen. If prompts may not leave your infrastructure, LiteLLM is the honest answer.
- No System and Organization Controls 2 (SOC 2) report, no European Union (EU) data residency guarantee, no third-party security audit.
- Cost figures are estimates from published list prices, used to enforce your cap. Your provider dashboard remains the billing truth.
Stop guessing which model to use.
One endpoint, your own keys, and a routing decision you can check line by line.