feat: 为全部 39 个 Rust 源文件添加系统性中文注释
为整个项目添加了详尽的中文文档注释,覆盖所有模块: 入口与架构: - main.rs — 架构图、数据流、4 个关键设计决策 - cli.rs — 所有 CLI 子命令中文化 - Cargo.toml — 每个依赖的作用说明 - channel/mod.rs — 渠道标识设计意图 核心守护进程与消息队列: - daemon.rs — 三消费者架构图、审批流 - queue/* — 公平轮转算法、路由调度架构 LLM 层: - types.rs — Role/Message/ToolCall 等每个字段含义 - provider.rs — Provider trait 设计 + SSE 解析 - conversation.rs — 工具循环流程图、摘要机制 - deepseek.rs — API 请求格式 上下文管理: - context/types.rs — ChatSession 消息生命周期 - context/builder.rs — Token 预算管理策略 - context/tools.rs — MemoryStore 双写策略 工具系统: - tools/mod.rs — 两层元工具架构图 - tools/approval.rs — 审批流程 - tools/definitions.rs — 声明式工具三要素 - tools/subprocess.rs — 执行流程 + 缓存策略 数据库与状态: - db/* — 5 张表用途、回退策略 - state.rs — 文件存储回退方案 - scheduler.rs — SKIP LOCKED 防重复 已废弃模块: - ipc.rs — 旧 UDS 协议 - worker.rs — 旧 vs 新架构对比
This commit is contained in:
+35
-4
@@ -8,7 +8,16 @@ use tokio::sync::mpsc;
|
||||
pub type StreamReceiver = mpsc::Receiver<StreamChunk>;
|
||||
pub type StreamSender = mpsc::Sender<StreamChunk>;
|
||||
|
||||
/// LLM 提供商抽象
|
||||
/// ## LLM 提供商抽象(trait)
|
||||
///
|
||||
/// 这是 LLM 层的核心抽象接口,定义了"一个 LLM 提供商需要提供什么能力"。
|
||||
/// 目前唯一的实现是 `DeepSeekProvider`,但通过这个 trait 可以轻松添加
|
||||
/// 其他提供商(如 OpenAI、Claude 等)。
|
||||
///
|
||||
/// ### 关键设计
|
||||
/// * 使用 `async_trait` 宏支持异步 trait 方法
|
||||
/// * 返回 `StreamReceiver`(mpsc::Receiver),调用方可以按 chunk 消费流式结果
|
||||
/// * `Send + Sync` 保证可以在 tokio task 间安全共享
|
||||
#[async_trait]
|
||||
pub trait LlmProvider: Send + Sync {
|
||||
/// 提供商名称
|
||||
@@ -26,14 +35,23 @@ pub trait LlmProvider: Send + Sync {
|
||||
|
||||
pub type BoxedProvider = Arc<dyn LlmProvider>;
|
||||
|
||||
/// 从配置创建恰当的提供商
|
||||
/// ## `create_provider` — 工厂函数:从配置创建恰当的 LLM 提供商
|
||||
///
|
||||
/// 目前只返回 DeepSeek,后续可以在这里根据配置 switch 到不同提供商。
|
||||
pub fn create_provider(_config: &ConversationConfig) -> Result<BoxedProvider, String> {
|
||||
Ok(Arc::new(super::deepseek::DeepSeekProvider::new()?))
|
||||
}
|
||||
|
||||
// ─── 内部:SSE 解析工具 ───
|
||||
|
||||
/// 流式块解析结果
|
||||
/// ## 流式块解析结果(内部枚举)
|
||||
///
|
||||
/// 用于从 SSE 的 JSON delta 中解析出不同种类的块。
|
||||
/// * `Text` — 普通文本 delta
|
||||
/// * `Reasoning` — 思考内容(DeepSeek reasoning_content)
|
||||
/// * `ToolCallDelta` — 工具调用的增量信息(可能需要跨多个 chunk 拼接)
|
||||
/// * `FinishReason` — 结束原因(stop / tool_calls 等)
|
||||
/// * `Usage` — 用量统计(通常在最后一个 chunk 中)
|
||||
#[allow(dead_code)]
|
||||
pub(crate) enum ParsedChunk {
|
||||
Text(String),
|
||||
@@ -48,7 +66,20 @@ pub(crate) enum ParsedChunk {
|
||||
Usage(super::types::Usage),
|
||||
}
|
||||
|
||||
/// 从 JSON body 中解析 DeepSeek/OpenAI 流式 delta
|
||||
/// ## 从 JSON body 中解析 DeepSeek/OpenAI 流式 delta
|
||||
///
|
||||
/// ### 输入
|
||||
/// 一行 SSE 数据,格式为 `data: {json}`。
|
||||
///
|
||||
/// ### 处理逻辑
|
||||
/// 1. 跳过非 `data: ` 前缀的行和 `[DONE]` 行
|
||||
/// 2. 解析 JSON 为 `ChunkResponse`(内嵌多个 `choices`)
|
||||
/// 3. 提取 usage(可能在任意一个 chunk 中)
|
||||
/// 4. 对每个 choice,按优先级提取:
|
||||
/// - tool_calls delta → `ToolCallDelta`
|
||||
/// - reasoning_content → `Reasoning`
|
||||
/// - content → `Text`
|
||||
/// - finish_reason → `FinishReason`
|
||||
pub(crate) fn parse_chat_chunk(line: &str) -> Option<ParsedChunk> {
|
||||
if !line.starts_with("data: ") {
|
||||
return None;
|
||||
|
||||
Reference in New Issue
Block a user