github jasonxu114514/opencode2api v1.4.4

3 hours ago

🆕 新增:免費通道可走 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

Full Changelog: v1.4.3...v1.4.4

Don't miss a new opencode2api release

NewReleases is sending notifications on new releases.