Групповые сообщения (веб-канал WhatsApp)
Цель: позволить Clawd находиться в группах WhatsApp, просыпаться только при пинге и держать этот тред отдельным от личного сеанса личных сообщений. Примечание: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. Значения по умолчанию можно задать в конфигурации (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или/think high(отправленные как отдельные сообщения) ограничены рамками этой группы; состояние личных сообщений не затрагивается. Сигналы keepalive пропускаются для групповых тредов. - Инъекция контекста: только ожидающие групповые сообщения (по умолчанию 50), которые не запустили выполнение, добавляются префиксом под
[Chat messages since your last reply - for context], а строка-триггер — под[Current message - respond to this]. Сообщения, уже находящиеся в сеансе, повторно не инъецируются. - Отображение отправителя: каждый пакет группы теперь завершается
[from: Sender Name (+E164)], чтобы Pi понимал, кто говорит. - Эфемерные/«просмотреть один раз»: мы разворачиваем их перед извлечением текста/упоминаний, поэтому пинги внутри них всё равно срабатывают.
- Системный промпт группы: при первом ходе группового сеанса (и всякий раз, когда
/activationменяет режим) мы вставляем короткий текст в системный промпт вроде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 удаляет визуальное @ из тела текста:
- Регулярные выражения регистронезависимы; они покрывают пинг по отображаемому имени вроде
@openclawи «сырое» число с+/пробелами или без них. - WhatsApp по-прежнему отправляет канонические упоминания через
mentionedJids, когда кто-то нажимает на контакт, поэтому запасной вариант с номером редко нужен, но является полезной страховкой.
Команда активации (только для владельца)
Используйте команду в групповом чате:/activation mention/activation always
channels.whatsapp.allowFrom или собственный E.164 бота, если не задано). Отправьте /status отдельным сообщением в группе, чтобы увидеть текущий режим активации.
Как использовать
- Добавьте свой аккаунт WhatsApp (тот, на котором запущен OpenClaw) в группу.
- Скажите
@openclaw …(или укажите номер). Триггерить могут только отправители из списка разрешённых, если вы не установилиgroupPolicy: "open". - Промпт агента будет включать недавний групповой контекст плюс завершающий маркер
[from: …], чтобы обратиться к нужному человеку. - Директивы уровня сеанса (
/verbose on,/think high,/newили/reset,/compact) применяются только к сеансу этой группы; отправляйте их отдельными сообщениями, чтобы они зарегистрировались. Ваш личный сеанс личных сообщений остаётся независимым.
Тестирование / проверка
- Ручной smoke-тест:
- Отправьте пинг
@openclawв группе и подтвердите ответ, в котором упоминается имя отправителя. - Отправьте второй пинг и проверьте, что блок истории включён, а затем очищается на следующем ходе.
- Отправьте пинг
- Проверьте логи шлюза Gateway (запуск с
--verbose), чтобы увидеть записиinbound web message, показывающиеfrom: <groupJid>и суффикс[from: …].
Известные особенности
- Сигналы keepalive намеренно пропускаются для групп, чтобы избежать шумных рассылок.
- Подавление эха использует объединённую строку пакета; если отправить идентичный текст дважды без упоминаний, ответ будет только на первый.
- Записи хранилища сеансов будут выглядеть как
agent:<agentId>:whatsapp:group:<jid>в хранилище сеансов (~/.openclaw/agents/<agentId>/sessions/sessions.jsonпо умолчанию); отсутствие записи означает лишь, что группа ещё не запускала выполнение. - Индикаторы набора текста в группах следуют
agents.defaults.typingMode(по умолчанию:messageпри отсутствии упоминаний).