Skip to content

Commit abd696e

Browse files
committed
fix: relax canonical model listing for custom providers
Keep strict canonical filtering for builtin/preferred providers, while allowing unknown models for custom/declarative providers. This fixes proxy-backed models disappearing from the picker despite working at runtime. Use provider_type() for classification in fetch_recommended_models and add focused regression tests for custom-include vs builtin-exclude behavior. Signed-off-by: Pete Gonzalez <4673363+octogonz@users.noreply.github.com>
1 parent 1dea9e2 commit abd696e

1 file changed

Lines changed: 65 additions & 0 deletions

File tree

crates/goose/src/providers/base.rs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -931,6 +931,45 @@ mod tests {
931931
}
932932
}
933933

934+
struct ListingProvider {
935+
name: String,
936+
provider_type: ProviderType,
937+
model_config: ModelConfig,
938+
supported_models: Vec<String>,
939+
}
940+
941+
#[async_trait::async_trait]
942+
impl Provider for ListingProvider {
943+
fn get_name(&self) -> &str {
944+
&self.name
945+
}
946+
947+
fn provider_type(&self) -> ProviderType {
948+
self.provider_type
949+
}
950+
951+
fn get_model_config(&self) -> ModelConfig {
952+
self.model_config.clone()
953+
}
954+
955+
async fn fetch_supported_models(&self) -> Result<Vec<String>, ProviderError> {
956+
Ok(self.supported_models.clone())
957+
}
958+
959+
async fn stream(
960+
&self,
961+
_model_config: &ModelConfig,
962+
_session_id: &str,
963+
_system: &str,
964+
_messages: &[Message],
965+
_tools: &[Tool],
966+
) -> Result<MessageStream, ProviderError> {
967+
Err(ProviderError::ExecutionError(
968+
"stream not implemented for listing tests".to_string(),
969+
))
970+
}
971+
}
972+
934973
fn create_test_stream(
935974
items: Vec<String>,
936975
) -> impl Stream<Item = Result<(Option<Message>, Option<ProviderUsage>), ProviderError>> {
@@ -1114,4 +1153,30 @@ mod tests {
11141153
assert_eq!(info.output_token_cost, Some(0.00001));
11151154
assert_eq!(info.currency, Some("$".to_string()));
11161155
}
1156+
1157+
#[tokio::test]
1158+
async fn test_fetch_recommended_models_includes_unknown_for_custom_provider() {
1159+
let provider = ListingProvider {
1160+
name: "custom-proxy".to_string(),
1161+
provider_type: ProviderType::Custom,
1162+
model_config: ModelConfig::new_or_fail("glm-5"),
1163+
supported_models: vec!["glm-5".to_string()],
1164+
};
1165+
1166+
let recommended = provider.fetch_recommended_models().await.unwrap();
1167+
assert!(recommended.contains(&"glm-5".to_string()));
1168+
}
1169+
1170+
#[tokio::test]
1171+
async fn test_fetch_recommended_models_excludes_unknown_for_builtin_provider() {
1172+
let provider = ListingProvider {
1173+
name: "openai".to_string(),
1174+
provider_type: ProviderType::Builtin,
1175+
model_config: ModelConfig::new_or_fail("gpt-4o"),
1176+
supported_models: vec!["definitely-unknown-model-id".to_string()],
1177+
};
1178+
1179+
let recommended = provider.fetch_recommended_models().await.unwrap();
1180+
assert!(recommended.is_empty());
1181+
}
11171182
}

0 commit comments

Comments
 (0)