字节 DeerFlow 2.0 深度解析:从研究框架到 Super Agent 基础设施的技术跃迁
2026年6月,字节跳动将 DeerFlow 彻底重写发布 2.0 版本,登顶 GitHub Trending 榜首。这不是一次功能迭代,而是一次从"深度研究框架"到"Super Agent 运行时基础设施"的彻底蜕变。本文将从架构设计、核心特性、代码实战、性能优化等多个维度,对 DeerFlow 2.0 进行全方位深度解析。
一、引言:AI Agent 的困境与突破
1.1 当前 AI Agent 的核心痛点
2025 年到 2026 年,AI Agent 赛道经历了从概念验证到工程落地的关键转折。然而,大多数 Agent 框架仍然停留在"带工具的聊天机器人"阶段,存在以下核心痛点:
上下文窗口管理混乱。长链路任务(如"调研某个技术方向并输出 50 页报告")往往在任务执行到一半时就打爆了上下文窗口,导致 Agent "遗忘"之前的子任务结果。
缺乏真正的执行环境。绝大多数 Agent 只能通过工具调用间接操作外部系统,本身没有独立的文件系统、进程隔离和持久化存储,无法完成需要"真正动手"的复杂任务。
Sub-Agent 编排能力薄弱。少数支持多 Agent 的框架也往往采用线性执行方式,无法动态拆解任务并并行调度多个子 Agent。
记忆系统缺失或简陋。会话结束后状态全部丢失,每次都要重新介绍背景、上传文件、解释偏好,用户体验极差。
1.2 DeerFlow 2.0 的破局思路
DeerFlow 2.0 的核心设计哲学是:给 Agent 一台真正的电脑。
这不是一句营销口号,而是架构层面的根本变革。每个 DeerFlow 任务运行在独立的 Docker 容器中,拥有完整的文件系统、Bash 执行能力、文件读写权限,以及跨 Session 的持久化记忆。Agent 不再是"隔着 API 遥控"的工具调用者,而是拥有真实运行环境的数字劳动者。
二、DeerFlow 是什么?从 v1 到 v2 的彻底重构
2.1 v1:深度研究框架
DeerFlow v1(2025 年发布)的定位是 Deep Research Framework——用户输入一个研究问题,框架自动完成搜索、信息整理、报告生成的全过程。
v1 的核心流程是线性的:
用户输入 → 搜索规划 → 并行搜索 → 内容提取 → 报告生成 → 输出
这个流程对于单轮研究任务表现良好,但社区的实际用法远超出了设计者的想象。开发者们开始用 v1 搭建数据流水线、自动生成演示文稿、做内容生产自动化、快速起 Dashboard……这些用法暴露了 v1 架构的根本性局限:
- 无法并行执行多个独立子任务
- 上下文窗口在长任务中迅速膨胀
- 没有持久化文件系统,Agent 无法"留下工作成果"
- 不支持跨 Session 的记忆积累
2.2 v2:彻底重写,从零构建
DeerFlow 2.0 与 v1 没有共用任何代码,是一次彻头彻尾的重写。官方将 v2 的定位调整为:
Super Agent Harness(超级 Agent 调度框架)
"Harness" 这个词值得深入理解。在软件工程中,Harness 指的是一个将多个组件"挂载"在一起、提供统一运行环境的框架。比如单元测试中的 Test Harness,或者 F1 赛车中的底盘 Harness。
DeerFlow 2.0 的 Harness 将以下核心能力标准化并挂载在一起:
| 能力层 | 作用 | 技术实现 |
|---|---|---|
| Sub-agents | 任务拆解与并行执行 | 动态 Agent 编排引擎 |
| Memory | 跨 Session 持久记忆 | 本地向量存储 + 文件系统 |
| Sandbox | 隔离的执行环境 | Docker 容器 |
| Skills | 能力扩展与复用 | Markdown 定义的技能文件 |
三、核心架构设计理念:Harness 模式详解
3.1 为什么需要 Harness?
要理解 DeerFlow 2.0 的架构价值,需要先理解当前 AI Agent 开发的碎片化现状。
一个典型的 Agent 开发流程是这样的:
- 选择大模型(GPT-4、Claude、DeepSeek…)
- 设计 Prompt 和系统指令
- 实现工具调用(Function Calling / Tool Use)
- 处理上下文管理(摘要、压缩、截断)
- 实现记忆系统(向量数据库、文件存储…)
- 处理多 Agent 协作(如果需要)
- 部署执行环境(本地?云端?隔离?)
这七个步骤,每一个都需要大量的工程投入,且不同项目之间的实现往往不可复用。DeerFlow 2.0 的 Harness 模式,正是要把步骤 47 标准化,让开发者专注于步骤 13(即真正的业务逻辑)。
3.2 Harness 的核心抽象
DeerFlow 2.0 定义了以下几个核心抽象:
Thread(线程):一次持续的交互会话,类似 ChatGPT 的一个对话,但功能远更强。Thread 内可以上传文件、挂载 Skills、启动 Sub-agents。
Skill:封装了特定领域知识和工作流程的 Markdown 文件。Skill 是 DeerFlow 的"能力插件",按需加载,避免上下文膨胀。
Sub-Agent:由 Lead Agent 动态拉起的次级 Agent,拥有独立的上下文窗口,专注于特定子任务。
Sandbox:每个 Thread 绑定的 Docker 容器,提供隔离的文件系统和执行环境。
这四个抽象层次清晰、职责明确,共同构成了 DeerFlow 2.0 的 Harness 基础设施。
四、五大核心特性深度剖析
4.1 Skills:Agent 能力的"乐高积木"
4.1.1 Skill 的本质
Skill 是 DeerFlow 能完成"几乎任何事情"的核心秘密。一个 Skill 本质上是一个 Markdown 文件,其中定义了:
- 该领域的最佳实践和工作流程
- 参考资源(URL、文档链接)
- 输出格式要求
- 注意事项和常见陷阱
内置 Skill 包括:深度研究、报告生成、演示文稿制作、网页生成、图像/视频生成等。
4.1.2 按需渐进加载机制
Skills 架构中最精妙的设计是 按需渐进加载。
传统做法是把所有可用工具和能力一次性塞进系统 Prompt,导致 Token 消耗巨大且上下文被无用信息污染。DeerFlow 的做法是:
- Lead Agent 接收到用户任务
- Lead Agent 分析任务类型,判断需要哪些 Skills
- 仅在需要时将对应 Skill 的 Markdown 内容加载进上下文
- Sub-Agent 执行时,同样按需加载各自需要的 Skills
这种机制有效控制了 Token 消耗,也让上下文始终保持"专注"。
4.1.3 Claude Code 深度集成
DeerFlow 2.0 提供了 claude-to-deerflow Skill,允许开发者直接在 Claude Code 终端中与运行中的 DeerFlow 实例交互:
# 安装 Claude Code 集成 Skill
npx skills add https://github.com/bytedance/deer-flow --skill claude-to-deerflow
安装后,你可以在 Claude Code 终端里:
- 发送研究任务到 DeerFlow
- 查看任务执行状态
- 管理 Threads
- 获取执行结果
全程无需离开终端,实现了"编码 Agent"与"研究 Agent"的无缝协作。
4.1.4 自定义 Skill 开发
DeerFlow 的 Skill 系统设计得非常开放。任何开发者都可以编写自己的 Skill 文件。一个典型的自定义 Skill 结构如下:
# Skill: Go 微服务代码生成
## 触发条件
当用户要求生成 Go 微服务项目、RESTful API 骨架时触发。
## 工作流程
1. 确认项目需求(数据库、缓存、认证方式)
2. 生成项目目录结构
3. 生成核心代码文件
4. 生成 Dockerfile 和 docker-compose.yml
5. 生成 README 和 API 文档
## 输出要求
- 代码符合 Go 官方风格规范
- 包含完整的错误处理
- 包含单元测试骨架
- 包含 Makefile
## 参考资源
- Go 标准库文档:https://pkg.go.dev/
- Uber Go Style Guide:https://github.com/uber-go/guide
将这个文件放入 DeerFlow 的 Skills 目录,它就会在相关任务中被自动加载。
4.2 Sub-Agents:并行执行复杂任务
4.2.1 传统 Agent 的执行瓶颈
传统 Agent 处理复杂任务的方式是线性执行:
任务开始
→ 步骤1:搜索资料(等待…)
→ 步骤2:分析资料(等待…)
→ 步骤3:撰写报告(等待…)
→ 步骤4:生成图表(等待…)
任务结束
这种方式的低效是显而易见的。步骤 1 搜索的资料之间往往没有依赖关系,完全可以并行;步骤 4 生成图表也可以在步骤 3 撰写报告的同时进行。
4.2.2 DeerFlow 的动态任务拆解
DeerFlow 2.0 的 Lead Agent 在接收到复杂任务后,会先进行任务拆解(Task Decomposition):
用户任务:"调研 Rust 在 WebAssembly 领域的应用,输出一份 30 页的深度报告,
包含代码示例、性能对比、和至少 5 个生产级案例"
Lead Agent 拆解:
├── Sub-Agent 1:Rust+WASM 基础原理调研
├── Sub-Agent 2:主流框架对比(wasm-bindgen、wasm-pack、Percy、Yew…)
├── Sub-Agent 3:性能基准测试设计与执行
├── Sub-Agent 4:生产案例收集(Discord、Figma、AutoCAD Web…)
├── Sub-Agent 5:代码示例编写
└── Sub-Agent 6:报告整合与排版
其中,Sub-Agent 1/2/3/4 可以并行执行,大幅提升任务完成速度。
4.2.3 Sub-Agent 上下文隔离
每个 Sub-Agent 拥有独立的上下文窗口,这是 DeerFlow 能处理超长任务的关键。
传统多 Agent 框架往往共享同一个上下文,导致:
- 子任务 A 的中间结果污染了子任务 B 的推理
- 上下文窗口迅速膨胀
- 无法有效并行(需要顺序写上下文)
DeerFlow 的做法是:每个 Sub-Agent 只看到自己的上下文(包含 Lead Agent 分配的任务描述、自己的工具调用历史、自己的执行结果)。完成时,将精简后的结果返回给 Lead Agent,由 Lead Agent 决定如何整合。
4.2.4 代码级理解:Sub-Agent 调度伪代码
以下是 DeerFlow Sub-Agent 调度逻辑的简化伪代码,帮助理解其工作原理:
class LeadAgent:
def execute_complex_task(self, user_task: str):
# 1. 任务拆解
subtasks = self.decompose_task(user_task)
# 2. 构建依赖图(哪些 subtask 可以并行)
dependency_graph = self.build_dependency_graph(subtasks)
# 3. 按依赖关系分批执行
results = {}
for batch in dependency_graph.topological_batches():
if batch.can_parallel():
# 并行执行当前批次
parallel_results = self.exec_parallel([
SubAgent(task=t, context=self.build_context(t))
for t in batch.tasks
])
results.update(parallel_results)
else:
# 串行执行(有依赖关系)
for t in batch.tasks:
results[t.id] = self.exec_sequential(
SubAgent(task=t, context=self.build_context(t, results))
)
# 4. 汇总结果,生成最终输出
return self.synthesize_results(results)
4.3 Sandbox 文件系统:Agent 有了自己的"电脑"
4.3.1 为什么需要 Sandbox?
这是 DeerFlow 和"带工具的聊天机器人"之间最根本的差别。
ChatGPT Plugins、Claude Tool Use 等机制,本质上都是让模型"申请"执行某个操作,然后由框架代为执行并返回结果。这种方式的局限在于:
- Agent 无法在两次工具调用之间保持"工作进度"
- Agent 无法直接操作文件系统(写中间结果、读之前生成的文件)
- Agent 无法执行需要持续运行的进程(如启动一个 Web 服务器)
DeerFlow 的解决方案是:给每个任务一个真实的运行环境。
4.3.2 Docker Sandbox 架构
每个 Thread 绑定一个独立的 Docker 容器,内部文件系统结构如下:
/mnt/user-data/
├── uploads/ # 用户上传的文件(通过 UI 或 API 上传)
├── workspace/ # Agent 的工作目录(读/写/执行)
└── outputs/ # 最终交付物(报告、代码、图像…)
Agent 在 Sandbox 内可以:
- 读写编辑文件(通过 Bash 工具或直接的文件工具)
- 执行任意 Bash 命令(编译代码、运行测试、启停服务)
- 查看和处理图像
- 安装软件包(
pip install、npm install…)
4.3.3 隔离与审计
多用户、多 Session 场景下,Sandbox 的隔离性至关重要。DeerFlow 的隔离机制包括:
- 容器级隔离:每个 Thread 一个容器,通过 Docker 的命名空间隔离
- 资源限制:可以配置 CPU、内存、磁盘配额,防止单个任务耗尽资源
- 操作审计:Sandbox 内的所有文件操作和执行日志可以被记录和审计
- 网络隔离(可选):可以配置 Sandbox 无法访问外部网络,适用于处理敏感数据的场景
4.3.4 实战:Agent 在 Sandbox 内完整开发一个 Web 应用
以下是一个 DeerFlow Agent 在 Sandbox 内完成的具体任务示例:
用户提示词:
"帮我开发一个简约的 Go + React 待办事项应用,包含用户注册登录、JWT 认证、CRUD 接口,并写一份 README。"
Agent 执行流程(在 Sandbox 内):
# Step 1: 初始化项目结构
mkdir -p todo-app/{backend,frontend,scripts}
# Step 2: 初始化 Go 后端
cd todo-app/backend
go mod init github.com/user/todo-app
go get github.com/gin-gonic/gin
go get github.com/golang-jwt/jwt/v5
go get gorm.io/gorm
go get gorm.io/driver/sqlite
# Step 3: 编写核心代码(Agent 生成并写入文件)
cat > main.go << 'EOF'
package main
import (
"github.com/gin-gonic/gin"
"github.com/yourname/todo-app/backend/handlers"
"github.com/yourname/todo-app/backend/middleware"
)
func main() {
r := gin.Default()
// 公开路由
r.POST("/api/register", handlers.Register)
r.POST("/api/login", handlers.Login)
// 需要认证的路由
auth := r.Group("/api")
auth.Use(middleware.JWTAuth())
{
auth.GET("/todos", handlers.GetTodos)
auth.POST("/todos", handlers.CreateTodo)
auth.PUT("/todos/:id", handlers.UpdateTodo)
auth.DELETE("/todos/:id", handlers.DeleteTodo)
}
r.Run(":8080")
}
EOF
# Step 4: 初始化 React 前端
cd ../frontend
npx create-react-app . --template typescript
npm install axios react-router-dom
# Step 5: 编写前端代码...
# Step 6: 编写 README.md
# Step 7: 本地测试(启动后端和前端)
# Step 8: 将完整项目打包到 /mnt/user-data/outputs/
这个流程如果通过传统"工具调用"方式实现,将极其繁琐且容易失败。而在 DeerFlow Sandbox 中,Agent 就像一名真实的开发者,可以连续操作、中途调试、迭代改进。
4.4 Context Engineering:长任务不"忘事"
4.4.1 上下文窗口的三重挑战
DeerFlow 面向的是"从几分钟到几小时"量级的任务,这类任务对上下文管理提出了三重挑战:
挑战一:上下文膨胀。一个需要 10 个 Sub-Agent 并行执行的任务,如果每个 Sub-Agent 返回 2000 Token 的结果,Lead Agent 的上下文就会膨胀 20000 Token。再加上历史消息、Skill 内容、系统指令……128k 的上下文窗口也会迅速打满。
挑战二:信息遗忘。即使上下文窗口足够大,LLM 对"中间部分"信息的关注度也会下降(Lost in the Middle 现象)。
挑战三:成本失控。上下文越长,每次推理的成本越高,响应速度也越慢。
4.4.2 DeerFlow 的两层上下文管理
DeerFlow 2.0 在上下文管理上做了两层设计:
第一层:Sub-Agent 上下文隔离
如前所述,每个 Sub-Agent 只看到自己的上下文。这不仅避免了相互干扰,也大幅降低了单个上下文的长度。
Lead Agent 在整合 Sub-Agent 结果时,看到的不是完整的 Sub-Agent 上下文,而是 Sub-Agent 返回的精简摘要。
第二层:主动摘要与文件系统卸载
在单个 Session 内,DeerFlow 会主动进行以下操作:
- 已完成子任务的摘要化:Sub-Agent 完成任务后,Lead Agent 生成一份精简摘要存入上下文,完整结果转存到 Sandbox 文件系统
- 中间结果文件化:长任务产生的大量中间数据(搜索结果、代码片段、分析结论)直接写入 Sandbox 文件,需要时再读取
- 上下文压缩:当上下文接近窗口上限时,主动压缩早期的非关键信息
4.4.3 代码实战:理解上下文压缩策略
以下是一个模拟 DeerFlow 上下文压缩逻辑的 Python 示例:
class ContextManager:
def __init__(self, max_context_tokens: int = 128000):
self.max_tokens = max_context_tokens
self.messages = []
self.compressed_summaries = []
def estimate_tokens(self, text: str) -> int:
"""估算 Token 数量(简化版,实际应使用 tokenizer)"""
return len(text) // 4 # 中文约 1.5-2 字/token,英文约 4 char/token
def should_compress(self) -> bool:
total = sum(self.estimate_tokens(m["content"]) for m in self.messages)
return total > self.max_tokens * 0.8 # 达到 80% 阈值时触发压缩
def compress_context(self):
"""压缩上下文:保留最近 N 条消息,压缩早期消息"""
# 1. 保留系统指令和最近 10 条消息
system_msg = [m for m in self.messages if m["role"] == "system"]
recent_msgs = self.messages[-10:]
# 2. 压缩中间的消息
middle_msgs = [
m for m in self.messages
if m not in system_msg and m not in recent_msgs
]
if not middle_msgs:
return
# 3. 调用 LLM 生成压缩摘要
summary = self.llm.summarize(
messages=middle_msgs,
instruction="请压缩以下对话历史,保留所有关键决策、重要结论和待办事项"
)
# 4. 用压缩摘要替换原始消息
self.compressed_summaries.append({
"summary": summary,
"covered_range": (middle_msgs[0].get("id"), middle_msgs[-1].get("id"))
})
self.messages = system_msg + [
{"role": "system", "content": f"[历史摘要]: {summary}"}
] + recent_msgs
4.5 长期记忆:越用越了解你
4.5.1 记忆系统的设计目标
大多数 Agent 的记忆系统实际上只是一个"会话历史存储",并不能真正做到"了解用户"。DeerFlow 2.0 的长期记忆设计目标包括:
- 跨 Session 持久化:关闭再打开,Agent 依然记得你
- 结构化存储:不仅存储"说了什么",还存储"用户的偏好、知识背景、常用工作流"
- 隐私可控:所有记忆保存在本地,用户随时可以查看、编辑、删除
- 渐进式积累:随着使用次数增加,记忆越来越丰富,Agent 越来越"懂你"
4.5.2 记忆的存储结构
DeerFlow 的长期记忆存储在本地文件系统中,典型结构如下:
~/.deerflow/
└── memory/
├── user_profile.md # 用户画像(偏好、背景、风格)
├── knowledge_base/ # 用户提供的知识库文件
├── workflows/ # 用户常用的工作流模式
└── session_summaries/ # 历史 Session 的摘要
├── 2026-07-01.md
├── 2026-07-02.md
└── ...
user_profile.md 是记忆系统的核心,由 Agent 在每次 Session 结束时自动更新。一个典型的 user_profile.md 内容如下:
# 用户画像
## 基本信息
- 姓名:XXX
- 职业:后端工程师,主攻 Go 和分布式系统
- 技术水平:高级(能够阅读和修改框架源码)
## 技术偏好
- 编程语言:Go > Rust > Python
- 数据库:PostgreSQL(生产)、SQLite(原型)
- Web 框架:Gin(Go)、Axum(Rust)
- 部署方式:Docker + Kubernetes
- 代码风格:简洁优先,避免过度抽象
## 写作风格
- 喜欢技术博客有完整代码示例
- 偏好客观分析,不喜欢过度营销化的语言
- 关注性能数据和基准测试
## 常用工作流
- 新技术调研:先跑官方 Demo → 读源码核心模块 → 写技术博客
- 代码 Review:关注并发安全、错误处理、性能瓶颈
- 技术选型:先做基准测试,再决策
## 历史 Session 要点
- 2026-07-01:调研了 Rust+WASM 在前端的应用,结论是适合计算密集型场景
- 2026-07-02:帮助搭建了 Go 微服务脚手架,使用了 Gin + GORM + Redis
4.5.3 记忆的更新机制
记忆更新是一个渐进式、增量式的过程。每次 Session 结束时,Lead Agent 会:
- 读取现有的
user_profile.md - 分析本次 Session 中了解到的新信息
- 更新相关字段(如发现用户新偏好、新工作流…)
- 将更新后的内容写回文件
这种机制确保了记忆的连续性,也避免了"每次都从头重建记忆"的低效做法。
五、实战:从零搭建 DeerFlow 2.0 环境
5.1 环境准备
DeerFlow 2.0 支持多种部署方式,推荐使用 Docker 方式(最省心、环境最干净)。
系统要求:
- Docker 20.10+
- 4GB+ RAM(Sandbox 容器需要内存)
- 10GB+ 磁盘空间
5.2 快速安装
# 1. 克隆仓库
git clone https://github.com/bytedance/deer-flow.git
cd deer-flow
# 2. 生成配置文件
make config
# 这会在项目根目录生成 CONFIG.YAML,需要编辑它配置模型
5.3 配置模型(CONFIG.YAML)
DeerFlow 不绑定特定模型,只要实现了 OpenAI 兼容 API 即可接入。编辑 CONFIG.YAML:
models:
- name: deepseek-v3
display_name: DeepSeek V3
use: langchain_openai:ChatOpenAI
model: deepseek-v3
api_key: ${DEEPSEEK_API_KEY}
api_base: https://api.deepseek.com/v1
max_tokens: 8192
temperature: 0.7
- name: doubao-seed-2.0-code
display_name: Doubao Seed 2.0 Code
use: langchain_openai:ChatOpenAI
model: Doubao-Seed-2.0-Code
api_key: ${DOUBAO_API_KEY}
api_base: https://ark.cn-beijing.volces.com/api/v3
max_tokens: 16384
temperature: 0.7
- name: kimi-2.5
display_name: Kimi 2.5
use: langchain_openai:ChatOpenAI
model: moonshot-v1-128k
api_key: ${MOONSHOT_API_KEY}
api_base: https://api.moonshot.cn/v1
max_tokens: 128000
temperature: 0.7
模型选择建议:
| 任务类型 | 推荐模型 | 原因 |
|---|---|---|
| 代码生成/审查 | Doubao Seed 2.0 Code | 字节自研,代码能力强 |
| 深度研究/复杂拆解 | DeepSeek v3.2 | 推理能力强,长上下文 |
| 文档分析/多模态 | Kimi 2.5 | 128k 上下文,支持多模态 |
5.4 Docker 方式启动
# 首次运行:拉取 Sandbox 镜像
make docker-init
# 启动服务
make docker-start
# 访问 http://localhost:2026 即可使用 Web UI
5.5 本地开发模式(不用 Docker)
如果不想用 Docker,也可以直接在本机运行:
# 安装依赖
pip install -e ".[dev]"
# 启动开发服务器
make dev
# 另开一个终端,启动前端(可选)
cd apps/website
npm install
npm run dev
六、代码实战:Python SDK 深度使用
6.1 安装 Python SDK
DeerFlow 提供了官方的 Python SDK,可以通过 pip 安装:
pip install deerflow-client
6.2 基础用法:对话与流式输出
from deerflow.client import DeerFlowClient
# 初始化客户端(自动读取本地 CONFIG.YAML)
client = DeerFlowClient()
# 普通对话
response = client.chat(
message="帮我分析 Rust 在 WebAssembly 领域的应用前景",
thread_id="my-rust-wasm-thread" # 指定 thread,实现持续对话
)
print(response)
# 流式输出(适合长时间任务)
for event in client.stream("最新的 AI Agent 开源项目趋势"):
if event.type == "messages-tuple":
data = event.data
if data.get("type") == "ai":
# 实时打印 AI 输出
print(data.get("content", ""), end="", flush=True)
elif data.get("type") == "tool_call":
# 打印工具调用信息
print(f"\n[工具调用] {data.get('name')}: {data.get('args')}")
elif data.get("type") == "sub_agent_start":
print(f"\n[Sub-Agent 启动] {data.get('agent_name')}")
6.3 高级用法:文件上传与多模态
# 上传文件到指定 Thread 的 Sandbox
client.upload_files(
thread_id="my-thread",
file_paths=[
"./docs/api-spec.yaml",
"./docs/architecture.png",
"./data/sample.csv"
]
)
# 基于上传的文件提问(多模态)
response = client.chat(
message="基于我上传的 API 规范文件,生成一个 TypeScript 客户端 SDK",
thread_id="my-thread"
)
6.4 高级用法:管理 Skills 和 Models
# 列出当前可用的 Skills
skills = client.list_skills()
for skill in skills:
print(f"Skill: {skill['name']} - {skill['description']}")
# 列出已配置的模型
models = client.list_models()
for model in models:
print(f"Model: {model['display_name']} ({model['name']})")
# 切换当前 Thread 使用的模型
client.switch_model(
thread_id="my-thread",
model_name="deepseek-v3"
)
6.5 集成示例:将 DeerFlow 嵌入已有 Python 应用
以下是一个将 DeerFlow 嵌入 Flask Web 应用的完整示例:
from flask import Flask, request, jsonify, Response
from deerflow.client import DeerFlowClient
import json
app = Flask(__name__)
client = DeerFlowClient()
@app.route("/api/chat", methods=["POST"])
def chat():
"""非流式对话接口"""
data = request.json
message = data.get("message")
thread_id = data.get("thread_id", "default")
if not message:
return jsonify({"error": "message is required"}), 400
response = client.chat(message=message, thread_id=thread_id)
return jsonify({"response": response})
@app.route("/api/chat/stream", methods=["POST"])
def chat_stream():
"""流式对话接口(Server-Sent Events)"""
data = request.json
message = data.get("message")
thread_id = data.get("thread_id", "default")
def generate():
for event in client.stream(message, thread_id=thread_id):
yield f"data: {json.dumps(event.data, ensure_ascii=False)}\n\n"
yield "data: [DONE]\n\n"
return Response(generate(), mimetype="text/event-stream")
@app.route("/api/upload", methods=["POST"])
def upload():
"""文件上传接口"""
thread_id = request.form.get("thread_id", "default")
files = request.files.getlist("files")
saved_paths = []
for f in files:
path = f"./uploads/{thread_id}/{f.filename}"
f.save(path)
saved_paths.append(path)
# 将文件上传到 DeerFlow Sandbox
client.upload_files(thread_id, saved_paths)
return jsonify({"uploaded": len(saved_paths)})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)
七、架构师视角:DeerFlow 2.0 的设计哲学
7.1 "给 Agent 一台电脑"的深远意义
DeerFlow 2.0 最革命性的设计,不是某个具体功能,而是将 Agent 从一个"调用者"变成一个"操作者"。
传统 Agent 架构:
LLM → 决定调用工具 → 框架执行工具 → 结果返回 LLM → ...
在这种架构中,LLM 就像一个"指挥官",它自己不动手,只是不断地"下令"。这种架构的根本局限是:LLM 无法直接感知和操作物理世界(或数字世界)。
DeerFlow 架构:
LLM → 在 Sandbox 内执行 → 直接操作文件系统/进程/网络 → 观察结果 → ...
在这个架构中,LLM 就像一个"坐在电脑前的开发者",它可以:
- 写一个脚本,运行,看结果,再修改
- 创建一个文件,过一会儿再读取它
- 启动一个服务,测试它,然后部署它
这种"操作者"模式,是 AI Agent 从"助手"进化到"同事"的关键一步。
7.2 与 OpenClaw、Claude Code 的对比
2026 年上半年,AI Agent 领域出现了多个有影响力的项目。将 DeerFlow 2.0 与它们对比,有助于理解其独特定位:
| 维度 | DeerFlow 2.0 | OpenClaw | Claude Code |
|---|---|---|---|
| 定位 | Super Agent Harness | 个人 AI 助手框架 | 终端 AI 编程助手 |
| 执行环境 | Docker Sandbox | 本地进程 | 本地终端 |
| 多 Agent | 原生支持(Sub-Agents) | 通过 Session 机制 | 不支持 |
| 记忆系统 | 跨 Session 持久化 | 有(MEMORY.md) | 无(单 Session) |
| 部署方式 | 本地/服务器 | 本地 | 本地终端 |
| 主要用途 | 复杂任务自动化 | 个人效率 | 代码编写 |
核心差异:DeerFlow 2.0 是一个"框架",OpenClaw 是一个"产品",Claude Code 是一个"工具"。三者的目标用户和使用场景有显著差异。
7.3 设计权衡:为什么选择 Docker Sandbox?
DeerFlow 选择 Docker 作为 Sandbox 的实现技术,背后有一系列设计权衡:
为什么不用进程级隔离?
进程级隔离(如 Python 的 subprocess)无法提供足够的文件系统隔离和网络隔离,且难以限制资源使用。
为什么不用 VM?
虚拟机资源开销过大,启动慢,不适合需要快速创建/销毁的 Agent 任务场景。
为什么用 Docker?
- 启动快(秒级)
- 资源开销适中
- 生态成熟,工具链完善
- 支持细粒度资源限制
- 跨平台(Linux、macOS、Windows)
安全性和信任假设:
Docker Sandbox 的安全性建立在"用户信任 DeerFlow 及其调用的模型"的前提下。如果模型被攻击(如通过 Prompt Injection 让 Agent 执行恶意代码),Sandbox 内的隔离仍然有效,但 Sandbox 内的数据可能被泄露。因此,DeerFlow 官方建议仅在本地可信环境(127.0.0.1)部署,不推荐直接暴露到公网。
八、性能优化:Token 管理与上下文压缩
8.1 Token 消耗的来源分析
在 DeerFlow 的长任务中,Token 消耗主要来源于以下几个方面:
| 来源 | 典型消耗 | 优化策略 |
|---|---|---|
| 系统指令 + Skill | 2000-5000 Token | 按需加载、Skill 精简 |
| 对话历史 | 随时间线性增长 | 上下文压缩、摘要化 |
| 工具调用结果 | 每次 500-5000 Token | 结果截断、结构化返回 |
| Sub-Agent 结果汇总 | 每个 Sub-Agent 1000-3000 Token | 摘要返回、关键结果优先 |
8.2 优化策略一:Skill 精简与按需加载
Skill 文件应该遵循"由简入繁"的原则。一个优化良好的 Skill 文件应该:
- 触发条件明确:让 Lead Agent 能快速判断是否需加载此 Skill
- 核心步骤精简:只保留关键工作流程,详细参考信息放到"参考资料"部分
- 分层加载:基础 Skill 可以很小,详细指导可以作为"进阶 Skill"独立存在
8.3 优化策略二:工具调用结果的结构化返回
工具调用的返回结果往往是 Token 消耗的大户。以下是优化前后对比:
优化前(搜索工具返回完整网页内容):
{
"url": "https://example.com/article",
"title": "Example Article",
"content": "(完整 5000 字文章内容)..." // 消耗 ~3000 Token
}
优化后(只返回摘要和关键信息):
{
"url": "https://example.com/article",
"title": "Example Article",
"summary": "本文讨论了...(100 字摘要)",
"key_points": ["点1", "点2", "点3"],
"relevance_score": 0.92
}
Token 消耗从 ~3000 降到 ~200,且信息密度更高。
8.4 优化策略三:Sub-Agent 结果的摘要化返回
Lead Agent 在整合 Sub-Agent 结果时,不应直接将完整结果塞入上下文,而应要求 Sub-Agent 返回结构化摘要:
# Sub-Agent 返回格式示例
{
"status": "completed",
"summary": "调研了 5 个 Rust+WASM 框架,推荐 wasm-bindgen + Yew 组合",
"key_findings": [
"wasm-bindgen 是官方推荐的工具链",
"Yew 提供 React-like 的开发体验",
"Percy 更适合需要 SSR 的场景"
],
"detailed_report_path": "/mnt/user-data/outputs/rust-wasm-report.md",
"code_examples": ["/mnt/user-data/workspace/demo1/", "..."]
}
Lead Agent 读到摘要后,如果需要对某个点深入了解,可以主动读取 Sandbox 内的详细报告文件。
九、安全部署:生产环境最佳实践
9.1 网络安全配置
DeerFlow 默认绑定 127.0.0.1(仅本地访问),这是最安全的配置。如果需要通过网络访问,应采取以下措施:
方案一:Nginx 反向代理 + 身份验证
# /etc/nginx/sites-available/deerflow
server {
listen 443 ssl;
server_name deerflow.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# 身份验证
auth_basic "DeerFlow Access";
auth_basic_user_file /etc/nginx/.htpasswd;
# IP 白名单
allow 10.0.0.0/8;
allow 192.168.1.0/24;
deny all;
location / {
proxy_pass http://127.0.0.1:2026;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
方案二:VPN/内网访问
将 DeerFlow 部署在内网服务器,通过 VPN 访问。这是最推荐的企业部署方式。
9.2 Sandbox 安全加固
# CONFIG.YAML 中的 Sandbox 安全配置
sandbox:
# 内存限制(建议 512MB~2GB)
memory_limit: 1g
# CPU 限制(建议 1~4 核)
cpu_limit: 2
# 磁盘配额(防止 Agent 写满磁盘)
disk_quota: 10g
# 网络策略
network:
# 完全禁用网络(适用于处理敏感数据)
enabled: false
# 或者:仅允许访问特定域名
# allowed_domains:
# - "api.deepseek.com"
# - "github.com"
# 文件系统权限
readonly_paths:
- "/etc/hosts" # 禁止修改系统配置
allowed_write_paths:
- "/mnt/user-data/" # 仅允许写入工作目录
9.3 Prompt Injection 防护
Prompt Injection 是当前 AI Agent 系统面临的最严重威胁之一。攻击者可能通过上传文件、网页内容等渠道,注入恶意指令,让 Agent 执行非预期操作。
DeerFlow 的防护策略包括:
- Sandbox 隔离:即使 Prompt Injection 成功,Agent 也只能在 Sandbox 内操作,无法影响宿主机
- 工具调用审计:所有工具调用都可以记录日志,便于事后审计
- 敏感操作确认:删除文件、发送外部请求等敏感操作可以要求用户确认(配置项)
# CONFIG.YAML 中的安全配置
security:
# 启用工具调用审计日志
audit_log: true
audit_log_path: "/var/log/deerflow/audit.log"
# 敏感操作需要用户确认
confirm_before:
- "file_delete"
- "external_http_request"
- "execute_shell_command"
# 过滤潜在的 Prompt Injection 内容
sanitize_inputs: true
十、多端接入:不止于 Web UI
10.1 Telegram Bot 集成
DeerFlow 2.0 支持通过 Telegram Bot API 接收任务,无需公网 IP(使用 Long-polling 模式):
# 配置 Telegram Bot(在 CONFIG.YAML 中)
telegram:
enabled: true
bot_token: "${TELEGRAM_BOT_TOKEN}"
allowed_users:
- 123456789 # 你的 Telegram User ID
启动后,在 Telegram 中与 Bot 对话:
你: /new # 创建新 Thread
Bot: ✅ 已创建新会话(Thread ID: abc123)
你: 帮我调研一下 Go 语言在 2026 年的最新特性
Bot: 收到!已开始研究,我会通过 Sub-Agent 并行调研多个信息源...
[过程中会实时推送进度更新]
你: /status abc123 # 查看任务状态
Bot: 📊 任务进行中
- Sub-Agent 1(Go 官方博客调研):✅ 完成
- Sub-Agent 2(GitHub Trending 分析):🔄 进行中
- Sub-Agent 3(社区讨论整理):⏳ 等待中
你: /models # 切换模型
Bot: 当前可用模型:
1. DeepSeek V3
2. Doubao Seed 2.0 Code
3. Kimi 2.5
请回复数字选择
10.2 Slack / 飞书集成
企业用户可以通过 Slack Socket Mode 或飞书 WebSocket 将 DeerFlow 接入团队工作流:
# Slack 配置
slack:
enabled: true
mode: "socket" # 无需公网 IP
bot_token: "${SLACK_BOT_TOKEN}"
app_token: "${SLACK_APP_TOKEN}"
allowed_channels:
- "C1234567" # 仅允许特定频道使用
# 飞书配置
feishu:
enabled: true
app_id: "${FEISHU_APP_ID}"
app_secret: "${FEISHU_APP_SECRET}"
十一、总结与展望:Super Agent 时代的基础设施
11.1 DeerFlow 2.0 的真正价值
回顾全文,DeerFlow 2.0 真正有趣的地方,不在于它能做什么,而在于它如何把"做事"这件事本身系统化了。
大多数 Agent 项目解决的是"用 LLM 完成任务"的问题——即如何让模型更好地理解意图、更准确地调用工具。而 DeerFlow 解决的是更底层的问题:
- 如何给 Agent 一个真实可靠的运行环境(Sandbox)
- 如何让 Agent 有记忆、有状态、有连续性(Memory)
- 如何让 Agent 能并行处理复杂任务(Sub-Agents)
- 如何让 Agent 能力可扩展、可复用(Skills)
这些问题的解决,标志着 AI Agent 从"ChatBot 增强版"到"数字劳动者"的本质跃迁。
11.2 当前局限与未来方向
DeerFlow 2.0 虽然架构先进,但仍有一些局限性:
模型依赖性强:DeerFlow 的能力上限仍然取决于底层 LLM 的推理能力。如果模型本身不擅长任务拆解,Sub-Agent 调度也会失效。
Sandbox 启动开销:每个新 Thread 需要启动一个新的 Docker 容器,冷启动时间约 3~10 秒。对于需要极致实时性的场景,这可能成为瓶颈。
中文生态尚在建设中:目前 DeerFlow 的文档和社区以英文为主,中文 Skill 和中文使用案例相对较少。
未来可能的演进方向:
- Sandbox 池化:预先启动一组 Sandbox 容器,任务到来时直接分配,消除冷启动开销
- 跨 Sandbox 协作:多个 Thread 的 Sandbox 之间可以共享特定目录,支持更复杂的多任务协作
- Skill 市场:建立类似 npm、PyPI 的 Skill 生态,让开发者方便地发布和获取社区 Skills
- 多模态 Sandbox:支持在 Sandbox 内运行带 GUI 的应用(通过 VNC 或 noVNC),让 Agent 能操作图形界面
11.3 给开发者的建议
如果你正在评估是否将 DeerFlow 2.0 引入你的工作流,以下是几点建议:
适合使用的场景:
- 需要"端到端"完成复杂技术任务(如:调研 + 报告 + 代码 + Demo)
- 需要持久化记忆,不想每次都重新介绍背景
- 需要让 Agent 操作文件系统、执行代码、启停服务
暂不适合的场景:
- 简单的问答和对话(用 ChatGPT / Claude 更直接)
- 对延迟极其敏感的场景(Sandbox 冷启动有开销)
- 需要严格可解释性的场景(Agent 的执行路径可能难以完全预测)
上手路线:
- 先用 Docker 方式快速跑起来,体验 Web UI
- 尝试通过 Python SDK 将 DeerFlow 嵌入自己的应用
- 编写自定义 Skill,适配自己的工作流程
- 根据需要配置安全策略,部署到生产环境
附录:快速参考
A. 常用命令速查
# 安装
git clone https://github.com/bytedance/deer-flow.git
cd deer-flow && make config
# Docker 方式运行
make docker-init # 首次:拉取 Sandbox 镜像
make docker-start # 启动服务(访问 localhost:2026)
make docker-stop # 停止服务
make docker-logs # 查看日志
# 本地开发
make dev # 启动开发服务器
make test # 运行测试
make lint # 代码检查
# Claude Code 集成
npx skills add https://github.com/bytedance/deer-flow --skill claude-to-deerflow
B. 配置文件示例(CONFIG.YAML)
参见第五章第三节的完整配置示例。
C. 相关资源
- 官方 GitHub:https://github.com/bytedance/deer-flow
- 官方文档:https://deerflow.dev
- Discord 社区:https://discord.gg/DeerFlow
- 问题反馈:https://github.com/bytedance/deer-flow/issues
本文撰写于 2026 年 7 月,基于 DeerFlow 2.0 正式版。如有技术细节变更,请以官方文档为准。
作者:程序员茄子 | 转载请注明出处