LLM engineering · Medium · 12 min

Read an SSE chat stream

With stream: true, the OpenAI-compatible chat API answers with Server-Sent Events. Join the text fragments and stop at [DONE].

An SSE stream arrives as text with one line per event: data: {json}. Each JSON carries the fragment in choices[0].delta.content, which may be missing (for example, the first event only carries role). Lines starting with : are comments (keep-alive) and empty lines separate events.

Write parseSSE(text) that returns the full text. Ignore comments, empty lines and any line that does not start with data:. When data: [DONE] arrives, stop: anything after it does not count. The space after data: is optional.

The variable SAMPLE holds an example stream.

One more check uses LIVE: real output from your own Ollama if you switch on "My Ollama", or a different sample if not. That check looks at structure, not exact words.

Challenges 0/5

  • Joins the text of SAMPLE
  • Skips events without content (no 'undefined')
  • Stops at data: [DONE]
  • Accepts data: without a space and ignores other lines
  • Works on the real stream from your model (My Ollama) or another sample

function parseSSE(text) {
  // 1. split into lines
  // 2. keep only lines that start with 'data:'; stop at [DONE]
  // 3. JSON.parse and append choices[0].delta.content when present
  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); }
Console output appears here (console.log).

Go deeper: the MDN reference →

This in production, with your data? Let's talk for 15 minutes →