Enrutamiento multiagente
Objetivo: varios agentes aislados (espacio de trabajo +agentDir + sesiones separados), además de varias cuentas de canal (por ejemplo, dos WhatsApps) en una sola Gateway en ejecución. La entrada se enruta a un agente mediante bindings.
¿Qué es “un agente”?
Un agente es un cerebro completamente delimitado con su propio:- Espacio de trabajo (archivos, AGENTS.md/SOUL.md/USER.md, notas locales, reglas de personalidad).
- Directorio de estado (
agentDir) para perfiles de autenticación, registro de modelos y configuración por agente. - Almacén de sesiones (historial de chat + estado de enrutamiento) en
~/.openclaw/agents/<agentId>/sessions.
sessions_history también es aquí la vía más segura para recuperar información entre sesiones: devuelve
una vista acotada y saneada, no un volcado sin procesar de la transcripción. La recuperación del asistente elimina
etiquetas de pensamiento, andamiaje de <relevant-memories>, cargas XML de llamadas de herramientas en texto plano
(incluido <tool_call>...</tool_call>,
<function_call>...</function_call>, <tool_calls>...</tool_calls>,
<function_calls>...</function_calls>, y bloques truncados de llamadas de herramientas),
andamiaje degradado de llamadas de herramientas, tokens de control del modelo filtrados en ASCII/ancho completo,
y XML malformado de llamadas de herramientas de MiniMax antes de la redacción/truncado.
Las credenciales del agente principal no se comparten automáticamente. Nunca reutilices agentDir
entre agentes (provoca colisiones de autenticación/sesión). Si quieres compartir credenciales,
copia auth-profiles.json al agentDir del otro agente.
Las Skills se cargan desde el espacio de trabajo de cada agente más raíces compartidas como
~/.openclaw/skills, y luego se filtran mediante la lista de permitidos efectiva de Skills del agente cuando
está configurada. Usa agents.defaults.skills para una línea base compartida y
agents.list[].skills para sustitución por agente. Consulta
Skills: per-agent vs shared y
Skills: agent skill allowlists.
La Gateway puede alojar un agente (predeterminado) o muchos agentes en paralelo.
Nota sobre el espacio de trabajo: el espacio de trabajo de cada agente es el cwd predeterminado, no un sandbox estricto.
Las rutas relativas se resuelven dentro del espacio de trabajo, pero las rutas absolutas pueden
alcanzar otras ubicaciones del host a menos que el sandboxing esté habilitado. Consulta
Sandboxing.
Rutas (mapa rápido)
- Configuración:
~/.openclaw/openclaw.json(oOPENCLAW_CONFIG_PATH) - Directorio de estado:
~/.openclaw(oOPENCLAW_STATE_DIR) - Espacio de trabajo:
~/.openclaw/workspace(o~/.openclaw/workspace-<agentId>) - Directorio del agente:
~/.openclaw/agents/<agentId>/agent(oagents.list[].agentDir) - Sesiones:
~/.openclaw/agents/<agentId>/sessions
Modo de un solo agente (predeterminado)
Si no haces nada, OpenClaw ejecuta un único agente:agentIdusa de forma predeterminadamain.- Las sesiones se identifican como
agent:main:<mainKey>. - El espacio de trabajo usa de forma predeterminada
~/.openclaw/workspace(o~/.openclaw/workspace-<profile>cuandoOPENCLAW_PROFILEestá establecido). - El estado usa de forma predeterminada
~/.openclaw/agents/main/agent.
Asistente de agentes
Usa el asistente de agentes para añadir un nuevo agente aislado:bindings (o deja que el asistente lo haga) para enrutar los mensajes entrantes.
Verifica con:
Inicio rápido
Crear el espacio de trabajo de cada agente
Usa el asistente o crea los espacios de trabajo manualmente:Cada agente obtiene su propio espacio de trabajo con
SOUL.md, AGENTS.md y USER.md opcional, además de un agentDir dedicado y un almacén de sesiones bajo ~/.openclaw/agents/<agentId>.Crear cuentas de canal
Crea una cuenta por agente en tus canales preferidos:Consulta las guías de canal: Discord, Telegram, WhatsApp.
- Discord: un bot por agente, habilita Message Content Intent y copia cada token.
- Telegram: un bot por agente mediante BotFather, copia cada token.
- WhatsApp: vincula cada número de teléfono por cuenta.
Añadir agentes, cuentas y bindings
Añade agentes en
agents.list, cuentas de canal en channels.<channel>.accounts y conéctalos con bindings (ejemplos abajo).Múltiples agentes = múltiples personas, múltiples personalidades
Con múltiples agentes, cadaagentId se convierte en una personalidad completamente aislada:
- Diferentes números de teléfono/cuentas (por
accountIdde cada canal). - Diferentes personalidades (mediante archivos del espacio de trabajo por agente como
AGENTS.mdySOUL.md). - Autenticación + sesiones separadas (sin interferencia entre ellas salvo que se habilite explícitamente).
Búsqueda de memoria QMD entre agentes
Si un agente debe buscar en las transcripciones de sesiones QMD de otro agente, añade colecciones adicionales enagents.list[].memorySearch.qmd.extraCollections.
Usa agents.defaults.memorySearch.qmd.extraCollections solo cuando todos los agentes
deban heredar las mismas colecciones compartidas de transcripciones.
Un número de WhatsApp, varias personas (división de mensajes directos)
Puedes enrutar distintos mensajes directos de WhatsApp a distintos agentes manteniéndote en una sola cuenta de WhatsApp. Haz coincidencia por E.164 del remitente (como+15551234567) con peer.kind: "direct". Las respuestas siguen saliendo desde el mismo número de WhatsApp (sin identidad de remitente por agente).
Detalle importante: los chats directos se contraen a la clave de sesión principal del agente, así que el aislamiento real requiere un agente por persona.
Ejemplo:
- El control de acceso de mensajes directos es global por cuenta de WhatsApp (pairing/allowlist), no por agente.
- Para grupos compartidos, vincula el grupo a un agente o usa Broadcast groups.
Reglas de enrutamiento (cómo los mensajes eligen un agente)
Los bindings son deterministas y gana el más específico:- coincidencia
peer(id exacto de mensaje directo/grupo/canal) - coincidencia
parentPeer(herencia de hilos) guildId + roles(enrutamiento por rol de Discord)guildId(Discord)teamId(Slack)- coincidencia
accountIdpara un canal - coincidencia a nivel de canal (
accountId: "*") - fallback al agente predeterminado (
agents.list[].default, o en su defecto la primera entrada de la lista, predeterminado:main)
peer + guildId), todos los campos especificados son obligatorios (semántica AND).
Detalle importante sobre el ámbito de la cuenta:
- Un binding que omite
accountIdcoincide solo con la cuenta predeterminada. - Usa
accountId: "*"para un fallback a nivel de canal en todas las cuentas. - Si más adelante añades el mismo binding para el mismo agente con un id de cuenta explícito, OpenClaw convierte el binding existente solo de canal en uno delimitado por cuenta en lugar de duplicarlo.
Varias cuentas / números de teléfono
Los canales que admiten varias cuentas (por ejemplo WhatsApp) usanaccountId para identificar
cada inicio de sesión. Cada accountId puede enrutarse a un agente distinto, de modo que un servidor puede alojar
varios números de teléfono sin mezclar sesiones.
Si quieres una cuenta predeterminada a nivel de canal cuando se omite accountId, establece
channels.<channel>.defaultAccount (opcional). Si no está establecido, OpenClaw usa como fallback
default si existe; en caso contrario, el primer id de cuenta configurado (ordenado).
Los canales comunes que admiten este patrón incluyen:
whatsapp,telegram,discord,slack,signal,imessageirc,line,googlechat,mattermost,matrix,nextcloud-talkbluebubbles,zalo,zalouser,nostr,feishu
Conceptos
agentId: un “cerebro” (espacio de trabajo, autenticación por agente, almacén de sesiones por agente).accountId: una instancia de cuenta de canal (por ejemplo, cuenta de WhatsApp"personal"frente a"biz").binding: enruta mensajes entrantes a unagentIdpor(channel, accountId, peer)y opcionalmente ids de servidor/equipo.- Los chats directos se contraen a
agent:<agentId>:<mainKey>(principal “main” por agente;session.mainKey).
Ejemplos por plataforma
Bots de Discord por agente
Cada cuenta de bot de Discord se asigna a unaccountId único. Vincula cada cuenta a un agente y mantén listas de permitidos por bot.
- Invita cada bot al servidor y habilita Message Content Intent.
- Los tokens viven en
channels.discord.accounts.<id>.token(la cuenta predeterminada puede usarDISCORD_BOT_TOKEN).
Bots de Telegram por agente
- Crea un bot por agente con BotFather y copia cada token.
- Los tokens viven en
channels.telegram.accounts.<id>.botToken(la cuenta predeterminada puede usarTELEGRAM_BOT_TOKEN).
Números de WhatsApp por agente
Vincula cada cuenta antes de iniciar la gateway:~/.openclaw/openclaw.json (JSON5):
Ejemplo: chat diario en WhatsApp + trabajo profundo en Telegram
División por canal: enruta WhatsApp a un agente rápido del día a día y Telegram a un agente Opus.- Si tienes varias cuentas para un canal, añade
accountIdal binding (por ejemplo{ channel: "whatsapp", accountId: "personal" }). - Para enrutar un único mensaje directo/grupo a Opus manteniendo el resto en chat, añade un binding
match.peerpara ese peer; las coincidencias de peer siempre ganan frente a las reglas de todo el canal.
Ejemplo: mismo canal, un peer a Opus
Mantén WhatsApp en el agente rápido, pero enruta un mensaje directo a Opus:Agente familiar vinculado a un grupo de WhatsApp
Vincula un agente familiar dedicado a un único grupo de WhatsApp, con filtrado por mención y una política de herramientas más estricta:- Las listas allow/deny de herramientas son herramientas, no Skills. Si una Skill necesita ejecutar un
binario, asegúrate de que
execesté permitido y de que el binario exista en el sandbox. - Para un filtrado más estricto, establece
agents.list[].groupChat.mentionPatternsy mantén habilitadas las listas de permitidos del grupo para el canal.
Configuración de sandbox y herramientas por agente
Cada agente puede tener sus propias restricciones de sandbox y herramientas:setupCommand vive en sandbox.docker y se ejecuta una vez al crear el contenedor.
Las sobrescrituras por agente de sandbox.docker.* se ignoran cuando el ámbito resuelto es "shared".
Ventajas:
- Aislamiento de seguridad: restringe herramientas para agentes no confiables
- Control de recursos: usa sandbox para agentes específicos mientras otros permanecen en el host
- Políticas flexibles: distintos permisos por agente
tools.elevated es global y se basa en el remitente; no se configura por agente.
Si necesitas límites por agente, usa agents.list[].tools para denegar exec.
Para orientar grupos, usa agents.list[].groupChat.mentionPatterns para que las @mentions se asignen claramente al agente previsto.
Consulta Multi-Agent Sandbox & Tools para ver ejemplos detallados.
Relacionado
- Channel Routing — cómo se enrutan los mensajes a los agentes
- Sub-Agents — generar ejecuciones de agentes en segundo plano
- ACP Agents — ejecutar arneses externos de programación
- Presence — presencia y disponibilidad del agente
- Session — aislamiento y enrutamiento de sesiones