cache_control 后,首次请求创建缓存,后续请求可以读取未过期的缓存。
使用前请设置 API 密钥:
本文示例使用
claude-sonnet-5。其他模型是否支持上下文缓存,请以平台中的模型说明为准。适用场景
当多个请求会重复携带相同的大段内容时,可以缓存稳定前缀,例如:- 长 system prompt
- 固定的知识库或产品文档
- 多轮对话中保持不变的历史消息
- 重复使用的代码库、工具定义和说明
Claude Messages API
5 分钟缓存
在需要缓存的内容块上添加cache_control:
ttl 时,缓存有效期默认为 5 分钟。
1 小时缓存
使用 1 小时缓存时,需要同时添加anthropic-beta 请求头,并将 ttl 设置为 1h:
响应用量字段
Claude Messages API 会在usage 中分别返回普通输入、缓存写入和缓存读取 token:
cache_creation_input_tokens > 0;再次发送相同稳定前缀时,应看到 cache_read_input_tokens > 0。
OpenAI 兼容 API
请求示例
通过/v1/chat/completions 使用缓存时,cache_control 的写法与 Claude Messages API 类似:
1 小时缓存
OpenAI 兼容格式同样支持 1 小时缓存。只需在请求中增加anthropic-beta 请求头,并在 cache_control 中设置 ttl: "1h":
content 必须使用数组
在 OpenAI 兼容格式中,cache_control 必须放在具体的内容块内,不能挂在字符串形式的消息上。
缓存 user 或 assistant 内容块
cache_control 也可以放在 user 或 assistant 消息的内容块上,用于缓存长文档或多轮对话前缀:
cache_control。
响应用量字段
OpenAI 兼容格式使用不同的字段报告缓存用量:如果
prompt_tokens_details.cache_write_tokens 为 0,仍需检查 claude_cache_creation_5_m_tokens 和 claude_cache_creation_1_h_tokens;存在 TTL 细分字段时,缓存写入量会通过对应字段返回。claude_cache_creation_5_m_tokens 和 claude_cache_creation_1_h_tokens 中的数字与单位之间包含下划线,请直接使用响应返回的字段名。缓存命中的条件
前缀长度达到最低门槛
示例模型的缓存前缀通常至少需要约 1024 token。前缀不足时,缓存标记可能被忽略且不会报错。前缀保持逐字节一致
缓存前缀中的文字、空格、换行和内容块顺序必须保持一致。不要在稳定前缀中加入时间戳、随机 ID 或请求计数等动态内容。请求未触发模型拒答
如果请求触发模型拒答,响应可能仍报告缓存创建 token,但该缓存不会在下一次请求中被读取。排查缓存未命中时,请同时检查stop_reason 是否为 refusal。
缓存仍在有效期内
缓存有效期为 5 分钟或 1 小时,并从最后一次访问开始计算;缓存命中会刷新有效期。计费用量
缓存相关用量分为三类:
三类用量互不重叠。缓存写入的成本通常高于普通输入,缓存读取的成本通常低于普通输入,因此上下文缓存更适合会在 TTL 内重复使用的稳定前缀。
最小可复现示例
下面的脚本先生成一个足够长的稳定前缀,再连续发送两次相同请求。第二次响应应出现cache_read_input_tokens > 0。
排查清单
缓存未命中时,请按顺序检查:stop_reason是否为refusal- 缓存前缀是否达到模型要求的最低 token 数
- 两次请求的稳定前缀是否逐字节相同
- OpenAI 兼容格式中的
content是否为数组 cache_control是否位于具体的内容块内- 1 小时缓存是否同时设置
ttl: "1h"和对应的anthropic-beta请求头 - 缓存是否已经超过 TTL
- 是否读取了当前接口对应的缓存用量字段