Flue useSubagent深度教程:让Agent把任务委托给子专家
【免费下载链接】flueThe sandbox agent framework.项目地址: https://gitcode.com/GitHub_Trending/flue1/flue
Flue 是一个开箱即用的 Agent 沙箱框架,它的useSubagent()Hook 允许你的 Agent 把专注任务委托给独立的"子专家":子代理在全新的上下文中工作,拥有自己的指令与能力,只有最终答案会返回给父 Agent。本教程带你快速掌握 Flue 子代理的声明、委托机制与继承规则,轻松构建分工明确的 AI Agent 团队。
什么是子代理(Subagent)
可以把 Agent 想象成一位"项目经理",而子代理是它手下的专职员工:
- 🏢隔离工作:子代理在自己的全新上下文里干活,不占用父 Agent 的对话历史
- 📨只交结果:只有子代理的最终回答会返回给父 Agent,中间过程完全不可见
- 🤖模型驱动:由父 Agent 的模型自主决定何时、向谁委托任务
三步声明一个子代理
Flue 通过useSubagent()Hook 声明子代理,只需三个必填字段(完整实现见 use-subagent.ts):
| 字段 | 作用 |
|---|---|
name | 子代理的名字,父模型用它来指名委托 |
description | 描述这个专家"做什么、何时用",是模型决策的关键 |
agent | 一个普通 Agent 函数,定义子代理的指令与能力 |
以 hello-world 示例(with-subagent.ts)为例,一个问候专家只需几行:
'use agent'; import { useModel, useSubagent } from '@flue/runtime'; function Greeter() { return 'Write one warm, concise greeting.'; } export function WithSubagent() { useModel('anthropic/claude-sonnet-4-6'); useSubagent({ name: 'greeter', description: 'Writes a short, warm greeting for a named user.', agent: Greeter, }); return 'When asked to greet someone, delegate to the `greeter` subagent.'; }⚠️小提醒:子代理的agent函数(如Greeter)不要导出——构建器会把导出的大写函数注册为顶层 Agent。
委托是如何发生的
委托由框架内置的task工具驱动,流程非常直观:
- 父 Agent 的系统提示词中有一个"Available Agents"目录,列出了所有已声明子代理的名字和描述
- 模型判断某项工作适合某个专家时,调用
task工具并传入子代理名字和任务提示词 - 运行时当场渲染子代理的
agent函数,在独立会话中跑完整个任务 - 子代理的最终消息作为
task工具的结果返回父 Agent
由此带来两个重要特性:
- 📝提示词就是全部简报——子代理看不到父对话,任务提示词必须自包含、信息完整
- ⚡任务天然并行——一批
task调用会并行执行,5 个独立检查可以变成 5 个并行的子会话,各自拥有独立的上下文窗口
子代理继承了什么
子代理默认与父 Agent完全隔离,只继承父级的"环境":
| ✅ 继承 | ❌ 不继承 |
|---|---|
| 沙箱及其工具(read/write/bash…) | 对话历史 |
| 工作区上下文(AGENTS.md、workspace skills) | 父级的指令、工具、技能、子代理 |
| 父级模型与推理强度(可覆盖) | 持久状态与初始数据 |
同时,定义中的两个可选字段可以覆盖继承值:
model—— 让子代理跑更便宜的模型(如把高频分类步骤交给 Haiku)thinkingLevel—— 单独控制子代理的推理强度
子代理内部照常使用useTool()、useSkill(),甚至嵌套useSubagent()(最多4 层)。由于父子共享沙箱,文件是天然的交接面:子代理写report.md,父 Agent 在任务返回后直接读取。
内置通才:GeneralSubagent
不想定义专家、只想把工作"扇出"到全新上下文?Flue 内置了GeneralSubagent(保留名flue-general):
useSubagent(GeneralSubagent);它是一个"白板"代理:共享沙箱工具、工作区上下文和父级模型,但没有任何自带指令——一切靠任务提示词驱动。委托能力是显式开启的,挂载它之后 Agent 才具备扇出能力。
跨 Agent 共享:defineSubagent
同一个专家被多个 Agent 复用时,用defineSubagent()定义一次、处处挂载(与defineTool同构,加载时校验并冻结):
// src/subagents/issue-classifier.ts export const issueClassifier = defineSubagent({ name: 'issue_classifier', description: 'Classifies support issues for routing.', agent: IssueClassifier, }); // 任意 Agent 中挂载,还可按场景区分模型 useSubagent({ ...issueClassifier, model: 'anthropic/claude-haiku-4-5' });什么时候该用子代理
🎯 适合的场景:
- 探索性工作会淹没父上下文但只产出简短结论(代码库调研、日志分析)
- 工作流的某一阶段需要不同的指令、工具或技能
- 多项独立工作可以并行运行
- 某类工作应该跑在更便宜的模型或不同的推理强度上
🚫 不选它的信号:工作确定性强 → 用工具(Tool);只是要给当前 Agent 加指导 → 用技能(Skill);需要外部系统长期给它发消息 → 注册一个真正的 Agent。
💪持久性加分项:子代理任务拥有自己的持久会话流,即使任务中途崩溃或重新部署,也能从自己的记录中恢复并跑完(见 durability.md)。
总结
| 能力 | 一句话 |
|---|---|
useSubagent() | 声明子专家,让模型通过task工具指名委托 |
| 全新上下文 | 隔离对话、只回传最终结果,天然并行 |
GeneralSubagent | 零配置的通才,一键开启扇出能力 |
defineSubagent() | 定义一次、多 Agent 共享,支持按挂载点覆盖模型 |
📚延伸阅读:
- 官方指南:subagents.md
- Hook API 参考:agent-hooks-api.md
- 实战示例:helper.ts、task.ts
【免费下载链接】flueThe sandbox agent framework.项目地址: https://gitcode.com/GitHub_Trending/flue1/flue
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考