diff --git a/crates/goose/src/config/declarative_providers.rs b/crates/goose/src/config/declarative_providers.rs index 20ca3fb963ff..95f8288a81f6 100644 --- a/crates/goose/src/config/declarative_providers.rs +++ b/crates/goose/src/config/declarative_providers.rs @@ -61,6 +61,8 @@ pub struct DeclarativeProviderConfig { pub env_vars: Option>, #[serde(default)] pub dynamic_models: Option, + #[serde(default)] + pub skip_canonical_filtering: bool, } fn default_requires_auth() -> bool { @@ -215,6 +217,7 @@ pub fn create_custom_provider( base_path: params.base_path, env_vars: None, dynamic_models: None, + skip_canonical_filtering: false, }; let custom_providers_dir = custom_providers_dir(); @@ -280,6 +283,7 @@ pub fn update_custom_provider(params: UpdateCustomProviderParams) -> Result<()> base_path: params.base_path, env_vars: existing_config.env_vars, dynamic_models: existing_config.dynamic_models, + skip_canonical_filtering: existing_config.skip_canonical_filtering, }; let file_path = custom_providers_dir().join(format!("{}.json", updated_config.name)); diff --git a/crates/goose/src/providers/base.rs b/crates/goose/src/providers/base.rs index fae0dd8b7ae1..546a9be273f8 100644 --- a/crates/goose/src/providers/base.rs +++ b/crates/goose/src/providers/base.rs @@ -534,10 +534,18 @@ pub trait Provider: Send + Sync { Ok(vec![]) } + fn skip_canonical_filtering(&self) -> bool { + false + } + /// Fetch models filtered by canonical registry and usability async fn fetch_recommended_models(&self) -> Result, ProviderError> { let all_models = self.fetch_supported_models().await?; + if self.skip_canonical_filtering() { + return Ok(all_models); + } + let registry = CanonicalModelRegistry::bundled().map_err(|e| { ProviderError::ExecutionError(format!("Failed to load canonical registry: {}", e)) })?; diff --git a/crates/goose/src/providers/declarative/lmstudio.json b/crates/goose/src/providers/declarative/lmstudio.json index ad8c7a392db2..8390793c3e10 100644 --- a/crates/goose/src/providers/declarative/lmstudio.json +++ b/crates/goose/src/providers/declarative/lmstudio.json @@ -7,5 +7,6 @@ "base_url": "http://localhost:1234/v1/chat/completions", "models": [], "supports_streaming": true, - "requires_auth": false + "requires_auth": false, + "skip_canonical_filtering": true } diff --git a/crates/goose/src/providers/openai.rs b/crates/goose/src/providers/openai.rs index 3e032c40a3d6..65c7faef95cd 100644 --- a/crates/goose/src/providers/openai.rs +++ b/crates/goose/src/providers/openai.rs @@ -65,6 +65,7 @@ pub struct OpenAiProvider { custom_headers: Option>, supports_streaming: bool, name: String, + skip_canonical_filtering: bool, } impl OpenAiProvider { @@ -126,6 +127,7 @@ impl OpenAiProvider { custom_headers, supports_streaming: true, name: OPEN_AI_PROVIDER_NAME.to_string(), + skip_canonical_filtering: false, }) } @@ -140,6 +142,7 @@ impl OpenAiProvider { custom_headers: None, supports_streaming: true, name: OPEN_AI_PROVIDER_NAME.to_string(), + skip_canonical_filtering: false, } } @@ -208,6 +211,7 @@ impl OpenAiProvider { custom_headers: config.headers, supports_streaming: config.supports_streaming.unwrap_or(true), name: config.name.clone(), + skip_canonical_filtering: config.skip_canonical_filtering, }) } @@ -361,6 +365,10 @@ impl Provider for OpenAiProvider { &self.name } + fn skip_canonical_filtering(&self) -> bool { + self.skip_canonical_filtering + } + fn get_model_config(&self) -> ModelConfig { self.model.clone() } @@ -617,6 +625,7 @@ mod tests { custom_headers: None, supports_streaming: true, name: name.to_string(), + skip_canonical_filtering: false, } } diff --git a/ui/desktop/openapi.json b/ui/desktop/openapi.json index 2e3671b272bb..8a531d119e5d 100644 --- a/ui/desktop/openapi.json +++ b/ui/desktop/openapi.json @@ -4633,6 +4633,9 @@ "requires_auth": { "type": "boolean" }, + "skip_canonical_filtering": { + "type": "boolean" + }, "supports_streaming": { "type": "boolean", "nullable": true diff --git a/ui/desktop/src/api/types.gen.ts b/ui/desktop/src/api/types.gen.ts index 6add7592e84e..480db5119408 100644 --- a/ui/desktop/src/api/types.gen.ts +++ b/ui/desktop/src/api/types.gen.ts @@ -217,6 +217,7 @@ export type DeclarativeProviderConfig = { models: Array; name: string; requires_auth?: boolean; + skip_canonical_filtering?: boolean; supports_streaming?: boolean | null; timeout_seconds?: number | null; };