dsh-retry-panel:DSH 设置里的「断线重试」与多层自动恢复

前言

在 DeepSeek Harness(DSH)里跑长任务时,失败往往不在「模型完全不可用」,而在限流窗口、流中断、截断或压缩吞轮这类可恢复断档。DSH 自带的 dsh-llm-retry 默认大约 5 次、总共约 16 秒退避;遇到 tpm_exceeded 这类需要分钟级窗口的错误,重试耗尽后整轮失败,界面只留下「本轮运行失败」,还要自己发「继续」。Amer-CN 维护的 dsh-retry-panel(npm 包名 dsh-auto-retry)在设置页提供一张 「断线重试」 卡片,把请求级重试、同轮续写、回合级自动继续、压缩吞轮恢复、可选看门狗和备用模型切换串成一条恢复链,尽量在同一回合或保留上下文的后续回合里接上,而不是每次断线都从零手动干预。

这是什么

dsh-retry-panel 是 DSH 生态里的模型推理类插件,仓库 Amer-CN/dsh-retry-panel,当前版本 0.6.2(MIT)。它在 Host 设置里增加可保存即生效的配置面板,并配合 Host 侧逻辑写入各 provider 的 retryPolicy,同时监听会话事件做自动继续与冷启动扫描。分类上属于「模型推理」;社区目录页见 skillhub.cn 条目。

它解决什么问题

典型触发是服务返回 429 或流失败,例如:

429: {"code":"capacity_exceeded","message":"model capacity exceeded: tpm_exceeded"}

除限流外,README 还列举了若干更隐蔽的情况:输出被 max-tokens 截断需手动「继续」、流挂起无报错、上下文压缩吞掉整轮却显示 completed、网关把瞬时 429 写成 insufficient_quota 被 DSH 归为 QUOTA 导致内置重试直接放弃。本插件针对这些路径设计了分层恢复,并在永久性错误(如 AUTH、CONTEXT_WINDOW_EXCEEDED)上停止空转。

核心功能

下面按 README 中的恢复顺序说明各层在做什么。

1. 请求级重试(四档「耐心」)

保存设置时,插件把「耐心」写入 llm-pi-ai 各 provider 与 llm-deepseek 顶层的 retryPolicy,并显式补上易漏错误码(含 QUOTA)。退避从 1s 起、60s 封顶、±20% 抖动。

选项 行为 适合
普通 最多重试 10 次,约 5 分钟 日常断流
长任务 最多重试 40 次,约 35 分钟 出门前挂任务
死磕 mode: always,一直重试到成功 整晚挂机
关闭 maxRetries: 0 自行控制

首次安装时,若所有 provider 尚无 retryPolicy,Host 会自动应用当前档位;只要任一 provider 已有自定义 retryPolicy,插件不会覆盖。

2. 同轮截断续写

开启「输出被截断时也继续」后,在 max-tokens 截断时于 agent/turn-stopping 阶段通过 agent.steer() 注入续写指令,尽量在同一回合接着输出;单轮最多续写 3 次,超限后放行 turn/end,由回合级继续兜底。

3. 回合级自动继续

一轮因临时性错误彻底失败后:等待可配置秒数(默认 5,连续失败按 2 倍递增,封顶 10 分钟),再以用户身份发送「继续」开新回合并保留上下文;默认最多连续 5 次,成功一轮清零。手动发消息或点停止会立刻让位;仅主智能体生效。跨重启会从持久会话历史倒推连续失败次数,与内存计数取较大值。若失败前最后一次工具调用尚无结果,自动继续文案会附加幂等提示,避免重复有副作用的操作。

4. 模型故障转移(可选)

开启「主模型失败时切换备用模型」后,在可继续的失败上可通过 sessionController.agents.selectForNextRequest() 把下一轮请求切到备用列表中的下一个模型;备用来自 DSH 真实模型目录下拉选择(v0.6),失败过的备用默认冷却 5 分钟(healthCooldownSec 可调)。只影响本会话下一轮请求,不改全局默认模型。

