Gruppennachrichten (WhatsApp-Web-Kanal)
Ziel: Clawd soll in WhatsApp-Gruppen mitlesen, nur bei einem Ping aktiv werden und diesen Thread von der persönlichen DM-Sitzung getrennt halten. Hinweis:agents.list[].groupChat.mentionPatterns wird inzwischen auch von Telegram/Discord/Slack/iMessage verwendet; dieses Dokument konzentriert sich auf WhatsApp-spezifisches Verhalten. Für Multi-Agent-Setups setzen Sie agents.list[].groupChat.mentionPatterns pro Agent (oder verwenden Sie messages.groupChat.mentionPatterns als globalen Fallback).
Was implementiert ist (2025-12-03)
- Aktivierungsmodi:
mention(Standard) oderalways.mentionerfordert einen Ping (echte WhatsApp-@-Erwähnungen übermentionedJids, Regex-Muster oder die E.164-Nummer des Bots irgendwo im Text).alwaysweckt den Agenten bei jeder Nachricht, aber er sollte nur antworten, wenn er einen sinnvollen Mehrwert liefern kann; andernfalls gibt er das stille TokenNO_REPLYzurück. Standardwerte können in der Konfiguration gesetzt werden (channels.whatsapp.groups) und pro Gruppe über/activationüberschrieben werden. Wennchannels.whatsapp.groupsgesetzt ist, fungiert es zusätzlich als Gruppen-Allowlist (fügen Sie"*"hinzu, um alle zuzulassen). - Gruppenrichtlinie:
channels.whatsapp.groupPolicysteuert, ob Gruppennachrichten akzeptiert werden (open|disabled|allowlist).allowlistverwendetchannels.whatsapp.groupAllowFrom(Fallback: expliziteschannels.whatsapp.allowFrom). Standard istallowlist(blockiert, bis Sie Absender hinzufügen). - Pro-Gruppen-Sitzungen: Sitzungsschlüssel sehen aus wie
agent:<agentId>:whatsapp:group:<jid>, sodass Befehle wie/verbose onoder/think high(als eigenständige Nachrichten gesendet) auf diese Gruppe beschränkt sind; der persönliche DM-Status bleibt unberührt. Heartbeats werden für Gruppenthreads übersprungen. - Kontext-Injektion: nur ausstehende Gruppennachrichten (Standard: 50), die keinen Lauf ausgelöst haben, werden unter
[Chat messages since your last reply - for context]vorangestellt, wobei die auslösende Zeile unter[Current message - respond to this]steht. Nachrichten, die bereits in der Sitzung sind, werden nicht erneut injiziert. - Absender-Kennzeichnung: Jeder Gruppenbatch endet jetzt mit
[from: Sender Name (+E164)], damit Pi weiß, wer spricht. - Ephemeral/View-once: Diese werden vor der Textextraktion/Erwähnungsanalyse entpackt, sodass Pings darin weiterhin auslösen.
- Gruppen-Systemprompt: Beim ersten Zug einer Gruppensitzung (und immer dann, wenn
/activationden Modus ändert) injizieren wir einen kurzen Hinweis in den Systemprompt wieYou are replying inside the WhatsApp group "<subject>". Group members: Alice (+44...), Bob (+43...), … Activation: trigger-only … Address the specific sender noted in the message context.. Wenn Metadaten nicht verfügbar sind, teilen wir dem Agenten dennoch mit, dass es sich um einen Gruppenchat handelt.
Konfigurationsbeispiel (WhatsApp)
Fügen Sie einengroupChat-Block zu ~/.openclaw/openclaw.json hinzu, damit Display-Name-Pings funktionieren, selbst wenn WhatsApp das visuelle @ im Textkörper entfernt:
- Die Regexe sind nicht groß-/kleinschreibungssensitiv; sie decken einen Display-Name-Ping wie
@openclawsowie die rohe Nummer mit oder ohne+/Leerzeichen ab. - WhatsApp sendet weiterhin kanonische Erwähnungen über
mentionedJids, wenn jemand auf den Kontakt tippt; daher ist der Nummern-Fallback selten nötig, aber ein nützliches Sicherheitsnetz.
Aktivierungsbefehl (nur Eigentümer)
Verwenden Sie den Gruppenchat-Befehl:/activation mention/activation always
channels.whatsapp.allowFrom oder die E.164-Nummer des Bots, wenn nicht gesetzt) kann dies ändern. Senden Sie /status als eigenständige Nachricht in die Gruppe, um den aktuellen Aktivierungsmodus anzuzeigen.
Verwendung
- Fügen Sie Ihr WhatsApp-Konto (das OpenClaw ausführt) der Gruppe hinzu.
- Sagen Sie
@openclaw …(oder fügen Sie die Nummer ein). Nur Absender auf der Allowlist können es auslösen, es sei denn, Sie setzengroupPolicy: "open". - Der Agenten-Prompt enthält den aktuellen Gruppenkontext sowie den abschließenden
[from: …]-Marker, damit er die richtige Person adressiert. - Sitzungsweite Direktiven (
/verbose on,/think high,/newoder/reset,/compact) gelten nur für die Sitzung dieser Gruppe; senden Sie sie als eigenständige Nachrichten, damit sie registriert werden. Ihre persönliche DM-Sitzung bleibt unabhängig.
Testen / Verifikation
- Manueller Smoke-Test:
- Senden Sie einen
@openclaw-Ping in der Gruppe und bestätigen Sie eine Antwort, die den Absendernamen referenziert. - Senden Sie einen zweiten Ping und prüfen Sie, dass der Verlaufsblock enthalten ist und im nächsten Zug wieder geleert wird.
- Senden Sie einen
- Prüfen Sie die Gateway-Logs (ausführen mit
--verbose), uminbound web message-Einträge zu sehen, diefrom: <groupJid>und das[from: …]-Suffix anzeigen.
Bekannte Hinweise
- Heartbeats werden für Gruppen bewusst übersprungen, um laute Broadcasts zu vermeiden.
- Die Echo-Unterdrückung verwendet den kombinierten Batch-String; wenn Sie identischen Text zweimal ohne Erwähnungen senden, erhält nur der erste eine Antwort.
- Sitzungsspeichereinträge erscheinen als
agent:<agentId>:whatsapp:group:<jid>im Sitzungsspeicher (~/.openclaw/agents/<agentId>/sessions/sessions.jsonstandardmäßig); ein fehlender Eintrag bedeutet lediglich, dass die Gruppe noch keinen Lauf ausgelöst hat. - Tippindikatoren in Gruppen folgen
agents.defaults.typingMode(Standard:messagebei fehlender Erwähnung).