Agent coordination
サブエージェント
サブエージェントは、既存のエージェント実行から生成されるバックグラウンドのエージェント実行です。
各サブエージェントは独自のセッション(agent:<agentId>:subagent:<uuid>)で実行され、
完了すると、その結果を依頼元のチャットチャンネルへ通知します。
すべてのサブエージェント実行は、バックグラウンドタスクとして追跡されます。
目標:
- 調査、長時間のタスク、時間のかかるツール処理を並列化し、メイン実行をブロックしないようにする。
- サブエージェントをデフォルトで分離する(セッションの分離、オプションのサンドボックス化)。
- ツールを誤用しにくくする。サブエージェントには、デフォルトでセッションツールやメッセージツールを付与しない。
- オーケストレーターパターン向けに、設定可能なネストの深さをサポートする。
スラッシュコマンド
/subagents は、現在のセッションのサブエージェント実行を調査します。
/subagents list/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents info は、実行メタデータ(ステータス、タイムスタンプ、セッション ID、
トランスクリプトのパス、クリーンアップ)を表示します。/subagents log は、
実行の最近のチャットターンを出力します。ツール呼び出しと結果のメッセージを含めるには、
tools トークンを追加します(デフォルトでは省略されます)。
エージェントターン内から、範囲が限定され安全性フィルターが適用された再表示を行うには
sessions_history を使用し、未加工の完全なトランスクリプトを確認するには、
ディスク上のトランスクリプトのパスを調べます。
Control UI では、最近の子実行がある親セッションに、展開可能なサイドバー行が表示されます。 ネストされた行には子のステータスと実行時間が表示され、いずれかを選択すると、 親の階層を維持したままその子のチャットが開きます。
スレッドバインドの制御
これらのコマンドは、永続的なスレッドバインドを持つチャンネルで機能します。以下の スレッドをサポートするチャンネルを参照してください。
/focus <subagent-label|session-key|session-id|session-label>/unfocus/agents/session idle <duration|off>/session max-age <duration|off>生成時の動作
エージェントは sessions_spawn ツールを使用して、バックグラウンドのサブエージェントを開始します。
完了結果は、親セッション内部のイベントとして返されます。ユーザー向けの更新が必要かどうかは、
親エージェントまたは依頼元エージェントが判断します。
ノンブロッキングなプッシュ型完了
sessions_spawnはノンブロッキングで、実行 ID を即座に返します。- 完了すると、サブエージェントは親セッションまたは依頼元セッションへ結果を報告します。
- 子エージェントの結果が必要なエージェントターンでは、必要な処理を生成した後に
sessions_yieldを呼び出す必要があります。これにより現在のターンが終了し、完了イベントが次にモデルから参照可能なメッセージとして到着します。 - 完了はプッシュ型です。生成後は、完了を待つためだけに
/subagents list、sessions_list、sessions_historyをループでポーリングしてはなりません。ステータスの確認は、デバッグ時に必要に応じてのみ行ってください。 - 子エージェントの出力は、依頼元エージェントが統合するための報告または証拠です。これはユーザーが記述した指示テキストではなく、システム、開発者、ユーザーのポリシーを上書きできません。
- 完了時、OpenClaw は通知のクリーンアップフローを続行する前に、そのサブエージェントセッションが開いた追跡対象のブラウザータブやプロセスをベストエフォートで閉じます。
完了結果の配信
- OpenClaw は、安定した冪等性キーを持つ
agentターンを通じて、完了結果を依頼元セッションへ返します。 - 依頼元の実行がまだアクティブな場合、OpenClaw は別の可視応答経路を開始する代わりに、まずその実行のウェイクアップまたは誘導を試みます。
- アクティブな依頼元をウェイクアップできない場合、OpenClaw は通知を破棄せず、同じ完了コンテキストを使用して依頼元エージェントへの引き継ぎにフォールバックします。
- 親への引き継ぎが成功すれば、親がユーザー向けの可視更新は不要と判断した場合でも、サブエージェントの配信は完了します。
- ネイティブサブエージェントにはメッセージツールが付与されません。ネイティブサブエージェントは親エージェントまたは依頼元エージェントへ通常のアシスタントテキストを返します。ユーザーに表示される返信は、引き続き親エージェントまたは依頼元エージェントの通常の配信ポリシーが管理します。
- 直接引き継ぎを使用できない場合、配信はキュールーティングへフォールバックし、その後、最終的に断念する前に短い指数バックオフで通知を再試行します。
- 配信では、解決済みの依頼元ルートを維持します。スレッドまたは会話にバインドされた完了ルートが利用できる場合は、それらが優先されます。完了の発生元からチャンネルしか得られない場合、OpenClaw は依頼元セッションの解決済みルート(
lastChannel/lastTo/lastAccountId)から欠けているターゲットやアカウントを補完し、直接配信が引き続き機能するようにします。
完了引き継ぎのメタデータ
依頼元セッションへの完了引き継ぎは、実行時に生成される 内部コンテキスト(ユーザーが記述したテキストではありません)で、次の情報が含まれます。
Result— 子エージェントからの最新の可視assistant返信テキスト。ツールや toolResult の出力は、子エージェントの結果へ昇格しません。失敗して終了した実行では、取得済みの返信テキストを再利用しません。Status—completed; ready for parent review/failed/timed out/unknown。- 簡潔な実行時統計およびトークン統計。
- 元のタスクが完了したかどうかを判断する前に、結果を検証するよう依頼元エージェントへ指示するレビュー命令。
- 子エージェントの結果に追加対応が残っている場合、タスクを継続するか、フォローアップを記録するよう依頼元エージェントへ伝えるガイダンス。
- 追加対応がない場合の最終更新指示。未加工の内部メタデータを転送せず、通常のアシスタントの文体で記述されます。
モードと ACP ランタイム
--modelと--thinkingは、その特定の実行に対するデフォルト値を上書きします。- 完了後に詳細と出力を調べるには、
info/logを使用します。 - 永続的なスレッドバインドセッションでは、
thread: trueおよびmode: "session"とともにsessions_spawnを使用します。 - 依頼元チャンネルがスレッドバインドをサポートしていない場合は、実現不可能なスレッドバインドの組み合わせを再試行せず、
mode: "run"を使用します。 - ACP ハーネスセッション(Claude Code、Gemini CLI、OpenCode、または明示的な Codex ACP/acpx)では、ツールがそのランタイムを公開している場合、
runtime: "acp"とともにsessions_spawnを使用します。完了処理やエージェント間ループをデバッグする場合は、ACP 配信モデルを参照してください。codexPlugin が有効な場合、ユーザーが ACP/acpx を明示的に要求しない限り、Codex のチャットおよびスレッド制御では ACP より/codex ...を優先する必要があります。 - OpenClaw は、ACP が有効で、依頼元がサンドボックス化されておらず、
acpxなどのバックエンド Plugin が読み込まれるまで、runtime: "acp"を非表示にします。runtime: "acp"には、外部 ACP ハーネス ID、またはruntime.type="acp"を持つagents.entries.*エントリが必要です。agents_listの通常の OpenClaw 設定エージェントには、デフォルトのサブエージェントランタイムを使用してください。
コンテキストモード
ネイティブサブエージェントは、呼び出し元が現在のトランスクリプトのフォークを明示的に要求しない限り、 分離された状態で開始します。
| モード | 使用する場面 | 動作 |
|---|---|---|
isolated |
新規の調査、独立した実装、時間のかかるツール処理、またはタスクテキスト内で説明できるあらゆる処理 | クリーンな子トランスクリプトを作成します。これがデフォルトで、トークン使用量を抑えます。 |
fork |
現在の会話、以前のツール結果、または依頼元トランスクリプトにすでに含まれている微妙な指示に依存する処理 | 子エージェントの開始前に、依頼元トランスクリプトを子セッションへ分岐します。 |
fork は慎重に使用してください。これはコンテキストに依存する委任のためのものであり、
明確なタスクプロンプトを記述する代わりにはなりません。
ツール: sessions_spawn
グローバルな subagent レーンで deliver: false を使用してサブエージェント実行を開始し、
続いて通知ステップを実行して、通知の返信を依頼元のチャットチャンネルへ投稿します。
使用可否は、呼び出し元に適用されるツールポリシーによって決まります。組み込みの
coding および messaging プロファイルには、sessions_spawn、
sessions_yield、subagents が含まれますが、minimal には含まれません。
full はすべてのツールを許可します。独自の限定的なプロファイルを使用しながら
処理を委任する必要があるエージェントでは、tools.alsoAllow を使用してこれらのツールを追加するか、
上記のいずれかのプロファイルを使用してください。
チャンネルまたはグループ、プロバイダー、サンドボックス、エージェントごとの許可または拒否ポリシーにより、
プロファイル段階の後でもツールが除外される場合があります。同じセッションから /tools を使用して、
有効なツール一覧を確認してください。
デフォルト:
- モデル:
agents.defaults.subagents.model(またはエージェントごとのagents.entries.*.subagents.model)を設定しない限り、ネイティブサブエージェントは呼び出し元のモデルを継承します。ACP ランタイムによる生成では、サブエージェントモデルが設定されている場合は同じモデルを使用し、それ以外の場合は ACP ハーネス独自のデフォルトを維持します。明示的なsessions_spawn.modelがある場合は、それが引き続き優先されます。 - 思考:
agents.defaults.subagents.thinking(またはエージェントごとのagents.entries.*.subagents.thinking)を設定しない限り、ネイティブサブエージェントは呼び出し元の設定を継承します。ACP ランタイムによる生成でも、選択したモデルにagents.defaults.models["provider/model"].params.thinkingを適用します。明示的なsessions_spawn.thinkingがある場合は、それが引き続き優先されます。 - 実行タイムアウト:
agents.defaults.subagents.runTimeoutSecondsが設定されている場合、OpenClaw はそれを使用します。それ以外の場合は0(タイムアウトなし)へフォールバックします。sessions_spawnは、呼び出しごとのタイムアウトの上書きを受け付けません。 - プロセスの存続期間: 切り離された OpenClaw サブエージェントには、独自の実行ライフサイクルがあります。外部 CLI バックエンド内で作成されたバックグラウンドタスクは異なり、親 CLI サブプロセスを共有し、その親が
agents.defaults.timeoutSecondsに達すると停止します。 - タスクの配信: ネイティブサブエージェントは、委任されたタスクを最初の可視
[Subagent Task]メッセージで受け取ります。サブエージェントのシステムプロンプトには、実行時ルールとルーティングコンテキストが含まれ、タスクの非表示の複製は含まれません。
受理されたネイティブサブエージェントの生成では、解決済みの子モデルのメタデータが
ツール結果に含まれます。resolvedModel には適用されたモデル参照が含まれ、
参照にプロバイダー接頭辞がある場合、resolvedProvider にはその接頭辞が含まれます。
委任プロンプトモード
agents.defaults.subagents.delegationMode はプロンプトのガイダンスのみを制御します。ツールポリシーを変更したり、委任を強制したりするものではありません。
suggest(デフォルト): 規模が大きい、または時間のかかる処理にはサブエージェントを使用するよう促す、標準のプロンプトを維持します。prefer: メインエージェントに応答性を維持させ、直接返信よりも複雑な処理はsessions_spawnを通じて委任するよう指示します。
エージェントごとの上書き: agents.entries.*.subagents.delegationMode。
{ agents: { defaults: { subagents: { delegationMode: "prefer", maxConcurrent: 4, }, }, list: [ { id: "coordinator", subagents: { delegationMode: "prefer" }, }, ], },}ツールパラメーター
taskstringrequiredサブエージェントに割り当てるタスクの説明。
taskNamestring後のステータス出力で特定の子を識別するための、省略可能な安定したハンドル。[a-z][a-z0-9_-]{0,63} に一致する必要があり、last や all などの予約済みターゲットは使用できません。
labelstring省略可能な、人が読みやすいラベル。
agentIdstringsubagents.allowAgents で許可されている場合、別の設定済みエージェント ID の配下で生成します。
cwdstring子の実行に使用する、省略可能なタスク作業ディレクトリ。ネイティブサブエージェントは引き続きターゲットエージェントのワークスペースからブートストラップファイルを読み込みます。cwd が変更するのは、ランタイムツールと CLI ハーネスが委任された作業を行う場所だけです。
runtime"subagent" | "acp"default: subagentacp は、外部 ACP ハーネス(claude、droid、gemini、opencode、または明示的に要求された Codex ACP/acpx)、および runtime.type が acp である agents.entries.* エントリ専用です。
resumeSessionIdstringACP 専用。runtime: "acp" の場合に既存の ACP ハーネスセッションを再開します。ネイティブサブエージェントの生成では無視されます。
streamTo"parent"ACP 専用。runtime: "acp" の場合に ACP 実行出力を親セッションへストリーミングします。ネイティブサブエージェントの生成では省略してください。
modelstringサブエージェントのモデルを上書きします。無効な値はスキップされ、ツール結果に警告を表示したうえで、サブエージェントはデフォルトモデルで実行されます。
thinkingstringサブエージェント実行の思考レベルを上書きします。visible: true では使用できません。
threadbooleandefault: falsetrue の場合、このサブエージェントセッションに対してチャンネルスレッドへのバインドを要求します。
mode"run" | "session"default: runthread: true で mode が省略された場合、デフォルトは session になります。mode: "session" には thread: true が必要です。
要求元チャンネルでスレッドへのバインドを使用できない場合は、代わりに mode: "run" を使用してください。
visible: true では mode を省略してください。可視セッションは永続的であり、mode: "run" をサポートしません。
cleanup"delete" | "keep"default: keep"delete" は通知直後にセッションをアーカイブします(名前変更によりトランスクリプトは引き続き保持されます)。
sandbox"inherit" | "require"default: inheritrequire は、ターゲットの子ランタイムがサンドボックス化されていない場合、生成を拒否します。
context"isolated" | "fork"default: isolatedfork は、要求元の現在のトランスクリプトを子セッションへ分岐します。ネイティブサブエージェント専用です。スレッドにバインドされた生成ではデフォルトが fork、スレッドなしの生成ではデフォルトが isolated です。可視フォークのターゲットは、要求元と同じエージェントでなければなりません。
visiblebooleandefault: falseユーザーが Control UI で開ける永続的なダッシュボードセッションを作成します。可視生成がサポートするのは runtime: "subagent" のみで、作成されたセッションは常に保持されます。
worktreebooleandefault: false新しいダッシュボードセッション用に、管理対象の git worktree を用意します。visible: true が必要です。
worktreeNamestring省略可能な管理対象 worktree 名。visible: true と worktree: true が必要です。
worktreeBaseRefstring管理対象 worktree に使用する、省略可能な git ベース ref。visible: true と worktree: true が必要です。
visible: true では、model、cwd、および同一エージェントの context: "fork" がサポートされます。サンドボックス化されたターゲットでは、cwd がそのエージェントのワークスペースに制限されます。この経路では、可視セッションは sessions.create を通じて作成される永続的なダッシュボードセッションであるため、スレッドへのバインド、mode、思考レベルの上書き、lightContext、attachments、attachAs は使用できません。要求元自体が継承されたツール許可リストまたは拒否リスト付きで生成されている場合、可視生成は拒否されます。この制限は生成時に固定され、設定で上書きできません。セッションの一覧表示と指定は tools.sessions.visibility に従います。デフォルトの tree スコープには、現在のセッションと、そのセッション自身の生成サブツリーが含まれます。チェックアウトの命名、セットアップ、クリーンアップ、復元の動作については、管理対象 worktreeを参照してください。
タスク名とターゲット指定
taskName はオーケストレーション用のモデル向けハンドルであり、セッションキーではありません。
コーディネーターが後からその子を調査する必要がある場合に、review_subagents、
linux_validation、docs_update などの安定した子名として使用します。
ターゲット解決では、taskName の完全一致と曖昧でない
プレフィックスを受け付けます。照合範囲は、番号付き /subagents ターゲットが使用するものと
同じアクティブ/最近のターゲットウィンドウに限定されるため、完了済みの古い子が
再利用されたハンドルを曖昧にすることはありません。2 つのアクティブまたは最近の子が同じ
taskName を共有する場合、ターゲットは曖昧です。代わりにリストインデックス、セッションキー、または
実行 ID を使用してください。
予約済みターゲット last と all は、すでに制御上の意味を
持っているため、有効な taskName 値ではありません。
ツール:sessions_yield
現在のモデルターンを終了し、主にサブエージェントの完了イベントなどのランタイムイベントが 次のメッセージとして到着するまで待機します。必要な子の作業を生成した後、 その完了結果が届くまで要求元が最終回答を作成できない場合に使用します。
sessions_yield が待機用の基本機能です。子の完了を検出するためだけに、
subagents、sessions_list、sessions_history、シェルの
sleep、またはプロセスポーリングを繰り返すループで置き換えないでください。
セッションの実効ツールリストに含まれている場合にのみ、sessions_yield を使用してください。
最小構成またはカスタムのツールプロファイルでは、sessions_spawn と
subagents が公開されていても、sessions_yield が公開されていない場合があります。その場合、
完了を待つためだけのポーリングループを作らないでください。
アクティブな子が存在する場合、OpenClaw は通常のターンに、ランタイムが生成した簡潔な
Active Subagents プロンプトブロックを挿入します。これにより、要求元はポーリングせずに、
現在の子セッション、実行 ID、ステータス、ラベル、タスク、taskName エイリアスを確認できます。
そのブロックのタスクフィールドとラベルフィールドは、指示ではなくデータとして引用されます。これらは
ユーザーまたはモデルが指定した生成引数に由来する可能性があるためです。
ツール:subagents
要求元セッションツリーが所有する、生成済みサブエージェント実行とバックグラウンドタスクの レコードを一覧表示します。タスク行には、ネイティブサブエージェント、ACP 実行、 Gateway CLI/メディア作業、Cron 実行が含まれます。スコープは現在の 要求元に限定され、子が確認できるのは自身が制御する子だけです。
オンデマンドのステータス確認とデバッグには subagents を使用します。完了イベントを
待つには sessions_yield を使用します。
タスクを停止するには、action: "list" が返した taskId とともに action: "cancel" を使用します。
キャンセルは制御対象のセッションツリー内に限定されます。末端の
サブエージェントは、別のセッションが所有する作業をキャンセルできません。
スレッドにバインドされたセッション
チャンネルでスレッドへのバインドが有効な場合、サブエージェントをスレッドに バインドしたままにでき、そのスレッド内の後続ユーザーメッセージは 同じサブエージェントセッションへ引き続きルーティングされます。
スレッドをサポートするチャンネル
会話バインドアダプターを登録しているチャンネルは、永続的なスレッドバインド型サブエージェントセッション
(sessions_spawn と thread: true)をサポートします。この機能をサポートする同梱チャンネルは、Discord、
iMessage、Matrix、Telegram です。Discord と Matrix はデフォルトで
子スレッドを作成し、Telegram と iMessage はデフォルトで現在の会話をバインドします。
有効化、タイムアウト、spawnSessions には、チャンネルごとの threadBindings 設定キーを使用します。
クイックフロー
生成
thread: true(および必要に応じて mode: "session")を指定して sessions_spawn。
バインド
OpenClaw は、アクティブなチャンネルでそのセッションターゲット用のスレッドを作成またはバインドします。
後続メッセージをルーティング
そのスレッド内の返信と後続メッセージは、バインドされたセッションへルーティングされます。
タイムアウトを確認
非アクティブ時の自動フォーカス解除を確認/更新するには /session idle を使用し、
ハード上限を制御するには /session max-age を使用します。
切り離し
手動で切り離すには /unfocus を使用します。
手動制御
| コマンド | 効果 |
|---|---|
/focus <target> |
現在のスレッドをサブエージェント/セッションターゲットにバインドする(またはスレッドを作成する) |
/unfocus |
現在バインドされているスレッドのバインドを解除する |
/agents |
アクティブな実行とバインド状態(binding:<id>、unbound、または bindings unavailable)を一覧表示する |
/session idle |
アイドル時の自動フォーカス解除を確認/更新する(フォーカス中のバインド済みスレッドのみ) |
/session max-age |
ハード上限を確認/更新する(フォーカス中のバインド済みスレッドのみ) |
設定スイッチ
- グローバルデフォルト:
session.threadBindings.enabled、session.threadBindings.idleHours、session.threadBindings.maxAgeHours。 - チャンネルごとの上書きと生成時の自動バインドキーはアダプター固有です。前述のスレッドをサポートするチャンネルを参照してください。
現在のアダプターの詳細については、設定リファレンスと スラッシュコマンドを参照してください。
許可リスト
agents.entries.*.subagents.allowAgentsstring[]明示的な agentId を介してターゲットに指定できる設定済みエージェント ID のリスト(["*"] は任意の設定済みターゲットを許可します)。デフォルトでは要求元エージェントのみです。リストを設定した後も、要求元が agentId で自身を生成できるようにする場合は、要求元の ID をリストに含めてください。
agents.defaults.subagents.allowAgentsstring[]要求元エージェントが独自の subagents.allowAgents を設定していない場合に使用される、設定済みターゲットエージェントのデフォルト許可リスト。
agents.defaults.subagents.requireAgentIdbooleandefault: falseagentId を省略した sessions_spawn 呼び出しをブロックします(明示的なプロファイル選択を強制します)。エージェントごとの上書き:agents.entries.*.subagents.requireAgentId。
agents.defaults.subagents.announceTimeoutMsnumberdefault: 120000Gateway の agent 通知配信試行に対する、呼び出しごとのタイムアウト。値は正の整数のミリ秒で、プラットフォームで安全なタイマーの最大値に制限されます。一時的な再試行により、通知の総待機時間が設定された 1 回分のタイムアウトより長くなる場合があります。
要求元セッションがサンドボックス化されている場合、sessions_spawn は
サンドボックス化されずに実行されるターゲットを拒否します。
検出
agents_list を使用して、sessions_spawn に対して現在許可されているエージェント ID を確認します。レスポンスには、一覧に含まれる各エージェントの有効なモデルと埋め込みランタイムメタデータが含まれるため、呼び出し元は OpenClaw、Codex app-server、およびその他の構成済みネイティブランタイムを区別できます。
allowAgents のエントリは、agents.entries.* で構成されているエージェント ID を指す必要があります。
["*"] は、構成済みの任意の対象エージェントとリクエスターを意味します。エージェント構成が削除されても、その ID が allowAgents に残っている場合、sessions_spawn はその ID を拒否し、agents_list はそれを省略します。古い許可リストのエントリを削除するには openclaw doctor --fix を実行します。または、対象がデフォルトを継承しながらスポーン可能な状態を維持する必要がある場合は、最小限の agents.entries.* エントリを追加します。
自動アーカイブ
- サブエージェントセッションは、
agents.defaults.subagents.archiveAfterMinutes後(デフォルトは60)に自動的にアーカイブされます。 - アーカイブでは
sessions.deleteを使用し、トランスクリプトの名前を*.deleted.<timestamp>に変更します(同じフォルダー内)。 cleanup: "delete"は通知直後にアーカイブします(名前変更によってトランスクリプトは引き続き保持されます)。- 自動アーカイブはベストエフォートです。Gateway が再起動すると、保留中のタイマーは失われます。
- 構成された実行タイムアウトは自動アーカイブを行いません。実行を停止するだけです。セッションは自動アーカイブされるまで残ります。
- 自動アーカイブは、深さ 1 と深さ 2 のセッションに同様に適用されます。
- ブラウザーのクリーンアップはアーカイブのクリーンアップとは別です。トランスクリプトやセッションレコードが保持される場合でも、追跡対象のブラウザータブやプロセスは、実行の終了時にベストエフォートで閉じられます。
ネストされたサブエージェント
デフォルトでは、サブエージェントは独自のサブエージェントをスポーンできません
(maxSpawnDepth: 1)。maxSpawnDepth: 2 を設定すると、1 レベルの
ネスト、つまりオーケストレーターパターンを有効にできます。メイン → オーケストレーターサブエージェント →
ワーカーサブサブエージェントという構成です。
{ agents: { defaults: { subagents: { maxSpawnDepth: 2, // サブエージェントによる子のスポーンを許可(デフォルト: 1、範囲 1-5) maxChildrenPerAgent: 5, // エージェントセッションごとのアクティブな子の最大数(デフォルト: 5、範囲 1-20) maxConcurrent: 8, // グローバル同時実行レーンの上限(デフォルト: 8) runTimeoutSeconds: 900, // sessions_spawn のデフォルトタイムアウト(0 = タイムアウトなし) announceTimeoutMs: 120000, // 呼び出しごとの Gateway 通知タイムアウト }, }, },}深さレベル
| 深さ | セッションキーの形式 | ロール | スポーン可能か |
|---|---|---|---|
| 0 | agent:<id>:main |
メインエージェント | 常に可能 |
| 1 | agent:<id>:subagent:<uuid> |
サブエージェント(深さ 2 が許可されている場合はオーケストレーター) | maxSpawnDepth >= 2 の場合のみ |
| 2 | agent:<id>:subagent:<uuid>:subagent:<uuid> |
サブサブエージェント(末端ワーカー) | 不可 |
通知チェーン
結果はチェーンをさかのぼって返されます。
- 深さ 2 のワーカーが終了 → 親(深さ 1 のオーケストレーター)に通知します。
- 深さ 1 のオーケストレーターが通知を受信し、結果を統合して終了 → メインに通知します。
- メインエージェントが通知を受信し、ユーザーに配信します。
各レベルが受信するのは、直接の子からの通知のみです。
深さごとのツールポリシー
- 子はスポーン時に、リクエスターに適用される送信者ポリシーを取得します。送信者のない子の実行と、認証済みオペレーターによる再開では、後から
toolsBySenderが変更されてもそのスナップショットが維持されます。現在のグローバル、エージェント、プロバイダー、サンドボックス、およびサブエージェントの制限は引き続き適用されます。代わりに、子を対象とする新しい外部チャネルのターンでは、現在の送信者ポリシーが再解決されます。 - ロールと制御スコープは、スポーン時にセッションメタデータへ書き込まれます。これにより、フラット化または復元されたセッションキーが誤ってオーケストレーター権限を再取得することを防ぎます。
- 深さ 1(
maxSpawnDepth >= 2の場合のオーケストレーター): 子をスポーンして状態を確認できるよう、sessions_spawn、subagents、sessions_list、sessions_historyが付与されます。その他のセッションツールとシステムツールは引き続き拒否されます。 - 深さ 1(
maxSpawnDepth == 1の場合の末端): セッションツールはありません(現在のデフォルト動作)。 - 深さ 2(末端ワーカー): セッションツールはありません。深さ 2 では
sessions_spawnが常に拒否されます。それ以上の子はスポーンできません。
エージェントごとのスポーン上限
各エージェントセッションは(深さにかかわらず)、同時に最大 maxChildrenPerAgent
(デフォルトは 5)個のアクティブな子を持つことができます。これにより、単一のオーケストレーターから制御不能に処理が拡散することを防ぎます。
カスケード停止
深さ 1 のオーケストレーターを停止すると、その深さ 2 の子もすべて 自動的に停止します。
- メインチャットで
/stopを実行すると、深さ 1 のすべてのエージェントが停止し、その深さ 2 の子にも停止がカスケードされます。
認証
サブエージェントの認証は、セッションタイプではなくエージェント IDによって解決されます。
- サブエージェントのセッションキーは
agent:<agentId>:subagent:<uuid>です。 - 認証ストアは、そのエージェントの
agentDirから読み込まれます。 - メインエージェントの認証プロファイルはフォールバックとしてマージされます。競合する場合は、エージェントのプロファイルがメインのプロファイルを上書きします。
マージは加算的に行われるため、メインのプロファイルは常に フォールバックとして利用できます。エージェントごとに完全に分離された認証は、まだサポートされていません。
通知
サブエージェントは通知ステップを介して結果を報告します。
- 通知ステップは、リクエスターのセッションではなく、サブエージェントのセッション内で実行されます。
- サブエージェントが正確に
ANNOUNCE_SKIPと応答した場合、何も投稿されません。 - 最新のアシスタントテキストが正確なサイレントトークン
NO_REPLY/no_replyである場合、それ以前に表示可能な進捗が存在していても通知出力は抑制されます。
配信方法は、リクエスターの深さによって異なります。
- 最上位のリクエスターセッションでは、外部配信(
deliver=true)を伴う後続のagent呼び出しが使用されます。 - ネストされたリクエスターのサブエージェントセッションは、内部の後続注入(
deliver=false)を受信するため、オーケストレーターはセッション内で子の結果を統合できます。 - ネストされたリクエスターのサブエージェントセッションが存在しない場合、OpenClaw は利用可能であれば、そのセッションのリクエスターにフォールバックします。
最上位のリクエスターセッションでは、完了モードの直接配信時に、まず 関連付けられた会話またはスレッドのルートとフックのオーバーライドを解決し、その後、 不足しているチャネル対象フィールドをリクエスターセッションに保存されたルートから補完します。 これにより、完了元がチャネルしか特定していない場合でも、 完了通知が正しいチャットまたはトピックに送られます。
ネストされた完了結果を構築する際、子の完了結果の集約は現在のリクエスター実行に限定されるため、 以前の実行による古い子の出力が現在の通知に混入することを防ぎます。通知応答は、 チャネルアダプターで利用可能な場合、スレッドまたはトピックのルーティングを維持します。
通知コンテキスト
通知コンテキストは、安定した内部イベントブロックに正規化されます。
| フィールド | ソース |
|---|---|
| ソース | subagent または cron |
| セッション ID | 子セッションのキー/ID |
| タイプ | 通知タイプ + タスクラベル |
| ステータス | ランタイム結果(ok、error、timeout、または unknown)から導出 — モデルのテキストからは推測しない |
| 結果の内容 | 子からの最新の表示可能なアシスタントテキスト |
| 後続処理 | 応答する場合とサイレントのままにする場合を説明する指示 |
失敗して終了した実行では、取得された応答テキストを再生せずに 失敗ステータスを報告します。ツールまたは toolResult の出力が子の結果テキストに昇格することはありません。
統計行
通知ペイロードの末尾には、ラップされている場合でも統計行が含まれます。
- ランタイム(例:
runtime 5m12s)。 - トークン使用量(入力/出力/合計)。
- モデルの料金が構成されている場合の推定コスト(
models.providers.*.models[].cost)。 sessionKey、sessionId、およびトランスクリプトのパス。これにより、メインエージェントはsessions_historyを介して履歴を取得するか、ディスク上のファイルを確認できます。
内部メタデータはオーケストレーション専用です。ユーザー向けの応答は、 通常のアシスタントの文体に書き換える必要があります。
sessions_history を推奨する理由
sessions_history は、エージェントのターン内から子のトランスクリプトを
読み取るための、より安全なオーケストレーション経路です。
- 汎用ログの秘匿化が無効な場合でも、認証情報やトークンに似たテキストを秘匿化します。
- 長いテキストブロックを切り詰め(ブロックごとに 4000 文字)、思考シグネチャ、推論再生ペイロード、およびインライン画像データを除外します。
- レスポンスに 80 KB の上限を適用します。サイズを超える行は
[sessions_history omitted: message too large]に置き換えられます。 - 存在する場合は
nextOffsetを使用して、より古いトランスクリプトウィンドウへ後方にページングします。 sessions_historyは、メッセージテキストから推論タグ、<relevant-memories>のスキャフォールディング、またはツール呼び出し XML を削除しません。秘匿化とサイズ制限のみを適用し、生のトランスクリプト形式に近い構造化コンテンツブロックを返します。/subagents logは構造化ブロックではなくプレーンなチャット行をレンダリングするため、より強力な文章サニタイザー(推論タグ、メモリスキャフォールディング、およびツール呼び出し XML の削除)を適用します。- 完全にバイト単位で一致するトランスクリプトが必要な場合は、ディスク上の生のトランスクリプトを直接確認する方法がフォールバックになります。
ツールポリシー
サブエージェントには、まず親または対象エージェントと同じプロファイルとツールポリシーのパイプラインが適用されます。その後、OpenClaw がサブエージェントの制限レイヤーを適用します。
サブエージェントは、深さやロールにかかわらず、常に gateway、agents_list、session_status、および
cron を利用できません(システムレベル/対話型のツール、または
メインエージェントが調整すべきツール)。末端のサブエージェント(デフォルトの深さ 1 の
動作、および深さ 2 のすべてのサブエージェント)は、さらに subagents、
sessions_list、sessions_history、および sessions_spawn を利用できません。サブエージェントには
message ツールが付与されることはありません。これはこの拒否リストによって
フィルタリングされるのではなく、スポーン時に無効化されます。また、サブエージェントが
通知チェーンのみを介して通信するよう、sessions_send も引き続き拒否されます。
sessions_history はここでも、制限され、サニタイズされた参照ビューとして機能します。
生のトランスクリプトダンプではありません。
maxSpawnDepth >= 2 の場合、深さ 1 のオーケストレーターサブエージェントには、
子を管理できるよう、さらに sessions_spawn、subagents、sessions_list、および
sessions_history が付与されます。
構成によるオーバーライド
{ agents: { defaults: { subagents: { maxConcurrent: 1, }, }, }, tools: { subagents: { tools: { // deny が優先される deny: ["gateway", "cron"], // allow を設定すると、許可リストのみになる(deny は引き続き優先される) // allow: ["read", "exec", "process"] }, }, },}tools.subagents.tools.allow は最終的な許可リスト専用フィルターです。すでに解決済みの
ツールセットを絞り込むことはできますが、tools.profile によって削除されたツールを
再追加することはできません。たとえば、tools.profile: "coding" には
web_search/web_fetch が含まれますが、browser ツールは含まれません。
コーディングプロファイルのサブエージェントでブラウザー自動化を使用できるようにするには、
プロファイル段階で browser を追加します。
{ tools: { profile: "coding", alsoAllow: ["browser"], },}1 つのエージェントだけにブラウザー自動化を許可する場合は、エージェントごとの
agents.entries.*.tools.alsoAllow: ["browser"] を使用します。
同時実行
サブエージェントは専用のプロセス内キューレーンを使用します。
- レーン名:
subagent - 同時実行数:
agents.defaults.subagents.maxConcurrent(デフォルト8)
稼働状況と復旧
OpenClaw は、endedAt がないことを、サブエージェントがまだ稼働中である恒久的な証拠とはみなしません。
古い実行とみなす期間を超えた未終了の実行
(2 時間、または設定された実行タイムアウトに短い猶予期間を加えた時間のうち、
長い方)は、/subagents list、ステータス概要、
子孫の完了ゲート、およびセッションごとの同時実行チェックで、
アクティブまたは保留中としてカウントされなくなります。
Gateway の再起動後、復元された古い未終了の実行は、その子セッションが
abortedLastRun: true とマークされていない限り削除されます。再起動によって中断された
実行は、サブエージェントの孤立復旧フロー用に登録されたままになります。古い
実行は再開せずに終了処理され、新しい子セッションには、中断マーカーが消去される前に
合成された再開メッセージが送られます。
自動再起動復旧は、子セッションごとに制限されます。同じ
サブエージェントの子が、短時間の再停止判定期間内に孤立復旧の対象として繰り返し受け入れられた場合、
OpenClaw はそのセッションに復旧トゥームストーンを永続化し、以降の再起動時に
自動再開しなくなります。タスクレコードを整合させるには
openclaw tasks maintenance --apply を実行し、トゥームストーン化されたセッションの
古い中断復旧フラグを消去するには openclaw doctor --fix を実行します。
停止
- リクエスト元のチャットで
/stopを送信すると、リクエスト元のセッションが中断され、そのセッションから起動されたアクティブなサブエージェントの実行も、ネストされた子へ連鎖して停止します。
制限事項
- サブエージェントによる通知はベストエフォートです。Gateway が再起動すると、保留中の「通知を返す」処理は失われます。
- サブエージェントは引き続き同じ Gateway プロセスのリソースを共有します。
maxConcurrentは安全弁として扱ってください。 sessions_spawnは常にノンブロッキングです。{ status: "accepted", runId, childSessionKey }を即座に返します。- サブエージェントのコンテキストには、
AGENTS.mdとTOOLS.mdのみが注入されます(SOUL.md、IDENTITY.md、USER.md、MEMORY.md、HEARTBEAT.md、BOOTSTRAP.mdは注入されません)。Codex ネイティブのサブエージェントにも同じ境界が適用されます。TOOLS.mdは継承された Codex スレッド命令に残り、親専用のペルソナ、アイデンティティ、ユーザーファイルはターン単位のコラボレーション命令として注入されるため、子がそれらを複製することはありません。 - 最大ネスト深度は 5(
maxSpawnDepthの範囲: 1-5)です。ほとんどのユースケースでは深度 2 を推奨します。 maxChildrenPerAgentはセッションごとのアクティブな子の数を制限します(デフォルト5、範囲1-20)。