channels.<channel>.streaming.mode: "progress" and OpenClaw creates the
message once real work starts, edits it as the agent reads, plans, calls
tools, or waits for approval, then turns it into the final answer.
Discord defaults preview streaming to
off; set streaming.mode: "progress"
to opt in. Telegram defaults to progress without additional config. Set
mode: "partial" on either to stream answer text instead. See
Streaming and chunking for the full
per-channel default table.Quick start
What users see
The status headline sits above the rolling progress lines and both stay visible,
so one message answers what the agent is doing and how far it has got.
For raw tool progress, the label appears once the agent starts meaningful work
and stays busy for the initial delay.
It sits at the top of the rolling progress-line list, so it scrolls away once
enough concrete work lines appear. The implicit label is hidden while a status
headline is present unless you configure one explicitly. Plain text-only
replies never show a progress draft; a line appears only for real work updates,
for example
🛠️ Bash: run tests, 🔎 Web Search: for "discord edit message",
or ✍️ Write: to /tmp/file.
The final answer replaces the draft in place when the channel can safely do
that; otherwise OpenClaw sends the final answer through normal delivery and
cleans up or stops updating the draft (see Finalization).
Choose a mode
channels.<channel>.streaming.mode controls the visible in-progress behavior:
Pick
progress when users care more about “what is happening” than watching
answer text stream token by token; partial when the answer text itself is
the progress signal; block for larger preview chunks. On Discord and
Telegram, streaming.mode: "block" is still preview streaming, not normal
block-reply delivery — use streaming.block.enabled for that.
Configure labels
Progress labels live underchannels.<channel>.streaming.progress. The default
raw tool-line label is "auto", which uses the plain built-in Working
label. A status headline hides that implicit label; set
label: "auto" explicitly if you want a label above it too:
label: "auto"):
Control progress lines
Progress lines come from real run events: tool starts, item updates, task plans, approvals, command output, patch summaries, and similar agent activity. They are enabled by default (progress.toolProgress, default true) and stay
visible underneath the status headline. Set progress.toolProgress: false to
keep the headline alone.
Tools can also emit typed progress while a single call is still running. That
is how a slow fetch or search updates the visible draft before the tool
returns its final result. The progress update is a partial tool result with
empty model content and explicit public channel metadata:
progress.text in the channel progress UI. The normal
tool result still arrives later as content/details and is the only part
returned to the model.
When adding progress to a tool, emit a short, generic message and delay it
until the operation has been pending long enough to be useful. web_fetch
does exactly this with a 5-second delay:
Detail mode
OpenClaw uses the same formatter for progress drafts and/verbose:
"explain" is the default and keeps drafts stable with concise labels.
"raw" appends underlying tool detail when available. Command text also
requires the explicit streaming.progress.commandText: "raw" opt-in below.
With that opt-in, a node --check /tmp/app.js call renders differently by mode:
Command/exec text
streaming.progress.commandText (default "status") controls how much command
detail shows next to exec/bash progress lines, independent of the detail mode
above. Set it to "raw" to opt into command text; keep "status" to show only
the tool-progress status:
Commentary lane
streaming.progress.commentary (default false) interleaves the model’s
pre-tool commentary/preamble narration (💬, for example “I’ll check… then
…”) with tool lines in the draft. See
Streaming and chunking for the
shared config shape across channels.
With the commentary lane enabled, preambles render only as those interleaved
💬 lines; the status headline below stays out of the way so the lane keeps its
documented shape.
Status headline
On Discord and Telegram in progress mode, the model’s typed pre-tool preamble becomes the draft’s status headline whenever it is available. Other progress-mode channels keep their existing status behavior. The headline is on by default and does not bypass the normal activity gate for short turns; enablingstreaming.progress.commentary hands preambles to the interleaved
commentary lane instead.
On Discord, when a utility model resolves for the agent — an explicit
utilityModel, or the primary
provider’s declared small-model default (OpenAI → gpt-5.6-luna,
Anthropic → claude-haiku-4-5) — it supplies a short plain-language filler
when the model emits no preamble or has been quiet for about 20 seconds
(Telegram’s headline is preamble-only today):
streaming.progress.narration, default
true) and never falls back to the primary model: it runs only with an explicit
utilityModel or a provider-declared default for the agent’s primary
provider. Set utilityModel: "" to disable utility routing entirely. Tool lines
keep accumulating underneath and return if both status sources stop. Draft
edits still wait for the normal activity gate and an actual
text change, which avoids flashes on fast turns and reduces edit churn in busy
channels. Set narration: false to disable only the utility-model filler; model
preamble headlines remain enabled:
commandText: "status", narration input also omits exec/bash command text,
matching what the draft shows.
Line limits
Limit how many lines stay visible (default 8):Hide tool/task lines
Keep the single progress draft but hide tool and task lines: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
Channels without safe edit support fall back to typing indicators or
final-only delivery. See Streaming and chunking for the
full runtime-behavior breakdown per channel.
Finalization
When the final answer is ready, OpenClaw tries to keep the chat clean:- In
progressmode on Discord, the final answer is sent as a fresh message and the status draft is deleted once that answer is delivered. Busy channels keep no orphaned tool log above the reply; error finals keep the draft as the visible record of the failed turn. - If the draft can safely become the final answer (
partial/blockmodes), OpenClaw edits it in place. - Slack’s compact progress style also promotes the progress draft into an eligible final text answer by editing that message in place.
- If the channel uses native progress streaming, OpenClaw finalizes that stream when the native transport accepts the final text.
- Otherwise (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 instead of overwriting the draft.
Troubleshooting
I only see the final answer. Check thatchannels.<channel>.streaming.mode is progress for the account
or channel that handled the message. Some group or quote-reply paths 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 the safety fallback described in Finalization. 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 whenever a
draft is active. If standalone messages still appear, confirm 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, and maps streaming.mode: "block" to Teams
block delivery because it has no draft-preview block mode like Discord and
Telegram.