跳转至

消息行为

OpenClaw 工作时 Slack 对话呈现的样子,以及命令如何到达它。

确认反应

ackReaction 在 OpenClaw 处理传入消息时发送确认表情。ackReactionScope 决定该表情实际发送的_时机_。

确认表情在工作期间保持静态。当 messages.statusReactions.enabled: true 时,实际失败会短暂显示错误反应,然后恢复确认表情。工具调用、思考、压缩和长时间运行的工具不会轮换或累积反应,成功完成也不会闪现单独的成功表情。

表情符号(ackReaction)

解析顺序:

  • channels.slack.accounts.<accountId>.ackReaction
  • channels.slack.ackReaction
  • messages.ackReaction
  • 代理身份表情回退(agents.entries.*.identity.emoji,否则 "eyes" / 👀)

说明:

  • Slack 期望使用短代码(例如 "eyes")。
  • 使用 "" 可为 Slack 账户或全局禁用该反应。

范围(messages.ackReactionScope)

Slack 提供程序从 messages.ackReactionScope 读取范围(默认 "group-mentions")。没有 Slack 账户或 Slack 频道级别的覆盖;该值对网关全局有效。

取值:

  • "all":在私信和群组中反应,包括环境房间事件。
  • "direct":仅在私信中反应。
  • "group-all":对除环境房间事件外的所有群组消息反应(不包括私信)。
  • "group-mentions"(默认):在群组中反应,但仅当机器人被提及时(或在已选择加入的群组可提及对象中)。私信被排除。
  • "off" / "none":从不反应。

Note

默认范围("group-mentions")不会在私信或环境房间事件中触发确认反应。若要在传入的 Slack 私信和安静房间事件中看到已配置的 ackReaction(例如 "eyes"),请将 messages.ackReactionScope 设置为 "all"。范围更改会在不重新连接 Slack 的情况下应用于下一条消息。

{
  messages: {
    ackReaction: "eyes",
    ackReactionScope: "all", // react in DMs and groups
  },
}

回复线程、历史记录限制、文本分块限制、流式传输、正在输入反应和 unfurl 设置会在不重新连接 Slack 的情况下应用于下一条被接纳的消息。活动 回复会保留其开始时使用的设置。账户覆盖也适用相同行为。

