dsh-pipeline
Multi-node workflow orchestration plugin for DeepSeek Harness (dsh) 适合需要自动化多步骤、多模型路由复杂工作流的用户,需dsh版本不低于0.2.0-rc.1。
같은 패키지 이름의 다른 저장소
설치
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:yuluo554/dsh-pipelinedsh-pipeline
DeepSeek Harness(dsh)多节点工作流编排插件 —— 回应官方讨论 #7704: 把"每轮对话手动换模型、挂技能、贴提示词、复制上一步结果"的重复流程, 定义成一份可复用、可进 git 的 JSON 流水线,一条命令编译并运行。
每个节点独立声明 prompt / model / skills,节点间自动传递输出,失败有策略、 取消能干净退出;Web 端提供零手写 JSON 的表单编辑器与运行入口, 会话流内实时渲染节点链运行卡(逐节点状态、耗时、token 用量、双模型成本对比)。
社区第三方插件,非官方出品。要求 dsh ≥ 0.2.0-rc.1(npm
next标签)。
特性
- 流水线即文件:定义存放在工作区
.dsh/pipelines/.json,纯 JSON、可审查、可分享(FR-1) - 确定性编译:定义 → IR → 官方 workflow 引擎脚本(普通 JS,无 eval),快照逐字节冻结(FR-2)
- 节点级模型路由:每节点独立
provider/model,成本敏感场景可把大纲/成文路由到不同档位(FR-6) - 节点内多条 prompt:
prompts[]顺序投递,中间结果经{{prev}}链式传递(FR-7) - 跨节点模板变量:
{{input}}、{{}}、{{prev}}自动注入上游输出(FR-4/T4) - 显式 DAG:
dependsOn覆盖隐式串接,支持汇聚;引用缺失/环/自依赖编译期拒绝(FR-2) - 结构化输出:节点级
outputSchema(引擎 schema 子集),下游可安全插值(FR-2) - 技能注入:节点级
skills[]经ctx.skills解析内容进提示词,缺技能 fail-loud(FR-10) - 失败策略:节点级
abort(默认)/skip/retry:n,流水线级默认策略(FR-9) - 取消传播:会话中断/AbortSignal 经引擎共享 signal 传播到全部受管子 agent,干净结算(FR-8)
- 能力探测先行:provider 缺
agentOptions/outputSchema通路时运行前给可读错误,绝不静默降级(FR-12) - Web 编辑器:设置区流水线列表 + 表单式节点编辑(模型下拉读 catalog、技能注入说明),零手写 JSON(FR-13)
- 运行入口页:选流水线 + 填输入 + 一键运行,发起后进会话流看运行卡(FR-13)
- 实时运行卡:
pipeline-run会话节点卡——节点链状态徽章、每节点耗时/token、双模型用量对比徽章(FR-14/15) - 错误信息 en/zh:插件配置
locale,默认 en - 编译期闸门(fail-loud,不静默忽略):节点级
tools路由与model.reasoningEffort—— 当前引擎 seam 不提供对应通路(见限制)
架构
双半包(host lib/ + client bundle),全部走官方 seam:
flowchart LR
subgraph def["定义(可复用文件)"]
A[".dsh/pipelines/*.json"]
end
subgraph host["宿主半 lib/"]
S["schema 校验"] --> IR["IR + 编译器"]
IR --> |"普通 JS 脚本(无 eval)"| R["runner
能力预检 + 结果映射"]
end
subgraph client["客户端半 client bundle"]
E["设置区编辑器
列表 + 表单节点编辑"]
P["运行入口页"]
C["pipeline-run 运行卡
状态/耗时/token/成本徽章"]
end
A --> S
E -->|"store RPC
/api/dsh-pipeline/*"| S
P -->|"POST /run"| R
R --> W["workflow-ptc 引擎
(共享沙箱 PTC 运行时)"]
W --> AG["子 agent × N
每节点独立 model / skills"]
W -. "workflow/agent-start|end" .-> REC["run-recorder"]
REC -. "session.append 持久日志" .-> C
- 命令/工具入口:
/pipeline list|show|run用户命令(不经模型轮次)与面向模型的pipeline工具(参数{name, input}),均在会话内发起,产物经官方引擎运行; 子 agent 继承父会话工作区 - 运行卡事件通路:与官方 tool-workflow 同款——宿主 recorder 监听引擎事件,写父会话
持久日志(
pipeline-run/run-start|agent-start|agent-end|run-end),浏览器从日志重放纯折叠; 事件断连/重连后卡片不脏渲染。token 聚合自子会话 usage,成本徽章按声明路由分组(含失败尝试的真实开销) - bundle 契约:懒 CJS
window.__ModuleLoader__.load,external 仅平台种子表 + locale 包; 插件 bundle patch 只翻转 web profile 默认禁用的workflow-ptc引擎开关,官方面向模型的workflow工具保持原样,两者共存
快速开始
前置要求
- Node ≥ 20
- dsh ≥ 0.2.0-rc.1(0.2.0-rc.1 在 npm
next标签:npm i -g @deepseek-ai/dsh@next;latest仍指 0.1.x,无法运行本插件) - 已配置可用的模型 provider(子 agent 走 dsh 自身模型配置;本插件不内置任何 key)
安装
dsh plugin --profile web add dsh-pipeline
包内含预构建产物,安装即用,无需本地构建。安装时插件的 bundle patch 会自动启用
web profile 默认禁用的 workflow-ptc 引擎(本插件是它的专用消费方)。
定义第一条流水线
把下面的 JSON 存为工作区 .dsh/pipelines/three-node-two-models.json
(大纲用便宜路由、复查走默认路由、成文用 reasoner):
{
"name": "three-node-two-models",
"description": "Outline on the cheap route, review on the parent route, write on the reasoner route.",
"nodes": [
{
"id": "outline",
"label": "Outline",
"prompts": ["Write a concise bullet-list outline for a short article about {{input}}."],
"model": { "provider": "deepseek", "model": "deepseek-chat" }
},
{
"id": "review",
"label": "Review",
"prompts": ["Review the outline for factual risks. Return numbered revision notes.\n\n{{outline}}"]
},
{
"id": "write",
"label": "Write",
"prompts": ["Write the final short article about {{input}}.\n\nOutline:\n{{outline}}\n\nNotes:\n{{review}}"],
"model": { "provider": "deepseek", "model": "deepseek-reasoner" }
}
]
}
定义格式完整字段(prompts[] / model / skills / dependsOn / outputSchema /
failurePolicy / retry / options.defaultFailurePolicy)见
data/pipelines/ 的 7 份示例与 GitHub 仓库
plan/03-模块详设.md。
运行
/pipeline list # 列出已保存流水线
/pipeline show # 打印定义 + 校验状态
/pipeline run three-node-two-models # 直接运行(不经模型轮次)
或直接对模型说"用 three-node-two-models 流水线写一篇关于 ×× 的文章",
让模型调用 pipeline 工具发起;也可在 Web 端 设置 → 流水线 的运行入口页选流水线一键运行。
运行发起后会话流内出现实时运行卡:节点链状态徽章、每节点耗时与 token、双模型用量对比。
本地开发回路(从源码)
git clone
cd dsh-pipeline
pnpm install && pnpm build
# 在本仓库的父目录执行(相对路径 link 安装):
dsh plugin --profile web add ./dsh-pipeline
dsh --profile web --dump-config # 应可见 "# == dsh-pipeline" 层 + workflow-ptc enabled
卸载:dsh plugin --profile web remove dsh-pipeline(层消失、注册随 effect 注销)。
内置基准评测
全部离线可重复(零 API 依赖、零模型调用),pnpm bench 一条命令出全部指标:
| 基准 | 输入 | 判据 | 当前指标 |
|---|---|---|---|
| B1 编译快照 | data/pipelines/*.json(7 份) | 编译输出与 data/snapshots/ 逐字节一致 | 7/7,0 diff |
| B2 校验矩阵 | data/invalid/*.json(15 份)+ 合法集 | 按冻结清单接受/拒绝且错误码正确 | 22/22,100% |
| B3 mock 引擎 e2e | mock WorkflowEngine × 4 场景 | agent() 调用参数序列 + 事件序完全匹配;取消后无残留调用 | 4/4,完全匹配 |
| B4 策略矩阵 | 注入失败节点 × abort/skip/retry × 6 场景 | 各策略结果/事件序符合语义(skip 置 null 继续;retry 节点级重跑、耗尽按策略收场;取消打断重试不失控) | 6/6,完全匹配 |
测试套件(pnpm test)共 101 例,全部离线:B1-B4 断言 + 真实 PTC 引擎(取消/策略)+
真实 Session 集成(运行卡事件族落盘/重建/卸载兼容)+ form-model/web/client-bundle +
脱敏守门(工作区 + 全历史)。
快照真值冻结口径见 data/README.md。
限制
- 节点级
tools路由与model.reasoningEffort编译期显式拒绝:官方 workflow 引擎 guest 的 agent 选项仅接受 label/phase/schema/provider/model,seam 无 toolFilter 通路 (实测 0.2.0-rc.1 仍如此);Web 编辑器对这两类字段只读展示,round-trip 无损保留 - provider 能力依赖:模型路由与结构化输出依赖 provider 的
agentOptions/outputSchema通路;不支持的 provider(如部分 ACP 后端)运行前报可读错误,不做 workaround - 单会话编排:流水线在触发它的会话内运行,不做跨会话/定时/无人值守调度;
不做图形化拖拽画布;不替代官方
workflow工具与 agentTeams - Web 发起的运行若宿主崩溃,运行卡停留 running(无 run-end 事件;不引入墙上时钟 误报长节点——诚实停留优于虚报 interrupted)
- 成本徽章按声明路由分组:取自定义里声明的
provider|model;走默认路由的节点 实际模型可能与徽章分组不同(徽章文案按"声明路由"表述) - 只支持
dsh.compatibility.dsh锁定的 preview 线(≥ 0.2.0-rc.1);preview 期 API 可能变动
免责声明
- 本项目为社区第三方插件,与 DeepSeek 官方无关;
#7704是本项目的需求来源 - 流水线运行会创建真实子 agent 并消耗真实 token(含失败与重试尝试);成本自行评估
- 项目不内置、不代理任何模型 API key;所有模型流量走 dsh 自身的凭据配置
- 软件按 MIT 许可提供,不附带任何担保;请在自己的账户与数据上自行评估风险
已知环境问题
实测记录(Windows + Git Bash + dsh 0.2.0-rc.1):
- dsh 0.2.0-rc.1 在 npm
next标签,latest仍指 0.1.x——装 dsh 本体时注意标签; 本插件的 patch 行指向workflow-ptc,在 0.1.x 上引擎无法启用、插件会 pending 不激活 - Windows Git Bash 下
npm i -g可能段错误(npm 包装脚本崩溃):改用node "/node_modules/npm/bin/npm-cli.js" i -g直跑 - 验装捷径:
dsh --help不加载插件;验证安装用dsh --profile web --dump-config(可见层与 workflow-ptc enabled)或后台启动抓 apply 日志 - Node 进程偶发原生崩溃(V8 unreachable / 0xC0000005,构建或测试期):同命令重试即过, 与代码无关;崩溃无业务输出 ≠ 测试失败,重试后再定性
开发
pnpm install
pnpm build # tsc -> lib/ + esbuild client bundle
pnpm test # node:test,99 例,全离线
pnpm bench # B1-B4 指标表(ALL GREEN 门槛)
pnpm lint # host + client 双 tsconfig
pnpm release:audit # 脱敏审查:文件名门 + 内容级扫描 + 全历史扫描(发布门,随测试运行)
仓库导览:src/ 宿主半(schema/ir/compiler/runner/web/entry/run-events/run-recorder)、
client/ 客户端半(编辑器/运行页/运行卡)、data/ 基准 fixtures 与冻结快照、
scripts/ 构建/冻结/基准脚本、plan/ 全套任务编排文档(需求→架构→详设→测试→里程碑→决策记录)
与各里程碑演示留档。