Slack
Статус: готов к продакшну для ЛС и каналов через Slack-приложения. По умолчанию используется Socket Mode; режим HTTP Events API также поддерживается.
- Спаривание — В ЛС Slack по умолчанию используется режим спаривания.
- Слеш-команды — Поведение нативных команд и каталог команд.
- Устранение неполадок каналов — Кросс-канальная диагностика и процедуры восстановления.
Быстрая настройка
Socket Mode (по умолчанию)
### Шаг 1: Создайте Slack-приложение и токены
В настройках Slack-приложения:
- включите **Socket Mode**
- создайте **App Token** (`xapp-...`) с правом `connections:write`
- установите приложение и скопируйте **Bot Token** (`xoxb-...`)
### Шаг 2: Настройте OpenClaw
{
channels: {
slack: {
enabled: true,
mode: "socket",
appToken: "xapp-...",
botToken: "xoxb-...",
},
},
}
Резервная переменная окружения (только для аккаунта по умолчанию):
SLACK_APP_TOKEN=xapp-...
SLACK_BOT_TOKEN=xoxb-...
### Шаг 3: Подпишитесь на события приложения
Подпишите бота на события:
- `app_mention`
- `message.channels`, `message.groups`, `message.im`, `message.mpim`
- `reaction_added`, `reaction_removed`
- `member_joined_channel`, `member_left_channel`
- `channel_rename`
- `pin_added`, `pin_removed`
Также включите **Messages Tab** в App Home для ЛС.
### Шаг 4: Запустите шлюз
openclaw gateway
Режим HTTP Events API
### Шаг 1: Настройте Slack-приложение для HTTP
- установите режим HTTP (`channels.slack.mode="http"`)
- скопируйте **Signing Secret** Slack
- установите Request URL для Event Subscriptions + Interactivity + Slash command на один webhook-путь (по умолчанию `/slack/events`)
### Шаг 2: Настройте OpenClaw для режима HTTP
{
channels: {
slack: {
enabled: true,
mode: "http",
botToken: "xoxb-...",
signingSecret: "your-signing-secret",
webhookPath: "/slack/events",
},
},
}
### Шаг 3: Уникальные webhook-пути для мультиаккаунтного HTTP
Мультиаккаунтный HTTP-режим поддерживается.
Задайте каждому аккаунту отдельный `webhookPath`, чтобы регистрации не конфликтовали.
Модель токенов
botToken+appTokenобязательны для Socket Mode.- HTTP-режим требует
botToken+signingSecret. - Токены из конфигурации имеют приоритет над переменными окружения.
SLACK_BOT_TOKEN/SLACK_APP_TOKENиспользуются только для аккаунта по умолчанию.userToken(xoxp-...) настраивается только через конфигурацию (нет резервной переменной окружения) и по умолчанию работает в режиме только для чтения (userTokenReadOnly: true).- Опционально: добавьте
chat:write.customize, если хотите, чтобы исходящие сообщения использовали идентичность активного агента (пользовательскиеusernameи иконку).icon_emojiиспользует синтаксис:emoji_name:.
Совет: Для действий/чтения каталога предпочтителен user token (при настройке). Для записи предпочтителен bot token; запись через user-token возможна только при
userTokenReadOnly: falseи недоступности bot token.
Управление доступом и маршрутизация
Политика ЛС
`channels.slack.dmPolicy` управляет доступом к ЛС (устаревшее: `channels.slack.dm.policy`):
- `pairing` (по умолчанию)
- `allowlist`
- `open` (требует, чтобы `channels.slack.allowFrom` содержал `"*"`; устаревшее: `channels.slack.dm.allowFrom`)
- `disabled`
Флаги ЛС:
- `dm.enabled` (по умолчанию true)
- `channels.slack.allowFrom` (предпочтительно)
- `dm.allowFrom` (устаревшее)
- `dm.groupEnabled` (групповые ЛС по умолчанию false)
- `dm.groupChannels` (опциональный allowlist MPIM)
Приоритет в мультиаккаунтном режиме:
- `channels.slack.accounts.default.allowFrom` применяется только к аккаунту `default`.
- Именованные аккаунты наследуют `channels.slack.allowFrom`, если собственный `allowFrom` не задан.
- Именованные аккаунты не наследуют `channels.slack.accounts.default.allowFrom`.
Спаривание в ЛС использует `openclaw pairing approve slack <code>`.
Политика каналов
`channels.slack.groupPolicy` управляет обработкой каналов:
- `open`
- `allowlist`
- `disabled`
Allowlist каналов находится в `channels.slack.channels` и должен использовать стабильные ID каналов.
Замечание по рантайму: если `channels.slack` полностью отсутствует (настройка только через env), рантайм откатывается к `groupPolicy="allowlist"` и пишет предупреждение (даже если `channels.defaults.groupPolicy` установлен).
Разрешение имён/ID:
- записи allowlist каналов и allowlist ЛС разрешаются при запуске, когда доступ по токену позволяет
- неразрешённые записи с именами каналов сохраняются, но игнорируются при маршрутизации по умолчанию
- входящая авторизация и маршрутизация каналов работают по ID; прямое сопоставление по username/slug требует `channels.slack.dangerouslyAllowNameMatching: true`
Упоминания и пользователи каналов
Сообщения в каналах по умолчанию требуют упоминания.
Источники упоминания:
- явное упоминание приложения (`<@botId>`)
- regex-паттерны упоминаний (`agents.list[].groupChat.mentionPatterns`, резервно `messages.groupChat.mentionPatterns`)
- неявное поведение reply-to-bot в треде
Настройки для канала (`channels.slack.channels.<id>`; имена только через разрешение при запуске или `dangerouslyAllowNameMatching`):
- `requireMention`
- `users` (allowlist)
- `allowBots`
- `skills`
- `systemPrompt`
- `tools`, `toolsBySender`
- Формат ключей `toolsBySender`: `id:`, `e164:`, `username:`, `name:` или wildcard `"*"`
(устаревшие ключи без префикса сопоставляются только по `id:`)
Команды и поведение слеш-команд
- Автоматический режим нативных команд отключён для Slack (
commands.native: "auto"не активирует нативные команды Slack). - Включите обработчики нативных команд Slack через
channels.slack.commands.native: true(или глобальноcommands.native: true). - При включённых нативных командах зарегистрируйте соответствующие слеш-команды в Slack (
/<command>), с одним исключением:- зарегистрируйте
/agentstatusдля команды status (Slack резервирует/status)
- зарегистрируйте
- Если нативные команды не включены, можно запускать одну настроенную слеш-команду через
channels.slack.slashCommand. - Нативные меню аргументов теперь адаптируют стратегию отображения:
- до 5 вариантов: кнопки
- 6-100 вариантов: статичное select-меню
- более 100 вариантов: внешний select с асинхронной фильтрацией при наличии обработчиков interactivity
- если закодированные значения превышают лимиты Slack, режим откатывается к кнопкам
- Для длинных вариантов меню аргументов слеш-команд используется диалог подтверждения перед отправкой выбранного значения.
Интерактивные ответы
Slack может отображать интерактивные элементы управления в ответах агента, но эта функция отключена по умолчанию.
Глобальное включение:
{
channels: {
slack: {
capabilities: {
interactiveReplies: true,
},
},
},
}
Включение только для одного аккаунта Slack:
{
channels: {
slack: {
accounts: {
ops: {
capabilities: {
interactiveReplies: true,
},
},
},
},
},
}
При включении агенты могут использовать Slack-специфичные директивы ответов:
[[slack_buttons: Approve:approve, Reject:reject]][[slack_select: Choose a target | Canary:canary, Production:production]]
Эти директивы компилируются в Slack Block Kit, а клики/выборы маршрутизируются через существующий обработчик Slack interaction event.
Замечания:
- Это Slack-специфичный UI. Другие каналы не транслируют директивы Slack Block Kit в свои кнопочные системы.
- Callback-значения интерактивных элементов — это непрозрачные токены OpenClaw, а не значения, заданные агентом.
- Если сгенерированные интерактивные блоки превышают лимиты Slack Block Kit, OpenClaw откатывается к обычному текстовому ответу.
Настройки слеш-команд по умолчанию:
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
Сессии слеш-команд используют изолированные ключи:
agent:<agentId>:slack:slash:<userId>
и маршрутизируют выполнение команды в целевую сессию разговора (CommandTargetSessionKey).
Тредирование, сессии и теги ответов
- ЛС маршрутизируются как
direct; каналы какchannel; MPIM какgroup. - При
session.dmScope=mainSlack ЛС сводятся к основной сессии агента. - Сессии каналов:
agent:<agentId>:slack:channel:<channelId>. - Ответы в тредах могут создавать суффиксы сессий (
:thread:<threadTs>). channels.slack.thread.historyScopeпо умолчаниюthread;thread.inheritParentпо умолчаниюfalse.channels.slack.thread.initialHistoryLimitопределяет, сколько существующих сообщений треда загружается при старте новой сессии треда (по умолчанию20; установите0для отключения).
Управление тредированием ответов:
channels.slack.replyToMode:off|first|all(по умолчаниюoff)channels.slack.replyToModeByChatType: по типуdirect|group|channel- устаревший резерв для прямых чатов:
channels.slack.dm.replyToMode
Поддерживаются ручные теги ответов:
[[reply_to_current]][[reply_to:<id>]]
Примечание:
replyToMode="off"отключает всё тредирование ответов в Slack, включая явные теги[[reply_to_*]]. Это отличается от Telegram, где явные теги по-прежнему обрабатываются в режиме"off". Различие отражает модели тредирования платформ: в Slack треды скрывают сообщения из канала, тогда как ответы Telegram остаются видны в основном потоке чата.
Медиа, чанкинг и доставка
Входящие вложения
Файловые вложения Slack загружаются с приватных URL Slack (запрос с аутентификацией по токену) и записываются в хранилище медиа при успешной загрузке и соблюдении лимитов размера.
Лимит входящего размера по умолчанию — `20MB`, если не переопределён через `channels.slack.mediaMaxMb`.
Исходящий текст и файлы
- текстовые чанки используют `channels.slack.textChunkLimit` (по умолчанию 4000)
- `channels.slack.chunkMode="newline"` включает разделение по абзацам в первую очередь
- отправка файлов использует Slack upload API и может включать ответы в тредах (`thread_ts`)
- лимит исходящих медиа определяется `channels.slack.mediaMaxMb` (при настройке); иначе используются MIME-зависимые значения по умолчанию из пайплайна медиа
Адресаты доставки
Предпочтительные явные адресаты:
- `user:<id>` для ЛС
- `channel:<id>` для каналов
ЛС Slack открываются через Slack conversation API при отправке пользовательским адресатам.
Действия и шлюзы
Действия Slack управляются через channels.slack.actions.*.
Доступные группы действий в текущем инструментарии Slack:
| Группа | По умолчанию |
|---|---|
| messages | включено |
| reactions | включено |
| pins | включено |
| memberInfo | включено |
| emojiList | включено |
События и операционное поведение
- Редактирования/удаления/трансляции тредов сообщений преобразуются в системные события.
- Добавление/удаление реакций преобразуются в системные события.
- События вступления/выхода участников, создания/переименования каналов и добавления/удаления закреплений преобразуются в системные события.
- Обновления статуса assistant thread (для индикаторов «печатает…» в тредах) используют
assistant.threads.setStatusи требуют bot scopeassistant:write. channel_id_changedможет мигрировать ключи конфигурации каналов при включённомconfigWrites.- Метаданные темы/назначения канала обрабатываются как ненадёжный контекст и могут внедряться в контекст маршрутизации.
- Block actions и modal interactions генерируют структурированные системные события
Slack interaction: ...с развёрнутыми полями:- block actions: выбранные значения, метки, значения picker и метаданные
workflow_* - modal
view_submissionиview_closedс метаданными маршрутизированного канала и вводами форм
- block actions: выбранные значения, метки, значения picker и метаданные
Реакция подтверждения
ackReaction отправляет эмодзи подтверждения, пока OpenClaw обрабатывает входящее сообщение.
Порядок разрешения:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- резервный эмодзи из идентичности агента (
agents.list[].identity.emoji, иначе ”👀”)
Замечания:
- Slack ожидает shortcode (например
"eyes"). - Используйте
""для отключения реакции для аккаунта Slack или глобально.
Резервная реакция набора текста
typingReaction добавляет временную реакцию на входящее Slack-сообщение, пока OpenClaw обрабатывает ответ, и удаляет её по завершении. Это полезный резервный вариант, когда нативный assistant typing Slack недоступен, особенно в ЛС.
Порядок разрешения:
channels.slack.accounts.<accountId>.typingReactionchannels.slack.typingReaction
Замечания:
- Slack ожидает shortcode (например
"hourglass_flowing_sand"). - Реакция добавляется по принципу best-effort, и очистка выполняется автоматически после ответа или завершения с ошибкой.
Манифест и чеклист областей
Пример манифеста Slack-приложения
{
"display_information": {
"name": "OpenClaw",
"description": "Slack connector for OpenClaw"
},
"features": {
"bot_user": {
"display_name": "OpenClaw",
"always_online": false
},
"app_home": {
"messages_tab_enabled": true,
"messages_tab_read_only_enabled": false
},
"slash_commands": [
{
"command": "/openclaw",
"description": "Send a message to OpenClaw",
"should_escape": false
}
]
},
"oauth_config": {
"scopes": {
"bot": [
"chat:write",
"channels:history",
"channels:read",
"groups:history",
"im:history",
"im:read",
"im:write",
"mpim:history",
"mpim:read",
"mpim:write",
"users:read",
"app_mentions:read",
"assistant:write",
"reactions:read",
"reactions:write",
"pins:read",
"pins:write",
"emoji:read",
"commands",
"files:read",
"files:write"
]
}
},
"settings": {
"socket_mode_enabled": true,
"event_subscriptions": {
"bot_events": [
"app_mention",
"message.channels",
"message.groups",
"message.im",
"message.mpim",
"reaction_added",
"reaction_removed",
"member_joined_channel",
"member_left_channel",
"channel_rename",
"pin_added",
"pin_removed"
]
}
}
}
Опциональные области user-token (операции чтения)
Если вы настраиваете `channels.slack.userToken`, типичные области чтения:
- `channels:history`, `groups:history`, `im:history`, `mpim:history`
- `channels:read`, `groups:read`, `im:read`, `mpim:read`
- `users:read`
- `reactions:read`
- `pins:read`
- `emoji:read`
- `search:read` (если вам нужен поиск Slack)
Устранение неполадок
Нет ответов в каналах
Проверьте по порядку:
- `groupPolicy`
- allowlist каналов (`channels.slack.channels`)
- `requireMention`
- allowlist `users` для канала
Полезные команды:
openclaw channels status --probe
openclaw logs --follow
openclaw doctor
Сообщения в ЛС игнорируются
Проверьте:
- `channels.slack.dm.enabled`
- `channels.slack.dmPolicy` (или устаревшее `channels.slack.dm.policy`)
- одобрения спаривания / записи allowlist
openclaw pairing list slack
Socket mode не подключается
Проверьте bot + app токены и включение Socket Mode в настройках Slack-приложения.
HTTP-режим не получает события
Проверьте:
- signing secret
- webhook path
- Slack Request URL (Events + Interactivity + Slash Commands)
- уникальный `webhookPath` для каждого HTTP-аккаунта
Нативные/слеш-команды не срабатывают
Определите, что вы подразумевали:
- режим нативных команд (`channels.slack.commands.native: true`) с зарегистрированными слеш-командами в Slack
- или режим одиночной слеш-команды (`channels.slack.slashCommand.enabled: true`)
Также проверьте `commands.useAccessGroups` и allowlist каналов/пользователей.
Текстовый стриминг
OpenClaw поддерживает нативный текстовый стриминг Slack через Agents and AI Apps API.
channels.slack.streaming управляет поведением живого предпросмотра:
off: отключить потоковый предпросмотр.partial(по умолчанию): заменять превью-текст последним частичным выводом.block: добавлять обновления предпросмотра блоками.progress: показывать текст прогресса при генерации, затем отправить финальный текст.
channels.slack.nativeStreaming управляет нативным Slack streaming API (chat.startStream / chat.appendStream / chat.stopStream) при streaming равном partial (по умолчанию: true).
Отключение нативного стриминга Slack (с сохранением поведения превью):
channels:
slack:
streaming: partial
nativeStreaming: false
Устаревшие ключи:
channels.slack.streamMode(replace | status_final | append) автоматически мигрируется вchannels.slack.streaming.- Булевое
channels.slack.streamingавтоматически мигрируется вchannels.slack.nativeStreaming.
Требования
- Включите Agents and AI Apps в настройках Slack-приложения.
- Убедитесь, что приложение имеет область
assistant:write. - Для сообщения должен быть доступен тред ответа. Выбор треда по-прежнему определяется
replyToMode.
Поведение
- Первый текстовый чанк запускает стрим (
chat.startStream). - Последующие чанки добавляются к тому же стриму (
chat.appendStream). - Конец ответа завершает стрим (
chat.stopStream). - Медиа и нетекстовые полезные нагрузки доставляются стандартным способом.
- При ошибке стриминга посреди ответа OpenClaw откатывается к стандартной доставке для оставшихся полезных нагрузок.
Указатели на справочник конфигурации
Основной справочник:
-
Справочник конфигурации - Slack
Ключевые поля Slack:
- режим/авторизация:
mode,botToken,appToken,signingSecret,webhookPath,accounts.* - доступ к ЛС:
dm.enabled,dmPolicy,allowFrom(устаревшее:dm.policy,dm.allowFrom),dm.groupEnabled,dm.groupChannels - переключатель совместимости:
dangerouslyAllowNameMatching(аварийный; держите выключенным, если не требуется) - доступ к каналам:
groupPolicy,channels.*,channels.*.users,channels.*.requireMention - тредирование/история:
replyToMode,replyToModeByChatType,thread.*,historyLimit,dmHistoryLimit,dms.*.historyLimit - доставка:
textChunkLimit,chunkMode,mediaMaxMb,streaming,nativeStreaming - операции/функции:
configWrites,commands.native,slashCommand.*,actions.*,userToken,userTokenReadOnly
- режим/авторизация: