分层设计
RAF 采用四层"洋葱"架构,从内到外逐层封装,确保核心抽象稳定、运行时功能可替换、扩展能力按需加载。
四层架构总览
graph TB
subgraph "第 4 层:扩展层 (Extension Layer)"
WebSearch[rust-agent-websearch]
RAG[rust-agent-rag]
Rhai[rust-agent-rhai]
Workflow[rust-agent-workflow]
Decl[rust-agent-decl]
Wiki[rust-agent-wiki]
Host[rust-agent-host]
end
subgraph "第 3 层:框架运行时层 (Framework Runtime)"
AgentB[AgentBuilder]
CCA[ChatClientAgent]
Builtin[内置工具 14个]
Compress[压缩策略]
Converter[AgentResponseConverter]
CSVStore[SessionStore 实现]
end
subgraph "第 2 层:LLM 客户端层 (Client Layer)"
DeepSeek[DeepSeekChatClient]
OpenAI[OpenAiChatClient]
Transport[SSE Transport / ChatClient]
end
subgraph "第 1 层:核心抽象层 (Core Abstractions)"
IAgent[IAgent trait]
IChatClient[IChatClient trait]
ITool[ITool trait]
ISession[ISession trait]
IContextProvider[IContextProvider trait]
ICompressionStrategy[ICompressionStrategy trait]
ITokenCounter[ITokenCounter trait]
ISessionStore[ISessionStore trait]
Types[核心类型:Types / Message / Error]
end
%% 依赖关系
DeepSeek --> IAgent
OpenAI --> IAgent
AgentB --> IAgent
Builtin --> ITool
Converter --> Types
WebSearch --> IAgent
RAG --> IAgent
Rhai --> ITool
Workflow --> IAgent
第 1 层:核心抽象层 (`rust-agent-core`)
**crate**: `rust-agent-core` **依赖**: `futures-core`, `tokio`, `serde`, `async-trait`
这是框架的基石,定义了所有核心 trait 和类型,**不包含任何具体实现**。
核心 Trait
| Trait | 职责 | |-------|------| | `IAgent` | 智能体接口:`run(messages, session, options) → BoxStream` | | `IChatClient` | LLM 通信接口:`run(messages, options) → BoxStream` | | `ITool` | 工具接口:`execute(arguments) → ToolResult` | | `ISession` | 会话接口:消息历史管理和序列化 | | `IContextProvider` | 上下文扩展点:`on_invoking()` / `on_invoked()` | | `ICompressionStrategy` | 压缩策略:`compress(messages, budget, counter) → messages` | | `ITokenCounter` | Token 计数:`count_tokens(messages)` | | `ISessionStore` | 会话持久化:`save_session()` / `get_session()` |
核心类型
| 类型 | 文件 | 说明 | |------|------|------| | `AgentId` | `types.rs` | 智能体唯一标识符 | | `AgentMetadata` | `types.rs` | 发现用的静态元数据 | | `FinishReason` | `types.rs` | 响应结束原因枚举 | | `ResponseMetadata` | `types.rs` | 每个 Content/Event 的元数据 | | `ToolCall` | `types.rs` | LLM 请求的工具调用 | | `Usage` | `types.rs` | 用量统计(含 KV 缓存) | | `ChatMessage` | `message.rs` | 扩展消息结构 | | `Content` | `message.rs` | 12 变体内容枚举 | | `AgentResponseUpdate` | `message.rs` | SSE 级更新(13 变体) | | `AgentResponseResult` | `message.rs` | 聚合响应结果 | | `AgentResponse` | `message.rs` | 最终响应(非流式) | | `AgentError` | `error.rs` | 统一错误类型(8 变体) | | `ToolResult` | `tool.rs` | 工具执行结果 | | `ToolRegistry` | `tool.rs` | 工具注册表 | | `ModelMetadata` | `model_metadata.rs` | 模型能力边界 | | `AgentRunOptions` | `run_options.rs` | 单次运行覆盖参数 | | `ChatClientRunOptions` | `chat_client.rs` | 聊天客户端运行选项 | | `WorkspaceScope` | `workspace.rs` | 工作区范围定义 | | `ContextResult` | `context_provider.rs` | Provider 注入载体 | | `BoxStream` | `stream.rs` | 流类型别名 |
为什么这一层如此重要?
1. **稳定性保证**:所有上层代码通过 trait 编程,具体实现可随时替换。 2. **可测试性**:可以 mock `IChatClient`,编写不依赖真实 API 的单元测试。 3. **生态兼容**:第三方 crate 只需依赖 `rust-agent-core`,无需引入整个框架。 4. **版本安全**:trait 变更受 Semantic Versioning 约束,接口演化可控。
第 2 层:LLM 客户端层 (`rust-agent-client`)
**crate**: `rust-agent-client` **依赖**: `rust-agent-core`, `reqwest`, `bytes`
实现 `IChatClient` trait,提供具体 LLM API 的 HTTP/SSE 传输能力。
组件
| 组件 | 说明 | |------|------| | `ChatClient` | 通用 HTTP 客户端,处理请求构建和 SSE 流解析 | | `DeepSeekChatClient` | DeepSeek 适配(thinking 模式、缓存追踪) | | `OpenAiChatClient` | OpenAI 适配 | | `ChatClientOptions` | 客户端配置(api_base、api_key、timeout) | | `SseStream` | SSE 事件流解析器 | | `UsageFormat` | 用量统计格式定义 |
设计要点
- **组合而非继承**:`DeepSeekChatClient` 包含一个 `ChatClient`(组合模式),通过 `inner()` 暴露。 - **透明传输**:HTTP 层对上层完全透明,Agent 不知道也不关心底层使用哪个提供商。 - **流式优先**:SSE 解析器将 HTTP 流式响应转换为 `futures_core::Stream`。
第 3 层:框架运行时层 (`rust-agent-framework`)
**crate**: `rust-agent-framework` **依赖**: `rust-agent-core`, `rust-agent-macros`
提供 Agent 运行时实现和开发工具。
组件
| 组件 | 文件 | 说明 | |------|------|------| | `AgentBuilder` | `builder.rs` | 流畅构建器,生成 `Arc<dyn IAgent>` | | `ChatClientAgent` | `agent/` | `IAgent` 核心实现,三阶段生命周期 | | `FunctionInvokingChatClient` | `decorators/` | `IChatClient` 装饰器,透明工具调用循环 | | `PerServiceCallPersistingChatClient` | `decorators/` | 每次 LLM 调用后自动持久化 | | `AgentResponseConverter` | `converter.rs` | 将 SSE 增量转换为结构化内容 | | `InMemoryHistoryProvider` | `context/` | 默认会话历史注入器 | | `WorkspaceContextProvider` | `context/` | 工作区工具和路径管理 | | `AgentSkillsProvider` | `context/` | Agent Skills 加载器 | | `SuperBrainContextProvider` | `super_brain/` | OKF 持久记忆(Super Brain) | | `SlidingWindowStrategy` | `compression/` | 滑动窗口压缩 | | `TokenBudgetStrategy` | `compression/` | Token 预算压缩(含工具结果淘汰) | | `CompressionPipeline` | `compression/` | 压缩策略链式组合 | | `EstimateCounter` | `token/` | 估算 Token 计数器 | | `InMemorySessionStore` | `session/` | 内存会话存储 | | `FileSystemSessionStore` | `session/` | 文件系统会话存储 | | `IsolationScopedSessionStore` | `session/` | 隔离域会话存储 | | 14 个内置工具 | `tools/` | 文件操作和命令执行工具集 |
设计要点
- **构建器模式**:`AgentBuilder` 封装了 `ChatClientAgent` 的复杂构造逻辑(管道组装、默认 Provider 注入)。 - **管道装饰器**:`FunctionInvokingChatClient` 包裹叶子客户端,透明处理工具调用循环——Agent 无需感知。 - **压缩管道**:`CompressionPipeline` 支持多策略链式组合,提供灵活的上下文窗口管理。 - **扩展点集成**:`ContextProvider` 链在 Agent 生命周期中插入自定义逻辑,是框架最重要的扩展机制。
第 4 层:扩展层
可选的独立 crate,按需引用。
| Crate | 说明 | |-------|------| | `rust-agent-macros` | `#[tool]` 过程宏,简化工具定义 | | `rust-agent-websearch` | Web 搜索集成 | | `rust-agent-rag` | 检索增强生成 | | `rust-agent-openapi` | OpenAPI 3.x HTTP 工具 | | `rust-agent-sandbox` | 代码沙箱 / code_interpreter | | `rust-agent-rhai` | Rhai 脚本引擎集成 | | `rust-agent-workflow` | 工作流编排引擎 | | `rust-agent-decl` | 声明式 Agent DSL | | `rust-agent-wiki` | Wiki 知识检索 | | `rust-agent-host` | Agent 宿主运行环境 |
为什么这样分层?
关注点分离
┌─────────────────────────────────────────────┐
│ 扩展层 → 按需加载,不污染核心 │
├─────────────────────────────────────────────┤
│ 框架运行时 → 通用能力,可替换具体实现 │
├─────────────────────────────────────────────┤
│ LLM 客户端 → 传输层,对上层透明 │
├─────────────────────────────────────────────┤
│ 核心抽象 → 稳定接口,Semantic Versioning │
└─────────────────────────────────────────────┘
实际好处
1. **编译速度**:Extension crate 不被默认编译,减少了 compile time。 2. **二进制大小**:不需要的扩展不会链接到最终可执行文件。 3. **依赖解耦**:核心 crate 不依赖任何具体 LLM 提供商库(如 reqwest),仅依赖 `futures-core`、`tokio`、`serde`。 4. **版本管理**:核心抽象按 SemVer 演化,运行时实现可独立迭代。
增加新 LLM 提供商
只需实现第 2 层:
// 1. 实现 IChatClient
struct NewClient { /* ... */ }
#[async_trait]
impl IChatClient for NewClient {
async fn run(&self, messages: &[ChatMessage], options: ChatClientRunOptions) -> Result<BoxStream<'static, Result<AgentResponseUpdate>>> {
// 调用新 API,返回 SSE 流
}
fn model_id(&self) -> &str { "new-model" }
}
// 2. 注册到 AgentBuilder
let agent = AgentBuilder::new("agent")
.chat_client(NewClient::new())
.build()?;
不需要修改任何上层代码。
下一步
理解分层架构后,请继续阅读 **[类型系统](./type-system.md)**,了解框架核心类型的设计和用途。