The Retry Tax

Small-model delegation is sold as a simple trade: route easy tasks to a cheap model, keep most of the bill's savings, and count them as booked. That trade only holds if the system knows when the cheap model failed. Most routers never check; they classify a prompt once. When the cheap model is wrong, someone eventually retries, and if that retry loop is blind, same tier, same prompt, hoping for a different sample, every wasted attempt is billed in full before the task reaches a model that could have solved it. This post builds a break-even model for that failure mode: given a cheap-to-premium price ratio and a number of blind retries before escalation, at what task failure rate does routing stop saving money at all? The formula is short, the answer collapses fast at realistic retry counts, and the fix is the same mechanism behind verifier-gated cascades: escalate on the first sign of failure, not the fourth. All figures are illustrative, not measured production data.

Published 2026-08-24 by Dor Amir on the Nadir blog.

Filed under Routing & Cascades.

Abstract.

Model routing is pitched as a straightforward trade: classify a prompt, send it to the cheapest model that can handle it, keep most of the savings. The pitch assumes the router knows when it guessed wrong. Most production routers don't check. They score the prompt once, before generation, and count the savings as booked the moment the request goes out. When the cheap model's answer is wrong, someone has to notice and retry, and if that retry loop is blind (same tier, same prompt, no new signal) every wasted attempt is billed in full before the task ever reaches a model that could actually solve it. This post builds a break-even model for that failure mode: given a price ratio between a cheap and a premium model, and a number of blind retries a naive router attempts before escalating, at what task failure rate does routing stop saving money at all? The formula is short: p_be = (r − 1) / (r + k − 1). At realistic retry counts it collapses fast. The fix already exists in production cascade systems, escalate on the first sign of failure instead of the fourth, and it is cheaper than what most naive routers do today.

All data and charts in this post are illustrative, modeled from a break-even framework, not measured production traces. Not derived from proprietary customer data. Sources cited throughout.

The research question.

Small-model delegation, sending simple tasks to a cheap model and reserving a premium model for hard ones, is the most common lever teams reach for first when an LLM bill gets too big. The pitch is simple: if a $0.02 model can do 70% of your traffic as well as a $0.10 model, route the 70% and keep the difference.

That pitch has a silent assumption baked in: that a wrong answer from the cheap model is free to detect and cheap to recover from. In practice, most routers are pre-generation classifiers. They look at the prompt, predict a difficulty tier, and send the request. We've written before about why that shape of router is a guess, not a measurement: it commits to a model before anyone has seen an answer. When the guess is wrong, the system needs a second mechanism to catch it, and what that mechanism does next determines whether the routing decision actually saved money or just moved the cost somewhere less visible.

Two very different things can happen next. A verifier can check the cheap model's answer once and escalate immediately on failure. Or, more common in systems built without a dedicated verification step, the caller (a retry wrapper, an orchestration framework's default error handling, or a human clicking "regenerate") can retry the same cheap tier one or more times before giving up and calling the premium model. The second pattern is what this post calls the retry tax: blind retries that add cost and latency without adding information.

The research question: given a price ratio between a cheap and a premium model, and a number of blind retries a router attempts before escalating, at what task escalation rate does small-model delegation stop saving money at all, and how does that break-even point move as blind retries are replaced with a single verification step?

Methodology.

This is an analytical framework, not a measured benchmark. Every number below is illustrative and stated as an assumption, not a claim about any specific production system. The framework generalizes; the constants don't need to match your workload to be useful, only the shape of the tradeoff does.

Core assumptions used throughout:

ParameterValueMeaning
Cheap model cost$0.02 / taskSmall or mid-tier model, one call
Premium model cost$0.10 / taskFrontier model, one call (r = 5x price ratio)
Task escalation rate (p)30% (representative)Share of tasks the cheap model cannot resolve
Blind retries before escalation (k)4 (naive) vs. 0 (verified)Same-tier retries with no new signal before falling back
Verifier cost$0.0075 / taskA calibrated check that reads the cheap model's answer before it ships
Compression discount20%Applied to per-call token cost via context/schema compression
Caching discountAdditional 15%Applied on top of compression, cache hits on repeated prefixes

The central relationship: a naive router that retries blindly on the cheap tier pays for every discarded attempt, plus the eventual escalation. A verified cascade pays a small, fixed verification cost on every task and escalates directly on the first rejection. The cost of an escalated task under each design is:

