Mainstream messaging
Slack
Поддержка Slack охватывает личные сообщения и каналы посредством интеграций с приложениями Slack. По умолчанию используется транспорт Socket Mode; также поддерживаются HTTP Request URLs. Режим ретрансляции предназначен для управляемых развертываний, в которых доверенный маршрутизатор отвечает за входящий трафик Slack.
Для личных сообщений Slack по умолчанию используется режим связывания.
Поведение встроенных команд и каталог команд.
Межканальная диагностика и инструкции по устранению неполадок.
Выбор транспорта
Socket Mode и HTTP Request URLs обеспечивают одинаковую функциональность для обмена сообщениями, слеш-команд, App Home и интерактивных возможностей. Выбирайте с учетом архитектуры развертывания, а не функций.
| Аспект | Socket Mode (по умолчанию) | HTTP Request URLs |
|---|---|---|
| Публичный URL Gateway | Не требуется | Требуется (DNS, TLS, обратный прокси-сервер или туннель) |
| Исходящая сеть | Должно быть доступно исходящее WSS-соединение с wss-primary.slack.com |
Без исходящего WS; только входящий HTTPS |
| Необходимые токены | Токен бота + App-Level Token с connections:write |
Токен бота + Signing Secret |
| Ноутбук разработчика / за межсетевым экраном | Работает без дополнительной настройки | Требуется публичный туннель (ngrok, Cloudflare Tunnel, Tailscale Funnel) или промежуточный Gateway |
| Горизонтальное масштабирование | Один сеанс Socket Mode на приложение на каждом хосте; для нескольких Gateway требуются отдельные приложения Slack | Обработчик POST без состояния; несколько реплик Gateway могут совместно использовать одно приложение за балансировщиком нагрузки |
| Несколько учетных записей на одном Gateway | Поддерживается; каждая учетная запись открывает собственное WS-соединение | Поддерживается; каждой учетной записи требуется уникальный webhookPath (по умолчанию /slack/events), чтобы регистрации не конфликтовали |
| Транспорт слеш-команд | Доставка через WS-соединение; slash_commands[].url игнорируется |
Slack отправляет POST на slash_commands[].url; поле обязательно для передачи команды обработчику |
| Подписание запросов | Не используется (аутентификация выполняется посредством App-Level Token) | Slack подписывает каждый запрос; OpenClaw проверяет подпись с помощью signingSecret |
| Восстановление после разрыва соединения | Включено автоматическое переподключение Slack SDK; OpenClaw также перезапускает завершившиеся с ошибкой сеансы Socket Mode с ограниченной экспоненциальной задержкой. Применяются настройки транспорта для тайм-аута pong. | Нет постоянного соединения, которое может разорваться; Slack повторяет каждый запрос отдельно |
Режим ретрансляции
Режим ретрансляции отделяет входящий трафик Slack от Gateway OpenClaw. Доверенный маршрутизатор отвечает за единственное соединение Slack Socket Mode, выбирает целевой Gateway и пересылает типизированное событие через аутентифицированное соединение WebSocket. Gateway по-прежнему использует собственный токен бота для исходящих вызовов Slack Web API.
{ channels: { slack: { mode: "relay", botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" }, relay: { url: "wss://router.example.com/gateway/ws", authToken: { source: "env", provider: "default", id: "SLACK_RELAY_AUTH_TOKEN" }, gatewayId: "team-gateway", }, }, },}URL ретрансляции должен использовать wss://, если только он не указывает на localhost. Рассматривайте токен предъявителя и таблицу маршрутов маршрутизатора как часть границы авторизации Slack: маршрутизируемые события поступают в обычный обработчик сообщений Slack как авторизованные активации. Предоставленный маршрутизатором slack_identity в кадре WebSocket hello может задать исходящие имя пользователя и значок по умолчанию; явно указанная вызывающей стороной идентичность по-прежнему имеет приоритет. Соединение ретрансляции переподключается с той же ограниченной экспоненциальной задержкой, что и Socket Mode, и удаляет предоставленную маршрутизатором идентичность при каждом отключении.
Установки для всей организации Enterprise Grid
Одна учетная запись Slack может получать сообщения из всех рабочих пространств, охваченных
установкой на уровне организации Enterprise Grid. Выберите прямой Socket Mode или HTTP
Request URLs; режим ретрансляции для корпоративных учетных записей не поддерживается. Оба
приведенных ниже манифеста с минимальными привилегиями включают только путь событий V1
message и app_mention, немедленные ответы и реакции состояния,
управляемые прослушивателем.
Socket Mode
{ "display_information": { "name": "OpenClaw", "description": "Slack connector for OpenClaw" }, "features": { "bot_user": { "display_name": "OpenClaw", "always_online": true } }, "oauth_config": { "scopes": { "bot": [ "app_mentions:read", "channels:history", "channels:read", "chat:write", "files:read", "files:write", "groups:history", "groups:read", "im:history", "im:read", "mpim:history", "mpim:read", "reactions:write", "users:read" ] } }, "settings": { "org_deploy_enabled": true, "socket_mode_enabled": true, "event_subscriptions": { "bot_events": [ "app_mention", "message.channels", "message.groups", "message.im", "message.mpim" ] } }}Попросите Enterprise Grid Org Admin или Org Owner одобрить приложение, установить его на
уровне организации и выбрать рабочие пространства, охватываемые установкой.
Перед запуском OpenClaw убедитесь, что приложение доступно во всех нужных рабочих
пространствах. Создайте токен уровня приложения с connections:write для Socket Mode,
затем скопируйте токен бота из установки организации. Настройте учетную запись,
использующую токен бота, установленного на уровне организации:
{ channels: { slack: { enabled: true, mode: "socket", enterpriseOrgInstall: true, appToken: { source: "env", provider: "default", id: "SLACK_APP_TOKEN" }, botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" }, dmPolicy: "open", allowFrom: ["*"], groupPolicy: "allowlist", channels: { C0123456789: { requireMention: true }, }, }, },}HTTP Request URLs
Используйте режим HTTP, если у Gateway есть публичная конечная точка HTTPS и он не открывает
соединение Socket Mode. Замените URL в примере публичным URL Gateway
webhookPath (по умолчанию /slack/events):
{ "display_information": { "name": "OpenClaw", "description": "Slack connector for OpenClaw" }, "features": { "bot_user": { "display_name": "OpenClaw", "always_online": true } }, "oauth_config": { "scopes": { "bot": [ "app_mentions:read", "channels:history", "channels:read", "chat:write", "files:read", "files:write", "groups:history", "groups:read", "im:history", "im:read", "mpim:history", "mpim:read", "reactions:write", "users:read" ] } }, "settings": { "org_deploy_enabled": true, "event_subscriptions": { "request_url": "https://gateway-host.example.com/slack/events", "bot_events": [ "app_mention", "message.channels", "message.groups", "message.im", "message.mpim" ] } }}Попросите Enterprise Grid Org Admin или Org Owner одобрить приложение, установить его на уровне организации и выбрать рабочие пространства, охватываемые установкой. После проверки Request URL службой Slack скопируйте токен бота установки организации и Basic Information -> App Credentials -> Signing Secret приложения. Настройте корпоративную учетную запись с тем же путем Request URL:
{ channels: { slack: { enabled: true, mode: "http", enterpriseOrgInstall: true, botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" }, signingSecret: { source: "env", provider: "default", id: "SLACK_SIGNING_SECRET", }, webhookPath: "/slack/events", dmPolicy: "open", allowFrom: ["*"], groupPolicy: "allowlist", channels: { C0123456789: { requireMention: true }, }, }, },}При запуске OpenClaw проверяет enterpriseOrgInstall с помощью Slack auth.test.
Токен, установленный на уровне организации, без этого флага или токен рабочего пространства
с этим флагом приводят к сбою запуска. Slack остается источником истины в отношении рабочих
пространств, предоставивших доступ установке; затем OpenClaw применяет настроенные политики
каналов, пользователей, личных сообщений и упоминаний к каждому доставленному событию.
Enterprise V1 отклоняет все созданные ботом события message и
app_mention до передачи обработчику независимо от allowBots, поскольку
установки на уровне организации не предоставляют стабильную идентичность бота с привязкой
к рабочему пространству для предотвращения циклов.
Поддержка Enterprise намеренно ограничена прямым Socket Mode или событиями HTTP
message и app_mention и немедленными ответами на них. Режим ретрансляции,
слеш-команды, взаимодействия, App Home, прослушиватели событий реакций, закрепления,
инструменты действий Slack, встроенные одобрения Slack, привязки, доставка из очереди или
по расписанию и проактивная отправка недоступны для корпоративной учетной записи. Исходящие
реакции подтверждения, набора текста и состояния поддерживаются через клиент Slack,
управляемый прослушивателем, и требуют reactions:write; входящие уведомления о реакциях
и инструменты действий с реакциями остаются недоступными.
Немедленные ответы используют стандартное поведение доставки Slack для фрагментов, медиафайлов, метаданных, резервного определения идентичности, разворачивания ссылок и подтверждений, но только пока проверенный клиент, принадлежащий обработчику, остаётся в активном цикле события. Очередь отправки в памяти и записи об участии в обсуждениях разделяются по рабочему пространству этого события; сам клиент никогда не сериализуется и не сохраняется.
Ключи политики каналов и записи dm.groupChannels должны использовать необработанные стабильные идентификаторы каналов Slack или
форму channel:<id>. OpenClaw нормализует обе формы до необработанного идентификатора канала для
сопоставления во время выполнения; префиксы slack:, group: и mpim: приводят к сбою запуска.
Записи политики пользователей должны использовать стабильные идентификаторы пользователей Slack; имена, слаги, отображаемые имена
и адреса электронной почты приводят к сбою запуска. Идентификаторы должны использовать канонический для Slack
префикс и основную часть в верхнем регистре (например, C0123456789 или U0123456789); варианты в нижнем регистре и
короткие похожие значения приводят к сбою запуска. Для корпоративных учётных записей нельзя включить
dangerouslyAllowNameMatching. Для корпоративных учётных записей можно задать глобальный параметр
mentionPatterns.mode, но mentionPatterns.allowIn и
mentionPatterns.denyIn приводят к сбою запуска, поскольку простые идентификаторы каналов Slack не
привязаны к рабочему пространству и могут повторно использоваться в разных рабочих пространствах. Установки в рабочих пространствах
сохраняют существующее поведение шаблонов упоминаний с ограниченной областью действия. Каждое принятое рабочее пространство
получает отдельные идентичности маршрутизации, сеанса, расшифровки, дедупликации, истории и кэша,
даже если идентификаторы Slack совпадают. В потоке message поддерживаются обычные сообщения пользователей
и созданные пользователями события file_share; остальные подтипы сообщений
отклоняются до авторизации или обработки системных событий.
Корпоративные личные сообщения должны быть либо отключены (dm.enabled=false или
dmPolicy="disabled"), либо явно открыты с помощью dmPolicy="open" и
эффективного параметра учётной записи allowFrom, содержащего литерал "*". Пустой
список разрешений или идентификаторы отдельных пользователей без "*" приводят к сбою запуска. Сопряжение и
пользовательские списки разрешений для личных сообщений отклоняются, поскольку идентификаторы пользователей Slack не
привязаны к рабочему пространству в этих хранилищах авторизации. Политики каналов и отправителей
продолжают применяться к сообщениям каналов.
Установка
openclaw plugins install @openclaw/slackplugins install регистрирует и включает плагин. Он не выполняет никаких действий, пока не настроены приложение Slack и параметры каналов ниже. Общие правила установки плагинов см. в разделе Плагины.
Быстрая настройка
Манифесты в этом разделе создают установку с областью действия рабочего пространства. Для установки на уровне всей организации Enterprise Grid вместо этого используйте специальный манифест и рабочий процесс для всей организации.
Режим сокетов (по умолчанию)
Создание нового приложения Slack
Откройте api.slack.com/apps → Create New App → From a manifest → выберите рабочее пространство → вставьте один из приведённых ниже манифестов → Next → Create.
{"display_information": {"name": "OpenClaw","description": "Коннектор Slack для OpenClaw"},"features": {"bot_user": { "display_name": "OpenClaw", "always_online": true },"app_home": {"home_tab_enabled": true,"messages_tab_enabled": true,"messages_tab_read_only_enabled": false},"assistant_view": {"assistant_description": "OpenClaw подключает обсуждения помощника Slack к агентам OpenClaw.","suggested_prompts": [{ "title": "Что вы умеете?", "message": "С чем вы можете мне помочь?" },{"title": "Сводка по этому каналу","message": "Составьте сводку недавней активности в этом канале."},{ "title": "Черновик ответа", "message": "Помогите мне составить черновик ответа." }]},"slash_commands": [{"command": "/openclaw","description": "Отправить сообщение в 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","usergroups:read","users:read"]}},"settings": {"socket_mode_enabled": true,"event_subscriptions": {"bot_events": ["app_home_opened","app_mention","assistant_thread_context_changed","assistant_thread_started","channel_rename","member_joined_channel","member_left_channel","message.channels","message.groups","message.im","message.mpim","pin_added","pin_removed","reaction_added","reaction_removed"]}}}{"display_information": {"name": "OpenClaw","description": "Коннектор Slack для OpenClaw"},"features": {"bot_user": { "display_name": "OpenClaw", "always_online": true },"app_home": {"home_tab_enabled": true,"messages_tab_enabled": true,"messages_tab_read_only_enabled": false},"assistant_view": {"assistant_description": "OpenClaw подключает обсуждения помощника Slack к агентам OpenClaw.","suggested_prompts": [{ "title": "Что вы умеете?", "message": "С чем вы можете мне помочь?" },{"title": "Сводка по этому каналу","message": "Составьте сводку недавней активности в этом канале."},{ "title": "Черновик ответа", "message": "Помогите мне составить черновик ответа." }]},"slash_commands": [{"command": "/openclaw","description": "Отправить сообщение в OpenClaw","should_escape": false}]},"oauth_config": {"scopes": {"bot": ["app_mentions:read","assistant:write","channels:history","channels:read","chat:write","commands","groups:history","groups:read","im:history","im:read","im:write","users:read"]}},"settings": {"socket_mode_enabled": true,"event_subscriptions": {"bot_events": ["app_home_opened","app_mention","assistant_thread_context_changed","assistant_thread_started","message.channels","message.groups","message.im"]}}}После создания приложения в Slack:
- Basic Information -> App-Level Tokens -> Generate Token and Scopes: добавьте
connections:write, сохраните и скопируйте токен уровня приложения. - Install App -> Install to Workspace: скопируйте OAuth-токен пользователя-бота.
Настройка OpenClaw
Рекомендуемая настройка SecretRef:
export SLACK_APP_TOKEN=slack-app-token-exampleexport SLACK_BOT_TOKEN=slack-bot-token-examplecat > slack.socket.patch.json5 <<'JSON5'{channels: {slack: {enabled: true,mode: "socket",appToken: { source: "env", provider: "default", id: "SLACK_APP_TOKEN" },botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" },},},}JSON5openclaw config patch --file ./slack.socket.patch.json5 --dry-runopenclaw config patch --file ./slack.socket.patch.json5Резервный вариант с переменными среды (только для учётной записи по умолчанию):
SLACK_APP_TOKEN=slack-app-token-exampleSLACK_BOT_TOKEN=slack-bot-token-exampleЗапуск Gateway
openclaw gatewayURL-адреса HTTP-запросов
Создание нового приложения Slack
Откройте api.slack.com/apps → Create New App → From a manifest → выберите рабочее пространство → вставьте один из приведённых ниже манифестов → замените https://gateway-host.example.com/slack/events публичным URL-адресом Gateway → Next → Create.
{"display_information": {"name": "OpenClaw","description": "Коннектор Slack для OpenClaw"},"features": {"bot_user": { "display_name": "OpenClaw", "always_online": true },"app_home": {"home_tab_enabled": true,"messages_tab_enabled": true,"messages_tab_read_only_enabled": false},"assistant_view": {"assistant_description": "OpenClaw подключает обсуждения помощника Slack к агентам OpenClaw.","suggested_prompts": [{ "title": "Что вы умеете?", "message": "С чем вы можете мне помочь?" },{"title": "Сводка по этому каналу","message": "Составьте сводку недавней активности в этом канале."},{ "title": "Черновик ответа", "message": "Помогите мне составить черновик ответа." }]},"slash_commands": [{"command": "/openclaw","description": "Отправить сообщение в OpenClaw","should_escape": false,"url": "https://gateway-host.example.com/slack/events"}]},"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","usergroups:read","users:read"]}},"settings": {"event_subscriptions": {"request_url": "https://gateway-host.example.com/slack/events","bot_events": ["app_home_opened","app_mention","assistant_thread_context_changed","assistant_thread_started","channel_rename","member_joined_channel","member_left_channel","message.channels","message.groups","message.im","message.mpim","pin_added","pin_removed","reaction_added","reaction_removed"]},"interactivity": {"is_enabled": true,"request_url": "https://gateway-host.example.com/slack/events","message_menu_options_url": "https://gateway-host.example.com/slack/events"}}}{"display_information": {"name": "OpenClaw","description": "Коннектор Slack для OpenClaw"},"features": {"bot_user": { "display_name": "OpenClaw", "always_online": true },"app_home": {"home_tab_enabled": true,"messages_tab_enabled": true,"messages_tab_read_only_enabled": false},"assistant_view": {"assistant_description": "OpenClaw подключает ветки ассистента Slack к агентам OpenClaw.","suggested_prompts": [{ "title": "Что вы умеете?", "message": "С чем вы можете мне помочь?" },{"title": "Сводка по этому каналу","message": "Составьте сводку недавней активности в этом канале."},{ "title": "Черновик ответа", "message": "Помогите мне составить черновик ответа." }]},"slash_commands": [{"command": "/openclaw","description": "Отправить сообщение в OpenClaw","should_escape": false,"url": "https://gateway-host.example.com/slack/events"}]},"oauth_config": {"scopes": {"bot": ["app_mentions:read","assistant:write","channels:history","channels:read","chat:write","commands","groups:history","groups:read","im:history","im:read","im:write","users:read"]}},"settings": {"event_subscriptions": {"request_url": "https://gateway-host.example.com/slack/events","bot_events": ["app_home_opened","app_mention","assistant_thread_context_changed","assistant_thread_started","message.channels","message.groups","message.im"]},"interactivity": {"is_enabled": true,"request_url": "https://gateway-host.example.com/slack/events","message_menu_options_url": "https://gateway-host.example.com/slack/events"}}}После создания приложения в Slack:
- Basic Information → App Credentials: скопируйте Signing Secret для проверки запросов.
- Install App -> Install to Workspace: скопируйте токен OAuth пользователя-бота.
Настройка OpenClaw
Рекомендуемая настройка SecretRef:
export SLACK_BOT_TOKEN=slack-bot-token-exampleexport SLACK_SIGNING_SECRET=...cat > slack.http.patch.json5 <<'JSON5'{channels: {slack: {enabled: true,mode: "http",botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" },signingSecret: { source: "env", provider: "default", id: "SLACK_SIGNING_SECRET" },webhookPath: "/slack/events",},},}JSON5openclaw config patch --file ./slack.http.patch.json5 --dry-runopenclaw config patch --file ./slack.http.patch.json5Запуск Gateway
openclaw gatewayНастройка транспорта Socket Mode
По умолчанию OpenClaw устанавливает для клиента Slack SDK тайм-аут ожидания pong в Socket Mode равным 15 секундам. Изменяйте настройки транспорта только при необходимости настройки для конкретного рабочего пространства или хоста:
{ channels: { slack: { mode: "socket", socketMode: { clientPingTimeout: 20000, serverPingTimeout: 30000, pingPongLoggingEnabled: false, }, }, },}Используйте это только для рабочих пространств в Socket Mode, где регистрируются тайм-ауты pong/server-ping веб-сокета Slack, или для хостов с известным дефицитом времени цикла событий. clientPingTimeout — время ожидания pong после отправки клиентского ping пакетом SDK; serverPingTimeout — время ожидания серверных ping от Slack. Сообщения и события приложения остаются состоянием приложения, а не сигналами активности транспорта.
Примечания:
socketModeигнорируется в режиме HTTP Request URL.- Базовые настройки
channels.slack.socketModeприменяются ко всем учётным записям Slack, если не переопределены. Для переопределений на уровне учётной записи используетсяchannels.slack.accounts.<accountId>.socketMode; поскольку это переопределение объекта, укажите все поля настройки сокета, необходимые для этой учётной записи. - Значение по умолчанию в OpenClaw (
15000) есть только уclientPingTimeout.serverPingTimeoutиpingPongLoggingEnabledпередаются в Slack SDK только при явной настройке. - Задержка перед повторным запуском Socket Mode начинается примерно с 2 секунд и ограничивается примерно 30 секундами. После устранимых сбоев запуска, ожидания запуска и отключения попытки повторяются до остановки канала. При постоянных ошибках учётной записи и учётных данных, таких как недействительная аутентификация, отозванные токены или отсутствующие области доступа, работа быстро завершается с ошибкой вместо бесконечных повторных попыток.
Контрольный список манифеста и областей доступа
Базовый манифест приложения Slack одинаков для Socket Mode и HTTP Request URLs. Отличаются только блок settings (и url слеш-команды).
Базовый манифест (Socket Mode по умолчанию):
{ "display_information": { "name": "OpenClaw", "description": "Коннектор Slack для OpenClaw" }, "features": { "bot_user": { "display_name": "OpenClaw", "always_online": true }, "app_home": { "home_tab_enabled": true, "messages_tab_enabled": true, "messages_tab_read_only_enabled": false }, "assistant_view": { "assistant_description": "OpenClaw подключает ветки ассистента Slack к агентам OpenClaw.", "suggested_prompts": [ { "title": "Что вы умеете?", "message": "С чем вы можете мне помочь?" }, { "title": "Сводка по этому каналу", "message": "Составьте сводку недавней активности в этом канале." }, { "title": "Черновик ответа", "message": "Помогите мне составить черновик ответа." } ] }, "slash_commands": [ { "command": "/openclaw", "description": "Отправить сообщение в 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", "usergroups:read", "users:read" ] } }, "settings": { "socket_mode_enabled": true, "event_subscriptions": { "bot_events": [ "app_home_opened", "app_mention", "assistant_thread_context_changed", "assistant_thread_started", "channel_rename", "member_joined_channel", "member_left_channel", "message.channels", "message.groups", "message.im", "message.mpim", "pin_added", "pin_removed", "reaction_added", "reaction_removed" ] } }}Для режима HTTP Request URLs замените settings вариантом HTTP и добавьте url в каждую слеш-команду. Требуется общедоступный URL:
{ "features": { "slash_commands": [ { "command": "/openclaw", "description": "Отправить сообщение в OpenClaw", "should_escape": false, "url": "https://gateway-host.example.com/slack/events" } ] }, "settings": { "event_subscriptions": { "request_url": "https://gateway-host.example.com/slack/events", "bot_events": [ "app_home_opened", "app_mention", "assistant_thread_context_changed", "assistant_thread_started", "channel_rename", "member_joined_channel", "member_left_channel", "message.channels", "message.groups", "message.im", "message.mpim", "pin_added", "pin_removed", "reaction_added", "reaction_removed" ] }, "interactivity": { "is_enabled": true, "request_url": "https://gateway-host.example.com/slack/events", "message_menu_options_url": "https://gateway-host.example.com/slack/events" } }}Дополнительные настройки манифеста
Включите дополнительные функции, расширяющие приведённые выше настройки по умолчанию.
Манифест по умолчанию включает вкладку Home раздела Slack App Home и подписку на app_home_opened. Когда участник рабочего пространства открывает вкладку Home, OpenClaw публикует безопасное представление Home по умолчанию с views.publish; полезная нагрузка беседы и конфиденциальная конфигурация в него не включаются. Когда включён режим одной слеш-команды, в подсказке команды используется channels.slack.slashCommand.name; в установках с нативными командами или без слеш-команд эта подсказка отсутствует. Вкладка Messages остаётся включённой для личных сообщений Slack. Манифест также включает ветки ассистента Slack с помощью features.assistant_view, assistant:write, assistant_thread_started и assistant_thread_context_changed; ветки ассистента направляются в отдельные сеансы веток OpenClaw и сохраняют предоставленный Slack контекст ветки доступным агенту.
Необязательные нативные слеш-команды
Вместо одной настроенной команды можно использовать несколько нативных слеш-команд, учитывая следующие особенности:
- Используйте
/agentstatusвместо/status, поскольку команда/statusзарезервирована. - В приложении Slack можно одновременно зарегистрировать не более 25 слеш-команд (ограничение платформы Slack).
Замените существующий раздел features.slash_commands подмножеством доступных команд:
Socket Mode (по умолчанию)
{"slash_commands": [{"command": "/new","description": "Начать новый сеанс","usage_hint": "[model]"},{"command": "/reset","description": "Сбросить текущий сеанс"},{"command": "/compact","description": "Сжать контекст сеанса","usage_hint": "[instructions]"},{"command": "/stop","description": "Остановить текущий запуск"},{"command": "/session","description": "Управлять сроком действия привязки к ветке","usage_hint": "простой <duration|off> или максимальный возраст <duration|off>"},{"command": "/think","description": "Задать уровень обдумывания","usage_hint": "<level>"},{"command": "/verbose","description": "Включить или отключить подробный вывод","usage_hint": "on|off|full"},{"command": "/fast","description": "Показать или задать быстрый режим","usage_hint": "[status|on|off]"},{"command": "/reasoning","description": "Включить или отключить отображение рассуждений","usage_hint": "[on|off|stream]"},{"command": "/elevated","description": "Включить или отключить режим повышенных привилегий","usage_hint": "[on|off|ask|full]"},{"command": "/exec","description": "Показать или задать настройки выполнения по умолчанию","usage_hint": "host=<auto|sandbox|gateway|node> security=<deny|allowlist|full> ask=<off|on-miss|always> node=<id>"},{"command": "/approve","description": "Одобрить или отклонить ожидающие запросы на подтверждение","usage_hint": "<id> <decision>"},{"command": "/model","description": "Показать или задать модель","usage_hint": "[name|#|status]"},{"command": "/models","description": "Показать список поставщиков и моделей","usage_hint": "[provider] [page] [limit=<n>|size=<n>|all]"},{"command": "/help","description": "Показать краткую справку"},{"command": "/commands","description": "Показать сформированный каталог команд"},{"command": "/tools","description": "Показать, что текущий агент может использовать прямо сейчас","usage_hint": "[compact|verbose]"},{"command": "/agentstatus","description": "Показать состояние среды выполнения, включая использование и квоту поставщика, если доступны"},{"command": "/tasks","description": "Показать активные и недавние фоновые задачи текущего сеанса"},{"command": "/context","description": "Объяснить, как формируется контекст","usage_hint": "[list|detail|json]"},{"command": "/whoami","description": "Показать идентификатор отправителя"},{"command": "/skill","description": "Запустить навык по имени","usage_hint": "<name> [input]"},{"command": "/btw","description": "Задать дополнительный вопрос без изменения контекста сеанса","usage_hint": "<question>"},{"command": "/side","description": "Задать дополнительный вопрос без изменения контекста сеанса","usage_hint": "<question>"},{"command": "/usage","description": "Настроить нижний колонтитул использования или показать сводку затрат","usage_hint": "off|tokens|full|cost"}]}URL-адреса HTTP-запросов
Используйте тот же список slash_commands, что и для Socket Mode выше, и добавьте "url": "https://gateway-host.example.com/slack/events" в каждую запись. Пример:
{"slash_commands": [{"command": "/new","description": "Начать новый сеанс","usage_hint": "[model]","url": "https://gateway-host.example.com/slack/events"},{"command": "/help","description": "Показать краткую справку","url": "https://gateway-host.example.com/slack/events"}]}Повторите это значение url для каждой команды в списке.
Необязательные области авторства (операции записи)
Добавьте область бота chat:write.customize, если исходящие сообщения должны использовать идентификатор активного агента (пользовательское имя и значок) вместо идентификатора приложения Slack по умолчанию.
Если используется значок эмодзи, Slack ожидает синтаксис :emoji_name:.
Необязательные области пользовательского токена (операции чтения)
Если настроен channels.slack.userToken, обычно используются следующие области чтения:
channels:history,groups:history,im:history,mpim:historychannels:read,groups:read,im:read,mpim:readusers:readreactions:readpins:reademoji:readsearch:read(если используются операции чтения через поиск Slack)
Модель токенов
botTokenиappTokenобязательны для Socket Mode.- Для режима HTTP требуются
botTokenиsigningSecret. - Для режима ретрансляции требуется
botToken, а такжеrelay.url,relay.authTokenиrelay.gatewayId; токен приложения и секрет подписи в нём не используются. botToken,appToken,signingSecret,relay.authTokenиuserTokenпринимают строки с открытым текстом или объекты SecretRef.- Токены из конфигурации переопределяют резервные значения из переменных среды.
- Резервные значения переменных среды
SLACK_BOT_TOKEN,SLACK_APP_TOKENиSLACK_USER_TOKENприменяются только к учётной записи по умолчанию. - По умолчанию
userTokenработает только для чтения (userTokenReadOnly: true).
Поведение снимка состояния:
- При проверке учётной записи Slack для каждого набора учётных данных отслеживаются поля
*Sourceи*Status(botToken,appToken,signingSecret,userToken). - Состояние может быть
available,configured_unavailableилиmissing. configured_unavailableозначает, что учётная запись настроена через SecretRef или другой источник секрета, не встроенный в конфигурацию, но текущей команде или пути среды выполнения не удалось получить фактическое значение.- В режиме HTTP включается
signingSecretStatus; в Socket Mode обязательной парой являютсяbotTokenStatusиappTokenStatus.
Действия и ограничения
Действия 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. download-file принимает идентификаторы файлов Slack, показанные во входящих заполнителях файлов, и возвращает предпросмотр изображений либо метаданные локального файла для файлов других типов.
Управление доступом и маршрутизация
Политика личных сообщений
channels.slack.dmPolicy управляет доступом к личным сообщениям. channels.slack.allowFrom — канонический список разрешённых личных сообщений.
pairing(по умолчанию)allowlistopen(требует, чтобыchannels.slack.allowFromсодержал"*")disabled
Флаги личных сообщений:
dm.enabled(по умолчанию true)channels.slack.allowFromdm.allowFrom(устаревший)dm.groupEnabled(для групповых личных сообщений по умолчанию false)dm.groupChannels(необязательный список разрешённых MPIM)
Приоритет при нескольких учётных записях:
channels.slack.accounts.default.allowFromприменяется только к учётной записиdefault.- Именованные учётные записи наследуют
channels.slack.allowFrom, если их собственныйallowFromне задан. - Именованные учётные записи не наследуют
channels.slack.accounts.default.allowFrom.
Устаревшие channels.slack.dm.policy и channels.slack.dm.allowFrom по-прежнему считываются для совместимости. openclaw doctor --fix переносит их в dmPolicy и allowFrom, если это можно сделать без изменения доступа.
Для сопряжения в личных сообщениях используется openclaw pairing approve slack <code>.
Политика каналов
channels.slack.groupPolicy управляет обработкой каналов:
openallowlistdisabled
Список разрешённых каналов находится в channels.slack.channels и должен использовать стабильные идентификаторы каналов Slack (например, C12345678) в качестве ключей конфигурации.
Примечание о среде выполнения: если channels.slack полностью отсутствует (настройка только через переменные среды), среда выполнения использует резервное значение groupPolicy="allowlist" и записывает предупреждение в журнал (даже если задан channels.defaults.groupPolicy).
Разрешение имён и идентификаторов:
- записи списков разрешённых каналов и личных сообщений разрешаются при запуске, если это допускает доступ по токену
- неразрешённые записи с именами каналов сохраняются в заданном виде, но по умолчанию игнорируются при маршрутизации
- по умолчанию входящая авторизация и маршрутизация каналов в первую очередь используют идентификаторы; для прямого сопоставления по имени пользователя или краткому имени требуется
channels.slack.dangerouslyAllowNameMatching: true
Упоминания и пользователи каналов
По умолчанию сообщения в каналах требуют упоминания.
Источники упоминаний:
- явное упоминание приложения (
<@botId>) - упоминание группы пользователей Slack (
<!subteam^S...>), если пользователь-бот входит в эту группу пользователей; требуетсяusergroups:read - регулярные выражения для упоминаний (
agents.list[].groupChat.mentionPatterns, резервное значениеmessages.groupChat.mentionPatterns) - неявное поведение ответа в ветке боту (отключается, если
thread.requireExplicitMentionимеет значениеtrue)
Параметры отдельных каналов (channels.slack.channels.<id>; имена доступны только через разрешение при запуске или dangerouslyAllowNameMatching):
requireMentionignoreOtherMentionsreplyToMode(off|first|all|batched; переопределяет режим ответа учётной записи или типа чата для этого канала)users(список разрешённых)allowBotsskillssystemPrompttools,toolsBySender- формат ключа
toolsBySender:channel:,id:,e164:,username:,name:или подстановочный знак"*"(устаревшие ключи без префикса по-прежнему сопоставляются только сid:)
ignoreOtherMentions (по умолчанию false) отбрасывает сообщения канала, в которых упоминается другой пользователь или группа пользователей, но не этот бот. Личные сообщения и групповые личные сообщения (MPIM) не затрагиваются. Для фильтра требуется разрешённый идентификатор пользователя-бота из auth.test; если эта идентификационная информация недоступна (например, используется идентификация только по пользовательскому токену), проверка пропускает сообщения без изменений.
allowBots применяет консервативный подход к публичным и приватным каналам: сообщения комнаты, отправленные ботом, принимаются, только если отправляющий бот явно указан в списке разрешённых users этой комнаты либо хотя бы один явно заданный идентификатор владельца Slack из channels.slack.allowFrom в данный момент принадлежит участнику комнаты. Подстановочные знаки и записи владельцев по отображаемому имени не подтверждают присутствие владельца. Для проверки присутствия владельца используется Slack conversations.members; убедитесь, что у приложения есть соответствующая область разрешений на чтение для данного типа комнаты (channels:read для публичных каналов, groups:read для приватных каналов). Если получить список участников не удаётся, OpenClaw отбрасывает сообщение комнаты, отправленное ботом.
Для принятых сообщений Slack, отправленных ботом, используется общая защита от зацикливания ботов. Настройте channels.defaults.botLoopProtection как бюджет по умолчанию, а затем переопределите его с помощью channels.slack.botLoopProtection или channels.slack.channels.<id>.botLoopProtection, если для рабочего пространства или канала требуется другой лимит.
Ветки, сеансы и теги ответов
- Личные сообщения маршрутизируются как
direct; каналы — какchannel; MPIM — какgroup. - Привязки маршрутов Slack принимают необработанные идентификаторы получателей, а также формы целей Slack, такие как
channel:C12345678,user:U12345678и<@U12345678>. - При значении
session.dmScope=mainпо умолчанию личные сообщения Slack объединяются в основной сеанс агента. - Сеансы каналов:
agent:<agentId>:slack:channel:<channelId>. - Обычные сообщения верхнего уровня в канале остаются в сеансе соответствующего канала, даже если
replyToModeимеет значение, отличное отoff. - Для ответов в ветках Slack используется родительский Slack
thread_tsв суффиксах сеансов (:thread:<threadTs>), даже если создание веток для исходящих ответов отключено с помощьюreplyToMode="off". - OpenClaw добавляет подходящее корневое сообщение верхнего уровня канала в
agent:<agentId>:slack:channel:<channelId>:thread:<rootTs>, если ожидается, что оно начнёт видимую ветку Slack, чтобы корневое сообщение и последующие ответы в ветке использовали один сеанс OpenClaw. Это относится к событиямapp_mention, явным упоминаниям бота или совпадениям с настроенным шаблоном упоминания, а также к каналамrequireMention: falseсо значениемreplyToMode, отличным отoff. - Значение
channels.slack.thread.historyScopeпо умолчанию —thread; значениеthread.inheritParentпо умолчанию —false. channels.slack.thread.initialHistoryLimitопределяет, сколько существующих сообщений ветки загружается при запуске нового сеанса ветки (по умолчанию20; задайте0, чтобы отключить).channels.slack.thread.requireExplicitMention(по умолчаниюfalse): при значенииtrueподавляет неявные упоминания в ветках, чтобы бот отвечал только на явные упоминания@botвнутри веток, даже если бот уже участвовал в ветке. Без этого ответы в ветке с участием бота обходят проверкуrequireMention.
Настройки создания веток для ответов:
channels.slack.channels.<id>.replyToMode: переопределение для отдельных публичных или приватных каналов Slackchannels.slack.replyToMode:off|first|all|batched(по умолчаниюoff)channels.slack.replyToModeByChatType: для каждогоdirect|group|channel- устаревший резервный вариант для личных чатов:
channels.slack.dm.replyToMode
Поддерживаются теги ответов, задаваемые вручную:
[[reply_to_current]][[reply_to:<id>]]
Для явных ответов в ветках Slack из инструмента message задайте replyBroadcast: true вместе с action: "send" и threadId или replyTo, чтобы запросить у Slack дополнительную публикацию ответа из ветки в родительском канале. Это соответствует флагу Slack reply_broadcast для chat.postMessage и поддерживается только при отправке текста или Block Kit, но не при загрузке медиафайлов.
Когда вызов инструмента message выполняется внутри ветки Slack и нацелен на тот же канал, OpenClaw обычно наследует текущую ветку Slack в соответствии с эффективным значением replyToMode для учётной записи, типа чата или отдельного канала. Автоматические ответы и вызовы send или upload-file в том же канале используют то же переопределение для отдельного канала. Задайте topLevel: true для action: "send" или action: "upload-file", чтобы принудительно создать новое сообщение в родительском канале. threadId: null принимается как эквивалентный отказ от ветки на верхнем уровне.
Реакции-подтверждения
ackReaction отправляет эмодзи подтверждения, пока OpenClaw обрабатывает входящее сообщение. ackReactionScope определяет, когда этот эмодзи фактически отправляется.
По умолчанию реакция-подтверждение остаётся неизменной, а состояние собственной ветки ассистента Slack отображает ход выполнения с помощью сменяющихся сообщений о загрузке. Задайте messages.statusReactions.enabled: true, чтобы вместо этого включить жизненный цикл реакций «в очереди/обдумывание/инструмент/готово/ошибка».
Эмодзи (ackReaction)
Порядок разрешения:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- резервный эмодзи из идентификационных данных агента (
agents.list[].identity.emoji, иначе"eyes"/ 👀)
Примечания:
- Slack ожидает короткие коды (например,
"eyes"). - Используйте
"", чтобы отключить реакцию для учётной записи Slack или глобально.
Область действия (messages.ackReactionScope)
Провайдер Slack считывает область действия из messages.ackReactionScope (по умолчанию "group-mentions"). Сейчас переопределение на уровне учётной записи или канала Slack отсутствует; значение является глобальным для Gateway.
Значения:
"all": реагировать в личных сообщениях и группах, включая фоновые события комнат."direct": реагировать только в личных сообщениях."group-all": реагировать на каждое групповое сообщение, кроме фоновых событий комнат (без личных сообщений)."group-mentions"(по умолчанию): реагировать в группах, но только при упоминании бота (или в группах с поддержкой упоминаний, где эта возможность включена). Личные сообщения исключены."off"/"none": никогда не реагировать.
{ messages: { ackReaction: "eyes", ackReactionScope: "all", // реагировать в личных сообщениях и группах },}Потоковая передача текста
channels.slack.streaming управляет поведением предварительного просмотра в реальном времени:
off: отключить потоковый предварительный просмотр в реальном времени.partial(по умолчанию): заменять текст предварительного просмотра последним частичным результатом.block: добавлять порционные обновления предварительного просмотра.progress: показывать текст состояния выполнения во время генерации, а затем отправлять окончательный текст.streaming.preview.toolProgress: когда активен предварительный просмотр черновика, направлять обновления инструментов и хода выполнения в то же редактируемое сообщение предварительного просмотра (по умолчанию:true). Задайтеfalse, чтобы сохранять отдельные сообщения инструментов и хода выполнения.streaming.preview.commandText/streaming.progress.commandText: задайтеstatus, чтобы сохранять компактные строки хода выполнения инструментов, скрывая необработанный текст команд и их выполнения (по умолчанию:raw).
Скрытие необработанного текста команд и их выполнения с сохранением компактных строк хода выполнения:
{ "channels": { "slack": { "streaming": { "mode": "progress", "progress": { "toolProgress": true, "commandText": "status" } } } }}channels.slack.streaming.nativeTransport управляет собственной потоковой передачей текста Slack, когда channels.slack.streaming.mode имеет значение partial (по умолчанию: true).
Собственные карточки задач Slack с ходом выполнения включаются отдельно для режима выполнения. Задайте для channels.slack.streaming.progress.nativeTaskCards значение true вместе с channels.slack.streaming.mode="progress", чтобы во время выполнения работы отправлять собственную карточку плана или задачи Slack, а после завершения обновить ту же карточку. Без этого флага режим выполнения сохраняет переносимое поведение предварительного просмотра черновика.
- Для отображения собственной потоковой передачи текста и состояния ветки ассистента Slack должна быть доступна ветка ответа. Выбор ветки по-прежнему определяется
replyToMode. - Корневые сообщения каналов, групповых чатов и личных сообщений верхнего уровня могут использовать обычный предварительный просмотр черновика, когда собственная потоковая передача недоступна или ветка ответа отсутствует.
- Личные сообщения Slack верхнего уровня по умолчанию остаются вне веток, поэтому в них не отображается собственный потоковый предварительный просмотр или предварительный просмотр состояния в стиле веток Slack; вместо этого OpenClaw публикует и редактирует предварительный просмотр черновика в личном сообщении.
- Медиафайлы и нетекстовые данные отправляются обычным способом.
- Окончательные медиафайлы и сообщения об ошибках отменяют ожидающие изменения предварительного просмотра; подходящие окончательные текстовые сообщения и блоки применяются только тогда, когда предварительный просмотр можно изменить на месте.
- Если потоковая передача прерывается в середине ответа, OpenClaw отправляет оставшиеся данные обычным способом.
Использование предварительного просмотра черновика вместо собственной потоковой передачи текста Slack:
{ channels: { slack: { streaming: { mode: "partial", nativeTransport: false, }, }, },}Включение собственных карточек задач Slack с ходом выполнения:
{ channels: { slack: { streaming: { mode: "progress", progress: { nativeTaskCards: true, render: "rich", }, }, }, },}Устаревшие ключи:
channels.slack.streamMode(replace | status_final | append) — устаревший псевдоним дляchannels.slack.streaming.mode.- логический параметр
channels.slack.streaming— устаревший псевдоним дляchannels.slack.streaming.modeиchannels.slack.streaming.nativeTransport. channels.slack.chunkModeиchannels.slack.nativeStreamingверхнего уровня — устаревшие псевдонимы дляchannels.slack.streaming.chunkModeиchannels.slack.streaming.nativeTransport.- Устаревшие псевдонимы не считываются во время выполнения; запустите
openclaw doctor --fix, чтобы перезаписать сохранённую конфигурацию потоковой передачи Slack с использованием канонических ключей.
Резервная реакция при наборе текста
typingReaction добавляет временную реакцию к входящему сообщению Slack, пока OpenClaw обрабатывает ответ, а затем удаляет её после завершения выполнения. Это особенно полезно за пределами ответов в ветках, где по умолчанию используется индикатор состояния «печатает...».
Порядок разрешения:
channels.slack.accounts.<accountId>.typingReactionchannels.slack.typingReaction
Примечания:
- Slack ожидает короткие коды (например,
"hourglass_flowing_sand"). - Реакция предоставляется по мере возможности, а после завершения ответа или обработки ошибки автоматически предпринимается попытка её удалить.
Голосовой ввод
Чтобы сейчас обратиться к OpenClaw голосом в Slack, отправьте аудиоклип Slack приложению OpenClaw. Микрофон диктовки Slackbot — это отдельная функция, принадлежащая Slack, а не API приложения.
- Голосовой ввод Slackbot доступен в личной беседе пользователя со Slackbot. Slack преобразует запись в запрос для Slackbot, но не передаёт сторонним приложениям Slack через Events API аудиофайл, событие диктовки, запрос или маркер источника ввода. Плагин OpenClaw для Slack не может включить или получать эти данные.
- Аудиоклипы Slack хранятся как файлы Slack, которые можно публиковать в личных сообщениях OpenClaw, каналах или ветках. OpenClaw скачивает доступный клип с помощью токена бота, нормализует MIME-метаданные клипа Slack и передаёт его в общий конвейер транскрибирования аудио. Рекомендуемый манифест приложения включает необходимую область доступа
files:read.
Аудиоклипы и голосовой ввод Slackbot имеют разные правила конфиденциальности: на клипы распространяется политика хранения файлов Slack, и OpenClaw скачивает их для транскрибирования, тогда как, по заявлению Slack, аудио голосового ввода не сохраняется.
В канале с requireMention: true аудиоклип без подписи может пройти проверку, если в нём произнесён настроенный шаблон упоминания (agents.list[].groupChat.mentionPatterns, с переходом к messages.groupChat.mentionPatterns при его отсутствии). OpenClaw авторизует отправителя до скачивания или транскрибирования клипа, а затем допускает его только при совпадении транскрипции. Неудачная или не соответствующая шаблону предварительная транскрипция удаляется вместе со скачанным клипом и не сохраняется в истории канала. Нативную идентичность Slack @bot невозможно определить по речи, поэтому настройте шаблон произносимого имени или добавьте текстовое упоминание. Если включено дублирование транскрипции, она отправляется только после допуска.
Медиафайлы, разбиение и доставка
Входящие вложения
Файловые вложения Slack скачиваются с размещённых в Slack закрытых URL-адресов (с использованием потока запросов с аутентификацией по токену) и записываются в хранилище медиафайлов, если получение прошло успешно и ограничения размера соблюдены. Заполнители файлов содержат Slack fileId, чтобы агенты могли получить исходный файл с помощью download-file.
Для скачивания используются ограниченные тайм-ауты простоя и общего времени. Если получение файла из Slack зависает или завершается ошибкой, OpenClaw продолжает обработку сообщения и использует заполнитель файла.
По умолчанию ограничение размера входящих данных во время выполнения составляет 20MB, если оно не переопределено параметром channels.slack.mediaMaxMb.
Исходящий текст и файлы
- текстовые фрагменты используют
channels.slack.textChunkLimit(по умолчанию8000, с ограничением собственным максимальным размером сообщения Slack) channels.slack.streaming.chunkMode="newline"включает разбиение в первую очередь по абзацам- для отправки файлов используются API загрузки Slack; также поддерживаются ответы в ветках (
thread_ts) - для длинных подписей к файлам первый допустимый в Slack текстовый фрагмент используется как комментарий к загрузке, а оставшиеся фрагменты отправляются последующими сообщениями
- ограничение размера исходящих медиафайлов определяется параметром
channels.slack.mediaMaxMb, если он настроен; в противном случае при отправке в каналы используются значения по умолчанию для соответствующего MIME-типа из конвейера медиафайлов
Цели доставки
Предпочтительные явные цели:
user:<id>для личных сообщенийchannel:<id>для каналов
Личные сообщения Slack, содержащие только текст или блоки, можно отправлять непосредственно по идентификаторам пользователей; для загрузки файлов и отправки в ветки сначала открывается личная беседа через API бесед Slack, поскольку этим путям требуется конкретный идентификатор беседы.
Команды и поведение команд с косой чертой
Команды с косой чертой отображаются в Slack либо как одна настроенная команда, либо как несколько нативных команд. Настройте channels.slack.slashCommand, чтобы изменить параметры команд по умолчанию:
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
/openclaw /helpДля нативных команд требуются дополнительные настройки манифеста в приложении Slack; вместо этого в глобальных конфигурациях они включаются с помощью channels.slack.commands.native: true или commands.native: true.
- Автоматический режим нативных команд для Slack отключён, поэтому
commands.native: "auto"не включает нативные команды Slack.
/helpМеню аргументов нативных команд отображаются одним из следующих способов в порядке приоритета:
- 3–5 достаточно коротких вариантов: меню переполнения ("...")
- более 100 вариантов при наличии асинхронной фильтрации: внешний список выбора
- 1–2 варианта или любой вариант, закодированное значение которого слишком длинное для списка выбора: блоки кнопок
- в остальных случаях (6–100 вариантов или более 100 без асинхронной фильтрации): статическое меню выбора, разбитое на группы по 100 вариантов
/thinkСеансы команд с косой чертой используют изолированные ключи наподобие agent:<agentId>:slack:slash:<userId> и по-прежнему направляют выполнение команд в сеанс целевой беседы с помощью CommandTargetSessionKey.
Нативные диаграммы
Публичный блок Slack data_visualization Block Kit
отображает в сообщениях линейные, столбчатые, площадные и круговые диаграммы. OpenClaw преобразует переносимый блок
presentation chart в эту нативную структуру; помимо обычного
доступа к сообщениям chat:write не требуются дополнительные области OAuth,
загрузка файлов, средство визуализации изображений или настройка Slack.
{ "blocks": [ { "type": "chart", "chartType": "bar", "title": "Quarterly revenue", "categories": ["Q1", "Q2"], "series": [{ "name": "Revenue", "values": [120, 145] }], "xLabel": "Quarter" } ]}Ограничения Slack применяются до нативной визуализации:
- заголовок и необязательные подписи осей: 50 символов
- круговая диаграмма: 1–12 положительных сегментов
- линейная, столбчатая или площадная диаграмма: 1–12 рядов с уникальными именами и 1–20 общих категорий
- подписи сегментов, категорий и рядов: 20 символов
- каждый ряд должен содержать по одному конечному значению для каждой категории; значения некруговых диаграмм могут быть отрицательными
Каждая нативная диаграмма также содержит текстовое представление верхнего уровня для программ
чтения с экрана, уведомлений, зеркалирования сеансов и клиентов, которые не могут отобразить
блок. При стандартной отправке представления в другие каналы OpenClaw те получают те же
детерминированные данные диаграммы в текстовом виде, если не заявляют о поддержке нативных диаграмм. Если
во время поэтапного развёртывания Slack отклоняет диаграмму с ошибкой invalid_blocks, OpenClaw
удаляет отклонённые нативные блоки данных, сохраняет соседние элементы управления и отправляет
полное представление диаграммы в виде видимого текста.
В настоящее время Slack принимает до двух блоков data_visualization на сообщение. Если
представление содержит более двух допустимых диаграмм, OpenClaw сохраняет их порядок
и продолжает нативную визуализацию в последующих сообщениях, размещая не более двух
диаграмм в каждом сообщении.
В объявлении для разработчиков Slack описывает этот блок как предназначенную для приложений функцию Block Kit и не указывает ограничений по платному тарифу. Условия доступности для Business+/Enterprise относятся к автоматическому созданию диаграмм ИИ в Slackbot, а не к отправке приложением уже структурированной диаграммы Block Kit. Диаграммы являются блоками только для сообщений, а не содержимым App Home, модальных окон или Canvas.
Нативные таблицы
Текущий блок Slack data_table Block Kit
отображает в сообщениях структурированные строки и столбцы. OpenClaw преобразует явно заданный
переносимый блок presentation table в data_table; устаревший блок Slack
table не используется.
Помимо обычного доступа к сообщениям chat:write, дополнительные области OAuth
или настройки Slack не требуются.
{ "blocks": [ { "type": "table", "caption": "Open pipeline", "headers": ["Account", "Stage", "ARR"], "rows": [ ["Acme", "Won", 125000], ["Globex", "Review", 82000] ], "rowHeaderColumnIndex": 0 } ]}OpenClaw преобразует заголовки и строковые ячейки в ячейки Slack raw_text. Числовые ячейки
преобразуются в raw_number, при этом конечное числовое значение сохраняется для нативной сортировки
и фильтрации. rowHeaderColumnIndex, если этот параметр задан, помечает указанный с нуля
столбец как заголовки строк Slack.
Опубликованные Slack ограничения data_table применяются до нативной визуализации:
- 1–20 столбцов
- 1–100 строк данных плюс строка заголовков
- одинаковое количество ячеек в каждой строке
- не более 10 000 символов суммарно во всех ячейках таблиц одного сообщения
Несколько допустимых блоков таблиц могут отображаться нативно, пока сообщение не превышает суммарное ограничение количества символов. Таблица, которая не помещается в нативные ограничения, преобразуется в полный детерминированный текст без потери строк или ячеек. Если этот текст превышает размер одного сообщения Slack, при отправке и ответах на команды с косой чертой используются упорядоченные текстовые фрагменты. Редактирование таблицы завершается явной ошибкой размера вместо незаметного усечения строк существующего сообщения.
Каждая нативная таблица, созданная из переносимого представления, также содержит текстовое представление
верхнего уровня для программ чтения с экрана, уведомлений, зеркалирования сеансов и
клиентов, которые не могут отобразить блок. Необработанные значения диаграмм и таблиц остаются буквальными
в резервном представлении, поэтому данные ячеек наподобие <@U123> не превращаются в упоминание Slack.
Если Slack отклоняет нативные блоки диаграмм или таблиц с ошибкой invalid_blocks, OpenClaw
удаляет все нативные блоки данных за один ограниченный шаг восстановления, сохраняет допустимые
соседние блоки, например кнопки и списки выбора, и отправляет полный видимый текст диаграмм
и таблиц с отключённым форматированием Slack. При доставке команд с косой чертой
отслеживается бюджет Slack в пять вызовов response_url на протяжении всей команды. Перед каждым
пакетом ответов выбирается полный план, укладывающийся в оставшееся количество вызовов, либо операция завершается ошибкой
до публикации этого пакета.
Только явно заданные блоки таблиц presentation преобразуются в нативные таблицы.
Таблицы Markdown с вертикальными чертами остаются авторским текстом; OpenClaw не пытается определить
структуру таблицы или типы ячеек. Существующие доверенные производители нативных блоков Slack могут и дальше
передавать необработанные блоки через channelData.slack.blocks; OpenClaw формирует резервный
текст из допустимых необработанных ячеек data_table, тогда как некорректные пользовательские блоки могут
быть сведены к подписи или общему резервному представлению Block Kit. Переносимый вывод агентов, CLI
и плагинов должен использовать presentation.
Интерактивные ответы
Slack может отображать созданные агентом интерактивные элементы управления ответами, но по умолчанию эта функция отключена.
Для нового вывода агентов, CLI и плагинов предпочтительно использовать общие
кнопки или блоки выбора presentation. Они используют тот же путь взаимодействия
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. Сохраняйте их для старых запросов и специальных механизмов обхода, предназначенных для Slack; для новых переносимых элементов управления используйте общее представление.
API компилятора директив также устарели для нового кода производителей:
compileSlackInteractiveReplies(...)parseSlackOptionsLine(...)isSlackInteractiveRepliesEnabled(...)buildSlackInteractiveBlocks(...)
Для новых элементов управления, отображаемых в Slack, используйте полезные нагрузки presentation и buildSlackPresentationBlocks(...).
Примечания:
- Это устаревший интерфейс, специфичный для Slack. Другие каналы не преобразуют директивы Slack Block Kit в собственные системы кнопок.
- Значения интерактивных обратных вызовов — это сгенерированные OpenClaw непрозрачные токены, а не исходные значения, заданные агентом.
- Если сгенерированные интерактивные блоки превысят ограничения Slack Block Kit, OpenClaw вместо отправки недопустимой полезной нагрузки блоков возвращается к исходному текстовому ответу.
Отправка модальных форм, обрабатываемая плагинами
Плагины Slack, регистрирующие обработчик интерактивных событий, также могут получать события жизненного цикла модальных форм
view_submission и view_closed до того, как OpenClaw сожмёт
полезную нагрузку для системного события, видимого агенту. При открытии модального окна Slack используйте один из следующих
вариантов маршрутизации:
- Задайте для
callback_idзначениеopenclaw:<namespace>:<payload>. - Либо сохраните существующее значение
callback_idи поместитеpluginInteractiveData: "<namespace>:<payload>"в полеprivate_metadataмодального окна.
Обработчик получает ctx.interaction.kind как view_submission или
view_closed, нормализованное значение inputs и полный исходный объект stateValues из
Slack. Для вызова обработчика плагина достаточно маршрутизации только по идентификатору обратного вызова; включите
существующие поля маршрутизации пользователя/сеанса private_metadata модального окна, если
модальное окно также должно создавать системное событие, видимое агенту. Агент получает
компактное системное событие Slack interaction: ... с удалёнными конфиденциальными данными. Если обработчик возвращает
systemEvent.summary, systemEvent.reference или systemEvent.data, эти
поля включаются в компактное событие, чтобы агент мог обращаться к
хранилищу плагина, не видя полной полезной нагрузки формы.
Встроенные подтверждения в Slack
Slack может выступать встроенным клиентом подтверждений с интерактивными кнопками и действиями вместо перехода к веб-интерфейсу или терминалу.
- Подтверждения выполнения и плагинов могут отображаться как встроенные запросы Slack Block Kit.
channels.slack.execApprovals.*по-прежнему отвечает за включение встроенного клиента подтверждений выполнения и настройку маршрутизации в личные сообщения/каналы.- Личные сообщения с запросами подтверждения выполнения используют
channels.slack.execApprovals.approversилиcommands.ownerAllowFrom. - Подтверждения плагинов используют встроенные кнопки Slack, когда Slack включён как встроенный клиент подтверждений для исходного сеанса либо когда
approvals.pluginуказывает на исходный сеанс Slack или целевой объект Slack. - Личные сообщения с запросами подтверждения плагинов используют утверждающих плагинов Slack из
channels.slack.allowFrom,allowFromименованной учётной записи или маршрут учётной записи по умолчанию. - Авторизация утверждающего по-прежнему применяется: пользователи, имеющие право подтверждать только выполнение, не могут подтверждать запросы плагинов, если они также не являются утверждающими плагинов.
Здесь используется та же общая поверхность кнопок подтверждения, что и в других каналах. Когда interactivity включён в настройках приложения Slack, запросы подтверждения отображаются непосредственно в беседе как кнопки Block Kit.
При наличии этих кнопок они являются основным интерфейсом подтверждения; OpenClaw
должен включать ручную команду /approve только тогда, когда результат инструмента сообщает, что
подтверждения в чате недоступны или ручное подтверждение является единственным способом.
Путь конфигурации:
channels.slack.execApprovals.enabledchannels.slack.execApprovals.approvers(необязательно; по возможности используетсяcommands.ownerAllowFrom)channels.slack.execApprovals.target(dm|channel|both, по умолчанию:dm)agentFilter,sessionFilter
Slack автоматически включает встроенные подтверждения выполнения, когда enabled не задано или имеет значение "auto" и удаётся определить хотя бы одного
утверждающего выполнения. Slack также может обрабатывать встроенные подтверждения плагинов через этот путь встроенного клиента,
когда удаётся определить утверждающих плагинов Slack и запрос соответствует фильтрам встроенного клиента. Установите
enabled: false, чтобы явно отключить Slack как встроенный клиент подтверждений. Установите enabled: true, чтобы
принудительно включить встроенные подтверждения, когда удаётся определить утверждающих. Отключение подтверждений выполнения Slack не отключает
доставку встроенных подтверждений плагинов Slack, включённую через approvals.plugin; для доставки подтверждений
плагинов вместо этого используются утверждающие плагинов Slack.
Поведение по умолчанию без явной конфигурации подтверждений выполнения Slack:
{ commands: { ownerAllowFrom: ["slack:U12345678"], },}Явная встроенная конфигурация Slack требуется только для переопределения утверждающих, добавления фильтров или включения доставки в исходный чат:
{ channels: { slack: { execApprovals: { enabled: true, approvers: ["U12345678"], target: "both", }, }, },}Общая переадресация approvals.exec настраивается отдельно. Используйте её только тогда, когда запросы подтверждения выполнения также должны
направляться в другие чаты или явно заданным внешним адресатам. Общая переадресация approvals.plugin также
настраивается отдельно; встроенная доставка Slack подавляет этот резервный вариант только тогда, когда Slack может обработать запрос
подтверждения плагина встроенным способом.
Команда /approve в том же чате также работает в каналах Slack и личных сообщениях, которые уже поддерживают команды. Полная модель переадресации подтверждений описана в разделе Подтверждения выполнения.
События и рабочее поведение
- Изменения и удаления сообщений преобразуются в системные события.
- Рассылки из ветки (ответы в ветке с параметром "Also send to channel") обрабатываются как обычные сообщения пользователей.
- События добавления и удаления реакций преобразуются в системные события.
- События присоединения и выхода участников, создания и переименования каналов, а также добавления и удаления закреплений преобразуются в системные события.
- Необязательный опрос присутствия может преобразовать наблюдаемый переход участника-человека из
awayвactiveв событие в последнем активном подходящем сеансе Slack этого участника. По умолчанию отключено. channel_id_changedможет переносить ключи конфигурации каналов, когда включеноconfigWrites.- Метаданные темы и назначения канала считаются недоверенным контекстом и могут внедряться в контекст маршрутизации.
- Начальное сообщение ветки и исходное заполнение контекста из истории ветки фильтруются по настроенным спискам разрешённых отправителей, когда это применимо.
- Действия с блоками, быстрые команды и взаимодействия с модальными окнами создают структурированные системные события
Slack interaction: ...с расширенными полями полезной нагрузки:- действия с блоками: выбранные значения, подписи, значения средств выбора и метаданные
workflow_* - глобальные быстрые команды: метаданные обратного вызова и инициатора, направляемые в прямой сеанс инициатора
- быстрые команды сообщений: контекст обратного вызова, инициатора, канала, ветки и выбранного сообщения
- события модального окна
view_submissionиview_closedс маршрутизированными метаданными канала и данными формы
- действия с блоками: выбранные значения, подписи, значения средств выбора и метаданные
Определите глобальные быстрые команды или быстрые команды сообщений в конфигурации приложения Slack и используйте любой непустой идентификатор обратного вызова. OpenClaw подтверждает получение соответствующих полезных нагрузок быстрых команд, применяет ту же политику отправителей для личных сообщений и каналов, что и для других взаимодействий Slack, и ставит очищенное событие в очередь маршрутизированного сеанса агента. Идентификаторы триггеров и URL-адреса ответов удаляются из контекста агента.
События присутствия
Slack не отправляет изменения присутствия через Events API или Socket Mode. Вместо этого OpenClaw может опрашивать users.getPresence для участников-людей, чьи сообщения прошли обычные проверки доступа и маршрутизации Slack.
{ channels: { slack: { presenceEvents: { mode: "auto" }, channels: { C0123456789: { presenceEvents: { mode: "on" } }, C0987654321: { presenceEvents: { mode: "off" } }, }, }, },}off(по умолчанию): без таймера присутствия и вызовов Slack API.auto: отслеживать личные сообщения, MPIM и ветки Slack, активные за последние 24 часа и содержащие не более 8 наблюдаемых участников-людей. Сеансы каналов верхнего уровня исключаются.on: отслеживать те же беседы без ограничения числа участников и включать сеансы каналов верхнего уровня. Используйте переопределение для отдельного канала, чтобы принудительно включить или отключить один канал.
OpenClaw опрашивает не более 45 уникальных пользователей в минуту для каждой учётной записи Slack, сохраняет первый результат без пробуждения агента и пробуждает его только при наблюдаемом переходе из away в active. Для каждой пары учётной записи Slack и пользователя действует постоянный 8-часовой период ожидания, даже если этот человек участвует в нескольких ветках. Событие направляется только в последнюю активную подходящую беседу этого человека и предписывает агенту обратиться к памяти/вики и известному контексту часового пояса, прежде чем решать, следует ли отправить одно короткое приветствие. Агент может не отвечать.
Токену бота требуется users:read, уже включённое в рекомендуемый манифест. События присутствия недоступны для установок Enterprise Grid на уровне всей организации.
Справочник по конфигурации
Основной справочник: Справочник по конфигурации — Slack.
Ключевые поля Slack
- режим/аутентификация:
mode,enterpriseOrgInstall,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 - пробуждение по присутствию:
presenceEvents.mode,channels.*.presenceEvents.mode(off|auto|on; по умолчаниюoff) - доставка:
textChunkLimit,streaming.chunkMode,mediaMaxMb,streaming,streaming.nativeTransport,streaming.preview.toolProgress - предпросмотр:
unfurlLinks(по умолчанию:false),unfurlMediaдля управления предпросмотром ссылок и медиаchat.postMessage; установитеunfurlLinks: true, чтобы снова включить предпросмотр ссылок - эксплуатация/возможности:
configWrites,commands.native,slashCommand.*,actions.*,userToken,userTokenReadOnly
Устранение неполадок
Нет ответов в каналах
Проверьте по порядку:
groupPolicy- список разрешённых каналов (
channels.slack.channels) — ключами должны быть идентификаторы каналов (C12345678), а не названия (#channel-name). Ключи на основе названий незаметно не работают приgroupPolicy: "allowlist", поскольку маршрутизация каналов по умолчанию в первую очередь использует идентификаторы. Чтобы найти идентификатор: щёлкните канал в Slack правой кнопкой мыши → Copy link — значениеC...в конце URL-адреса является идентификатором канала. requireMention- список разрешённых
usersдля отдельного канала messages.groupChat.visibleReplies: для обычных запросов группы/канала по умолчанию используется"automatic". Если включено"message_tool"и журналы содержат текст ассистента без вызоваmessage(action=send), модель не использовала видимый путь инструмента сообщений. В этом режиме итоговый текст остаётся приватным; проверьте подробный журнал Gateway на наличие метаданных подавленной полезной нагрузки или установите значение"automatic", если требуется публиковать каждый обычный итоговый ответ ассистента через устаревший путь.messages.groupChat.unmentionedInbound: если установлено значение"room_event", разрешённые сообщения канала без упоминаний считаются фоновым контекстом и не вызывают ответа, пока агент не вызовет инструментmessage. См. Фоновые события комнаты.
{messages: {groupChat: { visibleReplies: "automatic",},},}Полезные команды:
openclaw channels status --probeopenclaw logs --followopenclaw doctorЛичные сообщения игнорируются
Проверьте:
channels.slack.dm.enabledchannels.slack.dmPolicy(или устаревшийchannels.slack.dm.policy)- подтверждения сопряжения / записи списка разрешений (
dmPolicy: "open"по-прежнему требуетchannels.slack.allowFrom: ["*"]) - групповые личные сообщения используют обработку MPIM; включите
channels.slack.dm.groupEnabledи, если настроено, добавьте MPIM вchannels.slack.dm.groupChannels - события личных сообщений Slack Assistant: подробные журналы с упоминанием
drop message_changedобычно означают, что Slack отправил событие отредактированной ветки Assistant без доступного для восстановления отправителя-человека в метаданных сообщения
openclaw pairing list slackРежим Socket не подключается
Проверьте токены бота и приложения, а также включение Socket Mode в настройках приложения Slack.
Токен уровня приложения должен иметь connections:write, а токен OAuth пользователя бота
должен относиться к тому же приложению и рабочему пространству Slack, что и токен приложения.
Если openclaw channels status --probe --json показывает botTokenStatus или
appTokenStatus: "configured_unavailable", учетная запись Slack
настроена, но текущей среде выполнения не удалось получить значение,
указанное через SecretRef.
Записи журнала наподобие slack socket mode failed to start; retry ... означают устранимые
ошибки запуска. При отсутствии областей доступа, отозванных токенах и недействительной аутентификации
вместо этого происходит немедленный сбой. Запись slack token mismatch ... означает, что токен бота и токен приложения,
вероятно, относятся к разным приложениям Slack; исправьте учетные данные приложения Slack.
Режим HTTP не получает события
Проверьте:
- секрет подписи
- путь Webhook
- URL-адреса запросов Slack (события, интерактивные действия и команды с косой чертой)
- уникальный
webhookPathдля каждой учетной записи HTTP - публичный URL завершает TLS-соединение и перенаправляет запросы на путь Gateway
- путь
request_urlприложения Slack в точности совпадает сchannels.slack.webhookPath(по умолчанию/slack/events)
Если signingSecretStatus: "configured_unavailable" присутствует в снимках
учетной записи, учетная запись HTTP настроена, но текущей среде выполнения не удалось
получить секрет подписи, указанный через SecretRef.
Повторяющаяся запись журнала slack: webhook path ... already registered означает, что две учетные записи HTTP
используют один и тот же webhookPath; назначьте каждой учетной записи отдельный путь.
Нативные команды и команды с косой чертой не выполняются
Проверьте, какой режим предполагалось использовать:
- режим нативных команд (
channels.slack.commands.native: true) с соответствующими командами с косой чертой, зарегистрированными в Slack - или режим одной команды с косой чертой (
channels.slack.slashCommand.enabled: true)
Slack не создает и не удаляет команды с косой чертой автоматически. commands.native: "auto" не включает нативные команды Slack; используйте true и создайте соответствующие команды в приложении Slack. В режиме HTTP каждая команда Slack с косой чертой должна содержать URL Gateway. В Socket Mode полезная нагрузка команд поступает через WebSocket, а Slack игнорирует slash_commands[].url.
Также проверьте commands.useAccessGroups, авторизацию личных сообщений, списки разрешенных каналов
и списки разрешений users для отдельных каналов. Для заблокированных отправителей
команд с косой чертой Slack возвращает временные ошибки, включая:
This channel is not allowed.You are not authorized to use this command here.
Справочник по вложенным медиафайлам
Slack может прикреплять загруженные медиафайлы к ходу агента, если загрузка файлов из Slack завершилась успешно и соблюдены ограничения размера. Аудиоклипы можно транскрибировать, файлы изображений можно передавать по пути распознавания медиафайлов или непосредственно модели ответа с поддержкой компьютерного зрения, а остальные файлы остаются доступными как контекст загружаемых файлов.
Поддерживаемые типы медиафайлов
| Тип медиафайла | Источник | Текущее поведение | Примечания |
|---|---|---|---|
| Аудиоклипы Slack | URL файла Slack | Загружаются и направляются в общий процесс транскрибирования аудио | Требуются files:read и рабочая модель или CLI tools.media.audio |
| Изображения JPEG / PNG / GIF / WebP | URL файла Slack | Загружаются и прикрепляются к ходу для обработки с поддержкой компьютерного зрения | Ограничение на файл: channels.slack.mediaMaxMb (по умолчанию 20 МБ) |
| PDF-файлы | URL файла Slack | Загружаются и предоставляются как файловый контекст для таких инструментов, как download-file или pdf |
Входящая обработка Slack не преобразует PDF автоматически во входные изображения для компьютерного зрения |
| Другие файлы | URL файла Slack | По возможности загружаются и предоставляются как файловый контекст | Двоичные файлы не обрабатываются как входные изображения |
| Ответы в ветках | Файлы начального сообщения ветки | Файлы корневого сообщения могут загружаться как контекст, если ответ не содержит собственных медиафайлов | Для начальных сообщений только с файлами используется заполнитель вложения |
| Сообщения с несколькими файлами | Несколько файлов Slack | Каждый файл оценивается независимо | Обработка Slack ограничена восемью файлами на сообщение |
Процесс входящей обработки
При поступлении сообщения Slack с файловыми вложениями:
- OpenClaw загружает файл по приватному URL Slack с использованием токена бота.
- После успешной загрузки файл записывается в хранилище медиафайлов.
- Пути загруженных медиафайлов и типы содержимого добавляются во входящий контекст.
- Аудиоклипы направляются в общий процесс транскрибирования; пути моделей и инструментов с поддержкой изображений могут использовать вложенные изображения из того же контекста.
- Другие файлы остаются доступными как метаданные файлов или ссылки на медиафайлы для инструментов, способных их обрабатывать.
Наследование вложений корневого сообщения ветки
Когда сообщение поступает в ветку (имеет родительский элемент thread_ts):
- Если сам ответ не содержит медиафайлов, а включенное корневое сообщение содержит файлы, Slack может загрузить корневые файлы как контекст начального сообщения ветки.
- Корневые файлы загружаются только при инициализации нового или сброшенного сеанса ветки. Последующие текстовые ответы используют существующий контекст сеанса и не прикрепляют корневые файлы повторно как новые медиафайлы.
- Вложения непосредственно в ответе имеют приоритет над вложениями корневого сообщения.
- Корневое сообщение, содержащее только файлы без текста, представляется заполнителем вложения, чтобы резервный механизм по-прежнему мог включить его файлы.
Обработка нескольких вложений
Когда одно сообщение Slack содержит несколько файловых вложений:
- Каждое вложение обрабатывается независимо в рамках процесса обработки медиафайлов.
- Ссылки на загруженные медиафайлы объединяются в контексте сообщения.
- Порядок обработки соответствует порядку файлов Slack в полезной нагрузке события.
- Ошибка загрузки одного вложения не блокирует остальные.
Ограничения размера, загрузки и моделей
- Ограничение размера: по умолчанию 20 МБ на файл. Настраивается через
channels.slack.mediaMaxMb. - Ограничение транскрибирования аудио:
tools.media.audio.maxBytesтакже применяется, когда загруженный файл отправляется поставщику транскрибирования или CLI. - Ошибки загрузки: файлы, которые Slack не может предоставить, URL с истекшим сроком действия, недоступные и слишком большие файлы, а также HTML-ответы страницы аутентификации или входа Slack пропускаются, а не помечаются как неподдерживаемые форматы.
- Модель компьютерного зрения: для анализа изображений используется активная модель ответа, если она поддерживает компьютерное зрение, либо модель изображений, настроенная в
agents.defaults.imageModel.
Известные ограничения
| Сценарий | Текущее поведение | Обходной путь |
|---|---|---|
| Срок действия URL файла Slack истек | Файл пропускается; ошибка не отображается | Повторно загрузите файл в Slack |
| Транскрибирование аудио недоступно | Клип остается прикрепленным, но транскрипция не создается | Настройте tools.media.audio или установите поддерживаемый локальный CLI для транскрибирования |
| Клип без подписи не проходит проверку упоминания | Отбрасывается после приватного предварительного транскрибирования; транскрипция и загрузка удаляются | Настройте шаблон упоминания произнесенного имени, добавьте текстовое упоминание бота или используйте личное сообщение |
| Модель компьютерного зрения не настроена | Вложения изображений сохраняются как ссылки на медиафайлы, но не анализируются как изображения | Настройте agents.defaults.imageModel или используйте модель ответа с поддержкой компьютерного зрения |
| Очень большие изображения (> 20 МБ по умолчанию) | Пропускаются согласно ограничению размера | Увеличьте channels.slack.mediaMaxMb, если Slack это допускает |
| Пересланные или общие вложения | Текст и размещенные в Slack изображения и файлы обрабатываются по мере возможности | Повторно отправьте их непосредственно в ветку OpenClaw |
| Вложения PDF | Сохраняются как файловый или медийный контекст и не направляются автоматически в систему компьютерного зрения | Используйте download-file для метаданных файла или инструмент pdf для анализа PDF |
Связанная документация
Связанные материалы
Сопряжение пользователя Slack с Gateway.
Поведение каналов и групповых личных сообщений.
Маршрутизация входящих сообщений агентам.
Модель угроз и усиление защиты.
Структура конфигурации и приоритеты.
Каталог команд и их поведение.