Skip to content

Newly configured Codex model disappears from picker after switching to an older model #236

@garrza

Description

@garrza

Summary

In Zed’s Codex ACP integration, a newly promoted/default Codex model (GPT 5.5) appears in the model picker when opening a
new Codex thread, but disappears after switching to an older model. Opening a new Codex thread makes the new model
appear again.

I believe this is caused by codex-acp filtering model picker options to show_in_picker models plus only the
current model.

Repro

  1. Open Zed.
  2. Start a new Codex ACP thread.
  3. Open the model picker.
  4. Observe that the newly promoted/default model is visible.
  5. Switch to an older model.
  6. Open the model picker again.

Actual Behavior

The newly promoted/default model is no longer visible in the picker after switching away from it.

If I open a new Codex ACP thread, the model appears again because it is current/default for that new session.

Expected Behavior

A newly promoted/default model should remain visible in the model picker after switching away from it, assuming it
is intended to be user-selectable.

Suspected Cause

This may be caused by codex-acp building the picker from a model preset list that does not include the newly
released model yet.

In src/thread.rs, config_options() gets the current model, looks for a matching preset, and only adds the
current raw model string if no preset is found:

let current_model = self.get_current_model().await;
let current_preset = presets.iter().find(|p| p.model == current_model).cloned();

if current_preset.is_none() {
    model_select_options.push(SessionConfigSelectOption::new(
        current_model.clone(),
        current_model.clone(),
    ));
}

Then it adds models from the preset list:

  .filter(|model| model.show_in_picker || model.model == current_model)

This makes the newly configured/default model visible only while it is the current model if codex-acp does not
have a preset for it. After selecting an older known model, handle_set_config_model() updates self.config.model,
config_options() is rebuilt, and the raw fallback entry for the new model is no longer included.

There is similar logic in the legacy ACP models() path:

.filter(|model| model.show_in_picker || model.model == config_model)

Zed appears to use the config_options path first for Codex ACP, so the active issue is likely in the model config
option list.

Notes

I’m attaching video proof showing what I mean as well:

Screen.Recording.2026-04-23.at.5.27.08.PM.mov

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions