fix(llm): OpenCode 呼叫加逾時並讓失敗優雅降級(修正 Step5 卡住) #12

Closed
jiantw83 wants to merge 2 commits from ai-review-resolve/llm-timeout-20260626-164727 into develop
Member

變更摘要

修正 Step5 角色分析會「卡住數分鐘無回應」的問題(實測卡 ~9 分鐘)。根因是 OpenCode LLM 呼叫沒有逾時,server/模型停滯時請求會無限等待;且單一呼叫失敗時 chat() 直接 process.exit(1),反而繞過了去重/過濾既有的 try/catch fallback。

  • 加逾時opencodeAxiosOptions 加上 timeoutOPENCODE_TIMEOUT_MS,預設 120s),停滯的 OpenCode 請求會 fail-fast 而非無限等待。
  • 失敗改丟例外chat() 失敗(含逾時)改 throw 而非 process.exit(1)
    • Step5 角色分析以 Promise.allSettled 執行,逾時的單一角色會被略過,其餘角色照常產出。
    • 去重(deduplicateWithAI)、誤報過濾(filterFalsePositivesWithAI)、補行號(resolveMissingLineNumbers)原本就有 try/catch fallback,先前因 process.exit 而從未被執行;改為 throw 後可實際優雅降級。

效果:把「卡 9 分鐘(甚至整個流程被砍)」變成「最多等 ~2 分鐘,逾時的角色/步驟自動降級、流程繼續」。

影響範圍

  • app/llm.js(逾時設定 + 失敗處理)。不改變正常成功路徑的行為與輸出。
  • 逾時可由環境變數 OPENCODE_TIMEOUT_MS 調整。

測試

  • 新增:OpenCode 請求帶正數 timeout 的斷言;chat() 失敗時 throw(不再 process.exit)的斷言。
  • 全部單元測試通過(278 筆)。

本分支 commits

  • fix(llm): OpenCode 呼叫加逾時、失敗改丟例外以優雅降級
  • test(llm): 補逾時設定與失敗丟例外的測試
## 變更摘要 修正 Step5 角色分析會「卡住數分鐘無回應」的問題(實測卡 ~9 分鐘)。根因是 OpenCode LLM 呼叫**沒有逾時**,server/模型停滯時請求會無限等待;且單一呼叫失敗時 `chat()` 直接 `process.exit(1)`,反而繞過了去重/過濾既有的 try/catch fallback。 - **加逾時**:`opencodeAxiosOptions` 加上 `timeout`(`OPENCODE_TIMEOUT_MS`,預設 120s),停滯的 OpenCode 請求會 fail-fast 而非無限等待。 - **失敗改丟例外**:`chat()` 失敗(含逾時)改 `throw` 而非 `process.exit(1)`: - Step5 角色分析以 `Promise.allSettled` 執行,逾時的單一角色會被略過,其餘角色照常產出。 - 去重(`deduplicateWithAI`)、誤報過濾(`filterFalsePositivesWithAI`)、補行號(`resolveMissingLineNumbers`)原本就有 try/catch fallback,先前因 `process.exit` 而從未被執行;改為 throw 後可實際優雅降級。 效果:把「卡 9 分鐘(甚至整個流程被砍)」變成「最多等 ~2 分鐘,逾時的角色/步驟自動降級、流程繼續」。 ## 影響範圍 - 僅 `app/llm.js`(逾時設定 + 失敗處理)。不改變正常成功路徑的行為與輸出。 - 逾時可由環境變數 `OPENCODE_TIMEOUT_MS` 調整。 ## 測試 - 新增:OpenCode 請求帶正數 `timeout` 的斷言;`chat()` 失敗時 throw(不再 `process.exit`)的斷言。 - 全部單元測試通過(278 筆)。 ## 本分支 commits - `fix(llm)`: OpenCode 呼叫加逾時、失敗改丟例外以優雅降級 - `test(llm)`: 補逾時設定與失敗丟例外的測試
jiantw83 added 2 commits 2026-06-26 08:48:08 +00:00
opencodeAxiosOptions 加 timeout(OPENCODE_TIMEOUT_MS,預設 120s),避免 server/模型停滯時請求無限等待;chat() 失敗改 throw 而非 process.exit(1),讓 Step5 的 Promise.allSettled 與去重/過濾的 try/catch fallback 能各自優雅降級,不再因單一 LLM 失敗砍掉整個流程。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Owner

🤖 AI Code Review 團隊

👤 角色 🎯 面向 🧠 個性
🗡️ Assassin security 多疑偏執、以攻擊者視角看世界,假設每筆輸入都是惡意的,每個信任都會被濫用
🎼 Bard style 唯美龜毛、追求優雅,把可讀性與一致性當作旋律,最受不了走調的命名與排版
🧰 Leo maintainability 有遠見、重視長期維護成本,凡事先問「六個月後的自己還看得懂嗎?」,討厭把債留給未來
🔮 Mage logic 嚴謹冷靜、滴水不漏,凡事推演到最壞情況,深信「沒驗證過的假設都是 bug」
🧪 Maya testing 對測試覆蓋率有執念,深信「沒有測試的程式碼等於沒寫完」,溫和但堅持,最在意邊界與失敗路徑
Rogue efficiency 急性子、講求速度,最痛恨被浪費的 CPU 週期與記憶體,凡事先問「這能不能更快、更省」

🔍 服務:opencode 模型:gemini-2.5-flash

## 🤖 AI Code Review 團隊 | 👤 角色 | 🎯 面向 | 🧠 個性 | |--------|--------|--------| | **🗡️ Assassin** | security | 多疑偏執、以攻擊者視角看世界,假設每筆輸入都是惡意的,每個信任都會被濫用 | | **🎼 Bard** | style | 唯美龜毛、追求優雅,把可讀性與一致性當作旋律,最受不了走調的命名與排版 | | **🧰 Leo** | maintainability | 有遠見、重視長期維護成本,凡事先問「六個月後的自己還看得懂嗎?」,討厭把債留給未來 | | **🔮 Mage** | logic | 嚴謹冷靜、滴水不漏,凡事推演到最壞情況,深信「沒驗證過的假設都是 bug」 | | **🧪 Maya** | testing | 對測試覆蓋率有執念,深信「沒有測試的程式碼等於沒寫完」,溫和但堅持,最在意邊界與失敗路徑 | | **⚡ Rogue** | efficiency | 急性子、講求速度,最痛恨被浪費的 CPU 週期與記憶體,凡事先問「這能不能更快、更省」 | > 🔍 服務:opencode 模型:gemini-2.5-flash
admin closed this pull request 2026-06-26 08:53:58 +00:00

Pull request closed

This pull request cannot be reopened because the branch was deleted.
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: old-docker-actions/ai-code-review#12