Групповые сообщения
Цель: позволить 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(отправленные как отдельные сообщения), ограничены этой группой; состояние личных сообщений не затрагивается. Пульсации пропускаются для групповых потоков. - Внедрение контекста: только ожидающие групповые сообщения (по умолчанию 50), которые не запустили выполнение, добавляются в префикс под
[Сообщения чата с вашего последнего ответа - для контекста], а строка, вызвавшая запуск, - под[Текущее сообщение - ответьте на него]. Сообщения, уже находящиеся в сессии, не внедряются повторно. - Указание отправителя: каждая групповая пачка теперь заканчивается
[от: Имя отправителя (+E164)], чтобы Pi знал, кто говорит. - Исчезающие/просмотр-один-раз: мы разворачиваем их перед извлечением текста/упоминаний, поэтому пинги внутри них всё ещё срабатывают.
- Системный промпт группы: на первом шаге групповой сессии (и при каждом изменении режима через
/activation) мы внедряем краткую заметку в системный промпт, например:Вы отвечаете внутри группы WhatsApp "<subject>". Участники группы: Алиса (+44...), Боб (+43...), … Активация: только по триггеру … Обращайтесь к конкретному отправителю, указанному в контексте сообщения.Если метаданные недоступны, мы всё равно сообщаем агенту, что это групповой чат.
Пример конфигурации (WhatsApp)
Добавьте блок groupChat в ~/.openclaw/openclaw.json, чтобы пинги по отображаемому имени работали, даже когда WhatsApp удаляет визуальный @ в теле текста:
{
channels: {
whatsapp: {
groups: {
"*": { requireMention: true },
},
},
},
agents: {
list: [
{
id: "main",
groupChat: {
historyLimit: 50,
mentionPatterns: ["@?openclaw", "\\+?15555550123"],
},
},
],
},
}
Примечания:
- Регулярные выражения нечувствительны к регистру; они покрывают пинг по отображаемому имени, например
@openclaw, и сырой номер с+/пробелами или без них. - WhatsApp всё равно отправляет канонические упоминания через
mentionedJids, когда кто-то нажимает на контакт, поэтому запасной вариант с номером редко нужен, но является полезной страховкой.
Команда активации (только для владельца)
Используйте команду в групповом чате:
/activation mention/activation always
Только номер владельца (из channels.whatsapp.allowFrom или собственный E.164 бота, если не задан) может это изменить. Отправьте /status как отдельное сообщение в группе, чтобы увидеть текущий режим активации.
Как использовать
- Добавьте свой аккаунт WhatsApp (тот, на котором работает OpenClaw) в группу.
- Напишите
@openclaw …(или укажите номер). Только отправители из разрешительного списка могут его активировать, если вы не задалиgroupPolicy: "open". - Промпт агента будет включать недавний контекст группы и завершающий маркер
[от: …], чтобы он мог обратиться к нужному человеку. - Директивы уровня сессии (
/verbose on,/think high,/newили/reset,/compact) применяются только к сессии этой группы; отправляйте их как отдельные сообщения, чтобы они зарегистрировались. Ваша сессия личных сообщений остаётся независимой.
Тестирование / проверка
- Ручная проверка:
- Отправьте пинг
@openclawв группе и подтвердите ответ, который ссылается на имя отправителя. - Отправьте второй пинг и убедитесь, что блок истории включён, а затем очищен на следующем шаге.
- Отправьте пинг
- Проверьте логи шлюза (запустите с
--verbose), чтобы увидеть записиinbound web message, показывающиеfrom: <groupJid>и суффикс[от: …].
Известные особенности
- Пульсации намеренно пропускаются для групп, чтобы избежать шумных рассылок.
- Подавление эха использует объединённую строку пачки; если вы отправите идентичный текст дважды без упоминаний, ответ будет только на первый.
- Записи в хранилище сессий будут отображаться как
agent:<agentId>:whatsapp:group:<jid>в хранилище сессий (по умолчанию~/.openclaw/agents/<agentId>/sessions/sessions.json); отсутствующая запись означает лишь то, что группа ещё не запускала выполнение. - Индикаторы набора текста в группах следуют
agents.defaults.typingMode(по умолчанию:message, когда не упомянут).