通过 Slack 应用集成,已可用于生产环境中的私信和渠道。默认模式是 Socket Mode;也支持 HTTP 请求 URL。Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
配对
Slack 私信默认使用配对模式。
斜杠命令
原生命令行为和命令目录。
渠道故障排除
跨渠道诊断和修复操作手册。
快速设置
- Socket Mode(默认)
- HTTP 请求 URL
Socket Mode 传输调优
对于 Socket Mode,OpenClaw 默认将 Slack SDK 客户端 pong 超时设为 15 秒。仅在需要针对工作区或主机进行特定调优时,才覆盖传输设置:clientPingTimeout 是 SDK 发送客户端 ping 后等待 pong 的时间;serverPingTimeout 是等待 Slack 服务器 ping 的时间。应用消息和事件仍然是应用状态,而不是传输存活信号。
清单和作用域核对清单
Socket Mode 和 HTTP 请求 URL 使用相同的基础 Slack 应用清单。只有settings 块(以及斜杠命令的 url)不同。
基础清单(Socket Mode 默认):
settings 替换为 HTTP 变体,并为每个斜杠命令添加 url。需要公共 URL:
其他清单设置
启用不同功能来扩展上述默认设置。 默认清单启用 Slack 应用首页的 首页 标签页,并订阅app_home_opened。当工作区成员打开首页标签页时,OpenClaw 会通过 views.publish 发布一个安全的默认首页视图;其中不包含任何对话载荷或私有配置。消息 标签页仍为 Slack 私信启用。
可选的原生斜杠命令
可选的原生斜杠命令
可选作者身份作用域(写入操作)
可选作者身份作用域(写入操作)
如果你希望外发消息使用当前智能体身份(自定义用户名和图标),而不是默认 Slack 应用身份,请添加
chat:write.customize bot 作用域。如果你使用表情图标,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 搜索读取)
令牌模型
- Socket Mode 需要
botToken+appToken。 - HTTP 模式需要
botToken+signingSecret。 botToken、appToken、signingSecret和userToken接受明文 字符串或 SecretRef 对象。- 配置令牌会覆盖环境变量回退。
SLACK_BOT_TOKEN/SLACK_APP_TOKEN环境变量回退仅适用于默认账户。userToken(xoxp-...)只能通过配置提供(没有环境变量回退),并默认采用只读行为(userTokenReadOnly: true)。
- Slack 账户检查会跟踪每个凭据的
*Source和*Status字段(botToken、appToken、signingSecret、userToken)。 - Status 为
available、configured_unavailable或missing。 configured_unavailable表示账户通过 SecretRef 或其他非内联密钥来源进行了配置,但当前命令/运行时路径 无法解析实际值。- 在 HTTP 模式下,会包含
signingSecretStatus;在 Socket Mode 下, 必需组合为botTokenStatus+appTokenStatus。
操作和门控
Slack 操作由channels.slack.actions.* 控制。
当前 Slack 工具中可用的操作组:
| 组 | 默认值 |
|---|---|
| messages | 启用 |
| reactions | 启用 |
| pins | 启用 |
| memberInfo | 启用 |
| emojiList | 启用 |
send、upload-file、download-file、read、edit、delete、pin、unpin、list-pins、member-info 和 emoji-list。download-file 接受入站文件占位符中显示的 Slack 文件 ID,并对图片返回图片预览,或对其他文件类型返回本地文件元数据。
访问控制和路由
- 私信策略
- 渠道策略
- Mentions and channel users
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账户。- 命名账户在自己的
allowFrom未设置时继承channels.slack.allowFrom。 - 命名账户不会继承
channels.slack.accounts.default.allowFrom。
channels.slack.dm.policy 和 channels.slack.dm.allowFrom 仍会读取。openclaw doctor --fix 会在不改变访问权限的情况下,将它们迁移到 dmPolicy 和 allowFrom。私信中的配对使用 openclaw pairing approve slack <code>。线程、会话和回复标签
- 私信路由为
direct;渠道路由为channel;MPIM 路由为group。 - Slack 路由绑定接受原始对端 ID,以及
channel:C12345678、user:U12345678和<@U12345678>等 Slack 目标形式。 - 使用默认
session.dmScope=main时,Slack 私信会合并到智能体主会话。 - 渠道会话:
agent:<agentId>:slack:channel:<channelId>。 - 适用时,线程回复可以创建线程会话后缀(
:thread:<threadTs>)。 channels.slack.thread.historyScope默认值为thread;thread.inheritParent默认值为false。channels.slack.thread.initialHistoryLimit控制新线程会话启动时获取多少条现有线程消息(默认20;设为0可禁用)。channels.slack.thread.requireExplicitMention(默认false):当为true时,抑制隐式线程提及,使机器人只响应线程内显式的@bot提及,即使机器人已经参与过该线程。否则,机器人已参与线程中的回复会绕过requireMention门控。
channels.slack.replyToMode:off|first|all|batched(默认off)channels.slack.replyToModeByChatType:按direct|group|channel分别设置- 直接聊天的旧版回退:
channels.slack.dm.replyToMode
[[reply_to_current]][[reply_to:<id>]]
replyToMode="off" 会禁用 Slack 中的所有回复线程,包括显式 [[reply_to_*]] 标签。这与 Telegram 不同,Telegram 在 "off" 模式下仍会遵循显式标签。Slack 线程会将消息从渠道中隐藏,而 Telegram 回复会以内联形式保持可见。确认反应
ackReaction 会在 OpenClaw 处理入站消息时发送一个确认表情符号。
解析顺序:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- 智能体身份表情符号回退(
agents.list[].identity.emoji,否则为 ”👀”)
- Slack 期望使用短代码(例如
"eyes")。 - 使用
""可为 Slack 账号或全局禁用该反应。
文本流式传输
channels.slack.streaming 控制实时预览行为:
off:禁用实时预览流式传输。partial(默认):用最新的部分输出替换预览文本。block:追加分块预览更新。progress:生成时显示进度状态文本,然后发送最终文本。streaming.preview.toolProgress:当草稿预览处于活动状态时,将工具/进度更新路由到同一条已编辑的预览消息中(默认:true)。设为false可保留单独的工具/进度消息。streaming.preview.commandText/streaming.progress.commandText:设为status可隐藏原始命令/执行文本,同时保留紧凑的工具进度行(默认:raw)。
channels.slack.streaming.nativeTransport 在 channels.slack.streaming.mode 为 partial 时控制 Slack 原生文本流式传输(默认:true)。
- 必须有可用的回复线程,原生文本流式传输和 Slack 助手线程状态才会显示。线程选择仍遵循
replyToMode。 - 当原生流式传输不可用或不存在回复线程时,渠道、群聊和顶层私信根仍可使用普通草稿预览。
- 顶层 Slack 私信默认保持在线程外,因此不会显示 Slack 线程样式的原生流/状态预览;OpenClaw 会改为在私信中发布并编辑草稿预览。
- 媒体和非文本载荷会回退到普通投递。
- 媒体/错误最终消息会取消待处理的预览编辑;符合条件的文本/分块最终消息仅在可以就地编辑预览时刷新。
- 如果流式传输在回复中途失败,OpenClaw 会对剩余载荷回退到普通投递。
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。
输入反应回退
typingReaction 会在 OpenClaw 处理回复期间,为入站 Slack 消息添加一个临时表情回应,并在运行结束时移除它。这在线程回复之外最有用;线程回复会使用默认的“正在输入…”状态指示器。
解析顺序:
channels.slack.accounts.<accountId>.typingReactionchannels.slack.typingReaction
- Slack 需要短代码(例如
"hourglass_flowing_sand")。 - 该表情回应是尽力而为的,并且会在回复或失败路径完成后自动尝试清理。
媒体、分块和投递
入站附件
入站附件
Slack 文件附件会从 Slack 托管的私有 URL 下载(令牌认证请求流),并在获取成功且大小限制允许时写入媒体存储。文件占位符包含 Slack
fileId,因此智能体可以使用 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>用于私信channel:<id>用于渠道
命令和斜杠行为
斜杠命令在 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 将命令执行路由到目标 conversation 会话。
交互式回复
Slack 可以渲染由智能体编写的交互式回复控件,但此功能默认禁用。 全局启用:[[slack_buttons: Approve:approve, Reject:reject]][[slack_select: Choose a target | Canary:canary, Production:production]]
- 这是 Slack 专属 UI。其他渠道不会将 Slack Block Kit 指令转换为自己的按钮系统。
- 交互式回调值是 OpenClaw 生成的不透明令牌,而不是智能体编写的原始值。
- 如果生成的交互区块会超出 Slack Block Kit 限制,OpenClaw 会回退为原始文本回复,而不是发送无效的 blocks 载荷。
Slack 中的执行审批
Slack 可以作为带有交互式按钮和交互的原生审批客户端,而不是回退到 Web 界面或终端。- 执行审批使用
channels.slack.execApprovals.*进行原生私信/渠道路由。 - 当请求已经落在 Slack 中且审批 ID 类型为
plugin:时,插件审批仍可以通过同一个 Slack 原生按钮界面解析。 - 审批者授权仍会强制执行:只有被识别为审批者的用户才能通过 Slack 批准或拒绝请求。
interactivity 时,审批提示会直接在 conversation 中渲染为 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 渠道和私信。请参阅执行审批,了解完整的审批转发模型。
事件和运行行为
- 消息编辑/删除会映射为系统事件。
- 线程广播(“同时发送到渠道”的线程回复)会作为普通用户消息处理。
- 表情回应添加/移除事件会映射为系统事件。
- 成员加入/离开、渠道创建/重命名以及置顶添加/移除事件会映射为系统事件。
- 启用
configWrites时,channel_id_changed可以迁移渠道配置键。 - 渠道主题/用途元数据会被视为不受信任的上下文,并可注入到路由上下文中。
- 线程起始消息和初始线程历史上下文种子填充会在适用时按已配置的发送者允许列表过滤。
- 区块操作和模态交互会发出结构化的
Slack interaction: ...系统事件,并带有丰富的载荷字段:- 区块操作:所选值、标签、选择器值以及
workflow_*元数据 - 模态
view_submission和view_closed事件,包含已路由的渠道元数据和表单输入
- 区块操作:所选值、标签、选择器值以及
配置参考
主要参考:配置参考 - Slack。高价值 Slack 字段
高价值 Slack 字段
- 模式/身份验证:
mode、botToken、appToken、signingSecret、webhookPath、accounts.* - 私信访问:
dm.enabled、dmPolicy、allowFrom(旧版:dm.policy、dm.allowFrom)、dm.groupEnabled、dm.groupChannels - 兼容性开关:
dangerouslyAllowNameMatching(应急;除非需要,否则保持关闭) - 渠道访问:
groupPolicy、channels.*、channels.*.users、channels.*.requireMention - 线程/历史:
replyToMode、replyToModeByChatType、thread.*、historyLimit、dmHistoryLimit、dms.*.historyLimit - 投递:
textChunkLimit、chunkMode、mediaMaxMb、streaming、streaming.nativeTransport、streaming.preview.toolProgress - 运维/功能:
configWrites、commands.native、slashCommand.*、actions.*、userToken、userTokenReadOnly
故障排除
渠道中没有回复
渠道中没有回复
按顺序检查:
groupPolicy- 渠道允许列表(
channels.slack.channels):键必须是渠道 ID(C12345678),而不是名称(#channel-name)。在groupPolicy: "allowlist"下,基于名称的键会静默失败,因为默认情况下渠道路由会优先使用 ID。要查找 ID:在 Slack 中右键点击渠道 → 复制链接;URL 末尾的C...值就是渠道 ID。 requireMention- 每渠道
users允许列表
私信消息被忽略
私信消息被忽略
检查:
channels.slack.dm.enabledchannels.slack.dmPolicy(或旧版channels.slack.dm.policy)- 配对审批/允许列表条目
- Slack Assistant 私信事件:提到
drop message_changed的详细日志 通常表示 Slack 发送了一个已编辑的 Assistant 线程事件, 且消息元数据中没有可恢复的人类发送者
Socket Mode 未连接
Socket Mode 未连接
在 Slack 应用设置中验证机器人和应用令牌,以及 Socket Mode 启用状态。如果
openclaw channels status --probe --json 显示 botTokenStatus 或
appTokenStatus: "configured_unavailable",说明 Slack 账户已配置,
但当前运行时无法解析由 SecretRef 支持的值。HTTP 模式未接收事件
HTTP 模式未接收事件
验证:
- 签名密钥
- webhook 路径
- Slack 请求 URL(事件 + 交互性 + 斜杠命令)
- 每个 HTTP 账户唯一的
webhookPath
signingSecretStatus: "configured_unavailable",
说明 HTTP 账户已配置,但当前运行时无法解析由 SecretRef 支持的签名密钥。原生/斜杠命令未触发
原生/斜杠命令未触发
验证你的预期是:
- 原生命令模式(
channels.slack.commands.native: true),并在 Slack 中注册了匹配的斜杠命令 - 或单斜杠命令模式(
channels.slack.slashCommand.enabled: true)
commands.useAccessGroups 和渠道/用户允许列表。附件视觉参考
当 Slack 文件下载成功且大小限制允许时,Slack 可以将下载的媒体附加到智能体回合。图像文件可以通过媒体理解路径传递,或直接传递给具备视觉能力的回复模型;其他文件会保留为可下载的文件上下文,而不是作为图像输入处理。支持的媒体类型
| 媒体类型 | 来源 | 当前行为 | 备注 |
|---|---|---|---|
| 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 使用机器人令牌(
xoxb-...)从 Slack 的私有 URL 下载文件。 - 下载成功后,文件会写入媒体存储。
- 下载的媒体路径和内容类型会添加到入站上下文。
- 支持图像的模型/工具路径可以使用该上下文中的图像附件。
- 非图像文件仍会作为文件元数据或媒体引用,供能够处理它们的工具使用。
线程根附件继承
当消息到达某个线程中(具有thread_ts 父级)时:
- 如果回复本身没有直接媒体,而包含的根消息有文件,Slack 可以将根文件补齐为线程起始消息上下文。
- 直接回复附件优先于根消息附件。
- 只有文件且没有文本的根消息会用附件占位符表示,这样回退仍能包含其文件。
多附件处理
当单条 Slack 消息包含多个文件附件时:- 每个附件都会通过媒体流水线独立处理。
- 已下载的媒体引用会聚合到消息上下文中。
- 处理顺序遵循事件载荷中的 Slack 文件顺序。
- 某个附件下载失败不会阻塞其他附件。
大小、下载和模型限制
- 大小上限:默认每个文件 20 MB。可通过
channels.slack.mediaMaxMb配置。 - 下载失败:Slack 无法提供的文件、过期 URL、无法访问的文件、超大文件以及 Slack 凭证/登录 HTML 响应会被跳过,而不是报告为不支持的格式。
- 视觉模型:图像分析会使用支持视觉的当前回复模型,或使用在
agents.defaults.imageModel配置的图像模型。
已知限制
| 场景 | 当前行为 | 解决方法 |
|---|---|---|
| 过期的 Slack 文件 URL | 文件被跳过;不会显示错误 | 在 Slack 中重新上传文件 |
| 未配置视觉模型 | 图像附件会存储为媒体引用,但不会作为图像分析 | 配置 agents.defaults.imageModel 或使用支持视觉的回复模型 |
| 非常大的图像(默认 > 20 MB) | 按大小上限跳过 | 如果 Slack 允许,增大 channels.slack.mediaMaxMb |
| 转发/共享的附件 | 文本以及由 Slack 托管的图像/文件媒体会尽力处理 | 直接在 OpenClaw 线程中重新共享 |
| PDF 附件 | 存储为文件/媒体上下文,不会自动通过图像视觉处理 | 使用 download-file 获取文件元数据,或使用 pdf 工具分析 PDF |
相关文档
相关
配对
将 Slack 用户与 Gateway 网关配对。
群组
渠道和群组私信行为。
渠道路由
将入站消息路由到智能体。
安全
威胁模型和加固。
配置
配置布局和优先级。
斜杠命令
命令目录和行为。