本文示例使用
gemini-3.6-flash。其他模型是否支持 Context Cache,请以平台模型说明和价格页面为准。适用场景
当多个请求会重复携带相同的大段内容时,可以缓存稳定前缀,例如:- 超长 system prompt
- 固定的知识库或产品文档
- 多轮对话中的稳定历史消息
- 重复使用的工具定义和说明
核心用法
在稳定前缀最后一条消息的 content block 上添加cache_control:
省略
ttl 时默认使用 5m。消息结构
推荐使用以下结构:cache_control 所在消息及它之前的所有消息组成缓存前缀。它后面必须至少有一条实时消息。
OpenAI 兼容请求示例
不需要单独调用缓存创建接口。
cache_control 同时表达“缓存边界”和“缓存有效期”。原生 Gemini 请求示例
原生 GeminigenerateContent 接口同样支持在 contents[].parts[] 中添加 cache_control:
cache_control 是平台在 Gemini 请求格式上的扩展字段。平台识别边界后会在转发前移除该字段,并自动创建或复用缓存内容(cachedContent)。
流式接口使用相同请求体,只需将地址改为:
systemInstruction、边界之前的 contents、TTL 和 tools 不变,只修改边界之后的实时内容。
创建和复用流程
第一次发送带cache_control 的请求时:
复用缓存
再次请求时,保持以下内容不变:- 模型
cache_control之前的所有消息cache_control.ttl- 工具定义(如果使用 tools)
- 原生 Gemini 请求中的
systemInstruction
- 修改稳定前缀中的文字或消息顺序
- 更换模型
- 将
5m改为1h - 修改 tools 或工具参数定义
- 使用不同的 API 用户或渠道
Python 示例
stable_messages,只替换最后一条 user 消息即可。
判断是否命中
OpenAI 兼容响应
查看响应中的:
首次请求也可能出现较大的
cached_tokens,因为系统可以先创建缓存,再在同一次模型调用中引用它。
原生 Gemini 响应
查看响应中的usageMetadata.cachedContentTokenCount:
streamGenerateContent 会在 SSE 响应帧中返回相同的 usageMetadata。客户端应读取包含该字段的响应帧,不要只检查第一段文本。
使用建议
常见问题
原生 Gemini 请求格式可以自动创建缓存吗?
原生 Gemini 请求格式可以自动创建缓存吗?
可以。
generateContent 和 streamGenerateContent 使用相同的 cache_control 结构。边界必须放在 contents[].parts[] 中,且边界所在 content 后面必须保留至少一个实时 content。如果请求已经显式提供原生 cachedContent 资源名,平台会优先使用用户提供的资源,不再执行自动缓存创建。为什么没有命中缓存?
为什么没有命中缓存?
常见原因包括:
- 稳定前缀与上一次请求不完全一致
- TTL 已过期
- 修改了模型或 tools
- 缓存内容没有达到模型要求的最低 token 数
cache_control放在了最后一条消息上,没有留下实时问题
cache_control 可以放在最后一条消息上吗?
cache_control 可以放在最后一条消息上吗?
不建议。最后一条消息通常是当前实时问题,不应缓存。边界后没有实时消息时,请求会按普通模式执行。
可以设置其他 TTL 吗?
可以设置其他 TTL 吗?
不可以。目前只支持
5m 和 1h。其他值会返回 HTTP 400。可以设置多个缓存边界吗?
可以设置多个缓存边界吗?
可以,但所有边界必须使用相同 TTL,系统会使用最后一个边界。一般建议每个请求只设置一个边界,结构更清晰。
缓存不可用会导致请求失败吗?
缓存不可用会导致请求失败吗?
通常不会。缓存创建或复用条件不满足时,系统会自动使用普通请求。无效 TTL、混用不同 TTL 等参数错误除外。
模型没有开通 Context Cache 会怎样?
模型没有开通 Context Cache 会怎样?
请求会自动按普通模式执行,不创建显式缓存,也不产生缓存存储费用。普通输入、输出和可能存在的隐式缓存继续按照该模型原有规则计费。
为什么 cache_write_tokens 是 0?
为什么 cache_write_tokens 是 0?
这是 Gemini 上下文缓存的正常行为。缓存创建成本通过独立的缓存存储费用记录,不使用 OpenAI/Claude 风格的
cache_write_tokens 表示缓存创建量。cached_tokens 大于 0 就代表一定创建了显式缓存吗?
cached_tokens 大于 0 就代表一定创建了显式缓存吗?
不一定。系统自身也可能产生隐式缓存命中。对普通用户而言,可以使用缓存读取 token 判断本次请求是否享受缓存读取;如需核对显式缓存创建费用,请查看平台消费日志中的 Context Cache storage 记录。
缓存如何计费?
缓存如何计费?
创建缓存时可能产生一次缓存存储费用;使用缓存时,命中的 token 按缓存读取价格计费。具体价格以平台展示的模型价格为准。