Skip to content
On this page

4.核心组件详解

4.1总体概述:

(1)中间件技术

通过 Middleware(中间件)机制,可以以插件形式为 Agent 动态扩展可用工具。例如:TodoListMiddlewareFilesystemMiddlewareSubAgentMiddleware 等。其中:FilesystemMiddleware 提供的文件读写等工具,可直接配置给主 Agent 使用;SubAgentMiddleware 则允许将子代理(SubAgent)注册为主 Agent 可调用的工具。当主 Agent 调用某个 SubAgent 时,SubAgent 会以独立的 Agent 方式执行任务,从而形成一个 多级 Agent 协作体系,能够处理更加复杂、层次化的问题。

(2)大模型作为工具被调用

将模型的特定能力封装为可调用工具,例如 write_todos

write_todos 工具:让大模型创建和管理to list 列表;

他的功能并不是在write_todos内部完成的,而是在根据根据工具的描述,让模型生成合适参数,就完成了功能。 这个是值得学习的一个技巧。

(3)subAgent作为工具被调用

SubAgent 自身是一个完整的 Agent,可以作为“工具”被主 Agent 调用。这种“代理调用代理”的机制允许构建层级式智能体网络,形成递归调用结构。

形成多级调用可以处理更复杂的问题。

4.2状态(State)

在 DeepAgent 中,State 是智能体的记忆载体。 它用于保存执行过程中产生的各种上下文信息(如任务进度、文件状态、计划列表等),从而支持跨步骤、多层次的连续推理。

python
class Todo(TypedDict):
    """Todo to track."""

    content: str
    status: Literal["pending", "in_progress", "completed"]

定义 to do list类型, status 只能取 "pending", "in_progress", 或 "completed" 中的一个

python
class FileData(TypedDict):
    """Data structure for storing file contents with metadata."""

    content: list[str]
    """Lines of the file."""

    created_at: str
    """ISO 8601 timestamp of file creation."""

    modified_at: str
    """ISO 8601 timestamp of last modification."""

FileData 是一个 TypedDict(类型化字典),定义了文件数据的结构,content为文件的内容,created_at为文件创建时间,modified_at为文件最后修改时间

python
def _file_data_reducer(left: dict[str, FileData] | None, right: dict[str, FileData | None]) -> dict[str, FileData]:
    if left is None:
        return {k: v for k, v in right.items() if v is not None}

    result = {**left}
    for key, value in right.items():
        if value is None:
            result.pop(key, None)
        else:
            result[key] = value
    return result
python
class DeepAgentState(AgentState):
    todos: NotRequired[list[Todo]]
    files: Annotated[NotRequired[dict[str, str]], file_reducer]

DeepAgentState 继承自 AgentState,代表一个复杂智能体(DeepAgent)的运行状态。_file_data_reducer 是用于合并状态的函数。当多个状态(例如不同代理分支的结果)被整合时,它决定同名字段 files 的合并方式。字段 files 是一个可选的文件字典,用于存储文件内容及其元数据;在状态合并过程中,会由 _file_data_reducer 自动处理文件的新增、更新与删除逻辑。

python
class PlanningState(AgentState):
    todos: NotRequired[list[Todo]]

定义 PlanningState,只保留了 todos 字段。

python
class FilesystemState(AgentState):
    """State for the filesystem middleware."""

    files: Annotated[NotRequired[dict[str, FileData]], _file_data_reducer]
    """Files in the filesystem."""

定义 FilesystemState,专门处理“文件系统”相关状态,只保留了files字段。

每种 State 只关注特定功能(如规划或文件操作),从而实现模块化设计。

4.3工具(Tools)

工具(Tool)是 Agent 与外部世界交互的核心手段。 DeepAgent 使用装饰器 @tool 注册工具,并通过描述(description)告诉模型如何使用它。

示例:write_todos

python
@tool(description=WRITE_TODOS_TOOL_DESCRIPTION)
def write_todos(
    todos: list[Todo], tool_call_id: Annotated[str, InjectedToolCallId]
) -> Command:
    return Command(
        update={
            "todos": todos,
            "messages": [
                ToolMessage(f"Updated todo list to {todos}", tool_call_id=tool_call_id)
            ],
        }
    )

write_todos工具用于在 Agent 的状态里更新 todos(任务列表)。

参数:

todos:要更新的任务列表,类型是前面定义的 Todo(带 content 和 status)

tool_call_id:工具调用的唯一 ID,用于追踪是哪一次工具调用产生的消息

返回值:

返回一个 Command 对象,告诉 Agent 系统如何更新状态(state)