Everything downstream, the charts, the tables, the break-even curve, follows from sweeping these two designs across price ratios and escalation rates.

Where the tokens actually go.

Chart 1: Where tokens go when an agent task needs escalation. A task resolved on the first pass bills 2,400 tokens across reasoning, query generation, retrieved context, result reading, and final synthesis. A task escalated after 4 blind retries bills 12,000 tokens, 5x more, because the same five stages repeat on every discarded attempt.
Chart 1: Where tokens go when an agent task needs escalation. A task resolved on the first pass bills 2,400 tokens across reasoning, query generation, retrieved context, result reading, and final synthesis. A task escalated after 4 blind retries bills 12,000 tokens, 5x more, because the same five stages repeat on every discarded attempt.

A task that resolves cleanly on the first pass and a task that gets escalated after blind retries don't just differ in which model answers, they differ in how many times the entire pipeline runs. Reasoning, query generation, retrieved context, and result reading all repeat on every blind attempt, not just the final one. In this illustrative model, a clean pass bills 2,400 tokens; an escalated task that burns 4 blind retries before falling back to the premium model bills 12,000, a 5x multiplier that has nothing to do with the premium model's own overhead and everything to do with the retries. Retrieval and context overhead compound the same way inside a single step; the retry tax compounds it again across attempts.

The retry tax on the naive router.

Chart 2: The retry tax eats into router savings. At 100,000 tasks a month with a 30% escalation rate and a 5x cheap-to-premium price ratio, a naive premium-only baseline costs $10,000. Blind routing without a verifier costs $6,800, a 32% reduction. Adding compression brings it to $5,440, a 45.6% reduction. A cache-aware verified cascade reaches $4,150, a 58.5% reduction.
Chart 2: The retry tax eats into router savings. At 100,000 tasks a month with a 30% escalation rate and a 5x cheap-to-premium price ratio, a naive premium-only baseline costs $10,000. Blind routing without a verifier costs $6,800, a 32% reduction. Adding compression brings it to $5,440, a 45.6% reduction. A cache-aware verified cascade reaches $4,150, a 58.5% reduction.
ConfigurationCost / 1,000 tasksvs. naive
Naive: single premium model$10,000baseline
Router-based (blind, no verifier, k=4)$6,800−32.0%
Compression + blind router$5,440−45.6%
Cache-aware verified cascade (k=0)$4,150−58.5%

Blind routing captures real savings, 32% is not nothing, but it leaves a specific amount of money on the table: the cost of 4 wasted cheap-model attempts on every one of the 30% of tasks that needed escalation anyway. Compression helps because it shrinks every attempt, wasted or not, which is why it recovers another 13.6 points without touching the retry logic at all. The full recovery, another 12.9 points on top of that, comes from removing the wasted retries entirely: a verifier that checks the first answer and escalates on rejection, instead of hoping the second, third, or fourth blind attempt does better. Stacking routing, compression, and caching together doesn't add linearly, and the same is true here: compression and verification attack different parts of the same bill, and the order they're applied in changes how much each one has left to save.

The break-even point collapses fast.

This is the finding that matters most. Blind retries don't just tax the cost of routing, they change the escalation rate at which routing is worth doing at all.

Chart 3: Blind retries collapse the break-even point. At a 5x cheap-to-premium price ratio, a verified router with zero blind retries never costs more than staying on the premium model, its break-even point is 100% escalation. With 2 blind retries before escalation, break-even drops to 67%. With 4, it drops to 50%. With 8, a real failure mode in naive multi-agent systems that resample the same tier hoping for a different draw, it drops to 33%.
Chart 3: Blind retries collapse the break-even point. At a 5x cheap-to-premium price ratio, a verified router with zero blind retries never costs more than staying on the premium model, its break-even point is 100% escalation. With 2 blind retries before escalation, break-even drops to 67%. With 4, it drops to 50%. With 8, a real failure mode in naive multi-agent systems that resample the same tier hoping for a different draw, it drops to 33%.

The relationship has a closed form. Let r be the price ratio between the premium and cheap model, and k be the number of blind retries a router attempts on the cheap tier before falling back. The escalation rate at which routing savings hit exactly zero is:

p_be = (r − 1) / (r + k − 1)

