Client or integration
Other (every client that consumes an ocx config export: ZCode, Pi, OMP)
Provider or upstream service
zai (Z.AI GLM Coding Plan) and zhipu-bigmodel-coding
OpenCodex version
2.50.0 (installed), dev at 29d632f
Endpoint or capability
Model discovery / input modality metadata
Current behaviour
glm-5.3-flash is a native VLM, but the two Chat-path Z.AI rows describe it only negatively. They list the text-only siblings in noVisionModels and declare no modelInputModalities at all:
noVisionModels: ZAI_GLM_5X_SIDECAR_VISION_MODELS,
// (= ZAI_GLM_5X_MODELS.filter(id => id !== "glm-5.3-flash"))
That keeps Flash out of the vision sidecar, which is correct, but it never tells the catalog what the model can read. configuredInputModalities returns undefined (src/codex/catalog/provider-fetch.ts:674-677) and the catalog falls back to the ["text"] floor, so inputModalitiesForClient emits ["text"] and every client export lists a native multimodal model as text-only. The picker then refuses to attach an image.
The Responses sibling row does it correctly, so the same model is described two different ways in one registry:
modelInputModalities: { "glm-5.3": ["text"], "glm-5.3-flash": ["text", "image"], "glm-5-turbo": ["text"] }
Expected behaviour
The Chat-path rows should declare the modality positively, the same way the Responses row does: glm-5.3 as text-only and glm-5.3-flash as text + image.
Minimal redacted request or reproduction
curl -s https://api.z.ai/api/v1/models -H "Authorization: Bearer <redacted>" \
| python3 -c "import json,sys;[print(m['slug'], m['input_modalities']) for m in json.load(sys.stdin)['models']]"
Actual response or error
glm-5.3 ['text']
glm-5.3-flash ['text', 'image']
glm-5-turbo ['text']
# but an ocx client export lists glm-5.3-flash with modalities.input = ["text"]
Upstream documentation
https://docs.z.ai/guides/vlm/glm-5.3-flash
GLM-5.3-Flash is the first native multimodal model in the GLM-5 series
Input Modality: Video / Image / Text / File
https://docs.z.ai/guides/llm/glm-5.3
GLM-5.3 currently supports text-only inputs, with a 1M-token context window and a maximum output length of 128K tokens.
https://docs.z.ai/devpack/latest-model
GLM-5.3 is a text-only model, so uncheck Support Images; GLM-5.3-FLASH is a multimodal model, so Support Images can be checked
Suggested mapping or implementation notes
Add one shared positive declaration next to ZAI_GLM_5X_SIDECAR_VISION_MODELS and reference it from both Chat rows:
const ZAI_GLM_5X_INPUT_MODALITIES: Record<string, string[]> = {
...Object.fromEntries(ZAI_GLM_5X_SIDECAR_VISION_MODELS.map(id => [id, ["text"]])),
"glm-5.3-flash": ["text", "image"],
};
Upstream also lists video and file for Flash. Those stay out of scope: the internal modality vocabulary is text / image / audio and the ZCode and Pi export vocabulary is text / image, so there is nowhere to express them. Declaring image closes the picker defect.
The vendored snapshot behind src/generated/model-metadata.ts has no glm-5.3-flash row at all, but that file is byte-synced by tests/codex-integration/model-metadata-sync.test.ts and refreshing it is a separate deliberate commit. Registry declarations win over that fallback, so the defect closes in the registry alone.
Additional context and attachments
Related: #4286 reports the same class of defect from the other end, a client export dropping per-model image capability.
Checks
Client or integration
Other (every client that consumes an ocx config export: ZCode, Pi, OMP)
Provider or upstream service
zai (Z.AI GLM Coding Plan) and zhipu-bigmodel-coding
OpenCodex version
2.50.0 (installed), dev at 29d632f
Endpoint or capability
Model discovery / input modality metadata
Current behaviour
glm-5.3-flash is a native VLM, but the two Chat-path Z.AI rows describe it only negatively. They list the text-only siblings in noVisionModels and declare no modelInputModalities at all:
That keeps Flash out of the vision sidecar, which is correct, but it never tells the catalog what the model can read. configuredInputModalities returns undefined (src/codex/catalog/provider-fetch.ts:674-677) and the catalog falls back to the ["text"] floor, so inputModalitiesForClient emits ["text"] and every client export lists a native multimodal model as text-only. The picker then refuses to attach an image.
The Responses sibling row does it correctly, so the same model is described two different ways in one registry:
Expected behaviour
The Chat-path rows should declare the modality positively, the same way the Responses row does: glm-5.3 as text-only and glm-5.3-flash as text + image.
Minimal redacted request or reproduction
Actual response or error
Upstream documentation
https://docs.z.ai/guides/vlm/glm-5.3-flash
https://docs.z.ai/guides/llm/glm-5.3
https://docs.z.ai/devpack/latest-model
Suggested mapping or implementation notes
Add one shared positive declaration next to ZAI_GLM_5X_SIDECAR_VISION_MODELS and reference it from both Chat rows:
Upstream also lists video and file for Flash. Those stay out of scope: the internal modality vocabulary is text / image / audio and the ZCode and Pi export vocabulary is text / image, so there is nowhere to express them. Declaring image closes the picker defect.
The vendored snapshot behind src/generated/model-metadata.ts has no glm-5.3-flash row at all, but that file is byte-synced by tests/codex-integration/model-metadata-sync.test.ts and refreshing it is a separate deliberate commit. Registry declarations win over that fallback, so the defect closes in the registry alone.
Additional context and attachments
Related: #4286 reports the same class of defect from the other end, a client export dropping per-model image capability.
Checks