Skip to content

CommandCode image capabilities are missing from model metadata, disabling multimodal input in Codex App #2406

Description

@ardjo-s

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-luna
  • gpt-5.6-sol
  • MiniMaxAI/MiniMax-M3
  • moonshotai/Kimi-K3
  • meta/muse-spark-1.2
  • meta/muse-spark-1.2-contributor
  • openai/ox-alpha
  • deepseek/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:

  1. verified image-capable CommandCode models retain image through /v1/models and generated Codex catalog projection;
  2. combo image capability is enabled only when every target declares image support;
  3. unknown or experimentally failing routes remain text-only;
  4. 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

  1. added
    catalogModel catalog, slugs, visibility, routed entries
    providerProvider adapters, OpenAI-compat presets, upstream API quirks
    on Aug 22, 2026
  2. lidge-jun commented on Aug 22, 2026

    @lidge-jun
    Owner

    리뷰 · 우선순위 50 / 80

    설명: 이 이슈는 커맨드코드 모델이 이미지를 받는데도, 목록이 글자만 받는다고 적어서 콤보의 이미지 버튼이 꺼진다고 한다. 지금 CURRENT dev HEAD 는 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 은 작성자가 이미지가 안 갔다고 했다. 그 길은 이미지라고 적지 말 것

    메인테이너의 판단이 필요한 지점

    • 작성자가 통과했다고 한 길만 이미지로 넣을지. 가족 이름으로 추측하면 실패 길까지 켜진다
    • 커맨드코드가 능력 목록을 내려 주면 그 목록을 읽을지. 지금은 공식 기계 목록이 없다고 적혀 있다
    • 2410 노력 칸과 한 PR 로 묶을지. 칸은 다르고 제공자도 다르다

    너의 추천
    통과한 길만 modelInputModalities 에 text, image 를 넣는 작은 PR 을 받는다. 실패한 다섯 길은 글자로 둔다. 노력 칸은 건드리지 말 것. 이슈는 열어 둔다. 라벨은 그대로 둔다. 프리뷰 배포가 아니다.

    이 댓글은 grok-bot이 작성했습니다

  3. lidge-jun commented on Aug 26, 2026

    @lidge-jun
    Owner

    Shipped on dev as e821f95f0 (#2659).

    The verified-positive routes from your probe list now declare ["text", "image"] in a single COMMAND_CODE_MODEL_INPUT_MODALITIES map 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.3 and xai/grok-4.6 stay 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.

  4. lidge-jun commented on Aug 26, 2026

    @lidge-jun
    Owner

    Landed via #2659 at e821f95

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    catalogModel catalog, slugs, visibility, routed entrieslanded-via-maintainerOriginal PR closed after landing via a maintainer merge trainproviderProvider adapters, OpenAI-compat presets, upstream API quirksprovider-compatibilityProvider compatibility reports

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions