Routage multi-agent
Objectif : plusieurs agents isolés (espace de travail distinct +agentDir + sessions), ainsi que plusieurs comptes de canal (par ex. deux WhatsApps) dans une seule Gateway en cours d’exécution. Le trafic entrant est routé vers un agent via des liaisons.
Qu’est-ce qu’« un agent » ?
Un agent est un cerveau entièrement délimité avec ses propres éléments :- Espace de travail (fichiers, AGENTS.md/SOUL.md/USER.md, notes locales, règles de persona).
- Répertoire d’état (
agentDir) pour les profils d’authentification, le registre des modèles et la configuration par agent. - Magasin de sessions (historique de chat + état de routage) sous
~/.openclaw/agents/<agentId>/sessions.
agentDir
entre agents (cela provoque des collisions d’authentification/de session). Si vous souhaitez partager des identifiants,
copiez auth-profiles.json dans le agentDir de l’autre agent.
Les Skills sont par agent via le dossier skills/ de chaque espace de travail, avec des Skills partagés
disponibles depuis ~/.openclaw/skills. Voir Skills : par agent vs partagés.
La Gateway peut héberger un agent (par défaut) ou plusieurs agents côte à côte.
Note sur l’espace de travail : l’espace de travail de chaque agent est le cwd par défaut, et non un
sandbox strict. Les chemins relatifs se résolvent dans l’espace de travail, mais les chemins absolus peuvent
atteindre d’autres emplacements de l’hôte à moins que le sandboxing ne soit activé. Voir
Sandboxing.
Chemins (carte rapide)
- Configuration :
~/.openclaw/openclaw.json(ouOPENCLAW_CONFIG_PATH) - Répertoire d’état :
~/.openclaw(ouOPENCLAW_STATE_DIR) - Espace de travail :
~/.openclaw/workspace(ou~/.openclaw/workspace-<agentId>) - Répertoire de l’agent :
~/.openclaw/agents/<agentId>/agent(ouagents.list[].agentDir) - Sessions :
~/.openclaw/agents/<agentId>/sessions
Mode agent unique (par défaut)
Si vous ne faites rien, OpenClaw exécute un seul agent :agentIdpar défaut vautmain.- Les sessions sont indexées comme
agent:main:<mainKey>. - L’espace de travail par défaut est
~/.openclaw/workspace(ou~/.openclaw/workspace-<profile>lorsqueOPENCLAW_PROFILEest défini). - L’état par défaut est
~/.openclaw/agents/main/agent.
Assistant d’agent
Utilisez l’assistant d’agent pour ajouter un nouvel agent isolé :bindings (ou laissez l’assistant le faire) pour router les messages entrants.
Vérifiez avec :
Plusieurs agents = plusieurs personnes, plusieurs personnalités
Avec plusieurs agents, chaqueagentId devient une persona entièrement isolée :
- Numéros de téléphone/comptes différents (par canal
accountId). - Personnalités différentes (fichiers d’espace de travail par agent comme
AGENTS.mdetSOUL.md). - Authentification + sessions séparées (aucun chevauchement sauf activation explicite).
Un numéro WhatsApp, plusieurs personnes (répartition des Messages prives)
Vous pouvez router différents Messages prives WhatsApp vers différents agents tout en restant sur un seul compte WhatsApp. Match on sender E.164 (like+15551234567) with peer.kind: "direct". Les réponses proviennent toujours du même numéro WhatsApp (pas d’identité d’expéditeur par agent).
Détail important : les discussions directes se regroupent sous la clé de session principale de l’agent, donc une isolation réelle nécessite un agent par personne.
Exemple :
- Le contrôle d’accès aux Messages prives est global par compte WhatsApp (appairage/liste d’autorisation), pas par agent.
- Pour les groupes partagés, liez le groupe à un agent ou utilisez les Groupes de diffusion.
Règles de routage (comment les messages choisissent un agent)
Les liaisons sont déterministes et la plus spécifique l’emporte :- Correspondance
peer(ID exact de Message prive/groupe/canal) - Correspondance
parentPeer(héritage de thread) guildId + roles(routage par rôle Discord)guildId(Discord)teamId(Slack)- Correspondance
accountIdpour un canal - Correspondance au niveau du canal (
accountId: "*") - Repli vers l’agent par défaut (
agents.list[].default, sinon la première entrée de la liste, valeur par défaut :main)
peer + guildId), tous les champs spécifiés sont requis (sémantique AND).
Comptes / numéros multiples
Les canaux prenant en charge plusieurs comptes (par ex. WhatsApp) utilisentaccountId pour identifier
chaque connexion. Chaque accountId peut être routé vers un agent différent, de sorte qu’un seul serveur peut héberger
plusieurs numéros de téléphone sans mélanger les sessions.
Concepts
agentId: un « cerveau » (espace de travail, authentification par agent, magasin de sessions par agent).accountId: une instance de compte de canal (par ex. compte WhatsApp"personal"vs"biz").binding: route les messages entrants vers unagentIdpar(channel, accountId, peer)et éventuellement par identifiants de guilde/équipe.- Les discussions directes se regroupent vers
agent:<agentId>:<mainKey>(« principal » par agent ;session.mainKey).
Exemple : deux WhatsApps → deux agents
~/.openclaw/openclaw.json (JSON5) :
Exemple : discussion quotidienne WhatsApp + travail approfondi Telegram
Séparation par canal : routez WhatsApp vers un agent rapide du quotidien et Telegram vers un agent Opus.- Si vous avez plusieurs comptes pour un canal, ajoutez
accountIdà la liaison (par exemple{ channel: "whatsapp", accountId: "personal" }). - Pour router un seul Message prive/groupe vers Opus tout en gardant le reste sur le chat, ajoutez une liaison
match.peerpour ce pair ; les correspondances de pair l’emportent toujours sur les règles à l’échelle du canal.
Exemple : même canal, un pair vers Opus
Conservez WhatsApp sur l’agent rapide, mais routez un Message prive vers Opus :Agent familial lié à un groupe WhatsApp
Liez un agent familial dédié à un seul groupe WhatsApp, avec un contrôle par mentions et une politique d’outils plus restrictive :- Les listes d’autorisation/refus d’outils concernent les outils, pas les Skills. Si un Skill doit exécuter un
binaire, assurez-vous que
execest autorisé et que le binaire existe dans le sandbox. - Pour un contrôle plus strict, définissez
agents.list[].groupChat.mentionPatternset conservez les listes d’autorisation de groupe activées pour le canal.
Sandbox et configuration des outils par agent
À partir de la version v2026.1.6, chaque agent peut avoir son propre sandbox et ses propres restrictions d’outils :setupCommand se trouve sous sandbox.docker et s’exécute une seule fois lors de la création du conteneur.
Les surcharges sandbox.docker.* par agent sont ignorées lorsque la portée résolue est "shared".
Avantages :
- Isolation de sécurité : restreindre les outils pour les agents non fiables
- Contrôle des ressources : mettre certains agents en sandbox tout en conservant les autres sur l’hôte
- Politiques flexibles : permissions différentes par agent
tools.elevated est global et basé sur l’expéditeur ; il n’est pas configurable par agent.
Si vous avez besoin de frontières par agent, utilisez agents.list[].tools pour refuser exec.
Pour le ciblage de groupe, utilisez agents.list[].groupChat.mentionPatterns afin que les @mentions correspondent clairement à l’agent prévu.
Voir Sandbox et outils multi-agent pour des exemples détaillés.