Slack

Статус: готов к продакшну для ЛС и каналов через Slack-приложения. По умолчанию используется Socket Mode; режим HTTP Events API также поддерживается.

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

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: 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 загружаются с приватных 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 scope assistant:write.
  • channel_id_changed может мигрировать ключи конфигурации каналов при включённом configWrites.
  • Метаданные темы/назначения канала обрабатываются как ненадёжный контекст и могут внедряться в контекст маршрутизации.
  • Block actions и modal interactions генерируют структурированные системные события Slack interaction: ... с развёрнутыми полями:
    • block actions: выбранные значения, метки, значения picker и метаданные workflow_*
    • modal view_submission и view_closed с метаданными маршрутизированного канала и вводами форм

Реакция подтверждения

ackReaction отправляет эмодзи подтверждения, пока OpenClaw обрабатывает входящее сообщение.

Порядок разрешения:

  • channels.slack.accounts.<accountId>.ackReaction
  • channels.slack.ackReaction
  • messages.ackReaction
  • резервный эмодзи из идентичности агента (agents.list[].identity.emoji, иначе ”👀”)

Замечания:

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

Резервная реакция набора текста

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

Порядок разрешения:

  • channels.slack.accounts.<accountId>.typingReaction
  • channels.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.

Требования

  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

Связанные разделы