diff --git a/crates/goose/src/providers/init.rs b/crates/goose/src/providers/init.rs index bb19a1f9a04b..6105fc5626a5 100644 --- a/crates/goose/src/providers/init.rs +++ b/crates/goose/src/providers/init.rs @@ -137,7 +137,15 @@ async fn init_registry() -> RwLock { true, Some(registrations::openai_inventory()), ); - registry.register::(true); + registry.register_with_inventory::( + true, + Some(registrations::refresh_only().with_configured(|| { + let config = crate::config::Config::global(); + config + .get_secret::("OPENROUTER_API_KEY") + .is_ok() + })), + ); registry.register_with_inventory::( false, Some(registrations::pi_acp_inventory()), diff --git a/crates/goose/src/providers/openrouter.rs b/crates/goose/src/providers/openrouter.rs index d9d5088dafdf..631745ccfe49 100644 --- a/crates/goose/src/providers/openrouter.rs +++ b/crates/goose/src/providers/openrouter.rs @@ -233,8 +233,11 @@ impl Provider for OpenRouterProvider { &self.name } - /// Fetch supported models from OpenRouter API (only models with tool support) - async fn fetch_supported_models(&self) -> Result, ProviderError> { + fn skip_canonical_filtering(&self) -> bool { + true + } + + async fn fetch_recommended_models(&self, toolshim: bool) -> Result, ProviderError> { let response = self .api_client .request("api/v1/models") @@ -273,10 +276,20 @@ impl Provider for OpenRouterProvider { .iter() .filter_map(|model| { let id = model.get("id").and_then(|v| v.as_str())?; - Some(id.to_string()) + if toolshim { + return Some(id.to_string()); + } + let supports_tools = model + .get("supported_parameters") + .and_then(|v| v.as_array()) + .is_some_and(|params| params.iter().any(|p| p.as_str() == Some("tools"))); + if supports_tools { + Some(id.to_string()) + } else { + None + } }) .collect(); - models.sort(); Ok(models) }