Skip to content

Conversation

@terasakisatoshi
Copy link
Member

Summary

  • Adds new query_stream() function for message-level streaming
  • Enables more responsive applications by yielding messages as they arrive
  • Includes comprehensive examples demonstrating streaming usage

Details

This PR introduces streaming support to ClaudeCodeSDK.jl, allowing applications to receive and process messages as they arrive from the Claude CLI rather than waiting for the complete response.

Key Changes

  1. New query_stream() function: Returns a Channel{Message} that yields messages as they're received
  2. Transport layer enhancement: Added stream_messages() that reads CLI output line-by-line
  3. Client streaming support: New process_query_stream() method to handle streaming workflow
  4. Example code: Three new examples demonstrating different streaming use cases

Important Note

This implementation provides message-level streaming, not character-level streaming. The Claude CLI outputs complete messages as JSON objects, so we receive:

  • SystemMessage immediately when the query starts
  • Complete AssistantMessage once Claude finishes generating it
  • ResultMessage when the query completes

This is still valuable for:

  • Long-running queries where you want immediate feedback
  • Applications that need to know when processing starts
  • Better UX with progress indication

Usage Example

using ClaudeCodeSDK

# Stream messages as they arrive
for message in query_stream(prompt="Write a detailed analysis")
    if message isa SystemMessage
        println("Query started...")
    elseif message isa AssistantMessage
        for block in message.content
            if block isa TextBlock
                print(block.text)
                flush(stdout)
            end
        end
    elseif message isa ResultMessage
        println("\nCompleted! Cost: \$$(message.cost_usd)")
    end
end

Testing

All existing tests pass. The streaming functionality gracefully handles CLI availability and provides the same error handling as the batch query() function.

🤖 Generated with Claude Code

This commit introduces a new query_stream() function that yields messages
as they arrive from the Claude CLI, rather than waiting for the complete
response. This enables more responsive applications, especially for long-running
queries.

Key changes:
- Added query_stream() function that returns a Channel{Message}
- Implemented stream_messages() in transport layer using line-by-line reading
- Added process_query_stream() in client to support streaming workflow
- Created comprehensive examples demonstrating streaming usage

Note: This provides message-level streaming (each complete message arrives
as soon as it's available), not character-level streaming within messages.
The Claude CLI outputs complete messages as JSON objects, so individual
characters cannot be streamed.

Benefits:
- Get SystemMessage immediately when query starts
- Receive AssistantMessage as soon as Claude finishes generating
- More responsive UX for long responses
- Can start processing results before query completes

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
@terasakisatoshi terasakisatoshi merged commit 5b2eee0 into main Jun 16, 2025
10 checks passed
@terasakisatoshi terasakisatoshi deleted the feature/message-streaming branch June 16, 2025 09:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants