
The bill moved, or the answer got slower, and someone says the prompt is cached. Do not treat the reply as something a cache write produced, and do not ask the model whether it wrote, until you can name the write on the request you stored. Name cache_creation_input_tokens on that response. Name cache_read_input_tokens beside it. Name input_tokens, which is the part after the last breakpoint, not the whole prompt. Then show a second request whose three numbers are not these, or write that the log keeps only one shape. If any of the three requires asking the model what it cached, you do not have the write. You have a reply.
This is the cache record on one response. It is not the prompt text. Which prompt did that request send? is the system text, the messages, and the tools. A prompt can be long while both cache fields are zero, and a write can be non-zero while you still have not stored the text. It is not the token total someone quotes from a single field. Name the tokens the response billed is the usage object, including these fields. Naming the write is the narrower question: which of those fields moved, and by how many tokens. It is not the thinking budget. Which budget did that thinking use? is a budget you sent or a refusal in its place. A budget is not cache_creation_input_tokens. It is not which batch the request joined. Which batch did that request join? is a batch id and a custom id. A batch discount can stack with a cache price, and a batch is still not a write.
None of what follows is a savings rate for this product, and none of it is a reason to skip the log. The fields below are one vendor's current description of prompt caching. The percentages below that are a 2026 paper about other people's agent sessions. A pricing multiple is not your invoice. A paper that waited 24 hours between conditions cannot name the write on the call you opened tonight. They do tell you which numbers people mix up when they try to sound precise about a cache they have not stored.
Anthropic's prompt-caching page says cache_creation_input_tokens is the number of tokens written to the cache when a new entry is created, and cache_read_input_tokens is the number retrieved from the cache for this request. input_tokens is only the tokens after the last cache breakpoint. It is not all the input you sent. The total they print is cache_read_input_tokens plus cache_creation_input_tokens plus input_tokens. The worked example is a read of 100,000, a write of 0, and an input of 50, which sums to 100,050. 100,000 is not 100,050. 50 is not 0. A write of 0 next to a read of 100,000 is a hit, not a missing cache. If both the write and the read are 0, the page says the prompt was not cached. Two zeros are not one zero. There is no error when the prompt is shorter than the minimum. Silence is not a write (Anthropic, Prompt caching).
The minimums are not one number, and they are not monotonic in the model name. On the Claude API, Claude Platform on AWS, Google Cloud, and Microsoft Foundry, the page lists 512 tokens for Claude Fable 5.1, Claude Mythos 5.1, Claude Opus 5, Claude Fable 5, and Claude Mythos 5. It lists 2,048 for Claude Mythos Preview and Claude Opus 4.7. It lists 4,096 for Claude Opus 4.6 and Claude Opus 4.5. It lists 1,024 for Claude Opus 4.8, Claude Sonnet 5, Claude Sonnet 4.6, Claude Sonnet 4.5, and the retired Opus 4.1, Opus 4, and Sonnet 4, with the retirement exceptions the page attaches to each. It lists 4,096 again for Claude Haiku 4.5, and 2,048 for retired Haiku 3.5. 512 is not 1,024. 1,024 is not 2,048. 2,048 is not 4,096. Opus 4.8's minimum is 1,024 and Opus 4.6's is 4,096. A higher version number is not a higher minimum. Haiku 4.5's 4,096 is the same integer as Opus 4.6's 4,096 and is not the same model. The page says these minimums apply on every platform where each model is available, and it sends Bedrock readers to a different page for Bedrock's own minimums. Do not paste this list onto Bedrock.
The clock and the price are different axes. The default lifetime is 5 minutes. A 1-hour duration exists at additional cost. 5 minutes is not 1 hour. A 5-minute write is 1.25 times base input price, which the page also calls 25% more. A 1-hour write is 2 times base input price. A read is 0.1 times base input price, except Claude Fable 5.1 and Claude Mythos 5.1, which the footnote prices at 0.025 times. 0.025 is not 0.1. 1.25 is not 2. The 5-minute cache is refreshed for no additional cost when the cached content is used. That refresh is not a 1-hour write. You can use both durations in one request only if the longer TTL appears before the shorter one. A 1-hour block after a 5-minute block is not the order the page allows.
The price table is per model, and a multiplier is not a cell you may swap. Claude Fable 5.1 is $10 base input per million tokens, $12.50 for a 5-minute write, $20 for a 1-hour write, $0.25 for a hit, and $50 output. $12.50 is 1.25 times $10. $20 is 2 times $10. $0.25 is 0.025 times $10, which is the footnote, not the 0.1 rule. Claude Fable 5 is also $10 base and $12.50 and $20, but its hit price is $1, not $0.25. Fable 5.1 is not Fable 5. Claude Opus 5 is $5, $6.25, $10, $0.50, and $25. $5 is not 512 tokens. $6.25 is not Haiku 4.5's $1.25. Claude Haiku 4.5 is $1 base, $1.25 for a 5-minute write, $2 for a 1-hour write, $0.10 for a hit, and $5 output. $0.10 is 0.1 times $1. $2 is not $1.25. Claude Sonnet 4.5 is $3, $3.75, $6, $0.30, and $15. $3.75 is not $3. The page says these multipliers stack with the Batch API discount. A stack is not a reason to add the percentages. 25% more and a batch cut are two adjustments. Do not add them in your head and call the sum the write.
Breakpoints are a fourth count. You can define up to 4 cache breakpoints. 4 is not 4,096 tokens. The lookback window is 20 blocks, counting the breakpoint itself as the first. 20 is not 4. The worked turns are: turn 1 has 10 blocks and writes at block 10; turn 2 has 15 blocks, misses at 15, and hits the entry at 10; turn 3 has 35 blocks and checks 20 positions, blocks 35 through 16, and misses the entry at 15 because 15 is one position outside that window. 35 is not 15. 10 is not 20. A run of consecutive tool_use blocks counts as one position, and so does a run of consecutive tool_result blocks. One position is not one block. If the last block already has an explicit cache_control with the same TTL, automatic caching is a no-op. If the TTL differs, the API returns a 400. If 4 explicit breakpoints already exist, automatic caching also returns a 400. A 400 is not a write of 0. A write of 0 with a read of 0 is the short-prompt case, and it is not an error. The only cache type the page names is ephemeral, whose default lifetime is the 5 minutes already stated. ephemeral is not a model.
The paper people reach for when they want a savings rate measured three providers and did not store your write. Elias Lumer, Faheem Nizar, Akshaya Jangiti, Kevin Frank, Anmol Gulati, Mandar Phadate, and Vamse Kumar Subbiah, at PricewaterhouseCoopers, evaluated prompt caching on DeepResearch Bench. The abstract says caching reduces API costs by 41 to 80% and improves time to first token by 13 to 31%, across over 500 agent sessions with 10,000-token system prompts. Section 4.1 says cost savings range from 41% to 80% and time-to-first-token improvements range from 6% to 31%. 6% is not 13%. The introduction says 500 agent sessions. The methods say n equals 40 per condition. The page also names four models and four conditions. It does not print the product of those three counts. 40 is not 500. 10,000 tokens is not 512, and it is not 4,096. Over 500 is not the integer 500 (Lumer, Nizar, Jangiti, Frank, Gulati, Phadate, and Subbiah, Don't Break the Cache).
The benchmark is not the session count. DeepResearch Bench, as they describe it, is 100 PhD-level research tasks across 22 fields. 100 is not 500. 22 is not 4. The four models are GPT-5.2, Claude Sonnet 4.5, Gemini 2.5 Pro, and GPT-4o. Three providers, four models. 3 is not 4. They wait more than 24 hours between cache conditions so entries expire. 24 hours is their wait. It is not Anthropic's 5-minute default, and it is not the 1-hour option. Significance is at alpha 0.05. 0.05 is not 0.025, the Fable 5.1 read multiplier, and it is not a cost reduction. The ablation ranges are prompt sizes of 500 to 50,000 tokens and tool-call counts of 3 to 50. 500 tokens is not 512, and the paper's 50 is a count of tool calls. It is not the documentation example's input_tokens of 50.
Table 1 is the best mode per model, and best is not the same column for every row. GPT-5.2, excluding tool results, is 79.6% cost and 13.0% time to first token. Claude Sonnet 4.5, system prompt only, is 78.5% and 22.9%. Gemini 2.5 Pro, system prompt only, is 41.4% and 6.1%. GPT-4o, system prompt only, is 45.9% and 30.9%. 6.1% sits inside the section's 6 to 31 and outside the abstract's 13 to 31. 30.9 is not the integer 31. 79.6 is not 78.5. 41.4 is not 45.9. 13.0 is not 22.9.
Table 2 is every mode, and it does not match a single best. GPT-5.2 full context is 79.3% cost and 9.5% latency, system prompt is 81.4% and 10.5%, and excluding tool results is 79.6% and 13.0%. The cost peak is 81.4%. Table 1's best row for that model is the 79.6% row, chosen for latency. 81.4 is not 79.6. Claude Sonnet 4.5 is 77.8% and 21.8% full, 78.5% and 22.9% system, 78.1% and 20.9% excluding tool results. 77.8 is not 78.5. Gemini is 38.3% and 6.0% full, 41.4% and 6.1% system, and 27.8% with a time-to-first-token change of −2.9% when tool results are excluded. A negative latency figure is a regression. −2.9 is not 6.1. 27.8 is not 41.4. GPT-4o full context is 47.8% cost and −8.8% latency. System prompt is 45.9% and 30.9%. Excluding tool results is 46.8% and 28.1%. 47.8 is a larger cost cut than 45.9 and a worse latency result. −8.8 is not 30.9.
The prose ranges do not cover every cell they sit above. The page says cost reductions range from 79 to 81% for GPT-5.2, 78 to 79% for Claude Sonnet 4.5, 46 to 48% for GPT-4o, and 28 to 41% for Gemini. Claude's full-context cell is 77.8%, which is below 78. GPT-4o's system-prompt cell is 45.9%, which is below 46. Gemini's exclude-tool-results cell is 27.8%, which is below 28. Do not widen the sentence until the cell fits, and do not delete the cell because the sentence is rounder. A later sentence says strategy differences are typically within 2 to 4 percentage points. Gemini's 41.4 minus 27.8 is 13.6 points, which is not inside 2 to 4. GPT-5.2's 81.4 minus 79.3 is 2.1, which is inside that band. The word typically is doing work. It is not a claim that every pair is inside the band. None of these percentages is cache_creation_input_tokens on your request.
Do the three proofs on one real response, in the log that actually stored it. First, the binding. Copy the write, the read, and the input_tokens after the breakpoint. If both cache fields are 0, write that the prompt was not cached. Do not call that a hit. If the write is non-zero and the read is 0, write that this call created an entry and did not read one. Second, the other request. A different call, with a different triple, is not this one. A paper's 79.6% is not that second call. If you cannot show a request that is not this write, you have a rate, not a record. Third, the store. The numbers have to be in a log you keep. The model does not get to recall them. If the only copy is a screenshot of a dashboard that sums the three fields into one price, write that the split was not stored.
Three moves feel like the proof and are a second problem. Turning caching off because the write was more expensive than the read, and then describing the missing fields as a cleanup. Quoting 41 to 80% because it looks like a range you could promise, while the call in front of you is three integers, and the range is someone else's sessions. Asking the model whether it hit the cache. It will say yes. It will not read usage. The tokens the response billed, which you have not split, are name the tokens the response billed. Opening that page does not, by itself, separate a write from a read.
The path is ordinary when one tenant's call is stored without opening the next tenant's usage as the method. Veritas AI is a multi-tenant fraud-detection API with an enterprise dashboard, and one tenant's request is not the next tenant's. The shape that matters here is one response whose usage you can point at, distinct from the next. That case is not a prompt-cache ledger. Nothing in the description is a headcount, a duration, or a result figure. If the only record is a monthly total, you do not have this proof. You have an invoice.
There is a version of this call where hiring the path is the wrong purchase. Nothing is in production, because no model is being called. You have a slide of a cache and no response log. The request was not stored, so there is no write to name. A customer has already seen another customer's data. Keeping the next usage line does not close a leak. The wrong value was already written back to a system of record. A cache field does not undo a write. Or no metric was ever named, so there is nothing for a later eval to move. The criteria for choosing a firm sit on the page written for a top SaaS development company. That page is criteria. It does not rank anyone, including us.
When the feature is already live and the log does not store the three fields, the missing object is specific. A record, in an account you administer, of the write, the read, and the uncached tail on the call that produced the reply, plus a second call that differs. An AI pilot failed to reach production engagement is scoped after an audit, not before it. The audit is the first one to two weeks of an engagement that runs eight to twelve. The build is unpaid if the metric you agreed does not move. Rollout, when it happens, sits behind a human-review gate. If you do not yet know whether the pilot can be saved, a two-week AI readiness assessment hands you the findings either way. AI evaluation and observability is how you learn, afterwards, whether the cases you saved still fail when the cache write moves. An AI integration sprint is the shape where the acceptance sentence can require the three fields on every stored response. The paper's percentages will not be that score.
The session a checkout opened, and the cache a job restored, are different objects: which session did that checkout open? and which cache did that job restore?. Do not record either on this page. A payment status is not a token write. A workflow key is not cache_creation_input_tokens.
Before you tell anyone the prompt was cached, do the three proofs and write the triple. Name the write, the read, and the tokens after the breakpoint, or write that both cache fields were zero. Show a second request that differs, or write that the log keeps one shape. Do not ask the model whether it wrote, and do not quote a paper's range as your hit rate. A vendor page can tell you what a write costs on a model you name. The binding is the response you stored.
Questions
You stop treating the reply as something a cache write produced, and you stop asking the model whether it wrote, until you can name the write, the read, and the tokens after the breakpoint, show a different request whose three numbers are not these, and show that you stored the response rather than the model describing it. If both cache fields are zero, write that the prompt was not cached.
No. A range on someone else's sessions is not the integer on this response. A write you can defend is cache_creation_input_tokens beside the read and the uncached tail, or a written line that both cache fields were zero. 41 to 80 percent is not a token count, and 100,000 in a documentation example is not your prompt.
When nothing is in production, when no model is being called, when the request was not logged, when a customer has already seen another customer's data, when the wrong value was already a write, or when no metric was ever named.
Related: AI pilot failed to reach production
Find this useful? Tell Google to show you more of it.
