dsh-session-robustness:官方重试耗尽后的会话兜底

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 上。
  • 控制方式:通过设置页可暂停或关闭,无需卸载插件。

配置与使用

界面操作

  1. 打开 设置 → 会话鲁棒性。
  2. 默认已启用,次数上限为 0(即无限重试)。
  3. 官方还在重试时,界面显示“已重试模型请求 (n/5)”。
  4. 官方 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。

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

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

小夜