Gruppennachrichten (WhatsApp-Webkanal)
Ziel: Lass Clawd in WhatsApp-Gruppen sitzen, nur bei Erwähnung aufwachen und diesen Thread getrennt von der persönlichen DM-Session halten.
Hinweis: agents.list[].groupChat.mentionPatterns wird inzwischen auch von Telegram/Discord/Slack/iMessage verwendet; diese Dokumentation konzentriert sich auf WhatsApp-spezifisches Verhalten. Für Multi-Agent-Setups setze agents.list[].groupChat.mentionPatterns pro Agent (oder verwende messages.groupChat.mentionPatterns als globalen Fallback).
Was implementiert ist (2025-12-03)
- Aktivierungsmodi:
mention(Standard) oderalways.mentionerfordert eine Erwähnung (echte WhatsApp-@-Mentions viamentionedJids, Regex-Muster oder die E.164-Nummer des Bots im Text).alwaysweckt den Agent bei jeder Nachricht, aber er soll nur antworten, wenn er sinnvoll beitragen kann; andernfalls gibt er das stille TokenNO_REPLYzurück. Standards können in der Konfiguration festgelegt werden (channels.whatsapp.groups) und pro Gruppe via/activationüberschrieben werden. Wennchannels.whatsapp.groupsgesetzt ist, dient es auch als Gruppen-Allowlist (füge"*"hinzu, um alle zu erlauben). - Gruppenrichtlinie:
channels.whatsapp.groupPolicysteuert, ob Gruppennachrichten akzeptiert werden (open|disabled|allowlist).allowlistverwendetchannels.whatsapp.groupAllowFrom(Fallback: expliziteschannels.whatsapp.allowFrom). Standard istallowlist(blockiert, bis du Absender hinzufügst). - Pro-Gruppen-Sessions: Session-Schlüssel sehen so aus:
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-Zustand bleibt unberührt. Heartbeats werden für Gruppen-Threads übersprungen. - Kontextinjektion: 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 Session sind, werden nicht erneut injiziert. - Absenderanzeige: Jeder Gruppenbatch endet mit
[from: Absendername (+E164)], damit der Bot weiß, wer spricht. - Ephemeral/Einmalansicht: Diese werden vor der Text-/Mention-Extraktion entpackt, sodass Pings darin weiterhin auslösen.
- Gruppen-Systemprompt: Beim ersten Turn einer Gruppen-Session (und wenn sich der Modus via
/activationändert) wird ein kurzer Hinweis in den Systemprompt injiziert, z. B.You 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.Falls Metadaten nicht verfügbar sind, wird dem Agent trotzdem mitgeteilt, dass es sich um einen Gruppenchat handelt.
Konfigurationsbeispiel (WhatsApp)
Füge einen groupChat-Block zu ~/.openclaw/openclaw.json hinzu, damit Anzeigenamen-Pings auch funktionieren, wenn WhatsApp das visuelle @ im Textkörper entfernt:
{
channels: {
whatsapp: {
groups: {
"*": { requireMention: true },
},
},
},
agents: {
list: [
{
id: "main",
groupChat: {
historyLimit: 50,
mentionPatterns: ["@?openclaw", "\\+?15555550123"],
},
},
],
},
}
Hinweise:
- Die Regexe sind case-insensitive; sie decken einen Anzeigenamen-Ping wie
@openclawund die Rohzahl mit oder ohne+/Leerzeichen ab. - WhatsApp sendet weiterhin kanonische Mentions via
mentionedJids, wenn jemand auf den Kontakt tippt, sodass der Nummern-Fallback selten benötigt wird, aber ein nützliches Sicherheitsnetz darstellt.
Aktivierungsbefehl (nur Besitzer)
Verwende den Gruppenchat-Befehl:
/activation mention/activation always
Nur die Besitzernummer (aus channels.whatsapp.allowFrom, oder die eigene E.164 des Bots wenn nicht gesetzt) kann dies ändern. Sende /status als eigenständige Nachricht in der Gruppe, um den aktuellen Aktivierungsmodus zu sehen.
Verwendung
- Füge dein WhatsApp-Konto (das, auf dem OpenClaw läuft) der Gruppe hinzu.
- Schreibe
@openclaw …(oder füge die Nummer ein). Nur Absender auf der Allowlist können den Bot auslösen, es sei denn, du setztgroupPolicy: "open". - Der Agent-Prompt enthält den aktuellen Gruppenkontext plus den abschließenden
[from: …]-Marker, damit er die richtige Person ansprechen kann. - Session-spezifische Anweisungen (
/verbose on,/think high,/newoder/reset,/compact) gelten nur für die Session dieser Gruppe; sende sie als eigenständige Nachrichten, damit sie registriert werden. Deine persönliche DM-Session bleibt unabhängig.
Testen / Verifizierung
- Manueller Schnelltest:
- Sende einen
@openclaw-Ping in der Gruppe und bestätige, dass eine Antwort kommt, die den Absendernamen referenziert. - Sende einen zweiten Ping und überprüfe, dass der Verlaufsblock eingebunden und beim nächsten Turn gelöscht wird.
- Sende einen
- Prüfe die Gateway-Logs (mit
--verbosestarten), uminbound web message-Einträge zu sehen, diefrom: <groupJid>und das[from: …]-Suffix zeigen.
Bekannte Besonderheiten
- Heartbeats werden für Gruppen absichtlich übersprungen, um störende Broadcasts zu vermeiden.
- Echo-Unterdrückung verwendet den kombinierten Batch-String; wenn du identischen Text zweimal ohne Mentions sendest, erhält nur der erste eine Antwort.
- Session-Store-Einträge erscheinen als
agent:<agentId>:whatsapp:group:<jid>im Session-Store (standardmäßig~/.openclaw/agents/<agentId>/sessions/sessions.json); ein fehlender Eintrag bedeutet nur, dass die Gruppe noch keinen Lauf ausgelöst hat. - Tippindikatoren in Gruppen folgen
agents.defaults.typingMode(Standard:messagebei fehlender Erwähnung).