Skip to content

fix: strip unsupported OpenAI passthrough fields#1656

Open
gebdalaoli-arch wants to merge 3 commits intoWei-Shaw:mainfrom
gebdalaoli-arch:codex/fix-openai-compact-passthrough
Open

fix: strip unsupported OpenAI passthrough fields#1656
gebdalaoli-arch wants to merge 3 commits intoWei-Shaw:mainfrom
gebdalaoli-arch:codex/fix-openai-compact-passthrough

Conversation

@gebdalaoli-arch
Copy link
Copy Markdown

@gebdalaoli-arch gebdalaoli-arch commented Apr 14, 2026

概要

  • 抽取共享的 openAIResponsesUnsupportedFields 列表,统一定义 prompt_cache_retentionsafety_identifier
  • 让 OAuth passthrough 归一化、applyCodexOAuthTransform(...)、以及通用请求体过滤三条路径复用同一份规则
  • 补强回归测试,覆盖 transform 路径与官方客户端 compact passthrough 场景

问题说明

这个问题本质上不是“少删了一个字段”这么简单,而是同一类 unsupported Responses 字段在不同路径上的过滤规则已经分叉了:

  • openai_passthrough 的 OAuth / compact 路径走 normalizeOpenAIPassthroughOAuthBody(...)
  • OAuth 请求体变换走 applyCodexOAuthTransform(...)
  • 通用请求体过滤在 openai_gateway_service.go 里还有一层兜底

在最新 main 上,通用层已经会过滤 prompt_cache_retentionsafety_identifier,但它只在 !isCodexCLI 条件下执行;而 applyCodexOAuthTransform(...) 之前只剥 prompt_cache_retention,没有等价剥离 safety_identifier。结果就是:同类字段在三条路径上的处理不一致,官方客户端 / compact / OAuth 场景仍然容易出现漏网。

用户侧表现

当 compact / 自动压缩上下文请求把这些字段原样带到上游时,ChatGPT internal Codex endpoint 会返回 400 Unsupported parameter 一类错误,网关侧通常表现为 502。这会导致:

  • 自动压缩上下文持续失败
  • compact 请求无法成功完成
  • 对话在上下文过长时卡死,无法继续恢复

修复方式

这次不是继续在某一条路径上“补一个 if”,而是把同一类字段过滤收敛到共享列表:

  • 新增共享列表 openAIResponsesUnsupportedFields
  • normalizeOpenAIPassthroughOAuthBody(...) 使用该共享列表,保证 passthrough / compact 路径一致
  • applyCodexOAuthTransform(...) 也使用该共享列表,补上官方客户端 OAuth transform 对 safety_identifier 的缺口
  • 通用请求体过滤层改为复用同一份列表,避免后续三处定义再次漂移

验证

  • go test ./internal/service -run 'OpenAIGatewayService_OAuthPassthrough|ApplyCodexOAuthTransform' -count=1

(cherry picked from commit 7855399eefebeb7f9333658e01e3b373b64ffb86)
@gebdalaoli-arch
Copy link
Copy Markdown
Author

gebdalaoli-arch commented Apr 16, 2026

补充说明一下这个 bug 的实际影响:

如果这里不把 prompt_cache_retention / safety_identifier 过滤掉,Codex 在上下文过长时触发的自动压缩(compact)请求会反复被上游以 400 Unsupported parameter 拒绝,网关侧通常表现为 502。结果不是单次请求失败,而是自动压缩上下文会一直失效,整段对话卡死,无法继续恢复。

我继续检查了当前 main 的最新实现,结论是:这个问题在主线里看起来已经被“另一种更通用的方式”覆盖了。

  • openai_gateway_service.go 的通用请求体归一化逻辑里,当前 main 已统一删除 prompt_cache_retentionsafety_identifier
  • 2026-04-11 的提交 422e25c 还在 openai_gateway_chat_completions.go / openai_codex_transform.go 对相关 Cursor raw body / OAuth 变换链路做了同方向的剥离

所以,这个 PR 对 bug 根因和用户侧表现的判断是对的,但从当前主线状态看,这个缺口大概率已经被更上游、更通用的一层修掉了。如果维护者最后不合并这个 PR,比较可能的原因是“主线已有覆盖”,而不是这个问题本身不存在。

@gebdalaoli-arch
Copy link
Copy Markdown
Author

这次我把分支先同步到了最新 main,然后把实现收敛成了“最终版本”,核心是统一 unsupported 字段规则,而不是继续在某一条路径上单点补丁。

这次提交做了三件事:

  1. 抽出共享列表 openAIResponsesUnsupportedFields = [prompt_cache_retention, safety_identifier]
  2. 让三条路径都复用这份列表:
    • normalizeOpenAIPassthroughOAuthBody(...)
    • applyCodexOAuthTransform(...)
    • openai_gateway_service.go 的通用请求体过滤
  3. 补强回归测试:
    • transform 路径现在明确要求同时剥离 prompt_cache_retentionsafety_identifier
    • passthrough 测试覆盖官方客户端 compact 场景

这样做的原因是:最新 main 虽然已经在通用层过滤这两个字段,但那层逻辑挂在 !isCodexCLI 条件下;而 OAuth transform 之前只剥了 prompt_cache_retention,没有等价处理 safety_identifier。所以真正的问题不是“主线没修”,而是“同类字段在不同路径上的规则已经分叉”。

现在三条路径共用同一份字段定义,后续如果再新增同类 unsupported Responses 字段,只需要改一处列表,不会再出现 passthrough、official client、generic filter 各修一半的情况。

已验证:

  • go test ./internal/service -run 'OpenAIGatewayService_OAuthPassthrough|ApplyCodexOAuthTransform' -count=1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant