ClaudeCode.Stream (ClaudeCode v0.1.0)
View SourceStream 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
@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)
@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)
@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)
@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()
@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)
@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()