5baa170508
- README 添加 feature 组合表 + 模块级 features 清单 + 升级指南 - 18 个 example 顶部添加 Required features 注释 - roadmap.md 和 roadmap-v0.3.2.md 同步 Phase 26-27 完成状态 - cargo fmt 全量格式化(修复预存格式问题,CI format job 可通过)
98 lines
3.1 KiB
Rust
98 lines
3.1 KiB
Rust
//! 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<Value, ToolError> {
|
|
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<ContentBlock>, 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<dyn LlmProvider> = 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 完成");
|
|
}
|