The Triage Call

Between a search and a read, a research agent decides which of ten results to open. This post prices that decision in a simulation of a four-sub-question agent. Selecting pages from snippets before reading cut modeled cost per task by about 65% and latency by about 41% against reading everything, mostly because unread pages are never re-sent on later turns. The model tier running the triage call mattered far less than whether the call existed, and a small model with no confidence fallback cost a point of quality. Every number is illustrative and the assumptions are listed.

Published 2026-10-12 by Dor Amir on the Nadir blog.

Filed under Agents.

Abstract.

Most cost advice for research agents starts with the model: use a cheaper one, route between several. This post starts one step earlier, at the decision an agent makes after every search: which of ten results to open. We simulate a four-sub-question research agent under five policies (read everything, read a fixed top three, and three versions of a short "triage" call that picks pages from snippets) and compare tokens, cost, latency and a modeled quality score. In this model, selecting before reading cuts cost per task by about 65% and latency by about 41% against reading everything, mostly because unread pages are never re-sent on later turns. Which model runs the triage call matters far less than whether the call exists. A cheap triage model with no confidence fallback costs a few points of quality and a few percent of savings.

Every number and chart in this post comes from a simulation with assumptions listed below. It is illustrative, not measured on production traffic, and your results will differ. The quality score depends on an assumed distraction penalty, so treat the quality gap as a hypothesis to test, not a finding.

Introduction.

Agent token bills are growing for a boring reason: agents re-read. Anthropic's documentation says web search results "are counted as input tokens, in search iterations executed during a single turn and in subsequent conversation turns" (Claude Platform Docs, "Web search tool"). Research on coding agents makes the same point from the other side: trajectories accumulate "useless, redundant, and expired information" that is paid for again on every call (Xiao et al., arXiv:2509.23586).

We have covered the anatomy of a ReAct step, trajectory reduction and the search tax. This post isolates one small hop none of them priced: the decision between the search call and the read call.

Research question.

When an agent gets ten search results back, what does it cost, in tokens, dollars, seconds and answer quality, to decide which ones to read before reading them, and does the model making that decision need to be a premium one?

Methodology.

We modeled an agent that answers a task by resolving four sub-questions. Each sub-question runs one search round, with one retry if no relevant page was read. All parameters are assumptions:

