7.7 KiB
架构分析
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 会话流式对话(主链路)
- 前端聊天页通过
useThreadStream发起runs.stream(frontend/src/core/threads/hooks.ts) - LangGraph SDK 客户端调用网关流式接口(
frontend/src/core/api/api-client.ts->/api/langgraph) - Gateway 路由进入
thread_runs.py或runs.py,委派start_run(backend/app/gateway/routers/thread_runs.py,backend/app/gateway/services.py) start_run创建 RunRecord 并启动后台任务,运行make_lead_agent构建的 Agent 图(backend/packages/harness/deerflow/agents/lead_agent/agent.py)- 运行时事件通过
MemoryStreamBridge发布,sse_consumer序列化为 SSE 推送到前端(backend/packages/harness/deerflow/runtime/stream_bridge/memory.py) - 前端
useStream消费增量状态,刷新消息、标题、子任务与线程列表缓存(frontend/src/core/threads/hooks.ts)
Flow 2: 线程生命周期与状态持久化
- 前端线程列表调用
threads.search,线程详情页读取/更新状态(frontend/src/core/threads/hooks.ts) - Gateway
threads.py通过store+checkpointer读写线程元数据与 checkpoint - run 完成后,服务层将 checkpoint 中的标题回写线程 store(
_sync_thread_title_after_run,backend/app/gateway/services.py)
Flow 3: 前端 API 代理转发(非 LangGraph SDK 路径)
- 前端 Route Handler 接收
/api/memory/*请求(frontend/src/app/api/memory/[...path]/route.ts) - 直接代理至
NEXT_PUBLIC_BACKEND_BASE_URL对应网关地址 - 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