BUDGETS AND METERING

Spend controls

Hard USD ceilings, per-minute rate limits and a kill switch, all decided before the request leaves your network.

Token Observe enforces hard USD ceilings on any governed agent you set one on — per request, per rolling hour, per UTC day and per UTC month, in whatever combination you configure — alongside requests, tool calls and tokens per minute, and refuses a call that would cross one before it reaches a provider. The money verdict is deliberately the last one taken: permissions, rate limits and policy are decided first, then the route is resolved, then every provider and fallback that route could execute is priced, and the most expensive of those rates is reserved against the agent’s windows inside a single per-agent database transaction. A budgeted route with an unpriced reachable target is refused with a 409 before egress rather than priced at zero, because an empty price table is exactly how the ceiling was once silently disarmed. Above all of it sits the kill switch, scoped to one agent, one team or the whole estate, checked first in the pipeline and reaching even the routes that execute nothing.
USD ceilings
Per request, hour, UTC day and UTC month
Rate ceilings
Requests, tool calls and tokens per minute
Kill-switch scope
One agent, one team, or everything
Shipped price rows
50, loaded additively on every boot
What a hard ceiling costs youOne billable egress: no retry, no failover
On this page
the problem

A budget that only reports is not a budget

Most agent cost tooling is a dashboard. It tells you what you spent after you spent it, which is useful in a monthly review and useless at two in the morning when a retry loop is a third of the way through the month’s budget. The control a finance owner actually asks for is the one that refuses the call, and refusing a call means having a defensible price for it before it leaves the building.

That pricing is harder than it looks, and it is where most implementations are quietly wrong. Providers disagree about whether cached prompt tokens sit inside or outside the prompt total: Anthropic reports cache reads and cache writes alongside its input count, while OpenAI’s cached-token detail and Gemini’s cached-content count are already inside theirs. Treating one convention as the other misprices cache-heavy traffic by 50 to 90 per cent — the range the pricing module states in its own header — and agent traffic is typically cache-heavy, because the system prompt and the retrieved context repeat on every turn.

The failure mode that motivated the current design was worse than an inaccurate number. The shipped price catalogue was loaded only by the demo seeder, which the setup documentation explicitly tells production operators not to run, so the documented production path produced an install with an empty price table. An unknown model priced at zero meant every trace recorded $0 and every per-request ceiling admitted every request: the control was off while appearing to be on. An estate spending nothing and an estate spending unmetered emit identical bytes, and the customer finds out from the vendor invoice.

So Token Observe treats the price table as part of the control rather than as reporting furniture. The catalogue loads at boot on the documented production path, a budgeted agent whose resolved route cannot be priced is refused before egress, and every ceiling is checked against a conservative upper bound rather than a friendly estimate. A ceiling may be conservative. It may not be optimistic.

the mechanism

How it actually works

