群组
OpenClaw 在各平台上统一处理群聊:WhatsApp、Telegram、Discord、Slack、Signal、iMessage、Microsoft Teams、Zalo。
入门介绍(2 分钟)
OpenClaw “寄居”在你自己的消息账号上,没有独立的 WhatsApp 机器人用户。如果你在某个群组中,OpenClaw 就能看到该群组并在其中回复。
默认行为:
- 群组受限制(
groupPolicy: "allowlist")。 - 回复需要提及,除非你明确禁用提及过滤。
换句话说:白名单中的发送者可以通过提及 OpenClaw 来触发它。
要点
- 私信访问由
*.allowFrom控制。- 群组访问由
*.groupPolicy+ 白名单(*.groups、*.groupAllowFrom)控制。- 回复触发由提及过滤(
requireMention、/activation)控制。
快速流程(群组消息处理逻辑):
groupPolicy? disabled -> 丢弃
groupPolicy? allowlist -> 群组被允许? 否 -> 丢弃
requireMention? yes -> 被提及? 否 -> 仅存储为上下文
否则 -> 回复
常见场景:
| 目标 | 配置方式 |
|---|---|
| 允许所有群组但仅在 @提及时回复 | groups: { "*": { requireMention: true } } |
| 禁用所有群组回复 | groupPolicy: "disabled" |
| 仅特定群组 | groups: { "<group-id>": { ... } }(无 "*" 键) |
| 仅你自己可以在群组中触发 | groupPolicy: "allowlist", groupAllowFrom: ["+1555..."] |
会话键
- 群组会话使用
agent:<agentId>:<channel>:group:<id>会话键(房间/频道使用agent:<agentId>:<channel>:channel:<id>)。 - Telegram 论坛话题在群组 ID 后追加
:topic:<threadId>,使每个话题拥有独立会话。 - 私聊使用主会话(或按发送者配置时使用独立会话)。
- 群组会话跳过心跳检测。
模式:个人私信 + 公开群组(单代理)
可以——如果你的”个人”流量是私信,“公开”流量是群组,这种方式效果很好。
原因:在单代理模式下,私信通常落入主会话键(agent:main:main),而群组始终使用非主会话键(agent:main:<channel>:group:<id>)。如果你启用 mode: "non-main" 沙箱,这些群组会话在 Docker 中运行,而主私信会话保持在宿主机上。
这样你拥有一个代理”大脑”(共享工作区 + 记忆),但两种执行姿态:
- 私信:完整工具(宿主机)
- 群组:沙箱 + 受限工具(Docker)
如果你需要真正独立的工作区/人格(“个人”和”公开”绝不能混合),请使用第二个代理 + 绑定。参见多代理路由。
示例(私信在宿主机,群组沙箱化 + 仅消息工具):
{
agents: {
defaults: {
sandbox: {
mode: "non-main", // 群组/频道是非主 -> 沙箱化
scope: "session", // 最强隔离(每个群组/频道一个容器)
workspaceAccess: "none",
},
},
},
tools: {
sandbox: {
tools: {
// 如果 allow 非空,其他所有工具被阻止(deny 仍然优先)。
allow: ["group:messaging", "group:sessions"],
deny: ["group:runtime", "group:fs", "group:ui", "nodes", "cron", "gateway"],
},
},
},
}
想让”群组只能看到文件夹 X”而非”无宿主机访问”?保持 workspaceAccess: "none" 并仅将白名单路径挂载到沙箱中:
{
agents: {
defaults: {
sandbox: {
mode: "non-main",
scope: "session",
workspaceAccess: "none",
docker: {
binds: [
// 宿主机路径:容器路径:模式
"/home/user/FriendsShared:/data:ro",
],
},
},
},
},
}
相关内容:
- 配置键和默认值:Gateway 配置
- 调试工具被阻止的原因:沙箱 vs 工具策略 vs 提权
- 绑定挂载详情:沙箱化
显示标签
- UI 标签在可用时使用
displayName,格式为<channel>:<token>。 #room保留给房间/频道;群聊使用g-<slug>(小写,空格转-,保留#@+._-)。
群组策略
按频道控制群组/房间消息的处理方式:
{
channels: {
whatsapp: {
groupPolicy: "disabled", // "open" | "disabled" | "allowlist"
groupAllowFrom: ["+15551234567"],
},
telegram: {
groupPolicy: "disabled",
groupAllowFrom: ["123456789"], // Telegram 数字用户 ID(向导可解析 @username)
},
signal: {
groupPolicy: "disabled",
groupAllowFrom: ["+15551234567"],
},
imessage: {
groupPolicy: "disabled",
groupAllowFrom: ["chat_id:123"],
},
msteams: {
groupPolicy: "disabled",
groupAllowFrom: ["[email protected]"],
},
discord: {
groupPolicy: "allowlist",
guilds: {
GUILD_ID: { channels: { help: { allow: true } } },
},
},
slack: {
groupPolicy: "allowlist",
channels: { "#general": { allow: true } },
},
matrix: {
groupPolicy: "allowlist",
groupAllowFrom: ["@owner:example.org"],
groups: {
"!roomId:example.org": { allow: true },
"#alias:example.org": { allow: true },
},
},
},
}
| 策略 | 行为 |
|---|---|
"open" | 群组绕过白名单;提及过滤仍然生效。 |
"disabled" | 完全阻止所有群组消息。 |
"allowlist" | 仅允许匹配已配置白名单的群组/房间。 |
说明:
groupPolicy与提及过滤(需要 @提及)是分开的。- WhatsApp/Telegram/Signal/iMessage/Microsoft Teams/Zalo:使用
groupAllowFrom(回退:显式allowFrom)。 - 私信配对审批(
*-allowFrom存储条目)仅适用于私信访问;群组发送者授权需通过群组白名单显式指定。 - Discord:白名单使用
channels.discord.guilds.<id>.channels。 - Slack:白名单使用
channels.slack.channels。 - Matrix:白名单使用
channels.matrix.groups(房间 ID、别名或名称)。使用channels.matrix.groupAllowFrom限制发送者;也支持按房间的users白名单。 - 群组私信单独控制(
channels.discord.dm.*、channels.slack.dm.*)。 - Telegram 白名单可匹配用户 ID(
"123456789"、"telegram:123456789"、"tg:123456789")或用户名("@alice"或"alice");前缀不区分大小写。 - 默认为
groupPolicy: "allowlist";如群组白名单为空,群组消息被阻止。 - 运行时安全:当频道配置块完全缺失(
channels.<provider>不存在)时,群组策略回退到关闭模式(通常为allowlist),而非继承channels.defaults.groupPolicy。
快速心智模型(群组消息评估顺序):
groupPolicy(open/disabled/allowlist)- 群组白名单(
*.groups、*.groupAllowFrom、频道特定白名单) - 提及过滤(
requireMention、/activation)
提及过滤(默认)
群组消息默认需要提及,除非按群组覆盖。默认值位于各子系统的 *.groups."*" 下。
回复机器人消息视为隐式提及(当频道支持回复元数据时)。适用于 Telegram、WhatsApp、Slack、Discord 和 Microsoft Teams。
{
channels: {
whatsapp: {
groups: {
"*": { requireMention: true },
"[email protected]": { requireMention: false },
},
},
telegram: {
groups: {
"*": { requireMention: true },
"123456789": { requireMention: false },
},
},
imessage: {
groups: {
"*": { requireMention: true },
"123": { requireMention: false },
},
},
},
agents: {
list: [
{
id: "main",
groupChat: {
mentionPatterns: ["@openclaw", "openclaw", "\\+15555550123"],
historyLimit: 50,
},
},
],
},
}
说明:
mentionPatterns是不区分大小写的正则表达式。- 提供显式提及的平台仍然通过;模式是回退方案。
- 按代理覆盖:
agents.list[].groupChat.mentionPatterns(在多个代理共享一个群组时有用)。 - 仅在提及检测可用时(原生提及或已配置
mentionPatterns)才强制执行提及过滤。 - Discord 默认值位于
channels.discord.guilds."*"(可按服务器/频道覆盖)。 - 群组历史上下文在各频道间统一包装,仅含待处理消息(因提及过滤被跳过的消息);使用
messages.groupChat.historyLimit设置全局默认,使用channels.<channel>.historyLimit(或channels.<channel>.accounts.*.historyLimit)覆盖。设置0禁用。
群组/频道工具限制(可选)
部分频道配置支持限制特定群组/房间/频道内可用的工具。
tools:为整个群组允许/禁止工具。toolsBySender:群组内按发送者覆盖。 使用显式键前缀:id:<senderId>、e164:<phone>、username:<handle>、name:<displayName>和"*"通配符。 旧版无前缀键仍被接受,仅作为id:匹配。
解析顺序(最具体的优先):
- 群组/频道
toolsBySender匹配 - 群组/频道
tools - 默认(
"*")toolsBySender匹配 - 默认(
"*")tools
示例(Telegram):
{
channels: {
telegram: {
groups: {
"*": { tools: { deny: ["exec"] } },
"-1001234567890": {
tools: { deny: ["exec", "read", "write"] },
toolsBySender: {
"id:123456789": { alsoAllow: ["exec"] },
},
},
},
},
},
}
说明:
- 群组/频道工具限制在全局/代理工具策略之上附加应用(deny 仍然优先)。
- 部分频道使用不同的嵌套方式(如 Discord
guilds.*.channels.*、Slackchannels.*、MS Teamsteams.*.channels.*)。
群组白名单
配置了 channels.whatsapp.groups、channels.telegram.groups 或 channels.imessage.groups 后,键充当群组白名单。使用 "*" 允许所有群组同时仍设置默认提及行为。
常见意图(可直接复制):
- 禁用所有群组回复
{
channels: { whatsapp: { groupPolicy: "disabled" } },
}
- 仅允许特定群组(WhatsApp)
{
channels: {
whatsapp: {
groups: {
"[email protected]": { requireMention: true },
"[email protected]": { requireMention: false },
},
},
},
}
- 允许所有群组但需要提及(显式)
{
channels: {
whatsapp: {
groups: { "*": { requireMention: true } },
},
},
}
- 仅所有者可以在群组中触发(WhatsApp)
{
channels: {
whatsapp: {
groupPolicy: "allowlist",
groupAllowFrom: ["+15551234567"],
groups: { "*": { requireMention: true } },
},
},
}
激活控制(仅所有者)
群组所有者可以切换按群组的激活模式:
/activation mention/activation always
所有者由 channels.whatsapp.allowFrom(或未设置时机器人自身的 E.164 号码)确定。命令需作为独立消息发送。其他平台目前忽略 /activation。
上下文字段
群组入站载荷设置:
ChatType=groupGroupSubject(如已知)GroupMembers(如已知)WasMentioned(提及过滤结果)- Telegram 论坛话题还包含
MessageThreadId和IsForum。
代理系统提示在新群组会话的第一轮对话中包含群组介绍。它提醒模型像人类一样回复,避免 Markdown 表格,避免输入字面的 \n 序列。
iMessage 特别说明
- 路由或白名单配置时推荐使用
chat_id:<id>。 - 列出聊天:
imsg chats --limit 20。 - 群组回复始终返回同一
chat_id。
WhatsApp 特别说明
WhatsApp 特有的行为(历史注入、提及处理细节)参见群组消息。