Business

When the Second Retry Climbs: A Ladder for Three Model Tiers

Antonio Evans8 min read

A side-on staircase of three steps labeled Tier 1 (cheap), Tier 2 (mid) and Tier 3 (frontier).
Key points

Key points

  1. 1Retry escalation is a second routing decision, so promote a request only when one observable failure condition fires on the current tier and never because a retry "feels" warranted.
  2. 2A three-rung ladder (cheap, mid, frontier) with one attempt per rung bounds the blast radius and the token spend of anyone bad request.
  3. 3Every attempt is billable, so the ladder must be priced before it is shipped and the worst case cost per user request written down.
  4. 4The top rung needs a stop rule: after the fixed attempt count, return the best valid partial result with an error code and trip a circuit breaker.

Retry escalation is a routing decision, not a fallback

Most teams have a router that picks the first model, and then a fallback block that "just in case" moves the request to a bigger model. That conflates two different jobs. Routing answers "which model should serve this request by default?" Escalation answers "what happens when the answer comes back unusable?" The second question deserves its own explicit policy, because the default behavior (retry until something works) has no ceiling on cost or latency.

The routing literature is consistent on the vocabulary: error fallback moves a request after an explicit failure, while a latency fallback moves when a model has not begun responding within a threshold (Inworld on routing strategies). Those are two conditions, not one. A model can fail fast with a 500, fail slowly with a 9 second time to first token, or return 200 OK with JSON that fails your schema. Only one of those three is what most retry loops actually watch.

The useful framing comes from gateway work on model cascades: cheap-first, escalate-on-failure routing can cut blended cost substantially when most traffic resolves on the cheap tier, but the savings depend entirely on how often the escalation fires (TrueFoundry on cost and quality aware routing). Which means the escalation condition is not a detail. It is the whole design.

The distinction also matters for observability. If routing and retry share one code path, your logs record "model X answered" but not "model X was chosen at rung 2 after model Y failed schema validation twice." Inworld's guidance is to keep the attempt chain and routing reason visible in request logs precisely so you can see when the ladder, not the router, is doing the work (Inworld).

Define one observable failure condition per tier

A failure condition is observable if it can be evaluated from the response without human judgment. "The answer looked weak" is not a condition. These are:

  • Schema validation failed against a named validator.
  • Time to first token exceeded a budget derived from your p95 for that tier.
  • A required tool call is absent from the response.
  • Output hit the token ceiling and truncated mid-structure.
  • The provider returned a retryable error class after a single attempt.

The trap is stacking several conditions behind an OR and calling that a policy. Two schema failures and a latency overrun are different problems, and they should not promote a request to the same expensive tier. Pick the primary condition for your workload and make the rest recoverable on the same rung. For a JSON extraction pipeline, that primary condition is almost always schema validation; for a chat product it is time to first token.

Braintrust makes the related point for routing generally: prompt complexity and price can estimate cost, but they cannot show whether a model will return a correctly formatted response (Braintrust on routing without hurting quality). The same applies one step later. The only trustworthy escalation trigger is a failure you measured on your own traffic.

Watch the output budget when the condition is truncation. Reasoning tokens are billed as output and share the completion budget, so a response can run out of room with the visible text still short (BenchLM on token pricing). In that case the fix is a bigger budget on the same tier, not a promotion to a frontier model that will also truncate.

The three-rung ladder

Here is the ladder in full. Each rung gets one attempt. The only thing that advances the request is the condition from the previous section.

RungModel tierAttemptsFailure condition that promotesWhat you gainWhat you pay
1Cheap model1Two consecutive schema validation failures, or TTFT over budgetLowest cost per requestHighest format failure rate
2Mid model1Same condition, evaluated independentlyBetter instruction followingRoughly 5 to 10 times rung 1 on output tokens
3Frontier model1Attempt exhausted, no promotion leftBest reasoning and format adherenceHighest token price, highest latency
StopNone0All rungs failedBest partial result, error code, breaker opensOne wasted request path

Two attempts at rung 1 sound generous and are usually a mistake. If the same model with the same prompt produced invalid JSON twice, the third attempt has the same probability of working as the second, and you have paid for it. Promote instead.

The tier price spread is the reason the ladder is worth building at all. Published list rates collected by Silicon Data show output prices that differ by an order of magnitude between a small model and a large one, while input prices differ by roughly the same factor (Silicon Data on cost per token). PostHog's observability documentation makes the operational point that follows: model cost tracking has to attribute spend per request and per attempt, or the ladder is invisible on the bill (PostHog on calculating LLM costs).

A worked request path with numbers

Take a support ticket classifier. Input is 3,150 tokens, output is 400 tokens per request, a workload shape Silicon Data uses in its own examples (Silicon Data). Suppose your measured rung 1 schema failure rate is 12 percent, rung 2 reduces that to 4 percent, and rung 3 to under 1 percent.

Per 10,000 requests, roughly 1,200 climb from rung 1 to rung 2, and about 48 of those climb again to rung 3. The blended cost is dominated by rung 1, which serves 88 percent of traffic at its own price. The 48 frontier calls cost almost nothing in aggregate even at a high per-token rate, because the volume is tiny. This is the worked example that surprises people: the ladder is cheap not because the top rung is cheap but because almost nothing reaches it.

The bad outcome is a ladder with a loose trigger. Raise the rung 1 failure rate to 40 percent (a common result when a schema is new and the prompt is untested) and 4,000 requests climb to rung 2, with 160 reaching rung 3. The blended bill more than doubles on output tokens alone. Braintrust's advice applies directly here: a lower-cost model should receive a query class only after its results meet the acceptance criteria for that traffic (Braintrust). The same gate should sit between rungs.

LLM proxy pricing calculators exist for exactly this forecast. LiteLLM's calculator takes input tokens, output tokens and request volume and returns per-request, daily and monthly cost, exportable as CSV (LiteLLM pricing calculator docs). Run it three times, once per rung, weight by your measured escalation rates, and you have a defensible number before anyone commits to the ladder.

The stop rule at the top tier

The top rung is where most ladders quietly become infinite loops, because a frontier model failing feels like a reason to try harder. It is not. The stop rule has three parts.

First, a fixed attempt count across the whole ladder, not per rung. One cheap attempt, one mid attempt, one frontier attempt, then stop. Second, a degraded but valid response: the best parsed partial result from any rung, with an explicit error code naming the rung that failed. A user is better served by a complete answer to half their ticket than by a spinner. Third, a circuit breaker on the failing dependency so the next fifty requests do not repeat the experiment.

Circuit breaker mechanics are well documented for LLM apps: closed passes traffic, open fails fast, half-open probes with a small number of requests after a cooldown, and trips are driven by evidence such as error rate, timeouts and p95 latency rather than one noisy request (KryptoMindz on circuit breakers for LLM apps). The breaker is what keeps a provider outage from turning into a ladder that promotes every request to the most expensive tier simultaneously.

The escalation-matrix discipline from support operations transfers cleanly. A matrix works because it answers "who handles this, by when, and what happens if they cannot" in under a minute, with owners written as roles and criteria in plain language (IssueLinker escalation matrix). Your ladder is an escalation matrix for models: severity is the failure condition, owner is the tier, and response time is the attempt budget. Incident response guidance makes the same point about thresholds and ownership being explicit rather than inferred (incident.io on escalation policy).

Metrics to log per rung

A ladder you cannot measure is a budget leak. Log these fields on every attempt, tagged with the rung:

FieldWhy it matters
request_id and parent attemptTies the three rungs into one trace
rung and model tierShows which rung did the work
promotion_reasonNames the condition that fired, or "none"
input, cached input, output tokensCost attribution per rung
time to first token and total latencyLatency budget per attempt, summed across the chain
validator result and error codeFailure cause, not just failure existence
final outcomeserved, degraded, or failed

The latency field needs a warning attached. Total time across attempts is the number users feel, not the latency of the model that finally answered. Inworld lists both TTFT and completion in its recommended routing telemetry for exactly this reason, alongside input, cached input, output and cost (Inworld). Reporting only the successful model's latency makes the ladder look faster than it is.

Shadow mode is the cheapest way to calibrate the trigger before it spends real money. Run the candidate rung 2 model on real production requests without returning its output, capture the results, and compare pass rates against the rung 1 responses on the same inputs (Christopher Samiullah on shadow mode). Advanced deployment pattern guides describe the same technique as a pre-release check for load and input handling (APXML on canary and shadow testing). Once shadow data shows rung 2 clearing the schema at a materially higher rate, the promotion condition has evidence behind it.

