
sub2api v0.2.17 遇到 200 带顶层 error 的图片响应时仍按请求里的 n 张计费,CLIProxyAPI 的会话绑定只在内存里,两张补丁都还没合。

backend/internal/service/openai_images.go 第 742–800 行:第 744 行先取 parsed.N,第 793–794 行只在数到图时覆盖它。截图取自 v0.2.17 标签。CountTowardsSLA 与非流式标记一并写上,对客户端的状态码和正文仍按上游原样返回。5error、数不到任何图片输出。8error 的 2xx 不改行为,仍按 n 兜底。images_strip_upstream_urls,默认关。开了之后,已经带 b64_json 的图片项会删掉所有值是 http(s) 链接的字段,url、native_url 这类上游私有字段一起清。5
backend/internal/service/openai_images.go 第 978–1010 行:先数图,数到 0 才去判 error 字段,命中就置 inBandFailed 并写 Ops 事件。mergeable_state 为 unstable。5n 收小,虚计的张数跟 n 成正比。抓一次上游原始响应,看见 200 配顶层 error 就知道自己踩在这一类上。别指望监控替你发现,v0.2.17 不记这类失败。对账单时拿请求日志里的张数跟上游实际张数比,差额就是这一类的量。session_cache.go 里没有落盘代码。9session-affinity 是 false,TTL 一个小时。10routing.session-affinity-persistence。默认 false,要求 session-affinity 为真,Home 模式下忽略。11<auth-dir>/.runtime/session-affinity.cache。每 5 秒写一次,worker 停止时再写一次;写临时文件、同步、再原子替换,权限只给本人。12
sdk/cliproxy/auth/session_cache_persistence.go 第 66–100 行:第 80 行起每 5 秒一个 tick,第 97–100 行在停止信号或 tick 上各刷一次。Status、StatusMessage、LastError、Unavailable、NextRetryAfter、Quota、cooldownRecordedSeq、模型状态和刷新退避。14carryRuntime := isFileSnapshot && !credChanged && 同 provider。CredentialsChanged 也扩到了 codex 的 account_id、Vertex 的 project 与服务账号、插件 storage 的原始 JSON。account_id。改动收敛到 3 个文件、+461/−4。14clients.go 601 行里搜不到 rereadDiscardedFileSnapshot,conductor_lifecycle.go 里搜不到 isFileSnapshot。1516
internal/watcher/clients.go 第 223–255 行:先确认是同一份快照,再让自身与同路径的兄弟对象失效(第 245–249 行),最后重读这个文件(第 253 行)。models.list 能过、generateContent 回 403 PERMISSION_DENIED,原文仍是「Your project has been denied access.」。19n 收小;对账出现无图却计费的,先按「200 带顶层 error」这一类去核。/status 的窗口行,再看本地冷却。github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
status.openai.com
discuss.ai.google.dev
discuss.ai.google.dev
discuss.ai.google.dev
discuss.ai.google.dev
codex-reset.com
x.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.