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

Групи

OpenClaw однаково обробляє групові чати на різних поверхнях: Discord, iMessage, Matrix, Microsoft Teams, Signal, Slack, Telegram, WhatsApp, Zalo.

Вступ для початківців (2 хвилини)

OpenClaw «живе» у ваших власних облікових записах месенджерів. Окремого користувача-бота WhatsApp немає. Якщо ви перебуваєте в групі, OpenClaw може бачити цю групу й відповідати там. Типова поведінка:
  • Групи обмежені (groupPolicy: "allowlist").
  • Для відповідей потрібне згадування, якщо ви явно не вимкнете керування згадуваннями.
Простими словами: відправники зі списку дозволу можуть запускати OpenClaw, згадуючи його.
Коротко
  • Доступ до DM контролюється через *.allowFrom.
  • Доступ до груп контролюється через *.groupPolicy + списки дозволу (*.groups, *.groupAllowFrom).
  • Запуск відповіді контролюється через керування згадуваннями (requireMention, /activation).
Коротка схема (що відбувається з повідомленням у групі):
groupPolicy? disabled -> drop
groupPolicy? allowlist -> group allowed? no -> drop
requireMention? yes -> mentioned? no -> store for context only
otherwise -> reply

Видимість контексту і списки дозволу

У безпеці груп задіяно два різні механізми керування:
  • Авторизація запуску: хто може запускати агента (groupPolicy, groups, groupAllowFrom, списки дозволу для конкретного каналу).
  • Видимість контексту: який додатковий контекст передається в модель (текст відповіді, цитати, історія треду, метадані пересланого повідомлення).
Типово OpenClaw надає пріоритет звичайній поведінці чату й зберігає контекст здебільшого в тому вигляді, у якому його отримано. Це означає, що списки дозволу переважно визначають, хто може запускати дії, а не є універсальною межею редагування для кожного процитованого або історичного фрагмента. Поточна поведінка залежить від каналу:
  • Деякі канали вже застосовують фільтрацію за відправником для додаткового контексту в окремих шляхах (наприклад, ініціалізація тредів у Slack, пошук відповіді/треду в Matrix).
  • Інші канали досі передають контекст цитати/відповіді/пересилання в отриманому вигляді.
Напрям посилення безпеки (заплановано):
  • contextVisibility: "all" (типово) зберігає поточну поведінку з передаванням контексту в отриманому вигляді.
  • contextVisibility: "allowlist" фільтрує додатковий контекст до відправників зі списку дозволу.
  • contextVisibility: "allowlist_quote" — це allowlist плюс один явний виняток для цитати/відповіді.
Поки цю модель посилення безпеки не буде узгоджено реалізовано в усіх каналах, очікуйте відмінностей залежно від поверхні. Потік повідомлень у групі Якщо вам потрібно…
МетаЩо налаштувати
Дозволити всі групи, але відповідати лише на @згадуванняgroups: { "*": { requireMention: true } }
Вимкнути всі відповіді в групахgroupPolicy: "disabled"
Лише певні групиgroups: { "<group-id>": { ... } } (без ключа "*")
Лише ви можете запускати в групахgroupPolicy: "allowlist", groupAllowFrom: ["+1555..."]

Ключі сесій

  • Для групових сесій використовуються ключі сесій agent:<agentId>:<channel>:group:<id> (для кімнат/каналів — agent:<agentId>:<channel>:channel:<id>).
  • Для тем форумів Telegram до ідентифікатора групи додається :topic:<threadId>, щоб кожна тема мала власну сесію.
  • Прямі чати використовують основну сесію (або окрему для кожного відправника, якщо це налаштовано).
  • Heartbeat для групових сесій пропускаються.

Шаблон: особисті DM + публічні групи (один агент)