Steps 6, 8 and 11 of the request path. The order is load-bearing rather than incidental: it is encoded in the evaluator, and the reason each step sits where it does is the reason the guarantee holds.

  1. 01

    Kill switch, before anything else

    Step one of the governance pipeline finds any engaged switch whose scope reaches this subject and returns a 403 immediately, ahead of lifecycle status, permissions, budgets and policy. A global switch reaches every governed subject; a team switch matches the subject’s team case-insensitively, because a team name is typed by a human under incident pressure; an agent switch matches the subject id exactly. A released switch reaches nobody.
  2. 02

    Rate limits decided in the pure pass

    Requests, tool calls and tokens per minute are evaluated in the same deterministic pass as permissions and policy, and return a 429 naming the limit type, the configured value and the observed figure. USD is deliberately skipped here for any agent that has a ceiling configured: money cannot be decided honestly until routing has fixed which upstream will actually serve the call.
  3. 03

    Resolve the route, then price everything it could reach

    Route rules, tier selection, provider-compatibility filtering and the failover chain all change what may leave, so the primary target and every fallback are priced against the resolved model and provider kind rather than the model name the caller typed. Validating only the requested name would leave a rerouted target or a fallback as a zero-dollar escape hatch.
  4. 04

    Estimate conservatively, in both legs

    The input bound is the UTF-8 byte length of the complete serialised outbound request plus 256 tokens of framing overhead — a tokenizer cannot emit more ordinary tokens than there are bytes — and the output leg is priced at the caller’s max_tokens, or 4,096 when none is named. Each leg takes the highest rate in the reachable candidate set: the input leg the maximum of every candidate’s input, cache-read and cache-write columns, the output leg the maximum output rate.
  5. 05

    Admit atomically, per agent

    One transaction reads the three USD windows excluding this trace, tests whether adding the estimate would cross a configured ceiling, and writes the reservation only if it would not. SQLite takes BEGIN IMMEDIATE and PostgreSQL takes a transaction advisory lock on the agent id, so two concurrent callers cannot both decide against the same pre-reservation window.
  6. 06

    One egress for a hard-budgeted call

    A request under a USD ceiling is allowed at most one potentially billable network attempt. A timeout cannot prove the vendor did not complete and bill the call, so a retry or a failover would let one reservation cover several independently billable attempts; the reservation is retained in full on an ambiguous failure rather than released as a free call.
  7. 07

    Meter against the price pinned at admission

    Provider usage is normalised into four mutually exclusive token buckets, then priced against the immutable row captured before egress for the provider that actually served the call — unless the upstream reported an authoritative charge of its own, which is preferred over the arithmetic. Re-reading current prices at completion would let a catalogue sync landing mid-call reprice an admitted request — including down to zero.

The ceilings, and the windows they are measured over

Every governed subject carries four optional USD ceilings and three optional rate ceilings, and any subset of them can be set. A per-request ceiling is compared against the pre-flight estimate for that one call. The hourly, daily and monthly ceilings block both when the window is already at or over the limit and when the projection — spend so far plus this call’s estimate — would cross it, so a single large request cannot step over a limit it was already close to.

The windows are not all the same shape, and the difference matters when you are reading a report. The hour is a rolling sixty minutes back from now. The day starts at 00:00 UTC and the month at the first of the month, UTC, which is what makes the monthly figure line up with the budget report and with a vendor’s billing period rather than with a local timezone that would drift against both.

Spend still in flight counts. A trace that is running or parked awaiting human approval contributes the greater of its billed cost and its reservation, so a request cannot be admitted against a window that ignores the four calls already dispatched. That is a correction rather than an original design: the spend window used to aggregate completed traces only, so N concurrent requests each saw zero in-flight spend and all passed a cap that one of them would have breached.

Approvals made that accounting subtle, and the subtlety is stated rather than hidden. A denied or expired approval closes its trace and clears the estimate. An approved-but-unredeemed approval deliberately keeps its reservation, because the action has not happened yet and the money is still about to be spent; its expiry is what releases it. When the exact payload is resumed, the atomic admission excludes the original approval trace while transferring the estimate to the execution trace, so the same action is never counted twice, and re-polling a still-pending approval takes no second reservation at all.

perRequestUsd
Refuses a single call whose conservative estimate strictly exceeds the ceiling. It is inert on a subscription seat — the source says in as many words that the console should not offer it there — because a subscription prices the seat rather than the request, so the marginal cost of one call is not knowable at the moment of deciding and the estimate a seat decision carries is always zero. The window ceilings still bite on a seat, against whatever spend the control plane can attribute to that person.
hourlyUsd, dailyUsd, monthlyUsd
A rolling sixty minutes, the UTC calendar day and the UTC calendar month. Each blocks on the window already being at the limit, or on the projection crossing it, whichever comes first.
requestsPerMinute
Counted and recorded in one per-agent transaction, so a limit of one admits exactly one concurrent caller. Blocked attempts are written before any refusal, so they remain evidence and count towards the limiter rather than being free retries.
toolCallsPerMinute and tokensPerMinute
The same rolling minute, applied to tool invocations and to metered tokens. All three rate ceilings return a 429 naming the limit type, the configured value and the observed count.
Warnings, after the fact
A post-call check publishes a budget warning once any window reaches 80 per cent of its ceiling and a budget-exceeded event at 100 per cent. It exists to tell a human, not to enforce: the pre-flight check has already refused anything that would breach.
Worked example: how one call is priced before it may leave
serialised outbound request        41,208 bytes
+ framing overhead                    256 tokens
= input upper bound                41,464 tokens
max_tokens named by the caller      2,000 tokens

