shaw
16c0613b21
fix(compact): body-signal 客户端流式请求的响应合成回 SSE
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
2026-07-09 21:40:51 +08:00
..
2026-07-09 20:06:09 +08:00
2026-07-09 15:03:38 +08:00
2026-05-26 10:49:20 +08:00
2026-06-02 00:46:50 +08:00
2026-04-22 13:19:28 +08:00
2026-05-19 15:27:47 +08:00
2026-05-19 15:27:47 +08:00
2026-05-19 15:27:47 +08:00
2026-06-11 18:55:27 +08:00
2026-06-11 18:55:27 +08:00
2026-06-11 18:55:27 +08:00
2026-05-20 13:25:45 +08:00
2026-06-30 01:11:51 +08:00
2026-06-30 01:11:51 +08:00
2026-04-22 12:30:00 +08:00
2026-06-19 21:17:45 +08:00
2026-06-11 18:55:27 +08:00
2026-05-21 15:19:29 +08:00
2026-05-21 15:19:29 +08:00
2026-06-11 18:55:27 +08:00
2026-05-26 10:49:20 +08:00
2026-05-26 10:49:20 +08:00
2026-06-11 18:55:27 +08:00
2026-07-01 17:46:12 +08:00
2026-07-01 17:46:12 +08:00
2026-07-07 18:53:56 +08:00
2026-04-21 00:21:29 +08:00
2026-05-28 10:03:41 +00:00
2026-06-16 11:41:54 +08:00
2026-05-07 09:14:47 +08:00
2026-07-07 10:20:23 +08:00
2026-07-07 10:20:23 +08:00
2026-03-08 14:12:17 +08:00
2026-03-08 14:12:17 +08:00
2026-05-26 10:49:20 +08:00
2026-07-09 11:15:52 +08:00
2026-06-09 22:46:06 +08:00
2026-06-11 20:46:47 +08:00
2026-07-09 11:15:52 +08:00
2026-03-15 16:21:49 +08:00
2026-07-03 21:02:31 +08:00
2026-07-09 16:35:29 +08:00
2026-07-03 21:02:31 +08:00
2026-07-06 16:45:15 +08:00
2026-07-02 15:58:29 +08:00
2026-07-05 08:35:34 +08:00
2026-04-01 02:20:13 +08:00
2026-06-26 15:38:06 +08:00
2026-07-01 11:43:35 +08:00
2026-07-06 11:43:16 +08:00
2026-07-04 05:30:50 +08:00
2026-02-23 12:45:37 +08:00
2026-02-23 12:45:37 +08:00
2026-05-26 10:49:20 +08:00
2026-05-05 03:26:54 +08:00
2026-02-12 19:01:09 +08:00
2026-06-26 15:38:06 +08:00
2026-06-26 16:06:01 +08:00
2026-07-09 11:15:52 +08:00
2026-07-07 19:49:40 +08:00
2026-07-07 13:53:39 +08:00
2026-07-09 21:40:51 +08:00
2026-04-25 05:26:33 +00:00
2026-07-09 11:15:52 +08:00
2026-06-12 01:47:01 +08:00
2026-03-15 22:13:42 +08:00
2026-07-09 14:26:10 +08:00
2026-07-09 21:40:51 +08:00
2026-05-28 22:44:25 +08:00
2026-05-05 03:26:54 +08:00
2026-06-26 10:36:09 +08:00
2026-07-01 12:21:45 +08:00
2026-06-28 11:13:09 +08:00
2026-06-03 14:18:12 +08:00
2026-06-03 14:18:12 +08:00
2026-06-05 14:00:57 +08:00
2026-06-12 01:47:01 +08:00
2026-07-08 02:51:51 +00:00
2026-07-08 02:51:51 +00:00
2026-05-12 15:21:31 +08:00
2026-06-10 14:16:51 +08:00
2026-06-30 10:00:48 +08:00
2026-07-06 14:34:17 +08:00
2026-05-11 11:17:26 +08:00
2026-05-11 11:17:26 +08:00
2026-07-09 11:15:52 +08:00
2026-07-07 13:53:39 +08:00
2026-07-07 13:53:39 +08:00
2026-04-21 20:36:10 +08:00
2026-07-02 16:11:07 +08:00
2026-05-25 18:16:46 +08:00
2026-07-07 10:20:23 +08:00
2026-05-20 13:25:45 +08:00
2026-06-05 14:00:57 +08:00
2026-07-08 13:50:49 +08:00
2026-04-09 18:14:28 +08:00
2026-07-08 13:50:49 +08:00
2026-05-28 22:44:25 +08:00
2026-05-30 17:52:18 +08:00
2026-05-26 10:49:20 +08:00
2026-03-03 01:05:11 +08:00
2026-05-26 10:49:20 +08:00
2026-07-04 05:30:50 +08:00