use std::io::Write as _;
use std::sync::Arc;
use agent_sdk::{
AgentEvent, AgentInput, CancellationToken, EventStore, InMemoryEventStore, ObservingEventStore,
ThreadId, ToolContext, builder, providers::AnthropicProvider,
};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
env_logger::init();
let api_key = std::env::var("ANTHROPIC_API_KEY")
.map_err(|_| anyhow::anyhow!("ANTHROPIC_API_KEY environment variable must be set"))?;
let event_store: Arc<dyn EventStore> = Arc::new(ObservingEventStore::new(
InMemoryEventStore::new(),
|envelope| {
if let AgentEvent::TextDelta { delta, .. } = &envelope.event {
print!("{delta}");
let _ = std::io::stdout().flush();
}
},
));
let agent = builder::<()>()
.provider(AnthropicProvider::sonnet(api_key))
.event_store(event_store)
.build();
let thread_id = ThreadId::new();
print!("Agent: ");
std::io::stdout().flush()?;
let final_state = agent.run(
thread_id,
AgentInput::Text("Write a haiku about the Rust borrow checker.".to_string()),
ToolContext::new(()),
CancellationToken::new(),
);
let _ = final_state.await?;
println!();
Ok(())
}