create_deep_agent 具有以下核心配置选项:
create_deep_agent(
    model: str | BaseChatModel | None = None,
    tools: Sequence[BaseTool | Callable | dict[str, Any]] | None = None,
    *,
    system_prompt: str | SystemMessage | None = None,
    middleware: Sequence[AgentMiddleware] = (),
    subagents: Sequence[SubAgent | CompiledSubAgent | AsyncSubAgent] | None = None,
    skills: list[str] | None = None,
    memory: list[str] | None = None,
    response_format: ResponseFormat[ResponseT] | type[ResponseT] | dict[str, Any] | None = None,
    backend: BackendProtocol | BackendFactory | None = None,
    interrupt_on: dict[str, bool | InterruptOnConfig] | None = None,
    ...
) -> CompiledStateGraph
有关完整的参数列表,请参阅 create_deep_agent API 参考。

Model

传入 provider:model 格式的 model 字符串,或传入初始化的模型实例。若无指定,默认为 anthropic:claude-sonnet-4-6。请参阅所有支持的模型以便了解所有供应商和经过测试并推荐的建议模型
使用 provider:model 格式(例如 openai:gpt-5)模型字符串,可以在模型之间快速切换。
👉 参见 OpenAI chat model 继承文档
pip install -U "langchain[openai]"
import os
from deepagents import create_deep_agent

os.environ["OPENAI_API_KEY"] = "sk-..."

agent = create_deep_agent(model="openai:gpt-5.4")
# this calls init_chat_model for the specified model with default parameters
# to use specific model parameters, use init_chat_model directly

网络连接弹性

LangChain chat model 会自动使用指数退避机制重试失败的 API 请求。默认情况下,对于网络错误、速率限制(429)和服务器错误(5xx)模型最多重试 6 次。对于401(未授权)或 404等客户端错误,模型不会重试。 您可以在创建模型时指定 max_retries 参数以根据您的具体情况调整此行为:
from langchain.chat_models import init_chat_model
from deepagents import create_deep_agent

agent = create_deep_agent(
    model=init_chat_model(
        model="claude-sonnet-4-6",
        max_retries=10,  # 在不可靠的网络上增加(默认:6)
        timeout=120,     # 为慢速连接增加超时
    ),
)
对于在不可靠网络上长时间运行的智能体任务,考虑将 max_retries 增加到 10-15,并与检查点checkpointer配合使用,以便在故障时保存进程状态。

Tools

除了用于规划、文件管理和子智能体扩展的内置工具外,您还可以提供自定义工具:
import os
from typing import Literal
from tavily import TavilyClient
from deepagents import create_deep_agent

tavily_client = TavilyClient(api_key=os.environ["TAVILY_API_KEY"])

def internet_search(
    query: str,
    max_results: int = 5,
    topic: Literal["general", "news", "finance"] = "general",
    include_raw_content: bool = False,
):
    """运行网络搜索"""
    return tavily_client.search(
        query,
        max_results=max_results,
        include_raw_content=include_raw_content,
        topic=topic,
    )

agent = create_deep_agent(
    tools=[internet_search]
)

System Prompt

Deep Agents 默认带有内置的系统提示词。默认系统提示词包括有关使用内置规划工具、文件系统工具和子智能体的详细指令。 当特殊工具(如文件系统工具)以中间件形式添加时,它Deep Agents会将其附加到系统提示词。 但是,每个Deep Agent还应包含一个与本身任务用例相匹配的自定义系统提示词:
from deepagents import create_deep_agent

research_instructions = """\
您是一个专业研究员。您的工作是进行
彻底的研究,然后撰写一份完善的报告。\
"""

agent = create_deep_agent(
    system_prompt=research_instructions,
)

Middleware

默认情况下,Deep Agents 可以访问以下Middleware 中间件 如果您使用Memory(记忆)、Skills(技能)或Human-in-the-loop(人工中断),还会包含以下中间件:
  • MemoryMiddleware:当提供 memory 参数时跨会话持久化和检索对话上下文
  • SkillsMiddleware:当提供 skills 参数时启用自定义技能
  • HumanInTheLoopMiddleware:当提供 interruptOn 参数时在指定点暂停以进行人工审核或输入

预设中间件

LangChain 提供了额外的预设中间件,让您可以添加各种功能,如重试、回退或 PII 验证。请参阅内置中间件了解更多。 deepagents 库还提供了 create_summarization_tool_middleware中间件,使智能体能够在适当的时机触发对话消息总结 —— 例如在任务之间 —— 而不是在Token达到固定限额时。了解更多详情,请参阅对话消息总结

供应商特定中间件

某些模型供应商提供了自身特有的、经过优化的中间件,请参阅官方集成社区集成

自定义中间件

您可以开发自定义中间件来扩展功能、添加工具或实现自定义hook(钩子):
from langchain.tools import tool
from langchain.agents.middleware import wrap_tool_call
from deepagents import create_deep_agent


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


