Перейти до основного вмісту

Slack

Статус: готовий до використання у production для особистих повідомлень і каналів через інтеграції застосунку Slack. Типовий режим — Socket Mode; режим HTTP Events API також підтримується.

Сполучення

Особисті повідомлення Slack типово використовують режим сполучення.

Slash-команди

Вбудована поведінка команд і каталог команд.

Усунення проблем із каналами

Міжканальна діагностика та сценарії відновлення.

Швидке налаштування

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-...",
    },
  },
}
Резервне значення з env (лише для облікового запису за замовчуванням):
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

Запустіть gateway

openclaw gateway

Контрольний список маніфесту та scope

Приклад маніфесту застосунку Slack

{
  "display_information": {
    "name": "OpenClaw",
    "description": "Slack connector for OpenClaw"
  },
  "features": {
    "bot_user": {
      "display_name": "OpenClaw",
      "always_online": true
    },
    "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": [
        "app_mentions:read",
        "assistant:write",
        "channels:history",
        "channels:read",
        "chat:write",
        "commands",
        "emoji:read",
        "files:read",
        "files:write",
        "groups:history",
        "groups:read",
        "im:history",
        "im:read",
        "im:write",
        "mpim:history",
        "mpim:read",
        "mpim:write",
        "pins:read",
        "pins:write",
        "reactions:read",
        "reactions:write",
        "users:read"
      ]
    }
  },
  "settings": {
    "socket_mode_enabled": true,
    "event_subscriptions": {
      "bot_events": [
        "app_mention",
        "channel_rename",
        "member_joined_channel",
        "member_left_channel",
        "message.channels",
        "message.groups",
        "message.im",
        "message.mpim",
        "pin_added",
        "pin_removed",
        "reaction_added",
        "reaction_removed"
      ]
    }
  }
}
Якщо ви налаштовуєте channels.slack.userToken, типовими scope для читання є:
  • 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)

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

  • botToken + appToken обов’язкові для Socket Mode.
  • HTTP-режим потребує botToken + signingSecret.
  • botToken, appToken, signingSecret і userToken приймають звичайні рядки або об’єкти SecretRef.
  • Токени з конфігурації мають пріоритет над резервними значеннями з env.
  • Резервні значення з env SLACK_BOT_TOKEN / SLACK_APP_TOKEN застосовуються лише до облікового запису за замовчуванням.
  • userToken (xoxp-...) доступний лише в конфігурації (без резервного значення з env) і типово працює в режимі лише для читання (userTokenReadOnly: true).
  • Необов’язково: додайте chat:write.customize, якщо хочете, щоб вихідні повідомлення використовували ідентичність активного агента (власні username та icon). Для icon_emoji використовується синтаксис :emoji_name:.
Поведінка знімка стану:
  • Перевірка облікового запису Slack відстежує поля *Source і *Status для кожних облікових даних (botToken, appToken, signingSecret, userToken).
  • Статус може бути available, configured_unavailable або missing.
  • configured_unavailable означає, що обліковий запис налаштовано через SecretRef або інше не-inline джерело секретів, але поточний шлях команди/виконання не зміг визначити фактичне значення.
  • У HTTP-режимі включається signingSecretStatus; у Socket Mode обов’язковою парою є botTokenStatus + appTokenStatus.
Для дій/читання каталогів за наявності налаштування може надаватися перевага токену користувача. Для запису пріоритетним лишається токен бота; запис через токен користувача дозволено лише коли userTokenReadOnly: false і токен бота недоступний.

Дії та обмеження

Дії Slack контролюються через channels.slack.actions.*. Доступні групи дій у поточному інструментарії Slack:
ГрупаТипово
messagesувімкнено
reactionsувімкнено
pinsувімкнено
memberInfoувімкнено
emojiListувімкнено
Поточні дії з повідомленнями Slack включають send, upload-file, download-file, read, edit, delete, pin, unpin, list-pins, member-info та emoji-list.

