前言¶
DSH 里 /model 是立刻生效的:一轮还在跑(比如正在等待断联后重试)时切模型,重试就会按新模型发出去,于是「这一轮」被悄悄换成了它开始时不是的那个模型。对于希望每一轮由哪个模型服务都可控、且可复现的工作流来说,这是个隐性的坑。
下面介绍的 dsh-flow-queue 就是针对这个问题的插件:它把提示词投递、模型切换、命令执行、分支、循环都变成一张图里的节点,引擎只在 turn/end 落盘、且该会话的 Agent 空闲时才推进,所以切换永远落在两轮之间。这个插件由 Eclipse-NotFound 维护,属于社区目录里的「工作流」分类,许可证是 MIT。
这是什么¶
一句话定位:给 DeepSeek Harness(DSH)的可视化流程图编辑器,整张画布就住在右侧栏里,没有独立窗口。
把提示词、切换模型、执行命令、条件分支、循环、断点、子代理扇出、跨会话发送/等待画成一张有向图,按连线顺序执行,并且只在轮次边界执行;其上再叠一层「编制视图」(Fleet),管理工作区里协作的会话。
解决的问题:
- 在途请求与它的每一次重试,始终保持它开始时的模型,不会被中途切换打断;
- 模型切换只发生在两轮之间,语义上就是「下一个输入之前」;
- 图上的顺序等于执行顺序,跑到哪一步、结果如何,画布上实时可见。
核心功能¶
九种步骤节点。 每种一步,都在第二行按钮里点一下加到画布:
- 提示词:投递一条用户消息,可带图片与文件附件,也可为这一步单独指定模型;
- 切换模型:在轮次边界把会话切到指定模型,模型声明了思考强度档位时可一并指定;
- 执行命令:运行斜杠命令(
/compact、/plan等,走commands.execute); - 条件分支:按条件选「是 / 否」两条路;
- 循环:满足退出条件或到达最多轮数时走「退出循环」,否则走「再循环」;
- 断点:停下等人按「继续」;
- 扇出子代理:把同一条提示词发给最多 8 个一次性子代理(
spawn后端),每路可强制自己的模型/强度,留空则沿用会话路由;收齐后聚合。聚合方式有三种:全部完成、前 k 个完成(够了就取消慢的)、首个完成。父轮次不受影响,扇出是在轮次边界旁边等,不是跨过它; - 发送消息:把一条消息投给编制里的另一个会话(先落盘、退避重试、同目标严格保序,死信挡住队列直到人工重试);可附带本会话本轮改动的文件清单(仅文件工具写入,盲区如实标注);
- 等待会话:等目标在等待开始后完成一轮并空闲,或等目标最近一轮输出包含标记(默认
[[FLOW:REPORT)。
条件怎么判。 条件对最近一次产出求值:提示词节点看该轮助手输出的文本与工具失败记录;命令节点看命令结果。可选的条件包括 总是成立、正则匹配上一轮输出(多行模式)、包含文本、包含完成标记(默认 [[FLOW:DONE]])、上一轮有工具失败、上一步失败、模型判断(自然语言条件,执行到该步时发起一次极简判定轮,指令约 40 token + 条件原文,要求模型首行只答 YES 或 NO,答不出判该步失败 no-decision),每条都可取反。模型判断不注册全局工具、不改任何会话的工具表;循环里每一轮都重新判定,不复用旧结论。
提示词块的附加能力。 多行文本之外,还可以带图片附件(读为 base64,经宿主 attachments.saveImages 落盘后作为 image content part 发出)与任意文件附件。提示词编辑框沿用了输入框的两个习惯:行首输入 / 弹出可用命令与技能目录,输入 @ 弹出工作区文件引用(@path 语义与原生一致,是文本引用而非内容注入,模型自行读取)。整段文本恰好是一行宿主命令(如只写 /compact)的提示词步骤,执行时按命令运行而不是发给模型。图片/文件单步最多 8 个。
运行状态与安全行为。 状态有 未运行 / 运行中 / 等待继续(断点) / 已暂停 / 已完成 / 出错。三个设计取舍值得一提:
- 不会有幽灵成功:轮次以 error/aborted/interrupted 结束时,该步记失败;
- 不会卡死:提示词被接受但 30 秒内没有新轮次,该步
no-turn失败、整轮标记出错; - 重启安全:进程重启时仍标记为执行中的步骤显示为
interrupted,运行状态转为「已暂停」,不会自己偷偷接着跑。
每个步骤卡片显示状态、耗时、实际服务它的模型(取自该轮 request/header)、错误与命令结果。
流程包。 ⋯ → 流程包 可以把当前图存到 $DSH_PROFILE_DIR/flow-queue/packages/*.json,在任意会话里载入或删除,存的是节点与连线,不含运行状态。流程包可以声明参数变量:在提示词 / 扇出 / 发送文本里写 {{task}},载入时逐个填空;没填的占位符原样保留,绝不会悄悄变成空提示词。内置两个流程包(只写一次、永不覆盖):report-protocol(四态轮末标记的 worker 提示词模板 + 配套等标记步骤)与 superagent-review(superagent 全生命周期一张图:worker 派发 → 四态标记分支验就绪 → 独立 reviewer 评审 → 有界跟进回环 ≤3 轮 → 通过才到交付门,载入填 {{task}} 与 {{ticket}} 两个参数)。
安装与启用¶
官方安装命令就是一条(来自 README,不要凭包名拼接其他形式):
dsh plugin --profile web add github:Eclipse-NotFound/dsh-flow-queue
装完要重启 Harness web 运行时(bundle 在启动时组装),再刷新页面。版本要求为 DSH >=0.2.1-rc.1 <0.3.0(package.json 的 engines.dsh 字段写的也是这个范围)。
验证。 左侧栏底部(设置旁)出现插件图标,悬停显示「打开流程队列」。点这个图标,或点右侧栏开始页里的「流程队列」卡片,右侧栏会出现「流程队列」标签页,画布就在标签页里。标题旁有「流程」和「编制」两个视图切换,本插件大部分日常操作留在「流程」页。
插件在同源下注册 /flow-queue/api/… 路由(如 GET /flow-queue/api/state?sessionId=…、GET /flow-queue/api/models、POST /flow-queue/api/command 等),全部经 ctx.connection.requestRejection 准入,只有已认证的页面能调用。它只保存你自己在每会话里创建的内容(图与流程包目录),不向任何地方发送数据。
典型用法¶
README 给了一个五分钟可跑通的最小流程:提示词 → 切换模型 → 条件分支。步骤如下。
1、加三张卡片。 依次点第二行的 +提示词、+切换模型、+条件分支。最先加入的「提示词」就是流程起点。
2、填写三个步骤。 单击卡片(按下后不拖动)会在画布下方打开检查器抽屉,表头是「编辑步骤」。前提词框里写一条可判定的提示词,例如「用一句话确认你收到这条消息,然后另起一行只输出:FLOW-OK」,按 Ctrl/⌘ + Enter 保存(失焦也会保存),「模型」保持「不设置(沿用当前)」。切换模型卡从「模型」下拉里选目标模型。条件分支里把条件设为「包含文本」,匹配内容填 FLOW-OK。此时三张卡片正文分别显示提示词首行、提供商 / 模型、包含文本 · FLOW-OK。
3、连线。 从提示词卡片右侧的圆点拖到切换模型卡片(或点圆点再点目标卡片),再把切换模型连到条件分支。分支有两个输出圆点「是」「否」。想看清走向,可以再点 +断点 加一张断点卡,把「是」连过去。
4、运行。 点顶栏「开始」。提示词作为一条真实用户消息投进当前会话;那一轮结束之后、下一个输入之前,会话才切到新模型;然后分支对提示词那一轮的回复求值。运行状态先变「运行中」,整条跑完变「已完成」。添加了断点的情况下,回复包含 FLOW-OK 就走「是」停在断点,状态变「等待继续」,点「继续」收尾;不包含则走「否」,流程直接「已完成」,断点卡片保持「待运行」。
两句运行纪律要记住:改图必须在未运行时(运行中会被拒绝,要先点「暂停」或「停止」);再点一次「开始」会清掉各步状态、从头重跑。DEBUG 与恢复时可以单步卡片上直接跑:抽屉表头有「从此步开始」,点 ↓ 收起抽屉。
想复用整条流程时用 ⋯ → 流程包 保存。
适用场景与注意¶
适合谁:
- 想把多步智能体操作(提示词、切模型、跑命令、分流)一次性画好并反复运行,而不是每次手敲;
- 需要严格控制「哪一轮由哪个模型服务」的流程,例如带重试的长轮次不能被中途换模型;
- 想让一步「停下来等人确认」混进自动化流程的(用断点节点);
- 需要把同一个会话的操作发给多个一次性子代理并行处理(扇出节点);
- 多会话协作场景下要把消息从一个会话投给另一个、等它回话再继续(发送消息 / 等待会话)。
注意事项:
- 插件以当前 dsh 进程的权限运行,包括对会话、命令和文件系统的访问能力。安装前,请先读一遍源码(仓库公开,
main分支下的index.js、client.js、cordis.patch.yml)和 MIT 许可证,再决定是否启用; - 它只在 DSH
>=0.2.1-rc.1 <0.3.0范围内声明兼容,版本超出这个区间需要自行验证; - 插件依赖于宿主命令行,只有客户端弹窗的命令(如
/model选择器)不会出现在/菜单里; - 目前尚未实现:图片附件缩略图预览、拖拽排序、多选/框选、撤销重做、超过 8 路的扇出、面板内同屏同时看画布与检查器(窄栏下是二选一,选中步骤时用 ← 返回画布)。
结尾¶
dsh-flow-queue 的价值在于把流程的结构和执行时机都显式化:图上顺序即执行顺序,所有事只在轮次边界发生。整个插件由 Eclipse-NotFound 一人维护,体量不大,单文件代码结构清晰,安装即得一个右侧栏标签页。若它能满足你的工作流需求,源码和安装方式都在下面。
- 社区目录页:https://www.skillhub.cn/plugins/Eclipse-NotFound/dsh-flow-queue
- GitHub:https://github.com/Eclipse-NotFound/dsh-flow-queue