Mainstream messaging
Status: produktionsbereit über WhatsApp Web (Baileys). Gateway verwaltet verknüpfte Sitzung(en).
Installation (bei Bedarf)
- Onboarding (
openclaw onboard) undopenclaw channels add --channel whatsappfragen bei der ersten Auswahl nach der Installation des WhatsApp-Plugins. openclaw channels login --channel whatsappbietet den Installationsablauf ebenfalls an, wenn das Plugin noch nicht vorhanden ist.- Dev-Channel + Git-Checkout: verwendet standardmäßig den lokalen Plugin-Pfad.
- Stable/Beta: installiert zuerst das offizielle
@openclaw/whatsapp-Plugin aus ClawHub, mit npm als Fallback. - Die WhatsApp-Laufzeit wird außerhalb des zentralen OpenClaw-npm-Pakets verteilt, damit WhatsApp-spezifische Laufzeitabhängigkeiten beim externen Plugin bleiben.
Die manuelle Installation bleibt verfügbar:
openclaw plugins install clawhub:@openclaw/whatsappVerwenden Sie das reine npm-Paket (@openclaw/whatsapp) nur, wenn Sie den Registry-
Fallback benötigen. Pinnen Sie eine exakte Version nur, wenn Sie eine reproduzierbare Installation benötigen.
Die Standard-DM-Richtlinie ist Kopplung für unbekannte Absender.
Channel-übergreifende Diagnosen und Reparatur-Playbooks.
Vollständige Channel-Konfigurationsmuster und Beispiele.
Schnelle Einrichtung
WhatsApp-Zugriffsrichtlinie konfigurieren
{channels: {whatsapp: { dmPolicy: "pairing", allowFrom: ["+15551234567"], groupPolicy: "allowlist", groupAllowFrom: ["+15551234567"],},},}WhatsApp verknüpfen (QR)
openclaw channels login --channel whatsappDie aktuelle Anmeldung basiert auf QR. Stellen Sie in Remote- oder Headless-Umgebungen sicher, dass Sie einen zuverlässigen Weg haben, den Live-QR-Code an das Telefon zu übermitteln, das ihn scannen wird, bevor Sie die Anmeldung starten.
Für ein bestimmtes Konto:
openclaw channels login --channel whatsapp --account workUm vor der Anmeldung ein vorhandenes/benutzerdefiniertes WhatsApp-Web-Auth-Verzeichnis anzuhängen:
openclaw channels add --channel whatsapp --account work --auth-dir /path/to/wa-authopenclaw channels login --channel whatsapp --account workGateway starten
openclaw gatewayErste Kopplungsanfrage genehmigen (bei Verwendung des Kopplungsmodus)
openclaw pairing list whatsappopenclaw pairing approve whatsapp <CODE>Kopplungsanfragen laufen nach 1 Stunde ab. Ausstehende Anfragen sind auf 3 pro Channel begrenzt.
Aktuellen Anfragenden mit MeowCaller anrufen (experimentell)
Das WhatsApp-Plugin kann whatsapp_call in Agent-Turns offenlegen, die aus WhatsApp stammen. Das Tool
verwendet MeowCaller, um einen WhatsApp-Sprachanruf an
den aktuell autorisierten Anfragenden zu starten, und spielt nach Annahme eine OpenClaw-TTS-Nachricht ab. Das Tool
akzeptiert keine Zielnummer, daher kann ein Prompt den Anruf nicht an Dritte umleiten.
Diese experimentelle Fähigkeit ist standardmäßig deaktiviert.
Experimentelle Anrufe aktivieren
Fügen Sie dem WhatsApp-Channel in openclaw.json actions.calls: true hinzu:
{"channels": {"whatsapp": { "actions": { "calls": true }}}}Führen Sie dies mit Ihrer vorhandenen WhatsApp-Konfiguration zusammen und starten Sie dann das Gateway neu. Wenn die
Einstellung fehlt oder false ist, legt OpenClaw das Tool whatsapp_call nicht für den Agent offen.
Geprüfte MeowCaller-CLI installieren
Der Adapter erwartet auf dem Gateway-Host ein ausführbares Programm namens meowcaller im PATH.
Bis MeowCaller PR #7 gemergt ist, bauen Sie
den geprüften Branch bei Commit 752050471fc2bf7a8cdfbf7dbd3cd4e865d85d3f:
git clone --branch feat/send-only-notify https://github.com/steipete/meowcaller.gitcd meowcallergit checkout 752050471fc2bf7a8cdfbf7dbd3cd4e865d85d3fmkdir -p "$HOME/.local/bin"go build -o "$HOME/.local/bin/meowcaller" ./cmd/meowcallerStellen Sie sicher, dass $HOME/.local/bin auch im PATH des Gateway-Dienstes liegt. Diese Revision stellt
explizite Befehle pair und send-only notify bereit. notify öffnet kein Mikrofon, keinen Lautsprecher,
kein Videogerät, keine Senke für eingehendes Audio und keine Diagnoseerfassung. Ersetzen Sie es nicht durch den Befehl
play der Beispiel-CLI.
MeowCaller-Linked-Device koppeln
Bitten Sie den WhatsApp-Agent, die Anrufeinrichtung zu prüfen. Die Statusaktion whatsapp_call meldet das
kontospezifische Statusverzeichnis und den Kopplungsbefehl. Für das Standardkonto:
state_dir="$HOME/.openclaw/credentials/whatsapp-calls/default"mkdir -p "$state_dir"chmod 700 "$state_dir"meowcaller pair --store "$state_dir/wa-voip.db"Führen Sie den Befehl in einem interaktiven Terminal aus. Scannen Sie seinen QR über WhatsApp > Verknüpfte Geräte
und warten Sie auf MeowCaller linked device ready. Der Befehl beendet sich dann. Halten Sie wa-voip.db
privat; sie ist die MeowCaller-Linked-Device-Sitzung. Die Statusaktion whatsapp_call
gibt den kontospezifischen Befehl und die Shell zurück, wenn Sie ein nicht standardmäßiges Konto verwenden. Unter
Windows führen Sie den entsprechenden PowerShell-Befehl aus; MeowCaller erstellt das Store-Verzeichnis.
TTS konfigurieren und über WhatsApp anrufen
Konfigurieren Sie einen telefoniefähigen TTS-Provider, starten Sie das Gateway neu und senden Sie dann eine
WhatsApp-Anfrage wie Call me and say the build finished. Das Tool löst den Absender
aus vertrauenswürdigem eingehendem Kontext auf, synthetisiert eine temporäre private WAV-Datei, führt MeowCaller für ein
begrenztes Anruffenster aus und löscht die Audiodatei anschließend. OpenClaw übergibt den Store des Kontos
explizit, wartet nach Annahme, Wiedergabe und Auflegen auf einen Exit-Status von null und behandelt
ein Timeout oder einen Exit ungleich null als fehlgeschlagenen Tool-Aufruf.
Aktuelle Grenzen:
- nur ausgehende 1:1-Audioanrufe
- keine beliebigen Zielnummern
- keine gemeinsame Authentifizierung mit der Chat-Verbindung
- keine Selbstanrufe im Modus mit persönlicher Nummer/Selbst-Chat
- synthetisiertes Audio ist auf 60 Sekunden begrenzt
- keine Empfangsbestätigung zur Hörbarkeit auf dem Handgerät über MeowCallers Abschluss von Annahme/Wiedergabe/Auflegen hinaus
- OpenClaw stoppt den Begleitprozess nach einem begrenzten Fenster von 115-175 Sekunden, einschließlich MeowCallers Verbindungs-, Annahme-, Wiedergabe- und Beendigungsphasen
Bereitstellungsmuster
Dedizierte Nummer (empfohlen)
Dies ist der sauberste Betriebsmodus:
- separate WhatsApp-Identität für OpenClaw
- klarere DM-Allowlists und Routing-Grenzen
- geringere Wahrscheinlichkeit von Verwechslungen durch Selbst-Chat
Minimales Richtlinienmuster:
{ channels: { whatsapp: { dmPolicy: "allowlist", allowFrom: ["+15551234567"], }, },}Fallback mit persönlicher Nummer
Onboarding unterstützt den Modus mit persönlicher Nummer und schreibt eine selbst-chat-freundliche Baseline:
dmPolicy: "allowlist"allowFromenthält Ihre persönliche NummerselfChatMode: true
Zur Laufzeit basieren Selbst-Chat-Schutzmechanismen auf der verknüpften eigenen Nummer und allowFrom.
Channel-Umfang nur für WhatsApp Web
Der Messaging-Platform-Channel basiert in der aktuellen OpenClaw-Channel-Architektur auf WhatsApp Web (Baileys).
In der integrierten Chat-Channel-Registry gibt es keinen separaten Twilio-WhatsApp-Messaging-Channel.
Laufzeitmodell
- Gateway verwaltet den WhatsApp-Socket und die Reconnect-Schleife.
- Der Reconnect-Watchdog verwendet WhatsApp-Web-Transportaktivität, nicht nur eingehendes App-Nachrichtenvolumen, sodass eine stille Linked-Device-Sitzung nicht allein deshalb neu gestartet wird, weil kürzlich niemand eine Nachricht gesendet hat. Eine längere Obergrenze für Anwendungspausen erzwingt weiterhin einen Reconnect, wenn weiter Transport-Frames eintreffen, aber innerhalb des Watchdog-Fensters keine Anwendungsnachrichten verarbeitet werden; nach einem vorübergehenden Reconnect für eine kürzlich aktive Sitzung verwendet diese Prüfung auf Anwendungspausen für das erste Wiederherstellungsfenster das normale Nachrichten-Timeout.
- Baileys-Socket-Timings sind explizit unter
web.whatsapp.*:keepAliveIntervalMssteuert WhatsApp-Web-Anwendungs-Pings,connectTimeoutMssteuert das Timeout des öffnenden Handshakes, unddefaultQueryTimeoutMssteuert Baileys-Abfragewartezeiten plus die lokalen OpenClaw-Grenzen für ausgehendes Senden/Präsenz und eingehende Lesebestätigungsoperationen. - Ausgehende Sendungen erfordern einen aktiven WhatsApp-Listener für das Zielkonto.
- Gruppensendungen hängen native Erwähnungsmetadaten für
@+<digits>- und@<digits>-Tokens in Text und Medienbeschriftungen an, wenn das Token aktuellen WhatsApp-Teilnehmermetadaten entspricht, einschließlich LID-gestützter Gruppen. - Status- und Broadcast-Chats werden ignoriert (
@status,@broadcast). - Der Reconnect-Watchdog folgt WhatsApp-Web-Transportaktivität, nicht nur eingehendem App-Nachrichtenvolumen: stille Linked-Device-Sitzungen bleiben aktiv, solange Transport-Frames weiterlaufen, aber ein Transportstillstand erzwingt einen Reconnect deutlich vor dem späteren Remote-Disconnect-Pfad.
- Direktchats verwenden DM-Sitzungsregeln (
session.dmScope; Standardmainführt DMs in der Hauptsitzung des Agent zusammen). - Gruppensitzungen sind isoliert (
agent:<agentId>:whatsapp:group:<jid>). - WhatsApp Channels/Newsletters können explizite ausgehende Ziele mit ihrer nativen
@newsletter-JID sein. Ausgehende Newsletter-Sendungen verwenden Channel-Sitzungsmetadaten (agent:<agentId>:whatsapp:channel:<jid>) statt DM-Sitzungssemantik. - Der WhatsApp-Web-Transport berücksichtigt standardmäßige Proxy-Umgebungsvariablen auf dem Gateway-Host (
HTTPS_PROXY,HTTP_PROXY,NO_PROXY/ Varianten in Kleinbuchstaben). Bevorzugen Sie hostweite Proxy-Konfiguration gegenüber Channel-spezifischen WhatsApp-Proxy-Einstellungen. - Wenn
messages.removeAckAfterReplyaktiviert ist, entfernt OpenClaw die WhatsApp-Ack-Reaktion, nachdem eine sichtbare Antwort zugestellt wurde.
Genehmigungs-Prompts
WhatsApp kann Exec- und Plugin-Genehmigungs-Prompts mit 👍-/👎-Reaktionen rendern. Die Zustellung wird
durch die Top-Level-Konfiguration für Genehmigungsweiterleitung gesteuert:
{ approvals: { exec: { enabled: true, mode: "session", }, plugin: { enabled: true, mode: "targets", targets: [{ channel: "whatsapp", to: "+15551234567" }], }, },}approvals.exec und approvals.plugin sind unabhängig. WhatsApp als Channel zu aktivieren verknüpft nur
den Transport; es sendet keine Genehmigungs-Prompts, sofern die passende Genehmigungsfamilie nicht aktiviert ist
und an WhatsApp routet. Der Sitzungsmodus liefert native Emoji-Genehmigungen nur für Genehmigungen, die
aus WhatsApp stammen. Der Zielmodus verwendet die gemeinsame Weiterleitungs-Pipeline für explizite WhatsApp-
Ziele und erstellt keinen separaten Fanout für Genehmiger-DMs.
WhatsApp-Genehmigungsreaktionen erfordern explizite WhatsApp-Genehmiger aus allowFrom oder "*".
defaultTo steuert gewöhnliche Standardnachrichtenziele; es ist kein Genehmiger für Genehmigungen. Manuelle
/approve-Befehle durchlaufen weiterhin den normalen WhatsApp-Absenderautorisierungspfad, bevor
die Genehmigung aufgelöst wird.
Plugin-Hooks und Datenschutz
WhatsApp-Eingangsnachrichten können persönliche Nachrichteninhalte, Telefonnummern,
Gruppenkennungen, Absendernamen und Felder zur Sitzungs-Korrelation enthalten. Aus diesem Grund
sendet WhatsApp eingehende message_received-Hook-Payloads nicht an Plugins,
es sei denn, Sie aktivieren dies ausdrücklich:
{ channels: { whatsapp: { pluginHooks: { messageReceived: true, }, }, },}Sie können die Aktivierung auf ein Konto beschränken:
{ channels: { whatsapp: { accounts: { work: { pluginHooks: { messageReceived: true, }, }, }, }, },}Aktivieren Sie dies nur für Plugins, denen Sie den Empfang eingehender WhatsApp-Nachrichteninhalte und Kennungen anvertrauen.
Zugriffskontrolle und Aktivierung
DM policy
channels.whatsapp.dmPolicy steuert den Zugriff auf direkte Chats:
pairing(Standard)allowlistopen(erfordert, dassallowFrom"*"enthält)disabled
allowFrom akzeptiert Nummern im E.164-Stil (intern normalisiert).
allowFrom ist eine Zugriffskontrollliste für DM-Absender. Sie blockiert keine expliziten ausgehenden Sendungen an WhatsApp-Gruppen-JIDs oder @newsletter-Kanal-JIDs.
Überschreibung für mehrere Konten: channels.whatsapp.accounts.<id>.dmPolicy (und allowFrom) haben für dieses Konto Vorrang vor Standardeinstellungen auf Kanalebene.
Details zum Laufzeitverhalten:
- Kopplungen werden im Kanal-Allow-Store gespeichert und mit konfiguriertem
allowFromzusammengeführt - geplante Automatisierung und Heartbeat-Empfänger-Fallback verwenden explizite Zustellziele oder konfiguriertes
allowFrom; DM-Kopplungsgenehmigungen sind keine impliziten Cron- oder Heartbeat-Empfänger - wenn keine Zulassungsliste konfiguriert ist, ist die verknüpfte eigene Nummer standardmäßig erlaubt
- OpenClaw koppelt ausgehende
fromMe-DMs niemals automatisch (Nachrichten, die Sie vom verknüpften Gerät an sich selbst senden)
Group policy + allowlists
Gruppenzugriff hat zwei Ebenen:
-
Gruppenmitgliedschafts-Zulassungsliste (
channels.whatsapp.groups)- wenn
groupsfehlt, kommen alle Gruppen infrage - wenn
groupsvorhanden ist, fungiert es als Gruppen-Zulassungsliste ("*"erlaubt)
- wenn
-
Gruppen-Absenderregel (
channels.whatsapp.groupPolicy+groupAllowFrom)open: Absender-Zulassungsliste wird umgangenallowlist: Absender muss mitgroupAllowFrom(oder*) übereinstimmendisabled: alle eingehenden Gruppennachrichten blockieren
Fallback für Absender-Zulassungslisten:
- wenn
groupAllowFromnicht gesetzt ist, fällt die Laufzeit aufallowFromzurück, sofern verfügbar - Absender-Zulassungslisten werden vor Erwähnungs-/Antwortaktivierung ausgewertet
Hinweis: Wenn überhaupt kein channels.whatsapp-Block vorhanden ist, ist der Laufzeit-Fallback für Gruppenregeln allowlist (mit einer Warnmeldung im Log), selbst wenn channels.defaults.groupPolicy gesetzt ist.
Mentions + /activation
Gruppenantworten erfordern standardmäßig eine Erwähnung.
Die Erkennung von Erwähnungen umfasst:
- explizite WhatsApp-Erwähnungen der Bot-Identität
- konfigurierte Erwähnungs-Regex-Muster (
agents.list[].groupChat.mentionPatterns, Fallbackmessages.groupChat.mentionPatterns) - Transkripte eingehender Sprachnotizen für autorisierte Gruppennachrichten
- implizite Antwort-an-Bot-Erkennung (Antwortabsender entspricht der Bot-Identität)
Sicherheitshinweis:
- Zitat/Antwort erfüllt nur das Erwähnungs-Gating; es gewährt keine Absenderautorisierung
- mit
groupPolicy: "allowlist"werden Absender außerhalb der Zulassungsliste weiterhin blockiert, selbst wenn sie auf die Nachricht eines zugelassenen Benutzers antworten
Aktivierungsbefehl auf Sitzungsebene:
/activation mention/activation always
activation aktualisiert den Sitzungsstatus (nicht die globale Konfiguration). Dies ist eigentümergeschützt.
Konfigurierte ACP-Bindings
WhatsApp unterstützt persistente ACP-Bindings mit bindings[]-Einträgen auf oberster Ebene:
{ bindings: [ { type: "acp", agentId: "codex", match: { channel: "whatsapp", accountId: "work", peer: { kind: "direct", id: "+15555550123" }, }, }, { type: "acp", agentId: "codex", match: { channel: "whatsapp", accountId: "work", peer: { kind: "group", id: "120363424282127706@g.us" }, }, }, ],}- Direkte Chats stimmen mit E.164-Nummern wie
+15555550123überein. - Gruppen stimmen mit WhatsApp-Gruppen-JIDs wie
120363424282127706@g.usüberein. - Gruppen-Zulassungslisten, Absenderregel und Erwähnungs- oder Aktivierungs-Gating werden ausgeführt, bevor OpenClaw sicherstellt, dass die konfigurierte ACP-Sitzung existiert.
- Ein übereinstimmendes konfiguriertes ACP-Binding besitzt die Route. WhatsApp-Broadcast-Gruppen verteilen diesen Durchlauf nicht an gewöhnliche WhatsApp-Sitzungen.
Verhalten für persönliche Nummern und Selbst-Chats
Wenn die verknüpfte eigene Nummer auch in allowFrom vorhanden ist, werden WhatsApp-Schutzmaßnahmen für Selbst-Chats aktiviert:
- Lesebestätigungen für Selbst-Chat-Durchläufe überspringen
- Auto-Trigger-Verhalten per Erwähnungs-JID ignorieren, das Sie andernfalls selbst anpingen würde
- wenn
messages.responsePrefixnicht gesetzt ist, verwenden Selbst-Chat-Antworten standardmäßig[{identity.name}]oder[openclaw]
Nachrichtennormalisierung und Kontext
Inbound envelope + reply context
Eingehende WhatsApp-Nachrichten werden in den gemeinsamen Eingangsenvelope eingeschlossen.
Wenn eine zitierte Antwort vorhanden ist, wird Kontext in dieser Form angehängt:
[Replying to <sender> id:<stanzaId>]<quoted body or media placeholder>[/Replying]Antwort-Metadatenfelder werden ebenfalls befüllt, sofern verfügbar (ReplyToId, ReplyToBody, ReplyToSender, Absender-JID/E.164).
Wenn das zitierte Antwortziel herunterladbare Medien sind, speichert OpenClaw diese über
den normalen Eingang-Medienspeicher und stellt sie als MediaPath/MediaType bereit, damit
der Agent das referenzierte Bild prüfen kann, statt nur
<media:image> zu sehen.
Media placeholders and location/contact extraction
Eingehende Nachrichten, die nur Medien enthalten, werden mit Platzhaltern normalisiert, etwa:
<media:image><media:video><media:audio><media:document><media:sticker>
Autorisierte Gruppen-Sprachnotizen werden vor dem Erwähnungs-Gating transkribiert, wenn der
Textkörper nur <media:audio> ist. Dadurch kann das Aussprechen der Bot-Erwähnung in der Sprachnotiz
die Antwort auslösen. Wenn das Transkript den Bot weiterhin nicht erwähnt, wird das
Transkript statt des rohen Platzhalters in der ausstehenden Gruppenhistorie behalten.
Standorttexte verwenden knappen Koordinatentext. Standortlabels/-kommentare und Kontakt-/vCard-Details werden als eingezäunte nicht vertrauenswürdige Metadaten gerendert, nicht als Inline-Prompttext.
Pending group history injection
Für Gruppen können unverarbeitete Nachrichten gepuffert und als Kontext injiziert werden, wenn der Bot schließlich ausgelöst wird.
- Standardlimit:
50 - Konfiguration:
channels.whatsapp.historyLimit - Fallback:
messages.groupChat.historyLimit 0deaktiviert
Injektionsmarker:
[Chat messages since your last reply - for context][Current message - respond to this]
Read receipts
Lesebestätigungen sind standardmäßig für akzeptierte eingehende WhatsApp-Nachrichten aktiviert.
Global deaktivieren:
{ channels: { whatsapp: { sendReadReceipts: false, }, },}Überschreibung pro Konto:
{ channels: { whatsapp: { accounts: { work: { sendReadReceipts: false, }, }, }, },}Selbst-Chat-Durchläufe überspringen Lesebestätigungen auch dann, wenn sie global aktiviert sind.
Zustellung, Aufteilung und Medien
Text chunking
- Standardlimit für Textblöcke:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.chunkMode = "length" | "newline"- Der Modus
newlinebevorzugt Absatzgrenzen (Leerzeilen) und fällt dann auf längensichere Aufteilung zurück
Outbound media behavior
- unterstützt Bild-, Video-, Audio- (PTT-Sprachnotiz) und Dokument-Payloads
- Audiomedien werden über den Baileys-
audio-Payload mitptt: truegesendet, sodass WhatsApp-Clients sie als Push-to-Talk-Sprachnotiz rendern - Antwort-Payloads behalten
audioAsVoicebei; TTS-Sprachnotiz-Ausgaben für WhatsApp bleiben auf diesem PTT-Pfad, selbst wenn der Provider MP3 oder WebM zurückgibt - natives Ogg/Opus-Audio wird als
audio/ogg; codecs=opusgesendet, um Sprachnotiz-Kompatibilität zu gewährleisten - Nicht-Ogg-Audio, einschließlich Microsoft Edge TTS-MP3-/WebM-Ausgaben, wird vor der PTT-Zustellung mit
ffmpegzu 48-kHz-Mono-Ogg/Opus transkodiert /tts latestsendet die neueste Assistentenantwort als eine Sprachnotiz und unterdrückt wiederholte Sendungen für dieselbe Antwort;/tts chat on|off|defaultsteuert Auto-TTS für den aktuellen WhatsApp-Chat- animierte GIF-Wiedergabe wird über
gifPlayback: truebei Video-Sendungen unterstützt forceDocument/asDocumentsendet ausgehende Bilder, GIFs und Videos über den Baileys-Dokument-Payload, um WhatsApp-Medienkomprimierung zu vermeiden und gleichzeitig den aufgelösten Dateinamen und MIME-Typ beizubehalten- Beschriftungen werden beim Senden von Antwort-Payloads mit mehreren Medien auf das erste Medienelement angewendet, außer bei PTT-Sprachnotizen: Diese senden zuerst das Audio und sichtbaren Text separat, weil WhatsApp-Clients Sprachnotiz-Beschriftungen nicht konsistent rendern
- Medienquellen können HTTP(S),
file://oder lokale Pfade sein
Media size limits and fallback behavior
- Speicherobergrenze für eingehende Medien:
channels.whatsapp.mediaMaxMb(Standard50) - Sendeobergrenze für ausgehende Medien:
channels.whatsapp.mediaMaxMb(Standard50) - Überschreibungen pro Konto verwenden
channels.whatsapp.accounts.<accountId>.mediaMaxMb - Bilder werden automatisch optimiert (Größe/Qualitätssuche), um Limits einzuhalten, außer
forceDocument/asDocumentfordert Dokumentzustellung an - bei einem Fehler beim Senden von Medien sendet der Fallback für das erste Element eine Textwarnung, statt die Antwort stillschweigend zu verwerfen
Antwortzitate
WhatsApp unterstützt natives Zitieren von Antworten, bei dem ausgehende Antworten die eingehende Nachricht sichtbar zitieren. Steuern Sie dies mit channels.whatsapp.replyToMode.
| Wert | Verhalten |
|---|---|
"off" |
Nie zitieren; als einfache Nachricht senden |
"first" |
Nur den ersten ausgehenden Antwortblock zitieren |
"all" |
Jeden ausgehenden Antwortblock zitieren |
"batched" |
In der Warteschlange gebündelte Antworten zitieren, unmittelbare Antworten jedoch nicht zitieren |
Standard ist "off". Überschreibungen pro Konto verwenden channels.whatsapp.accounts.<id>.replyToMode.
{ channels: { whatsapp: { replyToMode: "first", }, },}Reaktionsstufe
channels.whatsapp.reactionLevel steuert, wie breit der Agent Emoji-Reaktionen auf WhatsApp verwendet:
| Stufe | Ack-Reaktionen | Vom Agent initiierte Reaktionen | Beschreibung |
|---|---|---|---|
"off" |
Nein | Nein | Überhaupt keine Reaktionen |
"ack" |
Ja | Nein | Nur Ack-Reaktionen (Empfang vor der Antwort) |
"minimal" |
Ja | Ja (konservativ) | Ack + Agent-Reaktionen mit konservativer Anleitung |
"extensive" |
Ja | Ja (empfohlen) | Ack + Agent-Reaktionen mit empfohlener Anleitung |
Standard: "minimal".
Überschreibungen pro Konto verwenden channels.whatsapp.accounts.<id>.reactionLevel.
{ channels: { whatsapp: { reactionLevel: "ack", }, },}Bestätigungsreaktionen
WhatsApp unterstützt unmittelbare Ack-Reaktionen beim eingehenden Empfang über channels.whatsapp.ackReaction.
Ack-Reaktionen werden durch reactionLevel gesteuert — sie werden unterdrückt, wenn reactionLevel "off" ist.
{ channels: { whatsapp: { ackReaction: { emoji: "👀", direct: true, group: "mentions", // always | mentions | never }, }, },}Verhaltenshinweise:
- wird sofort gesendet, nachdem eingehend akzeptiert wurde (vor der Antwort)
- wenn
ackReactionohneemojivorhanden ist, verwendet WhatsApp das Identitäts-Emoji des gerouteten Agenten, mit Fallback auf "👀"; lassen SieackReactionweg oder setzen Sieemoji: "", um keine Bestätigungsreaktion zu senden - Fehler werden protokolliert, blockieren aber nicht die normale Antwortzustellung
- Gruppenmodus
mentionsreagiert bei durch Erwähnungen ausgelösten Turns; Gruppenaktivierungalwaysdient als Umgehung für diese Prüfung - WhatsApp verwendet
channels.whatsapp.ackReaction(das älteremessages.ackReactionwird hier nicht verwendet)
Lifecycle-Statusreaktionen
Setzen Sie messages.statusReactions.enabled: true, damit WhatsApp während eines Turns die Bestätigungsreaktion ersetzt, anstatt ein statisches Empfangs-Emoji stehen zu lassen. Wenn aktiviert, verwendet OpenClaw denselben Reaktionsslot der eingehenden Nachricht für Lifecycle-Zustände wie in die Warteschlange gestellt, denkend, Tool-Aktivität, Compaction, erledigt und Fehler.
{ messages: { statusReactions: { enabled: true, emojis: { deploy: "🛫", build: "🏗️", concierge: "💁", }, }, },}Verhaltenshinweise:
channels.whatsapp.ackReactionsteuert weiterhin, ob Statusreaktionen für Direktnachrichten und Gruppen zulässig sind.- Die Statusreaktion für die Warteschlange verwendet dasselbe effektive Bestätigungs-Emoji wie einfache Bestätigungsreaktionen.
- WhatsApp hat einen Bot-Reaktionsslot pro Nachricht, daher ersetzen Lifecycle-Aktualisierungen die aktuelle Reaktion direkt.
messages.removeAckAfterReply: trueentfernt die finale Statusreaktion nach der konfigurierten Haltezeit für erledigt/Fehler.- Tool-Emoji-Kategorien umfassen
tool,coding,web,deploy,buildundconcierge.
Mehrere Konten und Zugangsdaten
Kontoauswahl und Standardwerte
- Konto-IDs stammen aus
channels.whatsapp.accounts - Standard-Kontoauswahl:
default, falls vorhanden, andernfalls die erste konfigurierte Konto-ID (sortiert) - Konto-IDs werden intern für die Suche normalisiert
Zugangsdatenpfade und Legacy-Kompatibilität
- aktueller Authentifizierungspfad:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - Sicherungsdatei:
creds.json.bak - ältere Standardauthentifizierung in
~/.openclaw/credentials/wird für Standardkonto-Flows weiterhin erkannt/migriert
Abmeldeverhalten
openclaw channels logout --channel whatsapp [--account <id>] löscht den WhatsApp-Authentifizierungszustand für dieses Konto.
Wenn ein Gateway erreichbar ist, stoppt die Abmeldung zuerst den aktiven WhatsApp-Listener für das ausgewählte Konto, damit die verknüpfte Sitzung bis zum nächsten Neustart keine Nachrichten weiter empfängt. openclaw channels remove --channel whatsapp stoppt ebenfalls den aktiven Listener, bevor die Kontokonfiguration deaktiviert oder gelöscht wird.
In Legacy-Authentifizierungsverzeichnissen bleibt oauth.json erhalten, während Baileys-Authentifizierungsdateien entfernt werden.
Tools, Aktionen und Konfigurationsschreibvorgänge
- Agent-Tool-Unterstützung umfasst die WhatsApp-Reaktionsaktion (
react). - Aktions-Gates:
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- Vom Kanal initiierte Konfigurationsschreibvorgänge sind standardmäßig aktiviert (deaktivieren über
channels.whatsapp.configWrites=false).
Fehlerbehebung
Nicht verknüpft (QR erforderlich)
Symptom: Kanalstatus meldet nicht verknüpft.
Behebung:
openclaw channels login --channel whatsappopenclaw channels statusVerknüpft, aber getrennt / Wiederverbindungsschleife
Symptom: verknüpftes Konto mit wiederholten Trennungen oder Wiederverbindungsversuchen.
Inaktive Konten können über das normale Nachrichten-Timeout hinaus verbunden bleiben; der Watchdog startet neu, wenn die WhatsApp-Web-Transportaktivität stoppt, der Socket geschlossen wird oder Aktivität auf Anwendungsebene länger als das längere Sicherheitsfenster still bleibt.
Wenn die Logs wiederholt status=408 Request Time-out Connection was lost zeigen, passen Sie
die Baileys-Socket-Zeitvorgaben unter web.whatsapp an. Beginnen Sie damit,
keepAliveIntervalMs unter das Leerlauf-Timeout Ihres Netzwerks zu verkürzen und
connectTimeoutMs bei langsamen oder verlustbehafteten Verbindungen zu erhöhen:
{ web: { whatsapp: { keepAliveIntervalMs: 15000, connectTimeoutMs: 60000, defaultQueryTimeoutMs: 60000, }, },}Behebung:
openclaw channels status --probeopenclaw doctoropenclaw logs --followopenclaw gateway statusWenn die Schleife nach Korrektur der Host-Konnektivität und Zeitvorgaben weiterhin besteht, sichern Sie das Authentifizierungsverzeichnis des Kontos und verknüpfen Sie dieses Konto erneut:
cp -a ~/.openclaw/credentials/whatsapp/<accountId> \ ~/.openclaw/credentials/whatsapp/<accountId>.bakopenclaw channels logout --channel whatsapp --account <accountId>openclaw channels login --channel whatsapp --account <accountId>Wenn ~/.openclaw/logs/whatsapp-health.log Gateway inactive meldet, aber
openclaw gateway status und openclaw channels status --probe zeigen, dass
Gateway und WhatsApp fehlerfrei sind, führen Sie openclaw doctor aus. Unter Linux warnt doctor
vor älteren crontab-Einträgen, die noch
~/.openclaw/bin/ensure-whatsapp.sh aufrufen; entfernen Sie diese veralteten Einträge mit
crontab -e, weil Cron die systemd-User-Bus-Umgebung fehlen kann und
dieses alte Skript den Gateway-Zustand falsch melden kann.
Falls nötig, verknüpfen Sie mit channels login erneut.
QR-Login läuft hinter einem Proxy ab
Symptom: openclaw channels login --channel whatsapp schlägt fehl, bevor ein nutzbarer QR-Code angezeigt wird, mit status=408 Request Time-out oder einer getrennten TLS-Socket-Verbindung.
WhatsApp-Web-Login verwendet die Standard-Proxy-Umgebung des Gateway-Hosts (HTTPS_PROXY, HTTP_PROXY, Varianten in Kleinbuchstaben und NO_PROXY). Prüfen Sie, ob der Gateway-Prozess die Proxy-Umgebung erbt und dass NO_PROXY nicht auf mmg.whatsapp.net passt.
Kein aktiver Listener beim Senden
Ausgehende Sendungen schlagen schnell fehl, wenn für das Zielkonto kein aktiver Gateway-Listener vorhanden ist.
Stellen Sie sicher, dass Gateway läuft und das Konto verknüpft ist.
Antwort erscheint im Transkript, aber nicht in WhatsApp
Transkriptzeilen erfassen, was der Agent erzeugt hat. Die WhatsApp-Zustellung wird separat geprüft: OpenClaw betrachtet eine automatische Antwort erst dann als gesendet, nachdem Baileys für mindestens einen sichtbaren Text- oder Medienversand eine ausgehende Nachrichten-ID zurückgegeben hat.
Bestätigungsreaktionen sind unabhängige Empfangsbestätigungen vor der Antwort. Eine erfolgreiche Reaktion beweist nicht, dass die spätere Text- oder Medienantwort von WhatsApp akzeptiert wurde.
Prüfen Sie die Gateway-Logs auf auto-reply delivery failed oder auto-reply was not accepted by WhatsApp provider.
Gruppennachrichten werden unerwartet ignoriert
Prüfen Sie in dieser Reihenfolge:
groupPolicygroupAllowFrom/allowFromgroups-Allowlist-Einträge- Erwähnungs-Gating (
requireMention+ Erwähnungsmuster) - doppelte Schlüssel in
openclaw.json(JSON5): spätere Einträge überschreiben frühere, halten Sie daher pro Scope nur ein einzigesgroupPolicy
Wenn channels.whatsapp.groups vorhanden ist, kann WhatsApp weiterhin Nachrichten aus anderen Gruppen beobachten, aber OpenClaw verwirft sie vor dem Sitzungsrouting. Fügen Sie die Gruppen-JID zu channels.whatsapp.groups hinzu oder fügen Sie groups["*"] hinzu, um alle Gruppen zuzulassen, während die Senderautorisierung unter groupPolicy und groupAllowFrom bleibt.
Bun-Runtime-Warnung
Die WhatsApp-Gateway-Runtime sollte Node verwenden. Bun wird als inkompatibel für den stabilen WhatsApp/Telegram-Gateway-Betrieb markiert.
System-Prompts
WhatsApp unterstützt Telegram-artige System-Prompts für Gruppen und Direktchats über die Maps groups und direct.
Auflösungshierarchie für Gruppennachrichten:
Die effektive groups-Map wird zuerst bestimmt: Wenn das Konto eigene groups definiert, ersetzt sie die Root-groups-Map vollständig (kein Deep Merge). Die Prompt-Suche läuft dann auf der resultierenden einzelnen Map:
- Gruppenspezifischer System-Prompt (
groups["<groupId>"].systemPrompt): wird verwendet, wenn der spezifische Gruppeneintrag in der Map vorhanden ist und sein SchlüsselsystemPromptdefiniert ist. WennsystemPromptein leerer String ("") ist, wird der Wildcard unterdrückt und kein System-Prompt angewendet. - Gruppen-Wildcard-System-Prompt (
groups["*"].systemPrompt): wird verwendet, wenn der spezifische Gruppeneintrag in der Map vollständig fehlt oder wenn er vorhanden ist, aber keinen SchlüsselsystemPromptdefiniert.
Auflösungshierarchie für Direktnachrichten:
Die effektive direct-Map wird zuerst bestimmt: Wenn das Konto eigene direct definiert, ersetzt sie die Root-direct-Map vollständig (kein Deep Merge). Die Prompt-Suche läuft dann auf der resultierenden einzelnen Map:
- Direktspezifischer System-Prompt (
direct["<peerId>"].systemPrompt): wird verwendet, wenn der spezifische Peer-Eintrag in der Map vorhanden ist und sein SchlüsselsystemPromptdefiniert ist. WennsystemPromptein leerer String ("") ist, wird der Wildcard unterdrückt und kein System-Prompt angewendet. - Direkt-Wildcard-System-Prompt (
direct["*"].systemPrompt): wird verwendet, wenn der spezifische Peer-Eintrag in der Map vollständig fehlt oder wenn er vorhanden ist, aber keinen SchlüsselsystemPromptdefiniert.
Unterschied zum Telegram-Verhalten bei mehreren Konten: In Telegram wird Root-groups für alle Konten in einer Mehrkonten-Einrichtung absichtlich unterdrückt, auch für Konten, die keine eigenen groups definieren, um zu verhindern, dass ein Bot Gruppennachrichten für Gruppen empfängt, denen er nicht angehört. WhatsApp wendet diese Schutzmaßnahme nicht an: Root-groups und Root-direct werden immer von Konten geerbt, die keinen Override auf Kontoebene definieren, unabhängig davon, wie viele Konten konfiguriert sind. Wenn Sie in einer WhatsApp-Mehrkonten-Einrichtung gruppen- oder direktchatspezifische Prompts pro Konto möchten, definieren Sie die vollständige Map explizit unter jedem Konto, statt sich auf Root-Standardwerte zu verlassen.
Wichtiges Verhalten:
channels.whatsapp.groupsist sowohl eine Konfigurations-Map pro Gruppe als auch die Allowlist auf Chat-Ebene für Gruppen. Auf Root- oder Konto-Scope bedeutetgroups["*"]: „Alle Gruppen sind zugelassen“ für diesen Scope.- Fügen Sie einen Wildcard-Gruppen-
systemPromptnur hinzu, wenn dieser Scope bereits alle Gruppen zulassen soll. Wenn weiterhin nur eine feste Menge von Gruppen-IDs zulässig sein soll, verwenden Siegroups["*"]nicht als Prompt-Standard. Wiederholen Sie den Prompt stattdessen für jeden explizit in der Allowlist enthaltenen Gruppeneintrag. - Gruppenzulassung und Senderautorisierung sind getrennte Prüfungen.
groups["*"]erweitert die Menge der Gruppen, die die Gruppenverarbeitung erreichen können, autorisiert aber nicht von sich aus jeden Sender in diesen Gruppen. Senderzugriff wird weiterhin separat durchchannels.whatsapp.groupPolicyundchannels.whatsapp.groupAllowFromgesteuert. channels.whatsapp.directhat nicht denselben Nebeneffekt für DMs.direct["*"]stellt nur eine Standardkonfiguration für Direktchats bereit, nachdem ein DM bereits durchdmPolicyplusallowFromoder Pairing-Store-Regeln zugelassen wurde.
Beispiel:
{ channels: { whatsapp: { groups: { // Use only if all groups should be admitted at the root scope. // Applies to all accounts that do not define their own groups map. "*": { systemPrompt: "Default prompt for all groups." }, }, direct: { // Applies to all accounts that do not define their own direct map. "*": { systemPrompt: "Default prompt for all direct chats." }, }, accounts: { work: { groups: { // This account defines its own groups, so root groups are fully // replaced. To keep a wildcard, define "*" explicitly here too. "120363406415684625@g.us": { requireMention: false, systemPrompt: "Focus on project management.", }, // Use only if all groups should be admitted in this account. "*": { systemPrompt: "Default prompt for work groups." }, }, direct: { // This account defines its own direct map, so root direct entries are // fully replaced. To keep a wildcard, define "*" explicitly here too. "+15551234567": { systemPrompt: "Prompt for a specific work direct chat." }, "*": { systemPrompt: "Default prompt for work direct chats." }, }, }, }, }, },}Verweise zur Konfigurationsreferenz
Primäre Referenz:
Wichtige WhatsApp-Felder:
- Zugriff:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups - Zustellung:
textChunkLimit,chunkMode,mediaMaxMb,sendReadReceipts,ackReaction,reactionLevel - Multi-Account:
accounts.<id>.enabled,accounts.<id>.authDir, Überschreibungen auf Kontoebene - Betrieb:
configWrites,debounceMs,web.enabled,web.heartbeatSeconds,web.reconnect.*,web.whatsapp.* - Sitzungsverhalten:
session.dmScope,historyLimit,dmHistoryLimit,dms.<id>.historyLimit - Prompts:
groups.<id>.systemPrompt,groups["*"].systemPrompt,direct.<id>.systemPrompt,direct["*"].systemPrompt