Configuration
Групи
OpenClaw обробляє групові чати узгоджено на всіх поверхнях: Discord, iMessage, Matrix, Microsoft Teams, Signal, Slack, Telegram, WhatsApp, Zalo.
Вступ для початківців (2 хвилини)
OpenClaw "живе" у ваших власних облікових записах месенджерів. Окремого користувача-бота WhatsApp немає. Якщо ви є в групі, OpenClaw може бачити цю групу й відповідати в ній.
Типова поведінка:
- Групи обмежені (
groupPolicy: "allowlist"). - Відповіді потребують згадки, якщо ви явно не вимкнули перевірку згадки.
- Звичайні фінальні відповіді в групах/каналах за замовчуванням приватні. Видимий вивід у кімнату використовує інструмент
message.
Інакше кажучи: дозволені відправники можуть запускати OpenClaw, згадавши його.
Швидкий потік (що відбувається з груповим повідомленням):
groupPolicy? disabled -> dropgroupPolicy? allowlist -> group allowed? no -> droprequireMention? yes -> mentioned? no -> store for context onlyotherwise -> replyВидимі відповіді
Для групових/канальних кімнат OpenClaw за замовчуванням використовує messages.groupChat.visibleReplies: "message_tool".
openclaw doctor --fix записує це типове значення в конфігурації налаштованих каналів, де його пропущено.
Це означає, що агент усе ще обробляє хід і може оновлювати стан пам’яті/сесії, але його звичайна фінальна відповідь не публікується автоматично назад у кімнату. Щоб говорити видимо, агент використовує message(action=send).
Це типове значення залежить від моделі/середовища виконання, які надійно викликають інструменти. Якщо журнали показують текст асистента, але didSendViaMessagingTool: false, модель відповіла приватно замість того, щоб викликати інструмент повідомлень. Це не збій надсилання Discord/Slack/Telegram. Використовуйте модель із надійними викликами інструментів для групових/канальних сесій або встановіть messages.groupChat.visibleReplies: "automatic", щоб відновити застарілі видимі фінальні відповіді.
Якщо інструмент повідомлень недоступний за активною політикою інструментів, OpenClaw повертається до автоматичних видимих відповідей замість того, щоб мовчки пригнічувати відповідь.
openclaw doctor попереджає про цю невідповідність.
Для прямих чатів і будь-якого іншого джерела ходу використовуйте messages.visibleReplies: "message_tool", щоб застосувати таку саму поведінку видимих відповідей лише через інструмент глобально. Середовища також можуть вибрати це як своє типове значення, якщо воно не задане; середовище Codex робить це для прямих чатів у режимі Codex. messages.groupChat.visibleReplies залишається конкретнішим перевизначенням для групових/канальних кімнат.
Це замінює старий шаблон примусового налаштування моделі відповідати NO_REPLY для більшості ходів у режимі спостереження. У режимі лише через інструмент відсутність видимої дії просто означає, що інструмент повідомлень не викликається.
Індикатори набору тексту все ще надсилаються, поки агент працює в режимі лише через інструмент. Типовий режим набору тексту для груп підвищується з "message" до "instant" для цих ходів, бо звичайного тексту повідомлення асистента може взагалі не бути до того, як агент вирішить, чи викликати інструмент повідомлень. Явна конфігурація режиму набору тексту все одно має пріоритет.
Щоб відновити застарілі автоматичні фінальні відповіді для групових/канальних кімнат:
{ messages: { groupChat: { visibleReplies: "automatic", }, },}Gateway гаряче перезавантажує конфігурацію messages після збереження файла. Перезапускайте лише тоді, коли спостереження за файлами або перезавантаження конфігурації вимкнене в розгортанні.
Щоб вимагати, аби видимий вивід для кожного вихідного чату проходив через інструмент повідомлень:
{ messages: { visibleReplies: "message_tool", },}Нативні слеш-команди (Discord, Telegram та інші поверхні з підтримкою нативних команд) обходять visibleReplies: "message_tool" і завжди відповідають видимо, щоб канал-рідний інтерфейс команд отримував очікувану відповідь. Це застосовується лише до перевірених нативних ходів команд; набрані текстом команди /... і звичайні ходи чату й надалі дотримуються налаштованого типового значення для груп.
Видимість контексту та списки дозволів
У безпеці груп беруть участь два різні елементи керування:
- Авторизація запуску: хто може запускати агента (
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..."] |
| Повторно використовувати один набір довірених відправників у різних каналах | groupAllowFrom: ["accessGroup:operators"] |
Про багаторазові списки дозволених відправників дивіться Групи доступу.
Ключі сесій
- Групові сесії використовують ключі сесій
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", ці групові сесії запускаються в налаштованому бекенді пісочниці, тоді як ваша основна DM-сесія залишається на хості. Docker є типовим бекендом, якщо ви не вибрали інший.
Це дає вам один "мозок" агента (спільний робочий простір + пам’ять), але два режими виконання:
- DM: повні інструменти (хост)
- Групи: пісочниця + обмежені інструменти
DM на хості, групи в пісочниці
{ 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" і монтуйте в пісочницю лише шляхи зі списку дозволів:
{ agents: { defaults: { sandbox: { mode: "non-main", scope: "session", workspaceAccess: "none", docker: { binds: [ // hostPath:containerPath:mode "/home/user/FriendsShared:/data:ro", ], }, }, }, },}Пов’язане:
- Ключі конфігурації та типові значення: Конфігурація Gateway
- Налагодження, чому інструмент заблоковано: Пісочниця проти політики інструментів проти підвищених прав
- Деталі монтування прив’язок: Ізоляція в пісочниці
Відображувані мітки
- Мітки UI використовують
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: ["[email protected]"], }, 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": { enabled: true }, "#alias:example.org": { enabled: true }, }, }, },}| Політика | Поведінка |
|---|---|
"open" |
Групи обходять списки дозволів; перевірка згадки все одно застосовується. |
"disabled" |
Повністю блокувати всі групові повідомлення. |
"allowlist" |
Дозволяти лише групи/кімнати, які відповідають налаштованому списку дозволів. |
Примітки для окремих каналів
groupPolicyвідокремлено від фільтрації за згадками (яка потребує @mentions).- WhatsApp/Telegram/Signal/iMessage/Microsoft Teams/Zalo: використовуйте
groupAllowFrom(резервний варіант: явнийallowFrom). - Signal:
groupAllowFromможе збігатися або з вхідним ідентифікатором групи Signal, або з телефоном/UUID відправника. - Схвалення прив’язування DM (записи сховища
*-allowFrom) застосовуються лише до доступу DM; авторизація відправника в групі залишається явно заданою через списки дозволених груп. - Discord: список дозволених використовує
channels.discord.guilds.<id>.channels. - Slack: список дозволених використовує
channels.slack.channels. - Matrix: список дозволених використовує
channels.matrix.groups. Надавайте перевагу ідентифікаторам або псевдонімам кімнат; пошук назв приєднаних кімнат виконується за найкращою спробою, а нерозпізнані назви ігноруються під час виконання. Використовуйтеchannels.matrix.groupAllowFrom, щоб обмежити відправників; також підтримуються покімнатні списки дозволенихusers. - Групові DM керуються окремо (
channels.discord.dm.*,channels.slack.dm.*). - Список дозволених Telegram може збігатися з ідентифікаторами користувачів (
"123456789","telegram:123456789","tg:123456789") або іменами користувачів ("@alice"чи"alice"); префікси не чутливі до регістру. - Типове значення —
groupPolicy: "allowlist"; якщо ваш список дозволених груп порожній, групові повідомлення блокуються. - Безпека під час виконання: коли блок провайдера повністю відсутній (
channels.<provider>відсутній), політика груп повертається до режиму із закриттям у разі помилки (зазвичайallowlist) замість успадкуванняchannels.defaults.groupPolicy.
Коротка ментальна модель (порядок оцінювання для групових повідомлень):
groupPolicy
groupPolicy (open/disabled/allowlist).
Списки дозволених груп
Списки дозволених груп (*.groups, *.groupAllowFrom, список дозволених для конкретного каналу).
Фільтрація за згадками
Фільтрація за згадками (requireMention, /activation).
Фільтрація за згадками (типово)
Групові повідомлення потребують згадки, якщо це не перевизначено для групи. Типові значення зберігаються для кожної підсистеми в *.groups."*".
Відповідь на повідомлення бота рахується як неявна згадка, коли канал підтримує метадані відповіді. Цитування повідомлення бота також може рахуватися як неявна згадка в каналах, які надають метадані цитати. Поточні вбудовані випадки включають Telegram, WhatsApp, Slack, Discord, Microsoft Teams і ZaloUser.
{ channels: { whatsapp: { groups: { "*": { requireMention: true }, "[email protected]": { 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). - Додавання групи чи відправника до списку дозволених не вимикає фільтрацію за згадками; встановіть для цієї групи
requireMentionуfalse, коли всі повідомлення мають запускати обробку. - Контекст підказки групового чату передає розв’язану інструкцію тихої відповіді в кожному ході; файли робочого простору не повинні дублювати механіку
NO_REPLY. - Групи, у яких дозволені тихі відповіді, трактують чисті порожні або лише reasoning-ходи моделі як тихі, еквівалентні
NO_REPLY. Прямі чати роблять те саме лише тоді, коли прямі тихі відповіді явно дозволені; інакше порожні відповіді залишаються невдалими ходами агента. - Типові значення Discord зберігаються в
channels.discord.guilds."*"(можна перевизначити для гільдії/каналу). - Контекст історії груп однаково обгортається в усіх каналах. Групи з фільтрацією за згадками зберігають очікувані пропущені повідомлення; групи, що завжди активні, також можуть зберігати нещодавні оброблені повідомлення кімнати, коли канал це підтримує. Використовуйте
messages.groupChat.historyLimitдля глобального типового значення таchannels.<channel>.historyLimit(абоchannels.<channel>.accounts.*.historyLimit) для перевизначень. Встановіть0, щоб вимкнути.
Обмеження інструментів для груп/каналів (необов’язково)
Деякі конфігурації каналів підтримують обмеження того, які інструменти доступні всередині конкретної групи/кімнати/каналу.
tools: дозволити/заборонити інструменти для всієї групи.toolsBySender: перевизначення для окремих відправників у межах групи. Використовуйте явні префікси ключів:channel:<channelId>:<senderId>,id:<senderId>,e164:<phone>,username:<handle>,name:<displayName>і шаблон"*". Ідентифікатори каналів використовують канонічні ідентифікатори каналів OpenClaw; псевдоніми на кшталтteamsнормалізуються доmsteams. Застарілі ключі без префікса все ще приймаються та зіставляються лише якid:.
Порядок розв’язання (перемагає найконкретніше):
Group toolsBySender
Збіг toolsBySender групи/каналу.
Інструменти групи
tools групи/каналу.
Default toolsBySender
Збіг типового ("*") toolsBySender.
Типові інструменти
Типові ("*") tools.
Приклад (Telegram):
{ channels: { telegram: { groups: { "*": { tools: { deny: ["exec"] } }, "-1001234567890": { tools: { deny: ["exec", "read", "write"] }, toolsBySender: { "id:123456789": { alsoAllow: ["exec"] }, }, }, }, }, },}Списки дозволених груп
Коли налаштовано channels.whatsapp.groups, channels.telegram.groups або channels.imessage.groups, ключі діють як список дозволених груп. Використовуйте "*", щоб дозволити всі групи й водночас задати типову поведінку згадок.
Поширені наміри (скопіюйте/вставте):
Вимкнути всі групові відповіді
{ channels: { whatsapp: { groupPolicy: "disabled" } },}Дозволити лише конкретні групи (WhatsApp)
{ channels: { whatsapp: { groups: { "[email protected]": { requireMention: true }, "[email protected]": { requireMention: false }, }, }, },}Дозволити всі групи, але вимагати згадку
{ channels: { whatsapp: { groups: { "*": { requireMention: true } }, }, },}Запуски лише власником (WhatsApp)
{ channels: { whatsapp: { groupPolicy: "allowlist", groupAllowFrom: ["+15551234567"], groups: { "*": { requireMention: true } }, }, },}Активація (лише власник)
Власники груп можуть перемикати активацію для окремої групи:
/activation mention/activation always
Власник визначається за channels.whatsapp.allowFrom (або за власним E.164 бота, якщо не задано). Надсилайте команду як окреме повідомлення. Інші поверхні наразі ігнорують /activation.
Поля контексту
Вхідні групові корисні навантаження задають:
ChatType=groupGroupSubject(якщо відомо)GroupMembers(якщо відомо)WasMentioned(результат фільтрації за згадками)- Теми форуму Telegram також включають
MessageThreadIdіIsForum.
Системна підказка агента включає вступ про групу на першому ході нової групової сесії. Вона нагадує моделі відповідати як людина, уникати Markdown-таблиць, мінімізувати порожні рядки й дотримуватися звичайних інтервалів чату, а також не вводити буквальні послідовності \n. Назви груп і мітки учасників, отримані з каналів, відображаються як огороджені недовірені метадані, а не як вбудовані системні інструкції.
Особливості iMessage
- Надавайте перевагу
chat_id:<id>під час маршрутизації або додавання до списку дозволених. - Перелік чатів:
imsg chats --limit 20. - Групові відповіді завжди повертаються до того самого
chat_id.
Системні підказки WhatsApp
Див. WhatsApp для канонічних правил системних підказок WhatsApp, включно з розв’язанням групових і прямих підказок, поведінкою шаблона та семантикою перевизначення облікового запису.
Особливості WhatsApp
Див. Групові повідомлення для поведінки лише WhatsApp (вставлення історії, подробиці обробки згадок).