前言¶
在 DeepSeek Harness(DSH)里跑长任务时,模型 provider 一旦返回 HTTP 429 或 RATE_LIMIT,内置的 @deepseek-ai/dsh-llm-retry 会把 maxRetries 用完后,由 @deepseek-ai/dsh-agent-loop 把失败升级成终结错误:写 turn/end { reason: { kind: 'error' } }、发 agent/error,Agent 回到 idle。任务停在半路,只能人工再发一条消息才能继续。限额场景下这很常见——仓库 README 里记录的一次实测会话中有 744 次 llm/retry、7 次以 error 结束的 turn/end,且均为 429。
下面介绍社区插件 dsh-model-auto-retry(维护者 kocor01),它在 DSH 宿主侧补一层「限流自愈」:先让内置重试跑完,再原地重试 429,必要时自动发续跑 follow-up,尽量无人值守把任务跑完。
这是什么¶
dsh-model-auto-retry 是 DSH 的 host 插件,分类属于工作流。一句话定位:在模型请求被限流(HTTP 429 / RATE_LIMIT)时保持 Agent 存活——循环内原地重试,重试用尽后再自动发送「如果任务未完成,请继续执行」类 follow-up。
- 目录页:https://www.skillhub.cn/plugins/kocor01/dsh-model-auto-retry
- 源码与说明:https://github.com/kocor01/dsh-model-auto-retry
- 当前 npm 包版本(package.json):
0.1.0,许可证 MIT,要求 Node>=20.3
仓库根目录即插件包(package.json、index.js、cordis.patch.yml 在顶层),可从 npm 或 GitHub 直接安装。
核心功能:两层,只处理 429¶
处理顺序可以概括为:
请求失败
└─ 内置 llm-retry:还能重试吗?能 → 它重试(本插件完全不介入)
不能 → 轮到本插件
└─ 第一层:是 429 吗?→ 按 Retry-After / 指数退避等待 → 返回 { kind: 'retry' }
→ 循环原地重试,Agent 不中断
└─ 第二层:turn 因 429 终结 → 等 Agent 变 idle → agent.followup('如果任务未完成,请继续执行')
两层都只在 429 / RATE_LIMIT 上生效;配额耗尽、鉴权失败等「重试也不会变好」的错误保持原样,仍交人工处理。
实现上有三条硬约束(改代码前宜读仓库 index.js 模块注释):
- 一定先
await next(),让内置重试优先,本插件只当最后一层,与加载顺序解耦。 - 续跑消息只能在
idle时发——running阶段的followup只会入队,不会唤醒驱动。 - 不写自定义 session 事件——状态只放内存。
默认策略 mode: hybrid 同时开启两层;也可只开原地重试(in-loop)、只开中断后续跑(continue),或 off 关闭。
安装与启用¶
安装会在 profile 的 bundle 列表里增加条目,并通过包内 cordis.patch.yml 在 profile 根部插入插件行。装完后可用 cordis_inspect_query → host / Config / listConfigs,传 {"name": "dsh-model-auto-retry"};该行 status 为 absent 是正常的——本插件不导出 Config schema,不是未挂载。注意 desktop profile 由 Electron 独占,dsh --profile desktop --dump-config 会报错,不要用该命令验证 desktop。
从 npm 安装(推荐)¶
把 desktop 换成你的 profile 名(dsh --help 会列出):
dsh plugin --profile desktop add dsh-model-auto-retry
从 GitHub 安装¶
dsh plugin --profile desktop add "github:kocor01/dsh-model-auto-retry"
私有仓库需先配置 git 凭据,或使用 SSH:
dsh plugin --profile desktop add "git+ssh://git@github.com/kocor01/dsh-model-auto-retry.git"
升级与卸载¶
三种安装方式升级后都需重启 DSH 才会重新加载模块;npm 包可用 update,GitHub 来源可重跑 add,本地目录链接需自行 git pull。
dsh plugin --profile desktop update dsh-model-auto-retry
dsh plugin --profile desktop remove dsh-model-auto-retry
也可在 DSH 里通过 plugin_manager 的 install_bundle / remove_bundle 操作;target 传仓库根目录绝对路径。
配置¶
在 profile 的 cordis.patch.yml 里按 id 覆盖(不要改仓库内那份,升级会被覆盖)。Loader 规则是覆盖即替换整个 config 对象;本插件对每个键都有代码内默认值,只写部分键是安全的。
- id: model-auto-retry
config:
mode: hybrid # hybrid | in-loop | continue | off
rateLimitCodes: ['RATE_LIMIT']
rateLimitStatuses: [429]
messagePattern: '^\s*429\b'
excludeCodes: ['QUOTA', 'ACCOUNT_QUOTA', 'AUTH', 'INVALID_CREDENTIAL', 'CONTEXT_WINDOW_EXCEEDED']
respectRetryAfter: true
initialDelayMs: 5000
maxDelayMs: 300000
jitterRatio: 0.2
maxInLoopRetries: 6
continueText: '如果任务未完成,请继续执行'
maxContinues: 8
resetWindowMs: 1800000
includeSubagents: true
continueSource: 'user'
常用调整:mode 控制策略组合;maxInLoopRetries / maxContinues 与 resetWindowMs 控制原地重试与续跑预算;continueSource 为 notice 时续跑以提示条出现而非用户气泡。配置写错会在激活期直接报错,不会出现「装了但没生效」的静默状态。
典型现象与验证¶
聊天与日志¶
hybrid/in-loop:聊天里通常没有额外消息,只有请求变慢;恢复过程在宿主日志里,前缀model-auto-retry:。hybrid/continue:中断后会出现内容为默认续跑文案的用户消息(或notice提示条),随后 Agent 继续。- 预算用尽或非 429:与未装插件相同——报错、停下、等人处理。
单元测试¶
在仓库根目录:
node --check index.js
node test/unit.test.mjs
README 说明在受限沙箱里 node --test 可能因 spawn EPERM 失败,直接运行 node test/unit.test.mjs 即可。
端到端(隔离 DSH_HOME)¶
README 提供可复现流程:起假 429 服务、设置 DSH_HOME 与 MOCK_API_KEY、用 headless profile 安装本地包路径并 --patch test\e2e-overlay.yml 跑任务,再读会话日志确认只有 completed、没有 error。对照组可用 e2e-overlay-control.yml(插件 off)与 e2e-overlay-continue.yml(只测第二层)。
仓库内表格记录:假服务前 3 次 429、内置 maxRetries: 1 时,hybrid 得到 turn/end completed;off 对照组为 turn/end error 且 CLI 非 0。
适用场景与注意¶
适合谁:经常 hit provider 限流、希望长任务少人工点「继续」的 DSH 用户;子 Agent 多时可把 includeSubagents 设为 false 避免并发放大。
边界(来自 README「已知边界」):
- 重试与续跑预算在内存中,重启 DSH 或热重载插件后归零。
- 无设置 UI,调参只靠 profile 的
cordis.patch.yml。 - 插件是「失败后恢复」,不是主动限速;要压 429 仍需配合 provider 的
retryPolicy或上游配额。 - 若 provider 已设
retryPolicy.mode: always,内置策略永不放弃,第一层往往不会触发。
安全与信任:插件以当前 DSH 进程的权限运行,会向 Agent 注入续跑消息并拦截 LLM 失败路径。安装前应阅读 index.js 与 LICENSE,仅从可信来源安装。
DSH 生态强调「一切皆插件」;SkillHub 上的插件目录是社区站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-model-auto-retry 在内置 LLM 重试耗尽之后,针对 429 做原地重试与 idle 后的自动 follow-up,把「限流导致 Agent 半路 idle」从常态故障改成可配置的自愈流程。需要详情、Issue 与完整配置表时,见目录页 https://www.skillhub.cn/plugins/kocor01/dsh-model-auto-retry 与 GitHub https://github.com/kocor01/dsh-model-auto-retry。