DeepAgents · 从入门到精通 目录

§14 实战:搭一个会写报告的研究助手

先给结论:把前 13 章串起来,你就能搭一个"搜索→存储→委派→出报告"的研究助手。

我用"研究 2025 年 agentic 框架"做例子。这是 DeepAgents 最经典的用法。

完整代码

import os
from typing import Literal
from tavily import TavilyClient
from deepagents import create_deep_agent
from deepagents.backends import CompositeBackend, StateBackend, StoreBackend
from langgraph.store.memory import InMemoryStore

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

def internet_search(query: str, max_results: int = 5) -> dict:
    """运行网络搜索。"""
    return tavily.search(query, max_results=max_results)

agent = create_deep_agent(
    model="anthropic:claude-sonnet-4-6",
    tools=[internet_search],
    subagents=[
        {"name": "data-collector", "description": "收集数据",
         "system_prompt": "全面收集数据", "tools": [internet_search]},
        {"name": "report-writer", "description": "撰写报告",
         "system_prompt": "写专业报告", "tools": []},
    ],
    store=InMemoryStore(),
    backend=CompositeBackend(
        default=StateBackend(),
        routes={"/memories/": StoreBackend(namespace=lambda rt: (rt.server_info.user.identity,))},
    ),
    system_prompt="""你是研究助手。把进度存到 /memories/research/:
- sources.txt   来源列表
- notes.txt     关键发现
- report.md     报告草稿""",
)

四大机制如何配合

能力 实现 组件
任务规划 自动拆任务 write_todos + TodoListMiddleware
上下文管理 大结果卸载 文件系统 + 自动驱逐(>20k)
专业化 上下文隔离 task + 子代理
持久记忆 混合存储 CompositeBackend + StoreBackend

跑它

result = agent.invoke(
    {"messages": [{"role": "user",
     "content": "研究 2025 年的 agentic 框架,写份报告"}]},
    config={"configurable": {"thread_id": "research-001"}},
)
print(result["messages"][-1].content)

标叔的经验:第一次跑这种多子代理流程,我盯着流式输出看。主 Agent 规划完,把"收集"派给 data-collector,把"写"派给 report-writer。主上下文始终干净。那一刻我真正懂了 §08 说的"隔离"是什么感觉。

标叔的结论:研究助手是 DeepAgents 的"hello world 进阶版"。吃透它,你就吃透了框架。

下一章,介绍开箱即用的终端编程代理:dcode。