Compare commits

...

2 Commits

Author SHA1 Message Date
Sayan Sisodiya
911b2bf45b integration test 2026-02-23 15:03:52 -08:00
Sayan Sisodiya
4f52c90e10 ignore PRESETS models when custom model_catalog_json specified
this prevents duplication/extra models from showing up in available models when the user explicitly overrides built in models list with a custom one
2026-02-23 14:30:42 -08:00
2 changed files with 68 additions and 2 deletions

View File

@@ -314,8 +314,12 @@ impl ModelsManager {
remote_models.sort_by(|a, b| a.priority.cmp(&b.priority));
let remote_presets: Vec<ModelPreset> = remote_models.into_iter().map(Into::into).collect();
let existing_presets = self.local_models.clone();
let mut merged_presets = ModelPreset::merge(remote_presets, existing_presets);
let mut merged_presets = if self.has_custom_model_catalog {
remote_presets
} else {
let existing_presets = self.local_models.clone();
ModelPreset::merge(remote_presets, existing_presets)
};
let chatgpt_mode = matches!(self.auth_manager.auth_mode(), Some(AuthMode::Chatgpt));
merged_presets = ModelPreset::filter_by_auth(merged_presets, chatgpt_mode);
@@ -881,6 +885,35 @@ mod tests {
assert_eq!(available, vec![expected_hidden, expected_visible]);
}
#[tokio::test]
async fn custom_catalog_listing_does_not_append_builtin_presets() {
let codex_home = tempdir().expect("temp dir");
let auth_manager =
AuthManager::from_auth_for_testing(CodexAuth::from_api_key("Test API Key"));
let manager = ModelsManager::new(
codex_home.path().to_path_buf(),
auth_manager,
Some(ModelsResponse {
models: vec![remote_model("oca/gpt-5.2-codex", "Prefixed", 0)],
}),
);
let available = manager.list_models(RefreshStrategy::Offline).await;
assert!(
available
.iter()
.any(|preset| preset.model == "oca/gpt-5.2-codex"),
"expected custom catalog model in list"
);
assert!(
!available
.iter()
.any(|preset| preset.model == "gpt-5.2-codex"),
"expected built-in preset to be omitted when custom catalog is provided"
);
}
#[test]
fn bundled_models_json_roundtrips() {
let file_contents = include_str!("../../models.json");

View File

@@ -608,6 +608,39 @@ async fn remote_models_preserve_builtin_presets() -> Result<()> {
Ok(())
}
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn custom_catalog_models_omit_builtin_presets_in_listing() -> Result<()> {
let codex_home = TempDir::new()?;
let auth = CodexAuth::from_api_key("Test API Key");
let auth_manager = codex_core::test_support::auth_manager_from_auth(auth);
let manager = ModelsManager::new(
codex_home.path().to_path_buf(),
auth_manager,
Some(ModelsResponse {
models: vec![test_remote_model(
"oca/gpt-5.2-codex",
ModelVisibility::List,
0,
)],
}),
);
let available = manager.list_models(RefreshStrategy::Offline).await;
assert!(
available
.iter()
.any(|model| model.model == "oca/gpt-5.2-codex"),
"custom catalog model should be listed"
);
assert!(
!available.iter().any(|model| model.model == "gpt-5.2-codex"),
"builtin presets should be omitted when custom catalog is provided"
);
Ok(())
}
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn remote_models_merge_adds_new_high_priority_first() -> Result<()> {
skip_if_no_network!(Ok(()));