superman2003
08ea29428d
fix(grok): recognize probed Free cache accounts
2026-07-15 14:07:01 +08:00
superman2003
f041b5cf0a
fix(grok): cache Free Messages function tools
2026-07-15 13:05:13 +08:00
Wesley Liddick
3f605c3543
Merge pull request #4303 from wp-a/fix/web-fingerprinted-asset-caching
...
fix(web): limit immutable caching to fingerprinted assets
2026-07-15 11:12:50 +08:00
Wesley Liddick
23796a1b34
Merge pull request #4291 from bestony/agent/user-server-timing/bes-26
...
feat: extend Server-Timing to authenticated user web APIs
2026-07-15 11:12:37 +08:00
Wesley Liddick
5b5e41450c
Merge pull request #4310 from jianjianai/codex/perf-scheduler-final
...
perf(scheduler): 完善缓存桶生命周期并复用重建批次查询
2026-07-15 11:09:47 +08:00
Wesley Liddick
4344f6afb0
Merge pull request #4298 from wp-a/fix/openai-images-json-completion-boundary
...
fix(images): preserve JSON completion boundaries
2026-07-15 11:08:47 +08:00
Wesley Liddick
6460b9895c
Merge pull request #4297 from wp-a/fix/openai-reset-credit-malformed-details
...
fix(openai): preserve reset count on malformed details
2026-07-15 11:08:25 +08:00
shaw
cf6aa1a5c3
fix(openai): 和解 #4304 与 #4306 的透传错误语义冲突
...
两个 PR 分别合并后在 main 上语义相撞(文本无冲突,CI 才暴露):
- #4306 把所有非 failover 透传错误重建为通用净化信封;
- #4304 要求确定性 context-window 错误不切号且文案对客户端可见
(如触发客户端自动压缩),其测试断言原文可达。
和解方案(保留双方意图):
- 净化器拆出 writeOpenAIPassthroughErrorEnvelope;context-window 错误
仍走本地 JSON 信封 + 净化头策略,但 message 使用脱敏后的上游消息,
不再抹成通用文案;其余错误净化行为不变。
- RebuildsUpstreamErrors 的两个 5xx 用例改用非瞬时状态码(530/501):
瞬时 5xx 对 API-key 账号已按 #4304 契约走 failover(由
APIKeyPassthrough_Transient5xxTriggersFailover 覆盖),净化重建
路径的 5xx 覆盖由非瞬时状态码继续承担。
2026-07-15 10:40:14 +08:00
Wesley Liddick
40a59c9e86
Merge pull request #4275 from jianjianai/codex/perf-u17-response-sse-flush
...
优化 Responses 流式事件边界刷新
2026-07-15 10:30:31 +08:00
Wesley Liddick
65d744d0e1
Merge pull request #4294 from caigee-cmd/fix/parallel-tool-use-ghost-delta
...
fix(apicompat): 并行 tool_use 幽灵 content_block_delta(index 错误)
2026-07-15 10:26:02 +08:00
Wesley Liddick
2381b6c104
Merge pull request #4304 from wp-a/fix/openai-passthrough-5xx-failover
...
fix(openai): fail over API-key passthrough 5xx
2026-07-15 10:20:44 +08:00
shaw
a38220ebdc
Merge origin/main into fix/openai-passthrough-5xx-failover ( resolve #4269 conflicts)
...
# Conflicts:
# backend/internal/service/openai_gateway_passthrough.go
2026-07-15 10:18:55 +08:00
Wesley Liddick
2ceaa4783c
Merge pull request #4311 from jianjianai/codex/perf-openai-forwarding-final
...
perf(openai): 优化 Responses 图片意图判定与透传流式刷新
2026-07-15 10:12:05 +08:00
Wesley Liddick
9b86585909
Merge pull request #4296 from wp-a/fix/openai-responses-sse-json-boundaries
...
fix(openai): repair concatenated Responses stream events
2026-07-15 10:11:55 +08:00
Wesley Liddick
42d1bf298d
Merge pull request #4306 from wp-a/fix/openai-passthrough-error-sanitization
...
fix(openai): sanitize passthrough upstream errors
2026-07-15 10:11:41 +08:00
shaw
eb7933af4c
fix(openai): 移除 #4269 合并时复活的旧版 Grok 错误路径处理
...
#4269 分支基于 #4212 之前的 main(merge-base da85cc7e),合并后把
ForwardAsAnthropic 错误路径上已被 #4212 重构移除的 Grok 块带了回来:
- xai.ParseQuotaHeaders 的 import 已被 main 删除,导致 main 编译失败;
- 该块与 failoverOpenAIUpstreamHTTPError 内部的 handleGrokAccountUpstreamError
重复(后者第一步就用新解析器 parseGrokQuotaSnapshot 更新配额快照),
保留会造成 Grok 错误双重处置。
删除整块,恢复 #4212 语义;#4269 的 agent identity 恢复逻辑保留不动。
2026-07-15 10:01:31 +08:00
Wesley Liddick
4355861ef2
Merge pull request #4269 from catoncat/agent/sub2api-agent-identity
...
feat(openai): support Codex Agent Identity authentication
2026-07-15 09:47:00 +08:00
Wesley Liddick
30df3f68e4
Merge pull request #4264 from lyon-le/perf/content-moderation-keyword-hot-path
...
perf(risk): 优化内容审核关键词热路径(优化性能)
2026-07-15 09:39:33 +08:00
Wesley Liddick
1c61225b28
Merge pull request #4271 from jianjianai/codex/perf-u10-ops-projection
...
优化 Ops 队列深度账号查询
2026-07-15 09:39:09 +08:00
Wesley Liddick
7cb8ece8d3
Merge pull request #4274 from jianjianai/codex/perf-u16-content-seed-scan
...
优化内容会话种子字段扫描
2026-07-15 09:38:59 +08:00
Wesley Liddick
8d13bbbea5
Merge pull request #4284 from zh239ns/codex/fix-openai-oauth-image-actual-size
...
fix(images): report decoded OAuth output dimensions
2026-07-15 09:37:34 +08:00
Wesley Liddick
125b03aee6
Merge pull request #4281 from bestony/feat/openai-ws-proxy-failed-host
...
fix(openai): include proxy host in websocket_proxy_failed logs
2026-07-15 09:37:04 +08:00
Wesley Liddick
65093591cd
Merge pull request #4282 from bestony/feat/openai-failover-switching-proxy-host
...
fix(openai): include proxy host in upstream_failover_switching logs
2026-07-15 09:36:53 +08:00
Wesley Liddick
1f91b69ca6
Merge pull request #4288 from wucm667/fix/issue-4285-gpt56-account-cost
...
fix: 修复 GPT-5.6 长上下文账号成本统计
2026-07-15 09:36:43 +08:00
shaw
a0593b0bf8
fix(gateway): 客户端断开后 failover 静默终止,不再误报 502 账号耗尽
...
上游请求经 detachUpstreamContext(WithoutCancel) 有意脱离客户端取消(保
计费),但 failover 循环仍用原始 c.Request.Context() 重新选号:客户端
断开后上游返回 520 等可 failover 错误时,重新选号必然得到 context
canceled,被误判为账号耗尽,记录并返回通用 502。
修复:客户端已断开 ⇒ failover 静默终止。
- 新增 failoverClientGone(c):请求 ctx 已取消时先停 compact 心跳
(建立 happens-before,对齐其它终结路径),响应未提交则标 499
(statusClientClosedRequest,与并发槽取消路径同惯例)
- 7 个 OpenAI 内联 failover 循环(Responses/Messages/chat_completions/
embeddings/images/grok_media/alpha_search)加双 guard:换号前 +
选号失败分支入口;guard 位于 ReportOpenAIAccountScheduleResult(false)
之后、RecordOpenAIAccountSwitch/池模式重试之前,账号健康副作用
(service 层 detached ctx)不受影响
- FailoverState.HandleFailoverError/HandleSelectionExhausted 入口加
ctx.Err() 检查返回 FailoverCanceled,取消不再改动 failover 状态;
全部 10 个 FailoverCanceled 分支统一调用 failoverClientGone 归类 499
- 上游 detach 与计费设计不变;真实上游 520 事件仍完整落 ops
(面板显示码 COALESCE(upstream_status_code,status_code)=520,
错误率/告警口径不变)
测试:新增 openai_responses_failover_cancel_test.go 复现 issue 场景
(520+取消 ⇒ 不切号、499、无 502 终态)+ 在线客户端对照(正常切换、
耗尽 502);failover_loop_test.go 补入口取消用例并修正取消语义断言。
Fixes #4257
2026-07-15 09:29:05 +08:00
Wesley Liddick
accb918eca
Merge pull request #4212 from heathermhuang/codex/fix-grok-oauth-credential-failover
...
fix(grok): fail over OAuth credential errors safely
2026-07-15 08:37:17 +08:00
jjaw
62be9db9df
补充调度缓存并发语义注释
2026-07-15 07:10:22 +08:00
jjaw
4aedbfc4a8
补充 OpenAI 转发复用边界注释
2026-07-15 06:59:00 +08:00
jjaw
143cab7bf5
复用重建批次内的账号查询
2026-07-15 05:31:50 +08:00
王鹏
536865032c
fix(openai): sanitize passthrough upstream errors
2026-07-15 04:47:16 +08:00
jjaw
8edad3a455
清理全量重建中的过期调度桶
2026-07-15 04:23:06 +08:00
王鹏
91dc31ef39
fix(openai): fail over API-key passthrough 5xx
2026-07-15 04:21:38 +08:00
jjaw
78e09a0f1a
复用请求级图片生成意图判断
2026-07-15 04:20:11 +08:00
王鹏
60bae26a2f
fix(web): limit immutable caching to fingerprinted assets
2026-07-15 04:00:46 +08:00
jjaw
43a2c13173
优化图片生成意图字段扫描
2026-07-15 03:54:32 +08:00
王鹏
2c13ed32e7
fix(images): preserve JSON completion boundaries
2026-07-15 03:15:47 +08:00
王鹏
d4da138cf5
fix(openai): preserve reset count on malformed details
2026-07-15 02:51:56 +08:00
王鹏
b286cca0c4
fix(openai): repair concatenated Responses stream events
2026-07-15 02:41:23 +08:00
jjaw
31a0efc747
退休已停用分组的调度缓存桶
2026-07-15 01:07:26 +08:00
蔡及
22e97898bb
fix: gofmt on parallel tool regression test
2026-07-15 00:59:28 +08:00
蔡及
07732a5a35
test: add regression tests for parallel tool_use ghost delta ( #4193 )
...
Three tests covering the CC→Responses→Anthropic finalize path:
- TestStreamingParallelToolUseNoGhostDelta: full end-to-end with two
parallel tool_calls, asserts every content_block_delta targets a
started block
- TestStreamingParallelToolUseSecondToolPackedArgsDone: focused test
where tool 1 streams deltas and tool 2 has packed .done args
- TestStreamingThreeParallelToolsAllPackedDone: three tools all with
packed .done, the most extreme case
All three fail on unfixed code (ghost deltas on wrong indices) and
pass after the fix.
2026-07-15 00:47:04 +08:00
蔡及
4f3b5110e2
fix: parallel tool_use ghost content_block_delta (index error)
...
resToAnthHandleFuncArgsDone used state.ContentBlockIndex directly
instead of looking up from OutputIndexToBlockIdx like
resToAnthHandleFuncArgsDelta does. When multiple tool_calls arrive
in parallel and arguments come as a packed .done (no prior delta),
the second+ tool would emit content_block_delta on an index that
was never content_block_start'ed, causing Claude Code to report
"Content block not found".
Fix: resolve block index from OutputIndexToBlockIdx, and skip the
delta if the block is already closed or the index doesn't match
the current open block.
Closes #4193
2026-07-15 00:44:09 +08:00
bestony
324a491671
feat: extend Server-Timing to authenticated user web APIs
...
Mirror the Admin UI Server-Timing opt-in for user-facing pages so
authenticated callers can inspect total/app/db/redis/deps metrics on
session, profile, keys, usage, payment, and related user APIs.
- Collect when X-User-UI-Request=1 or path is on the user allowlist
- Emit for non-admin only on allowlisted paths (header is not auth)
- Exclude payment public/webhook surfaces
- Mark matching SPA requests and allow the new CORS request header
2026-07-15 00:23:27 +08:00
jjaw
9da4cfbdcc
增加调度分组生命周期租约
2026-07-15 00:12:40 +08:00
jjaw
5e43c7faac
优化透传流事件边界刷新
2026-07-15 00:00:40 +08:00
jjaw
8523a52c07
优化调度缓存桶退休原语
2026-07-14 23:08:17 +08:00
wucm667
25e6688af6
[verified] fix: apply long-context pricing to account cost
2026-07-14 22:31:39 +08:00
jjaw
92edda2f6e
优化透传图片意图判定复用
2026-07-14 21:57:26 +08:00
zh239ns
bef520b191
fix(images): report decoded OAuth output dimensions
...
ChatGPT OAuth may normalize explicit image size controls to auto while returning smaller raster bytes. Decode final image headers so Images API metadata and tier billing reflect the actual output for both streaming and non-streaming OAuth responses.
2026-07-14 20:31:17 +08:00
bestony
ba5b6970be
fix(openai): include proxy host in upstream_failover_switching logs
...
Enrich openai.upstream_failover_switching structured logs with proxy
identity fields (proxy_id, proxy_name, proxy_host, proxy_port) so
operators can see which outbound proxy failed when switching accounts.
Matches the existing gateway.forward_failed / websocket_proxy_failed
logging pattern.
2026-07-14 19:33:56 +08:00