Skip to content

[Bug]: Custom model rows drop provider reasoning metadata from the Codex catalog #962

Closed

Description

@MarcTCruz

Client or integration

Codex CLI

Area

Catalog / models

Summary

When a provider model also has a dashboard-created customModels row, gatherRoutedModels() lets the custom row replace the provider-derived row without retaining provider capability metadata. For a local Ollama model marked with noReasoningModels and an empty modelReasoningEfforts list, the generated Codex catalog consequently advertises the generic reasoning ladder. Codex then rejects an ephemeral spawn_agent call during client-side preflight, before OpenCodex can route the child request.

The custom row should retain its explicit display name, context window, and input modalities while inheriting provider capability metadata. The generated catalog should expose no reasoning levels and no default reasoning level for this model.

Reproduction

  1. Configure a static local provider model and a custom row for the same provider/model ID using the redacted shape below.
  2. Run ocx sync.
  3. Inspect ollama/qwen-coder-3b in the generated Codex catalog.
  4. Observe that supported_reasoning_levels contains the generic low through ultra ladder and default_reasoning_level is medium.
  5. Start a fresh Codex process through the OpenCodex loopback proxy and request an ephemeral subagent using ollama/qwen-coder-3b with no reasoning.
  6. Codex rejects the child before creation because none is not among the advertised supported efforts.

A source-level reproduction through the public boundaries is also deterministic: gatherRoutedModels() returns one custom row with reasoningEfforts missing, and buildCatalogEntries() therefore synthesizes the generic ladder.

Version

Installed package: @bitkyc08/opencodex 2.10.0. The defect is also present at current dev commit 1d1c8038447c9cbd3825842a0ac9fb9db8d79ca1.

Operating system

Ubuntu 24.04 (aarch64)

Provider and model

Ollama / qwen-coder-3b

Logs or error output

Reasoning effort 'none' is not supported for model 'ollama/qwen-coder-3b'. Supported reasoning efforts: low, medium, high, xhigh, max, ultra

Redacted configuration

{
  "providers": {
    "ollama": {
      "adapter": "openai-chat",
      "baseUrl": "http://localhost:11434/v1",
      "liveModels": false,
      "models": ["qwen-coder-3b"],
      "selectedModels": ["qwen-coder-3b"],
      "noReasoningModels": ["qwen-coder-3b"],
      "modelReasoningEfforts": {
        "qwen-coder-3b": []
      }
    }
  },
  "customModels": [
    {
      "id": "redacted-uuid",
      "provider": "ollama",
      "modelId": "qwen-coder-3b",
      "displayName": "Qwen Coder 3B (local)",
      "contextWindow": 32768,
      "inputModalities": ["text"]
    }
  ]
}

Checks

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

Activity

  1. github-actions commented on Aug 3, 2026

    @github-actions
    Contributor

    Automated translation bookkeeping — detected language: unknown.

  2. added
    bugSomething isn't working
    catalogModel catalog, slugs, visibility, routed entries
    on Aug 3, 2026
  3. Ingwannu commented on Aug 4, 2026

    @Ingwannu
    Owner

    Maintainer triage: confirmed against the current integration code. The custom-row dedupe in gatherRoutedModels() replaces the provider-derived row without carrying its capability metadata, so a configured empty reasoning ladder is lost and the generic ladder is synthesized.

    A scoped fix is already prepared in stacked PR #973 at commit 83340662. It keeps explicit custom-row fields such as display name, context window, and modalities, while inheriting only missing provider-derived capabilities such as reasoningEfforts, default effort, and parallel-tool support. The regression asserts the exact reported Ollama shape and verifies that the final catalog contains no reasoning levels or default reasoning level.

    I reran the focused catalog and NVIDIA suites on the stacked head: 138 passed, 0 failed, including the #962 regression. PR #973 still has an unrelated macOS CI failure, so this is not merged or fixed on dev yet. Leaving the issue open until the stack lands.

  4. lidge-jun commented on Aug 4, 2026

    @lidge-jun
    Owner

    Fixed by #973, merged into dev as 880d2e66e.

    A custom model row now inherits provider reasoning metadata from the row it replaces, so a same-slug override keeps its reasoning efforts and live-discovered metadata instead of dropping them.

    The fix carried here is @Yuxin-Qiao's from #965 (cherry-pick -x, authorship intact). #963 proposed a broader variant and was closed in its favour — #965 models the actual defect, which is a custom row replacing a same-slug provider row, so it inherits from the row being replaced and retains discovered metadata.

    Closing. Reopen if a custom row still loses metadata the provider row carried.

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