
sub2api 的 Antigravity 入口静默忽略 responseJsonSchema,@ai-sdk/google 4.0.70 之后的结构化输出只拿回散文;同窗口 CLIProxyAPI 仍把一次 429 的 resets_in_seconds 无上界当冷却时长,68 小时锁死整张凭证。两条都没有版本修复,本期给出今晚能做的判定与处置顺序。
responseJsonSchema 改写成 responseSchema 再发出去。@ai-sdk/google 从 4.0.70 起只发 responseJsonSchema。v1internal 接受 generationConfig.responseJsonSchema,但静默忽略,只有 responseSchema 才触发结构化输出。responseSchema:合规 JSON,带不带 responseMimeType 都行。responseJsonSchema:普通文本,裸写、带 additionalProperties、带 $schema 三种写法都一样。responseMimeType: application/json:普通文本。_responseJsonSchema:400 Unknown name。cleanGeminiRequest 只处理 tools,函数末尾一句 if !modified { return body, nil } 就交出去,没有任何 generationConfig 分支。3responseJsonSchema、response_schema、responseSchema 在 v0.2.19 的 Go 代码里都是 0 命中。
responseJsonSchema 原样上行。3/antigravity/v1beta 这条原生 Gemini 入口:GET /models、GET /models/:model、POST /models/*modelAction,走 API Key 鉴权加分组 Google 校验。4/antigravity/v1/messages 那条 Claude 格式的入口不读这个字段,不受影响。generationConfig 里有 responseJsonSchema、没有 responseSchema,就是这条。@ai-sdk/google 降到 4.0.69,同一请求立刻恢复。这一步最干脆。normalizeGeminiGenerationConfigResponseSchema:有旧键就补新键、删旧键,schema 原样搬运。5mergeable_state: unstable、CLA 已签、零评审、1 提 2 文件 +115/−0。今晚不可能进版本。delete 旧键,再判 responseSchema / response_schema 是否已存在,存在就跳过。responseSchema 优先,补丁不会覆盖它。
responseSchema;注释第 538-539 行写明了「上游接受但静默忽略」与「@ai-sdk/google >= 4.0.70 只发新字段」。6schema_cleaner.go 有一段标着 [SAFETY] 处理空 Object:当 schema 是 type: object 但没有 properties 时,会注入一个 reason 字段并写进 required。7reason。model_cooldown,带 reset_time 与 reset_seconds 两个字段。8remaining=96h32m3s 这类量级,另一例回包的 resets_in_seconds 是 568157。parseCodexRetryAfter 读到 resets_in_seconds 就 time.Duration(resetsInSeconds) * time.Second 直接返回,既没有最小值也没有上限。9resets_at 那条分支同理,resetAtTime.Sub(now) 拿到多少就是多少。
resets_at(第 535-540 行)与 resets_in_seconds(第 542-545 行)两条出口都直接返回,函数里没有任何钳制。生产样本的 244741 秒与 568157 秒就是从这里进的系统。9usage_limit_reached 且没开模型级冷却时,这条结果被标成凭证级。result.RetryAfter 非空就 cooldown := *result.RetryAfter,只加一个 10 秒下限,然后 next = now.Add(cooldown)、credentialNext = next。10
result.RetryAfter 非 nil 时只做下限钳制(第 1127-1129 行),随即 next = now.Add(cooldown);第 1143 行 credentialNext = next 把它升级为整张凭证的恢复时刻。下半段那条 30 分钟封顶的 quotaCooldownAfterFailure 只在 else 分支里。10auth.Quota.Exceeded 为真、Reason 是 credential_quota、NextRecoverAt 在未来,三条同时成立就返回冷却原因,这张凭证对所有模型都不可选。11resets_in_seconds: 244741,约 68 小时。12save-cooldown-status 默认是 false,一旦有人把它打开,冷却会落到磁盘上,重启也清不掉。13auth_index——管理端的凭证清单里就有这一列。auth_index 去空格后为空回 400 auth_index is required;找不到这张凭证回 404 auth not found;成功回 status / auth_index / models。save-cooldown-status 打开时也有效。17upstream.codex.model-level-cooling 打开(默认 false),usage_limit_reached 就只冷却被请求的那个模型,同一凭证上别的模型还能用。18max-retry-interval 调大。 它默认 30(秒),意思是请求不会为冷却原地等待;调到接近冷却时长,客户端就真的卡在那里。oauth.request-scoped-errors.<provider> 里写 status: 429、match: "usage_limit_reached"、action: "stop"。| 编号 | 作者 | 规模 | 改法 | 状态 | 已知代价 |
|---|---|---|---|---|---|
| #5764 | Blaryxoff | 2 文件 +12/−2 | Codex 额度冷却封顶 6 小时,resets_in_seconds 先比上限再换算,兼防 int64 溢出 | open / clean / 零评审 | 到点没有 single-flight,并发请求或多进程会一起打到上游;与 max-retry-interval 有交互 |
| #6735 | seonghobae | 12 文件 +336/−17 | 封顶 5 分钟,到点用下一次请求做释放检查,且不让原重置时刻仍在未来的凭证优先 | open / clean | 改动面大,碰到选号逻辑 |
input_tokens=0 时重复计费)也仍未合并,本篇不重复展开。model-level-cooling 打开、再拿管理接口清一次被按住的凭证。npmjs.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
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
status.openai.com
status.anthropic.com
status.cloud.google.com
codex-reset.com
discuss.ai.google.dev
community.openai.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.