Was this page helpful?
この機能はZero Data Retention(ZDR)の対象です。組織がZDR契約を締結している場合、この機能を通じて送信されたデータは、APIレスポンスが返された後に保存されることはありません。
ほとんどのユースケースでは、サーバーサイドコンパクションが長時間の会話におけるコンテキスト管理の主要な戦略です。このページで説明する戦略は、クリアされるコンテンツをより細かく制御する必要がある特定のシナリオで役立ちます。
「context editing」(コンテキスト編集)を使用すると、会話履歴が増大するにつれて特定のコンテンツを選択的にクリアできます。コストの最適化や制限内に収めることだけでなく、Claudeが参照する内容を積極的にキュレーションすることが目的です。コンテキストは有限のリソースであり、収穫逓減の法則が働き、無関係なコンテンツはモデルの集中力を低下させます。コンテキスト編集により、そのキュレーションを実行時に細かく制御できます。コンテキスト管理の背後にあるより広範な原則については、Effective context engineeringを参照してください。このページでは以下を説明します。
| アプローチ | 実行場所 | 戦略 | 動作方法 |
|---|---|---|---|
| サーバーサイド | API | ツール結果のクリア(clear_tool_uses_20250919)思考ブロックのクリア( clear_thinking_20251015) | プロンプトがClaudeに到達する前に適用されます。会話履歴から特定のコンテンツをクリアします。各戦略は独立して設定できます。 |
| クライアントサイド | SDK | コンパクション | tool_runnerを使用する際にPython、TypeScript、Ruby SDKで利用可能です。要約を生成し、会話履歴全体を置き換えます。クライアントサイドコンパクションを参照してください。 |
コンテキスト編集はベータ版で、ツール結果のクリアと思考ブロックのクリアをサポートしています。有効にするには、APIリクエストでベータヘッダーcontext-management-2025-06-27を使用してください。
この機能に関するフィードバックは、フィードバックフォームからお寄せください。
clear_tool_uses_20250919戦略は、会話コンテキストが設定したしきい値を超えて増大したときにツール結果をクリアします。これは、ツール使用の多いエージェントワークフローで特に有用です。古いツール結果(ファイルの内容や検索結果など)は、Claudeがそれらを処理した後は不要になります。
アクティブになると、APIは最も古いツール結果を時系列順に自動的にクリアします。APIは各クリアされた結果をプレースホルダーテキストに置き換えるため、Claudeはそれが削除されたことを認識できます。デフォルトでは、ツール結果のみがクリアされます。clear_tool_inputsをtrueに設定することで、ツール結果とツール呼び出し(ツール使用パラメータ)の両方をオプションでクリアできます。
clear_thinking_20251015戦略は、拡張思考が有効な場合に会話内のthinkingブロックを管理します。この戦略により、思考の保持を制御できます。推論の連続性を維持するためにより多くの思考ブロックを保持するか、コンテキストスペースを節約するためにより積極的にクリアするかを選択できます。
デフォルトの動作: デフォルトはモデルクラスによって異なります。
| モデルクラス | 以前の思考をすべて保持 | 最後のターンの思考のみ保持 |
|---|---|---|
| Opus | Claude Opus 4.5以降 | Claude Opus 4.1(非推奨)以前 |
| Sonnet | Claude Sonnet 4.6以降 | Claude Sonnet 4.5以前 |
| Haiku | (なし) | Claude Haiku 4.5までのすべてのモデル |
デフォルトを上書きするには、この戦略を使用してください。コードが複数のモデル層で実行される場合は、モデルごとのデフォルトに依存するのではなく、keepを明示的に設定してください。
アシスタントの会話ターンには、複数のコンテンツブロック(たとえば、ツールを使用する場合)や複数の思考ブロック(たとえば、インターリーブ思考を使用する場合)が含まれる場合があります。
コンテキスト編集は、プロンプトがClaudeに到達する前にサーバーサイドで適用されます。クライアントアプリケーションは、変更されていない完全な会話履歴を保持します。クライアントの状態を編集されたバージョンと同期する必要はありません。通常どおり、ローカルで完全な会話履歴を管理し続けてください。
コンテキスト編集とプロンプトキャッシングの相互作用は、戦略によって異なります。
ツール結果のクリア:コンテンツがクリアされると、キャッシュされたプロンプトプレフィックスが無効になります。これを考慮して、キャッシュの無効化に見合うだけの十分なトークンをクリアしてください。clear_at_leastパラメータを使用して、毎回最小限のトークン数がクリアされるようにします。コンテンツがクリアされるたびにキャッシュ書き込みコストが発生しますが、後続のリクエストでは新しくキャッシュされたプレフィックスを再利用できます。
思考ブロックのクリア:思考ブロックがコンテキストに保持される(クリアされない)場合、プロンプトキャッシュは保持され、キャッシュヒットが可能になり、入力トークンコストが削減されます。思考ブロックがクリアされる場合、クリアが発生した時点でキャッシュが無効になります。キャッシュパフォーマンスとコンテキストウィンドウの可用性のどちらを優先するかに基づいて、keepパラメータを設定してください。
コンテキスト編集は、サポートされているすべてのClaudeモデルで利用可能です。
ツール結果のクリアを有効にする最も簡単な方法は、戦略タイプのみを指定することです。その他のすべての設定オプションはデフォルト値を使用します。
追加のパラメータを使用して、ツール結果のクリア動作をカスタマイズできます。
拡張思考が有効な場合にコンテキストとプロンプトキャッシングを効果的に管理するために、思考ブロックのクリアを有効にします。
clear_thinking_20251015戦略は、以下の設定をサポートしています。
| 設定オプション | デフォルト | 説明 |
|---|---|---|
keep | モデル固有 | 思考ブロックを保持する最近のアシスタントターン数を定義します。最後のNターンを保持するには{type: "thinking_turns", value: N}(Nは0より大きい必要があります)を使用し、すべての思考ブロックを保持するには"all"を使用します。Opus 4.5以降およびSonnet 4.6以降:すべてのターン。それ以前のOpus/SonnetおよびすべてのHaiku:最後のターンのみ。 |
設定例:
最後の3つのアシスタントターンの思考ブロックを保持する:
すべての思考ブロックを保持する(キャッシュヒットを最大化):
思考ブロックのクリアとツール結果のクリアの両方を一緒に使用できます。
複数の戦略を使用する場合、clear_thinking_20251015戦略をedits配列の最初にリストする必要があります。
| 設定オプション | デフォルト | 説明 |
|---|---|---|
trigger | 100,000入力トークン | コンテキスト編集戦略がアクティブになるタイミングを定義します。プロンプトがこのしきい値を超えると、クリアが開始されます。この値はinput_tokensまたはtool_usesのいずれかで指定できます。 |
keep | 3つのツール使用 | クリア発生後に保持する最近のツール使用/結果ペアの数を定義します。APIは最も古いツールインタラクションを最初に削除し、最新のものを保持します。 |
clear_at_least | なし | 戦略がアクティブになるたびにクリアされる最小トークン数を保証します。APIが指定された量以上をクリアできない場合、戦略は適用されません。これは、コンテキストのクリアがプロンプトキャッシュを破棄する価値があるかどうかを判断するのに役立ちます。 |
exclude_tools | なし | ツール使用と結果を決してクリアしないツール名のリスト。重要なコンテキストを保持するのに役立ちます。 |
clear_tool_inputs | false |
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": [
// ...
]
}
}トークンカウントエンドポイントはコンテキスト管理をサポートしており、コンテキスト編集が適用された後にプロンプトが使用するトークン数をプレビューできます。
{
"input_tokens": 25000,
"context_management": {
"original_input_tokens": 70000
}
}レスポンスには、コンテキスト管理が適用された後の最終トークン数(input_tokens)と、クリアが発生する前の元のトークン数(original_input_tokens)の両方が表示されます。
コンテキスト編集はメモリツールと組み合わせることができます。会話コンテキストが設定されたクリアしきい値に近づくと、Claudeは重要な情報を保存するための自動警告を受け取ります。これにより、Claudeはツール結果やコンテキストが会話履歴からクリアされる前に、それらをメモリファイルに保存できます。
この組み合わせにより、以下が可能になります。
たとえば、Claudeが多くの操作を実行するファイル編集ワークフローでは、コンテキストが増大するにつれて、Claudeは完了した変更をメモリファイルに要約できます。ツール結果がクリアされても、Claudeはメモリシステムを通じてその情報へのアクセスを保持し、効果的に作業を続けることができます。
両方の機能を一緒に使用するには、APIリクエストでそれらを有効にします。
コマンドや例を含むメモリツールの完全なリファレンスについては、メモリツールを参照してください。
AnthropicはSDKコンパクションよりもサーバーサイドコンパクションを推奨しています。 サーバーサイドコンパクションは、統合の複雑さが少なく、トークン使用量の計算が改善され、クライアントサイドの制限がない状態で、コンテキスト管理を自動的に処理します。要約プロセスをクライアントサイドで制御する必要がある場合にのみ、SDKコンパクションを使用してください。
compaction_controlパラメータはPython、TypeScript、Ruby SDKで非推奨となっており、将来のバージョンで削除される予定です。有効にすると、SDKは非推奨警告を出力します。ツールランナーでサーバーサイドコンパクションを使用するには、リクエストのcontext_managementパラメータでcompact_20260112編集を渡してください。
コンパクションは、tool_runnerメソッドを使用する際にPython、TypeScript、Ruby SDKで利用可能です。
「compaction」(コンパクション)は、トークン使用量が大きくなりすぎたときに要約を生成することで、会話コンテキストを自動的に管理するSDK機能です。コンテンツをクリアするサーバーサイドのコンテキスト編集戦略とは異なり、コンパクションはClaudeに会話履歴を要約するよう指示し、その要約で履歴全体を置き換えます。これにより、Claudeはコンテキストウィンドウを超えてしまう長時間実行タスクを継続して処理できます。
コンパクションが有効な場合、SDKは各モデルレスポンスの後にトークン使用量を監視します。
input_tokens + cache_creation_input_tokens + cache_read_input_tokens + output_tokensとして計算します。<summary></summary>タグで囲まれた構造化された要約を生成します。tool_runner呼び出しにcompaction_controlを追加して、トークン使用量がしきい値を超えたときに自動要約を有効にします。
会話が進むにつれて、メッセージ履歴が蓄積されます。
コンパクション前(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 | いいえ | デフォルトの要約プロンプトを参照 | 要約生成用のカスタムプロンプト |
しきい値は、コンパクションが発生するタイミングを決定します。しきい値が低いほど、より小さなコンテキストウィンドウでより頻繁にコンパクションが発生します。しきい値が高いほど、より多くのコンテキストが許容されますが、制限に達するリスクがあります。
要約生成には、より高速または安価なモデルを使用できます。
ドメイン固有のニーズに合わせてカスタムプロンプトを提供できます。プロンプトでは、Claudeに要約を<summary></summary>タグで囲むよう指示する必要があります。
組み込みの要約プロンプトは、以下を含む構造化された継続要約を作成するようClaudeに指示します。
この構造により、Claudeは重要なコンテキストを失ったり、間違いを繰り返したりすることなく、効率的に作業を再開できます。
サーバーサイドツールを使用する場合、SDKがトークン使用量を誤って計算し、コンパクションが間違ったタイミングでトリガーされる可能性があります。
たとえば、ウェブ検索操作の後、APIレスポンスは次のように表示される場合があります。
{
"usage": {
"input_tokens": 63000,
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 270000,
"output_tokens": 1400
}
}SDKは合計使用量を63,000 + 0 + 270,000 + 1,400 = 334,400トークンとして計算します。ただし、cache_read_input_tokensの値には、サーバーサイドツールによって行われた複数の内部API呼び出しからの累積読み取りが含まれており、実際の会話コンテキストではありません。実際のコンテキスト長は63,000のinput_tokensのみかもしれませんが、SDKは334kと認識し、コンパクションを早期にトリガーします。
回避策:
ツール使用レスポンスが保留中にSDKがコンパクションをトリガーすると、要約を生成する前にメッセージ履歴からツール使用ブロックが削除されます。Claudeは、まだ必要な場合、要約から再開した後にツール呼び出しを再発行します。
コンパクションがいつトリガーされるかを理解することで、しきい値を調整し、期待される動作を確認できます。
適したユースケース:
あまり適さないユースケース:
response = client.beta.messages.create(
model="claude-opus-4-8",
max_tokens=4096,
messages=[{"role": "user", "content": "Search for recent developments in AI"}],
tools=[{"type": "web_search_20250305", "name": "web_search"}],
betas=["context-management-2025-06-27"],
context_management={"edits": [{"type": "clear_tool_uses_20250919"}]},
)response = client.beta.messages.create(
model="claude-opus-4-8",
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},
],
betas=["context-management-2025-06-27"],
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"],
}
]
},
)response = client.beta.messages.create(
model="claude-opus-4-8",
max_tokens=16000,
messages=[{"role": "user", "content": "Hello"}],
thinking={"type": "adaptive"},
betas=["context-management-2025-06-27"],
context_management={
"edits": [
{
"type": "clear_thinking_20251015",
"keep": {"type": "thinking_turns", "value": 2},
}
]
},
)response = client.beta.messages.create(
model="claude-opus-4-8",
max_tokens=16000,
messages=[{"role": "user", "content": "Hello"}],
thinking={"type": "adaptive"},
betas=["context-management-2025-06-27"],
context_management={
"edits": [
{
"type": "clear_thinking_20251015",
"keep": {"type": "thinking_turns", "value": 3},
}
]
},
)response = client.beta.messages.create(
model="claude-opus-4-8",
max_tokens=16000,
messages=[{"role": "user", "content": "Hello"}],
thinking={"type": "adaptive"},
betas=["context-management-2025-06-27"],
context_management={
"edits": [
{
"type": "clear_thinking_20251015",
"keep": "all",
}
]
},
)response = client.beta.messages.create(
model="claude-opus-4-8",
max_tokens=16000,
messages=[
{
"role": "user",
"content": "Search for the latest developments in quantum error correction and summarize the key breakthroughs.",
}
],
thinking={"type": "adaptive"},
tools=[
{
"type": "web_search_20250305",
"name": "web_search",
"max_uses": 5,
}
],
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},
},
]
},
)
print(response)| ツール呼び出しパラメータをツール結果と一緒にクリアするかどうかを制御します。デフォルトでは、Claudeの元のツール呼び出しを表示したまま、ツール結果のみがクリアされます。 |
response = client.beta.messages.count_tokens(
model="claude-opus-4-8",
messages=[{"role": "user", "content": "Continue our conversation..."}],
betas=["context-management-2025-06-27"],
context_management={
"edits": [
{
"type": "clear_tool_uses_20250919",
"trigger": {"type": "input_tokens", "value": 30000},
"keep": {"type": "tool_uses", "value": 5},
}
]
},
)
print(f"Original tokens: {response.context_management.original_input_tokens}")
print(f"After clearing: {response.input_tokens}")
print(
f"Savings: {response.context_management.original_input_tokens - response.input_tokens} tokens"
)response = client.beta.messages.create(
model="claude-opus-4-8",
max_tokens=4096,
messages=[{"role": "user", "content": "Hello"}],
tools=[{"type": "memory_20250818", "name": "memory"}],
betas=["context-management-2025-06-27"],
context_management={"edits": [{"type": "clear_tool_uses_20250919"}]},
)