チャンネルとルーティング

OpenClawは、メッセージが送信元のチャンネルに返信をルーティングします。モデルがチャンネルを選択することはありません。ルーティングは決定論的で、ホスト側の設定で制御されます。

主要な用語

  • Channel: whatsapptelegramdiscordslacksignalimessagewebchat
  • AccountId: チャンネルごとのアカウントインスタンス(対応している場合)。
  • オプションのチャンネルデフォルトアカウント:channels.<channel>.defaultAccountで、アウトバウンドパスがaccountIdを指定しない場合に使用するアカウントを選択。
    • マルチアカウント構成では、2つ以上のアカウントが設定されている場合に明示的なデフォルト(defaultAccountまたはaccounts.default)を設定してください。設定しない場合、最初の正規化されたアカウントIDにフォールバックする可能性があります。
  • AgentId: 分離されたワークスペース+セッションストア(「ブレイン」)。
  • SessionKey: コンテキストの保存と同時実行制御に使用されるバケットキー。

セッションキーの形状(例)

ダイレクトメッセージはエージェントのmainセッションに集約されます:

  • agent:<agentId>:<mainKey>(デフォルト:agent:main:main

グループとチャンネルはチャンネルごとに分離されます:

  • グループ:agent:<agentId>:<channel>:group:<id>
  • チャンネル/ルーム:agent:<agentId>:<channel>:channel:<id>

スレッド:

  • Slack/Discordのスレッドはベースキーに:thread:<threadId>を追加。
  • Telegramのフォーラムトピックはグループキーに:topic:<topicId>を埋め込み。

例:

  • agent:main:telegram:group:-1001234567890:topic:42
  • agent:main:discord:channel:123456:thread:987654

メインDMルートのピン留め

session.dmScopemainの場合、ダイレクトメッセージは1つのメインセッションを共有できます。 オーナー以外のDMによってセッションのlastRouteが上書きされるのを防ぐため、以下の条件がすべて満たされるとOpenClawはallowFromからピン留めされたオーナーを推定します:

  • allowFromにワイルドカード以外のエントリが1つだけある。
  • そのエントリがチャンネルの具体的な送信者IDに正規化できる。
  • 受信DM送信者がピン留めされたオーナーと一致しない。

不一致の場合、OpenClawは受信セッションメタデータを記録しますが、メインセッションのlastRouteの更新はスキップします。

ルーティングルール(エージェントの選択方法)

ルーティングは受信メッセージごとに1つのエージェントを選択します:

  1. 正確なピアマッチbindingspeer.kind + peer.id)。
  2. 親ピアマッチ(スレッドの継承)。
  3. ギルド+ロールマッチ(Discord):guildId + roles
  4. ギルドマッチ(Discord):guildId
  5. チームマッチ(Slack):teamId
  6. アカウントマッチ(チャンネルのaccountId)。
  7. チャンネルマッチ(チャンネル上の任意のアカウント、accountId: "*")。
  8. デフォルトエージェントagents.list[].default、なければ最初のリストエントリ、フォールバックはmain)。

バインディングに複数のマッチフィールド(peerguildIdteamIdroles)が含まれる場合、指定されたすべてのフィールドが一致する必要があります。

マッチしたエージェントが使用するワークスペースとセッションストアを決定します。

ブロードキャストグループ(複数エージェントの実行)

ブロードキャストグループを使用すると、OpenClawが通常返信する場合に同じピアに対して複数のエージェントを実行できます(例:WhatsAppグループでメンション/アクティベーションゲーティング後)。

設定:

{
  broadcast: {
    strategy: "parallel",
    "[email protected]": ["alfred", "baerbel"],
    "+15555550123": ["support", "logger"],
  },
}

詳細:ブロードキャストグループ

設定の概要

  • agents.list:名前付きエージェント定義(ワークスペース、モデルなど)。
  • bindings:受信チャンネル/アカウント/ピアをエージェントにマッピング。

例:

{
  agents: {
    list: [{ id: "support", name: "Support", workspace: "~/.openclaw/workspace-support" }],
  },
  bindings: [
    { match: { channel: "slack", teamId: "T123" }, agentId: "support" },
    { match: { channel: "telegram", peer: { kind: "group", id: "-100123" } }, agentId: "support" },
  ],
}

セッションストレージ

セッションストアは状態ディレクトリ(デフォルト~/.openclaw)配下に格納されます:

  • ~/.openclaw/agents/<agentId>/sessions/sessions.json
  • JONLトランスクリプトはストアの隣に配置

session.store{agentId}テンプレートでストアパスを上書きできます。

GatewayとACPのセッション検出は、デフォルトのagents/ルートおよびテンプレート化されたsession.storeルート配下のディスクベースのエージェントストアもスキャンします。検出されたストアは解決済みのエージェントルート内にあり、通常のsessions.jsonファイルを使用する必要があります。シンボリックリンクとルート外パスは無視されます。

WebChatの動作

WebChatは選択されたエージェントにアタッチされ、デフォルトでエージェントのメインセッションを使用します。このため、WebChatではそのエージェントのクロスチャンネルコンテキストを1か所で確認できます。

返信コンテキスト

受信返信には以下が含まれます:

  • ReplyToIdReplyToBodyReplyToSender(利用可能な場合)。
  • 引用コンテキストはBody[Replying to ...]ブロックとして追加されます。

この動作はすべてのチャンネルで一貫しています。