use agent_sdk::advanced::TurnOutcome;
use agent_sdk::{
AgentInput, CancellationToken, InMemoryEventStore, ThreadId, ToolContext, ToolRuntime,
TurnOptions, builder, providers::AnthropicProvider,
};
use std::sync::Arc;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
env_logger::init();
let api_key = std::env::var("ANTHROPIC_API_KEY")
.expect("ANTHROPIC_API_KEY environment variable must be set");
let event_store = Arc::new(InMemoryEventStore::new());
let agent = builder::<()>()
.provider(AnthropicProvider::sonnet(api_key))
.event_store(event_store.clone())
.build();
let thread_id = ThreadId::new();
let tool_ctx = ToolContext::new(());
let server_options = TurnOptions {
tool_runtime: ToolRuntime::External,
strict_durability: true,
};
let outcome = Box::pin(agent.run_turn(
thread_id.clone(),
AgentInput::Text("What is the capital of France?".into()),
tool_ctx,
CancellationToken::new(),
server_options,
))
.await;
if let Some(summary) = outcome.summary() {
println!("── TurnSummary ──");
println!("thread_id : {}", summary.thread_id);
println!("turn : {}", summary.turn);
println!("total_turns : {}", summary.total_turns);
println!(
"provider / model : {} / {}",
summary.provenance.provider, summary.provenance.model
);
println!(
"response_id : {}",
summary.response_id.as_deref().unwrap_or("<none>")
);
println!("stop_reason : {:?}", summary.stop_reason);
println!("tool_call_count : {}", summary.tool_call_count);
println!(
"turn_usage : {} in / {} out",
summary.turn_usage.input_tokens, summary.turn_usage.output_tokens
);
println!(
"total_usage : {} in / {} out",
summary.total_usage.input_tokens, summary.total_usage.output_tokens
);
println!("duration_ms : {}", summary.duration_ms);
println!("tool_runtime : {:?}", summary.tool_runtime);
println!("strict_durability: {}", summary.strict_durability);
let json = serde_json::to_string_pretty(summary)?;
println!("\n── Serialised (durable server row) ──\n{json}");
}
match outcome {
TurnOutcome::Done { .. } => println!("\nAgent finished."),
TurnOutcome::NeedsMoreTurns { .. } => {
println!("\nAgent needs another turn (tool results already appended).");
}
TurnOutcome::PendingToolCalls {
tool_calls,
continuation,
..
} => {
println!(
"\n{} tool call(s) need external execution:",
tool_calls.len()
);
for call in &tool_calls {
println!(" • {} ({}) — {}", call.display_name, call.name, call.id);
}
let _ = continuation;
}
TurnOutcome::AwaitingConfirmation { description, .. } => {
println!("\nTool needs confirmation: {description}");
}
TurnOutcome::Refusal { .. } => println!("\nModel refused the request."),
TurnOutcome::Cancelled { .. } => println!("\nTurn was cancelled."),
TurnOutcome::Error(err) => eprintln!("\nError: {err}"),
}
Ok(())
}