Was this page helpful?
ほとんどのユースケースでは、サーバーサイドコンパクションが長時間実行される会話のコンテキスト管理における主要な戦略です。このページの戦略は、クリアするコンテンツをより細かく制御する必要がある特定のシナリオに役立ちます。
コンテキスト編集を使用すると、会話履歴が増大するにつれて特定のコンテンツを選択的にクリアできます。これにより、コストを最適化し、コンテキストウィンドウの制限内に収めることができます。このページでは以下を説明します:
| アプローチ | 実行場所 | 戦略 | 仕組み |
|---|---|---|---|
| サーバーサイド | 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 戦略は、会話コンテキストが設定したしきい値を超えた場合にツール結果をクリアします。これは、ツールを多用するエージェントワークフローに特に有用です。古いツール結果(ファイルの内容や検索結果など)は、Claudeが処理した後は不要になります。
有効化されると、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-6)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 戦略は 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": [
// `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": [...]
}
}トークンカウントエンドポイントはコンテキスト管理をサポートしており、コンテキスト編集が適用された後のプロンプトのトークン使用量をプレビューできます。
{
"input_tokens": 25000,
"context_management": {
"original_input_tokens": 70000
}
}レスポンスには、コンテキスト管理が適用された後の最終トークン数(input_tokens)と、クリアが行われる前の元のトークン数(original_input_tokens)の両方が表示されます。
コンテキスト編集はメモリツールと組み合わせることができます。会話コンテキストが設定されたクリアしきい値に近づくと、Claudeは重要な情報を保存するための自動警告を受け取ります。これにより、Claudeはツール結果やコンテキストが会話履歴からクリアされる前に、メモリファイルに保存できます。
この組み合わせにより、以下が可能になります:
例えば、Claudeが多くの操作を実行するファイル編集ワークフローでは、コンテキストが増大するにつれて、Claudeは完了した変更をメモリファイルに要約できます。ツール結果がクリアされても、Claudeはメモリシステムを通じてその情報にアクセスでき、効果的に作業を続けることができます。
両方の機能を一緒に使用するには、APIリクエストで有効にします:
SDKコンパクションよりもサーバーサイドコンパクションが推奨されます。 サーバーサイドコンパクションは、統合の複雑さが少なく、トークン使用量の計算が優れ、クライアントサイドの制限がなく、コンテキスト管理を自動的に処理します。SDKコンパクションは、要約プロセスのクライアントサイド制御が特に必要な場合にのみ使用してください。
コンパクションは、tool_runner メソッド使用時にPythonおよびTypeScript SDKで利用可能です。
コンパクションは、トークン使用量が大きくなりすぎた場合に要約を生成して会話コンテキストを自動的に管理する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回 ...
]トークンがしきい値を超えると、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 | いいえ | 以下を参照 | 要約生成用のカスタムプロンプト |
しきい値はコンパクションが発生するタイミングを決定します。低いしきい値はより頻繁なコンパクションとより小さなコンテキストウィンドウを意味します。高いしきい値はより多くのコンテキストを許容しますが、制限に達するリスクがあります。
# メモリ制約のあるシナリオ向けのより頻繁なコンパクション
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は重要なコンテキストを失ったり、ミスを繰り返したりすることなく、効率的に作業を再開できます。
サーバーサイドツールを使用する場合、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)
# ログには以下が表示されます:
# 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-opus-4-6",
"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-opus-4-6",
"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-opus-4-6",
"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-opus-4-6",
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
}
}
]
}
)| ツール呼び出しパラメータがツール結果と一緒にクリアされるかどうかを制御します。デフォルトでは、Claudeの元のツール呼び出しを表示したまま、ツール結果のみがクリアされます。 |
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-opus-4-6",
"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-opus-4-6",
max_tokens=4096,
messages=[...],
tools=[
{
"type": "memory_20250818",
"name": "memory"
},
# その他のツール
],
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-opus-4-6",
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()