Контроль доступу та маршрутизація

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>.

Треди, сесії та теги відповідей

  • Особисті повідомлення маршрутизуються як direct; канали — як channel; MPIM — як group.
  • Із типовим session.dmScope=main особисті повідомлення Slack згортаються до основної сесії агента.
  • Сесії каналів: agent:<agentId>:slack:channel:<channelId>.
  • Відповіді в треді можуть створювати суфікси сесій тредів (:thread:<threadTs>), якщо це застосовно.
  • Типове значення channels.slack.thread.historyScopethread; типове значення thread.inheritParentfalse.
  • channels.slack.thread.initialHistoryLimit визначає, скільки наявних повідомлень треду буде отримано під час запуску нової сесії треду (типово 20; установіть 0, щоб вимкнути).
Параметри тредів відповідей:
  • channels.slack.replyToMode: off|first|all|batched (типово 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 відповіді лишаються видимими в основному потоці чату.

Реакції-підтвердження

ackReaction надсилає emoji-підтвердження, поки OpenClaw обробляє вхідне повідомлення. Порядок визначення:
  • channels.slack.accounts.<accountId>.ackReaction
  • channels.slack.ackReaction
  • messages.ackReaction
  • резервне значення emoji ідентичності агента (agents.list[].identity.emoji, інакше ”👀”)
Примітки:
  • Slack очікує короткі коди (наприклад, "eyes").
  • Використовуйте "", щоб вимкнути реакцію для облікового запису Slack або глобально.

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

channels.slack.streaming контролює поведінку попереднього перегляду в реальному часі:
  • off: вимкнути потоковий попередній перегляд у реальному часі.
  • partial (типово): замінювати текст попереднього перегляду останнім частковим результатом.
  • block: додавати фрагментовані оновлення попереднього перегляду.
  • progress: показувати текст стану прогресу під час генерації, а потім надсилати фінальний текст.
channels.slack.nativeStreaming контролює вбудовану потокову передачу тексту Slack, коли streaming має значення partial (типово: true).
  • Щоб з’явилася вбудована потокова передача тексту, має бути доступний тред відповіді. Вибір треду й далі визначається replyToMode. Без нього використовується звичайний чернетковий попередній перегляд.
  • Для медіа та нетекстових payload використовується звичайна доставка.
  • Якщо потокова передача переривається посеред відповіді, OpenClaw повертається до звичайної доставки для решти payload.
Використовуйте чернетковий попередній перегляд замість вбудованої потокової передачі тексту Slack:
{
  channels: {
    slack: {
      streaming: "partial",
      nativeStreaming: false,
    },
  },
}
Застарілі ключі:
  • channels.slack.streamMode (replace | status_final | append) автоматично мігрується до channels.slack.streaming.
  • булеве значення channels.slack.streaming автоматично мігрується до channels.slack.nativeStreaming.

Резервна реакція друку

typingReaction додає тимчасову реакцію до вхідного повідомлення Slack, поки OpenClaw обробляє відповідь, а потім видаляє її після завершення виконання. Це особливо корисно поза відповідями в тредах, де використовується типовий індикатор стану “друкує…”. Порядок визначення:
  • channels.slack.accounts.<accountId>.typingReaction
  • channels.slack.typingReaction
Примітки:
  • Slack очікує короткі коди (наприклад, "hourglass_flowing_sand").
  • Реакція виконується за принципом best-effort, а очищення автоматично намагається завершитися після відповіді або завершення шляху помилки.

Медіа, розбиття на частини та доставка

Вкладення файлів Slack завантажуються з приватних URL, розміщених у Slack (потік запитів з автентифікацією токеном), і записуються до сховища медіа, якщо отримання успішне та дозволяють обмеження за розміром.Типове обмеження розміру вхідних даних під час виконання — 20MB, якщо його не перевизначено через channels.slack.mediaMaxMb.
  • текстові частини використовують channels.slack.textChunkLimit (типово 4000)
  • channels.slack.chunkMode="newline" вмикає розбиття спершу за абзацами
  • надсилання файлів використовує API завантаження Slack і може включати відповіді в тредах (thread_ts)
  • обмеження вихідних медіа визначається через channels.slack.mediaMaxMb, якщо налаштовано; інакше надсилання в канали використовує типові MIME-обмеження з медіаконвеєра
Рекомендовані явні цілі:
  • user:<id> для особистих повідомлень
  • channel:<id> для каналів
Особисті повідомлення Slack відкриваються через API розмов Slack під час надсилання до цілей користувача.

Команди та поведінка slash-команд

  • Вбудований автоматичний режим команд для Slack вимкнено (commands.native: "auto" не вмикає вбудовані команди Slack).
  • Увімкніть вбудовані обробники команд Slack через channels.slack.commands.native: true (або глобально commands.native: true).
  • Коли вбудовані команди ввімкнено, зареєструйте відповідні slash-команди в Slack (імена /<command>), з одним винятком:
    • зареєструйте /agentstatus для команди стану (Slack резервує /status)
  • Якщо вбудовані команди не ввімкнено, ви можете виконувати одну налаштовану slash-команду через channels.slack.slashCommand.
  • Вбудовані меню аргументів тепер адаптують свою стратегію відображення:
    • до 5 варіантів: блоки кнопок
    • 6-100 варіантів: статичне меню вибору
    • більше 100 варіантів: зовнішній вибір з асинхронною фільтрацією варіантів, якщо доступні обробники параметрів interactivity
    • якщо закодовані значення варіантів перевищують ліміти Slack, потік повертається до кнопок
  • Для довгих payload варіантів меню аргументів slash-команд використовують діалог підтвердження перед передачею вибраного значення.
Типові параметри slash-команд:
  • enabled: false
  • name: "openclaw"
  • sessionPrefix: "slack:slash"
  • ephemeral: true
Сесії slash-команд використовують ізольовані ключі:
  • agent:<agentId>:slack:slash:<userId>
і все одно спрямовують виконання команд до сесії цільової розмови (CommandTargetSessionKey).

Інтерактивні відповіді

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. Примітки:
  • Це UI, специфічний для Slack. Інші канали не перекладають директиви Slack Block Kit у власні системи кнопок.
  • Значення інтерактивних callback — це непрозорі токени, згенеровані OpenClaw, а не сирі значення, створені агентом.
  • Якщо згенеровані інтерактивні блоки перевищують обмеження Slack Block Kit, OpenClaw повертається до початкової текстової відповіді замість надсилання невалідного payload blocks.

Підтвердження exec у Slack

Slack може виступати як вбудований клієнт підтвердження з інтерактивними кнопками та взаємодіями замість повернення до Web UI або термінала.
  • Підтвердження exec використовують channels.slack.execApprovals.* для вбудованої маршрутизації в особисті повідомлення/канали.
  • Підтвердження plugin також можуть визначатися через ту саму вбудовану поверхню кнопок Slack, коли запит уже надходить у Slack, а тип ідентифікатора підтвердження — plugin:.
  • Авторизація затверджувачів і далі примусово застосовується: лише користувачі, визначені як затверджувачі, можуть схвалювати або відхиляти запити через Slack.
Для цього використовується та сама спільна поверхня кнопок підтвердження, що й для інших каналів. Коли у налаштуваннях застосунку Slack увімкнено interactivity, запити на підтвердження відображаються як кнопки Block Kit безпосередньо в розмові. Коли ці кнопки присутні, вони є основним UX підтвердження; OpenClaw має включати ручну команду /approve лише тоді, коли результат інструмента вказує, що підтвердження в чаті недоступні або ручне підтвердження є єдиним шляхом. Шлях конфігурації:
  • channels.slack.execApprovals.enabled
  • channels.slack.execApprovals.approvers (необов’язково; за можливості використовується резервне значення commands.ownerAllowFrom)
  • channels.slack.execApprovals.target (dm | channel | both, типово: dm)
  • agentFilter, sessionFilter
Slack автоматично вмикає вбудовані підтвердження exec, коли enabled не задано або має значення "auto" і визначається принаймні один затверджувач. Установіть enabled: false, щоб явно вимкнути Slack як вбудований клієнт підтвердження. Установіть enabled: true, щоб примусово ввімкнути вбудовані підтвердження, коли затверджувачі визначаються. Типова поведінка без явної конфігурації підтверджень exec для Slack:
{
  commands: {
    ownerAllowFrom: ["slack:U12345678"],
  },
}
Явна вбудована конфігурація Slack потрібна лише тоді, коли ви хочете перевизначити затверджувачів, додати фільтри або використовувати доставку в початковий чат:
{
  channels: {
    slack: {
      execApprovals: {
        enabled: true,
        approvers: ["U12345678"],
        target: "both",
      },
    },
  },
}
Спільне переспрямування approvals.exec є окремим. Використовуйте його лише тоді, коли запити на підтвердження exec також мають маршрутизуватися до інших чатів або явно позасмугових цілей. Спільне переспрямування approvals.plugin також є окремим; вбудовані кнопки Slack все одно можуть визначати підтвердження plugin, коли ці запити вже надходять у Slack. У Slack-каналах і особистих повідомленнях, які вже підтримують команди, також працює /approve у тому самому чаті. Повну модель переспрямування підтверджень див. у Підтвердження exec.

Події та поведінка під час роботи

  • Редагування/видалення повідомлень і thread broadcast відображаються в системні події.
  • Події додавання/видалення реакцій відображаються в системні події.
  • Події входу/виходу учасників, створення/перейменування каналу та додавання/видалення закріплень відображаються в системні події.
  • channel_id_changed може мігрувати ключі конфігурації каналу, якщо ввімкнено configWrites.
  • Метадані topic/purpose каналу вважаються недовіреним контекстом і можуть бути впроваджені в контекст маршрутизації.
  • Початкове повідомлення треду та початкове заповнення контексту історії треду фільтруються за налаштованими allowlist відправників, якщо це застосовно.
  • Дії блоків і взаємодії модальних вікон створюють структуровані системні події Slack interaction: ... із розширеними полями payload:
    • дії блоків: вибрані значення, мітки, значення picker і метадані workflow_*
    • події модальних вікон view_submission і view_closed з маршрутованими метаданими каналу та полями форм

Вказівники на довідник конфігурації

Основний довідник:
  • Довідник конфігурації - Slack Найважливіші поля Slack:
    • mode/auth: 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

Усунення проблем

Перевірте в такому порядку:
  • 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 в налаштуваннях застосунку Slack.Якщо openclaw channels status --probe --json показує botTokenStatus або appTokenStatus: "configured_unavailable", обліковий запис Slack налаштовано, але поточне середовище виконання не змогло визначити значення, що зберігається через SecretRef.
Перевірте:
  • signing secret
  • шлях webhook
  • Slack Request URL (Events + Interactivity + Slash Commands)
  • унікальний webhookPath для кожного HTTP-облікового запису
Якщо signingSecretStatus: "configured_unavailable" з’являється у знімках облікового запису, HTTP-обліковий запис налаштовано, але поточне середовище виконання не змогло визначити signing secret, що зберігається через SecretRef.
Перевірте, що саме ви мали на увазі:
  • режим вбудованих команд (channels.slack.commands.native: true) з відповідними зареєстрованими в Slack slash-командами
  • або режим однієї slash-команди (channels.slack.slashCommand.enabled: true)
Також перевірте commands.useAccessGroups і allowlist каналів/користувачів.

Пов’язане