
这一小时四仓零新版本:antigravity 上两个并行工具调用会被并成一条、回放账本还会串到别人的会话,修复只落在 dev;sub2api 六条合并里有两条会改你的行为。
index 是 0、1、1。OpenAI 客户端按 index 聚合 delta,call2 与 call3 因此被合成同一个调用,两段参数拼成了一段,客户端拿到的参数多半是段非法 JSON。FunctionIndex 并自增。tool_calls 数组,就把值改写成这个数组的长度。块内计数是局部的,流内计数是全局的,两者混用了。
internal/translator/antigravity/openai/chat-completions/antigravity_openai_response.go 第 175–189 行(GitHub 源码页截图,2026-10-21 读取)。第 179 行取流内计数器,第 180 行自增,第 181–182 行在本块已有数组时把值覆盖成数组长度——覆盖之后,同一块里的第二个调用会重新从 1 开始。choices[0].delta.tool_calls 里的 index 有没有重复。sdk/translator 的公开注册表就能拿到 0, 1, 1。NONE 时,applyOpenAIToolChoiceToAntigravity 会把整个 request.tools 删掉(第 531–533 行)。thoughtSignature。这一轮回放时工具声明已经不在请求里,签名失去了落点。request.tools 与 request.toolConfig 一起算进了哈希(第 1577 行)。antigravityReasoningReplayScopeFromRequest(第 99 行起)。Session-Id 头,或同一段请求体推出同一个 sessionId——就会共用同一份 Gemini 推理链。A 的推理链会被当成 B 的续写。Closes: #6825,其中 362 行是新增的回归测试。index 统一用流内计数器,去掉块内长度的覆盖。NONE 时保留 request.tools,只改 toolConfig.functionCallingConfig.mode。systemInstruction 与前序 contents,带 openai-chat-v1: 前缀;老账本按原算法匹配,互不干扰。
internal/runtime/executor/antigravity_reasoning_replay.go 第 104–129 行(GitHub 源码页截图,2026-10-21 读取)。第 114 行标记这是一条 OpenAI Chat 请求,第 115–116 行的注释写明调用方身份只从可信执行元数据取,第 117–124 行把 caller scope 的哈希拼进 sessionKey。tool_choice: none。改在代理侧用 payload.override 把 toolConfig.functionCallingConfig.mode 设成 NONE,payload 规则在翻译之后应用,request.tools 会留着。prompt_cache_key 或 Session-Id。/v1/messages 打 antigravity。这条路绕开的是第一条症状,index 那段代码只存在于 chat-completions 翻译器。账本仍由同一个执行器建,第三条症状照样在。Fixed 标签,状态还是 open。| PR | 合并(北京) | 规模 | 一句话 |
|---|---|---|---|
| #8166 | 17:42 | 18 文件 +624/−24 | Vertex service_account 账号支持配额上限 |
| #8167 | 17:43 | 22 文件 +691/−46 | 分组生图开关对 Gemini 系入口生效 |
| #8210 | 17:43 | 13 文件 +1728/−206 | Anthropic 账号兼容流式断开后读完上游再计费 |
| #8249 | 17:43 | 9 文件 +388/−33 | 单 antigravity 账号分组判定改按需求值 |
| #8250 | 17:44 | 2 文件 +139/−16 | 模型映射签名与遍历顺序无关、零分配 |
| #8251 | 17:44 | 7 文件 +1637/−46 | 调度快照解码结果常驻内存 |
/v1beta/models、/v1/messages、/v1/chat/completions、/v1/responses 都不检查这个开关。gemini- 开头且带 -image,或者请求体的 responseModalities 含 IMAGE。handle403 里直接 handleAuthError 永久停号。
backend/migrations/246_enable_gemini_image_generation_groups.sql 全文(GitHub 源码页截图,2026-10-21 读取)。第 1–2 行的注释写明了回填范围,第 5–6 行只更新 gemini 与 antigravity 两个平台、只改当前为 false 的行。responseModalities: IMAGE 会收到 400。false 不生效,与 grok 同口径取 OR,要关只能在创建之后编辑。/v1/chat/completions 与 /v1/responses 走 Anthropic 账号时,客户端断开后原来直接返回。message_delta 还没读,output_tokens 记 0;在 message_start 之前断开,连 input 也记 0。/v1/messages、Bedrock 与 OpenAI 侧兼容路径都是读完上游再计费,只有这两条例外。ForwardResult.ClientDisconnect 置真,读取间隔卡在 gateway.stream_data_interval_timeout(默认 180 秒)。platform in (gemini, antigravity) and allow_image_generation = false 的分组,再逐个看 composite 分组。/v1/responses 回 429 model_cooldown。CPA 的 error 日志里有这条请求,下游的 usage 消费端里没有。usage_limit_reached。Retry-After: 3299、reset_seconds: 3299、reset_time: 54m58s。sdk/cliproxy/auth/selector.go 的 modelCooldownError 生成,停在选号阶段。codex_executor_stream.go。选号失败没进执行器,也就没有发出 usage 事件。
sdk/cliproxy/auth/selector.go 第 119–152 行(GitHub 源码页截图,2026-10-21 读取)。第 142 行的 code: model_cooldown 与第 145–146 行的 reset_time、reset_seconds 都在这里组装,位置本身说明请求止步于选号。usage.speed 里标明这次响应按 fast 还是 standard 计费,fast 档更贵。parseClaudeUsageNode(internal/runtime/executor/helps/usage_helpers.go 第 1176 行起)只读 token 字段。ResponseServiceTier 因此一直是空的,fast 档响应被按 standard 计价。作者已经在 fork 上跑了三周,说没拿线上 fast 流量验过。backend/internal/service/subscription_bulk_action.go。MaxBulkSubscriptionActions = 100,第 29 行校验「必须显式列 ID 且不超过 100 条」。This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.