
The short answer: Unify picks the model for you from its benchmarks. nRouter hands that decision back — you pin a model per prompt template, run two named models against your own scoring set, and read the real per-request cost off the response. Quality-per-dollar measured on your traffic, not on someone else's leaderboard.
Unify AI's pitch is a good one, and it is worth stating fairly before arguing with it: model quality moves, prices move, latency moves, and keeping a per-task ranking current is work that most teams will never do. Unify does that work continuously and routes each call to whichever model its benchmarks say wins on your chosen quality/cost/speed trade-off. If your alternative is hardcoding one model and never revisiting it, Unify is strictly better than what you have.
The search that brings people to an Unify AI alternative page is usually not "the router picked badly". It is one of two more specific things: the routing decision became something you needed to explain to somebody, or the work that grew was governance rather than model selection. Both are worth taking seriously, and neither is a bug in Unify's product.
A vendor benchmark is not your eval
This is the substantive disagreement, so it goes first.
Every published model leaderboard — Unify's included, and every academic suite they and everyone else draw on — is an average over a prompt distribution. The distribution is not yours. Your prompts have a house style, a domain vocabulary, a length profile, a tool-call pattern and a failure mode that matters more than the others. A ranking built on a general distribution tells you which model is better on average across prompts that are not yours.
Four ways that gap shows up in production:
- The rubric is not your rubric. A benchmark scores correctness, or preference, or a task-specific metric. Your actual acceptance criterion might be "never invents a policy number", or "always emits valid JSON on the first attempt", or "stays under 200 words". A model that ranks third on a general suite can be first on a rubric with one hard constraint in it.
- Prompt–model coupling is real. A prompt tuned against one model's instruction-following habits does not transfer cleanly. Swapping the model under a fixed prompt measures the pairing, not the model. A router that swaps freely is silently re-running that experiment on every call.
- Tail behaviour is where incidents live, and averages hide it. The question that wakes you up is not "which model is better on average" but "which model fails in a way my downstream parser cannot survive". That is a p99 question, and a leaderboard is a mean.
- Refresh cadence is a dependency you did not choose. When a benchmark refreshes, the routing behaviour of your production system can change without a deploy on your side. For some teams that is the feature. For a team whose change-management process requires a reviewed diff for behaviour changes, it is a finding.
None of that says "do not use benchmarks". It says a benchmark belongs at the shortlisting stage, and your own scored traffic belongs at the decision stage. The general version of that argument is in LLM routing strategies for 2026.
Computing cost-per-passing-answer from your own requests
Here is the method that replaces "trust the leaderboard" with a number you generated. It needs three things, all of which are on every nRouter plan: an A/B assignment across two named models, an eval that scores the output, and a truthful per-request cost.
Step 1 — pin the comparison. Pick one prompt template that carries real
volume and two candidate models from the served catalogue on
/models, for example claude-sonnet-4-5-20250929 against gpt-5-mini. Two,
not five: the point is a decision, not a tournament. Read each candidate's list
rate before you start, from the source that publishes it — for the Claude family
that is Anthropic's pricing page, for the
GPT family OpenAI's API pricing, and for the
models served through Bedrock AWS's own rate card.
Those rates set your expectation. Step 5 is what tests it, and the two answers
disagree more often than they agree.
Step 2 — split live traffic. Assign the variant at the template, so both arms see the same prompt distribution — yours — over the same window.
Step 3 — read the real cost off each response. The gateway returns it:
HTTP/1.1 200 OK
x-nr-request-id: 4d18ba0c-...
x-nr-request-cost: 0.0112
x-nr-cost-status: exactWhen the cost cannot be computed, the x-nr-request-cost header is absent
and x-nr-cost-status reads unpriced. It is never 0. That matters here
more than anywhere else in this post: a zero silently drags an average down
and makes the cheaper-looking arm win an argument it did not win. Drop
unpriced requests from the denominator, or resolve them — do not sum them as
free.
Step 4 — score the arm, not the model. Run your eval over each arm's outputs. Pass rate is whatever your acceptance criterion is; if you have not written one down, that is the actual first task.
Step 5 — divide.
cost per passing answer = total arm cost / passing responses in that armThat single number is what "quality per dollar" means once it stops being a slogan. A model that costs 40% more per call and fails half as often is cheaper by this measure, and no general leaderboard could have told you so, because the pass criterion was yours — nor could the published rate cards, which price a token and say nothing about how many tokens your prompt needs to reach an acceptable answer. Re-run it when you edit the prompt, not when a benchmark refreshes.
The mechanics of both halves are in cost-vs-quality LLM routing: which tasks can go cheap and reading a spend ledger.
Side-by-side: who holds the routing decision
| Axis | Unify AI | nRouter |
|---|---|---|
| Who chooses the model for a call | The router, from its benchmark set | You, per prompt template |
| Basis for the choice | Continuously refreshed vendor benchmarks | Your eval on your traffic |
| Reproducing a past call | Requires knowing the router state at that moment | Same template, same model, by construction |
| Behaviour change without a deploy | Possible when benchmarks refresh | No — routing config is a change you make |
| A/B across two named models | Different shape — see unify.ai | Included on every plan |
| Evals on your own traffic | See unify.ai | Included on every plan |
| Guardrails on input and output | See unify.ai | Included on every plan |
| Prompt versioning | See unify.ai | Included on every plan |
| Per-team and per-key budget ceilings | See unify.ai | Included on every plan |
| Fee shape | Plan-dependent — see unify.ai | One platform fee: a flat 4% of your credits on pay-as-you-go, 0% on Pro |
| Provider credentials | Per their docs | Managed for you — no BYOK |
| Benchmark-driven arbitration | First-class | Not shipped, and not planned |
Unify AI cells defer to their published pages rather than quoting numbers we would have to keep fresh; their gating language and pricing move on their cadence.
Unify AI is a trademark of its owner. nRouter is not affiliated with or endorsed by them. All claims are sourced from their public pricing or documentation on the dates linked below; if any have changed, email hello@nrouter.ai and we will update.
What Unify AI does better
Three, and the first is the whole product.
- They do the benchmark maintenance so you do not. Tracking per-model quality drift, re-running suites when a provider ships a point release, keeping a cost-versus-quality curve current — that is continuous work with no end date. If nobody on your team owns it, a vendor who does own it is worth paying. Our answer is "score your own traffic", which is better only if you actually do it.
- Zero decisions at integration time. Send the prompt, get a good answer, never think about model names. For a small team shipping fast, removing a decision is a feature. Operator-pinned routing hands you back a decision you may not want.
- A cold-start answer. Before you have traffic, you have no eval and no pass rate — you have nothing to divide by. A benchmark is genuinely the best available signal at day zero. Our method needs volume before it says anything, and we would rather admit that than pretend a new project can run step five on its first afternoon.
The incident you have to debug
The clearest practical difference is not in a feature table. It shows up at 02:00.
A downstream parser starts rejecting responses. You have a request id and a timestamp. The question is which model produced the bad output, and whether it produced it because of the model, the prompt, or the input.
With operator-pinned routing the model is a property of the prompt template, so the first question is already answered before you open anything: this template calls this model, and it did an hour ago too. You are debugging one variable.
With arbitration, the model is a property of the call, decided by a policy whose inputs — benchmark state, live latency, price — were what they were at that moment. Good arbitration products record the decision, and you should check exactly how far back that record goes and what it contains before you depend on it. But recording a decision is not the same as being able to re-run it: the state that produced it has moved on.
That difference is worth roughly nothing when things work and a great deal for the hour when they do not. Request-level logging on the nRouter side is covered in LLM observability and request logs, and the failure-code contract in handling 429 and 402.
The fee shape, in one line
The only nRouter number you need to carry into a Unify comparison is the platform fee: a flat 4% of your credits on pay-as-you-go, 0% on Pro, added on top when you buy credits, so the credits you load reach your balance in full. It does not vary with which model the routing decision lands on, which is the property that matters when you are about to start moving traffic between models on purpose — you can optimise for cost-per-passing-answer without a fee that moves underneath the experiment. Plans, limits and the rest of the table are on /pricing.
Why none of the governance surface sits behind that fee has its own home: every feature on every plan: we charge a fee, not a gate. It matters here because an A/B test and an eval are exactly the features a tiered product tends to put one plan up, and you need both to run the method in this post.
Switch cost: one base URL, one API key
nRouter speaks the OpenAI wire format:
const client = new OpenAI({
- baseURL: 'https://api.unify.ai/v0',
- apiKey: process.env.UNIFY_API_KEY,
+ baseURL: 'https://api.nrouter.ai/v1',
+ apiKey: process.env.NROUTER_API_KEY,
});The Unify base URL above follows the shape documented at unify.ai and may drift — re-verify at port time. Message arrays, tool calls and streaming consumers are unchanged.
One substantive difference, stated plainly: if your model string invokes a
Unify router rather than naming a model, there is no equivalent string on our
side. You name a served model — claude-sonnet-4-5-20250929, gpt-5-mini,
claude-haiku-4-5, whatever the current list on /models says — and
the routing policy becomes configuration you wrote. The provider publishes what
each of those identifiers means; for the Claude candidates that is
Anthropic's models overview,
which is the page to read before you pin one.
Rebuilding a dynamic-router pattern explicitly
You can get most of the behaviour back. It just becomes yours.
| Unify behaviour | Explicit equivalent |
|---|---|
| Route to the cheapest model above a quality bar | Pin the cheap model; fall back on failure; keep an eval running on the pinned arm |
| Route to the fastest model right now | Ordered fallback chain, fastest first, with a timeout that trips to the next |
| Re-rank when a model degrades | Your eval pass rate is the trigger; you change the pin |
| Balance quality against cost per call | The cost-per-passing-answer number from earlier, recomputed per template |
| Benchmarks refreshed for you | No equivalent — this is the thing you are giving up |
The trade is legible: you gain reproducibility, an audit trail and a decision you can defend in a review; you take on the job of noticing when a model degrades. If nobody on your team will own that job, be honest about it now rather than three months in.
When nRouter is the right choice
Two or more should be true:
- Somebody outside engineering has asked why a given answer was produced, and "the router decided" was not an acceptable answer.
- Your change-management process needs behaviour changes to arrive as reviewed diffs, not as upstream refreshes.
- You already have, or are willing to write, an acceptance criterion you can score — the method above is worthless without one.
- The work queued on your roadmap is governance work: guardrails, prompt versioning, per-team ceilings, per-customer keys.
- You want the per-request cost to be a number you can read and reconcile, including when it is honestly unknown.
When to stay on Unify AI
- Nobody will own model-quality tracking. If the pin will be set once and never revisited, a maintained router beats a stale pin. This is the common case and we would rather say so.
- You are pre-traffic. No requests means no eval, no pass rate, nothing to divide. Come back when you have a week of production volume.
- Benchmark-driven arbitration is the product you are buying. We do not ship it, it is not on the roadmap, and configuring fallback chains by hand is not the same thing. Do not let anyone tell you it is.
- A model you need is not in our catalogue. Check /models before the migration ticket, not after.
- You need a completed SOC 2 Type II report today. Ours is in progress, not certified — see /security, and the control-level view in a SOC 2 checklist for LLM gateways.
Try it
Pay as you go starts at $5. Add a card and load the $5 minimum, with the platform fee on top. That is enough to run steps one through five on one real template and get an actual cost-per-passing-answer number for two models.
→ Get started at app.nrouter.ai/signup
If you would rather have company for the first run, bring one prompt template and your acceptance criterion to a walk-through call and we will set up the split and the scoring with you.
Questions? Drop into the public nRouter Slack — #support for
migration questions, #feature-requests for routing patterns you want to see
first-class.
See also
- LLM routing strategies for 2026 — the full taxonomy of routing approaches, of which arbitration and pinning are two.
- Cost-vs-Quality LLM Routing: Which Tasks Can Go Cheap — the hands-on version of the A/B and scoring loop this post sketches.
- Every Feature on Every Plan: We Charge a Fee, Not a Gate — why the A/B and eval features this method needs are not one plan up.
- Reading a spend ledger — how to reconcile the per-request cost headers against what you were actually charged.
- Eden AI alternative — the other scope-boundary comparison in this cluster, on modality breadth rather than routing authority.
- Cutting LLM costs: what published discounts actually save, and where the model is an assumption — what to do once you know which model wins per dollar, and which levers carry a published rate.
- Pricing — the plan table and the fee, in one place.
Sources
All Unify AI and provider claims above are sourced from each vendor's public pricing or documentation page. Every link below was re-checked on 2026-08-23. Model names are drawn from the live served list at /models. If a vendor updates their tiers and we have not refreshed, email hello@nrouter.ai and we will re-audit within one business day.
- Unify AI: unify.ai
- Anthropic pricing: anthropic.com/pricing — the published list rate for a Claude candidate, the expectation Step 5 tests.
- OpenAI API pricing: openai.com/api/pricing — the same for a GPT candidate.
- AWS Bedrock pricing: aws.amazon.com/bedrock/pricing — the rate card for models reached through Bedrock, which is live on nRouter.
- Anthropic models overview: platform.claude.com/docs/en/models/overview — what each Claude model identifier named in the switch section refers to. Added and checked 2026-09-11.
- nRouter served models: nrouter.ai/models
- nRouter pricing: nrouter.ai/pricing
Unify AI, Anthropic, OpenAI and AWS are trademarks of their respective owners. nRouter is not affiliated with or endorsed by them.


