dsh-script-progress:长任务脚本的进度条与里程碑回报

前言

在 DeepSeek Harness(DSH)里让 agent 跑下载、转码、批量处理时,常见局面是:脚本在后台转,聊天里只有转圈,模型和你都不知道还剩多久。本插件不是给界面画悬浮条,而是把「进度必须存在、里程碑必须回报」写进系统提示,并提供 Python / PowerShell / Node 三份零依赖助手,让脚本输出百分比、速率、ETA,并在 10 / 25 / 50 / 75 / 90% 等处用机器可读行和聊天回报对齐预期。

这是什么

dsh-script-progress(社区目录:elosiad/dsh-script-progress)由维护者 Elosiad 发布,归类为工作流类 DSH 插件。仓库:GitHub · Elosiad/dsh-script-progress。

它解决的是「长任务脚本没有硬性进度输出、模型没有硬性回报动作」的问题:提示段落(progress:script,order 9200)规定什么算长任务、脚本要输出什么、怎么跑、怎么报;助手目录落在 $DSH_HOME/script-progress/;里程碑行以 @@PROGRESS 为前缀,便于从 agent 抓到的 stdout 里识别。

界面上的进度展示可与 dsh-task-progress 配合:本插件负责生产 @@PROGRESS 与 JSONL,对方负责画条;二者不互相替代。

核心机制

下面分三块说明插件在 DSH 里实际做了什么。

系统提示段落

插件向系统提示注入 progress:script 段落(默认 order 9200)。其中会渲染助手目录的真实绝对路径,模型写脚本时可直接 sys.path.insert 或等价方式引用,无需每次重写进度条逻辑。

进度助手

激活后会在 $DSH_HOME/script-progress/ 提供 progress.py、progress.ps1、progress.mjs。脚本 import 或 dot-source 后即可使用 track / Progress 等 API。

里程碑约定的一行示例:

@@PROGRESS 25% 12.4it/s eta=00:03 label=下载

输出形态

被 agent 捕获、非 TTY 时约每 0.5 秒一行进度,里程碑单独一行;真实终端则 \r 原地刷新。进度条字符仅用 ASCII(# / -),避免 Windows 重定向 stdout 时的编码问题。任务未跑完就中断时,收尾会标明中止进度,不会谎报 100%。

安装与启用

从 GitHub 安装(仓库本身是可安装的 bundle):

dsh plugin --profile web add github:Elosiad/dsh-script-progress

本地开发可用目录链接:

dsh plugin --profile web add link:/path/to/dsh-script-progress

装完后重启一次 DSH。是否激活可参考(Windows 路径示例):

%USERPROFILE%\.dsh\script-progress\last-activation.json

卸载:

dsh plugin --profile web remove dsh-script-progress

插件在 当前 dsh 进程的权限 下运行;安装前建议通读仓库源码并确认许可证(MIT)。DSH 社区目录站点与 DeepSeek / 幻方无官方从属关系,属于「一切皆插件」生态里的第三方条目。

配置

在插件行的 config: 中修改,重新加载插件后生效。错误配置会当场抛错,不会在日志不明的情况下静默回退默认值。

字段 默认 说明
enabled true 总开关;关闭时该段落渲染为空
minSeconds 20 超过多少秒才算「长任务」(影响提示措辞阈值)
milestones [10,25,50,75,90] 里程碑百分比(1–99);100 由助手自动补
reportInChat true 是否要求逐条回报;关闭则结束时汇总
language zh 段落语言:zh / en
order 9200 段落插入位置
helperDir 空 助手目录覆盖;空则 $DSH_HOME/script-progress
debug false 将渲染段落写入 section.txt

典型用法

路径需换成你本机 $DSH_HOME/script-progress 下的实际目录(提示段落里也会给出渲染后的路径)。

Python

import sys
sys.path.insert(0, r"C:\Users\you\.dsh\script-progress")
from progress import track

for item in track(items, label="下载"):
    fetch(item)

# 或者手动控制
from progress import Progress
p = Progress(total=len(urls), label="下载", unit="req")
for url in urls:
    p.update(note=url)
p.close()

PowerShell

. "C:\Users\you\.dsh\script-progress\progress.ps1"

ForEach-WithProgress -Items $urls -Label '下载' -Unit 'req' -Process {
    param($url)
    Invoke-WebRequest $url | Out-Null
}

Node

const { track, Progress } = await import(
  'file:///C:/Users/you/.dsh/script-progress/progress.mjs'
)

for (const item of track(items, { label: '下载' })) {
  await fetch(item)
}

捕获输出时,里程碑与进度行大致如下(摘自 README):

[ 15%] ###-------------------     120 it/s ETA 00:01 | 下载
@@PROGRESS 25% 123it/s eta=00:01 label=下载
[ 44%] ##########------------     119 it/s ETA 00:01 | 下载
@@PROGRESS 50% 121it/s eta=00:01 label=下载
@@PROGRESS 100% 118it/s elapsed=00:02 label=下载
完成 200 it · 耗时 00:02 · 平均 118 it/s · 下载

两种上报路径

场景 做法 谁写进度
脚本能改 使用本插件助手 助手同时写 stdout 与 JSONL
外部命令无法改(如 ffmpeg、curl) 按 README 使用 DSH_PROGRESS_CLI 包装运行 包装器解析输出中的百分比或计数

不建议为上报再写伴随脚本;能包一层就用包装器或助手即可。

适用场景与注意

适合谁:经常让 agent 生成长耗时循环脚本、又希望在聊天里按时看到里程碑说明的 DSH 用户;需要与 dsh-task-progress 搭配才能在 UI 里看到任务进度条。

前提与边界:

  1. 工具执行期间 agent 循环阻塞时,模型读不到中途输出;提示条款要求长任务放后台跑,这是「能否报进度」的前提,不是风格建议。
  2. 约束主要在提示词层,模型仍可能不严格遵循;不是运行时的强制拦截。
  3. 包升级后首次激活可能覆盖助手目录;自定义助手请设 helperDir。
  4. 进度写入失败会被吞掉,避免进度逻辑拖垮用户脚本。

仓库提供自测入口:node test\smoke.mjs(配置解析、段落渲染、助手落盘与三语言实跑等)。

结尾

dsh-script-progress 把长任务的进度与里程碑回报从「最好有」变成提示与助手共同支撑的惯例:脚本侧有百分比、速率、ETA 和 @@PROGRESS 行,模型侧在约定百分比向用户说明进展。需要界面可视化时,再装显示端插件即可。

  • 目录页:https://www.skillhub.cn/plugins/Elosiad/dsh-script-progress
  • 源码与文档:https://github.com/Elosiad/dsh-script-progress
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye