マルチエージェント ルーティング
目的:1 つの稼働中の Gateway で、複数の 分離された エージェント(個別のワークスペース +agentDir + セッション)と、複数のチャンネル アカウント(例:2 つの WhatsApp)を同時に扱います。インバウンドは、バインディングによってエージェントへルーティングされます。 インバウンドはバインディングを介してエージェントにルーティングされます。
「1 つのエージェント」とは?
エージェントとは、次をそれぞれ専有する、完全にスコープ化された「頭脳」です。- ワークスペース(ファイル、AGENTS.md / SOUL.md / USER.md、ローカル ノート、ペルソナ ルール)。
- 状態ディレクトリ(
agentDir):認証プロファイル、モデル レジストリ、エージェント別設定。 - セッション ストア(チャット履歴 + ルーティング状態):
~/.openclaw/agents/<agentId>/sessions配下。
agentDir
を再利用しないでください (認証/セッションの衝突を引き起こします)。 メイン エージェントの認証情報は自動的に共有 されません。エージェント間で agentDir を再利用しないでください(認証/セッションの衝突を引き起こします)。認証情報を共有したい場合は、auth-profiles.json を別のエージェントの agentDir にコピーしてください。
Skills は、各ワークスペースの skills/ フォルダーを通じて エージェント単位 で提供され、共有 Skills は ~/.openclaw/skills から利用できます。詳細は Skills: per-agent vs shared を参照してください。 Skills: per-agent vs sharedを参照してください。 Skills: per-agent vs sharedを参照してください。
Gateway は 1 つのエージェント(デフォルト)または 複数のエージェント を並列にホストできます。
ワークスペースに関する注意: 各エージェントのワークスペースは デフォルトの cwd であり、厳密なサンドボックスではありません。相対パスはワークスペース内に解決されますが、サンドボックス化が有効でない限り、絶対パスはホスト上の他の場所へ到達できます。詳細は Sandboxing を参照してください。 ワークスペース内では相対パスが解決されますが、サンドボックス化が有効になっていない限り、絶対パスは
他のホストロケーションに到達することができます。
Sandboxing を参照してください。 ワークスペース内では相対パスが解決されますが、サンドボックス化が有効になっていない限り、絶対パスは
他のホストロケーションに到達することができます。
Sandboxing を参照してください。
パス(クイック マップ)
- 設定:
~/.openclaw/openclaw.json(またはOPENCLAW_CONFIG_PATH) - 状態ディレクトリ:
~/.openclaw(またはOPENCLAW_STATE_DIR) - ワークスペース:
~/.openclaw/workspace(または~/.openclaw/workspace-<agentId>) - エージェント ディレクトリ:
~/.openclaw/agents/<agentId>/agent(またはagents.list[].agentDir) - セッション:
~/.openclaw/agents/<agentId>/sessions
単一エージェント モード(デフォルト)
何も設定しない場合、OpenClaw は単一エージェントで実行されます。agentIdはmainがデフォルトです。- セッションは
agent:main:<mainKey>としてキー付けされます。 - ワークスペースのデフォルトは
~/.openclaw/workspace(OPENCLAW_PROFILEが設定されている場合は~/.openclaw/workspace-<profile>)です。 - 状態のデフォルトは
~/.openclaw/agents/main/agentです。
エージェント ヘルパー
エージェント ウィザードを使用して、新しい分離エージェントを追加します。bindings を追加します(またはウィザードに任せます)。
以下の認証を行います。
複数エージェント = 複数人、複数の人格
複数エージェント では、各agentId が 完全に分離されたペルソナ になります。
- 異なる電話番号/アカウント(チャンネル
accountId単位)。 - 異なる人格(
AGENTS.mdやSOUL.mdなど、エージェント別ワークスペース ファイル)。 - 分離された認証 + セッション(明示的に有効化しない限り、相互干渉はありません)。
1 つの WhatsApp 番号、複数人(DM 分割)
1 つの WhatsApp アカウント のまま、異なる WhatsApp DM を異なるエージェントへルーティングできます。送信者の E.164(例:+15551234567)に一致させて peer.kind: "dm" を行います。返信は同じ WhatsApp 番号から送信されます(エージェントごとの送信者 ID はありません)。 peer.kind: "direct" を使用して、送信者の E.164(例: +15551234567)にマッチさせます。 返信は依然として同じWhatsApp番号(エージェントごとの送信者IDなし)から来ます。 peer.kind: "direct" を使用して、送信者の E.164(例: +15551234567)にマッチさせます。 返信は依然として同じWhatsApp番号(エージェントごとの送信者IDなし)から来ます。
重要な注意:ダイレクト チャットはエージェントの メイン セッション キー に集約されるため、真の分離には 1 人につき 1 エージェント が必要です。
例:
- DM のアクセス制御は WhatsApp アカウント単位でグローバル(ペアリング/許可リスト)であり、エージェント単位ではありません。
- 共有グループについては、グループを 1 つのエージェントにバインドするか、Broadcast groups を使用してください。
ルーティング ルール(メッセージがエージェントを選ぶ仕組み)
バインディングは 決定論的 と ほとんどの特定の勝利です:peerの一致(正確な DM/グループ/チャンネル ID)parentPeerの一致(スレッド継承)- 目的:1 つの稼働中の Gateway で、複数の 分離された エージェント(個別のワークスペース +
agentDir+ セッション)と、複数のチャンネル アカウント(例:2 つの WhatsApp)を同時に扱います。インバウンドは、バインディングによってエージェントへルーティングされます。 インバウンドはバインディングを介してエージェントにルーティングされます。 guildId(Discord)teamId(Slack)- チャンネルに対する
accountIdの一致 - チャンネル レベルの一致(
accountId: "*") - デフォルト エージェントへフォールバック(
agents.list[].default、それ以外は最初のエントリ、デフォルト:main)
peer + guildId)を設定した場合、指定されたすべてのフィールドが必要です(AND セマンティクス)。
複数アカウント/電話番号
複数アカウント をサポートするチャンネル(例:WhatsApp)では、各ログインを識別するためにaccountId を使用します。各 accountId は異なるエージェントへルーティングできるため、1 台のサーバーで複数の電話番号を、セッションを混在させずにホストできます。 複数アカウント をサポートするチャンネル(例:WhatsApp)では、各ログインを識別するために accountId を使用します。各 accountId は異なるエージェントへルーティングできるため、1 台のサーバーで複数の電話番号を、セッションを混在させずにホストできます。 それぞれのaccountIdは異なるエージェントにルーティングすることができるので、1つのサーバーはセッションを混合せずに
複数の電話番号をホストできます。
概念
agentId:1 つの「頭脳」(ワークスペース、エージェント別認証、エージェント別セッション ストア)。accountId:1 つのチャンネル アカウント インスタンス(例:WhatsApp アカウント"personal"と"biz")。binding:(channel, accountId, peer)および必要に応じてギルド/チーム ID により、インバウンド メッセージをagentIdへルーティングします。- ダイレクト チャットは
agent:<agentId>:<mainKey>(エージェント別の「メイン」;session.mainKey)に集約されます。
例:2 つの WhatsApp → 2 つのエージェント
~/.openclaw/openclaw.json(JSON5):
例:WhatsApp の日常チャット + Telegram の集中作業
チャンネルで分割:WhatsApp は日常向けの高速エージェントへ、Telegram は Opus エージェントへルーティングします。- チャンネルに複数アカウントがある場合、バインディングに
accountIdを追加してください(例:{ channel: "whatsapp", accountId: "personal" })。 - 特定の DM/グループのみを Opus にルーティングし、残りはチャットに保つには、そのピアに対して
match.peerのバインディングを追加します。ピア一致は常にチャンネル全体のルールより優先されます。
例:同一チャンネルで、1 つのピアのみを Opus へ
WhatsApp は高速エージェントのままにし、1 つの DM だけを Opus にルーティングします。WhatsApp グループにバインドされたファミリー エージェント
メンション ゲーティングと、より厳格なツール ポリシーを用いて、専用のファミリー エージェントを 1 つの WhatsApp グループにバインドします。- ツールの許可/拒否リストはツールであり、スキルではありません。 スキルが
バイナリを実行する必要がある場合は、
execが許可され、バイナリがサンドボックスに存在することを確認してください。 - より厳格なゲーティングには、
agents.list[].groupChat.mentionPatternsを設定し、チャンネルのグループ許可リストを有効に保ってください。
エージェント別サンドボックスとツール設定
v2026.1.6 以降、各エージェントは独自のサンドボックスおよびツール制限を持てます。setupCommand は sandbox.docker の下にあり、コンテナ作成時に一度実行されます。
注意: setupCommand は sandbox.docker の下にあり、コンテナ作成時に一度実行されます。
注記:setupCommand は sandbox.docker 配下に存在し、コンテナ作成時に 1 度だけ実行されます。解決されたスコープが "shared" の場合、エージェント別の sandbox.docker.* オーバーライドは無視されます。
利点:
- セキュリティ分離:信頼できないエージェントに対するツール制限
- リソース制御:特定のエージェントのみをサンドボックス化し、他はホスト上で実行
- 柔軟なポリシー:エージェントごとに異なる権限
tools.elevated は global で送信者ベースです。エージェントごとに設定することはできません。
エージェント毎の境界線が必要な場合は、 exec を拒否するには agents.list[].tools を使用します。
注記:tools.elevated は グローバル で送信者ベースです。エージェント単位では設定できません。エージェント別の境界が必要な場合は、agents.list[].tools を使用して exec を拒否してください。グループのターゲティングには、@メンションが意図したエージェントに正しくマッピングされるよう、agents.list[].groupChat.mentionPatterns を使用してください。
詳細な例は Multi-Agent Sandbox & Tools を参照してください。