Codex Desktop: custom-provider model shown as "Custom High" and session persona claims GPT-5
Codex Desktop: custom-provider model is shown as "Custom High" and the session persona claims GPT-5
What version of Codex?
Desktop: OpenAI.Codex_26.727.6591.0 (Windows MSIX, build 26.727) / CLI 0.146.0-alpha.9.2 (Windows 11, 10.0.26200)
What issue are you seeing?
Two related symptoms when using a custom provider plus a locally configured model_catalog_json:
- Wrong label in the Desktop model picker. The composer model picker (bottom-right of the input box) shows a fabricated
provider + reasoning_effortlabel - e.g.Custom High, orDeepseek Maxwhen the provider is nameddeepseek- instead of the model'sdisplay_namefrom the configured catalog (DeepSeek V4 Flash). - Wrong model identity in the session. The session's
base_instructions/instructions_templatecontainYou are Codex, an agent based on GPT-5.even though the configured model isdeepseek-v4-flashand the catalog entry provides its own model messages. Asking "which model are you using?" returns GPT-5, while the CLI TUI correctly displays the configured model slug.
The CLI and the Desktop app run the same configured model (deepseek-v4-flash) and the catalog is resolved correctly (codex debug models shows the entry with display_name: "DeepSeek V4 Flash"), so this appears to be a Desktop rendering / metadata-selection bug rather than a configuration problem.
Steps to reproduce
- Configure
~/.codex/config.toml:
```toml
model = "deepseek-v4-flash"
model_provider = "deepseek"
model_reasoning_effort = "max"
model_catalog_json = "C:/Users/user/.codex/models.json"
[model_providers.deepseek]
name = "deepseek"
base_url = "https://api.deepseek.com/"
wire_api = "responses"
```
- In
models.json, include an entry for the model with proper metadata:
``json``
{
"slug": "deepseek-v4-flash",
"display_name": "DeepSeek V4 Flash",
"model_messages": {
"instructions_template": "You are Codex, an agent based on DeepSeek V4 Flash. ...",
...
}
}
- Run
codex debug models- the entry is returned with the correctdisplay_nameand instructions. - Open the Codex Desktop app. The model picker shows
Custom High/Deepseek Max(provider + effort) instead ofDeepSeek V4 Flash, even though the catalog entry exists. - Start a task with this model. The saved session (
session_meta) containsbase_instructions: "You are Codex, an agent based on GPT-5. ...". Asking the agent "which model are you using?" yields a GPT-5 answer, while the CLI showsdeepseek-v4-flash.
Expected behavior
- The Desktop model picker should resolve the configured model to its catalog
display_name(or at minimum its slug, like the CLI does), instead of concatenatingprovider + effort. - Sessions for custom-provider models should use the model's catalog instructions (
instructions_template/base_instructions), or otherwise must not identify the agent as GPT-5 when the configured model is a third-party model.
Additional notes
- The catalog metadata alone is not enough: even with a valid
display_namepresent inmodel_catalog_json, the picker still renders the fallbackprovider + effortlabel. - This matches the symptom already described in #19694 ("the Desktop App may show
Custom...") and is related to #34487; the new facet here is the session persona claiming the wrong model (GPT-5) for a custom-provider model.
Related issues
- #19694 - Codex Desktop model picker filters out models returned from
model_catalog_json - #34487 - Desktop:
model_catalog_jsonloaded but custom models not shown in picker (regression, related to #32349)
2 Comments
Follow-up after a local fix: the desktop model picker now resolves
deepseek-v4-flashcorrectly (the app-servermodel/listreturnsdisplay_name: "DeepSeek V4 Flash"), so the composer label is fixed for new tasks. However, resuming an existing thread still sends the OLD compiled system prompt ("You are Codex, an agent based on GPT-5...") to the model, because the rolloutsession_metastores the compiledbase_instructionsat thread creation and does not recompile them when the model catalog/config changes. New tasks are correct; resumed old threads keep the stale model identity until the user starts a new task. Suggest recompiling base instructions on resume, or invalidating session_meta when the catalog for the thread model changes.I filed #37700 with a current Windows data point and a more specific resolver trace for the related wrong-label symptom.
The distinguishing behavior is that the custom catalog does render correctly and routing/thread state use the configured provider-prefixed model. Only current-selection resolution fails. In the bundled
app-initial-*.js, the resolver exact-matches the configured provider-prefixed ID against a bare-slug built-in model list; the miss produces the localized "Custom" label and the hardcodedgpt-5.3-codexfallback.Full sanitized reproduction and potential root cause: https://github.com/openai/codex/issues/37700