文本流式传输

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

  • off:禁用实时预览流式传输。
  • partial:用最新的部分输出替换预览文本。设置此值可恢复 2026.8.1 之前的默认值,即 progress 成为默认值之前(#122552)。
  • block:追加分块预览更新。
  • progress(默认):在 Slack 支持时,使用原生任务卡片在回复线程中显示结构化进度,并以 Block Kit 会话卡片作为回退。在回复线程之外,默认仅保留最终答案。
  • streaming.progress.toolProgress:progress 模式默认保持安静(false)。设置为 true 会为每次工具调用添加一行任务(原生卡片)或一行活动(Block Kit 卡片),并在 Block Kit 卡片上添加工具/文件/时间计数器。streaming.preview.toolProgress 控制 partial 和 block 模式中的工具预览(默认:true)。
  • streaming.preview.commandText / streaming.progress.commandText:status 保留紧凑的工具进度行,同时隐藏原始命令/执行文本(默认);设置为 raw 可选择显示命令文本。

显示工具日志,同时隐藏原始命令/执行文本:

{
  "channels": {
    "slack": {
      "streaming": {
        "mode": "progress",
        "progress": {
          "toolProgress": true,
          "commandText": "status"
        }
      }
    }
  }
}

channels.slack.streaming.nativeTransport 在 channels.slack.streaming.mode 为 partial 时控制 Slack 原生文本流式传输(默认:true)。

在 progress 模式中,没有回复线程目标的轮次不会发布预览或进度消息,除非你明确选择一种展示方式。这包括有效 replyToMode: "off" 的频道回复以及普通顶层私信。这些轮次使用临时正在输入反应,并一次性交付最终答案;失败仍使用正常错误交付。任何显式的 streaming.progress 设置都会让顶层轮次加入预览,包括 commentary: true 或自定义 label。唯一例外是 nativeTaskCards: true,它只影响线程。空的 streaming.progress 对象或仅设置 streaming.mode: "progress" 会保持安静的顶层默认行为。此规则适用于合并根设置和账户覆盖后的有效设置。模式 off、partial 和 block 保留其现有行为。

对于线程轮次,包括 Agent View、Assistant View 和 Slack 管理的线程,Slack 的原生代理卡片仍是默认:整个轮次是一条流式消息,将叙述与实时计划/任务卡片交错,并在同一条消息中以助手的回答结束。当代理发布计划时,卡片显示已编写的计划步骤;否则显示一行稳定的工作摘要;审批请求拥有自己的行。默认情况下,中间工具失败和非零命令退出会被隐藏,因此成功回答不会累积失败或 Recovered: … 行。当 progress.toolProgress: true 时,它还会显示每个工具的任务行,包括工具失败,并与任何已编写的计划并列显示。常规更新以一秒间隔合并;审批、可见失败和完成会绕过该延迟。只有当轮次执行了实际工作——短暂延迟后工具或计划活动仍在运行——卡片才会出现,因此普通问题会在没有卡片的情况下得到回答。

如果没有已编写或显式的标题,原生摘要行会以 已完成 或 失败 结束。

将 channels.slack.streaming.progress.nativeTaskCards 设置为 false 可回退到 Block Kit 会话卡片,它会发布一条单独的消息,显示标题、叙述、计划清单和已编写的评论,并最终确定为成功或错误。如果没有已编写或显式的标题,完成的卡片会显示 完成 或 失败。当 progress.toolProgress: true 时,它还会列出最近的工具活动、工具/文件总数和已用时间。

将 channels.slack.streaming.progress.style 设置为 "compact",以使用一个纯文本进度草稿,而不是任一种卡片界面。显式设置 progress.toolProgress: false 也会在 style 未设置时选择紧凑样式。设置 style: "card" 可在 toolProgress: false 时保留卡片,或为顶层轮次选择 Block Kit 卡片。评论以斜体文本显示,且已生成的推理和审批请求仍可见。终端任务错误仍使用常规错误投递。最终响应作为新消息发布,然后在 Slack 确认投递后删除临时预览。被人工回复取代的旧预览会随之清理;持久消息和视频保留在对话中。

对于流式前导文本,Slack 会等待第一个完整的前导文本后再创建消息,因此其通知包含完整思考,而不是单个 Token。一旦该消息存在,后续前导文本可以作为编辑进行流式传输,而无需再次通知。

{
  channels: {
    slack: {
      streaming: {
        mode: "progress",
        progress: {
          style: "compact",
          label: false,
          commentary: true,
          toolProgress: false,
        },
      },
    },
  },
}

紧凑进度始终使用常规最终投递,包括媒体和错误。其他草稿模式在回复无法安全替换草稿时使用常规投递,包括超大文本、拆分块负载、自定义出站身份或编辑失败。

两种界面都通过 Open in OpenClaw 链接会话,但仅当该链接可以工作时:必须设置 gateway.publicOrigin(外部可达的 Gateway 源),并且 Control UI 不得通过 gateway.controlUi.enabled: false 禁用。未设置 publicOrigin 的安装——即无法从 Slack 访问 OpenClaw 的情况——不会获得链接,而不是获得一个失效链接。如果 Control UI 在路径前缀下提供服务,还需设置 gateway.controlUi.basePath。

当某个轮次生成一个可见工作会话时,完成卡片改为通过 Open work session 链接到该子会话。对于多个可见工作会话,它会按接受顺序显示最多五个链接,使用它们的标签或编号的 Open work session 链接;隐藏的子代理不会替换会话链接。

  • 必须存在回复线程,才能显示原生文本流和 Slack 会话状态。线程选择仍遵循 replyToMode。
  • 频道、群聊和顶层 DM 根在显式选择时使用草稿预览。没有回复线程的默认 progress 轮次仅使用临时输入反应。
  • 顶层 Slack DM 默认保持在线程外;Agent View 和 Assistant View 保留其基于线程的原生进度。
  • 自定义出站用户名/图标设置会保持可移植预览启用。OpenClaw 保持预览或会话卡片由应用创建,并单独投递自定义的最终消息。Slack 不允许删除冒充消息。
  • 媒体和非文本负载回退到常规投递。
  • 在紧凑进度之外,媒体/错误最终消息会取消待处理的预览编辑;符合条件的文本/块最终消息只有在能够就地编辑预览时才会刷新。
  • 原生流式回复会等待 Slack 的确认,然后才将投递标记为成功。每个完整的回复块都会单独刷新,包括短块;常规进度更新仍会合并。稍后进度卡片最终化失败不会丢弃已确认的回复。
  • 显式的 HTTP 429 速率限制拒绝默认最多重试两次,在 Slack 的 Retry-After 延迟之后。这也适用于普通消息和上传完成;丢失的响应和服务器错误不会被重放。
  • 明确的接收者或范围拒绝会为缓冲文本回退到常规投递。模糊的流式失败(例如丢失的响应)会报告失败,而不会重放未确认的文本,因为 Slack 可能已经接受了它。后续负载使用常规投递。

使用草稿预览而不是 Slack 原生文本流:

{
  channels: {
    slack: {
      streaming: {
        mode: "partial",
        nativeTransport: false,
      },
    },
  },
}

保持 Slack 原生进度任务卡片在带线程的轮次中启用:

{
  channels: {
    slack: {
      streaming: {
        mode: "progress",
        progress: {
          nativeTaskCards: true,
        },
      },
    },
  },
}

旧版键:

  • 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 会在 OpenClaw 处理回复时,为传入的 Slack 消息添加一个临时反应,并在运行结束时将其移除。这在非线程回复之外最有用,因为线程回复使用 Slack 的 processing 会话状态。

解析顺序:

  • channels.slack.accounts.<accountId>.typingReaction
  • channels.slack.typingReaction
  • 对于没有回复线程或未显式选择进度呈现的默认 progress 轮次,使用 "hourglass_flowing_sand";否则不使用输入反应。

说明:

  • Slack 期望使用短代码(例如 "hourglass_flowing_sand")。
  • 使用 "" 可禁用输入反应,包括安静顶层轮次的默认值。
  • 该反应是尽力而为的,并在回复或失败路径完成后自动尝试清理。

命令和斜杠行为

斜杠命令在 Slack 中显示为单个已配置命令或多个原生命令。配置 channels.slack.slashCommand 以更改命令默认值:

  • enabled: false
  • name: "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 将命令执行路由到目标会话。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw