🐛 修正:免費層工具調用
- 官方工具名還原為客戶端工具:整形後的免費請求附帶官方工具集(
shell、grep、read、task…),模型依官方提示調用時,響應映射回客戶端實際聲明的工具(shell/bash→Bash、read→Read、edit→Edit、task/subagent→Agent、question→AskUserQuestion等),Claude Code 不再報No such tool available: shell;客戶端未聲明對應工具時保留原名,不作猜測。 - 清除歷史中的幽靈調用:Anthropic / Chat / Responses 三種協議下,名稱既未聲明也無對應的工具調用連同配對結果(
tool_use_id/tool_call_id/call_id)一併移除;有對應的官方名改寫為客戶端線上名;指向已移除工具的具名tool_choice被丟棄,模型不再在後續輪次模仿殘留調用。 - Chat 串流不再洩漏拆分的工具名:名稱跨分片到達時先暫存 arguments,名稱解析完成後一併發出(或在
finish_reason/ EOF 時原樣沖出),客戶端不會收到半截名或線上名。
🐛 修正:OpenCode 會話標題請求
- 識別 OpenCode 2.x 的系統 prompt 式標題請求及 1.x 舊式提示;判定要求無工具、至多 3 條消息且無 assistant / tool 輪次,代理流量不會被誤判。
- 標題請求不再注入官方工具集,以無工具形式送達上游,不再觸發
403 FreeTierError/429 FreeUsageLimitError。 - 匿名通道(代理與 WARP)的標題請求只嘗試一次:遇 429 或失敗時就地合成標題(取首條用戶文字,至多 6 詞 / 40 字符,JSON 與 SSE 均支持),不再為一個標題輪換整個出口池。
🐛 修正:WARP 與代理健康檢查
- WARP 429 遵循
Retry-After:上游提示長於默認冷卻時,該出口按更長時間冷卻;所有活躍出口均已在同一額度範圍內試過或正在冷卻時提前停止重試,不再在一兩秒內燒穿整個 WARP 池。 - 代理健康檢查目標由
cloudflare.com/cdn-cgi/trace改為 OpenCode 源站https://opencode.ai/,並在可用時沿用免費流量的 Bun(官方 TLS 指紋)客戶端;屏蔽 Cloudflare 但能正常服務 OpenCode 的出口不再被誤判停用、退役。
🆕 新增:按 Key 綁定代理(proxy_bindings)
- 可選配置
proxy_bindings將 Zen / Go Key 綁定到指定代理(或direct);Key 在規範化時轉為 16 位 hex 指紋,原始密鑰不重複存儲、不出現在診斷中。 - 故障封閉:綁定的代理不可用時,對應 Key 不遷移到其他代理、不回退直連;代理恢復後立即恢復流量,無需重新綁定。
- 引用不存在的 Key 或代理時配置校驗失敗,熱重載保持原運行時不變;未配置綁定時路由行為與以前完全一致,匿名流量不受影響。
🆕 新增:被動模型可用性
- 免費模型可用性改由真實請求被動追蹤:2xx 標記可用;429、403、5xx、超時與傳輸錯誤不會停用模型,僅權威的「模型不可用」錯誤才會。
- 後台主動推理探測改為選擇性開啟:新配置
models.active_probes(默認false),每小時約省下 10 次真實推理請求;WebUI 配置中心新增對應開關。 - 模型目錄刷新合併並發觸發,上游失敗時保留最後一次成功的目錄。
🆕 新增:Playground 指定中繼
- Diagnostics → 請求測試新增「中繼」選擇器,可將單次請求固定到某一代理(按序號或脫敏後的 URL),各層級均生效;固定時只嘗試一次,且不寫入冷卻、代理健康或 IP 封鎖狀態。結果面板新增「測試中繼」一行。
POST /api/debug/inference新增可選relay欄位,未知中繼返回400 unknown_relay,不靜默回退;GET /api/debug/models新增relays(已脫敏憑據)。- 匿名通道每次嘗試的記錄附帶脫敏中繼(如
anon:200:412ms@socks5h://…),請求流水可直接看出每次嘗試的出口。 - 新增界面文案補齊 English / Tiếng Việt / Italiano 翻譯。
⚠️ 升級注意
- 免費模型默認不再主動探測:可用性在有真實流量後才更新;如需舊行為,設
models.active_probes: true。 - 代理健康檢查改打
opencode.ai:出口無法到達 OpenCode 源站的代理會被判為不健康(此前只需能到達 Cloudflare)。 proxy_bindings目前只能在config.json(或配置 API)中設置,WebUI 尚無編輯界面;從 WebUI 保存配置會保留現有綁定。- 綁定
#pool代理端點只固定傳輸路由,不保證固定的公網出口 IP。
What's Changed
- fix(proxy): probe the OpenCode origin instead of cloudflare.com by @WengeLiu101 in #153
- fix(free-tier): restore official tool names and drop ghost tool calls by @cheerc in #166
- fix(gateway): preserve OpenCode v2 title requests and avoid WARP pool churn by @NekomyaDev in #169
- feat(gateway): add optional per-key proxy binding with fail-closed routing (#149) by @NekomyaDev in #170
- feat(models): add passive availability tracking and opt-in probes by @NekomyaDev in #171
- fix(gateway): restore the build after #169 and tidy the merged batch by @jasonxu114514 in 46eb13e
- feat(diagnostics): pin a Playground request to one relay by @unrayed in #167
New Contributors
- @NekomyaDev made their first contribution in #169
- @unrayed made their first contribution in #167
Full Changelog: v1.4.6...v1.4.7