关于 deepagents-implementation
这是使用 Deep Agents 实现 Agent 的参考技能;Deep Agents 是基于 LangGraph 的 Agent 框架。内容涵盖配置、存储后端、任务委派、流式处理、人工审批、中间件和 MCP 工具连接。
主要功能
- 01使用 create_deep_agent 创建 Agent
- 02可插拔的存储后端
- 03子 Agent 任务委派
- 04流式处理与检查点
- 05人工审批中断
- 06MCP 服务工具集成
适用场景
- 01构建基于 LangGraph 的 Agent
- 02跨对话持久化 Agent 状态
- 03在工作流中加入专用子 Agent
- 04将 MCP 工具连接到 Agent
MCP 相关
说明如何通过 MultiServerMCPClient 连接 MCP 服务,并将其工具提供给 Deep Agents Agent 使用。还列出 MCP 子进程配置的部署检查项。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ existential-birds/ beagle --skill deepagents-implementation安装后在 Claude Code 中输入/deepagents-implementation确认已加载。
附带文件references/patterns.mdreferences/tools.md
详细介绍
Deep Agents 实现
核心概念
Deep Agents 提供了一个基于 LangGraph 构建、开箱即用的 Agent 框架:
create_deep_agent:用于创建已配置 Agent 的工厂函数- 中间件:注入的功能(文件系统、待办事项、子 Agent、摘要)
- 后端:可插拔的文件存储(状态、文件系统、存储、组合)
- 子 Agent:通过
task工具执行隔离任务
返回的 Agent 是一个已编译的 LangGraph StateGraph,兼容流式传输、检查点和 LangGraph Studio。
必要导入
# Core
from deepagents import create_deep_agent
# Subagents
from deepagents import CompiledSubAgent
# Backends
from deepagents.backends import (
StateBackend, # Ephemeral (default)
FilesystemBackend, # Real disk
StoreBackend, # Persistent cross-thread
CompositeBackend, # Route paths to backends
)
# LangGraph (for checkpointing, store, streaming)
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.checkpoint.postgres import PostgresSaver
from langgraph.store.memory import InMemoryStore
# LangChain (for custom models, tools)
from langchain.chat_models import init_chat_model
from langchain_core.tools import tool
基本用法
最简 Agent
from deepagents import create_deep_agent
# Uses Claude Sonnet 4 by default
agent = create_deep_agent()
result = agent.invoke({"messages": [{"role": "user", "content": "Hello!"}]})
使用自定义工具
from langchain_core.tools import tool
from deepagents import create_deep_agent
@tool
def web_search(query: str) -> str:
"""Search the web for information."""
return tavily_client.search(query)
agent = create_deep_agent(
tools=[web_search],
system_prompt="You are a research assistant. Search the web to answer questions.",
)
result = agent.invoke({"messages": [{"role": "user", "content": "What is LangGraph?"}]})
使用自定义模型
from langchain.chat_models import init_chat_model
from deepagents import create_deep_agent
# OpenAI
model = init_chat_model("openai:gpt-4o")
# Or Anthropic with custom settings
from langchain_anthropic import ChatAnthropic
model = ChatAnthropic(model_name="claude-sonnet-4-5-20250929", max_tokens=8192)
agent = create_deep_agent(model=model)
使用检查点(持久化)
from langgraph.checkpoint.memory import InMemorySaver
from deepagents import create_deep_agent
agent = create_deep_agent(checkpointer=InMemorySaver())
# Must provide thread_id with checkpointer
config = {"configurable": {"thread_id": "user-123"}}
result = agent.invoke({"messages": [...]}, config)
# Resume conversation
result = agent.invoke({"messages": [{"role": "user", "content": "Follow up"}]}, config)
流式传输
Agent 支持所有 LangGraph 流模式。
流式更新
for chunk in agent.stream(
{"messages": [{"role": "user", "content": "Write a report"}]},
stream_mode="updates"
):
print(chunk) # {"node_name": {"key": "value"}}
流式消息(逐个 Token)
for chunk in agent.stream(
{"messages": [{"role": "user", "content": "Explain quantum computing"}]},
stream_mode="messages"
):
# Real-time token streaming
print(chunk.content, end="", flush=True)
异步流式传输
async for chunk in agent.astream(
{"messages": [...]},
stream_mode="updates"
):
print(chunk)
多种流模式
for mode, chunk in agent.stream(
{"messages": [...]},
stream_mode=["updates", "messages"]
):
if mode == "messages":
print("Token:", chunk.content)
else:
print("Update:", chunk)
后端配置
StateBackend(默认 - 临时)
文件存储在 Agent 状态中,仅在当前线程内持久保留。
# Implicit - this is the default
agent = create_deep_agent()
# Explicit
from deepagents.backends import StateBackend
agent = create_deep_agent(backend=lambda rt: StateBackend(rt))
FilesystemBackend(真实磁盘)
在磁盘上读写实际文件。启用用于执行 shell 命令的 execute 工具。
from deepagents.backends import FilesystemBackend
agent = create_deep_agent(
backend=FilesystemBackend(root_dir="/path/to/project"),
)
StoreBackend(跨线程持久化)
使用 LangGraph Store 在不同对话之间持久化数据。
from langgraph.store.memory import InMemoryStore
from deepagents.backends import StoreBackend
store = InMemoryStore()
agent = create_deep_agent(
backend=lambda rt: StoreBackend(rt),
store=store, # Required for StoreBackend
)
CompositeBackend(混合路由)
将不同路径路由到不同后端。
from langgraph.store.memory import InMemoryStore
from deepagents.backends import CompositeBackend, StateBackend, StoreBackend
store = InMemoryStore()
agent = create_deep_agent(
backend=CompositeBackend(
default=StateBackend(), # /workspace/* → ephemeral
routes={
"/memories/": StoreBackend(store=store), # persistent
"/preferences/": StoreBackend(store=store), # persistent
},
),
store=store,
)
# Files under /memories/ persist across all conversations
# Files under /workspace/ are ephemeral per-thread
子 Agent
使用默认通用 Agent
默认情况下,所有主 Agent 工具都可供 general-purpose 子 Agent 使用。
agent = create_deep_agent(tools=[web_search])
# The agent can now delegate via the `task` tool:
# task(subagent_type="general-purpose", prompt="Research topic X in depth")
定义自定义子 Agent
from deepagents import create_deep_agent
research_agent = {
"name": "researcher",
"description": "Conducts deep research on complex topics with web search",
"system_prompt": """You are an expert researcher.
Search thoroughly, cross-reference sources, and synthesize findings.""",
"tools": [web_search, document_reader],
}
code_agent = {
"name": "coder",
"description": "Writes, reviews, and debugs code",
"system_prompt": "You are an expert programmer. Write clean, tested code.",
"tools": [code_executor, linter],
"model": "openai:gpt-4o", # Optional: different model per subagent
}
agent = create_deep_agent(
subagents=[research_agent, code_agent],
system_prompt="Delegate research to the researcher and coding to the coder.",
)
预编译的 LangGraph 子 Agent
使用现有 LangGraph 图作为子 Agent。
from deepagents import CompiledSubAgent, create_deep_agent
from langgraph.prebuilt import create_react_agent
# Existing graph
custom_graph = create_react_agent(
model="anthropic:claude-sonnet-4-5-20250929",
tools=[specialized_tool],
prompt="Custom workflow instructions",
)
agent = create_deep_agent(
subagents=[CompiledSubAgent(
name="custom-workflow",
description="Runs my specialized analysis workflow",
runnable=custom_graph,
)]
)
使用自定义中间件的子 Agent
from langchain.agents.middleware import AgentMiddleware
class LoggingMiddleware(AgentMiddleware):
def transform_response(self, response):
print(f"Subagent response: {response}")
return response
agent_spec = {
"name": "logged-agent",
"description": "Agent with extra logging",
"system_prompt": "You are helpful.",
"tools": [],
"middleware": [LoggingMiddleware()], # Added after default middleware
}
人机协作
基本中断配置
在特定工具执行前暂停,以请求人工批准。
from deepagents import create_deep_agent
agent = create_deep_agent(
tools=[send_email, delete_file, web_search],
interrupt_on={
"send_email": True, # Simple interrupt
"delete_file": True, # Require approval before delete
# web_search not listed - runs without approval
},
checkpointer=checkpointer, # Required for interrupts
)
带选项的中断
agent = create_deep_agent(
tools=[send_email],
interrupt_on={
"send_email": {
"allowed_decisions": ["approve", "edit", "reject"]
},
},
checkpointer=checkpointer,
)
# Invoke - will pause at send_email
config = {"configurable": {"thread_id": "user-123"}}
result = agent.invoke({"messages": [...]}, config)
# Check state
state = agent.get_state(config)
if state.next: # Has pending interrupt
# Resume with approval
from langgraph.types import Command
agent.invoke(Command(resume={"approved": True}), config)
# Or resume with edit
agent.invoke(Command(resume={"edited_args": {"to": "[email protected]"}}), config)
# Or reject
agent.invoke(Command(resume={"rejected": True}), config)
在子 Agent 工具上中断
# Interrupts apply to subagents too
agent = create_deep_agent(
subagents=[research_agent],
interrupt_on={
"web_search": True, # Interrupt even when subagent calls it
},
checkpointer=checkpointer,
)
自定义中间件
中间件结构
from langchain.agents.middleware.types import (
AgentMiddleware,
ModelRequest,
ModelResponse,
)
from langchain_core.tools import tool
class MyMiddleware(AgentMiddleware):
# Tools to inject
tools = []
# System prompt content to inject
system_prompt = ""
def transform_request(self, request: ModelRequest) -> ModelRequest:
"""Modify request before sending to model."""
return request
def transform_response(self, response: ModelResponse) -> ModelResponse:
"""Modify response after receiving from model."""
return response
通过中间件注入工具
from langchain_core.tools import tool
@tool
def get_current_time() -> str:
"""Get the current time."""
from datetime import datetime
return datetime.now().isoformat()
class TimeMiddleware(AgentMiddleware):
tools = [get_current_time]
system_prompt = "You have access to get_current_time for time-sensitive tasks."
agent = create_deep_agent(middleware=[TimeMiddleware()])
上下文注入中间件
class UserContextMiddleware(AgentMiddleware):
def __init__(self, user_preferences: dict):
self.user_preferences = user_preferences
@property
def system_prompt(self):
return f"User preferences: {self.user_preferences}"
agent = create_deep_agent(
middleware=[UserContextMiddleware({"theme": "dark", "language": "en"})]
)
响应日志中间件
import logging
class LoggingMiddleware(AgentMiddleware):
def transform_response(self, response: ModelResponse) -> ModelResponse:
logging.info(f"Agent response: {response.messages[-1].content[:100]}...")
return response
agent = create_deep_agent(middleware=[LoggingMiddleware()])
MCP 工具集成
连接 MCP(模型上下文协议)服务以提供额外工具。
from langchain_mcp_adapters.client import MultiServerMCPClient
from deepagents import create_deep_agent
async def main():
mcp_client = MultiServerMCPClient({
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/path"],
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {"GITHUB_TOKEN": os.environ["GITHUB_TOKEN"]},
},
})
mcp_tools = await mcp_client.get_tools()
agent = create_deep_agent(tools=mcp_tools)
async for chunk in agent.astream(
{"messages": [{"role": "user", "content": "List my repos"}]}
):
print(chunk)
实现关卡
对于涉及真实磁盘、人工中断、持久化或 MCP 子进程的配置,请按顺序使用下表(最简 create_deep_agent() 冒烟测试可跳过)。
| 步骤 | 通过条件 |
|---|---|
| 1 | FilesystemBackend 或 execute:root_dir 已明确限定范围(不是意外指向用户主目录或文件系统根目录);在信任生产路径前,先在一次性目录中进行冒烟测试。 |
| 2 | **interrupt_on / 恢复:**已配置 checkpointer;每次可能发生中断的 invoke / astream 都包含带有 configurable["thread_id"] 的 config;暂停后,在执行 Command(resume=...) 前,agent.get_state(config) 显示存在待处理的中断状态;如果设置了恢复载荷,该载荷须符合工具选项(例如 allowed_decisions)。 |
| 3 | **Store、PostgreSQL saver、MCP:**凭据来自环境或密钥管理器,而非已提交的源代码;MCP 的 command / args / 必需的 env 键与部署主机实际提供的内容(例如 npx、令牌)相匹配。 |
更多参考资料
如需详细参考文档,请参阅: