El auge de las interfaces de chat impulsadas por LLM ha creado un problema peculiar de experiencia de usuario: ver texto aparecer caracter por caracter es emocionante, pero ver Markdown parcialmente renderizado parpadear y saltar es frustrante. Cuando un LLM genera un bloque de codigo, una tabla o una lista anidada, los renderizadores Markdown estandar no pueden manejar la llegada incremental de tokens. Esperan la salida completa, luego la renderizan toda de una vez – frustrando el proposito del streaming. Los usuarios miran texto sin procesar hasta que el stream termina, luego la pagina salta cuando todo se reformatea simultaneamente.
Streamdown es la elegante solucion de Vercel a este problema. Es un renderizador de Markdown en streaming de codigo abierto disenado especificamente para contenido generado por LLM. La idea clave es que el renderizado Markdown debe ocurrir progresivamente: cada token debe ser renderizado inmediatamente, los elementos deben aparecer a medida que se vuelven inequivocos, y el DOM debe actualizarse incrementalmente sin inestabilidad de diseno.
La libreria esta construida especificamente para la era de la IA. Los renderizadores Markdown tradicionales asumen entrada completa y estatica. Streamdown asume entrada incompleta y en streaming, y toma decisiones inteligentes sobre como renderizar contenido parcial. Cuando un LLM comienza a generar un bloque de codigo, Streamdown renderiza un contenedor de bloque de codigo abierto inmediatamente. Cuando comienza una tabla, renderiza la etiqueta de apertura de la tabla y popula las celdas a medida que llegan. Esto crea una experiencia visual fluida y progresiva que coincide con la naturaleza de streaming de las respuestas LLM.
Arquitectura Central
El pipeline interno de Streamdown procesa los tokens entrantes a traves de cuatro etapas:
| Etapa | Componente | Funcion |
|---|---|---|
| Tokenizador | Lexer Incremental | Analizar tokens Markdown parciales a medida que llegan |
| Constructor | Constructor AST Parcial | Construir un AST que pueda representar elementos incompletos |
| Renderizador | Renderizador DOM Progresivo | Actualizar el DOM en vivo con cada cambio del AST |
| Finalizador | Resolvedor Post-Stream | Finalizar cualquier elemento incompleto restante |
El Pipeline de Renderizado
El siguiente diagrama ilustra como Streamdown procesa una respuesta en streaming de un LLM:
sequenceDiagram
participant LLM as Stream LLM
participant Buffer as Buffer de Tokens
participant Lexer as Lexer Incremental
participant AST as AST Parcial
participant DOM as Renderizador DOM
participant Worker as Trabajador de Resaltado
LLM->>Buffer: Token "## "
Buffer->>Lexer: Vaciar fragmento parcial
Lexer->>AST: "encabezado h2"
AST->>DOM: Abrir etiqueta de encabezado
LLM->>Buffer: Token "Installation"
Buffer->>Lexer: Vaciar
Lexer->>AST: "nodo de texto"
AST->>DOM: Adjuntar "Installation"
LLM->>Buffer: Token "\n\n```python\n"
Buffer->>Lexer: Vaciar
Lexer->>AST: "abrir bloque de codigo"
AST->>DOM: Renderizar cascaron de bloque
LLM->>Buffer: Token "print('hello')"
Buffer->>Lexer: Vaciar
Lexer->>AST: "linea de codigo"
AST->>DOM: Adjuntar linea de codigo (sin estilo)
LLM->>Buffer: Token "\n```"
Buffer->>Lexer: Vaciar
Lexer->>AST: "cerrar bloque de codigo"
AST->>DOM: Cerrar bloque de codigo
Worker-->>AST: Solicitar resaltado
AST->>DOM: Actualizar con contenido resaltadoCada token del stream LLM pasa por este pipeline en tiempo real. El lexer incremental es el componente critico: debe mantener el estado entre las llegadas de tokens para identificar correctamente cuando una secuencia parcial como [Click h podria ser el inicio de un enlace ([Click here](url)) y renderizarlo apropiadamente.
Comparacion de Calidad de Renderizado
La tabla a continuacion compara Streamdown con enfoques alternativos para renderizar salida LLM:
| Enfoque | Streaming? | Sintaxis Parcial | Resaltado de Codigo | Renderizado de Tablas | Tamano del Bundle |
|---|---|---|---|---|---|
| Streamdown | Si, token por token | Degradacion elegante | Trabajador en segundo plano | Incremental | 12 KB (gzip) |
| react-markdown | No (espera completo) | N/A | Basado en plugins | Solo completo | 15 KB |
| marked | No | N/A | Basado en plugins | Solo completo | 10 KB |
| innerHTML vanilla | Si, pero inseguro | Renderizado roto | Manual | Roto | 0 KB (sin deps) |
| Renderizador personalizado | Parcial | Generalmente roto | Manual | Generalmente roto | Variable |
Ejemplo de Uso
Usar Streamdown con React y el SDK de IA de Vercel es sencillo:
import { Streamdown } from '@vercel/streamdown/react';
export function ChatMessage({ content }) {
return <Streamdown content={content} />;
}
El componente maneja automaticamente la entrada en streaming, el renderizado progresivo y la resolucion final. Para casos de uso mas avanzados, Streamdown proporciona hooks para estilos personalizados, integracion de temas y manejadores de interaccion.
Comenzando
Visita el repositorio de Streamdown en GitHub para instrucciones de instalacion, documentacion de API y ejemplos. La libreria esta disponible en npm como @vercel/streamdown y soporta todos los frameworks frontend principales. La documentacion del SDK de IA de Vercel proporciona guias de integracion para combinar Streamdown con respuestas en streaming del SDK de IA.
FAQ
Que es Streamdown?
Streamdown es el renderizador de Markdown en streaming de codigo abierto de Vercel que muestra texto generado por LLM token por token a medida que llega, con renderizacion progresiva de elementos Markdown como tablas, bloques de codigo, listas y encabezados.
Por que es dificil el renderizado de Markdown en streaming?
Los analizadores Markdown estandar asumen entrada completa. El Markdown en streaming renderiza tokens incrementalmente, por lo que el renderizador debe manejar sintaxis parcial – como una fila de tabla que llega antes de su encabezado, o un bloque de codigo no cerrado – y actualizar el DOM incrementalmente sin parpadeos o cambios de diseno.
Como maneja Streamdown el resaltado de sintaxis de codigo durante el streaming?
Streamdown usa una estrategia de renderizado de multiples pasadas. Los bloques de codigo aparecen primero como texto plano sin estilo a medida que llegan los tokens, luego un trabajador en segundo plano aplica el resaltado de sintaxis una vez que el bloque esta completo. Esto asegura cero latencia percibida mientras eventualmente muestra codigo completamente resaltado.
Puedo usar Streamdown sin React?
Si. Streamdown es agnostico al framework y exporta una API de JavaScript vanilla que funciona con cualquier stack frontend. Tambien hay integraciones dedicadas para React, Vue, Svelte y Solid.js con hooks y componentes amigables para streaming.
Cual es la diferencia entre Streamdown y React Markdown estandar?
Las librerias estandar de React Markdown como react-markdown requieren entrada Markdown completa antes de renderizar. Streamdown esta disenado para renderizado incremental: actualiza el DOM en vivo token por token, manejando la sintaxis parcial con elegancia, y resolviendo en Markdown correctamente renderizado a medida que el stream se completa.
Lecturas Adicionales
- Repositorio de Streamdown en GitHub – Codigo fuente, documentacion de API y ejemplos
- Documentacion del SDK de IA de Vercel – Integrando Streamdown con streams del SDK de IA
- Blog de Vercel: Streaming en Aplicaciones de IA – La perspectiva de Vercel sobre UX de streaming para IA
- Especificacion CommonMark – El estandar Markdown que Streamdown implementa
無程式碼也能輕鬆打造專業LINE官方帳號!一鍵導入模板,讓AI助你行銷加分!