Перейти к основному содержанию

Групповые сообщения (веб-канал 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 удаляет визуальное @ из тела текста:
{
  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 отдельным сообщением в группе, чтобы увидеть текущий режим активации.

Как использовать

  1. Добавьте свой аккаунт WhatsApp (тот, на котором запущен OpenClaw) в группу.
  2. Скажите @openclaw … (или укажите номер). Триггерить могут только отправители из списка разрешённых, если вы не установили groupPolicy: "open".
  3. Промпт агента будет включать недавний групповой контекст плюс завершающий маркер [from: …], чтобы обратиться к нужному человеку.
  4. Директивы уровня сеанса (/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 при отсутствии упоминаний).