Aller au contenu

Channel Routing

OpenClaw routes replies back to the channel where a message came from. The model does not choose a channel; routing is deterministic and controlled by the host configuration.

  • Channel : telegram, whatsapp, discord, irc, googlechat, slack, signal, imessage, line, plus les canaux d’extension. webchat est le canal de l’interface utilisateur WebChat interne et n’est pas un canal sortant configurable.
  • AccountId: per‑channel account instance (when supported).
  • Compte par défaut du canal facultatif : channels.<channel>.defaultAccount choisit quel compte est utilisé lorsqu’un chemin sortant ne spécifie pas accountId.
    • Dans les configurations multi-comptes, définissez une valeur par défaut explicite (defaultAccount ou accounts.default) lorsque deux comptes ou plus sont configurés. Sans cela, le routage de secours peut choisir le premier ID de compte normalisé.
  • AgentId: an isolated workspace + session store (“brain”).
  • SessionKey: the bucket key used to store context and control concurrency.

Direct messages collapse to the agent’s main session:

  • agent:<agentId>:<mainKey> (par défaut : agent:main:main)

Groups and channels remain isolated per channel:

  • Groupes : agent:<agentId>:<channel>:group:<id>
  • Canaux/salons : agent:<agentId>:<channel>:channel:<id>

Threads:

  • Les fils de discussion Slack/Discord ajoutent :thread:<threadId> à la clé de base.
  • Les sujets de forum Telegram intègrent :topic:<topicId> dans la clé de groupe.

Examples:

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

Lorsque session.dmScope est main, les messages directs peuvent partager une session principale. Pour empêcher que le lastRoute de la session ne soit écrasé par des messages directs de non-propriétaires, OpenClaw déduit un propriétaire épinglé à partir de allowFrom lorsque toutes ces conditions sont remplies :

  • allowFrom a exactement une entrée sans caractère générique.
  • L’entrée peut être normalisée en un ID d’expéditeur concret pour ce channel.
  • L’expéditeur du message privé entrant ne correspond pas à ce propriétaire épinglé.

Dans ce cas de non-correspondance, OpenClaw enregistre toujours les métadonnées de session entrantes, mais il ignore la mise à jour du lastRoute de la session principale.

Le routage choisit un agent pour chaque message entrant :

  1. Correspondance exacte des homologues (bindings avec peer.kind + peer.id).
  2. Correspondance de pair parent (héritage de fil de discussion).
  3. Correspondance Guilde + rôles (Discord) via guildId + roles.
  4. Correspondance de Guilde (Discord) via guildId.
  5. Correspondance d’équipe (Slack) via teamId.
  6. Correspondance de compte (accountId sur le canal).
  7. Correspondance de channel (n’importe quel compte sur ce channel, accountId: "*").
  8. Agent par défaut (agents.list[].default, sinon première entrée de la liste, repli sur main).

Lorsqu’une liaison inclut plusieurs champs de correspondance (peer, guildId, teamId, roles), tous les champs fournis doivent correspondre pour que cette liaison s’applique.

L’agent correspondant détermine quel espace de travail et quel magasin de session sont utilisés.

Les groupes de diffusion vous permettent d’exécuter plusieurs agents pour le même pair lorsqu’OpenClaw répondrait normalement (par exemple : dans les groupes WhatsApp, après filtrage par mention/activation).

Configuration :

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

Voir : Broadcast Groups.

  • agents.list : définitions d’agents nommés (espace de travail, modèle, etc.).
  • bindings : faire correspondre les channels/comptes/pairs entrants aux agents.

Exemple :

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

Les magasins de session résident dans le répertoire d’état (par défaut ~/.openclaw) :

  • ~/.openclaw/agents/<agentId>/sessions/sessions.json
  • Les transcriptions JSONL résident à côté du magasin

Vous pouvez remplacer le chemin du magasin via le modèle session.store et {agentId}.

La découverte de session Gateway et ACP analyse également les magasins d’agents sur disque sous la racine agents/ par défaut et sous les racines session.store basées sur des modèles. Les magasins découverts doivent rester à l’intérieur de cette racine d’agent résolue et utiliser un fichier sessions.json standard. Les liens symboliques et les chemins hors racine sont ignorés.

WebChat s’attache à l’agent sélectionné et utilise par défaut la session principale de l’agent. Pour cette raison, WebChat vous permet de voir le contexte inter-canaux de cet agent en un seul endroit.

Les réponses entrantes incluent :

  • ReplyToId, ReplyToBody et ReplyToSender lorsqu’ils sont disponibles.
  • Le contexte cité est ajouté à Body sous forme de bloc [Replying to ...].

Ceci est cohérent sur tous les canaux.