
CLIProxyAPI 那条「先烧最早重置那张号」的路由补丁评审清零,仍卡在 dev 之外;本期给出它的排序规则、两处会咬人的边界、作者 17 小时实测数字,以及上一期流式排空补丁被重写后新挂的那条 P2。
dev,18 个文件 +2685/−4,五笔提交,维护者还没有表态。v8.0.53 里没有这段代码。| 你的情况 | 现在是什么状态 | 今晚能做什么 |
|---|---|---|
在 v8.0.53 上配了 routing.strategy: soonest-reset | 这个名字不被识别,实际按 round-robin 跑 | 按轮转的脾气算余量,配置先留着 |
用外部脚本每分钟改 weight,把号提前停在某个百分比 | 这条策略想替掉的就是这套脚本 | 脚本可以停,但换代之前继续用 |
| 想今晚就拿到这个排序 | 没有 tag 带它,只能从 PR 头分支自己构建 | 构建后 priority 仍然优先于重置排序 |
| 号池里既有周窗口又有短窗口的 Codex 号 | c3a4f7e 修的就是这个判定 | 用新提交构建,别用 11-03 之前的头 |
Window-Minutes。
feat/soonest-reset-routing,文件 sdk/cliproxy/auth/selector_soonest_reset.go 第 322–355 行。4fill-first 一致:先取可用的最高优先级层,再在这一层里按重置时间排。
feat/soonest-reset-routing,文件 sdk/cliproxy/auth/selector_soonest_reset.go 第 44–52 行。6InvalidateAuth 是唯一能让名额重新空出来的路径。探针记录只存在内存里,重启后每张号再各探一次。
feat/soonest-reset-routing,文件 sdk/cliproxy/auth/conductor_selection.go 第 1812–1821 行。7| 观察项 | 换之前(加权轮转 + 脚本,24 小时) | 换之后(17 小时) |
|---|---|---|
| 最早重置那张号(开局 97%) | 被脚本提前停调约 27 小时 | 跑到重置前 5 分钟才失败切换 |
| 6–7 天后才重置的号 | 拿走 40% 流量 | 约 0%,留着没动 |
| 客户端看到的 429 | 0 | 0,一次上游 429 被透明重试 |
| 重启后 / 滚动后的探测 | — | 每号恰好 1 次 |
400 Advisor tool result content could not be processed,客户端下一轮自己恢复。1Chunks,再排空上游;排空仍限 64 KiB;上游请求换成一个可分离的 context。message_stop 之前跟随下游取消。之后分离,排空才跑得完。context.AfterFunc 在父 context 已经取消时,是在另一个 goroutine 里调 cancel。ctx.Err() 为 nil 返回,ExecuteStream 立刻把它交给 http.Client.Do,一次已经放弃的请求照样发出去。signal.active 为 false,今日 UTC 尚未重置。20soonest-reset 等于什么都没做,实际跑的是轮转。先知道这件事,才能算准余量。x-codex-*-window-minutes 在不在。这两个头不来,这套排序就没有判据,装了也排不出来。priority 那一条想清楚——它仍压过重置顺序。不想自己构建,就等它合进 dev 再说下一班车。github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
status.openai.com
status.claude.com
status.cloud.google.com
codex-reset.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.