python
WRITE_TODOS_TOOL_DESCRIPTION = """Use this tool to create and manage a structured task list for your current work session. This helps you track progress, organize complex tasks, and demonstrate thoroughness to the user.
It also helps the user understand the progress of the task and overall progress of their requests.
Only use this tool if you think it will be helpful in staying organized. If the user's request is trivial and takes less than 3 steps, it is better to NOT use this tool and just do the taks directly.

## When to Use This Tool
Use this tool in these scenarios:

1. Complex multi-step tasks - When a task requires 3 or more distinct steps or actions
2. Non-trivial and complex tasks - Tasks that require careful planning or multiple operations
3. User explicitly requests todo list - When the user directly asks you to use the todo list
4. User provides multiple tasks - When users provide a list of things to be done (numbered or comma-separated)
5. The plan may need future revisions or updates based on results from the first few steps. Keeping track of this in a list is helpful.

## How to Use This Tool
1. When you start working on a task - Mark it as in_progress BEFORE beginning work.
2. After completing a task - Mark it as completed and add any new follow-up tasks discovered during implementation.
3. You can also update future tasks, such as deleting them if they are no longer necessary, or adding new tasks that are necessary. Don't change previously completed tasks.
4. You can make several updates to the todo list at once. For example, when you complete a task, you can mark the next task you need to start as in_progress.

## When NOT to Use This Tool
It is important to skip using this tool when:
1. There is only a single, straightforward task
2. The task is trivial and tracking it provides no benefit
3. The task can be completed in less than 3 trivial steps
4. The task is purely conversational or informational

这是该工具的描述,具体介绍了何时使用以及如何使用该工具

python

class PlanningMiddleware(AgentMiddleware):
    state_schema = PlanningState
    tools = [write_todos]

介绍下这个工具的用法,这是规划中间件,具体的应用会在后续讲解,该中间件职责是让模型能生成和管理“待办任务”(ToDo)列表。他注册一个工具 write_todos,让模型可以调用它来写入或更新待办任务。同时中间件会根据 WRITE_TODOS_SYSTEM_PROMPT,来合理的使用 write_todos。

核心原理:

  • 工具的逻辑本身非常简单(仅返回更新命令),
  • 真正的“任务分解与生成”由模型通过描述来完成。

也就是说:模型并不直接执行代码,而是根据工具描述自动生成参数,让工具完成操作。这种模式把模型从“执行者”转变为“指挥者”,实现了“模型驱动工具,工具驱动状态更新”的闭环。

其他工具:

ls 、read_file、write_file、edit_file,glob、grep这些都是对于文件的操作工具

4.4中间件(Middleware)

控制和自定义每个步骤的代理执行。中间件提供了一种更严格地控制代理内部发生的事情的方法。核心代理循环涉及调用模型,让它选择要执行的工具,然后在它不再调用工具时完成,中间件在每个步骤之前和之后都公开钩子。

这比传统工具机制更强大,因为它能:

  • 监控 模型行为(日志记录、调试分析)
  • 修改 模型输入输出(如重写提示词、注入额外上下文)
  • 控制 执行流(重试、回退、提前终止)
  • 增强 模型功能(为 Agent 添加自动规划、任务跟踪、文件系统等能力)

使用方法:通过将中间件传递给 :create_agent

python
class PlanningMiddleware(AgentMiddleware):
    state_schema = PlanningState
    tools = [write_todos]

该中间件让模型具备「规划与任务管理」能力。它注册了 write_todos 工具,并在系统提示(system prompt)中加入指令,使模型能够自动生成、更新和追踪任务清单。

设计优势: 传统工具必须显式调用,而中间件可以在不修改主流程的情况下动态插入逻辑, 因此非常适合实现像 “自动规划”、“文件交互”、“子代理管理” 这类跨层级功能。

4.5子代理(Subagent)

SubAgent 是 DeepAgent 最具创新性的部分之一。它允许一个 Agent 把另一个 Agent 作为工具调用,形成递归的代理结构。

  • 每个 SubAgent 都是一个独立智能体,拥有自己的模型、工具和中间件。
  • 主 Agent 可以通过调用子代理来“委派任务”,子代理完成后将结果返回。
  • 这种机制使得系统可以不断分解任务,形成树状或链式任务执行结构。

核心优势:

  1. 层次化任务分解 主 Agent 只负责规划和分配任务,复杂问题可被递归拆解。
  2. 高并发执行 多个 SubAgent 可并行工作,最终结果自动合并。
  3. 理论上可无限嵌套 SubAgent 可以再次调用 SubAgent,形成无限层级调用链,实现复杂的自组织智能。

这种模式让 DeepAgent 从“单体大模型”演化为“多智能体协作系统”,为复杂问题求解提供了新的架构基础。