highest input rate in the route     $3.00 / MTok   (primary + 2 fallbacks)
highest output rate in the route   $15.00 / MTok
reserved before egress             $0.154392

hourlyUsd ceiling                  $5.00
spend in the rolling hour          $4.91  (incl. 2 running traces)
projected                          $5.064392  ->  refused, 429

Price resolution at admission, and why an unpriced route fails closed

A budget is only enforceable against what may actually leave, so pricing happens after the route is resolved and covers every candidate on it. Route rules can send a requested model somewhere else, tier routing can substitute a cheaper one, compatibility filtering can drop a target, and failover can promote a fallback — all after the caller supplied a model name. Pricing only the name the caller typed would leave a rerouted target or an unpriced fallback as a zero-dollar escape hatch, so the check uses the resolved model and provider kind for the primary and for each fallback in turn.

Price rows are matched by specificity: an exact provider beats a wildcard provider, an exact model beats a wildcard model, and the longest pattern wins among equals. Rows are versioned rather than overwritten, so a superseded row still exists in the table and is filtered out by its effective window before any match is attempted. Where a candidate has no active row at all and the agent has any USD ceiling configured, the request is refused with a 409 before egress, naming the model, the provider and how many further fallbacks are also unpriced. An agent with no USD ceiling is explicitly unbudgeted and keeps the previous behaviour, which is to record what it can.

That refusal exists because of a specific defect. The 50 shipped price rows were loaded only by the demo seeder, which the setup documentation tells production operators not to run, so the documented production install started with an empty price table; an unknown model produced a $0 estimate, and the code comment of the day said in as many words that this silently disarmed the per-request ceiling. The catalogue now loads at boot, additively — a key of model, provider kind and effective date that is already present is skipped, so a restart can never overwrite a price an operator corrected by hand. The cost of that choice is that a shipped price is never refreshed in place on upgrade, which is accepted deliberately: stale-but-present beats absent, because absent means zero and a disarmed ceiling.

The estimate itself is an upper bound rather than a guess. The input leg counts the UTF-8 bytes of the complete serialised canonical outbound request — tool definitions, JSON-schema keys, tool arguments, passthrough configuration and every message boundary included — plus a fixed 256 tokens for provider-added sentinels, on the reasoning that a tokenizer cannot emit more ordinary tokens than there are bytes. It replaced a four-characters-per-token estimate for one reason: hard money ceilings may be conservative, they may not be optimistic. The output leg was added after a second defect, where pricing input alone let a request asking for 100,000 output tokens pass a small per-request ceiling and then blow through it on the way back; where a request names no output cap at all, admission prices an assumed 4,096 tokens and stamps the outbound request with that same value, so an upstream cannot silently answer past the amount reserved.

The most expensive reachable rate wins
The input leg is estimated at the highest of every candidate’s input, cache-read and cache-write rates, and the output leg at the highest output rate in the same set, so failover cannot exchange a priced request for a cheaper assumption.
Long cache writes are priced at the higher tier
Anthropic and Bedrock bill a five-minute cache write at 1.25 times input and a one-hour write at 2 times. The price table has one cache-write column, so on those two provider kinds a request carrying any explicit cache TTL other than five minutes is priced at no less than twice the input rate, and an unrecognised TTL is given the same treatment rather than an optimistic five-minute rate. The adjustment is scoped to those two provider kinds and no others.
Vendor-side routing controls are refused, not passed through
OpenRouter fields that would move routing or processing outside the priced boundary — caller-supplied fallback model lists, provider overrides, route delegation, plugins, transforms and vendor web search — fail before egress, as do retained :online, :nitro, :floor and :exacto model targets. An operator alias mapped to a safe base model remains usable.
One potentially billable egress
A hard-budgeted call caps network attempts across the entire provider chain at one. This is a real availability trade: the same request under no USD ceiling would have been retried with backoff and then failed over to the next provider.

The kill switch, and what absolute has to mean

The kill switch stops a named agent, a whole team, or everything, and it is the first thing the governance pipeline checks — ahead of lifecycle status, permissions, budgets and every policy. Engaging one is an admin action, requires a stated reason, and cannot be done anonymously, because the audit entry is the only account anyone will ever have of why an entire fleet stopped. Engagement and release both append to the hash-chained audit log and publish an event; releasing is admin-only too.

Scope is deliberately three values rather than four. A global switch reaches every governed subject. A team switch compares team names case-insensitively, on the reasoning that a team name is being typed by a human under incident pressure and a capital letter should not be the difference between a fleet stopping and not. An agent switch matches the subject id exactly, and because a subscription seat is a governed subject with its own prefixed id, the same scope stops a seat.

The predicate that answers whether a switch reaches a subject is written once and exported, and that is load-bearing rather than tidy. The same function the gateway stops a request with is the filter that decides which switches are compiled into an endpoint seat’s signed policy bundle. A second copy that was stricter by one character would omit an engaged switch from the artifact, and the big red button would be pressed in the console and reach nothing at all on the device.

The gap worth naming is the one that was found and closed. Token counting and the model-catalogue routes deliberately skip the trace-opening path, because they execute nothing and opening a trace for a size check would pollute the evidence record — but in skipping it they also skipped the agent-status and kill-switch checks, so a frozen agent could still price prompts and enumerate models. Those checks now run on all three routes. The switch is still an admission control, though: it refuses new work rather than recalling a request already dispatched upstream.

global
Every governed subject in the estate, agents and seats alike, refused with a 403 naming the scope, the person who engaged it and the reason they gave.
team
Matched against the subject’s team, case-insensitively. Everything else about the subject is ignored, so a newly registered agent joining that team is stopped without anyone having to remember to add it.
agent
One subject id. Because seats and agents are the same kind of governed subject, an agent-scoped switch pointed at a seat id stops that seat’s device-side enforcement at the next bundle it holds.

Cache-token accounting, which is where cost figures usually go wrong

Providers disagree about whether cached prompt tokens are inside or outside the prompt total, and the pricing module puts the cost of getting it wrong at the same 50 to 90 per cent on cache-heavy traffic. Anthropic reports cache_read_input_tokens and cache_creation_input_tokens exclusive of input_tokens. OpenAI’s prompt_tokens_details.cached_tokens is already inside prompt_tokens, and Gemini’s cachedContentTokenCount is already inside promptTokenCount. A ledger that adds Anthropic’s buckets to an OpenAI-shaped total double-counts a cached prefix on every single turn of every long-running agent.

Token Observe normalises every provider’s usage into four buckets that are mutually exclusive by construction — uncached input, cache read, cache write and output — before any cost arithmetic happens, and re-asserts that invariant at every boundary the numbers cross. Provider usage is treated as untrusted wire data even where a TypeScript interface calls it a number: anything that is not a non-negative safe integer is refused outright, because a negative count would subtract from a budget and a non-finite one would turn the whole ledger into NaN. An OpenAI response claiming more cached tokens than prompt tokens is rejected rather than clamped.

