サブエージェント委譲
源码版本v2026.7.20
職務
delegate_tool が主 agent のサブタスクを隔離されたサブエージェントに委譲する:サブエージェントは自身の対話、自身のターミナル、自身のツールセットを持ち、走り終えたら最終結果だけを親に返す。これで「コンテキストコストゼロ」のパイプラインを実現する——親 agent のコンテキストはサブタスクの過程詳細に汚染されない。サブエージェントは ThreadPoolExecutor worker で走り、危険コマンドはデフォルトで auto-deny(auto-approve に設定可能)。
主要ファイル
def delegate_task:2426— 委譲入口class DelegateEvent:625— 委譲イベント列挙auto-deny / auto-approve コールバック:61-103—_subagent_auto_deny(安全デフォルト)/_subagent_auto_approve(opt-in YOLO)_get_subagent_approval_callback:102-160—delegation.subagent_auto_approve設定でコールバックを選ぶDaemonThreadPoolExecutor:1978-1990— サブエージェント用の常駐スレッドプールwith DaemonThreadPoolExecutor:2651-2660— 委譲実行コンテキストtools/daemon_pool.py—DaemonThreadPoolExecutor実装多バックエンドターミナル:5-15— サブエージェントのターミナルは 6 つのサンドボックスバックエンドのいずれかで実行(サンドボックス参照)
データフロー
- 主ループの provider が
tool_call: delegateを返す。 delegate_task:2426が呼ばれ、サブタスク記述と任意の toolsets を受け取る。DaemonThreadPoolExecutor:2651で worker を起動:- worker initializer が承認コールバックをインストール(
tools/delegate_tool.py:102)、デフォルトで危険コマンドは auto-deny - サブエージェントは自身の対話コンテキストを構築し、
run_conversation:588を呼んでループを回す - サブエージェントのツール呼び出しは
registry:765を経る(親 agent が toolsets を制限可能)
- worker initializer が承認コールバックをインストール(
- サブエージェント完了後、最終テキストだけを返し、delegate_task は
tool_result:798でラップして親 agent に戻す。 - 親 agent のコンテキストは tool 結果を一つ増やすだけで、過程に汚染されない。
まとめ
サブエージェント委譲 = コンテキスト隔離 + 危険コマンド管理。親 agent は結果だけを見て過程を見ない、これで長いパイプラインが過程ノイズで膨れ上がらない。安全デフォルトは auto-deny、バッチ/cron では opt-in で auto-approve 可能。ターミナル実行はサンドボックスバックエンドに落ちる。