yaa 智能体采用 Rust 实现,支持 WASM(WebAssembly)和 WASI 运行时环境,可作为服务器模式或命令行交互模式运行,也可编译为 WASM 被 HTML 调用。
- 会话数据管理 (SessionData)
- 工具调用框架 (ToolRegistry)
- 提示词生成器 (PromptGenerator)
- 大语言模型 API 集成 (OpenAIClient)
- 智能体核心逻辑 (process_session)
- 工具实现:
- 再度思考工具 (RethinkTool)
- 完成会话工具 (FinishTool)
- 提问工具 (QuestionTool) - 当需要更多信息时向用户提问
%% yaa 实现代码结构图
classDiagram
class SessionData {
+id: String
+title: Option<String>
+start_time: String
+character: String
+status: String
+messages: Vec<Message>
+config: Config
+new(character: String) -> Self
+add_message(role: Role, content: String)
}
class ToolRegistry {
+tools: HashMap<String, Tool>
+new() -> Self
+execute(name: String, params: Value) -> Result<Value>
}
class PromptGenerator {
+generate(session_data: &SessionData, tools: &[ToolInfo]) -> String
+generate_with_current_time(session_data: &SessionData, tools: &[ToolInfo]) -> String
}
class OpenAIClient {
+api_key: String
+base_url: Option<String>
+new(api_key: String, base_url: Option<String>) -> Self
+chat_completion(messages: Vec<Message>) -> Result<String>
}
class Agent {
+process_session(session_data: SessionData) -> Result<AgentResponseData>
}
class RethinkTool {
+name() -> &str
+execute() -> Result<ToolOutput>
}
class FinishTool {
+name() -> &str
+execute() -> Result<ToolOutput>
}
SessionData --> Message : 包含
SessionData --> Config : 包含
Agent --> SessionData : 处理
Agent --> ToolRegistry : 使用
Agent --> PromptGenerator : 使用
Agent --> OpenAIClient : 使用
ToolRegistry --> RethinkTool : 注册
ToolRegistry --> FinishTool : 注册
ToolRegistry --> ToolInput : 处理
ToolRegistry --> ToolOutput : 生成
- 接收会话数据 (SessionData)
- 检查并补全会话配置
- 生成提示词 (PromptGenerator)
- 调用大语言模型 API (OpenAIClient)
- 解析工具调用 (extract_tool_call)
- 检查工具授权:
- 检查会话配置中的 auto_approve 设置
- 检查用户消息中的授权标记
- 执行工具 (ToolRegistry)
- 生成响应数据 (AgentResponseData/StreamResponseData)
%% yaa 智能体工作流程图
sequenceDiagram
客户端->>+智能体: 发送 SessionData
智能体->>+提示词生成器: 生成提示词
提示词生成器-->>-智能体: 返回提示词
智能体->>+大语言模型API: 发送提示词
大语言模型API-->>-智能体: 返回响应
智能体->>+工具解析器: 解析工具调用
工具解析器-->>-智能体: 返回工具名和参数
智能体->>+授权检查: 验证工具调用权限
授权检查-->>-智能体: 返回授权结果
智能体->>+工具注册表: 执行工具
工具注册表-->>-智能体: 返回工具结果
智能体-->>-客户端: 返回 AgentResponseData
- 功能:将当前的对话历史再次输入到模型中,让模型继续思考更多的可能性
- 参数:
- 理由 (string, required): 调用这个工具的理由
- 默认配置:自动授权 (auto_approve: true)
- 功能:当无法通过其它方法获取更多信息时向用户提问
- 参数:
- question (string, required): 想要询问用户的问题
- guess_one/guess_two/guess_three (string, optional): 用户可能的回答建议
- 默认配置:自动授权 (auto_approve: true)
- 功能:当任务完成时调用此工具结束会话
- 参数:
- 理由 (string, required): 任务完成的总结理由
- 默认配置:自动授权 (auto_approve: true)
pub struct SessionData {
pub id: String,
pub title: Option<String>,
pub start_time: String,
pub character: String,
pub status: String,
pub messages: Vec<Message>,
pub config: Config,
}
pub struct Message {
pub role: Role, // user|assistant|system|tool|error
pub content: String,
}
pub struct Config {
pub yaa: YaaConfig,
pub llm_api: LlmApiConfig,
pub tool: ToolConfig,
}pub struct AgentResponseData {
pub id: String,
pub title: Option<String>,
pub start_time: String,
pub finish_reason: String,
pub messages: Vec<Message>,
pub usage: Usage,
}
pub struct StreamResponseData {
pub id: String,
pub status: String,
pub message: Message,
}- 消息角色处理问题:
- 当消息角色为 Tool 时调用 API,API 返回的数据无法格式化为 JSON
- 其他非 User 和 Assistant 的消息角色也可能导致类似问题
-
WASM 支持 (web/模块)
- WASM 绑定 (bindings.rs)
- Web Worker 支持 (worker.rs)
-
命令行模式 (cli/模块)
- 命令行入口 (mod.rs)
- 子命令实现 (commands.rs)