mcpField
D
deepagents-implementation

deepagents-implementation

github.com/existential-birdsAgent 工作流85137 次安装11 周前更新
代码仓库

关于 deepagents-implementation

这是使用 Deep Agents 实现 Agent 的参考技能;Deep Agents 是基于 LangGraph 的 Agent 框架。内容涵盖配置、存储后端、任务委派、流式处理、人工审批、中间件和 MCP 工具连接。

主要功能

  1. 01使用 create_deep_agent 创建 Agent
  2. 02可插拔的存储后端
  3. 03子 Agent 任务委派
  4. 04流式处理与检查点
  5. 05人工审批中断
  6. 06MCP 服务工具集成

适用场景

  1. 01构建基于 LangGraph 的 Agent
  2. 02跨对话持久化 Agent 状态
  3. 03在工作流中加入专用子 Agent
  4. 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() 冒烟测试可跳过)。

步骤通过条件
1FilesystemBackend 或 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、令牌)相匹配。

更多参考资料

如需详细参考文档,请参阅:

  • 内置工具参考 - 列出每个 Agent 可用的完整工具清单(文件系统、任务管理、子 Agent 委派)及路径要求
  • 常见模式 - 可用于生产环境的示例,包括带记忆功能的研究 Agent、可访问磁盘的代码助手、多专家团队以及生产环境 PostgreSQL 配置

评论

支持 Markdown