Skip to content

[Bug]: Devin catalog drops supportsImages, leaving vision-capable models without inputModalities #4530

Description

@thisisjun786

Client or integration

OpenCodex dashboard

Area

Catalog / models

Summary

Devin's GetCascadeModelConfigs response includes ClientModelConfig.supportsImages (protobuf field 5), but OpenCodex does not parse or propagate this field. As a result, ocx models live --provider devin --json and /api/models omit inputModalities even for models that the signed-in account's upstream catalog explicitly marks as image-capable.

In a live catalog read on 2026-09-14, 190 available model variants collapsed to 42 base IDs. All variants of 36 base IDs advertised image support, including kimi-k3, swe-2, deepseek-v4-1-flash, and glm-5-3-flash. Before the local workaround, all 42 OpenCodex rows omitted inputModalities.

Expected: preserve upstream image capability during discovery and expose inputModalities: ["text", "image"] for confirmed image-capable models. Keep false/unknown handling explicit and handle effort variants conservatively. Do not require users to maintain a manual vision allowlist for a capability already supplied by the provider.

Reproduction

  1. Use OpenCodex 2.52.0 with an authenticated devin provider and liveModels: true, without a providers.devin.modelInputModalities override.
  2. Run ocx models live --provider devin --json and inspect kimi-k3 or swe-2. inputModalities is absent.
  3. Compare with the same account's GetCascadeModelConfigs response: field 5 is true for these models, including every available effort variant observed.
  4. The dropped-field behavior can also be reproduced without credentials or inference, from a checkout with Bun:
bun --eval '
import { parseCatalogBuffer } from "./src/adapters/devin/cloud-direct/catalog.ts";
import { encodeMessage, encodeString, encodeVarintField } from "./src/adapters/devin/cloud-direct/wire.ts";
const row = Buffer.concat([
  encodeString(1, "Vision fixture"),
  encodeVarintField(5, 1),
  encodeVarintField(18, 1048576),
  encodeString(22, "kimi-k3"),
]);
const entry = parseCatalogBuffer(encodeMessage(1, row), "unused-fixture", "https://server.codeium.com").byUid.get("kimi-k3");
console.log(JSON.stringify(entry));
console.log("retainsSupportsImages=" + Object.hasOwn(entry, "supportsImages"));
'

The fixture contains supportsImages=true, but the parsed entry loses it. This fixture tests parsing only; the real provider capability values above came from a separate live catalog read.

Version

2.52.0 (@bitkyc08/opencodex). The same missing field was also confirmed in upstream dev at df7dc1be530141c55bd10e70ebe79cb80914d98e.

Operating system

Ubuntu 26.04.1 LTS, Linux x86_64

Provider and model

devin; examples: kimi-k3, swe-2, gemini-3-8-flash, deepseek-v4-1-flash, glm-5-3-flash.

Logs or error output

Before workaround:
  Devin base models: 42
  Rows with image in inputModalities: 0

Upstream GetCascadeModelConfigs:
  Available variants: 190
  Base models with supportsImages=true for every variant: 36
  Other base models: 6

Examples (upstream -> OpenCodex before workaround):
  kimi-k3:             true on 3/3 variants -> inputModalities absent
  swe-2:               true on 3/3 variants -> inputModalities absent
  gemini-3-8-flash:     true on 3/3 variants -> inputModalities absent
  deepseek-v4-1-flash:  true on 2/2 variants -> inputModalities absent
  glm-5-3-flash:        true on 3/3 variants -> inputModalities absent

Screenshots and supporting files

Source trace at the inspected upstream revision:

  • catalog.ts:116: parseCatalogBuffer reads fields 1, 4, 18, and 22, but omits field 5. ModelCatalogEntry has no image capability property.
  • live-models.ts: fetchDevinUsableModels returns model IDs and context windows, with no modality map.
  • provider-fetch.ts: the Devin discovery branch consequently has no upstream image metadata to propagate.

Devin's adapter already encodes image parts as ChatMessagePrompt.images (field 10); this report concerns capability discovery, not a missing image transport implementation.

Local workaround verified: add ["text", "image"] overrides for the 36 upstream-confirmed base IDs, then run ocx sync. Afterward the live Devin catalog exposes image input on 36/42 rows, and the generated Codex catalog exposes text,image for the selected Devin models. The six other models were left unchanged. No image inference requests were made, so this is catalog/configuration evidence, not an end-to-end vision benchmark.

Redacted configuration

Minimal provider shape before the workaround:

{
  "providers": {
    "devin": {
      "adapter": "devin",
      "authMode": "oauth",
      "baseUrl": "https://server.codeium.com",
      "liveModels": true,
      "defaultModel": "swe-2"
    }
  }
}

Example of the supported local workaround, applied only to confirmed model IDs:

{
  "providers": {
    "devin": {
      "modelInputModalities": {
        "kimi-k3": ["text", "image"],
        "swe-2": ["text", "image"]
      }
    }
  }
}

Checks

  • I searched existing issues and documentation.
  • I removed secrets, tokens, account details, request credentials, and personal data.

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

    bugSomething isn't workingcatalogModel catalog, slugs, visibility, routed entries

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions