diff --git a/crates/language_model_selector/src/language_model_selector.rs b/crates/language_model_selector/src/language_model_selector.rs index 49939b91b5..e57dbc8d12 100644 --- a/crates/language_model_selector/src/language_model_selector.rs +++ b/crates/language_model_selector/src/language_model_selector.rs @@ -326,8 +326,14 @@ struct GroupedModels { impl GroupedModels { pub fn new(other: Vec, recommended: Vec) -> Self { + let recommended_ids: HashSet<_> = recommended.iter().map(|info| info.model.id()).collect(); + let mut other_by_provider: IndexMap<_, Vec> = IndexMap::default(); for model in other { + if recommended_ids.contains(&model.model.id()) { + continue; + } + let provider = model.model.provider_id(); if let Some(models) = other_by_provider.get_mut(&provider) { models.push(model); @@ -889,4 +895,26 @@ mod tests { let results = matcher.fuzzy_search("z4n"); assert_models_eq(results, vec!["zed/gpt-4.1-nano"]); } + + #[gpui::test] + fn test_exclude_recommended_models(_cx: &mut TestAppContext) { + let recommended_models = create_models(vec![("zed", "claude")]); + let all_models = create_models(vec![ + ("zed", "claude"), // Should be filtered out from "other" + ("zed", "gemini"), + ("copilot", "o3"), + ]); + + let grouped_models = GroupedModels::new(all_models, recommended_models); + + let actual_other_models = grouped_models + .other + .values() + .flatten() + .cloned() + .collect::>(); + + // Recommended models should not appear in "other" + assert_models_eq(actual_other_models, vec!["zed/gemini", "copilot/o3"]); + } }