142 lines
7.7 KiB
Markdown
142 lines
7.7 KiB
Markdown
# 架构分析
|
||
|
||
**Analysis Date:** 2026-04-07
|
||
|
||
## 模式概览
|
||
|
||
**Overall:** 分层单体 + 前后端分离 + 运行时内核(Harness)与应用壳层(App)拆分
|
||
|
||
**Key Characteristics:**
|
||
- 后端采用 `Harness(Core)` 与 `Gateway/Channels(App)` 分层,依赖方向固定为 `app.* -> deerflow.*`,反向依赖禁止(见 `backend/docs/HARNESS_APP_SPLIT.md`)
|
||
- 前端采用 Next.js App Router,页面层(`src/app`)与领域能力层(`src/core`)分离,UI 组件集中在 `src/components`
|
||
- 运行时通过单例对象管理(`RunManager`、`StreamBridge`、`checkpointer`、`store`),由网关生命周期统一初始化(`backend/app/gateway/deps.py`)
|
||
|
||
**结论:**
|
||
当前架构边界清晰,后续规划应优先沿“Gateway 负责协议与路由、Harness 负责运行时与智能体能力、Frontend core 负责数据访问”的既有分层扩展,避免跨层直接调用。
|
||
|
||
## 分层设计
|
||
|
||
**前端展示与路由层(Next App Router):**
|
||
- Purpose: 负责页面路由、布局装配、页面级 Provider 注入
|
||
- Location: `frontend/src/app`
|
||
- Contains: `layout.tsx`、`page.tsx`、`workspace/*`、`api/*` Route Handler
|
||
- Depends on: `frontend/src/components`、`frontend/src/core`、`frontend/src/server`
|
||
- Used by: 浏览器请求与 Next.js 运行时
|
||
|
||
**前端领域能力层(Core):**
|
||
- Purpose: 负责 API 客户端、流式会话、线程管理、上传、设置与 i18n 逻辑
|
||
- Location: `frontend/src/core`
|
||
- Contains: `core/threads/hooks.ts`、`core/api/api-client.ts`、`core/*/api.ts|hooks.ts`
|
||
- Depends on: `@langchain/langgraph-sdk`、`@tanstack/react-query`、后端 API
|
||
- Used by: `frontend/src/components/workspace/*` 与页面组件
|
||
|
||
**后端 API 网关层(App Gateway):**
|
||
- Purpose: 负责 HTTP 协议适配、路由聚合、SSE 输出、线程与运行生命周期接口
|
||
- Location: `backend/app/gateway`
|
||
- Contains: `app.py`、`deps.py`、`services.py`、`routers/*.py`
|
||
- Depends on: `deerflow.runtime`、`deerflow.config`、`deerflow.agents`
|
||
- Used by: 前端、第三方客户端、IM 渠道服务
|
||
|
||
**后端 IM 渠道层(App Channels):**
|
||
- Purpose: 负责飞书/Slack/Telegram 等外部消息通道接入与消息转发
|
||
- Location: `backend/app/channels`
|
||
- Contains: `service.py`、`manager.py`、`feishu.py`、`slack.py`、`telegram.py`
|
||
- Depends on: `deerflow` 核心能力与 Gateway 配置
|
||
- Used by: 网关生命周期在启动阶段触发(`backend/app/gateway/app.py`)
|
||
|
||
**后端运行时内核层(Harness):**
|
||
- Purpose: 负责 Agent 构建、Middleware 编排、工具系统、运行时状态与流桥接
|
||
- Location: `backend/packages/harness/deerflow`
|
||
- Contains: `agents/`、`runtime/`、`tools/`、`sandbox/`、`skills/`、`models/`、`config/`
|
||
- Depends on: LangChain/LangGraph 与基础设施依赖
|
||
- Used by: `backend/app/gateway/*` 与潜在 SDK/CLI 调用
|
||
|
||
## 关键数据/控制流
|
||
|
||
**Flow 1: Web 会话流式对话(主链路)**
|
||
1. 前端聊天页通过 `useThreadStream` 发起 `runs.stream`(`frontend/src/core/threads/hooks.ts`)
|
||
2. LangGraph SDK 客户端调用网关流式接口(`frontend/src/core/api/api-client.ts` -> `/api/langgraph`)
|
||
3. Gateway 路由进入 `thread_runs.py` 或 `runs.py`,委派 `start_run`(`backend/app/gateway/routers/thread_runs.py`, `backend/app/gateway/services.py`)
|
||
4. `start_run` 创建 RunRecord 并启动后台任务,运行 `make_lead_agent` 构建的 Agent 图(`backend/packages/harness/deerflow/agents/lead_agent/agent.py`)
|
||
5. 运行时事件通过 `MemoryStreamBridge` 发布,`sse_consumer` 序列化为 SSE 推送到前端(`backend/packages/harness/deerflow/runtime/stream_bridge/memory.py`)
|
||
6. 前端 `useStream` 消费增量状态,刷新消息、标题、子任务与线程列表缓存(`frontend/src/core/threads/hooks.ts`)
|
||
|
||
**Flow 2: 线程生命周期与状态持久化**
|
||
1. 前端线程列表调用 `threads.search`,线程详情页读取/更新状态(`frontend/src/core/threads/hooks.ts`)
|
||
2. Gateway `threads.py` 通过 `store` + `checkpointer` 读写线程元数据与 checkpoint
|
||
3. run 完成后,服务层将 checkpoint 中的标题回写线程 store(`_sync_thread_title_after_run`,`backend/app/gateway/services.py`)
|
||
|
||
**Flow 3: 前端 API 代理转发(非 LangGraph SDK 路径)**
|
||
1. 前端 Route Handler 接收 `/api/memory/*` 请求(`frontend/src/app/api/memory/[...path]/route.ts`)
|
||
2. 直接代理至 `NEXT_PUBLIC_BACKEND_BASE_URL` 对应网关地址
|
||
3. Gateway 处理并返回,前端透明透传响应头与响应体
|
||
|
||
**State Management:**
|
||
- 前端 UI 状态:React State + Context(例如 `ArtifactsProvider`、`SubtasksProvider`)
|
||
- 前端服务端状态:React Query(线程列表、突变后失效重取)
|
||
- 后端运行状态:`RunManager` 内存注册表(运行中任务)
|
||
- 后端持久状态:LangGraph checkpointer + store(线程状态、checkpoint、元数据)
|
||
|
||
## 关键抽象
|
||
|
||
**Run 生命周期抽象(RunManager + RunRecord):**
|
||
- Purpose: 统一 run 的创建、冲突策略、取消、状态迁移
|
||
- Examples: `backend/packages/harness/deerflow/runtime/runs/manager.py`
|
||
- Pattern: 内存注册表 + asyncio 锁保护并发一致性
|
||
|
||
**流桥接抽象(StreamBridge):**
|
||
- Purpose: 将后台执行事件转换为可订阅的事件流
|
||
- Examples: `backend/packages/harness/deerflow/runtime/stream_bridge/base.py`, `backend/packages/harness/deerflow/runtime/stream_bridge/memory.py`
|
||
- Pattern: 每 run 一条队列 + END/HEARTBEAT 哨兵事件
|
||
|
||
**Agent 组装抽象(make_lead_agent / create_deerflow_agent):**
|
||
- Purpose: 基于配置与上下文动态装配模型、工具与 middleware 链
|
||
- Examples: `backend/packages/harness/deerflow/agents/lead_agent/agent.py`, `backend/packages/harness/deerflow/agents/factory.py`
|
||
- Pattern: “配置驱动 + 有序中间件管线 + 条件启用能力”
|
||
|
||
**前端会话编排抽象(useThreadStream):**
|
||
- Purpose: 屏蔽流式协议细节,提供统一发送消息/停止运行/状态更新能力
|
||
- Examples: `frontend/src/core/threads/hooks.ts`
|
||
- Pattern: Hook 封装 SDK + optimistic UI + query cache 同步
|
||
|
||
## 关键入口
|
||
|
||
**Gateway 入口:**
|
||
- Location: `backend/app/gateway/app.py`
|
||
- Triggers: `uvicorn app.gateway.app:app`(见 `backend/Makefile`)
|
||
- Responsibilities: 应用启动、router 装配、生命周期内 runtime 单例初始化
|
||
|
||
**Gateway 运行时依赖入口:**
|
||
- Location: `backend/app/gateway/deps.py`
|
||
- Triggers: FastAPI lifespan 调用 `langgraph_runtime`
|
||
- Responsibilities: 创建/销毁 `stream_bridge`、`checkpointer`、`store`、`run_manager`
|
||
|
||
**前端根入口:**
|
||
- Location: `frontend/src/app/layout.tsx`
|
||
- Triggers: Next.js App Router 根布局渲染
|
||
- Responsibilities: 注入主题与 i18n Provider
|
||
|
||
**前端工作台入口:**
|
||
- Location: `frontend/src/app/workspace/layout.tsx`, `frontend/src/app/workspace/chats/[thread_id]/page.tsx`
|
||
- Triggers: 访问 `/workspace/*`
|
||
- Responsibilities: QueryClient 注入、侧边栏控制、聊天线程交互
|
||
|
||
## 错误处理策略
|
||
|
||
**Strategy:** 分层兜底 + 协议一致化
|
||
|
||
**Patterns:**
|
||
- 路由层用 HTTP 状态码表达失败,依赖层缺失返回 503(`backend/app/gateway/deps.py`)
|
||
- 流式执行失败统一在服务层记录并通过 SSE/最终状态输出(`backend/app/gateway/services.py`)
|
||
- 前端流式错误统一 toast 呈现并清理 optimistic 状态(`frontend/src/core/threads/hooks.ts`)
|
||
|
||
## 跨切面关注点
|
||
|
||
**Logging:** 后端在网关入口统一配置 logging,模块内按 `logger` 输出(`backend/app/gateway/app.py`)
|
||
**Validation:** 请求模型使用 Pydantic;运行配置做字段规整(如 `normalize_stream_modes`、`build_run_config`)
|
||
**Authentication:** 前端通过 `better-auth` 路由处理认证(`frontend/src/app/api/auth/[...all]/route.ts`, `frontend/src/server/better-auth/*`);网关核心 API 当前以部署侧网关/Nginx 控制为主
|
||
|
||
---
|
||
|
||
*Architecture analysis: 2026-04-07*
|