Конфигурация

Групповые сообщения

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

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

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

СопряжениеГруппы