pig_protocol/sse
Parsers for OpenAI Server-Sent Events (SSE) streams.
Handles two streams:
- Chat Completions:
parse_chat_linedecodes per-token deltas. - Responses API (Codex):
parse_responses_eventdecodes typed events keyed off the event’stypefield.
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.