生命不息,折腾不止。系列收官篇——把前几篇的模型、插件、多 Agent、MCP 全串起来,让 dsh 从「会聊天的工具」变成一个能自己按时干活的自动化工作台。

一、收官:一张完整工作台的拼图长啥样

从 8 月 22 号到现在,这个系列已经把 dsh 的核心能力走了一遍:

  • 接模型:装好 dsh、接中转站、换模型(settings.yaml
  • 写插件apply(ctx) + defineTool,给 Agent 加自己的工具
  • 多 Agentsubagent / 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
2
3
4
5
6
7
8
9
// workflow 工具的 script 参数:纯 JS,支持顶层 await
async function main(args) {
const items = await parallel([
() => agent('Scrape site A', { label: 'A' }),
() => agent('Scrape site B', { label: 'B' }),
() => agent('Scrape site C', { label: 'C' }),
])
return items.filter(Boolean)
}

注意 agent() 的第一个参数就是给子 Agent 的任务描述,label 只是给人看的标签。并行派出去三个「采集员」,最后把成功的结果(非 null)过滤出来汇总。

三、用 workflow 跑一次真活:并行采集 + 汇总

把上面那个例子套到真实场景——每天产出一份「AI 领域快讯」。改成三个子 Agent 各管一个方向:

1
2
3
4
5
6
7
8
async function main(args) {
const parts = await parallel([
() => agent('搜索今天 AI 大模型领域的重要新闻,挑 3-5 条,每条一句话总结', { label: 'news' }),
() => agent('搜索今天 AI Agent / 智能体相关的开源项目和工具更新,挑 3 个', { label: 'agent' }),
() => agent('搜索今天 DeepSeek 官方及社区的重要动态,挑 3 条', { label: 'deepseek' }),
])
return parts.filter(Boolean)
}

跑完你拿到的就是三份结构化结果。想让日报更规整,还可以在后面再接一个 agent() 做「总编」:把 parts 拼成一段带标题分节的日报。这里多提一嘴成本:多 Agent 扇出最烧 token 和并发,模型端如果指向 ai.aklibk.com 这种 OpenAI 兼容中转接口,多模型按场景切换、按量计费,跑批量的性价比会高不少(国产框架卖点就是「多模型对接 + 便宜」,不是别的那套)。不用就跳过。

四、定时任务 dsh-schedule:让工作台自己转起来

workflow 负责「怎么干」,定时还得靠另一个插件。官方内置的 schedule 工具偏「定时提醒」,真要按 cron 自动触发 Agent 干活,社区的 dsh-schedule(csiroqa 维护,MIT 协议)是成熟方案:到点自动创建一次性 Agent、跑任务、把会话日志落盘。

装它(需要 Node >= 22 和 pnpm):

1
2
3
4
5
6
git clone https://github.com/csiroqa/dsh-schedule.git
cd dsh-schedule
pnpm install
pnpm build
dsh plugin --profile web add link:$(pwd) # Windows 用 link:E:\path\to\dsh-schedule
dsh web # 重启后浏览器 Ctrl+F5 硬刷新

装好后,在会话里用斜杠命令管理任务:

1
2
3
4
5
6
/schedule add 0 9 * * * 每天上午9点总结昨天的进展
/schedule list # 查看任务
/schedule run # 立即跑一次
/schedule pause # 暂停
/schedule remove # 删除
/status # 看进程、CPU、内存、会话、Agent、插件、模型状态

cron 是标准的五段式,字段顺序 minute hour day month week0 9 * * * 就是每天 9 点。任务记录持久化在 $DSH_HOME/schedule.json(原子写入),单次任务默认 30 分钟超时保护,防挂死。

把第三节的 workflow 任务描述塞进 /schedule add,每天早上 9 点它就会自动开工——这才是「全自动工作台」的最后一块拼图。

五、长任务收尾:jobs / goal / ralph 各管什么

工作台跑起来后,还有三个「管家」要认识,它们职责不同,别用混:

  • jobsjob_list / job_output / job_kill——统一的后台任务注册表,不管任务是 bash 后台命令还是后台子 Agent,都能查、能取结果、能杀。
  • goal:会话级的长期目标,带 phase 和 round cap(轮次上限)。这个上限很关键——一个没边界的目标,是让 Agent 账单失控的最快方式。
  • ralph:为一个固定目标反复迭代的循环——每一轮开一个全新子 Agent,不继承上一轮对话上下文,只传一份有界的交接报告,靠共享工作区当长期记忆。适合「目标稳定、需要一轮轮试错推进」的活。

一句话记忆:workflow 是你写脚本、脚本调度一批 Agent;ralph 是目标不动、每轮换个全新 Agent 继续推。多数场景 workflow + schedule 就够用了,ralph 留给真正的长程迭代任务。

六、总结与踩坑速查

到这儿,dsh 系列收官:模型、插件、多 Agent、MCP、工作流、定时任务全部走通,一张「能自己按时干活」的自动化工作台就搭起来了。最后把这一篇的坑列清楚:

  1. 一两个子任务别上 workflow:直接 subagent 就行,workflow 留给大批量扇出,省得绕远路。
  2. 脚本里记得 .filter(Boolean)agent() 失败返回 null,不过滤会带着 null 继续往下跑。
  3. pipeline 和 parallel 别混:parallel 是「全部跑完再继续」的屏障;pipeline 是「各条目独立走完各阶段」,阶段间不互相等。
  4. 定时任务是无值守执行的:它拿着当前 dsh 账号的权限跑,能读写文件、执行命令——只加你信得过的任务描述。
  5. 别把 dsh 端口暴露到公网:dsh 默认只绑本机(loopback),/dsh-schedule/* 这些端点也只监听本机,公网裸奔会出大事。
  6. 长期目标设 round cap:没有轮次上限的 goal 是账单黑洞。

生命不息,折腾不止。DeepSeek Harness 系列到此完结。下一篇开新坑——《Claude Code 实战系列》第一篇:从安装配置到把命令行 AI 变成你的自动化搭子,咱们下回见。