use claude_agents_sdk::{ClaudeAgentOptions, ClaudeClient, Message, UserMessageContent};
use tokio_stream::StreamExt;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("Partial Message Streaming Example");
println!("{}", "=".repeat(50));
let options = ClaudeAgentOptions::new()
.with_model("claude-sonnet-4-5")
.with_max_turns(2)
.with_partial_messages();
let mut client = ClaudeClient::new(Some(options), None);
client.connect().await?;
let prompt = "Think of three jokes, then tell one";
println!("Prompt: {}\n", prompt);
println!("{}", "=".repeat(50));
client.query(prompt).await?;
while let Some(msg) = client.receive_messages().next().await {
let msg = msg?;
match &msg {
Message::StreamEvent(event) => {
println!("StreamEvent: {:?}", event);
}
Message::Assistant(asst) => {
println!("AssistantMessage: {} blocks", asst.content.len());
for block in &asst.content {
println!(" Block: {:?}", block);
}
}
Message::User(user) => match &user.content {
UserMessageContent::Text(text) => {
println!("UserMessage (text): {:?}", text);
}
UserMessageContent::Blocks(blocks) => {
println!("UserMessage: {} blocks", blocks.len());
}
},
Message::System(sys) => {
println!("SystemMessage: subtype={:?}", sys.subtype);
}
Message::Result(result) => {
println!(
"ResultMessage: subtype={:?}, cost={:?}",
result.subtype, result.total_cost_usd
);
break;
}
}
}
client.disconnect().await?;
Ok(())
}