「prompt caching」(プロンプトキャッシング)は、プロンプト内の特定のプレフィックスから再開できるようにすることで、APIの使用を最適化します。これにより、繰り返しのタスクや一貫した要素を含むプロンプトの処理時間とコストが大幅に削減されます。
この機能はZero Data Retention(ZDR)の対象です。組織がZDR契約を締結している場合、この機能を通じて送信されたデータは、APIレスポンスが返された後に保存されることはありません。
プロンプトキャッシングを有効にする方法は2つあります。
cache_controlフィールドを追加します。システムは自動的にキャッシュブレークポイントを最後のキャッシュ可能なブロックに適用し、会話が進むにつれてそれを前方に移動させます。増加するメッセージ履歴を自動的にキャッシュすべきマルチターン会話に最適です。cache_controlを配置し、何をキャッシュするかを細かく制御します。最も簡単な開始方法は自動キャッシングです。
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
cache_control={"type": "ephemeral"},
system="You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.",
messages=[
{
"role": "user",
"content": "Analyze the major themes in 'Pride and Prejudice'.",
}
],
)
print(response.usage.model_dump_json())自動キャッシングでは、システムは最後のキャッシュ可能なブロックまでのすべてのコンテンツをキャッシュします。同じプレフィックスを持つ後続のリクエストでは、キャッシュされたコンテンツが自動的に再利用されます。
プロンプトキャッシングを有効にしてリクエストを送信すると、次のように動作します。
これは特に以下の場合に有用です。
デフォルトでは、キャッシュの有効期間は5分です。キャッシュされたコンテンツが使用されるたびに、追加コストなしでキャッシュが更新されます。
5分では短すぎる場合、Anthropicは追加コストで1時間のキャッシュ期間も提供しています。
詳細については、1時間のキャッシュ期間を参照してください。
プロンプトキャッシングはプレフィックス全体をキャッシュします
プロンプトキャッシングは、cache_controlで指定されたブロックまでの、tools、system、messages(この順序で)を含むプロンプト全体を参照します。
プロンプトキャッシングは新しい料金体系を導入します。以下の表は、サポートされている各モデルの100万トークンあたりの価格を示しています。
| モデル | 基本入力トークン | 5分キャッシュ書き込み | 1時間キャッシュ書き込み | キャッシュヒットおよびリフレッシュ | 出力トークン |
|---|---|---|---|---|---|
| Claude Fable 5 | $10 / MTok | $12.50 / MTok | $20 / MTok | $1 / MTok | $50 / MTok |
| Claude Mythos 5(限定提供) | $10 / MTok | $12.50 / MTok | $20 / MTok | $1 / MTok | $50 / MTok |
| Claude Opus 4.8 | $5 / MTok | $6.25 / MTok | $10 / MTok | $0.50 / MTok | $25 / MTok |
| Claude Opus 4.7 | $5 / MTok | $6.25 / MTok | $10 / MTok | $0.50 / MTok | $25 / MTok |
| Claude Opus 4.6 | $5 / MTok | $6.25 / MTok | $10 / MTok | $0.50 / MTok | $25 / MTok |
| Claude Opus 4.5 | $5 / MTok | $6.25 / MTok | $10 / MTok | $0.50 / MTok | $25 / MTok |
| Claude Opus 4.1(非推奨) | $15 / MTok | $18.75 / MTok | $30 / MTok | $1.50 / MTok | $75 / MTok |
| Claude Opus 4(Vertex AIを除き提供終了) | $15 / MTok | $18.75 / MTok | $30 / MTok | $1.50 / MTok | $75 / MTok |
| Claude Sonnet 4.6 | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
| Claude Sonnet 4.5 | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
| Claude Sonnet 4(BedrockおよびVertex AIを除き提供終了) | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
| Claude Haiku 4.5 | $1 / MTok | $1.25 / MTok | $2 / MTok | $0.10 / MTok | $5 / MTok |
| Claude Haiku 3.5(BedrockおよびVertex AIを除き提供終了) | $0.80 / MTok | $1 / MTok | $1.60 / MTok | $0.08 / MTok | $4 / MTok |
上記の表は、プロンプトキャッシングに関する以下の価格乗数を反映しています。
これらの乗数は、Batch API割引やデータレジデンシーなどの他の価格修飾子と重複して適用されます。詳細については料金を参照してください。
プロンプトキャッシング(自動および明示的の両方)は、すべてのアクティブなClaudeモデルでサポートされています。
自動キャッシングは、プロンプトキャッシングを有効にする最も簡単な方法です。個々のコンテンツブロックにcache_controlを配置する代わりに、リクエストボディのトップレベルに単一のcache_controlフィールドを追加します。システムは自動的にキャッシュブレークポイントを最後のキャッシュ可能なブロックに適用します。
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
cache_control={"type": "ephemeral"},
system="You are a helpful assistant that remembers our conversation.",
messages=[
{"role": "user", "content": "My name is Alex. I work on machine learning."},
{
"role": "assistant",
"content": "Nice to meet you, Alex! How can I help with your ML work today?",
},
{"role": "user", "content": "What did I say I work on?"},
],
)
print(response.usage.model_dump_json())自動キャッシングでは、会話が進むにつれてキャッシュポイントが自動的に前方に移動します。新しいリクエストごとに最後のキャッシュ可能なブロックまでのすべてがキャッシュされ、以前のコンテンツはキャッシュから読み取られます。
| リクエスト | コンテンツ | キャッシュの動作 |
|---|---|---|
| リクエスト1 | System + User(1) + Asst(1) + User(2) ◀ キャッシュ | すべてがキャッシュに書き込まれる |
| リクエスト2 | System + User(1) + Asst(1) + User(2) + Asst(2) + User(3) ◀ キャッシュ | SystemからUser(2)まではキャッシュから読み取り、 Asst(2) + User(3)はキャッシュに書き込まれる |
| リクエスト3 | System + User(1) + Asst(1) + User(2) + Asst(2) + User(3) + Asst(3) + User(4) ◀ キャッシュ | SystemからUser(3)まではキャッシュから読み取り、 Asst(3) + User(4)はキャッシュに書き込まれる |
キャッシュブレークポイントは各リクエストで最後のキャッシュ可能なブロックに自動的に移動するため、会話が進んでもcache_controlマーカーを更新する必要はありません。
デフォルトでは、自動キャッシングは5分のTTLを使用します。基本入力トークン価格の2倍で1時間のTTLを指定できます。
{ "cache_control": { "type": "ephemeral", "ttl": "1h" } }自動キャッシングは明示的なキャッシュブレークポイントと互換性があります。併用する場合、自動キャッシュブレークポイントは利用可能な4つのブレークポイントスロットのうち1つを使用します。
これにより、両方のアプローチを組み合わせることができます。たとえば、明示的なブレークポイントを使用してシステムプロンプトをキャッシュし、自動キャッシングで会話を処理します。
{
"model": "claude-opus-4-8",
"max_tokens": 1024,
"cache_control": { "type": "ephemeral" },
"system": [
{
"type": "text",
"text": "You are a helpful assistant.",
"cache_control": { "type": "ephemeral" }
}
],
"messages": [{ "role": "user", "content": "What are the key terms?" }]
}自動キャッシングは同じ基盤のキャッシングインフラストラクチャを使用します。料金、最小トークンしきい値、コンテキスト順序の要件、および20ブロックのルックバックウィンドウはすべて、明示的なブレークポイントと同様に適用されます。
cache_controlがある場合、自動キャッシングは何も行いません。cache_controlがある場合、APIは400エラーを返します。自動キャッシングは、Claude API、Claude Platform on AWS、およびMicrosoft Foundry(ベータ版)で利用可能です。BedrockおよびVertex AIは自動キャッシングをサポートしていません。
キャッシングをより細かく制御するには、個々のコンテンツブロックに直接cache_controlを配置できます。これは、異なる頻度で変更される異なるセクションをキャッシュする必要がある場合や、何をキャッシュするかを正確に制御する必要がある場合に便利です。
静的コンテンツ(ツール定義、システム指示、コンテキスト、例)をプロンプトの先頭に配置します。cache_controlパラメータを使用して、キャッシング用の再利用可能なコンテンツの末尾をマークします。
キャッシュプレフィックスは、tools、system、messagesの順に作成されます。この順序は階層を形成し、各レベルは前のレベルの上に構築されます。
静的コンテンツの末尾にキャッシュブレークポイントを1つだけ使用すると、システムは以前のリクエストがすでにキャッシュに書き込んだ最長のプレフィックスを自動的に見つけます。この仕組みを理解することで、キャッシング戦略を最適化できます。
3つの基本原則:
キャッシュ書き込みはブレークポイントでのみ発生します。 ブロックにcache_controlをマークすると、そのブロックで終わるプレフィックスのハッシュという、正確に1つのキャッシュエントリが書き込まれます。システムはそれより前の位置にはエントリを書き込みません。ハッシュは累積的であり、ブレークポイントまでのすべてを含むため、ブレークポイント以前のいずれかのブロックを変更すると、次のリクエストで異なるハッシュが生成されます。
キャッシュ読み取りは、以前のリクエストが書き込んだエントリを後方に探します。 各リクエストで、システムはブレークポイントでのプレフィックスハッシュを計算し、一致するキャッシュエントリを確認します。存在しない場合は、1ブロックずつ後方に遡り、各位置でのプレフィックスハッシュがすでにキャッシュにあるものと一致するかどうかを確認します。これは以前の書き込みを探しているのであり、安定したコンテンツを探しているのではありません。
ルックバックウィンドウは20ブロックです。 システムはブレークポイントごとに最大20の位置を確認し、ブレークポイント自体を最初の位置としてカウントします。そのウィンドウ内で一致するエントリが見つからない場合、チェックは停止します(または、次の明示的なブレークポイントがあればそこから再開します)。
例:増加する会話でのルックバック
各ターンで新しいブロックを追加し、各リクエストの最後のブロックにcache_controlを設定します。
よくある間違い:リクエストごとに変更されるコンテンツにブレークポイントを配置する
プロンプトに大きな静的システムコンテキスト(ブロック1から5)があり、その後にタイムスタンプとユーザーメッセージを含むリクエストごとのブロック(ブロック6)が続きます。ブロック6にcache_controlを設定します。
ルックバックは、ブレークポイントの背後にある安定したコンテンツを見つけてキャッシュするわけではありません。以前のリクエストがすでに書き込んだエントリを見つけるのであり、書き込みはブレークポイントでのみ発生します。cache_controlをブロック5(リクエスト間で同じままである最後のブロック)に移動すると、後続のすべてのリクエストがキャッシュされたプレフィックスを読み取ります。自動キャッシングも同じ罠に陥ります。自動キャッシングはブレークポイントを最後のキャッシュ可能なブロックに配置しますが、この構造ではそれがリクエストごとに変更されるブロックであるため、代わりにブロック5に明示的なブレークポイントを使用してください。
重要なポイント: キャッシュを共有したいリクエスト間でプレフィックスが同一である最後のブロックにcache_controlを配置します。増加する会話では、各ターンで追加されるブロックが20未満である限り、最後のブロックで機能します。以前のコンテンツは変更されないため、次のリクエストのルックバックが以前の書き込みを見つけます。変化するサフィックス(タイムスタンプ、リクエストごとのコンテキスト、受信メッセージ)を持つプロンプトの場合は、変化するブロックではなく、静的プレフィックスの末尾にブレークポイントを配置します。
以下の場合、最大4つのキャッシュブレークポイントを定義できます。
重要な制限: ルックバックは、以前のリクエストがすでに書き込んだエントリのみを見つけることができます。増加する会話によってブレークポイントが最後の書き込みから20ブロック以上離れると、ルックバックウィンドウはそれを見逃します。必要になる前にそこに書き込みが蓄積されるように、最初からその位置に近い2つ目のブレークポイントを追加してください。
キャッシュブレークポイント自体はコストを追加しません。 課金されるのは以下のみです。
cache_controlブレークポイントを追加してもコストは増加しません。実際にキャッシュされ読み取られたコンテンツに基づいて同じ金額を支払います。ブレークポイントは、どのセクションを独立してキャッシュできるかを制御するだけです。
Claude API、Claude Platform on AWS、Vertex AI、およびMicrosoft Foundry(ベータ版)では、キャッシュ可能なプロンプトの最小長は以下のとおりです。
モデルの利用可能性はプラットフォームによって異なり、新しくリリースされたモデルの最小値も異なる場合があります。Amazon Bedrockでは、Claude Fable 5およびClaude Mythos 5のキャッシュ可能なプロンプトの最小長は1,024トークンです。
これより短いプロンプトは、cache_controlでマークされていてもキャッシュできません。このトークン数未満をキャッシュするリクエストはキャッシングなしで処理され、エラーは返されません。プロンプトがキャッシュされたかどうかを確認するには、レスポンスのusageフィールドを確認してください。cache_creation_input_tokensとcache_read_input_tokensの両方が0の場合、プロンプトはキャッシュされていません(おそらく最小長の要件を満たしていないため)。
プロンプトがモデルとプラットフォームの最小値にわずかに届かない場合、しきい値に達するようにキャッシュされるコンテンツを拡張することは多くの場合価値があります。キャッシュ読み取りはキャッシュされていない入力トークンよりも大幅にコストが低いため、最小値に達することで頻繁に再利用されるプロンプトのコストを削減できます。
BedrockはAWSが運営するプラットフォームです。Bedrockでは、適用されるモデルごとの最小値、失敗時の動作、およびusageフィールド名について、Bedrockプロンプトキャッシングのドキュメントを参照してください。
同時リクエストについては、キャッシュエントリは最初のレスポンスが開始された後にのみ利用可能になることに注意してください。並列リクエストでキャッシュヒットが必要な場合は、最初のレスポンスを待ってから後続のリクエストを送信してください。
現在、「ephemeral」が唯一サポートされているキャッシュタイプであり、デフォルトで5分の有効期間があります。
リクエスト内のほとんどのブロックをキャッシュできます。これには以下が含まれます。
tools配列内のツール定義system配列内のコンテンツブロックmessages.content配列内のコンテンツブロックmessages.content配列内のコンテンツブロックmessages.content配列内のコンテンツブロックこれらの各要素は、自動的に、またはcache_controlでマークすることでキャッシュできます。
ほとんどのリクエストブロックはキャッシュできますが、いくつかの例外があります。
思考ブロックはcache_controlで直接キャッシュできません。ただし、思考ブロックは以前のアシスタントターンに表示される場合、他のコンテンツと一緒にキャッシュできます。この方法でキャッシュされた場合、キャッシュから読み取られるときに入力トークンとしてカウントされます。
サブコンテンツブロック(引用など)自体は直接キャッシュできません。代わりに、トップレベルのブロックをキャッシュします。
引用の場合、引用のソース資料として機能するトップレベルのドキュメントコンテンツブロックをキャッシュできます。これにより、引用が参照するドキュメントをキャッシュすることで、引用とプロンプトキャッシングを効果的に使用できます。
空のテキストブロックはキャッシュできません。
キャッシュされたコンテンツへの変更は、キャッシュの一部またはすべてを無効化する可能性があります。
プロンプトの構造化で説明したように、キャッシュはtools → system → messagesの階層に従います。各レベルでの変更は、そのレベルとそれ以降のすべてのレベルを無効化します。
以下の表は、さまざまな種類の変更によってキャッシュのどの部分が無効化されるかを示しています。✘はキャッシュが無効化されることを示し、✓はキャッシュが有効なままであることを示します。
| 変更内容 | ツールキャッシュ | システムキャッシュ | メッセージキャッシュ | 影響 |
|---|---|---|---|---|
| ツール定義 | ✘ | ✘ | ✘ | ツール定義(名前、説明、パラメータ)の変更はキャッシュ全体を無効化します |
| ウェブ検索の切り替え | ✓ | ✘ | ✘ | ウェブ検索の有効化/無効化はシステムプロンプトを変更します |
| 引用の切り替え | ✓ | ✘ | ✘ | 引用の有効化/無効化はシステムプロンプトを変更します |
| 速度設定 | ✓ | ✘ | ✘ | speed: "fast"と標準速度の切り替えはシステムおよびメッセージキャッシュを無効化します |
| ツール選択 | ✓ | ✓ | ✘ | tool_choiceパラメータの変更はメッセージブロックのみに影響します |
| 画像 | ✓ | ✓ | ✘ | プロンプト内のどこかで画像を追加/削除するとメッセージブロックに影響します |
| 思考パラメータ | ✓ | ✓ | ✘ | 拡張思考設定(有効化/無効化、バジェット)の変更はメッセージブロックに影響します |
| 拡張思考リクエストに渡される非ツール結果 | ✓ | ✓ | モデルによる | Opus 4.5以降およびSonnet 4.6以降では、思考ブロックはデフォルトで保持されるため、キャッシュは有効なままです(✓)。それ以前のOpus/SonnetモデルおよびすべてのHaikuモデルでは、以前にキャッシュされたすべての思考ブロックがコンテキストから削除され、それらの思考ブロックに続くメッセージはキャッシュから削除されます(✘)。詳細については、思考ブロックを使用したキャッシングを参照してください。 |
Claude Opus 4.8では、システムまたはメッセージキャッシュを無効化することなく、会話の途中で新しいシステム指示を追加できます。トップレベルのsystemフィールドを編集する代わりに、{"role": "system"}メッセージをmessagesに追加することで、キャッシュされたプレフィックスが変更されないままになります。会話途中のシステムメッセージを参照してください。
レスポンス内のusage(またはストリーミングの場合はmessage_startイベント)にある以下のAPIレスポンスフィールドを使用して、キャッシュパフォーマンスを監視します。
cache_creation_input_tokens:新しいエントリを作成するときにキャッシュに書き込まれたトークン数。cache_read_input_tokens:このリクエストでキャッシュから取得されたトークン数。input_tokens:キャッシュから読み取られなかった、またはキャッシュの作成に使用されなかった入力トークン数(つまり、最後のキャッシュブレークポイント以降のトークン)。トークン内訳の理解
input_tokensフィールドは、リクエスト内の最後のキャッシュブレークポイント以降のトークンのみを表し、送信したすべての入力トークンではありません。
合計入力トークンを計算するには:
total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens空間的な説明:
cache_read_input_tokens = ブレークポイント前のすでにキャッシュされているトークン(読み取り)cache_creation_input_tokens = ブレークポイント前の現在キャッシュされているトークン(書き込み)input_tokens = 最後のブレークポイント以降のトークン(キャッシュ対象外)例: キャッシュされたコンテンツ(キャッシュから読み取り)が100,000トークン、新たにキャッシュされるコンテンツが0トークン、ユーザーメッセージ(キャッシュブレークポイント以降)が50トークンのリクエストの場合:
cache_read_input_tokens:100,000cache_creation_input_tokens:0input_tokens:50これはコストとレート制限の両方を理解するために重要です。キャッシングを効果的に使用している場合、input_tokensは通常、合計入力よりもはるかに小さくなります。
拡張思考をプロンプトキャッシングと併用する場合、思考ブロックには特別な動作があります。
他のコンテンツと一緒に自動キャッシング:思考ブロックは明示的にcache_controlでマークできませんが、ツール結果を含む後続のAPI呼び出しを行うと、リクエストコンテンツの一部としてキャッシュされます。これは、会話を続けるために思考ブロックを返すツール使用中によく発生します。
入力トークンのカウント:思考ブロックがキャッシュから読み取られると、使用量メトリクスで入力トークンとしてカウントされます。これはコスト計算とトークンバジェットにとって重要です。
キャッシュ無効化パターン:
cache_controlマーカーがなくても発生しますキャッシュ無効化の詳細については、キャッシュを無効化するものを参照してください。
ツール使用の例:
Request 1: User: "What's the weather in Paris?"
Response: [thinking_block_1] + [tool_use block 1]
Request 2:
User: ["What's the weather in Paris?"],
Assistant: [thinking_block_1] + [tool_use block 1],
User: [tool_result_1, cache=True]
Response: [thinking_block_2] + [text block 2]
# Request 2 caches its request content (not the response)
# The cache includes: user message, thinking_block_1, tool_use block 1, and tool_result_1
Request 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]
# On earlier Opus/Sonnet and all Haiku models, non-tool-result user block causes prior thinking blocks to be stripped; on Opus 4.5+/Sonnet 4.6+ they are keptそれ以前のOpus/SonnetモデルおよびすべてのHaikuモデルでは、この時点で以前のすべての思考ブロックがコンテキストから削除されます。Opus 4.5以降およびSonnet 4.6以降では、以前の思考ブロックはデフォルトで保持され、キャッシュされたプレフィックスの一部として残ります。
より詳細な情報については、拡張思考のドキュメントを参照してください。
2026年2月5日以降、プロンプトキャッシングは組織レベルの分離ではなくワークスペースレベルの分離を使用します。キャッシュはワークスペースごとに分離され、同じ組織内のワークスペース間でのデータ分離が確保されます。これはClaude API、Claude Platform on AWS、およびMicrosoft Foundry(ベータ版)に適用されます。BedrockおよびVertex AIは組織レベルのキャッシュ分離を維持します。複数のワークスペースを使用している場合は、この違いを考慮してキャッシング戦略を見直してください。
組織およびワークスペースの分離: キャッシュは組織間で分離されます。異なる組織は、同一のプロンプトを使用してもキャッシュを共有することはありません。2026年2月5日以降、Claude API、Claude Platform on AWS、およびMicrosoft Foundry(ベータ版)では、組織内のワークスペースごとにもキャッシュが分離されます。BedrockおよびVertex AIは引き続き組織レベルの分離のみを使用します。
完全一致: キャッシュヒットには、cache controlでマークされたブロックまでのすべてのテキストと画像を含む、100%同一のプロンプトセグメントが必要です。
出力トークン生成: プロンプトキャッシングは出力トークン生成に影響しません。受け取るレスポンスは、プロンプトキャッシングが使用されていない場合と同一です。
プロンプトキャッシングのパフォーマンスを最適化するには:
シナリオに合わせてプロンプトキャッシング戦略を調整します。
予期しない動作が発生した場合:
キャッシュ診断(ベータ版)では、APIが連続するリクエストを比較し、プロンプトプレフィックスがどこで分岐したかを正確に報告するため、このリストの多くの手順を自動的に処理します。
cache_controlマーカーが同じ位置にあることを確認しますtool_choiceと画像の使用が呼び出し間で一貫していることを確認しますtool_useコンテンツブロック内のキーの順序が安定していることを確認しますtool_choiceの変更、またはプロンプト内のどこかでの画像の有無の変更は、キャッシュを無効化し、新しいキャッシュエントリの作成が必要になります。キャッシュ無効化の詳細については、キャッシュを無効化するものを参照してください。
5分では短すぎる場合、Anthropicは追加コストで1時間のキャッシュ期間も提供しています。
1時間のキャッシュ期間は、Claude API、Claude Platform on AWS、Amazon Bedrock、Amazon Bedrock(レガシー)、Vertex AI、およびMicrosoft Foundry(ベータ版)で利用可能です。
拡張キャッシュを使用するには、次のようにcache_control定義にttlを含めます。
"cache_control": {
"type": "ephemeral",
"ttl": "1h"
}レスポンスには、次のような詳細なキャッシュ情報が含まれます。
{
"usage": {
"input_tokens": 2048,
"cache_read_input_tokens": 1800,
"cache_creation_input_tokens": 248,
"output_tokens": 503,
"cache_creation": {
"ephemeral_5m_input_tokens": 148,
"ephemeral_1h_input_tokens": 100
}
}
}現在のcache_creation_input_tokensフィールドは、cache_creationオブジェクト内の値の合計に等しいことに注意してください。
ウェブ検索などのサーバーツールを使用中に、リクエストしていないephemeral_5m_input_tokensの書き込みが表示される場合は、プロンプトキャッシングとツール使用に関するこのガイドを参照してください。
定期的に使用されるプロンプト(つまり、5分ごとよりも頻繁に使用されるシステムプロンプト)がある場合は、追加料金なしで更新され続けるため、5分キャッシュを引き続き使用してください。
1時間キャッシュは、以下のシナリオで最適に使用されます。
5分キャッシュと1時間キャッシュは、レイテンシに関して同じように動作します。長いドキュメントでは、一般的に最初のトークンまでの時間が改善されます。
同じリクエストで1時間と5分の両方のキャッシュコントロールを使用できますが、重要な制約があります。より長いTTLを持つキャッシュエントリは、より短いTTLの前に表示される必要があります(つまり、1時間キャッシュエントリは5分キャッシュエントリの前に表示される必要があります)。
TTLを混在させる場合、APIはプロンプト内の3つの課金位置を決定します。
A:最も高いキャッシュヒットでのトークン数(ヒットがない場合は0)。B:Aの後の最も高い1時間cache_controlブロックでのトークン数(存在しない場合はAと等しい)。C:最後のcache_controlブロックでのトークン数。Bおよび/またはCがAより大きい場合、Aが最も高いキャッシュヒットであるため、それらは必然的にキャッシュミスになります。
以下が課金されます。
Aのキャッシュ読み取りトークン。(B - A)の1時間キャッシュ書き込みトークン。(C - B)の5分キャッシュ書き込みトークン。以下に3つの例を示します。これは3つのリクエストの入力トークンを示しており、それぞれ異なるキャッシュヒットとキャッシュミスがあります。その結果、色付きのボックスに示されているように、それぞれ異なる計算価格になります。
キャッシュのプリウォーミングにより、ユーザーが実際のリクエストをトリガーする前に、システムプロンプトまたはツール定義をプロンプトキャッシュにロードできます。これにより、最初のユーザーインタラクションでのキャッシュミスによるレイテンシペナルティが排除され、レイテンシに敏感なアプリケーションの「time-to-first-token」(最初のトークンまでの時間)、すなわちTTFTが短縮されます。
リクエストでmax_tokens: 0を設定します。APIはプロンプトをモデルに読み込み、任意のcache_controlブレークポイントでキャッシュを書き込み、出力を生成せずにすぐに返します。レスポンスには空のcontent配列、stop_reason: "max_tokens"、および完全に入力されたusageブロックが含まれます。
cache_controlブレークポイントは、プレースホルダーのユーザーメッセージではなく、フォローアップリクエストと共有される最後のブロック(通常はシステムプロンプトまたはツール定義)に配置します。そうしないと、キャッシュエントリがプレースホルダーにキー付けされ、フォローアップリクエストがヒットしません。これは、自動キャッシングではなく明示的なキャッシュブレークポイントを使用することを意味します。自動キャッシングはブレークポイントを最後のブロックに配置しますが、ここではそれがプレースホルダーだからです。プレースホルダーのユーザーメッセージは、空白以外のコンテンツを含む任意の文字列にできます(ここでの例では"warmup"を使用しています)。そのコンテンツはモデルに読み込まれますが、応答されることはありません。
プリウォームリクエストは、プレフィックスがまだキャッシュされていない場合、他のリクエストと同様にキャッシュ書き込み料金が発生します。レスポンスのusage.cache_creation_input_tokensを確認して、書き込みが発生したことを確認してください。出力トークンは0として課金されます。
client = anthropic.Anthropic()
# ユーザーが到着する前にこれを実行し、共有システムプロンプトのキャッシュをウォームアップします。
prewarm = client.messages.create(
model="claude-opus-4-8",
max_tokens=0,
system=[
{
"type": "text",
"text": "You are an expert software engineer with deep knowledge of distributed systems...",
"cache_control": {"type": "ephemeral"},
}
],
messages=[{"role": "user", "content": "warmup"}],
)
print(prewarm.stop_reason) # "max_tokens"
print(prewarm.content) # []
print(prewarm.usage)APIは空のcontent配列を返します。
{
"id": "msg_01XFDUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"content": [],
"model": "claude-opus-4-8",
"stop_reason": "max_tokens",
"stop_sequence": null,
"usage": {
"input_tokens": 8,
"cache_creation_input_tokens": 5120,
"cache_read_input_tokens": 0,
"cache_creation": {
"ephemeral_5m_input_tokens": 5120,
"ephemeral_1h_input_tokens": 0
},
"iterations": [
{
"input_tokens": 8,
"output_tokens": 0,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 5120,
"cache_creation": {
"ephemeral_5m_input_tokens": 5120,
"ephemeral_1h_input_tokens": 0
},
"type": "message"
}
],
"output_tokens": 0,
"service_tier": "standard",
"inference_geo": "global"
}
}アプリケーションの起動時(またはスケジュールされた間隔で)にプリウォームリクエストを発行し、プリウォームが完了した後に実際のユーザーリクエストを送信します。
client = anthropic.Anthropic()
SYSTEM_PROMPT = [
{
"type": "text",
"text": "You are an expert software engineer with deep knowledge of distributed systems...",
"cache_control": {"type": "ephemeral"},
}
]
def prewarm_cache() -> None:
"""Call this at application startup or on a scheduled interval."""
client.messages.create(
model="claude-opus-4-8",
max_tokens=0,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": "warmup"}],
)
def respond(user_message: str) -> anthropic.types.Message:
"""The real user request; benefits from a warm cache."""
return client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": user_message}],
)
# ユーザートラフィックが到着する前にキャッシュをウォームアップします。
prewarm_cache()
# その後、ユーザーがメッセージを送信する時点で、システムプロンプトのプレフィックスはすでにキャッシュされています。
response = respond("How do I implement a binary search tree?")
print(response.content[0].text)キャッシュTTLは引き続き適用されることに注意してください。デフォルトの5分キャッシュの場合、キャッシュをウォームに保つために少なくとも5分ごとに新しいプリウォームリクエストを送信してください。ユーザーリクエスト間の間隔が長い場合は、代わりに1時間のキャッシュ期間を使用してください。
max_tokens: 0 リクエストは、以下のいずれかが設定されている場合、invalid_request_error で拒否されます。これらはいずれも、ゼロトークンの予算では生成できない出力を前提としているためです。
stream: truethinking.type: "enabled")output_config.format){"type": "tool", ...} または {"type": "any"} の tool_choicemax_tokens: 0 は、Message Batches リクエスト内でも拒否されます。事前ウォームアップは最初のトークンまでの時間を対象としており、これはバッチ処理には適用されません。また、バッチ処理中に書き込まれたキャッシュエントリは、後続のリクエストが実行される前に期限切れになる可能性が高いためです。
max_tokens: 0 が利用可能になる前は、一部のアプリケーションでは同じ効果を得るために max_tokens: 1 のウォームアップ呼び出しを使用していました。max_tokens: 0 のアプローチが推奨されます。出力が生成されないため、破棄すべき単一トークンの応答がなく、出力トークンに対する課金も発生せず、リクエストの意図が明確になります。
プロンプトキャッシングを始めるにあたって、プロンプトキャッシングのクックブックでは詳細な例とベストプラクティスを提供しています。
以下のコードスニペットは、さまざまなプロンプトキャッシングのパターンを示しています。これらの例は、さまざまなシナリオでキャッシングを実装する方法を示しており、この機能の実用的な応用を理解するのに役立ちます。
プロンプトキャッシング(自動および明示的の両方)はZDR対象です。Anthropicは、プロンプトの生テキストやClaudeの応答を保存しません。
KV(キーバリュー)キャッシュ表現とキャッシュされたコンテンツの暗号化ハッシュはメモリ内にのみ保持され、永続的に保存されることはありません。キャッシュされたエントリの最小有効期間は5分(標準)または1時間(拡張)であり、その後は速やかに(ただし即座にではなく)削除されます。キャッシュエントリは組織間で分離されており、Claude API、Claude Platform on AWS、およびMicrosoft Foundry(ベータ版)では、組織内のワークスペース間でも分離されています。
すべての機能におけるZDR対象については、APIとデータ保持を参照してください。
Was this page helpful?