Skip to content

Z.AI Chat rows advertise glm-5.3-flash as text-only, so client exports block image attachments on a native VLM #4296

Description

@lidge-jun

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

  • I searched existing provider and compatibility issues.
  • The request and response were redacted.
  • The expected behaviour is based on an upstream specification or a concrete client requirement.

Activity

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

    providerProvider 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