cache_control
块在Messages API中实现提示缓存的示例:
cache_control
参数进行缓存。这使得可以在多个API调用中重复使用这个大文本,而无需每次都重新处理它。仅更改用户消息就可以让您询问关于这本书的各种问题,同时利用缓存的内容,从而获得更快的响应和提高效率。
tools
、system
和messages
(按此顺序),直到并包括标记为cache_control
的块。Model | Base Input Tokens | 5m Cache Writes | 1h Cache Writes | Cache Hits & Refreshes | Output Tokens |
---|---|---|---|---|---|
Claude Opus 4.1 | $15 / MTok | $18.75 / MTok | $30 / MTok | $1.50 / MTok | $75 / MTok |
Claude Opus 4 | $15 / MTok | $18.75 / MTok | $30 / MTok | $1.50 / MTok | $75 / MTok |
Claude Sonnet 4 | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
Claude Sonnet 3.7 | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
Claude Sonnet 3.5 (deprecated) | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
Claude Haiku 3.5 | $0.80 / MTok | $1 / MTok | $1.6 / MTok | $0.08 / MTok | $4 / MTok |
Claude Opus 3 (deprecated) | $15 / MTok | $18.75 / MTok | $30 / MTok | $1.50 / MTok | $75 / MTok |
Claude Haiku 3 | $0.25 / MTok | $0.30 / MTok | $0.50 / MTok | $0.03 / MTok | $1.25 / MTok |
cache_control
参数标记可重用内容的结尾以进行缓存。
缓存前缀按以下顺序创建:tools
、system
,然后是messages
。这个顺序形成了一个层次结构,其中每个级别都建立在前一个级别之上。
cache_control
断点时,系统会自动检查所有先前内容块边界(直到您显式断点之前大约20个块)的缓存命中cache_control
。任何缓存少于此数量令牌的请求都将在不缓存的情况下处理。要查看提示是否被缓存,请参阅响应使用字段。
对于并发请求,请注意缓存条目只有在第一个响应开始后才可用。如果您需要并行请求的缓存命中,请在发送后续请求之前等待第一个响应。
目前,“ephemeral”是唯一支持的缓存类型,默认生命周期为5分钟。
cache_control
断点不会增加您的成本 - 您仍然根据实际缓存和读取的内容支付相同的金额。断点只是让您控制哪些部分可以独立缓存。
cache_control
指定进行缓存。这包括:
tools
数组中的工具定义system
数组中的内容块messages.content
数组中的内容块,用于用户和助手轮次messages.content
数组中的内容块messages.content
数组中的内容块cache_control
以启用该部分请求的缓存。
cache_control
缓存。但是,当思考块出现在之前的助手轮次中时,它们可以与其他内容一起缓存。以这种方式缓存时,它们在从缓存读取时确实算作输入令牌。
tools
→ system
→ messages
。每个级别的更改都会使该级别和所有后续级别失效。
下表显示了不同类型的更改会使缓存的哪些部分失效。✘表示缓存失效,而✓表示缓存保持有效。
更改内容 | 工具缓存 | 系统缓存 | 消息缓存 | 影响 |
---|---|---|---|---|
工具定义 | ✘ | ✘ | ✘ | 修改工具定义(名称、描述、参数)会使整个缓存失效 |
网络搜索切换 | ✓ | ✘ | ✘ | 启用/禁用网络搜索会修改系统提示 |
引用切换 | ✓ | ✘ | ✘ | 启用/禁用引用会修改系统提示 |
工具选择 | ✓ | ✓ | ✘ | 对tool_choice 参数的更改只影响消息块 |
图像 | ✓ | ✓ | ✘ | 在提示中任何地方添加/删除图像都会影响消息块 |
思考参数 | ✓ | ✓ | ✘ | 扩展思考设置的更改(启用/禁用、预算)会影响消息块 |
传递给扩展思考请求的非工具结果 | ✓ | ✓ | ✘ | 当在启用扩展思考时传递非工具结果时,所有先前缓存的思考块都会从上下文中剥离,并且上下文中跟随这些思考块的任何消息都会从缓存中删除。有关更多详细信息,请参阅使用思考块缓存。 |
usage
中(或如果流式传输则在message_start
事件中):
cache_creation_input_tokens
:创建新条目时写入缓存的令牌数。cache_read_input_tokens
:此请求从缓存中检索的令牌数。input_tokens
:未从缓存读取或用于创建缓存的输入令牌数。tool_choice
和图像使用在调用之间保持一致cache_control
参数,以确保所有内容都可以被缓存tool_choice
的更改或提示中任何地方图像的存在/缺失都会使缓存失效,需要创建新的缓存条目。有关缓存失效的更多详细信息,请参阅什么会使缓存失效。cache_control
,但当您使用工具结果进行后续API调用时,它们会作为请求内容的一部分被缓存。这通常在工具使用期间发生,当您将思考块传回以继续对话时。
输入令牌计数:当从缓存读取思考块时,它们在您的使用指标中算作输入令牌。这对成本计算和令牌预算很重要。
缓存失效模式:
cache_control
标记,这种缓存行为也会发生cache_control
定义中包含ttl
,如下所示:
cache_creation_input_tokens
字段等于cache_creation
对象中值的总和。
A
:最高缓存命中的令牌计数(如果没有命中则为0)。B
:A
之后最高1小时cache_control
块的令牌计数(如果不存在则等于A
)。C
:最后一个cache_control
块的令牌计数。B
和/或C
大于A
,它们必然是缓存未命中,因为A
是最高缓存命中。A
的缓存读取令牌。(B - A)
的1小时缓存写入令牌。(C - B)
的5分钟缓存写入令牌。大型上下文缓存示例
input_tokens
:仅用户消息中的令牌数cache_creation_input_tokens
:整个系统消息中的令牌数,包括法律文档cache_read_input_tokens
:0(第一个请求没有缓存命中)input_tokens
:仅用户消息中的令牌数cache_creation_input_tokens
:0(没有新的缓存创建)cache_read_input_tokens
:整个缓存系统消息中的令牌数缓存工具定义
cache_control
参数放置在最后一个工具(get_time
)上,以将所有工具指定为静态前缀的一部分。这意味着所有工具定义,包括get_weather
和在get_time
之前定义的任何其他工具,都将作为单个前缀缓存。当您有一组一致的工具,希望在多个请求中重复使用而不每次都重新处理它们时,这种方法很有用。对于第一个请求:input_tokens
:用户消息中的令牌数cache_creation_input_tokens
:所有工具定义和系统提示中的令牌数cache_read_input_tokens
:0(第一个请求没有缓存命中)input_tokens
:用户消息中的令牌数cache_creation_input_tokens
:0(没有新的缓存创建)cache_read_input_tokens
:所有缓存工具定义和系统提示中的令牌数继续多轮对话
cache_control
标记最后一条消息的最后一个块,以便对话可以增量缓存。系统将自动查找并使用最长的先前缓存前缀进行后续消息。也就是说,先前标记为cache_control
块的块后来没有标记为此,但如果它们在5分钟内被命中,它们仍将被视为缓存命中(也是缓存刷新!)。此外,请注意cache_control
参数放置在系统消息上。这是为了确保如果这从缓存中被驱逐(在超过5分钟未使用后),它将在下一个请求时被添加回缓存。这种方法对于在持续对话中维护上下文而不重复处理相同信息很有用。当正确设置时,您应该在每个请求的使用响应中看到以下内容:input_tokens
:新用户消息中的令牌数(将是最小的)cache_creation_input_tokens
:新助手和用户轮次中的令牌数cache_read_input_tokens
:对话中直到上一轮的令牌数综合应用:多个缓存断点
cache_control
参数缓存所有工具定义。
cache_control
,以启用对话随着进展的增量缓存。
input_tokens
:最终用户消息中的令牌cache_creation_input_tokens
:所有缓存段中的令牌(工具+指令+RAG文档+对话历史)cache_read_input_tokens
:0(没有缓存命中)input_tokens
:仅新用户消息中的令牌cache_creation_input_tokens
:添加到对话历史的任何新令牌cache_read_input_tokens
:所有先前缓存的令牌(工具+指令+RAG文档+先前对话)我需要多个缓存断点还是末尾一个就足够了?
缓存断点会增加额外成本吗?
缓存的生命周期是多长?
我可以使用多少个缓存断点?
cache_control
参数)。提示缓存是否适用于所有模型?
提示缓存如何与扩展思考配合工作?
如何启用提示缓存?
cache_control
断点。我可以将提示缓存与其他API功能一起使用吗?
提示缓存如何影响定价?
我可以手动清除缓存吗?
如何跟踪我的缓存策略的有效性?
cache_creation_input_tokens
和cache_read_input_tokens
字段监控缓存性能。什么会破坏缓存?
提示缓存如何处理隐私和数据分离?
cache_control
都是安全的。为了成本效率,最好从缓存中排除高度可变的部分(例如,用户的任意输入)。
我可以将提示缓存与批处理API一起使用吗?
为什么我在Python中看到错误`AttributeError: 'Beta' object has no attribute 'prompt_caching'`?
为什么我看到'TypeError: Cannot read properties of undefined (reading 'messages')'?