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 を使用します。
未加工の完全なトランスクリプトを確認するには、ディスク上のトランスクリプトのパスを参照します。
スレッド紐づけの制御
これらのコマンドは、永続的なスレッド紐づけをサポートするチャンネルで使用できます。 以下のスレッド対応チャンネルを参照してください。
/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応答テキスト。tool/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.list[]エントリが必要です。agents_listの通常の OpenClaw 設定エージェントには、デフォルトのサブエージェントランタイムを使用してください。
コンテキストモード
呼び出し元が現在のトランスクリプトのフォークを明示的に要求しない限り、 ネイティブサブエージェントは分離された状態で開始します。
| モード | 使用する場面 | 動作 |
|---|---|---|
isolated |
新規の調査、独立した実装、処理の遅いツール作業、またはタスクテキスト内で説明可能なあらゆる作業 | クリーンな子トランスクリプトを作成します。これがデフォルトであり、トークン使用量を抑えます。 |
fork |
現在の会話、以前のツール結果、または依頼元のトランスクリプトにすでに含まれる詳細な指示に依存する作業 | 子エージェントが開始する前に、依頼元のトランスクリプトを子セッションへ分岐させます。 |
fork は必要な場合に限って使用してください。コンテキスト依存の委任に使用するものであり、
明確なタスクプロンプトを記述する代わりにはなりません。
ツール: sessions_spawn
グローバルな subagent レーン上で deliver: false を指定してサブエージェント実行を開始し、
その後、通知ステップを実行して、通知応答を依頼元のチャットチャンネルへ投稿します。
利用可否は、呼び出し元に適用される実効ツールポリシーによって決まります。組み込みの
coding プロファイルには sessions_spawn が含まれますが、messaging と minimal には
含まれません。full ではすべてのツールが許可されます。制限の厳しいプロファイルを使用しながら
作業を委任する必要があるエージェントには、tools.alsoAllow: ["sessions_spawn", "sessions_yield", "subagents"] を追加するか、tools.profile: "coding" を使用します。
チャンネルやグループ、プロバイダー、サンドボックス、エージェントごとの許可・拒否ポリシーによって、
プロファイルの適用後にツールが除外される場合もあります。同じセッションから /tools を使用して、
実効ツール一覧を確認してください。
デフォルト:
- モデル:
agents.defaults.subagents.model(またはエージェントごとのagents.list[].subagents.model)を設定しない限り、ネイティブサブエージェントは呼び出し元のモデルを継承します。ACP ランタイムでの生成では、設定済みのサブエージェントモデルがある場合は同じモデルを使用し、それ以外の場合は ACP ハーネス独自のデフォルトを維持します。明示的なsessions_spawn.modelが常に優先されます。 - 思考:
agents.defaults.subagents.thinking(またはエージェントごとのagents.list[].subagents.thinking)を設定しない限り、ネイティブサブエージェントは呼び出し元の設定を継承します。ACP ランタイムでの生成では、選択したモデルに対してagents.defaults.models["provider/model"].params.thinkingも適用されます。明示的なsessions_spawn.thinkingが常に優先されます。 - 実行タイムアウト:
agents.defaults.subagents.runTimeoutSecondsが設定されている場合、OpenClaw はその値を使用します。それ以外の場合は0(タイムアウトなし)へフォールバックします。sessions_spawnは呼び出しごとのタイムアウトのオーバーライドを受け付けません。 - タスク配信: ネイティブサブエージェントは、最初に表示される
[Subagent Task]メッセージで委任されたタスクを受け取ります。サブエージェントのシステムプロンプトにはランタイムルールとルーティングコンテキストが含まれますが、タスクの非表示の複製は含まれません。
受理されたネイティブサブエージェントの生成では、ツール結果に解決済みの子モデルのメタデータが含まれます。
resolvedModel には適用されたモデル参照が含まれ、参照にプロバイダーが含まれる場合、
resolvedProvider にはそのプロバイダーのプレフィックスが含まれます。
委任プロンプトモード
agents.defaults.subagents.delegationMode はプロンプトのガイダンスのみを制御します。ツールポリシーを変更したり、委任を強制したりするものではありません。
suggest(デフォルト): 規模の大きい作業や時間のかかる作業ではサブエージェントを使用するよう促す、標準的なプロンプトを維持します。prefer: メインエージェントに応答性を保たせ、直接応答より複雑な作業はすべてsessions_spawnを通じて委任するよう指示します。
エージェントごとのオーバーライド: agents.list[].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.list[] エントリ専用です。
resumeSessionIdstringACP 専用。runtime: "acp" の場合に既存の ACP ハーネスセッションを再開します。ネイティブサブエージェントの生成では無視されます。
streamTo"parent"ACP 専用。runtime: "acp" の場合に ACP 実行の出力を親セッションへストリーミングします。ネイティブサブエージェントの生成では省略してください。
modelstringサブエージェントのモデルを上書きします。無効な値はスキップされ、ツール結果に警告を表示したうえで、サブエージェントはデフォルトモデルで実行されます。
thinkingstringサブエージェント実行の思考レベルを上書きします。
threadbooleandefault: falsetrue の場合、このサブエージェントセッションに対するチャンネルスレッドのバインドを要求します。
mode"run" | "session"default: runthread: true で mode を省略した場合、デフォルトは session になります。mode: "session" には thread: true が必要です。
要求元チャンネルでスレッドのバインドを利用できない場合は、代わりに mode: "run" を使用してください。
cleanup"delete" | "keep"default: keep"delete" は通知直後にセッションをアーカイブします(名前変更によりトランスクリプトは引き続き保持されます)。
sandbox"inherit" | "require"default: inheritrequire は、ターゲットの子ランタイムがサンドボックス化されていない場合、生成を拒否します。
context"isolated" | "fork"default: isolatedfork は要求元の現在のトランスクリプトを子セッションへ分岐します。ネイティブサブエージェント専用です。スレッドにバインドされた生成のデフォルトは fork、スレッドなしの生成のデフォルトは isolated です。
タスク名とターゲット指定
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_yield を公開せずに
sessions_spawn と subagents を公開している場合があります。その場合、完了を待つためだけに
ポーリングループを作らないでください。
アクティブな子が存在する場合、OpenClaw はランタイムが生成する簡潔な
Active Subagents プロンプトブロックを通常のターンに挿入します。これにより、要求元はポーリングせずに
現在の子セッション、実行 ID、ステータス、ラベル、タスク、および
taskName エイリアスを確認できます。このブロック内のタスクフィールドとラベルフィールドは
命令ではなくデータとして引用されます。これらはユーザーまたはモデルが指定した生成引数に
由来する可能性があるためです。
ツール:subagents
要求元セッションが所有する、生成済みサブエージェント実行の一覧を表示します。範囲は 現在の要求元に限定され、子が参照できるのは自身が制御する子だけです。
オンデマンドのステータス確認とデバッグには subagents を使用します。完了イベントを
待つには sessions_yield を使用します。
スレッドにバインドされたセッション
チャンネルでスレッドのバインドが有効な場合、サブエージェントをスレッドにバインドしたままにできるため、 そのスレッド内の後続ユーザーメッセージは同じサブエージェントセッションへ引き続きルーティングされます。
スレッドをサポートするチャンネル
会話バインドアダプターを登録しているチャンネルでは、永続的なスレッドバインド型サブエージェントセッション
(thread: true を指定した sessions_spawn)がサポートされます。この機能を備えた同梱チャンネルは、
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.list[].subagents.allowAgentsstring[]明示的な agentId でターゲットにできる設定済みエージェント ID の一覧(["*"] は任意の設定済みターゲットを許可します)。デフォルトでは要求元エージェントのみです。一覧を設定したうえで、要求元が agentId を使って自身を生成できるようにする場合は、その一覧に要求元の ID を含めてください。
agents.defaults.subagents.allowAgentsstring[]要求元エージェントが独自の subagents.allowAgents を設定していない場合に使用される、設定済みターゲットエージェントのデフォルト許可リスト。
agents.defaults.subagents.requireAgentIdbooleandefault: falseagentId を省略した sessions_spawn 呼び出しをブロックします(明示的なプロファイル選択を強制します)。エージェント単位の上書き:agents.list[].subagents.requireAgentId。
agents.defaults.subagents.announceTimeoutMsnumberdefault: 120000Gateway の agent 通知配信試行に対する呼び出しごとのタイムアウト。値は正の整数のミリ秒で、プラットフォーム上安全なタイマーの最大値に制限されます。一時的な再試行により、通知の合計待機時間が設定した 1 回分のタイムアウトより長くなる場合があります。
要求元セッションがサンドボックス化されている場合、sessions_spawn は
サンドボックス外で実行されるターゲットを拒否します。
検出
現在 sessions_spawn に許可されているエージェント ID を確認するには、
agents_list を使用します。応答には一覧に含まれる各エージェントの有効な
モデルと埋め込みランタイムメタデータが含まれるため、呼び出し元は OpenClaw、Codex
app-server、およびその他の設定済みネイティブランタイムを区別できます。
allowAgents のエントリは、agents.list[] 内の設定済みエージェント ID を指す必要があります。
["*"] は、任意の設定済みターゲットエージェントと要求元を意味します。エージェント設定が
削除されてもその ID が allowAgents に残っている場合、sessions_spawn はその ID を
拒否し、agents_list はその ID を省略します。古い許可リストエントリを削除するには
openclaw doctor --fix を実行するか、デフォルトを継承しながらターゲットを
引き続き生成可能にする必要がある場合は、最小限の agents.list[] エントリを追加してください。
自動アーカイブ
- サブエージェントセッションは、
agents.defaults.subagents.archiveAfterMinutes(デフォルトは60)後に自動的にアーカイブされます。 - アーカイブでは
sessions.deleteを使用し、トランスクリプトの名前を*.deleted.<timestamp>に変更します(同じフォルダー内)。 cleanup: "delete"は通知直後にアーカイブします(名前変更によりトランスクリプトは引き続き保持されます)。- 自動アーカイブはベストエフォートです。Gateway が再起動すると、保留中のタイマーは失われます。
- 設定された実行タイムアウトでは自動アーカイブされません。実行が停止するだけです。セッションは自動アーカイブされるまで残ります。
- 自動アーカイブは深度 1 と深度 2 のセッションに同様に適用されます。
- ブラウザーのクリーンアップはアーカイブのクリーンアップとは別です。トランスクリプト/セッションレコードを保持する場合でも、追跡対象のブラウザータブ/プロセスは実行終了時にベストエフォートで閉じられます。
ネストされたサブエージェント
デフォルトでは、サブエージェントは自身のサブエージェントを生成できません
(maxSpawnDepth: 1)。1 段階のネスト、つまりオーケストレーターパターン(メイン → オーケストレーターサブエージェント →
ワーカーサブサブエージェント)を有効にするには、maxSpawnDepth: 2 を設定します。
{ 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 の統括役が通知を受け取り、結果を統合して完了 → メインへ通知します。
- メインエージェントが通知を受け取り、ユーザーへ届けます。
各階層には、直接の子からの通知のみが表示されます。
深さ別のツールポリシー
- 役割と制御範囲は、起動時にセッションメタデータへ書き込まれます。これにより、フラット化または復元されたセッションキーが誤って統括権限を取り戻すのを防ぎます。
- 深さ 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)。 - メインエージェントが
sessions_historyで履歴を取得したり、ディスク上のファイルを確認したりできるようにするための、sessionKey、sessionId、およびトランスクリプトのパス。
内部メタデータは統括専用です。ユーザー向けの応答は、通常のアシスタントの 文体に書き直す必要があります。
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: ["gateway", "cron"], // allow を設定すると、許可リストのみになる(拒否は引き続き優先される) // allow: ["read", "exec", "process"] }, }, },}tools.subagents.tools.allow は最終的な許可リスト専用フィルターです。
すでに解決されたツールセットを絞り込むことはできますが、tools.profile に
よって削除されたツールを再追加することはできません。たとえば、
tools.profile: "coding" には web_search / web_fetch は含まれますが、
browser ツールは含まれません。コーディングプロファイルのサブエージェントに
ブラウザー自動化を使用させるには、プロファイル段階でブラウザーを追加します。
{ tools: { profile: "coding", alsoAllow: ["browser"], },}1 つのエージェントだけにブラウザー自動化を付与する場合は、エージェント単位の
agents.list[].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)。