pig_protocol/sse

Parsers for OpenAI Server-Sent Events (SSE) streams.

Handles two streams:

Pure — no IO. The transport layer (pig_protocol/transport/httpc) is responsible for delivering the raw bytes.

Types

A decoded event from an OpenAI Responses API (Codex) SSE stream.

pub type ResponsesEvent {
  ResponseCreated(id: String)
  OutputTextDelta(delta: String)
  FunctionCallArgumentsDelta(delta: String)
  FunctionCallArgumentsDone(arguments: String)
  ResponseCompleted(metadata: inference.InferenceMetadata)
  ResponseIncomplete(metadata: inference.InferenceMetadata)
  ResponseFailed(message: String)
  ResponseError(message: String)
  OtherResponseEvent
}

Constructors

  • ResponseCreated(id: String)
  • OutputTextDelta(delta: String)
  • FunctionCallArgumentsDelta(delta: String)
  • FunctionCallArgumentsDone(arguments: String)
  • ResponseCompleted(metadata: inference.InferenceMetadata)
  • ResponseIncomplete(metadata: inference.InferenceMetadata)
  • ResponseFailed(message: String)
  • ResponseError(message: String)
  • OtherResponseEvent

A decoded delta from a Chat Completions SSE stream.

pub type StreamDelta {
  ContentChunk(String)
  UsageChunk(input: Int, output: Int)
  StreamDone
}

Constructors

  • ContentChunk(String)
  • UsageChunk(input: Int, output: Int)
  • StreamDone

Values

pub fn frame_data(frame: String) -> String

Extract the concatenated data: payload from an SSE frame.

Ignores id:, event:, and comment lines. Multiple data: lines are joined with a newline before being trimmed.

pub fn parse_chat_line(data: String) -> Result(StreamDelta, Nil)

Parse a single data: payload from a Chat Completions stream.

Returns StreamDone for [DONE], UsageChunk for a final usage frame, and ContentChunk for a token delta.

pub fn parse_responses_event(data: String) -> ResponsesEvent

Parse a single data: payload from a Responses API stream.

pub fn split_frames(buffer: String) -> #(List(String), String)

Split a buffer into complete SSE frames and any trailing partial frame.

SSE frames are separated by two consecutive newlines (\n\n). The returned remainder should be prepended to the next chunk of bytes.

Search Document