Status: productieklaar via WhatsApp Web (Baileys). Gateway beheert gekoppelde sessie(s).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.
Installatie (op aanvraag)
- Onboarding (
openclaw onboard) enopenclaw channels add --channel whatsappvragen om de WhatsApp Plugin te installeren wanneer je deze voor het eerst selecteert. openclaw channels login --channel whatsappbiedt ook de installatiestroom wanneer de Plugin nog niet aanwezig is.- Dev-kanaal + git-checkout: gebruikt standaard het lokale Plugin-pad.
- Stable/Beta: gebruikt het npm-pakket
@openclaw/whatsappwanneer een huidig pakket is gepubliceerd.
Koppelen
Kanaalprobleemoplossing
Gateway-configuratie
Snelle installatie
WhatsApp koppelen (QR)
Implementatiepatronen
Speciaal nummer (aanbevolen)
Speciaal nummer (aanbevolen)
- aparte WhatsApp-identiteit voor OpenClaw
- duidelijkere DM-allowlists en routeringsgrenzen
- kleinere kans op verwarring door chatten met jezelf
Terugval op persoonlijk nummer
Terugval op persoonlijk nummer
dmPolicy: "allowlist"allowFrombevat je persoonlijke nummerselfChatMode: true
allowFrom.Kanaalscope alleen voor WhatsApp Web
Kanaalscope alleen voor WhatsApp Web
Baileys) in de huidige OpenClaw-kanaalarchitectuur.Er is geen apart Twilio WhatsApp-berichtenkanaal in het ingebouwde chatkanaalregister.Runtimemodel
- Gateway beheert de WhatsApp-socket en reconnect-loop.
- De reconnect-watchdog gebruikt WhatsApp Web-transportactiviteit, niet alleen het volume van inkomende app-berichten, zodat een stille sessie van een gekoppeld apparaat niet opnieuw wordt gestart alleen omdat niemand onlangs een bericht heeft gestuurd. Een langere limiet voor applicatiestilte forceert nog steeds een reconnect als transportframes blijven binnenkomen maar er geen applicatieberichten worden verwerkt binnen het watchdog-venster; na een tijdelijke reconnect voor een recent actieve sessie gebruikt die controle op applicatiestilte de normale berichttime-out voor het eerste herstelvenster.
- Baileys-sockettimings zijn expliciet onder
web.whatsapp.*:keepAliveIntervalMsbeheert WhatsApp Web-applicatiepings,connectTimeoutMsbeheert de time-out voor de openingshandshake endefaultQueryTimeoutMsbeheert Baileys-querytime-outs. - Uitgaande verzendingen vereisen een actieve WhatsApp-listener voor het doelaccount.
- Status- en broadcastchats worden genegeerd (
@status,@broadcast). - De reconnect-watchdog volgt WhatsApp Web-transportactiviteit, niet alleen het volume van inkomende app-berichten: stille sessies van gekoppelde apparaten blijven actief zolang transportframes doorgaan, maar een transportstoring forceert ruim vóór het latere externe disconnect-pad een reconnect.
- Directe chats gebruiken DM-sessieregels (
session.dmScope; standaardmainvouwt DM’s samen naar de hoofdsessie van de agent). - Groepssessies zijn geïsoleerd (
agent:<agentId>:whatsapp:group:<jid>). - WhatsApp Web-transport respecteert standaard proxy-omgevingsvariabelen op de Gateway-host (
HTTPS_PROXY,HTTP_PROXY,NO_PROXY/ varianten in kleine letters). Geef de voorkeur aan proxyconfiguratie op hostniveau boven kanaalspecifieke WhatsApp-proxy-instellingen. - Wanneer
messages.removeAckAfterReplyis ingeschakeld, wist OpenClaw de WhatsApp-ack-reactie nadat een zichtbaar antwoord is afgeleverd.
Plugin-hooks en privacy
Inkomende WhatsApp-berichten kunnen persoonlijke berichtinhoud, telefoonnummers, groeps-ID’s, afzendernamen en sessiecorrelatievelden bevatten. Daarom zendt WhatsApp inkomendemessage_received-hook-payloads niet uit naar Plugins
tenzij je daar expliciet voor kiest:
Toegangscontrole en activatie
- DM-beleid
- Groepsbeleid + allowlists
- Vermeldingen + /activation
channels.whatsapp.dmPolicy beheert toegang tot directe chats:pairing(standaard)allowlistopen(vereist datallowFrom"*"bevat)disabled
allowFrom accepteert nummers in E.164-stijl (intern genormaliseerd).Multi-account-override: channels.whatsapp.accounts.<id>.dmPolicy (en allowFrom) krijgen voorrang op kanaalbrede standaardwaarden voor dat account.Details van runtimegedrag:- koppelingen worden opgeslagen in de kanaal-allow-store en samengevoegd met geconfigureerde
allowFrom - als er geen allowlist is geconfigureerd, is het gekoppelde eigen nummer standaard toegestaan
- OpenClaw koppelt nooit automatisch uitgaande
fromMe-DM’s (berichten die je vanaf het gekoppelde apparaat naar jezelf stuurt)
Gedrag met persoonlijk nummer en chatten met jezelf
Wanneer het gekoppelde eigen nummer ook aanwezig is inallowFrom, worden WhatsApp-beveiligingen voor chatten met jezelf geactiveerd:
- leesbevestigingen overslaan voor beurten waarin je met jezelf chat
- auto-triggergedrag via mention-JID negeren dat anders jezelf zou pingen
- als
messages.responsePrefixniet is ingesteld, gebruiken antwoorden aan jezelf standaard[{identity.name}]of[openclaw]
Berichtnormalisatie en context
Inkomende envelop + antwoordcontext
Inkomende envelop + antwoordcontext
ReplyToId, ReplyToBody, ReplyToSender, afzender-JID/E.164).Mediaplaceholders en extractie van locatie/contact
Mediaplaceholders en extractie van locatie/contact
<media:image><media:video><media:audio><media:document><media:sticker>
<media:audio> is, zodat het uitspreken van de botvermelding in de voice-note het
antwoord kan triggeren. Als het transcript de bot nog steeds niet vermeldt, wordt het
transcript bewaard in openstaande groepsgeschiedenis in plaats van de ruwe placeholder.Locatiebodies gebruiken beknopte coördinatentekst. Locatielabels/opmerkingen en contact-/vCard-details worden weergegeven als fenced niet-vertrouwde metadata, niet als inline prompttekst.Injectie van openstaande groepsgeschiedenis
Injectie van openstaande groepsgeschiedenis
- standaardlimiet:
50 - configuratie:
channels.whatsapp.historyLimit - terugval:
messages.groupChat.historyLimit 0schakelt uit
[Chat messages since your last reply - for context][Current message - respond to this]
Leesbevestigingen
Leesbevestigingen
Aflevering, chunking en media
Tekstchunking
Tekstchunking
- standaard chunklimiet:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.chunkMode = "length" | "newline"newline-modus geeft de voorkeur aan alineagrenzen (lege regels) en valt daarna terug op lengteveilige chunking
Gedrag van uitgaande media
Gedrag van uitgaande media
- ondersteunt afbeeldings-, video-, audio- (PTT-spraaknotitie) en documentpayloads
- audiomedia wordt verzonden via de Baileys-
audio-payload metptt: true, zodat WhatsApp-clients dit weergeven als een push-to-talk-spraaknotitie - antwoordpayloads behouden
audioAsVoice; TTS-uitvoer als spraaknotitie voor WhatsApp blijft dit PTT-pad gebruiken, zelfs wanneer de provider MP3 of WebM retourneert - native Ogg/Opus-audio wordt verzonden als
audio/ogg; codecs=opusvoor compatibiliteit met spraaknotities - niet-Ogg-audio, inclusief Microsoft Edge TTS MP3/WebM-uitvoer, wordt met
ffmpeggetranscodeerd naar 48 kHz mono Ogg/Opus voordat deze via PTT wordt afgeleverd /tts latestverzendt het laatste assistentantwoord als één spraaknotitie en onderdrukt herhaalde verzendingen voor hetzelfde antwoord;/tts chat on|off|defaultregelt automatische TTS voor de huidige WhatsApp-chat- afspelen van geanimeerde GIF’s wordt ondersteund via
gifPlayback: truebij videoverzendingen - bij het verzenden van antwoordpayloads met meerdere media-items worden bijschriften toegepast op het eerste media-item, behalve dat PTT-spraaknotities de audio eerst verzenden en zichtbare tekst apart, omdat WhatsApp-clients bijschriften bij spraaknotities niet consistent weergeven
- mediabronnen kunnen HTTP(S),
file://of lokale paden zijn
Limieten voor mediagrootte en fallbackgedrag
Limieten voor mediagrootte en fallbackgedrag
- opslaglimiet voor inkomende media:
channels.whatsapp.mediaMaxMb(standaard50) - verzendlimiet voor uitgaande media:
channels.whatsapp.mediaMaxMb(standaard50) - overschrijvingen per account gebruiken
channels.whatsapp.accounts.<accountId>.mediaMaxMb - afbeeldingen worden automatisch geoptimaliseerd (formaat wijzigen/kwaliteitsronde) om binnen de limieten te passen
- bij een fout tijdens mediaverzending verzendt de fallback voor het eerste item een tekstwaarschuwing in plaats van de reactie stilzwijgend te laten vallen
Antwoorden citeren
WhatsApp ondersteunt native antwoordcitaten, waarbij uitgaande antwoorden het inkomende bericht zichtbaar citeren. Regel dit metchannels.whatsapp.replyToMode.
| Waarde | Gedrag |
|---|---|
"off" | Nooit citeren; verzenden als een gewoon bericht |
"first" | Alleen het eerste uitgaande antwoordfragment citeren |
"all" | Elk uitgaand antwoordfragment citeren |
"batched" | In wachtrij geplaatste gebundelde antwoorden citeren en directe antwoorden niet citeren |
"off". Overschrijvingen per account gebruiken channels.whatsapp.accounts.<id>.replyToMode.
Reactieniveau
channels.whatsapp.reactionLevel bepaalt hoe breed de agent emoji-reacties op WhatsApp gebruikt:
| Niveau | Bevestigingsreacties | Door agent geïnitieerde reacties | Beschrijving |
|---|---|---|---|
"off" | Nee | Nee | Helemaal geen reacties |
"ack" | Ja | Nee | Alleen bevestigingsreacties (ontvangstbewijs vóór antwoord) |
"minimal" | Ja | Ja (conservatief) | Bevestiging + agentreacties met conservatieve richtlijnen |
"extensive" | Ja | Ja (aangemoedigd) | Bevestiging + agentreacties met aangemoedigde richtlijnen |
"minimal".
Overschrijvingen per account gebruiken channels.whatsapp.accounts.<id>.reactionLevel.
Bevestigingsreacties
WhatsApp ondersteunt directe bevestigingsreacties bij ontvangst van inkomende berichten viachannels.whatsapp.ackReaction.
Bevestigingsreacties worden begrensd door reactionLevel — ze worden onderdrukt wanneer reactionLevel "off" is.
- onmiddellijk verzonden nadat inkomend is geaccepteerd (vóór het antwoord)
- fouten worden gelogd maar blokkeren normale antwoordaflevering niet
- groepsmodus
mentionsreageert op beurten die door een vermelding zijn geactiveerd; groepsactivatiealwayswerkt als bypass voor deze controle - WhatsApp gebruikt
channels.whatsapp.ackReaction(legacymessages.ackReactionwordt hier niet gebruikt)
Meerdere accounts en referenties
Accountselectie en standaardinstellingen
Accountselectie en standaardinstellingen
- account-id’s komen uit
channels.whatsapp.accounts - standaard accountselectie:
defaultals die aanwezig is, anders de eerste geconfigureerde account-id (gesorteerd) - account-id’s worden intern genormaliseerd voor opzoeken
Paden voor referenties en legacycompatibiliteit
Paden voor referenties en legacycompatibiliteit
- huidig authenticatiepad:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - back-upbestand:
creds.json.bak - legacy standaardauthenticatie in
~/.openclaw/credentials/wordt nog steeds herkend/gemigreerd voor standaardaccountflows
Uitloggedrag
Uitloggedrag
openclaw channels logout --channel whatsapp [--account <id>] wist de WhatsApp-authenticatiestatus voor dat account.In legacy authenticatiemappen blijft oauth.json behouden terwijl Baileys-authenticatiebestanden worden verwijderd.Tools, acties en configuratieschrijfbewerkingen
- Ondersteuning voor agenttools omvat de WhatsApp-reactieactie (
react). - Actiepoorten:
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- Door het kanaal geïnitieerde configuratieschrijfbewerkingen zijn standaard ingeschakeld (uitschakelen via
channels.whatsapp.configWrites=false).
Problemen oplossen
Niet gekoppeld (QR vereist)
Niet gekoppeld (QR vereist)
Gekoppeld maar verbroken / reconnectlus
Gekoppeld maar verbroken / reconnectlus
status=408 Request Time-out Connection was lost tonen, stem dan
de Baileys-sockettimings af onder web.whatsapp. Begin met het verkorten van
keepAliveIntervalMs tot onder de idle-time-out van je netwerk en het verhogen van
connectTimeoutMs op trage of verliesgevoelige verbindingen:channels login.QR-login verloopt achter een proxy
QR-login verloopt achter een proxy
openclaw channels login --channel whatsapp mislukt voordat een bruikbare QR-code wordt getoond met status=408 Request Time-out of een TLS-socketverbreking.WhatsApp Web-login gebruikt de standaard proxyomgeving van de Gateway-host (HTTPS_PROXY, HTTP_PROXY, varianten in kleine letters en NO_PROXY). Controleer of het Gateway-proces de proxy-env overneemt en dat NO_PROXY niet overeenkomt met mmg.whatsapp.net.Geen actieve listener bij verzenden
Geen actieve listener bij verzenden
Groepsberichten onverwacht genegeerd
Groepsberichten onverwacht genegeerd
groupPolicygroupAllowFrom/allowFrom- allowlist-vermeldingen in
groups - vermeldingspoort (
requireMention+ vermeldingspatronen) - dubbele sleutels in
openclaw.json(JSON5): latere vermeldingen overschrijven eerdere, dus houd ééngroupPolicyper scope aan
Bun-runtimewaarschuwing
Bun-runtimewaarschuwing
Systeemprompts
WhatsApp ondersteunt Telegram-achtige systeemprompts voor groepen en directe chats via degroups- en direct-maps.
Resolutiehiërarchie voor groepsberichten:
De effectieve groups-map wordt eerst bepaald: als het account zijn eigen groups definieert, vervangt die de root-groups-map volledig (geen diepe merge). Daarna wordt de prompt opgezocht op de resulterende enkele map:
- Groepsspecifieke systeemprompt (
groups["<groupId>"].systemPrompt): gebruikt wanneer de specifieke groepsvermelding in de map bestaat en de sleutelsystemPromptis gedefinieerd. AlssystemPrompteen lege string ("") is, wordt de wildcard onderdrukt en wordt er geen systeemprompt toegepast. - Wildcard-systeemprompt voor groepen (
groups["*"].systemPrompt): gebruikt wanneer de specifieke groepsvermelding volledig ontbreekt in de map, of wanneer die bestaat maar geen sleutelsystemPromptdefinieert.
direct-map wordt eerst bepaald: als het account zijn eigen direct definieert, vervangt die de root-direct-map volledig (geen diepe merge). Daarna wordt de prompt opgezocht op de resulterende enkele map:
- Direct-specifieke systeemprompt (
direct["<peerId>"].systemPrompt): gebruikt wanneer de specifieke peervermelding in de map bestaat en de sleutelsystemPromptis gedefinieerd. AlssystemPrompteen lege string ("") is, wordt de wildcard onderdrukt en wordt er geen systeemprompt toegepast. - Wildcard-systeemprompt voor direct (
direct["*"].systemPrompt): gebruikt wanneer de specifieke peervermelding volledig ontbreekt in de map, of wanneer die bestaat maar geen sleutelsystemPromptdefinieert.
dms blijft de lichte bucket voor per-DM-overschrijvingen van geschiedenis (dms.<id>.historyLimit). Promptoverschrijvingen staan onder direct.groups bewust onderdrukt voor alle accounts in een configuratie met meerdere accounts — zelfs accounts die geen eigen groups definiëren — om te voorkomen dat een bot groepsberichten ontvangt voor groepen waar deze niet toe behoort. WhatsApp past deze guard niet toe: root-groups en root-direct worden altijd geërfd door accounts die geen overschrijving op accountniveau definiëren, ongeacht hoeveel accounts zijn geconfigureerd. Als je in een WhatsApp-configuratie met meerdere accounts groeps- of directe prompts per account wilt, definieer dan expliciet de volledige map onder elk account in plaats van te vertrouwen op standaardinstellingen op rootniveau.
Belangrijk gedrag:
channels.whatsapp.groupsis zowel een configuratiemap per groep als de allowlist op chatniveau voor groepen. Op root- of accountscope betekentgroups["*"]dat “alle groepen worden toegelaten” voor die scope.- Voeg alleen een wildcard-groep
systemPrompttoe wanneer je al wilt dat die scope alle groepen toelaat. Als je nog steeds wilt dat alleen een vaste set groeps-ID’s in aanmerking komt, gebruik dan nietgroups["*"]voor de promptstandaard. Herhaal de prompt in plaats daarvan op elke expliciet toegestane groepsvermelding. - Groepstoelating en afzenderautorisatie zijn afzonderlijke controles.
groups["*"]verbreedt de set groepen die groepsafhandeling kan bereiken, maar autoriseert op zichzelf niet elke afzender in die groepen. Afzendertoegang wordt nog steeds afzonderlijk geregeld doorchannels.whatsapp.groupPolicyenchannels.whatsapp.groupAllowFrom. channels.whatsapp.directheeft niet hetzelfde neveneffect voor DM’s.direct["*"]biedt alleen een standaardconfiguratie voor directe chats nadat een DM al is toegelaten doordmPolicyplusallowFromof regels uit de pairing-store.
Verwijzingen naar configuratiereferentie
Primaire referentie: Belangrijke WhatsApp-velden:- toegang:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups - bezorging:
textChunkLimit,chunkMode,mediaMaxMb,sendReadReceipts,ackReaction,reactionLevel - meerdere accounts:
accounts.<id>.enabled,accounts.<id>.authDir, overschrijvingen op accountniveau - bewerkingen:
configWrites,debounceMs,web.enabled,web.heartbeatSeconds,web.reconnect.*,web.whatsapp.* - sessiegedrag:
session.dmScope,historyLimit,dmHistoryLimit,dms.<id>.historyLimit - instructies:
groups.<id>.systemPrompt,groups["*"].systemPrompt,direct.<id>.systemPrompt,direct["*"].systemPrompt