Skip to main content

Stream Transport Helpers

The Go AI SDK provides transport-oriented helpers for converting stream results into HTTP-friendly payloads and reading them back.

CreateTextStreamResponse​

func CreateTextStreamResponse(ctx context.Context, result *ai.StreamTextResult) (*http.Response, error)

Returns an *http.Response with a plain text body (text/plain; charset=utf-8) built from text chunks.

PipeTextStreamToResponse​

func PipeTextStreamToResponse(ctx context.Context, result *ai.StreamTextResult, w io.Writer) error

Writes text chunks to w as plain UTF-8 text.

CreateUIMessageStream​

func CreateUIMessageStream(ctx context.Context, result *ai.StreamTextResult, opts ...ai.UIMessageStreamResultOptions) (<-chan ai.UIMessageChunk, <-chan error)

Converts stream chunks to UI message chunks.

CreateUIMessageStreamResponse​

func CreateUIMessageStreamResponse(ctx context.Context, result *ai.StreamTextResult, opts ...ai.UIMessageStreamResultOptions) (*http.Response, error)

Returns an *http.Response with Server-Sent Events (text/event-stream) UI message chunks.

PipeUIMessageStreamToResponse​

func PipeUIMessageStreamToResponse(ctx context.Context, result *ai.StreamTextResult, w io.Writer, opts ...ai.UIMessageStreamResultOptions) error

Writes UI message chunks as Server-Sent Events.

Keep-alive​

CreateUIMessageStreamResponseWithInit and PipeUIMessageStreamToResponseWithInit accept a *ai.UIMessageStreamResponseInit with a KeepAliveMs *time.Duration field. When set to a positive duration, the pipeline writes an opening : stream-open\n\n SSE comment immediately — so a reverse proxy sees the response start right away instead of buffering an empty connection — and then a : keep-alive\n\n comment whenever that duration elapses with no other write, resetting on every real chunk:

keepAlive := 15 * time.Second
err := ai.PipeUIMessageStreamToResponseWithInit(ctx, result, w, &ai.UIMessageStreamResponseInit{
KeepAliveMs: &keepAlive,
})

ReadUIMessageStream and ReadUIMessages already skip SSE comment lines (any line starting with :), so a client reading a keep-alive-enabled stream needs no changes.

ReadUIMessageStream​

func ReadUIMessageStream(r io.Reader) ([]ai.UIMessageChunk, error)

Reads Server-Sent Events UI chunk payloads from a reader.

ConsumeStream​

func ConsumeStream(ctx context.Context, stream provider.TextStream) error

Consumes a stream until completion or context cancellation.