Before optimising an AI bill, I want to know whether the dashboard is counting the right thing. Our implementation history contains two instructive accounting problems: image requests that appeared unusually cheap because fallback counting omitted image input, and multi-round requests whose local estimates counted context incorrectly. Neither problem requires a broken model API. Both can make sensible engineering decisions look irrational. The lesson is to label the origin of a number, reconcile it with provider evidence and measure useful completed work. The examples here are fictional, not extracts from UltraFit360’s invoices or customer usage.
A number needs a source label
Provider-reported usage, locally tokenised text and a rough character estimate are different kinds of evidence. They should not be combined under an unqualified “actual tokens” heading. A report can remain useful with incomplete data if it exposes which records are estimates and how the fallback was calculated.
I would store the usage source alongside input and output counts, model identity and operation outcome. That makes it possible to ask whether an apparent improvement came from a shorter request or a larger share of missing usage reports. A precise decimal produced by an approximate formula is still an approximation.
Images are not just a long text string
A vision request can contain text instructions, image content and model output. Counting only the visible text misses an important part of the input. The historical token guide describes this failure mode and a conservative fallback added to make missing image usage visible.
That historical fallback must not become a universal rule. Image accounting varies by provider, model, image size and processing settings. A fixed allowance can be useful for a labelled estimate, but it is not an interchangeable price meter for every vision model. When drafting a current budget, consult the provider’s actual usage and pricing rules rather than copying an old table from a repository note.
Multi-round agents complicate the request boundary
An agent may call a model, run a tool and call the model again with the result. The second input can include earlier messages. Those tokens may legitimately be processed again, but a local accounting routine can also accidentally count the same conceptual context twice within its own estimate.
I would distinguish the logical task from the provider calls that implement it. Each call gets its own usage record. The task aggregates those records with a clear relationship, rather than reconstructing everything from the final transcript. This makes retries and tool rounds inspectable without confusing “one user question” with “one billable model call.”
One task can contain several billable calls
A minimal fictional accounting model keeps task outcomes separate from per-call evidence.
Logical task · one record
- Task reference
Groups the initial attempt, tool rounds and retries.
- Completion outcome
Completed, failed, abandoned or unknown under a stated definition.
- Aggregate
Sum related call records without rebuilding usage from the final transcript.
Model call · many records per task
- Model + operation
Identify which provider call actually processed the input.
- Usage + source
Provider-reported, labelled estimate or unknown; unknown is not zero.
- Modality + outcome
Preserve text/image context and failed calls in the ledger.
Compare usage per successful task as well as per call. A cheap failed attempt may increase the cost of completion.
Cheap failures can create an expensive product
Suppose a fictional workflow uses fewer tokens per attempt after a prompt is shortened, but fails often enough that people ask again. The cost per call falls while the cost per successful task may rise. Latency, frustration and support load can worsen as well.
A practical comparison therefore includes the outcome. Define what completion means for that task, count failed and abandoned attempts where observable and inspect the total usage needed to reach the result. Do not silently discard errors because they make the graph harder to read. The team needs to see what the product spends while being unhelpful, not only the attractive successful examples.
Reconcile estimates without exposing private content
A cost report rarely needs the full prompt, a food photograph or a customer message to explain aggregate usage. Metadata such as operation type, model, usage source, time and completion status can answer many questions. Sensitive content collection should be justified separately.
To compare estimates with billing, align the time window, currency, model categories and any discounts or cached-input treatment. A mismatch is a reason to inspect the definitions, not immediately conclude that the provider or application is wrong. Taxes, credits and billing adjustments may belong outside a pure usage estimate. Make that separation visible rather than adding a mysterious correction factor.
A fictional worksheet I would trust
Imagine a report with one row per model call and columns for input usage, output usage, source, request status and task identifier. A task summary then shows total reported usage, estimated usage and whether the requested outcome completed. Missing values stay missing instead of becoming zero.
This design lets a team compare similar tasks and identify which operation needs investigation. It also makes a vision-heavy task distinguishable from a text-only task without revealing the image itself. The worksheet is a teaching model, not our private database layout. The transferable idea is transparent provenance and aggregation, not a particular table name.
Scroll the table horizontally to see all columns.
| Fictional call | Usage source | Task status |
|---|---|---|
| Text analysis | Provider reported | Completed |
| Vision analysis | Labelled estimate | Completed |
| Retry | Provider reported | Failed |
| Missing report | Unknown, not zero | Uncertain |
Optimise one cause at a time
Once accounting is credible, look at redundant context, unnecessary rounds, avoidable retries and whether a deterministic operation should replace a model call. A smaller model can be appropriate for some tasks, but the decision should be validated on the same quality checks used for the larger one.
Caching also needs task-specific judgment. Reusing a stable public explanation is different from reusing an answer that depends on a person’s current plan. A high hit rate does not establish correctness. Cost optimisation that serves stale advice has merely transferred the expense from the invoice to the user experience.
Publish measured scope rather than extrapolated savings
Our historical notes include projections based on assumed traffic and prices. Those projections are not a current account balance. I would report a measured sample only with its model, task mix, period and success criteria, and clearly distinguish a forecast from observed expenditure.
The same discipline applies to screenshots. An illustrative chart can explain the calculation, but it should say it is illustrative. A beautiful generated image should never masquerade as an invoice or monitoring capture. Trustworthy technical writing keeps the measurement method visible even when the resulting headline is less dramatic.
Questions worth asking
Should missing usage become zero? No. Zero means the operation used none; missing means the system does not know. Conflating them systematically rewards blind spots.
Can a character count estimate every model? It can provide a rough fallback for some text, but tokenisation and multimodal accounting differ. Label the estimate and prefer provider-reported evidence when available.
What is the best first optimisation? Fix the largest verified source of waste in completed tasks. That may be context assembly, retry policy or an unnecessary model call. Start with evidence rather than selecting the cheapest advertised model and hoping the rest follows.
Sources
Technical references checked .


