Платформы обмена сообщениями

Slack

Статус: готово к работе в продакшене для личных сообщений и каналов через интеграции приложения Slack. Режим по умолчанию — Socket Mode; также поддерживается режим HTTP Events API.

Быстрая настройка

{
  channels: {
    slack: {
      enabled: true,
      mode: "socket",
      appToken: "xapp-...",
      botToken: "xoxb-...",
    },
  },
}

Модель токенов

  • Для 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 (по умолчанию)
  • allowlist
  • open (требует, чтобы 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 <code>.

Команды и поведение слэш-команд

  • Автоматический режим нативных команд отключён для Slack (commands.native: "auto" не включает нативные команды Slack).
  • Включите обработчики нативных команд Slack с помощью channels.slack.commands.native: true (или глобально commands.native: true).
  • Когда нативные команды включены, зарегистрируйте соответствующие слэш-команды в Slack (имена /<command>), за одним исключением:
    • зарегистрируйте /agentstatus для команды статуса (Slack резервирует /status)
  • Если нативные команды не включены, вы можете выполнить одну настроенную слэш-команду через channels.slack.slashCommand.
  • Меню аргументов нативных команд теперь адаптируют свою стратегию отображения:
    • до 5 вариантов: блоки кнопок
    • 6-100 вариантов: статическое выпадающее меню
    • более 100 вариантов: внешнее выпадающее меню с асинхронной фильтрацией вариантов, когда доступны обработчики опций интерактивности
    • если закодированные значения вариантов превышают лимиты Slack, процесс возвращается к кнопкам
  • Для длинных полезных нагрузок опций меню аргументов слэш-команд используют диалог подтверждения перед отправкой выбранного значения.

Настройки слэш-команды по умолчанию:

  • enabled: false
  • name: "openclaw"
  • sessionPrefix: "slack:slash"
  • ephemeral: true

Сессии слэш-команд используют изолированные ключи:

  • agent:<agentId>:slack:slash:<userId>

и всё ещё направляют выполнение команды в сессию целевого разговора (CommandTargetSessionKey).

Ветки обсуждений, сессии и теги ответов

  • Личные сообщения маршрутизируются как direct; каналы как channel; MPIM как group.
  • При настройке по умолчанию session.dmScope=main личные сообщения Slack объединяются в основную сессию агента.
  • Сессии каналов: 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 контролируются 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.<accountId>.ackReaction
  • channels.slack.ackReaction
  • messages.ackReaction
  • резервный вариант эмодзи идентификатора агента (agents.list[].identity.emoji, иначе ”👀”)

Примечания:

  • Slack ожидает короткие коды (например, "eyes").
  • Используйте "", чтобы отключить реакцию для аккаунта Slack или глобально.

Резервный вариант реакции "печатает"

typingReaction добавляет временную реакцию к входящему сообщению Slack, пока OpenClaw обрабатывает ответ, а затем удаляет её по завершении выполнения. Это полезный резервный вариант, когда нативная индикация печати ассистента Slack недоступна, особенно в личных сообщениях. Порядок разрешения:

  • channels.slack.accounts.<accountId>.typingReaction
  • channels.slack.typingReaction

Примечания:

  • Slack ожидает короткие коды (например, "hourglass_flowing_sand").
  • Реакция выполняется по принципу best-effort, и очистка автоматически предпринимается после завершения ответа или пути сбоя.

Манифест и контрольный список областей видимости

Диагностика проблем

Потоковая передача текста

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.

Требования

  1. Включите Agents and AI Apps в настройках вашего приложения Slack.
  2. Убедитесь, что у приложения есть область видимости assistant:write.
  3. Для этого сообщения должна быть доступна ветка ответов. Выбор ветки всё ещё следует 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

Связанные темы

Synology ChatTelegram