LobeHub 开源 Monorepo 架构全景:分层结构、技术栈与新人上手地图
本文基于 LobeHub(@lobehub/lobehub)仓库内的架构地图文档 .agents/skills/project-overview/SKILL.md 整理并扩展,系统讲解该开源 AI Agent 工作区的 monorepo 目录布局、UI / SPA / 服务端 / 数据层的全链路分层架构、完整技术栈清单,以及开源仓与私有云仓之间的 stub 覆盖协作机制。读完本文,你可以快速在仓库中定位任意一层代码的位置,理解一次请求从 React UI 到 PostgreSQL 的完整数据流,并独立完成本地开发环境的搭建。
项目定位与平台矩阵
LobeHub(前身 LobeChat)是一个开源、现代设计的 AI Agent Workspace,本仓库即其开源根仓库(npm 包名 @lobehub/lobehub,当前版本见 package.json,为 2.2.13)。从根 package.json 的 description 可见,它定位为支持语音合成、多模态与可扩展 Function Call 插件体系的 AI Agent 框架。
从 package.json 的 workspaces 字段与仓库结构可以确认,LobeHub 支持多端形态:
- Web(桌面/移动):根仓库的 Next.js 应用,SPA 以 Vite 构建为静态壳,再嵌入 Next.js 路由体系(
src/app/spa/目录负责托管); - 桌面端(Electron):独立工作区
apps/desktop,另有apps/desktop/src/main作为独立 pnpm workspace; - 移动端(React Native):单独仓库维护,已独立发布,不在本 monorepo 内——这解释了为什么 Web 端仍有
src/spa/entry.mobile.tsx入口而移动端代码不在本仓; - 附加工作区:
apps/share、apps/workbench与e2e,分别对应分享页 SPA、工作台 SPA 与端到端测试。
架构地图文档特别提醒:目录清单是“关键位置精选地图”而非穷举树。
packages/、src/store/、路由分组等目录会随版本持续增长,新人上手时应对实际目录执行ls获取当前全集。
完整技术栈及版本核实
架构文档给出了一张技术栈总表,并声明“精确版本以根 package.json 为准”。对照 package.json 的 dependencies / devDependencies,可以逐项核实如下(版本取自当前仓库实际声明):
| 类别 | 技术 | 仓库中核实的版本 |
|---|---|---|
| 框架 | Next.js + React | next: ^16.3.0、react: 19.2.7 |
| 路由 | Next.js 内嵌 SPA + React Router | react-router: ^8.3.0 |
| 语言 | TypeScript | typescript: 6.0.3 |
| UI 组件 | @lobehub/ui、antd |
@lobehub/ui: ^5.38.0、antd: 6.3.5(并在 overrides 中锁死) |
| CSS-in-JS | antd-style | antd-style: 4.1.0 |
| 图标 | lucide-react、@ant-design/icons |
lucide-react: ^1.31.0、@ant-design/icons: ^6.3.4 |
| 国际化 | react-i18next | react-i18next: ^16.6.6、i18next: ^25.10.10 |
| 状态管理 | zustand | zustand: 5.0.4 |
| URL 参数 | nuqs | nuqs: ^2.9.5 |
| 数据获取 | SWR | swr: ^2.5.0 |
| React Hooks | ahooks | ahooks: ^3.9.7 |
| 日期时间 | dayjs | dayjs: ^1.11.21 |
| 工具库 | es-toolkit | es-toolkit: ^1.50.0 |
| API | TRPC(类型安全) | @trpc/client / @trpc/next / @trpc/react-query / @trpc/server 均为 ^11.18.0 |
| 数据库 | Neon PostgreSQL + Drizzle ORM | @neondatabase/serverless: ^1.1.0、drizzle-orm: ^0.45.2 |
| 测试 | Vitest | vitest: 3.2.6 |
两个值得注意的工程细节:
overrides锁版本:package.json 中对antd、drizzle-orm、lexical、pdfjs-dist、@types/react等做了硬性 override,且 pnpm-workspace.yaml 的overrides中再次锁死react/react-dom。这说明该 monorepo 对第三方依赖版本一致性非常敏感,新增依赖时需同步考虑两层 override。pnpm工作区清单双轨:pnpm-workspace.yaml 声明packages/**、e2e、apps/desktop/src/main、apps/server、apps/share、apps/workbench;根package.json的workspaces字段则额外列出了packages/business/*(业务 stub 子包)。两者的并集才是完整工作区。
Monorepo 目录布局
LobeHub 采用扁平布局:apps/、packages/、src/ 全部位于仓库根目录,没有 git submodule。根目录下的关键文件包括 drizzle.config.ts(Drizzle Kit 配置)、vite.config.ts(SPA 构建入口)、Dockerfile(自托管构建)、next.config.ts(Next.js 配置)。
(仓库根目录)
├── apps/
│ ├── cli/ # LobeHub CLI(独立 workspace)
│ ├── desktop/ # Electron 桌面应用
│ ├── server/ # 服务端(`@/server/*` 别名)
│ │ └── src/
│ │ ├── router-hono/ # Hono 端点路由与独立运行时
│ │ └── ... # featureFlags、globalConfig、modules、routers、services、utils、workflows
│ ├── share/ # 分享页 SPA
│ └── workbench/ # 工作台 SPA
├── docs/ # changelog、development、self-hosting、usage
├── locales/ # en-US、zh-CN 等语言包
├── packages/ # ~90 个 @lobechat/* 工作区包,`ls` 获取全集
└── src/ # Web 应用主体
apps/:三端应用层
apps/server/:服务端逻辑集中地。实际目录(经ls核实)包含featureFlags/、globalConfig/、modules/、router-hono/、routers/、runtimeConfig/、services/、utils/、workflows/。其中routers/下恰好是架构文档所述的async/、lambda/、mobile/、tools/四组 tRPC 路由;router-hono/则基于 Hono 框架提供独立端点运行时(根依赖hono: ^4.13.1可佐证)。apps/desktop/:Electron 桌面端,含独立的vite.main.config.ts/vite.preload.config.ts/vite.renderer.config.ts三套构建配置,说明 main / preload / renderer 三层各自独立打包。apps/cli/:LobeHub 命令行工具,拥有自己的tsdown.config.ts与vitest.config.mts,并附带man/手册目录。
packages/:约 90 个工作区包
当前 packages/ 下实际有约 90 个包(超出架构文档“~80”的估计,印证了“持续增长,以 ls 为准”的告诫)。核心包及其职责:
| 包 | 职责 |
|---|---|
| agent-runtime | Agent 运行时核心 |
| agent-signal | Agent Signal 管线 |
| agent-tracing | 追踪 / 快照 |
| context-engine | 上下文引擎 |
| database | 数据层,源码位于 src/{models,schemas,repositories} |
| model-bank | 模型定义与 Provider 卡片 |
| model-runtime | 模型运行时,src/{core,providers} |
| locales | i18n 事实源 |
builtin-tool-*(约 35 个) |
每个工具一个包:calculator、web-browsing、claude-code、memory、task 等 |
| builtin-tools | 中央注册表,组合上述 builtin-tool-* |
| business | 开源 stub(config、const、model-bank、model-runtime 等),由云仓覆盖 |
| prompts | 提示词资产(约 200+ 文件) |
| types / utils | 共享类型与工具 |
根 package.json 的 dependencies 中以 workspace:* 形式声明了全部这些内部包(如 "@lobechat/agent-runtime": "workspace:*"),是核实包清单最权威的位置。
src/:Web 应用主体
经核实,src/ 的分层与架构文档一致,且部分目录比文档描述更全:
src/app/(Next.js App Router 层):包含(backend)/(api、f、market、middleware、oidc、trpc、webapi)、spa/(SPA HTML 模板服务)、spa-auth/(认证 HTML 壳,SSR)、spa-share/与spa-workbench/(后两者承载独立工作区构建的静态产物);src/routes/:SPA 页面分段,刻意保持“薄”——只做页面组装,业务委托给features/。实际包含(main)/、(mobile)/、(desktop)/、(popup)/、auth/、onboarding/分组,以及较新出现的acceptance/、verify-im/;src/spa/:SPA 入口与路由配置,四个入口entry.{web,mobile,desktop,popup}.tsx均存在,且与 package.json 的sideEffects白名单完全对应(该白名单还包含src/initialize.ts与entry.auth.tsx);src/features/:领域业务组件(约 3400 个文件,是代码量最大的目录);src/store/:约 30 个 zustand store;src/business/:开源 stub(client / server 两侧),云仓提供真实实现——实测该目录下现有client/、server/两个子目录;- 其余为
components/、hooks/、layout/(全局 Provider)、libs/(第三方集成:analytics、oidc 等)、services/(客户端服务)、types/、utils/。
分层架构地图
将上述目录抽象为职责层,即得到架构文档给出的完整地图(各行位置均已逐一在仓库中核实存在):
| 层 | 位置 |
|---|---|
| UI 组件 | src/components、src/features |
| SPA 页面 | src/routes/ |
| React Router | src/spa/router/ |
| 全局 Provider | src/layout |
| Zustand Store | src/store |
| 客户端服务 | src/services/ |
| REST API | src/app/(backend)/webapi |
| tRPC 路由 | apps/server/src/routers({async|lambda|mobile|tools} 四组) |
| 服务端服务 | apps/server/src/services(可访问 DB) |
| 服务端模块 | apps/server/src/modules(禁止访问 DB) |
| Feature Flag | apps/server/src/featureFlags |
| 全局配置 | apps/server/src/globalConfig |
| DB Schema | packages/database/src/schemas |
| DB Model | packages/database/src/models |
| DB Repository | packages/database/src/repositories |
| 第三方集成 | src/libs(analytics、oidc 等) |
| 内置工具 | packages/builtin-tool-*、packages/builtin-tools |
| 开源 stub | src/business/*、packages/business/*(本仓即事实源) |
其中 services 与 modules 的权限区分(services 可触达数据库、modules 不可)是从源码目录结构看出的明确约束,意味着模块层只承担编排 / 计算职责,数据访问被强制收敛到服务层,便于审计与测试。数据层自身也可在 packages/database/src 看到 core/、server/、types/、utils/ 等辅助子目录,而 drizzle.config.ts 与根脚本 db:generate / db:migrate 对应 Drizzle 的迁移生成与执行链路;库表文档则维护在 docs/development/database-schema.dbml(db:visualize 脚本基于它生成可视化)。
数据流全链路
架构文档给出的核心数据流为:
React UI → Store Actions → Client Service → TRPC Lambda → Server Services → DB Model → PostgreSQL
结合仓库源码,可以逐环节理解这条链路:
- React UI:
src/features/下的领域组件(约 3400 文件)响应交互; - Store Actions:组件调用
src/store/中 zustand store 暴露的 action; - Client Service:store action 委托给
src/services/的客户端服务,屏蔽传输细节; - TRPC Lambda:客户端通过
@trpc/react-query(^11.18.0)调用apps/server/src/routers/lambda/中的路由——lambda命名表明其设计为可部署在 Serverless Lambda 层的请求入口; - Server Services:lambda 路由进一步调用
apps/server/src/services,这是唯一被允许触达数据库的一层; - DB Model → PostgreSQL:services 经由
packages/database/src/models与repositories落到 Drizzle ORM 定义的 Schema(packages/database/src/schemas),最终由 Neon PostgreSQL(@neondatabase/serverless)持久化。
与之并行的还有 routers/async/(异步任务型 tRPC)、routers/mobile/(移动端专用)与 routers/tools/(工具相关)三组路由,以及 router-hono/ 提供的 Hono 独立端点运行时——从源码结构看,Hono 路由体系承担了部分不走 tRPC 的轻量 HTTP 端点。
开源仓与云仓的协作:stub 覆盖机制
这是理解本仓库“为什么有些实现看起来是空壳”的关键。架构文档说明:本开源仓被一个私有云(SaaS)仓以 git submodule 形式挂载在 lobehub/ 路径下消费。云仓提供:
src/business/{client,server}与packages/business/*的真实实现,覆盖本仓的 stub(本仓中src/business/实测含client/、server/子目录,packages/business/对应business-config、business-const、business-model-bank、business-model-runtime等子包,见根package.json中@lobechat/business-*的 workspace 依赖);- 云独有路由(如
(cloud)/、embed/)、云独有 store(如subscription/)、云独有 tRPC 路由(billing、budget、风控等),以及src/app/(backend)/cron/下的 Vercel cron 路由; - 文件解析顺序:云仓中
@/store/x的解析优先级为——云仓src/store/x> 开源仓packages/store/src/x> 开源仓src/store/x,即云仓覆盖优先(Cloud override wins)。
对仅在本开源仓工作的开发者,结论很直接:忽略云层,src/business/ 与 packages/business/ 中的 stub 就是事实源,不要去寻找“缺失”的实现。
本地开发:验证这份地图最快的方式
以下命令均取自根 package.json 的 scripts,是新人验证本文各层定位的最短路径:
# 启动开发环境(devStartupSequence 会编排整个启动序列)
pnpm dev
pnpm dev:next # 直接跑 Next dev(端口 3010)
pnpm dev:spa # Vite 开发 SPA 壳
pnpm dev:desktop # Electron 桌面端开发
# 自托管依赖服务:PostgreSQL + Redis + RustFS + SearXNG
pnpm dev:docker
pnpm dev:docker:reset # 清数据重来并重跑 db:migrate
# 数据库迁移与可视化
pnpm db:migrate
pnpm db:visualize # 基于 docs/development/database-schema.dbml 生成图
# 质量门禁
pnpm lint # eslint + stylelint + type-check + 循环依赖检查
pnpm type-check # tsgo --noEmit
pnpm test-app # Vitest 全量单测
其中 lint:circular 使用 dpdm 对 src/**/*.ts 与 packages/**/src/**/*.ts 分别做循环依赖检查——这解释了为什么前文分层表中 services / modules / stores 的职责边界如此清晰:架构约束是由 CI 层面的工具链强制保证的。
小结
- LobeHub 是一个扁平布局的 pnpm monorepo:
apps/(cli、desktop、server、share、workbench)+packages/(约 90 个@lobechat/*包)+ 根src/(Web 主体),三者平级位于仓库根目录,无 git submodule; - 数据流严格分层:
UI → zustand store → src/services → tRPC lambda 路由 → apps/server/src/services → packages/database(models/repositories)→ PostgreSQL,且 services 可触 DB 而 modules 不可,由lint:circular等工具链兜底; - 技术栈以 Next.js 16 + React 19 + TypeScript 为骨架,TRPC 11 + Drizzle + Neon 为服务端骨架,精确版本以根 package.json 与 pnpm-workspace.yaml 为准;
src/business/与packages/business/是留给私有云仓覆盖的 stub,开源仓内它们即事实源;- 目录清单会随版本增长,本文所有“约 90 个包”“约 30 个 store”等数量级描述均为当前仓库快照,定位代码时请以
ls实际结果为准。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00