ClaudeCode.Stream (ClaudeCode v0.1.0)

View Source

Stream utilities for handling Claude Code responses.

This module provides functions to create and manipulate streams of messages from Claude Code sessions. It enables real-time processing of Claude's responses without waiting for the complete result.

Example

session
|> ClaudeCode.query("Write a story")
|> ClaudeCode.Stream.text_content()
|> Stream.each(&IO.write/1)
|> Stream.run()

Summary

Functions

Buffers text content until complete assistant messages are formed.

Creates a stream of messages from a Claude Code query.

Filters a message stream by message type.

Extracts text content from a message stream.

Extracts tool use blocks from a message stream.

Takes messages until a result is received.

Functions

buffered_text(stream)

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

Buffers text content until complete assistant messages are formed.

This is useful when you want complete sentences or paragraphs rather than individual text fragments.

Examples

session
|> ClaudeCode.query("Explain something")
|> ClaudeCode.Stream.buffered_text()
|> Enum.each(&IO.puts/1)

create(session, prompt, opts \\ [])

@spec create(pid(), String.t(), keyword()) :: Enumerable.t()

Creates a stream of messages from a Claude Code query.

This is the primary function for creating message streams. It returns a Stream that emits messages as they arrive from the CLI.

Options

  • :timeout - Maximum time to wait for each message (default: 60_000ms)
  • :filter - Message type filter (:all, :assistant, :tool_use, :result)

Examples

# Stream all messages
ClaudeCode.Stream.create(session, "Hello")
|> Enum.each(&IO.inspect/1)

# Stream only assistant messages
ClaudeCode.Stream.create(session, "Hello", filter: :assistant)
|> Enum.map(& &1.message.content)

filter_type(stream, type)

@spec filter_type(Enumerable.t(), atom()) :: Enumerable.t()

Filters a message stream by message type.

Examples

# Only assistant messages
stream |> ClaudeCode.Stream.filter_type(:assistant)

# Only result messages
stream |> ClaudeCode.Stream.filter_type(:result)

text_content(stream)

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

Extracts text content from a message stream.

Filters the stream to only emit text content from assistant messages, making it easy to collect the textual response.

Examples

text = session
|> ClaudeCode.query("Tell me about Elixir")
|> ClaudeCode.Stream.text_content()
|> Enum.join()

tool_uses(stream)

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

Extracts tool use blocks from a message stream.

Filters the stream to only emit tool use content blocks, making it easy to react to tool usage in real-time.

Examples

session
|> ClaudeCode.query("Create some files")
|> ClaudeCode.Stream.tool_uses()
|> Enum.each(&handle_tool_use/1)

until_result(stream)

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

Takes messages until a result is received.

This is useful when you want to process messages but stop as soon as the final result arrives.

Examples

messages = session
|> ClaudeCode.query("Quick task")
|> ClaudeCode.Stream.until_result()
|> Enum.to_list()