跳转至

Jan 源码拆解

一款本地优先桌面 AI 应用是怎样运转的?

Jan 的表面是一个聊天窗口,内部却是一条跨语言、跨进程、跨存储的流水线:React 负责交互,TypeScript Core 负责抽象,Tauri 把 WebView 接到 Rust,Rust 管理模型进程、远程代理、MCP 服务与本地数据。理解它的关键,不是记住所有组件名,而是掌握三条主线:

  1. 数据主线:Thread / Message / Assistant / Model 如何从 UI 状态变成磁盘数据。
  2. 推理主线:一条用户消息如何选择 Provider、整理上下文、建立流并回写 UI。
  3. 能力主线:工具、MCP、RAG、Web Search 如何被加入模型请求,又如何受到审批与权限控制。

章节地图

flowchart LR
  A[开篇总览] --> B[运行时拓扑]
  B --> C[领域模型与持久化]
  C --> D[Core 与扩展]
  D --> E[本地推理]
  E --> F[聊天请求旅程]
  F --> G[API 代理]
  G --> H[MCP / 工具 / RAG]
  H --> I[Web UI 与状态]
  I --> J[模型生命周期]
  J --> K[安全与运维]
  K --> L[测试与取舍]

先记住的一句话

Jan 把“聊天产品的业务编排”放在 WebView,把“需要系统权限、子进程、密钥和跨平台差异的能力”放在 Rust/Tauri,再用 Core 的类型与 Extension 作为两侧共享的协议层。

这句话会在后面的每一章被源码重新证明。