大模型的流量大多是重复的。聊天机器人每一轮都重发相同的系统提示,智能体则重发工具定义和到目前为止的全部对话。提示缓存让模型从缓存中读取这段重复的前缀,而缓存输入按正常输入价格的一小部分计费。本文介绍提示缓存在 GetVibe API 上的工作方式,以及如何充分利用它。
缓存输入怎么计费
目录中的每个文本模型都公布了缓存条款。在 https://getvibeapi.com/api/catalog 中,每个模型变体都包含:
cachedInputUsd:每 1M 缓存输入 token 的价格。cacheReadMult:缓存价格相对于正常输入价格的比例。cacheWriteMult:写入缓存相对于正常输入的计费方式。
撰写本文时,几乎所有文本模型都标注 cacheReadMult: 0.1(一个缓存输入 token 的价格是普通输入的十分之一)和 cacheWriteMult: 1。唯一的例外是 Claude Fable 5.1,读取为 0.025,写入为 1.25。这些数值可能变化,请从目录或各模型页面读取,不要写死在代码里。
| 模型 | 价格(输入 · 输出) |
|---|---|
| Claude Opus 5.5 | $0.1067 输入 · $0.5334 输出 每百万 token |
| GPT-6 Sol | $0.1096 输入 · $0.548 输出 每百万 token |
| DeepSeek V4.1 Flash | $0.0112 输入 · $0.0445 输出 每百万 token |
模型页面在这些价格旁边列出了缓存输入价格。
OpenAI 模型:自动缓存
在 /v1/chat/completions 上,OpenAI 系列模型会自动缓存。当多个请求以相同的稳定前缀开头时,这段前缀会从缓存中读取。不需要任何特殊字段,关键是请求的开头不要变化。我们逐字节转发请求体,不重新排列字段,所以你这边完全相同的前缀,到上游时依然相同。
Claude:cache_control 断点
Claude 只有在请求中带有显式 cache_control 断点时才会缓存,仅仅重复前缀并不会开启缓存。把断点放在不变部分的末尾:
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-opus-5.5",
"max_tokens": 256,
"system": [
{"type": "text", "text": "A large fixed instruction worth caching...",
"cache_control": {"type": "ephemeral"}}
],
"messages": [{"role": "user", "content": "Question about the instruction"}]
}'
如果你没有自己设置断点,网关会在 /v1/messages 和 /v1/chat/completions 上替你插入一个。如果你自己管理断点,你的标记会原样保留。
可缓存提示的五条规则
- 稳定内容在前,变化内容在后。系统提示、工具定义和参考文档放在最前面,用户的新消息放在最后。
- 前缀中不要放时间戳或请求 ID。开头附近只要有一个字符变化,后面的所有内容都会失效。
- 工具定义保持固定顺序。从无序映射生成工具列表,会让前缀每次调用都不同。
- 追加历史,不要改写。会总结或重排之前轮次的智能体会破坏缓存。新的轮次应追加在末尾。
- 固定使用一个模型。缓存属于某个模型,对话中途切换模型就要从头开始。
验证是否生效
查看响应中的 usage 对象。OpenAI 格式下,缓存 token 位于 prompt_tokens_details.cached_tokens;Anthropic 格式下,查看 cache_read_input_tokens 和 cache_creation_input_tokens。控制台的用量视图也会按模型显示缓存命中比例。如果相同请求的缓存计数一直为零,说明前缀中有内容在变化。
下一步
阅读缓存文档,为 Claude Code 配置自定义端点(智能体从缓存中受益最多),或在模型页面比较缓存价格。
