dsh-unlimited-retry:为 DSH 智能体循环提供无上限模型请求重试

前言

用 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 一致):

  1. llm/retry — 等待之前,日志里能看到即将发生的等待;
  2. 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 构建。

典型用法

  1. 按上节在对应 surface 安装并重启(或硬刷新 Web)。
  2. 打开 Harness Settings 中本插件页面,确认 host 半侧状态 pill 正常,按需调整 initialDelayMs、maxDelayMs、无 policy 时是否重试、终端错误码等(写入 profile patch,经 configEditor 持久化)。
  3. 启动长时间 agent 运行;遇可重试失败时,先消耗 provider 前 5 次(若配置了 retryPolicy),之后由本插件按阶梯等待并重发;在面板查看计数、最近重试与按码/ provider breakdown。
  4. 需要停止时正常取消任务即可;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 简体中文说明)。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye