🆕 新增:免費通道可走 Cloudflare WARP
- 免費模型流量可改由進程內建的 WARP 隧道出口:WireGuard over UDP 加上 gVisor netstack,不需要 TUN、root、NET_ADMIN,也不用改路由。
- 新增
warp.enabled/pool_size/stack/source_ipv6,WebUI、config.example.json與四份 README 都已支援。 - 啟用後匿名通道、免費 Zen key 回退、免費模型探測與目錄刷新都不再走代理;付費模型與 Go key 維持原本的代理。
- WARP 初始化失敗時啟動與熱重載 fail closed;
/healthz、/api/monitor與監控頁會顯示出口池狀態。 stack預設 IPv6。設定source_ipv6(路由前綴)後,每個出口會用IPV6_FREEBIND綁定自己的外層來源位址,實現真正的出口輪換;IPv6 端點失敗時自動回退 IPv4。
🔧 改進:出口池按並發動態調整
warp.pool_size現在是上限而不是固定值:活躍出口依「使用中的租約 + 排隊請求 + 1 個備用」計算,閒置 60 秒後自動縮回。- IPv6 出口按 /64 去重並冷卻 30 分鐘(IPv4 按 /32),因為免費額度就是按這個區塊計算。
- 碰到 429/403 立刻淘汰該出口並立刻重新註冊,不再等下一輪。
- 免費模型請求遇到 429 會持續換出口,只有用完
retry.max_attempts才把最後的 429 回給客戶端;429 不再打開匿名通道斷路器,也不會冷卻 key。 - WARP 傳輸固定 HTTP/1.1(釘住 ALPN 並清空
TLSNextProto),修正目錄刷新被 h2 SETTINGS 幀打斷的問題。 - 修正出口池的生命週期 context 被啟動逾時取消、導致永遠無法輪換的問題。
🔧 改進:免費請求更接近官方 CLI
- 免費模型請求注入官方 OpenCode 系統提示(含
<env>與內建 skill 列表):v1/zen用 1.x 措辭,/inference與/zen/go用 2.x 措辭;已帶標記的請求不會重複注入,System One 不受影響。 - 客戶端工具改名為
clint_前綴(清洗、去重、長度 ≤64),並補齊該通道的官方工具集(v1 11 個、v2 13 個);tool_choice、function_call與工具呼叫歷史同步改寫,回應再還原成客戶端原本的名字。 - v2 通道跟進 OpenCode 2.1.x 客戶端:
/inference/<provider>/v1/...路由、max_completion_tokens: 32000、工具strict: false、保留model在前的鍵序、關閉 HTML escaping,Accept 與 Content-Length 位置交給運行時決定。 ses_會話 id 的時間戳改錨定在 UTC 當日往前 30 天內,避免上游把「時間戳不合理」當成額度用完而回 429。
🔧 其它改進
- 匿名通道新增可選斷路器(
models.anonymous_backoff);單一 403/429 或連續失敗會暫停該通道,成功後自動恢復。 - 免費 IP 封鎖(403 abusive traffic)只冷卻該出口並結束匿名嘗試,不再用同一個 IP 重試其他通道或 key。
- 請求層級的 400/422(上下文過長等)不再逐個出口重試;匿名出口走訪上限改為 8,
#pool輪換仍依retry.max_attempts。 - 明確關閉 reasoning 的請求會保留客戶端的選擇。
- WebUI 新增義大利文(介面與 README);內嵌前端資源加上
Cache-Control: no-cache,升級二進位後不會再拿到舊版 UI。 - 代理探測只要沒有回應就視為代理失敗,不再只認逾時與連線拒絕。
🐛 修正
- 修正 WARP 池無法輪換、一直卡在第一個出口的問題。
- 修正 WARP 傳輸被協商成 h2 導致目錄刷新失敗。
- 修正
ses_時間戳超出上游視窗、健康出口被誤判為 429 的問題。 - 修正匿名通道重複嘗試請求層級錯誤、以及單一 IP 封鎖拖垮整條通道的問題。
⚠️ 升級注意
- 啟用 WARP 需要能對外送 UDP 2408,容器要放行,否則啟動會 fail closed。每個出口註冊間隔約 12 秒,冷啟動或擴容需要一點時間。
stack預設 IPv6;主機或容器沒有可用 IPv6 時會自動退回 IPv4。warp.pool_size從固定數量改成上限,實際活躍出口依並發增減。- 出口被大量使用時,建議把
retry.max_attempts調到 6–8,讓請求有機會換到健康的出口;免費額度按出口 /64 計算,出口太少仍可能全部耗盡。 - 免費請求的 body 會多出官方提示與工具集,上游 prompt cache 可能重建一次;客戶端工具名在請求中變成
clint_*,回應已還原成原名。
What's Changed
- fix(upstream): cap the number of anonymous exits tried per request by @cuipengcx90 in #127
- feat(gateway): add an opt-in circuit breaker for the anonymous free-tier lane by @tubimasky in #140
- fix(upstream): handle free-tier IP block and stop retrying request-level 400s by @cheerc in #132
- feat: add Italian localization for the WebUI by @croccio in #144
- fix(protocol): preserve explicit reasoning disable by @jasonxu114514 in #150
- docs: document explicit reasoning disable in translations by @jasonxu114514 in #151
- feat(upstream): follow the OpenCode 2.1 client's version and /inference routes by @AiFLYF in #141
- feat(upstream): match the 2.x client's chat body byte for byte by @AiFLYF in #142
- fix(upstream): let the runtime own Accept and Content-Length placement by @AiFLYF in #143
- fix(webui): stop browsers serving a stale embedded UI after the binary is upgraded by @WengeLiu101 in #112
- fix(proxy): a probe that returns no response must fail the proxy, not just timeouts and refusals by @WengeLiu101 in #111
New Contributors
- @cuipengcx90 made their first contribution in #127
- @tubimasky made their first contribution in #140
- @croccio made their first contribution in #144
Full Changelog: v1.4.3...v1.4.4