Claude Codeで長時間セッションのコストが増える理由
長時間開いたセッションは、体感の作業量以上にプラン上限を消費することがあります。原因はキャッシュ切れやバックグラウンド処理など複数あり、対処法もそれぞれ異なります。
長時間セッションで何が起きているか
数時間開きっぱなしのセッションは、実際に打った指示の量から想像するより多くのプラン上限を消費することがあります。公式ドキュメントはこの現象を「usage climbs in a long session」として整理し、原因を複数挙げています。共通するのは、Claude Codeがリクエストのたびに会話全体を送り直すという設計です。
Claude Codeは1回のツール呼び出しごとに新しいリクエストを送り、その中に会話履歴とツール結果をまとめて含めます。プロンプトキャッシュが効いているあいだはキャッシュ済みトークンの単価で再読み込みされますが、それでも「1日中開いていたセッションでの一言質問」は会話全体ぶんの利用量として計上されます。跳ねる経路は4つあり、効く対策はそれぞれ違います。
原因1: プロンプトキャッシュが切れて全文を再処理する
キャッシュされたプレフィックスは、一定時間操作がないと失効します。休憩後の最初のリクエストはキャッシュを外れ、コンテキスト全体を再計算してキャッシュを作り直すため、離席明けの最初のターンだけ体感が重くなります。
このキャッシュがどれだけ長く生き残るかはTTL(生存時間)が決め、Claude Codeはリクエストの種類ごとに2種類のTTLを使い分けます。
| リクエストの種類 | サブスクリプション(プラン利用枠内) | 使用量クレジット / APIキー / クラウド経由 |
|---|---|---|
メイン会話(対話ターン、-p実行) | サブスクリプション(プラン利用枠内)1時間 | 使用量クレジット / APIキー / クラウド経由5分 |
| それ以外(サブエージェント・workflow・チームメイト・fork・圧縮など) | サブスクリプション(プラン利用枠内)5分(一部サーバー側の補助リクエストのみ1時間) | 使用量クレジット / APIキー / クラウド経由5分 |
プラン利用枠を使い切って使用量クレジットに切り替わると、メイン会話のTTLも5分に落ちます。1時間のTTLを維持したいなら、自分で指定できます。promptCacheTtl設定かCLAUDE_CODE_PROMPT_CACHE_TTL環境変数(Claude Code v2.1.242以降)を使います。
原因2: 待機中でも動くバックグラウンド処理
セッションを開いたまま何も打たずにいても、いくつかの仕組みは会話全体を送るリクエストを裏で発生させます。
- スケジュールタスク: 設定した間隔で発火し、セッションがアイドルでもそのたびにコンテキスト全体を送信します
- クロスセッションメッセージ: 別セッションからのメッセージは、待機中のセッションに新しいターンとして配信され、そのたびに全体を再送します。
crossSessionInboundをholdにすると配信を保留できます - goalのチェックイン: バックグラウンド作業を待つgoalが有効な間、Claude Codeはアイドル中でも進捗確認のターンを起こします。v2.1.246以降は1つのgoalあたり最大3回に制限され、それ以前は無制限でした。
CLAUDE_CODE_GOAL_CHECKIN_MINUTESを0にすると止められます - チームメイト: Agent Teamsの各チームメイトは終了するまでトークンを消費し続けます。プランモードで動くチームメイトがいる構成は、通常セッションの約7倍のトークンを使います。各チームメイトが自分専用のcontext windowを持ち、別インスタンスとして動くためです
これらは会話が進んでいなくても発生する点が共通しています。待機時間そのものは無料ではありません。
サブエージェントも別枠の消費源です。サブエージェント・workflow・fork・圧縮リクエストは「メイン会話」ではなく「それ以外」のバケットに分類され、サブスクリプションでも既定は5分TTLです。長時間セッションで調査系のサブエージェントを何度も呼ぶ運用は、都度キャッシュを作り直しやすい構造になっています。
原因3: セッション中の操作がキャッシュを都度壊す
長く開いたセッションほど、意図せずキャッシュを壊す操作を重ねやすくなります。次の操作はいずれもプレフィックスを変え、次のリクエストを未キャッシュの全文再処理にします。
- モデル切り替え(
/model): モデルごとにキャッシュが別なので、切り替えた直後の1リクエストは必ずキャッシュを外れます。opusplan設定はplanモードと実行モードを行き来するたびにこの切り替えが起きます - effortレベルの変更(
/effort): キャッシュはモデルだけでなくeffortレベルでも区別されます - fast modeのオン: リクエストヘッダーがキャッシュキーの一部になるため、セッションの後半でfast modeを初めて有効にするほど、そのぶん長い履歴が未キャッシュ扱いになります
- MCPサーバーの接続・切断: ツール定義がプレフィックスに乗っている場合(tool searchが使えない環境など)、サーバーの再接続だけでもキャッシュが崩れます
- ツール全体のdeny設定変更:
Bashのようなツール名まるごとの拒否ルールを/permissionsで追加・削除すると、次のリクエストでキャッシュが切れます
いずれも単発では小さなコストですが、セッションが長引くほどこうした操作の回数が積み重なり、都度の再処理が合算されていきます。
逆にキャッシュを壊さない操作も知っておくと安心です。ファイルの編集・読み直し、/recap、/rewindでの巻き戻し、権限モードの切り替え(opusplanを除く)はいずれもキャッシュを維持したまま実行できます。CLAUDE.mdをセッション中に編集しても、その変更自体はキャッシュを壊しません。ただし反映は次の/clearや再起動まで持ち越されます。
原因4: 圧縮そのものが大きなリクエストになる
/compactは要約対象の会話をまるごと読んでから要約を作るため、大きなコンテキストを圧縮する行為自体が大きなリクエストになります。キャッシュが温かいうちは、この要約リクエストもキャッシュ済みプレフィックスから読めるので、実際のコンテキストサイズから想像するより安く済みます。
問題はキャッシュのTTLを過ぎた後の圧縮です。読み込むべきキャッシュが残っていないため、要約リクエストは履歴全体を未キャッシュのまま処理します。これが、長時間放置したセッションを再開したときの/compactが最も高くつく理由です。Pro・Maxプランでは、1時間以上放置され10万トークンを超えたセッションを再開すると、送信前にダイアログが出て「要約から再開」「そのまま全体を再開」「今後は聞かない」の3択を提示します。要約から再開すればその場で圧縮が走り、以後のリクエストは要約ぶんだけで済みます。全体をそのまま再開すれば詳細は失われませんが、再キャッシュが済むまでのリクエストごとの単価は会話サイズに比例します。
利用形態別にどれだけ影響が違うか
同じ「長時間セッション」でも、使い方によって影響の出方は変わります。
| 利用形態 | 対策の効き方 | 理由 |
|---|---|---|
| 数時間、離席を挟まず対話し続ける | 対策の効き方条件次第 | 理由キャッシュは温かいまま保たれやすいが、コンテキスト自体は伸び続ける |
| 数分〜数十分おきに離席を挟む | 対策の効き方大きい | 理由離席のたびにTTLを外れて再処理が発生しやすく、TTL調整や/clearの効果が大きい |
| goalやスケジュールタスクを裏で走らせたまま放置 | 対策の効き方大きい | 理由チェックイン間隔や配信設定を絞ることで無駄打ちを直接減らせる |
| 単発の短いセッションだけを使う | 対策の効き方ほぼ影響なし | 理由キャッシュが切れるほどの空白が生まれる前にセッションが終わる |
長時間セッションのコストをどう抑えるか
原因ごとに効く対処が異なります。休憩をよく挟むなら、設定ファイルでpromptCacheTtlを1hに指定するか環境変数CLAUDE_CODE_PROMPT_CACHE_TTL=1hをセットして1時間TTLを固定します。無関係な作業に移るときは要約を待たず/clearで会話ごと畳むのが手早く済みます。goalは使い終わったら/goal stopなどで明示的に止め、スケジュールタスクも常時稼働ではなく必要な間だけ有効にすると、待機中の無駄打ちが減ります。プロンプトキャッシュの仕組み全体はPrompt Cachingを理解するにまとめています。
プランの利用上限そのものについてはClaude Pro制限の仕組み、チーム単位での支出可視化はClaude Codeのコスト管理を参照してください。
実際に何が起きているかを/usageで確認する
原因を推測するより先に、自分のセッションでどれが実際に起きているかを/usageで確認できます。Claude Code v2.1.251以降では、メイン会話の最初の応答が返った後にSessionブロックへPrompt cache (main)という行が追加されます。
Prompt cache (main): 14 requests · 91% of input tokens from cache
· 2 misses (last 6m 10s ago, 310.2k tokens re-cached)
· 1 expected rebuild (compaction or tool-result clearing)
· warm (1h TTL, last activity 40s ago)この行は3つを教えてくれます。missesはキャッシュが外れて再処理が発生したリクエストの数と、直近のミスで再キャッシュされたトークン量です。全体の5%かつ2,000トークン以上を再処理したリクエストがミスとして数えられます。expected rebuildsは圧縮やツール結果のクリアでClaude Code自身が会話を書き換えた結果のミスで、原因3・原因4に該当するものはここに現れます。warm / coldは今このプレフィックスがTTL内かどうかで、coldならセッションがどれだけアイドルだったかも表示されます。
Pro・Max・Team・Enterpriseプランでは、/usageがさらに「plan usage breakdown」を表示します。直近の利用量をSkills・サブエージェント・プラグイン・MCPサーバーごとの割合で示し、/loopやスケジュールタスクのうち重いものは実行回数・合計トークン・直近実行時刻つきで一覧できます。原因を切り分けたら、この内訳で該当する項目が実際に上位に出ているかを照合してください。この内訳は直近利用量の10%以上を占める挙動(長いコンテキストやキャッシュミスなど)を自動で洗い出し、それぞれに削減のヒントを添えて表示するため、原因の見当がつかないときはまずここを見るのが近道です。
よくある質問
セッションを開きっぱなしにするだけでコストは増えますか
会話を進めなくても、goalのチェックインやスケジュールタスク、クロスセッションメッセージの配信が裏で会話全体を送るリクエストを発生させることがあります。これらを使っていなければ、開きっぱなし自体が課金を増やすことはありません。
promptCacheTtlはどこで設定しますか
Claude Codeの設定ファイルでpromptCacheTtlを指定するか、環境変数CLAUDE_CODE_PROMPT_CACHE_TTL(v2.1.242以降)で上書きできます。値を1hにすると、使用量クレジットやAPIキー経由でもメイン会話のTTLを1時間まで伸ばせます。
/modelや/effortを切り替えるとキャッシュはどうなりますか
キャッシュはモデルとeffortレベルの組み合わせごとに別扱いなので、切り替えた直後の1リクエストは必ずキャッシュを外れて全文再処理になります。切り替え自体を減らすのが最も直接的な対策です。
/compactを毎回実行すればコストは抑えられますか
キャッシュが温かいうちの/compactは比較的安く済みますが、TTLを過ぎてからの圧縮は履歴全体を未キャッシュで処理するため最も高くつきます。放置後にいきなり圧縮するより、TTL内に/clearするか要約から再開するかを選ぶほうが無駄が少なくなります。
原因を自分で切り分けられないときはどうすればよいですか
推測で対策を打つ前に/usageを確認してください。Prompt cache行がミス数と再キャッシュ量を示し、Pro・Max・Team・Enterpriseプランではplan usage breakdownが利用量の10%以上を占める挙動を削減のヒント付きで教えてくれます。
まとめ
長時間セッションのコスト増加は、単一のバグではなく、会話全体を送り直す設計とキャッシュの課金モデルが交差した結果です。キャッシュ切れ・バックグラウンド処理・セッション中の状態変更・圧縮という4つの経路はそれぞれ独立して発生し、原因を切り分けて初めて狙った対策が打てます。まずは/usageのPrompt cache行とplan usage breakdownで、自分のセッションがどの経路に該当するかを確認してください。