动态子代理允许一个代理从解释器代码中调度子代理。该代理可以使用 JavaScript 循环、条件分支和并行批处理来将工作路由到已配置的子代理并综合结果,而不是要求模型一次选择一个子代理调用。 当工作跨越许多独立单元、需要多重视角或受益于递归分析时,请使用此模式。关于通用解释器设置,请参阅解释器。
动态子代理使用解释器运行时,该功能处于Beta 版。API 和生命周期行为可能在版本之间发生变化。
解释器需要 langchain-quickjs>=0.2.0 和 Python >=3.11。

快速入门

动态子代理需要解释器中间件。请先安装并连接解释器。内置的通用子代理无需额外配置即可处理基本的扇出操作。
python
:::
“workflow”(工作流)一词是一个有用的触发器。 解释器系统提示将 “workflow” 视为一个信号,用于组织通过解释器的工作,使用代码中的 task() 来调度子代理,而不是通过一次由模型选择的工具调用来逐步处理项目。将请求表述为 “workflow” 是您可以主动选择启用动态编排的一个明确手段。如需进行单次、直接的委派,请改用简单直接的措辞。
与 dcode(LangChain 的终端编码代理)一起使用动态子代理?dcode 启用了代码解释器,因此动态子代理开箱即用。有关设置和使用详情,请参阅 dcode 子代理页面。

工作原理

当一个代理拥有子代理和解释器中间件时,解释器会公开一个内置的 task() 全局函数,用于从代码中调度子代理。跨越许多独立单元的任务(检查目录中的每个文件、分类处理一批工单)变成一个扇出工作的循环,从而可以确定性地运行,而不是一次由模型选择一个工具调用。 子代理编排还支持递归语言模型(RLM)工作流,这是在递归语言模型论文中描述的方法:将工作集保存在解释器变量中,选择切片,使用 task() 调用子代理,并综合结果。 许多编排工作流将动态子代理与程序化工具调用(PTC)结合使用:使用解释器代码中的 tools.* 来发现或筛选输入,然后使用 task() 调度子代理。PTC 默认是关闭的;通过在解释器中间件上设置显式的允许列表来启用它。 task() 是进入子代理执行的能力桥梁,类似于用于工具的 PTC。有关隔离默认值、审批边界和中间件选项,请参阅安全性和配置。
在使用 mode="thread"(默认值)时,多轮编排可以在代理轮次之间持久化解释器变量。有关详情,请参阅解释器页面上的持久化部分。
task() 接受以下输入:
  • description:给子代理的提示
  • subagentType:要运行哪个已配置的子代理
  • responseSchema(可选):结构化输出
task() 运行一个完整的代理循环并解析为子代理的结果:
当你传递 responseSchema 时,解析后的值已经是一个类型化的 JavaScript 对象;仅当子代理故意返回了一个 JSON 字符串时才调用 JSON.parse。

模式

代理根据任务的形态选择策略;这些策略源于其编写解释器代码的方式,而非源于配置,而您提供的子代理决定了它能做什么。每种模式都共享相同的编排方法:将工作保存在 JS 变量中,使用 task() 调度子代理,并在代码中组合结果。下图展示了常见的形态,每种都附带一个可运行的示例。

分类与执行

首先对项目进行分类,然后根据分类结果由专门的子代理处理每个项目。这允许您处理混合输入,其中不同的项目需要不同的专业知识。 用例: 分类处理支持工单、错误日志、用户反馈或任何需要根据类型进行不同处理的项目批。
您配置的内容
Google
OpenAI
Anthropic
OpenRouter
Fireworks
Baseten
Ollama
代理编写的代码

扇出与综合

代理并行地跨多个项目调度同类工作,然后合并结果。 用例: 跨目录的代码审查、分析一批文档、处理日志文件、跨多个服务运行相同检查。 从解释器代码中发现文件需要程序化工具调用(PTC)。在解释器中间件的 PTC 允许列表中启用 glob。
您配置的内容
代理编写的代码

对抗性验证

一种两遍模式。第一遍产生发现结果。第二遍将每个发现结果发送给独立的验证者,只有通过共识的发现结果才会被保留。当置信度比速度更重要时,这可以减少误报。 用例: 误报代价高昂的安全审计、合规性检查、任何需要对结果有高度信心的审查。
您配置的内容
代理编写的代码

生成与筛选

多个子代理针对同一问题生成独立的解决方案。代理在代码中比较、评分和筛选结果,只保留最佳结果。 用例: 架构提案、重构策略、内容变体,以及在提交之前探索多个选项能产生更好结果的任务。
您配置的内容
代理编写的代码

锦标赛

变体由一个裁判子代理进行一对一比较,获胜者在淘汰赛中晋级。 用例: 在主观标准下的优化、样式选择、在竞争性的实现之间做出选择。
您配置的内容
代理编写的代码

循环直至完成

代理运行一个发现循环,针对已找到的内容进行去重,直到没有新结果出现。当工作范围事先未知时很有用。 用例: 穷尽搜索、死代码检测、依赖审计,以及任何需要完整性而非固定数量结果的扫描。
您配置的内容
代理编写的代码
task() 从一个已经运行的 eval 调用内部调度。它不经过常规的工具调用路径,因此父代理上的 interrupt_on 审批工作流不会针对每次调度强制执行。如果您需要在子代理编排运行之前进行审批,请对 eval 工具本身设置门控。

禁用动态子代理

只要代理拥有子代理,子代理调度默认就是开启的。如果您希望子代理仅通过常规的 task 工具路径可用,请禁用它。有关其他中间件选项,请参阅解释器页面上的配置部分。

另请参阅

  • 解释器:QuickJS 设置、程序化工具调用、持久化、安全性和中间件配置
  • 子代理:配置子代理的名称、描述和系统提示
  • 事件流:从协调器和委派的子代理流式传输更新