前言¶
在 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。