Grupos
OpenClaw maneja los chats grupales de forma consistente en todas las plataformas: WhatsApp, Telegram, Discord, Slack, Signal, iMessage, Microsoft Teams, Zalo.
Introducción para principiantes (2 minutos)
OpenClaw “vive” en tus propias cuentas de mensajería. No existe un usuario bot de WhatsApp separado. Si tú estás en un grupo, OpenClaw puede ver ese grupo y responder ahí.
Comportamiento por defecto:
- Los grupos están restringidos (
groupPolicy: "allowlist"). - Las respuestas requieren una mención a menos que desactives explícitamente la comprobación de mención.
En resumen: los remitentes en la lista permitida pueden activar OpenClaw mencionándolo.
TL;DR
- Acceso a DMs se controla con
*.allowFrom.- Acceso a grupos se controla con
*.groupPolicy+ listas permitidas (*.groups,*.groupAllowFrom).- Activación de respuestas se controla con la comprobación de mención (
requireMention,/activation).
Flujo rápido (qué le pasa a un mensaje de grupo):
groupPolicy? disabled -> drop
groupPolicy? allowlist -> group allowed? no -> drop
requireMention? yes -> mentioned? no -> store for context only
otherwise -> reply
Si quieres…
| Objetivo | Qué configurar |
|---|---|
| Permitir todos los grupos pero solo responder con @mención | groups: { "*": { requireMention: true } } |
| Desactivar todas las respuestas en grupos | groupPolicy: "disabled" |
| Solo grupos específicos | groups: { "<group-id>": { ... } } (sin clave "*") |
| Solo tú puedes activar en grupos | groupPolicy: "allowlist", groupAllowFrom: ["+1555..."] |
Claves de sesión
- Las sesiones de grupo usan claves
agent:<agentId>:<channel>:group:<id>(las salas/canales usanagent:<agentId>:<channel>:channel:<id>). - Los temas de foro de Telegram añaden
:topic:<threadId>al id del grupo para que cada tema tenga su propia sesión. - Los chats directos usan la sesión principal (o por remitente si está configurado).
- Los heartbeats se omiten en sesiones de grupo.
Patrón: DMs personales + grupos públicos (agente único)
Sí — esto funciona bien si tu tráfico “personal” son DMs y tu tráfico “público” son grupos.
Por qué: en modo de agente único, los DMs normalmente llegan a la clave de sesión principal (agent:main:main), mientras que los grupos siempre usan claves de sesión no principales (agent:main:<channel>:group:<id>). Si activas el sandboxing con mode: "non-main", esas sesiones de grupo se ejecutan en Docker mientras tu sesión principal de DM permanece en el host.
Esto te da un “cerebro” de agente (workspace + memoria compartidos), pero dos posturas de ejecución:
- DMs: herramientas completas (host)
- Grupos: sandbox + herramientas restringidas (Docker)
Si necesitas workspaces/personas verdaderamente separados (“personal” y “público” nunca deben mezclarse), usa un segundo agente + bindings. Consulta Enrutamiento Multi-Agente.
Ejemplo (DMs en host, grupos en sandbox + solo herramientas de mensajería):
{
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"],
},
},
},
}
¿Quieres que “los grupos solo puedan ver la carpeta X” en lugar de “sin acceso al host”? Mantén workspaceAccess: "none" y monta solo las rutas permitidas en el sandbox:
{
agents: {
defaults: {
sandbox: {
mode: "non-main",
scope: "session",
workspaceAccess: "none",
docker: {
binds: [
// hostPath:containerPath:mode
"/home/user/FriendsShared:/data:ro",
],
},
},
},
},
}
Relacionado:
- Claves de configuración y valores por defecto: Configuración del gateway
- Depuración de herramientas bloqueadas: Sandbox vs Política de herramientas vs Elevado
- Detalles de bind mounts: Sandboxing
Etiquetas de visualización
- Las etiquetas de UI usan
displayNamecuando está disponible, formateado como<channel>:<token>. #roomestá reservado para salas/canales; los chats grupales usang-<slug>(minúsculas, espacios →-, se mantienen#@+._-).
Política de grupo
Controla cómo se manejan los mensajes de grupo/sala por canal:
{
channels: {
whatsapp: {
groupPolicy: "disabled", // "open" | "disabled" | "allowlist"
groupAllowFrom: ["+15551234567"],
},
telegram: {
groupPolicy: "disabled",
groupAllowFrom: ["123456789"], // numeric Telegram user id (wizard can resolve @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 },
},
},
},
}
| Política | Comportamiento |
|---|---|
"open" | Los grupos omiten las listas permitidas; la comprobación de mención sigue aplicándose. |
"disabled" | Bloquea todos los mensajes de grupo por completo. |
"allowlist" | Solo permite grupos/salas que coincidan con la lista permitida configurada. |
Notas:
groupPolicyes independiente de la comprobación de mención (que requiere @menciones).- WhatsApp/Telegram/Signal/iMessage/Microsoft Teams/Zalo: usan
groupAllowFrom(respaldo:allowFromexplícito). - Las aprobaciones de emparejamiento de DM (entradas
*-allowFromdel almacén) solo aplican al acceso por DM; la autorización del remitente en grupos permanece explícita en las listas permitidas del grupo. - Discord: la lista permitida usa
channels.discord.guilds.<id>.channels. - Slack: la lista permitida usa
channels.slack.channels. - Matrix: la lista permitida usa
channels.matrix.groups(IDs de sala, alias o nombres). Usachannels.matrix.groupAllowFrompara restringir remitentes; también se admiten listas permitidas por sala conusers. - Los DMs de grupo se controlan por separado (
channels.discord.dm.*,channels.slack.dm.*). - La lista permitida de Telegram puede coincidir con IDs de usuario (
"123456789","telegram:123456789","tg:123456789") o nombres de usuario ("@alice"o"alice"); los prefijos no distinguen mayúsculas. - El valor por defecto es
groupPolicy: "allowlist"; si tu lista permitida de grupo está vacía, los mensajes de grupo se bloquean. - Seguridad en tiempo de ejecución: cuando un bloque de proveedor está completamente ausente (
channels.<provider>no existe), la política de grupo recurre a un modo fail-closed (normalmenteallowlist) en lugar de heredarchannels.defaults.groupPolicy.
Modelo mental rápido (orden de evaluación para mensajes de grupo):
groupPolicy(open/disabled/allowlist)- Listas permitidas de grupo (
*.groups,*.groupAllowFrom, lista permitida específica del canal) - Comprobación de mención (
requireMention,/activation)
Comprobación de mención (por defecto)
Los mensajes de grupo requieren mención a menos que se anule por grupo. Los valores por defecto se establecen por subsistema en *.groups."*".
Responder a un mensaje del bot cuenta como mención implícita (cuando el canal soporta metadatos de respuesta). Esto aplica a Telegram, WhatsApp, Slack, Discord y 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,
},
},
],
},
}
Notas:
mentionPatternsson expresiones regulares que no distinguen mayúsculas y minúsculas.- Las plataformas que proporcionan menciones explícitas siguen funcionando; los patrones son un respaldo.
- Anulación por agente:
agents.list[].groupChat.mentionPatterns(útil cuando varios agentes comparten un grupo). - La comprobación de mención solo se aplica cuando la detección de mención es posible (menciones nativas o
mentionPatternsconfigurados). - Los valores por defecto de Discord están en
channels.discord.guilds."*"(se pueden anular por servidor/canal). - El contexto de historial de grupo se envuelve uniformemente entre canales y es solo pendiente (mensajes omitidos por la comprobación de mención); usa
messages.groupChat.historyLimitpara el valor global por defecto ychannels.<channel>.historyLimit(ochannels.<channel>.accounts.*.historyLimit) para anulaciones. Establece0para desactivar.
Restricciones de herramientas por grupo/canal (opcional)
Algunas configuraciones de canal permiten restringir qué herramientas están disponibles dentro de un grupo/sala/canal específico.
tools: permite/deniega herramientas para todo el grupo.toolsBySender: anulaciones por remitente dentro del grupo. Usa prefijos de clave explícitos:id:<senderId>,e164:<phone>,username:<handle>,name:<displayName>, y comodín"*". Las claves legacy sin prefijo siguen aceptándose y se emparejan solo comoid:.
Orden de resolución (el más específico gana):
toolsBySenderdel grupo/canal que coincidatoolsdel grupo/canaltoolsBySenderpor defecto ("*") que coincidatoolspor defecto ("*")
Ejemplo (Telegram):
{
channels: {
telegram: {
groups: {
"*": { tools: { deny: ["exec"] } },
"-1001234567890": {
tools: { deny: ["exec", "read", "write"] },
toolsBySender: {
"id:123456789": { alsoAllow: ["exec"] },
},
},
},
},
},
}
Notas:
- Las restricciones de herramientas de grupo/canal se aplican además de la política de herramientas global/agente (deny siempre gana).
- Algunos canales usan anidación diferente para salas/canales (p. ej., Discord
guilds.*.channels.*, Slackchannels.*, MS Teamsteams.*.channels.*).
Listas permitidas de grupo
Cuando se configura channels.whatsapp.groups, channels.telegram.groups o channels.imessage.groups, las claves actúan como lista permitida de grupo. Usa "*" para permitir todos los grupos mientras configuras el comportamiento de mención por defecto.
Patrones comunes (copiar/pegar):
- Desactivar todas las respuestas en grupos
{
channels: { whatsapp: { groupPolicy: "disabled" } },
}
- Permitir solo grupos específicos (WhatsApp)
{
channels: {
whatsapp: {
groups: {
"[email protected]": { requireMention: true },
"[email protected]": { requireMention: false },
},
},
},
}
- Permitir todos los grupos pero requerir mención (explícito)
{
channels: {
whatsapp: {
groups: { "*": { requireMention: true } },
},
},
}
- Solo el propietario puede activar en grupos (WhatsApp)
{
channels: {
whatsapp: {
groupPolicy: "allowlist",
groupAllowFrom: ["+15551234567"],
groups: { "*": { requireMention: true } },
},
},
}
Activación (solo propietario)
Los propietarios de grupo pueden alternar la activación por grupo:
/activation mention/activation always
El propietario se determina por channels.whatsapp.allowFrom (o el E.164 propio del bot cuando no está configurado). Envía el comando como un mensaje independiente. Otras plataformas actualmente ignoran /activation.
Campos de contexto
Los payloads entrantes de grupo establecen:
ChatType=groupGroupSubject(si se conoce)GroupMembers(si se conoce)WasMentioned(resultado de la comprobación de mención)- Los temas de foro de Telegram también incluyen
MessageThreadIdeIsForum.
El prompt del sistema del agente incluye una introducción de grupo en el primer turno de una nueva sesión de grupo. Le recuerda al modelo que responda como un humano, evite tablas Markdown y evite escribir secuencias literales \n.
Especificaciones de iMessage
- Prefiere
chat_id:<id>al enrutar o configurar listas permitidas. - Listar chats:
imsg chats --limit 20. - Las respuestas de grupo siempre van al mismo
chat_id.
Especificaciones de WhatsApp
Consulta Mensajes de grupo para el comportamiento específico de WhatsApp (inyección de historial, detalles del manejo de menciones).