首页
/ LobeHub 开源 Monorepo 架构全景:分层结构、技术栈与新人上手地图

LobeHub 开源 Monorepo 架构全景:分层结构、技术栈与新人上手地图

2026-09-06 13:08:32作者:郜逊炳

本文基于 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.jsonworkspaces 字段与仓库结构可以确认,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/shareapps/workbenche2e,分别对应分享页 SPA、工作台 SPA 与端到端测试。

架构地图文档特别提醒:目录清单是“关键位置精选地图”而非穷举树。packages/src/store/、路由分组等目录会随版本持续增长,新人上手时应对实际目录执行 ls 获取当前全集。

完整技术栈及版本核实

架构文档给出了一张技术栈总表,并声明“精确版本以根 package.json 为准”。对照 package.jsondependencies / devDependencies,可以逐项核实如下(版本取自当前仓库实际声明):

类别 技术 仓库中核实的版本
框架 Next.js + React next: ^16.3.0react: 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.0antd: 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.6i18next: ^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.0drizzle-orm: ^0.45.2
测试 Vitest vitest: 3.2.6

两个值得注意的工程细节:

  1. overrides 锁版本package.json 中对 antddrizzle-ormlexicalpdfjs-dist@types/react 等做了硬性 override,且 pnpm-workspace.yamloverrides 中再次锁死 react / react-dom。这说明该 monorepo 对第三方依赖版本一致性非常敏感,新增依赖时需同步考虑两层 override。
  2. pnpm 工作区清单双轨pnpm-workspace.yaml 声明 packages/**e2eapps/desktop/src/mainapps/serverapps/shareapps/workbench;根 package.jsonworkspaces 字段则额外列出了 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.tsvitest.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.jsondependencies 中以 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.jsonsideEffects 白名单完全对应(该白名单还包含 src/initialize.tsentry.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/componentssrc/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/*(本仓即事实源)

其中 servicesmodules 的权限区分(services 可触达数据库、modules 不可)是从源码目录结构看出的明确约束,意味着模块层只承担编排 / 计算职责,数据访问被强制收敛到服务层,便于审计与测试。数据层自身也可在 packages/database/src 看到 core/server/types/utils/ 等辅助子目录,而 drizzle.config.ts 与根脚本 db:generate / db:migrate 对应 Drizzle 的迁移生成与执行链路;库表文档则维护在 docs/development/database-schema.dbmldb:visualize 脚本基于它生成可视化)。

数据流全链路

架构文档给出的核心数据流为:

React UI → Store Actions → Client Service → TRPC Lambda → Server Services → DB Model → PostgreSQL

结合仓库源码,可以逐环节理解这条链路:

  1. React UIsrc/features/ 下的领域组件(约 3400 文件)响应交互;
  2. Store Actions:组件调用 src/store/ 中 zustand store 暴露的 action;
  3. Client Service:store action 委托给 src/services/ 的客户端服务,屏蔽传输细节;
  4. TRPC Lambda:客户端通过 @trpc/react-query^11.18.0)调用 apps/server/src/routers/lambda/ 中的路由——lambda 命名表明其设计为可部署在 Serverless Lambda 层的请求入口;
  5. Server Services:lambda 路由进一步调用 apps/server/src/services,这是唯一被允许触达数据库的一层;
  6. DB Model → PostgreSQL:services 经由 packages/database/src/modelsrepositories 落到 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-configbusiness-constbusiness-model-bankbusiness-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.jsonscripts,是新人验证本文各层定位的最短路径:

# 启动开发环境(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 使用 dpdmsrc/**/*.tspackages/**/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.jsonpnpm-workspace.yaml 为准;
  • src/business/packages/business/ 是留给私有云仓覆盖的 stub,开源仓内它们即事实源;
  • 目录清单会随版本增长,本文所有“约 90 个包”“约 30 个 store”等数量级描述均为当前仓库快照,定位代码时请以 ls 实际结果为准。
登录后查看全文
热门项目推荐
相关项目推荐