5. 冷会话恢复

宿主重启后,插件启动约 2 秒会扫描最近 10 分钟内活跃的持久会话(单次最多 5 个),对可恢复的失败或孤儿回合尝试唤醒并补发继续;默认开关为开。

6. 压缩吞轮恢复

识别「仅有压缩检查点、无 assistant 输出与工具调用却 completed」的回合,补发「按最近的检查点继续动手」类消息。

7. 卡住看门狗(默认关)

开启后,若一轮超过设定秒数(默认 180)无流输出或事件,会取消当前请求并交给回合级自动继续;超长工具调用可能被误判,需自行权衡。

安装与启用

按 DSH bundle 方式安装,不要手写裸 - id: 覆盖条目。

1、进入 profile 目录并添加依赖:

cd ~/.dsh/profiles/desktop        # 或 web
pnpm add github:Amer-CN/dsh-retry-panel

2、在同一 package.json 的 dsh.profile.bundles 中加入包名:

{
  "dsh": {
    "profile": {
      "bundles": [
        "@deepseek-ai/dsh-base",
        "@deepseek-ai/dsh-web-app",
        "dsh-auto-retry"
      ]
    }
  }
}

若 DSH 版本支持从 GitHub 安装插件,也可使用:

dsh plugin --profile desktop add github:Amer-CN/dsh-retry-panel

装完后重启或重载 DSH;Web 端刷新页面,桌面端重新打开应用。

兼容方面:dsh.engines.dsh 要求 >=0.2.1-rc.1;README 注明在 0.2.1-rc.5(2026-10-30)实测。需要带 settings / configEditor 的 desktop / web profile,headless 下静默跳过。

典型用法与设置项

日常用法是打开 DSH 设置,找到 「断线重试」 卡片,按任务长度选择「重试耐心」,并按需打开自动继续、截断续写、冷会话恢复或备用模型。保存后立即生效,无需重启 Host。

常用默认值(均可于面板调整):

设置 默认 说明
重试耐心 普通 普通 / 长任务 / 死磕 / 关闭
回合失败后自动发送「继续」 开 回合级总开关
等待秒数 5 0~600;连续失败递增,封顶 10 分钟
最多连续 5 1~50,成功一轮清零
继续时发送 继续 支持 {code} {kind} {attempt} {tool}
主模型失败时切换备用模型 关 需配置备用列表
重启后恢复被中断的任务 开 扫描最近 10 分钟内失败/孤儿会话
输出被截断时也继续 开 同轮续写 + 跨轮兜底
卡住不动时自动重来 关 看门狗
卡住判定秒数 180 30~600

实现上,重试策略保存后会 POST /api/auto-retry/apply,由 Host 在独立任务里 settings.mutate 写入 retryPolicy;浏览器端仅访问同源路由,不直接请求模型供应商。运行时除 @deepseek-ai/schemastery@3.18.5 外无其它外部依赖;插件不读写文件、不持久化 API Key,配置由 DSH settings 管理。

适用场景与注意

适合经常在 DSH 里挂长任务、又常遇到 429、断流、截断或压缩吞轮的开发者。「死磕」档会不限次数重试直到成功或你手动停止,Permanent 类错误仍不会无限续命。自动继续是重开一轮而非续写半段回答;故障转移需显式配置备用模型,健康冷却表在内存中、重启清空。冷会话扫描只看最近 10 分钟、最多 5 个会话。

DSH 插件与 Host 同进程权限运行,安装前建议阅读仓库源码与 LICENSE;安全报告方式见仓库 SECURITY.md。SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-retry-panel 把限流与断流上的「等一会儿再试」和任务断档上的「自动继续」收到一张设置卡里,并用四档耐心、同轮续写与可选故障转移减少手动点「继续」的次数。目录页:https://www.skillhub.cn/plugins/Amer-CN/dsh-retry-panel;源码与完整说明:https://github.com/Amer-CN/dsh-retry-panel。

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

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

小夜