use std::sync::Arc;
use rs_adk::agent::Agent;
use rs_adk::context::InvocationContext;
use rs_adk::error::AgentError;
use rs_adk::router::AgentRegistry;
use rs_adk::tool::{ToolDispatcher, TypedTool};
use async_trait::async_trait;
use schemars::JsonSchema;
use serde::Deserialize;
#[derive(Deserialize, JsonSchema)]
struct WeatherArgs {
city: String,
}
struct WeatherAgent {
dispatcher: ToolDispatcher,
}
impl WeatherAgent {
fn new() -> Self {
let weather_tool = TypedTool::new(
"get_weather",
"Get current weather for a city",
|args: WeatherArgs| async move {
Ok(serde_json::json!({
"city": args.city,
"temperature": "22°C",
"condition": "Sunny"
}))
},
);
let mut dispatcher = ToolDispatcher::new().with_timeout(std::time::Duration::from_secs(10));
dispatcher.register_function(Arc::new(weather_tool));
Self { dispatcher }
}
}
#[async_trait]
impl Agent for WeatherAgent {
fn name(&self) -> &str {
"weather"
}
async fn run_live(&self, _ctx: &mut InvocationContext) -> Result<(), AgentError> {
println!(
"WeatherAgent running with {} tools (default timeout: {:?})",
self.dispatcher.len(),
self.dispatcher.default_timeout(),
);
Ok(())
}
fn tools(&self) -> Vec<rs_genai::prelude::Tool> {
self.dispatcher.to_tool_declarations()
}
}
struct GreetingAgent;
#[async_trait]
impl Agent for GreetingAgent {
fn name(&self) -> &str {
"greeter"
}
async fn run_live(&self, _ctx: &mut InvocationContext) -> Result<(), AgentError> {
println!("GreetingAgent: Hello!");
Ok(())
}
}
fn main() {
let mut registry = AgentRegistry::new();
registry.register(Arc::new(WeatherAgent::new()));
registry.register(Arc::new(GreetingAgent));
println!("Registered agents: {:?}", registry.names());
if let Some(agent) = registry.resolve("weather") {
println!(
"Resolved '{}' with {} tools",
agent.name(),
agent.tools().len()
);
}
}