deerflow2/.planning/codebase/ARCHITECTURE.md

142 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 架构分析
**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*