Skip to content

feat(retry): align retry policy with upstream session/retry.ts (default 3, cap 5) - #7

Merged
samson910022 merged 4 commits into
mainfrom
feat/retry-policy
Sep 8, 2026
Merged

samson910022 merged 4 commits into
mainfrom
feat/retry-policy

Conversation

@samson910022

Copy link
Copy Markdown
Owner

設計語義

  • n = OPENCODE_PROXY_RETRY_MAX_RETRIES(env)/ RETRY_MAX_RETRIES(config.json),resolveMaxRetries() 解析:缺省/非法→3,floor,clamp [0,5]。
  • 總嘗試 1+n:maxAttempts = maxRetries + 1,每次重試開新 session(舊 errored assistant message 不复用)。
  • 退避:computeRetryDelay(attempt),attempt 1-based(第 2 次總嘗試前等待 ≈2s)。
  • 僅「無產出 + transient」才重試;有 content/reasoning 即停。

官方對照表(upstream session/retry.ts)

項 官方 本 PR
初延/因子/jitter 2000ms ×2ⁿ⁻¹ +25% 同
header 優先 retry-after-ms > retry-after(秒) > HTTP date 同(大小寫不敏感)
無 header 上限 30s 同
5xx / isRetryable 強制重試 是 是
ContextOverflow 永不重試 是 是
RETRY_MAX_RETRIES 上限 5 同,預設取本代理歷史值 3(官方預設 5)

與官方的差異點(deliberate)

  • header clamp 30s:官方 header 等待近無界(至 INT32_MAX,實例 700s);閘道面對自帶 timeout 的客戶端(LiteLLM),MAX_HEADER_DELAY_MS=30s 截斷。見 src/retry/policy.js 頭註解。

預設行為變化(舊部署必讀)

  • 預設總嘗試 3 → 1+3=4,退避 800/1600ms 線性 → 2s/4s/8s 指數+jitter。如需接近舊次數設 OPENCODE_PROXY_RETRY_MAX_RETRIES=2(退避曲線無 knob 可還原)。
  • 即時 kill-switch:OPENCODE_PROXY_RETRY_MAX_RETRIES=0(單次嘗試;注意比舊行為更嚴格)。
  • messages 非串流錯誤不再固定行为外无其他变化;responses 非串流新增重试(成功路径零变化)。

覆蓋範圍

  • chat 雙路由 + messages 非串流:改用新退避;responses 非串流:新增同結構迴圈。
  • responses/messages 串流:保持單次嘗試,不動。
  • 測試:167 passed, 5 suites;新增 15(retry-policy 11 + 接線 4)。

Rollback

  • git revert <merge-sha> 即可,無 migration。

@samson910022
samson910022 merged commit 440e607 into main Sep 8, 2026
3 checks passed
@samson910022
samson910022 deleted the feat/retry-policy branch September 10, 2026 21:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant