通过 Slack 应用集成,为 DM 和频道提供生产可用支持。默认模式为 Socket Mode;也支持 HTTP Request URLs。Documentation Index
Fetch the complete documentation index at: https://openclaw.zhcndoc.com/llms.txt
Use this file to discover all available pages before exploring further.
配对
Slack DM 默认使用配对模式。
斜杠命令
原生命令行为与命令目录。
频道故障排查
跨频道诊断与修复操作手册。
快速设置
- Socket Mode(默认)
- HTTP Request URLs
创建一个新的 Slack 应用
在 Slack 应用设置中点击 创建新应用 按钮:
- 选择 from a manifest 并为你的应用选择一个工作区
- 粘贴下面的 示例 manifest 并继续创建
- 生成带有
connections:write的 App-Level Token(xapp-...) - 安装应用并复制显示的 Bot Token(
xoxb-...)
Socket Mode 传输调优
OpenClaw 默认将 Slack SDK 客户端的 pong 超时设置为 15 秒,适用于 Socket Mode。仅当你需要针对工作区或主机进行特定调优时,才覆盖传输设置:clientPingTimeout 是 SDK 发送客户端 ping 后等待 pong 的时间;serverPingTimeout 是等待 Slack 服务器 ping 的时间。应用消息和事件仍然是应用状态,而不是传输层存活信号。
Manifest 和作用域检查清单
基础 Slack 应用 manifest 在 Socket Mode 和 HTTP Request URLs 中是相同的。只有settings 块(以及斜杠命令的 url)不同。
基础 manifest(Socket Mode 默认):
settings 替换为 HTTP 变体,并为每个斜杠命令添加 url。需要公开 URL:
其他 manifest 设置
启用不同功能以扩展上述默认配置。 默认 manifest 会启用 Slack App Home 的 Home 选项卡,并订阅app_home_opened。当工作区成员打开 Home 选项卡时,OpenClaw 会使用 views.publish 发布一个安全的默认 Home 视图;其中不包含对话负载或私有配置。Messages 选项卡仍对 Slack DM 保持启用。
可选的原生斜杠命令
可选的原生斜杠命令
可选的作者身份作用域(写入操作)
可选的作者身份作用域(写入操作)
如果你希望发出的消息使用当前代理身份(自定义用户名和图标),而不是默认的 Slack 应用身份,请添加
chat:write.customize bot scope。如果你使用表情符号图标,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 搜索读取)
Token 模型
botToken+appToken是 Socket Mode 所必需的。- HTTP 模式需要
botToken+signingSecret。 botToken、appToken、signingSecret和userToken接受明文 字符串或 SecretRef 对象。- 配置中的 token 会覆盖环境变量回退。
SLACK_BOT_TOKEN/SLACK_APP_TOKEN环境变量回退仅适用于默认账号。userToken(xoxp-...)仅可通过配置提供(不支持环境变量回退),默认行为为只读(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 工具中可用的操作组:
| Group | Default |
|---|---|
| messages | enabled |
| reactions | enabled |
| pins | enabled |
| memberInfo | enabled |
| emojiList | enabled |
send、upload-file、download-file、read、edit、delete、pin、unpin、list-pins、member-info 和 emoji-list。download-file 接受入站文件占位符中显示的 Slack 文件 ID,并会针对图片返回图片预览,针对其他文件类型返回本地文件元数据。
访问控制与路由
- DM policy
- 频道策略
- 提及与频道用户
channels.slack.dmPolicy 控制 DM 访问。channels.slack.allowFrom 是规范的 DM 允许列表。pairing(默认)allowlistopen(需要channels.slack.allowFrom包含"*")disabled
dm.enabled(默认 true)channels.slack.allowFromdm.allowFrom(旧版)dm.groupEnabled(群组 DM 默认 false)dm.groupChannels(可选的 MPIM 允许列表)
channels.slack.accounts.default.allowFrom仅适用于default账号。- 当命名账号自身的
allowFrom未设置时,会继承channels.slack.allowFrom。 - 命名账号不会继承
channels.slack.accounts.default.allowFrom。
channels.slack.dm.policy 和 channels.slack.dm.allowFrom 仍会为兼容性读取。openclaw doctor --fix 会在不改变访问权限的前提下,将它们迁移到 dmPolicy 和 allowFrom。DMs 中的配对使用 openclaw pairing approve slack <code>。线程、会话和回复标签
- DMs route as
direct; channels aschannel; MPIMs asgroup. - Slack route bindings accept raw peer IDs plus Slack target forms such as
channel:C12345678,user:U12345678, and<@U12345678>. - With default
session.dmScope=main, Slack DMs collapse to agent main session. - Channel sessions:
agent:<agentId>:slack:channel:<channelId>. - Thread replies can create thread session suffixes (
:thread:<threadTs>) when applicable. channels.slack.thread.historyScopedefault isthread;thread.inheritParentdefault isfalse.channels.slack.thread.initialHistoryLimitcontrols how many existing thread messages are fetched when a new thread session starts (default20; set0to disable).channels.slack.thread.requireExplicitMention(defaultfalse): whentrue, suppress implicit thread mentions so the bot only responds to explicit@botmentions inside threads, even when the bot already participated in the thread. Without this, replies in a bot-participated thread bypassrequireMentiongating.
channels.slack.replyToMode:off|first|all|batched(默认off)channels.slack.replyToModeByChatType:按direct|group|channel分别设置- direct chats 的旧版回退:
channels.slack.dm.replyToMode
[[reply_to_current]][[reply_to:<id>]]
replyToMode="off" 会禁用 Slack 中的所有回复线程,包括显式的 [[reply_to_*]] 标签。这与 Telegram 不同,Telegram 在 "off" 模式下仍会遵循显式标签。Slack 线程会将消息隐藏在频道中,而 Telegram 的回复会以内联方式保持可见。Ack 反应
ackReaction 会在 OpenClaw 处理入站消息时发送一个确认表情,处理完成后移除。
解析顺序:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- agent 身份表情回退(
agents.list[].identity.emoji,否则为"👀")
- Slack 期望使用简写名(例如
"eyes")。 - 可使用
""来禁用该 Slack 账号或全局的反应。
文本流式传输
channels.slack.streaming 控制实时预览行为:
off:禁用实时预览流式传输。partial(默认):用最新的部分输出替换预览文本。block:追加分块预览更新。progress:在生成过程中显示进度状态文本,然后发送最终文本。streaming.preview.toolProgress:当草稿预览处于激活状态时,将工具/进度更新路由到同一条已编辑的预览消息中(默认:true)。设为false可保留单独的工具/进度消息。
channels.slack.streaming.mode 为 partial 时,channels.slack.streaming.nativeTransport 控制 Slack 原生文本流式传输(默认:true)。
- A reply thread must be available for native text streaming and Slack assistant thread status to appear. Thread selection still follows
replyToMode. - Channel, group-chat, and top-level DM roots can still use the normal draft preview when native streaming is unavailable or no reply thread exists.
- Top-level Slack DMs stay off-thread by default, so they do not show Slack’s thread-style native stream/status preview; OpenClaw posts and edits a draft preview in the DM instead.
- Media and non-text payloads fall back to normal delivery.
- Media/error finals cancel pending preview edits; eligible text/block finals flush only when they can edit the preview in place.
- If streaming fails mid-reply, OpenClaw falls back to normal delivery for remaining payloads.
channels.slack.streamMode(replace | status_final | append)会自动迁移到channels.slack.streaming.mode。- 布尔值
channels.slack.streaming会自动迁移到channels.slack.streaming.mode和channels.slack.streaming.nativeTransport。 - 旧版
channels.slack.nativeStreaming会自动迁移到channels.slack.streaming.nativeTransport。
输入中 typing 反应回退
typingReaction 会在 OpenClaw 处理回复期间向入站 Slack 消息添加一个临时反应,并在运行结束后将其移除。这在线程回复之外最有用,因为线程回复默认会使用“正在输入…”状态指示器。
解析顺序:
channels.slack.accounts.<accountId>.typingReactionchannels.slack.typingReaction
- Slack 期望使用简写名(例如
"hourglass_flowing_sand")。 - 该反应尽力而为,回复或失败路径完成后会自动尝试清理。
媒体、分块与投递
入站附件
入站附件
Slack 文件附件会从 Slack 托管的私有 URL 下载(使用 token 认证请求流程),并在获取成功且大小限制允许时写入媒体存储。文件占位符包含 Slack
fileId,因此 agent 可以使用 download-file 获取原始文件。下载会使用有界的空闲超时和总超时。如果 Slack 文件检索卡住或失败,OpenClaw 会继续处理消息,并回退到文件占位符。运行时入站大小上限默认是 20MB,除非被 channels.slack.mediaMaxMb 覆盖。出站文本和文件
出站文本和文件
- 文本分块使用
channels.slack.textChunkLimit(默认 4000) channels.slack.chunkMode="newline"启用优先按段落拆分- 文件发送使用 Slack 上传 API,并可包含线程回复(
thread_ts) - 若已配置,出站媒体上限遵循
channels.slack.mediaMaxMb;否则频道发送使用媒体管道中的 MIME 类型默认值
投递目标
投递目标
推荐的显式目标:
user:<id>用于 DMschannel:<id>用于频道
命令与斜杠行为
Slash 命令在 Slack 中表现为单个已配置命令或多个原生命令。配置channels.slack.slashCommand 可更改命令默认值:
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
channels.slack.commands.native: true 或 commands.native: true 启用。
- 对于 Slack,原生命令自动模式是 关闭 的,因此
commands.native: "auto"不会启用 Slack 原生命令。
- 最多 5 个选项:按钮块
- 6-100 个选项:静态选择菜单
- 超过 100 个选项:在可用交互选项处理器时,使用带异步选项过滤的外部选择器
- 超出 Slack 限制:编码后的选项值会回退为按钮
agent:<agentId>:slack:slash:<userId> 的隔离键,并仍然通过 CommandTargetSessionKey 将命令执行路由到目标对话会话。
交互式回复
Slack 可以渲染由 agent 生成的交互式回复控件,但该功能默认是禁用的。 全局启用它:[[slack_buttons: Approve:approve, Reject:reject]][[slack_select: Choose a target | Canary:canary, Production:production]]
- 这是 Slack 专属 UI。其他渠道不会将 Slack Block Kit 指令转换为它们自己的按钮系统。
- 交互回调值是 OpenClaw 生成的不透明令牌,而不是 agent 编写的原始值。
- 如果生成的交互块会超过 Slack Block Kit 限制,OpenClaw 会回退为原始文本回复,而不是发送无效的 blocks 负载。
Slack 中的执行审批
Slack 可以作为原生审批客户端,通过交互式按钮和交互操作来处理审批,而不是回退到 Web UI 或终端。- 执行审批使用
channels.slack.execApprovals.*进行原生 DM/频道路由。 - 当请求已经落在 Slack 中且审批 id 类型为
plugin:时,插件审批仍然可以通过同一个 Slack 原生按钮界面进行处理。 - 仍会强制执行审批者授权:只有被识别为审批者的用户才能通过 Slack 批准或拒绝请求。
interactivity 时,审批提示会直接在对话中渲染为 Block Kit 按钮。
当这些按钮存在时,它们就是主要的审批体验;只有当工具结果表明聊天审批不可用或手动审批是唯一途径时,OpenClaw
才应包含手动的 /approve 命令。
配置路径:
channels.slack.execApprovals.enabledchannels.slack.execApprovals.approvers(可选;在可能时回退到commands.ownerAllowFrom)channels.slack.execApprovals.target(dm|channel|both,默认:dm)agentFilter,sessionFilter
enabled 未设置或为 "auto" 且至少有一个审批者被解析时,Slack 会自动启用原生执行审批。设置 enabled: false 可显式禁用 Slack 作为原生审批客户端。
设置 enabled: true 可在审批者解析成功时强制启用原生审批。
未显式配置 Slack 执行审批时的默认行为:
approvals.exec 转发是独立的。只有当执行审批提示还必须
路由到其他聊天或显式的带外目标时才使用它。共享的 approvals.plugin 转发也同样
独立;当这些请求已经落在 Slack 中时,Slack 原生按钮仍然可以处理插件审批。
同聊 /approve 也可在已经支持命令的 Slack 频道和 DM 中使用。完整的审批转发模型请参见 执行审批。
事件与运行行为
- 消息编辑/删除会映射为系统事件。
- 线程广播(“也发送到频道”的线程回复)会被当作普通用户消息处理。
- reaction 的添加/移除事件会映射为系统事件。
- 成员加入/离开、频道创建/重命名,以及 pin 的添加/移除事件会映射为系统事件。
- 启用
configWrites时,channel_id_changed可迁移频道配置键。 - 频道 topic/purpose 元数据会被视为不受信任的上下文,并可能被注入到路由上下文中。
- 线程起始消息和初始线程历史上下文种子在适用时会按配置的发送者白名单过滤。
- Block actions 和 modal 交互会发出结构化的
Slack interaction: ...系统事件,并带有丰富的 payload 字段:- block actions:所选值、标签、选择器值,以及
workflow_*元数据 - modal
view_submission和view_closed事件,包含路由后的频道元数据和表单输入
- block actions:所选值、标签、选择器值,以及
配置参考
主要参考:/gateway/config-channels#slack。高信号 Slack 字段
高信号 Slack 字段
- mode/auth:
mode,botToken,appToken,signingSecret,webhookPath,accounts.* - DM 访问:
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,streaming.nativeTransport,streaming.preview.toolProgress - 运维/功能:
configWrites,commands.native,slashCommand.*,actions.*,userToken,userTokenReadOnly
故障排查
频道中没有回复
频道中没有回复
按以下顺序检查:
groupPolicy- channel allowlist (
channels.slack.channels) — keys must be channel IDs (C12345678), not names (#channel-name). Name-based keys silently fail undergroupPolicy: "allowlist"because channel routing is ID-first by default. To find an ID: right-click the channel in Slack → Copy link — theC...value at the end of the URL is the channel ID. requireMention- 每个频道的
users白名单
DM 消息被忽略
DM 消息被忽略
检查:
channels.slack.dm.enabledchannels.slack.dmPolicy(或旧版channels.slack.dm.policy)- 配对审批 / 白名单条目
- Slack Assistant DM 事件:verbose 日志中提到
drop message_changed通常意味着 Slack 发送了一个已编辑的 Assistant 线程事件, 但消息元数据中没有可恢复的人类发送者
Socket mode 未连接
Socket mode 未连接
在 Slack 应用设置中验证 bot + app token 以及 Socket Mode 是否已启用。如果
openclaw channels status --probe --json 显示 botTokenStatus 或
appTokenStatus: "configured_unavailable",说明 Slack 账号已
配置,但当前运行时无法解析基于 SecretRef 的值。HTTP mode 未接收到事件
HTTP mode 未接收到事件
验证:
- signing secret
- webhook path
- Slack Request URLs(Events + Interactivity + Slash Commands)
- 每个 HTTP 账号唯一的
webhookPath
signingSecretStatus: "configured_unavailable",
说明 HTTP 账号已配置,但当前运行时无法
解析基于 SecretRef 的 signing secret。原生/slash 命令未触发
原生/slash 命令未触发
确认你期望的是以下哪种模式:
- 原生命令模式(
channels.slack.commands.native: true),并且 Slack 中注册了匹配的 slash 命令 - 或单一 slash 命令模式(
channels.slack.slashCommand.enabled: true)
commands.useAccessGroups 和频道/用户白名单。附件视觉参考
当 Slack 文件下载成功且大小限制允许时,Slack 可以将已下载媒体附加到 agent 的轮次中。图片文件可以通过媒体理解路径传递,或直接传递给支持视觉的回复模型;其他文件会作为可下载的文件上下文保留,而不会被当作图像输入处理。支持的媒体类型
| 媒体类型 | 来源 | 当前行为 | 备注 |
|---|---|---|---|
| JPEG / PNG / GIF / WebP 图片 | Slack 文件 URL | 下载并附加到轮次中,以便进行支持视觉的处理 | 单文件上限:channels.slack.mediaMaxMb(默认 20 MB) |
| PDF 文件 | Slack 文件 URL | 下载并作为文件上下文暴露给诸如 download-file 或 pdf 之类的工具 | Slack 入站不会自动将 PDF 转换为图像视觉输入 |
| 其他文件 | Slack 文件 URL | 在可能时下载并作为文件上下文暴露 | 二进制文件不被当作图像输入 |
| 线程回复 | 线程起始消息文件 | 当回复没有直接媒体时,可将根消息文件作为上下文注入 | 仅文件的起始消息会使用附件占位符 |
| 多图消息 | 多个 Slack 文件 | 每个文件独立评估 | Slack 处理每条消息最多限制为八个文件 |
入站管道
当带有文件附件的 Slack 消息到达时:- OpenClaw 使用 bot token(
xoxb-...)从 Slack 的私有 URL 下载文件。 - 成功后,文件会写入媒体存储。
- 下载后的媒体路径和内容类型会添加到入站上下文中。
- 支持图像的模型/工具路径可以使用该上下文中的图像附件。
- 非图像文件仍作为文件元数据或媒体引用供可处理它们的工具使用。
线程根附件继承
当消息在某个线程中到达(具有thread_ts 父级)时:
- 如果回复本身没有直接媒体,而包含的根消息有文件,Slack 可以将根文件作为线程起始上下文注入。
- 直接回复附件优先于根消息附件。
- 只有文件而没有文本的根消息会表示为附件占位符,以便回退机制仍可包含其文件。
多附件处理
当单条 Slack 消息包含多个文件附件时:- 每个附件都会通过媒体管道独立处理。
- 下载后的媒体引用会聚合到消息上下文中。
- 处理顺序遵循事件负载中 Slack 文件的顺序。
- 某个附件下载失败不会阻止其他附件处理。
大小、下载与模型限制
- 大小上限:默认每个文件 20 MB。可通过
channels.slack.mediaMaxMb配置。 - 下载失败:Slack 无法提供的文件、过期 URL、无法访问的文件、超大文件,以及 Slack auth/login HTML 响应都会被跳过,而不是报告为不支持的格式。
- 视觉模型:图像分析会使用当前激活的回复模型(如果它支持视觉),或者使用
agents.defaults.imageModel中配置的图像模型。
已知限制
| 场景 | 当前行为 | 解决办法 |
|---|---|---|
| 过期的 Slack 文件 URL | 文件被跳过;不显示错误 | 在 Slack 中重新上传文件 |
| 未配置视觉模型 | 图像附件会作为媒体引用存储,但不会作为图像分析 | 配置 agents.defaults.imageModel,或使用支持视觉的回复模型 |
| 非常大的图片(默认 > 20 MB) | 按大小上限跳过 | 如果 Slack 允许,可增大 channels.slack.mediaMaxMb |
| 转发/共享的附件 | 文本和 Slack 托管的图像/文件媒体按最佳努力处理 | 直接在 OpenClaw 线程中重新分享 |
| PDF 附件 | 作为文件/媒体上下文存储,不会自动通过图像视觉路径处理 | 使用 download-file 获取文件元数据,或使用 pdf 工具分析 PDF |
相关文档
相关内容
配对
将 Slack 用户与网关配对。
群组
频道和群组 DM 的行为。
频道路由
将入站消息路由给代理。
安全
威胁模型与加固。
配置
配置布局与优先级。
斜杠命令
命令目录与行为。