Statut : prêt pour la production via WhatsApp Web (Baileys). Gateway gère les sessions liées.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Installation (à la demande)
- L’onboarding (
openclaw onboard) etopenclaw channels add --channel whatsappproposent d’installer le Plugin WhatsApp la première fois que vous le sélectionnez. openclaw channels login --channel whatsapppropose aussi le flux d’installation lorsque le Plugin n’est pas encore présent.- Canal de développement + dépôt git extrait : utilise par défaut le chemin du Plugin local.
- Stable/Bêta : utilise le package npm
@openclaw/whatsappsur l’étiquette de version officielle actuelle.
PATH pendant l’installation npm, car
l’une de ses dépendances Baileys/libsignal est récupérée depuis une URL git. Installez
Git for Windows, puis redémarrez le shell et relancez l’installation :
bin est sur PATH.
Pairing
Channel troubleshooting
Gateway configuration
Configuration rapide
Link WhatsApp (QR)
Modèles de déploiement
Dedicated number (recommended)
Dedicated number (recommended)
- identité WhatsApp séparée pour OpenClaw
- listes d’autorisation de MP et limites de routage plus claires
- risque plus faible de confusion avec les conversations avec soi-même
Personal-number fallback
Personal-number fallback
dmPolicy: "allowlist"allowFrominclut votre numéro personnelselfChatMode: true
allowFrom.WhatsApp Web-only channel scope
WhatsApp Web-only channel scope
Baileys) dans l’architecture actuelle des canaux OpenClaw.Il n’existe pas de canal de messagerie WhatsApp Twilio séparé dans le registre intégré des canaux de chat.Modèle d’exécution
- Gateway gère la socket WhatsApp et la boucle de reconnexion.
- Le chien de garde de reconnexion utilise l’activité de transport WhatsApp Web, pas seulement le volume de messages applicatifs entrants, de sorte qu’une session d’appareil lié silencieuse n’est pas redémarrée uniquement parce que personne n’a envoyé de message récemment. Une limite plus longue de silence applicatif force tout de même une reconnexion si des trames de transport continuent d’arriver, mais qu’aucun message applicatif n’est traité pendant la fenêtre du chien de garde ; après une reconnexion transitoire pour une session récemment active, cette vérification de silence applicatif utilise le délai normal des messages pour la première fenêtre de récupération.
- Les temporisations de socket Baileys sont explicites sous
web.whatsapp.*:keepAliveIntervalMscontrôle les pings applicatifs WhatsApp Web,connectTimeoutMscontrôle le délai d’expiration de la poignée de main d’ouverture, etdefaultQueryTimeoutMscontrôle les délais d’expiration des requêtes Baileys. - Les envois sortants nécessitent un écouteur WhatsApp actif pour le compte cible.
- Les envois de groupe joignent les métadonnées de mention natives pour les jetons
@+<digits>et@<digits>dans le texte et les légendes de médias lorsque le jeton correspond aux métadonnées de participant WhatsApp actuelles, y compris les groupes adossés à LID. - Les chats de statut et de diffusion sont ignorés (
@status,@broadcast). - Le chien de garde de reconnexion suit l’activité de transport WhatsApp Web, pas seulement le volume de messages applicatifs entrants : les sessions d’appareil lié silencieuses restent actives tant que les trames de transport continuent, mais un blocage du transport force une reconnexion bien avant le chemin ultérieur de déconnexion distante.
- Les chats directs utilisent les règles de session de MP (
session.dmScope; la valeur par défautmainregroupe les MP dans la session principale de l’agent). - Les sessions de groupe sont isolées (
agent:<agentId>:whatsapp:group:<jid>). - Les canaux/newsletters WhatsApp peuvent être des cibles sortantes explicites avec leur JID natif
@newsletter. Les envois sortants de newsletter utilisent les métadonnées de session de canal (agent:<agentId>:whatsapp:channel:<jid>) plutôt que la sémantique de session de MP. - Le transport WhatsApp Web respecte les variables d’environnement de proxy standard sur l’hôte du Gateway (
HTTPS_PROXY,HTTP_PROXY,NO_PROXY/ variantes en minuscules). Préférez la configuration de proxy au niveau de l’hôte aux paramètres de proxy WhatsApp propres au canal. - Lorsque
messages.removeAckAfterReplyest activé, OpenClaw efface la réaction d’accusé de réception WhatsApp après la remise d’une réponse visible.
Hooks de Plugin et confidentialité
Les messages entrants WhatsApp peuvent contenir le contenu de messages personnels, des numéros de téléphone, des identifiants de groupe, des noms d’expéditeurs et des champs de corrélation de session. Pour cette raison, WhatsApp ne diffuse pas les charges utiles de hookmessage_received entrant aux plugins
sauf si vous l’activez explicitement :
Contrôle d’accès et activation
- DM policy
- Group policy + allowlists
- Mentions + /activation
channels.whatsapp.dmPolicy contrôle l’accès aux chats directs :pairing(par défaut)allowlistopen(nécessite queallowFrominclue"*")disabled
allowFrom accepte les numéros au style E.164 (normalisés en interne).allowFrom est une liste de contrôle d’accès des expéditeurs de MP. Elle ne filtre pas les envois sortants explicites vers des JID de groupe WhatsApp ou des JID de canal @newsletter.Remplacement multicomptes : channels.whatsapp.accounts.<id>.dmPolicy (et allowFrom) prennent le pas sur les valeurs par défaut au niveau du canal pour ce compte.Détails du comportement à l’exécution :- les appairages sont conservés dans le magasin d’autorisations du canal et fusionnés avec
allowFromconfiguré - l’automatisation planifiée et le repli de destinataire Heartbeat utilisent des cibles de livraison explicites ou
allowFromconfiguré ; les approbations d’appairage de MP ne sont pas des destinataires Cron ou Heartbeat implicites - si aucune liste d’autorisation n’est configurée, le numéro propre lié est autorisé par défaut
- OpenClaw n’appaire jamais automatiquement les MP sortants
fromMe(messages que vous vous envoyez depuis l’appareil lié)
Comportement avec numéro personnel et conversation avec soi-même
Lorsque le numéro propre lié est aussi présent dansallowFrom, les protections WhatsApp de conversation avec soi-même s’activent :
- ignorer les accusés de lecture pour les tours de conversation avec soi-même
- ignorer le comportement de déclenchement automatique par JID de mention qui vous notifierait autrement vous-même
- si
messages.responsePrefixn’est pas défini, les réponses de conversation avec soi-même utilisent par défaut[{identity.name}]ou[openclaw]
Normalisation des messages et contexte
Inbound envelope + reply context
Inbound envelope + reply context
ReplyToId, ReplyToBody, ReplyToSender, JID/E.164 de l’expéditeur).
Lorsque la cible de la réponse citée est un média téléchargeable, OpenClaw l’enregistre via
le magasin normal de médias entrants et l’expose comme MediaPath/MediaType afin que
l’agent puisse inspecter l’image référencée au lieu de voir uniquement
<media:image>.Media placeholders and location/contact extraction
Media placeholders and location/contact extraction
<media:image><media:video><media:audio><media:document><media:sticker>
<media:audio>, donc prononcer la mention du bot dans la note vocale peut
déclencher la réponse. Si la transcription ne mentionne toujours pas le bot, elle est
conservée dans l’historique de groupe en attente au lieu de l’espace réservé brut.Les corps de localisation utilisent un texte de coordonnées concis. Les libellés/commentaires de localisation et les détails de contact/vCard sont rendus comme des métadonnées non fiables clôturées, pas comme du texte d’invite en ligne.Pending group history injection
Pending group history injection
- limite par défaut :
50 - configuration :
channels.whatsapp.historyLimit - repli :
messages.groupChat.historyLimit 0désactive
[Chat messages since your last reply - for context][Current message - respond to this]
Accusés de lecture
Accusés de lecture
Livraison, découpage et médias
Découpage du texte
Découpage du texte
- limite de découpage par défaut :
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.chunkMode = "length" | "newline"- le mode
newlineprivilégie les limites de paragraphe (lignes vides), puis revient à un découpage sûr par longueur
Comportement des médias sortants
Comportement des médias sortants
- prend en charge les charges utiles d’image, de vidéo, d’audio (note vocale PTT) et de document
- les médias audio sont envoyés via la charge utile
audiode Baileys avecptt: true, afin que les clients WhatsApp les affichent comme une note vocale en mode pression pour parler - les charges utiles de réponse préservent
audioAsVoice; la sortie de note vocale TTS pour WhatsApp reste sur ce chemin PTT, même lorsque le fournisseur renvoie du MP3 ou du WebM - l’audio Ogg/Opus natif est envoyé sous la forme
audio/ogg; codecs=opuspour la compatibilité avec les notes vocales - l’audio non Ogg, y compris la sortie MP3/WebM de Microsoft Edge TTS, est transcodé avec
ffmpegen Ogg/Opus mono 48 kHz avant la livraison PTT /tts latestenvoie la dernière réponse de l’assistant comme une seule note vocale et supprime les envois répétés pour la même réponse ;/tts chat on|off|defaultcontrôle le TTS automatique pour la discussion WhatsApp actuelle- la lecture des GIF animés est prise en charge via
gifPlayback: truelors des envois vidéo - les légendes sont appliquées au premier élément multimédia lors de l’envoi de charges utiles de réponse multimédias, sauf pour les notes vocales PTT, qui envoient d’abord l’audio puis le texte visible séparément, car les clients WhatsApp n’affichent pas toujours les légendes de notes vocales
- la source du média peut être HTTP(S),
file://ou des chemins locaux
Limites de taille des médias et comportement de repli
Limites de taille des médias et comportement de repli
- plafond d’enregistrement des médias entrants :
channels.whatsapp.mediaMaxMb(par défaut50) - plafond d’envoi des médias sortants :
channels.whatsapp.mediaMaxMb(par défaut50) - les remplacements par compte utilisent
channels.whatsapp.accounts.<accountId>.mediaMaxMb - les images sont optimisées automatiquement (redimensionnement/balayage de qualité) pour respecter les limites
- en cas d’échec d’envoi de média, le repli du premier élément envoie un avertissement textuel au lieu de supprimer silencieusement la réponse
Citation des réponses
WhatsApp prend en charge la citation native des réponses, où les réponses sortantes citent visiblement le message entrant. Contrôlez-la avecchannels.whatsapp.replyToMode.
| Valeur | Comportement |
|---|---|
"off" | Ne jamais citer ; envoyer comme un message simple |
"first" | Citer uniquement le premier fragment de réponse sortante |
"all" | Citer chaque fragment de réponse sortante |
"batched" | Citer les réponses groupées en file d’attente tout en laissant les réponses immédiates sans citation |
"off". Les remplacements par compte utilisent channels.whatsapp.accounts.<id>.replyToMode.
Niveau de réaction
channels.whatsapp.reactionLevel contrôle l’étendue de l’utilisation des réactions emoji par l’agent sur WhatsApp :
| Niveau | Réactions d’accusé de réception | Réactions initiées par l’agent | Description |
|---|---|---|---|
"off" | Non | Non | Aucune réaction |
"ack" | Oui | Non | Réactions d’accusé de réception uniquement (accusé avant réponse) |
"minimal" | Oui | Oui (conservateur) | Accusé de réception + réactions de l’agent avec consignes conservatrices |
"extensive" | Oui | Oui (encouragé) | Accusé de réception + réactions de l’agent avec consignes encourageantes |
"minimal".
Les remplacements par compte utilisent channels.whatsapp.accounts.<id>.reactionLevel.
Réactions d’accusé de réception
WhatsApp prend en charge les réactions d’accusé de réception immédiates à la réception entrante viachannels.whatsapp.ackReaction.
Les réactions d’accusé de réception sont contrôlées par reactionLevel — elles sont supprimées lorsque reactionLevel vaut "off".
- envoyées immédiatement après l’acceptation du message entrant (avant la réponse)
- les échecs sont journalisés, mais ne bloquent pas la livraison normale de la réponse
- le mode de groupe
mentionsréagit sur les tours déclenchés par une mention ; l’activation de groupealwaysagit comme contournement pour cette vérification - WhatsApp utilise
channels.whatsapp.ackReaction(l’ancienmessages.ackReactionn’est pas utilisé ici)
Comptes multiples et identifiants
Sélection du compte et valeurs par défaut
Sélection du compte et valeurs par défaut
- les identifiants de compte proviennent de
channels.whatsapp.accounts - sélection du compte par défaut :
defaults’il est présent, sinon le premier identifiant de compte configuré (trié) - les identifiants de compte sont normalisés en interne pour la recherche
Chemins des identifiants et compatibilité héritée
Chemins des identifiants et compatibilité héritée
- chemin d’authentification actuel :
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - fichier de sauvegarde :
creds.json.bak - l’authentification par défaut héritée dans
~/.openclaw/credentials/est encore reconnue/migrée pour les flux de compte par défaut
Comportement de déconnexion
Comportement de déconnexion
openclaw channels logout --channel whatsapp [--account <id>] efface l’état d’authentification WhatsApp pour ce compte.Lorsqu’un Gateway est joignable, la déconnexion arrête d’abord l’écouteur WhatsApp actif pour le compte sélectionné afin que la session liée ne continue pas à recevoir des messages jusqu’au prochain redémarrage. openclaw channels remove --channel whatsapp arrête également l’écouteur actif avant de désactiver ou de supprimer la configuration du compte.Dans les répertoires d’authentification hérités, oauth.json est préservé tandis que les fichiers d’authentification Baileys sont supprimés.Outils, actions et écritures de configuration
- La prise en charge des outils d’agent inclut l’action de réaction WhatsApp (
react). - Garde-fous d’action :
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- Les écritures de configuration initiées par le canal sont activées par défaut (désactivation via
channels.whatsapp.configWrites=false).
Dépannage
Non lié (QR requis)
Non lié (QR requis)
Lié mais déconnecté / boucle de reconnexion
Lié mais déconnecté / boucle de reconnexion
status=408 Request Time-out Connection was lost, ajustez les temporisations de socket Baileys sous web.whatsapp. Commencez par raccourcir keepAliveIntervalMs sous le délai d’inactivité de votre réseau et par augmenter connectTimeoutMs sur les liens lents ou avec pertes :~/.openclaw/logs/whatsapp-health.log indique Gateway inactive, mais que openclaw gateway status et openclaw channels status --probe montrent que le Gateway et WhatsApp sont sains, exécutez openclaw doctor. Sous Linux, le diagnostic avertit au sujet d’entrées crontab héritées qui invoquent encore ~/.openclaw/bin/ensure-whatsapp.sh ; supprimez ces entrées obsolètes avec crontab -e, car cron peut ne pas disposer de l’environnement du bus utilisateur systemd et faire en sorte que cet ancien script signale à tort l’état du Gateway.Si nécessaire, reliez avec channels login.La connexion QR expire derrière un proxy
La connexion QR expire derrière un proxy
openclaw channels login --channel whatsapp échoue avant d’afficher un code QR utilisable avec status=408 Request Time-out ou une déconnexion de socket TLS.La connexion WhatsApp Web utilise l’environnement proxy standard de l’hôte du Gateway (HTTPS_PROXY, HTTP_PROXY, variantes en minuscules et NO_PROXY). Vérifiez que le processus Gateway hérite de l’environnement proxy et que NO_PROXY ne correspond pas à mmg.whatsapp.net.Aucun écouteur actif lors de l’envoi
Aucun écouteur actif lors de l’envoi
La réponse apparaît dans la transcription mais pas dans WhatsApp
La réponse apparaît dans la transcription mais pas dans WhatsApp
auto-reply delivery failed ou auto-reply was not accepted by WhatsApp provider.Messages de groupe ignorés de manière inattendue
Messages de groupe ignorés de manière inattendue
groupPolicygroupAllowFrom/allowFrom- entrées de liste d’autorisation
groups - filtrage par mention (
requireMention+ modèles de mention) - clés en double dans
openclaw.json(JSON5) : les entrées ultérieures remplacent les précédentes, conservez donc un seulgroupPolicypar portée
Avertissement d’exécution Bun
Avertissement d’exécution Bun
Prompts système
WhatsApp prend en charge les prompts système de style Telegram pour les groupes et les discussions directes via les cartesgroups et direct.
Hiérarchie de résolution pour les messages de groupe :
La carte effective groups est déterminée en premier : si le compte définit ses propres groups, elle remplace entièrement la carte racine groups (pas de fusion profonde). La recherche de prompt s’exécute ensuite sur la carte unique résultante :
- Prompt système propre au groupe (
groups["<groupId>"].systemPrompt) : utilisé lorsque l’entrée du groupe spécifique existe dans la carte et que sa clésystemPromptest définie. SisystemPromptest une chaîne vide (""), le caractère générique est supprimé et aucun prompt système n’est appliqué. - Prompt système générique de groupe (
groups["*"].systemPrompt) : utilisé lorsque l’entrée du groupe spécifique est entièrement absente de la carte, ou lorsqu’elle existe mais ne définit aucune clésystemPrompt.
direct est déterminée en premier : si le compte définit sa propre carte direct, elle remplace entièrement la carte racine direct (pas de fusion profonde). La recherche de prompt s’exécute ensuite sur la carte unique résultante :
- Invite système spécifique au direct (
direct["<peerId>"].systemPrompt) : utilisée lorsque l’entrée du pair spécifique existe dans la map et que sa clésystemPromptest définie. SisystemPromptest une chaîne vide (""), le joker est supprimé et aucune invite système n’est appliquée. - Invite système joker du direct (
direct["*"].systemPrompt) : utilisée lorsque l’entrée du pair spécifique est totalement absente de la map, ou lorsqu’elle existe mais ne définit aucune clésystemPrompt.
dms reste le bucket léger de remplacement d’historique par DM (dms.<id>.historyLimit). Les remplacements d’invites se trouvent sous direct.groups à la racine est volontairement supprimé pour tous les comptes dans une configuration multi-compte, même les comptes qui ne définissent pas leurs propres groups, afin d’empêcher un bot de recevoir des messages de groupes auxquels il n’appartient pas. WhatsApp n’applique pas cette protection : groups et direct à la racine sont toujours hérités par les comptes qui ne définissent aucun remplacement au niveau du compte, quel que soit le nombre de comptes configurés. Dans une configuration WhatsApp multi-compte, si vous voulez des invites de groupe ou de direct par compte, définissez explicitement la map complète sous chaque compte plutôt que de vous appuyer sur les valeurs par défaut au niveau racine.
Comportement important :
channels.whatsapp.groupsest à la fois une map de configuration par groupe et la liste d’autorisation des groupes au niveau du chat. À la racine comme au niveau du compte,groups["*"]signifie « tous les groupes sont admis » pour cette portée.- N’ajoutez un
systemPromptde groupe joker que si vous voulez déjà que cette portée admette tous les groupes. Si vous voulez toujours que seul un ensemble fixe d’ID de groupes soit éligible, n’utilisez pasgroups["*"]comme valeur par défaut de l’invite. Répétez plutôt l’invite sur chaque entrée de groupe explicitement autorisée. - L’admission des groupes et l’autorisation des expéditeurs sont deux vérifications distinctes.
groups["*"]élargit l’ensemble des groupes pouvant atteindre le traitement des groupes, mais n’autorise pas à lui seul chaque expéditeur dans ces groupes. L’accès des expéditeurs reste contrôlé séparément parchannels.whatsapp.groupPolicyetchannels.whatsapp.groupAllowFrom. channels.whatsapp.directn’a pas le même effet secondaire pour les DM.direct["*"]fournit seulement une configuration de chat direct par défaut après qu’un DM a déjà été admis pardmPolicyplusallowFromou les règles du stockage d’appairage.
Pointeurs de référence de configuration
Référence principale : Champs WhatsApp à fort signal :- accès :
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups - livraison :
textChunkLimit,chunkMode,mediaMaxMb,sendReadReceipts,ackReaction,reactionLevel - multi-compte :
accounts.<id>.enabled,accounts.<id>.authDir, remplacements au niveau du compte - opérations :
configWrites,debounceMs,web.enabled,web.heartbeatSeconds,web.reconnect.*,web.whatsapp.* - comportement de session :
session.dmScope,historyLimit,dmHistoryLimit,dms.<id>.historyLimit - invites :
groups.<id>.systemPrompt,groups["*"].systemPrompt,direct.<id>.systemPrompt,direct["*"].systemPrompt