Групові повідомлення (веб-канал WhatsApp)
Мета: дозволити Clawd бути присутнім у групах WhatsApp, прокидатися лише коли його пінгують, і тримати цей потік окремо від особистої сесії в DM. Примітка:agents.list[].groupChat.mentionPatterns тепер також використовується для Telegram/Discord/Slack/iMessage; цей документ зосереджений на поведінці, специфічній для WhatsApp. Для конфігурацій із кількома агентами задавайте agents.list[].groupChat.mentionPatterns для кожного агента окремо (або використовуйте messages.groupChat.mentionPatterns як глобальний запасний варіант).
Поточна реалізація (2025-12-03)
- Режими активації:
mention(типово) абоalways.mentionвимагає пінг (справжні @-згадки WhatsApp черезmentionedJids, безпечні regex-шаблони або E.164 номер бота будь-де в тексті).alwaysпробуджує агента на кожне повідомлення, але він має відповідати лише тоді, коли може додати змістовну цінність; інакше він повертає точний тихий токенNO_REPLY/no_reply. Типові значення можна задати в конфігурації (channels.whatsapp.groups) і перевизначити для кожної групи через/activation. Коли заданоchannels.whatsapp.groups, це також працює як список дозволених груп (додайте"*"для дозволу всіх). - Політика груп:
channels.whatsapp.groupPolicyкерує тим, чи приймаються групові повідомлення (open|disabled|allowlist).allowlistвикористовуєchannels.whatsapp.groupAllowFrom(запасний варіант: явнийchannels.whatsapp.allowFrom). Типове значення —allowlist(блокується, доки ви не додасте відправників). - Сесії для кожної групи: ключі сесій мають вигляд
agent:<agentId>:whatsapp:group:<jid>, тому такі команди, як/verbose on,/trace onабо/think high(надіслані як окремі повідомлення), обмежуються цією групою; стан особистих DM не змінюється. Heartbeat для групових потоків пропускаються. - Додавання контексту: групові повідомлення лише в очікуванні (типово 50), які не запустили виконання, додаються на початку під
[Chat messages since your last reply - for context], а рядок, що спрацював як тригер, — під[Current message - respond to this]. Повідомлення, які вже є в сесії, не додаються повторно. - Відображення відправника: кожен пакет групових повідомлень тепер завершується рядком
[from: Sender Name (+E164)], щоб Pi знав, хто говорить. - Ephemeral/view-once: ми розгортаємо їх перед витягуванням тексту/згадок, тому пінги всередині них також спрацьовують.
- Системний prompt групи: на першому ході групової сесії (і щоразу, коли
/activationзмінює режим) ми додаємо короткий фрагмент у системний prompt, наприклад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.Якщо метадані недоступні, ми все одно повідомляємо агенту, що це груповий чат.
Приклад конфігурації (WhatsApp)
Додайте блокgroupChat до ~/.openclaw/openclaw.json, щоб згадки за відображуваним іменем працювали навіть тоді, коли WhatsApp прибирає візуальний @ з тексту повідомлення:
- Ці regex є нечутливими до регістру та використовують ті самі захисні обмеження safe-regex, що й інші поверхні конфігурації regex; недійсні шаблони та небезпечні вкладені повторення ігноруються.
- WhatsApp усе ще надсилає канонічні згадки через
mentionedJids, коли хтось торкається контакту, тож запасний варіант із номером рідко потрібен, але є корисною страховкою.
Команда активації (лише для власника)
Використовуйте команду групового чату:/activation mention/activation always
channels.whatsapp.allowFrom, або власний E.164 бота, якщо не задано) може це змінити. Надішліть /status як окреме повідомлення в групу, щоб побачити поточний режим активації.
Як використовувати
- Додайте свій обліковий запис WhatsApp (той, на якому працює OpenClaw) до групи.
- Скажіть
@openclaw …(або вкажіть номер). Лише відправники зі списку дозволених можуть його запускати, якщо тільки ви не встановитеgroupPolicy: "open". - Prompt агента міститиме нещодавній груповий контекст плюс кінцевий маркер
[from: …], щоб він міг звернутися до правильної людини. - Директиви рівня сесії (
/verbose on,/trace on,/think high,/newабо/reset,/compact) застосовуються лише до сесії цієї групи; надсилайте їх як окремі повідомлення, щоб вони зареєструвалися. Ваша особиста DM-сесія залишається незалежною.
Тестування / перевірка
- Ручний smoke-тест:
- Надішліть пінг
@openclawу групі та підтвердьте відповідь, яка посилається на ім’я відправника. - Надішліть другий пінг і перевірте, що блок історії включається, а потім очищується на наступному ході.
- Надішліть пінг
- Перевірте журнали gateway (запустіть із
--verbose), щоб побачити записиinbound web message, які показуютьfrom: <groupJid>і суфікс[from: …].
Відомі особливості
- Heartbeat навмисно пропускаються для груп, щоб уникнути шумних широкомовних повідомлень.
- Придушення ехо використовує об’єднаний рядок пакета; якщо ви двічі надішлете однаковий текст без згадок, відповідь буде лише на перший раз.
- Записи в сховищі сесій відображатимуться як
agent:<agentId>:whatsapp:group:<jid>у сховищі сесій (~/.openclaw/agents/<agentId>/sessions/sessions.jsonтипово); відсутній запис лише означає, що група ще не запускала виконання. - Індикатори набору тексту в групах дотримуються
agents.defaults.typingMode(типово:message, коли немає згадки).