1. 介绍

官方文档:https://docs.langchain.com/oss/python/deepagents/overview

中文文档:https://langchain-doc.cn/v1/python/deepagents/overview.html

DeepAgents 是一个独立库,用于构建能够处理复杂多步骤任务的代理。深度代理基于 LangGraph,灵感来自 Claude Code、Deep Research 和 Manus 等应用程序,具备规划功能、用于上下文管理的文件系统以及生成子代理的能力。

何时使用Deepagents

当你想构建能够:

  • 处理需要规划和分解的复杂多步骤任务
  • 通过文件系统工具管理大量上下文
  • 将工作委托给专门的子代理以实现上下文隔离
  • 跨对话和线程持续保存记忆

如果想构建更简单的代理,可以考虑使用 LangChain 的 create_agent 或构建自定义的 LangGraph 工作流程。

2. 安装

python>=3.11
pip install deepagents
# 其他依赖: LangChain 模型对象 富文本控制台
pip install langchain_openai rich

3. 第一个例程

agent.py

import argparse
import asyncio
from langchain_openai import ChatOpenAI
from deepagents import create_deep_agent
from langchain_core.messages import SystemMessage, HumanMessage
from deepagents.backends import FilesystemBackend
from console import *

model_config = {
    "model": "YOU_MODEL",
    "base_url": "YOU_BASE_URL",
    "api_key": "YOU_API_KEY",
    "temperature": 0.1,
    "extra_body": {}# {"reasoning_effort": "medium"}
}

async def main(prompt: str):
    agent = create_deep_agent(
        model=ChatOpenAI(**model_config),
        memory=["./AGENTS.md"],
        skills=["./skills"],
        # tools=[],
        backend=FilesystemBackend(root_dir=r"/home/ywh/workspace/deepagent", virtual_mode=True),    # 设置virtual_mode,root_dir才会有效,否则root_dir是根目录
    )
    display = AgentDisplay()
    console.print()

    # Agent执行循环 - 使用 astream 获取流式状态
    with Live(display.spinner, console=console, refresh_per_second=10, transient=True) as live:
        async for chunk in agent.astream(
            {"messages": [("user", prompt)]},
            config={"configurable": {"thread_id": "deepagent-demo"}},
            stream_mode="values",
        ):
            if "messages" in chunk:
                messages = chunk["messages"]
                if len(messages) > display.printed_count:
                    # Temporarily stop spinner to print
                    live.stop()
                    for msg in messages[display.printed_count:]:
                        display.print_message(msg)
                    display.printed_count = len(messages)
                    # Resume spinner
                    live.start()
                    live.update(display.spinner)

    console.print()
    console.print("[bold green]✓ Done![/]")
        

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="agent script.")
    parser.add_argument('-p', '--prompt', type=str, required=True, help='user prompt')
    args = parser.parse_args()
    asyncio.run(main(prompt=args.prompt))

console.py


from rich.console import Console
from rich.live import Live
from rich.markdown import Markdown
from rich.panel import Panel
from rich.spinner import Spinner
from rich.text import Text
from langchain_core.messages import AIMessage, HumanMessage, ToolMessage
console = Console()

class AgentDisplay:
    """Manages the display of agent progress."""

    def __init__(self):
        self.printed_count = 0
        self.current_status = ""
        self.spinner = Spinner("dots", text="Thinking...")

    def update_status(self, status: str):
        self.current_status = status
        self.spinner = Spinner("dots", text=status)

    def print_message(self, msg):
        """Print a message with nice formatting."""
        if isinstance(msg, HumanMessage):
            console.print(Panel(str(msg.content), title="You", border_style="blue"))

        elif isinstance(msg, AIMessage):
            content = msg.content
            if isinstance(content, list):
                text_parts = [p.get("text", "") for p in content if isinstance(p, dict) and p.get("type") == "text"]
                content = "\n".join(text_parts)

            if content and content.strip():
                console.print(Panel(Markdown(content), title="Agent", border_style="green"))

            if msg.tool_calls:
                for tc in msg.tool_calls:
                    name = tc.get("name", "unknown")
                    args = tc.get("args", {})

                    console.print(f"  [bold cyan]>> {name}...[/]")

        elif isinstance(msg, ToolMessage):
            console.print(f"  [bold cyan]✓ {msg.content}[/]")

这样就完成一个类claude code的可定制化agent。

  • alipay_img
  • wechat_img
最后更新于 2026-02-05