Так — це добре працює, якщо ваш «особистий» трафік — це DM, а «публічний» трафік — це групи. Чому: у режимі одного агента DM зазвичай потрапляють в основний ключ сесії (agent:main:main), тоді як групи завжди використовують неосновні ключі сесій (agent:main:<channel>:group:<id>). Якщо ви ввімкнете ізоляцію з mode: "non-main", ці групові сесії виконуватимуться в Docker, а ваша основна DM-сесія залишиться на хості. Це дає вам один «мозок» агента (спільний workspace + пам’ять), але дві моделі виконання:
  • DM: повні інструменти (хост)
  • Групи: sandbox + інструменти лише для обміну повідомленнями (Docker)
Якщо вам потрібні справді окремі робочі простори/персони («особисте» і «публічне» ніколи не повинні змішуватися), використовуйте другого агента + bindings. Див. Маршрутизація кількох агентів.
Приклад (DM на хості, групи в sandbox + лише інструменти для обміну повідомленнями):
{
  agents: {
    defaults: {
      sandbox: {
        mode: "non-main", // groups/channels are non-main -> sandboxed
        scope: "session", // strongest isolation (one container per group/channel)
        workspaceAccess: "none",
      },
    },
  },
  tools: {
    sandbox: {
      tools: {
        // If allow is non-empty, everything else is blocked (deny still wins).
        allow: ["group:messaging", "group:sessions"],
        deny: ["group:runtime", "group:fs", "group:ui", "nodes", "cron", "gateway"],
      },
    },
  },
}
Потрібно, щоб «групи могли бачити лише папку X» замість «без доступу до хоста»? Залиште workspaceAccess: "none" і змонтуйте в sandbox лише шляхи зі списку дозволу:
{
  agents: {
    defaults: {
      sandbox: {
        mode: "non-main",
        scope: "session",
        workspaceAccess: "none",
        docker: {
          binds: [
            // hostPath:containerPath:mode
            "/home/user/FriendsShared:/data:ro",
          ],
        },
      },
    },
  },
}
Пов’язане:

Мітки відображення

  • Мітки інтерфейсу використовують displayName, коли він доступний, у форматі <channel>:<token>.
  • #room зарезервовано для кімнат/каналів; групові чати використовують g-<slug> (нижній регістр, пробіли -> -, зберігаються #@+._-).

Політика груп

Керуйте тим, як обробляються повідомлення з груп/кімнат для кожного каналу:
{
  channels: {
    whatsapp: {
      groupPolicy: "disabled", // "open" | "disabled" | "allowlist"
      groupAllowFrom: ["+15551234567"],
    },
    telegram: {
      groupPolicy: "disabled",
      groupAllowFrom: ["123456789"], // numeric Telegram user id (wizard can resolve @username)
    },
    signal: {
      groupPolicy: "disabled",
      groupAllowFrom: ["+15551234567"],
    },
    imessage: {
      groupPolicy: "disabled",
      groupAllowFrom: ["chat_id:123"],
    },
    msteams: {
      groupPolicy: "disabled",
      groupAllowFrom: ["user@org.com"],
    },
    discord: {
      groupPolicy: "allowlist",
      guilds: {
        GUILD_ID: { channels: { help: { allow: true } } },
      },
    },
    slack: {
      groupPolicy: "allowlist",
      channels: { "#general": { allow: true } },
    },
    matrix: {
      groupPolicy: "allowlist",
      groupAllowFrom: ["@owner:example.org"],
      groups: {
        "!roomId:example.org": { allow: true },
        "#alias:example.org": { allow: true },
      },
    },
  },
}
ПолітикаПоведінка
"open"Групи обходять списки дозволу; керування згадуваннями все ще застосовується.
"disabled"Повністю блокує всі повідомлення з груп.
"allowlist"Дозволяє лише групи/кімнати, що відповідають налаштованому списку дозволу.
Примітки:
  • groupPolicy відокремлена від керування згадуваннями (яке вимагає @згадувань).
  • Для WhatsApp/Telegram/Signal/iMessage/Microsoft Teams/Zalo використовуйте groupAllowFrom (резервний варіант: явний allowFrom).
  • Схвалення сполучення DM (записи в сховищі *-allowFrom) застосовуються лише до доступу через DM; авторизація відправників у групах залишається явною й керується списками дозволу груп.
  • Для Discord список дозволу використовує channels.discord.guilds.<id>.channels.
  • Для Slack список дозволу використовує channels.slack.channels.
  • Для Matrix список дозволу використовує channels.matrix.groups. Віддавайте перевагу ідентифікаторам або псевдонімам кімнат; пошук імен приєднаних кімнат виконується за принципом best-effort, а нерозпізнані імена ігноруються під час виконання. Використовуйте channels.matrix.groupAllowFrom, щоб обмежувати відправників; також підтримуються списки дозволу users для окремих кімнат.
  • Групові DM керуються окремо (channels.discord.dm.*, channels.slack.dm.*).
  • Список дозволу Telegram може відповідати ID користувачів ("123456789", "telegram:123456789", "tg:123456789") або іменам користувачів ("@alice" або "alice"); префікси не залежать від регістру.
  • Типове значення — groupPolicy: "allowlist"; якщо ваш список дозволу груп порожній, повідомлення з груп блокуються.
  • Безпека під час виконання: коли блок провайдера повністю відсутній (channels.<provider> відсутній), політика груп переходить у fail-closed режим (зазвичай allowlist) замість успадкування channels.defaults.groupPolicy.
