← Blog
October 2, 2025

Añade streaming a tu aplicación LLM de forma sencilla

La transmisión es la ganancia más fácil para la experiencia de usuario y el costo. Los usuarios ven las palabras antes, cancelan cuando tienen suficiente y gastan menos fichas. La transmisión reduce la latencia, que es fundamental para una experiencia fluida para el usuario final. Solo necesitas dos cosas: un servidor que transmite, y un cliente que lee fragmentos sin almacenamiento en búfer.

Prueba Compute hoy
Lanza un VLLM servidor de inferencia en Calcular. Obtienes un punto final HTTPS con rutas al estilo de OpenAI que se transmiten de forma predeterminada. Dirija su SDK de OpenAI existente a la nueva URL base y comience a medir el TTFT.

Tokens de transmisión: una comparación entre SSE y WebSockets en inglés sencillo

Eventos enviados por el servidor (SSE). Transmisión unidireccional a través de HTTP. El SSE transmite datos del servidor al cliente a través de una conexión HTTP. Sencillo, compatible con servidores proxy, ideal para la transmisión de tokens. La API EventSource está estandarizada por WHATWG como parte del HTML Living Standard. Funciona con EventSource en los navegadores y con las respuestas en streaming en la mayoría de los clientes HTTP.

WebSockets. Mensajes bidireccionales a través de un socket persistente. Los WebSockets utilizan el protocolo WebSocket y se administran mediante un objeto WebSocket, lo que permite una comunicación bidireccional en tiempo real entre el cliente y el servidor. Resulta útil cuando el cliente debe enviar eventos a mitad de camino (escritura, sincronización del cursor, ediciones colaborativas). La transmisión de tokens es el modo en el que el servidor devuelve los tokens uno por uno a medida que el modelo los genera.

Regla empírica: utilizar SSE para chatear a menos que realmente necesites mensajes bidireccionales. Con la transmisión de tokens, el servidor puede empezar a devolver los tokens antes de generar la respuesta completa.

Cuándo usar qué

  • VER: respuestas de chat, resúmenes, generación de código, cualquier cosa de solo lectura en el navegador.
  • WebSockets: editores colaborativos, transmisiones de voz, herramientas que llevan las actualizaciones de mitad de generación del cliente al servidor y aplicaciones del mundo real que requieren una comunicación bidireccional interactiva.
  • Mezcla: comience con SSE; añada WS más adelante para los pocos lugares que lo necesiten. Los tokens de transmisión son credenciales temporales y únicas que utilizan las plataformas de vídeo en línea para autenticar y autorizar el acceso de un usuario a una transmisión de vídeo específica.

Implementación de eventos enviados por el servidor (SSE)

Nodo (SDK de OpenAI, servidor compatible con OpenAI)

