群组(Groups)
OpenClaw 在各个平台上一致地处理群聊:WhatsApp、Telegram、Discord、Slack、Signal、iMessage、Microsoft Teams。
初学者介绍(2 分钟)
OpenClaw "生活"在您自己的消息账户上。没有单独的 WhatsApp 机器人用户。 如果您在一个群组中,OpenClaw 可以看到该群组并在那里回复。
默认行为:
- 群组受限制(groupPolicy: "allowlist")。
- 回复需要提及,除非您明确禁用提及门控(mention gating)。
翻译:白名单发送者可以通过提及来触发 OpenClaw。
简而言之
- 私聊访问(DM access) 由 *.allowFrom 控制。
- 群组访问(Group access) 由 *.groupPolicy + 白名单(*.groups、*.groupAllowFrom)控制。
- 回复触发(Reply triggering) 由提及门控(requireMention、/activation)控制。
快速流程(群组消息会发生什么):
groupPolicy? disabled -> drop
groupPolicy? allowlist -> group allowed? no -> drop
requireMention? yes -> mentioned? no -> store for context only
otherwise -> reply
如果您想要...
| 目标 | 设置什么 |
|---|---|
| 允许所有群组但仅在 @提及时回复 | groups: { "*": { requireMention: true } } |
| 禁用所有群组回复 | groupPolicy: "disabled" |
| 仅特定群组 | groups: { "<group-id>": { ... } }(没有 "*" 键) |
| 只有您可以在群组中触发 | groupPolicy: "allowlist", groupAllowFrom: ["+1555..."] |
会话密钥(Session keys)
- 群组会话使用 agent:<agentId>:<channel>:group:<id> 会话密钥(房间/频道使用 agent:<agentId>:<channel>:channel:<id>)。
- Telegram 论坛主题(forum topics)在群组 id 后添加 :topic:<threadId>,因此每个主题都有自己的会话。
- 直接聊天使用主会话(或如果配置了则使用每个发送者的会话)。
- 群组会话会跳过心跳(Heartbeats)。
模式:个人私聊 + 公共群组(单代理)
是的 — 如果您的"个人"流量是私聊,而您的"公共"流量是群组,这种方式效果很好。
为什么:在单代理模式下,私聊通常落在主会话密钥(agent:main:main)中,而群组总是使用非主会话密钥(agent:main:<channel>:group:<id>)。如果您使用 mode: "non-main" 启用沙箱,这些群组会话在 Docker 中运行,而您的主私聊会话保持在主机上。
这给您一个代理"大脑"(共享工作区 + 内存),但两种执行姿态:
- 私聊:完整工具(主机)
- 群组:沙箱 + 受限工具(Docker)
如果您需要真正独立的工作区/角色("个人"和"公共"绝不能混合),请使用第二个代理 + 绑定(bindings)。参见 多代理路由(Multi-Agent Routing)。
示例(私聊在主机上,群组沙箱化 + 仅消息工具):
{
agents: {
defaults: {
sandbox: {
mode: "non-main", // groups/channels are non-main -> sandboxed
scope: "session", // strongest isolation (one container per group/channel)
workspaceAccess: "none"
}
}
},
tools: {
sandbox: {
tools: {
// If allow is non-empty, everything else is blocked (deny still wins).
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: [
// hostPath:containerPath:mode
"~/FriendsShared:/data:ro"
]
}
}
}
}
}
相关:
- 配置键和默认值:网关配置(Gateway configuration)
- 调试为什么工具被阻止:沙箱 vs 工具策略 vs 提升(Sandbox vs Tool Policy vs Elevated)
- 绑定挂载详情:沙箱化(Sandboxing)
显示标签(Display labels)
- UI 标签在可用时使用 displayName,格式为 <channel>:<token>。
- #room 保留给房间/频道;群聊使用 g-<slug>(小写,空格 -> -,保留 #@+._-)。
群组策略(Group policy)
控制每个频道如何处理群组/房间消息:
{
channels: {
whatsapp: {
groupPolicy: "disabled", // "open" | "disabled" | "allowlist"
groupAllowFrom: ["+15551234567"]
},
telegram: {
groupPolicy: "disabled",
groupAllowFrom: ["123456789", "@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:使用 groupAllowFrom(后备:显式的 allowFrom)。
- Discord:白名单使用 channels.discord.guilds.<id>.channels。
- Slack:白名单使用 channels.slack.channels。
- Matrix:白名单使用 channels.matrix.groups(房间 ID、别名或名称)。使用 channels.matrix.groupAllowFrom 限制发送者;也支持每个房间的 users 白名单。
- 群组私聊(Group DMs)单独控制(channels.discord.dm.*、channels.slack.dm.*)。
- Telegram 白名单可以匹配用户 ID("123456789"、"telegram:123456789"、"tg:123456789")或用户名("@alice" 或 "alice");前缀不区分大小写。
- 默认值为 groupPolicy: "allowlist";如果您的群组白名单为空,群组消息将被阻止。
快速心智模型(群组消息的评估顺序):
- groupPolicy(open/disabled/allowlist)
- 群组白名单(*.groups、*.groupAllowFrom、特定频道白名单)
- 提及门控(requireMention、/activation)
提及门控(Mention gating)(默认)
群组消息需要提及,除非每个群组覆盖。默认值位于 *.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."*" 中(可在每个 guild/channel 级别覆盖)。
- 群组历史上下文在各个频道间统一包装,并且是仅待处理(由于提及门控而跳过的消息);使用 messages.groupChat.historyLimit 作为全局默认值,使用 channels.<channel>.historyLimit(或 channels.<channel>.accounts.*.historyLimit)进行覆盖。设置 0 以禁用。
群组/频道工具限制(Group/channel tool restrictions)(可选)
某些频道配置支持限制在特定群组/房间/频道内可用的工具。
- tools:允许/拒绝整个群组的工具。
- toolsBySender:群组内的每个发送者覆盖(键是发送者 ID/用户名/电子邮件/电话号码,取决于频道)。使用 "*" 作为通配符。
解析顺序(最具体的优先):
- 群组/频道 toolsBySender 匹配
- 群组/频道 tools
- 默认("*")toolsBySender 匹配
- 默认("*")tools
示例(Telegram):
{
channels: {
telegram: {
groups: {
"*": { tools: { deny: ["exec"] } },
"-1001234567890": {
tools: { deny: ["exec", "read", "write"] },
toolsBySender: {
"123456789": { alsoAllow: ["exec"] }
}
}
}
}
}
}
注意:
- 群组/频道工具限制在全局/代理工具策略之外应用(拒绝仍然优先)。
- 某些频道对房间/频道使用不同的嵌套(例如,Discord guilds.*.channels.*、Slack channels.*、MS Teams teams.*.channels.*)。
群组白名单(Group allowlists)
当配置了 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)(仅所有者)
群组所有者可以切换每个群组的激活:
- /activation mention
- /activation always
所有者由 channels.whatsapp.allowFrom 确定(或未设置时为机器人的自身 E.164)。将命令作为独立消息发送。其他平台目前忽略 /activation。
上下文字段(Context fields)
群组入站负载(inbound payloads)设置:
- ChatType=group
- GroupSubject(如果已知)
- GroupMembers(如果已知)
- WasMentioned(提及门控结果)
- Telegram 论坛主题还包括 MessageThreadId 和 IsForum。
代理系统提示在新群组会话的第一轮包括一个群组介绍。它提醒模型像人类一样回复,避免 Markdown 表格,并避免输入字面 \n 序列。
iMessage 特定事项
- 在路由或白名单时优先使用 chat_id:<id>。
- 列出聊天:imsg chats --limit 20。
- 群组回复始终返回到相同的 chat_id。
WhatsApp 特定事项
有关 WhatsApp 独有的行为(历史注入、提及处理详情),请参见 群组消息(Group messages)。