Where this fits in your stack

The ladder is policy, so it belongs in one place that sees every model call. If your application calls three providers through three SDKs, you will implement the promotion rule three times and it will drift. A single inference endpoint with one API key per environment makes the ladder a config change rather than a refactor, which is the practical argument for routing all tiers through one gateway. Quanta Inference puts text, image, video, audio and embedding models behind one OpenAI-compatible, prepaid API priced in US dollars, so the three rungs can be swapped or re-priced without touching application code (Quanta Inference).

Two habits keep the ladder healthy after launch. First, review the promotion rate weekly; a rung that suddenly serves 30 percent of traffic is either a prompt regression or a provider problem, and both cost money. Second, test the stop rule on purpose. Switch the frontier tier to a failing model in staging and confirm that the degraded response, the error code and the breaker all behave as written. An escalation policy nobody has fired is a policy nobody can trust, which is the lesson support escalation design has been teaching for years (TechTarget on service tiers and escalation paths).

FAQ

FAQ

Why not just retry the cheap model three times before escalating?

Because identical attempts are not independent. If the same model and prompt returned invalid JSON twice, the third attempt carries the same probability of failing, so you pay three times to learn what the first two attempts already told you. Retrying is only rational when something changed: a shortened prompt, a repaired schema instruction, or a different tier. Escalate instead.

How do I pick the latency budget for the first rung?

Derive it from your own measurements, not a vendor claim. Take the p95 time to first token for the cheap tier on your real traffic over a couple of weeks, add a margin you can defend, and set the total chain budget from the product requirement. Inworld's guidance is to define the timeout from the application budget and the primary route's normal p95 (Inworld). If the budget is tighter than the cheap tier's p95, the tier is wrong for that query class.

Should the escalation condition ever be a quality judgment?

Not as the default trigger. Quality scores from a judge model add latency and cost to every request and introduce their own failure mode. Use deterministic checks first, and reserve judged quality for offline evaluation that decides which query classes may enter at rung 2. Braintrust's routing guidance makes the same case: pre-response signals cannot tell you whether the output was correct, so quality evidence has to come from evaluated outputs (Braintrust).

What exactly should the user see when the top tier fails?

The best valid partial result you have, plus an error code that your client can act on, and no retry prompt. Log the whole attempt chain against the request id so support can reconstruct it. If the breaker is open, the next requests should fail fast to the degraded path rather than trying the ladder again, which is the controlled degradation behavior circuit breakers are designed to give (KryptoMindz).

How many rungs should a ladder have?

Three is the practical ceiling for most workloads, because each additional rung multiplies the configuration surface and the latency the user feels on the rare bad request. Support escalation models converge on three tiers for the same reason: enough separation to match cost to complexity, few enough that people remember the rules (IssueLinker). If a fourth tier seems necessary, the real problem is usually the rung 1 condition, not the missing rung.

Sources

Sources

  1. LLM Routing Strategies: Conditional Routing, Failover, and ...
  2. Intelligent LLM Routing: Cost & Quality-Aware Selection
  3. How to cut LLM costs with model routing without hurting quality
  4. How LLM Token Pricing Works: A Complete Guide to API ...
  5. Understanding LLM Cost Per Token: A 2026 Practical Guide
  6. Calculating LLM costs - Docs
  7. Pricing Calculator (Cost Estimation)
  8. Circuit Breakers for Reliable LLM Apps | Fallbacks & Recovery
  9. The Escalation Matrix Support Teams Actually Use - IssueLinker
  10. Escalation policy best practices: designing policies that actually work
  11. Deploying Machine Learning Models in Shadow Mode
  12. Advanced Deployment Patterns: Canary and Shadow Testing
  13. Customer service tiers and escalation paths explained - TechTarget
About the author

About the author

Antonio Evans
Antonio Evans

Antonio Evans is the founder of Quanta Intelligence and a fractional CTO who builds HIPAA-ready AI systems for health and life-science companies. Before that he was technical co-founder of FriendsEAT for twenty years, CEO of Socialdraft, and a data engineer at IBM. Antonio lives with his dog Santino in Lisbon, Portugal.

All articles