编程代理和多轮助手经常重复发送系统提示、工具定义和对话前缀。模型与端点支持时,缓存可降低重复输入 token 的费用。但只有模型、端点和请求形式匹配才生效;相似文本不等于缓存命中。它不会折扣生成的输出。本文区分 OpenAI 风格的自动缓存与 Claude 的显式 breakpoint。
缓存会改变哪部分账单?
缓存读取使用缓存输入价格,而非普通输入价格。GetVibe 目录会将缓存支持和价格与模型单价一起展示。2026 年 10 月 3 日的目录快照中,GPT-6 Luna $0.0055 输入 · $0.0274 输出 每百万 token,Claude Sonnet 5.5 $0.0534 输入 · $0.2667 输出 每百万 token;页面会使用模型目录实时渲染。缓存读写费率可能因模型不同,必须查看模型页。
估算重复前缀时,可分别计算:重复输入 token × 普通输入费率,以及重复输入 token × cache-read 费率。两者差值是潜在输入节省。如果模型会对写入收费,也要扣除写入成本。最终是否省钱还要由真实 usage 验证。
OpenAI 兼容模型:保持前缀稳定
支持的 OpenAI 系列路由会自动缓存,常规 Chat Completions 无需增加 cache-control 字段。重要的是请求开头保持一致:把系统指令、固定示例和工具定义放前面,将用户特有内容放后面。不要在前缀开头写时间戳、随机 ID 或按请求变化的 feature flag。工具定义也应保持固定顺序。
继续代理会话时尽量追加新轮次,而不要改写旧历史。切换模型会使用不同缓存。如果前缀长度没有达到模型门槛,或缓存已过期,即使请求有效,也可能看不到缓存 token。
Claude:breakpoints 与 Messages 接口
Claude 缓存通过 cache-control breakpoint 启用。在 GetVibe 支持的 Claude 请求中,如果没有 breakpoint,集成可以自动加入;若自行管理,请查看最新缓存文档,并把标记放在稳定内容末尾。Claude Code 使用 Anthropic Messages,URL 和认证配置见Claude Code 指南。
curl https://getvibeapi.com/v1/messages \
-H "x-api-key: $GETVIBE_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-5.5",
"max_tokens": 300,
"system": [{"type":"text","text":"Stable instructions shared by every request."}],
"messages": [{"role":"user","content":"A request-specific question."}]
}'示例把稳定指令放在 system 部分,把变化问题放在 user 部分。具体 breakpoint 字段应依据你的客户端和模型文档。
验证缓存命中,不要凭感觉判断
发送两次相同的长前缀,只改变短后缀。检查响应 usage:OpenAI 格式在 prompt_tokens_details.cached_tokens 报告缓存 token;Anthropic 格式有 cache read 和 cache creation 字段。dashboard usage 也能查看缓存信息。若计数一直为零,检查前缀是否完全相同、是否达到模型最小长度、模型是否支持,以及路由是否变化。
测试样本要足够长,超过模型缓存门槛。一句系统提示可能看不到区别。多次重复测试,因为缓存时效和请求间隔会影响前缀是否仍然温热。
实测节省流程
- 选一段在多个请求中重复使用的真实长前缀。
- 记录模型页当前费率和普通输入 usage。
- 重复调用,只改变 user suffix。
- 确认响应显示 cached input。
- 对比几次重复调用在账单中的费用。
实验时尽量保持输出长度相近,避免输出开销掩盖输入差异。不要只根据缓存倍率宣传节省;必须看到命中和计费变化。
常见未命中原因
- 稳定指令之前插入了 timestamp 或 request ID。
- 工具列表每次以不同顺序序列化。
- 空格变化或历史截断方式改变了请求。
- 中途更换模型。
- 前缀太短或缓存窗口已过期。
缓存能降低长代理会话成本,但不能成为发送无关仓库内容的理由。先缩小提示,再缓存仍需重复的部分。实现细节见缓存实践指南和实时模型页。
Breakpoint 的位置要可复用
Messages 请求中,将固定指令和参考文档放在 system block,再把问题放在 user message。breakpoint 应位于稳定部分末尾,而不是 request-specific timestamp 后。如果有多份较长文档,可在模型支持的范围内对复用部分设置标记,并确认允许的 breakpoint 数量。
一些代理会重写或总结历史,导致序列化前缀改变。排查时可比较请求结构,但不要把私密内容写进普通日志。
核对写入费与最小长度
有些模型要求缓存前缀达到最小长度,首次写入和后续读取的费率也可能不同。短 prompt 可能不产生可见节省。查看该模型的 cache-read、cache-write 费率及最小长度,将首个写入请求和后续命中分别统计。
缓存可能在闲置后过期,且不是应用的持久存储。为了答案正确,仍需发送所需上下文,不能把缓存当作保存会话状态的数据库。
将缓存与缩短提示分开评估
删掉重复内容和缓存重复内容是两种优化。先移除过期指令、无关示例和复制的日志,再缓存留下的稳定信息。这样即使未命中,请求也更小。
改 prompt 时保持样本固定,并同时比较输出质量与缓存 usage,避免为省钱而删除模型必须的信息。
