SSE stream viewer

Input
Output

SSE Stream Viewer

A streamed LLM response arrives as dozens of small events, each with a few characters of text or a piece of a tool call's JSON. Paste the capture, from curl -N, your browser's EventStream tab or a log, and see the final message the SDK would have built, or every event in order.

Example: a Claude answer with a tool call

Thirteen events from Claude: some text, then a tool call whose input arrives in three pieces. Merged, it's one message with the text, the tool's input as JSON, the stop reason and the token usage:

Event stream

event: message_start
data: {"type":"message_start","message":{"id":"msg_01XFDUDYJgAACzvnptvVoYEL","type":"message","role":"assistant","content":[],"model":"claude-opus-5-5","stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":472,"output_tokens":2}}}

event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}

event: ping
data: {"type":"ping"}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"I'll check the "}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"order status."}}

event: content_block_stop
data: {"type":"content_block_stop","index":0}

event: content_block_start
data: {"type":"content_block_start","index":1,"content_block":{"type":"tool_use","id":"toolu_01T1x1fJ34qAmk2tNTrN7Up6","name":"get_order","input":{}}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":""}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"{\"order_id\": \"ORD-"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"20419\"}"}}

event: content_block_stop
data: {"type":"content_block_stop","index":1}

event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"tool_use","stop_sequence":null},"usage":{"output_tokens":89}}

event: message_stop
data: {"type":"message_stop"}

Output

{
  "id": "msg_01XFDUDYJgAACzvnptvVoYEL",
  "type": "message",
  "role": "assistant",
  "content": [
    {
      "type": "text",
      "text": "I'll check the order status."
    },
    {
      "type": "tool_use",
      "id": "toolu_01T1x1fJ34qAmk2tNTrN7Up6",
      "name": "get_order",
      "input": {
        "order_id": "ORD-20419"
      }
    }
  ],
  "model": "claude-opus-5-5",
  "stop_reason": "tool_use",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 472,
    "output_tokens": 89
  }
}

How do I use the SSE stream viewer?

  1. Paste the stream: the data: lines as captured, or one JSON event per line.
  2. Read the final message, or choose Show: the text only, or every event.
  3. Copy the message as JSON, or open it in any other tool.

What does the SSE stream viewer do?

  • OpenAI Chat Completions and Responses, Anthropic Messages, Gemini
  • Tool calls rebuilt from their pieces
  • Says when a stream was cut off

When to use the SSE stream viewer

Streaming APIs send text/event-stream: a series of events, each a data: line with a small JSON object, separated by blank lines. For a language model each event carries the next few characters of the answer, a piece of a tool call's arguments, or, at the end, the stop reason and token usage. The SDKs put those pieces back together for you; when you capture the raw stream with curl -N, a proxy or the browser's EventStream tab, you get the pieces.

Bracely merges them the way each API documents: Anthropic's content blocks with text, thinking, signatures, citations and tool inputs; OpenAI Chat Completions choices with content and tool-call arguments joined by their index, and the usage chunk; OpenAI Responses from its output items, or from response.completed when the capture has it; and Gemini's candidates, with text pieces joined and thoughts and function calls kept as their own parts.

A capture that stops early is still read: you see everything up to the cut, and the note says what's missing, such as a stream with no [DONE] or a tool input whose JSON never closed.

Frequently asked questions

Which formats does it read?
SSE as captured (event:, data:, id: and blank lines, LF or CRLF), or one JSON event per line with no data: prefix, as some loggers write them. Comments and multi-line data are handled.
Can it connect to a live stream?
This tool reads a capture. To watch a stream as it arrives, use WebSocket & SSE, which connects to an address and shows each event as it comes.
Why rebuild a stream by hand?
To debug what a model really sent: a tool call whose JSON broke off, text that stopped mid-sentence, or usage numbers to check. The capture shows every piece; this shows what they add up to.
Is my data uploaded?
No. Bracely runs entirely in your browser, so nothing you paste or open leaves your device.

More JSON tools

Bracely has 108 JSON tools in one page. Related ones:

Runs entirely in your browser. Nothing you paste is uploaded. Made by Saurabh Pagrut · About · Privacy policy
Last updated · Version 6.2 · Changelog
Saurabh Pagrut on GitHub · LinkedIn · X · YouTube · Instagram