Claude API: キャッシュ診断で「どこが変わってキャッシュが外れたか」を特定する
API に診断用のヘッダーと前回のメッセージIDを付けると、キャッシュが外れたときに「モデル/system/tools/messages のどこが最初に変わったか」と、失ったトークン数が返る。Console でも一覧できる。
どんな時に使う?
- 長いプロンプトのエージェントで、料金が想定より高い(キャッシュ読み取りが少ない)
- system プロンプトに時刻を入れる、JSON のキー順が毎回変わる、など見つけにくい原因を探したい
手順
- 毎回のリクエストに beta ヘッダー
cache-diagnosis-2026-04-07を付ける(付けたリクエストだけ比較用に記録される) - 2回目以降は前回レスポンスの
idをdiagnostics.previous_message_idに入れる - レスポンスの
diagnostics.cache_miss_reason.typeを見る:model_changed/system_changed/tools_changed/messages_changed usage.cache_read_input_tokensと組み合わせて判断- 診断 null かつ読み取り多 → 正常
- 診断 null かつ読み取り少 → キャッシュ切れ。間隔を詰めるか 1時間 TTL を使う
*_changedかつ読み取り少 → 自分のバグ。示された箇所を固定する
よくある原因
- system プロンプトの先頭に日時やリクエストごとの値(→ 後ろのメッセージへ移す)
- Go/Swift などで tool_use の JSON キー順がランダム
- 会話履歴の途中を編集・切り詰めた
tool_choice・thinking 設定・effort を途中で変えた
注意点
- 最初に分岐した箇所しか報告されない。直したら次を見る
- 関連: Claude Code: Haiku 5.5 の自動コンパクトを100Kにして安い料金帯に収める / ガイド: モデルと料金プランの選び方(AIコーディング)