Skip to content

fix(codex): surface gpt-5.x in /model chooser (drop stale allowlist)#1546

Merged
chenhg5 merged 1 commit into
mainfrom
qa-cursor/fix-codex-model-whitelist
Jul 14, 2026
Merged

fix(codex): surface gpt-5.x in /model chooser (drop stale allowlist)#1546
chenhg5 merged 1 commit into
mainfrom
qa-cursor/fix-codex-model-whitelist

Conversation

@chenhg5

@chenhg5 chenhg5 commented Jul 14, 2026

Copy link
Copy Markdown
Owner

背景

外部用户 (微信群 Shawn) 反馈:5.6 的模型选不到,已经更新几次 cli 到 144 版本。已经升级 codex-cli>= 0.143 (Sol/Terra/Luna 系列开始随发布),但在 cc-connect 的 /model 选择器里依然看不到任何 gpt-5.x 模型。

根因

agent/codex/codex.go 里的 fetchModelsFromAPI 通过 openaiChatModels map (2026-03-02 添加后 4 个多月未更新) 过滤 GET /v1/models 响应:

var openaiChatModels = map[string]bool{
    "o4-mini": true, "o3": true, "o3-mini": true, "o1": true, "o1-mini": true,
    "gpt-4.1": true, "gpt-4.1-mini": true, "gpt-4.1-nano": true,
    "gpt-4o": true, "gpt-4o-mini": true,
    "codex-mini-latest": true,
}
  • 只有 11 个 entry, 最新的模型也停在 GPT-4o / GPT-4.1 时代
  • 走到 fetchModelsFromAPI 的用户 (没配 model_catalog_json 也没配 provider.models = [...]) 就算 CLI 升级了也只能看到这 11 个老模型
  • provider /v1/models 里返回的 gpt-5-* / gpt-5.3-codex / gpt-5.4 / gpt-5.5 / gpt-5.6 / gpt-5.6-sol / gpt-5.6-terra / gpt-5.6-luna 全部被静默丢弃

AvailableModels 4 层 fallback 顺序

Priority Source 受影响?
1 readCodexModelCatalog — 显式配置 model_catalog_json in ~/.codex/config.toml
2 configuredModels — cc-connect provider config 里 models = [...]
3 fetchModelsFromAPIGET /v1/models + 白名单过滤 ← 这个 PR
4 readCodexCachedModels~/.codex/models_cache.json 否 (但因为第 3 层 hit 到不了)

方案

模式匹配替换静态 map, future-proof:

  • Accept (case-insensitive prefix): gpt-* / chatgpt-* / codex-* / o1-* / o3-* / o4-* / o5-* + 裸 o1/o3/o4/o5
  • Reject (子串): embedding, whisper, tts, dall-e, audio-preview, realtime, transcribe, moderation, image, search-preview —— 防止 embedding / audio / image / moderation 模型污染 chat 选择器
  • 效果: gpt-5.6, gpt-6, o5-mini, codex-*未来模型自动兼容,无需再修代码

测试

45 个 test case (TestIsCodexChatModel) 覆盖:

  • ✅ 老 chat family: gpt-4o, gpt-4.1, chatgpt-4o-latest, o1, o1-mini, o1-preview, o3, o3-mini, o4-mini, codex-mini-latest
  • GPT-5 系列 (regression 本身): gpt-5, gpt-5-mini, gpt-5.3, gpt-5.3-codex, gpt-5.4, gpt-5.5, gpt-5.6, gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna
  • ✅ 大小写不敏感: GPT-5.6, Codex-Mini-Latest
  • ❌ 非 chat 模态: text-embedding-*, whisper-1, tts-1, gpt-4o-realtime-preview, gpt-4o-audio-preview, gpt-4o-transcribe, gpt-4o-search-preview, dall-e-3, gpt-image-1, text-moderation-latest, omni-moderation-latest
  • ❌ 无关模型: babbage-002, davinci-002, claude-3-5-sonnet, gemini-1.5-pro
$ go test ./agent/codex/ -run '^TestIsCodexChatModel$' -v
--- PASS: TestIsCodexChatModel (0.00s) [45 subtests all pass]
$ go test ./agent/codex/ -count=1
ok  	github.com/chenhg5/cc-connect/agent/codex	0.905s

影响面 / 风险

  • 只影响 fetchModelsFromAPI 路径, 也就是没显式配 model_catalog_json / provider.models 的默认 codex 用户
  • 老 chat 模型的行为不变 (allowlist 覆盖过的 11 个模型在新逻辑下依然 accept)
  • 已配 model_catalog_json 的高级用户 (走优先级 1) 完全不受影响
  • 非 chat 模态被 substring 显式排除, 不会因为放宽 prefix 而误加 embedding / audio / image / moderation 模型
  • 无 API breaking change, 只是 /model 里多列出用户 provider 支持的 GPT-5 系列

Workaround (供用户在合并前使用)

如果用户想立刻用 gpt-5.6, 两个 workaround (等价于绕过第 3 层去命中第 1/2 层):

  1. cc-connect config 的 provider 里显式写 models = ["gpt-5.6"] (触发 configuredModels)
  2. ~/.codex/config.tomlmodel_catalog_json = "~/.codex/models_cache.json" (触发 readCodexModelCatalog, 需要 CLI >= 0.143)

Reporter

外部用户微信反馈 (Shawn), 由 QA 定位并修复。

Made with Cursor

The API-fetch fallback in `fetchModelsFromAPI` filtered `GET /v1/models`
through `openaiChatModels`, a hard-coded 11-entry map added on
2026-03-02 and never updated. Every `gpt-5*` variant returned by
providers using `codex-cli >= 0.143` (including `gpt-5.6-sol`,
`gpt-5.6-terra`, `gpt-5.6-luna`) was silently dropped, so upgrading the
Codex CLI did not make GPT-5.6 selectable in cc-connect's /model chooser.

Users hitting the other three code paths — `readCodexModelCatalog`
(explicit `model_catalog_json` in `~/.codex/config.toml`),
`configuredModels` (explicit `models = [...]` in the provider config),
or `readCodexCachedModels` (last-resort read of
`~/.codex/models_cache.json`) — were unaffected.

Fix: replace the static map with `isCodexChatModel`, which uses pattern
rules so future frontier models (gpt-5.x, gpt-6, o5-*, codex-*) are
picked up automatically.

  Accept  gpt-* / chatgpt-* / codex-* / o1-* / o3-* / o4-* / o5-*
          plus bare o1, o3, o4, o5.
  Reject  any ID containing embedding, whisper, tts, dall-e,
          audio-preview, realtime, transcribe, moderation, image, or
          search-preview (so /v1/models cannot leak embedding, audio,
          image, or moderation models into a chat chooser).

45 unit tests cover the legacy chat families, GPT-5.0–5.6 (incl. Bedrock
variants), case-insensitivity, and every non-chat modality currently
served by /v1/models.

Reported by external user on WeChat: "5.6 的模型选不到,已经更新几次
cli 到 144 版本".

Co-authored-by: Cursor <cursoragent@cursor.com>
@chenhg5 chenhg5 merged commit 52dfe8b into main Jul 14, 2026
5 checks passed
@chenhg5 chenhg5 deleted the qa-cursor/fix-codex-model-whitelist branch July 14, 2026 13:55
chenhg5 pushed a commit that referenced this pull request Jul 14, 2026
1 commit on beta.1: #1547 cherry-pick of #1546 (drop stale openaiChatModels allowlist).
Owner requested beta.2 after E2E QA pass, not direct stable.

Co-authored-by: Cursor <cursoragent@cursor.com>
JayGarland pushed a commit to JayGarland/cc-connect that referenced this pull request Jul 14, 2026
…henhg5#1546)

The API-fetch fallback in `fetchModelsFromAPI` filtered `GET /v1/models`
through `openaiChatModels`, a hard-coded 11-entry map added on
2026-03-02 and never updated. Every `gpt-5*` variant returned by
providers using `codex-cli >= 0.143` (including `gpt-5.6-sol`,
`gpt-5.6-terra`, `gpt-5.6-luna`) was silently dropped, so upgrading the
Codex CLI did not make GPT-5.6 selectable in cc-connect's /model chooser.

Users hitting the other three code paths — `readCodexModelCatalog`
(explicit `model_catalog_json` in `~/.codex/config.toml`),
`configuredModels` (explicit `models = [...]` in the provider config),
or `readCodexCachedModels` (last-resort read of
`~/.codex/models_cache.json`) — were unaffected.

Fix: replace the static map with `isCodexChatModel`, which uses pattern
rules so future frontier models (gpt-5.x, gpt-6, o5-*, codex-*) are
picked up automatically.

  Accept  gpt-* / chatgpt-* / codex-* / o1-* / o3-* / o4-* / o5-*
          plus bare o1, o3, o4, o5.
  Reject  any ID containing embedding, whisper, tts, dall-e,
          audio-preview, realtime, transcribe, moderation, image, or
          search-preview (so /v1/models cannot leak embedding, audio,
          image, or moderation models into a chat chooser).

45 unit tests cover the legacy chat families, GPT-5.0–5.6 (incl. Bedrock
variants), case-insensitivity, and every non-chat modality currently
served by /v1/models.

Reported by external user on WeChat: "5.6 的模型选不到,已经更新几次
cli 到 144 版本".

Co-authored-by: dev-claudecode <dev-claudecode@cc-connect.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
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