OpenClaw 将回复确定性地路由回消息来源频道,模型不选择频道,路由由主机配置控制。

核心概念

  • Channel:telegram、whatsapp、discord、irc、slack、signal、imessage、line 等
  • AccountId:每个频道的账号实例
  • AgentId:独立的工作区 + 会话存储(“大脑”)
  • SessionKey:存储上下文和控制并发的桶键

会话键格式

  • 私信(DM):agent:<agentId>:<mainKey>(默认 agent:main:main)
  • 群组:agent:<agentId>:<channel>:group:<id>
  • 频道/房间:agent:<agentId>:<channel>:channel:<id>
  • 线程:Slack/Discord 追加 :thread:<threadId>,Telegram 论坛话题嵌入 :topic:<topicId>

路由规则(优先级从高到低)

  1. 精确 peer 匹配(bindings 中 peer.kind + peer.id)
  2. 父 peer 匹配(线程继承)
  3. Guild + roles 匹配(Discord)
  4. Guild 匹配(Discord)
  5. Team 匹配(Slack)
  6. Account 匹配(频道账号)
  7. Channel 匹配(该频道任意账号)
  8. 默认 agent(agents.list[].default,否则第一个,回退到 main)

当 binding 包含多个匹配字段时,所有字段必须同时匹配。

配置示例

{
  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" },
  ],
}

广播群组

让多个 agent 处理同一条消息:

{
  broadcast: {
    strategy: "parallel",
    "120363403215116621@g.us": ["alfred", "baerbel"],
  },
}

详见 channel-broadcast-groups。

出站目标前缀

  • channel:<id>:频道
  • user:<id>:私信
  • room:<id>:房间
  • thread:<id>:线程
  • telegram:123 / tg:123:带频道前缀的目标

跨频道组合(如 WhatsApp 投递到 telegram:123)会在插件特定目标规范化前失败。

会话存储

~/.openclaw/agents/<agentId>/sessions/sessions.json

可通过 session.store 和 {agentId} 模板覆盖路径。

回复上下文

入站回复包含:

  • ReplyToId、ReplyToBody、ReplyToSender(如可用)
  • 引用上下文以 [Replying to ...] 块追加到 Body

相关链接