Платформы обмена сообщениями
Slack
Статус: готово к работе в продакшене для личных сообщений и каналов через интеграции приложения Slack. Режим по умолчанию — Socket Mode; также поддерживается режим HTTP Events API.
Быстрая настройка
Модель токенов
- Для Socket Mode требуются
botToken+appToken. - Для HTTP режима требуются
botToken+signingSecret. - Токены из конфигурации переопределяют значения из переменных окружения.
- Переменные окружения
SLACK_BOT_TOKEN/SLACK_APP_TOKENиспользуются только для аккаунта по умолчанию. userToken(xoxp-...) задаётся только в конфигурации (без переменной окружения) и по умолчанию работает в режиме только для чтения (userTokenReadOnly: true).- Опционально: добавьте
chat:write.customize, если хотите, чтобы исходящие сообщения использовали идентификатор активного агента (пользовательскиеusernameи иконка). Дляicon_emojiиспользуется синтаксис:emoji_name:.
💡 Для действий/чтения директории может быть предпочтительным использование пользовательского токена, если он настроен. Для записи предпочтительным остаётся токен бота; запись с пользовательским токеном разреше на только при
userTokenReadOnly: falseи недоступности токена бота.
Контроль доступа и маршрутизация
channels.slack.dmPolicy управляет доступом к личным сообщениям (устаревшее: channels.slack.dm.policy):
pairing(по умолчанию)allowlistopen(требует, чтобыchannels.slack.allowFromвключал"*"; устаревшее:channels.slack.dm.allowFrom)disabled
Флаги для личных сообщений:
dm.enabled(по умолчанию true)channels.slack.allowFrom(предпочтительный)dm.allowFrom(устаревший)dm.groupEnabled(групповые личные сообщения по умолчанию false)dm.groupChannels(опциональный разрешительный список MPIM)
Приоритет для нескольких аккаунтов:
channels.slack.accounts.default.allowFromприменяется только к аккаунтуdefault.- Именованные аккаунты наследуют
channels.slack.allowFrom, если их собственныйallowFromне задан. - Именованные аккаунты не наследуют
channels.slack.accounts.default.allowFrom.
Связывание в личных сообщениях использует команду openclaw pairing approve slack .
channels.slack.groupPolicy управляет обработкой каналов:
openallowlistdisabled
Разрешительный список каналов находится в channels.slack.channels.
Примечание для времени выполнения: если channels.slack полностью отсутствует (настройка только через env), среда выполнения возвращается к groupPolicy="allowlist" и выводит предупреждение (даже если задан channels.defaults.groupPolicy).
Разрешение имён/ID:
- записи в разрешительном списке каналов и личных сообщений разрешаются при запуске, если доступ по токену позволяет
- неразрешённые записи сохраняются в том виде, в котором сконфигурированы
- сопоставление для входящей авторизации по умолчанию сначала по ID; прямое сопоставление по имени пользователя/слагу требует
channels.slack.dangerouslyAllowNameMatching: true
Сообщения в каналах по умолчанию требуют упоминания. Источники упоми нания:
- явное упоминание приложения (
<@botId>) - шаблоны регулярных выражений для упоминаний (
agents.list[].groupChat.mentionPatterns, резервный вариантmessages.groupChat.mentionPatterns) - неявное поведение ответа боту в ветке обсуждения
Контроль для каждого канала (channels.slack.channels.<id|name>):
requireMentionusers(разрешительный список)allowBotsskillssystemPrompttools,toolsBySender- Формат ключа
toolsBySender:id:,e164:,username:,name:или подстановочный знак"*"(устаревшие ключи без префикса всё ещё сопоставляются только сid:)
Команды и поведение слэш-команд
- Автоматический режим нативных команд отключён для Slack (
commands.native: "auto"не включает нативные команды Slack). - Включите обработчики нативных команд Slack с помощью
channels.slack.commands.native: true(или глобальноcommands.native: true). - Когда нативные команды включены, зарегистрируйте соответствующие слэш-команды в Slack (имена
/), за одним исключением:- зарегистрируйте
/agentstatusдля команды статуса (Slack резервирует/status)
- зарегистрируйте
- Если нативные команды не включены, вы можете выполнить одну настроенную слэш-команду через
channels.slack.slashCommand. - Меню аргументов нативных команд теперь адаптируют свою стратегию отображения:
- до 5 вариантов: блоки кнопок
- 6-100 вариантов: статическое выпадающее меню
- более 100 вариантов: внешнее выпадающее меню с асинхронной фильтрацией вариантов, когда доступны обработчики опций интерактивности
- если закодированные значения вариантов превышают лимиты Slack, процесс возвращается к кнопкам
- Для длинных полезных нагрузок опций меню аргументов слэш-команд используют диалог подтверждения перед отправкой выбранного значения.
Настройки слэш-команды по умолчанию:
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
Сессии слэш-команд используют изолированные ключи:
agent::slack:slash:
и всё ещё направляют выполнение команды в сессию целевого разговора (CommandTargetSessionKey).
Ветки обсуждений, сессии и теги ответов
- Личные сообщения маршрутизируются как
direct; каналы какchannel; MPIM какgroup. - При настройке по умолчанию
session.dmScope=mainличные сообщения Slack объединяются в основную сессию агента. - Сессии каналов:
agent::slack:channel:. - Ответы в ветке могут создавать суффиксы сессии ветки (
:thread:), когда это применимо. 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:]]
Примечание: replyToMode="off" отключает все ветки ответов в Slack, включая явные теги [[reply_to_*]]. Это отличается от Telegram, где явные теги всё ещё учитываются в режиме "off". Разница отражает модели ветвления платформ: ветки Slack скрывают сообщения от канала, в то время как ответы Telegram остаются видимыми в основном потоке чата.
Медиа, разбиение на части и доставка
Вложения файлов Slack загружаются с приватных URL-адресов, размещённых в Slack (поток запроса с аутентификацией по токену), и записываются в хранилище медиа при успешной загрузке и соблюдении ограничений размера.
Верхний предел размера для входящих данных по умолчанию — 20MB, если не переопределён channels.slack.mediaMaxMb.
- части текста используют
channels.slack.textChunkLimit(по умолчанию 4000) channels.slack.chunkMode="newline"включает разбиение сначала по абзацам- отправка файлов использует API загрузки Slack и может включать ответы в ветке (
thread_ts) - верхний предел для исходящих медиа следует
channels.slack.mediaMaxMb, если настроено; в противном случае отправка в канал использует значения по умолчанию для типа MIME из конвейера медиа
Предпочтительные явные цели:
user:для личных сообщенийchannel:для каналов
Личные сообщения Slack открываются через API разговоров Slack при отправке пользователям.
Действия и шлюзы
Действия Slack контролируются channels.slack.actions.*. Доступные группы действий в текущем инструментарии Slack:
| Группа | По умолчанию |
|---|---|
| messages | включено |
| reactions | включено |
| pins | включено |
| memberInfo | включено |
| emojiList | включено |
События и операционное поведение
- Редактирование/удаление сообщений и широковещательные рассылки в ветках преобразуются в системные события.
- События добавления/удаления реакции преобразуются в системные события.
- События присоединения/выхода участника, создания/переименования канала и добавления/удаления закрепления преобразуются в системные события.
- Обновления статуса ветки ассистента (для индикаторов "печатает..." в ветках) используют
assistant.threads.setStatusи требуют области видимости ботаassistant:write. channel_id_changedможет переносить ключи конфигурации канала при включённомconfigWrites.- Метаданные темы/цели канала рассматриваются как ненадёжный контекст и могут быть внедрены в контекст маршрутизации.
- Действия с блоками и модальные взаимодействия генерируют структурированные системные события
Slack interaction: ...с богатыми полями полезной нагрузки:- действия с блоками: выбранные значения, метки, значения средства выбора и метаданные
workflow_* - события модального окна
view_submissionиview_closedс метаданными маршрутизированного канала и вводами формы
- действия с блоками: выбранные значения, метки, значения средства выбора и метаданные
Реакции подтверждения
ackReaction отправляет эмодзи подтверждения, пока OpenClaw обрабатывает входящее сообщение. Порядок разрешения:
channels.slack.accounts..ackReactionchannels.slack.ackReactionmessages.ackReaction- резервный вариант эмодзи идентификатора агента (
agents.list[].identity.emoji, иначе ”👀”)
Примечания:
- Slack ожидает короткие коды (например,
"eyes"). - Используйте
"", чтобы отключить реакцию для аккаунта Slack или глобально.
Резервный вариант реакции "печатает"
typingReaction добавляет временную реакцию к входящему сообщению Slack, пока OpenClaw обрабатывает ответ, а затем удаляет её по завершении выполнения. Это полезный резервный вариант, когда нативная индикация печати ассистента Slack недоступна, особенно в личных сообщениях. Порядок разрешения:
channels.slack.accounts..typingReactionchannels.slack.typingReaction
Примечания:
- Slack ожидает короткие коды (например,
"hourglass_flowing_sand"). - Реакция выполняется по принципу best-effort, и очистка автомати чески предпринимается после завершения ответа или пути сбоя.
Манифест и контрольный список областей видимости
{
"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"
]
}
}
}
Если вы настраиваете channels.slack.userToken, типичные области видимости для чтения:
channels:history,groups:history,im:history,mpim:historychannels:read,groups:read,im:read,mpim:readusers:readreactions:readpins:reademoji:readsearch:read(если вы зависите от поиска в Slack)
Диагностика проблем
Проверьте по порядку:
groupPolicy- разрешительный список каналов (
channels.slack.channels) requireMention- разрешительный список
usersдля каждого канала
Полезные команды:
openclaw channels status --probe
openclaw logs --follow
openclaw doctor
Проверьте:
channels.slack.dm.enabledchannels.slack.dmPolicy(или устаревшееchannels.slack.dm.policy)- подтверждения связывания / записи в разрешительном списке
openclaw pairing list slack
Проверьте токены бота и приложения, а также включение Socket Mode в настройках приложения Slack.
Проверьте:
- секрет подписи
- путь вебхука
- URL-адреса запросов Slack (Events + Interactivity + Slash Commands)
- уникальный
webhookPathдля каждого HTTP-аккаунта
Убедитесь, что вы планировали:
- режим нативных команд (
channels.slack.commands.native: true) с соответствующими зарегистрированными слэш-командами в Slack - или режим одиночной слэш-команды (
channels.slack.slashCommand.enabled: true)
Также проверьте commands.useAccessGroups и разрешительные списки каналов/пользователей.
Потоковая передача текста
OpenClaw поддерживает нативную потоковую передачу текста Slack через API Agents and AI Apps. channels.slack.streaming управляет поведением живого предпросмотра:
off: отключить потоковую передачу живого предпросмотра.partial(по умолчанию): заменять текст предпросмотра последним частичным выводом.block: добавлять обновления предпросмотра частями.progress: показывать текст статуса выполнения во время генерации, затем о тправлять окончательный текст.
channels.slack.nativeStreaming управляет нативным потоковым API Slack (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
- режим/аутентификация: