Перейти до основного вмісту

Групові повідомлення (веб-канал 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 прибирає візуальний @ з тексту повідомлення:
{
  channels: {
    whatsapp: {
      groups: {
        "*": { requireMention: true },
      },
    },
  },
  agents: {
    list: [
      {
        id: "main",
        groupChat: {
          historyLimit: 50,
          mentionPatterns: ["@?openclaw", "\\+?15555550123"],
        },
      },
    ],
  },
}
Примітки:
  • Ці regex є нечутливими до регістру та використовують ті самі захисні обмеження safe-regex, що й інші поверхні конфігурації regex; недійсні шаблони та небезпечні вкладені повторення ігноруються.
  • WhatsApp усе ще надсилає канонічні згадки через mentionedJids, коли хтось торкається контакту, тож запасний варіант із номером рідко потрібен, але є корисною страховкою.

Команда активації (лише для власника)

Використовуйте команду групового чату:
  • /activation mention
  • /activation always
Лише номер власника (з channels.whatsapp.allowFrom, або власний E.164 бота, якщо не задано) може це змінити. Надішліть /status як окреме повідомлення в групу, щоб побачити поточний режим активації.

Як використовувати

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