OpenClaw 在各个平台上的群聊处理保持一致:Discord、iMessage、Matrix、Microsoft Teams、Signal、Slack、Telegram、WhatsApp、Zalo。Documentation Index
Fetch the complete documentation index at: https://openclaw.zhcndoc.com/llms.txt
Use this file to discover all available pages before exploring further.
入门简介(2 分钟)
OpenClaw “运行”在你自己的消息账号上。并没有单独的 WhatsApp 机器人用户。如果 你 在某个群里,OpenClaw 就能看到该群并在那里回应。 默认行为:- 群组受限制(
groupPolicy: "allowlist")。 - 除非你显式禁用提及门控,否则回复需要通过提及触发。
- 群组/频道中的普通最终回复默认是私有的。可见的房间输出使用
message工具。
简而言之
- DM 访问 由
*.allowFrom控制。 - 群组访问 由
*.groupPolicy+ 允许名单(*.groups、*.groupAllowFrom)控制。 - 回复触发 由提及门控(
requireMention、/activation)控制。
可见回复
对于群组/频道房间,OpenClaw 默认将messages.groupChat.visibleReplies 设为 "message_tool"。
openclaw doctor --fix 会把这个默认值写入那些未设置该项的已配置频道配置中。
这意味着代理仍会处理该轮对话并可更新记忆/会话状态,但其正常的最终答案不会自动发布回房间。若要可见地发言,代理会使用 message(action=send)。
如果在当前工具策略下 message 工具不可用,OpenClaw 会回退到自动可见回复,而不是静默抑制响应。
openclaw doctor 会警告这种不匹配。
对于直接聊天和任何其他来源轮次,使用 messages.visibleReplies: "message_tool" 可将同样的仅工具可见回复行为全局应用。Harness 也可以将其作为未设置时的默认值;Codex harness 在 Codex 模式的直接聊天中就是这样做的。messages.groupChat.visibleReplies 仍然是群组/频道房间更具体的覆盖项。
这替代了旧的模式:在大多数潜伏模式轮次中强制模型回答 NO_REPLY。在仅工具模式下,不做任何可见输出就只是意味着不调用 message 工具。
代理在仅工具模式下工作时仍会发送打字指示。由于在代理决定是否调用 message 工具之前,可能根本不会有正常的 assistant 消息文本,因此这些轮次的默认群组打字模式会从 “message” 升级为 “instant”。显式的打字模式配置仍然优先生效。
要恢复群组/频道房间的旧式自动最终回复:
messages 配置。只有在部署中禁用了文件监听或配置重载时才需要重启。
要让每个来源聊天的可见输出都必须通过 message 工具:
visibleReplies: "message_tool",并始终可见回复,以便频道原生命令 UI 收到它期望的响应。这只适用于已验证的原生命令轮次;手动输入的文本 /... 命令和普通聊天轮次仍然遵循配置的群组默认值。
上下文可见性和允许名单
群组安全涉及两个不同的控制项:- 触发授权:谁可以触发代理(
groupPolicy、groups、groupAllowFrom、特定渠道的允许名单)。 - 上下文可见性:哪些补充上下文会注入到模型中(回复文本、引用、线程历史、转发元数据)。
当前行为是按渠道区分的
当前行为是按渠道区分的
- 某些渠道已经在特定路径中对补充上下文应用了基于发送者的过滤(例如 Slack 线程种子、Matrix 回复/线程查找)。
- 其他渠道仍会按接收到的样子传递引用/回复/转发上下文。
加固方向(计划中)
加固方向(计划中)
contextVisibility: "all"(默认)保持当前“按接收样子”的行为。contextVisibility: "allowlist"会将补充上下文过滤为仅允许名单中的发送者。contextVisibility: "allowlist_quote"是allowlist再加一个明确的引用/回复例外。
| 目标 | 需要设置什么 |
|---|---|
| 允许所有群组但只在 @ 提及时回复 | groups: { "*": { requireMention: true } } |
| 禁用所有群组回复 | groupPolicy: "disabled" |
| 仅特定群组 | groups: { "<group-id>": { ... } }(不使用 "*" 键) |
| 只有你可以在群组中触发 | groupPolicy: "allowlist", groupAllowFrom: ["+1555..."] |
| 在各渠道间复用一组受信任发送者 | groupAllowFrom: ["accessGroup:operators"] |
会话键
- 群组会话使用
agent:<agentId>:<channel>:group:<id>会话键(房间/频道使用agent:<agentId>:<channel>:channel:<id>)。 - Telegram 论坛主题会在群组 id 后追加
:topic:<threadId>,因此每个主题都有自己的会话。 - 直接聊天使用主会话(或按发送者单独配置时使用按发送者会话)。
- 群组会话会跳过心跳。
模式:个人 DM + 公开群组(单代理)
可以——如果你的“个人”流量是 DM,而“公开”流量是 群组,这样做非常合适。 原因:在单代理模式下,DM 通常落到 主 会话键(agent:main:main),而群组总是使用 非主 会话键(agent:main:<channel>:group:<id>)。如果你启用了 mode: "non-main" 的沙箱,这些群组会话会在配置好的沙箱后端中运行,而你的主 DM 会话仍留在宿主机上。如果你不指定后端,Docker 是默认后端。
这样你就得到一个代理“大脑”(共享工作区 + 记忆),但有两种执行姿态:
- DM:完整工具(宿主机)
- 群组:沙箱 + 受限工具
如果你需要真正分离的工作区/人格(“个人”和“公开”绝不能混在一起),请使用第二个代理 + 绑定。参见 多代理路由。
- DM 在宿主机上,群组在沙箱中
- 群组只看到一个允许名单中的文件夹
- 配置键和默认值:Gateway 配置
- 调试为什么某个工具被阻止:沙箱 vs 工具策略 vs 提权
- 挂载绑定详情:沙箱化
显示标签
- UI 标签在可用时使用
displayName,格式为<channel>:<token>。 #room预留给房间/频道;群聊使用g-<slug>(小写,空格 ->-,保留#@+._-)。
群组策略
按渠道控制群组/房间消息的处理方式:| 策略 | 行为 |
|---|---|
"open" | 群组绕过允许名单;但提及门控仍然生效。 |
"disabled" | 完全阻止所有群组消息。 |
"allowlist" | 仅允许匹配配置中允许名单的群组/房间。 |
按渠道说明
按渠道说明
groupPolicy与提及门控是分开的(提及门控需要 @ 提及)。- WhatsApp/Telegram/Signal/iMessage/Microsoft Teams/Zalo:使用
groupAllowFrom(回退:显式allowFrom)。 - Signal:
groupAllowFrom可以匹配传入的 Signal 群组 id 或发送者电话/UUID。 - DM 配对审批(
*-allowFrom存储项)仅适用于 DM 访问;群组发送者授权仍然显式依赖群组允许名单。 - Discord:允许名单使用
channels.discord.guilds.<id>.channels。 - Slack:允许名单使用
channels.slack.channels。 - Matrix:允许名单使用
channels.matrix.groups。优先使用房间 ID 或别名;已加入房间名称查找尽力而为,未解析的名称会在运行时被忽略。使用channels.matrix.groupAllowFrom来限制发送者;也支持按房间的users允许名单。 - 群组 DM 由单独配置控制(
channels.discord.dm.*、channels.slack.dm.*)。 - Telegram 允许名单可以匹配用户 ID(
"123456789"、"telegram:123456789"、"tg:123456789")或用户名("@alice"或"alice");前缀不区分大小写。 - 默认值是
groupPolicy: "allowlist";如果你的群组允许名单为空,群组消息会被阻止。 - 运行时安全:当某个 provider 配置块完全缺失(
channels.<provider>不存在)时,群组策略会回退到 fail-closed 模式(通常是allowlist),而不是继承channels.defaults.groupPolicy。
提及门控(默认)
群组消息默认需要提及,除非按群组单独覆盖。默认值按子系统存放在*.groups."*" 下。
当渠道支持回复元数据时,回复机器人消息会被视为隐式提及。在提供引用元数据的渠道上,引用机器人消息也可能被视为隐式提及。当前内置案例包括 Telegram、WhatsApp、Slack、Discord、Microsoft Teams 和 ZaloUser。
提及门控说明
提及门控说明
mentionPatterns是不区分大小写的安全正则模式;无效模式和不安全的嵌套重复形式会被忽略。- 提供显式提及的界面仍会通过;模式只是兜底。
- 按代理覆盖:
agents.list[].groupChat.mentionPatterns(当多个代理共享一个群组时很有用)。 - 只有在可以进行提及检测时才会强制提及门控(原生提及或已配置
mentionPatterns)。 - 将某个群组或发送者加入允许名单并不会禁用提及门控;当所有消息都应触发时,请将该群组的
requireMention设为false。 - 群聊提示上下文会在每一轮携带已解析的静默回复指令;工作区文件不应重复
NO_REPLY机制。 - 允许静默回复的群组会将干净的空白或仅推理的模型轮次视为静默,等同于
NO_REPLY。直接聊天只有在显式允许静默回复时才这样处理;否则空回复仍然算作失败的代理轮次。 - Discord 默认值位于
channels.discord.guilds."*"(可按 guild/channel 覆盖)。 - 群组历史上下文在各渠道间统一包装,并且是仅待处理项(因提及门控而跳过的消息);全局默认使用
messages.groupChat.historyLimit,覆盖则使用channels.<channel>.historyLimit(或channels.<channel>.accounts.*.historyLimit)。设为0可禁用。
群组/渠道工具限制(可选)
某些渠道配置支持限制在特定群组/房间/渠道内部可用的工具。tools:为整个群组允许/禁止工具。toolsBySender:群组内按发送者覆盖。使用显式键前缀:id:<senderId>、e164:<phone>、username:<handle>、name:<displayName>和"*"通配符。旧式未加前缀的键仍被接受,并且只按id:匹配。
示例(Telegram):
群组/渠道工具限制会在全局/代理工具策略之上应用(deny 仍然优先)。某些渠道对房间/渠道使用不同的嵌套方式(例如 Discord
guilds.*.channels.*、Slack channels.*、Microsoft Teams teams.*.channels.*)。群组允许列表
当配置了channels.whatsapp.groups、channels.telegram.groups 或 channels.imessage.groups 时,这些键会作为群组允许列表使用。使用 "*" 可以允许所有群组,同时仍然设置默认提及行为。
常见意图(复制/粘贴):
- 禁用所有群组回复
- 仅允许特定群组(WhatsApp)
- 允许所有群组但要求提及
- 仅限所有者触发(WhatsApp)
激活(仅所有者)
群组所有者可以切换每个群组的激活方式:/activation mention/activation always
channels.whatsapp.allowFrom(若未设置,则由机器人自身的 E.164)决定。将命令作为独立消息发送。其他界面当前会忽略 /activation。
上下文字段
群组入站负载会设置:ChatType=groupGroupSubject(如果已知)GroupMembers(如果已知)WasMentioned(提及门控结果)- Telegram 论坛主题还会包含
MessageThreadId和IsForum。
- BlueBubbles 可选地在填充
GroupMembers之前,从本地 Contacts 数据库中丰富未命名的 macOS 群组参与者信息。此功能默认关闭,并且只会在正常群组门控通过后运行。
\n 序列。来自渠道的群组名称和参与者标签会被渲染为带边界的、不可信元数据,而不是行内系统指令。
iMessage 细节
- 路由或加入允许列表时,优先使用
chat_id:<id>。 - 列出聊天:
imsg chats --limit 20。 - 群组回复始终返回到同一个
chat_id。