10.6 声明式 Agent 配置实战教程
概述
本教程手把手带你用 YAML 配置文件创建一个完整的、可直接投入生产的 Agent,涵盖模型配置、工具绑定、工作区管理、记忆系统和技能加载。学完本教程你将能够:
- 把现有的 `AgentBuilder` 代码迁移为声明式 YAML 配置 - 在 YAML 中配置多种类型的工具和上下文提供器 - 使用 `DeclAgentBuilder` 在 Rust 代码中一行加载配置文件 - 调试声明式配置中的常见问题
第一步:最简 Agent 的 YAML 文件
创建一个文件 `my-agent.yaml`:
kind: prompt
name: hello-agent
model:
id: agnes-2.0-flash
provider: openai
connection:
kind: key
api_key: $AGNES_API_KEY
instructions: 你是一个友好的助手,用中文简洁作答。
maxToolRounds: 3
Rust 加载代码:
use rust_agent_decl::DeclAgentBuilder;
let agent = DeclAgentBuilder::new()
.from_yaml_file("my-agent.yaml")
.build()
.await?;
// 运行
let session = agent.create_session();
let messages = vec![ChatMessage::user("你好,请用一句话介绍自己。")];
let mut stream = agent.run(messages, Some(session), None).await?;
第二步:添加工具
在 YAML 中添加 `tools` 段。**内置工具的 description 已内建,无需手写**:
kind: prompt
name: tool-agent
model:
id: agnes-2.0-flash
provider: openai
connection:
kind: key
api_key: $AGNES_API_KEY
instructions: 你是文件管理助手,可以读写文件。
tools:
# 内置工具:只需 kind + name
- kind: file
name: read_file
- kind: file
name: write_file
- kind: file
name: list_files
# 自定义工具:必须提供 description
- kind: function
name: greet
description: 用指定语言打招呼
maxToolRounds: 10
Rust 加载代码(需注册自定义工具工厂):
use rust_agent_decl::DeclAgentBuilder;
use rust_agent_macros::tool;
use rust_agent_core::ToolResult;
// 定义 YAML 中声明的自定义工具
#[tool(description = "用指定语言打招呼")]
async fn greet(
#[param(desc = "语言代码(如 zh, en)")] lang: String,
) -> ToolResult {
let greeting = match lang.as_str() {
"zh" => "你好!",
"en" => "Hello!",
_ => "👋",
};
ToolResult::success(serde_json::json!({"greeting": greeting}))
}
let agent = DeclAgentBuilder::new()
.from_yaml_file("tool-agent.yaml")
.with_tool("greet", |_| Ok(std::sync::Arc::new(greet_stub())))
.build()
.await?;
第三步:配置工作区
添加 `contexts` 段定义工作区边界:
contexts:
- kind: workspace
name: project-root
config:
root: /home/dev/myapp # 工作区根路径
policy: approve # 越界操作需审批
> 完整的工作区配置教程见 [第 8.5 节:声明式工作区配置与工具联动](../08-workspace-management/declarative-workspace.md)。
第四步:添加记忆系统
添加持久化记忆,让 Agent 在多次对话之间记住用户偏好:
contexts:
- kind: memory
name: skill-memory
config:
directory: logs/memory
enabled: true
consolidationInterval: 1 # 每次对话后整理记忆
第五步:添加技能系统
加载 SKILL.md 文件作为 Agent 的领域知识:
contexts:
- kind: skills
name: code-review
config:
directory: skills/code-review # 技能目录路径
技能目录结构:
skills/code-review/
├── SKILL.md # 技能定义(必需)
├── references/
│ └── rust-guidelines.md # 参考资料
└── assets/
└── templates/ # 模板文件
最终完整配置
把所有内容组合起来:
kind: prompt
name: production-agent
displayName: 生产级全栈助手
description: 具备工作区管理、记忆、技能和多种工具的全栈开发 Agent
model:
id: agnes-2.0-flash
provider: openai
connection:
kind: key
api_key: $AGNES_API_KEY
endpoint: https://apihub.agnes-ai.com/v1
options:
temperature: 0.3
maxTokens: 8192
topP: 0.95
instructions: |
你是一个全栈开发助手。核心准则:
1. **先理解再动手**:不确定就问,不要猜测
2. **最小改动**:只写必要的代码,不过度设计
3. **工作区感知**:所有文件操作在指定工作区内进行
4. **记忆利用**:从持久记忆中检索用户偏好和项目上下文
5. **技能驱动**:对代码审查、测试等任务使用专项技能
additionalInstructions: |
当前项目技术栈:Rust 2021 edition + Axum + PostgreSQL。
# ── 上下文提供器 ──
contexts:
- kind: workspace
name: project-root
config:
root: /home/dev/project
policy: approve
- kind: memory
name: skill-memory
config:
directory: logs/memory
consolidationInterval: 1
- kind: skills
name: code-review
config:
directory: skills/code-review
# ── 工具 ──
tools:
- kind: file
name: read_file
- kind: file
name: write_file
- kind: file
name: edit_file
- kind: file
name: list_files
- kind: file
name: search_file
- kind: file
name: find_files
- kind: file
name: run_command
- kind: web
name: web_search
maxToolRounds: 20
Rust 入口代码:
use rust_agent_decl::DeclAgentBuilder;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let agent = DeclAgentBuilder::new()
.from_yaml_file("production-agent.yaml")
.build()
.await?;
// 使用 ReplRunner 获得开箱即用的交互体验
rust_agent_cli::ReplRunner::new(agent)
.banner("🦀 全栈开发助手 — 输入 /help 查看命令")
.run()
.await?;
Ok(())
}
调试技巧
1. 验证 YAML 语法
# 使用 Python 检查 YAML 语法
python3 -c "import yaml; yaml.safe_load(open('agent.yaml'))"
# 或使用 yamllint
yamllint agent.yaml
2. 查看解析后的结构
use rust_agent_decl::AgentDocument;
let doc = AgentDocument::from_yaml_file("agent.yaml")?;
let def = doc.inner_definition();
println!("{:#?}", def);
3. 启用调试日志
RUST_LOG=debug,rust_agent_decl=trace cargo run
4. 常见错误及解决
| 错误信息 | 原因 | 解决 | |---------|------|------| | `Unknown tool 'xxx'` | `function`/`custom` 工具未注册工厂 | 添加 `.with_tool("xxx", factory)` | | `YAML feature is required` | 未启用 yaml feature | `features = ["yaml"]` | | `AgentDocument contains a Manifest` | YAML 顶层有 `template:` 字段 | 去掉 Manifest 包装 |
从 AgentBuilder 迁移对照
| AgentBuilder 写法 | YAML 配置 | |---|---| | `AgentBuilder::new("my-agent")` | `name: my-agent` | | `.instructions("你是助手")` | `instructions: 你是助手` | | `.chat_client(DeepSeekChatClient::from_key(...))` | `model: { connection: { kind: key, api_key: $KEY } }` | | `.with_tool(ReadFile { scope: None })` | `tools: [{ kind: file, name: read_file }]` | | `.with_tool(Echo)` | `tools: [{ kind: function, name: echo, description: ... }]` | | `.max_tool_rounds(15)` | `maxToolRounds: 15` | | `.add_context_provider(prov)` | `contexts: [{ kind: ..., name: ..., config: {...} }]` | | `WorkspaceScope::new("/path", "name")` | `contexts: [{ kind: workspace, config: { root: /path, policy: approve } }]` |
下一步
- 查阅完整的配置字段参考 → [10.5 配置字段完全参考](config-reference.md) - 深入 AgentSchema v1.0 规范 → [10.4 AgentSchema v1.0 规范](agent-schema.md) - 了解工作区配置的完整教程 → [8.5 声明式工作区配置与工具联动](../08-workspace-management/declarative-workspace.md)