Коротка ментальна модель (порядок обробки для повідомлень у групі):
  1. groupPolicy (open/disabled/allowlist)
  2. списки дозволу груп (*.groups, *.groupAllowFrom, список дозволу конкретного каналу)
  3. керування згадуваннями (requireMention, /activation)

Керування згадуваннями (типово)

Для повідомлень у групі потрібне згадування, якщо це не перевизначено для конкретної групи. Типові значення для кожної підсистеми задаються через *.groups."*". Відповідь на повідомлення бота зараховується як неявне згадування (коли канал підтримує метадані відповіді). Це стосується Telegram, WhatsApp, Slack, Discord і Microsoft Teams.
{
  channels: {
    whatsapp: {
      groups: {
        "*": { requireMention: true },
        "123@g.us": { requireMention: false },
      },
    },
    telegram: {
      groups: {
        "*": { requireMention: true },
        "123456789": { requireMention: false },
      },
    },
    imessage: {
      groups: {
        "*": { requireMention: true },
        "123": { requireMention: false },
      },
    },
  },
  agents: {
    list: [
      {
        id: "main",
        groupChat: {
          mentionPatterns: ["@openclaw", "openclaw", "\\+15555550123"],
          historyLimit: 50,
        },
      },
    ],
  },
}
Примітки:
  • mentionPatterns — це безпечні regex-шаблони без урахування регістру; недійсні шаблони та небезпечні форми з вкладеним повторенням ігноруються.
  • Поверхні, які надають явні згадування, усе одно їх передають; шаблони є резервним варіантом.
  • Перевизначення для окремого агента: agents.list[].groupChat.mentionPatterns (корисно, коли кілька агентів спільно використовують одну групу).
  • Керування згадуваннями застосовується лише тоді, коли можливе виявлення згадування (наявні нативні згадування або налаштовано mentionPatterns).
  • Для Discord типові значення зберігаються в channels.discord.guilds."*" (можна перевизначити для окремої гільдії/каналу).
  • Контекст історії групи однаково обгортається в усіх каналах і є лише для pending (повідомлення, пропущені через керування згадуваннями); використовуйте messages.groupChat.historyLimit для глобального типового значення та channels.<channel>.historyLimit (або channels.<channel>.accounts.*.historyLimit) для перевизначень. Встановіть 0, щоб вимкнути.

Обмеження інструментів для груп/каналів (необов’язково)

