
v8.0.36 的 Gemini 流式执行器把「终局事件已交付、客户端随后断开」的请求记成 499 与零 token;本期给四条判据、两处源码位置、一条已进 dev 的修复,以及同窗口另外三笔该动手的动作。
| 客户端行为 | 客户端看到 | 本机用量记录 |
|---|---|---|
| 读到 EOF | HTTP 200,completed,usage 11 输入 / 4 输出 | 成功,11 / 4 |
收到 response.completed 立刻断开 | HTTP 200,响应体里 usage.output_tokens=4 | failed=1、canceled=1、failure_status=499、failure_body="context canceled",token 全 0 |
499 / context canceled、token 全 0,另外 2 笔正常。34 条被取消的记录全部有 TTFT。1499;context canceled;usage 字段是有 token 的。
internal/runtime/executor/gemini_executor.go 第 419–427 行,v8.0.36 源码:读上游流的 scanner 一报错,就直接调 reporter.PublishFailure(ctx, errScan)。2reporter,不是 streamUsage。这一路上游发来的 usageMetadata 是先攒在 streamUsage 缓冲里的。defer streamUsage.Publish,入口在第 397–399 行。3context.Canceled——报障人记录里那句 failure_body 正是这七个字。
gemini_vertex_executor.go 第 878–892 行写着同一组判断:只要终局帧已经交付、错误又是取消,就直接返回,不记失败。6terminalDelivered:Vertex 的两条流(服务账号与 API key)、Antigravity 流、Meta 流都带着这层判断,唯独 Gemini 执行器没有。7b12db8c3d8b6,标题是 fix(gemini): preserve usage after terminal stream cancellation,Closes: #6821,改 4 个文件 +228/−32。8terminalDelivered。context.Canceled,直接返回。reporter.PublishFailure 改成 streamUsage.PublishFailure,把缓冲里的 token 一起写进去。defer streamUsage.Publish 换成:context 已取消且终局没交付才算失败,否则按成功发布。9
internal/runtime/executor/helps/gemini_stream_terminal.go 把名单写死:data: [DONE]、[DONE]、response.completed、response.incomplete、response.done、message_stop,以及四种带非空 finish_reason / finishReason 的路径。10executeInteractionsStream,dev 上第 682 行仍是 defer streamUsage.Publish,第 750–757 行仍是 reporter.PublishFailure,没有终局标记也没换缓冲。11gemini_stream_terminal.go(按 tag 直取是 404),最新 tag 仍是 v8.0.36,发布时间北京时间 10-21 01:18。12failure_status=499 + context canceled + TTFT 非空 + 对外 200。挑出来的笔数与 token 就是这台的漏账规模。usage 补记;至少要在对账时把它们从「取消」里摘出来,别当成失败率。df07b1e59(今晨 08:44):上一期那个空文本块修好了。 上一期报的 #6820,修复进了 dev:两个翻译器(Responses 与 Chat Completions)都丢空文本块与纯空白块。Fixed 标签但仍开着;另有一张独立 PR #6822 提出同样的修法,现在状态是冲突(mergeable_state: dirty),别按它判进度。06fd5b8bc(今晨 08:03):上一期说「面板看不出来」的三个缺口补了。 上一期讲 SIWC 令牌失效在面板上没有字段能看出来,这笔提交加了只读状态接口 GET /v8/management/oauth/siwc/status?name=<凭证>(也接受 auth_index),返回 off / valid / invalid。17expires_in 算,不再用扣过 3 分钟提前量的值)。0543eaa80),改 6 个文件 +133/−13。20response.incomplete:max_output_tokens 映射成 max_tokens,content_filter 映射成 refusal,流式与非流式两条路都走,并且截断优先于 tool_use / end_turn 的原有优先级。21end_turn 收尾:客户端以为模型自己说完了,用量也一并丢掉。incomplete-stop-reason.ts 在 v2.1.19 上是 404。end_turn 当成「模型自己说完了」。被截断的回答现在长得一样。22trade_no 一致,任何一条不满足就报错。25confirm failed,订单不推进。upstream confirmation failed 与 PAYMENT_UPSTREAM_UNCONFIRMED。命中就是这道新确认没过,不是回调没到。v0.2.16 没有这道确认,回退即恢复——这与两位报障人的观察一致。error.type=overloaded_error 或 message 含 server is busy),并给快照冷却加 2 小时硬上限。28/v1/models 带上 context_window / max_context_window,省掉客户端用自带过期目录导致的过早压缩。30tools[0]: missing field 'name',报障人给的是 v0.2.17。单条,暂无补丁。3101M5E4G39TD1BW1QWHZG6RFA5H,名称是 Degraded performance in ChatGPT, Codex, and APIs,影响等级 minor。components 为空数组),只按服务名标注。同一时段官方社区出现一条多条会话打不开的帖子(社区时间 10:38),与这次降级时间吻合,可作为旁证。34executeInteractionsStream 还是旧写法。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
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
community.openai.com
status.anthropic.com
status.cloud.google.com
codex-reset.com
opentherank.com
reddit.com
reddit.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.