//! Multi-turn [`Client`] example. //! //! Sends two prompts back-to-back without re-spawning the CLI subprocess — //! mirrors the Python SDK's `ClaudeSDKClient` async-context pattern. //! //! Run: //! //! ```sh //! cargo run --example interactive //! ``` use claude_agent_sdk::{ClaudeAgentOptions, Client, ContentBlock, Message}; use tokio_stream::StreamExt; #[tokio::main] async fn main() -> anyhow::Result<()> { let mut client = Client::new(ClaudeAgentOptions::new().with_max_turns(1)).await?; client.connect().await?; let mut stream = client.messages(); client.send("Say 'one'.").await?; drain_until_result(&mut stream, "turn 1").await?; client.send("Say 'two'.").await?; drain_until_result(&mut stream, "turn 2").await?; client.disconnect().await?; Ok(()) } async fn drain_until_result( stream: &mut (impl tokio_stream::Stream> + Unpin), label: &str, ) -> anyhow::Result<()> { while let Some(item) = stream.next().await { match item? { Message::Assistant(a) => { for block in &a.message.content { if let ContentBlock::Text(t) = block { println!("[{label}] Claude: {}", t.text); } } } Message::Result(_) => { println!("[{label}] done"); return Ok(()); } _ => {} } } Ok(()) }