Skip to main content
list_orders returns ~3.1k tokens per call, roughly 0.0094ofcontexteachtime0.0094 of context each time — 8.39 across 892 calls.

When it fires

What it means

Ten thousand bytes is roughly 2,500 tokens. Every call is putting that into the model’s context window, and it is paid for on every subsequent turn of the conversation, not once. The insight prices it two ways because both matter: per call, which is what you are deciding about, and across the range, which is what it has already cost.

The fixes, in the order they usually work

1

Return fields, not records

A row with 40 columns costs 40 columns of context. Return the three or four fields the model actually needs to answer the next question, and offer a get_x tool for the full record when it is genuinely wanted.
2

Add a limit, and default it low

A search with no limit returns everything matching. A default of 10 with an explicit limit argument is almost always better than 100 — the model can ask for more, and usually does not need to.
3

Stop pretty-printing

JSON.stringify(x, null, 2) is measurably more bytes than JSON.stringify(x), and no model reads the indentation.
4

Stop echoing the request

Returning the filters that were applied, alongside the results, doubles small responses. The model already has the arguments it sent.
5

Summarise where you can

A count and five examples often answers the question better than four hundred rows — and if it does not, the model can narrow and ask again for far less than the four hundred rows would have cost.

Worth checking before you optimise

Sometimes a heavy response is correct. A tool whose whole job is fetching a document returns a document. The test is whether the model uses what it is given. A heavy tool with high first-call success is expensive and working; a heavy tool that also gets retried is expensive and not working, and it is the second one worth fixing first.