Repository navigation
[Bug]: Custom model rows drop provider reasoning metadata from the Codex catalog #962
Description
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
- Configure a static local provider model and a custom row for the same provider/model ID using the redacted shape below.
- Run
ocx sync. - Inspect
ollama/qwen-coder-3bin the generated Codex catalog. - Observe that
supported_reasoning_levelscontains the genericlowthroughultraladder anddefault_reasoning_levelismedium. - Start a fresh Codex process through the OpenCodex loopback proxy and request an ephemeral subagent using
ollama/qwen-coder-3bwith no reasoning. - Codex rejects the child before creation because
noneis 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, ultraRedacted 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
github-actions commentedon Aug 3, 2026
Automated translation bookkeeping — detected language: unknown.
Ingwannu commentedon Aug 4, 2026
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 asreasoningEfforts, 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
devyet. Leaving the issue open until the stack lands.lidge-jun commentedon Aug 4, 2026
Fixed by #973, merged into
devas880d2e66e.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.
docs(triage): adjudicate the nine overnight PRs
feat(models): per-custom-model reasoning effort in the Models dashboard
fix(models): enforce ladder invariants and constrain Pi effort levels
feat(models): per-custom-model reasoning effort in the Models dashboard
fix(models): enforce ladder invariants and constrain Pi effort levels
docs(triage): adjudicate the nine overnight PRs
feat(models): per-custom-model reasoning effort in the Models dashboard
fix(models): enforce ladder invariants and constrain Pi effort levels