数据截至 (上游 commit 25aa2735dabb)
Deep Agents — 架构与原理
30 秒导读: Deep Agents 是 LangChain 官方出的 batteries-included agent harness(开箱即用的 agent 外壳)。你给它一个模型、几个自己的工具、一句系统提示,它就还你一个已经会读写文件、跑 shell、拆子 agent、自己压缩上下文的 agent。它不发明新的运行时,只是把这些能力预装成一摞中间件,叠在 LangChain 的
create_agent()上面。
引用约定: 本页所有
path:line相对克隆根。libs/deepagents/deepagents/是 SDK 主包目录,libs/ARCHITECTURE.md、README.md是仓库自带的上游文档。
1. 这是什么(零基础也能懂)
一句话定义: Deep Agents 是一个有主张的 agent 外壳——把"长时间、多步骤任务的 agent 通常都要自己写一遍"的那套基础设施(计划、文件、子 agent、上下文管理),做成默认就有、又能逐件替换的默认值。
它解决什么问题。 想象你要让 AI 干一件跑一两个小时的活:读完一个大仓库、改十几个文件、边做边记笔记。自己从零搭,会依次撞上四堵墙:
| 撞到的墙 | 具体表现 | 本文档哪章给答案 |
|---|---|---|
| 上下文塞满 | 几十次工具调用后历史超出窗口,模型开始失忆 | 05 |
| 没有工作台 | 模型没地方放中间产物,只能把一切塞回对话里 | 02、03 |
| 主线被淹 | 一次大搜索的结果污染主线程,后面全乱 | 04 |
| 每次重写 | 权限、审批、断点续跑这些"工程活"每个项目都要重造 | 01、03 |
Deep Agents 就是把这四堵墙的答案预先打包好。
给谁用。 三类人各取所需:
| 你是谁 | 你的处境 | 该用哪层 |
|---|---|---|
| 想快速做一个能干长活的 agent | 不想自己写待办工具、文件工具、摘要逻辑 | Deep Agents |
| 想要一个轻的 agent loop | 只要"模型 + 工具 + 循环",自带的中间件反而碍事 | LangChain create_agent() |
| agent loop 本身形状就不对 | 要自定义图、并行分支、特殊状态流转 | LangGraph |
这段取舍是 README 的 FAQ 明说的(README.md:85-89),不是推断。
它开箱能做什么。 只要调一次 create_deep_agent(),模型就已经看得见这几组工具——这份清单写在函数自己的 docstring 里(libs/deepagents/deepagents/graph.py:291-299):
| 工具 | 干什么 | 谁提供 |
|---|---|---|
ls / read_file / write_file / edit_file / glob / grep | 一整套文件操作 | FilesystemMiddleware |
execute | 在沙箱里跑 shell 命令 | 同上,但只在后端支持时才出现 |
task | 把一件事丢给子 agent 去做 | SubAgentMiddleware |
注意:待办清单(write_todos)已经不在这份默认清单里了。TodoListMiddleware 自 0.7.x 起改为 opt-in——默认栈不再装它,只有像 _openai_codex.py 这样的 harness profile 会把它作为 extra_middleware 加回(libs/deepagents/deepagents/profiles/harness/_openai_codex.py:77)。
文件工具的数量有三种口径,别被数字绕晕(三处都对,差别只在"谁在数"):
| 口径 | 数量 | 出处 |
|---|---|---|
create_deep_agent docstring 列的文件操作 | 6(不含 delete) | libs/deepagents/deepagents/graph.py:293 |
FilesystemMiddleware(tools=...) 可选的内置文件工具名 | 7(含 delete) | libs/deepagents/deepagents/middleware/filesystem.py:1339,_FS_TOOL_ORDER |
| 中间件构造时真正造出来的工具对象 | 8(7 个 + execute) | libs/deepagents/deepagents/middleware/filesystem.py:1718-1731,tool_factories |
03 按 8 个的口径讲,因为那一章关心的是"模型这次请求里能看见谁"。
注意 execute 那一行:它不是无条件存在的。后端必须实现 SandboxBackendProtocol(libs/deepagents/deepagents/backends/protocol.py:840),这个工具才会被放进模型请求——这是 §6 要讲的"中间件比普通工具强"的第一个具体例子。
用起来什么样。 最小可跑示例就是 README 的 Quickstart(README.md:55-64),四行:
from deepagents import create_deep_agent
agent = create_deep_agent(
model="openai:gpt-5.5", # 或直接传一个 BaseChatModel 实例
tools=[my_custom_tool], # 你自己的工具,附加,不会顶掉内置的
system_prompt="You are a research assistant.",
)
result = agent.invoke({"messages": "Research LangGraph and write a summary"})
重点看这两处:
tools=是加法——create_deep_agent()的参数文档明写 "Passing tools here is additive — it never removes a built-in"(graph.py:336)。想去掉某个内置工具,得走 profile 的excluded_tools,不是靠不传。- 返回值是 LangGraph 的
CompiledStateGraph,所以.invoke()/.stream()/ checkpoint / interrupt 全都是 LangGraph 原生能力,Deep Agents 一个都没重新发明。
一句话直觉。 把 LangChain 的 create_agent() 想成毛坯房:水电(模型调用、工具执行循环)都通了,但空的。Deep Agents 是精装交付:家具(文件、子 agent)已经摆好,而且每件都能拆下来换掉。
2. 三层心智模型:谁负责什么
这一节回答一个最常卡住人的问题:出了问题该去哪一层找? 官方架构文档专门为此写了「The three layers」(libs/ARCHITECTURE.md:12-28),照抄它的分工:
┌─────────────────────────────────────────────────────────────┐
│ Deep Agents 有主张的 harness │
│ 默认值 / 中间件栈 / 后端 / profiles │
├─────────────────────────────────────────────────────────────┤
│ LangChain agent 抽象 │
│ create_agent() 模型 + 工具 + 中间件 → 一个 agent loop │
├─────────────────────────────────────────────────────────────┤
│ LangGraph 运行时 │
│ state / checkpoint / streaming / interrupt │
└─────────────────────────────────────────────────────────────┘
自下而上读:
- LangGraph = 运行时。 它把 agent 跑成一张图:若干步骤 + 步骤间的跳转,每步能读写共享 state。持久化(checkpoint)、流式观测(streaming)、暂停/恢复(interrupt)都由它提供(
libs/ARCHITECTURE.md:24)。 - LangChain
create_agent()= agent 抽象。 调用方只描述"模型、工具、中间件"三样,它负责把"调模型 → 执行工具 → 再调模型"这个循环搭出来(libs/ARCHITECTURE.md:25)。 - Deep Agents = 有主张的 harness。 关键一句原文:它不引入新运行时,
create_deep_agent()只是组装默认中间件栈,并配置后端、子 agent、技能、记忆和 profile(libs/ARCHITECTURE.md:26)。
这条分层的实操价值: 定位问题时先问"这行为归谁管"。
| 症状 | 大概率在哪层 | 去看 |
|---|---|---|
| 某个工具模型根本看不见 | Deep Agents(中间件装配 / profile 排除) | 01 |
| 工具看得见但一调就报错 | Deep Agents(后端能力 / 权限) | 02、03 |
| 循环不停 / 工具结果没回填 | LangChain agent loop | 上游 create_agent |
| 会话恢复不了、状态丢了 | LangGraph checkpoint | 上游 LangGraph + 05 |