agentDir) et son historique de session — ainsi que plusieurs comptes de canaux (par exemple deux WhatsApp) dans un seul Gateway en cours d’exécution. Les messages entrants sont routés vers le bon agent au moyen de liaisons.
Un agent désigne ici le périmètre complet par persona : fichiers d’espace de travail, profils d’authentification, registre de modèles et stockage de sessions. agentDir est le répertoire d’état sur disque qui contient cette configuration par agent dans ~/.openclaw/agents/<agentId>/. Une liaison associe un compte de canal (par exemple un espace de travail Slack ou un numéro WhatsApp) à l’un de ces agents.
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 de modèles et la configuration par agent. - Stockage de sessions (historique de discussion + état de routage) sous
~/.openclaw/agents/<agentId>/sessions.
sessions_history est également ici le chemin de rappel intersessions le plus sûr : il renvoie une vue bornée et assainie, pas un dump brut de transcription. Le rappel de l’assistant supprime les balises de réflexion, l’échafaudage <relevant-memories>, les charges utiles XML d’appels d’outils en texte brut (notamment <tool_call>...</tool_call>, <function_call>...</function_call>, <tool_calls>...</tool_calls>, <function_calls>...</function_calls> et les blocs d’appels d’outils tronqués), l’échafaudage d’appels d’outils dégradé, les jetons de contrôle de modèle ASCII/pleine largeur divulgués et le XML d’appel d’outil MiniMax mal formé avant la rédaction/troncature.~/.openclaw/skills, puis filtrées par la liste d’autorisation de Skills effective de l’agent lorsqu’elle est configurée. Utilisez agents.defaults.skills pour une base partagée et agents.list[].skills pour un remplacement par agent. Voir Skills : par agent ou partagées et Skills : listes d’autorisation de Skills d’agent.
Le Gateway peut héberger un agent (par défaut) ou plusieurs agents côte à côte.
Remarque sur l’espace de travail : l’espace de travail de chaque agent est le cwd par défaut, pas un bac à sable 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 sauf si le sandboxing est 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 d’agent :
~/.openclaw/agents/<agentId>/agent(ouagents.list[].agentDir) - Sessions :
~/.openclaw/agents/<agentId>/sessions
Mode mono-agent (par défaut)
Si vous ne faites rien, OpenClaw exécute un seul agent :agentIdvautmainpar défaut.- Les sessions sont indexées sous la forme
agent:main:<mainKey>. - L’espace de travail vaut par défaut
~/.openclaw/workspace(ou~/.openclaw/workspace-<profile>lorsqueOPENCLAW_PROFILEest défini). - L’état vaut par défaut
~/.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 :
Démarrage rapide
Créer chaque espace de travail d’agent
Utilisez l’assistant ou créez les espaces de travail manuellement :Chaque agent reçoit son propre espace de travail avec
SOUL.md, AGENTS.md et éventuellement USER.md, ainsi qu’un agentDir dédié et un stockage de sessions sous ~/.openclaw/agents/<agentId>.Créer des comptes de canaux
Créez un compte par agent sur vos canaux préférés :Voir les guides de canaux : Discord, Telegram, WhatsApp.
- Discord : un bot par agent, activez Message Content Intent, copiez chaque jeton.
- Telegram : un bot par agent via BotFather, copiez chaque jeton.
- WhatsApp : associez chaque numéro de téléphone par compte.
Ajouter des agents, des comptes et des liaisons
Ajoutez des agents sous
agents.list, des comptes de canaux sous channels.<channel>.accounts, puis connectez-les avec bindings (exemples ci-dessous).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 (
accountIdpar canal). - Personnalités différentes (fichiers d’espace de travail par agent comme
AGENTS.mdetSOUL.md). - Authentification + sessions séparées (aucune interférence sauf activation explicite).
Recherche mémoire QMD entre agents
Si un agent doit rechercher dans les transcriptions de sessions QMD d’un autre agent, ajoutez des collections supplémentaires sousagents.list[].memorySearch.qmd.extraCollections. Utilisez agents.defaults.memorySearch.qmd.extraCollections uniquement lorsque tous les agents doivent hériter des mêmes collections de transcriptions partagées.
Un numéro WhatsApp, plusieurs personnes (séparation des DM)
Vous pouvez router différents DM WhatsApp vers différents agents tout en restant sur un seul compte WhatsApp. Faites correspondre l’expéditeur E.164 (comme+15551234567) avec peer.kind: "direct". Les réponses proviennent toujours du même numéro WhatsApp (pas d’identité d’expéditeur par agent).
Les discussions directes se réduisent à la clé de session principale de l’agent, donc une véritable isolation exige un agent par personne.
- Le contrôle d’accès aux DM est global par compte WhatsApp (association/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 :Départage et sémantique AND
Départage et sémantique AND
- Si plusieurs liaisons correspondent dans le même niveau, la première dans l’ordre de configuration l’emporte.
- Si une liaison définit plusieurs champs de correspondance (par exemple
peer+guildId), tous les champs spécifiés sont requis (sémantiqueAND).
Détail du périmètre de compte
Détail du périmètre de compte
- Une liaison qui omet
accountIdcorrespond uniquement au compte par défaut. Elle ne correspond pas à tous les comptes. - Utilisez
accountId: "*"pour un repli à l’échelle du canal sur tous les comptes. - Utilisez
accountId: "<name>"pour correspondre à un compte. - Si vous ajoutez plus tard la même liaison pour le même agent avec un ID de compte explicite, OpenClaw met à niveau la liaison existante propre au canal vers une liaison limitée au compte au lieu de la dupliquer.
Plusieurs comptes / numéros de téléphone
Les canaux qui prennent en charge plusieurs comptes (par exemple WhatsApp) utilisentaccountId pour identifier chaque connexion. Chaque accountId peut être routé vers un agent différent, de sorte qu’un serveur peut héberger plusieurs numéros de téléphone sans mélanger les sessions.
Si vous voulez un compte par défaut à l’échelle d’un canal lorsque accountId est omis, définissez channels.<channel>.defaultAccount (facultatif). Lorsqu’il n’est pas défini, OpenClaw se rabat sur default s’il est présent, sinon sur le premier ID de compte configuré (trié).
Les canaux courants prenant en charge ce modèle incluent :
whatsapp,telegram,discord,slack,signal,imessageirc,line,googlechat,mattermost,matrix,nextcloud-talkzalo,zalouser,nostr,feishu
Concepts
agentId: un « cerveau » (espace de travail, authentification par agent, stockage de sessions par agent).accountId: une instance de compte de canal (par exemple compte WhatsApp"personal"ou"biz").binding: route les messages entrants vers unagentIdpar(channel, accountId, peer)et éventuellement par IDs de guilde/équipe.- Les discussions directes se réduisent à
agent:<agentId>:<mainKey>(« main » par agent ;session.mainKey).
Exemples de plateformes
Bots Discord par agent
Bots Discord par agent
Chaque compte de bot Discord correspond à un
accountId unique. Liez chaque compte à un agent et conservez les listes d’autorisation par bot.- Invitez chaque bot dans le serveur et activez Message Content Intent.
- Les jetons se trouvent dans
channels.discord.accounts.<id>.token(le compte par défaut peut utiliserDISCORD_BOT_TOKEN).
Bots Telegram par agent
Bots Telegram par agent
- Créez un bot par agent avec BotFather et copiez chaque jeton.
- Les jetons se trouvent dans
channels.telegram.accounts.<id>.botToken(le compte par défaut peut utiliserTELEGRAM_BOT_TOKEN). - Pour plusieurs bots dans le même groupe Telegram, invitez chaque bot et mentionnez le bot qui doit répondre.
- Désactivez le mode de confidentialité BotFather pour chaque bot de groupe, puis ajoutez à nouveau le bot afin que Telegram applique le paramètre.
- Autorisez les groupes avec
channels.telegram.groups, ou utilisezgroupPolicy: "open"uniquement pour les déploiements de groupes de confiance. - Placez les ID utilisateur des expéditeurs dans
groupAllowFrom. Les ID de groupes et de supergroupes doivent être danschannels.telegram.groups, pas dansgroupAllowFrom. - Liez par
accountIdafin que chaque bot soit routé vers son propre agent.
Numéros WhatsApp par agent
Numéros WhatsApp par agent
Associez chaque compte avant de démarrer le Gateway :
~/.openclaw/openclaw.json (JSON5) :Modèles courants
- WhatsApp quotidien + travail approfondi Telegram
- Même canal, un pair vers Opus
- Agent famille lié à un groupe WhatsApp
Répartissez par canal : routez WhatsApp vers un agent rapide pour le quotidien et Telegram vers un agent Opus.Remarques :
- Ces exemples utilisent
accountId: "*"afin que les liaisons continuent de fonctionner si vous ajoutez des comptes ultérieurement. - Pour router un seul DM/groupe vers Opus tout en conservant le reste sur chat, ajoutez une liaison
match.peerpour ce pair ; les correspondances de pair l’emportent toujours sur les règles à l’échelle du canal.
Configuration du bac à sable et des outils par agent
Chaque agent peut avoir ses propres restrictions de bac à sable et d’outils :setupCommand se trouve sous sandbox.docker et s’exécute une fois lors de la création du conteneur. Les remplacements sandbox.docker.* par agent sont ignorés lorsque la portée résolue est "shared".- Isolation de sécurité : restreignez les outils pour les agents non fiables.
- Contrôle des ressources : placez certains agents dans un bac à sable tout en gardant 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 limites par agent, utilisez agents.list[].tools pour refuser exec. Pour cibler les groupes, utilisez agents.list[].groupChat.mentionPatterns afin que les @mentions soient clairement associées à l’agent prévu.Connexe
- Agents ACP — exécution de harnais de codage externes
- Routage des canaux — comment les messages sont routés vers les agents
- Présence — présence et disponibilité de l’agent
- Session — isolation et routage des sessions
- Sous-agents — lancement d’exécutions d’agents en arrière-plan