上下文編輯允許您隨著對話增長自動管理對話上下文,幫助您優化成本並保持在上下文窗口限制內。您可以使用伺服器端 API 策略、客戶端 SDK 功能,或兩者結合使用。
| 方法 | 運行位置 | 策略 | 工作原理 |
|---|---|---|---|
| 伺服器端 | API | 工具結果清除 (clear_tool_uses_20250919)思考區塊清除 ( clear_thinking_20251015) | 在提示到達 Claude 之前應用。從對話歷史記錄中清除特定內容。每個策略可以獨立配置。 |
| 客戶端 | SDK | 壓縮 | 在使用 tool_runner 時,可在 Python 和 TypeScript SDK 中使用。生成摘要並替換完整對話歷史記錄。請參閱下方的 壓縮。 |
上下文編輯目前處於測試版,支持工具結果清除和思考區塊清除。要啟用它,請在您的 API 請求中使用測試版標頭 context-management-2025-06-27。
請通過我們的 反饋表單 分享您對此功能的反饋。
clear_tool_uses_20250919 策略在對話上下文增長超過您配置的閾值時清除工具結果。激活後,API 會按時間順序自動清除最舊的工具結果,用佔位符文本替換它們,讓 Claude 知道工具結果已被移除。默認情況下,只清除工具結果。您可以通過將 clear_tool_inputs 設置為 true,選擇清除工具結果和工具調用(工具使用參數)。
clear_thinking_20251015 策略在啟用擴展思考時管理對話中的 thinking 區塊。此策略自動清除來自先前回合的較舊思考區塊。
默認行為:啟用擴展思考而不配置 clear_thinking_20251015 策略時,API 會自動僅保留最後一個助手回合的思考區塊(等同於 keep: {type: "thinking_turns", value: 1})。
要最大化快取命中,通過設置 keep: "all" 保留所有思考區塊。
助手對話回合可能包括多個內容區塊(例如使用工具時)和多個思考區塊(例如使用 交錯思考)。
上下文編輯在伺服器端進行
上下文編輯在提示到達 Claude 之前在 伺服器端 應用。您的客戶端應用程式保持完整的、未修改的對話歷史記錄——您無需將客戶端狀態與編輯版本同步。繼續像往常一樣在本地管理您的完整對話歷史記錄。
上下文編輯和提示快取
上下文編輯與 提示快取 的交互因策略而異:
工具結果清除:清除內容時使快取的提示前綴失效。為了解決這個問題,我們建議清除足夠的令牌以使快取失效值得。使用 clear_at_least 參數確保每次清除最少數量的令牌。每次清除內容時您會產生快取寫入成本,但後續請求可以重用新快取的前綴。
思考區塊清除:當思考區塊在上下文中被 保留(未清除)時,提示快取被保留,啟用快取命中並降低輸入令牌成本。當思考區塊被 清除 時,快取在清除發生的位置失效。根據您是否想優先考慮快取性能或上下文窗口可用性來配置 keep 參數。
上下文編輯可用於:
claude-opus-4-5-20251101)claude-opus-4-1-20250805)claude-opus-4-20250514)claude-sonnet-4-5-20250929)claude-sonnet-4-20250514)claude-haiku-4-5-20251001)啟用工具結果清除的最簡單方法是僅指定策略類型,因為所有其他 配置選項 將使用其默認值:
您可以使用其他參數自訂工具結果清除行為:
上下文編輯允許您在對話增長時自動管理對話上下文,幫助您優化成本並保持在上下文窗口限制內。您可以使用伺服器端 API 策略、客戶端 SDK 功能,或兩者結合使用。
| 方法 | 運行位置 | 策略 | 工作原理 |
|---|---|---|---|
| 伺服器端 | API | 工具結果清除 (clear_tool_uses_20250919)思考區塊清除 ( clear_thinking_20251015) | 在提示到達 Claude 之前應用。從對話歷史中清除特定內容。每個策略可以獨立配置。 |
| 客戶端 | SDK | 壓縮 | 在使用 tool_runner 時,可在 Python 和 TypeScript SDK 中使用。生成摘要並替換完整對話歷史。請參閱下面的 壓縮。 |
上下文編輯目前處於測試版,支持工具結果清除和思考區塊清除。要啟用它,請在您的 API 請求中使用測試版標頭 context-management-2025-06-27。
請通過我們的 反饋表單 分享您對此功能的反饋。
clear_tool_uses_20250919 策略在對話上下文增長超過您配置的閾值時清除工具結果。激活後,API 會按時間順序自動清除最舊的工具結果,用佔位符文本替換它們,讓 Claude 知道工具結果已被移除。默認情況下,只清除工具結果。您可以通過將 clear_tool_inputs 設置為 true,選擇清除工具結果和工具調用(工具使用參數)。
clear_thinking_20251015 策略在啟用擴展思考時管理對話中的 thinking 區塊。此策略自動清除來自先前輪次的較舊思考區塊。
默認行為:啟用擴展思考而不配置 clear_thinking_20251015 策略時,API 自動僅保留最後一個助手輪次的思考區塊(等同於 keep: {type: "thinking_turns", value: 1})。
要最大化緩存命中,通過設置 keep: "all" 保留所有思考區塊。
助手對話輪次可能包括多個內容區塊(例如使用工具時)和多個思考區塊(例如使用 交錯思考)。
上下文編輯在伺服器端進行
上下文編輯在提示到達 Claude 之前在伺服器端應用。您的客戶端應用程序保持完整的、未修改的對話歷史——您無需將客戶端狀態與編輯版本同步。繼續像往常一樣在本地管理您的完整對話歷史。
上下文編輯和提示緩存
上下文編輯與 提示緩存 的交互因策略而異:
工具結果清除:清除內容時使緩存的提示前綴失效。為了解決這個問題,我們建議清除足夠的令牌以使緩存失效值得。使用 clear_at_least 參數確保每次清除時至少清除最少數量的令牌。每次清除內容時您都會產生緩存寫入成本,但後續請求可以重用新緩存的前綴。
思考區塊清除:當思考區塊保留在上下文中(未清除)時,提示緩存被保留,啟用緩存命中並減少輸入令牌成本。當思考區塊被清除時,緩存在清除發生的位置失效。根據您是否想優先考慮緩存性能或上下文窗口可用性來配置 keep 參數。
上下文編輯可在以下模型上使用:
claude-opus-4-5-20251101)claude-opus-4-1-20250805)claude-opus-4-20250514)claude-sonnet-4-5-20250929)claude-sonnet-4-20250514)claude-haiku-4-5-20251001)啟用工具結果清除的最簡單方法是僅指定策略類型,因為所有其他 配置選項 將使用其默認值:
您可以使用其他參數自定義工具結果清除行為:
啟用思考區塊清除以在啟用擴展思考時有效管理上下文和提示緩存:
clear_thinking_20251015 策略支持以下配置:
| 配置選項 | 默認值 | 描述 |
|---|---|---|
keep | {type: "thinking_turns", value: 1} | 定義要保留多少個最近的帶有思考區塊的助手輪次。使用 {type: "thinking_turns", value: N},其中 N 必須 > 0 以保留最後 N 個輪次,或使用 "all" 保留所有思考區塊。 |
配置示例:
// 保留最後 3 個助手輪次的思考區塊
{
"type": "clear_thinking_20251015",
"keep": {
"type": "thinking_turns",
"value": 3
}
}
// 保留所有思考區塊(最大化緩存命中)
{
"type": "clear_thinking_20251015",
"keep": "all"
}clear_thinking_20251015 策略支持以下配置:
| 配置選項 | 默認值 | 描述 |
|---|---|---|
keep | {type: "thinking_turns", value: 1} | 定義要保留多少個最近的帶有思考區塊的助手輪次。使用 {type: "thinking_turns", value: N},其中 N 必須 > 0 以保留最後 N 個輪次,或使用 "all" 保留所有思考區塊。 |
配置示例:
// 保留最後 3 個助手輪次的思考區塊
{
"type": "clear_thinking_20251015",
"keep": {
"type": "thinking_turns",
"value": 3
}
}
// 保留所有思考區塊(最大化緩存命中)
{
"type": "clear_thinking_20251015",
"keep": "all"
}您可以同時使用思考區塊清除和工具結果清除:
使用多個策略時,clear_thinking_20251015 策略必須在 edits 陣列中首先列出。
clear_thinking_20251015 策略支持以下配置:
| 配置選項 | 默認值 | 描述 |
|---|---|---|
keep | {type: "thinking_turns", value: 1} | 定義要保留多少個最近的帶有思考區塊的助手輪次。使用 {type: "thinking_turns", value: N},其中 N 必須 > 0 以保留最後 N 個輪次,或使用 "all" 保留所有思考區塊。 |
配置示例:
// 保留最後 3 個助手輪次的思考區塊
{
"type": "clear_thinking_20251015",
"keep": {
"type": "thinking_turns",
"value": 3
}
}
// 保留所有思考區塊(最大化緩存命中)
{
"type": "clear_thinking_20251015",
"keep": "all"
}您可以同時使用思考區塊清除和工具結果清除:
使用多個策略時,clear_thinking_20251015 策略必須在 edits 陣列中首先列出。
| 配置選項 | 默認值 | 描述 |
|---|---|---|
trigger | 100,000 輸入令牌 | 定義上下文編輯策略何時激活。一旦提示超過此閾值,清除將開始。您可以在 input_tokens 或 tool_uses 中指定此值。 |
keep | 3 個工具使用 | 定義清除發生後要保留多少個最近的工具使用/結果對。API 首先移除最舊的工具交互,保留最新的。 |
clear_at_least | 無 | 確保每次策略激活時至少清除最少數量的令牌。如果 API 無法清除至少指定的數量,該策略將不被應用。這有助於確定上下文清除是否值得破壞您的提示緩存。 |
exclude_tools | 無 | 工具名稱列表,其工具使用和結果永遠不應被清除。對於保留重要上下文很有用。 |
clear_tool_inputs | false | 控制是否將工具調用參數與工具結果一起清除。默認情況下,只清除工具結果,同時保持 Claude 的原始工具調用可見。 |
clear_thinking_20251015 策略支持以下配置:
| 配置選項 | 默認值 | 描述 |
|---|---|---|
keep | {type: "thinking_turns", value: 1} | 定義要保留多少個最近的帶有思考區塊的助手輪次。使用 {type: "thinking_turns", value: N},其中 N 必須 > 0 以保留最後 N 個輪次,或使用 "all" 保留所有思考區塊。 |
配置示例:
// 保留最後 3 個助手輪次的思考區塊
{
"type": "clear_thinking_20251015",
"keep": {
"type": "thinking_turns",
"value": 3
}
}
// 保留所有思考區塊(最大化緩存命中)
{
"type": "clear_thinking_20251015",
"keep": "all"
}您可以同時使用思考區塊清除和工具結果清除:
使用多個策略時,clear_thinking_20251015 策略必須在 edits 陣列中首先列出。
| 配置選項 | 默認值 | 描述 |
|---|---|---|
trigger | 100,000 輸入令牌 | 定義上下文編輯策略何時激活。一旦提示超過此閾值,清除將開始。您可以在 input_tokens 或 tool_uses 中指定此值。 |
keep | 3 個工具使用 | 定義清除發生後要保留多少個最近的工具使用/結果對。API 首先移除最舊的工具交互,保留最新的。 |
clear_at_least | 無 | 確保每次策略激活時至少清除最少數量的令牌。如果 API 無法清除至少指定的數量,該策略將不被應用。這有助於確定上下文清除是否值得破壞您的提示緩存。 |
exclude_tools | 無 | 工具名稱列表,其工具使用和結果永遠不應被清除。對於保留重要上下文很有用。 |
clear_tool_inputs | false | 控制是否將工具調用參數與工具結果一起清除。默認情況下,只清除工具結果,同時保持 Claude 的原始工具調用可見。 |
您可以使用 context_management 回應欄位查看哪些上下文編輯已應用於您的請求,以及有關清除的內容和輸入令牌的有用統計信息。
{
"id": "msg_013Zva2CMHLNnXjNJJKqJ2EF",
"type": "message",
"role": "assistant",
"content": [...],
"usage": {...},
"context_management": {
"applied_edits": [
// When using `clear_thinking_20251015`
{
"type": "clear_thinking_20251015",
"cleared_thinking_turns": 3,
"cleared_input_tokens": 15000
},
// When using `clear_tool_uses_20250919`
{
"type": "clear_tool_uses_20250919",
"cleared_tool_uses": 8,
"cleared_input_tokens": 50000
}
]
}
}對於流式回應,上下文編輯將包含在最終 message_delta 事件中:
{
"type": "message_delta",
"delta": {
"stop_reason": "end_turn",
"stop_sequence": null
},
"usage": {
"output_tokens": 1024
},
"context_management": {
"applied_edits": [...]
}
}clear_thinking_20251015 策略支援以下配置:
| 配置選項 | 預設值 | 描述 |
|---|---|---|
keep | {type: "thinking_turns", value: 1} | 定義要保留多少個最近的助手回合(包含思考區塊)。使用 {type: "thinking_turns", value: N},其中 N 必須 > 0 以保留最後 N 個回合,或使用 "all" 以保留所有思考區塊。 |
配置範例:
// 保留最後 3 個助手回合的思考區塊
{
"type": "clear_thinking_20251015",
"keep": {
"type": "thinking_turns",
"value": 3
}
}
// 保留所有思考區塊(最大化快取命中)
{
"type": "clear_thinking_20251015",
"keep": "all"
}您可以同時使用思考區塊清除和工具結果清除:
使用多個策略時,clear_thinking_20251015 策略必須在 edits 陣列中首先列出。
| 配置選項 | 預設值 | 描述 |
|---|---|---|
trigger | 100,000 個輸入 token | 定義上下文編輯策略何時啟動。一旦提示超過此閾值,清除就會開始。您可以在 input_tokens 或 tool_uses 中指定此值。 |
keep | 3 個工具使用 | 定義清除後要保留多少個最近的工具使用/結果對。API 會首先移除最舊的工具互動,保留最新的互動。 |
clear_at_least | 無 | 確保每次策略啟動時至少清除指定數量的 token。如果 API 無法至少清除指定的數量,該策略將不會被應用。這有助於判斷上下文清除是否值得破壞您的提示快取。 |
exclude_tools | 無 | 工具名稱列表,其工具使用和結果永遠不應被清除。適用於保留重要上下文。 |
clear_tool_inputs | false | 控制工具呼叫參數是否與工具結果一起被清除。預設情況下,只清除工具結果,同時保留 Claude 的原始工具呼叫可見。 |
您可以使用 context_management 回應欄位查看哪些上下文編輯已應用於您的請求,以及有關清除的內容和輸入 token 的有用統計資訊。
{
"id": "msg_013Zva2CMHLNnXjNJJKqJ2EF",
"type": "message",
"role": "assistant",
"content": [...],
"usage": {...},
"context_management": {
"applied_edits": [
// 使用 `clear_thinking_20251015` 時
{
"type": "clear_thinking_20251015",
"cleared_thinking_turns": 3,
"cleared_input_tokens": 15000
},
// 使用 `clear_tool_uses_20250919` 時
{
"type": "clear_tool_uses_20250919",
"cleared_tool_uses": 8,
"cleared_input_tokens": 50000
}
]
}
}對於串流回應,上下文編輯將包含在最終的 message_delta 事件中:
{
"type": "message_delta",
"delta": {
"stop_reason": "end_turn",
"stop_sequence": null
},
"usage": {
"output_tokens": 1024
},
"context_management": {
"applied_edits": [...]
}
}token 計數 端點支援上下文管理,允許您預覽在應用上下文編輯後您的提示將使用多少 token。
{
"input_tokens": 25000,
"context_management": {
"original_input_tokens": 70000
}
}回應顯示應用上下文管理後的最終 token 計數(input_tokens)和任何清除發生前的原始 token 計數(original_input_tokens)。
上下文編輯可以與記憶工具結合。當您的對話上下文接近配置的清除閾值時,Claude 會收到自動警告以保留重要資訊。這使 Claude 能夠在工具結果從對話歷史中被清除之前,將其保存到記憶檔案中。
此組合允許您:
例如,在 Claude 執行許多操作的檔案編輯工作流程中,Claude 可以在上下文增長時將已完成的變更摘要保存到記憶檔案。當工具結果被清除時,Claude 通過其記憶系統保留對該資訊的存取權,並可以繼續有效地工作。
要同時使用這兩個功能,請在您的 API 請求中啟用它們:
壓縮在使用 tool_runner 方法 時,可在 Python 和 TypeScript SDK 中使用。
壓縮是一項 SDK 功能,當 token 使用量增長過大時,通過生成摘要來自動管理對話上下文。與清除內容的伺服器端上下文編輯策略不同,壓縮指示 Claude 摘要對話歷史,然後用該摘要替換完整歷史。這允許 Claude 繼續處理長期執行的任務,否則會超過上下文視窗。
啟用壓縮時,SDK 在每個模型回應後監控 token 使用量:
input_tokens + cache_creation_input_tokens + cache_read_input_tokens + output_tokens<summary></summary> 標籤中的結構化摘要將 compaction_control 新增到您的 tool_runner 呼叫:
隨著對話增長,訊息歷史累積:
壓縮前(接近 100k token):
[
{ "role": "user", "content": "Analyze all files and write a report..." },
{ "role": "assistant", "content": "I'll help. Let me start by reading..." },
{ "role": "user", "content": [{ "type": "tool_result", "tool_use_id": "...", "content": "..." }] },
{ "role": "assistant", "content": "Based on file1.txt, I see..." },
{ "role": "user", "content": [{ "type": "tool_result", "tool_use_id": "...", "content": "..." }] },
{ "role": "assistant", "content": "After analyzing file2.txt..." },
// ... 50 more exchanges like this ...
]當 token 超過閾值時,SDK 注入摘要請求,Claude 生成摘要。整個歷史隨後被替換:
壓縮後(回到約 2-3k token):
[
{
"role": "assistant",
"content": "# Task Overview\nThe user requested analysis of directory files to produce a summary report...\n\n# Current State\nAnalyzed 52 files across 3 subdirectories. Key findings documented in report.md...\n\n# Important Discoveries\n- Configuration files use YAML format\n- Found 3 deprecated dependencies\n- Test coverage at 67%\n\n# Next Steps\n1. Analyze remaining files in /src/legacy\n2. Complete final report sections...\n\n# Context to Preserve\nUser prefers markdown format with executive summary first..."
}
]Claude 從此摘要繼續工作,就像它是原始對話歷史一樣。
| 參數 | 類型 | 必需 | 預設值 | 描述 |
|---|---|---|---|---|
enabled | boolean | 是 | - | 是否啟用自動壓縮 |
context_token_threshold | number | 否 | 100,000 | 觸發壓縮的 token 計數 |
model | string | 否 | 與主模型相同 | 用於生成摘要的模型 |
summary_prompt | string | 否 | 見下文 | 摘要生成的自訂提示 |
閾值決定何時發生壓縮。較低的閾值意味著更頻繁的壓縮,上下文視窗較小。較高的閾值允許更多上下文,但有觸及限制的風險。
# 在記憶受限的情況下更頻繁地壓縮
compaction_control={
"enabled": True,
"context_token_threshold": 50000
}
# 當您需要更多上下文時壓縮頻率較低
compaction_control={
"enabled": True,
"context_token_threshold": 150000
}您可以使用更快或更便宜的模型來生成摘要:
compaction_control={
"enabled": True,
"context_token_threshold": 100000,
"model": "claude-haiku-4-5"
}您可以為特定領域的需求提供自訂提示。您的提示應指示 Claude 將其摘要包裝在 <summary></summary> 標籤中。
compaction_control={
"enabled": True,
"context_token_threshold": 100000,
"summary_prompt": """Summarize the research conducted so far, including:
- Sources consulted and key findings
- Questions answered and remaining unknowns
- Recommended next steps
Wrap your summary in <summary></summary> tags."""
}上下文編輯可以與記憶工具結合使用。當您的對話上下文接近配置的清除閾值時,Claude 會收到自動警告以保留重要資訊。這使 Claude 能夠在工具結果從對話歷史中清除之前,將工具結果或上下文保存到其記憶檔案中。
此組合允許您:
例如,在 Claude 執行許多操作的檔案編輯工作流程中,Claude 可以在上下文增長時將已完成的變更摘要保存到記憶檔案。當工具結果被清除時,Claude 通過其記憶系統保留對該資訊的存取權限,並可以繼續有效地工作。
要同時使用這兩個功能,請在您的 API 請求中啟用它們:
壓縮在使用 tool_runner 方法時,可在 Python 和 TypeScript SDK 中使用。
壓縮是一項 SDK 功能,當令牌使用量增長過大時,通過生成摘要來自動管理對話上下文。與清除內容的伺服器端上下文編輯策略不同,壓縮指示 Claude 摘要對話歷史,然後用該摘要替換完整歷史。這允許 Claude 繼續處理否則會超過上下文視窗的長期運行任務。
啟用壓縮後,SDK 在每個模型回應後監控令牌使用量:
input_tokens + cache_creation_input_tokens + cache_read_input_tokens + output_tokens<summary></summary> 標籤中的結構化摘要將 compaction_control 添加到您的 tool_runner 呼叫中:
隨著對話增長,訊息歷史會累積:
壓縮前(接近 100k 令牌):
[
{ "role": "user", "content": "Analyze all files and write a report..." },
{ "role": "assistant", "content": "I'll help. Let me start by reading..." },
{ "role": "user", "content": [{ "type": "tool_result", "tool_use_id": "...", "content": "..." }] },
{ "role": "assistant", "content": "Based on file1.txt, I see..." },
{ "role": "user", "content": [{ "type": "tool_result", "tool_use_id": "...", "content": "..." }] },
{ "role": "assistant", "content": "After analyzing file2.txt..." },
// ... 50 more exchanges like this ...
]當令牌超過閾值時,SDK 注入摘要請求,Claude 生成摘要。整個歷史隨後被替換:
壓縮後(回到約 2-3k 令牌):
[
{
"role": "assistant",
"content": "# Task Overview\nThe user requested analysis of directory files to produce a summary report...\n\n# Current State\nAnalyzed 52 files across 3 subdirectories. Key findings documented in report.md...\n\n# Important Discoveries\n- Configuration files use YAML format\n- Found 3 deprecated dependencies\n- Test coverage at 67%\n\n# Next Steps\n1. Analyze remaining files in /src/legacy\n2. Complete final report sections...\n\n# Context to Preserve\nUser prefers markdown format with executive summary first..."
}
]Claude 從此摘要繼續工作,就像它是原始對話歷史一樣。
| 參數 | 類型 | 必需 | 預設值 | 描述 |
|---|---|---|---|---|
enabled | boolean | 是 | - | 是否啟用自動壓縮 |
context_token_threshold | number | 否 | 100,000 | 觸發壓縮的令牌計數 |
model | string | 否 | 與主模型相同 | 用於生成摘要的模型 |
summary_prompt | string | 否 | 見下文 | 摘要生成的自訂提示 |
閾值決定何時發生壓縮。較低的閾值意味著更頻繁的壓縮,上下文視窗更小。較高的閾值允許更多上下文,但有達到限制的風險。
# More frequent compaction for memory-constrained scenarios
compaction_control={
"enabled": True,
"context_token_threshold": 50000
}
# Less frequent compaction when you need more context
compaction_control={
"enabled": True,
"context_token_threshold": 150000
}您可以使用更快或更便宜的模型來生成摘要:
compaction_control={
"enabled": True,
"context_token_threshold": 100000,
"model": "claude-haiku-4-5"
}您可以為特定領域的需求提供自訂提示。您的提示應指示 Claude 將其摘要包裝在 <summary></summary> 標籤中。
compaction_control={
"enabled": True,
"context_token_threshold": 100000,
"summary_prompt": """Summarize the research conducted so far, including:
- Sources consulted and key findings
- Questions answered and remaining unknowns
- Recommended next steps
Wrap your summary in <summary></summary> tags."""
}內建摘要提示指示 Claude 建立包括以下內容的結構化延續摘要:
此結構使 Claude 能夠有效地恢復工作,而不會丟失重要上下文或重複犯錯。
使用伺服器端工具時,SDK 可能會錯誤地計算令牌使用量,導致壓縮在錯誤的時間觸發。
例如,在網路搜尋操作後,API 回應可能顯示:
{
"usage": {
"input_tokens": 63000,
"cache_read_input_tokens": 270000,
"output_tokens": 1400
}
}SDK 將總使用量計算為 63,000 + 270,000 = 333,000 令牌。但是,cache_read_input_tokens 值包括伺服器端工具進行的多個內部 API 呼叫的累積讀取,而不是您的實際對話上下文。您的實際上下文長度可能只有 63,000 個 input_tokens,但 SDK 看到 333k 並過早觸發壓縮。
解決方案:
當壓縮在工具使用回應待處理時觸發時,SDK 在生成摘要之前從訊息歷史中移除工具使用區塊。如果仍需要,Claude 在從摘要恢復後會重新發出工具呼叫。
使用伺服器端工具時,SDK 可能會錯誤地計算令牌使用量,導致壓縮在錯誤的時間觸發。
例如,在網路搜尋操作後,API 回應可能顯示:
{
"usage": {
"input_tokens": 63000,
"cache_read_input_tokens": 270000,
"output_tokens": 1400
}
}SDK 將總使用量計算為 63,000 + 270,000 = 333,000 令牌。但是,cache_read_input_tokens 值包括伺服器端工具進行的多個內部 API 呼叫的累積讀取,而不是您的實際對話上下文。您的實際上下文長度可能只有 63,000 個 input_tokens,但 SDK 看到 333k 並過早觸發壓縮。
解決方案:
當壓縮在工具使用回應待處理時觸發時,SDK 在生成摘要之前從訊息歷史中移除工具使用區塊。如果仍需要,Claude 在從摘要恢復後會重新發出工具呼叫。
啟用日誌記錄以追蹤壓縮何時發生:
import logging
logging.basicConfig(level=logging.INFO)
logging.getLogger("anthropic.lib.tools").setLevel(logging.INFO)
# Logs will show:
# INFO: Token usage 105000 has exceeded the threshold of 100000. Performing compaction.
# INFO: Compaction complete. New token usage: 2500使用伺服器端工具時,SDK 可能會錯誤地計算令牌使用量,導致壓縮在錯誤的時間觸發。
例如,在網路搜尋操作後,API 回應可能顯示:
{
"usage": {
"input_tokens": 63000,
"cache_read_input_tokens": 270000,
"output_tokens": 1400
}
}SDK 將總使用量計算為 63,000 + 270,000 = 333,000 令牌。但是,cache_read_input_tokens 值包括伺服器端工具進行的多個內部 API 呼叫的累積讀取,而不是您的實際對話上下文。您的實際上下文長度可能只有 63,000 個 input_tokens,但 SDK 看到 333k 並過早觸發壓縮。
解決方案:
當壓縮在工具使用回應待處理時觸發時,SDK 在生成摘要之前從訊息歷史中移除工具使用區塊。如果仍需要,Claude 在從摘要恢復後會重新發出工具呼叫。
啟用日誌記錄以追蹤壓縮何時發生:
import logging
logging.basicConfig(level=logging.INFO)
logging.getLogger("anthropic.lib.tools").setLevel(logging.INFO)
# Logs will show:
# INFO: Token usage 105000 has exceeded the threshold of 100000. Performing compaction.
# INFO: Compaction complete. New token usage: 2500良好的使用案例:
不太理想的使用案例:
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" \
--header "anthropic-beta: context-management-2025-06-27" \
--data '{
"model": "claude-sonnet-4-5",
"max_tokens": 4096,
"messages": [
{
"role": "user",
"content": "Search for recent developments in AI"
}
],
"tools": [
{
"type": "web_search_20250305",
"name": "web_search"
}
],
"context_management": {
"edits": [
{"type": "clear_tool_uses_20250919"}
]
}
}'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" \
--header "anthropic-beta: context-management-2025-06-27" \
--data '{
"model": "claude-sonnet-4-5",
"max_tokens": 4096,
"messages": [
{
"role": "user",
"content": "Create a simple command line calculator app using Python"
}
],
"tools": [
{
"type": "text_editor_20250728",
"name": "str_replace_based_edit_tool",
"max_characters": 10000
},
{
"type": "web_search_20250305",
"name": "web_search",
"max_uses": 3
}
],
"context_management": {
"edits": [
{
"type": "clear_tool_uses_20250919",
"trigger": {
"type": "input_tokens",
"value": 30000
},
"keep": {
"type": "tool_uses",
"value": 3
},
"clear_at_least": {
"type": "input_tokens",
"value": 5000
},
"exclude_tools": ["web_search"]
}
]
}
}'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" \
--header "anthropic-beta: context-management-2025-06-27" \
--data '{
"model": "claude-sonnet-4-5",
"max_tokens": 4096,
"messages": [
{
"role": "user",
"content": "Search for recent developments in AI"
}
],
"tools": [
{
"type": "web_search_20250305",
"name": "web_search"
}
],
"context_management": {
"edits": [
{"type": "clear_tool_uses_20250919"}
]
}
}'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" \
--header "anthropic-beta: context-management-2025-06-27" \
--data '{
"model": "claude-sonnet-4-5",
"max_tokens": 4096,
"messages": [
{
"role": "user",
"content": "Create a simple command line calculator app using Python"
}
],
"tools": [
{
"type": "text_editor_20250728",
"name": "str_replace_based_edit_tool",
"max_characters": 10000
},
{
"type": "web_search_20250305",
"name": "web_search",
"max_uses": 3
}
],
"context_management": {
"edits": [
{
"type": "clear_tool_uses_20250919",
"trigger": {
"type": "input_tokens",
"value": 30000
},
"keep": {
"type": "tool_uses",
"value": 3
},
"clear_at_least": {
"type": "input_tokens",
"value": 5000
},
"exclude_tools": ["web_search"]
}
]
}
}'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" \
--header "anthropic-beta: context-management-2025-06-27" \
--data '{
"model": "claude-sonnet-4-5-20250929",
"max_tokens": 1024,
"messages": [...],
"thinking": {
"type": "enabled",
"budget_tokens": 10000
},
"context_management": {
"edits": [
{
"type": "clear_thinking_20251015",
"keep": {
"type": "thinking_turns",
"value": 2
}
}
]
}
}'response = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[...],
thinking={
"type": "enabled",
"budget_tokens": 10000
},
tools=[...],
betas=["context-management-2025-06-27"],
context_management={
"edits": [
{
"type": "clear_thinking_20251015",
"keep": {
"type": "thinking_turns",
"value": 2
}
},
{
"type": "clear_tool_uses_20250919",
"trigger": {
"type": "input_tokens",
"value": 50000
},
"keep": {
"type": "tool_uses",
"value": 5
}
}
]
}
)response = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[...],
thinking={
"type": "enabled",
"budget_tokens": 10000
},
tools=[...],
betas=["context-management-2025-06-27"],
context_management={
"edits": [
{
"type": "clear_thinking_20251015",
"keep": {
"type": "thinking_turns",
"value": 2
}
},
{
"type": "clear_tool_uses_20250919",
"trigger": {
"type": "input_tokens",
"value": 50000
},
"keep": {
"type": "tool_uses",
"value": 5
}
}
]
}
)response = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[...],
thinking={
"type": "enabled",
"budget_tokens": 10000
},
tools=[...],
betas=["context-management-2025-06-27"],
context_management={
"edits": [
{
"type": "clear_thinking_20251015",
"keep": {
"type": "thinking_turns",
"value": 2
}
},
{
"type": "clear_tool_uses_20250919",
"trigger": {
"type": "input_tokens",
"value": 50000
},
"keep": {
"type": "tool_uses",
"value": 5
}
}
]
}
)response = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[...],
thinking={
"type": "enabled",
"budget_tokens": 10000
},
tools=[...],
betas=["context-management-2025-06-27"],
context_management={
"edits": [
{
"type": "clear_thinking_20251015",
"keep": {
"type": "thinking_turns",
"value": 2
}
},
{
"type": "clear_tool_uses_20250919",
"trigger": {
"type": "input_tokens",
"value": 50000
},
"keep": {
"type": "tool_uses",
"value": 5
}
}
]
}
)curl https://api.anthropic.com/v1/messages/count_tokens \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "content-type: application/json" \
--header "anthropic-beta: context-management-2025-06-27" \
--data '{
"model": "claude-sonnet-4-5",
"messages": [
{
"role": "user",
"content": "Continue our conversation..."
}
],
"tools": [...],
"context_management": {
"edits": [
{
"type": "clear_tool_uses_20250919",
"trigger": {
"type": "input_tokens",
"value": 30000
},
"keep": {
"type": "tool_uses",
"value": 5
}
}
]
}
}'response = client.beta.messages.create(
model="claude-sonnet-4-5",
max_tokens=4096,
messages=[...],
tools=[
{
"type": "memory_20250818",
"name": "memory"
},
# Your other tools
],
betas=["context-management-2025-06-27"],
context_management={
"edits": [
{"type": "clear_tool_uses_20250919"}
]
}
)import anthropic
client = anthropic.Anthropic()
runner = client.beta.messages.tool_runner(
model="claude-sonnet-4-5",
max_tokens=4096,
tools=[...],
messages=[
{
"role": "user",
"content": "Analyze all the files in this directory and write a summary report."
}
],
compaction_control={
"enabled": True,
"context_token_threshold": 100000
}
)
for message in runner:
print(f"Tokens used: {message.usage.input_tokens}")
final = runner.until_done()response = client.beta.messages.create(
model="claude-sonnet-4-5",
max_tokens=4096,
messages=[...],
tools=[
{
"type": "memory_20250818",
"name": "memory"
},
# Your other tools
],
betas=["context-management-2025-06-27"],
context_management={
"edits": [
{"type": "clear_tool_uses_20250919"}
]
}
)import anthropic
client = anthropic.Anthropic()
runner = client.beta.messages.tool_runner(
model="claude-sonnet-4-5",
max_tokens=4096,
tools=[...],
messages=[
{
"role": "user",
"content": "Analyze all the files in this directory and write a summary report."
}
],
compaction_control={
"enabled": True,
"context_token_threshold": 100000
}
)
for message in runner:
print(f"Tokens used: {message.usage.input_tokens}")
final = runner.until_done()