At r = 5 and k = 0 (a verifier that escalates on the first rejection), p_be = 1.0: routing can never cost more than staying on the premium model, no matter how bad the underlying task mix is, because the only overhead on a wrong answer is the verifier's own small cost. At k = 2, p_be drops to 0.667. At k = 4, a fairly ordinary retry-then-give-up pattern in systems without a confidence check, p_be drops to 0.5: once half your traffic needs the premium model anyway, blind retrying has already erased the entire benefit of routing. At k = 8, the kind of resampling loop that shows up in naive multi-agent frameworks trying the same subagent repeatedly before an orchestrator gives up on it, p_be falls to 0.333.

This is the mechanism behind FrugalGPT's cascade architecture and the reason verifier-gated cascades outperform pre-generation classifiers on RouterBench: the cascade's advantage isn't just that it's accurate, it's that its failure mode is bounded. A verified cascade with k = 0 degrades gracefully toward the cost of the premium-only baseline as task difficulty increases. A blind-retry router degrades past it, and does so faster the more retries it allows before giving up.

The retry-storm pattern itself isn't new to LLM systems. Distributed systems engineering has been here before: retrying a failing call against the same backend, without backoff or a circuit breaker, is a well-documented way to turn a small failure rate into an outage. AWS's Builders' Library covers the same shape of problem in the context of network calls, and Google's SRE book devotes a full chapter to how naive retries cause cascading failures. An LLM router that blindly retries a cheap model is the same failure mode with a token bill attached instead of a downtime page.

Latency: the tax hides in the tail.

Chart 4: The retry tax hides in the tail, not the median. A blind retry loop that attempts 4 retries before escalating has a P50 latency of 1.2 seconds, which looks fine, but a P95 of 9.3 seconds, because the failure path pays for 4 sequential cheap-model calls plus the escalation. A sequential verified cascade brings P95 to 6.0 seconds. A speculative parallel cascade, firing the cheap and premium model at once and using whichever the verifier clears first, brings it to 4.5 seconds. An optimized pipeline combining parallel execution with caching reaches 4.3 seconds.
Chart 4: The retry tax hides in the tail, not the median. A blind retry loop that attempts 4 retries before escalating has a P50 latency of 1.2 seconds, which looks fine, but a P95 of 9.3 seconds, because the failure path pays for 4 sequential cheap-model calls plus the escalation. A sequential verified cascade brings P95 to 6.0 seconds. A speculative parallel cascade, firing the cheap and premium model at once and using whichever the verifier clears first, brings it to 4.5 seconds. An optimized pipeline combining parallel execution with caching reaches 4.3 seconds.
StrategyP50P95
Blind retry loop (4 retries then escalate)1.2s9.3s
Verified cascade (sequential)1.5s6.0s
Speculative parallel cascade1.5s4.5s
Optimized pipeline (parallel + cache)1.3s4.3s

The median is a misleading number here. The blind retry loop has the best P50 of the four strategies, because 70% of tasks resolve on the first cheap-model attempt and never touch the retry path. Its P95, the number a real user or downstream agent actually experiences on a bad day, is the worst by a wide margin: four sequential cheap-model calls before an escalation adds up. A verified cascade trades a small latency cost on every request (the verifier check, which runs even on tasks that would have succeeded anyway) for a much smaller latency cost on the failure path, since there's no retry loop to run through. Firing the cheap and premium model in parallel and using whichever result the verifier accepts first cuts the tail further, at the cost of paying for a premium-model call on every task, whether it's needed or not, unless that call can be cancelled the moment the verifier clears the cheap answer.

Cost versus quality: small-model-first is dominated.

Chart 5: Small-model-first is dominated, not just riskier. Premium-only costs $10,000 per 1,000 tasks at 98% quality. Small-model-first blind routing, with no verifier, costs $6,800 at only 82% quality, because failures ship uncaught. Hybrid routing with a verified cascade costs $4,150 at 96% quality. Aggressive compression alone costs $3,000 at 85% quality. Hybrid routing beats blind small-model-first on both cost and quality at once.
Chart 5: Small-model-first is dominated, not just riskier. Premium-only costs $10,000 per 1,000 tasks at 98% quality. Small-model-first blind routing, with no verifier, costs $6,800 at only 82% quality, because failures ship uncaught. Hybrid routing with a verified cascade costs $4,150 at 96% quality. Aggressive compression alone costs $3,000 at 85% quality. Hybrid routing beats blind small-model-first on both cost and quality at once.
StrategyCost / 1,000 tasksQuality
Premium-only$10,00098%
Small-model-first (blind, no verifier)$6,80082%
Hybrid routing (verified cascade)$4,15096%
Aggressive compression$3,00085%

