跳到主要内容
Deep Agents 采用模块化中间件架构构建。Deep Agents 可以访问
  1. 规划工具
  2. 用于存储上下文和长期记忆的文件系统
  3. 生成子代理的能力
每个功能都作为单独的中间件实现。当您使用 create_deep_agent 创建一个 Deep Agent 时,我们会自动将 TodoListMiddlewareFilesystemMiddlewareSubAgentMiddleware 附加到您的代理。 中间件是可组合的——您可以根据需要向代理添加任意数量的中间件。您可以独立使用任何中间件。 以下部分解释了每个中间件提供的功能。

规划中间件

规划是解决复杂问题的关键。如果您最近使用过 Claude Code,您会注意到它在处理复杂的、多部分任务之前会列出待办事项清单。您还会注意到,随着更多信息的传入,它可以即时调整和更新此待办事项清单。 TodoListMiddleware 为您的代理提供了一个专门用于更新此待办事项清单的工具。在执行多部分任务之前和期间,代理会被提示使用 write_todos 工具来跟踪它正在做什么以及还需要做什么。
from langchain.agents import create_agent
from langchain.agents.middleware import TodoListMiddleware

# TodoListMiddleware is included by default in create_deep_agent
# You can customize it if building a custom agent
agent = create_agent(
    model="claude-sonnet-4-5-20250929",
    # Custom planning instructions can be added via middleware
    middleware=[
        TodoListMiddleware(
            system_prompt="Use the write_todos tool to..."  # Optional: Custom addition to the system prompt
        ),
    ],
)

文件系统中间件

上下文工程是构建有效代理的主要挑战。当使用返回可变长度结果的工具(例如,web_search 和 rag)时,这尤其困难,因为长工具结果可以很快填满您的上下文窗口。 FilesystemMiddleware 提供了四个用于与短期和长期记忆交互的工具:
  • ls:列出文件系统中的文件
  • read_file:读取整个文件或文件中指定行数的内容
  • write_file:将新文件写入文件系统
  • edit_file:编辑文件系统中的现有文件
from langchain.agents import create_agent
from deepagents.middleware.filesystem import FilesystemMiddleware

# FilesystemMiddleware is included by default in create_deep_agent
# You can customize it if building a custom agent
agent = create_agent(
    model="claude-sonnet-4-5-20250929",
    middleware=[
        FilesystemMiddleware(
            long_term_memory=False,  # Enables access to long-term memory, defaults to False. You must attach a store to use long-term memory.
            system_prompt="Write to the filesystem when...",  # Optional custom addition to the system prompt
            custom_tool_descriptions={
                "ls": "Use the ls tool when...",
                "read_file": "Use the read_file tool to..."
            }  # Optional: Custom descriptions for filesystem tools
        ),
    ],
)

短期与长期文件系统

默认情况下,这些工具将文件写入您图状态中的本地“文件系统”。如果您向代理运行时提供一个 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": "Use the ls tool when...",
                "read_file": "Use the read_file tool to..."
            }  # Optional: Custom descriptions for filesystem tools
        ),
    ],
)
如果您启用 use_longterm_memory=True 并在代理运行时提供 Store,则任何以 /memories/ 为前缀的文件都将保存到长期记忆存储中。请注意,部署在 LangGraph 平台上的任何代理都会自动提供长期记忆存储。

子代理中间件

将任务交给子代理可以隔离上下文,使主(监督)代理的上下文窗口保持整洁,同时仍能深入处理任务。 子代理中间件允许您通过 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:
    """Get the weather in a city."""
    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": "This subagent can get weather in cities.",
                    "system_prompt": "Use the get_weather tool to get the weather in a city.",
                    "tools": [get_weather],
                    "model": "gpt-4.1",
                    "middleware": [],
                }
            ],
        )
    ],
)
子代理通过名称描述系统提示工具定义。您还可以为子代理提供自定义模型或额外的中间件。当您希望子代理拥有一个额外的状态键以与主代理共享时,这会特别有用。 对于更复杂的用例,您还可以提供自己预构建的 LangGraph 图作为子代理。
from langchain.agents import create_agent
from deepagents.middleware.subagents import SubAgentMiddleware
from deepagents import CompiledSubAgent
from langgraph.graph import StateGraph

# Create a custom LangGraph graph
def create_weather_graph():
    workflow = StateGraph(...)
    # Build your custom graph
    return workflow.compile()

weather_graph = create_weather_graph()

# Wrap it in a CompiledSubAgent
weather_subagent = CompiledSubAgent(
    name="weather",
    description="This subagent can get weather in cities.",
    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 子代理。该子代理具有与主代理相同的指令以及主代理可访问的所有工具。general-purpose 子代理的主要目的是上下文隔离——主代理可以将一个复杂的任务委托给该子代理,并获得简洁的答案,而不会因中间工具调用而产生冗余信息。
以编程方式连接这些文档到 Claude、VSCode 等,通过 MCP 获取实时答案。
© . This site is unofficial and not affiliated with LangChain, Inc.