Ingeniería LLM · Media · 12 min

Lee un stream SSE de chat

Con stream: true, la API de chat compatible con OpenAI responde con Server-Sent Events. Junta los fragmentos de texto y para en [DONE].

Un stream SSE llega como texto con una línea por evento: data: {json}. Cada JSON trae el fragmento en choices[0].delta.content, que puede faltar (por ejemplo, el primer evento solo trae role). Las líneas que empiezan por : son comentarios (keep-alive) y las vacías separan eventos.

Escribe parseSSE(text) que devuelva el texto completo. Ignora comentarios, líneas vacías y cualquier línea que no empiece por data:. Cuando llegue data: [DONE], para: lo que venga después no cuenta. El espacio tras data: es opcional.

La variable SAMPLE contiene un stream de ejemplo.

Un reto más usa LIVE: la salida real de tu propio Ollama si activas «Mi Ollama», o una muestra distinta si no. Ese reto mira la estructura, no las palabras exactas.

Retos 0/5

  • Junta el texto de SAMPLE
  • Ignora eventos sin content (no añade 'undefined')
  • Para en data: [DONE]
  • Acepta data: sin espacio e ignora otras líneas
  • Funciona con el stream real de tu modelo (Mi Ollama) o con otra muestra

function parseSSE(text) {
  // 1. separa en líneas
  // 2. quédate solo con las líneas que empiezan por 'data:'; para en [DONE]
  // 3. JSON.parse y añade choices[0].delta.content cuando exista
  let out = '';
  for (const line of text.split('\n')) {
    if (line.startsWith('data: ')) {
      const chunk = JSON.parse(line.slice(6));
      out += chunk.choices[0].delta.content;
    }
  }
  return out;
}

try { console.log(parseSSE(SAMPLE)); } catch (e) { console.error(e.message); }
La consola aparece aquí (console.log).

Para profundizar: la referencia de MDN (en inglés) →

¿Esto en producción, con tus datos? Hablemos 15 minutos →