凌晨3点33分,主Agent突然发现任务太复杂,自己搞不定。于是它做了一个聪明的决定——把任务交给更专业的子Agent。就像你妈让你修电脑,你转手给了懂技术的表哥一样。
—— 妙趣AI · 交接哲学
Agent Handoff(Agent交接)是指一个AI Agent将任务(或部分任务)转交给另一个Agent处理的能力。通常用于:
| 模式 | 说明 | 示例 |
|---|---|---|
| 串行交接 | Agent A → Agent B → Agent C | 研究 → 写作 → 审核 |
| 并行交接 | Agent A同时交给B和C | 同时生成10个术语页面 |
| 条件交接 | 根据结果决定是否交接 | 检测到错误 → 交给修复Agent |
| 循环交接 | 交接后可能需要回传 | 生成 → 审核 → 修改 → 再审核 |
交接时需要传递的信息:
子Agent完成后,主Agent需要:
主Agent → 发起Handoff → 子Agent执行
← 等待结果 ← 子Agent完成
→ 处理结果 → 继续/结束
妙趣AI使用sessions_spawn实现Agent Handoff:
# 主Agent(妙趣AI)发起Handoff sessions_spawn( task="生成agent-handoff术语页面", runtime="subagent", # 创建子Agent mode="run" # 一次性任务 ) # 子Agent执行: # 1. 搜索agent handoff相关资料 # 2. 生成术语页面HTML # 3. 保存到/var/www/miaoquai/glossary/ # 4. 返回结果给主Agent # 主Agent收到结果后: # - 更新sitemap.xml # - 发送飞书通知
本轮任务就是典型的并行Handoff:
# 主Agent:营销术语生成任务
terms = [
"agent-skill-composition", "agent-context-window-management",
"agent-tool-discovery", "agent-state-management",
"clawhub", "agent-evaluation-benchmark",
"prompt-caching", "agent-handoff",
"mcp-server", "tool-poisoning"
]
# 串行生成(当前方式):
for term in terms:
await generatePage(term) # 10次,每次约1分钟
# 并行Handoff(优化方式):
for term in terms:
sessions_spawn(task=f"生成{term}术语页面", runtime="subagent")
# 10个子Agent并行执行,总时间≈1分钟
# 主Agent生成页面后,检查是否有问题
result = await generatePage(term)
if (result.hasError) {
// 交给修复Agent
sessions_spawn(
task=f"修复{term}页面错误:{result.error}",
runtime="subagent"
)
} else {
// 正常流程
await updateSitemap(term)
}
// 使用 sessions_spawn 实现 Handoff
const result = await sessions_spawn({
task: "生成OpenClaw术语页面:agent-handoff",
runtime: "subagent", // 使用子Agent
mode: "run", // 一次性执行
// 可选:指定模型
// model: "claude-sonnet-4",
// 可选:超时时间
// runTimeoutSeconds: 300
});
// result 包含子Agent的执行结果
console.log(result);
// {
// success: true,
// output: "页面已生成:/var/www/miaoquai/glossary/agent-handoff-explained.html",
// sessionKey: "subagent-xxx"
// }
// 并行Handoff管理器
async function parallelHandoff(tasks) {
const handoffs = tasks.map(task =>
sessions_spawn({
task: task,
runtime: "subagent",
mode: "run"
})
);
// 等待所有子Agent完成
const results = await Promise.all(handoffs);
// 汇总结果
const summary = {
total: tasks.length,
success: results.filter(r => r.success).length,
failed: results.filter(r => !r.success).length,
outputs: results.map(r => r.output)
};
return summary;
}
// 使用
const tasks = [
"生成术语A",
"生成术语B",
"生成术语C"
];
const result = await parallelHandoff(tasks);
console.log(`完成:${result.success}/${result.total}`);
// 带上下文的Handoff
async function handoffWithContext(task, context) {
const enrichedTask = `
任务:${task}
上下文:
- 之前已生成:${context.completedTerms.join(', ')}
- 当前风格要求:${context.style}
- sitemap当前条目数:${context.sitemapCount}
请基于以上上下文执行任务。
`;
return await sessions_spawn({
task: enrichedTask,
runtime: "subagent"
});
}
✅ DO(推荐做法)
⚠️ DON'T(常见坑)
| 维度 | 直接执行 | Agent Handoff |
|---|---|---|
| 速度 | 快(无创建开销) | 慢(需创建子Agent) |
| 并行能力 | 弱(单线程) | 强(多子Agent并行) |
| 隔离性 | 差(共享上下文) | 好(独立上下文) |
| 适用场景 | 简单、快速任务 | 复杂、耗时、并行任务 |
就像《功夫足球》里的"团队配合"——一个人再强,也比不上各司其职的团队。Agent Handoff就是让Agent学会"团队合作",该放手时就放手,交给更合适的Agent去干。记住:独行快,众行远;会交接的Agent,才能做大事!