The uncomfortable point in this chart isn't that blind small-model-first delegation sacrifices quality for cost, that tradeoff would at least be a choice. It's that hybrid routing costs less than blind delegation and holds quality closer to the premium baseline. Blind small-model-first is not on the cost-quality frontier at all: it is strictly worse than verified routing on both axes simultaneously, because the money it fails to save on retries buys it nothing in return. The only reason to end up there is not measuring escalation cost separately from routing savings in the first place.

What this means for engineering teams.

A few tradeoffs worth stating plainly, because none of the levers here are free:

Implementation framework.

Step 1: Instrument escalation events separately from routing decisions. Log whether each task resolved on the cheap tier, escalated after verification, or escalated after N blind retries. Most teams that measure "router savings" are actually measuring routing decisions made, not tasks successfully resolved at the cheap tier, and the gap between those two numbers is the retry tax.

Step 2: Replace fixed retry counts with a verification step. A calibrated verifier that scores the cheap model's answer before shipping it, the same architecture behind our binary classifier's routing decisions, turns k blind retries into k = 0. This is the single highest-leverage change in the framework above: it's the difference between a break-even point that never crosses zero and one that collapses at 33-50% escalation.

Step 3: Measure your actual price ratio and escalation rate. The formula p_be = (r − 1) / (r + k − 1) is only useful with real inputs. Pull your cheap and premium model's blended cost per task, and pull your actual escalation rate from the logs in Step 1, not an assumption.

def resolve_task(task, cheap_model, premium_model, verifier, max_blind_retries=0):
    """Verifier-gated cascade: escalate on the first verifier rejection.
    Set max_blind_retries > 0 only to reproduce the naive blind-retry pattern
    for comparison; production routing should default to 0."""
    cost = 0.0
    for attempt in range(max_blind_retries + 1):
        answer = cheap_model.run(task)
        cost += cheap_model.price_per_call
        verdict = verifier.check(task, answer)
        cost += verifier.price_per_call
        if verdict.passed:
            return answer, cost, {"tier": "cheap", "attempts": attempt + 1}
    answer = premium_model.run(task)
    cost += premium_model.price_per_call
    return answer, cost, {"tier": "premium", "attempts": max_blind_retries + 1}

Step 4: Route simple, classifiable steps to cheaper models, but don't stop there. Routing without verification is a guess about which tier a prompt needs, made before generation. It should still be the first filter; it just can't be the only safety net.

Step 5: Compress after routing, not instead of it. Compression reduces the cost of every attempt, cheap or premium, wasted or not. It narrows the retry tax; it doesn't remove it. Apply it on top of a verified cascade, not as a substitute for one.

Step 6: Cache what actually repeats. System prompts, tool schemas, and other static prefixes are worth caching. Don't budget caching savings against dynamic, per-task context that won't hit a second time.

Step 7: Monitor cost, latency, and quality together, per tier. A router that looks like it's saving money on a cost-per-request dashboard can be quietly retrying its way through the savings on the tasks that fail. Track completed-task cost (including retries and escalations), P95 latency, and quality by tier, not a single blended average.

What this doesn't solve.

This is a two-tier, single-verifier model. Production systems often have more tiers, imperfect verifiers with their own false-positive and false-negative rates, and retry policies that vary by task type rather than a single global k. A verifier that is wrong in the "pass" direction ships bad answers without ever triggering escalation, which this framework doesn't price in, that failure mode needs its own calibration measurement, not a break-even formula. The price ratio r is also treated as fixed here; in practice it shifts with model pricing changes and with how much context each tier actually consumes, which is its own moving target.

Conclusion.

The instinct to route simple tasks to cheap models is correct. The instinct to assume that decision is free to get wrong is not. A router that can't tell the difference between "this needs a retry" and "this needs to escalate" defaults to retrying, and every blind retry is billed at full price for producing nothing. The future of small-model delegation isn't just picking the right price ratio, it's pairing that decision with a cheap, fast way to know when it was wrong.

