router overhead — rolling p95: 11ms. Illustrative model, not measured results.

Model routing & fallback layer

CHEAP BY DEFAULT.STRONG ON DOUBT.

live

  • −64%unit cost, like-for-like
  • 91.9%first-pick pass rate
  • 11msrouter overhead, p95

Switchyard is a routing and fallback layer between your application and every model you pay for. It scores each request before it leaves, sends it to the cheapest tier that still clears your quality floor, escalates the ones that don’t, and routes sideways when a provider degrades.

Illustrative model, not measured results.

Interlockinglive route table — rungs ordered by cost, cheapest at the footFIG-00ILLUSTRATIVE
020406080100120140160180200L-3Rfrontier reasoning4%L-3frontier19%M-2mid general31%S-1small general38%C-0semantic cache8%n 134n 486n 749n 839n 192capability / cost/chatingress8M / moroute set / last sixreqdifficultyrung set06D 37M-205D 35M-204D 12S-103D 63L-302D 13S-101D 5S-1 → M-2difficulty fingerprint9 msRw 0.34Cw 0.22Fw 0.14Kw 0.20Xw 0.10difficulty D788645926176D3 · complex→ L-3escalation crossover8.1%of routed calls move +1 rungobservedin flight / sessionrequests in transit / cap 36first pickcalls simulated8.1% n 1793091.9%2,400010203040506070809101112131415161718192021222324252627282930
  • 01One request, numbered. It leaves the diagram the moment it reaches its rung.
  • 04Escalated. The gate opens and the packet snaps one rung up, still carrying its number.
  • Flow speed on a track is that rung’s share of routed traffic. Nothing here is decorative.
Illustrative model · FIG-00 · Packet density per track is the routed mix share; escalated calls land one rung above where they were first routed.

02 — why now

THE SAME QUESTION, 43.0× APART.

In eighteen months the count of production-viable general tiers roughly tripled, and the cost of one answer spread out with them. Model selection stopped being a launch-day decision. It is a per-request decision now.

  • 9 → 31Production-viable general tiersVendor-neutral codes only, start of the window to now
  • 43.0×Spread, cheapest rung to dearestOne question, same input and output length on every rung
  • 6Rungs in the default ladderCache, self-hosted, small, mid, frontier, frontier reasoning
Price band by tiercost of one answer, USD per call, log scaleFIG-01ILLUSTRATIVE
$0.00001$0.0001$0.001$0.01General-purpose rungsCache and self-hosted rungsL-3Rfrontier reasoning$0.01980L-3frontier$0.01020M-2mid general$0.00246S-1small general$0.00046H-1self-hosted 8B$0.00008C-0semantic cache$0.0000243.0×S-1 → L-3R · cheapest general rung to dearestUSD per call — log scale
Illustrative model · FIG-01 · Every rung priced on one question at the same input and output length; the deep-reasoning rung bills more output for that same question.

See evidence

03 — the problem

ONE MODEL IS A BET.

Score every tier on one undifferentiated sample of traffic and the answer is always “buy the expensive one.” So you pay frontier prices for the routine half of your calls. The chart is not wrong. It is wrong to measure hard and trivial questions in the same bucket.

Cost against quality, one samplejudge score against cost per thousand calls, log scaleFIG-02ILLUSTRATIVE
60708090$1$10S-171.2M-279.8L-388.6L-3R90.9The rung this chart talks you intoUSD per 1,000 calls — log scaleJudge score, 0–100The month that chart does not showone dot = $500 of a month’s model spendOverprovisioning: routine calls on a frontier tier60%Retry sink: reruns after failures and truncation6%Provider wobble: queueing and re-sends during throttling2%Frontier calls that were actually necessary31%173 × $500$86,500
Illustrative model · FIG-02 · Every tier scored on the same undifferentiated traffic mix — this is the chart that talks teams into buying the top rung.

A mid-sized AI support & document Q&A product (illustrative)

Three bills nobody itemises
Three bills nobody itemisesValue
Overprovisioning: routine calls on a frontier tier$52,300
Retry sink: reruns after failures and truncation$4,900
Provider wobble: queueing and re-sends during throttling$2,100
Frontier calls that were actually necessary$27,200
Total$86,500

