Configuration

Группы рассылки

Status: experimental

Обзор

Группы рассылки запускают несколько агентов для одного входящего сообщения. Каждый агент обрабатывает сообщение в собственном изолированном сеансе и публикует свой ответ, поэтому один номер WhatsApp может обслуживать команду специализированных агентов в одном групповом чате или личной переписке.

Группы рассылки проверяются после списков разрешённых каналов и правил активации групп. В группах WhatsApp рассылка выполняется, когда OpenClaw обычно должен ответить (например, при упоминании — в зависимости от настроек группы). Она изменяет только то, какие агенты запускаются, но не определяет, допускается ли сообщение к обработке.

Активный контур контроля качества WhatsApp включает whatsapp-broadcast-group-fanout, который проверяет, что одно сообщение с упоминанием в группе может привести к появлению разных видимых ответов от двух настроенных агентов.

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

Базовая настройка

Добавьте раздел верхнего уровня broadcast (рядом с bindings). Ключи — идентификаторы собеседников WhatsApp, значения — массивы идентификаторов агентов:

  • групповые чаты: JID группы (например, 120363403215116621@g.us)
  • личные сообщения: номер телефона отправителя в формате E.164 (например, +15551234567)
json
{  "broadcast": {    "120363403215116621@g.us": ["alfred", "baerbel", "assistant3"]  }}

Результат: когда OpenClaw должен ответить в этом чате, запускаются все три агента.

Каждый указанный идентификатор агента должен существовать в agents.list: проверка конфигурации сообщает о неизвестных идентификаторах, а среда выполнения пропускает их с предупреждением Broadcast agent <id> not found in agents.list; skipping.

Стратегия обработки

broadcast.strategy определяет, как агенты обрабатывают сообщение:

Стратегия Поведение
parallel (по умолчанию) Все агенты обрабатывают сообщение одновременно; ответы приходят в произвольном порядке.
sequential Агенты обрабатывают сообщение в порядке массива; каждый ждёт завершения предыдущего.
json
{  "broadcast": {    "strategy": "sequential",    "120363403215116621@g.us": ["alfred", "baerbel"]  }}

Полный пример

json
{  "agents": {    "list": [      {        "id": "code-reviewer",        "name": "Code Reviewer",        "workspace": "/path/to/code-reviewer",        "sandbox": { "mode": "all" }      },      {        "id": "security-auditor",        "name": "Security Auditor",        "workspace": "/path/to/security-auditor",        "sandbox": { "mode": "all" }      },      {        "id": "docs-generator",        "name": "Documentation Generator",        "workspace": "/path/to/docs-generator",        "sandbox": { "mode": "all" }      }    ]  },  "broadcast": {    "strategy": "parallel",    "120363403215116621@g.us": ["code-reviewer", "security-auditor", "docs-generator"],    "120363424282127706@g.us": ["support-en", "support-de"],    "+15555550123": ["assistant", "logger"]  }}

Принцип работы

