Files
zclaw_openfang/wiki/chat.md
iven 36a1c87d87
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
docs(wiki): 重构为模块化知识库 — 按模块组织而非按文档类型
问题: 旧 wiki 按文档类型组织(architecture/data-flows/file-map),
修复 Butler Router 需要读 4 个文件才能拼凑全貌。
且 SaaS Relay 主路径 vs 本地降级的优先级描述不准确。

重构为模块化结构,每个模块页自包含:
- 设计思想: 为什么这样设计
- 代码逻辑: 数据流 + 关键代码
- 关联模块: 依赖关系

新增模块页:
- routing.md: 客户端路由 (明确 SaaS Relay 是主路径,不是本地模式)
- chat.md: 聊天系统 (3种实现 + Token Pool 中转机制)
- butler.md: 管家模式 (路由/冷启动/痛点/双模式UI)
- memory.md: 记忆管道 (提取→FTS5→检索→注入)
- saas.md: SaaS平台 (认证/Token池/计费/Admin)
- middleware.md: 中间件链 (14层 + 优先级)
- hands-skills.md: Hands(9) + Skills(75)
- pipeline.md: Pipeline DSL

删除旧文件: architecture.md, data-flows.md, module-status.md, file-map.md
(内容已分布到对应模块页中)

添加 .gitignore 排除 Obsidian 工作区状态文件
2026-04-11 00:36:26 +08:00

3.3 KiB
Raw Blame History

title, updated, status, tags
title updated status tags
聊天系统 2026-04-11 active
module
chat
stream

聊天系统

index 导航。关联模块: routing saas butler

设计思想

核心问题: 3 种运行环境需要 3 种 ChatStream 实现。

环境 实现 传输 为什么
桌面端 (Tauri) KernelClient Tauri Event 内置 Kernel但 baseUrl 可指向 SaaS relay
桌面端 (Tauri + SaaS) KernelClient + relay Tauri Event → SaaS 主路径: Token Pool 中转
浏览器端 SaaSRelayGatewayClient HTTP SSE 无 Tauri 运行时
外部 Gateway GatewayClient WebSocket 独立进程部署

统一接口: 3 种实现共享同一套回调:

{ onDelta, onThinkingDelta, onTool, onHand, onComplete, onError }

代码逻辑

发送消息流

入口: streamStore.sendMessage(content)streamStore.ts

sendMessage(content)
  → effectiveSessionKey = conversationStore.sessionKey || uuid()
  → effectiveAgentId = resolveGatewayAgentId(currentAgent)
  → client.chatStream(content, callbacks, { sessionKey, agentId, chatMode })
    → KernelClient: Tauri invoke('kernel_chat', ...)
      → Kernel → loop_runner → LLM Driver
        → 如果 baseUrl 指向 SaaS relay → 请求发往 Token Pool → LLM
        → 如果 baseUrl 指向 LLM 直连 → 请求直接发往 LLM
      → Tauri Event emit('chat-response-delta', ...)
        → onDelta(text) → streamStore 追加 delta
        → onTool(tool) → toolStore 更新
        → onHand(hand) → handStore 更新
        → onComplete() → conversationStore 持久化
    → SaaSRelay: HTTP POST /api/v1/relay/chat/completions → SSE
    → GatewayClient: WebSocket send → onmessage
  → 5 分钟超时守护 (kernel-chat.ts:76) 防止流挂起

Store 拆分 (4 Store)

原来 908 行的 ChatStore 已拆分为:

Store 文件 职责
streamStore store/chat/streamStore.ts 流式消息编排、发送、取消
conversationStore store/chat/conversationStore.ts 会话管理、当前模型
messageStore store/chat/messageStore.ts 消息持久化
chatStore store/chat/chatStore.ts 聊天通用状态

模型切换

UI 选择模型 → conversationStore.currentModel = newModel
  → 下次 sendMessage 时connectionStore 读取 currentModel
  → SaaS 模式: relay 白名单验证 → 可用则切换
  → 本地模式: 直接使用用户配置的模型

关联模块

  • routing — 路由决定使用哪种 client
  • saas — Token Pool 提供模型和 API Key
  • butler — ButlerRouter 中间件增强 system prompt
  • middleware — 消息经过 14 层中间件处理
  • memory — 对话内容可能触发记忆提取

关键文件

文件 职责
desktop/src/store/chat/streamStore.ts 流式消息编排
desktop/src/store/chat/conversationStore.ts 会话管理
desktop/src/lib/kernel-chat.ts Kernel ChatStream (Tauri)
desktop/src/lib/saas-relay-client.ts SaaS Relay ChatStream
desktop/src/lib/gateway-client.ts Gateway ChatStream (WS)
desktop/src/components/ChatArea.tsx 聊天区域 UI
crates/zclaw-runtime/src/loop_runner.rs Rust 主聊天循环