核验清单
- ✓看这次响应里的
cache_creation_input_tokens和cache_read_input_tokens。两个都是 0,前缀没过该模型的最低长度,或缓存被跳过,你付的是普通输入,不是折扣。 - ✓如果每次写入 token 都很大、读取一直是 0,断点在会变的内容上,或者下一次请求已经出了时限。把断点挪到跨请求不变的最后一块,再看读取是否出现。
- ✓Claude 的 5 分钟从这次请求开始算,不从回答结束算。流式回答自己占了大半窗口,跟进请求可能已经是新的写入。
- ✓不要把 Claude 的三项相加和 OpenAI 的减法混用。GPT-5.6 起,写入价替代普通输入价,不是在 1 倍之外再加 1.25 倍。
- ✓Claude 的 1 小时档要数窗口里有没有两次命中。一次命中覆盖不了 2 倍写入。5 分钟档一次完整复用就能把 1.25 倍拉回到比发两次更便宜。
1. 命中便宜,写入不便宜
很多人把提示缓存理解成「同一段前缀,第二次自动打折」。Claude 和 OpenAI 现在的价目都不是这个意思。命中(cache read)确实远低于普通输入。写入(cache write)在现行的多数模型上比普通输入更贵。只看「cached」这个词,会把第一笔加价当成平台算错。
Claude 定价页把乘数写在提示缓存一节:5 分钟缓存写入是基础输入价的 1.25 倍,1 小时写入是 2 倍。命中和刷新,多数模型是 0.1 倍;Claude Opus 5.5 和 Sonnet 5.5 是 0.05 倍;Fable 5.1 和 Mythos 5.1 是 0.025 倍。官方给的回本账是:5 分钟档,写入 1.25 再加一次命中 0.1,合计 1.35,对照不缓存时把同一段发两次的 2 倍,第一次完整复用就回本。1 小时档写入已经是 2 倍,要两次命中(2 + 0.2 = 2.2,对照三次不缓存的 3)才划算。只写一次、窗口里没有第二次请求,你付的是加价,不是折扣。具体单价以定价页为准,这里只核对乘数。
OpenAI 提示缓存说明从 GPT-5.6 起把写入也改成普通未缓存输入的 1.25 倍,读取多数是 0.1 倍,GPT-6.1 Sol 是 0.05 倍。文档算过同一笔:按 0.1 倍读取,写一次再完整读一次是 1.35 倍,不缓存发两次是 2 倍;写一次再读九次是 2.15 倍,不缓存发十次是 10 倍。更早的模型没有写入加价,只有各自的缓存读取折扣。把 2024 年「自动对半」的记忆套到 GPT-5.6 上,第一笔会对不上。写入价是替代,不是附加:同一批 token 走未缓存输入、缓存读取、缓存写入三者之一,不会在 1 倍之外再加 1.25。
2. 时钟从请求开始走,不从回答结束走
Claude 提示缓存默认 5 分钟。寿命从写入或读取这次请求的开始时刻算,不从回答结束算。文档里的例子:流式回答用了 4 分钟,下一次要复用同一前缀,必须在这次回答结束后大约 1 分钟内发出。生成时间吃的是缓存寿命,不是免费附送的等待。命中会刷新寿命,这次刷新不再另收一笔写入费。你付的是命中本身的读取价。「刷新不再另收写入」不是「命中变成 0」。
1 小时档要显式把 TTL 设成 1 小时,写入按 2 倍。它买的是更长的窗口,不是更便宜的命中。自动缓存默认仍是 5 分钟。顶层 cache_control 和块上已有的断点 TTL 不一致,接口返回 400;已经放满 4 个显式断点再加自动缓存,也是 400。缓存被静默跳过时则不报错,见下一节的用量字段。
并发还有一个坑:缓存条目要等第一次响应开始之后,后续请求才能读到。一批并行请求同时打出去,各自看不到别人正在写的缓存,于是各自付一笔写入。要命中,得等第一笔响应开始,再发后面的。
OpenAI 在 GPT-5.6 及之后,prompt_cache_options.ttl 目前只支持 30m,这也是默认值。最近一次写入或复用之后至少 30 分钟可再用,复用刷新寿命,不再收写入费;平台可能留得更久,不能把「可能更久」当成账单承诺。更早的模型用 prompt_cache_retention:in_memory 大约闲置 5 到 10 分钟、最长一小时;24h 通常大约 30 分钟可用、最长可留 24 小时。两种都支持时,组织没开 Zero Data Retention,默认 24h;开了则默认 in_memory。短窗口不是接口故障,是保留策略。缓存不跨组织,也不跨处理区域。
3. 断点放在会变的那一块,等于每次都付写入
Claude 只在标了 cache_control 的断点上写一条缓存。哈希覆盖断点之前的整个前缀,顺序是 tools、system、messages。断点前面任何一个块变了,哈希就变,下一次是新的写入。读取会从断点往回找以前写过的条目,最多看 20 个位置。它找的是以前的写入,不是「这段看起来很稳定,所以自动缓存」。自动缓存把断点放在最后一个可缓存块上。如果最后一块是每轮都变的用户消息,每一轮都在写,读不到上一轮。断点要放在跨请求保持不变的最后一块上。对话在长,但每轮新增不到 20 块时,把断点留在末尾仍能回看到上一轮的写入;一旦超出这 20 块的回看窗口,上一轮的条目就在窗外,需要更靠前的第二个断点事先写过。
断点个数本身不加价,最多 4 个。加价只看实际写入和读取的 token。前缀短于该模型的最低长度时,请求照常处理,不报错,也不缓存。用量里 cache_creation_input_tokens 和 cache_read_input_tokens 都是 0,就是没进缓存。最低长度按模型不同,文档列出 512、1024、2048、4096 几档,以提示缓存页里你这个模型的那一行为准。用别的模型的门槛去解释自己的 0,会对错原因。
失效顺着层级走。改工具定义,tools、system、messages 全部失效。开关联网搜索、引用,或在 speed: "fast" 和标准速度之间切换,system 和 messages 失效。改 tool_choice、增删图片,messages 失效。这些变化不会报错,下一笔只是重新按写入价计。思考块不能单独标断点,但出现在之前的助手回合里时可以跟着别的内容被缓存;从缓存读出时,它们计入输入 token。
OpenAI 在 GPT-5.6 及之后可以显式断点。prompt_cache_options.mode 设成 explicit 且一个断点都不放,这次请求不使用提示缓存,也不产生写入。断点之后的内容按未缓存输入计,不收写入费。这是避开「把会变的尾巴写进缓存」的办法。隐式模式会把断点放在最近一条合格消息的末尾,那条消息如果每轮都变,写入就会跟着变。更早的模型只有隐式断点,报告的 cached_tokens 还会扣掉隐藏的系统 token,再向下取整到 128 的倍数,所以用量数字可以小于你心算的前缀长度。缓存落在单台机器上。同一组织、同一区域里,流量高过大约每分钟 15 次,可能被分流到没有这份缓存的机器,于是未命中。prompt_cache_key 在 GPT-5.6 之前影响路由,不能保证命中;在 GPT-5.6 及之后,路由由平台处理,这个 key 用来把不同客户的缓存账分开,也不是命中开关。GPT-5.6 起最低可缓存前缀是 1024 个可见输入 token,隐藏的系统内容不计入这个门槛。更早的模型门槛还跟工具、图片、输出格式和推理强度有关。
4. 两家的用量字段不是同一本账
Claude 的 input_tokens 只统计最后一个断点之后的 token,不是你发出去的全部输入。总输入是 cache_read_input_tokens + cache_creation_input_tokens + input_tokens。把 input_tokens 当成全部输入再乘基础单价,会把命中和写入都漏掉,账单看起来像平台多收了。流式响应里这三项在 message_start 的 usage 里,不在最后一条文本事件里。
OpenAI 在 usage.input_tokens_details 里给 cached_tokens 和 cache_write_tokens。普通输入等于 input_tokens 减去这两项。写入的那些 token 用 1.25 倍,不在此之外再乘 1 倍。用 Claude 的三项相加去套 OpenAI,或者用 OpenAI 的减法去套 Claude,都会得到一笔不存在的重复收费,或一笔不存在的折扣。诊断接口报的 cache miss 计数可以和 usage 不一致,计费以当次响应的 usage 为准。诊断本身不加价,但为了对比而额外打出的基线请求或重试,仍按那些请求自己的 token 计。
乘数还会叠别的修饰。Claude 写明缓存乘数与 Batch 折扣、长上下文定价、数据驻留叠加。Claude 4.6 及之后,用 inference_geo 指定仅美国推理,输入、输出、写入、读取都再乘 1.1。Haiku 5.5 按提示长度分档,提示超过 10 万 token 走更高单价,缓存读取和写入都计入这次提示长度。一次请求超了线,即使其中一部分是命中,也按更高档计;更早的短请求保持当时的价格。这和国内 DeepSeek、通义千问的上下文缓存不是同一口表。那边是前缀命中折扣。这边在现行 Claude 和 GPT-5.6 之后,第一笔写入可以比不开缓存更贵。
5. 给 API 账户充值,补不回一次未命中
对账先拆四列。第一列是这次 usage:写入 token、读取 token、断点之后的普通输入,各乘各的乘数,不要加总后再乘一个价。第二列是时限:Claude 从请求开始算 5 分钟或 1 小时;OpenAI GPT-5.6 起至少 30 分钟,更早的模型看 in_memory 还是 24h,以及组织有没有开 Zero Data Retention。第三列是前缀是否真的相同:工具定义、system、消息顺序,有没有在 fast 和标准速度之间切过。第四列是请求是不是抢在第一次响应开始之前并行发出去的。
给平台账户充值是第五本账。链上把稳定币换成能充进 API 账户的资产,发生在余额入账之前。它不制造缓存命中,也不把已经按 1.25 倍或 2 倍记下的写入改成折扣。需要这一步时,可以用无需注册、非托管的 AllSwap 完成链上兑换。兑换成功只说明资产换了手。断点、时限和用量字段该改还得改。