agentDir + セッション)、および複数のチャネルアカウント(例: 2つの WhatsApp アカウント)を運用すること。受信メッセージはバインディングを介して適切なエージェントにルーティングされます。
「1つのエージェント」とは何を指しますか?
エージェントは、以下の要素を独自に持つ、完全にスコープ化された「頭脳」です。- ワークスペース (ファイル、AGENTS.md/SOUL.md/USER.md、ローカルメモ、ペルソナルール)。
- 状態ディレクトリ (
agentDir): 認証プロファイル、モデルレジストリ、およびエージェントごとの構成を保持します。 - セッションストア (チャット履歴 + ルーティング状態):
~/.openclaw/agents/<agentId>/sessions配下に保存されます。
agentDir を再利用しないでください(認証やセッションの衝突の原因となります)。認証情報を共有したい場合は、auth-profiles.json を別のエージェントの agentDir にコピーしてください。
スキルは各ワークスペースの skills/ フォルダを介してエージェントごとに管理されます。また、~/.openclaw/skills から共有スキルを利用することも可能です。詳細は スキル: エージェントごと vs 共有 を参照してください。
ゲートウェイは、1つのエージェント(デフォルト)または複数のエージェントを並行してホストできます。
ワークスペースに関する注意: 各エージェントのワークスペースはデフォルトの作業ディレクトリ (cwd) であり、厳密なサンドボックスではありません。相対パスはワークスペース内で解決されますが、サンドボックスが有効でない限り、絶対パスを使用してホスト上の他の場所にアクセスできてしまいます。詳細は サンドボックス を参照してください。
パス (クイックマップ)
- 構成ファイル:
~/.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 を追加します(ウィザードで自動設定することも可能です)。
以下のコマンドで確認できます。
クイックスタート
各エージェントのワークスペースを作成する
ウィザードを使用するか、手動でワークスペースを作成します。各エージェントは、
SOUL.md、AGENTS.md、オプションの USER.md を含む独自のワークスペースと、~/.openclaw/agents/<agentId> 配下の専用の agentDir およびセッションストアを取得します。エージェント、アカウント、バインディングを追加する
agents.list にエージェントを追加し、channels.<channel>.accounts にチャネルアカウントを追加して、それらを bindings で接続します(例は後述)。複数のエージェント = 複数の人格、複数のキャラクター
複数のエージェントを運用する場合、各agentId は完全に独立したペルソナとして機能します。
- 異なる電話番号/アカウント (チャネルごとの
accountId)。 - 異なるキャラクター (
AGENTS.mdやSOUL.mdなどのエージェントごとのワークスペースファイルによる設定)。 - 個別の認証とセッション (明示的に有効にしない限り、データが混ざることはありません)。
1 つの WhatsApp 番号で、複数人を相手にする (DM 分割)
1 つの WhatsApp アカウントを使用しながら、異なる相手からの DM をそれぞれ別々のエージェントにルーティングできます。送信者の E.164 番号(例:+15551234567)と peer.kind: "direct" で判定します。返信はすべて同じ WhatsApp 番号から送信されます(エージェントごとの送信者 ID は持てません)。
重要な詳細: ダイレクトチャットはエージェントのメインセッションキーに集約されるため、真の分離を実現するには1人につき1つのエージェントを割り当てる必要があります。
例:
- DM のアクセス制御は、エージェントごとではなく、WhatsApp アカウント単位でグローバルに適用されます(ペアリング/許可リスト)。
- 共有グループの場合は、グループを特定のエージェントにバインドするか、ブロードキャストグループ を使用してください。
ルーティングルール (メッセージがどのエージェントに送られるか)
バインディングは確定的であり、最も条件が限定されているもの(具体的なもの)が優先されます。peerの一致 (特定の DM/グループ/チャネル ID)parentPeerの一致 (スレッドの継承)guildId + roles(Discord のロールによるルーティング)guildId(Discord)teamId(Slack)accountIdによるチャネルの一致- チャネルレベルの一致 (
accountId: "*") - デフォルトエージェントへのフォールバック (
agents.list[].default、設定がない場合はリストの最初のエントリ、デフォルトはmain)
peer + guildId)を設定した場合、それらすべての条件を満たす必要があります(AND 条件)。
アカウントスコープに関する重要な詳細:
accountIdを省略したバインディングは、デフォルトのアカウントのみに一致します。- すべてのアカウントにわたるチャネル全体のフォールバック設定には、
accountId: "*"を使用します。 - 後で同じエージェントに対して特定のアカウント ID を指定したバインディングを追加すると、OpenClaw は既存のチャネルのみのバインディングを重複させるのではなく、アカウントスコープの設定にアップグレードします。
複数のアカウント / 電話番号
WhatsApp のように複数のアカウントをサポートするチャネルでは、accountId を使用して各ログインを識別します。各 accountId を異なるエージェントにルーティングできるため、1つのサーバーでセッションを混合させることなく、複数の電話番号をホストできます。
accountId が省略された場合にチャネル全体のデフォルトアカウントを使用したい場合は、channels.<channel>.defaultAccount を設定します(オプション)。設定されていない場合、OpenClaw は default アカウントがあればそれを、なければ最初に構成されたアカウント ID(ソート順)を使用します。
このパターンをサポートする主なチャネルは以下の通りです。
whatsapp、telegram、discord、slack、signal、imessageirc、line、googlechat、mattermost、matrix、nextcloud-talkbluebubbles、zalo、zalouser、nostr、feishu
コンセプト
agentId: 1つの「頭脳」 (ワークスペース、エージェントごとの認証、エージェントごとのセッションストア)。accountId: チャネルアカウントの 1 つのインスタンス (例: WhatsApp アカウントの"personal"と"biz")。binding: 受信メッセージを(channel, accountId, peer)およびオプションでギルド/チーム ID に基づいて特定のagentIdにルーティングします。- ダイレクトチャットは
agent:<agentId>:<mainKey>に集約されます。
プラットフォーム別の例
エージェントごとの Discord ボット
各 Discord ボットアカウントは、一意のaccountId にマッピングされます。各アカウントをエージェントにバインドし、ボットごとに許可リストを管理します。
- 各ボットをサーバー(ギルド)に招待し、「Message Content Intent」を有効にしてください。
- トークンは
channels.discord.accounts.<id>.tokenに設定します(デフォルトアカウントではDISCORD_BOT_TOKEN環境変数も使用可能です)。
エージェントごとの Telegram ボット
- BotFather を使用してエージェントごとにボットを作成し、トークンをコピーしてください。
- トークンは
channels.telegram.accounts.<id>.botTokenに設定します(デフォルトアカウントではTELEGRAM_BOT_TOKEN環境変数も使用可能です)。
エージェントごとの WhatsApp 番号
ゲートウェイを起動する前に、各アカウントをリンクしておきます。~/.openclaw/openclaw.json (JSON5):
例: WhatsApp は日常用 + Telegram は集中作業用
チャネルごとに分割する例: WhatsApp は日常的な高速エージェントに、Telegram は Opus エージェントにルーティングします。- 同一チャネルで複数のアカウントがある場合は、バインディングに
accountIdを追加してください。 - 特定の DM/グループだけを Opus に送り、残りを通常チャットに維持したい場合は、その相手に対して
match.peerバインディングを追加してください。ピア一致は常にチャネル全体のルールよりも優先されます。
例: 同一チャネルで、特定の相手だけ Opus に送る
WhatsApp は高速エージェントを使用しつつ、特定の 1 人からの DM だけを Opus に送る設定です。WhatsApp グループに紐付けられたファミリーエージェント
特定の WhatsApp グループに専用のファミリーエージェントを割り当て、メンションによる制限と厳格なツールポリシーを適用する例です。- ツールの許可/拒否リストはツールの設定であり、スキルの設定ではありません。スキルがバイナリを実行する必要がある場合は、
execが許可されており、かつバイナリがサンドボックス内に存在することを確認してください。 - ゲートをより厳密にするには、
agents.list[].groupChat.mentionPatternsを設定し、そのチャネルのグループ許可リストを有効にしておきます。
エージェントごとのサンドボックスとツールの設定
v2026.1.6 以降、各エージェントは独自のサンドボックス設定とツールの制限を持つことができます。setupCommand は sandbox.docker 配下に記述し、コンテナ作成時に 1 回だけ実行されます。解決されたスコープが "shared" の場合、エージェントごとの sandbox.docker.* のオーバーライドは無視されます。
メリット:
- セキュリティの分離: 信頼できないエージェントのツールを制限できます。
- リソース管理: 特定のエージェントだけをサンドボックス化し、他はホスト上で実行できます。
- 柔軟なポリシー: エージェントごとに異なる権限を設定できます。
tools.elevated はグローバルかつ送信者ベースの設定であり、エージェントごとに構成することはできません。エージェントごとの境界を設けたい場合は、agents.list[].tools を使用して exec を拒否してください。グループ内でのターゲット指定には、agents.list[].groupChat.mentionPatterns を使用し、@メンションが目的のエージェントに正しくマッピングされるようにします。
詳細は マルチエージェントサンドボックス & ツール を参照してください。