importar OpenAI desde «openai»;
const client = new OpenAI ({baseUrl: "https://YOUR-ENDPOINT/v1 «, apiKey: process.env.key});

const stream = await client.chat.completions.create ({
modelo: «f3-7b-instruct»,
messages: [{role: «user», content: «Redacte una breve actualización sobre el estado del proyecto».}],
transmisión: verdadera,
número máximo de tokens: 200
});

para await (parte constante de la transmisión) {
const delta = chunk.choices?. ¿[0]?. ¿delta?. contenido;
si (delta) process.stdout.write (delta);
}

Python (OpenAI SDK, servidor compatible con OpenAI)

desde openai importar OpenAI
client = OpenAI (base_url=» https://YOUR-ENDPOINT/v1 «, API_KEY="Your_key»)

con client.chat.completions.stream (
model="f3-7b-instruct»,
messages= [{"role» :"user», "content» :"Escribe un resumen de un párrafo. «}],
max_tokens=200,
) como transmisión:
para un evento en streaming:
si event.type == «token»:
print (event.token, end= "»)

Cancela rápido cuando los usuarios dejan de leer:

const controller = new abortController ();
//señal de paso: client.chat.completions.create ({..., stream: true, signal: controller.signal})
//más adelante
controlador.abort ();

Implemente WebSocket Server (cuando necesite dos vías)

El servidor WebSocket establece una conexión websocket persistente con los clientes, lo que permite la comunicación bidireccional en tiempo real. Durante el protocolo de enlace inicial, el servidor y el cliente intercambian encabezados HTTP, incluidos SEC-Websocket-Key, SEC-Websocket-Version y SEC-Websocket-Protocol, para actualizar la conexión HTTP a una conexión WebSocket y garantizar la seguridad y el cumplimiento del protocolo.

//Bosquejo de servidor usando ws
importar {WebSocketServer} desde «ws»;
const wss = new WebSocketServer ({puerto: 8080});

wss.on («conexión», (ws) => {
ws.on («mensaje», asíncrono (mensaje) => {
const {prompt} = JSON.parse (msg.toString ());
//llame a su punto final compatible con OpenAI con stream=true
para await (token constante de GenerateStream (prompt)) {
ws.send (token);//contrapresión: compruebe ws.BufferedAmount
}
});

ws.on («cerrar», () => {
//Gestiona la limpieza cuando se cierra la conexión
//Libera recursos o realiza cualquier limpieza necesaria aquí
});
});

Cuando se cierra la conexión, el servidor WebSocket desencadena un evento de cierre, lo que le permite gestionar la limpieza y liberar los recursos asociados a esa conexión de Websocket.

Manejar contrapresión: pausa cuando ws.BufferedAmount es grande; reanuda cuando se agota. En los navegadores, utilice la API de transmisiones con reader.read () y respete las señales de ReadableStreamDefaultReader.

Cancelaciones, reintentos, contrapresión

  • Cancela rápidamente. Conecte un botón de parada que aborte la solicitud HTTP o cierre el socket. La caché KV del servidor bloquea de forma inmediata y gratuita.
  • Vuelve a intentarlo. Utilice un retroceso exponencial con fluctuaciones en los errores de conexión y de primer token. No vuelvas a intentarlo después de haber transmitido texto visible para el usuario, a menos que reinicies claramente la respuesta.
  • Contrapresión. En Node, compruebe las señales res.flush () /drain o BufferedAmount en WS. Mantén los fragmentos pequeños; prefiere líneas JSON delimitadas por\npara las transmisiones personalizadas. Configure el número máximo de solicitudes o transmisiones simultáneas para evitar la sobrecarga del servidor.

Puertas de enlace y proxies (evite sorpresas de almacenamiento en búfer)

  • Mantener almacenamiento en búfer de respuesta desactivado para rutas de streaming.
  • Utilice HTTP/1.1 o HTTP/2 con keep‑alive; evita los intermediarios que unen partes.
  • Set sensato tiempos de espera de inactividad generaciones tan largas no caen a mitad de camino.
  • Enviar Tipo de contenido: texto/secuencia de eventos para SSE con Cache-Control: no-store y Connection: keep-alive.

Consejos de experiencia de usuario que hacen que la transmisión parezca rápida

  • Muestre las fichas a medida que lleguen; mantenga un signo de intercalación sutil.
  • Permitir a los usuarios parar y copiar fácilmente.
  • Imprima bloques de código parciales de forma limpia; cierre las vallas cuando terminen las transmisiones.
  • Mantenga breves las indicaciones del sistema; los límites de salida ajustados evitan que se desvíen.
  • Registra el marca de tiempo del primer token para detectar regresiones.
Prueba Compute hoy
Implemente un VLLM punto final activado Calcular. La transmisión está activada de forma predeterminada. Colócala cerca de los usuarios, establece límites de salida estrictos y observa cómo mejoran TTFT y TPS.

Transmisión de tokens que parece rápida y cuesta menos

Usa SSE para la mayoría de los chats. Usa WebSockets solo cuando necesites mensajes bidireccionales. Cancela rápidamente, limita las salidas y desactiva el almacenamiento en búfer del proxy. Mida tiempo hasta el primer token y fichas por segundo, luego ajusta los límites de los límites de los lotes y los límites antes de cambiar el hardware.

PREGUNTAS MÁS FRECUENTES

¿Qué es un evento enviado por el servidor (SSE)?

Transmisión HTTP unidireccional que el servidor envía al cliente. La transmisión de tokens se corresponde bien con el SSE.

¿Cuál es la diferencia entre SSE y WebSockets?

El SSE es unidireccional y sencillo; los WebSockets son bidireccionales y mejores para las aplicaciones interactivas. Para la salida de chat, el SSE suele ser suficiente.

¿La API compatible con OpenAI admite la transmisión?

Sí, use stream: true o un cliente SSE. Recibirás fichas incrementales hasta que el modelo se detenga o hasta que lo canceles.

¿Cómo cancelo una transmisión?

Anule la solicitud HTTP (SSE) o cierre el WebSocket. Libere siempre los recursos del servidor al cancelar.

¿Por qué veo que la salida llega en un solo fragmento?

Un intermediario está almacenando en búfer la respuesta. Deshabilite el almacenamiento en búfer de la ruta y mantenga activa la conexión.

¿Puedo hacer streaming en navegadores sin biblioteca?

Sí: EventSource para SSE o fetch () con la API de Streams para leer fragmentos.