Codex Desktop: custom-provider model shown as "Custom High" and session persona claims GPT-5

Open 💬 2 comments Opened Aug 2, 2026 by dknewu

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:

  1. Wrong label in the Desktop model picker. The composer model picker (bottom-right of the input box) shows a fabricated provider + reasoning_effort label - e.g. Custom High, or Deepseek Max when the provider is named deepseek - instead of the model's display_name from the configured catalog (DeepSeek V4 Flash).
  2. Wrong model identity in the session. The session's base_instructions / instructions_template contain You are Codex, an agent based on GPT-5. even though the configured model is deepseek-v4-flash and 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

  1. 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"
```

  1. 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. ...",
...
}
}
``

  1. Run codex debug models - the entry is returned with the correct display_name and instructions.
  2. Open the Codex Desktop app. The model picker shows Custom High / Deepseek Max (provider + effort) instead of DeepSeek V4 Flash, even though the catalog entry exists.
  3. Start a task with this model. The saved session (session_meta) contains base_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 shows deepseek-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 concatenating provider + 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_name present in model_catalog_json, the picker still renders the fallback provider + effort label.
  • 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_json loaded but custom models not shown in picker (regression, related to #32349)

View original on GitHub ↗

2 Comments

dknewu · 26 days ago

Follow-up after a local fix: the desktop model picker now resolves deepseek-v4-flash correctly (the app-server model/list returns display_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 rollout session_meta stores the compiled base_instructions at 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.

itsHabib · 18 days ago

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 hardcoded gpt-5.3-codex fallback.

Full sanitized reproduction and potential root cause: https://github.com/openai/codex/issues/37700