Quick start
Enable progress drafts per channel withstreaming.mode: "progress":
What users see
A progress draft has two parts:| Part | Purpose |
|---|---|
| Label | A short title such as Thinking... or Shelling.... |
| Progress lines | Compact run updates using the same tool labels and icons as verbose output. |
🛠️ Exec, 🔎 Web Search, or ✍️ Write: to /tmp/file.
By default they use the same compact explain mode as /verbose; set
agents.defaults.toolProgressDetail: "raw" when debugging and you also want raw
commands/details appended.
The final answer replaces the draft when possible; otherwise
OpenClaw sends the final answer normally and cleans up or stops updating the
draft according to the channel’s transport.
Choose a mode
channels.<channel>.streaming.mode controls the visible in-progress behavior:
| Mode | Best for | What appears in chat |
|---|---|---|
off | Quiet channels | Only the final answer. |
partial | Watching answer text appear | One draft edited with the latest answer text. |
block | Larger answer-preview chunks | One preview updated or appended in bigger chunks. |
progress | Tool-heavy or long-running turns | One status draft, then the final answer. |
progress when users care more about “what is happening” than watching
the answer text stream token by token.
Choose partial when the answer itself is the progress signal.
Choose block when you want draft preview updates in larger text chunks. On
Discord and Telegram, streaming.mode: "block" is still preview streaming, not
normal block delivery. Use streaming.block.enabled or legacy
blockStreaming when you want normal block replies.
Configure labels
Progress labels live underchannels.<channel>.streaming.progress.
The default label is auto, which chooses from OpenClaw’s built-in
single-word-with-ellipsis label pool:
Control progress lines
Progress lines are enabled by default in progress mode. They come from real run events: tool starts, item updates, task plans, approvals, command output, patch summaries, and similar agent activity. OpenClaw uses the same formatter for progress drafts and/verbose:
"explain" is the default and keeps drafts stable with concise labels like
🛠️ Exec: check JS syntax for /tmp/app.js. "raw" appends the underlying
command/detail when available, which is useful while debugging but noisier in
chat.
For example, the same command appears differently depending on the detail mode:
| Mode | Progress line |
|---|---|
explain | 🛠️ Exec: check JS syntax for /tmp/app.js |
raw | 🛠️ Exec: check JS syntax for /tmp/app.js, node --check /tmp/app.js |
toolProgress: false, OpenClaw still suppresses the older standalone
tool-progress messages for that turn. The channel stays visually quiet until the
final answer, except for the label if one is configured.
Channel behavior
Each channel uses the cleanest transport it supports:| Channel | Progress transport | Notes |
|---|---|---|
| Discord | Send one message, then edit it. | Final text edits in place when it fits one safe preview message. |
| Matrix | Send one event, then edit it. | Account-level streaming config controls account-level drafts. |
| Microsoft Teams | Native Teams stream in personal chats. | streaming.mode: "block" maps to Teams block delivery. |
| Slack | Native stream or editable draft post. | Thread availability affects whether native streaming can be used. |
| Telegram | Send one message, then edit it. | Older visible drafts may be replaced so final timestamps stay useful. |
| Mattermost | Editable draft post. | Tool activity is folded into the same draft-style post. |
Finalization
When the final answer is ready, OpenClaw tries to keep the chat clean:- If the draft can safely become the final answer, OpenClaw edits it in place.
- If the channel uses native progress streaming, OpenClaw finalizes that stream when the native transport accepts the final text.
- If the final answer has media, an approval prompt, an explicit reply target, too many chunks, or a failed edit/send, OpenClaw sends the final answer through the normal channel delivery path.
Troubleshooting
I only see the final answer. Check thatchannels.<channel>.streaming.mode is set to progress for the
account or channel that handled the message. Some group or quote-reply paths may
disable draft previews for a turn when the channel cannot safely edit the right
message.
I see the label but no tool lines.
Check streaming.progress.toolProgress. If it is false, OpenClaw keeps the
single draft behavior but hides tool and task progress lines.
I see a fresh final message instead of an edited draft.
That is a safety fallback. It can happen for media replies, long answers,
explicit reply targets, old Telegram drafts, missing Slack thread targets,
deleted preview messages, or failed native stream finalization.
I still see standalone progress messages.
Progress mode suppresses default standalone tool-progress messages when a draft
is active. If standalone messages still appear, verify that the turn is actually
using progress mode and not streaming.mode: "off" or a channel path that
cannot create a draft for that message.
Teams behaves differently from Discord or Telegram.
Microsoft Teams uses a native stream in personal chats instead of the generic
send-and-edit preview transport. Teams also treats streaming.mode: "block" as
Teams block delivery because it does not have the same draft-preview block mode
used by Discord and Telegram.