Error during compactionの意味と対処 — Claude Code
「Error during compaction: Conversation too long」で/compact自体が失敗したときの原因の切り分けと、Escで数ターン戻って再実行する対処を解説します。
/compactを実行したのに要約が完成せず、「Error during compaction」に続けて「Conversation too long」と表示されることがあります。会話を縮めるための/compactが、会話が長すぎて動かない状態です。繰り返しても同じエラーが続くので、まずEscを2回押して数ターン前まで巻き戻し、それから再実行します。
Error: Error during compaction: Error: Conversation too long. Press esc twice to go up a few messages and try again.GitHubのissue #15896(2025年12月31日)に貼られた表示では、先頭にError: が二重に付いています。2025年8月のissue #6616にはPress esc to go up a few messages and try again.と、twiceの無い文言が貼られています。版によって案内の文言が違うので、画面の表示が少し違っても、Error during compactionとConversation too longが出ていれば同じ系統のエラーです。
症状で見分ける — 同じ「長すぎ」でも原因は3系統ある
「長すぎる」系のエラーは文言が近く、対処が別々です。画面に出た文字列から、どの系統かを先に決めます。
| 画面の文言 | 状態 | まず試すこと |
|---|---|---|
Context limit reached · /compact or /clear to continue | 状態上限に達した通常のエラー | まず試すこと/compactを実行する |
Prompt is too long · automatic compaction failed: <原因> | 状態自動圧縮が別の原因で失敗した | まず試すこと原因に出た内容(モデルが使えない、認証エラーなど)を先に直す |
Prompt is too long · this conversation is a single exchange… | 状態やり取りが1往復しかなく、要約する前の会話が無い | まず試すこと/clearして、貼り付けや添付を減らして再送する |
Error during compaction: Conversation too long | 状態/compact自体が会話の長さで失敗した | まず試すことEscを2回押して戻る(次節) |
3行目の「1往復しかない会話」は、/compactを打つとNot enough messages to compact.と返る状態でもあります。要約できる過去のやり取りが無く、場所を取っているのは、その1回のプロンプトと、毎回のリクエストに付くシステムプロンプトやツール定義です。
もう1つ、同じError during compaction:で始まっても、後ろがAPI Error: 400のような別の文言なら原因が違います。issue #64278には、上限到達後に手動で/compactを打つと400が返り、原因は直近のassistantメッセージのthinkingブロックだと報告されています。
対処 — Escで数ターン戻ってから再実行する
最初に、巻き戻して空きを作ります。
/compactが失敗したときの手順
- 1
Escを2回押す
プロンプト入力欄が空の状態でEscを2回押すと、これまでのプロンプトを選べるメニューが開きます。
/rewindと同じ画面です。 - 2
数ターン前のポイントを選ぶ
直近の重いメッセージ(巨大なツール出力や貼り付け)を含まない位置を選びます。選んだ位置より後の会話がコンテキストから外れ、空きができます。
- 3
もう一度/compactを実行する
空きができたので、要約が書き込めます。
- 4
足りなければ/clearで新しく始める
/clearで新しいセッションに移り、元の会話は/resumeで呼び戻せます。
入力欄に文字が入った状態でEscを2回押すと、メニューは開かず入力中のテキストが消えます。消えたテキストは入力履歴に残るので、Upキーで呼び戻してからあらためてEscを2回押してください。
「Summarize up to here」で前半だけを圧縮する
Escで開くメニューには、会話を戻す選択肢のほかに要約の選択肢があります。
| 選択肢 | 動作 |
|---|---|
| Restore conversation | 動作選んだ時点まで会話を戻す |
| Restore code and conversation | 動作会話とコードの両方を戻す |
| Restore code | 動作コードだけを戻し、会話は残す |
| Summarize from here | 動作選んだ時点以降の会話を要約に圧縮する |
| Summarize up to here | 動作選んだ時点より前の会話を要約に圧縮し、以降のメッセージはそのまま残す |
コードを戻す2つの選択肢は、選んだ時点より後にClaude Codeが追跡したファイル変更があるときだけ表示されます。変更が無ければ、Restore conversation、要約の2つ、Never mindだけが出ます。
このエラーの対処で使いやすいのが「Summarize up to here」です。会話の前半だけを要約に置き換え、直近のやり取りは原文のまま残るので、全体をまとめて要約しようとして失敗する/compactとは違う経路になります。要約後は会話中に「Summarized conversation」の区切りが入り、元のメッセージはセッションのトランスクリプトに残るため、Claudeは詳細を参照できます。
要約の方針を指定するには、矢印キーで「Summarize」の行を選び、「add context (optional)」欄に指示を書いてEnterを押します。数字キーで選ぶと、指示なしですぐ要約されます。どちらの要約もディスク上のファイルは変更しません。
試行錯誤が長引いた区間だけを圧縮したいときは「Summarize from here」が向いています。選んだ時点以降の会話を要約し、それより前の初期方針は原文のまま残せます。空きを作ることが目的なら、前半を圧縮する側が向きます。
なぜ/compactが失敗するのか — 空きが無いときに要約を作る逆説
/compactは会話を要約してから、その要約をコンテキストに書き戻します。会話が上限近くまで埋まった状態で要約を頼むと、要約のための余白が足りず失敗する、という説明が成り立ちます。
ただし余白不足だけが原因とは限りません。issue #6616には、コンテキストの空きが86%ある状態でこのエラーが出たという報告があります。
上限に近づく前に/contextを実行すると、システムプロンプト、ツール、メモリファイル、メッセージのどれが窓を占めているかを内訳で見られます。
フォールバックモデルが小さいと、圧縮のエラーがそのまま出る
fallbackModelでフォールバック連鎖を設定している場合は、別の原因もあります。連鎖は圧縮処理もカバーしますが、Claude Codeは主モデルよりコンテキストウィンドウが小さいモデルへはフォールバックしません。小さいモデルで要約すると、会話の一部がその時点で切り捨てられるためです。
候補がすべて主モデルより小さいウィンドウだと、圧縮は元のエラーをそのまま表示します。連鎖は--fallback-modelで1セッション分だけ指定でき、claude --fallback-model sonnet,haikuのようにカンマ区切りで並べます。この構成を使っているなら、Escで戻る対処に加えて候補の並びを見直す必要があります。
自分のバージョンで再現するかが変わる — 圧縮失敗まわりの修正の経緯
このエラーは、Claude Codeのバージョンによって出方が変わります。公式のエラーページと更新履歴から、圧縮の失敗に関わる修正を版番号つきで並べます。v2.1.162とv2.1.217、v2.1.228の変更は、エラーページの記述が出典です。
圧縮の失敗に関わる主な修正
- v2.1.1621往復だけの会話は圧縮を試みない
要約できる過去のやり取りが無い会話では、圧縮を試みずに原因(システムプロンプトやツール定義の大きさ)を説明するようになりました。それ以前は圧縮を試みたうえで、失敗すると素の「Prompt is too long」が出ました。
- v2.1.178圧縮が--fallback-modelに従う
圧縮が、設定したフォールバック連鎖に従うようになりました。過負荷やモデルが使えない場合に連鎖へ移ります。
- v2.1.216失敗した/compactがエラーとして表示される
/contextが上限超過の警告を出すようになり、失敗した/compactはエラーとして表示されます。 - v2.1.217Amazon Bedrockの上限エラーを認識する
Bedrockが返す
Input is too long for requested model.を、上限超過として扱うようになりました。それ以前は、この文言では自動圧縮が起動せず、/compactも同じエラーで失敗しました。 - v2.1.228Claude appsゲートウェイの上限トークンを認識する
クラウドの上流が上限超過を拒否したとき、ゲートウェイが返す
capability_rejected: prompt_too_longをPrompt is too longと同じに扱うようになりました。それ以前は、このトークンでは自動圧縮が起動しませんでした。 - v2.1.229自動圧縮の失敗に原因が付く
自動圧縮が別のエラーで失敗したとき、「Prompt is too long · automatic compaction failed:」の後に原因が表示されます。
- v2.1.2691往復も要約できない会話でも続行できる
全体を1往復も要約できない状態でも、最新のプロンプトを原文のまま残して前を要約する、といった最終手段で回復するようになりました。それ以前は、その状態のセッションで毎ターン同じエラーが出続けました。
- v2.1.282要約リクエストが拒否されたらフォールバックで再試行
要約のリクエストが拒否されて圧縮が失敗する場合、フォールバックモデルで再試行します。
- v2.1.284圧縮後もまだ長いとき、もう一度圧縮する
圧縮したのにリクエストが長すぎる場合、直近の会話の保持量を減らしてもう一度圧縮します。
古い版を使っているほど、手動の巻き戻しが必要な場面が増えます。手元の版はclaude --versionで確認でき、v2.1.287では次のように表示されます。
2.1.287 (Claude Code)claude updateで更新すると、上の修正がそろった状態になります。
繰り返さないために — 上限の手前で圧縮を走らせる設定
自動圧縮の発動位置は、起動オプションで変えられます。v2.1.287のclaude --helpには次の項目があります。
--autocompact <auto|tokens> Auto-compact window size (auto, or 100k–1M tokens)自動圧縮の「窓」は、コンテキストがどこまで埋まったら圧縮するかの基準です。500kのように指定すると、モデルの上限より手前で圧縮が走ります。--autocompactが効くのはその1回の起動だけで、保存済みの設定は変わりません。
/autocompact 500k(v2.1.221以降)は値をユーザー設定のautoCompactWindowに保存し、現在のセッションにも反映するので、以降のセッションにも効きます。autoでモデルに合わせた既定の窓へ戻ります。managed settingsのような優先度の高い設定がこのキーを決めている場合、コマンドは値を保存しますが、セッションはその設定の窓のままで、コマンドがそう表示します。
窓はモデルのコンテキストウィンドウを超えない範囲に丸められ、指定できるのは100kから1Mトークンです。500kのほか、100から1000までの数は千単位として読まれるので、200と書けば200kになります。
一方、環境変数のCLAUDE_CODE_AUTO_COMPACT_WINDOWはトークン数の整数だけを受け付けます。500kと書くと500と読まれ、下限の100Kに丸められます。スクリプトや環境変数側で設定するときは500000と書きます。この変数が設定されている間は、コマンド、フラグ、設定より優先され、/autocompactは窓を変えずに上書き中であることを報告します。ステータスラインのused_percentageはモデルの全窓に対する割合のままなので、変数を使うと、その数値は圧縮が走る時点を示さなくなります。
窓を指定しない場合の圧縮位置も、モデルで違います。1Mの窓を持つモデル(Anthropic API上のSonnet 5、Fableモデル、Opus 4.7以降)は、窓が埋まる前の約967Kトークンで圧縮します。Sonnet 4.6と拡張コンテキストなしのOpus 4.6は200Kの境界で圧縮します。CLAUDE_CODE_DISABLE_1M_CONTEXT=1を設定すると、1Mの窓を持つモデルも200Kの境界で圧縮します。
自動圧縮を切っている場合は、手動の/compactを上限の前に自分で打つ運用になります。DISABLE_AUTO_COMPACTを1にすると自動圧縮だけが止まり、手動の/compactは使えます。切ったまま運用するなら、画面に「Context limit reached」が出る前に/compactする習慣が必要です。/configで切った場合は、上限エラーの行に「auto-compact is off」の注記が付きます(v2.1.235以降)。
圧迫している要素を先に減らす
繰り返し踏むなら、コンテキストを占める要素の側を減らします。使っていないMCPサーバーは/mcp disable <name>で止めると、ツール定義がコンテキストから外れます。肥大したCLAUDE.mdは、該当ファイルを扱うときだけ読み込まれるパス指定ルールに分けられます。
表にまとめた手順はContext exceeds token limitの意味と対処にあります。自動圧縮が発火する条件と、要約後に残る情報はClaude Code compactの発火条件と要約後に残る情報で扱っています。そもそもコンテキストに入れる量を絞る設計はClaude Codeのコンテキスト管理が参考になります。Claude Code全体の使い方から入りたい場合は完全ガイドを先に読むと流れがつかめます。
まとめ
巻き戻しで対処できるのは、Error during compaction系のうち会話の長さが原因のものです。Prompt is too long · automatic compaction failed:やAPI Error: 400が出ているなら、文言に含まれる原因を先に見ます。