Skip to content

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 秒或发出第二个工作事件,在有实际工作时添加紧凑的进度行,并抑制该回合的重复独立进度消息。

用户看到什么

进度草稿包含两部分:

部分目的
标签一个简短的状态行,例如 WorkingShelling
进度行与详细输出相同的工具图标和格式,紧凑显示每个运行更新。

标签在智能体开始有意义工作后出现,并且要么持续忙碌 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 优先保证消息完整送达,而不是强行编辑。

相关链接