/model でモデルを切り替えるのは一瞬です。キャッシュが温かいうちなら確認も出ます(2.1.238以降)。では、そこで何を捨てているのか。
Claude Code 2.1.251 でプロンプトキャッシュが数字で見えるようになったので、測ってみました。
同じセッションを継続 書き直し 197 トークン
sonnet に切り替えた 書き直し 56,584 トークン ← 287倍
sonnet のまま継続 書き直し 149 トークン
opus に戻した 書き直し 67 トークン ← 帰りは安い
検証環境: Windows 10 / Claude Code 2.1.251 / 測定は 2026-09-01 時点
何が見えるようになったか
2.1.251(8/28)から、/usage に Prompt cache (main) 行が出ます。ヒット率、ミス数、いま warm かどうか。statusline からも prompt_cache で同じ数字が読めます。
なお /cost と /usage は同じ画面でした。 changelog は「/cost に追加した」、ドキュメントは「/usage を実行する」と書いています。-p で両方叩いたら出力が1文字も違いません(ただし -p で出るのはプラン使用量の画面で、Prompt cache (main) 行は対話セッションでないと出ません)。
自分で測るなら --output-format json が早いです。
claude -p "hi" --resume <セッションID> --output-format json
見るのは cache_read_input_tokens(読めた分)と cache_creation_input_tokens(書き直した分)の2つです。
モデルを切り替えたターンだけ、書き直しが287倍
同じセッションを --resume で4回続けて、途中でモデルだけ変えました。
| モデル | read | create | |
|---|---|---|---|
| 1 | opus | 79,018 | 197 |
| 2 | sonnet に切替 | 34,090 | 56,584 |
| 3 | sonnet のまま | 90,674 | 149 |
| 4 | opus に戻す | 90,823 | 67 |
跳ねているのは切り替えたターンだけです。 公式は「各モデルが自分のキャッシュを持つ」「切り替えるとキャッシュヒットなしで読み直す」と書いています。書き直しの跳ね方はそのとおりでしたが、2行目の read は0になっていません。 この直前に別のセッションで sonnet を1回動かしており、その分が残っていたと思われます。初めて切り替えるなら read はもっと小さいはずです。
面白いのは4行目でした。 opus に戻したとき、書き直しは 67トークン。行きは高く、帰りは安い。 ただし read が 90,823 と、opus がそれまでに書いた量を超えています。ここは説明がつきませんでした。
/usage によると、私の直近7日は使用量の48%が8時間以上開きっぱなしのセッションから来ていました。長いセッションほど、切り替えで捨てる量が増えます。
TTL を変えると、キャッシュが2つに割れる
サブスクのプラン内利用なら、メイン会話のキャッシュは1時間保ちます。FORCE_PROMPT_CACHING_5M=1 で5分に落とせるので、TTL だけ切り替えて5回測りました。
| # | 条件 | read | create | 1時間枠 | 5分枠 |
|---|---|---|---|---|---|
| 1 | 既定・初回 | 0 | 78,521 | 78,521 | 0 |
| 2 | 既定・2回目 | 25,538 | 52,987 | 52,987 | 0 |
| 3 | 5分に切替 | 0 | 78,651 | 0 | 78,651 |
| 4 | 5分・2回目 | 25,663 | 52,985 | 0 | 52,985 |
| 5 | 既定に戻す | 25,538 | 52,988 | 52,988 | 0 |
3行目で read が0。 1時間側の温かいキャッシュがあるのに読めていません。そして5行目、既定に戻したら 25,538 が完全一致で復活しました(2行目と同じ値)。
消えたのではなく、別の入れ物になっていました。 デバッグで FORCE_PROMPT_CACHING_5M=1 を付けるときは、切り替え分の書き直しを払うことになります。
claude -p を繰り返すと、毎回5万トークン捨てている
短いプロンプトを3回投げて、セッションを続けるかどうかだけ変えました。
| read | create | ヒット率 | |
|---|---|---|---|
毎回新しい -p
|
25,538 | 52,986 | 32.5% |
| 継続する | 78,524 | 361 | 99.5% |
| さらに継続 | 78,885 | 133 | 99.8% |
52,986 が 133。約400分の1です。
-p は毎回別のセッションになります。続けて叩いても、読めたのは32.5%だけ。 残りは毎回書き直しています。
CI やバッチで -p をループで回すなら、セッションを続けるだけで書き直しがほぼ消えます。
詰まったところ
-c(直前の会話を続ける)で、実験が汚れました。
検証用のセッションを続けるつもりが、作業中の別のセッションを掴みました。 read が440万トークンと出て気づきました。-c は「このディレクトリで最後に動いた会話」を拾い、-p と組み合わせると -p 由来のものまで対象に入ります。 測るときは --resume でIDを指定します。
もう1つ、推論が間違っていました。
最初、新しい -p で --model sonnet を動かし、read=0 を見て「モデルを変えるとキャッシュが飛ぶ」と書きかけました。モデルを変えずに新しい -p を叩いた1回目も、read=0 でした。 何も証明していません。測り直した結果が上の表です。
まとめ
- 2.1.251 で
/usageにPrompt cache (main)行が付いた。/costは同じ画面 -
--output-format jsonの read / create トークン数で、自分の環境を測れる -
モデルを切り替えたターンだけ、書き直しが 197 → 56,584(287倍)。
ただし戻すときは67トークン。行きは高く、帰りは安い - TTL を変えるとキャッシュが2つに割れる。 既定に戻すと元の値が完全一致で復活した
-
claude -pの繰り返しはヒット率32.5%。 続けると99.8%。書き直しが約400分の1
モデル切替がタダに見えるのは、請求が1ターン遅れて来るからです。 切り替えた瞬間ではなく、次に何か話しかけたときに払っています。
参考
- How Claude Code uses prompt caching — キャッシュを壊す操作の一覧と TTL の決まり方
-
Manage costs effectively —
Prompt cache (main)行の読み方 -
Status line —
prompt_cacheの全フィールド -
CLI reference —
-cと--resumeの違い
関連記事
-
/model を1度でも押すと ANTHROPIC_DEFAULT_MODEL は効きません — 同じく
/modelを押した後に起きること - 環境変数でサブエージェントのモデルを固定できなくなった — モデル指定の優先順位の話
JQITのエンジニアの95%以上は未経験からの採用です。
よければコーポレートサイトにも遊びに来てください。
エンジニア採用も行っています。もしご興味あれば覗いてみてください。
▶ 採用サイト