Canales y enrutamiento

OpenClaw enruta las respuestas de vuelta al canal de donde provino el mensaje. El modelo no elige un canal; el enrutamiento es determinista y controlado por la configuración del host.

Términos clave

  • Canal: whatsapp, telegram, discord, slack, signal, imessage, webchat.
  • AccountId: instancia de cuenta por canal (cuando es compatible).
  • Cuenta predeterminada opcional del canal: channels.<channel>.defaultAccount elige qué cuenta se usa cuando una ruta de salida no especifica accountId.
    • En configuraciones multi-cuenta, establece un predeterminado explícito (defaultAccount o accounts.default) cuando hay dos o más cuentas configuradas. Sin esto, el enrutamiento de respaldo puede elegir el primer ID de cuenta normalizado.
  • AgentId: un workspace aislado + almacén de sesión (“cerebro”).
  • SessionKey: la clave de bucket usada para almacenar contexto y controlar concurrencia.

Formas de clave de sesión (ejemplos)

Los mensajes directos se colapsan en la sesión principal del agente:

  • agent:<agentId>:<mainKey> (predeterminado: agent:main:main)

Los grupos y canales permanecen aislados por canal:

  • Grupos: agent:<agentId>:<channel>:group:<id>
  • Canales/salas: agent:<agentId>:<channel>:channel:<id>

Hilos:

  • Los hilos de Slack/Discord añaden :thread:<threadId> a la clave base.
  • Los temas de foro de Telegram incorporan :topic:<topicId> en la clave del grupo.

Ejemplos:

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

Fijación de ruta del DM principal

Cuando session.dmScope es main, los mensajes directos pueden compartir una sesión principal. Para evitar que el lastRoute de la sesión sea sobrescrito por DMs de no propietarios, OpenClaw infiere un propietario fijado desde allowFrom cuando se cumplen todas estas condiciones:

  • allowFrom tiene exactamente una entrada no comodín.
  • La entrada puede normalizarse a un ID de remitente concreto para ese canal.
  • El remitente del DM entrante no coincide con ese propietario fijado.

En ese caso de discrepancia, OpenClaw aún registra los metadatos de sesión entrantes, pero omite actualizar el lastRoute de la sesión principal.

Reglas de enrutamiento (cómo se elige un agente)

El enrutamiento selecciona un agente por cada mensaje entrante:

  1. Coincidencia exacta de peer (bindings con peer.kind + peer.id).
  2. Coincidencia de peer padre (herencia de hilo).
  3. Coincidencia de guild + roles (Discord) vía guildId + roles.
  4. Coincidencia de guild (Discord) vía guildId.
  5. Coincidencia de equipo (Slack) vía teamId.
  6. Coincidencia de cuenta (accountId en el canal).
  7. Coincidencia de canal (cualquier cuenta en ese canal, accountId: "*").
  8. Agente predeterminado (agents.list[].default, o primera entrada de la lista, respaldo a main).

Cuando un binding incluye múltiples campos de coincidencia (peer, guildId, teamId, roles), todos los campos proporcionados deben coincidir para que ese binding aplique.

El agente coincidente determina qué workspace y almacén de sesión se usan.

Grupos de difusión (ejecutar múltiples agentes)

Los grupos de difusión permiten ejecutar múltiples agentes para el mismo peer cuando OpenClaw respondería normalmente (por ejemplo: en grupos de WhatsApp, tras la activación por mención).

Configuración:

{
  broadcast: {
    strategy: "parallel",
    "[email protected]": ["alfred", "baerbel"],
    "+15555550123": ["support", "logger"],
  },
}

Consulta: Grupos de difusión.

Resumen de configuración

  • agents.list: definiciones de agentes con nombre (workspace, modelo, etc.).
  • bindings: mapeo de canales/cuentas/peers entrantes a agentes.

Ejemplo:

{
  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" },
  ],
}

Almacenamiento de sesiones

Los almacenes de sesión residen bajo el directorio de estado (predeterminado ~/.openclaw):

  • ~/.openclaw/agents/<agentId>/sessions/sessions.json
  • Las transcripciones JSONL están junto al almacén

Puedes modificar la ruta del almacén vía session.store y templating con {agentId}.

El descubrimiento de sesiones del Gateway y ACP también escanea almacenes de agentes respaldados en disco bajo la raíz predeterminada agents/ y bajo las raíces templated de session.store. Los almacenes descubiertos deben permanecer dentro de esa raíz de agente resuelta y usar un archivo regular sessions.json. Los symlinks y rutas fuera de la raíz se ignoran.

Comportamiento del WebChat

WebChat se conecta al agente seleccionado y por defecto usa la sesión principal del agente. Por esto, WebChat te permite ver el contexto entre canales para ese agente en un solo lugar.

Contexto de respuesta

Las respuestas entrantes incluyen:

  • ReplyToId, ReplyToBody y ReplyToSender cuando están disponibles.
  • El contexto citado se añade a Body como un bloque [Replying to ...].

Esto es consistente entre canales.