DSH 默认的 dsh-llm-retry 机制在遇到超时、限流或网络波动时,通常在 5 次重试后便停止。此时如果请求失败,会话往往直接中断。dsh-session-robustness 旨在解决这一痛点,它接在官方重试之后,针对瞬时 API 故障继续重试,直到成功、取消或暂停。
插件定位¶
这是一个 DSH 工作流插件,由 bainianlaoyao 维护。它不改变模型策略,也不自动发送“继续”指令,而是在同一个打开的 turn/step 上,针对特定瞬时错误(如 TIMEOUT, RATE_LIMIT, STREAM_CLOSED 等)进行无限次重试,并将失败分片不写入历史上下文。
安装¶
通过命令行安装:
dsh plugin --profile web add dsh-session-robustness
安装后重启 web profile,设置页会出现“会话鲁棒性”选项。
核心功能¶
1. 接管重试流程¶
插件挂载在 agent/request-error waterfall 上。其执行顺序在官方 dsh-llm-retry 之后,compaction(上下文压缩)之前:
1. adapter 流失败
2. agent/request-error waterfall
3. compaction(只处理 CONTEXT_WINDOW_EXCEEDED)
4. dsh-llm-retry(官方 5 次重试)
5. 本插件(官方预算耗尽后,瞬时失败继续重试)
2. 重试策略¶
- 覆盖范围:除了官方重试的合格码(
EMPTY_RESPONSE,RATE_LIMIT,SERVER,TIMEOUT,TRANSPORT),本插件额外无条件覆盖STREAM_CLOSED,MALFORMED_RESPONSE,STREAM,HTTP_408,HTTP_409,HTTP_425,HTTP_429,HTTP_499,HTTP_5xx。 - 退避机制:采用指数 + 抖动退避,优先遵循服务端返回的
Retry-After头。 - Codex 专项处理:0.1.6 版本起,针对 openai-codex provider,处理 WebSocket 续写丢失问题,防止因流失败导致后续请求锚定在旧的 response.id 上。
- 控制方式:通过设置页可暂停或关闭,无需卸载插件。
配置与使用¶
界面操作¶
- 打开 设置 → 会话鲁棒性。
- 默认已启用,次数上限为 0(即无限重试)。
- 官方还在重试时,界面显示“已重试模型请求 (n/5)”。
- 官方 5 次用完后,composer 上方会出现“官方 5 次已用完,正在接管第 N 次”,可当场暂停。
YAML 配置¶
若需硬性上限,可编辑 $DSH_HOME/settings.yaml:
session-robustness:
enabled: true
paused: false
maxRetries: 0 # 0 = 无限(官方 5 次之后)
initialDelayMs: 1000
maxDelayMs: 30000
jitterRatio: 0.2
extraRetryableCodes: [] # 例如 INVALID_REQUEST;永久错误仍会被拒绝
注意事项¶
- 永久错误不重试:
AUTH、QUOTA、CONTEXT_WINDOW_EXCEEDED、MISSING_CREDENTIAL、INVALID_CREDENTIAL、NO_ADAPTER、ABORTED等永久性错误不会进入此插件的重试流程。上下文溢出仍交给官方 compaction。 - 进程外隔离:进程外 / ACP 子 agent 不会接管此插件,仅接管当前进程内的 in-process 子 agent。
- 不包装流:不包装
ctx.llm.stream(),不自动发“继续”。 - 许可证:MIT。
该插件适用于对 API 稳定性要求较高的场景,通过增加容错层减少因瞬时网络波动导致的会话中断。更多详情见 GitHub。