> ## Documentation Index
> Fetch the complete documentation index at: https://openclaw.veiseule.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Roteamento de canais

# channels/channel-routing.md

O OpenClaw roteia as respostas **de volta para o canal de onde a mensagem veio**. O
modelo não escolhe um canal; o roteamento é determinístico e controlado pela
configuração do host.

## Termos chave

* **Canal**: `whatsapp`, `telegram`, `discord`, `slack`, `signal`, `imessage`, `webchat`.
* **AccountId**: instância de conta por canal (quando suportado).
* **AgentId**: um workspace isolado + armazenamento de sessão (“cérebro”).
* **SessionKey**: a chave de bucket usada para armazenar contexto e controlar concorrência.

## Formatos de chave de sessão (exemplos)

Mensagens diretas colapsam para a sessão **principal** do agente:

* `agent:<agentId>:<mainKey>` (padrão: `agent:main:main`)

Grupos e canais permanecem isolados por canal:

* Grupos: `agent:<agentId>:<channel>:group:<id>`
* Canais/salas: `agent:<agentId>:<channel>:channel:<id>`

Tópicos:

* Tópicos do Slack/Discord acrescentam `:thread:<threadId>` à chave base.
* Tópicos de fórum do Telegram incorporam `:topic:<topicId>` na chave do grupo.

Exemplos:

* `agent:main:telegram:group:-1001234567890:topic:42`
* `agent:main:discord:channel:123456:thread:987654`

## Regras de roteamento (como um agente é escolhido)

O roteamento seleciona **um agente** para cada mensagem de entrada:

1. **Correspondência exata de par** (`bindings` com `peer.kind` + `peer.id`).
2. **Correspondência por parente** (herança de thread).
3. **Correspondência por guild + roles** (Discord) via `guildId` + `roles`.
4. **Correspondência de guilda** (Discord) via `guildId`.
5. **Correspondência de equipe** (Slack) via `teamId`.
6. **Correspondência de conta** (`accountId` no canal).
7. **Correspondência de canal** (qualquer conta nesse canal).
8. **Agente padrão** (`agents.list[].default`, caso contrário a primeira entrada da lista, fallback para `main`).

Quando um binding inclui múltiplos campos de correspondência (`peer`, `guildId`, `teamId`, `roles`), **todos os campos fornecidos devem corresponder** para que o binding seja aplicado.

O agente correspondente determina qual workspace e armazenamento de sessão são usados.

## Grupos de broadcast (executar múltiplos agentes)

Grupos de broadcast permitem executar **múltiplos agentes** para o mesmo par **quando o OpenClaw normalmente responderia** (por exemplo: em grupos do WhatsApp, após o gating de menção/ativação).

Configuração:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  broadcast: {
    strategy: "parallel",
    "120363403215116621@g.us": ["alfred", "baerbel"],
    "+15555550123": ["support", "logger"],
  },
}
```

Veja: [Broadcast Groups](/channels/broadcast-groups).

## Visão geral de configuração

* `agents.list`: definições nomeadas de agentes (workspace, modelo etc.).
* `bindings`: mapeia canais/contas/pares de entrada para agentes.

Exemplo:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  agents: {
    list: [{ id: "support", name: "Support", workspace: "~/.openclaw/workspace-support" }],
  },
  bindings: [
    { match: { channel: "slack", teamId: "T123" }, agentId: "support" },
    { match: { channel: "telegram", peer: { kind: "group", id: "-100123" } }, agentId: "support" },
  ],
}
```

## Armazenamento de sessão

Os armazenamentos de sessão ficam no diretório de estado (padrão `~/.openclaw`):

* `~/.openclaw/agents/<agentId>/sessions/sessions.json`
* Transcrições JSONL ficam junto ao armazenamento

Você pode substituir o caminho do armazenamento via `session.store` e template `{agentId}`.

## Comportamento do WebChat

O WebChat se conecta ao **agente selecionado** e, por padrão, à sessão principal do agente. Por causa disso, o WebChat permite ver o contexto entre canais desse agente em um só lugar.

## Contexto de resposta

As respostas de entrada incluem:

* `ReplyToId`, `ReplyToBody` e `ReplyToSender` quando disponíveis.
* O contexto citado é anexado a `Body` como um bloco `[Replying to ...]`.

Isso é consistente entre os canais.
