Configuration
Routage des canaux
Canaux et routage
OpenClaw achemine les réponses vers le canal d’où provient le message. Le modèle ne choisit pas de canal ; le routage est déterministe et contrôlé par la configuration de l’hôte.
Termes clés
- Canal : un plugin de canal intégré tel que
discord,googlechat,imessage,irc,line,signal,slack,telegramouwhatsapp, ainsi que les canaux de plugins installés.webchatest le canal interne de l’interface WebChat et ne peut pas être configuré comme canal sortant. - AccountId : instance de compte propre à chaque canal (lorsque cette fonctionnalité est prise en charge).
- Compte par défaut facultatif du canal :
channels.<channel>.defaultAccountdétermine le compte utilisé lorsqu’un chemin sortant ne spécifie pasaccountId.- Dans les configurations à plusieurs comptes, définissez une valeur par défaut explicite (
defaultAccountou un compte nommédefault) lorsque deux comptes ou plus sont configurés. Sans cela, le routage de repli peut sélectionner le premier ID de compte normalisé.
- Dans les configurations à plusieurs comptes, définissez une valeur par défaut explicite (
- AgentId : espace de travail et stockage de sessions isolés (« cerveau »).
- SessionKey : clé de compartiment utilisée pour stocker le contexte et contrôler les accès concurrents.
Préfixes des destinations sortantes
Les destinations sortantes explicites peuvent inclure un préfixe de fournisseur, tel que telegram:123 ou tg:123. Le cœur ne considère ce préfixe comme une indication de sélection du canal que lorsque le canal sélectionné est last ou qu’il n’est pas résolu d’une autre manière, et uniquement lorsque le plugin chargé annonce ce préfixe. Si l’appelant a déjà sélectionné un canal explicite, le préfixe du fournisseur doit correspondre à ce canal ; les combinaisons intercanaux, telles qu’une livraison WhatsApp vers telegram:123, échouent avant la normalisation de la destination propre au plugin.
Les préfixes de type de destination et de service tels que channel:<id>, user:<id>, room:<id>, thread:<id>, imessage:<handle> et sms:<number> restent dans la grammaire du canal sélectionné. Ils ne sélectionnent pas eux-mêmes le fournisseur.
Formes des clés de session (exemples)
Par défaut, les messages directs sont regroupés dans la session principale de l’agent :
agent:<agentId>:<mainKey>(par défaut :agent:main:main)
session.dmScope contrôle le regroupement des messages directs : main (valeur par défaut) partage une seule session
principale, tandis que per-peer, per-channel-peer et per-account-channel-peer
conservent les messages directs dans des sessions distinctes. Une liaison de routage peut remplacer la portée pour les
correspondants auxquels elle s’applique via bindings[].session.dmScope.
Même lorsque l’historique des conversations par message direct est partagé avec la session principale, les politiques de bac à sable et d’outils utilisent une clé d’exécution de discussion directe dérivée pour chaque compte dans le cas des messages directs externes, afin que les messages provenant d’un canal ne soient pas traités comme des exécutions locales de la session principale.
Les groupes et les canaux restent isolés par canal :
- Groupes :
agent:<agentId>:<channel>:group:<id> - Canaux/salles :
agent:<agentId>:<channel>:channel:<id>
Fils de discussion :
- 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é du groupe.
Exemples :
agent:main:telegram:group:-1001234567890:topic:42agent:main:discord:channel:123456:thread:987654
Épinglage de la route principale des messages directs
Lorsque session.dmScope vaut main, les messages directs peuvent partager une seule session principale.
Pour empêcher que la valeur lastRoute de la session soit remplacée par les messages directs d’un autre utilisateur que le propriétaire,
OpenClaw déduit un propriétaire épinglé à partir de allowFrom lorsque toutes les conditions suivantes sont remplies :
allowFromcontient 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 canal.
- L’expéditeur du message direct entrant ne correspond pas à ce propriétaire épinglé.
En cas de non-correspondance, OpenClaw enregistre tout de même les métadonnées de session entrantes, mais
ne met pas à jour la valeur lastRoute de la session principale.
Enregistrement entrant protégé
Les plugins de canal peuvent marquer un enregistrement de session entrante avec createIfMissing: false
lorsqu’un chemin protégé ne doit pas créer de nouvelle session OpenClaw. Dans ce mode,
OpenClaw peut mettre à jour les métadonnées et lastRoute d’une session existante, mais
ne crée pas une entrée de session uniquement destinée au routage simplement parce qu’un message a été observé.
Règles de routage (mode de sélection d’un agent)
Le routage sélectionne un agent pour chaque message entrant :
- Correspondance exacte avec le pair (
bindingsavecpeer.kind+peer.id). - Correspondance avec le pair parent (héritage du fil de discussion).
- Correspondance générique avec le pair (
peer.id: "*"pour un type de pair). - Correspondance avec la guilde et les rôles (Discord) via
guildId+roles. - Correspondance avec la guilde (Discord) via
guildId. - Correspondance avec l’équipe (Slack) via
teamId. - Correspondance avec le compte (
accountIdsur le canal). - Correspondance avec le canal (n’importe quel compte sur ce canal,
accountId: "*"). - Agent par défaut (
agents.list[].default, sinon la première entrée de la liste, avec repli surmain).
Lorsqu’une liaison comprend 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 l’espace de travail et le stockage de sessions utilisés.
Groupes de diffusion (exécuter plusieurs agents)
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 le filtrage par mention/activation).
Configuration :
{ broadcast: { strategy: "parallel", "120363403215116621@g.us": ["alfred", "baerbel"], "+15555550123": ["support", "logger"], },}Voir : Groupes de diffusion.
Vue d’ensemble de la configuration
agents.list: définitions d’agents nommés (espace de travail, modèle, etc.).bindings: associe les canaux, comptes et 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" }, ],}Stockage des sessions
Les lignes de session d’exécution se trouvent dans la base de données SQLite de chaque agent, sous le répertoire d’état (par défaut ~/.openclaw) :
~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite
Les installations plus anciennes peuvent comporter des fichiers JSONL de transcription hérités et un stockage de lignes sessions.json sous ~/.openclaw/agents/<agentId>/sessions/. Au démarrage, le Gateway et openclaw doctor --fix importent automatiquement dans SQLite les lignes et l’historique hérités actifs. Utilisez openclaw doctor --session-sqlite inspect --session-sqlite-all-agents ainsi que la séquence de validation de
Doctor lorsque vous avez besoin de preuves explicites de la migration.
Vous pouvez toujours sélectionner un chemin de stockage hérité avec session.store et le modèle {agentId} pour les workflows de migration et de maintenance hors ligne.
La détection des sessions du Gateway et d’ACP analyse également les stockages d’agents sur disque sous la racine agents/ par défaut et sous les racines définies par le modèle session.store. Les stockages détectés doivent rester dans cette racine d’agent résolue et utiliser un fichier hérité sessions.json standard. Les liens symboliques et les chemins situés hors de la racine sont ignorés.
Comportement de WebChat
WebChat se connecte à l’agent sélectionné et utilise par défaut la session principale de l’agent. Ainsi, WebChat vous permet de consulter au même endroit le contexte de cet agent provenant de plusieurs canaux.
Contexte de réponse
Les réponses entrantes comprennent :
ReplyToId,ReplyToBodyetReplyToSenderlorsqu’ils sont disponibles.- Le contexte cité est ajouté à
Bodysous forme de bloc[Replying to ...].
Ce comportement est cohérent sur tous les canaux.