🆕 新增:匿名免費通道只走 v2 /inference
- 匿名免費流量不再自動回退到 1.x
/zen:anonymousUpstreams只返回設定的 v2 位址,v1 呼叫已註解保留,可一鍵恢復。 - 匿名目錄刷新與免費模型探測同步跟隨,不再對已退役的
/zen發請求。 - 仍保留顯式設定:若把
upstream.anonymous指到/zen,閘道會照設定使用(不建議)。帶 Zen key 的免費模型仍走upstream.zen,本次未改。
🔧 改進:免費請求身份與工具名
- 客戶端沒給 project id 時,每個請求生成新的 40 位 hex project id,避免免費額度按 project×出口記賬時共用一個已被燒穿的桶;客戶端自帶 project id 仍原樣保留。
- 回應工具名解析改為:精確
clint_→ 去前綴 → 忽略大小寫 → 忽略_ - . 空白,只折疊到唯一匹配;兩個工具折疊衝突時不猜。 - JSON 與 SSE(Chat/Responses/Anthropic)共用同一解析器;未帶
clint_前綴的工具調用幀也會進入折疊路徑,減少宿主 unknown-tool 往返。
🔧 改進:WARP 預熱與註冊節奏
- 移除固定 12 秒註冊間隔:背景註冊連續進行,由 create mutex 串行化;只有被拒才退避。
warp.pool_size的一半(至少 1 個,且空閒時至少保留 2 個)作為預熱常駐;第一個出口仍同步註冊並決定 readiness。- 遭遇 429 時不再在註冊路徑內睡眠:registrar 記錄
Retry-After並快速失敗,由池排程下一次嘗試,避免長時間佔住 create mutex。 - 同一出口區塊反覆重複時(3 次)暫停預熱 1–5 分鐘,不再對已飽和的 colo 持續註冊。
- 免費模型自動探測會跳過少於 2 個出口的池,並在探測淘汰出口後停止本輪,避免把預熱池抽乾。
/healthz的warp.preload與四份 README/WebUI 同步說明。
🐛 修正
- 啟動時第一個 WARP 出口遇到 Cloudflare 註冊限流不再 fail closed:在初始化期限內等完
Retry-After;初始化至少預留一個完整限流窗口。 - 修正關閉時池計時器可能未被
Wait等待的 Add/Wait 競爭:計時器改為在池鎖內登記,關閉後不再排程。
⚠️ 升級注意
- 匿名免費模型不再自動回退
/zen;若所在地區或出口只能靠/zen,升級後該通道會直接失敗,需要改回舊行為或改設upstream.anonymous。 - 每個未帶 project id 的請求都會得到新的上游 project id;上游的 project 維度配額/快取行為可能與以往不同。
- WARP 冷啟動不再固定等 12 秒,但 Cloudflare 仍可能限流;限流時啟動最多等待一個窗口(5 分鐘)後才失敗。
- 工具名折疊只影響上游回傳的工具名;客戶端工具在請求中仍是
clint_*,回應會還原。
What's Changed
- feat(warp): preload half the pool and register without a fixed gap by @jasonxu114514 in 7d34bdd
- fix(warp): pace registration from Cloudflare and stop probe churn by @jasonxu114514 in 5143e12
- fix(warp): wait out a rate limit during the first registration by @jasonxu114514 in 5187184
- feat(free-tier): use only the v2 lane and fold response tool names by @jasonxu114514 in 9f59241
- fix(warp): schedule pool timers under the pool lock by @jasonxu114514 in fe49a02
Full Changelog: v1.4.4...v1.4.5