Claude Media
Claude Fable 5.1のサブエージェント並行作業でリードを待たせない設計

Claude Fable 5.1のサブエージェント並行作業でリードを待たせない設計

起動ツールの即時リターン・結果の後続メッセージ投入・待機専用ツールの3点で、Claude Fable 5.1のリードエージェントはサブエージェント実行中も動かし続けられます。

Claude Fable 5.1は、サブエージェントに作業を任せている間もリードエージェント側を待機させない設計を公式ドキュメントで推奨しています。カスタムのコーディングエージェントを組む開発者向けの指示です。サブエージェントを起動するツールをリードの手を止めない形で設計すると、同程度の品質・トークン使用量・コストを保ったまま完了までの平均時間を短縮できるとされています。実装手順は3つです。

Claude Fable 5.1のサブエージェント並行作業とは

Claude Fable 5.1のサブエージェント並行作業とは、サブエージェントの起動を待ち状態にせず、リードエージェントが他の作業を続けながら完了を受け取れる実行方式です。公式ドキュメント「Prompting Claude Fable 5.1」は、コーディングエージェントがサブエージェントへ処理を委譲できる場合の指示を示しています。リードを毎回止めて完了を待たせないよう、明示的に勧めています。

背景にあるのは、Claude Fable 5.1がFable 5より長時間の自律実行に強くなった点です。公式の「What's new in Claude Fable 5.1」も、長時間の自律的なコーディング作業や多段階の調査作業が強化されたと位置付けています。長時間動く実行が増えるほど、リードがサブエージェントの完了をただ待つだけの時間も伸びやすくなります。

ドキュメントが挙げる典型症状は、リードエージェントがサブエージェントの実行中にアイドルになることです。心当たりがあれば、この設計が当てはまります。

リードを待たせない3つの実装ステップ

3つとも、サブエージェントを起動する側のツール設計に関わる項目です。

手順

リードを止めない3つの設計

  1. 1

    起動ツールはすぐ返す

    サブエージェントを起動するツールは、起動した時点で呼び出し元に制御を返します。

  2. 2

    結果は後続のuserメッセージで渡す

    サブエージェントの結果は、準備でき次第、後続のuserメッセージとしてリードに渡します。

  3. 3

    待機専用ツールを別に持たせる

    リードが結果を待ちたいときだけ呼ぶ、待機専用の別ツールを用意します。リードはこれを呼ばない限り、完了を意識せず次の作業へ進めます。

3ステップを満たすツール設計の一例は次のとおりです。公式のツール定義そのものではなく、3ステップを満たす実装例です。

{
  "name": "start_subagent",
  "description": "サブエージェントを起動し、完了を待たずにtask_idを返す",
  "input_schema": {
    "type": "object",
    "properties": {
      "task": { "type": "string" },
      "context": { "type": "string" }
    },
    "required": ["task"]
  }
}
{
  "name": "wait_for_subagent",
  "description": "指定したtask_idのサブエージェントが完了するまでリードをブロックする",
  "input_schema": {
    "type": "object",
    "properties": {
      "task_id": { "type": "string" }
    },
    "required": ["task_id"]
  }
}

JSONで新しいのは返り値です。start_subagentはtask_idだけを返し、サブエージェント本体の実行と、完了後のuserメッセージの追加はハーネスの責務になります。一方のwait_for_subagentはtask_idだけを受け取り、完了まで呼び出しが返りません。リードが止まるのはこの呼び出しの間だけで、呼ばなければ止まりません。入力スキーマにcontextを持たせる側はstart_subagentだけなので、待機ツールは起動後の合流専用の窓口として小さく保てます。

ここには、Claude APIのツール呼び出しの決まりが関わります。ツール結果のブロックは、対応するtool_useの直後に置く必要があり、間にほかのメッセージを挟めません。start_subagentもこの制約に従い、task_idを含むtool_resultをその場で返して呼び出し自体はすぐに完結させます。サブエージェントの実際の結果は、そのtool_resultの中身ではなく、完了後に追加するuserメッセージとして渡します。さらに、tool_resultを含むuserメッセージでは、テキストをtool_resultの後ろに置く決まりです。ハーネスが結果を差し込むときは、未回答のtool_useが残っていない区切りを選びます。ツール呼び出しの往復と、結果の届くタイミングを切り離す点が、この設計の核心です。

効果はどれくらいか — 待つケースと進めるケースの使い分け

この設計を入れても、Claude Fable 5.1が常にリードを動かし続けるわけではありません。公式ドキュメントは「モデルは依然としてしばしば待つことを選ぶ」と明記しています。時間短縮の効果が出るのは、リードが他の作業を進める判断をした実行に限られます。

つまりこの実装は、リードを強制的に働かせ続けるものではなく、待たなくてもよい選択肢を与える設計です。逆に、複数の独立したサブタスクを並行して進められる場面では、リードが待機ツールを呼ばずに他の作業へ進み、その分だけ完了までの時間が縮む形になります。

