Slack

Slack

状态:通过 Slack 应用集成为私聊 + 频道做好生产准备。默认模式是 Socket Mode;也支持 HTTP Events API 模式。

快速设置

1

创建 Slack 应用和令牌

在 Slack 应用设置中:

  • 启用Socket Mode
  • 创建应用令牌xapp-...)带有 connections:write
  • 安装应用并复制机器人令牌xoxb-...
2

配置 OpenClaw

{
  channels: {
    slack: {
      enabled: true,
      mode: "socket",
      appToken: "xapp-...",
      botToken: "xoxb-...",
    },
  },
}

环境变量回退(仅默认账户):

SLACK_APP_TOKEN=xapp-...
SLACK_BOT_TOKEN=xoxb-...
3

订阅应用事件

订阅机器人事件:

  • app_mention
  • message.channelsmessage.groupsmessage.immessage.mpim
  • reaction_addedreaction_removed
  • member_joined_channelmember_left_channel
  • channel_rename
  • pin_addedpin_removed

同时为私聊启用 App Home消息选项卡

4

启动网关

openclaw gateway

令牌模型

  • Socket Mode 需要 botToken + appToken
  • HTTP 模式需要 botToken + signingSecret
  • 配置令牌覆盖环境变量回退。
  • SLACK_BOT_TOKEN / SLACK_APP_TOKEN 环境变量回退仅适用于默认账户。
  • userTokenxoxp-...)仅限配置(无环境变量回退)并默认为只读行为(userTokenReadOnly: true)。
  • 可选:如果你想让传出消息使用活动代理身份(自定义 username 和图标),添加 chat:write.customizeicon_emoji 使用 :emoji_name: 语法。

对于动作/目录读取,配置时可以优先使用用户令牌。对于写入,机器人令牌仍然是首选;仅当 userTokenReadOnly: false 且机器人令牌不可用时才允许用户令牌写入。

访问控制和路由

