9. Load only the tools this job can use
Do this. A writing task does not need every browser, database, email, Slack, GitHub, and calendar tool you own. Keep a few common tools available and load the rest only when a request needs them. If your host supports tool search or deferred loading, use it for large catalogs. If a job needs no tools, give it none.
What it saves. Tool descriptions at the start of the request, and tool results on every later turn.
Why it works. Every tool ships a name, an explanation, and an argument schema. All of it is model input even when the model never calls that tool.
How we know: Anthropic reports that a typical multi-server setup can start with roughly 55,000 tokens of tool definitions, and that its tool-search tool generally cuts that definition load by more than 85% by loading only the three to five tools a request appears to need. Anthropic recommends it once you have about ten tools or more than 10,000 tokens of definitions. Source: https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool
10. Clean up old tool output during a genuinely long job
Do this. Sometimes a clean task is the wrong answer. You are three hours into debugging one system and the model needs decisions it made forty minutes ago. That is where compaction and context editing belong: remove or compact the old browser pages, command output, screenshots, and reasoning the next step no longer needs, while keeping the state it does.
A browser page dumped 20,000 tokens into the conversation and the next step needs the account ID from it. Keep the ID. Drop the page.
Do not compact a five-message chat because the feature exists, and do not remove a fact the next step still needs.
What it saves. Reused input on every later step of the same long job.
Why it works. The next request carries a smaller representation of the earlier work instead of every raw intermediate result.
The tradeoff. Editing old material can break a prompt-cache match. That is fine when you remove far more waste than the cache discount was saving — but you have to compare the whole job, not the one call.
How we know: OpenAI supports compaction for long-running API work and says the compaction item preserves the state later turns need using fewer tokens (https://developers.openai.com/api/docs/guides/compaction). Anthropic supports context editing that can clear old tool results and thinking blocks (https://platform.claude.com/docs/en/build-with-claude/context-editing). The actual saving depends on what your host keeps, so verify the next request's input count.
11. Ask for only the answer you need
Do this. Ask for one file, one JSON object, five bullets, or one replacement paragraph. Set a short output limit when the interface supports it. Do not request a process diary unless you are going to read it.
This is not an argument for caveman prose. If the writing is the product, give it the space it deserves. Remove the words nobody will use.
What it saves. Output now, and input later — because the model's answer often becomes part of the next request.
Why it works. Every generated word is a token when it is written and may be a token again on every subsequent turn.
How we know: in the matched job the clean worker produced 131 output tokens and the normal three-call worker produced 515. Shorter output was not the whole win, but it helped twice: once immediately, and again by leaving less text for later calls to carry.
12. Use more than one model — but count the whole job
Do this. Give bounded extraction, classification, formatting, and short rewrites to a cheaper model when it can pass the same check. Keep difficult judgment, strategy, and final writing on the strongest model you have. You do not have to pick Codex or Claude as a religion — use Codex, Claude, GLM, a local model, or whatever earns the work.
Then apply the rule that stops model routing from becoming theater: count the whole job. If a small model burns 20,000 tokens, fails, and a large model has to reread the failure plus the original request to fix it, you did not save anything. You added a detour. If a small model handles a thousand routine classifications correctly and the strong model only sees the five uncertain cases, that is a large real win.
What it saves. Expensive-model capacity, and sometimes total tokens. Model choice alone guarantees neither.
Why it works. Different jobs need different levels of judgment. A lower price per call is only useful when the returned work passes without expensive repair.
How we know: compare the complete job — all input, reused input, output, calls, retries, and human repair. Keep the smaller model only when the accepted result costs less. Nothing here claims that any particular cheap model wins on your work.
13. Put a hard stop on oversized calls and retries
Do this. Set explicit limits before the call for fresh input, reused input, output length, number of model calls, and number of repair attempts.
If the answer is missing one required fact, one small repair with that fact may make sense. If the request itself is over the limit, do not send it again. Narrow the source, drop the tools this job cannot use, move the exact steps into code, and send a smaller request to a clean worker.
What it saves. Duplicate calls, retry loops, and runaway output.
Why it works. A second copy of an oversized request is still oversized. A token-limit failure cannot be repaired by repeating the same call.
How we know: an early Ringer path retried after a token-limit failure, and the second call could not make the first request smaller — it only repeated the waste. The pre-call code now has separate limits for fresh input, reused input, output, and calls, and its tests confirm a failed or over-limit call does not silently fall through to another model.