前言¶
DeepSeek Harness(DSH)内置的 dsh-llm-retry 对临时故障使用有界指数退避策略,默认从 500ms 到 10s 共重试 5 次。当预算耗尽时,TPM/RPM 窗口仍然活跃,可能导致更严重的限流。OpenModel Platform(OMP)对速率限制的处理方式不同:它会重试最多 10 次,等待至少 30 秒,并接受 provider 的 Retry-After 头,最长可达 5 分钟。
这个插件为 DSH 增加了一套与 OMP 对齐的 429 重试行为,无需修改 DSH 核心代码。
是什么¶
dsh-omp-retry 是一个 DSH 插件,为 HTTP 429(Too Many Requests)响应提供 OMP 风格的重试策略。它由 Rinai-R 维护,定位为工作流类插件。插件会在 dsh-llm-retry 之前插入一个 agent/request-error 监听器,只接管 RATE_LIMIT 错误码,其余错误码仍由内置执行器处理。
核心功能¶
- 最多 10 次速率限制重试(可配置)。
- 延迟为
max(30 s, provider Retry-After),即至少等待 30 秒,或使用 provider 返回的Retry-After头。 - 若 provider 返回的
Retry-After超过 5 分钟,则终止重试链,不再等待。 - 每次重试会持久化
llm/retry/llm/retry-started事件,保证重试 UI 和会话历史正常工作。 - 取消操作、回合结束或插件销毁会中断当前等待。
SERVER、TIMEOUT、TRANSPORT、EMPTY_RESPONSE仍由dsh-llm-retry处理。CONTEXT_WINDOW_EXCEEDED、QUOTA、AUTH、INVALID_REQUEST不会重试。
安装与启用¶
使用官方安装命令:
dsh plugin --profile desktop add github:Rinai-R/dsh-omp-retry
将 desktop 替换为你的实际 profile 名称(如 web 或自定义 profile),然后重启 DSH。插件会在启动时自动插入 omp-rate-limit-retry 配置行。
配置¶
默认配置为:
maxRetries: 10floorMs: 30000maxDelayMs: 300000
在 profile 的 cordis.patch.yml 中覆盖:
- id: omp-rate-limit-retry
config:
maxRetries: 10
floorMs: 30000
maxDelayMs: 300000
设为 maxRetries: 0 可禁用插件。插件的重试预算独立于 provider 的 retryPolicy.maxRetries:即使 provider 仍为默认 5 次,该插件仍会进行最多 10 次速率限制重试。
典型用法¶
在 cordis.patch.yml 中为 provider 配置 OMP 风格的本地退避,并将 RATE_LIMIT 放入可重试列表:
retryPolicy:
mode: normal
maxRetries: 10
retryableCodes:
- EMPTY_RESPONSE
- RATE_LIMIT
- SERVER
- TIMEOUT
- TRANSPORT
backoff:
initialDelayMs: 500
maxDelayMs: 8000
jitterRatio: 0.25
这样,当 dsh-omp-retry 拦截到 429 响应时,会按 OMP 策略重试;未拦截的错误仍由 provider 策略处理。
适用场景与注意¶
适合需要与 OMP 行为对齐、希望更长时间窗口内处理速率限制的开发者。插件以当前 DSH 进程权限运行,安装前建议检查源码与许可证(MIT)。
限制¶
- 不适用于 Ghostty,也不是通用重试框架,仅覆盖 HTTP 429 速率限制。
- 未实现 OMP 的 model/credential 降级链。
- 若 provider 的
Retry-After超过maxDelayMs,将不再等待。
总结¶
dsh-omp-retry 通过 OMP 风格的 429 重试策略,帮助 DSH 更好地处理速率限制场景。配合合适的 provider 重试配置,可以在保持会话历史和 UI 正常工作的同时,延长重试窗口。更多细节见插件目录页或 GitHub 仓库。