@@ -91,6 +91,39 @@ def test_writes_ucode_profile_config_file(self, tmp_path, monkeypatch):
9191 assert doc ["model" ] == "gpt-5"
9292 assert "profiles" not in doc
9393
94+ def test_writes_openai_model_id_for_databricks_gpt_endpoint (self , tmp_path , monkeypatch ):
95+ config_path = tmp_path / ".codex" / "ucode.config.toml"
96+ backup_path = tmp_path / "codex-ucode-config.backup.toml"
97+ monkeypatch .setattr (codex , "CODEX_CONFIG_PATH" , config_path )
98+ monkeypatch .setattr (codex , "CODEX_BACKUP_PATH" , backup_path )
99+ monkeypatch .setattr (codex , "agent_version" , lambda binary : "0.134.0" )
100+ monkeypatch .setattr (codex , "save_state" , lambda state : None )
101+
102+ codex .write_tool_config (
103+ {"workspace" : WS , "codex_models" : ["databricks-gpt-5" , "databricks-gpt-5-5" ]}
104+ )
105+
106+ doc = read_toml_safe (config_path )
107+ assert doc ["model" ] == "gpt-5.5"
108+
109+ def test_preserves_databricks_model_id_when_openai_id_is_incompatible (
110+ self , tmp_path , monkeypatch
111+ ):
112+ config_path = tmp_path / ".codex" / "ucode.config.toml"
113+ backup_path = tmp_path / "codex-ucode-config.backup.toml"
114+ monkeypatch .setattr (codex , "CODEX_CONFIG_PATH" , config_path )
115+ monkeypatch .setattr (codex , "CODEX_BACKUP_PATH" , backup_path )
116+ monkeypatch .setattr (codex , "agent_version" , lambda binary : "0.134.0" )
117+ monkeypatch .setattr (codex , "save_state" , lambda state : None )
118+
119+ codex .write_tool_config (
120+ {"workspace" : WS , "codex_models" : ["databricks-gpt-5-2-codex" ]},
121+ "databricks-gpt-5-2-codex" ,
122+ )
123+
124+ doc = read_toml_safe (config_path )
125+ assert doc ["model" ] == "databricks-gpt-5-2-codex"
126+
94127 def test_removes_legacy_ucode_profile_from_shared_config (self , tmp_path , monkeypatch ):
95128 config_dir = tmp_path / ".codex"
96129 config_dir .mkdir ()
@@ -187,12 +220,36 @@ def test_unknown_version_uses_modern_layout(self, monkeypatch):
187220
188221
189222class TestCodexDefaultModel :
190- def test_returns_first_codex_model (self ):
191- assert codex .default_model ({"codex_models" : ["gpt-5" , "gpt-4o" ]}) == "gpt-5"
223+ def test_picks_highest_semver_over_alpha (self ):
224+ state = {"codex_models" : ["databricks-gpt-5" , "databricks-gpt-5-5" ]}
225+
226+ assert codex .default_model (state ) == "databricks-gpt-5-5"
192227
193228 def test_none_when_no_models (self ):
194229 assert codex .default_model ({}) is None
195230
231+ def test_prefers_base_over_suffixed_same_version (self ):
232+ models = ["gpt-5-5-mini" , "gpt-5-5" , "gpt-5" ]
233+
234+ assert codex .default_model ({"codex_models" : models }) == "gpt-5-5"
235+
236+ def test_namespaced_models_use_same_version_parser (self ):
237+ models = ["served-models/databricks-gpt-5" , "served-models/databricks-gpt-5-5" ]
238+
239+ assert codex .default_model ({"codex_models" : models }) == "served-models/databricks-gpt-5-5"
240+
241+ def test_openai_model_id_maps_databricks_naming (self ):
242+ assert codex ._openai_model_id ("databricks-gpt-5-5" ) == "gpt-5.5"
243+ assert codex ._openai_model_id ("databricks-gpt-5-5-mini" ) == "gpt-5.5-mini"
244+ assert codex ._openai_model_id ("databricks-gpt-4o" ) == "gpt-4o"
245+ assert codex ._openai_model_id ("served-models/databricks-gpt-5-5" ) == "gpt-5.5"
246+ assert codex ._openai_model_id ("gpt-5.5" ) == "gpt-5.5"
247+
248+ def test_codex_model_id_preserves_openai_incompatible_models (self ):
249+ assert codex ._codex_model_id ("databricks-gpt-5-2-codex" ) == "databricks-gpt-5-2-codex"
250+ assert codex ._codex_model_id ("databricks-gpt-5-4-nano" ) == "databricks-gpt-5-4-nano"
251+ assert codex ._codex_model_id ("databricks-gpt-5-5" ) == "gpt-5.5"
252+
196253
197254class TestCodexValidateCmd :
198255 def test_starts_with_binary (self ):
0 commit comments