第三幕 · 可插拔能力 / 10 委派与扩展(子代理/工作流)
0%
第三幕 · 可插拔能力 · 第 10 章

委派与扩展(子代理/工作流)

子代理、后台任务、工作流脚本、技能 SOP —— 主 agent 的四种「扩展自己」的玩法。

🤝开场小故事:一个人的公司

你是一家一人公司。活儿多起来后,你发现不能什么都自己干——有的活要花很久,有的活可以并行,有的活有固定的流程。一个人加班到凌晨三点?那是因为你还没学会当老板。

于是你开始:招实习生(子代理,独立上下文干独立任务)、把长活挂后台(jobs,边干别的边等)、写批处理脚本(workflow,大规模派活)、给员工发岗位手册(skill,复用型说明书)。这正是 dsh 主 agent 的扩展之道——老板动动嘴,员工跑断腿。

一句话讲清楚:主 agent 通过 subagent(子代理)、jobs(后台任务)、 workflow(编排脚本)把工作派出去,再用 skill / goal / plan / todo 这些「软能力」把协作方式定下来。
委派示意图:主 agent 派生子代理、后台任务与工作流
图 10-1 三种「派活」方式 + 四种「软能力」。

① 子代理(subagent)—— 招实习生

subagent seam 让一个 agent 把工作委派给子 agent(可选的扩展能力,不属于 agent loop 本身)。 子代理有独立的上下文 —— 主 agent 不会被一堆细节撑爆上下文。

  • 一次委派(subagent_fork):独立跑一件任务,拿一个结果回来(默认前台);
  • 可延续委派(subagent):一份持久化的子会话,可以跨轮继续 —— 后续用 send_message 续派、interrupt_agent 打断、list_agents 盘点;
  • 提供方:进程内 spawn/fork(走父级 ctx 创建)、进程外 ACP / Codex / Claude Code / dsh-sdk (远程传输,把一轮委派交给另一个产品)。

fork 还有一个贴心细节:它会把父级的「平衡的已完成轮次前缀」作为种子注入子会话 —— 子代理开局就「知道」前面聊了啥。

② 后台任务(jobs)—— 挂后台排队

长时间运行的活(bash、子代理委派)可以登记到 ctx.jobs 后台任务注册表 (id 形如 bash-3subagent-1,状态 running / completed / killed / failed……), 主对话继续干别的,稍后用三个工具读取:

text
job_list     # 看看有哪些后台任务在跑
job_output   # 读某个任务的输出(可等待)
job_kill     # 终止某个任务

③ 工作流(workflow)—— 写批处理脚本

workflow 工具让模型写一个 JS 编排脚本(纯 JS、顶层 await、最后 return 一个 JSON), 在 worker 线程引擎里跑,脚本里可以扇出大量子代理。四个核心钩子:

js
phase('审计')                              // 开始一个阶段
const 结果 = await parallel([               // 并发跑,等全部完成(屏障)
  () => agent('审 A', { schema }),          // 跑一个子代理
  () => agent('审 B', { schema }),
])
const 流水 = await pipeline(条目, 阶段1, 阶段2) // 每项过各阶段(无屏障)
log('进度汇报')
return 结果.filter(Boolean)                  // 最终 JSON 结果

官方指引:一两次委派用普通 subagent 就够了,大规模扇出才用 workflow。 还有固定形态的 ralph 工具:每轮启动全新子代理(无对话种子), 共享工作区当长期记忆,轮间只传一份有界结构化交接报告 —— 适合需要「换个人重新想」的任务。

注:上面脚本为便于理解而写的示意代码,并非官方文档原文;钩子名称与语义均属实(agent / pipeline / parallel / phase / log / return JSON)。

④ 软能力:skill / goal / plan / todo

能力一句话
skill(技能)复用型「岗位说明书」(SOP):目录由 ctx.skills 合并提供方,tool-skill 在会话开头注入目录、按需加载正文。技能是「可选的指令」,工具是「可调用的动作」。
goal(目标)附着在会话上的持久完成目标(active/paused/blocked/complete + Goal Round 上限),事件溯源,按修订号演进;Goal Round = 一次由目标触发的轮次。
plan(计划模式)「先交方案再动手」的软性指引状态:激活期间每个请求携带 plan 指引段,注册 exit_plan_mode 工具收尾。
todo(待办)任务清单:todo_write 每次调用整体替换,写全量 todo/write 会话事件,UI 渲染成 checklist。
💡什么时候用哪个?

一件独立任务 → subagent;需要长期合作、来回派活 → 可延续 subagent + 控制工具; 很多件并行/流水线 → workflow;想换全新视角反复迭代 → ralph; 长时间跑 → 挂 jobs 后台;反复用到的方法 → 沉淀成 skill

费曼自查

1一次委派和可延续委派有什么区别?
参考:一次委派(subagent_fork)= 独立跑一件任务拿一个结果(默认前台);可延续委派(subagent)= 一份持久化子会话,可跨轮继续,用 send_message 续派、interrupt_agent 打断、list_agents 盘点。
2什么时候用 workflow 而不是普通 subagent?
参考:一两次委派用普通 subagent;大规模扇出(很多子任务并行/流水线/分阶段)才用 workflow 脚本 —— 它用 agent()/pipeline()/parallel()/phase() 编排。
3skill 和 tool 的区别?
参考:skill 是可选的指令(复用型任务说明书,注入到提示词上下文);tool 是模型可调用的动作。技能是「教你怎么做」,工具是「替你做」。
4Goal Round 和「轮次」有什么关系?
参考:Goal Round 是目标策略的一次续行周期,会被具体化为一个由目标触发的轮次(可含零或多个步骤)。Round 计数器归目标策略所有,不统计会话里每个普通轮次。