Appearance
Progress drafts 让 OpenClaw 在长时间运行的智能体回合中,用一条持续更新的消息展示“正在做什么”,而不是生成一堆临时状态回复。核心配置是 channels.<channel>.streaming.mode: "progress",OpenClaw 会在工作超过 5 秒或触发第二个工作事件后显示标签,然后添加工具图标和说明行。最终回答会尽量直接编辑这条草稿,失败时回退到正常回复。如果不显示进度行,检查 streaming.progress.toolProgress;如果看到新消息而不是编辑,通常是媒体回复、过长回答或渠道限制的自我保护。
OpenClaw Progress drafts 配置与故障排查
Progress drafts 让长时间运行的智能体回合在聊天中显得更“鲜活”,而不会将对话变成一堆临时状态回复。
启用进度草稿后,OpenClaw 在回合确认开始实际工作后创建一条可见的进展消息,在智能体阅读、计划、调用工具或等待批准时持续更新,并在渠道安全的情况下将这条草稿变成最终回复。
text
Shelling...
📖 from docs/concepts/progress-drafts.md
🔎 Web Search: for "discord edit message"
🛠️ Bash: run tests当你想让用户看到工具密集型任务的状态,并在回合结束后获得干净回复时,使用进度草稿。
快速开始
在每个渠道上通过 streaming.mode: "progress" 启用:
json5
{
channels: {
discord: {
streaming: {
mode: "progress",
},
},
},
}这通常就够了。OpenClaw 会自动选择一个单词的标签,等待工作持续至少 5 秒或发出第二个工作事件,在有实际工作时添加紧凑的进度行,并抑制该回合的重复独立进度消息。
用户看到什么
进度草稿包含两部分:
| 部分 | 目的 |
|---|---|
| 标签 | 一个简短的状态行,例如 Working 或 Shelling。 |
| 进度行 | 与详细输出相同的工具图标和格式,紧凑显示每个运行更新。 |
标签在智能体开始有意义工作后出现,并且要么持续忙碌 5 秒,要么触发第二个工作事件。它是滚动进度行列表的一部分,因此一旦出现足够的实际工作,起始状态会滚动离开。纯文本回复不会显示进度草稿。进度行只在智能体发出有用的工作更新时添加,例如 🛠️ Bash: run tests、🔎 Web Search: for "discord edit message" 或 ✍️ Write: to /tmp/file。默认使用与 /verbose 相同的简洁解释模式;调试时设置为 agents.defaults.toolProgressDetail: "raw" 以追加原始命令/详情。最终回复在可能时替换草稿;否则 OpenClaw 正常发送最终回复,并根据渠道的传输方式清理或停止更新草稿。
选择模式
channels.<channel>.streaming.mode 控制可见的进行中行为:
| 模式 | 最适合 | 聊天中显示的内容 |
|---|---|---|
off | 安静渠道 | 仅最终回复。 |
partial | 观察回复文本逐步出现 | 一条随着最新回复文本编辑的草稿。 |
block | 较大的回复预览块 | 一条以较大块更新或追加的预览。 |
progress | 工具密集或长时间运行的回合 | 一条状态草稿,然后最终回复。 |
当用户更关心“发生了什么”而不是逐词查看回复文本时,选择 progress。
当回复本身就是进度信号时,选择 partial。
当需要以较大的文本块更新预览草稿时,选择 block。在 Discord 和 Telegram 上,streaming.mode: "block" 仍然是预览流式输出,而不是正常的块传递。如需正常的块回复,使用 streaming.block.enabled 或传统的 blockStreaming。
配置标签
进度标签位于 channels.<channel>.streaming.progress。
默认标签是 auto,从 OpenClaw 内置的单词标签池中选取:
text
Working
Shelling
Scuttling
Clawing
Pinching
Molting
Bubbling
Tiding
Reefing
Cracking
Sifting
Brining
Nautiling
Krilling
Barnacling
Lobstering
Tidepooling
Pearling
Snapping
Surfacing使用固定标签:
json5
{
channels: {
discord: {
streaming: {
mode: "progress",
progress: {
label: "Investigating",
},
},
},
},
}使用自定义自动标签池:
json5
{
channels: {
discord: {
streaming: {
mode: "progress",
progress: {
label: "auto",
labels: ["Checking", "Reading", "Testing", "Finishing"],
},
},
},
},
}隐藏标签,仅显示进度行:
json5
{
channels: {
discord: {
streaming: {
mode: "progress",
progress: {
label: false,
},
},
},
},
}控制进度行
进度行默认启用,来自真实的运行事件:工具启动、项目更新、任务计划、批准、命令输出、补丁摘要等智能体活动。
OpenClaw 对进度草稿和 /verbose 使用相同的格式化器:
json5
{
agents: {
defaults: {
toolProgressDetail: "explain", // explain | raw
},
},
}"explain" 是默认值,保持草稿稳定,显示简洁标签如 🛠️ check JS syntax for /tmp/app.js。"raw" 在可用时追加底层命令/详情,调试时有用,但在聊天中更嘈杂。
例如,相同命令根据详情模式显示不同:
| 模式 | 进度行 |
|---|---|
explain | 🛠️ check JS syntax for /tmp/app.js |
raw | 🛠️ check JS syntax for /tmp/app.js, node --check /tmp/app.js |
限制可见行数:
json5
{
channels: {
discord: {
streaming: {
mode: "progress",
progress: {
maxLines: 4,
},
},
},
},
}进度行会自动压缩,以减少编辑草稿时的聊天气泡重排。
OpenClaw 默认截断长进度行,使重复编辑不会每次换行。默认每行字符上限是 120。普通文本在单词边界截断,长路径或原始命令用中间省略号缩短,以便后缀可见。
调整每行字符上限:
json5
{
channels: {
discord: {
streaming: {
mode: "progress",
progress: {
maxLineChars: 160,
},
},
},
},
}Slack 可以以结构化的 Block Kit 字段渲染进度行,而不是单一文本正文:
json5
{
channels: {
slack: {
streaming: {
mode: "progress",
progress: {
render: "rich",
},
},
},
},
}丰富渲染保留相同的纯文本回退,因此不支持丰富形状的渠道和客户端仍可显示紧凑的进度文本。
保留单个进度草稿但隐藏工具和任务行:
json5
{
channels: {
discord: {
streaming: {
mode: "progress",
progress: {
toolProgress: false,
},
},
},
},
}设置 toolProgress: false 后,OpenClaw 仍然抑制该回合较旧的独立工具进度消息。渠道保持视觉安静直到最终回复,除了已配置的标签以外。
渠道行为
每个渠道使用其支持的最干净的传输方式:
| 渠道 | 进度传输方式 | 备注 |
|---|---|---|
| Discord | 发送一条消息,然后编辑它。 | 当最终文本适合一条安全预览消息时,原地编辑文本。 |
| Matrix | 发送一个事件,然后编辑它。 | 账户级流式配置控制账户级草稿。 |
| Microsoft Teams | 个人聊天中的原生 Teams 流。 | streaming.mode: "block" 映射到 Teams 块传递。 |
| Slack | 原生流或可编辑的草稿帖子。 | 线程可用性影响是否可以使用原生流。 |
| Telegram | 发送一条消息,然后编辑它。 | 旧的可见草稿可能被替换,使最终时间戳保持有用。 |
| Mattermost | 可编辑的草稿帖子。 | 工具活动被折叠到同一草稿风格帖子中。 |
没有安全编辑支持的渠道通常回退到打字指示或仅最终回复。
最终化
当最终回复就绪时,OpenClaw 尝试保持聊天干净:
- 如果草稿可以安全地成为最终回复,OpenClaw 会原地编辑它。
- 如果渠道使用原生进度流,OpenClaw 会在原生传输接受最终文本时完成该流。
- 如果最终回复包含媒体、批准提示、明确回复目标、过多块、或编辑/发送失败,OpenClaw 将通过正常渠道发送路径发送最终回复。
回退路径是有意的。发送一条全新的最终回复,好过丢失文本、错误线程回复或覆盖一个无法安全表示的草稿。
故障排查
我只看到最终回复。
检查处理消息的账户或渠道是否设置了 channels.<channel>.streaming.mode: "progress"。某些群组或引用回复路径可能在该回合禁用草稿预览,因为渠道无法安全编辑正确的消息。
我看到标签但没有工具行。
检查 streaming.progress.toolProgress。如果设置为 false,OpenClaw 保留单个草稿行为但隐藏工具和任务进度行。
我看到的是一条全新的最终消息,而不是编辑的草稿。
这是安全回退。可能由媒体回复、长回复、明确回复目标、旧的 Telegram 草稿、缺失的 Slack 线程目标、已删除的预览消息或原生流完成失败引起。
我仍然看到独立的进度消息。
进度模式在草稿激活时抑制默认的独立工具进度消息。如果独立消息仍然出现,请验证该回合是否实际使用了 progress 模式,而不是 streaming.mode: "off" 或无法为该消息创建草稿的渠道路径。
Teams 的行为与 Discord 或 Telegram 不同。
Microsoft Teams 在个人聊天中使用原生流,而不是通用的发送-编辑预览传输。Teams 也将 streaming.mode: "block" 视为 Teams 块传递,因为它没有 Discord 和 Telegram 使用的草稿预览块模式。
常见问题
为什么我配置了 progress 模式,却只看到最终回复?
检查渠道配置中的 channels.<channel>.streaming.mode 是否准确设置为 "progress",并且该消息不是来自群组或引用回复路径。另外,如果渠道(如某些群组频道)不支持编辑消息,OpenClaw 也会回退到仅最终回复。
进度草稿中不显示工具行怎么办?
确认 streaming.progress.toolProgress 没有被显式设为 false。默认是 true。如果仍然不显示,可能是智能体没有触发工具事件,或工具执行时间极短(少于 5 秒且未触发第二个工作事件)。可以临时将 agents.defaults.toolProgressDetail 设为 "raw" 观察是否有行出现。
为什么有时候发送了新消息而不是编辑草稿?
这是安全回退。常见原因:最终回复包含媒体或按钮(需要特殊格式)、回复过长超过渠道单条消息限制、存在明确回复目标、Telegram 中旧草稿已被替换、Slack 中目标线程已删除、或原生流完成失败。OpenClaw 优先保证消息完整送达,而不是强行编辑。