Деякі конфігурації каналів дають змогу обмежувати, які інструменти доступні всередині конкретної групи/кімнати/каналу.
  • tools: дозволити/заборонити інструменти для всієї групи.
  • toolsBySender: перевизначення для окремих відправників усередині групи. Використовуйте явні префікси ключів: id:<senderId>, e164:<phone>, username:<handle>, name:<displayName> і wildcard "*". Старі ключі без префікса все ще приймаються й зіставляються лише як id:.
Порядок визначення (найконкретніше має пріоритет):
  1. збіг toolsBySender для групи/каналу
  2. tools для групи/каналу
  3. типовий збіг toolsBySender для "*"
  4. типове tools для "*"
Приклад (Telegram):
{
  channels: {
    telegram: {
      groups: {
        "*": { tools: { deny: ["exec"] } },
        "-1001234567890": {
          tools: { deny: ["exec", "read", "write"] },
          toolsBySender: {
            "id:123456789": { alsoAllow: ["exec"] },
          },
        },
      },
    },
  },
}
Примітки:
  • Обмеження інструментів для груп/каналів застосовуються додатково до глобальної/агентської політики інструментів (deny все одно має пріоритет).
  • Деякі канали використовують іншу вкладеність для кімнат/каналів (наприклад, Discord guilds.*.channels.*, Slack channels.*, Microsoft Teams teams.*.channels.*).

Списки дозволу груп

Коли налаштовано channels.whatsapp.groups, channels.telegram.groups або channels.imessage.groups, ключі діють як список дозволу груп. Використовуйте "*", щоб дозволити всі групи й водночас задати типову поведінку для згадувань. Поширена плутанина: схвалення сполучення DM — це не те саме, що авторизація груп. Для каналів, які підтримують сполучення DM, сховище pairing розблоковує лише DM. Команди в групах усе одно вимагають явної авторизації відправника групи з конфігураційних списків дозволу, таких як groupAllowFrom, або задокументованого резервного механізму конфігурації для цього каналу. Типові наміри (копіюйте/вставляйте):
  1. Вимкнути всі відповіді в групах
{
  channels: { whatsapp: { groupPolicy: "disabled" } },
}
  1. Дозволити лише певні групи (WhatsApp)
{
  channels: {
    whatsapp: {
      groups: {
        "123@g.us": { requireMention: true },
        "456@g.us": { requireMention: false },
      },
    },
  },
}
  1. Дозволити всі групи, але вимагати згадування (явно)
{
  channels: {
    whatsapp: {
      groups: { "*": { requireMention: true } },
    },
  },
}
  1. Лише власник може запускати в групах (WhatsApp)
{
  channels: {
    whatsapp: {
      groupPolicy: "allowlist",
      groupAllowFrom: ["+15551234567"],
      groups: { "*": { requireMention: true } },
    },
  },
}

Активація (лише для власника)

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

Поля контексту

Для вхідних даних груп задаються:
  • ChatType=group
  • GroupSubject (якщо відомо)
  • GroupMembers (якщо відомо)
  • WasMentioned (результат керування згадуваннями)
  • Теми форумів Telegram також містять MessageThreadId і IsForum.
Примітки для конкретних каналів:
  • BlueBubbles може за бажанням збагачувати неіменованих учасників груп macOS з локальної бази контактів перед заповненням GroupMembers. Це вимкнено типово й виконується лише після проходження звичайної перевірки груп.
Системний prompt агента містить вступ для групи на першому ході нової групової сесії. Він нагадує моделі відповідати як людині, уникати таблиць Markdown, мінімізувати порожні рядки, дотримуватися звичайних інтервалів у чаті та уникати буквального введення послідовностей \n.

Особливості iMessage

  • Для маршрутизації або списків дозволу надавайте перевагу chat_id:<id>.
  • Перегляд чатів: imsg chats --limit 20.
  • Відповіді в групі завжди повертаються до того самого chat_id.

Особливості WhatsApp

Див. Повідомлення в групах для поведінки, специфічної для WhatsApp (впровадження історії, деталі обробки згадувань).