チャンネルとルーティング
OpenClawは、メッセージが送信元のチャンネルに返信をルーティングします。モデルがチャンネルを選択することはありません。ルーティングは決定論的で、ホスト側の設定で制御されます。
主要な用語
- Channel:
whatsapp、telegram、discord、slack、signal、imessage、webchat。 - AccountId: チャンネルごとのアカウントインスタンス(対応している場合)。
- オプションのチャンネルデフォルトアカウント:
channels.<channel>.defaultAccountで、アウトバウンドパスがaccountIdを指定しない場合に使用するアカウントを選択。- マルチアカウント構成では、2つ以上のアカウントが設定されている場合に明示的なデフォルト(
defaultAccountまたはaccounts.default)を設定してください。設定しない場合、最初の正規化されたアカウントIDにフォールバックする可能性があります。
- マルチアカウント構成では、2つ以上のアカウントが設定されている場合に明示的なデフォルト(
- 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:42agent:main:discord:channel:123456:thread:987654
メインDMルートのピン留め
session.dmScopeがmainの場合、ダイレクトメッセージは1つのメインセッションを共有できます。
オーナー以外のDMによってセッションのlastRouteが上書きされるのを防ぐため、以下の条件がすべて満たされるとOpenClawはallowFromからピン留めされたオーナーを推定します:
allowFromにワイルドカード以外のエントリが1つだけある。- そのエントリがチャンネルの具体的な送信者IDに正規化できる。
- 受信DM送信者がピン留めされたオーナーと一致しない。
不一致の場合、OpenClawは受信セッションメタデータを記録しますが、メインセッションのlastRouteの更新はスキップします。
ルーティングルール(エージェントの選択方法)
ルーティングは受信メッセージごとに1つのエージェントを選択します:
- 正確なピアマッチ(
bindingsのpeer.kind+peer.id)。 - 親ピアマッチ(スレッドの継承)。
- ギルド+ロールマッチ(Discord):
guildId+roles。 - ギルドマッチ(Discord):
guildId。 - チームマッチ(Slack):
teamId。 - アカウントマッチ(チャンネルの
accountId)。 - チャンネルマッチ(チャンネル上の任意のアカウント、
accountId: "*")。 - デフォルトエージェント(
agents.list[].default、なければ最初のリストエントリ、フォールバックはmain)。
バインディングに複数のマッチフィールド(peer、guildId、teamId、roles)が含まれる場合、指定されたすべてのフィールドが一致する必要があります。
マッチしたエージェントが使用するワークスペースとセッションストアを決定します。
ブロードキャストグループ(複数エージェントの実行)
ブロードキャストグループを使用すると、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か所で確認できます。
返信コンテキスト
受信返信には以下が含まれます:
ReplyToId、ReplyToBody、ReplyToSender(利用可能な場合)。- 引用コンテキストは
Bodyに[Replying to ...]ブロックとして追加されます。
この動作はすべてのチャンネルで一貫しています。