Messages and delivery
Rascunhos de progresso
Rascunhos de progresso transformam uma mensagem do canal em uma linha de status ativa enquanto um
agente trabalha, em vez de uma pilha de respostas temporárias indicando que "ainda está trabalhando". Defina
channels.<channel>.streaming.mode: "progress" e o OpenClaw cria a
mensagem assim que o trabalho real começa, edita-a à medida que o agente lê, planeja, chama
ferramentas ou aguarda aprovação e, por fim, transforma-a na resposta final.
Trabalhando...📖 de docs/concepts/progress-drafts.md🔎 Pesquisa na Web: por "discord edit message"🛠️ Bash: executar testesInício rápido
{ channels: { discord: { streaming: { mode: "progress", }, }, },}Padrões a partir daqui: atraso inicial de 5 segundos, linhas compactas de progresso enquanto um trabalho útil acontece e supressão das mensagens de progresso independentes mais antigas para esse turno. Rascunhos de linhas brutas de ferramentas usam um rótulo automático de uma palavra; um título de status omite esse título redundante, a menos que um seja configurado explicitamente.
Esta página aborda a experiência dos rascunhos de progresso e suas opções de configuração. Para a matriz completa dos modos de streaming, observações de runtime por canal e migração de chaves legadas, consulte Streaming e divisão em blocos.
O que os usuários veem
| Parte | Finalidade |
|---|---|
| Título de status | No Discord e Telegram, o preâmbulo do modelo; o Discord adiciona um texto auxiliar. |
| Rótulo | Linha inicial/de status opcional, como Working. |
| Linhas de progresso | Atualizações compactas da execução usando os mesmos ícones de ferramentas e formatador de detalhes que /verbose. |
Para o progresso bruto de ferramentas, o rótulo aparece quando o agente inicia um trabalho significativo
e permanece ocupado durante o atraso inicial.
Ele fica no topo da lista contínua de linhas de progresso e, portanto, sai da área visível quando
linhas suficientes de trabalho concreto aparecem. Um título de status mostra apenas o status
em linguagem simples do agente, a menos que um rótulo seja configurado explicitamente. Respostas
somente de texto simples nunca mostram um rascunho de progresso; uma linha aparece apenas para atualizações de trabalho real,
por exemplo, 🛠️ Bash: run tests, 🔎 Web Search: for "discord edit message"
ou ✍️ Write: to /tmp/file.
A resposta final substitui o rascunho no mesmo lugar quando o canal pode fazer isso com segurança; caso contrário, o OpenClaw envia a resposta final pela entrega normal e limpa ou para de atualizar o rascunho (consulte Finalização).
Escolha um modo
channels.<channel>.streaming.mode controla o comportamento visível durante o processamento:
| Modo | Mais adequado para | O que aparece no chat |
|---|---|---|
off |
Canais silenciosos | Somente a resposta final. |
partial |
Observar o texto da resposta aparecer | Um rascunho editado com o texto mais recente da resposta. |
block |
Blocos maiores de pré-visualização da resposta | Uma pré-visualização atualizada ou ampliada em blocos maiores. |
progress |
Turnos com muitas ferramentas ou de longa duração | Um rascunho de status e, depois, a resposta final. |
Escolha progress quando os usuários se importarem mais com "o que está acontecendo" do que em observar
o texto da resposta ser transmitido token por token; partial quando o próprio texto da resposta for
o sinal de progresso; block para blocos maiores de pré-visualização. No Discord e
Telegram, streaming.mode: "block" ainda é streaming de pré-visualização, não a entrega normal de
respostas em blocos — use streaming.block.enabled para isso.
Configure rótulos
Os rótulos de progresso ficam em channels.<channel>.streaming.progress. O rótulo padrão
das linhas brutas de ferramentas é "auto", que usa o rótulo interno simples Working.
Um título de status oculta esse rótulo implícito; defina
label: "auto" explicitamente se também quiser um rótulo acima dele:
TrabalhandoUse um rótulo fixo:
{ channels: { discord: { streaming: { mode: "progress", progress: { label: "Investigando", }, }, }, },}Use seu próprio conjunto de rótulos (ainda escolhido aleatoriamente/por semente quando label: "auto"):
{ channels: { discord: { streaming: { mode: "progress", progress: { label: "auto", labels: ["Verificando", "Lendo", "Testando", "Finalizando"], }, }, }, },}Oculte o rótulo e mostre apenas as linhas de progresso:
{ channels: { discord: { streaming: { mode: "progress", progress: { label: false, }, }, }, },}Controle as linhas de progresso
As linhas de progresso vêm de eventos reais da execução: início de ferramentas, atualizações de itens, planos de
tarefas, aprovações, saída de comandos, resumos de patches e atividades semelhantes do agente.
Elas ficam habilitadas por padrão (progress.toolProgress, padrão true).
As ferramentas também podem emitir progresso tipado enquanto uma única chamada ainda está em execução. É assim que uma busca ou recuperação lenta atualiza o rascunho visível antes que a ferramenta retorne seu resultado final. A atualização de progresso é um resultado parcial da ferramenta com conteúdo vazio para o modelo e metadados públicos explícitos do canal:
{ "content": [], "progress": { "text": "Recuperando conteúdo da página...", "visibility": "channel", "privacy": "public", "id": "web_fetch:fetching" }}O OpenClaw renderiza somente progress.text na interface de progresso do canal. O resultado normal
da ferramenta ainda chega depois como content/details e é a única parte
retornada ao modelo.
Ao adicionar progresso a uma ferramenta, emita uma mensagem curta e genérica e adie-a
até que a operação esteja pendente por tempo suficiente para ser útil. web_fetch
faz exatamente isso com um atraso de 5 segundos:
const clearProgressTimer = scheduleToolProgress( onUpdate, { text: "Recuperando conteúdo da página...", id: "web_fetch:fetching" }, 5_000, { signal },); try { return await runToolWork();} finally { clearProgressTimer();}Chamadas rápidas não mostram uma linha de progresso; chamadas longas mostram uma enquanto ainda estão pendentes; chamadas canceladas limpam o temporizador antes que um progresso obsoleto possa aparecer. O texto de progresso é um canal lateral público da interface, portanto nunca deve incluir segredos, argumentos brutos, conteúdo recuperado, saída de comandos ou texto da página.
Modo de detalhes
O OpenClaw usa o mesmo formatador para rascunhos de progresso e /verbose:
{ agents: { defaults: { toolProgressDetail: "explain", // explain | raw }, },}"explain" é o padrão e mantém os rascunhos estáveis com rótulos concisos.
"raw" acrescenta o comando subjacente quando disponível, o que é útil durante
a depuração, mas gera mais ruído no chat. Por exemplo, uma chamada node --check /tmp/app.js
é renderizada de modo diferente em cada modo:
| Modo | Linha de progresso |
|---|---|
explain |
🛠️ check js syntax for /tmp/app.js |
raw |
🛠️ check js syntax for /tmp/app.js · node --check /tmp/app.js |
Texto de comando/execução
streaming.progress.commandText (padrão "raw") controla quantos detalhes do comando
aparecem ao lado das linhas de progresso de exec/bash, independentemente do modo de detalhes
acima. Defina-o como "status" para manter uma linha de progresso da ferramenta visível enquanto oculta
completamente o texto do comando:
{ channels: { discord: { streaming: { mode: "progress", progress: { commandText: "status", }, }, }, },}Faixa de comentários
streaming.progress.commentary (padrão false) intercala a narração de
comentário/preâmbulo do modelo anterior à ferramenta (💬, por exemplo, "Vou verificar... e depois
...") com as linhas de ferramentas no rascunho. Consulte
Streaming e divisão em blocos para ver o
formato de configuração compartilhado entre canais.
Com a faixa de comentários habilitada, os preâmbulos são renderizados apenas como essas linhas 💬 intercaladas; o título de status abaixo não interfere, para que a faixa mantenha seu formato documentado.
Título de status
No Discord e Telegram no modo de progresso, o preâmbulo tipado do modelo anterior à ferramenta
se torna o título de status do rascunho sempre que estiver disponível. Outros
canais no modo de progresso mantêm seu comportamento de status existente. O título fica
ativado por padrão e não ignora o bloqueio normal de atividade em turnos curtos;
habilitar streaming.progress.commentary encaminha os preâmbulos para a faixa intercalada
de comentários.
No Discord, quando um modelo utilitário é resolvido para o agente — um
utilityModel explícito ou o padrão
de modelo pequeno declarado pelo provedor principal (OpenAI → gpt-5.6-luna,
Anthropic → claude-haiku-4-5) — ele fornece um texto auxiliar curto em linguagem simples
quando o modelo não emite um preâmbulo ou permanece sem atualizações por cerca de 20 segundos
(atualmente, o título do Telegram usa apenas o preâmbulo):
Atualizando o modelo padrão na sua configuração e depois reiniciando o gateway paraaplicar a alteração. Uma chamada de listagem de agentes falhou e está sendo tentada novamente.A narração utilitária fica ativada por padrão (streaming.progress.narration, padrão
true) e nunca recorre ao modelo principal: ela é executada apenas com um
utilityModel explícito ou um padrão declarado pelo provedor principal
do agente. Defina utilityModel: "" para desabilitar completamente o roteamento utilitário. As linhas de ferramentas
continuam se acumulando abaixo e voltam a aparecer se ambas as fontes de status pararem. As edições do
rascunho ainda aguardam o bloqueio normal de atividade e uma alteração real
no texto, o que evita flashes em turnos rápidos e reduz a rotatividade de edições em canais
movimentados. Defina narration: false para desabilitar apenas o texto auxiliar do modelo utilitário; os títulos
de preâmbulo do modelo permanecem habilitados:
{ channels: { discord: { streaming: { mode: "progress", progress: { narration: false, }, }, }, },}A entrada da narração é limitada e tem dados sensíveis removidos: o modelo utilitário recebe o
texto da solicitação de entrada junto com os mesmos resumos compactos e com dados sensíveis removidos das ferramentas que o rascunho
renderizaria — nunca a saída bruta de comandos nem os resultados das ferramentas. Com
commandText: "status", a entrada da narração também omite o texto de comandos exec/bash,
correspondendo ao que o rascunho mostra.
Limites de linhas
Limite quantas linhas permanecem visíveis (padrão 8):
{ channels: { discord: { streaming: { mode: "progress", progress: { maxLines: 4, }, }, }, },}As linhas de progresso são compactadas automaticamente para reduzir o reajuste do balão de chat enquanto o rascunho é editado, e o OpenClaw trunca linhas longas para que edições repetidas do rascunho não quebrem as linhas de forma diferente a cada atualização. O limite padrão por linha é de 120 caracteres; o texto corrido é cortado em um limite de palavra, enquanto detalhes longos, como caminhos ou comandos brutos, são encurtados com reticências no meio para que o sufixo permaneça visível.
Ajuste o limite por linha:
{ channels: { discord: { streaming: { mode: "progress", progress: { maxLineChars: 160, }, }, }, },}Renderização avançada (Slack)
O Slack pode renderizar linhas de progresso como campos estruturados do Block Kit em vez de texto simples:
{ channels: { slack: { streaming: { mode: "progress", progress: { render: "rich", }, }, }, },}A renderização avançada sempre envia o mesmo corpo em texto simples junto com os campos do Block Kit, portanto clientes que não conseguem renderizar o formato mais elaborado ainda mostram o texto compacto de progresso.
Ocultar linhas de ferramentas/tarefas
Mantenha o único rascunho de progresso, mas oculte as linhas de ferramentas e tarefas:
{ channels: { discord: { streaming: { mode: "progress", progress: { toolProgress: false, }, }, }, },}Com toolProgress: false, o OpenClaw ainda suprime as mensagens independentes
mais antigas de progresso das ferramentas nessa interação — o canal permanece
visualmente silencioso até a resposta final, exceto pelo rótulo, caso algum esteja configurado.
Comportamento do canal
| Canal | Transporte do progresso | Observações |
|---|---|---|
| Discord | Envia uma mensagem e depois a edita. | Usa por padrão o modo progress; a resposta final inclui um comprovante de atividade -#, e o rascunho de status é excluído após a entrega da resposta. |
| Matrix | Envia um evento e depois o edita. | A configuração de streaming no nível da conta controla os rascunhos no nível da conta. |
| Microsoft Teams | Stream nativo do Teams em chats pessoais. | streaming.mode: "block" corresponde à entrega em blocos do Teams. |
| Slack | Stream nativo ou publicação de rascunho editável. | Exige um destino de thread de resposta; mensagens diretas de nível superior sem um ainda recebem publicações de prévia do rascunho e edições. |
| Telegram | Envia uma mensagem e depois a edita. | Se uma mensagem chegar entre o rascunho de progresso e a resposta, o rascunho será republicado abaixo dela (publicar o novo e depois excluir o antigo), em vez de fazer a tela do cliente saltar. |
| Mattermost | Publicação de rascunho editável. | O modo block alterna entre publicações de texto concluído e de atividade das ferramentas; outros modos incorporam a atividade das ferramentas à mesma publicação no estilo de rascunho. |
Os canais sem suporte seguro à edição usam indicadores de digitação ou entrega somente da resposta final como alternativa. Consulte Streaming e divisão em partes para ver a análise completa do comportamento em tempo de execução de cada canal.
Finalização
Quando a resposta final está pronta, o OpenClaw tenta manter o chat organizado:
- No modo
progressno Discord, a resposta final é enviada como uma nova mensagem com um pequeno comprovante de atividade-#anexado (por exemplo,-# 🧠 2 thoughts · 🛠️ 5 tool calls · ⏱️ 12s), e o rascunho de status é excluído assim que essa resposta é entregue. Canais movimentados não mantêm nenhum log órfão de ferramentas acima da resposta; respostas finais com erro mantêm o rascunho como registro visível da interação que falhou. - Se o rascunho puder se tornar a resposta final com segurança (modos
partial/block), o OpenClaw o edita no mesmo lugar. - Se o canal usar streaming nativo de progresso, o OpenClaw finaliza esse stream quando o transporte nativo aceita o texto final.
- Caso contrário (mídia, uma solicitação de aprovação, um destino explícito de resposta, partes demais ou falha na edição ou no envio), o OpenClaw envia a resposta final pelo fluxo normal de entrega do canal, em vez de substituir o rascunho.
Essa alternativa é intencional: enviar uma nova resposta final é melhor do que perder texto, associar uma resposta à thread errada ou substituir um rascunho por um conteúdo que o canal não consegue representar com segurança.
Solução de problemas
Vejo apenas a resposta final.
Verifique se channels.<channel>.streaming.mode está definido como progress para a conta
ou o canal que processou a mensagem. Alguns fluxos de grupo ou de resposta com citação desativam
as prévias de rascunho em uma interação quando o canal não consegue editar com segurança a
mensagem correta.
Vejo o rótulo, mas nenhuma linha de ferramenta.
Verifique streaming.progress.toolProgress. Se estiver definido como false, o OpenClaw mantém o
comportamento de rascunho único, mas oculta as linhas de progresso das ferramentas e tarefas.
Vejo uma nova mensagem final em vez de um rascunho editado.
Essa é a alternativa de segurança descrita em Finalização. Isso pode acontecer em respostas com mídia, respostas longas, destinos explícitos de resposta, rascunhos antigos do Telegram, destinos de thread ausentes no Slack, mensagens de prévia excluídas ou falha na finalização do stream nativo.
Ainda vejo mensagens independentes de progresso.
O modo de progresso suprime as mensagens independentes padrão de progresso das ferramentas sempre que um
rascunho está ativo. Se as mensagens independentes ainda aparecerem, confirme se a interação está
realmente usando o modo progress, e não streaming.mode: "off" ou um fluxo do canal
que não consegue criar um rascunho para essa mensagem.
O Teams se comporta de maneira diferente do Discord ou Telegram.
O Microsoft Teams usa um stream nativo em chats pessoais, em vez do transporte genérico
de prévia com envio e edição, e associa streaming.mode: "block" à
entrega em blocos do Teams porque não possui um modo de bloco de prévia de rascunho como o Discord e o
Telegram.