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

Slack

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

Сполучення

Приватні повідомлення Slack типово працюють у режимі сполучення.

Slash-команди

Нативна поведінка команд і каталог команд.

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

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

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

1

Створіть новий застосунок Slack

У налаштуваннях застосунку Slack натисніть кнопку Create New App:
  • виберіть from a manifest і виберіть робочий простір для вашого застосунку
  • вставте приклад manifest нижче та продовжте створення
  • згенеруйте App-Level 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

Запустіть gateway

openclaw gateway

Контрольний список manifest і scope

{
  "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"
      ]
    }
  }
}
Додайте bot scope chat:write.customize, якщо хочете, щоб вихідні повідомлення використовували ідентичність активного агента (власне ім’я користувача та значок) замість типової ідентичності застосунку Slack.Якщо ви використовуєте значок emoji, Slack очікує синтаксис :emoji_name:.
Якщо ви налаштовуєте channels.slack.userToken, типовими scopes для читання є:
  • 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 search)

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

  • 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).
Поведінка знімка статусу:
  • Перевірка облікового запису Slack відстежує поля *Source і *Status для кожного облікового запису (botToken, appToken, signingSecret, userToken).
  • Статус може бути available, configured_unavailable або missing.
  • configured_unavailable означає, що обліковий запис налаштовано через SecretRef або інше не вбудоване джерело секрету, але поточна команда/шлях виконання не зміг визначити фактичне значення.
  • У режимі HTTP включається signingSecretStatus; у Socket Mode обов’язковою парою є botTokenStatus + appTokenStatus.
Для дій/читання каталогу user token може мати пріоритет, якщо його налаштовано. Для запису bot token залишається пріоритетним; запис через user token дозволено лише коли userTokenReadOnly: false і bot token недоступний.

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

Дії 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>.

Треди, сесії та теги reply

  • Приватні повідомлення маршрутизуються як 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.thread.requireExplicitMention (типово false): коли має значення true, пригнічує неявні згадки в тредах, тож бот відповідає лише на явні згадки @bot усередині тредів, навіть якщо бот уже брав участь у треді. Без цього відповіді в треді, де брав участь бот, обходять обмеження requireMention.
Елементи керування тредами відповідей:
  • channels.slack.replyToMode: off|first|all|batched (типово off)
  • channels.slack.replyToModeByChatType: для кожного direct|group|channel
  • застаріле резервне значення для прямих чатів: channels.slack.dm.replyToMode
Підтримуються ручні теги reply:
  • [[reply_to_current]]
  • [[reply_to:<id>]]
Примітка: replyToMode="off" вимикає усі треди відповідей у Slack, включно з явними тегами [[reply_to_*]]. Це відрізняється від Telegram, де явні теги все одно враховуються в режимі "off". Різниця відображає моделі тредів платформ: у Slack треди приховують повідомлення з каналу, тоді як у Telegram replies залишаються видимими в основному потоці чату.

Ack-реакції

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

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

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

Резервний варіант з typing reaction

typingReaction додає тимчасову реакцію до вхідного повідомлення Slack, поки OpenClaw обробляє відповідь, а потім видаляє її після завершення виконання. Це найкорисніше поза відповідями в тредах, де використовується типовий індикатор стану “is typing…”. Порядок визначення:
  • channels.slack.accounts.<accountId>.typingReaction
  • channels.slack.typingReaction
