
同一人在 22:02–22:03 连开三条流式缺陷单:AI Studio relay 丢末帧、取消被记成成功、WebSocket 的 401 被本地 408 顶掉;三张补丁都没合,另有分组按张计费合入主干与一张外部调度诉求被关成 not planned。
finishReason 与 usageMetadata。response.completed,claude 没有 message_stop。
internal/runtime/executor/aistudio_executor.go 第 383–412 行:wsrelay.MessageTypeStreamChunk 分支拿到 event.Payload 后,只调一次 TranslateStreamWithClaudeInputTokens,chunk 内部没有再按 SSE 空行切分。wsrelay.decodeChunk 把 payload["data"] 原样返回,现有测试也是一帧一个 chunk。data:、event:、id:、retry:、注释)开头时按空行切帧,每帧单独走完观察模型、用量、翻译、错误捕获和 apply_patch 停止这一整套。[DONE] 开头的不切,避免把漂亮打印的 JSON 拆坏。两个文件 +266/−17,mergeable clean,自动评审在 22:02 给出的结论是有未解决问题5。nextStreamChunk 在 ctx.Done() 与数据通道之间做 select。执行器在请求上下文结束时关闭自己的通道,于是取消发生之后两个 case 同时就绪,Go 随机挑一个。!ok 会让上游把这一轮当成正常结束。带投递跟踪的流会由 streamDeliveryCompletion 按投递结果纠正。usage.StreamDeliverySupported 为 false,插件在 CompleteRequest 里收到 succeeded3。
sdk/api/handlers/handlers_interceptors.go 第 231–255 行:第 244–248 行的 select 里,取消与读通道两个 case 平级;读到关闭的通道后只把 *closed 置真,第三个返回值仍是 false。golang:1.27-bookworm linux/amd64(在 arm64 Mac 上模拟)跑 TestIssue6332PluginNestedDelivery/cancel_partial,40 次 -race 挂 2 次。outcome=succeeded,而客户端那条连接已经断开,两边对不上时就值得查这里。取消率高的实例上,这个偏差会被放大。forwardResponsesWebsocket 同时 select 错误通道和 data 通道。生产者把终局错误先塞进带缓冲的 errs,再关掉 errs 与 data;当 select 先读到已关闭的 data,这一轮就以「stream closed before response.completed」收场。
sdk/api/handlers/openai/openai_responses_websocket_forward.go 第 126–150 行:data 关闭且未完成时,第 141–143 行直接构造 StatusRequestTimeout 与那句断流文案。upstream requires HTTP replay),告诉客户端可以重放;现在客户端只看到一条断开。/v1/responses 的 WebSocket 会话莫名断开,服务端日志在同一秒有 401/429 记录。errs,把缓冲好的错误取出来。两个文件 +78/−28,自动评审 22:03 结论是无问题7。bdde391d,Closes: #6971,4 个文件 +46/−18。response.completed 这个正常终局上补 candidates.0.finishReason: STOP,原来只有 response.incomplete 才写。OpenAI→Gemini 那个「有内容块就 return true」的分支,现在遇到非空的 finish_reason 会继续往下走到结束原因处理。bc064340,v8.0.42 的这两个翻译器文件没有这几行9。27f3abfb 的 session 级 OAuth 代理,3dae075d 把 devin 的 swe-2 lightning 多个 UID 聚成一个模型10。两笔都还在 dev。groups 加一列 image_count_billing,默认 false,面板上叫「按张计费」11。v0.2.18 整包里没有 image_billing_count.go,分组表里也没有这一列,按张计费要等下一个版本。用量记录里的 image_count 在 v0.2.18 已经有了。reasoning_effort: "off" 关思考,OpenAI 兼容客户端把这档写成 none,上游当未知值拒掉,整个请求 40012。shouldFailoverOpenAIUpstreamResponse 里能直接看到。能触发换号的状态码是 401、402、403、405、429、529 与 5xx。
backend/internal/service/openai_gateway_upstream_errors.go 第 302–336 行:第 303–310 行的 switch 只列 401、402、403、405、429、529 与 5xx;第 337–339 行的 400 例外只对 OpenAI 兼容账号的「模型不存在」生效。reasoning_effort_mappings 把 none 映成 off。分组级映射在 v0.2.18 已经存在14;PR 作者没走这条路,理由是同一分组里的 Go 与官方账号会被一起改写。messages[] 里插入 role:"system" 的会话中消息,配置文件里能开的只有 rebuild-mid-system-message,作用是把它们搬进顶层 system 字段,v8.0.42 没有丢弃这一档15。input_tokens 458285。rebuild-mid-system-message 只有开关、没有模式;payload 规则按路径改字段,删不掉「role 为 system 的那几条」。要么在请求到你看得见的那一层先删,要么换一个接受搬家的上游。internal/home 与 sdk/cliproxy/auth/conductor_home.go),并建议对接 CLIProxyAPIHome。想自己做调度的,路线从「拿一个受限管理 key」变成「实现 Home 的调度接口」。| 仓库 | 当前版本 | 发布时间(北京) | 窗口内主干动作 |
|---|---|---|---|
| CLIProxyAPI | v8.0.42 | 10-24 22:21 | dev 三笔(22:17),main 未动 |
| sub2api | v0.2.18 | 10-23 15:44 | main 一笔直接提交(21:30)+ #8323 合并(21:48) |
| codex-proxy | v2.1.20 | 10-23 03:56 | 无 |
| codex2api | v3.1.1 | 10-17 05:42 | 两个合并(22:44):#832 非流式 Images 不再发 102、#833 HTTP 代理 502/504 回退 IPv6 探测 |
github.com
github.com
github.com
github.com
github.com
github.com
status.openai.com
status.claude.com
status.cloud.google.com
codex-reset.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.