
10 月 17 日北京 00:31 到 01:37 这 66 分钟里四个仓库都没发新版本:sub2api 在 01:12 到 01:14 之间开出三张修复,补的分别是 Gemini 流式断开不计费、分组生图开关对 Gemini 入口失效、Vertex 账号不累计费用这三处会让你看错账的口径漏洞,都还没合并;CLIProxyAPI 多了一个今晚就能拉起来的用量伴随工具,Antigravity 客户端版本缓存那条刚过审。
feeeei:fix/gemini-stream-client-disconnect-billing5。/v1beta、/v1/messages 兼容、/v1/chat/completions 兼容这三条流式路径,遇到客户端中途断开时会直接按错误返回,已经解析到的那份 usageMetadata 被丢掉,这次请求就此不计费5。finishReason 之后立刻关连接,结果一样5。backend/internal/service/gemini_chat_completions_compat_service.go 第 304 行写的是 ClientDisconnect: false,这条路径从来不把自己标记成断连6。io.EOF)。第二件是断开来自客户端:错误本身是 context.Canceled,或者请求自带的 context 已经取消7。usage.hasObservedTokens() 为真,或者已经回吐过图片7。
backend/internal/service/gemini_stream_client_abort.go 第 11–25 行:第 16 行先排除空错误与 io.EOF,第 19–20 行判是不是客户端走了,第 24 行要求已观测到 token 用量或图片才放行计费7ForwardResult.ClientDisconnect 置为 true。断开前一点用量都没有的,仍然不计费5。usageMetadata 计,所以读到结束分片之后才断开,拿到的是完整用量7。finishReason 之后断开,与正常完成同口径5。usageMetadata 覆盖掉前面已经收好的用量5。merged=false、mergeable_state 为 clean,1 个提交、13 个文件 +585/−48。/v1beta/models、/v1/messages、/v1/chat/completions、/v1/responses 都不查它。关掉之后照样能生图8。GroupAllowsImageGeneration,定义在 backend/internal/service/image_generation_intent.go 第 34–37 行:无分组时放行,有分组时看 group.AllowImageGeneration9。openai_gateway_forward.go 第 343–345 行、openai_ws_forwarder_ingress.go、openai_gateway_passthrough.go、openai_gateway_handler.go、openai_images.go、image_task_handler.go、grok_media.go10。
backend/internal/service/gemini_image_generation_gate.go 第 14–37 行:第 19 行先看分组开关,第 22–26 行用 switch 把门禁限定在三类分组上,第 27 行才进入生图判定11image 或 banana 的模型从白名单里摘掉,GroupModelAllowlist 中间件会在合成路由改写与调度之前按客户端写的公开模型名拦下,回 40412。merged=false、mergeable_state 为 clean,1 个提交、18 个文件 +521/−2613。backend/internal/service/account.go 第 1381–1384 行的 IsAPIKeyOrBedrock() 只认 apikey 与 bedrock 两种类型14。a.IsAPIKeyOrBedrock() && a.IsQuotaExceeded(),gateway_usage_billing.go 第 140 行与第 544 行同样只认这两种类型。整包搜 SupportsAccountQuota 没有任何结果,这个方法正是这张 PR 新加的。SupportsAccountQuota(),认 apikey、bedrock 与 service_account 三种13。IsAPIKeyOrBedrock(),语义不动13。AlwaysAccumulatesQuotaUsed(),只有 service_account 为真。这类账号即使一个上限都不设,也会累加 quota_used,账号接口始终返回这个字段;日用量与周用量仍然要设了对应上限才统计13。quota_used 从升级之后开始累加,升级之前的历史费用不会被补进来13。kakcil:feature/usage-watch-account-quota15。examples/usage-watch/watch.py。每完成一条代理请求,它打印一行:provider、请求的模型、被选中的账号、token 用量,以及那张凭证最近一次观测到的额度百分比15。observability.usage.usage-statistics-enabled,v8.0.31 的示例配置里这个键在第 1160 行,默认是 false16。python3 examples/usage-watch/watch.py --key-file <管理密钥文件>。基址默认 http://127.0.0.1:8317,可用 --base-url 改;--provider claude 或 --provider codex 只输出一侧;--once 读一次当前队列就退出。密钥也可以走环境变量 CLIPROXY_MANAGEMENT_KEY17。GET /v8/management/observability/usage/queue,凭证列表是 GET /v8/management/credentials,两条都挂在 v8 的管理端路由上18。X-Codex-Primary-Used-Percent 与 X-Codex-Secondary-Used-Percent,claude 的凭证读 Anthropic-Ratelimit-Unified-5h-Utilization 与 Anthropic-Ratelimit-Unified-7d-Utilization19。quota unavailable19。
examples/usage-watch/watch.py 第 33–70 行:第 42–44 行取不到任何信号就返回 quota unavailable,第 46–56 行按 provider 分别指定要读哪几个响应头,第 68–71 行把观测时间换算成「多少秒之前」19examples/usage-watch/watch.py 就能跑。跑之前先确认自己那版 CLIProxyAPI 有上面那两个 v8 管理端接口,并且注意它的基分支是 dev。CGO_ENABLED=0 编译通过。他没有说自己做过别的东西。merged=false、mergeable_state 为 clean,base 是 dev,2 个文件 +53/−6,到截稿只有 1 个提交20。internal/misc/antigravity_version.go 里两处独立的缺陷。AntigravityLatestVersion() 用 time.Now().Before(antigravityVersionExpiry) 按挂钟时间判断缓存还新不新,而负责刷新的 runAntigravityVersionUpdater 用的是 time.NewTicker——单调时钟在系统休眠时会暂停20。refreshAntigravityVersion() 在 TTL 过期之后撞上一次瞬时抓取失败——作者举的例子是刚唤醒、网卡还在重连——会把有效的缓存覆盖成 fallback,于是那句「keeping cached value」在 TTL 一过期就永远走不到20。2.23.0(第 23 行),缓存 TTL 是 6 小时(第 25 行),刷新间隔是 TTL 的一半、也就是 3 小时(第 59 行)22。antigravity/hub/<版本> darwin/arm6423。gemini-4-argon-high 要求不低于 2.23.020。feeeee 的原话是:现在的插件化还比较弱,暂时只支持 OpenAI 的 OAuth 出站部分,用于防止 Codex 账户降智;提问者设想的那种设计,要大改 sub2api 整体架构、改成插桩式才做得到25。gemini-3.8-flash-high 做多轮工具会话时,上游回一个合法的 functionCall 但整条回答里没有正文26。latest4。latestgithub.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
antigravity-hub-auto-updater-974169037036.us-central1.run.app
github.com
github.com
status.openai.com
status.anthropic.com
status.cloud.google.com
codex-reset.com
opentherank.com
community.openai.com
reddit.com
reddit.com
reddit.com
github.com
github.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.