Methods
There are plenty of ways to make an AI bill smaller. Most of them change what the model gives back. We only turn on the ones that can't.
Same model, same input tokens. There is no quality decision being made, so there is nothing to test and nothing to argue about in a security review.
Each of these genuinely saves money, and each changes what the model receives or which model answers. We'll tell you what they'd save. We won't switch them on for you.
The full list
| Method | Saves | Output | Where it applies |
|---|---|---|---|
| Prompt caching | 90% | identical | Any repeated prefix — system prompts, tool definitions, conversation history |
| Image caching | 90% | identical | One image is 1,500–4,800 tokens. Same mechanism as text. |
| Batch API | 50% | identical | Input and output. Async-tolerant work only — evals, bulk classification, offline runs. |
| Exact-match cache | 100% | byte-identical | A true repeat returns the stored bytes. The only literal byte-identity guarantee here. |
| Request dedup | varies | identical | Concurrent identical calls collapse into one upstream request |
| Batch + caching | 95% | identical | The two stack: a cached token inside a batch is 0.1× × 0.5. Use the 1-hour TTL — a 5-minute entry expires inside a 24h batch window. |
| Container pairing | 100% | identical | Code-execution container hours are waived outright on any request that also uses a
current web_search/web_fetch tool version. |
| Output truncation | varies | identical | stop_sequences ends generation at the last token you need. Billing is on
tokens actually generated, so trailing prose is real money. |
| Streaming long jobs | ~2× | identical | Avoids the idle-connection drop that makes a client blindly retry and pay for the same generation twice. |
| Billing path | ~10% | identical | Inference geography and commitment terms change the invoice, not the model |
| Model routing | up to 5× | changes | A different model writes different words. Must be proven per workload. |
| Image downsampling | ~3× | changes | Fewer pixels reach the model. Small text degrades first. |
| OCR instead of vision | ~7× | changes | The model never sees the image — only an OCR engine's reading of it |
| Semantic cache | high | changes | Answers a similar question with a stored response. Can be silently wrong. |
| History trimming | caps growth | changes | The model permanently loses what it can no longer see |
| Pre-resizing images | $0 | identical | Saves upload time, not tokens — Claude resizes server-side regardless. We don't bill it as savings. |
Two honest limits. Caching discounts input only; output always bills at full rate, which caps every input-side lever. And inference isn't bit-deterministic to begin with: send the same prompt a thousand times at temperature 0 and you get back around eighty distinct completions, because GPU kernels don't reduce in a fixed order. Nothing on this page causes that and nothing on this page can fix it. So "identical" means zero quality change by construction — same model, same input tokens — not identical bytes. Only an exact-match cache hit is literally byte-for-byte, because it returns what was stored.
| Claim | What's actually true |
|---|---|
Lower max_tokens | Zero price effect in either direction. You are billed on tokens generated, not on the ceiling you set. |
| A cheaper image format | None. Token cost is
ceil(w/28) × ceil(h/28) — pixels only. JPEG vs PNG changes upload size
and nothing else. |
| Long-context discount tier | Does not exist on any current model. A 900K-token request bills at the same per-token rate as a 9K one. |
| Fast mode | A 2× premium on Opus, not a discount, and it multiplies with everything else. |
| Files API | No token reduction. An uploaded image bills exactly as inline base64 does. It is a payload and latency win. |
| Tiling a big image | Costs more, not less — each tile hits the resolution cap independently. It buys fidelity, not savings. |
We publish these because every one of them is something a vendor could quietly bill you for implementing. None of them will appear on your invoice as a saving, so none of them appear in ours.
Why the split matters
Anything that changes model output has to be evaluated, argued about, and signed off. That's where cost projects die. Everything in our default set skips that conversation entirely — because nothing about the answer changed.