Поток сообщений

  • Поступает входящее сообщение

    Поступает сообщение из группы WhatsApp или личной переписки.

  • Маршрутизация и допуск

    OpenClaw применяет списки разрешённых каналов, правила активации групп и настроенное владение привязкой ACP.

  • Проверка рассылки

    Если маршрут не принадлежит настроенной привязке ACP, OpenClaw проверяет наличие идентификатора собеседника в broadcast.

  • Если применяется рассылка

    • Все указанные агенты обрабатывают сообщение.
    • У каждого агента есть собственный ключ сеанса и изолированный контекст.
    • Агенты обрабатывают сообщение параллельно (по умолчанию) или последовательно.
    • Аудиовложения расшифровываются один раз перед разветвлением, поэтому агенты используют общую расшифровку вместо отдельных вызовов STT.
  • Если рассылка не применяется

    OpenClaw направляет сообщение по обычному маршруту или по настроенному маршруту сеанса ACP, выбранному при маршрутизации.

  • Изоляция сеансов

    Для каждого агента в группе рассылки полностью разделены:

    • Ключи сеансов (agent:alfred:whatsapp:group:120363... и agent:baerbel:whatsapp:group:120363...)
    • История переписки (агент не видит ответы других агентов)
    • Рабочее пространство (отдельные песочницы, если они настроены)
    • Доступ к инструментам (разные списки разрешений и запретов)
    • Память и контекст (отдельные IDENTITY.md, SOUL.md и т. д.)

    Одно исключение намеренно является общим: буфер контекста группы (последние сообщения группы, используемые для контекста) совместно используется для каждого собеседника, поэтому при запуске все агенты рассылки видят одинаковый контекст. Он очищается один раз после завершения разветвления.

    Благодаря этому агенты могут иметь разные характеры, модели, навыки и права доступа к инструментам (например, только чтение или чтение и запись).

    Пример: изолированные сеансы

    В группе 120363403215116621@g.us с агентами ["alfred", "baerbel"]:

    Контекст Alfred

    text
    Сеанс: agent:alfred:whatsapp:group:120363403215116621@g.usИстория: [сообщение пользователя, предыдущие ответы alfred]Рабочее пространство: ~/openclaw-alfred/Инструменты: чтение, запись, выполнение

    Контекст Baerbel

    text
    Сеанс: agent:baerbel:whatsapp:group:120363403215116621@g.usИстория: [сообщение пользователя, предыдущие ответы baerbel]Рабочее пространство: ~/openclaw-baerbel/Инструменты: только чтение

    Сценарии использования

    • Команды специализированных агентов: группа разработчиков, в которой code-reviewer, security-auditor, test-generator и docs-checker отвечают на одно сообщение каждый со своей точки зрения.
    • Многоязычная поддержка: один чат поддержки, в котором support-en, support-de и support-es отвечают на своих языках.
    • Контроль качества: support-agent отвечает, а qa-agent проверяет ответ и отвечает только при обнаружении проблем.
    • Автоматизация задач: task-tracker, time-logger и report-generator получают одно и то же обновление состояния.

    Рекомендации

    1. Сосредоточьте каждого агента на одной задаче

    Назначайте каждому агенту одну чёткую обязанность (formatter, linter, tester) вместо одного универсального агента «помощник разработчика».

    2. Используйте понятные идентификаторы и имена
    json
    {  "agents": {    "list": [      { "id": "security-scanner", "name": "Security Scanner" },      { "id": "code-formatter", "name": "Code Formatter" },      { "id": "test-generator", "name": "Test Generator" }    ]  }}
    3. Настройте разные права доступа к инструментам
    json
    {  "agents": {    "list": [      { "id": "reviewer", "tools": { "allow": ["read", "exec"] } },      { "id": "fixer", "tools": { "allow": ["read", "write", "edit", "exec"] } }    ]  }}

    reviewer имеет доступ только для чтения. fixer может читать и записывать.

    4. Отслеживайте производительность

    При большом количестве агентов предпочитайте "strategy": "parallel" (по умолчанию), ограничивайте группы рассылки несколькими агентами и используйте более быстрые модели для простых агентов.

    5. Сбои остаются изолированными

    Сбои агентов происходят независимо. Ошибка одного агента записывается в журнал (Broadcast agent <id> failed: ...) и не блокирует остальных.

    Совместимость

    Провайдеры

    В настоящее время группы рассылки реализованы только для WhatsApp (веб-канал). Другие каналы игнорируют конфигурацию broadcast.

    Маршрутизация

    Группы рассылки работают вместе с существующей маршрутизацией:

    json
    {  "bindings": [    {      "match": { "channel": "whatsapp", "peer": { "kind": "group", "id": "GROUP_A" } },      "agentId": "alfred"    }  ],  "broadcast": {    "GROUP_B": ["agent1", "agent2"]  }}
    • GROUP_A: отвечает только alfred (обычная маршрутизация).
    • GROUP_B: отвечают agent1 И agent2 (рассылка).

    Устранение неполадок

    Агенты не отвечают

    Проверьте:

    1. Идентификаторы агентов существуют в agents.list (проверка конфигурации отклоняет неизвестные идентификаторы).
    2. Формат идентификатора собеседника корректен (JID группы, например 120363403215116621@g.us, или номер E.164, например +15551234567, для личных сообщений).
    3. Сообщение прошло обычные проверки допуска (правила упоминаний и активации по-прежнему применяются).

    Отладка:

    bash
    openclaw logs --follow | grep -i broadcast

    При успешном разветвлении в журнал записывается Broadcasting message to <n> agents (<strategy>).

    Отвечает только один агент

    Причина: идентификатор собеседника может находиться в обычных привязках маршрутов, но отсутствовать в broadcast, либо он может соответствовать эксклюзивной настроенной привязке ACP.

    Исправление: добавьте собеседников с обычной привязкой маршрута в конфигурацию рассылки или удалите либо измените настроенную привязку ACP, если требуется разветвлённая рассылка.

    Проблемы с производительностью

    Если при большом количестве агентов работа замедляется: сократите число агентов в группе, используйте более лёгкие модели и проверьте время запуска песочницы.

    Примеры

    Пример 1. Команда проверки кода
    json
    {  "broadcast": {    "strategy": "parallel",    "120363403215116621@g.us": [      "code-formatter",      "security-scanner",      "test-coverage",      "docs-checker"    ]  },  "agents": {    "list": [      {        "id": "code-formatter",        "workspace": "~/agents/formatter",        "tools": { "allow": ["read", "write"] }      },      {        "id": "security-scanner",        "workspace": "~/agents/security",        "tools": { "allow": ["read", "exec"] }      },      {        "id": "test-coverage",        "workspace": "~/agents/testing",        "tools": { "allow": ["read", "exec"] }      },      { "id": "docs-checker", "workspace": "~/agents/docs", "tools": { "allow": ["read"] } }    ]  }}

    Один фрагмент кода в группе приводит к четырём ответам: исправления форматирования, обнаруженная проблема безопасности, пробел в покрытии тестами и небольшое замечание к документации.

    Пример 2. Многоязычный конвейер
    json
    {  "broadcast": {    "strategy": "sequential",    "+15555550123": ["detect-language", "translator-en", "translator-de"]  },  "agents": {    "list": [      { "id": "detect-language", "workspace": "~/agents/lang-detect" },      { "id": "translator-en", "workspace": "~/agents/translate-en" },      { "id": "translator-de", "workspace": "~/agents/translate-de" }    ]  }}

    Справочник API

    Схема конфигурации

    typescript
    interface OpenClawConfig {  broadcast?: {    strategy?: "parallel" | "sequential";    [peerId: string]: string[];  };}

    Поля

    strategy"parallel" | "sequential"default: "parallel"

    Способ обработки агентами. parallel запускает всех агентов одновременно; sequential запускает их в порядке массива.

    [peerId]string[]

    JID группы WhatsApp или номер телефона в формате E.164. Значение — массив идентификаторов агентов, каждый из которых должен обрабатывать сообщения от этого собеседника.

    Ограничения

    1. Максимальное количество агентов: жёсткого ограничения нет, но большое количество агентов (10+) может замедлить работу.
    2. Общий контекст: агенты не видят ответы друг друга (это предусмотрено архитектурой).
    3. Порядок сообщений: параллельные ответы могут поступать в любом порядке.
    4. Ограничения частоты запросов: все ответы отправляются из одной учётной записи WhatsApp, поэтому ответ каждого агента учитывается в общих ограничениях частоты запросов WhatsApp.

    Связанные материалы

    Was this useful?
    On this page

    On this page