use claude_agent_sdk::{ClaudeAgentOptions, ClaudeClient, ContentBlock, Message};
use futures::StreamExt;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Session Management Example ===\n");
println!("--- Example 1: Separate Sessions ---");
example_separate_sessions().await?;
println!("\n--- Example 2: Fork Session for Fresh Start ---");
example_fork_session().await?;
println!("\n--- Example 3: Dynamic Session Switching ---");
example_dynamic_switching().await?;
Ok(())
}
async fn example_separate_sessions() -> Result<(), Box<dyn std::error::Error>> {
let mut client = ClaudeClient::new(ClaudeAgentOptions::default());
client.connect().await?;
println!("Session 1: Asking about math");
client
.query_with_session("What is 2 + 2?", "math-session")
.await?;
{
let mut stream = client.receive_response();
while let Some(msg) = stream.next().await {
if let Message::Assistant(assistant) = msg? {
for block in &assistant.message.content {
if let ContentBlock::Text(text_block) = block {
println!("Claude (math-session): {}", text_block.text);
}
}
}
}
}
println!("\nSession 2: Asking about programming (different context)");
client
.query_with_session("What is Rust?", "programming-session")
.await?;
{
let mut stream = client.receive_response();
while let Some(msg) = stream.next().await {
if let Message::Assistant(assistant) = msg? {
for block in &assistant.message.content {
if let ContentBlock::Text(text_block) = block {
println!("Claude (programming-session): {}", text_block.text);
}
}
}
}
}
println!("\nBack to Session 1: Follow-up on math");
client
.query_with_session("What about 3 + 3?", "math-session")
.await?;
{
let mut stream = client.receive_response();
while let Some(msg) = stream.next().await {
if let Message::Assistant(assistant) = msg? {
for block in &assistant.message.content {
if let ContentBlock::Text(text_block) = block {
println!("Claude (math-session): {}", text_block.text);
}
}
}
}
}
client.disconnect().await?;
Ok(())
}
async fn example_fork_session() -> Result<(), Box<dyn std::error::Error>> {
let options = ClaudeAgentOptions::builder()
.fork_session(true)
.max_turns(1)
.build();
let mut client = ClaudeClient::new(options);
client.connect().await?;
println!("With fork_session=true, resumed sessions start fresh");
println!("This is useful when you want to completely clear memory/context");
client.query("Remember this number: 42").await?;
{
let mut stream = client.receive_response();
while let Some(msg) = stream.next().await {
if let Message::Assistant(assistant) = msg? {
for block in &assistant.message.content {
if let ContentBlock::Text(text_block) = block {
println!("Claude: {}", text_block.text);
}
}
}
}
}
client.disconnect().await?;
Ok(())
}
async fn example_dynamic_switching() -> Result<(), Box<dyn std::error::Error>> {
let mut client = ClaudeClient::new(ClaudeAgentOptions::default());
client.connect().await?;
println!("Starting first conversation");
client.query("My favorite color is blue").await?;
{
let mut stream = client.receive_response();
while let Some(msg) = stream.next().await {
if let Message::Assistant(assistant) = msg? {
for block in &assistant.message.content {
if let ContentBlock::Text(text_block) = block {
println!("Claude: {}", text_block.text);
}
}
}
}
}
println!("\nSwitching to new session (different context)");
client
.new_session("session-2", "My favorite color is red")
.await?;
{
let mut stream = client.receive_response();
while let Some(msg) = stream.next().await {
if let Message::Assistant(assistant) = msg? {
for block in &assistant.message.content {
if let ContentBlock::Text(text_block) = block {
println!("Claude: {}", text_block.text);
}
}
}
}
}
client.disconnect().await?;
Ok(())
}