「Agent terminated early」の対処 — Claude Codeのサブエージェント中断エラー
サブエージェントが「Agent terminated early due to an API error」で止まったときの意味と対処。フォアグラウンドとバックグラウンドの違い、フォールバックとリトライの効く範囲、再開の手順をまとめます。
Agent terminated early due to an API error: <error detail> — Claude Codeでサブエージェントを走らせているときにこう出たら、そのサブエージェントのAPIリクエストが回復不能な形で失敗し、タスクを終える前に止まったことを意味します。コロンの後ろに続く詳細が原因を特定する手がかりです。
「Agent terminated early」の意味
このエラーは、サブエージェントのAPIリクエストが終端的に失敗し、タスクを完了できないまま終わったことを示します。使用量上限への到達や、サーバーエラーでリトライを使い切ったことが典型的な原因です。
表示されるのはClaude Code v2.1.199以降です。それより前は専用のエラー表示がなく、APIエラーのテキストがサブエージェントの成果物としてClaudeに渡っていました。エラーで止まったことに気づけないまま処理が進む失敗の仕方です。v2.1.199以降は、失敗が失敗として返ります。
コロン以降の詳細で原因を切り分ける
エラーメッセージのコロンより後ろに、実際に失敗した理由が続きます。この詳細は、公式のエラーリファレンスにある他の項目の見出しとそのまま対応しています。
| コロン以降に出る文言の傾向 | 主な原因 | 最初に確認すること |
|---|---|---|
| session limit / weekly limit系 | 主な原因プランの利用枠を使い切った | 最初に確認すること/usageでリセット時刻を確認する |
| server error / 529 / overloaded | 主な原因Claude側の一時的な混雑 | 最初に確認すること数分待って再試行、fallbackModelの設定 |
| rate limit / 429 | 主な原因送信過多かAPIティアの制限 | 最初に確認することしばらく待つ、送信頻度を落とす |
| credit balance is too low | 主な原因Consoleの支払い残高が尽きている | 最初に確認すること請求設定でクレジットを追加 |
詳しい切り分けはClaude rate limitエラーの対処で扱っています。Claude Codeの全体像を先に知りたい場合は、そちらから読むと用語がつながります。
使用量上限系は、種類によって逃げ道が違います。セッション上限と週次上限は全モデルで共有なので、モデルを切り替えても回復しません。Opus上限とSonnet上限はそのモデルファミリーだけが対象で、/modelでファミリー外のモデルに替えれば作業を続けられます。ただしモデルごとにプロンプトキャッシュが別なので、切り替え直後の1回は会話全体を読み直します。
週次の枠は、1回の大きな作業でも尽きます。ワークフローの大量の同時実行のような一度の集中的な作業では、週次の枠がセッション枠のリセット前に尽きることがあります。
フォアグラウンドとバックグラウンドで挙動が違う
同じAPIエラーでも、サブエージェントがフォアグラウンドかバックグラウンドかで、Claudeが受け取る情報が変わります。
止まったときにClaudeが受け取るもの
フォアグラウンド
すでにテキストを出力していれば、その部分出力に「途中で打ち切られた」という注記が付いて返り、このエラーにはなりません。何も出力していない、またはツール呼び出しだけだった場合に限り、「Agent terminated early due to an API error」で終わります。
バックグラウンド
常に失敗としてマークされます。終了時にClaudeが受け取るメッセージには、APIエラーの内容とサブエージェントの最後の出力が含まれるので、途中までの作業は失われません。
フォアグラウンドの「テキストがあれば部分出力」には前段があります。応答が途中で切れ、その時点の部分応答にテキストがありツール呼び出しがない場合、Claude Codeはサブエージェントに続きを促して実行を続けます。これは対話セッションでも同じです。促しを使い切ってはじめて、エラーで終わる扱いになります。
v2.1.199だけは例外で、ツール呼び出しのみで止まったサブエージェントが、打ち切りの注記だけを含む空の部分結果を返していました。それ以降のバージョンでは、この形も「Agent terminated early due to an API error」で終わります。
失敗したサブエージェントは/tasksに残らない
このエラーで終わったサブエージェントを、あとから/tasksで探しても出てきません。成功して完了したバックグラウンドのサブエージェントは、完了扱いで/tasksのリストに30秒残り、詳細ビューも開いたままです。失敗したもの、自分で止めたものはリストから外れます。
画面下のサブエージェントパネルでは、バックグラウンドのサブエージェントの行の扱いが逆向きです。成功した行はすぐ消えてフッターに「/tasks to see subagents」が30秒出ます。失敗した行はその場で30秒残り、選択してxを押せば先に消せます。
中断したサブエージェントを再開する
原因が解消したら、最初からやり直す必要はありません。次の流れで進めます。
エラーから再開するまで
- 1
コロン以降の詳細を読む
使用量上限ならリセット時刻、サーバーエラーなら一時的な混雑というように、原因の種類を決めます。
- 2
原因が消えるのを待つ、または回避する
使用量上限はリセット後でないと同じ失敗を繰り返します。Opus上限やSonnet上限なら
/modelで別ファミリーに替える手もあります。 - 3
Claudeに続きを頼む
「続きをやって」と伝えると、Claudeが
SendMessageにエージェントIDか名前を指定して、そのサブエージェントを再開します。
SendMessageの再開は、完了したサブエージェントと、ClaudeがTaskStopツールで止めたサブエージェントに効きます。自分で/tasksからxで止めたサブエージェントは自動では再開されず、Claudeが送ったメッセージは拒否されます。パネルにその行が残っているあいだなら、自分でトランスクリプトに入力して再開でき、以後はClaudeからの再開も効きます。
もうひとつ、再開できない型があります。組み込みのExploreとPlanは一度きりの実行で、エージェントIDを返さないため、Claudeは再開できません。これらが途中で落ちたときは、general-purposeかカスタムのサブエージェントで再実行します。
再開が効かない場合は、名前の再利用も疑います。v2.1.199以降は、名前が会話の中で同じサブエージェントを指し続けているかを確認し、別のエージェントが同じ名前を取っていれば送信を拒否します。拒否のエラーには、いまその名前が指す先が書かれます。以前のサブエージェントがまだ動いているなら、スポーン時に受け取ったエージェントIDで宛先を指定します。この確認は現在の会話の範囲で働き、/clearでリセットされます。
サブエージェントの設計や並列実行の考え方はClaude Code Sub-agents完全ガイドにまとめています。エラーメッセージが導入された経緯はClaude Code v2.1.199のリリースノートで確認できます。
止まりにくくする3つの手段と、効かない範囲
再発を減らす手段は3つありますが、それぞれ守備範囲が違います。設定したのに止まったときは、そのエラーが守備範囲の外にないかを見ます。
サブエージェントを止まりにくくする設定
フォールバックモデル
主モデルが過負荷や利用不可のとき、別のモデルに切り替えて続けます。認証・課金・レート制限・リクエストサイズ・通信のエラーでは切り替わりません。
リトライ回数
失敗したAPIリクエストを再送する回数で、既定は10回です。
CLAUDE_CODE_MAX_RETRIESで変えられ、v2.1.186以降は上限が15回です。リトライの監視
CLAUDE_CODE_RETRY_WATCHDOG=1で、429と529の容量系エラーを待ち続けます。無人の長時間実行向けです。
フォールバックモデルは、v2.1.247以降、サブエージェントにも効きます。それより前は、チェーンが対象とする失敗でもサブエージェントが終了していました。チェーンが対象とする失敗にサブエージェントが当たると、Claude Codeは受け付けてくれる最初のモデルに切り替え、サブエージェントはエラーで終わらず作業を続けます。チェーンはカンマ区切りで並べ、3モデルまでです。
claude --fallback-model sonnet,haikuv2.1.287のclaude --helpでは、このオプションは「デフォルトのモデルが過負荷または利用不可のときに、指定したモデルへ自動でフォールバックする。カンマ区切りで順に試す。各ユーザーターンの冒頭で主モデルを試し直す」と説明されています。切り替えはそのターンだけで、次のメッセージでは主モデルから再開します。毎回設定したくなければ、settingsのfallbackModelに配列で書きます。
コロン以降が429系や使用量上限なら、フォールバックを設定していてもこのエラーで止まります。
無人運用では、リトライの監視が効きます。
export CLAUDE_CODE_RETRY_WATCHDOG=1これを設定すると、失敗にせず5分を上限に間隔を広げながら再試行し続けます。応答にレート制限のリセット時刻が付いていれば、リセットまで待ちます。使用量上限に当たったセッションは、残りの時間を待ち切る動きになります。
一方で、標準速度のリクエストが「支出上限に達した」または「利用クレジットが尽きた」という429を返したときは、すぐに失敗します。ゲートウェイ側の支出上限が定期的にリセットされる場合も同じです。v2.1.239より前は、これも延々と再試行していました。
監視を有効にしていれば、サーバーエラー・タイムアウト・接続断のような他の一時的なエラーも、v2.1.199以降は既定の再試行回数が300回に上がります。バックオフの合計は約3時間です。CLAUDE_CODE_MAX_RETRIESを明示した場合も、15回の上限が外れます。環境変数の一覧はClaude Code環境変数リファレンスにあります。
対話セッションで使用量上限に当たったときは、別の逃げ道があります。claude.aiのサブスクリプションでサインインしていれば、v2.1.234以降はセッションを開いたまま待ち、リセット後に中断したタスクを自動で続けます。待機中は「Usage limit reached」と、続行する時刻を示す行が画面下に出ます。待機後に失敗したサブエージェントの続きが要るときは、あらためて再開を頼みます。この自動続行は/configの「Continue automatically at usage limit」でオフにでき、待機中はEscか/rate-limit-optionsで取り消せます。
よくある質問
「Concurrent subagent limit reached」とは違いますか
違います。「Concurrent subagent limit reached」は、同時に動くサブエージェントが既定の20を超えたときに出るエラーで、APIエラーではなく同時実行数の上限そのものです。Claudeには再試行しないよう伝えるエラーが返ります。v2.1.217以降、この上限はCLAUDE_CODE_MAX_CONCURRENT_SUBAGENTSで変更でき、ultracode使用中のセッションでは適用されません。「Agent terminated early due to an API error」はAPIリクエストの失敗が原因で、原因の層がまったく別です。
まとめ
コロン以降の詳細が使用量上限なら、待つかモデルファミリーを替える。サーバーエラーならフォールバックかリトライの設定が効く。レート制限と課金のエラーには、フォールバックは効かない。この3分岐を先に決めてから、サブエージェントの再開に進むのが最短です。
関連する記事
Claude Code をもっと見る →Claude Codeとは — できること・料金・始め方と使い方の全体像
「spawned with zero tools」の対処 — Claude Codeのサブエージェント権限設定
「No Response From API」が繰り返し出る原因と対処 — Claude Code
「Could not update spend limit」の対処 — Claude Codeの支出上限エラー
「temporarily limiting requests」の意味 — Claude Codeの一時的なサーバー制限
「archive integrity check」の対処 — Claude Codeのプラグイン改ざん検知エラー