//! quick_start —— 30 行最小可运行示例,展示 Agent / BaseTool / Builder / Session 四层抽象。 //! Required features: cargo run --example quick_start --features "agent" //! //! 运行:`cargo run --example quick_start`(离线,零配置) use agcore::agent::{Agent, AgentBuilder, AgentSession}; use agcore::llm::LlmProvider; use agcore::llm::hooks::HookExecutor; use agcore::llm::mock::MockProvider; use agcore::llm::types::{ Usage, message::{ContentBlock, Message}, response_v2::{MessageResponse, StopReason}, }; use agcore::tools::{BaseTool, ToolContext, ToolError, ToolRegistry}; use async_trait::async_trait; use serde_json::{Value, json}; use std::sync::Arc; struct Greeter; impl Agent for Greeter { fn name(&self) -> &str { "greeter" } fn system_prompt(&self) -> Option<&str> { Some("中文助手,先调用 echo 工具,再总结。") } } struct EchoTool; #[async_trait] impl BaseTool for EchoTool { fn name(&self) -> &str { "echo" } fn description(&self) -> &str { "回显文本" } fn parameters(&self) -> Value { json!({"type":"object","properties":{"text":{"type":"string"}},"required":["text"]}) } async fn execute(&self, args: Value, _: &ToolContext<'_>) -> Result { let text = args.get("text").and_then(|v| v.as_str()).ok_or_else(|| { ToolError::InvalidArguments("text".into(), "需要 string 类型的 text 参数".into()) })?; Ok(json!({"echoed": format!("收到: {text}")})) } } fn resp(content: Vec, stop: StopReason, u: (u32, u32)) -> MessageResponse { MessageResponse { id: String::new(), model: "mock".into(), message: Message::Assistant { content }, usage: Usage::from_input_output(u.0, u.1), stop_reason: stop, extra: Default::default(), } } #[tokio::main] async fn main() { let mut registry = ToolRegistry::new(); registry.register(Arc::new(EchoTool)).unwrap(); let provider: Arc = Arc::new(MockProvider::new(vec![ resp( vec![ContentBlock::ToolUse { id: "c1".into(), name: "echo".into(), input: json!({"text": "你好"}), }], StopReason::ToolUse, (5, 8), ), resp( vec![ContentBlock::Text { text: "EchoTool 已收到您的消息并完成回传。".into(), }], StopReason::Stop, (8, 16), ), ])); let bundle = Arc::new( AgentBuilder::new() .provider(provider) .tool_registry(Arc::new(registry)) .hook_executor(Arc::new(HookExecutor::new())) .build() .unwrap(), ); let mut session = AgentSession::new(Arc::new(Greeter), "qs", bundle); let resp = session.submit_turn("你好").await.unwrap(); let text = resp.text(); println!("LLM: {text}"); assert!(text.contains("收到"), "响应应包含'收到'字样: {text}"); println!("\n✓ quick_start 完成"); }