Streaming y chunking
OpenClaw tiene dos capas de streaming separadas:
- Streaming de bloques (canales): emite bloques completados a medida que el asistente escribe. Estos son mensajes de canal normales (no deltas de tokens).
- Streaming de vista previa (Telegram/Discord/Slack): actualiza un mensaje de vista previa temporal mientras se genera.
Actualmente no hay un streaming real de deltas de tokens hacia los mensajes del canal. El streaming de vista previa se basa en mensajes (envío + ediciones/adiciones).
Streaming de bloques (mensajes del canal)
Sección titulada «Streaming de bloques (mensajes del canal)»El streaming de bloques envía la salida del asistente en fragmentos gruesos a medida que está disponible.
Model output └─ text_delta/events ├─ (blockStreamingBreak=text_end) │ └─ chunker emits blocks as buffer grows └─ (blockStreamingBreak=message_end) └─ chunker flushes at message_end └─ channel send (block replies)Leyenda:
text_delta/events: eventos de streaming del modelo (pueden ser dispersos para modelos sin streaming).chunker:EmbeddedBlockChunkeraplicando límites mín/máx + preferencia de ruptura.channel send: mensajes salientes reales (respuestas de bloques).
Controles:
agents.defaults.blockStreamingDefault:"on"/"off"(desactivado por defecto).- anulaciones de canal:
*.blockStreaming(y variantes por cuenta) para forzar"on"/"off"por canal. agents.defaults.blockStreamingBreak:"text_end"o"message_end".agents.defaults.blockStreamingChunk:{ minChars, maxChars, breakPreference? }.agents.defaults.blockStreamingCoalesce:{ minChars?, maxChars?, idleMs? }(fusionar bloques transmitidos antes de enviar).- Límite estricto del canal:
*.textChunkLimit(p. ej.,channels.whatsapp.textChunkLimit). - Modo de fragmentación del canal:
*.chunkMode(lengthpor defecto,newlinedivide en líneas en blanco (límites de párrafo) antes de la fragmentación por longitud). - Límite suave de Discord:
channels.discord.maxLinesPerMessage(17 por defecto) divide las respuestas largas para evitar el recorte en la interfaz de usuario.
Semántica de límites:
text_end: transmite bloques tan pronto como el fragmentador los emite; vacía en cadatext_end.message_end: espera a que termine el mensaje del asistente y luego vacía la salida almacenada en el búfer.
message_end aún usa el fragmentador si el texto almacenado en el búfer excede maxChars, por lo que puede emitir varios fragmentos al final.
Entrega de medios con streaming de bloques
Sección titulada «Entrega de medios con streaming de bloques»Los medios de streaming deben usar campos de carga útil estructurados como mediaUrl o
mediaUrls; el texto transmitido no se analiza como un comando de adjunto. Cuando el streaming
de bloques envía medios temprano, OpenClaw recuerda ese envío para el turno. Si
la carga útil final del asistente repite la misma URL de medio, el envío final
elimina el medio duplicado en lugar de enviar el adjunto nuevamente.
Las cargas útiles finales duplicadas exactas se suprimen. Si la carga útil final agrega texto distinto alrededor de un medio que ya se transmitió, OpenClaw aún envía el nuevo texto manteniendo el medio con un solo envío. Esto evita notas de voz o archivos duplicados en canales como Telegram.
Algoritmo de fragmentación (límites inferior/superior)
Sección titulada «Algoritmo de fragmentación (límites inferior/superior)»La fragmentación de bloques está implementada por EmbeddedBlockChunker:
- Límite inferior: no emitir hasta que el búfer sea >=
minChars(a menos que se fuerce). - Límite superior: preferir divisiones antes de
maxChars; si se fuerza, dividir enmaxChars. - Preferencia de ruptura:
paragraph→newline→sentence→whitespace→ ruptura fuerte. - Cercas de código: nunca dividir dentro de las cercas; cuando se fuerce en
maxChars, cerrar + reabrir la cerca para mantener el Markdown válido.
maxChars está limitado al textChunkLimit del canal, por lo que no puedes exceder los límites por canal.
Fusión (combinar bloques transmitidos)
Sección titulada «Fusión (combinar bloques transmitidos)»Cuando la transmisión de bloques está habilitada, OpenClaw puede fusionar fragmentos de bloque consecutivos antes de enviarlos. Esto reduce el “spam de una sola línea” mientras aún proporciona salida progresiva.
- La fusión espera brechas de inactividad (
idleMs) antes de vaciar. - Los búferes están limitados por
maxCharsy se vaciarán si lo exceden. minCharsevita que se envíen fragmentos diminutos hasta que se acumule suficiente texto (el vaciado final siempre envía el texto restante).- El unidor se deriva de
blockStreamingChunk.breakPreference(paragraph→\n\n,newline→\n,sentence→ espacio). - Las anulaciones de canal están disponibles a través de
*.blockStreamingCoalesce(incluyendo configuraciones por cuenta). - La fusión predeterminada
minCharsse aumenta a 1500 para Signal/Slack/Discord a menos que se anule.
Ritmo similar al humano entre bloques
Sección titulada «Ritmo similar al humano entre bloques»Cuando el streaming de bloques está habilitado, puedes agregar una pausa aleatoria entre las respuestas de bloques (después del primer bloque). Esto hace que las respuestas de múltiples burbujas se sientan más naturales.
- Configuración:
agents.defaults.humanDelay(anular por agente a través deagents.list[].humanDelay). - Modos:
off(predeterminado),natural(800-2500ms),custom(minMs/maxMs). - Se aplica solo a respuestas de bloques, no a las respuestas finales ni a los resúmenes de herramientas.
”Transmitir fragmentos o todo”
Sección titulada «”Transmitir fragmentos o todo”»Esto se asigna a:
- Transmitir fragmentos:
blockStreamingDefault: "on"+blockStreamingBreak: "text_end"(emitir sobre la marcha). Los canales que no sean Telegram también necesitan*.blockStreaming: true. - Transmitir todo al final:
blockStreamingBreak: "message_end"(vaciar una vez, posiblemente múltiples fragmentos si es muy largo). - Sin transmisión de bloques:
blockStreamingDefault: "off"(solo la respuesta final).
Nota del canal: La transmisión de bloques está desactivada a menos que
*.blockStreaming se establezca explícitamente en true. Los canales pueden transmitir una vista previa en vivo
(channels.<channel>.streaming) sin respuestas de bloque.
Recordatorio de ubicación de configuración: los valores predeterminados de blockStreaming* se encuentran en
agents.defaults, no en la configuración raíz.
Modos de streaming de vista previa
Sección titulada «Modos de streaming de vista previa»Clave canónica: channels.<channel>.streaming
Modos:
off: desactiva la transmisión de vista previa.partial: vista previa única que se reemplaza con el texto más reciente.block: actualizaciones de vista previa en pasos fragmentados/anexados.progress: vista previa de progreso/estado durante la generación, respuesta final al completar.
streaming.mode: "block" es un modo de transmisión de vista previa para canales con capacidad de edición
tales como Discord y Telegram. No habilita la entrega de bloques del canal allí.
Use streaming.block.enabled o la clave de canal heredada blockStreaming cuando
desee respuestas de bloque normales. Microsoft Teams es la excepción: no tiene
transporte de bloques de borrador-vista previa, por lo que streaming.mode: "block" se asigna a la entrega de bloques de Teams
en lugar de la transmisión nativa parcial/de progreso.
Asignación de canales
Sección titulada «Asignación de canales»| Canal | off | partial | block | progress |
|---|---|---|---|---|
| Telegram | ✅ | ✅ | ✅ | borrador de progreso editable |
| Discord | ✅ | ✅ | ✅ | borrador de progreso editable |
| Slack | ✅ | ✅ | ✅ | ✅ |
| Mattermost | ✅ | ✅ | ✅ | ✅ |
| MS Teams | ✅ | ✅ | ✅ | transmisión de progreso nativa |
Solo Slack:
channels.slack.streaming.nativeTransportactiva las llamadas a la API de transmisión nativa de Slack cuandochannels.slack.streaming.mode="partial"(predeterminado:true).- La transmisión nativa de Slack y el estado del hilo del asistente de Slack requieren un hilo de respuesta de destino. Los MD de nivel superior no muestran esa vista previa de estilo de hilo, pero aún pueden usar publicaciones y ediciones de vista previa de borrador de Slack.
Migración de clave heredada:
- Telegram: los valores heredados
streamModey escalar/booleanostreamingse detectan y migran mediante rutas de compatibilidad de doctor/config astreaming.mode. - Discord:
streamMode+ booleanostreamingsiguen siendo alias de tiempo de ejecución para el enumstreaming; ejecuteopenclaw doctor --fixpara reescribir la configuración persistida. - Slack:
streamModesigue siendo un alias de tiempo de ejecución parastreaming.mode; el booleanostreamingsigue siendo un alias de tiempo de ejecución parastreaming.modemásstreaming.nativeTransport;nativeStreamingheredado sigue siendo un alias de tiempo de ejecución parastreaming.nativeTransport. Ejecuteopenclaw doctor --fixpara reescribir la configuración persistida.
Comportamiento en tiempo de ejecución
Sección titulada «Comportamiento en tiempo de ejecución»Telegram:
- Utiliza actualizaciones de vista previa
sendMessage+editMessageTexten MDs y grupos/temas. - El texto final edita la vista previa activa en su lugar; los finales largos reutilizan ese mensaje para el primer fragmento y envían solo los fragmentos restantes.
- El modo
progressmantiene el progreso de la herramienta en un borrador de estado editable, borra ese borrador al completarse y envía la respuesta final a través de la entrega normal. - Si la edición final falla antes de que se confirme el texto completado, OpenClaw utiliza la entrega final normal y limpia la vista previa obsoleta.
- Se omite la transmisión de vista previa cuando la transmisión de bloques de Telegram está explícitamente habilitada (para evitar la doble transmisión).
/reasoning streampuede escribir el razonamiento en una vista previa transitoria que se elimina después de la entrega final.
Discord:
- Utiliza mensajes de vista previa de envío + edición.
- El modo
blockutiliza fragmentación de borrador (draftChunk). - Se omite la transmisión de vista previa cuando la transmisión de bloques de Discord está explícitamente habilitada.
- Las cargas útiles de medios finales, errores y respuestas explícitas cancelan las vistas previas pendientes sin vaciar un nuevo borrador, y luego usan la entrega normal.
Slack:
partialpuede usar la transmisión nativa de Slack (chat.startStream/append/stop) cuando esté disponible.blockusa vistas previas de borrador de estilo anexar.progressusa texto de vista previa de estado, luego la respuesta final.- Los MD de nivel superior sin un hilo de respuesta usan publicaciones y ediciones de vista previa de borrador en lugar de la transmisión nativa de Slack.
- La transmisión de vista previa nativa y de borrador suprime las respuestas de bloque para ese turno, por lo que una respuesta de Slack se transmite por una sola ruta de entrega.
- Las cargas útiles finales de medios/errores y los finales de progreso no crean mensajes de borrador desechables; solo los finales de texto/bloque que pueden editar la vista previa vacían el texto del borrador pendiente.
Mattermost:
- Transmite el pensamiento, la actividad de las herramientas y el texto de respuesta parcial en una sola publicación de vista previa de borrador que se finaliza en su lugar cuando la respuesta final es segura de enviar.
- Recurre al envío de una publicación final nueva si la publicación de vista previa fue eliminada o no está disponible en el momento de la finalización.
- Las cargas útiles finales de medios/errores cancelan las actualizaciones de vista previa pendientes antes de la entrega normal en lugar de vaciar una publicación de vista previa temporal.
Matrix:
- Las vistas previas de borrador se finalizan en su lugar cuando el texto final puede reutilizar el evento de vista previa.
- Los finales de solo medios, errores y desajuste de objetivo de respuesta cancelan las actualizaciones de vista previa pendientes antes de la entrega normal; se redacta una vista previa obsoleta ya visible.
Actualizaciones de vista previa del progreso de herramientas
Sección titulada «Actualizaciones de vista previa del progreso de herramientas»La transmisión de vista previa también puede incluir actualizaciones de progreso de herramientas: líneas de estado cortas como “buscando en la web”, “leyendo archivo” o “llamando a herramienta” que aparecen en el mismo mensaje de vista previa mientras se ejecutan las herramientas, antes de la respuesta final. En el modo de servidor de aplicaciones de Codex, los mensajes de preámbulo/comentario de Codex utilizan esta misma ruta de vista previa, por lo que las breves notas de progreso tipo “Estoy comprobando…” pueden transmitirse al borrador editable sin formar parte de la respuesta final. Esto mantiene los turnos de herramientas de varios pasos visualmente activos en lugar de silenciosos entre la primera vista previa de pensamiento y la respuesta final.
Las herramientas de larga duración pueden emitir un progreso tipado antes de volver. Por ejemplo,
web_fetch arma un temporizador de cinco segundos cuando se inicia: si la recuperación todavía está
pendiente, la vista previa puede mostrar Fetching page content...; si la recuperación termina
o se cancela antes de eso, no se emite ninguna línea de progreso. El resultado final posterior de la herramienta
aún se entrega normalmente al modelo.
Superficies compatibles:
- Discord, Slack, Telegram y Matrix transmiten actualizaciones del progreso de herramientas y los prefacios de Codex a la edición de vista previa en vivo de manera predeterminada cuando la transmisión de vista previa está activa. Microsoft Teams utiliza su flujo de progreso nativo en chats personales.
- Telegram se ha lanzado con las actualizaciones de vista previa de progreso de herramientas habilitadas desde
v2026.4.22; mantenerlas habilitadas preserva ese comportamiento lanzado. - Mattermost ya pliega la actividad de la herramienta en su única publicación de vista previa de borrador (ver más arriba).
- Las ediciones de progreso de herramientas siguen el modo de transmisión de vista previa activo; se omiten cuando la transmisión de vista previa está
offo cuando la transmisión de bloques se ha hecho cargo del mensaje. En Telegram,streaming.mode: "off"es solo final: el chatter de progreso genérico también se suprime en lugar de entregarse como mensajes de estado independientes, mientras que las solicitudes de aprobación, las cargas útiles multimedia y los errores aún se enrutan normalmente. - Para mantener la transmisión de vista previa pero ocultar las líneas de progreso de herramientas, establezca
streaming.preview.toolProgressenfalsepara ese canal. Para mantener las líneas de progreso de herramientas visibles mientras se oculta el texto de comando/exec, establezcastreaming.preview.commandTexten"status"ostreaming.progress.commandTexten"status"; el valor predeterminado es"raw"para preservar el comportamiento lanzado. Esta política es compartida por los canales de borrador/progreso que utilizan el renderizador de progreso compacto de OpenClaw, incluyendo Discord, Matrix, Microsoft Teams, Mattermost, vistas previas de borrador de Slack y Telegram. Para deshabilitar las ediciones de vista previa por completo, establezcastreaming.modeenoff. - Las respuestas de cita seleccionadas de Telegram son una excepción: cuando
replyToModeno es"off"y hay texto de cita seleccionado, OpenClaw omite el flujo de vista previa de la respuesta para ese turno, por lo que no se pueden mostrar las líneas de vista previa del progreso de las herramientas. Las respuestas al mensaje actual sin texto de cita seleccionado mantienen el flujo de vista previa. Consulte los documentos del canal de Telegram para más detalles.
Mantenga las líneas de progreso visibles pero oculte el texto sin procesar del comando/exec:
{ "channels": { "telegram": { "streaming": { "mode": "partial", "preview": { "toolProgress": true, "commandText": "status" } } } }}Use la misma estructura bajo otra clave de canal de progreso compacto, por ejemplo channels.discord, channels.matrix, channels.msteams, channels.mattermost, o las vistas previas de borrador de Slack. Para el modo progress-draft, coloque la misma política bajo streaming.progress:
{ "channels": { "telegram": { "streaming": { "mode": "progress", "progress": { "toolProgress": true, "commandText": "status" } } } }}Relacionado
Sección titulada «Relacionado»- Reestructuración del ciclo de vida de los mensajes - diseño objetivo compartido para vista previa, edición, flujo y finalización
- Borradores de progreso - mensajes visibles de trabajo en curso que se actualizan durante turnos largos
- Mensajes - ciclo de vida y entrega de mensajes
- Reintento - comportamiento de reintento ante fallos de entrega
- Canales - soporte de streaming por canal