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