深度智能体基于模块化的中间件架构构建,默认具备以下能力:
  1. 规划工具
  2. 用于存储上下文和长期记忆的文件系统
  3. 生成子智能体的能力
每个能力都由独立的中间件实现。当您通过 create_deep_agent 创建深度智能体时,系统会自动为智能体挂载 TodoListMiddlewareFilesystemMiddlewareSubAgentMiddleware 中间件具备可组合性——可以按需添加或移除,单独使用亦可。下列章节逐一介绍每个中间件提供的功能。

规划中间件

规划对于解决复杂问题至关重要。如果您近期使用过 Claude Code,会注意到它在处理复杂、多步骤任务前会先写一份待办清单,并且能在获取更多信息后随时调整。 TodoListMiddleware 为智能体提供了一个专门的工具来更新待办列表。在执行多步骤任务前和执行过程中,智能体会被提示使用 write_todos 工具来记录当前进度以及待完成事项。
from langchain.agents import create_agent
from langchain.agents.middleware import TodoListMiddleware

# create_deep_agent 默认包含 TodoListMiddleware
# 若自定义智能体,可自行调整
agent = create_agent(
    model="claude-sonnet-4-5-20250929",
    # 可通过中间件添加自定义的规划提示
    middleware=[
        TodoListMiddleware(
            system_prompt="Use the write_todos tool to..."  # 可选:为系统提示追加说明
        ),
    ],
)

文件系统中间件

上下文工程是构建高效智能体的核心挑战之一。特别是在使用返回长度不固定结果的工具(如 web_searchrag)时,较长的工具输出很容易填满上下文窗口。 FilesystemMiddleware 提供四个工具,让智能体可以操作短期和长期记忆:
  • ls:列出智能体文件系统中的所有文件
  • read_file:读取智能体文件系统中的文件
  • write_file:在智能体文件系统中新建文件
  • edit_file:编辑智能体文件系统中的现有文件
from langchain.agents import create_agent
from deepagents.middleware.filesystem import FilesystemMiddleware

# create_deep_agent 默认包含 FilesystemMiddleware
# 若自定义智能体,可按需配置
agent = create_agent(
    model="claude-sonnet-4-5-20250929",
    middleware=[
        FilesystemMiddleware(
            long_term_memory=False,  # 是否启用长期记忆,默认为 False。要使用长期记忆需提供 store。
            system_prompt="当需要写入内容时,请使用文件系统……",  # 可选:为系统提示追加说明
            custom_tool_descriptions={
                "ls": "需要查看当前目录文件时调用 ls。",
                "read_file": "当需要读取文件内容时使用 read_file。"
            }
        ),
    ],
)

短期 vs. 长期文件系统

默认情况下,这些工具写入图状态中的本地“文件系统”。如果在运行时提供 Store 对象,就可以启用长期记忆,使内容在智能体的不同线程之间持久存在。
from langchain.agents import create_agent
from deepagents.middleware import FilesystemMiddleware
from langgraph.store.memory import InMemoryStore

store = InMemoryStore()

agent = create_agent(
    model="claude-sonnet-4-5-20250929",
    store=store,
    middleware=[
        FilesystemMiddleware(
            long_term_memory=True,
            custom_tool_descriptions={
                "ls": "需要查看当前目录文件时调用 ls。",
                "read_file": "当需要读取文件内容时使用 read_file。"
            }
        ),
    ],
)
当您在运行时启用 use_longterm_memory=True 并提供 Store 时,所有以 /memories/ 为前缀的文件都会写入长期记忆。部署在 LangGraph Platform 的智能体默认已经具备长期记忆存储能力。

子智能体中间件

将任务交由子智能体处理,可以隔离上下文,保持主(监督者)智能体的上下文窗口干净,同时深入处理具体任务。 子智能体中间件允许通过 task 工具向主智能体提供子智能体。
from langchain_core.tools import tool
from langchain.agents import create_agent
from deepagents.middleware.subagents import SubAgentMiddleware


@tool
def get_weather(city: str) -> str:
    """获取某个城市的天气。"""
    return f"The weather in {city} is sunny."

agent = create_agent(
    model="claude-sonnet-4-5-20250929",
    middleware=[
        SubAgentMiddleware(
            default_model="claude-sonnet-4-5-20250929",
            default_tools=[],
            subagents=[
                {
                    "name": "weather",
                    "description": "该子智能体可获取各城市的天气信息。",
                    "system_prompt": "使用 get_weather 工具查询城市天气。",
                    "tools": [get_weather],
                    "model": "gpt-4.1",
                    "middleware": [],
                }
            ],
        )
    ],
)
子智能体需要提供 namedescriptionsystem prompttools。还可以为子智能体配置自定义 model 或额外的 middleware,这在需要让子智能体与主智能体共享特定状态键时尤其有用。 对于更复杂的场景,还可以将自定义的 LangGraph 图作为子智能体提供。
from langchain.agents import create_agent
from deepagents.middleware.subagents import SubAgentMiddleware
from deepagents import CompiledSubAgent
from langgraph.graph import StateGraph

# 构建自定义 LangGraph 图

def create_weather_graph():
    workflow = StateGraph(...)
    # 在此构建自定义图
    return workflow.compile()

weather_graph = create_weather_graph()

# 封装为 CompiledSubAgent
weather_subagent = CompiledSubAgent(
    name="weather",
    description="该子智能体可获取各城市的天气信息。",
    runnable=weather_graph
)

agent = create_agent(
    model="claude-sonnet-4-5-20250929",
    middleware=[
        SubAgentMiddleware(
            default_model="claude-sonnet-4-5-20250929",
            default_tools=[],
            subagents=[weather_subagent],
        )
    ],
)
除了用户自定义的子智能体外,主智能体始终可以访问一个 general-purpose(通用)子智能体。该子智能体与主智能体共享相同的指令及工具权限,主要用于上下文隔离——主智能体可以将复杂任务委派给它,获得简洁答案,从而避免中间工具调用带来的上下文膨胀。
Connect these docs programmatically to Claude, VSCode, and more via MCP for real-time answers.