mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-26 00:00:54 +00:00
v0.1.147 的 body-signal 提升(#3804)把 Codex remote compact v2 的流式 /responses 请求改写为上游 unary /responses/compact(JSON),但把 JSON 文档原样写回给了按 Responses SSE 协议消费的客户端。Codex 只从 response.output_item.done 收集 item 且必须收到 response.completed, 收到 JSON 后报 "stream disconnected before completion: stream closed before response.completed" 无限重连,每次重连再白烧一次上游 compact 配额(#3875,v0.1.146 无提升逻辑故正常)。 修复保留提升的全部收益(requireCompact 调度过滤、compact 模型映射、 白名单归一化、上游 unary JSON),补上协议转换缺失的响应半程: - handler 在 body-signal 提升时记录原始 body 的 stream:true 意图 (MarkOpenAICompactClientStream);path-based 请求不标记,Codex v1 unary 协议与链式 sub2api 的 JSON 写回行为保持不变。 - 四个非流式写回点(handleNonStreamingResponse / handleSSEToJSON / handleNonStreamingResponsePassthrough / handlePassthroughSSEToJSON) 对已标记的 2xx JSON 响应经 writeOpenAICompactSSEBridge 合成最小 Responses SSE:每个 output[] item 一条 response.output_item.done (原始字段逐字节保留),最后一条 response.completed 携带完整 response 对象。 - 按 codex-rs 解析器硬约束兜底:先 json.Compact 防 pretty JSON 换行 破坏 SSE 帧;response.id 缺失时注入 resp_*(必填 string);usage 缺 input_tokens/output_tokens/total_tokens 整数字段时整体删除, 避免整条 completed 事件解析失败。 - 非 2xx 一律保持 JSON 原样,Codex 依赖 HTTP 状态码走重试链路。 新增 9 个 service 测试 + 4 个 handler 测试覆盖合成形态、id/usage 兜底、 path-based 不受影响、主链路/透传链路/上游 SSE 提取再合成三条端到端。 Fixes #3875 Refs #3777