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。