Slack
Socket mode (по умолчанию)
Быстрая настройка (для начинающих)
- Создайте приложение Slack и включите Socket Mode.
- Создайте App Token (
xapp-...) и Bot Token (xoxb-...). - Задайте токены для OpenClaw и запустите Gateway (шлюз).
Настройка
- Создайте приложение Slack (From scratch) на https://api.slack.com/apps.
- Socket Mode → включите переключатель. Затем Basic Information → App-Level Tokens → Generate Token and Scopes с областью
connections:write. Скопируйте App Token (xapp-...). - OAuth & Permissions → добавьте области доступа bot token (используйте манифест ниже). Нажмите Install to Workspace. Скопируйте Bot User OAuth Token (
xoxb-...). - Необязательно: OAuth & Permissions → добавьте User Token Scopes (см. список только для чтения ниже). Переустановите приложение и скопируйте User OAuth Token (
xoxp-...). - Event Subscriptions → включите события и подпишитесь на:
message.*(включает правки/удаления/рассылки в тредах)app_mentionreaction_added,reaction_removedmember_joined_channel,member_left_channelchannel_renamepin_added,pin_removed
- Пригласите бота в каналы, которые он должен читать.
- Slash Commands → создайте
/openclaw, если используетеchannels.slack.slashCommand. Если вы включаете нативные команды, добавьте по одной slash-команде на каждую встроенную команду (с теми же именами, что и/help). По умолчанию нативные команды для Slack выключены, если вы не зададитеchannels.slack.commands.native: true(глобальноеcommands.nativeравно"auto", что оставляет Slack выключенным). - App Home → включите Messages Tab, чтобы пользователи могли писать боту в личные сообщения.
channels.slack.accounts с токенами для каждого аккаунта и необязательным name. gateway/configuration для общего шаблона.
Конфигурация OpenClaw (Socket mode)
Установить токены через env vars (рекомендуется):SLACK_APP_TOKEN=xapp-...SLACK_BOT_TOKEN=xoxb-...
User token (необязательно)
OpenClaw может использовать пользовательский токен Slack (xoxp-...) для операций чтения (история,
закрепы, реакции, emoji, информация об участниках). По умолчанию он остаётся только для чтения: чтение
предпочитает пользовательский токен при его наличии, а запись по‑прежнему использует bot token, если
вы явно не включили иное. Даже при userTokenReadOnly: false bot token остаётся
предпочтительным для записи, когда он доступен.
Пользовательские токены настраиваются в конфиге (поддержки env vars нет). Для
нескольких аккаунтов задайте channels.slack.accounts.<id>.userToken.
Пример с bot + app + user token:
Использование токенов
- Операции чтения (история, список реакций, список закрепов, список emoji, информация об участниках, поиск) предпочитают пользовательский токен, если он настроен, иначе bot token.
- Операции записи (отправка/редактирование/удаление сообщений, добавление/удаление реакций, закрепление/открепление,
загрузка файлов) по умолчанию используют bot token. Если задан
userTokenReadOnly: falseи bot token недоступен, OpenClaw переходит на пользовательский токен.
Контекст истории
channels.slack.historyLimit(илиchannels.slack.accounts.*.historyLimit) управляет тем, сколько последних сообщений канала/группы включается в prompt.- Используется запасное значение
messages.groupChat.historyLimit. Установите0, чтобы отключить (по умолчанию 50).
HTTP mode (Events API)
Используйте HTTP webhook режим, когда ваш Gateway (шлюз) доступен для Slack по HTTPS (типично для серверных развёртываний). HTTP mode использует Events API + Interactivity + Slash Commands с общим URL запроса.Настройка (HTTP mode)
- Создайте приложение Slack и отключите Socket Mode (необязательно, если вы используете только HTTP).
- Basic Information → скопируйте Signing Secret.
- OAuth & Permissions → установите приложение и скопируйте Bot User OAuth Token (
xoxb-...). - Event Subscriptions → включите события и задайте Request URL на путь webhook вашего шлюза (по умолчанию
/slack/events). - Interactivity & Shortcuts → включите и задайте тот же Request URL.
- Slash Commands → задайте тот же Request URL для ваших команд.
https://gateway-host/slack/events
Конфигурация OpenClaw (минимальная)
channels.slack.accounts.<id>.mode = "http" и укажите уникальный
webhookPath для каждого аккаунта, чтобы каждое приложение Slack указывало на свой URL.
Манифест (опционально)
Используйте этот манифест приложения Slack, чтобы быстро создать приложение (при необходимости измените имя/команду). Включите пользовательские области доступа, если планируете настраивать пользовательский токен.slash_commands для каждой команды, которую хотите открыть (в соответствии со списком /help). Переопределяйте с помощью channels.slack.commands.native.
Scopes (текущие и необязательные)
Conversations API в Slack типо‑ориентирован: вам нужны только области доступа для тех типов диалогов, с которыми вы реально работаете (channels, groups, im, mpim). См. См. https://docs.slack.dev/apis/web-api/using-the-conversations-api/ для обзора.Bot token scopes (обязательные)
chat:write(отправка/обновление/удаление сообщений черезchat.postMessage) https://docs.slack.dev/reference/methods/chat.postMessageim:write(открытие личных сообщений черезconversations.openдля DMs пользователей) https://docs.slack.dev/reference/methods/conversations.openchannels:history,groups:history,im:history,mpim:historyhttps://docs.slack.dev/reference/methods/conversations.historychannels:read,groups:read,im:read,mpim:readhttps://docs.slack.dev/reference/methods/conversations.infousers:read(поиск пользователей) https://docs.slack.dev/reference/methods/users.inforeactions:read,reactions:write(reactions.get/reactions.add) https://docs.slack.dev/reference/methods/reactions.get https://docs.slack.dev/reference/methods/reactions.addpins:read,pins:write(pins.list/pins.add/pins.remove) https://docs.slack.dev/reference/scopes/pins.read https://docs.slack.dev/reference/scopes/pins.writeemoji:read(emoji.list) https://docs.slack.dev/reference/scopes/emoji.readfiles:write(загрузки черезfiles.uploadV2) https://docs.slack.dev/messaging/working-with-files/#upload
User token scopes (необязательные, по умолчанию только чтение)
Добавьте их в User Token Scopes, если настраиваетеchannels.slack.userToken.
channels:history,groups:history,im:history,mpim:historychannels:read,groups:read,im:read,mpim:readusers:readreactions:readpins:reademoji:readsearch:read
Пока не требуется (но вероятно в будущем)
mpim:write(только если мы добавим открытие group-DM/старт DM черезconversations.open)groups:write(только если мы добавим управление приватными каналами: создание/переименование/приглашение/архивация)chat:write.public(только если нужно публиковать в каналы, где бота нет) https://docs.slack.dev/reference/scopes/chat.write.publicusers:read.email(только если нам нужны поля email изusers.info) https://docs.slack.dev/changelog/2017-04-narrowing-email-accessfiles:read(только если начнём перечислять/читать метаданные файлов)
Конфиг
Slack использует только Socket Mode (без HTTP webhook сервера). Укажите оба токена:SLACK_BOT_TOKENSLACK_APP_TOKEN
messages.ackReaction +
messages.ackReactionScope. Используйте messages.removeAckAfterReply, чтобы очистить
ack‑реакцию после ответа бота.
Ограничения
- Исходящий текст разбивается на части по
channels.slack.textChunkLimit(по умолчанию 4000). - Необязательное разбиение по новым строкам: задайте
channels.slack.chunkMode="newline", чтобы сначала делить по пустым строкам (границы абзацев) перед разбиением по длине. - Загрузка медиа ограничена
channels.slack.mediaMaxMb(по умолчанию 20).
Треды ответов
По умолчанию OpenClaw отвечает в основном канале. Используйтеchannels.slack.replyToMode для управления автоматическим тредингом:
| Режим | Поведение |
|---|---|
off | По умолчанию. Ответ в основном канале. В тред — только если исходное сообщение уже было в треде. |
first | Первый ответ уходит в тред (под исходным сообщением), последующие — в основной канал. Полезно для сохранения контекста без захламления тредами. |
all | Все ответы уходят в тред. Сохраняет диалоги компактными, но может снижать видимость. |
slack sendMessage).
Трединг по типам чатов
Вы можете настроить разное поведение трединга для каждого типа чата, задавchannels.slack.replyToModeByChatType:
direct: личные сообщения 1:1 (Slackim)group: групповые DMs / MPIMs (Slackmpim)channel: обычные каналы (публичные/приватные)
replyToModeByChatType.<chatType>replyToMode- Значение по умолчанию провайдера (
off)
channels.slack.dm.replyToMode по‑прежнему принимается как запасной вариант для direct, если не задано переопределение по типу чата.
Примеры:
Тредить только DMs:
Ручные теги трединга
Для тонкой настройки используйте эти теги в ответах агента:[[reply_to_current]]— ответить на исходное сообщение (начать/продолжить тред).[[reply_to:<id>]]— ответить на конкретный id сообщения.
Сессии и маршрутизация
- DMs используют общую сессию
main(как WhatsApp/Telegram). - Каналы сопоставляются с сессиями
agent:<agentId>:slack:channel:<channelId>. - Slash‑команды используют сессии
agent:<agentId>:slack:slash:<userId>(префикс настраивается черезchannels.slack.slashCommand.sessionPrefix). - Если Slack не предоставляет
channel_type, OpenClaw выводит его из префикса id канала (D,C,G) и по умолчанию используетchannel, чтобы ключи сессий оставались стабильными. - Регистрация нативных команд использует
commands.native(глобальное значение по умолчанию"auto"→ Slack выключен) и может быть переопределена для рабочего пространства черезchannels.slack.commands.native. Текстовые команды требуют отдельных сообщений/...и могут быть отключены черезcommands.text: false. Slack slash‑команды управляются в приложении Slack и автоматически не удаляются. Используйтеcommands.useAccessGroups: false, чтобы обходить проверки групп доступа для команд. - Полный список команд и конфигурация: Slash commands
Безопасность ТМ (пар)
- По умолчанию:
channels.slack.dm.policy="pairing"— неизвестные отправители DMs получают код сопряжения (истекает через 1 час). - Подтверждение через:
openclaw pairing approve slack <code>. - Чтобы разрешить всем: задайте
channels.slack.dm.policy="open"иchannels.slack.dm.allowFrom=["*"]. channels.slack.dm.allowFromпринимает id пользователей, @хэндлы или email (разрешаются при старте, когда токены позволяют). Мастер настройки принимает имена пользователей и разрешает их в id во время настройки, когда токены позволяют.
Политика групп
channels.slack.groupPolicyуправляет обработкой каналов (open|disabled|allowlist).allowlistтребует, чтобы каналы были перечислены вchannels.slack.channels.- Если вы задаёте только
SLACK_BOT_TOKEN/SLACK_APP_TOKENи никогда не создаёте разделchannels.slack, значения по умолчанию во время выполнения устанавливаютgroupPolicyвopen. Добавьтеchannels.slack.groupPolicy,channels.defaults.groupPolicyили allowlist каналов, чтобы зафиксировать политику. - Мастер конфигурации принимает имена
#channelи по возможности разрешает их в ID (публичные + приватные); при нескольких совпадениях предпочитается активный канал. - При старте OpenClaw разрешает имена каналов/пользователей в allowlist в ID (когда токены позволяют) и логирует сопоставление; неразрешённые записи сохраняются как введены.
- Чтобы разрешить ни одного канала, задайте
channels.slack.groupPolicy: "disabled"(или оставьте allowlist пустым).
channels.slack.channels.<id> или channels.slack.channels.<name>):
allow: разрешить/запретить канал, когдаgroupPolicy="allowlist".requireMention: контроль упоминаний для канала.tools: необязательные переопределения политик инструментов на канал (allow/deny/alsoAllow).toolsBySender: необязательные переопределения политик инструментов для отправителей внутри канала (ключи — id отправителей/@хэндлы/email; поддерживается wildcard"*").allowBots: разрешить сообщения, созданные ботом, в этом канале (по умолчанию: false).users: необязательный allowlist пользователей для канала.skills: фильтр Skills (пропуск = все Skills, пусто = ни одной).systemPrompt: дополнительный системный prompt для канала (объединяется с темой/назначением).enabled: установитеfalse, чтобы отключить канал.
Цели доставки
Используйте их с отправками через cron/CLI:user:<id>для DMschannel:<id>для каналов
Действия инструментов
Действия инструментов Slack можно ограничивать черезchannels.slack.actions.*:
| Группа действий | По умолчанию | Примечания |
|---|---|---|
| reactions | enabled | Реакции + список реакций |
| messages | enabled | Чтение/отправка/редактирование/удаление |
| pins | enabled | Закрепить/открепить/список |
| memberInfo | enabled | Информация об участниках |
| emojiList | enabled | Список кастомных emoji |
Примечания по безопасности
- Операции записи по умолчанию используют bot token, чтобы изменения состояния оставались в рамках прав и идентичности бота приложения.
- Установка
userTokenReadOnly: falseпозволяет использовать пользовательский токен для операций записи, когда bot token недоступен, что означает выполнение действий с правами пользователя, установившего приложение. Рассматривайте пользовательский токен как высокопривилегированный и держите ограничения действий и allowlist максимально жёсткими. - Если вы включаете запись пользовательским токеном, убедитесь, что он включает ожидаемые
области доступа на запись (
chat:write,reactions:write,pins:write,files:write), иначе эти операции завершатся ошибкой.
Устранение неполадок
Сначала запустите лестницу:- Подключено, но нет ответов в каналах: канал заблокирован
groupPolicyили отсутствует в allowlistchannels.slack.channels. - DMs игнорируются: отправитель не одобрен при
channels.slack.dm.policy="pairing". - Ошибки API (
missing_scope,not_in_channel, ошибки аутентификации): токены бота/приложения или области доступа Slack неполные.
Примечания
- Контроль упоминаний управляется через
channels.slack.channels(установитеrequireMentionвtrue);agents.list[].groupChat.mentionPatterns(илиmessages.groupChat.mentionPatterns) также считаются упоминаниями. - Переопределение для нескольких агентов: задайте шаблоны для каждого агента в
agents.list[].groupChat.mentionPatterns. - Уведомления о реакциях следуют
channels.slack.reactionNotifications(используйтеreactionAllowlistс режимомallowlist). - Сообщения, созданные ботом, по умолчанию игнорируются; включите через
channels.slack.allowBotsилиchannels.slack.channels.<id>.allowBots. - Предупреждение: если вы разрешаете ответы другим ботам (
channels.slack.allowBots=trueилиchannels.slack.channels.<id>.allowBots=true), предотвращайте циклы ответов ботов с помощью allowlistrequireMention,channels.slack.channels.<id>.usersи/или жёстких ограничений вAGENTS.mdиSOUL.md. - Для инструмента Slack семантика удаления реакций описана в /tools/reactions.
- Вложения загружаются в хранилище медиа при наличии разрешений и если размер не превышает лимит.