Overprovisioning is the large one. Retries and provider wobble are the two that never appear in a model comparison, because a comparison measures one call at a time and these only show up over a month.

And when the model you bet on starts throttling, you have no second choice to fall back to. You have a queue.

04 — difficulty fingerprint

TEN MILLISECONDS. FIVE DIMENSIONS. ONE SCORE.

The fingerprint answers one question, and it answers it before the request leaves your application: how hard is this. Five dimensions, fixed weights, collapsed into one score. No user identity, no history — only this request.

  • 5 / 9 / 14 msLatency (p50 / p95 / p99)
  • $0.00003Cost per call
  • 0.71Agreement with human labels (κ)
  • 84.1%Band accuracy, traffic-weighted
Five dimensions, one scoreweights are fixed and printed on the figure; the score is the router’s only inputFIG-03ILLUSTRATIVE
weights, fixed and summing to onescored inp95 9 msRreasoning depthw 0.34Ccontext spanw 0.22Fformat strictnessw 0.14Kfactual sensitivityw 0.20Xrefusal riskw 0.10Translate this paragraph into EnglishR12C8F20K15X5difficulty D12BandD1routinerouted toS-1Extract the tables in this PDF as JSONwith schema validationR34C62F96K55X12difficulty D51BandD2standardrouted toM-2Given these three contracts, can we terminate unilaterallyR78C86F45K92X61difficulty D76BandD3complexrouted toL-3
Illustrative model · FIG-03 · five axes per request, weights as printed; D is the weighted sum

Four difficulty bands

Four difficulty bands
BandRangeShare of traffic
D1routineD < 2542%
D2standard25–5534%
D3complex55–8019%
D4high-stakesD ≥ 805%
Size
60M encoder, self-hosted
Fine-tuned on
1,200,000 labelled requests

A small self-hosted encoder does the scoring, so working out where a request should go never requires sending it anywhere first.

It gets it wrong sometimes. The calls it scores too low are caught by the ladder. The calls it scores too high are money we wasted, and we print that number rather than round it away. Tighten the thresholds and the waste shrinks while escalation rises. The knob is yours.

Under-routing
Scored a rung too low. The ladder catches these — they are the main source of escalation.
Over-routing
Scored a rung too high. Nothing catches these: it is money we spent for nothing, roughly 11% of the bill.

Open the glossary

Where it is wrongrow-normalised, % of traffic in each actual bandFIG-03BILLUSTRATIVE
Predicted bandActual bandD1D2D3D4D191.27.90.80.1D29.479.810.10.7D31.114.677.27.1D40.22.418.379.1rows normalised to 100Band accuracy, traffic-weighted84.1%Under-routed — the ladder catches these7.2%Over-routed — this is the money wasted8.7%Over-routed — this is the money wasted$0.439USD / 1k11% of the routed bill
Illustrative model · FIG-03B · Band accuracy is weighted by traffic. Under-routed calls are picked up by the ladder; over-routed calls are the waste.

05 — route budget

A BUDGET IS A CONSTRAINT, NOT A REPORT.

Each endpoint declares a ceiling in dollars per thousand calls, and the router solves inside it. When headroom runs out the whole ladder shifts down a rung for the rest of the day. Nobody gets an email after the money is already gone.

The routing treeevery edge carries its condition, every leaf its share of trafficFIG-04ILLUSTRATIVE
first checksemantic cache hit?cos ≥ 0.94 && same tenant && same prompt_versionD142 pproutineD234 ppstandardD319 ppcomplexD45 ppC-08S-130M-24S-18M-222L-34M-25L-313L-3R1L-32L-3R30102030405060708090100share of all traffic, percentage pointsΣ 100 ppPathRungppD1cache hitC-08D1D1 → budget headroomS-130D1D1 → factual sensitivity K ≥ 70M-24D2D2 → format strictness F < 80S-18D2D2 → defaultM-222D2D2 → K ≥ 85 or F ≥ 95L-34PathRungppD3D3 → under 20% budget headroomM-25D3D3 → defaultL-313D3D3 → R ≥ 85L-3R1D4D4 → under 20% budget headroomL-32D4D4 → defaultL-3R3
Illustrative model · FIG-04 · Leaf shares add up to all routed traffic. Move the budget and the selected branch actually changes — the tree is re-solved, not re-drawn.

