deerflow2/.planning/codebase/ARCHITECTURE.md

7.7 KiB
Raw Permalink Blame History

架构分析

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
  • 运行时通过单例对象管理(RunManagerStreamBridgecheckpointerstore),由网关生命周期统一初始化(backend/app/gateway/deps.py

结论: 当前架构边界清晰后续规划应优先沿“Gateway 负责协议与路由、Harness 负责运行时与智能体能力、Frontend core 负责数据访问”的既有分层扩展,避免跨层直接调用。

分层设计

前端展示与路由层Next App Router:

  • Purpose: 负责页面路由、布局装配、页面级 Provider 注入
  • Location: frontend/src/app
  • Contains: layout.tsxpage.tsxworkspace/*api/* Route Handler
  • Depends on: frontend/src/componentsfrontend/src/corefrontend/src/server
  • Used by: 浏览器请求与 Next.js 运行时

前端领域能力层Core:

  • Purpose: 负责 API 客户端、流式会话、线程管理、上传、设置与 i18n 逻辑
  • Location: frontend/src/core
  • Contains: core/threads/hooks.tscore/api/api-client.tscore/*/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.pydeps.pyservices.pyrouters/*.py
  • Depends on: deerflow.runtimedeerflow.configdeerflow.agents
  • Used by: 前端、第三方客户端、IM 渠道服务

后端 IM 渠道层App Channels:

  • Purpose: 负责飞书/Slack/Telegram 等外部消息通道接入与消息转发
  • Location: backend/app/channels
  • Contains: service.pymanager.pyfeishu.pyslack.pytelegram.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.streamfrontend/src/core/threads/hooks.ts
  2. LangGraph SDK 客户端调用网关流式接口(frontend/src/core/api/api-client.ts -> /api/langgraph
  3. Gateway 路由进入 thread_runs.pyruns.py,委派 start_runbackend/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_runbackend/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例如 ArtifactsProviderSubtasksProvider
  • 前端服务端状态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_bridgecheckpointerstorerun_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 状态码表达失败,依赖层缺失返回 503backend/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_modesbuild_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