channels.slack.dmPolicy 控制私聊访问(旧版:channels.slack.dm.policy):

  • pairing(默认)
  • allowlist
  • open(需要 channels.slack.allowFrom 包含 "*";旧版:channels.slack.dm.allowFrom
  • disabled

私聊标志:

  • dm.enabled(默认 true)
  • channels.slack.allowFrom(首选)
  • dm.allowFrom(旧版)
  • dm.groupEnabled(群组私聊默认 false)
  • dm.groupChannels(可选 MPIM 白名单)

多账户优先级:

  • channels.slack.accounts.default.allowFrom 仅适用于 default 账户。
  • 命名账户在其自身的 allowFrom 未设置时继承 channels.slack.allowFrom
  • 命名账户不继承 channels.slack.accounts.default.allowFrom

私聊中的配对使用 openclaw pairing approve slack <code>

命令和斜杠行为

  • 原生命令自动模式对 Slack 关闭commands.native: "auto" 不启用 Slack 原生命令)。
  • 使用 channels.slack.commands.native: true(或全局 commands.native: true)启用原生 Slack 命令处理程序。
  • 启用原生命令时,在 Slack 中注册匹配的斜杠命令(/<command> 名称),但有一个例外:
    • 为状态命令注册 /agentstatus(Slack 保留 /status
  • 原生参数菜单现在适应其渲染策略:
    • 最多 5 个选项:按钮块
    • 6-100 个选项:静态选择菜单
    • 超过 100 个选项:外部选择,当交互选项处理程序可用时进行异步选项过滤
    • 如果编码的选项值超过 Slack 限制,流程回退到按钮
  • 对于长选项负载,斜杠命令参数菜单在分发选定值之前使用确认对话框。

默认斜杠命令设置:

  • enabled: false
  • name: "openclaw"
  • sessionPrefix: "slack:slash"
  • ephemeral: true

斜杠会话使用隔离键:

  • agent:<agentId>:slack:slash:<userId>

并将命令执行路由到目标对话会话(CommandTargetSessionKey)。

主题、会话和回复标签

  • 私聊路由为 direct;频道为 channel;MPIM 为 group
  • 使用默认 session.dmScope=main,Slack 私聊折叠到代理主会话。
  • 频道会话:agent:<agentId>:slack:channel:<channelId>
  • 主题回复在适用时可以创建主题会话后缀(:thread:<threadTs>)。
  • channels.slack.thread.historyScope 默认是 threadthread.inheritParent 默认是 false
  • channels.slack.thread.initialHistoryLimit 控制新主题会话启动时获取多少现有主题消息(默认 20;设置 0 禁用)。

回复主题控制:

  • channels.slack.replyToModeoff|first|all(默认 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 回复在主聊天流中保持可见。

媒体、分块和传递

动作和门

Slack 动作由 channels.slack.actions.* 控制。

当前 Slack 工具中可用的动作组:

默认
messages启用
reactions启用
pins启用
memberInfo启用
emojiList启用

事件和操作行为

  • 消息编辑/删除/主题广播映射到系统事件。
  • 反应添加/删除事件映射到系统事件。
  • 成员加入/离开、频道创建/重命名和固定添加/删除事件映射到系统事件。
  • 助手主题状态更新(用于主题中的"正在输入..."指示器)使用 assistant.threads.setStatus 并需要机器人范围 assistant:write
  • configWrites 启用时,channel_id_changed 可以迁移频道配置键。
  • 频道主题/目的元数据被视为不受信任的上下文,可以注入到路由上下文中。
  • 块动作和模态交互发出结构化的 Slack interaction: ... 系统事件,带有丰富的负载字段:
    • 块动作:选定的值、标签、选择器值和 workflow_* 元数据
    • 模态 view_submissionview_closed 事件,带有路由频道元数据和表单输入

确认反应

ackReaction 在 OpenClaw 处理入站消息时发送确认表情符号。

解析顺序:

  • channels.slack.accounts.<accountId>.ackReaction
  • channels.slack.ackReaction
  • messages.ackReaction
  • 代理身份表情符号回退(agents.list[].identity.emoji,否则 "👀")

注意:

  • Slack 需要短代码(例如 "eyes")。
  • 使用 "" 为频道或账户禁用反应。

Manifest 和范围检查清单

故障排除

文本流式传输

OpenClaw 通过 Agents and AI Apps API 支持 Slack 原生文本流式传输。

channels.slack.streaming 控制实时预览行为:

  • off:禁用实时预览流式传输。
  • partial(默认):用最新的部分输出替换预览文本。
  • block:追加块状预览更新。
  • progress:生成时显示进度状态文本,然后发送最终文本。

channels.slack.nativeStreaming 控制 Slack 的原生流式 API(chat.startStream / chat.appendStream / chat.stopStream),当 streamingpartial 时(默认:true)。

禁用原生 Slack 流式传输(保留草稿预览行为):

channels:
  slack:
    streaming: partial
    nativeStreaming: false

旧版键:

  • channels.slack.streamModereplace | status_final | append)自动迁移到 channels.slack.streaming
  • 布尔 channels.slack.streaming 自动迁移到 channels.slack.nativeStreaming

要求

  1. 在 Slack 应用设置中启用Agents and AI Apps
  2. 确保应用具有 assistant:write 范围。
  3. 该消息必须有可用的回复主题。主题选择仍遵循 replyToMode

行为

  • 第一个文本块启动流(chat.startStream)。
  • 后续文本块追加到同一流(chat.appendStream)。
  • 回复结束完成流(chat.stopStream)。
  • 媒体和非文本负载回退到正常传递。
  • 如果流式传输在回复中途失败,OpenClaw 对其余负载回退到正常传递。

配置参考指针

主要参考:

  • 配置参考 - Slack

    高信号 Slack 字段:

    • 模式/认证:modebotTokenappTokensigningSecretwebhookPathaccounts.*
    • 私聊访问:dm.enableddmPolicyallowFrom(旧版:dm.policydm.allowFrom)、dm.groupEnableddm.groupChannels
    • 兼容性切换:dangerouslyAllowNameMatching(紧急;除非需要否则保持关闭)
    • 频道访问:groupPolicychannels.*channels.*.userschannels.*.requireMention
    • 主题/历史:replyToModereplyToModeByChatTypethread.*historyLimitdmHistoryLimitdms.*.historyLimit
    • 传递:textChunkLimitchunkModemediaMaxMbstreamingnativeStreaming
    • 操作/功能:configWritescommands.nativeslashCommand.*actions.*userTokenuserTokenReadOnly

相关