Every decision is one path through a readable tree. Each request carries the reason it took the edge it took: the band it landed in, the rule that fired, the rung it was given.

Four side rules can override the tree. Strict formats force a schema-validated rung. Fact-sensitive calls lose the smallest rung. Thin budget pushes the whole ladder down. Calls likely to be refused race two rungs and take the first one that clears the floor.

See how it plugs in

Budget and actual, per endpoint

USD per 1,000 calls

Budget and actual, per endpoint
EndpointQuality floorBudgetActualHeadroom
/chatsupport chatjudge p10 ≥ 74$4.20$2.8133%
/docqadocument Q&Ajudge p10 ≥ 78$5.50$4.2223%
/extractstructured extractionschema pass ≥ 99.0%$4.80$3.6823%
/reviewcontract & code reviewjudge p10 ≥ 84$9.60$8.6510%

Budgets are hard caps in this illustrative deployment; every endpoint is running under its own.

06 — fallback ladder

FAIL SIDEWAYS, NOT DOWN.

A ladder is an ordered chain of rungs — a model tier, its parameters, a prompt version, a trigger condition and a maximum wait. A timeout, an error, a schema failure or a score below the floor moves the request to the next rung. The same ladder runs in both directions.

  • 91.9%first-pick pass rate8,455 / 9,200
  • 8.1%ladder triggered745 / 9,200
  • 1.4%Escalation churn< 2.0%
Ten thousand requests, end to endcache, first pick, each rung of the ladder, and what falls off the endFIG-05ILLUSTRATIVE
per 10,000 arrivalsanswered, one way or another99.99%arrive10,000served from cache800routed9,200first pick passes8,455ladder triggered7458.1%02,0004,0006,0008,00010,000of the calls that triggered the ladderhatched = counted as a failureresolved at +1 rung589resolved at +2 rungs127resolved at top rung25brownout response3hard failure1ladder triggeredΣ 745first-pick pass rate91.9%escalation rate8.1%Gained on escalation, judge points+12.0
Illustrative model · FIG-05 · Counts are per ten thousand arrivals. The escalation rate here is the same number the hero counter is reading.

What the ladder costs

The price of a ladder is latency. Median time to an answer falls hard, because most requests never needed a frontier model. The far tail gets slightly worse, because an escalated request makes two hops. That is the honest trade and it is in the chart.

If an endpoint cannot absorb that tail, run two rungs in parallel and pay for the one you throw away.

What the ladder costs
PercentileBaselineRoutedDelta
P502,265ms955ms−58%
P753,532ms1,927ms−45%
P905,911ms4,223ms−29%
P957,545ms7,257ms−4%
P9913,332ms13,511ms+1%
Latency, both distributionsWhat the ladder costsFIG-06ILLUSTRATIVE
RoutedBaselineshare of calls, %0102030400–250250–500500–1k1k–2k2k–4k4k–8k8k–16kend-to-end latency, ms — log-spaced bucketsPercentileBaselineP502,265msP753,532msP905,911msP957,545msP9913,332msRoutedP50955msP751,927msP904,223msP957,257msP9913,511msP99 +1% · hatched = worse than baselineRouter overheadfingerprint / decision & budget, p95 9 / 4 msP506msP9511msP9919ms
Illustrative model · FIG-06 · end-to-end latency, log-spaced buckets, both distributions on the same axis

07 — quality floor

YOUR FLOOR. NOT OURS.

Each endpoint declares its own minimum: a judge score at the tenth percentile, or a schema pass rate. It is not negotiable. Savings are only ever taken from the headroom above it.

  • −2.3Blended judge score89.1 → 86.8
  • +2.8The tail went the other wayp5 68.4 → 71.2
