前言¶
在开发基于 DSH 的智能体应用时,一个常见问题是:当 agent 连续多步只调用工具而不输出任何文字时,用户在界面上看到的只有工具执行的过程,却不知道当前进展到哪一步。对于长任务,这种「闷头干」的状态很容易被误判为卡死,导致用户失去耐心。
多数 agent 的使用约定里都写着「动手前说一句要干什么、每过一个阶段丢一句、出岔子当场说」。这条规矩依赖开发者的自觉,而在长任务场景下,这种自觉最先失效。
dsh-progress 插件通过机器判别「沉默」来解决这个问题。
插件定位¶
dsh-progress 是一个 DSH 工作流插件,由 hzh5021 维护。它的核心作用是:当 agent 连续若干步模型输出里没有任何 text 块时,自动往当前会话里注入一条提醒,让 agent 在下一个被接纳的 step 里看到并采取行动。
它不评价内容好坏,只管「说没说」。同一轮最多提醒 maxPerTurn 次(默认 1),避免刷屏。
核心功能¶
插件只做一件事:统计模型输出里 text 块的连续出现次数。当连续 silentSteps 步(默认 2)没有 text 时,触发提醒。
提醒通过 agent.inject() 注入,消息的 source.kind 为 "plugin:dsh-progress",其他插件和日志可以据此识别来源。同一 session 使用 WeakMap 记账,session 结束后记录自动释放。
插件监听以下事件并更新计数器:
| 事件 | 动作 |
|---|---|
assistant/message 里有非空 text |
沉默计数归零、工具计数归零 |
assistant/message 里没有 text |
沉默计数 +1 |
tool/call |
工具计数 +1 |
turn/start / turn/end |
两个计数与本轮提醒额度一起归零 |
判据只认 text block。reasoning(推理内容)和 tool-call 都不算说话——这正是要治的毛病:模型可以在推理里转几十圈,对用户一个字符不说。结构认不出(字段变了)时当作说过话:宁可漏报,不可误报。
安装与启用¶
官方安装命令:
dsh plugin add hzh5021/dsh-progress
安装后,插件会自动插入到 profile 的插件花名册中。手动安装需要四步:
- 把包放到
~/.dsh/plugins/dsh-progress/目录。 - 在 profile 的
package.json的dependencies里添加"dsh-progress": "file:../../plugins/dsh-progress",并在 profile 的node_modules/下建立同名软链接。 - 在同一份
package.json的dsh.profile.bundles里添加"dsh-progress"。 - 重启 DSH。
插件行由本包的 cordis.patch.yml 自动插入,profile 的 cordis.yml 是生成物,不要手动修改。
配置¶
插件在 profile 的插件行 config: 下覆盖:
- id: progress
name: dsh-progress
config:
enabled: true
silentSteps: 2
maxPerTurn: 1
probeFile: ""
配置项说明:
| 键 | 默认值 | 说明 |
|---|---|---|
enabled |
true |
设为 false 时整个插件不挂任何监听 |
silentSteps |
2 |
连着几步没有 text 就提醒(1–50,越界取边界) |
maxPerTurn |
1 |
每轮最多提醒几次(0–20;0 = 只盯着不出声) |
probeFile |
"" |
调试用:非空就往这个文件追加诊断行,最多 400 行;默认关闭 |
典型用法¶
假设有一个长任务,agent 需要调用多个外部工具,但模型在推理过程中不会主动输出进度。启用 dsh-progress 后,当连续两步输出只有工具调用而没有文字时,插件会自动注入一条提醒:
[plugin:dsh-progress] 检测到连续 2 步无文本输出,建议输出进度或状态
agent 在下一个被接纳的 step 里看到这条提醒后,可以选择输出一段进度文字,或根据实际情况决定是否继续执行。同一轮内,最多只会触发一次提醒,避免刷屏。
插件只认 text block。如果宿主修改了内容块结构,插件会退化成「当说过话」——不报错,也不再提醒。
适用场景与注意¶
这个插件适合需要长时间运行、工具调用密集的场景,例如需要多次查询外部数据、进行复杂推理的任务。
使用时需要注意:
- 插件以当前 dsh 进程权限运行,安装前应检查源码与许可证。
- 只管「不说话」,不管「一个工具跑了十分钟没结果」。
- 判不出「说了话,但通篇是交作业」。
- subagent 会话不管(那是临时会话)。
- 任何异常都吞掉并记日志:提醒失败绝不能打断正在跑的轮次。
结尾¶
dsh-progress 通过简单的计数逻辑,解决了长任务中「沉默」带来的可见性问题。它不依赖外部模块,只使用 Node 内置功能,降低了维护成本。
如果你正在开发基于 DSH 的智能体应用,并且需要让长任务在沉默时主动报进度,可以参考:
- 目录页:https://www.skillhub.cn/plugins/hzh5021/dsh-progress
- GitHub:https://github.com/hzh5021/dsh-progress