dsh-model-auto-retry:429 限流下让 DSH Agent 不中断

前言

在 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。

仓库根目录即插件包(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 模块注释):

  1. 一定先 await next(),让内置重试优先,本插件只当最后一层,与加载顺序解耦。
  2. 续跑消息只能在 idle 时发——running 阶段的 followup 只会入队,不会唤醒驱动。
  3. 不写自定义 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。

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

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

小夜