Four endpoints, each against its own floorEvery endpoint declares its own floor, in its own unit — a judge-score percentile for prose, a schema pass rate for structured output. All four clear the floor they declared. The savings differ by a factor of three, and the reason is always the floor.FIG-07ILLUSTRATIVE
Share of trafficDeclared floorMeasuredUSD / 1kSaving/chatsupport chat46%judge p10 ≥ 74p10 = 79.160100$2.8174%/docqadocument Q&A29%judge p10 ≥ 78p10 = 81.660100$4.2261%/extractstructured extraction18%schema pass ≥ 99.0%99.4%95100$3.6866%/reviewcontract & code review7%judge p10 ≥ 84p10 = 85.260100$8.6520%Σthe gap right of the floor line is the headroom savings come out of$3.7865%
Illustrative model · FIG-07 · shares sum to 1.00; saving is like-for-like against the single-tier baseline

The tail went the other way

The blended judge score drops a couple of points and we are not hiding it. The bottom of the distribution improves, because a declared floor forces a redo on the worst answers — something a single-tier setup never notices, since it has nothing to compare them against.

What that averages out to
BasisBlended judge score
Baseline, everything on the frontier tier89.1
Routed, first pick only85.8
Routed, after the ladder86.8
Judge score by difficulty band and tierthe table to read before fixing a tier for anythingFIG-07BILLUSTRATIVE
Judge score by difficulty band and tier
TierD1 routine · 42%D2 standard · 34%D3 complex · 19%D4 high-stakes · 5%
C-088.285.0——
S-186.879.466.151.8
M-289.186.176.363.2
L-390.489.887.978.6
L-3R90.690.289.485.4
Illustrative model · FIG-07B · Blank cells are combinations we do not route. Column weights are the traffic share of each difficulty band.

20%

/review · contract & code review

One endpoint in the reference deployment barely saves anything. That is the correct result: its floor already sits close to the ceiling of the tiers that could serve it, so there was never much headroom to take.

08 — cost per resolved call

BILL THE ANSWER, NOT THE TOKEN.

The denominator is answers your product accepted. The numerator includes retries, the lower-rung attempts thrown away during an escalation, judge scoring, classifier amortisation and shadow replay. Per-token billing hides every one of them.

  • −64%unit cost, like-for-like$10.81 → $3.88
  • −53%Bill$86.5k → $40.4k
  • +30%Calls (M)8.0 → 10.4
Six months of bills, against the counterfactualmonthly spend as routing coverage ramps, with traffic growing underneathFIG-08ILLUSTRATIVE
Bill actually paidSame traffic on one tier throughoutthe area between them0306090120M0 baselineM1M2M3M4M5M6monthly bill, thousand USD112.440.4the area between themrouting coverage08.0158.2358.5608.9829.4959.910010.4calls / month, millionsBill actually paid−53%$86.5k → $40.4kcalls / month, millions+30%8.0 → 10.4USD per 1,000 calls−64%$10.81 → $3.88
Illustrative model · FIG-08 · Traffic grows across the window, so the falling line is a unit-cost result rather than a quieter month.
Where the routed unit cost goesUSD per 1,000 callsFIG-08BILLUSTRATIVE
USD per 1,000 calls$0$3$6$9$12Baseline$10.81Routed$3.884−64%model inference (5 tiers)$3.669The four lines a deck leaves out×100escalation waste$0.073shadow replay (3% of traffic)$0.105fingerprint classifier$0.030judge scoring (6% sampled)$0.007$0$0.12RoutedΣ $3.884
Illustrative model · FIG-08B · USD per 1,000 calls · Total $3.884

Three of those lines are ours to pay, and we print them anyway — escalation waste, shadow replay, classifier amortisation. Leaving them out is how a deck beats reality.

The two lines in the chart are the bill that was paid and the bill the same traffic would have cost on one tier. The area between them is the whole argument.

Cost per resolved call

Cost per resolved call
BasisUnit costAccepted rateCost per resolved call
Baseline$10.8194.1%$11.49
Routed$3.8894.6%$4.11

11%

Over-routing

Scored a rung too high. Nothing catches these: it is money we spent for nothing, roughly 11% of the bill.

09 — shadow replay · swap window

NEW TIERS LIVE IN THE SHADOW FIRST.

