Wesley Liddick
b73d8c3efe
Merge pull request #4009 from heathermhuang/codex/fix-recent-grok-issues
...
fix: expand Grok API, CLI, billing, and setup support
2026-07-13 10:36:11 +08:00
Heatherm Huang
f73031f436
test(grok): align scheduling reasons with upstream
2026-07-13 10:21:34 +08:00
shaw
64a2a31729
fix(billing): 修复复审发现的三处按次计费问题
...
- HIGH: GetByKeyForAuth 的 WithGroup 显式 Select 补 web_search_price_per_call 列,
否则 auth 快照里分组覆盖价恒为 nil,覆盖价/免费配置在实际计费中静默失效
- MEDIUM: 按次搜索倍率改用不含高峰因子的基础倍率(与 image/video 按次不变式
及分组表单价格预览承诺一致),calculateOpenAIRecordUsageCost 新增独立倍率参数
- LOW: 计费门槛从 <400 收紧为严格 2xx,1xx/3xx 透传不计费
2026-07-13 10:14:53 +08:00
Heatherm Huang
aeb34d2003
fix(grok): sanitize composer reasoning parameters
2026-07-13 10:11:33 +08:00
Heatherm Huang
f187f08ae3
fix(grok): harden OAuth routing and CLI version guard
2026-07-13 10:11:33 +08:00
Heatherm Huang
3375b4ed2b
fix(grok): route OAuth subscriptions through CLI proxy
2026-07-13 10:11:33 +08:00
Heatherm Huang
d9e466ad3a
feat(grok): support xAI API key accounts
...
Allow Grok API-key accounts in Responses forwarding and connection tests, expose creation and edit defaults in the dashboard, and document the supported setup.
2026-07-13 10:11:33 +08:00
Heatherm Huang
038b25c0b1
fix(grok): resolve recent integration issues
2026-07-13 10:09:53 +08:00
shaw
7cbb36f278
feat(billing): Codex alpha/search 网页搜索按次计费
...
- alpha/search 成功请求(上游 2xx)按次计费落 usage_logs(billing_mode=per_request),
上游错误透传/failover 不计费;使用 mandatory 池提交,池满同步兜底不丢扣费
- 单价默认 0.01 USD/次(官方 $10/1000 次),分组新增 web_search_price_per_call
覆盖价(0=免费,负数/留空=默认价),实际扣费叠加分组费率倍数(与 token 口径一致)
- 分组字段全链路:ent schema + 迁移 174 + 端口快照 v15 + admin 创建/更新 + DTO
- 前端分组表单(openai 平台)新增单次价格配置,实时预览应用当前倍率后的单次价格
- 该端点鉴权维持仅 OpenAI 分组(非 OpenAI 分组 404)
2026-07-13 09:54:51 +08:00
shaw
8d51364c3d
Merge remote-tracking branch 'origin/main' into feat/grok-prompt-cache-identity
...
# Conflicts:
# backend/internal/handler/endpoint.go
# backend/internal/service/openai_gateway_grok_test.go
2026-07-13 09:12:44 +08:00
Wesley Liddick
33b1d772f7
Merge pull request #4063 from yardbirds0/fix/codex-alpha-search
...
fix: 转发 Codex alpha/search 独立搜索端点
2026-07-13 08:58:01 +08:00
Wesley Liddick
1c214eaca4
Merge pull request #4059 from visa2/fix/openai-messages-codex-identity
...
fix(openai): restore Codex identity headers for OAuth Messages
2026-07-13 08:56:21 +08:00
Wesley Liddick
841481e051
Merge pull request #3971 from yardbirds0/codex/fix-remote-compaction-v2
...
fix: 保留 remote_compaction_v2 原生 Responses 请求链路
2026-07-13 08:54:53 +08:00
Wesley Liddick
2f4478fd32
Merge pull request #4019 from wucm667/fix/compact-keepalive-writer-nil-guard
...
fix(service): 补齐 compact keepalive writer nil 守卫
2026-07-13 08:54:31 +08:00
Wesley Liddick
877bee84a1
Merge pull request #4072 from jianjianai/codex/fix-upstream-review
...
修复 tool_search 参数解析与 compact writer 生命周期
2026-07-13 08:54:15 +08:00
superman2003
7050070aa3
fix(grok): route cacheable chat requests via responses
2026-07-12 11:50:56 +08:00
jjaw
06af8115f7
修复 compact 心跳 writer 生命周期
2026-07-12 04:53:41 +08:00
visa2
d5b47c2142
fix(openai): restore Codex identity for OAuth Messages
2026-07-11 20:47:52 +08:00
superman2003
1dedb2097d
fix(grok): persist quota exhaustion as rate limit
2026-07-11 20:41:32 +08:00
Tian Lee
52071d391b
fix(openai): 转发 Codex alpha/search 独立搜索端点
2026-07-11 20:31:33 +08:00
superman2003
0478fd3668
feat(grok): enable free OAuth prompt caching
2026-07-11 19:34:01 +08:00
Tian Lee
84bb7d0709
fix: 保留 remote_compaction_v2 原生 Responses 链路
2026-07-11 12:51:53 +08:00
wucm667
6e2bb31281
fix(service): guard compact keepalive writer delegates
2026-07-11 08:52:46 +08:00
wucm667 and Claude Opus 4.8
4d4ba64bf7
fix(codex): 剥离续链 message item 的非法 item_* id
...
OpenAI OAuth 转发续链请求时,type=message 的 item 的 id 被客户端以
item_* 形式回放,但上游要求以 msg 开头,返回 400
"Expected an ID that begins with 'msg'",sub2api 随后向客户端返回 502。
客户端自动重试会不断重放同一份坏上下文,导致连续失败。
filterCodexInputWithOptions 在 PreserveReferences=true 路径下为
type=message 增加与 #3785 (fd64d07e6 ) 平行的 id 前缀检查:非 msg 开头
即删除。合法的 msg* id 原样保留,不改写 item_* 为 msg_*,因为改写出的
id 未必对应真实上游对象。
原 TestFilterCodexInput_NonToolCallItemKeepsID 以 message + item_msg_001
断言"保留 id",该行为已被上游拒绝,改用 web_search_call 覆盖同一意图。
Fixes #3981
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-07-10 23:32:34 +08:00
xlplbo
eb4d005031
Merge remote-tracking branch 'upstream/main'
2026-07-10 20:46:38 +08:00
shaw
8a51119e39
fix(openai): pair originator with final User-Agent for codex upstream
...
上游 /backend-api/codex 的 404 gating 是配套校验:originator 必须与
User-Agent 首段(首个 '/' 前的 client 名)配套且为官方 codex 身份,
错配(如 originator=codex_cli_rs + UA=codex-tui/...)一律 404;version
头若携带须 >= 0.144.0。
修复:
- pkg/openai 新增 PairCodexClientIdentity:由最终出站 UA 推导配套
originator(含 CODEX_INTERNAL_ORIGINATOR_OVERRIDE 尾部括号组身份恢复、
精确集合大小写归一、长度/字符集校验)
- service 新增 enforceCodexIdentityHeaders 终态收口:originator 按最终
UA 重配,推导不出官方身份整体回退默认 Codex CLI 身份;version 低于
0.144.0 提升为内置版本;originator 缺失时 no-op(保护 messages bridge)
- 接入非透传/透传/WS 三条转发路径(透传与 WS 删除会把 codex-tui 等官方
UA 强改为 codex_cli_rs 造成错配的旧兜底)、用量探针(指纹缓存 UA 与硬
编码 originator 错配)、账号 responses/图像测试(opencode 错配)
- messages 兼容桥构建前显式打 bridge 标记,防止映射到非 gpt-5/codex
模型时收口误改其刻意最小化的请求形态
Fixes #3901
2026-07-10 19:11:26 +08:00
xlplbo and Claude Fable 5
7942338328
fix(apicompat): 回程还原 namespace 子工具调用,修复 Codex MCP 工具 unsupported call
...
Codex 0.14x 将 MCP 工具声明为 namespace 工具,chat 桥去程摊平为
"<namespace>__<name>" function 工具后,回程仅原样回传平铺名的
function_call 项;codex 按 namespace+name 路由查不到该名字,所有
MCP 工具调用被判为 unsupported call。
- NamespaceToolNames 构建摊平名 →(namespace, 子工具名)反查表
(摊平名超长带截断哈希,无法按字符串切分还原)
- 非流式/流式回程命中映射时还原为裸子工具名 + namespace 字段,
ResponsesOutput 新增 Namespace 字段并同步 wire 层白名单
- 回退桥入口将映射与 CustomTools/ToolSearchDeclared 一并穿入
已在测试机经 codex exec + MCP server 端到端验证。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01NWQyEgFKKbdve67G6qCoAU
2026-07-10 17:38:17 +08:00
Wesley Liddick
5260a42a0b
Merge pull request #3953 from lyon-le/feat/openai-fast-policy-user-scope
...
feat(openai): 支持用户级 Fast/Flex 策略
2026-07-10 17:31:55 +08:00
Wesley Liddick
815516d8d3
Merge pull request #3969 from jinfeijie/fix/grok-responses-reasoning-effort
...
fix(grok): preserve compatible reasoning effort
2026-07-10 17:31:41 +08:00
jinfeijie bot
5a0dd510e5
fix(grok): remove obsolete helper
2026-07-10 17:11:04 +08:00
jinfeijie bot
0fa1eb85ec
fix(grok): preserve compatible reasoning effort
2026-07-10 16:58:17 +08:00
Wesley Liddick
6dd3274aaf
Merge pull request #3948 from superman2003/fix/gpt56-billing-usage-integrity
...
fix(openai): correct GPT-5.6 billing and usage gaps
2026-07-10 15:45:18 +08:00
Wesley Liddick
d0f6f27d5f
Merge pull request #3941 from Tassoi/codex/fix-image-gen-namespace-strip
...
fix(image): strip Codex image_gen namespace declarations
2026-07-10 15:45:05 +08:00
Wesley Liddick
6a2063b374
Merge pull request #3883 from ShuminFu/fix/setup-token-auto-refresh
...
fix: 后台自动刷新纳入 setup-token 账号(修复 8h 后 401)
2026-07-10 15:44:54 +08:00
Lyonle
f2966530c5
feat(openai): 支持用户级 Fast/Flex 策略
2026-07-10 15:16:09 +08:00
superman2003
de28eba3c8
fix(openai): harden GPT-5.6 billing and usage
2026-07-10 15:13:11 +08:00
Tassoi
d3a1835ed7
fix(image): strip Codex image_gen namespace declarations
2026-07-10 06:37:06 +00:00
Shumin
a495d5e302
test: 更新断言以覆盖 setup-token 纳入后台刷新
...
- ListOAuthRefreshCandidates SQL 断言由 type = 'oauth' 改为
type IN ('oauth', 'setup-token')。
- ClaudeTokenRefresher.CanRefresh 增加 anthropic setup-token → true 用例。
2026-07-10 02:27:33 -04:00
shaw
0dec1ad292
fix(service): 消除 isOpenAIGPT56Model 重复声明,统一到 openai_model_alias.go
...
PR #3898 与 #3909 各自新增了同名函数(billing 精确匹配版 / gateway
前缀匹配版),合并后 internal/service 编译失败。保留前缀匹配语义作为
唯一实现:对 normalizeKnownOpenAICodexModel 的输出(gpt-5.6-* 精确
基名)canonicalize 幂等且精确分支命中,计费行为不变;同时保住
gpt-5.6-*-max 等后缀变体的识别。
2026-07-10 14:09:07 +08:00
Wesley Liddick
8b96acde97
Merge pull request #3898 from Arron196/feat/gpt-5.6-cache-billing-stats
...
feat(openai): 支持 GPT-5.6 系列缓存写入计费与统计
2026-07-10 13:57:29 +08:00
li
b9b013a088
fix(usage): WS passthrough effort 提取补入映射后模型候选
...
Fixes #3924
2026-07-10 11:56:47 +08:00
Wesley Liddick
ddb1a210ce
Merge pull request #3912 from superman2003/fix/audit-concurrency-and-recovery
...
fix: harden billing concurrency and payment recovery
2026-07-10 11:38:45 +08:00
shaw
c3ae5fc3c5
fix(usage): effort 提取改用模型候选列表,修复后缀模型元数据丢失
...
#3909 将 effort 提取的模型参数改为 firstNonEmpty(upstreamModel, ...),
而 OAuth 的 normalizeCodexModel 会剥掉模型 effort 后缀
(gpt-5.4-xhigh -> gpt-5.4),导致后缀式模型且 body 无显式
reasoning 字段的请求在 usage 元数据中丢失 effort。
extractOpenAIReasoningEffortFromBody/extractOpenAIReasoningEffort
改为接受模型候选变参:显式 effort 的 max 保留判定沿用第一个非空
候选(映射后模型),后缀推导回退依次尝试每个候选(原始模型名兜底)。
纯元数据修复,不改变任何转发行为。
2026-07-10 11:09:06 +08:00
Wesley Liddick
72ef0b3884
Merge pull request #3909 from githubbzxs/fix/gpt56-max-compact
...
fix: support GPT-5.6 max reasoning effort
2026-07-10 10:57:35 +08:00
superman2003
fc66a30ffc
fix: harden billing concurrency and payment recovery
2026-07-10 10:56:49 +08:00
Wesley Liddick
066a85949a
Merge pull request #3905 from fengshao1227/fix/codex-client-version-bump
...
fix(openai): 升级 Codex 客户端版本至 0.144.1,修复 gpt-5.6-luna 404
2026-07-10 10:43:51 +08:00
psyche
80b3d4c1f8
fix: 兼容 GPT-5.6 max 推理强度
2026-07-10 10:39:16 +08:00
shaw
000f6dc655
fix(compact): 终态 output 非空但缺 compaction 时从事件流补入(146 等价性收尾)
...
146 纯流式透传下 Codex 只从 raw output_item.done 收集 item,无论终态
output 形态如何都能拿到 compaction;SSE→JSON 提取链路此前仅在终态 output
为空时修补。补齐最后一处不等价:compact 请求终态 output 非空但缺
compaction、事件流中存在(done 优先 added 兜底)时以 raw JSON 追加。
门控:仅 compact 路径 + 仅缺失时触发,已含 compaction 或非 compact
请求逐字节不变。
Refs #3887 #3777
2026-07-10 10:25:09 +08:00
shaw
ae9a01d852
fix(compact): 二轮审计加固——心跳字节不得污染 failover 判定与并发写安全
...
对首轮修复的对抗式审计发现并修复以下问题:
1. failover 判定污染(真实回归风险):handler 以 "Forward 前后
c.Writer.Size() 是否变化" 判定响应是否已写出并据此放弃换号。心跳注释
字节会使该判定恒真,compact 请求一旦在上游等待期间发过心跳,上游
429/5xx 将不再 failover。新增
OpenAICompactKeepaliveAdjustedWrittenSize(扣除心跳字节、互斥锁下
一致读取、仅心跳字节归一化为未写哨兵 -1),快照、failover 比较与
openAIForwardErrorAlreadyCommunicated 三处判定统一改用该口径;无心跳
请求完全等价于原 c.Writer.Size()。
2. 并发写竞争:心跳 goroutine 与未被显式拦截的写回路径(Forward 内部
本地拒绝等)存在 ResponseWriter 数据竞争。StartOpenAICompactSSE-
Keepalive 现将 c.Writer 替换为 openAICompactKeepaliveWriter:写侧
方法(Header/Write/WriteString/WriteHeader/WriteHeaderNow/Flush)
先在互斥锁下停拍,读侧(Status/Size/Written)仅加锁不停拍——任何
请求侧响应构造与心跳从构造上互斥,热路径状态读取不误杀心跳。
3. 语义拦截补齐:rejectIfCyberSessionBlocked(在用户槽位长等待之后
执行的直接 c.JSON)与 writeOpenAIFastPolicyBlockedResponse 在心跳
提交后降级为 response.failed 终止事件;未提交时先停拍再写 JSON,
状态码语义不变。失败事件 errType 参数化(permission_error 等)。
4. reconstruct 混合形态:done 事件存在但 compaction 只在
output_item.added 中时也要补入;done 已含 compaction 时跳过 added,
避免无 id 可去重时收集两份(Codex 要求恰好一个)。
5. 观测性:logOpenAIRemoteCompactOutcome 对心跳提交后的失败(wire 200)
以 GetOpsStreamError 纠正 outcome,不再误记 succeeded。
新增 5 个测试:failover 口径不变式、包装器停拍语义(-race)、fast
policy 提交前后两态、混合 done/added 形态(含去重)。
Refs #3887 #3777
2026-07-10 10:18:16 +08:00
benjamin
0a5f34a2ef
fix(openai): recognize Windows websocket resets
2026-07-10 10:11:21 +08:00