ByteDance 开源 Agent 系统 — 后端 Python 核心技术架构深度分析
DeerFlow Harness 是基于 LangGraph/LangChain 构建的企业级 Agent 运行时框架,采用分层架构与中间件管线模式。
从用户请求到响应的完整数据流,展示系统各组件如何协作。
FastAPI 路由或嵌入式 DeerFlowClient 接收用户消息,创建 Thread(如需)和 Run 记录
从 config.yaml 加载配置,解析环境变量引用($VAR),检测 mtime 热重载,同步子配置单例
工厂函数组装 Lead Agent:创建模型、聚合工具、装配中间件链、注入 Checkpointer 和 Tracing
请求依次穿过 14 层中间件:ThreadData 初始化 → Sandbox 获取 → Guardrail 审查 → Summarization 压缩 → LoopDetection 检测 → Clarification 拦截
通过 resolve_class() 动态加载模型类(ChatOpenAI/ChatAnthropic 等),处理 Thinking 模式切换,附加 Tracing 回调
LLM 生成 tool_calls 后,工具在沙箱内执行(bash/file ops)、通过 MCP 协议调用远程服务、或派发子代理并行处理子任务
双模式流式输出:values 模式(完整状态快照)和 messages 模式(增量消息),SSE 协议对齐,累积 Token 统计
LangGraph Checkpointer 持久化对话状态,SQLAlchemy ORM 存储线程元数据、运行记录、反馈数据
基于 Pydantic 的类型安全配置,支持 YAML 加载、环境变量解析、热重载和运行时覆盖。
$ENV_VAR 引用,支持默认值 $VAR:-default配置驱动的动态模型实例化,支持多供应商、Thinking 模式切换和 Tracing 注入。
langchain_openai:ChatOpenAI)多源工具聚合,支持配置工具、内置工具、MCP 工具和 ACP 工具的统一加载与去重。
make_sync_tool_wrapper() 使用 ThreadPoolExecutor + contextvars.copy_context() 在独立线程中运行 asyncio.run(),确保 LangGraph 同步工具接口兼容异步实现。_ensure_sync_invocable_tool() 自动为仅有 coroutine 的工具补充 func 同步入口。
14 层固定顺序中间件管线,基于 RuntimeFeatures 声明式装配,支持 @Next/@Prev 锚点插入自定义中间件。
| # | 中间件 | 钩子 | 核心功能 |
|---|---|---|---|
| 0 | ThreadDataMiddleware | before_agent | 初始化线程工作区路径 |
| 1 | UploadsMiddleware | before_agent | 管理上传目录 |
| 2 | SandboxMiddleware | before/after_agent | 懒加载/释放沙箱实例 |
| 3 | DanglingToolCallMiddleware | wrap_model_call | 修补缺失 ToolMessage |
| 4 | GuardrailMiddleware | wrap_tool_call | 工具调用前安全审查 |
| 5 | ToolErrorHandlingMiddleware | wrap_tool_call | 工具异常转 ToolMessage |
| 6 | SummarizationMiddleware | wrap_model_call | 长对话压缩 + 记忆刷新 |
| 7 | TodoMiddleware | wrap_model_call | 计划模式任务追踪 |
| 8 | TitleMiddleware | after_agent | 自动生成线程标题 |
| 9 | MemoryMiddleware | after_agent | 异步记忆更新 |
| 10 | ViewImageMiddleware | wrap_model_call | 图片内容注入 |
| 11 | SubagentLimitMiddleware | wrap_tool_call | 并发子代理截断 |
| 12 | LoopDetectionMiddleware | wrap_model_call | 循环检测与中断 |
| 13 | ClarificationMiddleware | wrap_model_call | 澄清请求拦截(始终最后) |
每个字段可为 bool(使用默认实现)或直接传入自定义中间件实例,实现灵活替换。
自定义中间件可通过装饰器声明相对位置,_insert_extra() 迭代插入并保证 ClarificationMiddleware 始终在末尾。支持冲突检测和循环依赖预防。
隔离的代码执行环境,支持本地和远程后端,虚拟路径映射和安全防护。
Model Context Protocol 外部工具集成,支持 stdio/sse/http 三种传输、OAuth 认证和持久会话池。
模块级缓存 + extensions_config.json mtime 变更检测。缓存过期时 reset_mcp_tools_cache() 关闭会话池并重新初始化。工具加载流程:ExtensionsConfig.from_file() → build_servers_config() → 注入 OAuth 头 → MultiServerMCPClient → get_tools() → _make_session_pool_tool() 包装 → make_sync_tool_wrapper() 补充同步入口 → 缓存。
并行任务委派,独立 LangGraph Agent 执行,支持协作取消和超时控制。
try_set_terminal() 原子转换到终态(COMPLETED/FAILED/CANCELLED/TIMED_OUT),防止重复状态转换。包含 token_usage_records 按 caller 分桶记录 Token 消耗。
可插拔技能架构,支持安装、验证、LLM 安全扫描和技能注入。
Fail-closed 安全语义,工具调用前安全审查,异常时默认拒绝。
SQLAlchemy 异步 ORM,支持 memory/sqlite/postgres 三种后端,自动建表。
LangSmith / Langfuse 双追踪后端,RunJournal 事件捕获和 Token 归因。
安全文件写入,防符号链接、路径遍历和文件名碰撞。
系统的"反射脊梁",贯穿全系统的配置驱动类加载机制。
被几乎所有需要动态加载的模块依赖:models/(模型类)、tools/(工具类)、sandbox/(提供者类)、mcp/(拦截器)、guardrails/(provider)。_build_missing_dependency_hint() 为已知包生成安装提示。
DeerFlow Harness 后端架构中反复出现的设计模式总结。
resolve_variable() / resolve_class() 贯穿全系统,实现配置驱动的类加载。所有可插拔组件(模型、工具、沙箱、护栏)均通过字符串路径动态实例化。
14 层固定顺序中间件 + @Next/@Prev 锚点插入。ClarificationMiddleware 始终末尾保证拦截优先级。RuntimeFeatures 声明式控制装配。
AppConfig / SandboxProvider / MCPSessionPool / MCP 工具缓存均使用模块级单例 + mtime 检测热重载,平衡性能与配置实时性。
push/pop_current_app_config() 支持运行时配置隔离,嵌套作用域内可安全覆盖全局配置而不影响其他请求。
GuardrailProvider(Protocol) / SandboxProvider(ABC) / Sandbox(ABC) 等抽象允许插件化实现,符合依赖倒置原则。
子代理通过 threading.Event 实现协作取消,在 astream() 迭代边界检测取消信号,避免强制中断导致状态不一致。
子代理使用持久化守护线程事件循环,避免与父循环冲突。_get_isolated_subagent_loop() 确保长生命周期异步操作安全执行。
Guardrail / 安全扫描在异常时默认拒绝而非放行。安全关键路径不依赖"默认允许"策略,确保系统在异常情况下仍保持安全。