A slice of live traffic is mirrored to candidate tiers offline. Those responses are never returned to anyone. They only update quality scores and confidence intervals.

  • 3%Shadow replay312,000 / mo
  • 5,0005,000 shadow samples2–4 d
  • ±0.6CI lower bound within 0.5 pointsσ ≈ 22
How the interval narrowshalf-width of the judge-score interval against shadow sample countFIG-09ILLUSTRATIVE
interval half-width, judge pointsexpected half-width at this sample countσ ≈ 22±0±1±2±3±0.6swap threshold±3.1200±1.9500±1.41,000±1.02,0005,000±0.410,000±0.320,000shadow samples on one endpoint — log scaleinterval half-width, judge pointsPromotion rampswap threshold · 5,000 · 7 d15%225%3100%
Illustrative model · FIG-09 · Shadow traffic is billed like any other call, and that cost is already inside the unit cost in the previous section.

A candidate clears three gates before it can become a default: enough shadow samples on the same endpoint, enough consecutive days, and an interval whose lower bound stays close to the incumbent. Promotion then ramps in three steps rather than one switch.

Three gates

5,000 shadow samples
On the same endpoint. Not 5,000 across the deployment — endpoints do not generalise to each other.
Seven consecutive days
Enough to contain a weekend and a Monday, which look nothing alike.
CI lower bound within 0.5 points
The 95% interval’s lower bound may not sit more than half a point below the incumbent.

The sample threshold is not a round number somebody liked. It is the point where the interval narrows enough that half a point of difference stops being noise.

Tier · Status

C-0 reuse layer, H-1 fingerprint / fallback, S-1 D1 primary, S-2 D1 long-context, M-2 D2 primary, M-3 /extract candidate, L-3 D3 primary, L-3R D4 primary (output ≈3×), X-9 removed 2026-06

Tiers leave as well. Last quarter some were promoted, one was rolled back, two were retired. A routing layer that only ever adds is not maintaining a ladder. It is collecting one.

5% → 25% → 100%Then it ramps

10 — brownout · stance

DIM THE LIGHTS, DON’T CUT THE CITY.

When a provider throttles or falls over, the endpoint drops to lower rungs, caps output length and switches its top tier off. It keeps answering. A degraded answer beats an error page.

  • 31.4%Upstream failure rateupstream 5xx+429 > 8% over 60s
  • 1.1%User-visible error ratedetected in 40s
  • 41.2%Answers from a degraded rungBlended judge score 86.9 → 81.6
One incident, minute by minuteupstream failure, user-visible errors, degraded share and judge score on one clockFIG-10ILLUSTRATIVE
Illustrative incident: frontier provider 429 rate spikes 0.3% → 31.4%upstream 5xx+429 > 8% over 60sUpstream failure rate31.4%3508% / 60sAnswers from a degraded rung41.2%450User-visible error rate1.10%1.20Blended judge score86.9 → 81.68878+4mincutover · detected in 40s0481216202428minutes from first error
Illustrative model · FIG-10 · The marked minute is when the ladder was cut over. Everything after it is the cost of staying up.

In the illustrative incident the upstream failure rate goes double digits and the user-visible error rate barely moves. The price is printed next to it: a large share of answers came from a degraded rung, and the blended score sat lower for as long as the incident lasted. Detection is measured in seconds, not in support tickets.

Trigger rule: upstream 5xx and 429 above 8% over 60 seconds.

top rung on /chat and /docqa swapped L-3 → M-2, output cap 1024 → 512, L-3R disabled

Five things we don’t do

  1. We don't train or host model weights, apart from one 8B classifier/fallback of our own.
  2. We don't publish leaderboards or named-vendor quality comparisons.
  3. We don't retain prompt or completion bodies by default — only fingerprints, routing decisions and metrics. Body retention is opt-in.
  4. We don't set your quality floor. That's a product decision, not a default.
  5. We don't lock you in. Ladders are plain text; export them and run without us.

Each one costs us something. That is why they are worth writing down.

We will also tell you when not to buy this: one endpoint, one model, a small monthly bill, or a floor that already sits at the ceiling of what could serve it. Where we stand