配对
Slack 私信默认使用配对模式。
斜杠命令
原生命令行为与命令目录。
频道故障排查
跨频道诊断与修复操作手册。
选择传输方式
Socket Mode 和 HTTP Request URLs 在消息、斜杠命令、App Home 和交互性方面功能齐全。请选择部署形态,而不是按功能选择。选择 Socket Mode 适用于单网关主机、开发笔记本,以及能够访问
*.slack.com 但不能接受入站 HTTPS 的本地/内网环境。选择 HTTP Request URLs 适用于在负载均衡器后运行多个网关副本、出站 WSS 被阻止但允许入站 HTTPS,或者你已经在反向代理处终结 Slack webhook 的场景。中继模式
中继模式将 Slack 入口与 OpenClaw gateway 分离。受信任的路由器拥有唯一的 Slack Socket Mode 连接,选择目标 gateway,并通过已认证的 websocket 转发带类型的事件。gateway 仍然使用自己的 bot token 来执行外发的 Slack Web API 调用。wss://。请将 bearer token 和路由器路由表视为 Slack 授权边界的一部分:被路由的事件会作为已授权的激活进入正常的 Slack 消息处理器。websocket hello 帧中由路由器提供的 slack_identity 可以设置默认的外发用户名和图标;但如果调用方显式提供了 identity,则以调用方为准。中继连接会以与 Socket Mode 相同的有限退避时序重新连接,并在断开时清除路由器提供的 identity。
Enterprise Grid 组织级安装
一个 Slack 账号可以接收来自 Enterprise Grid 组织级安装所覆盖的每个工作区的消息和交互。请选择直接 Socket 模式或 HTTP 请求 URL;企业账号不支持中继模式。下面的两份最小权限清单都启用了 Enterprise 消息、提及、反应、置顶、频道创建和频道重命名事件路径、即时回复、由监听器拥有的状态反应、用于 Block Kit 操作和模态提交的 Slack 交互,以及单个/openclaw 斜杠命令。
Socket 模式
connections:write 的应用级 token,然后从组织安装中复制 bot token。配置使用组织安装 bot token 的账号:
HTTP 请求 URL
当 Gateway 有一个公开的 HTTPS 端点且不打开 Socket 模式连接时,请使用 HTTP 模式。将示例 URL 替换为 Gateway 的公开webhookPath URL(默认 /slack/events):
https://app.slack.com/client/T.../... 复制 T... 工作区 ID。将该工作区 ID 与频道的 C... ID 一起用于每个限定范围的策略键,如上所示。
启动时,OpenClaw 使用 Slack auth.test 来检测令牌属于工作区安装还是 Enterprise Grid 组织范围安装。不需要设置安装模式。Slack 仍然是确定哪些工作区已授予安装权限的事实来源;然后 OpenClaw 将配置的频道、用户、私信和提及策略应用于每个已投递的事件。默认情况下,Enterprise 安装会拒绝机器人撰写的 message 和 app_mention 事件。请在账号或频道上设置 allowBots,以便在与工作区安装相同的循环防护规则下允许这些事件。OpenClaw 会保留组织安装的 auth.test user_id 和 bot_id,用于该检查。
Enterprise 支持直接 Socket 模式或 HTTP 消息、提及、成员关系、反应、置顶、频道创建、频道重命名、Block Kit 操作、模态框,以及已配置的快捷方式和斜杠命令负载,还支持限定工作区的出站消息和在线状态轮询。将任何快捷方式添加到应用清单的 features.shortcuts 列表中;OpenClaw 会通过相同的交互路径接收其回调 ID。清单示例注册了单个 /openclaw 命令;原生命令模式仍然需要下文所述的由管理员管理的命令条目。中继模式、频道 ID 变更事件、App Home、Agent 和 Assistant 生命周期事件、已配置的 ACP 绑定,以及运行时当前对话绑定,对于企业账号仍不可用。当不带 peer 指定的绑定指定 match.teamId,或者 peer ID 使用 team:<team-id>:channel:<channel-id> 或 team:<team-id>:user:<user-id> 时,支持静态 agent 路由绑定。
源自已投递且限定工作区的 Slack 轮次的 Slack 原生审批受到支持;审批按钮使用相同的、由监听器拥有且限定工作区的交互路径。企业账号支持 操作和门控 中列出的每个群组的 Slack 操作工具;配置的 channels.slack.actions.* 门控和 OAuth 作用域仍然适用。入站成员关系、反应、置顶、频道创建和频道重命名通知使用经过验证、由监听器拥有且限定工作区的事件路由。出站确认、输入状态和状态反应也通过该客户端受到支持,并且需要 reactions:write。
OpenClaw 将 Enterprise Grid 目标记录为 team:<team-id>:channel:<channel-id> 或 team:<team-id>:user:<user-id>。当前对话 Slack 工具操作会继承其工作区。分离式或主动式调用必须提供限定工作区的目标;裸频道 ID 和用户 ID 会安全失败,因为不同工作区可能重复使用这些 ID。不带目标参数的操作(例如 member-info 和 emoji-list)需要可信的当前 Slack 对话上下文。
Enterprise 频道策略键必须使用 team:<team-id>:channel:<channel-id> 或 "*" 通配符。dm.groupChannels 需要使用限定工作区的形式,不接受 "*"。已投递的 Enterprise 事件绝不会从其限定工作区和频道身份回退到裸频道 ID。工作区安装保留原始稳定频道 ID 和 channel:<id> 兼容性。频道前缀 slack:、group: 和 mpim: 会导致启动失败。
Enterprise 用户策略条目中的 allowFrom、reactionAllowlist 和每频道 users 必须使用 team:<team-id>:user:<user-id> 或 "*"。限定工作区的发送者永远不会匹配裸用户 ID。工作区安装保留原始稳定用户 ID、slack:<user-id> 和 user:<user-id> 兼容性。Enterprise toolsBySender 键接受原始稳定用户 ID、id:<user-id>、channel:slack:<user-id> 或 "*"。名称、slug、显示名称和电子邮件地址会导致启动失败。ID 必须使用 Slack 的规范大写前缀和主体(例如 C0123456789 或 U0123456789);小写和过短的相似字符串会导致启动失败。Enterprise 账号不能启用 dangerouslyAllowNameMatching。Enterprise 账号可以设置全局 mentionPatterns.mode。Enterprise mentionPatterns.allowIn 和 mentionPatterns.denyIn 条目使用 team:<team-id>:channel:<channel-id>;裸频道 ID 会导致启动失败,因为它们可能在不同工作区中重复使用。工作区安装保留现有的裸频道限定提及模式行为。即使 Slack ID 重叠,每个已接受的工作区也会获得独立的路由、会话、记录、去重、历史和缓存身份。在 message 流中,普通用户消息和用户撰写的 file_share 事件受支持;其他消息子类型会在授权或系统事件处理之前被拒绝。
Enterprise 私信支持与工作区安装相同的 disabled、open、allowlist 和 pairing 策略。配对审批会存储为 team:<team-id>:user:<user-id>,并且仅应用于来自该工作区的事件。账号级显式 allowFrom 条目使用相同的限定形式,并且仅应用于该工作区;频道和发送者策略继续应用于频道消息。
Enterprise 私信支持与工作区安装相同的 disabled、open、allowlist 和 pairing 策略。配对审批会存储为 team:<team-id>:user:<user-id>,并且仅应用于来自该工作区的事件。账号级显式 allowFrom 条目仍然在组织范围内生效;频道和发送者策略继续应用于频道消息。
安装
plugins install 会注册并启用该插件。在你配置好下面的 Slack 应用和频道设置之前,它不会执行任何操作。有关通用的插件安装规则,请参见 插件。
快速设置
本节中的 manifest 会创建一个 workspace 作用域的安装。对于 Enterprise Grid 组织安装,请改用专用的 组织范围 manifest 和工作流。- Socket 模式(默认)
- HTTP 请求 URL
1
创建新的 Slack 应用
打开 api.slack.com/apps → Create New App → From a manifest → 选择你的 workspace → 粘贴下面任一 manifest → Next → Create。Slack 创建应用后:
推荐 与 Slack 插件的完整功能集一致:App Home、斜杠命令、文件、表情反应、置顶、群组 DM,以及 emoji/usergroup 读取。若 workspace 策略限制 scope,则选择 Minimal —— 它覆盖 DM、频道/群组历史、提及和斜杠命令,但会移除文件、reaction、pin、群组 DM(
mpim:*)、emoji:read 和 usergroups:read。有关每个 scope 的原因以及附加选项(例如额外斜杠命令),请参见 manifest 与 scope 检查清单。- Basic Information -> App-Level Tokens -> Generate Token and Scopes:添加
connections:write,保存,并复制 App-Level Token。 - Install App -> Install to Workspace:复制 Bot User OAuth Token。
2
配置 OpenClaw
推荐的 SecretRef 设置:环境变量回退(仅默认账号):
3
启动网关
用户身份(以真实个人身份发布)
用户身份允许 OpenClaw 读取并以授权 Slack 应用的那个人的身份发布内容。userToken 是实际使用的身份;一个配套的 Slack 应用通过 Socket Mode 或 HTTP Request URL 传输 Events API 流量。该配套应用不需要 bot user 或 bot token。
按如下方式设置配套应用:
-
在 OAuth & Permissions -> User Token Scopes 下,添加这些用户级权限:
- 历史记录:
channels:history、groups:history、im:history、mpim:history - 会话查找:
channels:read、groups:read、im:read、mpim:read - 用户:
users:read - 发布:
chat:write(消息将以授权用户的身份发布) - 打开私信:
im:write、mpim:write
- 历史记录:
-
在 Event Subscriptions -> Subscribe to events on behalf of users 下,添加这些用户事件。不要只把它们添加到 bot-events 列表中:
message.channelsmessage.groupsmessage.immessage.mpim
-
选择一种事件传输方式:
- Socket Mode: 启用 Socket Mode,并创建一个带有
connections:write的应用级 token。将其配置为appToken。 - HTTP Request URL: 将 Event Subscriptions 指向公开的 OpenClaw Slack 端点,并复制 Basic Information -> App Credentials -> Signing Secret。将其配置为
signingSecret。
- Socket Mode: 启用 Socket Mode,并创建一个带有
-
安装或重新安装该应用,将其授权给目标人类用户,并将生成的用户 OAuth token 复制到
userToken中。
Socket Mode 传输调优
OpenClaw 将 Socket Mode 的 Slack SDK 客户端 pong 超时设置为 15 秒。这是固定的内部默认值,操作员无法配置。 注意:channels.slack.socketMode对象(包括clientPingTimeout、serverPingTimeout和pingPongLoggingEnabled)已弃用,运行时不再读取。openclaw doctor会针对已弃用的布局调优配置项显示一般性提示,而不是显示逐项路径。openclaw doctor --fix会移除这些字段在任何位置的配置,包括频道根目录和accounts.<accountId>下,并在socketMode对象为空后将其删除。你在其中添加的任何其他键都会保留,因此请手动删除。- 应用消息和事件仍属于应用状态,而不是传输存活信号。
- Socket Mode 重启退避时间从约 2 秒开始,最大约为 30 秒。可恢复的启动、等待启动和断开连接失败会一直重试,直到频道停止。永久性的账户和凭据错误(例如身份验证无效、令牌被撤销或缺少权限范围)会快速失败,而不会无限重试。
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 视图;其中不包含会话负载或私有配置。启用单斜杠命令模式时,命令提示会使用 channels.slack.slashCommand.name;使用原生命令或不使用斜杠命令的安装会省略该提示。Messages 选项卡对 Slack 私信仍然保持启用。新应用通过 features.agent_view、assistant:write 和 app_context_changed 使用 Slack Agent View。每个可见的 Agent View 根视图都会路由到各自的 OpenClaw 线程会话,Slack 有序的 active-view 实体仅作为不受信任的上下文传递给代理。
已存在且已使用 features.assistant_view 的应用可以保留当前 manifest。OpenClaw 会继续为这些安装处理 assistant_thread_started 和 assistant_thread_context_changed。Slack 将 Assistant View 迁移到 Agent View 视为不可逆,并要求用户之后强制刷新,因此,在你打算迁移整个工作区之前,不要在现有应用上替换 assistant_view。
可选的原生斜杠命令
可选的原生斜杠命令
可以使用多个 原生斜杠命令 代替单个配置命令,并带来一些细微差异:
- 使用
/agentstatus代替/status,因为/status命令已被保留。 - 同一时间,一个 Slack 应用最多只能注册 25 个斜杠命令(Slack 平台限制)。
/login 添加到 manifest;下面的示例将其包含在内,而不是可选的 /side 别名,以保持 25 个命令。/login 可以在任何地方显示,但它只会在私聊或 Web UI 中发放配对码。将你现有的 features.slash_commands 部分替换为 可用命令 的一个子集:- Socket Mode(默认)
- HTTP Request URLs
可选的作者身份作用域(写入操作)
可选的作者身份作用域(写入操作)
如果你希望发出的消息使用当前代理身份(自定义用户名和图标),而不是默认的 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 模型
- Bot 身份(默认)需要
botToken+appToken用于 Socket Mode,或botToken+signingSecret用于 HTTP 模式。 - User 身份需要
userToken+appToken用于 Socket Mode,或userToken+signingSecret用于 HTTP 模式。它不使用 bot token。 - Relay 模式需要
botToken加上relay.url、relay.authToken和relay.gatewayId;它不使用 app token 或 signing secret。 botToken、appToken、signingSecret、relay.authToken和userToken接受明文 字符串或 SecretRef 对象。- 配置中的 token 会覆盖环境变量回退。
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表示 bot 身份,使用userTokenStatus+appTokenStatus表示 user 身份。
操作与门控
Slack 操作由channels.slack.actions.* 控制。
当前 Slack 工具中可用的操作组如下:
当前 Slack 消息操作包括
send、upload-file、download-file、read、edit、delete、pin、unpin、list-pins、member-info 和 emoji-list。download-file 接受传入文件占位符中显示的 Slack 文件 ID,并对图片返回图像预览,对其他文件类型返回本地文件元数据。
访问控制与路由
- DM 策略
- 频道策略
- 提及与频道用户
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 允许列表)
dm.groupEnabled 和 dm.groupChannels 只会过滤 Slack 已经投递给应用的群组 DM。它们不能让应用看到一个它从未加入过的群组 DM。请将群组 DM 转换为私有频道并邀请应用,或者让应用使用 conversations.open 打开一个新的 MPDM。参见 群组 DM(MPDM)与 bot。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>。群组 DM(MPDM)与 bot
Slack 群组 DM,也称为多人直接消息或 MPDM,不是应用可以通过被提及而加入的频道。在现有群组 DM 中输入@YourBot 不会把应用加入其中,也不会让该对话对它可见。
- 如果在创建群组 DM 时就包含了该应用,Slack 会投递
message.mpim事件,并且当 DM 策略允许时,OpenClaw 可以响应。 - 如果在一个现有群组 DM 中提及了该应用,但它并不是成员,那么 bot token 将完全无法看到该对话。Slack Web API 调用(如
conversations.info、conversations.members和conversations.history)会因方法和上下文不同而失败,报访问或未找到错误,该 MPDM 不会出现在conversations.list?types=mpim中,且不会有任何事件投递给 OpenClaw。 - OpenClaw 通过已投递的
message.mpim事件唤醒。app_mention事件不会把应用加入 DM 或 MPDM 上下文。 dm.groupEnabled和dm.groupChannels只会过滤 Slack 已经投递给应用的 MPDM。它们不能赋予应用对其从未参与过的群组 DM 的成员资格或可见性。没有任何 OpenClaw 配置项能让应用看到它从未加入过的群组 DM。
- 将群组 DM 转换为私有频道,然后请现有成员使用
/invite @YourBot邀请应用。基于 API 的邀请必须使用conversations.invite,并且所用 token 的执行者必须已经是成员,且被允许邀请该应用。 - 让应用使用具有
mpim:write的 bot token,通过conversations.open打开一个新的 MPDM,并在users中传入人类收件人。Slack 会自动包含调用方 bot 用户。
线程、会话与回复标签
- DM 路由为
direct;频道为channel;MPIM 为group。 - Slack 路由绑定接受原始对端 ID,以及 Slack 目标形式,例如
channel:C12345678、user:U12345678和<@U12345678>。 - 在默认
session.dmScope=main下,普通 Slack DM 会折叠到 agent 主会话。Agent View 根线程和现有的 Assistant View 线程仍然会隔离为:thread:<threadTs>会话。 - 频道会话:
agent:<agentId>:slack:channel:<channelId>。 - 普通顶层频道消息会留在按频道划分的会话中,即使
replyToMode不是off也是如此。 - Slack 频道、MPIM、Agent View 和 Assistant View 的线程回复会使用父级 Slack
thread_ts作为会话后缀(:thread:<threadTs>)。普通 DM 回复线程仍然只是基于 DM 主会话的 UI 表现。 - 当某个符合条件的顶层频道根消息预计会开启一个可见的 Slack 线程时,OpenClaw 会将其种子化到
agent:<agentId>:slack:channel:<channelId>:thread:<rootTs>,这样该根消息和后续线程回复就会共享一个 OpenClaw 会话。这适用于app_mention事件、显式 bot 触发或配置的 mention-pattern 匹配,以及requireMention: false且replyToMode非off的频道。 channels.slack.thread.historyScope默认值为thread;thread.inheritParent默认值为false。channels.slack.thread.initialHistoryLimit控制新线程会话开始时要抓取多少条现有线程消息(默认20;设为0可禁用)。channels.slack.implicitMentions.replyToBot控制是否允许回复机器人自己的消息时绕过提及门控(默认true)。channels.slack.implicitMentions.threadParticipation控制当机器人在某个线程中已经回复过时,后续跟进是否可绕过提及门控(默认true)。将其设为false可要求这些后续消息必须重新显式提及。openclaw doctor --fix会把旧的channels.slack.thread.requireExplicitMention键迁移为这个正向的规范标志。- 账户级覆盖位于
channels.slack.accounts.<id>.implicitMentions;共享默认值位于channels.defaults.implicitMentions。
channels.slack.channels.<id>.replyToMode:针对 Slack 频道/私有频道消息的按频道覆盖channels.slack.replyToMode:off|first|all|batched(默认off)channels.slack.replyToModeByChatType:按direct|group|channel区分- 直聊的旧版回退:
channels.slack.dm.replyToMode
[[reply_to_current]][[reply_to:<id>]]
message 工具的显式 Slack thread replies,设置 replyBroadcast: true,并配合 action: "send" 和 threadId 或 replyTo,以请求 Slack 也将该 thread reply 广播到父频道。这会映射到 Slack 的 chat.postMessage reply_broadcast 标志,并且仅支持文本或 Block Kit 发送,不支持媒体上传。
当 message 工具调用在 Slack thread 内运行且目标是同一频道时,OpenClaw 通常会根据生效中的账号、聊天类型或按频道 replyToMode 继承当前 Slack thread。自动回复以及同频道的 send 或 upload-file 调用会使用相同的按频道覆盖。若要强制发送新的父频道消息,可在 action: "send" 或 action: "upload-file" 上设置 topLevel: true。threadId: null 也可接受,作用等同于同级顶层禁用。
replyToMode="off" 会禁用可选的 Slack 外发回复线程功能,包括显式的 [[reply_to_*]] 标签。Agent View 和 Assistant View 是由 Slack 管理的线程式体验,因此它们的回复和状态会无论此设置如何都保留在可见的根消息上。它不会把其他入站 Slack 线程会话扁平化。这与 Telegram 不同,在 Telegram 中,即使处于 "off" 模式,显式标签仍会被遵守。Slack 线程会将消息从频道中隐藏,而 Telegram 回复会以内联方式保持可见。确认反应
ackReaction 会在 OpenClaw 处理入站消息期间发送一个确认表情,而 ackReactionScope 决定该表情实际何时发送。
默认情况下,确认状态保持静态,而 Slack 的原生 agent/assistant 线程状态会通过轮换的加载消息显示进度。将 messages.statusReactions.enabled: true 设为启用,即可改用 queued/thinking/tool/done/error 这一套反应生命周期。
Emoji(ackReaction)
解析顺序:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- agent 身份 emoji 回退(
agents.entries.*.identity.emoji,否则为"eyes"/ 👀)
- Slack 期望使用简写名(例如
"eyes")。 - 可使用
""来禁用该 Slack 账号或全局的反应。
范围(messages.ackReactionScope)
Slack 提供方从 messages.ackReactionScope 读取范围(默认 "group-mentions")。目前没有 Slack 账号级或频道级覆盖;该值对网关全局生效。
取值:
"all":在私聊和群组中添加反应,包括环境房间事件。"direct":仅在私聊中添加反应。"group-all":对所有群组消息添加反应,但不包括环境房间事件(不含私聊)。"group-mentions"(默认):在群组中添加反应,但仅限于提及机器人时(或在已选择加入的群组可提及对象中)。不包括私聊。"off"/"none":从不添加反应。
默认范围(
"group-mentions")不会在私聊或环境房间事件中触发确认反应。若要在传入的 Slack 私聊和安静的房间事件中看到已配置的 ackReaction(例如 "eyes"),请将 messages.ackReactionScope 设置为 "all"。messages.ackReactionScope 会在 Slack 提供方启动时读取,因此需要重启网关才能使更改生效。文本流式传输
channels.slack.streaming 控制实时预览行为:
off:禁用实时预览流式传输partial:使用最新的部分输出替换预览文本。设置此值可恢复之前的默认行为block:追加分块的预览更新progress(默认):在任务运行期间,在 thread 中维护一张实时 Block Kit 会话卡片,在原位置完成该卡片,并将助手的最终文本作为单独的消息发送streaming.preview.toolProgress:当草稿预览处于活动状态时,将工具/进度更新路由到同一条已编辑的预览消息中(默认:true)。设置为false可保留单独的工具/进度消息streaming.preview.commandText/streaming.progress.commandText:status会保留紧凑的工具进度行,同时隐藏原始 command/exec 文本(默认);设置为raw可选择显示命令文本
channels.slack.streaming.mode 为 partial 时,channels.slack.streaming.nativeTransport 控制 Slack 原生文本流式传输(默认:true)。
默认会话卡片显示当前标题、可选的旁白、计划检查清单、最近活动、工具/文件总数以及已用时间。完成后,卡片标题会变为成功或错误,同时保留最后的计划和活动。当配置了 gateway.publicOrigin 时,终端卡片会包含一个链接到该会话的 在 OpenClaw 中打开 按钮。如果 Control UI 位于路径前缀下提供服务,还需要设置 gateway.controlUi.basePath。
Slack 原生进度任务卡片仍是单独选择启用的路径。将 channels.slack.streaming.progress.nativeTaskCards 设置为 true,并将 channels.slack.streaming.mode="progress",即可使用 Slack 原生计划/任务流,而不是 Block Kit 会话卡片。此设置保持不变。
- 必须存在回复 thread,原生文本流式传输和 Slack assistant thread 状态才能显示。thread 的选择仍遵循
replyToMode - 当原生流式传输不可用或不存在回复 thread 时,频道、群聊和顶层 DM 根消息仍可使用普通草稿预览
- 顶层 Slack DM 默认不在线程中,因此不会显示 Slack 线程式的原生流/状态预览;OpenClaw 会改为在 DM 中发布并编辑草稿预览
- 自定义出站用户名/图标设置会保持可移植预览启用。OpenClaw 会让预览或会话卡片由应用撰写,并单独发送自定义的最终消息。Slack 不允许删除冒充其他身份发送的消息
- 媒体和非文本负载会回退到普通投递
- 媒体/错误最终消息会取消待处理的预览编辑;符合条件的文本/区块最终消息只有在可以原地编辑预览时才会刷新
- 如果流式传输在回复过程中途失败,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.chunkMode和channels.slack.nativeStreaming是channels.slack.streaming.chunkMode和channels.slack.streaming.nativeTransport的旧版别名。 - 运行时不会读取旧版别名;请运行
openclaw doctor --fix将持久化的 Slack 流式传输配置重写为规范键。
输入中 typing 反应回退
typingReaction 会在 OpenClaw 处理回复期间向入站 Slack 消息添加一个临时反应,并在运行结束后将其移除。这在线程回复之外最有用,因为线程回复默认会使用“正在输入…”状态指示器。
解析顺序:
channels.slack.accounts.<accountId>.typingReactionchannels.slack.typingReaction
- Slack 期望使用简写名(例如
"hourglass_flowing_sand")。 - 该反应尽力而为,回复或失败路径完成后会自动尝试清理。
语音输入
要在 Slack 中向 OpenClaw 讲话,请现在发送一个 Slack 音频剪辑到 OpenClaw 应用。Slackbot 的听写麦克风是 Slack 自有的独立功能,不是应用 API。- Slackbot 语音听写 存在于用户的私有 Slackbot 会话中。Slack 会将录音转换为 Slackbot 提示,但不会通过 Events API 向第三方 Slack 应用发出音频文件、听写事件、提示或输入源标记。OpenClaw Slack 插件无法启用或接收它。
- Slack 音频剪辑 是可存储的 Slack 文件,可以发布到 OpenClaw 的 DM、频道或线程中。OpenClaw 会使用 bot token 下载可访问的剪辑,规范化 Slack 剪辑的 MIME 元数据,并通过共享的 音频转录管道 发送它。推荐的应用清单包含所需的
files:read范围。
requireMention: true 的频道中,无需字幕的音频剪辑可以通过说出已配置的提及模式(agents.entries.*.groupChat.mentionPatterns,回退到 messages.groupChat.mentionPatterns)来满足门槛。OpenClaw 会在下载或转录剪辑之前对发送者进行授权,然后仅当转录内容匹配时才允许通过。失败或不匹配的推测性转录会与下载的剪辑一起被丢弃;它不会保留在频道历史中。无法从语音中推断出原生 Slack @bot 身份,因此请配置一个口述名称模式或包含一个手动输入的提及。如果启用了转录回显,则回显仅会在通过准入后发送。
媒体、分块与投递
入站附件
入站附件
Slack 文件附件会从 Slack 托管的私有 URL 下载(使用 token 认证请求流程),并在获取成功且大小限制允许时写入媒体存储。文件占位符包含 Slack
fileId,因此 agent 可以使用 download-file 获取原始文件。下载会使用有界的空闲超时和总超时。如果 Slack 文件检索卡住或失败,OpenClaw 会继续处理消息,并回退到文件占位符。运行时入站大小上限默认是 20MB,除非被 channels.slack.mediaMaxMb 覆盖。出站文本和文件
出站文本和文件
- 文本分块使用
channels.slack.textChunkLimit(默认8000,并受 Slack 自身消息长度限制上限约束) channels.slack.streaming.chunkMode="newline"启用先按段落拆分- 文件发送使用 Slack 上传 API,并且可以包含线程回复(
thread_ts) - 较长的文件说明会将第一个 Slack 安全文本分块作为上传评论,其余分块作为后续消息发送
- 出站媒体上限在配置时遵循
channels.slack.mediaMaxMb;否则频道发送使用媒体管道中的 MIME 类型默认值
投递目标
投递目标
推荐的显式目标:
user:<id>用于 DMschannel:<id>用于频道
命令与斜杠行为
Slack 中的 Slash 命令表现为单个已配置命令或多个原生命令。配置channels.slack.slashCommand 可更改命令默认值:
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
channels.slack.commands.native: true 或 commands.native: true 启用。
- 对于 Slack,原生命令自动模式是 关闭 的,因此
commands.native: "auto"不会启用 Slack 原生命令。
- 3-5 个简短选项:溢出(
"...")菜单 - 超过 100 个选项,且可用异步选项过滤:外部选择
- 1-2 个选项,或任何其编码值对于选择器来说过长的选项:按钮块
- 否则(6-100 个选项,或超过 100 个但没有异步过滤):静态选择菜单,每个菜单最多分块显示 100 个选项
agent:<agentId>:slack:slash:<userId> 的隔离键,并仍然通过 CommandTargetSessionKey 将命令执行路由到目标对话会话。
原生图表
Slack 的公开data_visualization Block Kit 区块
可在消息中渲染折线图、柱状图、面积图和饼图。OpenClaw 将可移植的
presentation chart 区块映射为这种原生形态;除正常的
chat:write 消息访问权限外,不需要额外的 OAuth 作用域、
文件上传、图像渲染器或 Slack 配置。
- 标题和可选坐标轴标签:50 个字符
- 饼图:1-12 个正值分段
- 折线图/柱状图/面积图:1-12 个唯一命名的系列,以及 1-20 个共享类别
- 分段、类别和系列标签:20 个字符
- 每个系列都必须为每个类别包含一个有限值;非饼图数值 可以为负数
invalid_blocks 拒绝图表,OpenClaw 会移除被拒绝的原生数据区块,保留任何同级控件,并以可见文本的形式发送完整的图表表示。
Slack 当前每条消息最多接受两个 data_visualization 区块。若一个 presentation 包含超过两个有效图表,OpenClaw 会保留它们的顺序,并在后续消息中继续原生渲染,每条消息不超过两个
图表。
Slack 的 开发者发布
将该区块描述为面向应用的 Block Kit 功能,并未公布任何付费
方案限制。Business+/Enterprise 的资格说明适用于
Slackbot 自动生成 AI 图表,这与应用发送一个
已经结构化的 Block Kit 图表是不同的。图表是仅限消息的区块,不是 App
Home、模态窗口或 Canvas 内容。
原生表格
Slack 当前的data_table Block Kit 区块可在消息中渲染结构化的行和列。OpenClaw 会将显式的、可移植的
presentation table 块映射为 data_table;它不使用 Slack 旧版的table 区块。除了正常的
chat:write 消息访问权限之外,不需要额外的 OAuth 作用域或 Slack 配置。
raw_text 单元格。数值单元格映射为
raw_number,并保留有限数值以便原生排序和筛选。rowHeaderColumnIndex 在存在时,会将该从 0 开始计数的列标记为 Slack 行标题。 Slack 公布的
data_table 限制会在原生渲染前强制执行:
- 1-20 列
- 1-100 行数据,外加表头行
- 每一行的单元格数量必须相同
- 在一条消息中的所有表格单元格总字符数最多为 10,000
文本表示,供屏幕阅读器、通知、会话镜像以及无法渲染该区块的客户端使用。原始图表和表格值在回退内容中保持字面形式,因此诸如
<@U123> 这样的单元格数据不会变成 Slack 提及。如果 Slack 因
invalid_blocks 拒绝原生图表或表格区块,OpenClaw 会在一次有界恢复步骤中移除所有原生数据区块,保留诸如按钮和选择器之类的有效同级区块,并在禁用 Slack 格式化的情况下发送完整可见的图表和表格文本。斜杠命令传递会跟踪 Slack 在该命令中的五次调用 response_url 预算。在每一批回复之前,它都会选择一个能适配剩余调用次数的完整计划,否则会在发送该批次之前失败。
只有显式的 presentation 表格块才会被提升为原生表格。Markdown 管道表格仍然作为作者文本;OpenClaw 不会猜测表格结构或单元格类型。现有受信任的 Slack 原生生产者可以继续通过 channelData.slack.blocks 传递原始块;OpenClaw 会从有效的原始 data_table 单元格推导回退文本,而格式错误的自定义块可能会降级为其 caption 或通用的 Block Kit 回退。可移植 agent、CLI 和插件输出应使用 presentation。
Slack 客户端还可以将粘贴的电子表格内容作为旧版 table
块发送到消息的顶层 blocks 或 attachments 中。OpenClaw 会将这些
传入单元格渲染为对分隔符安全的 TSV,用于实时 agent 输入、线程上下文,以及
Slack read 操作。只有原生表格块才会从普通
attachments 中被接纳;link-unfurl 和其他未转发的 attachment 文本仍然
被排除在外。
插件拥有的模态框提交
注册了交互处理器的 Slack 插件,也可以在 OpenClaw 为 agent 可见的系统事件压缩负载之前,接收模态框的view_submission 和 view_closed 生命周期事件。在打开 Slack 模态框时,请使用以下一种路由模式:
- 将
callback_id设为openclaw:<namespace>:<payload>。 - 或保留现有的
callback_id,并在模态框的private_metadata中放入pluginInteractiveData: "<namespace>:<payload>"。
ctx.interaction.kind 为 view_submission 或
view_closed,规范化后的 inputs,以及来自
Slack 的完整原始 stateValues 对象。仅使用 callback-id 路由就足以调用插件处理器;当模态框还应该生成一个 agent 可见的系统事件时,请包含现有模态框的 private_metadata 用户/会话路由字段。agent 会收到一个简洁、脱敏的 Slack interaction: ... 系统事件。如果处理器返回
systemEvent.summary、systemEvent.reference 或 systemEvent.data,这些字段会包含在该简洁事件中,这样 agent 就可以引用
插件拥有的存储,而无需看到完整的表单负载。
Slack 中的原生审批
Slack 可以作为原生审批客户端,通过交互式按钮和交互操作来处理审批,而不是回退到 Web UI 或终端。- Exec 和插件审批可以渲染为 Slack 原生的 Block Kit 提示。
channels.slack.execApprovals.*仍然是原生 exec 审批客户端的启用与 DM/频道路由配置。- Exec 审批 DM 使用
channels.slack.execApprovals.approvers或commands.ownerAllowFrom。 - 当 Slack 被启用为源会话的原生审批客户端时,或者当
approvals.plugin路由到源 Slack 会话或 Slack 目标时,插件审批会使用 Slack 原生按钮。 - 插件审批 DM 使用来自
channels.slack.allowFrom、命名账号allowFrom或账号默认路由的 Slack 插件审批者。 - 审批者授权仍然会被强制执行:仅限 exec 的审批者不能批准插件请求,除非他们同时也是插件审批者。
interactivity 时,审批提示会直接在对话中渲染为 Block Kit 按钮。当这些按钮存在时,它们是主要的审批 UX;只有当工具结果表明聊天审批不可用,或手动审批是唯一途径时,OpenClaw 才应包含手动 /approve 命令。
配置路径:
channels.slack.execApprovals.enabledchannels.slack.execApprovals.approvers(可选;在可能时回退到commands.ownerAllowFrom)channels.slack.execApprovals.target(dm|channel|both,默认:dm)agentFilter、sessionFilter
enabled 未设置或为 "auto" 且至少有一个 exec 审批者可解析时,Slack 会自动启用原生 exec 审批。当 Slack 插件审批者可解析且请求匹配原生客户端过滤器时,Slack 也可以通过这个原生客户端路径处理原生插件审批。将 enabled: false 设为显式禁用 Slack 作为原生审批客户端。将 enabled: true 设为在审批者可解析时强制启用原生审批。禁用 Slack exec 审批不会禁用通过 approvals.plugin 启用的原生 Slack 插件审批投递;插件审批投递会改用 Slack 插件审批者。
未显式配置 Slack 执行审批时的默认行为:
approvals.exec 转发是独立的。仅当 exec 审批提示也必须路由到其他聊天或显式的带外目标时才使用它。共享的 approvals.plugin 转发也同样独立;只有当 Slack 能够原生处理插件审批请求时,Slack 原生投递才会抑制该回退。
同聊 /approve 也可在已经支持命令的 Slack 频道和 DM 中使用。完整的审批转发模型请参见 执行审批。
事件与运行行为
- 消息编辑/删除会映射为系统事件。
- 线程广播(“也发送到频道”线程回复)会作为普通用户消息处理。
- 反应添加/移除事件会映射为系统事件。
- 成员加入/离开、频道创建/重命名,以及置顶添加/移除事件会映射为系统事件。
- 可选的在线状态轮询可以将观察到的人工参与者从
离开到在线的转换映射到该参与者最近活跃的符合条件的 Slack 会话中。默认关闭。 - 启用
configWrites时,channel_id_changed可以迁移频道配置键。 - 频道主题/用途元数据被视为不受信任的上下文,并且可以注入到路由上下文中。
- Agent View
app_context实体会按照 Slack 相关性顺序进行验证,并且只作为结构化的不受信任上下文暴露;省略的上下文会清除该轮内容,而不是复用过期实体。 - 线程发起者和初始线程历史上下文种子在适用时会根据配置的发送者允许列表进行过滤。
- 用于探测、作用域发现、会话分类和投递对账的专用 Web API 读取请求,每次请求尝试都有 30 秒截止时间。瞬态失败仍可能重试,因此完整操作可能耗时更长。共享的 Bolt 和具备 mutation 能力的客户端不使用这个默认截止时间,因为 Slack 可能会在迟到的响应到达 OpenClaw 之前就提交 mutation。
- 块操作、快捷方式和 modal 交互会发出结构化的
Slack interaction: ...系统事件,并带有丰富的负载字段:- 块操作:所选值、标签、选择器值和
workflow_*元数据 - 全局快捷方式:回调和参与者元数据,路由到参与者的直接会话
- 消息快捷方式:回调、参与者、频道、线程和所选消息上下文
- modal
view_submission和view_closed事件,带有路由后的频道元数据和表单输入
- 块操作:所选值、标签、选择器值和
在线状态事件
Slack 不会通过 Events API 或 Socket Mode 发送在线状态变化。OpenClaw 可以改为对其消息已通过正常 Slack 访问和路由检查的人工参与者轮询users.getPresence。
off(默认):不启用在线状态计时器,也不调用 Slack API。auto:监控最近 24 小时内活跃的 DM、MPIM 和 Slack 线程,最多 8 位被观察到的人类参与者。不包括顶层频道会话。on:监控相同的会话,不设参与者上限,并包含顶层频道会话。可使用按频道覆盖来强制启用或抑制某个频道。
away 到 active 的转换时唤醒。每个 Slack 账户、工作区和用户都适用持续 8 小时的持久冷却期,即使该人员参与了多个线程也是如此。该事件只会路由到该人员最近活跃的符合条件的会话,并告知 agent 在决定是否发送一条简短问候前查阅记忆/wiki 和已知的时区上下文。agent 可以保持静默。
机器人令牌需要 users:read,推荐的 manifest 已经包含该权限。Enterprise Grid 组织范围的安装只有在授权事件识别出相应工作区后,才会创建工作区范围的轮询客户端;在线状态、冷却期和投递目标仍按工作区分区。
配置参考
主要参考:/gateway/config-channels#slack。高信号 Slack 字段
高信号 Slack 字段
- 模式/认证:
identity、mode、botToken、appToken、userToken、signingSecret、webhookPath、accounts.* - 私信访问:
dm.enabled、dmPolicy、allowFrom(旧版:dm.policy、dm.allowFrom)、dm.groupEnabled、dm.groupChannels - 兼容性开关:
dangerouslyAllowNameMatching(紧急备用;除非必要,否则保持关闭) - 频道访问:
groupPolicy、channels.*、channels.*.users、channels.*.requireMention、implicitMentions.* - 线程/历史记录:
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)、用于控制chat.postMessage链接/媒体预览的unfurlMedia;设置unfurlLinks: true以重新启用链接预览 - 运维/功能:
configWrites、commands.native、slashCommand.*、actions.*、userToken、userTokenReadOnly
故障排查
频道中没有回复
频道中没有回复
按以下顺序检查:有用的命令:
groupPolicy- 频道允许列表(
channels.slack.channels)——键必须是频道 ID(C12345678)或工作区限定的频道目标(team:<team-id>:channel:<channel-id>),不能是名称(#channel-name)。在groupPolicy: "allowlist"下,基于名称的键会静默失败,因为默认情况下频道路由优先使用 ID。要查找 ID:在 Slack 中右键点击频道 → 复制链接——URL 末尾的C...值就是频道 ID。 requireMention- 每个频道的
users允许列表 messages.groupChat.visibleReplies:普通 group/channel 请求默认是"automatic"。如果你选择了"message_tool",并且日志显示有 assistant 文本但没有message(action=send)调用,则说明模型没有走到可见的 message-tool 路径。在这种模式下,最终文本会保持私密;请检查 gateway 的详细日志以查看被抑制的 payload 元数据,或者如果你希望每个普通 assistant 最终回复都通过旧路径发布,请将其设置为"automatic"。messages.groupChat.unmentionedInbound:如果它是"room_event",那么允许的频道内未提及聊天会作为环境上下文存在,并且保持静默,除非 agent 调用message工具。参见 环境房间事件。
DM 消息被忽略
DM 消息被忽略
检查:
channels.slack.dm.enabledchannels.slack.dmPolicy(或旧版channels.slack.dm.policy)- 配对审批 / allowlist 条目(
dmPolicy: "open"仍然需要channels.slack.allowFrom: ["*"]) - 群组 DM 使用 MPIM 处理;启用
channels.slack.dm.groupEnabled,并且如果已配置,请将 MPIM 包含在channels.slack.dm.groupChannels中 - Slack Assistant DM 事件:提到
drop message_changed的详细日志 通常意味着 Slack 发送了一个编辑后的 Assistant 线程事件,但在消息元数据中没有可恢复的人类发送者
Socket 模式未连接
Socket 模式未连接
验证 Slack 应用设置中的 bot + app tokens 和 Socket Mode 启用状态。
App-Level Token 需要
connections:write,并且 Bot User OAuth Token
必须属于与 app token 相同的 Slack app/workspace。如果 openclaw channels status --probe --json 显示 botTokenStatus 或
appTokenStatus: "configured_unavailable",说明 Slack 账号已
配置,但当前运行时无法解析基于 SecretRef 的值。类似 slack socket mode failed to start; retry ... 的日志表示可恢复的
启动失败。缺少 scope、令牌被撤销以及无效认证则会立即失败。
slack token mismatch ... 日志意味着 bot token 和 app token
看起来属于不同的 Slack app;请修正 Slack app 凭据。HTTP 模式未接收到事件
HTTP 模式未接收到事件
验证:
- signing secret
- webhook path
- Slack Request URLs(Events + Interactivity + Slash Commands)
- 每个 HTTP 账号唯一的
webhookPath - 公共 URL 终止 TLS 并将请求转发到 Gateway path
- Slack app 的
request_url路径必须与channels.slack.webhookPath完全匹配(默认/slack/events)
signingSecretStatus: "configured_unavailable",
说明 HTTP 账号已配置,但当前运行时无法
解析基于 SecretRef 的 signing secret。重复出现的 slack: webhook path ... already registered 日志意味着两个 HTTP
账号使用了相同的 webhookPath;请为每个账号分配不同的路径。原生/slash 命令未触发
原生/slash 命令未触发
确认你期望的是以下哪种模式:
- 原生命令模式(
channels.slack.commands.native: true),并且 Slack 中注册了匹配的 slash 命令 - 或单一 slash 命令模式(
channels.slack.slashCommand.enabled: true)
commands.allowFrom(如果已配置)、DM 授权、
频道 allowlist 以及每个频道的 users 允许列表。频道 allowlist 中的 access-group
条目会自动解析。对于被阻止的 slash 命令发送者,Slack 会返回以下临时错误:此频道不被允许。你无权在此处使用此命令。
附件媒体参考
当 Slack 文件下载成功且大小限制允许时,Slack 可以将下载的媒体附加到代理轮次中。音频片段可以被转写,图像文件可以通过媒体理解路径处理,或直接传递给支持视觉的回复模型,而其他文件仍可作为可下载的文件上下文使用。支持的媒体类型
入站管道
当带有文件附件的 Slack 消息到达时:- OpenClaw 使用 bot token 从 Slack 的私有 URL 下载文件。
- 下载成功后,文件会写入媒体存储。
- 下载后的媒体路径和内容类型会添加到入站上下文中。
- 音频片段会路由到共享转写管道;支持图像的模型/工具路径可以使用同一上下文中的图像附件。
- 其他文件仍可作为文件元数据或媒体引用供能够处理它们的工具使用。
线程根附件继承
当消息在某个线程中到达(具有thread_ts 父级)时:
- 如果回复本身没有直接媒体,而包含的根消息有文件,则 Slack 可以将根文件作为线程起始上下文注入。
- 只有在初始化新的或重置后的线程会话时,才会注入根文件。后续仅文本回复会复用现有会话上下文,不会将根文件重新附加为新的媒体。
- 直接回复附件的优先级高于根消息附件。
- 仅包含文件而没有文本的根消息会以附件占位符表示,以便回退逻辑仍可包含其文件。
多附件处理
当单条 Slack 消息包含多个文件附件时:- 每个附件都会通过媒体管道独立处理。
- 下载后的媒体引用会聚合到消息上下文中。
- 处理顺序遵循事件负载中 Slack 文件的顺序。
- 某个附件下载失败不会阻止其他附件处理。
大小、下载与模型限制
- 大小上限:默认每个文件 20 MB。可通过
channels.slack.mediaMaxMb配置。 - 音频转写上限:当下载的文件发送到转写提供方或 CLI 时,也会应用所选支持音频的
tools.media.models[]条目的maxBytes。 - 下载失败:Slack 无法提供的文件、过期的 URL、无法访问的文件、超大文件以及 Slack 认证/登录 HTML 响应都会被跳过,而不会被报告为不支持的格式。
- 视觉模型:如果当前回复模型支持视觉,则图像分析使用该模型;否则使用
agents.defaults.imageModel中配置的图像模型。
已知限制
相关文档
相关内容
配对
将 Slack 用户与网关配对。
群组
频道和群组 DM 的行为。
频道路由
将入站消息路由给代理。
安全
威胁模型与加固。
配置
配置布局与优先级。
斜杠命令
命令目录与行为。