No.025 分类运维 更新于 2026.08.21
- 580 字
- 约 2 分钟
怎么让 dsh 无限重试
dsh 默认只会重试 5 次且间隔很快;本文展示通过配置 retryPolicy 为 always,实现指数退避的无限重试。
背景
dsh(DeepSeek Harness)是我常用的 AI 助手 CLI。默认情况下它的 llm-retry 插件采用 normal 模式,maxRetries 为 5,baseDelayMs 为 500,导致:
- 前几次重试仅间隔 0.5 s、1 s、2 s…
- 第 5 次仍然失败后直接返回错误,整个会话结束。
在模型频繁出现网络抖动或临时限流时,这种“快速五次”往往不够。
错误示例
(省略实际运行日志,示例截图或文字)
provider “openai” failed, retry 5/5, backoff 2 s → abort
正确的做法:配置 retryPolicy
1. 不要修改 node_modules
AI 之前误改了 @earendil-works/pi-ai/dist/utils/retry.js,但该文件 并未被 dsh 调用,真正的重试策略在 @deepseek-ai/dsh-llm-retry 中。直接改源码会在升级后被覆盖,且容易产生副作用。
2. 在 ~/.dsh/settings.yaml 中为每个 Provider 添加 retryPolicy
llm-pi-ai:
providers:
nvm:
displayName: 英伟达
apiKeyEnv: NVM_API_KEY
api: openai-completions
baseURL: https://integrate.api.nvidia.com/v1
retryPolicy:
mode: always # 无限重试
backoff:
initialDelayMs: 2000 # 第一次重试 2 s
maxDelayMs: 30000 # 最大 30 s
jitterRatio: 0.1 # ±10% 抖动避免“同步雨点”
modelscope1:
displayName: 魔搭
apiKeyEnv: MODELSCOPE1_API_KEY
api: openai-completions
baseURL: https://api-inference.modelscope.cn/v1
retryPolicy:
mode: always
backoff:
initialDelayMs: 2000
maxDelayMs: 30000
jitterRatio: 0.1 mode 说明
normal:受maxRetries限制,默认 5 次。always:不受次数限制,只受backoff最大延迟控制,直至手动中止。
backoff 计算
delay = min(initialDelayMs * 2^(retry‑1) * jitter, maxDelayMs)其中jitter为[1‑ratio, 1+ratio]的随机因子,防止多个实例同步重试。
3. 保存后直接生效
dsh 会在下次请求时读取 settings.yaml,无需重新安装或重启。如果你已经运行了 dsh,只需要重新发起会话即可看到日志:
$ dsh conversation -m openai/gpt-4
...
[retry] attempt 1/∞, wait 2.1s
[retry] attempt 2/∞, wait 4.3s
... 验证
- 故意让请求超时(如关闭网络或使用错误的
baseURL)。 - 观察终端输出,确认重试次数持续递增,且延迟随
2x增长直至 30 s。 - 按
Ctrl+C中断会话,dsh会立刻停止后续重试。
注意事项
- 无限重试会消耗配额。对 Quota/ Billing 错误(如
QUOTA、INVALID_CREDENTIAL)always模式仍会重试,可能导致无限请求并触发封禁。请根据实际需要决定是否使用always,或在normal模式下自行调高maxRetries。 - 如果只想延长间隔而不想无限循环,可以保留
mode: normal,只调大maxRetries或maxDelayMs。 - 配置错误会在启动时抛出 Schema validation 错误,记得检查
pnpm dev或pnpm build输出的报错信息。
小结
- 别改源码:dsh 的重试逻辑在
dsh-llm-retry,通过settings.yaml完全可配置。 - 用
retryPolicy.mode: always实现无限重试,配合backoff参数得到指数退避。 - 手动中止:
Ctrl+C(或发送中断信号)随时停止重试,避免不必要的费用。
这样就完成了让 dsh 无限重试的配置,你可以把它当作日常的容错手段,特别是在不稳定网络或临时限流的场景下。祝玩得开心!
License 版权
本文《怎么让 dsh 无限重试》由 年华 写,按 CC BY-NC-SA 4.0 协议发布。可以转载,但要署名、不能商用,改过的内容也按同样的协议发布。
https://tblog.amamo.top/posts/%E6%80%8E%E4%B9%88%E8%AE%A9-dsh-%E6%97%A0%E9%99%90%E9%87%8D%E8%AF%95/
Comments评论