Примітки:
  • Slack очікує shortcodes (наприклад, "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-kind із конвеєра медіа
Бажані явні цілі:
  • 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 для команди status (Slack резервує /status)
  • Якщо нативні команди не ввімкнено, можна запускати одну налаштовану slash-команду через channels.slack.slashCommand.
  • Нативні меню аргументів тепер адаптують свою стратегію відображення:
    • до 5 варіантів: блоки кнопок
    • 6-100 варіантів: статичне меню вибору
    • понад 100 варіантів: зовнішній вибір з асинхронною фільтрацією варіантів, якщо доступні обробники параметрів interactivity
    • якщо закодовані значення варіантів перевищують обмеження Slack, потік повертається до кнопок
  • Для довгих корисних навантажень варіантів меню аргументів 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 повернеться до початкової текстової відповіді замість надсилання недійсного корисного навантаження blocks.

Погодження exec у Slack

Slack може діяти як нативний клієнт погодження з інтерактивними кнопками та взаємодіями замість повернення до Web UI або термінала.
  • Погодження exec використовують channels.slack.execApprovals.* для нативної маршрутизації до приватних повідомлень/каналів.
  • Погодження plugin також можуть визначатися через ту саму поверхню нативних кнопок Slack, коли запит уже надходить у Slack, а тип ID погодження — plugin:.
  • Авторизація того, хто погоджує, як і раніше, примусово застосовується: лише користувачі, визначені як approvers, можуть погоджувати або відхиляти запити через Slack.
Це використовує ту саму спільну поверхню кнопок погодження, що й інші канали. Коли interactivity увімкнено в налаштуваннях вашого застосунку Slack, запити на погодження відображаються як кнопки 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" і визначається принаймні один approver. Установіть enabled: false, щоб явно вимкнути Slack як нативний клієнт погодження. Установіть enabled: true, щоб примусово ввімкнути нативні погодження, коли approvers визначаються. Типова поведінка без явної конфігурації погодження exec для Slack:
{
  commands: {
    ownerAllowFrom: ["slack:U12345678"],
  },
}
Явна нативна конфігурація Slack потрібна лише тоді, коли ви хочете перевизначити approvers, додати фільтри або вибрати доставку в чат походження:
{
  channels: {
    slack: {
      execApprovals: {
        enabled: true,
        approvers: ["U12345678"],
        target: "both",
      },
    },
  },
}
Спільне переспрямування approvals.exec є окремим. Використовуйте його лише тоді, коли запити на погодження exec також мають маршрутизуватися до інших чатів або явних цілей поза основним каналом. Спільне переспрямування approvals.plugin також є окремим; нативні кнопки Slack усе ще можуть визначати погодження plugin, коли ці запити вже надходять у Slack. Команда /approve у тому самому чаті також працює в каналах і приватних повідомленнях Slack, які вже підтримують команди. Див. Погодження exec, щоб ознайомитися з повною моделлю переспрямування погоджень.

Події та операційна поведінка

  • Редагування/видалення повідомлень і трансляції тредів зіставляються із системними подіями.
  • Події додавання/видалення реакцій зіставляються із системними подіями.
  • Події входу/виходу учасників, створення/перейменування каналів і додавання/видалення закріплень зіставляються із системними подіями.
  • channel_id_changed може мігрувати ключі конфігурації каналу, коли ввімкнено configWrites.
  • Метадані теми/призначення каналу вважаються недовіреним контекстом і можуть бути ін’єктовані в контекст маршрутизації.
  • Початкове повідомлення треду та початкове заповнення контексту історії треду фільтруються відповідно до налаштованих allowlist відправників, де це застосовно.
  • Дії block і взаємодії modal створюють структуровані системні події Slack interaction: ... із насиченими полями корисного навантаження:
    • дії block: вибрані значення, мітки, значення picker і метадані workflow_*
    • події modal 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
Перевірте bot token + app token і ввімкнення Socket Mode в налаштуваннях застосунку Slack.Якщо openclaw channels status --probe --json показує botTokenStatus або appTokenStatus: "configured_unavailable", обліковий запис Slack налаштовано, але поточне середовище виконання не змогло визначити значення, що підтримується SecretRef.
Перевірте:
  • signing secret
  • шлях webhook
  • Slack Request URLs (Events + Interactivity + Slash Commands)
  • унікальний webhookPath для кожного HTTP-облікового запису
Якщо signingSecretStatus: "configured_unavailable" з’являється у знімках облікового запису, HTTP-обліковий запис налаштовано, але поточне середовище виконання не змогло визначити signing secret, що підтримується SecretRef.
Перевірте, чи ви справді мали на увазі:
  • режим нативних команд (channels.slack.commands.native: true) з відповідними slash-командами, зареєстрованими у Slack
  • або режим однієї slash-команди (channels.slack.slashCommand.enabled: true)
Також перевірте commands.useAccessGroups і allowlist каналів/користувачів.

Пов’язані розділи