前言¶
在 DeepSeek Harness(DSH)里跑 Agent,任务往往要连续多轮请求模型。网络抖动、代理重启、供应商 5xx、流中断或 429 限流,都会在界面里留下一条失败终态;内置的 @deepseek-ai/dsh-llm-retry 只覆盖短窗口内的几次抖动,分钟级配额或回合已经断在中间时,仍需要有人手动点重试或换模型。dsh-auto-rerun 是社区维护者 good-saltfish 发布的宿主插件(分类:模型推理),专门接管「断连类」失败:同回合内长退避重试、可选回合级 followup 续跑、可选换路线,并在右侧栏展示状态与可调参数。下面介绍它的定位、三层机制、安装与配置要点。
这是什么¶
dsh-auto-rerun(npm 包名同名,当前发布版本 1.8.5,MIT 许可证)挂在 DSH 的 Cordis 插件体系上,监听 agent/request-error 与 agent/error 等事件。当失败被判定为断连类(而非 401/403、400、上下文超长等「重试无意义」的错误)时,插件在会话内继续尝试,而不是立刻把终态抛给用户。它与内置重试互补:内置层做供应商 retryPolicy.normal 下的短退避;本插件做长窗口、限流专用退避、retryUntilSuccess 一直试到成功,以及 Layer B/C 的续跑与选模型(后者默认关闭)。
核心机制:三层互补¶
README 用 Layer A/B/C 说明行为边界,与内置 @deepseek-ai/dsh-llm-retry 不冲突。
Layer A:请求级接管¶
触发条件:瀑布下游在内置重试预算耗尽或无 provider policy 后让出终态,且失败属于断连类。插件追加自己的重试,返回 { kind: 'retry' }。
- 普通断连:默认最多 3 次接管,退避 5s 起、最大 60s,指数系数 2,jitter 20%。
- 限流(429、
RATE_LIMIT、tpm exhausted):单独使用 30s→60s→120s→180s 的长窗口,避免短退避反复撞墙。 - 若响应头有
Retry-After,或失败文本含retry in ~3s、retry_after: 5、请 3 秒后重试等(honorMessageRetryHint默认开),按服务端指示等待,优先于固定窗口。
默认 retryUntilSuccess: true:同一模型、同一会话内,只要不是「死路」(401/403、订阅过期、key 失效、永久没额度),就持续重连直到成功;退避仍有封顶,不会打爆端点。连续 retryUntilSuccessMaxMs(默认 7200000 ms,即 2 小时)仍无成功请求时,把错误交还宿主,避免路线彻底坏掉却永远静默重试。关闭 retryUntilSuccess 则回到计数与时间预算制(如 busyRouteBudgetMs)。
Layer B:回合级续跑¶
请求仍终态失败且触发 agent/error,且失败码不在 rerunExcludeCodes(默认含 RATE_LIMIT)时,延迟 rerunDelayMs(默认 3s)后自动 agent.followup,让 Agent 新开回合从中断处续跑。连续自动续跑上限默认 reruns: 1。限流类默认只走 Layer A 静默重试,不向会话发可见续跑消息。
Layer C:选模型重试(默认关)¶
自 1.6.0 起 modelFallback.enabled 默认为 false。开启后,同一路线预算用尽或 retryUntilSuccess 模式下连续失败超过 fallbackAfterMs,或出现死路信号时,可换 provider/model 再试;死路路线进入约 30 分钟黑名单。单次事故最多换 fallbackMaxSwitches(默认 2)次。换路线优先走宿主 selectForNextRequest,会话里会出现 [model changed: …];拿不到该服务时才在 agent/request 外层改写 provider/model。候选顺序:fallbackRoutes → 同 model id 的另一 provider → 本进程已见过的路线 → 目录其余模型。
断连类如何判定¶
任一命中即视为断连类:loop 失败码(默认 EMPTY_RESPONSE、RATE_LIMIT、SERVER、TIMEOUT、TRANSPORT);POSIX errno(如 ECONNRESET、ETIMEDOUT);HTTP 408/425/429/500/502/503/504 及消息正则(socket hang up、fetch failed、rate limit 等)。可通过 codes、extraCodes、statusSet、messagePattern 调整。
右侧栏操作面板¶
插件通过 dsh-better-sidebar 在 Web 宿主右侧栏注册「自动重跑」页(client.js)。状态区展示版本、运行时长、当前路线、接管重连/续跑/换路线等计数与最近活动;开关区可改 retryUntilSuccess、modelFallback、debug;数字区可改 retries、reruns 等,失焦或回车提交。修改作用于运行中的配置,若配置了 settingsFile(默认 ${DSH_HOME:-~/.dsh}/auto-rerun-settings.json)会持久化;写空字符串则仅内存。
安装与启用¶
插件已发布到 npm,也可从 GitHub Release 安装 tgz。安装后新会话即生效;已在跑的会话建议重启 DSH 以便宿主插件重新挂载。
从 npm 安装(任意 DSH 会话里):
plugin_manager install_bundle "dsh-auto-rerun"
从 GitHub 发布包安装(不依赖 npm,示例为 v1.8.5):
plugin_manager install_bundle "https://github.com/good-saltfish/dsh-auto-rerun/releases/download/v1.8.5/dsh-auto-rerun-1.8.5.tgz"
本地开发调试:
plugin_manager install_bundle "<你本机的仓库路径>"
也可在 Plugin Manager 页面手动安装本地目录。运行环境要求 Node.js >= 20;package.json 声明 DSH 引擎 >=0.1.7-rc.1,peer 依赖 @deepseek-ai/cordis ^4.0.1。
配置入口¶
在 cordis.patch.yml 的 entry config 或插件行配置中调整。总开关 enabled 默认 true;Layer A/B 分别对应 request.enabled、rerun.enabled。完整选项约 34 项,README 配置表列出默认值与含义,包括限流延迟、事故间隔 incidentGapMs、续跑语言 lang(zh/en)、调试 debug、可选 logFile 与环境变量 DSH_AUTO_RERUN_LOG 等。需要「只守一个模型、一直重试」时保持默认即可;需要限流仍发续跑消息可将 rerunExcludeCodes 设为 [](一般不建议)。
典型用法与注意¶
典型场景:长时间 Agent 任务、免费或易限流线路、VPN/代理不稳定环境——让 Layer A 在后台按长退避消化 429 与 5xx,避免任务死在一条红字上;回合已失败且非限流排除码时,Layer B 自动 followup 一次续跑。
与内置重试的关系:不要关掉内置 retry 指望本插件替代短窗口;两者分层,本插件只在内置让出终态且属断连类时接管。
安全与权限:插件以当前 DSH 进程权限运行,会改写请求路线、发 followup、可选写 settingsFile 与日志文件。安装前请阅读 GitHub 仓库 源码与 MIT 许可证,仅在信任维护者与配置的前提下启用 modelFallback 与持久化路径。
社区插件目录见 SkillHub 条目(与 DeepSeek / 幻方无官方从属关系,属社区生态「一切皆插件」的一部分)。问题与版本更新以 GitHub Issues 与 Release 为准。
结尾¶
dsh-auto-rerun 把断连类故障从「一次失败就停」变成「同会话内可控的重试与可选续跑」:限流用长退避、retryUntilSuccess 用时间天花板防止假死、死路与拥塞分开处理,右侧栏可观测可改参。若你经常在 DSH 里跑长任务,值得在配置里打开总开关并熟悉 Layer A 与 rerunExcludeCodes 的默认行为,再按需开启选模型重试。
- 目录页:https://www.skillhub.cn/plugins/good-saltfish/dsh-auto-rerun
- 源码与文档:https://github.com/good-saltfish/dsh-auto-rerun