できること
分岐箇所の特定
前のレスポンスの id を previous_message_id として渡すと、プロンプトキャッシュのプレフィックスが前のターンとどこで分岐したかを API が返します。分岐先はモデル・system プロンプト・tools・メッセージ履歴のいずれかとして示されます。
原因の種類と影響の目安
model_changed・system_changed・tools_changed・messages_changed などの種類で原因を示します。*_changed の 4 種類には、分岐点より後ろの入力トークン数の推定値 cache_missed_input_tokens が付きます。
usage との併用
diagnostics は「リクエストが変わったか」を、usage.cache_read_input_tokens は「キャッシュがヒットしたか」を示します。両方を合わせて見ると、どこを調べるべきかが分かります。
機能解説
概要
Messages リクエストに diagnostics オブジェクトを含めると利用できます。プロンプトキャッシュが前のターンと一致しなかった原因を調べる場面に関わる機能です。
仕組み
diagnostics オブジェクトを含むリクエストごとに、API はレスポンスの id をキーにした軽量なフィンガープリントを保存します。オブジェクトを含まないリクエストについては何も保存しません。
次のリクエストが届くと、API はそのリクエストのフィンガープリントを作り直して保存済みのものと比較し、最初に分岐した箇所を説明する diagnostics オブジェクトをレスポンスに付けます。比較の対象はリクエストの構造で、実際にキャッシュがヒットしたかどうかとは独立しています。
POST /v1/messagesのレスポンスには常にdiagnosticsフィールドが含まれ、リクエストにdiagnosticsオブジェクトが無い場合はnullになります。- ストリーミングのレスポンスでは、
diagnosticsはmessage_startイベントに含まれます。 - 診断がリクエストをブロックしたり失敗させたりすることはありません。
レスポンスの読み方
diagnostics の値と cache_miss_reason の種類は次のとおりです。
diagnosticsがnull:リクエストにdiagnosticsオブジェクトが無い、previous_message_idがnullだった (最初のターン)、または比較を行い分岐が見つからなかった、のいずれかです。{"cache_miss_reason": null}:レスポンスの組み立て時点で比較がまだ終わっていなかった状態です。結論が出ていないものとして扱い、次のターンで確認します。model_changed:前のリクエストとモデルが異なります。ルーター、A/B テスト、フォールバックが別のモデルを選んだ場合などが該当します。キャッシュはモデルごとです。system_changed:systemパラメーターが異なります。タイムスタンプやリクエスト ID など、リクエストごとに変わる値が system プロンプトに埋め込まれている場合が典型です。tools_changed:tools配列が異なります。ターン間でツールが追加・削除・並べ替えされた場合や、ツールのinput_schemaの JSON が決定的でない形で直列化された場合です。messages_changed:モデル・system・tools は一致していますが、messagesの前のほうのエントリが末尾への追加ではなく、変更・並べ替え・削除されています。previous_message_not_found:指定したprevious_message_idに対応するフィンガープリントが保存されていません。リクエストが変わったことを示すものではありません。unavailable:このリクエストでは診断情報を得られませんでした。リクエスト自体は通常どおり処理されます。
レスポンスが示すのは最も早い分岐だけです。後ろの分岐がその陰に隠れている場合があるため、最初の分岐から先に直します。cache_missed_input_tokens はトークン化前のバイト長から求めた推定値で、失われたキャッシュ可能なプレフィックスの規模の目安です。課金の数値としては扱いません。
制限事項
- 比較するには、前のリクエストが同じ organization と workspace で実行されている必要があります。
previous_message_idの参照に使うフィンガープリントは短い期間で期限が切れます。診断の比較は、間隔の近いリクエストの間で行います。- 非常に長い会話で、変更がメッセージ一覧の深い位置にしか無い場合、正確な位置ではなく
unavailableが返る場合があります。 - ベータヘッダーだけを送り
diagnosticsオブジェクトを含めないリクエストは受け付けられますが、フィンガープリントは保存されません。後のターンでそのリクエストをprevious_message_idに指定するとprevious_message_not_foundが返ります。
管理者・導入時に確認したい点
この機能のデータの扱いは次のとおりです。
- フィンガープリントに含まれるのはハッシュとトークン数の推定値だけで、プロンプトの生の内容は含まれません。
- フィンガープリントの保持は限られた期間で、organization と workspace の範囲に限定され、ほかの目的には使われません。
- Anthropic は、この機能のためにプロンプトや Claude の出力の生のテキストを保存しません。
- フィンガープリントが保存されるのは、
diagnosticsオブジェクトを含むリクエストだけです。
使い方
cache-diagnosis-2026-04-07 ベータヘッダーは現在不要で、diagnostics オブジェクトを含めることが利用の申し込み (オプトイン) になります。
- Messages リクエストのすべてのターンに
diagnosticsオブジェクトを含めます。API がフィンガープリントを保存するのは、このオブジェクトを含むリクエストだけです。 - 最初のターンでは
"previous_message_id": nullを渡します。比較対象の前のメッセージが無い状態でオプトインします。 - 2 ターン目以降は、直前のレスポンスの
idをprevious_message_idとして渡します。複数ターンの会話では、最新のレスポンスのidを毎ターン引き継ぎます。
利用シーン
usage.cache_read_input_tokens が想定より少ないときに、system プロンプトへリクエストごとに変わる値が埋め込まれていないかを確かめる場面に向いています。
ルーターや A/B テスト、フォールバックの仕組みによって、ターンの途中で別のモデルが選ばれていないかを確認する場面に使えます。
ツール定義を組み立てるコードで、tools 配列の順序や input_schema の直列化がターンごとに変わっていないかを調べる場面に使えます。
会話履歴を加工するアプリケーションで、過去のメッセージを書き換え・並べ替え・削除していないかを確認する場面に向いています。
ChatGPT・OpenAI の対応する機能
比較の単位となる業務: プロンプトキャッシュのミス原因の診断
OpenAI API プラットフォームの Prompt Caching ダッシュボードでは、キャッシュヒット率の推移、書き込みあたりの読み取り数、キャッシュ読み取り・書き込み・非キャッシュのトークン内訳を確認できます。
Cache diagnostics は、個々の Messages リクエストを前のリクエストと比較し、モデル・system プロンプト・tools・メッセージ履歴のどこで最初に分岐したかを API のレスポンスで返します。前者は利用状況を集計して見る仕組み、後者はリクエスト単位で分岐箇所を示す仕組みです。
これまでの変更
Claude API でベータを終了し、ベータヘッダーが不要になりました。ヘッダーを送り続けるリクエストも従来どおり動作します。
ベータヘッダーを送ったリクエストへのレスポンスに、常に
diagnosticsフィールドが含まれるようになりました。フィンガープリントの保存が、
diagnosticsオブジェクトを含むリクエストに限られました。すべてのターンでdiagnosticsを含め、最初のターンでは"previous_message_id": nullを指定します。キャッシュ診断がベータとして提供開始されました。利用には
cache-diagnosis-2026-04-07ベータヘッダーが必要でした。
対象プランについては、公式のリリースノートには記載がありません。