前言¶
用 DeepSeek Harness(DSH)跑长时间无人值守任务时,一次瞬态网络错误或上游限流就可能让整轮对话以错误结束、运行直接停掉。Harness 自带 @deepseek-ai/dsh-llm-retry 会执行重试,但次数预算挂在各 provider 适配器的 retryPolicy 上:默认 mode: "normal" 在 maxRetries(当前构建为 5 次)用完后会放弃,步骤失败、回合关闭。若希望「在可接受的退避策略下一直重试,直到成功或你主动停止」,社区插件 dsh-unlimited-retry(维护者 xalor888,npm 包名同插件名,当前版本 2.4.0,MIT 许可证)在 provider 策略之后再加一层,并提供可实时查看状态的 Settings 面板。
这是什么¶
dsh-unlimited-retry 的定位是:在 DeepSeek Harness 的 agent loop 里,对模型请求做无上限重试(可配置退避上限),并附带 live Settings 面板。它是标准 DSH bundle 插件,同一 npm 包同时支持 DSH Web UI 与官方桌面客户端(Electron)。
分类上属于社区目录中的「模型推理」类插件;GitHub 仓库 xalor888/dsh-unlimited-retry 与目录页 skillhub.cn/plugins/xalor888/dsh-unlimited-retry 为独立社区站点条目,与 DeepSeek / 幻方无官方从属关系。
与内置重试的分工¶
插件监听 agent/request-error。该事件在 Cordis 里是 waterfall,最后注册的 listener 在最内层:其它恢复逻辑(内置 provider retryPolicy、上下文溢出压缩、如 dsh-compaction-image-offload 等)先尝试;只有没人救回来的失败才落到本插件。
在默认「provider 5 次重试」下,有效顺序如下:
| 次数 | 处理方 | 行为 |
|---|---|---|
| 1 – 5 | provider 的 retryPolicy |
各自预算、错误码与延迟 |
| 6 – ∞ | 本插件 | 指数退避 + jitter,延迟上限为 maxDelayMs |
内置 mode: "always" 虽可全 provider 一直重试,但是非此即彼,且没有延迟上限;本插件用 maxDelayMs 作为硬顶,并与 provider 的 providerRetryAfterMs 取较小值,避免单次等待无限拉长。
核心功能¶
重试行为¶
- 默认无尝试次数上限,直到请求成功或你取消运行。
- 指数退避 + jitter:从
initialDelayMs起加倍,封顶maxDelayMs;maxDelayMs优先于其它冲突(例如把上限设为 10 ms 就是 10 ms,不会因initialDelayMs更大而被悄悄抬高)。 - 按 step 独立阶梯:新 step 从初始延迟重新开始,不会沿用上一 step 的封顶延迟。
ABORTED(用户取消)永不重试;适配器从未接纳的请求、或 loop 尚未进入 turn 前的失败,不会产生agent/request-error,本插件也不会介入。- 可在无 provider
retryPolicy时仍重试(可开关)。
可观测事件¶
每次计划中的重试会按顺序追加两条事件(与 dsh-llm-retry 一致):
llm/retry— 等待之前,日志里能看到即将发生的等待;llm/retry-started— 等待之后、请求真正重发时。
若因 abort 或插件卸载取消重试,会留下无配对 llm/retry-started 的 llm/retry 记录。事件中 mode 记为 always,policyKey 固定为 unlimited-retry,避免与 provider 预算键冲突。
Settings 面板¶
通过 Harness dsh.client 注入 Web 侧 UI(仅在有 Web 客户端时;headless / ACP / SDK 组合仍可重试,无面板)。面板能力包括:live 状态、重试计数与进行中的等待、有效阶梯展示(诚实标注 No limit)、按失败码与 provider 的统计、最近重试列表、通过 configEditor 写回 profile 的策略编辑(重启后仍保留并热加载 host 侧)、终端错误码列表(可逐项添加或一键应用推荐集)、带确认的计数器重置。样式仅使用 --dsw-alias-* token,随主题切换。
适用范围¶
本插件是 Host 插件,非 preset 插件:对 profile 启动的每个 session、每个 preset 均生效(标准 / ptc / minimal / cordis 等);同一 composition 里 sibling agent 各自维护阶梯;挂载在 preset scope 内的 agent 经 scope-dispatch 测试验证可用。
| 情况 | 是否适用 |
|---|---|
| DSH Web UI | 是(含 Settings) |
| 官方 Electron 客户端 | 是(desktop profile 即 Web 模板) |
| headless / ACP / SDK(无 Web 服务) | 是(仅重试,无面板) |
用户取消 ABORTED |
否 |
环境要求(来自 package.json):Node >=20,DSH >=0.2.0-0 <0.3.0-0。
安装与启用¶
社区目录与 npm 均发布同一产品线;Web 与桌面安装面不同,不要混用 CLI profile。
DSH Web UI¶
在终端对 web profile 安装:
dsh plugin --profile web add dsh-unlimited-retry
安装或更新后需重启 host,浏览器侧建议硬刷新(Linux/Windows:Ctrl+F5;macOS:Cmd+Shift+R)以绕过缓存。
官方桌面客户端(Electron)¶
不要在终端对 desktop profile 执行上述命令。 CLI 会拒绝写入 desktop:
error: profile "desktop" is managed exclusively by the Electron application
用 --profile web 装到的插件桌面窗口读不到,常见现象是 Settings 里根本没有对应页面。
应在桌面客户端会话里让 host 用内置 plugin_manager 安装(作用域为当前 profile,即 desktop)。可先检查是否已安装及版本,需要时可指定 dsh-unlimited-retry@<version>。首次安装后面板仍不出现时,应完全退出客户端(含托盘)再打开,而不是重复安装。
桌面侧原理:desktop profile 由 base + web-app 组成,Electron 加载本地 Web UI URL,dsh.client 面板与 Web 同源加载,无需单独 client 构建。
典型用法¶
- 按上节在对应 surface 安装并重启(或硬刷新 Web)。
- 打开 Harness Settings 中本插件页面,确认 host 半侧状态 pill 正常,按需调整
initialDelayMs、maxDelayMs、无 policy 时是否重试、终端错误码等(写入 profile patch,经configEditor持久化)。 - 启动长时间 agent 运行;遇可重试失败时,先消耗 provider 前 5 次(若配置了
retryPolicy),之后由本插件按阶梯等待并重发;在面板查看计数、最近重试与按码/ provider breakdown。 - 需要停止时正常取消任务即可;
ABORTED不会触发本插件继续重试。
无 Web 时仅 host 重试逻辑生效,行为与有 UI 时一致,只是没有可视化面板。
适用场景与注意¶
适合:无人值守长跑、对偶发网络/限流敏感但不希望整 run 因第 6 次失败就停掉的场景;需要在 Settings 里直观看到重试阶梯与统计的 Web/桌面用户。
务必注意:
- 插件以当前 DSH 进程的权限运行;安装前请自行查看 GitHub 源码 与 MIT 许可证,评估是否纳入你的环境。
- 无上限重试会延长占用时间与 API 调用窗口;应配合
maxDelayMs与终端码配置,避免对明确不可恢复的错误无限等待。 - Web 与 desktop 安装路径不同,装错 profile 是最常见的「装了但没面板」原因。
结尾¶
dsh-unlimited-retry 在 Harness 既有 provider 重试之后补一层有延迟上限的无界重试,并把状态与策略编辑放进 Settings,便于长跑任务在瞬态故障下继续推进。更多信息见社区目录 https://www.skillhub.cn/plugins/xalor888/dsh-unlimited-retry 与仓库 https://github.com/xalor888/dsh-unlimited-retry(含 README.zh.md 简体中文说明)。