deepagents
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseDeep Agents — Architecture & Review
Deep Agents — 架构设计与代码审查
| Concern | Section |
|---|---|
| Architectural decisions, framework choice, subagent/middleware design | Architecture |
| Reviewing existing Deep Agents code for bugs and anti-patterns | Code Review |
Architecture
架构设计
Deep Agents Architecture Decisions
Deep Agents架构决策
When to Use Deep Agents
何时使用Deep Agents
Use Deep Agents When You Need:
适合使用Deep Agents的场景:
- Long-horizon tasks - Complex workflows spanning dozens of tool calls
- Planning capabilities - Task decomposition before execution
- Filesystem operations - Reading, writing, and editing files
- Subagent delegation - Isolated task execution with separate context windows
- Persistent memory - Long-term storage across conversations
- Human-in-the-loop - Approval gates for sensitive operations
- Context management - Auto-summarization for long conversations
- 长周期任务 - 涉及数十次工具调用的复杂工作流
- 规划能力需求 - 执行前的任务分解
- 文件系统操作 - 文件的读取、写入与编辑
- 子Agent委托 - 独立任务执行,拥有单独的上下文窗口
- 持久化内存 - 跨对话的长期存储
- 人机协作 - 敏感操作的审批环节
- 上下文管理 - 长对话的自动摘要
Consider Alternatives When:
考虑替代方案的场景:
| Scenario | Alternative | Why |
|---|---|---|
| Single LLM call | Direct API call | Deep Agents overhead not justified |
| Simple RAG pipeline | LangChain LCEL | Simpler abstraction |
| Custom graph control flow | LangGraph directly | More flexibility |
| No file operations needed | | Lighter weight |
| Stateless tool use | Function calling | No middleware needed |
| 场景 | 替代方案 | 原因 |
|---|---|---|
| 单次LLM调用 | 直接API调用 | Deep Agents的开销无必要 |
| 简单RAG流水线 | LangChain LCEL | 更简洁的抽象层 |
| 自定义图控制流 | 直接使用LangGraph | 更高的灵活性 |
| 无需文件操作 | | 更轻量化 |
| 无状态工具调用 | 函数调用 | 无需中间件 |
Backend Selection
后端选择
Backend Comparison
后端对比
| Backend | Persistence | Use Case | Requires |
|---|---|---|---|
| Ephemeral (per-thread) | Working files, temp data | Nothing (default) |
| Disk | Local development, real files | |
| Cross-thread | User preferences, knowledge bases | LangGraph |
| Mixed | Hybrid memory patterns | Multiple backends |
| 后端 | 持久化特性 | 使用场景 | 依赖条件 |
|---|---|---|---|
| 临时存储(单线程) | 工作文件、临时数据 | 无(默认选项) |
| 磁盘存储 | 本地开发、真实文件操作 | |
| 跨线程共享 | 用户偏好、知识库 | LangGraph |
| 混合存储 | 混合内存模式 | 多个后端 |
Backend Decision Tree
后端决策树
Need real disk access?
├─ Yes → FilesystemBackend(root_dir="/path")
└─ No
└─ Need persistence across conversations?
├─ Yes → Need mixed ephemeral + persistent?
│ ├─ Yes → CompositeBackend
│ └─ No → StoreBackend
└─ No → StateBackend (default)需要真实磁盘访问?
├─ 是 → FilesystemBackend(root_dir="/path")
└─ 否
└─ 需要跨对话持久化?
├─ 是 → 需要临时+持久混合存储?
│ ├─ 是 → CompositeBackend
│ └─ 否 → StoreBackend
└─ 否 → StateBackend (默认)CompositeBackend Routing
CompositeBackend路由配置
Route different paths to different storage backends:
python
from deepagents import create_deep_agent
from deepagents.backends import CompositeBackend, StateBackend, StoreBackend
agent = create_deep_agent(
backend=CompositeBackend(
default=StateBackend(), # Working files (ephemeral)
routes={
"/memories/": StoreBackend(store=store), # Persistent
"/preferences/": StoreBackend(store=store), # Persistent
},
),
)将不同路径路由至不同存储后端:
python
from deepagents import create_deep_agent
from deepagents.backends import CompositeBackend, StateBackend, StoreBackend
agent = create_deep_agent(
backend=CompositeBackend(
default=StateBackend(), # 工作文件(临时存储)
routes={
"/memories/": StoreBackend(store=store), # 持久化存储
"/preferences/": StoreBackend(store=store), # 持久化存储
},
),
)Subagent Architecture
子Agent架构
When to Use Subagents
何时使用子Agent
Use subagents when:
- Task is complex, multi-step, and can run independently
- Task requires heavy context that would bloat the main thread
- Multiple independent tasks can run in parallel
- You need isolated execution (sandboxing)
- You only care about the final result, not intermediate steps
Don't use subagents when:
- Task is trivial (few tool calls)
- You need to see intermediate reasoning
- Splitting adds latency without benefit
- Task depends on main thread state mid-execution
适合使用子Agent的场景:
- 任务复杂、多步骤且可独立执行
- 任务需要大量上下文,会导致主线程上下文膨胀
- 多个独立任务可并行执行
- 需要隔离执行环境(沙箱)
- 仅关注最终结果,无需中间步骤
不适合使用子Agent的场景:
- 任务简单(仅需少量工具调用)
- 需要查看中间推理过程
- 拆分任务会增加延迟且无收益
- 任务执行过程中依赖主线程状态
Subagent Patterns
子Agent模式
Pattern 1: Parallel Research
模式1:并行研究
┌─────────────┐
│ Orchestrator│
└──────┬──────┘
┌──────────┼──────────┐
▼ ▼ ▼
┌──────┐ ┌──────┐ ┌──────┐
│Task A│ │Task B│ │Task C│
└──┬───┘ └──┬───┘ └──┬───┘
└──────────┼──────────┘
▼
┌─────────────┐
│ Synthesize │
└─────────────┘Best for: Research on multiple topics, parallel analysis, batch processing.
┌─────────────┐
│ 编排器│
└──────┬──────┘
┌──────────┼──────────┐
▼ ▼ ▼
┌──────┐ ┌──────┐ ┌──────┐
│任务A│ │任务B│ │任务C│
└──┬───┘ └──┬───┘ └──┬───┘
└──────────┼──────────┘
▼
┌─────────────┐
│ 结果合成 │
└─────────────┘最佳适用场景:多主题研究、并行分析、批量处理。
Pattern 2: Specialized Agents
模式2:专业化Agent
python
research_agent = {
"name": "researcher",
"description": "Deep research on complex topics",
"system_prompt": "You are an expert researcher...",
"tools": [web_search, document_reader],
}
coder_agent = {
"name": "coder",
"description": "Write and review code",
"system_prompt": "You are an expert programmer...",
"tools": [code_executor, linter],
}
agent = create_deep_agent(subagents=[research_agent, coder_agent])Best for: Domain-specific expertise, different tool sets per task type.
python
research_agent = {
"name": "researcher",
"description": "复杂主题深度研究",
"system_prompt": "你是一名专业研究员...",
"tools": [web_search, document_reader],
}
coder_agent = {
"name": "coder",
"description": "编写与审查代码",
"system_prompt": "你是一名资深程序员...",
"tools": [code_executor, linter],
}
agent = create_deep_agent(subagents=[research_agent, coder_agent])最佳适用场景:领域专业技能需求、不同任务类型对应不同工具集。
Pattern 3: Pre-compiled Subagents
模式3:预编译子Agent
python
from deepagents import CompiledSubAgent, create_deep_agentpython
from deepagents import CompiledSubAgent, create_deep_agentUse existing LangGraph graph as subagent
将现有LangGraph图作为子Agent使用
custom_graph = create_react_agent(model=..., tools=...)
agent = create_deep_agent(
subagents=[CompiledSubAgent(
name="custom-workflow",
description="Runs specialized workflow",
runnable=custom_graph
)]
)
Best for: Reusing existing LangGraph graphs, complex custom workflows.custom_graph = create_react_agent(model=..., tools=...)
agent = create_deep_agent(
subagents=[CompiledSubAgent(
name="custom-workflow",
description="执行专业化工作流",
runnable=custom_graph
)]
)
最佳适用场景:复用现有LangGraph图、复杂自定义工作流。Middleware Architecture
中间件架构
Built-in Middleware Stack
内置中间件栈
Deep Agents applies middleware in this order:
- TodoListMiddleware - Task planning with /
write_todosread_todos - FilesystemMiddleware - File ops: ,
ls,read_file,write_file,edit_file,glob,grepexecute - SubAgentMiddleware - Delegation via tool
task - SummarizationMiddleware - Auto-summarizes at ~85% context or 170k tokens
- AnthropicPromptCachingMiddleware - Caches system prompts (Anthropic only)
- PatchToolCallsMiddleware - Fixes dangling tool calls from interruptions
- HumanInTheLoopMiddleware - Pauses for approval (if configured)
interrupt_on
Deep Agents按以下顺序应用中间件:
- TodoListMiddleware - 通过/
write_todos实现任务规划read_todos - FilesystemMiddleware - 文件操作:,
ls,read_file,write_file,edit_file,glob,grepexecute - SubAgentMiddleware - 通过工具实现任务委托
task - SummarizationMiddleware - 上下文占比约85%或达到170k tokens时自动摘要
- AnthropicPromptCachingMiddleware - 缓存系统提示词(仅支持Anthropic)
- PatchToolCallsMiddleware - 修复中断导致的未完成工具调用
- HumanInTheLoopMiddleware - 触发审批暂停(若配置)
interrupt_on
Custom Middleware Placement
自定义中间件配置
python
from langchain.agents.middleware import AgentMiddleware
class MyMiddleware(AgentMiddleware):
tools = [my_custom_tool]
def transform_request(self, request):
# Modify system prompt, inject context
return request
def transform_response(self, response):
# Post-process, log, filter
return responsepython
from langchain.agents.middleware import AgentMiddleware
class MyMiddleware(AgentMiddleware):
tools = [my_custom_tool]
def transform_request(self, request):
# 修改系统提示词、注入上下文
return request
def transform_response(self, response):
# 后处理、日志记录、过滤
return responseCustom middleware added AFTER built-in stack
自定义中间件添加至内置栈之后
agent = create_deep_agent(middleware=[MyMiddleware()])
undefinedagent = create_deep_agent(middleware=[MyMiddleware()])
undefinedMiddleware vs Tools Decision
中间件与工具的选择决策
| Need | Use Middleware | Use Tools |
|---|---|---|
| Inject system prompt content | ✅ | ❌ |
| Add tools dynamically | ✅ | ❌ |
| Transform requests/responses | ✅ | ❌ |
| Standalone capability | ❌ | ✅ |
| User-invokable action | ❌ | ✅ |
| 需求 | 使用中间件 | 使用工具 |
|---|---|---|
| 注入系统提示词内容 | ✅ | ❌ |
| 动态添加工具 | ✅ | ❌ |
| 转换请求/响应 | ✅ | ❌ |
| 独立功能 | ❌ | ✅ |
| 用户可调用操作 | ❌ | ✅ |
Subagent Middleware Inheritance
子Agent中间件继承
Subagents receive their own middleware stack by default:
- TodoListMiddleware
- FilesystemMiddleware (shared backend)
- SummarizationMiddleware
- AnthropicPromptCachingMiddleware
- PatchToolCallsMiddleware
Override with in SubAgentMiddleware or per-subagent key.
default_middleware=[]middleware子Agent默认拥有独立的中间件栈:
- TodoListMiddleware
- FilesystemMiddleware(共享后端)
- SummarizationMiddleware
- AnthropicPromptCachingMiddleware
- PatchToolCallsMiddleware
可通过SubAgentMiddleware的或子Agent的字段覆盖默认配置。
default_middleware=[]middlewareArchitecture Decision Checklist
架构决策检查清单
Before implementing:
- Is Deep Agents the right tool? (vs LangGraph directly, vs simpler agent)
- Backend strategy chosen?
- Ephemeral only → StateBackend (default)
- Need disk access → FilesystemBackend
- Need cross-thread persistence → StoreBackend or CompositeBackend
- Subagent strategy defined?
- Which tasks benefit from isolation?
- Custom subagents with specialized tools/prompts?
- Parallel execution opportunities identified?
- Human-in-the-loop points defined?
- Which tools need approval?
- Approval flow (approve/edit/reject)?
- Custom middleware needed?
- System prompt injection?
- Request/response transformation?
- Context management considered?
- Long conversations → summarization triggers
- Large file handling → use references
- Checkpointing strategy? (for persistence/resume)
实现前需确认:
- Deep Agents是否为合适工具?(对比直接使用LangGraph或更简单的Agent)
- 是否已选择后端策略?
- 仅临时存储 → StateBackend(默认)
- 需要磁盘访问 → FilesystemBackend
- 需要跨线程持久化 → StoreBackend或CompositeBackend
- 是否已定义子Agent策略?
- 哪些任务可通过隔离执行获益?
- 是否需要带专用工具/提示词的自定义子Agent?
- 是否已识别并行执行的机会?
- 是否已定义人机协作节点?
- 哪些工具需要审批?
- 审批流程(批准/编辑/拒绝)?
- 是否需要自定义中间件?
- 是否需要注入系统提示词?
- 是否需要转换请求/响应?
- 是否已考虑上下文管理?
- 长对话 → 摘要触发机制
- 大文件处理 → 使用引用方式
- 是否已制定检查点策略?(用于持久化/恢复)
Code Review
代码审查
Deep Agents Code Review
Deep Agents代码审查
When reviewing Deep Agents code, check for these categories of issues.
审查Deep Agents代码时,需检查以下类别问题。
Critical Issues
严重问题
1. Missing Checkpointer with interrupt_on
1. 使用interrupt_on但缺少Checkpointer
python
undefinedpython
undefinedBAD - interrupt_on without checkpointer
错误示例 - 使用interrupt_on但未配置checkpointer
agent = create_deep_agent(
tools=[send_email],
interrupt_on={"send_email": True},
# No checkpointer! Interrupts will fail
)
agent = create_deep_agent(
tools=[send_email],
interrupt_on={"send_email": True},
# 无checkpointer!中断将失败
)
GOOD - checkpointer required for interrupts
正确示例 - 中断功能需要checkpointer
from langgraph.checkpoint.memory import InMemorySaver
agent = create_deep_agent(
tools=[send_email],
interrupt_on={"send_email": True},
checkpointer=InMemorySaver(),
)
undefinedfrom langgraph.checkpoint.memory import InMemorySaver
agent = create_deep_agent(
tools=[send_email],
interrupt_on={"send_email": True},
checkpointer=InMemorySaver(),
)
undefined2. Missing Store with StoreBackend
2. 使用StoreBackend但缺少Store
python
undefinedpython
undefinedBAD - StoreBackend without store
错误示例 - StoreBackend未配置store
from deepagents.backends import StoreBackend
agent = create_deep_agent(
backend=lambda rt: StoreBackend(rt),
# No store! Will raise ValueError at runtime
)
from deepagents.backends import StoreBackend
agent = create_deep_agent(
backend=lambda rt: StoreBackend(rt),
# 无store!运行时将抛出ValueError
)
GOOD - provide store
正确示例 - 提供store
from langgraph.store.memory import InMemoryStore
store = InMemoryStore()
agent = create_deep_agent(
backend=lambda rt: StoreBackend(rt),
store=store,
)
undefinedfrom langgraph.store.memory import InMemoryStore
store = InMemoryStore()
agent = create_deep_agent(
backend=lambda rt: StoreBackend(rt),
store=store,
)
undefined3. Missing thread_id with Checkpointer
3. 使用Checkpointer但缺少thread_id
python
undefinedpython
undefinedBAD - no thread_id when using checkpointer
错误示例 - 使用checkpointer但未提供thread_id
agent = create_deep_agent(checkpointer=InMemorySaver())
agent.invoke({"messages": [...]}) # Error!
agent = create_deep_agent(checkpointer=InMemorySaver())
agent.invoke({"messages": [...]}) # 报错!
GOOD - always provide thread_id
正确示例 - 必须提供thread_id
config = {"configurable": {"thread_id": "user-123"}}
agent.invoke({"messages": [...]}, config)
undefinedconfig = {"configurable": {"thread_id": "user-123"}}
agent.invoke({"messages": [...]}, config)
undefined4. Relative Paths in Filesystem Tools
4. 文件系统工具使用相对路径
python
undefinedpython
undefinedBAD - relative paths not supported
错误示例 - 不支持相对路径
read_file(path="src/main.py")
read_file(path="./config.json")
read_file(path="src/main.py")
read_file(path="./config.json")
GOOD - absolute paths required
正确示例 - 必须使用绝对路径
read_file(path="/workspace/src/main.py")
read_file(path="/config.json")
undefinedread_file(path="/workspace/src/main.py")
read_file(path="/config.json")
undefined5. Windows Paths in Virtual Filesystem
5. 虚拟文件系统使用Windows路径
python
undefinedpython
undefinedBAD - Windows paths rejected
错误示例 - Windows路径将被拒绝
read_file(path="C:\Users\file.txt")
write_file(path="D:/projects/code.py", content="...")
read_file(path="C:\Users\file.txt")
write_file(path="D:/projects/code.py", content="...")
GOOD - Unix-style virtual paths
正确示例 - 使用类Unix虚拟路径
read_file(path="/workspace/file.txt")
write_file(path="/projects/code.py", content="...")
undefinedread_file(path="/workspace/file.txt")
write_file(path="/projects/code.py", content="...")
undefinedBackend Issues
后端相关问题
6. StateBackend Expecting Persistence
6. 期望StateBackend提供持久化
python
undefinedpython
undefinedBAD - expecting files to persist across threads
错误示例 - 期望文件跨线程持久化
agent = create_deep_agent() # Uses StateBackend by default
agent = create_deep_agent() # 默认使用StateBackend
Thread 1
线程1
agent.invoke({"messages": [...]}, {"configurable": {"thread_id": "a"}})
agent.invoke({"messages": [...]}, {"configurable": {"thread_id": "a"}})
Agent writes to /data/report.txt
Agent写入/data/report.txt
Thread 2 - file won't exist!
线程2 - 文件不存在!
agent.invoke({"messages": [...]}, {"configurable": {"thread_id": "b"}})
agent.invoke({"messages": [...]}, {"configurable": {"thread_id": "b"}})
Agent tries to read /data/report.txt - NOT FOUND
Agent尝试读取/data/report.txt - 未找到
GOOD - use StoreBackend or CompositeBackend for cross-thread persistence
正确示例 - 使用StoreBackend或CompositeBackend实现跨线程持久化
agent = create_deep_agent(
backend=CompositeBackend(
default=StateBackend(),
routes={"/data/": StoreBackend(store=store)},
),
store=store,
)
undefinedagent = create_deep_agent(
backend=CompositeBackend(
default=StateBackend(),
routes={"/data/": StoreBackend(store=store)},
),
store=store,
)
undefined7. FilesystemBackend Without root_dir Restriction
7. FilesystemBackend未限制root_dir
python
undefinedpython
undefinedBAD - unrestricted filesystem access
错误示例 - 无限制的文件系统访问
agent = create_deep_agent(
backend=FilesystemBackend(root_dir="/"), # Full system access!
)
agent = create_deep_agent(
backend=FilesystemBackend(root_dir="/"), # 全系统访问权限!
)
GOOD - scope to project directory
正确示例 - 限定至项目目录
agent = create_deep_agent(
backend=FilesystemBackend(root_dir="/home/user/project"),
)
undefinedagent = create_deep_agent(
backend=FilesystemBackend(root_dir="/home/user/project"),
)
undefined8. CompositeBackend Route Order Confusion
8. CompositeBackend路由顺序混淆
python
undefinedpython
undefinedBAD - shorter prefix shadows longer prefix
错误示例 - 短前缀覆盖长前缀
agent = create_deep_agent(
backend=CompositeBackend(
default=StateBackend(),
routes={
"/mem/": backend_a, # This catches /mem/long-term/ too!
"/mem/long-term/": backend_b, # Never reached
},
),
)
agent = create_deep_agent(
backend=CompositeBackend(
default=StateBackend(),
routes={
"/mem/": backend_a, # 会匹配/mem/long-term/路径!
"/mem/long-term/": backend_b, # 永远不会被命中
},
),
)
GOOD - CompositeBackend sorts by length automatically
正确示例 - CompositeBackend会自动按长度排序
But be explicit about your intent:
但建议明确表达意图:
agent = create_deep_agent(
backend=CompositeBackend(
default=StateBackend(),
routes={
"/memories/": persistent_backend,
"/workspace/": ephemeral_backend,
},
),
)
undefinedagent = create_deep_agent(
backend=CompositeBackend(
default=StateBackend(),
routes={
"/memories/": persistent_backend,
"/workspace/": ephemeral_backend,
},
),
)
undefined9. Expecting execute Tool Without SandboxBackend
9. 未使用SandboxBackend却调用execute工具
python
undefinedpython
undefinedBAD - execute tool won't work with StateBackend
错误示例 - StateBackend不支持execute工具
agent = create_deep_agent() # Default StateBackend
agent = create_deep_agent() # 默认StateBackend
Agent calls execute("ls -la") → Error: not supported
Agent调用execute("ls -la") → 错误:不支持
GOOD - use FilesystemBackend for shell execution
正确示例 - 使用FilesystemBackend执行shell命令
agent = create_deep_agent(
backend=FilesystemBackend(root_dir="/project"),
)
agent = create_deep_agent(
backend=FilesystemBackend(root_dir="/project"),
)
Agent calls execute("ls -la") → Works
Agent调用execute("ls -la") → 正常工作
undefinedundefinedSubagent Issues
子Agent相关问题
10. Subagent Missing Required Fields
10. 子Agent缺少必填字段
python
undefinedpython
undefinedBAD - missing required fields
错误示例 - 缺少必填字段
agent = create_deep_agent(
subagents=[{
"name": "helper",
# Missing: description, system_prompt, tools
}]
)
agent = create_deep_agent(
subagents=[{
"name": "helper",
# 缺失:description、system_prompt、tools
}]
)
GOOD - all required fields present
正确示例 - 包含所有必填字段
agent = create_deep_agent(
subagents=[{
"name": "helper",
"description": "General helper for misc tasks",
"system_prompt": "You are a helpful assistant.",
"tools": [], # Can be empty but must be present
}]
)
undefinedagent = create_deep_agent(
subagents=[{
"name": "helper",
"description": "通用辅助工具,处理各类杂项任务",
"system_prompt": "你是一名乐于助人的助手。",
"tools": [], # 可以为空但必须存在
}]
)
undefined11. Subagent Name Collision
11. 子Agent名称冲突
python
undefinedpython
undefinedBAD - duplicate subagent names
错误示例 - 子Agent名称重复
agent = create_deep_agent(
subagents=[
{"name": "research", "description": "A", ...},
{"name": "research", "description": "B", ...}, # Collision!
]
)
agent = create_deep_agent(
subagents=[
{"name": "research", "description": "A", ...},
{"name": "research", "description": "B", ...}, # 名称冲突!
]
)
GOOD - unique names
正确示例 - 使用唯一名称
agent = create_deep_agent(
subagents=[
{"name": "web-research", "description": "Web-based research", ...},
{"name": "doc-research", "description": "Document research", ...},
]
)
undefinedagent = create_deep_agent(
subagents=[
{"name": "web-research", "description": "基于网页的研究", ...},
{"name": "doc-research", "description": "文档研究", ...},
]
)
undefined12. Overusing Subagents for Simple Tasks
12. 简单任务过度使用子Agent
python
undefinedpython
undefinedBAD - subagent overhead for trivial task
错误示例 - 简单任务使用子Agent造成开销
In system prompt or agent behavior:
在系统提示词或Agent行为中:
"Use the task tool to check the current time"
"Delegate file reading to a subagent"
"使用task工具查看当前时间"
"将文件读取任务委托给子Agent"
GOOD - use subagents for complex, isolated work
正确示例 - 子Agent用于复杂、隔离的工作
"Use the task tool for multi-step research that requires many searches"
"Delegate the full analysis workflow to a subagent"
undefined"针对需要多次搜索的多步骤研究,使用task工具"
"将完整分析工作流委托给子Agent"
undefined13. CompiledSubAgent Without Proper State
13. CompiledSubAgent状态不兼容
python
undefinedpython
undefinedBAD - subgraph with incompatible state schema
错误示例 - 子图状态 schema 不兼容
from langgraph.graph import StateGraph
class CustomState(TypedDict):
custom_field: str # No messages field!
sub_builder = StateGraph(CustomState)
from langgraph.graph import StateGraph
class CustomState(TypedDict):
custom_field: str # 缺少messages字段!
sub_builder = StateGraph(CustomState)
... build graph
... 构建图
subgraph = sub_builder.compile()
agent = create_deep_agent(
subagents=[CompiledSubAgent(
name="custom",
description="Custom workflow",
runnable=subgraph, # State mismatch!
)]
)
subgraph = sub_builder.compile()
agent = create_deep_agent(
subagents=[CompiledSubAgent(
name="custom",
description="自定义工作流",
runnable=subgraph, # 状态不匹配!
)]
)
GOOD - ensure compatible state or use message-based interface
正确示例 - 确保状态兼容或使用基于消息的接口
class CompatibleState(TypedDict):
messages: Annotated[list, add_messages]
custom_field: str
undefinedclass CompatibleState(TypedDict):
messages: Annotated[list, add_messages]
custom_field: str
undefinedMiddleware Issues
中间件相关问题
14. Middleware Order Misunderstanding
14. 误解中间件执行顺序
python
undefinedpython
undefinedBAD - expecting custom middleware to run first
错误示例 - 期望自定义中间件优先执行
class PreProcessMiddleware(AgentMiddleware):
def transform_request(self, request):
# Expecting this runs before built-in middleware
return request
agent = create_deep_agent(middleware=[PreProcessMiddleware()])
class PreProcessMiddleware(AgentMiddleware):
def transform_request(self, request):
# 期望在所有内置中间件之前执行
return request
agent = create_deep_agent(middleware=[PreProcessMiddleware()])
Actually runs AFTER TodoList, Filesystem, SubAgent, etc.
实际在TodoList、Filesystem、SubAgent等内置中间件之后执行
GOOD - understand middleware runs after built-in stack
正确示例 - 明确自定义中间件在内置栈之后执行
Built-in order:
内置中间件顺序:
1. TodoListMiddleware
1. TodoListMiddleware
2. FilesystemMiddleware
2. FilesystemMiddleware
3. SubAgentMiddleware
3. SubAgentMiddleware
4. SummarizationMiddleware
4. SummarizationMiddleware
5. AnthropicPromptCachingMiddleware
5. AnthropicPromptCachingMiddleware
6. PatchToolCallsMiddleware
6. PatchToolCallsMiddleware
7. YOUR MIDDLEWARE HERE
7. 你的自定义中间件
8. HumanInTheLoopMiddleware (if interrupt_on set)
8. HumanInTheLoopMiddleware(若配置interrupt_on)
undefinedundefined15. Middleware Mutating Request/Response
15. 中间件修改请求/响应对象
python
undefinedpython
undefinedBAD - mutating instead of returning new object
错误示例 - 修改原对象而非返回新对象
class BadMiddleware(AgentMiddleware):
def transform_request(self, request):
request.messages.append(extra_message) # Mutation!
return request
class BadMiddleware(AgentMiddleware):
def transform_request(self, request):
request.messages.append(extra_message) # 直接修改!
return request
GOOD - return modified copy
正确示例 - 返回修改后的副本
class GoodMiddleware(AgentMiddleware):
def transform_request(self, request):
return ModelRequest(
messages=[*request.messages, extra_message],
**other_fields
)
undefinedclass GoodMiddleware(AgentMiddleware):
def transform_request(self, request):
return ModelRequest(
messages=[*request.messages, extra_message],
**other_fields
)
undefined16. Middleware Tools Without Descriptions
16. 中间件工具无描述信息
python
undefinedpython
undefinedBAD - tool without docstring
错误示例 - 工具无文档字符串
@tool
def my_tool(arg: str) -> str:
return process(arg)
class MyMiddleware(AgentMiddleware):
tools = [my_tool] # LLM won't know how to use it!
@tool
def my_tool(arg: str) -> str:
return process(arg)
class MyMiddleware(AgentMiddleware):
tools = [my_tool] # LLM无法知晓如何使用!
GOOD - descriptive docstring
正确示例 - 添加描述性文档字符串
@tool
def my_tool(arg: str) -> str:
"""Process the input string and return formatted result.
Args:
arg: The string to process
Returns:
Formatted result string
"""
return process(arg)undefined@tool
def my_tool(arg: str) -> str:
"""处理输入字符串并返回格式化结果。
参数:
arg: 待处理的字符串
返回:
格式化后的结果字符串
"""
return process(arg)undefinedSystem Prompt Issues
系统提示词相关问题
17. Duplicating Built-in Tool Instructions
17. 重复内置工具说明
python
undefinedpython
undefinedBAD - re-explaining what middleware already covers
错误示例 - 重复中间件已覆盖的内容
agent = create_deep_agent(
system_prompt="""You have access to these tools:
- write_todos: Create task lists
- read_file: Read files from the filesystem
- task: Delegate to subagents
When using files, always use absolute paths...""")
agent = create_deep_agent(
system_prompt="""你可使用以下工具:
- write_todos: 创建任务列表
- read_file: 从文件系统读取文件
- task: 委托给子Agent
使用文件时,请始终使用绝对路径...""")
This duplicates what FilesystemMiddleware and TodoListMiddleware inject!
这与FilesystemMiddleware和TodoListMiddleware注入的内容重复!
GOOD - focus on domain-specific guidance
正确示例 - 聚焦领域特定指引
agent = create_deep_agent(
system_prompt="""You are a code review assistant.
Workflow:
1. Read the files to review
2. Create a todo list of issues found
3. Delegate deep analysis to subagents if needed
4. Compile findings into a report""")
undefinedagent = create_deep_agent(
system_prompt="""你是一名代码审查助手。
工作流:
1. 读取待审查文件
2. 创建问题清单
3. 必要时将深度分析委托给子Agent
4. 将发现的问题整理成报告""")
undefined18. Contradicting Built-in Instructions
18. 与内置说明冲突
python
undefinedpython
undefinedBAD - contradicting default behavior
错误示例 - 与默认行为冲突
agent = create_deep_agent(
system_prompt="""Never use the task tool.
Always process everything in the main thread.
Don't use todos, just remember everything."""
)
agent = create_deep_agent(
system_prompt="""永远不要使用task工具。
所有任务都在主线程中处理。
不要使用todos,自行记住所有内容。"""
)
Fighting against the framework!
与框架设计相悖!
GOOD - work with the framework
正确示例 - 配合框架使用
agent = create_deep_agent(
system_prompt="""For simple tasks, handle directly.
For complex multi-step research, use subagents.
Track progress with todos for tasks with 3+ steps."""
)
undefinedagent = create_deep_agent(
system_prompt="""简单任务直接处理。
复杂多步骤研究使用子Agent。
步骤≥3的任务使用todos跟踪进度。"""
)
undefined19. Missing Stopping Criteria
19. 缺少终止条件
python
undefinedpython
undefinedBAD - no guidance on when to stop
错误示例 - 未定义终止规则
agent = create_deep_agent(
system_prompt="Research everything about the topic thoroughly."
)
agent = create_deep_agent(
system_prompt="全面研究该主题的所有内容。"
)
Agent may run indefinitely!
Agent可能无限运行!
GOOD - define completion criteria
正确示例 - 定义完成条件
agent = create_deep_agent(
system_prompt="""Research the topic with these constraints:
- Maximum 5 web searches
- Stop when you have 3 reliable sources
- Limit subagent delegations to 2 parallel tasks
- Summarize findings within 500 words"""
)
undefinedagent = create_deep_agent(
system_prompt="""按以下约束研究主题:
- 最多执行5次网页搜索
- 获取3个可靠来源后停止
- 子Agent并行任务不超过2个
- 研究结果摘要不超过500字"""
)
undefinedPerformance Issues
性能相关问题
20. Not Parallelizing Independent Subagents
20. 独立子Agent未并行执行
python
undefinedpython
undefinedBAD - sequential subagent calls (in agent behavior)
错误示例 - 子Agent串行调用(Agent行为中)
Agent calls: task(research topic A) → wait → task(research topic B) → wait
Agent调用: task(研究主题A) → 等待 → task(研究主题B) → 等待
GOOD - parallel subagent calls
正确示例 - 子Agent并行调用
Agent calls in single turn:
Agent在单轮对话中调用:
task(research topic A)
task(研究主题A)
task(research topic B)
task(研究主题B)
task(research topic C)
task(研究主题C)
All run concurrently!
所有任务并发执行!
Guide via system prompt:
通过系统提示词引导:
agent = create_deep_agent(
system_prompt="""When researching multiple topics,
launch all research subagents in parallel in a single response."""
)
undefinedagent = create_deep_agent(
system_prompt="""研究多个主题时,
在单轮响应中并行启动所有研究子Agent。"""
)
undefined21. Large Files in State
21. 大文件存储在StateBackend
python
undefinedpython
undefinedBAD - writing large files to StateBackend
错误示例 - 将大文件写入StateBackend
Agent writes 10MB log file to /output/full_log.txt
Agent将10MB日志文件写入/output/full_log.txt
This bloats every checkpoint!
这会导致每个检查点体积膨胀!
GOOD - use FilesystemBackend for large files or paginate
正确示例 - 使用FilesystemBackend存储大文件或分页处理
agent = create_deep_agent(
backend=CompositeBackend(
default=StateBackend(), # Small files
routes={
"/large_files/": FilesystemBackend(root_dir="/tmp/agent"),
},
),
)
undefinedagent = create_deep_agent(
backend=CompositeBackend(
default=StateBackend(), # 小文件存储
routes={
"/large_files/": FilesystemBackend(root_dir="/tmp/agent"),
},
),
)
undefined22. InMemorySaver in Production
22. 生产环境使用InMemorySaver
python
undefinedpython
undefinedBAD - ephemeral checkpointer in production
错误示例 - 生产环境使用临时检查点
agent = create_deep_agent(
checkpointer=InMemorySaver(), # Lost on restart!
)
agent = create_deep_agent(
checkpointer=InMemorySaver(), # 重启后数据丢失!
)
GOOD - persistent checkpointer
正确示例 - 使用持久化检查点
from langgraph.checkpoint.postgres import PostgresSaver
agent = create_deep_agent(
checkpointer=PostgresSaver.from_conn_string(DATABASE_URL),
)
undefinedfrom langgraph.checkpoint.postgres import PostgresSaver
agent = create_deep_agent(
checkpointer=PostgresSaver.from_conn_string(DATABASE_URL),
)
undefined23. Missing Recursion Awareness
23. 未考虑递归限制
python
undefinedpython
undefinedBAD - no guard against long-running loops
错误示例 - 未防范长时间循环
agent = create_deep_agent(
system_prompt="Keep improving the solution until it's perfect."
)
agent = create_deep_agent(
system_prompt="不断优化方案直至完美。"
)
May hit recursion limit (default 1000)
可能触发递归限制(默认1000次)
GOOD - explicit iteration limits
正确示例 - 明确迭代限制
agent = create_deep_agent(
system_prompt="""Improve the solution iteratively:
- Maximum 3 revision cycles
- Stop if quality score > 90%
- Stop if no improvement after 2 iterations"""
)
undefinedagent = create_deep_agent(
system_prompt="""迭代优化方案:
- 最多3次修订循环
- 质量评分>90%时停止
- 连续2次迭代无改进时停止"""
)
undefinedCode Review Checklist
代码审查检查清单
Configuration
配置
- Checkpointer provided if using
interrupt_on - Store provided if using
StoreBackend - Thread ID provided in config when using checkpointer
- Backend appropriate for use case (ephemeral vs persistent)
- 使用时已提供Checkpointer
interrupt_on - 使用时已提供
StoreBackend参数store - 使用checkpointer时配置中已提供Thread ID
- 后端选择符合使用场景(临时存储vs持久化)
Backends
后端
- FilesystemBackend scoped to safe
root_dir - StoreBackend has corresponding parameter
store - CompositeBackend routes don't shadow each other unintentionally
- Not expecting persistence from StateBackend across threads
- FilesystemBackend已限定至安全的
root_dir - StoreBackend已配置对应的参数
store - CompositeBackend路由未意外覆盖
- 未期望StateBackend提供跨线程持久化
Subagents
子Agent
- All required fields present (name, description, system_prompt, tools)
- Unique subagent names
- CompiledSubAgent has compatible state schema
- Subagents used for complex tasks, not trivial operations
- 所有必填字段完整(name、description、system_prompt、tools)
- 子Agent名称唯一
- CompiledSubAgent状态schema兼容
- 子Agent用于复杂任务而非简单操作
Middleware
中间件
- Custom middleware added after built-in stack (expected behavior)
- Tools have descriptive docstrings
- Not mutating request/response objects
- 自定义中间件添加至内置栈之后(符合预期行为)
- 工具包含描述性文档字符串
- 未直接修改请求/响应对象
System Prompt
系统提示词
- Not duplicating built-in tool instructions
- Not contradicting framework defaults
- Stopping criteria defined for open-ended tasks
- Parallelization guidance for independent tasks
- 未重复内置工具说明
- 未与框架默认行为冲突
- 开放式任务已定义终止条件
- 独立任务已明确并行执行指引
Performance
性能
- Large files routed to appropriate backend
- Production uses persistent checkpointer
- Recursion/iteration limits considered
- Independent subagents parallelized
- 大文件已路由至合适后端
- 生产环境使用持久化检查点
- 已考虑递归/迭代限制
- 独立子Agent已并行执行
See also (related skills — Code review family)
相关技能(代码审查系列)
If your issue relates to:
- CodeRabbit-powered review (default) — check if appropriate.
code-review - auto-apply CodeRabbit review comments — check if appropriate.
autofix - Python + pytest review (type safety, async, fixtures) — check if appropriate.
python-code-review - Rust source review — check if appropriate.
rust-code-review - Rust test review — check if appropriate.
rust-testing-code-review - tokio async review — check if appropriate.
tokio-async-code-review - Rust FFI review — check if appropriate.
ffi-code-review - SQLAlchemy 2.0 review — check if appropriate.
sqlalchemy-code-review
若你的问题涉及:
- CodeRabbit驱动的审查(默认) — 适用技能。
code-review - 自动应用CodeRabbit审查意见 — 适用技能。
autofix - Python + pytest审查(类型安全、异步、fixtures) — 适用技能。
python-code-review - Rust源码审查 — 适用技能。
rust-code-review - Rust测试用例审查 — 适用技能。
rust-testing-code-review - tokio异步代码审查 — 适用技能。
tokio-async-code-review - Rust FFI审查 — 适用技能。
ffi-code-review - SQLAlchemy 2.0审查 — 适用技能。
sqlalchemy-code-review