Where a price row names no cache columns, cache reads and cache writes both bill at the full input rate. That is conservative by design and never under-bills. Streaming counters are cumulative, and some OpenAI-compatible endpoints emit more than one usage frame where a later frame omits or regresses a bucket, so the merge keeps the greatest validated value seen for each bucket: a conservative merge that can never hand back a budget credit and never mistakes a repeated total for an incremental delta.

OpenRouter is the only upstream that reports an authoritative USD charge for a call, and where it is present it is preferred over local arithmetic so the ledger matches the invoice. It was captured on the buffered path only and dropped on streams until the usage stream event was made to carry it; the field is absent rather than zero when unknown, so free stays distinguishable from not reported. Everything else prices against the admission-time row pinned for the provider that actually served the call, rounded to eight decimal places so repeated addition across a month stays stable.

Anthropic and Bedrock
Cache buckets are reported alongside the input count, not inside it. Bedrock’s own invocation metrics follow the same exclusive convention and are only read when the Anthropic events reported nothing; reading them as an inclusive total would bill a cached prefix twice.
OpenAI
Cached tokens are subtracted out of the prompt total to produce the uncached-input bucket. A cached count larger than the prompt total is a RangeError rather than a silent correction.
Gemini
Cached content is inside the prompt count and normalised the OpenAI way. Thinking tokens sit outside the candidate count but bill at the output rate, so they are folded into the output bucket rather than lost.
Estimates are never billed
The rough four-characters-per-token estimator survives only for the policy triggers that key on prompt size; the money bound is the byte count that replaced it. Actual usage always comes from the provider response, and a failure to price a completed response falls back to the conservative amount reserved at admission rather than to zero.

Routing down a tier, and the retrospective that tells you whether to

Token Observe can serve a cheaper model than the caller asked for, and never a more expensive one. The classifier is a heuristic and the source says so first: no classifier model, no embedding, no learned weights, because a router that had to call a model to decide which model to call would spend a meaningful share of the saving it exists to produce and would add a second upstream dependency to the request path. It scores a handful of signals that genuinely separate cheap work from expensive work — what the latest turn asks for, prompt size, the caller’s output cap, conversation depth, whether tools were offered, whether the prompt carries code — publishes the reasoning, and lets a per-agent ceiling override the whole thing.

Three properties are load-bearing. It is pure and deterministic, with no I/O, no clock and no randomness, so a route decision recorded on a trace can be reproduced from the trace months later. It is always explained: every decision carries its reasons — matched keywords, character counts, tool counts, the score and the tier it lands in, and the confidence bar by name when that is what stopped a swap — and never prompt text, and the decision is written to the trace whether or not a swap happened, because otherwise the router doing nothing and the router being switched off look identical. And it is conservative by construction, because spending more of someone’s money than they asked for is not a cost-optimisation feature.

Two rules decide the served tier, in this order. A downgrade is opt-in: it needs the agent’s allowDowngrade flag and a classification confidence of at least 0.75, and either alone is not enough. In practice that threshold means two agreeing cheap signals — a request that asks to extract will not on its own move a tier, but one that asks to extract and is a single short turn with no tools will. The agent’s maxTier ceiling then applies regardless of the opt-in, regardless of the confidence and regardless of what the caller asked for, because an opt-out ceiling would not stop anything. A model the price table does not name is treated as reasoning tier for ceiling purposes, so an unpriced model cannot walk straight through the bound that exists to cap it.

The confidence figure is not a probability and is not presented as one; nothing in the classifier was calibrated against labelled data. Its only job is to distinguish several signals agreeing from one weak signal tipping a borderline score, and the residual standard verdict starts low enough that it can never on its own clear the downgrade bar — a tier is never moved on the strength of the signals cancelling out. Only an explicit task-tier declaration from the caller returns full confidence, because that is a statement of fact rather than an inference. The per-request saving figure is an estimate from pre-flight token counts, clamped at zero, and measured from the cheapest equally-specific row for the requested model, which is the opposite bias to the ceiling lookup and for a stated reason: an overstated saving is a number the business would go on to quote.

