
CLIProxyAPI v8.0.43 在 23:37 发出,上一期那三条流式缺陷连同白天五处修复一起进版;作者四张补丁仍未合并,其中一处首帧读取的同型写法被漏掉,另有一条链式网关 408 被写成 502 的草稿补丁没合。
splitRelayFrames,按空行把 chunk 切成单帧;以 SSE 字段开头的块保留 data: 行,裸 JSON 与 [DONE] 整块不切。4 模型观测、用量解析、元数据过滤、翻译四步改成逐帧跑。
for _, frame := range splitRelayFrames(event.Payload) 是这次改动的入口,第 390–395 行把模型、用量、翻译逐帧跑一遍;取自提交 30780351 的 aistudio_executor.go 第 383–410 行,也就是 v8.0.43 里的同一段代码。select 在两者之间随机挑,挑到通道关闭就把这一轮当成正常结束。6if !ok && ctx.Err() != nil 就直接报取消。7 五行代码,二十行测试。
select 是随机的,单纯的关闭会被当成成功。取自 handlers_interceptors.go 第 241–262 行。readInitialStreamChunks 里同一处写法,新增 69 行;落地只收了其中 24 行,另外 45 行没有采纳。8handlers_stream.go 第 488–510 行还是老结构:select 在 ctx.Done() 与 chunks 之间随机,随后 if !ok 直接置 streamClosedBeforeRead。9
select:取消置 streamCanceledBeforeRead,通道关闭置 streamClosedBeforeRead,两条路只差一个分支却记账不同。取自 handlers_stream.go 第 486–510 行,v8.0.43 与它相同。streamCanceledBeforeRead 会把这一轮写成 canceled,10 走关闭那条路时 completionOutcome 停在 succeeded。建连之后、首字节之前被客户端掐掉的请求,在插件统计里可能被算成一次成功。stream closed before response.completed,上游那句 1012 重放提示一起丢掉。11handlers.PendingStreamError 排空 errs,标准与 duplex 两条转发路径都覆盖,共 79 行新增、28 行删除,另附 36 行回归测试。12 作者补丁 #6982 的 75 行新增里有 65 行与此相同。13-race 下两个 websocket 测试各自 40 次挂 2 次,改成在 upgrade 之前编号连接、等请求体到达再回完成帧。15 作者补丁 #6984 的 48 行新增与落地逐行一致,一张测试补丁被完整收下。$ref 与 allOf 解析之后。1response.completed 之前断」统一回 408、code 是 request_timeout。16 外层的 codexTerminalFailureStatus 不认这个 code,落 default 回 502。
case errorCode == "request_timeout",紧邻的第 202–203 行 default 回 502 就是 v8.0.43 现在对这类错误的处理;取自 PR #6986 头分支 codex_executor_terminal.go 第 190–206 行。conductor_cooldown.go 第 1220 行把 408、500、502、503、504、520–526 一并算成可恢复失败,写入 NextRetryAfter 并把凭证标成不可用。17 默认 transient-error-cooldown-seconds: 0 折算成 60 秒,于是一次被上游截断的请求会把一张健康凭证锁一分钟。sdk/cliproxy/executor/types.go 第 287 行有 IsRequestScoped(),18 conductor_cooldown.go 第 2391 行会先看这个标记再决定要不要冷却。19 缺的是 statusErr 结构体没实现它——补丁加一个 requestScoped 字段、在 408 且错误体不是鉴权/限流/配额类时置真,这条路就通了。20routing.cooldown.transient-error-cooldown-seconds 设成 -1,让瞬时错误一律不冷却;要么接受这 60 秒,把重试交给客户端。前者的代价是真的 5xx 也不再摘号。tools 与历史里的 input[].additional_tools 按拼接合并,同名函数两份一起发给上游,回 400 Duplicate function definition provided: clock__sleep。21 提交 0c61b12c 按工具名去重、先到先得,已随 v8.0.43 发出。22 还没升版的机器,避开它的办法是新开会话,或把会话里带过来的 additional_tools 清掉。host.model.execute_stream 重放一段 Claude Messages 请求时拿不到调用方身份,MCP 工具别名退回默认密钥,tools 段与原始请求不同——而 tools 是 Anthropic 缓存前缀的第一段,重放打不中原请求写下的 prompt cache。23 提交 e48d780f 把 caller scope 暴露在拦截结构上并接受在 HostModelExecutionRequest 里,已随 v8.0.43 发出。24effective_at 为空,最新一条帖的时间是 22:38。31git ls-remote 里 refs/tags/v8.0.43、refs/heads/main、refs/heads/dev 三者都是 30780351;配置不用动,两份 config.example.yaml 逐字节相同。finishReason 与 usageMetadata;WebSocket 客户端收到 401 或 429 的原码;取消的请求在插件统计里记成 canceled——这一条仍有残留,建连后首字节前取消的那批可能还算成功。-1 或接受一分钟锁号,等 #6986 合了再恢复默认。refs/tags 不再指向 30780351,以及 #6979 那一半有没有被补上。github.com
github.com
github.com
github.com
patch-diff.githubusercontent.com
github.com
github.com
patch-diff.githubusercontent.com
github.com
github.com
github.com
github.com
patch-diff.githubusercontent.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.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.