call_count = [0]  # 使用列表以允许在嵌套函数中修改

@wrap_tool_call
def log_tool_calls(request, handler):
    """拦截并记录每个工具调用 - 演示横切关注点。"""
    call_count[0] += 1
    tool_name = request.name if hasattr(request, 'name') else str(request)

    print(f"[中间件] 工具调用 #{call_count[0]}: {tool_name}")
    print(f"[中间件] 参数: {request.args if hasattr(request, 'args') else 'N/A'}")

    # 执行工具调用
    result = handler(request)

    # 记录结果
    print(f"[中间件] 工具调用 #{call_count[0]} 完成")

    return result


agent = create_deep_agent(
    tools=[get_weather],
    middleware=[log_tool_calls],
)
初始化后不要修改属性如果您需要跨hook(钩子调用)跟踪值(例如计数器或累计数据),请使用graph state, graph state 被设计为线程环境的,因此更新在并发下是安全的。这样做:
class CustomMiddleware(AgentMiddleware):
    def __init__(self):
        pass

    def before_agent(self, state, runtime):
        return {"x": state.get("x", 0) + 1}  # 更新图形状态而不是
不要这样做:
class CustomMiddleware(AgentMiddleware):
    def __init__(self):
        self.x = 1

    def before_agent(self, state, runtime):
        self.x += 1  # 变异会导致竞态条件
原地修改,如在 before_agent 中修改 self.x 或更改hook(钩子)中的其他共享值,可能导致微妙的错误和竞争条件,因为许多操作是并发运行的(子智能体、并行工具和不同线程上的并行调用)。有关使用自定义属性扩展状态的完整详细信息,请参阅自定义中间件 - 自定义状态信息模式。 如果您必须在自定义中间件中进行修改操作,请考虑当子智能体、并行工具或并发智能体调用同时运行时会发生什么。

Subagents

要隔离详细工作并避免上下文膨胀,请使用子智能体:
import os
from typing import Literal
from tavily import TavilyClient
from deepagents import create_deep_agent

tavily_client = TavilyClient(api_key=os.environ["TAVILY_API_KEY"])

def internet_search(
    query: str,
    max_results: int = 5,
    topic: Literal["general", "news", "finance"] = "general",
    include_raw_content: bool = False,
):
    """Run a web search"""
    return tavily_client.search(
        query,
        max_results=max_results,
        include_raw_content=include_raw_content,
        topic=topic,
    )

research_subagent = {
    "name": "research-agent",
    "description": "Used to research more in depth questions",
    "system_prompt": "You are a great researcher",
    "tools": [internet_search],
    "model": "openai:gpt-5.2",  # Optional override, defaults to main agent model
}
subagents = [research_subagent]

agent = create_deep_agent(
    model="claude-sonnet-4-6",
    subagents=subagents
)
更多信息,请参阅子智能体

Backends

Deep Agents 的工具可以使用虚拟文件系统来存储、访问和编辑文件。默认情况下,Deep Agents 会使用 StateBackend 如果您想使用Skills 技能Memory 记忆,则必须在创建智能体之前将期望的技能或记忆文件添加到Backends(后端)。
存储在 langgraph 状态中的临时文件系统后端。此文件系统仅在单个线程中持久化。
# By default we provide a StateBackend
agent = create_deep_agent()

# Under the hood, it looks like
from deepagents.backends import StateBackend

agent = create_deep_agent(
    backend=StateBackend()
)
更多信息,请参阅后端

沙盒

Sandboxes(沙盒)是一个专门的后端,它具有自己的文件系统和执行命令的shell命令行,能够在隔离的环境中执行智能体的代码。 当您希望deep agent不更改本地计算机上的任何内容,而进行写入文件、安装依赖项并运行命令时,请使用沙盒后端。 您可以通过在创建deep agent时将沙盒后端传递给 backend 来配置沙盒: 更多信息,请参阅沙盒

Human-in-the-loop 人工中断

某些工具执行的操作可能是敏感的,需要在执行前获得人工授权。 您可以为每个工具配置人工授权:
from langchain.tools import tool
from deepagents import create_deep_agent
from langgraph.checkpoint.memory import MemorySaver

@tool
def delete_file(path: str) -> str:
    """Delete a file from the filesystem."""
    return f"Deleted {path}"

@tool
def read_file(path: str) -> str:
    """Read a file from the filesystem."""
    return f"Contents of {path}"

@tool
def send_email(to: str, subject: str, body: str) -> str:
    """Send an email."""
    return f"Sent email to {to}"

# Checkpointer is REQUIRED for human-in-the-loop
checkpointer = MemorySaver()

