DeepSeek Harness 实战工作流:把 dsh 搭成全自动工作台
生命不息,折腾不止。系列收官篇——把前几篇的模型、插件、多 Agent、MCP 全串起来,让 dsh 从「会聊天的工具」变成一个能自己按时干活的自动化工作台。
一、收官:一张完整工作台的拼图长啥样
从 8 月 22 号到现在,这个系列已经把 dsh 的核心能力走了一遍:
- 接模型:装好 dsh、接中转站、换模型(
settings.yaml) - 写插件:
apply(ctx)+defineTool,给 Agent 加自己的工具 - 多 Agent:
subagent/subagent_fork派活,主 Agent 当项目经理 - 外部工具:
dsh-mcp-client一个 yaml 接一个 MCP server
但能力是散的。真正的工作台,得把这些串成一条自动流转的流水线:定时触发 → 拆任务 → 多 Agent 并行 → 汇总 → 落盘。这一篇就干这件事,核心是三样东西:workflow(编排)、dsh-schedule(定时)、jobs/goal(长任务管理)。
二、workflow 工具:agent / pipeline / parallel 三个原语
workflow 工具(@deepseek-ai/dsh-tool-workflow)是 dsh 官方的多 Agent 编排器。它让模型执行一段纯 JS 编排脚本,脚本里用三个原语把活分发出去,最后把脚本的返回值交回主 Agent:
agent():跑一个子 Agent,返回它的最终文本(或一个经过 schema 校验的对象);子 Agent 失败/出错时返回null,所以脚本里记得过滤pipeline():把一批条目按阶段流水线式推进——条目 A 在第三阶段时,条目 B 可能还在第一阶段,各走各的parallel():并发屏障——所有任务都跑完才继续,适合「一起开跑、最后汇总」
一句话选型:独立小任务用普通 subagent;一两个子任务别动用 workflow;大量扇出(并行抓取、并行审计)才上 workflow。官方给的最小例子长这样:
1 | // workflow 工具的 script 参数:纯 JS,支持顶层 await |
注意 agent() 的第一个参数就是给子 Agent 的任务描述,label 只是给人看的标签。并行派出去三个「采集员」,最后把成功的结果(非 null)过滤出来汇总。
三、用 workflow 跑一次真活:并行采集 + 汇总
把上面那个例子套到真实场景——每天产出一份「AI 领域快讯」。改成三个子 Agent 各管一个方向:
1 | async function main(args) { |
跑完你拿到的就是三份结构化结果。想让日报更规整,还可以在后面再接一个 agent() 做「总编」:把 parts 拼成一段带标题分节的日报。这里多提一嘴成本:多 Agent 扇出最烧 token 和并发,模型端如果指向 ai.aklibk.com 这种 OpenAI 兼容中转接口,多模型按场景切换、按量计费,跑批量的性价比会高不少(国产框架卖点就是「多模型对接 + 便宜」,不是别的那套)。不用就跳过。
四、定时任务 dsh-schedule:让工作台自己转起来
workflow 负责「怎么干」,定时还得靠另一个插件。官方内置的 schedule 工具偏「定时提醒」,真要按 cron 自动触发 Agent 干活,社区的 dsh-schedule(csiroqa 维护,MIT 协议)是成熟方案:到点自动创建一次性 Agent、跑任务、把会话日志落盘。
装它(需要 Node >= 22 和 pnpm):
1 | git clone https://github.com/csiroqa/dsh-schedule.git |
装好后,在会话里用斜杠命令管理任务:
1 | /schedule add 0 9 * * * 每天上午9点总结昨天的进展 |
cron 是标准的五段式,字段顺序 minute hour day month week,0 9 * * * 就是每天 9 点。任务记录持久化在 $DSH_HOME/schedule.json(原子写入),单次任务默认 30 分钟超时保护,防挂死。
把第三节的 workflow 任务描述塞进 /schedule add,每天早上 9 点它就会自动开工——这才是「全自动工作台」的最后一块拼图。
五、长任务收尾:jobs / goal / ralph 各管什么
工作台跑起来后,还有三个「管家」要认识,它们职责不同,别用混:
- jobs:
job_list/job_output/job_kill——统一的后台任务注册表,不管任务是 bash 后台命令还是后台子 Agent,都能查、能取结果、能杀。 - goal:会话级的长期目标,带 phase 和 round cap(轮次上限)。这个上限很关键——一个没边界的目标,是让 Agent 账单失控的最快方式。
- ralph:为一个固定目标反复迭代的循环——每一轮开一个全新子 Agent,不继承上一轮对话上下文,只传一份有界的交接报告,靠共享工作区当长期记忆。适合「目标稳定、需要一轮轮试错推进」的活。
一句话记忆:workflow 是你写脚本、脚本调度一批 Agent;ralph 是目标不动、每轮换个全新 Agent 继续推。多数场景 workflow + schedule 就够用了,ralph 留给真正的长程迭代任务。
六、总结与踩坑速查
到这儿,dsh 系列收官:模型、插件、多 Agent、MCP、工作流、定时任务全部走通,一张「能自己按时干活」的自动化工作台就搭起来了。最后把这一篇的坑列清楚:
- 一两个子任务别上 workflow:直接
subagent就行,workflow 留给大批量扇出,省得绕远路。 - 脚本里记得
.filter(Boolean):agent()失败返回null,不过滤会带着null继续往下跑。 - pipeline 和 parallel 别混:parallel 是「全部跑完再继续」的屏障;pipeline 是「各条目独立走完各阶段」,阶段间不互相等。
- 定时任务是无值守执行的:它拿着当前 dsh 账号的权限跑,能读写文件、执行命令——只加你信得过的任务描述。
- 别把 dsh 端口暴露到公网:dsh 默认只绑本机(loopback),
/dsh-schedule/*这些端点也只监听本机,公网裸奔会出大事。 - 长期目标设 round cap:没有轮次上限的 goal 是账单黑洞。
生命不息,折腾不止。DeepSeek Harness 系列到此完结。下一篇开新坑——《Claude Code 实战系列》第一篇:从安装配置到把命令行 AI 变成你的自动化搭子,咱们下回见。