Policies: read everything (premium, sequential), fixed top-3 (read the first three results, no judgment), premium triage, small triage, and hybrid (small triage, escalating to the premium model when the small model's best score is under a threshold). 4,000 simulated tasks per policy, seed fixed.

Results.

Where the tokens go.

Chart 1: Re-sent history is the largest stage in the read-everything agent. Illustrative simulation: 466K tokens per task for read-everything against 157K for small triage with premium fallback; query generation and synthesis are negligible.
Chart 1: Re-sent history is the largest stage in the read-everything agent. Illustrative simulation: 466K tokens per task for read-everything against 157K for small triage with premium fallback; query generation and synthesis are negligible.

The read-everything agent bills about 466K tokens per task. Search snippets and final synthesis are rounding errors. The largest stage is reasoning calls that carry history, about 280K, and that history is mostly pages read in earlier rounds. Page reading itself is another 180K. Selecting before reading shrinks both, because a page that was never opened is never carried.

Cost.

Chart 2: Modeled cost per 1,000 research tasks. Read everything $4,712; fixed top-3 $2,578; premium triage $1,634; small triage $1,733; hybrid $1,652. Illustrative prices.
Chart 2: Modeled cost per 1,000 research tasks. Read everything $4,712; fixed top-3 $2,578; premium triage $1,634; small triage $1,733; hybrid $1,652. Illustrative prices.

Against $4,712 per 1,000 tasks for reading everything, the three triage policies land between $1,634 and $1,733. The triage call itself is cheap: about 1,200 input tokens. The saving comes from what it prevents. Note how little separates the triage tiers. Premium triage is 5% cheaper than small triage here, because the small model's misses cost retries.

Latency.

Chart 3: Modeled latency per task. Read everything 139 s; fixed top-3 101 s; premium triage 81 s; small triage 82 s; hybrid 82 s. Illustrative assumptions.
Chart 3: Modeled latency per task. Read everything 139 s; fixed top-3 101 s; premium triage 81 s; small triage 82 s; hybrid 82 s. Illustrative assumptions.

Triage adds a hop (roughly one extra second per round) and still wins by about 41% on wall-clock, because it removes sequential page fetches and shorter prompts speed up every later call. Parallel retrieval alone would capture the fetch savings but not the token savings: it can increase token load, since it reads at least as much, faster.

Cost against quality.

Chart 4: Modeled cost vs quality. Read everything: $4,712 at 88.5%. Fixed top-3: $2,578 at 84.2%. Premium triage: $1,634 at 96.3%. Small triage: $1,733 at 95.1%. Hybrid: $1,652 at 95.8%. Dashed line sweeps the fallback threshold.
Chart 4: Modeled cost vs quality. Read everything: $4,712 at 88.5%. Fixed top-3: $2,578 at 84.2%. Premium triage: $1,634 at 96.3%. Small triage: $1,733 at 95.1%. Hybrid: $1,652 at 95.8%. Dashed line sweeps the fallback threshold.

The fixed top-3 policy shows the danger zone: it is cheaper than reading everything and worse on quality, because rank order is a weak proxy for relevance and it misses evidence without noticing. Small triage with no fallback loses about 1.2 points against premium. The hybrid recovers most of that gap while escalating only about a third of rounds. This is the one place the model tier shows up, and it shows up as a confidence rule, not a blanket choice.

What is being wasted.

Chart 5: Wasted page tokens per task at first read, read-everything agent: irrelevant pages about 73K, boilerplate 54K, duplicate pages 25K.
Chart 5: Wasted page tokens per task at first read, read-everything agent: irrelevant pages about 73K, boilerplate 54K, duplicate pages 25K.

Of 180K page tokens read, about 40% went to irrelevant pages, 30% to boilerplate and 14% to pages the agent had already seen. Each needs a different fix: triage for the first, extraction or reader-mode for the second, a session-level URL ledger for the third. Compression helps with the second and does little for the first, which is why we would compress after selecting rather than blindly before.

Discussion.

Four caveats follow from the model.

  1. Cheaper is not always cheaper. The small triage model cost more than the premium one once retries were counted. A per-token discount is not a per-task discount.
  2. Quality is the soft spot. Our distraction penalty is assumed. If your model is robust to noisy context, the quality gap shrinks and only the cost and latency gains remain. Measure it on your tasks.
  3. Caching only helps repeating work. A URL ledger and prompt caching pay off when sessions revisit the same pages; our 20% duplicate rate is a guess.
  4. Rules need monitoring. A fallback threshold tuned on today's search provider drifts when results change. Log the escalation rate and alert on it.

Implementation guide.

  1. Instrument tokens by stage. Tag every call as reasoning, query, snippet, page read or synthesis.
  2. Separate reasoning from context. Report carried history and new content separately; carried history is where growth hides.
  3. Detect over-reading and duplicates. Count pages read per relevant page used, and keep a per-session ledger of URLs.
  4. Route simple steps. Triage and extraction over short snippets are narrow, closed-context tasks; send them to a smaller tier.
  5. Compress after retrieval. Strip boilerplate from the pages you chose to read, not from everything.
  6. Add a confidence threshold and fallback. Escalate when the cheap model's top score is low.
  7. Monitor cost, latency and quality together. A dashboard of one without the others will reward the wrong change.
def triage(snippets, small, premium, min_conf=1.4, k=3):
    scores = small.score_relevance(snippets)       # one short call, ~1.2K tokens
    if max(scores) < min_conf:                      # no clear winner: escalate
        scores = premium.score_relevance(snippets)
    ranked = sorted(range(len(snippets)), key=lambda i: -scores[i])
    return [i for i in ranked[:k] if scores[i] > 0.5]

Where Nadir fits.

This is the kind of problem model routing is built for. Instead of treating every step as a flagship-model problem, a team can classify each step's difficulty and send it to the cheapest model that clears a quality floor. Nadir does that with model="auto", and its response metadata reports the routing decision and cost per request, so the by-stage view in step 1 comes from data you already have. Whether a given step is safe to downgrade is an empirical question; Observe mode records what Nadir would have done without changing any response, so you can check before you switch.

Conclusion.

The future of LLM cost optimization is not only cheaper models. It is better orchestration, better routing, better retrieval discipline and better measurement. In our simulation, the biggest lever was a short decision before the read, and the model tier on that decision was second-order. Benchmark your own workflow: log tokens by stage for a week, count pages read per page used, and see what the numbers say. If you want help with the measuring, start with a free key and run Observe mode on your agent traffic.


Sources: [Claude Platform Docs, "Web search tool"](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool). [Xiao, Gao, Peng and Xiong, "Reducing Cost of LLM Agents with Trajectory Reduction," arXiv:2509.23586](https://arxiv.org/abs/2509.23586). [Liu et al., "Lost in the Middle: How Language Models Use Long Contexts," arXiv:2307.03172](https://arxiv.org/abs/2307.03172). Simulation parameters are assumptions as stated in Methodology; prices are illustrative round numbers, not any provider's rate card.

More on agents

What Nadir is

Nadir is an LLM router. Nadir sends each prompt to the cheapest model that can handle it. 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; the Claude plugin can also move a main-thread turn to Haiku when Nadir's cache check prices it cheaper, unless its switch_main_model option is off. 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.