agent = create_deep_agent(
    model="claude-sonnet-4-6",
    tools=[delete_file, read_file, send_email],
    interrupt_on={
        "delete_file": True,  # Default: approve, edit, reject
        "read_file": False,   # No interrupts needed
        "send_email": {"allowed_decisions": ["approve", "reject"]},  # No editing
    },
    checkpointer=checkpointer  # Required!
)
在智能体和子智能体进行工具调用以及工具调用内部,您可以设置中断,以便获得人工授权后恢复执行。 更多信息,请参阅人工中断

Skills

您可以使用Skills 技能为您的deep agent增添新的功能和专业知识。 虽然工具倾向于提供底层级别功能(如原生文件系统操作或任务规划),但技能可以包含关于如何完成任务的详细指令、参考信息和其他资产(如模板)。 这些技能文件仅在智能体确定技能对当前提示词有用时才会被智能体加载。 这种渐进式加载减少了智能体启动时就必须加载的Token和上下文。 技能示例,请参阅 Deep Agent 示例技能 要将技能添加到deep agent,请在创建 create_deep_agent 时将它们作为参数传递:
from urllib.request import urlopen
from deepagents import create_deep_agent
from deepagents.backends.utils import create_file_data
from langgraph.checkpoint.memory import MemorySaver

checkpointer = MemorySaver()

skill_url = "https://raw.githubusercontent.com/langchain-ai/deepagents/refs/heads/main/libs/cli/examples/skills/langgraph-docs/SKILL.md"
with urlopen(skill_url) as response:
    skill_content = response.read().decode('utf-8')

skills_files = {
    "/skills/langgraph-docs/SKILL.md": create_file_data(skill_content)
}

agent = create_deep_agent(
    skills=["/skills/"],
    checkpointer=checkpointer,
)

result = agent.invoke(
    {
        "messages": [
            {
                "role": "user",
                "content": "What is langgraph?",
            }
        ],
        # Seed the default StateBackend's in-state filesystem (virtual paths must start with "/").
        "files": skills_files
    },
    config={"configurable": {"thread_id": "12345"}},
)

Memory

使用AGENTS.md 文件为您的deep agent提供额外的上下文。 您可以在创建deep agent时将一个或多个文件路径传递给 memory 参数:
from urllib.request import urlopen

from deepagents import create_deep_agent
from deepagents.backends.utils import create_file_data
from langgraph.checkpoint.memory import MemorySaver

with urlopen("https://raw.githubusercontent.com/langchain-ai/deepagents/refs/heads/main/examples/text-to-sql-agent/AGENTS.md") as response:
    agents_md = response.read().decode("utf-8")
checkpointer = MemorySaver()

agent = create_deep_agent(
    memory=[
        "/AGENTS.md"
    ],
    checkpointer=checkpointer,
)

result = agent.invoke(
    {
        "messages": [
            {
                "role": "user",
                "content": "Please tell me what's in your memory files.",
            }
        ],
        # Seed the default StateBackend's in-state filesystem (virtual paths must start with "/").
        "files": {"/AGENTS.md": create_file_data(agents_md)},
    },
    config={"configurable": {"thread_id": "123456"}},
)
有关更多详细信息,请参阅记忆

Structured output 结构化输出

Deep Agents 支持 structured output 结构化输出。 您可以定义一个期望的结构化输出模式结构,将它传递给create_deep_agent()函数的response_format参数。 当模型产生结构化输出时,deep agent就会将其捕获、验证并返回至自身状态中的“structured_response”。
import os
from typing import Literal
from pydantic import BaseModel, Field
from tavily import TavilyClient
from deepagents import create_deep_agent

tavily_client = TavilyClient(api_key=os.environ["TAVILY_API_KEY"])

def internet_search(
    query: str,
    max_results: int = 5,
    topic: Literal["general", "news", "finance"] = "general",
    include_raw_content: bool = False,
):
    """Run a web search"""
    return tavily_client.search(
        query,
        max_results=max_results,
        include_raw_content=include_raw_content,
        topic=topic,
    )

class WeatherReport(BaseModel):
    """A structured weather report with current conditions and forecast."""
    location: str = Field(description="The location for this weather report")
    temperature: float = Field(description="Current temperature in Celsius")
    condition: str = Field(description="Current weather condition (e.g., sunny, cloudy, rainy)")
    humidity: int = Field(description="Humidity percentage")
    wind_speed: float = Field(description="Wind speed in km/h")
    forecast: str = Field(description="Brief forecast for the next 24 hours")


agent = create_deep_agent(
    response_format=WeatherReport,
    tools=[internet_search]
)

result = agent.invoke({
    "messages": [{
        "role": "user",
        "content": "What's the weather like in San Francisco?"
    }]
})

print(result["structured_response"])
# location='San Francisco, California' temperature=18.3 condition='Sunny' humidity=48 wind_speed=7.6 forecast='Pleasant sunny conditions expected to continue with temperatures around 64°F (18°C) during the day, dropping to around 52°F (11°C) at night. Clear skies with minimal precipitation expected.'
更多信息和示例, 参见 response format.