Status: productieklaar via WhatsApp Web (Baileys). Gateway beheert gekoppelde sessie(s).Documentation Index
Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Installeren (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.
- Stabiel/Beta: gebruikt het npm-pakket
@openclaw/whatsappop de huidige officiële release-tag.
PATH tijdens npm install, omdat
een van de Baileys/libsignal-afhankelijkheden wordt opgehaald via een git-URL. Installeer
Git for Windows, herstart daarna de shell en voer de installatie opnieuw uit:
bin-directory ervan op PATH staat.
Koppelen
Kanaalproblemen oplossen
Gateway-configuratie
Snelle configuratie
WhatsApp koppelen (QR)
Implementatiepatronen
Speciaal nummer (aanbevolen)
Speciaal nummer (aanbevolen)
- afzonderlijke WhatsApp-identiteit voor OpenClaw
- duidelijkere DM-allowlists en routeringsgrenzen
- kleinere kans op verwarring door zelf-chat
Fallback met persoonlijk nummer
Fallback met 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 afzonderlijk Twilio WhatsApp-berichtenkanaal in het ingebouwde chatkanaalregister.Runtimemodel
- Gateway beheert de WhatsApp-socket en reconnect-lus.
- De reconnect-watchdog gebruikt WhatsApp Web-transportactiviteit, niet alleen inkomend app-berichtvolume, zodat een stille gekoppeld-apparaat-sessie niet alleen opnieuw wordt gestart omdat niemand recent een bericht heeft gestuurd. Een langere applicatiestilte-limiet forceert nog steeds een reconnect als transportframes blijven binnenkomen maar er tijdens het watchdog-venster geen applicatieberichten worden verwerkt; na een tijdelijke reconnect voor een recent actieve sessie gebruikt die applicatiestiltecontrole de normale berichttime-out voor het eerste herstelvenster.
- Baileys-sockettimings zijn expliciet onder
web.whatsapp.*:keepAliveIntervalMsbepaalt WhatsApp Web-applicatiepings,connectTimeoutMsbepaalt de time-out voor de openingshandshake, endefaultQueryTimeoutMsbepaalt Baileys-querytime-outs. - Uitgaande verzendingen vereisen een actieve WhatsApp-listener voor het doelaccount.
- Groepsverzendingen voegen native vermeldingsmetadata toe voor
@+<digits>- en@<digits>-tokens in tekst en mediabijschriften wanneer het token overeenkomt met huidige WhatsApp-deelnemersmetadata, inclusief LID-ondersteunde groepen. - Status- en broadcastchats worden genegeerd (
@status,@broadcast). - De reconnect-watchdog volgt WhatsApp Web-transportactiviteit, niet alleen inkomend app-berichtvolume: stille gekoppeld-apparaat-sessies blijven actief zolang transportframes doorgaan, maar een transportstoring forceert ruim vóór het latere pad voor externe verbreking 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 Channels/Newsletters kunnen expliciete uitgaande doelen zijn met hun native
@newsletter-JID. Uitgaande nieuwsbriefverzendingen gebruiken kanaalsessiemetadata (agent:<agentId>:whatsapp:channel:<jid>) in plaats van DM-sessiesemantiek. - 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-proxyinstellingen. - 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, groepsidentificaties, afzendernamen en sessiecorrelatievelden bevatten. Daarom zendt WhatsApp inkomendemessage_received-hookpayloads niet uit naar plugins
tenzij je dit expliciet inschakelt:
Toegangscontrole en activatie
- DM-beleid
- Groepsbeleid + allowlists
- Vermeldingen + /activation
channels.whatsapp.dmPolicy beheert directe chattoegang:pairing(standaard)allowlistopen(vereist datallowFrom"*"bevat)disabled
allowFrom accepteert E.164-achtige nummers (intern genormaliseerd).allowFrom is een toegangscontrolelijst voor DM-afzenders. Het blokkeert geen expliciete uitgaande verzendingen naar WhatsApp-groeps-JID’s of @newsletter-kanaal-JID’s.Override voor meerdere accounts: 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 - geplande automatisering en Heartbeat-ontvangerfallback gebruiken expliciete bezorgdoelen of geconfigureerde
allowFrom; DM-koppelingsgoedkeuringen zijn geen impliciete Cron- of Heartbeat-ontvangers - 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 zelf-chat
Wanneer het gekoppelde eigen nummer ook aanwezig is inallowFrom, worden WhatsApp-zelf-chatbeveiligingen geactiveerd:
- leesbevestigingen overslaan voor zelf-chatbeurten
- auto-triggergedrag voor vermeldings-JID’s negeren dat anders jezelf zou pingen
- als
messages.responsePrefixniet is ingesteld, gebruiken zelf-chatantwoorden standaard[{identity.name}]of[openclaw]
Berichtnormalisatie en context
Inkomende envelop + antwoordcontext
Inkomende envelop + antwoordcontext
ReplyToId, ReplyToBody, ReplyToSender, afzender-JID/E.164).
Wanneer het geciteerde antwoorddoel downloadbare media is, slaat OpenClaw dit op via
de normale inkomende mediaopslag en stelt het beschikbaar als MediaPath/MediaType, zodat
de agent de gerefereerde afbeelding kan inspecteren in plaats van alleen
<media:image> te zien.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 spraaknotitie
het antwoord kan triggeren. Als de transcriptie de bot nog steeds niet vermeldt, wordt de
transcriptie bewaard in de openstaande groepsgeschiedenis in plaats van de ruwe placeholder.Locatiebody’s gebruiken beknopte coördinatentekst. Locatielabels/opmerkingen en contact-/vCard-details worden weergegeven als omheinde 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
Bezorging, opsplitsing en media
Tekst opsplitsen
Tekst opsplitsen
- standaard chunklimiet:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.chunkMode = "length" | "newline"- de modus
newlinegeeft de voorkeur aan alineagrenzen (lege regels) en valt daarna terug op lengteveilige opsplitsing
Gedrag van uitgaande media
Gedrag van uitgaande media
- ondersteunt payloads voor afbeeldingen, video, audio (PTT-spraaknotitie) en documenten
- audiomedia worden verzonden via de Baileys-
audio-payload metptt: true, zodat WhatsApp-clients deze weergeven als een push-to-talk-spraaknotitie - antwoordpayloads behouden
audioAsVoice; TTS-spraaknotitie-uitvoer 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 vóór PTT-bezorging /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 en zichtbare tekst afzonderlijk verzenden omdat WhatsApp-clients bijschriften bij spraaknotities niet consistent weergeven
- mediabronnen kunnen HTTP(S),
file://of lokale paden zijn
Limieten voor mediagrootte en terugvalgedrag
Limieten voor mediagrootte en terugvalgedrag
- 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/kwaliteitssweep) om binnen de limieten te passen
- bij mislukte mediaverzending verzendt de terugval voor het eerste item een tekstwaarschuwing in plaats van de reactie stilzwijgend te laten vallen
Antwoordcitaat
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 de eerste uitgaande antwoordchunk citeren |
"all" | Elke uitgaande antwoordchunk citeren |
"batched" | In de wachtrij geplaatste gebundelde antwoorden citeren, terwijl directe antwoorden ongeciteerd blijven |
"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 | Ack-reacties | Door agent gestarte reacties | Beschrijving |
|---|---|---|---|
"off" | Nee | Nee | Helemaal geen reacties |
"ack" | Ja | Nee | Alleen ack-reacties (ontvangst vóór antwoord) |
"minimal" | Ja | Ja (conservatief) | Ack + agentreacties met conservatieve begeleiding |
"extensive" | Ja | Ja (aangemoedigd) | Ack + agentreacties met aangemoedigde begeleiding |
"minimal".
Overschrijvingen per account gebruiken channels.whatsapp.accounts.<id>.reactionLevel.
Bevestigingsreacties
WhatsApp ondersteunt onmiddellijke ack-reacties bij inkomende ontvangst viachannels.whatsapp.ackReaction.
Ack-reacties worden begrensd door reactionLevel: ze worden onderdrukt wanneer reactionLevel "off" is.
- direct verzonden nadat inkomend verkeer is geaccepteerd (vóór antwoord)
- fouten worden gelogd maar blokkeren normale antwoordbezorging niet
- groepsmodus
mentionsreageert op beurten die door een vermelding worden 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 - standaardaccountselectie:
defaultindien aanwezig, anders de eerste geconfigureerde account-id (gesorteerd) - account-id’s worden intern genormaliseerd voor opzoeken
Paden voor referenties en legacy-compatibiliteit
Paden voor referenties en legacy-compatibiliteit
- huidig auth-pad:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - back-upbestand:
creds.json.bak - legacy standaardauth in
~/.openclaw/credentials/wordt nog steeds herkend/gemigreerd voor standaardaccountflows
Uitloggedrag
Uitloggedrag
openclaw channels logout --channel whatsapp [--account <id>] wist de WhatsApp-authstatus voor dat account.Wanneer een Gateway bereikbaar is, stopt uitloggen eerst de live WhatsApp-listener voor het geselecteerde account, zodat de gekoppelde sessie geen berichten blijft ontvangen tot de volgende herstart. openclaw channels remove --channel whatsapp stopt ook de live listener voordat accountconfiguratie wordt uitgeschakeld of verwijderd.In legacy auth-mappen blijft oauth.json behouden terwijl Baileys-authbestanden worden verwijderd.Tools, acties en configuratieschrijfacties
- Ondersteuning voor agenttools omvat de WhatsApp-reactieactie (
react). - Actiegates:
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- Door het kanaal geïnitieerde configuratieschrijfacties zijn standaard ingeschakeld (uitschakelen via
channels.whatsapp.configWrites=false).
Probleemoplossing
Niet gekoppeld (QR vereist)
Niet gekoppeld (QR vereist)
Gekoppeld maar verbroken / herverbindingslus
Gekoppeld maar verbroken / herverbindingslus
status=408 Request Time-out Connection was lost tonen, stem dan
Baileys-sockettimings af onder web.whatsapp. Begin met het verkorten van
keepAliveIntervalMs tot onder de idle-time-out van je netwerk en verhoog
connectTimeoutMs op trage of verliesgevoelige verbindingen:~/.openclaw/logs/whatsapp-health.log Gateway inactive meldt maar
openclaw gateway status en openclaw channels status --probe laten zien dat de
gateway en WhatsApp gezond zijn, voer dan openclaw doctor uit. Op Linux waarschuwt doctor
voor legacy crontab-items die nog steeds
~/.openclaw/bin/ensure-whatsapp.sh aanroepen; verwijder die verouderde items met
crontab -e omdat Cron de systemd-gebruikersbusomgeving kan missen en
ervoor kan zorgen dat dat oude script Gateway-gezondheid verkeerd rapporteert.Koppel indien nodig opnieuw met 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 verbroken TLS-socket.WhatsApp Web-login gebruikt de standaard proxyomgeving van de gatewayhost (HTTPS_PROXY, HTTP_PROXY, varianten in kleine letters en NO_PROXY). Controleer of het gatewayproces de proxy-env erft en dat NO_PROXY niet overeenkomt met mmg.whatsapp.net.Geen actieve listener bij verzenden
Geen actieve listener bij verzenden
Antwoord verschijnt in transcript maar niet in WhatsApp
Antwoord verschijnt in transcript maar niet in WhatsApp
auto-reply delivery failed of auto-reply was not accepted by WhatsApp provider.Groepsberichten onverwacht genegeerd
Groepsberichten onverwacht genegeerd
groupPolicygroupAllowFrom/allowFrom- allowlist-items in
groups - vermeldingsgating (
requireMention+ vermeldingspatronen) - dubbele sleutels in
openclaw.json(JSON5): latere items overschrijven eerdere, dus houd ééngroupPolicyper scope aan
Bun-runtimewaarschuwing
Bun-runtimewaarschuwing
Systeemprompts
WhatsApp ondersteunt Telegram-achtige systeemprompts voor groepen en directe chats via de mapsgroups en direct.
Resolutiehiërarchie voor groepsberichten:
De effectieve map groups wordt eerst bepaald: als het account zijn eigen groups definieert, vervangt deze de rootmap groups volledig (geen diepe merge). Promptopzoeking wordt daarna uitgevoerd op de resulterende enkele map:
- Groepsspecifieke systeemprompt (
groups["<groupId>"].systemPrompt): gebruikt wanneer het specifieke groepsitem in de map bestaat en de sleutelsystemPromptervan is gedefinieerd. AlssystemPrompteen lege string ("") is, wordt de wildcard onderdrukt en wordt er geen systeemprompt toegepast. - Groepswildcard-systeemprompt (
groups["*"].systemPrompt): gebruikt wanneer het specifieke groepsitem volledig afwezig is in de map, of wanneer het bestaat maar geen sleutelsystemPromptdefinieert.
direct wordt eerst bepaald: als het account zijn eigen direct definieert, vervangt deze de rootmap direct volledig (geen diepe merge). Promptopzoeking wordt daarna uitgevoerd op de resulterende enkele map:
- Direct-specifieke systeemprompt (
direct["<peerId>"].systemPrompt): gebruikt wanneer de specifieke peer-vermelding in de map bestaat en de sleutelsystemPromptis gedefinieerd. AlssystemPrompteen lege string ("") is, wordt de wildcard onderdrukt en wordt er geen systeemprompt toegepast. - Direct-wildcard-systeemprompt (
direct["*"].systemPrompt): gebruikt wanneer de specifieke peer-vermelding volledig ontbreekt in de map, of wanneer die wel bestaat maar geen sleutelsystemPromptdefinieert.
dms blijft de lichte per-DM-bucket voor geschiedenisoverschrijvingen (dms.<id>.historyLimit). Promptoverschrijvingen staan onder direct.groups bewust onderdrukt voor alle accounts in een multi-accountconfiguratie — zelfs accounts die zelf geen groups definiëren — om te voorkomen dat een bot groepsberichten ontvangt voor groepen waarvan hij geen lid is. WhatsApp past deze beveiliging niet toe: root-groups en root-direct worden altijd overgenomen door accounts die geen override op accountniveau definiëren, ongeacht hoeveel accounts zijn geconfigureerd. Als je in een multi-accountconfiguratie van WhatsApp prompts per account voor groepen of directe chats wilt, definieer dan de volledige map expliciet onder elk account in plaats van te vertrouwen op standaardwaarden op rootniveau.
Belangrijk gedrag:
channels.whatsapp.groupsis zowel een configuratiemap per groep als de allowlist voor groepen op chatniveau. Op root- of accountniveau betekentgroups["*"]dat “alle groepen worden toegelaten” voor dat bereik.- Voeg alleen een wildcardgroep-
systemPrompttoe wanneer je al wilt dat dat bereik alle groepen toelaat. Als je nog steeds wilt dat alleen een vaste set groeps-ID’s in aanmerking komt, gebruik dan nietgroups["*"]als standaardwaarde voor de prompt. Herhaal de prompt in plaats daarvan op elke expliciet toegestane groepsvermelding. - Groepstoelating en afzenderautorisatie zijn afzonderlijke controles.
groups["*"]vergroot de set groepen die groepsafhandeling kunnen 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 - aflevering:
textChunkLimit,chunkMode,mediaMaxMb,sendReadReceipts,ackReaction,reactionLevel - multi-account:
accounts.<id>.enabled,accounts.<id>.authDir, overrides op accountniveau - beheer:
configWrites,debounceMs,web.enabled,web.heartbeatSeconds,web.reconnect.*,web.whatsapp.* - sessiegedrag:
session.dmScope,historyLimit,dmHistoryLimit,dms.<id>.historyLimit - prompts:
groups.<id>.systemPrompt,groups["*"].systemPrompt,direct.<id>.systemPrompt,direct["*"].systemPrompt