subagents 参数中指定自定义子智能体。子智能体适用于上下文隔离(保持主智能体的上下文整洁)和提供专业化指令。
本页涵盖同步子智能体,即主管阻塞直到子智能体完成。对于长时间运行的任务、并行工作流,或需要中途控制和取消的场景,请参见异步子智能体。
为什么使用子智能体?
子智能体解决上下文膨胀问题。当智能体使用产生大量输出的工具(网络搜索、文件读取、数据库查询)时,上下文窗口会快速被中间结果填满。子智能体隔离这些详细工作——主智能体只接收最终结果,而不是产生它的数十个工具调用。 何时使用子智能体:- 多步骤任务会使主智能体的上下文变得混乱
- 需要自定义指令或工具的专业领域
- 需要不同模型能力的任务
- 当您希望让主智能体专注于高层协调时
- 简单的单步骤任务
- 当您需要保持中间上下文时
- 当开销超过收益时
配置
subagents 应是字典列表或 CompiledSubAgent 对象列表。有两种类型:
默认子智能体
深度智能体自动添加一个同步general-purpose 子智能体,除非您已提供同名的同步子智能体。
- 要替换它,传入您自己名为
general-purpose的子智能体。 - 要重命名或重新提示自动添加的版本,在活动的harness 配置文件上设置
general_purpose_subagent=GeneralPurposeSubagentProfile(...)。 - 要禁用它,请参见下方不使用子智能体运行。
不使用子智能体运行
要运行没有task 工具的智能体,需要做两件事:
- 在活动的 harness 配置文件上设置
general_purpose_subagent=GeneralPurposeSubagentProfile(enabled=False)。 - 不通过
create_deep_agent的subagents=传入同步子智能体。
SubAgentMiddleware(和 task 工具)。既没有默认的也没有调用者提供的时,智能体在没有委派的情况下运行。
异步子智能体不受影响——它们通过自己的中间件和工具流转,详见异步子智能体。
SubAgent(基于字典)
对于大多数使用场景,将子智能体定义为匹配SubAgent 规范的字典,包含以下字段:
CompiledSubAgent
对于复杂的工作流,使用预构建的 LangGraph 图作为CompiledSubAgent:
使用 SubAgent
使用 CompiledSubAgent
对于更复杂的使用场景,您可以使用CompiledSubAgent 提供自定义子智能体。
您可以使用 LangChain 的 create_agent 或通过图 API 创建自定义 LangGraph 图来创建自定义子智能体。
如果您创建自定义 LangGraph 图,请确保图具有名为 "messages" 的状态键:
流式输出
流式传输追踪信息时,智能体名称可在元数据的lc_agent_name 中获取。
审查追踪信息时,您可以使用此元数据来区分数据来自哪个智能体。
以下示例创建了一个名为 main-agent 的深度智能体和一个名为 research-agent 的子智能体:
"research-agent" 的子智能体将在任何关联的智能体运行元数据中包含 {'lc_agent_name': 'research-agent'}:

结构化输出
子智能体支持结构化输出,因此父智能体接收的是可预测、可解析的 JSON,而非自由格式文本。子智能体的结构化输出需要
deepagents>=1.8.4。responseFormat。当子智能体完成时,其结构化响应被 JSON 序列化并作为 ToolMessage 内容返回给父智能体。模式接受 createAgent 支持的任何内容:Zod 模式、JSON 模式对象、toolStrategy(...) 或 providerStrategy(...)。
response_format 时,父级接收子智能体的最后消息文本原样。使用后,父级始终获得匹配模式的有效 JSON,当父级需要程序化处理结果或将其传递给下游工具时很有用。
有关模式类型和策略(工具调用 vs 提供商原生)的完整详细信息,请参见结构化输出。
通用子智能体
除了任何用户定义的子智能体外,每个深度智能体始终可以访问一个general-purpose 子智能体。此子智能体:
- 与主智能体具有相同的系统提示
- 可访问所有相同的工具
- 使用相同的模型(除非被覆盖)
- 当配置了技能时继承主智能体的技能
覆盖通用子智能体
在subagents 列表中包含名为 "general-purpose" 的子智能体以替换默认值。使用此方法为通用子智能体配置不同的模型、工具或系统提示:
enabled 标志设置为 False。
何时使用它
通用子智能体适用于无需专业行为的上下文隔离。主智能体可以将复杂的多步骤任务委派给此子智能体,并获得简洁的结果返回,而不会有来自中间工具调用的膨胀。示例
主智能体不会自己进行 10 次网络搜索并用结果填满上下文,而是委派给通用子智能体:
task(name="general-purpose", task="Research quantum computing trends")。子智能体在内部执行所有搜索并只返回摘要。技能继承
使用create_deep_agent 配置技能时:
- 通用子智能体:自动继承主智能体的技能
- 自定义子智能体:默认不继承技能——使用
skills参数赋予它们自己的技能
只有配置了技能的子智能体才会获得
SkillsMiddleware 实例——没有 skills 参数的自定义子智能体不会。存在时,技能状态双向完全隔离:父级的技能对子级不可见,子级的技能不会传播回父级。最佳实践
编写清晰的描述
主智能体使用描述来决定调用哪个子智能体。要具体: 好:"Analyzes financial data and generates investment insights with confidence scores"
差: "Does finance stuff"
保持系统提示详细
包括关于如何使用工具和格式化输出的具体指导:最小化工具集
只给子智能体它们需要的工具。这提高了专注度和安全性:按任务选择模型
不同的模型擅长不同的任务:返回简洁结果
指示子智能体返回摘要而非原始数据:常见模式
多个专业子智能体
为不同领域创建专业子智能体:- 主智能体创建高层计划
- 将数据收集委派给 data-collector
- 将结果传递给 data-analyzer
- 将洞察发送给 report-writer
- 编译最终输出
上下文管理
当您使用运行时上下文调用父智能体时,该上下文会自动传播到所有子智能体。每次子智能体运行都会收到您在父级invoke / ainvoke 调用中传入的相同运行时上下文。
这意味着在任何子智能体内运行的工具可以访问您提供给父级的相同上下文值:
每子智能体的上下文
所有子智能体接收相同的父上下文。要传递特定于某个子智能体的配置,使用命名空间键(为键加上子智能体名称前缀,例如researcher:max_depth)在扁平的 context 映射中,或者将这些设置建模为上下文类型的独立字段:
识别哪个子智能体调用了工具
当同一工具在父级和多个子智能体之间共享时,您可以使用lc_agent_name 元数据(与流式输出中使用的相同值)来确定哪个智能体发起了调用:
runtime.context 读取智能体特定的设置,从 runtime.config 元数据读取 lc_agent_name 来分支工具行为。
故障排除
子智能体未被调用
问题:主智能体试图自己做工作而不是委派。 解决方案:-
使描述更具体:
-
指示主智能体进行委派:
上下文仍然膨胀
问题:尽管使用了子智能体,上下文仍然填满。 解决方案:-
指示子智能体返回简洁结果:
-
对大数据使用文件系统:
选择了错误的子智能体
问题:主智能体为任务调用了不适当的子智能体。 解决方案:在描述中清晰区分子智能体:通过 MCP 连接这些文档到 Claude、VSCode 等以获取实时解答。