どちらを選びやすいかは、次の作業がサブエージェントの結果に依存するかどうかで変わってくると考えられます。サブエージェントに任せたテスト実行の結果を見てから次の修正方針を決めるようなタスクでは、待機ツールを呼んで結果を確認してから動く展開になりやすそうです。一方、別ファイルのリファクタリングやドキュメント更新のように、結果を待たずに進められる作業がほかに残っていれば、リードはそちらを先に進める余地があります。

Claude Codeの既定挙動との違い

同じ「サブエージェントを待たない」設計でも、Claude Code自体はすでに近い挙動を標準で持っています。対話セッションではforkモードが既定でオンになっています。既定オンの対象はClaude Code v2.1.232以降で、それ以前のバージョンではCLAUDE_CODE_FORK_SUBAGENT=1の設定が要ります。ClaudeがAgentツールで起動するサブエージェントはfork・非forkを問わずバックグラウンドで動き、Claudeの側からフォアグラウンドを求めることはできません。例外は2つあります。1つは環境変数CLAUDE_CODE_DISABLE_BACKGROUND_TASKSを1にした場合です。バックグラウンド実行の機能が丸ごと無効になり、サブエージェントはすべてフォアグラウンドで動きます。もう1つは、エージェントチームのチームメイトがサブエージェントを起動した場合で、こちらもフォアグラウンドで動きます。

3ステップが要るのは、Claude Codeのようにハーネス側が非同期実行を組み込んでいない場合です。自前のハーネスでサブエージェント呼び出しツールを実装しているなら、起動ツールを即座に返す設計へ作り直します。Claude Codeの対話セッションでは、fork既定オンの挙動がすでに近い動きをします。

Claude Codeの非対話モード(-p実行)やAgent SDKでは、fork既定がオフになります。この場合もサブエージェントは基本的にバックグラウンドで動き、Claudeが結果を先に使いたいときだけフォアグラウンドを選びます。CLAUDE_CODE_FORK_SUBAGENT=1でforkモードを有効にすることもできます。Agent SDK経由でClaude Codeのサブエージェント機構を呼び出す構成でも、3ステップを自分で組む必要はありません。

サブエージェントが応答しなくなったときの検知は、Claude CodeではCLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MSが担っています。既定は10分(600000ミリ秒)です。ストリームのアイドル上限CLAUDE_STREAM_IDLE_TIMEOUT_MSを上げた場合は、この既定も連動して上がります。進捗イベントが届くたびにタイマーが戻り、時間内に進捗がなければサブエージェントを中断して親に報告します。自前のハーネスで起動即時リターン型の設計にする場合も、同様のストール検知を別途用意しないと、応答が止まったサブエージェントに気づけないまま待ち続けることになります。

実装時に注意すべき点

  • 結果を渡すuserメッセージの投入タイミングが遅れると、リードは古い前提のまま作業を続けてしまう。結果が届いた直後に会話へ反映する仕組みが要る
  • 待機専用ツールを用意しないまま起動ツールだけ非同期化すると、結果を待ちたい場面で待つ手段が無くなる。両方をセットで実装する
  • 独立したサブエージェントを複数同時に起動する場面では、同じ資料にある、独立したツール呼び出しを1ターンでまとめて発行させる指示と組み合わせると、起動そのものも1ターンにまとまりやすくなる
  • サブエージェントの起動・終了を監視したい場合は、SubagentStart/SubagentStop hookのようなライフサイクルイベントの仕組みが参考になる。Claude Code固有の機能だが、自前ハーネスで監視を設計する際の型として使える

Claude Codeの仕様は、自前ハーネスの設計の参考にもなります。バックグラウンドのサブエージェントは、継承できる組み込みツールが絞られます(Read・Edit・Bash・WebFetchなどは残り、それ以外は外れます)。ただし、会話のforkと、再開したフォアグラウンドのサブエージェントはこの制限の対象外です。同じ定義でも、フォアグラウンドとバックグラウンドで使えるツールが変わりうるということです。非同期化するときは、サブエージェントに渡すツール集合が変わらないかも確かめておくと安全です。

また、対話セッションでは、サブエージェントがさらにバックグラウンドのサブエージェントを起動した場合、起動した側は結果を待ってから終了します。非対話モードとAgent SDKでは待たないため、起動元の終了後に完了した結果は、メインの会話に届きます。入れ子を許すハーネスでは、結果をどの会話に返すかを先に決めておく必要があります。

結果の受け渡しや監視が追いつかなくなると、リードを待たせない設計の効果が薄れます。

まとめ

要否は、自分のハーネスがどこでサブエージェントを動かしているかで決まります。Claude CodeのAgentツールやAgent SDK経由なら近い挙動がすでに動き、Anthropic APIを直接呼ぶ独自ループなら3ステップを自分で組みます。Claude Fable 5.1の全体像と合わせて、既存のハーネスの前提を確かめると判断しやすくなります。

参照した一次ソース

この記事の記述は、次の一次ソースと照合しています。更新時に参照先が変わった場合は一覧も更新します。

  1. platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-cla…
  2. platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1
  3. platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls
  4. code.claude.com/docs/en/sub-agents
この記事を共有:XはてブLinkedIn