Deciding whether to switch downgrade routing on at all is a separate, retrospective question, answered from the flight recorder rather than from a vendor claim. The savings analysis runs over completed calls only, so it costs nothing and changes nothing, and it splits its total by confidence — quote the high band, treat the total as a ceiling. It is a report rather than a screen: the figure is served by an API endpoint over a bounded scan, at most 500 traces and by default the last thirty days, and the payload says so by returning a truncated flag when the scan hit its cap. The conservatism is layered: an excerpt that reads as diagnosis, design or formal reasoning, or that contains code, puts the call back at the reasoning tier and it can never register as a saving at all, while a call that was offered tools or that ran on 8,000 or more input tokens is never suggested below standard whatever the prompt looks like. A call whose model has no price row is reported as skipped rather than assumed free. The report carries its own assumptions rather than a footnote: complexity is inferred from a redacted prompt excerpt and token counts and is not a judgement that the cheaper model would have answered acceptably; the modelled cost reuses the actual token counts, and a different model would tokenise differently and may be more or less verbose; and savings are priced at today’s rates, not the rates in force when the call was made.

allowDowngrade
Off by default. Serving a different model than the caller named changes the answer they get, so it has to be opted into per agent rather than assumed.
maxTier
A ceiling, not a target. An agent capped at standard never reaches a reasoning model however the router scores the task, which is what stops a cheap classifier quietly costing frontier prices.
Never above the requested tier
The promise to send complex work to strong models is honoured by declining to downgrade it, not by upgrading on the caller’s behalf. An upgrade would spend money nobody authorised, and no ceiling in the data model would bound it.
Reproducible selection
Among candidates at the chosen tier, selection is ordered by blended rate, then provider priority, then model name, so two identically-priced models cannot make the same trace unrepeatable.
Worked example: the tier decision recorded on the trace
// reasons[], in the shape the classifier and the resolver emit them
latest turn asks to extract, summarise (-3)
prompt is 148 characters with no tools offered (-2)
caller capped the answer at 40 output tokens (-2)
single-turn request with no prior context (-1)
score -8 places the task in the economy tier
downgraded standard → economy at confidence 0.95

// recorded beside them on the tier_routing event
verdict              rerouted
selectedTier         economy
selectedModel        cheapest reachable row at that tier
estimatedSavingUsd   clamped at zero, measured from the cheapest
                     equally-specific row for the requested model
the limits

What this does not do

Stated here rather than discovered during an evaluation. Every line below closes off a reasonable assumption a reader would otherwise carry into a proof of concept.

  • There is no team-level or fleet-level budget pool. Ceilings are enforced per governed subject; the team and fleet figures in the budget report are the sum of the per-agent ceilings that exist, published beside a count of the agents that have none.
  • Nothing here is reconciled against a vendor invoice. Every figure is metered from the provider’s own reported usage against the price rows you hold — the one exception being OpenRouter, which reports an authoritative charge that is used in place of the arithmetic — and a shipped price row is a list price captured on a date that will go stale.
  • The retrospective savings report has no dashboard screen. It is an API endpoint over a bounded trace scan, so reading it today means calling it or wiring it into your own reporting, not opening a page in the console.
  • A hard-budgeted call forgoes retry and failover after its one potentially billable egress. That is a deliberate availability cost in exchange for a spend boundary, and an agent with no USD ceiling does not pay it.
  • The savings analysis cannot tell you a cheaper model would have answered acceptably. Nothing short of re-running the work and judging both outputs can, which is why the recommended sequence is read the modelled saving, run the router in shadow, then enable the downgrade.
  • Token Observe cannot bound spend it never sees. A vendor credential used directly, outside the gateway and outside a managed seat, is a discovery problem before it is a budget one.

If one of those limits is the thing that decides it for you, say so and you will get a straight answer about whether it is on the roadmap or out of scope.

