shaw
2cffe1cf5f
fix(compact): SSE→JSON 保留 raw output_item.done 并为 unary 等待补下游心跳(修复 #3887)
#3887 报告 v0.1.149(已含 #3880 桥接修复)remote compact 仍失败且持续
计费。核实为 #3880 明示的两个遗留:
1. 上游对 unary compact 返回 SSE 且 compaction item 只出现在 raw
response.output_item.done、终态 completed.response.output 为空
(#3777 实录形态)时,reconstructResponseOutputFromSSE 只累加
text/function_call/reasoning 三类 delta,compaction item 被丢弃,
桥接合成 0 个 output_item.done,Codex 报 "expected exactly one
compaction output item, got 0" 后盲目重试,每次重试重新消耗上游
compact 配额。
2. 桥接为全缓冲写回:上游 unary 完成前(大上下文可达数分钟,且上游
处理期间不发送任何字节)下游连响应头都收不到,反向代理
(Nginx/Cloudflare Tunnel)空闲超时掐断连接同样触发盲重连
(同类问题见 #2243/#2976)。
修复:
- reconstructResponseOutputFromSSE 优先以 raw JSON 逐字节收集
output_item.done item(协议上的最终完整形态),不经窄结构体,
encrypted_content/summary/opaque 等 compact 专属字段全部保留;
无 done 事件时退回收集 output_item.added 中的 compaction 类 item;
两者皆无才回到原 delta 重建。path-based v1 JSON 写回同样受益。
- 新增 openAICompactSSEKeepalive:body-signal 客户端流式 compact 在
上游等待期间按 gateway.stream_keepalive_interval 向下游写 SSE 注释
行心跳(eventsource 解析层直接忽略)。首拍延迟一个间隔,快速失败
仍走 JSON+状态码;首拍后状态码固化为 200,桥接/错误链路
(writeOpenAICompactSSEBridge、errorResponse、
handleStreamingAwareError、ensureForwardErrorResponse、
writeOpenAINonStreamingProtocolError)统一降级为 response.failed
终止事件并标记 ops 流内错误。
- API-key 账号的 compact 上游请求也强制 accept: application/json
(#3777 期望行为 4;透传白名单原会放行客户端的 text/event-stream)。
测试:#3777 实录形态经 handleSSEToJSON / 透传 / path-based 三条链路
的修补断言;raw-done 优先不与 delta 重复;added 回退门控;心跳提交、
提交后 2xx 续写、提交后失败降级、未提交行为不变;-race 通过。
Fixes #3887
Refs #3777 #3875 #3880
2026-07-10 09:56:56 +08:00
..
2026-07-09 22:30:04 +08:00
2026-07-09 15:03:38 +08:00
2026-05-26 10:49:20 +08:00
2026-02-02 22:13:50 +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-02-07 22:14:07 +08:00
2026-07-03 21:02:31 +08:00
2026-07-06 16:45:15 +08:00
2026-01-06 20:31:40 +08:00
2026-07-02 15:58:29 +08:00
2026-07-05 08:35:34 +08:00
2026-02-07 17:12:15 +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-10 09:56:56 +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
2025-12-26 16:45:40 +08:00
2025-12-31 08:50:12 +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
2025-12-26 16:45:40 +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