扩展思考为 Claude 提供了增强的推理能力,用于处理复杂任务,同时在提供最终答案之前提供不同级别的透明度来了解其逐步思考过程。
扩展思考在以下模型中受支持:
claude-sonnet-4-5-20250929)claude-sonnet-4-20250514)claude-3-7-sonnet-20250219) (已弃用)claude-haiku-4-5-20251001)claude-opus-4-5-20251101)claude-opus-4-1-20250805)claude-opus-4-20250514)API 行为在 Claude Sonnet 3.7 和 Claude 4 模型之间有所不同,但 API 形状保持完全相同。
有关更多信息,请参阅不同模型版本中思考的差异。
启用扩展思考后,Claude 会创建 thinking 内容块,其中输出其内部推理。Claude 在制作最终响应之前会整合来自此推理的见解。
API 响应将包括 thinking 内容块,后跟 text 内容块。
以下是默认响应格式的示例:
{
"content": [
{
"type": "thinking",
"thinking": "让我逐步分析这个...",
"signature": "WaUjzkypQ2mUEVM36O2TxuC06KN8xyfbJwyem2dw3URve/op91XWHOEBLLqIOMfFG/UvLEczmEsUjavL...."
},
{
"type": "text",
"text": "根据我的分析..."
}
]
}有关扩展思考响应格式的更多信息,请参阅 Messages API 参考。
以下是在 Messages API 中使用扩展思考的示例:
要启用扩展思考,请添加一个 thinking 对象,将 type 参数设置为 enabled,并将 budget_tokens 设置为扩展思考的指定令牌预算。
budget_tokens 参数确定 Claude 允许用于其内部推理过程的最大令牌数。在 Claude 4 模型中,此限制适用于完整思考令牌,而不是总结输出。较大的预算可以通过为复杂问题启用更彻底的分析来改进响应质量,尽管 Claude 可能不会使用整个分配的预算,特别是在 32k 以上的范围内。
budget_tokens 必须设置为小于 max_tokens 的值。但是,当使用交错思考与工具时,您可以超过此限制,因为令牌限制变成您的整个上下文窗口(200k 令牌)。
启用扩展思考后,Claude 4 模型的 Messages API 返回 Claude 完整思考过程的摘要。总结的思考提供了扩展思考的全部智能优势,同时防止了滥用。
以下是总结思考的一些重要考虑事项:
Claude Sonnet 3.7 继续返回完整的思考输出。
在罕见情况下,如果您需要访问 Claude 4 模型的完整思考输出,请联系我们的销售团队。
您可以使用服务器发送事件 (SSE) 流式传输扩展思考响应。
启用扩展思考的流式传输后,您会通过 thinking_delta 事件接收思考内容。
有关通过 Messages API 进行流式传输的更多文档,请参阅流式传输消息。
以下是如何处理思考流式传输的方法:
示例流式传输输出:
event: message_start
data: {"type": "message_start", "message": {"id": "msg_01...", "type": "message", "role": "assistant", "content": [], "model": "claude-sonnet-4-5", "stop_reason": null, "stop_sequence": null}}
event: content_block_start
data: {"type": "content_block_start", "index": 0, "content_block": {"type": "thinking", "thinking": ""}}
event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "让我逐步解决这个问题:\n\n1. 首先分解 27 * 453"}}
event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "\n2. 453 = 400 + 50 + 3"}}
// 其他思考增量...
event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "signature_delta", "signature": "EqQBCgIYAhIM1gbcDa9GJwZA2b3hGgxBdjrkzLoky3dl1pkiMOYds..."}}
event: content_block_stop
data: {"type": "content_block_stop", "index": 0}
event: content_block_start
data: {"type": "content_block_start", "index": 1, "content_block": {"type": "text", "text": ""}}
event: content_block_delta
data: {"type": "content_block_delta", "index": 1, "delta": {"type": "text_delta", "text": "27 * 453 = 12,231"}}
// 其他文本增量...
event: content_block_stop
data: {"type": "content_block_stop", "index": 1}
event: message_delta
data: {"type": "message_delta", "delta": {"stop_reason": "end_turn", "stop_sequence": null}}
event: message_stop
data: {"type": "message_stop"}使用启用思考的流式传输时,您可能会注意到文本有时以较大的块到达,交替出现较小的逐令牌传递。这是预期的行为,特别是对于思考内容。
流式传输系统需要分批处理内容以获得最佳性能,这可能导致这种"分块"传递模式,流式传输事件之间可能出现延迟。我们正在不断努力改进这种体验,未来的更新将专注于使思考内容流式传输更顺畅。
扩展思考可以与工具使用一起使用,允许 Claude 通过工具选择和结果处理进行推理。
使用扩展思考和工具使用时,请注意以下限制:
工具选择限制:带有思考的工具使用仅支持 tool_choice: {"type": "auto"} (默认) 或 tool_choice: {"type": "none"}。使用 tool_choice: {"type": "any"} 或 tool_choice: {"type": "tool", "name": "..."} 将导致错误,因为这些选项强制工具使用,这与扩展思考不兼容。
保留思考块:在工具使用期间,您必须将 thinking 块传回 API 以获取最后的助手消息。将完整的未修改块传回 API 以维持推理连续性。
您不能在助手轮次中间切换思考,包括在工具使用循环期间。整个助手轮次必须在单一思考模式下运行:
从模型的角度来看,工具使用循环是助手轮次的一部分。助手轮次直到 Claude 完成其完整响应(可能包括多个工具调用和结果)才完成。
例如,这个序列都是单个助手轮次的一部分:
用户:"巴黎的天气如何?"
助手:[思考] + [工具使用:get_weather]
用户:[工具结果:"20°C,晴天"]
助手:[文本:"巴黎的天气是 20°C 和晴天"]尽管有多个 API 消息,但工具使用循环在概念上是一个连续助手响应的一部分。
您可能会遇到此错误:
预期 `thinking` 或 `redacted_thinking`,但找到 `tool_use`。
启用 `thinking` 时,最后的 `assistant` 消息必须以思考块开始
(在最后一组 `tool_use` 和 `tool_result` 块之前)。这通常发生在以下情况:
✗ 无效:在工具使用后立即切换思考
用户:"天气如何?"
助手:[工具使用](思考已禁用)
用户:[工具结果]
// 无法在此处启用思考 - 仍在同一助手轮次中✓ 有效:首先完成助手轮次
用户:"天气如何?"
助手:[工具使用](思考已禁用)
用户:[工具结果]
助手:[文本:"晴天"]
用户:"明天呢?"(思考已禁用)
助手:[思考] + [文本:"..."](思考已启用 - 新轮次)最佳实践:在每个轮次开始时规划您的思考策略,而不是尝试在轮次中间切换。
切换思考模式也会使提示缓存对消息历史记录无效。有关更多详情,请参阅扩展思考与提示缓存部分。
在工具使用期间,您必须将 thinking 块传回 API,并且必须将完整的未修改块传回 API。这对于维持模型的推理流和对话完整性至关重要。
虽然您可以从之前的 assistant 角色轮次中省略 thinking 块,但我们建议始终将所有思考块传回 API 以进行任何多轮对话。API 将:
在对话中切换思考模式时,请记住整个助手轮次(包括工具使用循环)必须在单一思考模式下运行。有关更多详情,请参阅在对话中切换思考模式。
当 Claude 调用工具时,它暂停了响应的构建以等待外部信息。返回工具结果后,Claude 将继续构建该现有响应。这需要在工具使用期间保留思考块,原因有两个:
推理连续性:思考块捕获了导致工具请求的 Claude 逐步推理。当您发布工具结果时,包括原始思考可确保 Claude 能够从中断的地方继续推理。
上下文维护:虽然工具结果在 API 结构中显示为用户消息,但它们是连续推理流的一部分。保留思考块在多个 API 调用中维持这个概念流。有关上下文管理的更多信息,请参阅我们的上下文窗口指南。
重要:提供 thinking 块时,连续 thinking 块的整个序列必须与模型在原始请求期间生成的输出相匹配;您不能重新排列或修改这些块的序列。
Claude 4 模型中的扩展思考与工具使用支持交错思考,这使 Claude 能够在工具调用之间进行思考,并在收到工具结果后进行更复杂的推理。
通过交错思考,Claude 可以:
要启用交错思考,请在 API 请求中添加 beta 标头 interleaved-thinking-2025-05-14。
以下是交错思考的一些重要注意事项:
budget_tokens 可以超过 max_tokens 参数,因为它代表一个助手轮次内所有思考块的总预算。interleaved-thinking-2025-05-14。interleaved-thinking-2025-05-14,但不会产生任何效果。interleaved-thinking-2025-05-14 传递给除 Claude Opus 4.5、Claude Opus 4.1、Opus 4 或 Sonnet 4 之外的任何模型,您的请求将失败。提示缓存 与思考有几个重要的注意事项:
扩展思考任务通常需要超过 5 分钟才能完成。考虑使用 1 小时缓存持续时间 来维护跨越较长思考会话和多步工作流的缓存命中。
思考块上下文移除
缓存失效模式
使用扩展思考与工具使用时,思考块表现出特定的缓存行为,这会影响令牌计数:
工作原理:
详细示例流程:
请求 1:
User: "What's the weather in Paris?"响应 1:
[thinking_block_1] + [tool_use block 1]请求 2:
User: ["What's the weather in Paris?"],
Assistant: [thinking_block_1] + [tool_use block 1],
User: [tool_result_1, cache=True]响应 2:
[thinking_block_2] + [text block 2]请求 2 写入请求内容的缓存(不是响应)。缓存包括原始用户消息、第一个思考块、工具使用块和工具结果。
请求 3:
User: ["What's the weather in Paris?"],
Assistant: [thinking_block_1] + [tool_use block 1],
User: [tool_result_1, cache=True],
Assistant: [thinking_block_2] + [text block 2],
User: [Text response, cache=True]对于 Claude Opus 4.5 及更高版本,默认情况下保留所有先前的思考块。对于较旧的模型,因为包含了非工具结果用户块,所有先前的思考块都被忽略。此请求将按以下方式处理:
User: ["What's the weather in Paris?"],
Assistant: [tool_use block 1],
User: [tool_result_1, cache=True],
Assistant: [text block 2],
User: [Text response, cache=True]关键点:
cache_control 标记在较旧的 Claude 模型中(Claude Sonnet 3.7 之前),如果提示令牌和 max_tokens 的总和超过模型的上下文窗口,系统会自动调整 max_tokens 以适应上下文限制。这意味着您可以设置一个大的 max_tokens 值,系统会根据需要静默减少它。
使用 Claude 3.7 和 4 模型,max_tokens(启用思考时包括您的思考预算)被强制执行为严格限制。如果提示令牌 + max_tokens 超过上下文窗口大小,系统现在将返回验证错误。
您可以阅读我们的 上下文窗口指南 以获得更深入的了解。
使用启用思考的扩展思考计算上下文窗口使用时,需要注意一些事项:
max_tokens 限制下图演示了启用扩展思考时的专门令牌管理:
有效的上下文窗口计算为:
context window =
(current input tokens - previous thinking tokens) +
(thinking tokens + encrypted thinking tokens + text output tokens)我们建议使用 令牌计数 API 为您的特定用例获取准确的令牌计数,特别是在处理包含思考的多轮对话时。
使用扩展思考与工具使用时,思考块必须显式保留并与工具结果一起返回。
扩展思考与工具使用的有效上下文窗口计算变为:
context window =
(current input tokens + previous thinking tokens + tool use tokens) +
(thinking tokens + encrypted thinking tokens + text output tokens)下图说明了扩展思考与工具使用的令牌管理:
鉴于 Claude 3.7 和 4 模型的上下文窗口和 max_tokens 行为与扩展思考,您可能需要:
max_tokens 值进行此更改是为了提供更可预测和透明的行为,特别是因为最大令牌限制已显著增加。
完整的思考内容被加密并在 signature 字段中返回。此字段用于验证思考块是由 Claude 生成的,当传递回 API 时。
仅当使用 带有扩展思考的工具 时,严格来说才需要发送回思考块。否则,您可以从先前的轮次中省略思考块,或让 API 为您剥离它们(如果您传递它们回去)。
如果发送回思考块,我们建议按照您收到的方式传递所有内容以保持一致性并避免潜在问题。
以下是关于思考加密的一些重要注意事项:
content_block_delta 事件中的 signature_delta 添加,就在 content_block_stop 事件之前。signature 值在 Claude 4 模型中的长度明显长于以前的模型。signature 字段是一个不透明字段,不应被解释或解析 - 它仅用于验证目的。signature 值在平台之间兼容(Claude API、Amazon Bedrock 和 Vertex AI)。在一个平台上生成的值将与另一个平台兼容。偶尔,Claude 的内部推理会被我们的安全系统标记。当这种情况发生时,我们会加密 thinking 块的部分或全部内容,并将其作为 redacted_thinking 块返回给您。redacted_thinking 块在传回 API 时会被解密,允许 Claude 继续其响应而不会丢失上下文。
在构建使用扩展思维的面向客户的应用程序时:
以下是显示正常和编辑后思维块的示例:
{
"content": [
{
"type": "thinking",
"thinking": "Let me analyze this step by step...",
"signature": "WaUjzkypQ2mUEVM36O2TxuC06KN8xyfbJwyem2dw3URve/op91XWHOEBLLqIOMfFG/UvLEczmEsUjavL...."
},
{
"type": "redacted_thinking",
"data": "EmwKAhgBEgy3va3pzix/LafPsn4aDFIT2Xlxh0L5L8rLVyIwxtE3rAFBa8cr3qpPkNRj2YfWXGmKDxH4mPnZ5sQ7vB9URj2pLmN3kF8/dW5hR7xJ0aP1oLs9yTcMnKVf2wRpEGjH9XZaBt4UvDcPrQ..."
},
{
"type": "text",
"text": "Based on my analysis..."
}
]
}在输出中看到编辑后的思维块是预期的行为。该模型仍然可以使用这个编辑后的推理来为其响应提供信息,同时保持安全防护栏。
如果您需要在应用程序中测试编辑后思维处理,可以使用此特殊测试字符串作为提示:ANTHROPIC_MAGIC_STRING_TRIGGER_REDACTED_THINKING_46C9A13E193C177646C7398A98432ECCCE4C1253D5E2D82641AC0E52CC2876CB
在多轮对话中将 thinking 和 redacted_thinking 块传回 API 时,您必须将最后一个助手转向的完整未修改块传回 API。这对于维护模型的推理流程至关重要。我们建议始终将所有思维块传回 API。有关更多详情,请参阅上面的保留思维块部分。
Messages API 在 Claude Sonnet 3.7 和 Claude 4 模型中处理思维的方式不同,主要在编辑和总结行为方面。
请参阅下表了解简明对比:
| 功能 | Claude Sonnet 3.7 | Claude 4 模型(Opus 4.5 之前) | Claude Opus 4.5 及更高版本 |
|---|---|---|---|
| 思维输出 | 返回完整思维输出 | 返回总结的思维 | 返回总结的思维 |
| 交错思维 | 不支持 | 支持 interleaved-thinking-2025-05-14 测试版标头 | 支持 interleaved-thinking-2025-05-14 测试版标头 |
| 思维块保留 | 不在转向间保留 | 不在转向间保留 | 默认保留(启用缓存优化、节省令牌) |
Claude Opus 4.5 引入了一个新的默认行为:默认情况下,来自先前助手转向的思维块在模型上下文中被保留。这与早期模型不同,早期模型会从先前的转向中删除思维块。
思维块保留的好处:
重要注意事项:
对于早期模型(Claude Sonnet 4.5、Opus 4.1 等),来自先前转向的思维块继续从上下文中被删除。使用提示缓存的扩展思维部分中描述的现有行为适用于这些模型。
有关完整的定价信息,包括基本费率、缓存写入、缓存命中和输出令牌,请参阅定价页面。
思维过程产生的费用包括:
启用扩展思维时,会自动包含专门的系统提示来支持此功能。
使用总结的思维时:
计费的输出令牌计数将不与响应中的可见令牌计数匹配。您需要为完整的思维过程付费,而不是您看到的摘要。
max_tokens 大于 21,333 时,需要流式传输。流式传输时,准备好处理思维和文本内容块的到达。temperature 或 top_k 修改以及强制工具使用不兼容。top_p 设置为 1 到 0.95 之间的值。curl https://api.anthropic.com/v1/messages \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "content-type: application/json" \
--data \
'{
"model": "claude-sonnet-4-5",
"max_tokens": 16000,
"thinking": {
"type": "enabled",
"budget_tokens": 10000
},
"messages": [
{
"role": "user",
"content": "是否存在无限多个质数使得 n mod 4 == 3?"
}
]
}'curl https://api.anthropic.com/v1/messages \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "content-type: application/json" \
--data \
'{
"model": "claude-sonnet-4-5",
"max_tokens": 16000,
"stream": true,
"thinking": {
"type": "enabled",
"budget_tokens": 10000
},
"messages": [
{
"role": "user",
"content": "27 * 453 是多少?"
}
]
}'在我们的食谱中探索思维的实际示例。