
CLIProxyAPI 的三条出口都把上游的 MALFORMED_RESPONSE 读成正常结束,空回复会被客户端当成成功重发;同窗口还有 d946c4fb 留下的记账竞态、一条非 Codex 客户端 503 的归因,以及 sub2api composite 分组里被静默跳过的推理强度映射。
MALFORMED_RESPONSE,客户端收到的却是一句「正常结束」。1stop,Claude 出口写成 end_turn,Responses 出口写成 response.completed。三条都不报错。native_finish_reason。3
internal/translator/gemini/openai/chat-completions/gemini_openai_response.go 第 252–276 行:第 260 行判定末块,第 266 行只放行 MAX_TOKENS,第 269 行兜底写 stop,真实原因只留在第 272 行的 native_finish_reason 里。resolveGeminiClaudeStopReason 把 SAFETY、RECITATION、PROHIBITED_CONTENT、SPII、BLOCKLIST、IMAGE_SAFETY 映射成 refusal,其余落 default,返回 end_turn。4MALFORMED_RESPONSE 不在那张名单里,于是走了 default。
internal/translator/gemini/claude/gemini_claude_response.go 第 39–63 行:第 42 行那条固定错误只写给 MALFORMED_FUNCTION_CALL,第 55 行把安全类原因映射成 refusal,第 59 行的 default 归成 end_turn。geminiResponsesTerminalState 只把 MAX_TOKENS 判成 response.incomplete,其余全部 response.completed。6MALFORMED_RESPONSE,零命中。三条出口没有一条认识这个词。promptFeedback.blockReason 不被 geminiStreamHasFinishSignal 认」。v8.0.40 的那份名单里,这条与它的 response. 变体都已经在里面了。7native_finish_reason,别判 finish_reason。看到 malformed_response 就重试(上游是概率性的,报障人第四次成功),看到 safety 就别重试,重发也是白烧 token。go test -race ./sdk/api/handlers/openai 在 d946c4fb 上直接挂。这条链是:流结束后 wrapStreamResult 起的 goroutine 记账,走到 IsCodexClientRequest,那里读 ctx.Value("gin").(*gin.Context).Request.Header。10conductor_stream.go 第 224 行。11authAccessTokenForRequest 选令牌分区。12
sdk/cliproxy/auth/types.go 第 876–893 行:第 879–880 行直接从 gin.Context 上取 User-Agent,而这个 Context 由 gin 的 sync.Pool 回收给下一个请求;第 895–900 行的 IsCodexUseSIWCForRequest 正是靠它决定用外层令牌还是 SIWC 令牌。use_siwc。分区选错,401 记账就会记到另一个令牌上:好令牌被标成被拒,或者被拒的那个没被标。d946c4fb,所以在跑 v8.0.40 的现网都带着它。修法是把判定在请求 goroutine 上先算一次、存进 ctx(withCodexClientRequestSnapshot),这个 PR 还没合。X-OpenAI-Internal-Codex-Responses-Lite: true 才能用。14web_search_call 历史、跳过 image_generation 工具注入、把 parallel_tool_calls 置 false;另外三处在 websocket 的请求、连接与入口上。161718use_siwc 的账号走 SIWC 令牌,base URL 缺省落到 https://api.openai.com/v1;Codex 客户端绕开 SIWC,用外层令牌,缺省落 https://chatgpt.com/backend-api/codex。1920error.code。写着 auth_unavailable 或 model_cooldown,是本地发的——本地这条 503 还带 Retry-After。21use_siwc。开了,非 Codex 客户端走的是 api.openai.com/v1,Codex 客户端走的是另一台主机。server_is_overloaded 那种,状态码是对的,错在流里。parallel_tool_calls。/v1/messages、上游也是 /v1/messages,客户端显式传 output_config.effort。22deepseek-flash、low → max。实际发到上游的仍是 low,没有任何报错或日志。
backend/internal/handler/composite_platform.go 第 62–76 行:第 67 行先放行 anthropic / openai / composite 三种分组,第 69 行取到实际目标平台,第 71–73 行再要求它必须是 anthropic 或 openai——composite 路由到 DeepSeek 就停在这一行。OriginalRequest 与 Payload,各 base64),插件侧实际长度变成客户端 body 的 8/3 倍。29 附带一份报告文件,0 评论。cpa_latency_swap_v1,用带标记的 PING 帧采 RTT,不上报不延长心跳期限,再按每轮预算探测候选节点。30https://chatgpt.com/settings/usage?tab=analytics,那里能看出是不是同一个号被多个实例用。31| 处境 | 今天做什么 | 依据 |
|---|---|---|
| 客户端偶发空回复,日志却一切正常 | 判 native_finish_reason:malformed_response 重试,safety 不重试 | gemini_openai_response.go |
| 还在 v8.0.32 及更早,安全拦截被报成断流 | 升到 v8.0.33 及以上,那份终止名单已含 promptFeedback.blockReason | gemini_executor.go |
跑 v8.0.40 且 codex 号开了 use_siwc | 401 记账可能记到错的分区;盯 401 与刷新日志,别只信面板状态 | #6901 |
| 非 Codex 客户端调 gpt 拿到 503 | 先看 error.code:auth_unavailable/model_cooldown 是本地,其余看第 3 步 | errors.go |
想靠加 Responses-Lite 头解决 503 | 它只改 body 不改路由;先在测试号上对比两次上游 body 再决定 | codex_executor_request.go |
| composite 分组绑了 DeepSeek,推理强度映射没生效 | 平台闸会直接跳过;客户端自己带 effort,别等这层映射 | composite_platform.go |
| 想确认「并发超限」是不是自己造成的 | 去 ChatGPT 用量分析页看这个号被几个实例用 | #8294 |
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
github.com
github.com
status.openai.com
status.claude.com
status.cloud.google.com
codex-reset.com
opentherank.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.