This is the problem verifier-gated cascades are built to solve: instead of hoping the cheap model gets it right, or retrying blind and hoping the next attempt does, check the answer once and escalate immediately when the check fails. Nadir runs that check on every routed request, so escalation happens on the first sign of trouble instead of the fourth, and the savings dashboard shows the real delta, retries and all, against always using the premium model.

Teams that separate "routing decisions made" from "tasks resolved at the cheap tier" consistently find the same gap: some of what looks like router savings is actually a retry loop nobody priced. Closing that gap doesn't require a bigger model or a smarter classifier. It requires knowing, cheaply and quickly, when the first answer was wrong.


Data and charts in this post are illustrative, derived from the break-even framework described above, not measured production traces. Sources: [Chen, Zaharia, Zou, "FrugalGPT: How to Use Large Language Models While Reducing Cost and Improving Performance," arXiv:2305.05176, Stanford, TMLR 2024](https://arxiv.org/abs/2305.05176). [Brooker, "Timeouts, retries, and backoff with jitter," AWS Builders' Library](https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/). [Google SRE Book, "Addressing Cascading Failures"](https://sre.google/sre-book/addressing-cascading-failures/).

More on routing & cascades

What Nadir is

Nadir is an LLM router. Nadir sizes every prompt and routes it to the cheapest model that still clears your quality bar. A small decision model reads each prompt against your model menu and picks the lowest-cost model it expects to handle it. When the decision model is uncertain or unavailable, the request goes to the strongest model on the menu. The routing step makes no call to your model provider.

Nadir runs two ways. The decision API returns a model, reasoning-effort, cache, context, and policy recommendation without calling a model provider, beside the gateway you already run. That is how a shadow-mode evaluation works, and its projected savings stay advisory. The OpenAI compatible managed proxy executes the route, and migration is a two-line change: point the base URL at api.getnadir.com and set model to auto. On that path an optional verifier can score a complete non-streaming answer and escalate to a stronger model when it misses the configured bar. Streaming bypasses post-generation verification. BYOK is supported on every tier.

For coding agents, Nadir Auto is a terminal launcher for Claude Code or Codex that asks Nadir for the main-session model before each turn, with your configured model as the fallback and cost ceiling. Delegation integrations for Claude Code, Codex, or Cursor instead recommend a model tier for subagent work, and the agent decides. Either way inference runs on your own provider account, so Nadir holds no provider keys on that path.

What the numbers are, and what they are not

Nadir publishes each evaluation with its scope. On checkable code, run-check-escalate solved 392 of 395 common HumanEval and MBPP problems (99.2%), graded by running the canonical tests; that applies only to tasks with runnable deterministic tests. Nadir-Tumbler posts an arena_score of 72.3 on RouterArena's public scorer, 5th of 23 routers, which measures the routing decision on RouterArena's own model pool. A reference-assisted RouterBench evaluation over 11,420 held-out triples produced a 60% lower projected cost than always-Opus with about 98% retained quality and a 1.7% catastrophic-route rate. That experiment gave the verifier the expensive-model reference answer, which production does not have, so it is a research ceiling and not the deployed path.

None of these is a production guarantee, a universal savings rate, or a forecast for any particular workload. Customer savings are reported from measured execution against a declared baseline, and customer quality only from outcome-labelled traffic. Projected savings and realized savings are separate artifacts and are never blended.

Design-partner program

Three rungs, picked by risk appetite. Rung 0 Shadow runs advisory decision calls alongside live traffic and returns a projected receipt, with nothing in the request path changed. Rung 1 Hosted is the two-line swap on a production slice and returns a realized receipt. Rung 2 On-prem is a supervised six-week proof of concept inside the partner's VPC, where no prompt, response, or usage reaches Nadir. The commitments are the same at every rung. Apply for a rung directly: Rung 0 Shadow, Rung 1 Hosted, or Rung 2 On-prem. Not sure which fits? Start at getnadir.com/contact/?reason=design-partner.

Licensing

NadirClaw is the self-hosted core, source-available under the PolyForm Noncommercial License. Source-available is the correct label; NadirClaw is not open source. Nadir Route's hosted plan has no base fee and charges a variable fee only on measured savings from requests Nadir executed.

Pages on this site

Machine-readable summaries of this site: llms.txt and llms-full.txt.