use lingshu_sdk::prelude::*;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let agent = SdkAgent::builder("copilot/claude-sonnet-4.6")?
.max_iterations(15)
.quiet_mode(true)
.build()?;
let result = agent
.run("What are the top 3 design patterns in Rust? Give a brief example for each.")
.await?;
println!("=== Conversation Result ===\n");
println!(
"Response:\n{}\n",
&result.final_response[..result.final_response.len().min(500)]
);
println!("--- Metadata ---");
println!("Model: {}", result.model);
println!("Session ID: [redacted]");
println!("API calls: {}", result.api_calls);
println!("Interrupted: {}", result.interrupted);
println!("Budget exhausted: {}", result.budget_exhausted);
println!("\n--- Token Usage ---");
println!("Input tokens: {}", result.usage.input_tokens);
println!("Output tokens: {}", result.usage.output_tokens);
println!("Cache read: {}", result.usage.cache_read_tokens);
println!("Cache write: {}", result.usage.cache_write_tokens);
println!("Reasoning tokens: {}", result.usage.reasoning_tokens);
println!("Total tokens: {}", result.usage.total_tokens);
println!("\n--- Cost Breakdown ---");
println!("Input cost: ${:.6}", result.cost.input_cost);
println!("Output cost: ${:.6}", result.cost.output_cost);
println!("Cache read cost: ${:.6}", result.cost.cache_read_cost);
println!("Cache write cost: ${:.6}", result.cost.cache_write_cost);
println!("Total cost: ${:.6}", result.cost.total_cost);
if !result.tool_errors.is_empty() {
println!("\n--- Tool Errors ---");
for err in &result.tool_errors {
println!(
" Turn {}: {} — [error details redacted]",
err.turn, err.tool_name
);
}
}
println!("\nMessages in conversation: {}", result.messages.len());
Ok(())
}