Talk it through

What happens when an agent reaches its monthly ceiling mid-conversation?

The next call is refused before it reaches a provider, with a 429 and a typed reason naming the limit type, the configured value and the actual figure. Nothing partially executes and nothing is billed, because the refusal happens at admission rather than after egress. The attempt is still recorded as a blocked trace, so the evidence of the refusal exists. Separately, a post-call check publishes a budget warning once any window reaches 80 per cent of its ceiling and a budget-exceeded event at 100 per cent, so a human hears about the wall before an agent walks into it. That check reads the hour, day and month windows only; the per-request ceiling has nothing to warn about, because it is decided one call at a time.

Can two concurrent requests both slip past the same cap?

No. The USD admission runs inside one per-agent transaction that reads the three windows, tests the projection and writes the reservation before releasing the lock, with BEGIN IMMEDIATE on SQLite and a transaction advisory lock on PostgreSQL. Requests still in flight are counted: a running or awaiting-approval trace contributes the greater of its billed cost and its reservation. This is a fix rather than an original property — the spend window used to aggregate completed traces only, so several concurrent requests each saw zero in-flight spend and all passed a cap one of them would have breached. The guarantee is only as good as the store underneath it, which is why a deployment whose trace store cannot offer that atomic admission has its USD-budgeted traffic refused outright rather than quietly downgraded to completed-spend accounting.

What happens if a model has no price row?

For an agent with any USD ceiling configured, the request is refused with a 409 before egress, naming the unpriced model, the provider that would have served it and how many further fallbacks are also unpriced. Adding a price row, or removing every USD ceiling from an intentionally unbudgeted agent, resolves it. The alternative was tried and was worse: an unpriced model produced a $0 estimate, which silently disarmed every per-request ceiling on the documented production install. A control that is off while appearing to be on is the failure this refusal exists to prevent.

Does the kill switch stop calls that are already in flight?

No. It is checked at the start of every governed request, so it refuses new work rather than recalling a call already dispatched upstream. What it does cover is broader than the model gateway: it runs on token counting and the model-catalogue routes too, which deliberately open no trace because they execute nothing and once skipped the check with them, and it is the same predicate that filters an engaged switch into an endpoint seat’s signed policy bundle. Engaging or releasing one is admin-only, requires a stated reason and is written into the audit chain.

Will Token Observe ever route a request to a more expensive model?

No. The router never serves above the tier the caller asked for. A downgrade requires the agent’s allowDowngrade flag and a classification confidence of at least 0.75, and the agent’s maxTier ceiling caps the result regardless of both. A model the price table does not name is treated as reasoning tier for ceiling purposes, so an unpriced model cannot pass through the cap. The reasoning in the source is direct: an upgrade would spend money nobody authorised, and no ceiling in the data model would bound it.

How much should the retrospective savings number be trusted?

Treat the total as a ceiling and the high-confidence band as the defensible figure. The analysis reads completed calls, so it costs nothing and risks nothing, but it infers task complexity from a redacted prompt excerpt, token counts and whether tools were offered, and it models the cheaper model at the actual token counts even though a different model would tokenise differently. A prompt that reads as reasoning work or carries code is put back at the reasoning tier and can never register as a saving, and a call with tools or 8,000-plus input tokens is never suggested below standard. Unpriced calls are skipped rather than assumed free, the scan is bounded to a page of recent traces rather than the whole corpus, and the report ships those assumptions in its own payload.

Ask about this capability
Ask how this one actually works, where it sits in the request path, or what it will not do. Answers stay inside what this page claims.

Prefer to ask a person? Write to us →

get in touch

Bring us the agent you are least comfortable with.

Write to hello@tenhaw.com with what your agents do, which providers they call and what would have to be true for you to put something in front of them. James Rooney replies. You will get a straight answer about whether Token Observe fits, including when it does not.

no form · no qualification step · no sales desk · the other three ways in