HuggingfaceClient.Inference.SSE (huggingface_client v0.1.0)

Copy Markdown View Source

Server-Sent Events (SSE) parser for streaming inference responses.

Implements the WHATWG SSE spec as a pure Elixir byte-stream parser, faithfully mirroring the logic in vendor/fetch-event-source/parse.ts from the JS package.

Key properties

  • Handles \r\n, \r, and \n line endings
  • Accumulates partial lines across chunk boundaries (no data loss)
  • Ignores :comment lines
  • Dispatches a message on each blank line
  • Filters data: [DONE] sentinel values
  • JSON-decodes data fields and surfaces {"error": ...} as exceptions

Example

chunks = ["data: {"choices":[{}]}\n\n", "data: [DONE]\n\n"]
Enum.to_list(HuggingfaceClient.Inference.SSE.parse_stream_json(chunks))
# => [%{"choices" => [%{}]}]

Summary

Functions

Wraps an enumerable of binary chunks into a lazy stream of parsed SSE events.

Parses SSE chunks and JSON-decodes each .data field.

Types

event()

@type event() :: %{
  id: String.t(),
  event: String.t(),
  data: String.t(),
  retry: non_neg_integer() | nil
}

Functions

parse_stream(chunk_stream)

@spec parse_stream(Enumerable.t()) :: Enumerable.t()

Wraps an enumerable of binary chunks into a lazy stream of parsed SSE events.

Each element is an %{id, event, data, retry} map. [DONE] messages and empty-data events are filtered out.

parse_stream_json(chunk_stream)

@spec parse_stream_json(Enumerable.t()) :: Enumerable.t()

Parses SSE chunks and JSON-decodes each .data field.

Returns a stream of decoded maps. Events where data isn't valid JSON are logged at :warning level and skipped. Events containing {"error": ...} are raised as ProviderApiError.