Roteamento multiagente
Objetivo: múltiplos agentes isolados (workspace +agentDir + sessões separados), além de múltiplas contas de canal (por exemplo, dois WhatsApps) em um único Gateway em execução. O tráfego de entrada é roteado para um agente por meio de bindings.
O que é “um agente”?
Um agente é um cérebro totalmente delimitado com seu próprio:- Workspace (arquivos, AGENTS.md/SOUL.md/USER.md, notas locais, regras de persona).
- Diretório de estado (
agentDir) para perfis de autenticação, registro de modelos e configuração por agente. - Armazenamento de sessões (histórico de chat + estado de roteamento) em
~/.openclaw/agents/<agentId>/sessions.
sessions_history também é o caminho mais seguro de recordação entre sessões aqui: ele retorna
uma visão limitada e higienizada, não um despejo bruto de transcrição. A recordação do assistente remove
tags de thinking, scaffolding <relevant-memories>, payloads XML de chamada de ferramenta em texto simples
(incluindo <tool_call>...</tool_call>,
<function_call>...</function_call>, <tool_calls>...</tool_calls>,
<function_calls>...</function_calls> e blocos truncados de chamada de ferramenta),
scaffolding degradado de chamada de ferramenta, tokens de controle de modelo ASCII/full-width vazados
e XML malformado de chamada de ferramenta do MiniMax antes de redação/truncamento.
As credenciais do agente principal não são compartilhadas automaticamente. Nunca reutilize agentDir
entre agentes (isso causa colisões de autenticação/sessão). Se quiser compartilhar credenciais,
copie auth-profiles.json para o agentDir do outro agente.
Skills são carregadas a partir do workspace de cada agente mais raízes compartilhadas como
~/.openclaw/skills e então filtradas pela allowlist efetiva de Skills do agente quando
configurada. Use agents.defaults.skills para uma linha de base compartilhada e
agents.list[].skills para substituição por agente. Consulte
Skills: por agente vs compartilhadas e
Skills: allowlists de Skills de agente.
O Gateway pode hospedar um agente (padrão) ou muitos agentes lado a lado.
Observação sobre workspace: o workspace de cada agente é o cwd padrão, não um
sandbox rígido. Caminhos relativos são resolvidos dentro do workspace, mas caminhos absolutos podem
alcançar outros locais do host, a menos que o sandboxing esteja ativado. Consulte
Sandboxing.
Caminhos (mapa rápido)
- Configuração:
~/.openclaw/openclaw.json(ouOPENCLAW_CONFIG_PATH) - Diretório de estado:
~/.openclaw(ouOPENCLAW_STATE_DIR) - Workspace:
~/.openclaw/workspace(ou~/.openclaw/workspace-<agentId>) - Diretório do agente:
~/.openclaw/agents/<agentId>/agent(ouagents.list[].agentDir) - Sessões:
~/.openclaw/agents/<agentId>/sessions
Modo de agente único (padrão)
Se você não fizer nada, o OpenClaw executará um único agente:agentIdusamainpor padrão.- As sessões usam chaves como
agent:main:<mainKey>. - O workspace usa
~/.openclaw/workspacepor padrão (ou~/.openclaw/workspace-<profile>quandoOPENCLAW_PROFILEestá definido). - O estado usa
~/.openclaw/agents/main/agentpor padrão.
Auxiliar de agente
Use o assistente de agente para adicionar um novo agente isolado:bindings (ou deixe o assistente fazer isso) para rotear mensagens de entrada.
Verifique com:
Início rápido
Crie o workspace de cada agente
Use o assistente ou crie workspaces manualmente:Cada agente recebe seu próprio workspace com
SOUL.md, AGENTS.md e USER.md opcional, além de um agentDir dedicado e armazenamento de sessões em ~/.openclaw/agents/<agentId>.Crie contas de canal
Crie uma conta por agente nos seus canais preferidos:Consulte os guias de canal: Discord, Telegram, WhatsApp.
- Discord: um bot por agente, ative Message Content Intent, copie cada token.
- Telegram: um bot por agente via BotFather, copie cada token.
- WhatsApp: vincule cada número de telefone por conta.
Adicione agentes, contas e bindings
Adicione agentes em
agents.list, contas de canal em channels.<channel>.accounts e conecte tudo com bindings (exemplos abaixo).Múltiplos agentes = múltiplas pessoas, múltiplas personalidades
Com múltiplos agentes, cadaagentId se torna uma persona totalmente isolada:
- Números de telefone/contas diferentes (por
accountIddo canal). - Personalidades diferentes (por arquivos do workspace do agente, como
AGENTS.mdeSOUL.md). - Autenticação + sessões separadas (sem interferência entre si, a menos que explicitamente ativada).
Pesquisa de memória QMD entre agentes
Se um agente deve pesquisar as transcrições de sessão QMD de outro agente, adicione coleções extras emagents.list[].memorySearch.qmd.extraCollections.
Use agents.defaults.memorySearch.qmd.extraCollections apenas quando todo agente
deve herdar as mesmas coleções compartilhadas de transcrição.
Um número de WhatsApp, múltiplas pessoas (divisão de DM)
Você pode rotear DMs diferentes do WhatsApp para agentes diferentes, permanecendo em uma única conta do WhatsApp. Faça a correspondência pelo E.164 do remetente (como+15551234567) com peer.kind: "direct". As respostas ainda sairão do mesmo número de WhatsApp (sem identidade de remetente por agente).
Detalhe importante: chats diretos colapsam para a chave de sessão principal do agente, então o isolamento verdadeiro exige um agente por pessoa.
Exemplo:
- O controle de acesso de DM é global por conta de WhatsApp (pairing/allowlist), não por agente.
- Para grupos compartilhados, vincule o grupo a um agente ou use Grupos de transmissão.
Regras de roteamento (como mensagens escolhem um agente)
Bindings são determinísticos e o mais específico vence:- correspondência
peer(id exato de DM/grupo/canal) - correspondência
parentPeer(herança de thread) guildId + roles(roteamento por função no Discord)guildId(Discord)teamId(Slack)- correspondência
accountIdpara um canal - correspondência em nível de canal (
accountId: "*") - fallback para o agente padrão (
agents.list[].default, caso contrário a primeira entrada da lista, padrão:main)
peer + guildId), todos os campos especificados são exigidos (semântica AND).
Detalhe importante sobre escopo de conta:
- Um binding que omite
accountIdcorresponde apenas à conta padrão. - Use
accountId: "*"para um fallback em todo o canal, abrangendo todas as contas. - Se você depois adicionar o mesmo binding para o mesmo agente com um id de conta explícito, o OpenClaw atualiza o binding existente apenas de canal para escopo de conta em vez de duplicá-lo.
Múltiplas contas / números de telefone
Canais que oferecem suporte a múltiplas contas (por exemplo, WhatsApp) usamaccountId para identificar
cada login. Cada accountId pode ser roteado para um agente diferente, então um único servidor pode hospedar
múltiplos números de telefone sem misturar sessões.
Se você quiser uma conta padrão em todo o canal quando accountId for omitido, defina
channels.<channel>.defaultAccount (opcional). Quando não definido, o OpenClaw faz fallback
para default se presente; caso contrário, usa o primeiro id de conta configurado (ordenado).
Canais comuns que oferecem suporte a esse padrão incluem:
whatsapp,telegram,discord,slack,signal,imessageirc,line,googlechat,mattermost,matrix,nextcloud-talkbluebubbles,zalo,zalouser,nostr,feishu
Conceitos
agentId: um “cérebro” (workspace, autenticação por agente, armazenamento de sessão por agente).accountId: uma instância de conta de canal (por exemplo, conta de WhatsApp"personal"vs"biz").binding: roteia mensagens de entrada para umagentIdpor(channel, accountId, peer)e opcionalmente ids de guild/team.- Chats diretos colapsam para
agent:<agentId>:<mainKey>(o “main” por agente;session.mainKey).
Exemplos por plataforma
Bots do Discord por agente
Cada conta de bot do Discord é mapeada para umaccountId único. Vincule cada conta a um agente e mantenha allowlists por bot.
- Convide cada bot para a guild e ative Message Content Intent.
- Os tokens ficam em
channels.discord.accounts.<id>.token(a conta padrão pode usarDISCORD_BOT_TOKEN).
Bots do Telegram por agente
- Crie um bot por agente com o BotFather e copie cada token.
- Os tokens ficam em
channels.telegram.accounts.<id>.botToken(a conta padrão pode usarTELEGRAM_BOT_TOKEN).
Números de WhatsApp por agente
Vincule cada conta antes de iniciar o gateway:~/.openclaw/openclaw.json (JSON5):
Exemplo: chat diário no WhatsApp + trabalho profundo no Telegram
Divida por canal: roteie o WhatsApp para um agente rápido do dia a dia e o Telegram para um agente Opus.- Se você tiver múltiplas contas para um canal, adicione
accountIdao binding (por exemplo{ channel: "whatsapp", accountId: "personal" }). - Para rotear uma única DM/grupo para Opus, mantendo o restante em chat, adicione um binding
match.peerpara esse peer; correspondências de peer sempre vencem regras amplas de canal.
Exemplo: mesmo canal, um peer para Opus
Mantenha o WhatsApp no agente rápido, mas roteie uma DM para Opus:Agente de família vinculado a um grupo do WhatsApp
Vincule um agente de família dedicado a um único grupo do WhatsApp, com controle por menção e uma política de ferramentas mais restrita:- Listas de allow/deny de ferramentas são ferramentas, não Skills. Se uma skill precisar executar um
binário, verifique se
execestá permitido e se o binário existe no sandbox. - Para um controle mais rígido, defina
agents.list[].groupChat.mentionPatternse mantenha as allowlists de grupo ativadas para o canal.
Configuração de sandbox e ferramentas por agente
Cada agente pode ter seu próprio sandbox e suas próprias restrições de ferramentas:setupCommand fica em sandbox.docker e é executado uma vez na criação do contêiner.
Substituições por agente em sandbox.docker.* são ignoradas quando o escopo resolvido é "shared".
Benefícios:
- Isolamento de segurança: restrinja ferramentas para agentes não confiáveis
- Controle de recursos: aplique sandbox a agentes específicos, mantendo outros no host
- Políticas flexíveis: permissões diferentes por agente
tools.elevated é global e baseado em remetente; ele não é configurável por agente.
Se você precisar de limites por agente, use agents.list[].tools para negar exec.
Para direcionamento de grupo, use agents.list[].groupChat.mentionPatterns para que @mentions mapeiem claramente para o agente pretendido.
Consulte Sandbox e ferramentas multiagente para exemplos detalhados.
Relacionado
- Roteamento de canais — como as mensagens são roteadas para agentes
- Subagentes — iniciar execuções de agente em segundo plano
- Agentes ACP — executar harnesses externos de programação
- Presença — presença e disponibilidade do agente
- Sessão — isolamento e roteamento de sessão