channels.<channel>.streaming.mode: "progress" 后,OpenClaw 会在真正开始工作时创建这条
消息,在代理读取、规划、调用工具或等待批准时对其进行编辑,然后将其转换为最终答案。
Discord 默认将预览流式传输设为
off;设置 streaming.mode: "progress"
即可启用。Telegram 默认使用 progress,无需额外配置。在任一平台上设置
mode: "partial",即可改为流式传输答案文本。有关每个频道默认设置的完整表格,请参阅
流式传输与分块。快速开始
用户会看到什么
状态标题位于滚动进度行的上方,并且两者都会保持可见,
因此一条消息即可说明代理正在做什么,以及目前进展到哪一步。
对于原始工具进度,标签会在代理开始进行有意义的工作后显示,
并在初始延迟期间保持忙碌状态。
它位于滚动进度行列表的顶部,因此当出现足够多的具体工作行后就会向上滚动消失。除非你明确配置了标签,否则在存在状态标题时会隐藏隐式标签。纯文本回复不会显示进度草稿;只有真正的工作更新才会显示进度行,
例如
🛠️ Bash: 运行测试、🔎 Web Search: 搜索“discord edit message”,
或 ✍️ Write: 写入 /tmp/file。
当通道可以安全地这样做时,最终答案会直接替换草稿;否则 OpenClaw 会通过正常传递发送最终答案,并清理或停止更新草稿(参见 最终处理)。
选择一种模式
channels.<channel>.streaming.mode 控制可见的进行中行为:
当用户更关心“正在发生什么”,而不是看答案文本逐个 token 逐步输出时,选择
progress;当答案文本本身就是进度信号时,选择 partial;对于更大的预览块,选择 block。在 Discord 和 Telegram 上,streaming.mode: "block" 仍然是预览流式输出,而不是普通的块回复发送——若要实现后者,请使用 streaming.block.enabled。
配置标签
进度标签位于channels.<channel>.streaming.progress 下。默认的
原始工具行标签是 "auto",它使用内置的普通 Working
标签。状态标题会隐藏这个隐式标签;如果你也想在其上方显示标签,请显式设置
label: "auto":
label: "auto" 时,仍会按随机/种子选择):
控制进度行
进度行来自实际运行事件:工具启动、项目更新、任务计划、审批、命令输出、补丁摘要以及类似的代理活动。默认情况下它们处于启用状态(progress.toolProgress,默认值为 true),并会显示在状态标题下方。设置 progress.toolProgress: false 可仅保留标题。
工具在单次调用仍在运行时,也可以发出类型化进度。这就是慢速获取或搜索在工具返回最终结果之前,如何更新可见草稿的方式。进度更新是一个部分工具结果,模型内容为空,并带有显式的公共通道元数据:
progress.text。正常的工具结果仍会在之后以 content/details 的形式到达,并且是唯一返回给模型的部分。
为工具添加进度时,应发出简短、通用的消息,并且只在操作已挂起足够长时间、足以体现价值时再发送。web_fetch 正是这样做的,延迟 5 秒:
细节模式
OpenClaw 为进度草稿和/verbose 使用相同的格式化器:
"explain" 是默认值,并通过简洁的标签保持草稿稳定。"raw" 会在可用时附加底层工具详细信息。命令文本还需要在下方显式选择加入 streaming.progress.commandText: "raw"。启用该选项后,node --check /tmp/app.js 调用在不同模式下的渲染如下:
命令/exec 文本
streaming.progress.commandText(默认 "status")控制 exec/bash 进度行旁显示多少命令详细信息,与上述详细模式相互独立。将其设置为 "raw" 可选择显示命令文本;保持为 "status" 则仅显示工具进度状态:
评论通道
streaming.progress.commentary(默认 false)会将模型的工具前评论/前导叙述(💬,例如“我会先检查……然后……”)与草稿中的工具行交错显示。有关跨通道共享的配置形状,请参见
流式传输与分块。
启用评论通道后,前导语只会渲染为这些交错的
💬 行;下面的状态标题会避开显示,从而让该通道保持其
文档中定义的形状。
状态标题
在 Discord 和 Telegram 的进度模式下,只要可用,模型的类型化工具前前导语 就会成为草稿的状态标题。其他 进度模式通道会保留其现有的状态行为。状态标题默认开启,并且不会绕过短轮次的正常活动门槛; 启用streaming.progress.commentary 会将前导语交给交错的
评论通道处理。
在 Discord 上,当有一个实用模型为代理解析时——无论是显式的
utilityModel,还是主
提供方声明的小模型默认值(OpenAI → gpt-5.6-luna,
Anthropic → claude-haiku-4-5)——如果模型没有输出前导语,或已安静约 20 秒,
它会提供一段简短、通俗的填充文本
(Telegram 的标题目前仍仅使用前导语):
streaming.progress.narration,默认
true),并且永远不会回退到主模型:它只在显式
utilityModel 或提供方为代理的主
提供方声明默认值时运行。设置 utilityModel: "" 可完全禁用实用路由。工具行会继续在下方累积,并在两个状态来源都停止时返回。如果配置了状态文本,草稿编辑仍会等待正常的活动门槛和实际
文本变更,这可避免在快速轮次中闪烁,并减少繁忙
通道中的编辑抖动。设置 narration: false 可仅禁用实用模型填充;模型
前导语标题仍保持启用:
commandText: "status" 时,叙述输入也会省略 exec/bash 命令文本,与草稿所显示的内容保持一致。
行数限制
限制可见行数(默认 8):富渲染(Slack)
Slack 可以将进度行渲染为结构化的 Block Kit 字段,而不是纯文本:隐藏工具/任务行
保留单一进度草稿,但隐藏工具和任务行:toolProgress: false 时,OpenClaw 仍会抑制该轮次中较旧的独立工具进度消息——通道会保持视觉上安静,直到最终答案;如果配置了标签,则标签除外。
频道行为
不支持安全编辑的频道会回退到输入指示器或仅最终内容传递。有关每个频道完整运行时行为分解,请参见 流式传输和分块。
最终化
当最终答案准备好时,OpenClaw 会尽量保持聊天整洁:- 在 Discord 的
progress模式下,最终答案会作为一条新的消息发送,并在末尾附加一个很小的-#活动回执(例如-# 🧠 2 thoughts · 🛠️ 5 tool calls · ⏱️ 12s),并且在该答案送达后会删除状态草稿。繁忙的频道不会在回复上方留下孤立的工具日志;出错的最终结果会保留草稿,作为失败轮次的可见记录。 - 如果草稿可以安全地直接成为最终答案(
partial/block模式),OpenClaw 会就地编辑它。 - 如果频道使用原生进度流,OpenClaw 会在原生传输接受最终文本时结束该流。
- 否则(媒体、审批提示、显式回复目标、分块过多,或编辑/发送失败),OpenClaw 会通过正常的频道投递路径发送最终答案,而不是覆盖草稿。
故障排查
我只看到了最终答案。 检查channels.<channel>.streaming.mode 对于处理该消息的账号
或频道是否为 progress。某些群组或引用回复路径会在频道无法安全编辑正确
消息时,为该轮禁用草稿预览。
我看到了标签,但没有工具行。
检查 streaming.progress.toolProgress。如果它是 false,OpenClaw 会保留单一草稿行为,但会隐藏工具和任务进度行。
我看到的是一条新的最终消息,而不是编辑后的草稿。
这是 最终化 中描述的安全回退。它
可能发生在媒体回复、长答案、显式回复目标、旧的 Telegram
草稿、缺失的 Slack 线程目标、已删除的预览消息,或本地流最终化失败时。
我仍然看到了独立的进度消息。
只要草稿处于激活状态,进度模式就会抑制默认的独立工具进度消息。如果独立消息仍然出现,请确认该轮实际上使用的是 progress 模式,而不是 streaming.mode: "off",或者是某个无法为该消息创建草稿的频道路径。
Teams 的行为与 Discord 或 Telegram 不同。
Microsoft Teams 在个人聊天中使用原生流,而不是通用的发送并编辑预览传输,并且将 streaming.mode: "block" 映射为 Teams 的块式投递,因为它没有像 Discord 和 Telegram 那样的草稿预览块模式。