Repository navigation
CommandCode image capabilities are missing from model metadata, disabling multimodal input in Codex App #2406
Description
Client or integration
Codex App
Provider or upstream service
CommandCode (command-code)
OpenCodex version
2.31.0
Endpoint or capability
/v1/models, generated Codex model catalog, and /v1/responses image input
Current behaviour
OpenCodex's built-in CommandCode model registry does not declare image input for several models whose upstream route accepts images. Consequently, the generated Codex model catalog exposes those targets as text-only. In Codex App, Image / multimodal becomes unavailable when one of these targets participates in a combo, even when every selected route has been verified to accept image input.
End-to-end image probes succeeded for these CommandCode routes:
gpt-5.6-lunagpt-5.6-solMiniMaxAI/MiniMax-M3moonshotai/Kimi-K3meta/muse-spark-1.2meta/muse-spark-1.2-contributoropenai/ox-alphadeepseek/deepseek-v4-flash-vision-exp
The issue is not only cosmetic: capability intersection in combo models treats an absent/unknown image declaration as text-only, so one incomplete target disables image input for the whole combo.
Separate real-request probes did not deliver the image for deepseek/deepseek-v4-flash, deepseek/deepseek-v4-pro, zai-org/GLM-5.2, zai-org/GLM-5.3, and xai/grok-4.6. Those routes should not be marked image-capable without upstream fixes and verification.
Expected behaviour
OpenCodex should declare input_modalities: ["text", "image"] for CommandCode models that demonstrably accept image input, and preserve that capability when generating the Codex catalog and combo intersections.
Unknown models should remain conservative. Image capability should not be inferred merely from a family name or marketing profile; it should be backed by provider metadata or an end-to-end request test.
Minimal redacted request or reproduction
# 1. Start OpenCodex 2.31.0 and inspect model metadata.
curl -s http://127.0.0.1:10100/v1/models \
-H "Authorization: Bearer REDACTED" \
| jq '.data[] | select(.id | contains("gpt-5.6-luna"))'
# 2. Select a combo containing command-code/gpt-5.6-luna in Codex App.
# Observe that Image / multimodal is disabled because the CommandCode target
# is projected as text-only/unknown.
# 3. Send the same small image directly through /v1/responses to that target.
# The model correctly identifies unique content from the image, proving that
# the route accepts image input.Actual response or error
Codex App capability UI:
Image / multimodal
Unavailable until every selected target supports image input.
No provider request error is required to trigger the bug: incomplete model metadata disables the client capability before the request can be made.
Upstream documentation
CommandCode model profiles are available through the CommandCode service/dashboard. I could not find a stable public specification that provides machine-readable input modalities for every route; therefore the capability list above is based on redacted end-to-end image probes.
Suggested mapping or implementation notes
Add explicit image modalities to the built-in CommandCode registry for the verified routes above, or ingest authoritative capabilities from CommandCode if an endpoint is available.
Please keep image capability and reasoning-effort metadata as independent fields when merging custom/provider rows. A custom image override should fill only the modality gap and must not erase inherited reasoning levels.
A regression test could assert:
- verified image-capable CommandCode models retain
imagethrough/v1/modelsand generated Codex catalog projection; - combo image capability is enabled only when every target declares image support;
- unknown or experimentally failing routes remain text-only;
- custom modality overrides preserve reasoning metadata.
Additional context
Observed on macOS with Codex App and OpenCodex proxy on 127.0.0.1:10100. Local registry patching confirms that adding explicit modalities restores the Codex App image toggle, while direct provider probes distinguish working routes from models that merely advertise vision elsewhere.
- I searched existing issues before filing.
- Secrets and provider credentials are redacted.
- The problem reproduces on OpenCodex 2.31.0.
Activity
lidge-jun commentedon Aug 22, 2026
리뷰 · 우선순위 50 / 80
설명: 이 이슈는 커맨드코드 모델이 이미지를 받는데도, 목록이 글자만 받는다고 적어서 콤보의 이미지 버튼이 꺼진다고 한다. 지금 CURRENT
devHEAD 는4f41a8e93이다. 이번 시간에 origin/dev 는 46d4150 에서 한 커밋이 와서 여기까지 왔다. 착지는 2396 사용량 CLI 오늘 비용이다. package.json 은 2.27.0 이다. src/config.ts 는 3975줄이다. src/runtime 폴더는 지금 HEAD 에 없다. 지금 HEAD 의 src/providers/registry.ts 1124줄 command-code 는 liveModels 이고 정적 모델 목록이 없다. 1152줄 modelInputModalities 는 stealth/ox-alpha 와 deepseek/deepseek-v4-flash-vision-exp 두 줄만 이미지다. gpt-5.6-luna, gpt-5.6-sol, MiniMaxAI/MiniMax-M3, moonshotai/Kimi-K3, meta/muse-spark-1.2 는 없다. 1091줄 주석은 deriveComboCatalogModel 이 비어 있는 멤버를 글자만으로 둔다고 적는다. 그래서 한 목표만 비어도 콤보 전체가 이미지를 끈다. 작성자가 직접 보낸 이미지 시험은 위에 적은 길이 된다고 했고, deepseek-v4-flash, deepseek-v4-pro, GLM-5.2, GLM-5.3, grok-4.6 은 이미지가 안 갔다고 했다. 그 실패 길은 이미지라고 적으면 안 된다. 작성자 버전은 2.31.0 이다. 지금 origin/dev 패키지는 2.27.0 이다. 1152줄 표는 지금 HEAD 에도 두 줄뿐이다. PR 이 아직 없다. provider-compatibility, provider, catalog 라벨이 있다. 2410 은 같은 표 구멍의 노력 칸이다. 이 이슈는 이미지 칸이다. 사용자 길이로는 이미지가 되는 길을 콤보가 꺼 버리는 목록 구멍이라서 50. 카탈로그 팁은 Ox Alpha x-preview-f-free + deepseek-v4-flash-vision-exp. Cursor 정적 카탈로그는 opus-4-8-fast / opus-5-fast. 2334 CursorCredentialRouter 는 여전히 src/providers/cursor-pool.ts 모듈+테스트만 있고 어댑터에 연결되지 않았다. 2332 H2 는 discovery 전용. 2320 overflow + 2342 는 이미 dev. 2188 사이드카는 이미 dev. 2382 데스크톱 앱 재시작은 이미 dev. 2292 는 아직 연다.src/providers/registry.ts 라인 1152 - 지금 HEAD 의 command-code modelInputModalities 는 ox-alpha 와 deepseek-v4-flash-vision-exp 두 줄만 이미지다
src/providers/registry.ts 라인 1124 - command-code 는 liveModels 이고 정적 모델 목록이 없다. 능력 표만 손대면 된다
src/providers/registry.ts 라인 1091 - 콤보는 비어 있는 멤버를 글자만으로 둔다. 한 목표가 비면 이미지 버튼이 꺼진다
src/providers/command-code-efforts.ts - 노력 표와 이미지 표는 다른 칸이다. 이미지를 채울 때 노력 칸을 지우면 안 된다
이슈 본문 실패 길 - deepseek-v4-flash, deepseek-v4-pro, GLM-5.2, GLM-5.3, grok-4.6 은 작성자가 이미지가 안 갔다고 했다. 그 길은 이미지라고 적지 말 것
메인테이너의 판단이 필요한 지점
너의 추천
통과한 길만 modelInputModalities 에 text, image 를 넣는 작은 PR 을 받는다. 실패한 다섯 길은 글자로 둔다. 노력 칸은 건드리지 말 것. 이슈는 열어 둔다. 라벨은 그대로 둔다. 프리뷰 배포가 아니다.
이 댓글은 grok-bot이 작성했습니다
devlog: quota-window and backlog roadmap (260826) (#2644)
lidge-jun commentedon Aug 26, 2026
Shipped on
devase821f95f0(#2659).The verified-positive routes from your probe list now declare
["text", "image"]in a singleCOMMAND_CODE_MODEL_INPUT_MODALITIESmap referenced by both the OAuth and API-key presets, so the two cannot drift apart. A parity assertion pins that.Your negative list is doing real work here and was honoured exactly:
deepseek/deepseek-v4-flash,deepseek/deepseek-v4-pro,zai-org/GLM-5.2,zai-org/GLM-5.3andxai/grok-4.6stay text-only, asserted by full upstream id. A route that accepts the request and silently drops the image is worse than one that declines it — the model answers about an image it never received and nothing surfaces an error.Thank you for probing both directions rather than only the successes. That is what made this safe to ship as static metadata.
lidge-jun commentedon Aug 26, 2026
Landed via #2659 at e821f95
devlog: quota-window and backlog roadmap (260826) (lidge-jun#2644)
devlog: quota-window and backlog roadmap (260826) (lidge-jun#2644)