Jan 源码拆解¶
一款本地优先桌面 AI 应用是怎样运转的?¶
Jan 的表面是一个聊天窗口,内部却是一条跨语言、跨进程、跨存储的流水线:React 负责交互,TypeScript Core 负责抽象,Tauri 把 WebView 接到 Rust,Rust 管理模型进程、远程代理、MCP 服务与本地数据。理解它的关键,不是记住所有组件名,而是掌握三条主线:
- 数据主线:Thread / Message / Assistant / Model 如何从 UI 状态变成磁盘数据。
- 推理主线:一条用户消息如何选择 Provider、整理上下文、建立流并回写 UI。
- 能力主线:工具、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 作为两侧共享的协议层。
这句话会在后面的每一章被源码重新证明。