
今天在開發時,遇到了一個有趣但也讓人有點困擾的狀況。使用的開發環境是 OpenCode 搭配 OpenRouter,主模型則是透過 OpenRouter BYOK (Bring Your Own Key) 綁定 Google AI Studio API Key 的 Google Gemini 3.1 Pro。
本來預期所有的花費都會走自己的 Key,享受免費或可控的額度,沒想到卻在 OpenRouter 的後台發現了預期之外的扣費紀錄。
案發現場:被悄悄觸發的背景請求
透過檢查 OpenRouter Log 的 Generation Data,我發現 OpenCode 在使用過程中,背景會自動觸發額外的 API 請求,而這些請求的行為跟我的全域設定完全不同:
- 模型被切換: 請求並沒有發給 Gemini,而是被發送到了
anthropic/claude-haiku-4.5。 - Provider 改變: 走的是 Amazon Bedrock(OpenRouter 自己的後端)。
- BYOK 失效: 紀錄顯示
is_byok: false,代表這筆請求沒有走我綁定的 Key,而是直接扣除了我 OpenRouter 帳戶裡的餘額。 - 用量特徵:
tokens_prompt: 603,tokens_completion: 10,典型的輕量級背景任務用量,且 origin 標示為https://opencode.ai/。
推測原因:獨立的 Small Model 機制
仔細推敲後,我認為這跟 OpenCode 底層的任務分發機制有關。
OpenCode 內部應該有一個獨立的 small_model 機制,專門用來處理像是「生成 Session 標題」、「壓縮摘要 Context」這類不需要強大推理能力的輕量級背景任務。
問題的核心在於,這個機制似乎不繼承使用者的主模型或 BYOK 設定。相反地,它會自行在可用的 Provider 列表中尋找相對便宜的模型來代勞。在這個案例中,系統就自動挑中了 OpenRouter 平台上的 Claude Haiku 4.5,進而導致了帳戶餘額被意外扣款。
尚未釐清的問題
雖然大致找出了問題的成因,但要徹底解決這個狀況,目前還有兩個關鍵問題需要進一步釐清:
- 黑盒的決策邏輯: OpenCode 究竟是透過什麼樣的確切權重或邏輯,決定在眾多模型中挑選 Claude Haiku 4.5 的?
- 設定檔的正確位置: 該如何正確設定並覆寫這個 Small Model 的行為?我嘗試過直接修改
opencode.json,但結果卻導致 OpenCode 無法順利啟動。這部分的有效設定檔位置與格式,還有待後續查閱文件或原始碼來摸索。
這算是一個在串接聚合 API 工具時容易忽略的小陷阱,記錄下來,希望也能幫到遇到類似狀況的開發者。
























