diff --git a/crates/goose-cli/src/commands/configure.rs b/crates/goose-cli/src/commands/configure.rs index 02e977506b..d1d5a634d8 100644 --- a/crates/goose-cli/src/commands/configure.rs +++ b/crates/goose-cli/src/commands/configure.rs @@ -466,13 +466,11 @@ fn select_model_from_list( ), ); - if provider_meta.allows_unlisted_models { - model_items.push(( - UNLISTED_MODEL_KEY.to_string(), - "Enter a model not listed...".to_string(), - "", - )); - } + model_items.push(( + UNLISTED_MODEL_KEY.to_string(), + "Enter a model not listed...".to_string(), + "", + )); let selection = cliclack::select("Select a model:") .items(&model_items) @@ -492,13 +490,11 @@ fn select_model_from_list( let mut model_items: Vec<(String, String, &str)> = models.iter().map(|m| (m.clone(), m.clone(), "")).collect(); - if provider_meta.allows_unlisted_models { - model_items.push(( - UNLISTED_MODEL_KEY.to_string(), - "Enter a model not listed...".to_string(), - "", - )); - } + model_items.push(( + UNLISTED_MODEL_KEY.to_string(), + "Enter a model not listed...".to_string(), + "", + )); let selection = cliclack::select("Select a model:") .items(&model_items) diff --git a/crates/goose/src/providers/base.rs b/crates/goose/src/providers/base.rs index 89382f6cfd..ea498a61f0 100644 --- a/crates/goose/src/providers/base.rs +++ b/crates/goose/src/providers/base.rs @@ -175,9 +175,6 @@ pub struct ProviderMetadata { pub model_doc_link: String, /// Required configuration keys pub config_keys: Vec, - /// Whether this provider allows entering model names not in the fetched list - #[serde(default)] - pub allows_unlisted_models: bool, } impl ProviderMetadata { @@ -210,7 +207,6 @@ impl ProviderMetadata { .collect(), model_doc_link: model_doc_link.to_string(), config_keys, - allows_unlisted_models: false, } } @@ -231,7 +227,6 @@ impl ProviderMetadata { known_models: models, model_doc_link: model_doc_link.to_string(), config_keys, - allows_unlisted_models: false, } } @@ -244,15 +239,8 @@ impl ProviderMetadata { known_models: vec![], model_doc_link: "".to_string(), config_keys: vec![], - allows_unlisted_models: false, } } - - /// Set allows_unlisted_models flag (builder pattern) - pub fn with_unlisted_models(mut self) -> Self { - self.allows_unlisted_models = true; - self - } } /// Configuration key metadata for provider setup diff --git a/crates/goose/src/providers/chatgpt_codex.rs b/crates/goose/src/providers/chatgpt_codex.rs index 40f15d1b16..5d543e3eff 100644 --- a/crates/goose/src/providers/chatgpt_codex.rs +++ b/crates/goose/src/providers/chatgpt_codex.rs @@ -864,7 +864,6 @@ impl ProviderDef for ChatGptCodexProvider { false, )], ) - .with_unlisted_models() } fn from_env( diff --git a/crates/goose/src/providers/claude_code.rs b/crates/goose/src/providers/claude_code.rs index 7a8bd02734..a46ff5534e 100644 --- a/crates/goose/src/providers/claude_code.rs +++ b/crates/goose/src/providers/claude_code.rs @@ -487,10 +487,6 @@ impl ProviderDef for ClaudeCodeProvider { true, false, true, )], ) - // The model list only returns aliases the `claude` CLI uses, such as "default" - // and "haiku". There is no listing that includes full names like - // "claude-sonnet-4-5-20250929". However, they are permitted. - .with_unlisted_models() } fn from_env( diff --git a/crates/goose/src/providers/codex.rs b/crates/goose/src/providers/codex.rs index 3a31e9f621..854b9c7a79 100644 --- a/crates/goose/src/providers/codex.rs +++ b/crates/goose/src/providers/codex.rs @@ -605,7 +605,6 @@ impl ProviderDef for CodexProvider { ConfigKey::from_value_type::(false, false, true), ], ) - .with_unlisted_models() } fn from_env( diff --git a/crates/goose/src/providers/cursor_agent.rs b/crates/goose/src/providers/cursor_agent.rs index ad05cae1d5..e9790a3648 100644 --- a/crates/goose/src/providers/cursor_agent.rs +++ b/crates/goose/src/providers/cursor_agent.rs @@ -294,7 +294,6 @@ impl ProviderDef for CursorAgentProvider { true, false, true, )], ) - .with_unlisted_models() } fn from_env( diff --git a/crates/goose/src/providers/gcpvertexai.rs b/crates/goose/src/providers/gcpvertexai.rs index 559c0a46d2..4f2df3ecd1 100644 --- a/crates/goose/src/providers/gcpvertexai.rs +++ b/crates/goose/src/providers/gcpvertexai.rs @@ -541,7 +541,6 @@ impl ProviderDef for GcpVertexAIProvider { ), ], ) - .with_unlisted_models() } fn from_env( @@ -742,6 +741,5 @@ mod tests { assert!(!metadata.known_models.is_empty()); assert_eq!(metadata.default_model, "gemini-2.5-flash"); assert_eq!(metadata.config_keys.len(), 6); - assert!(metadata.allows_unlisted_models); } } diff --git a/crates/goose/src/providers/gemini_cli.rs b/crates/goose/src/providers/gemini_cli.rs index 7dbeb68712..5f1e549b39 100644 --- a/crates/goose/src/providers/gemini_cli.rs +++ b/crates/goose/src/providers/gemini_cli.rs @@ -169,7 +169,6 @@ impl ProviderDef for GeminiCliProvider { true, false, true, )], ) - .with_unlisted_models() } fn from_env( diff --git a/crates/goose/src/providers/openrouter.rs b/crates/goose/src/providers/openrouter.rs index 05a4b6da04..d8f26106cd 100644 --- a/crates/goose/src/providers/openrouter.rs +++ b/crates/goose/src/providers/openrouter.rs @@ -168,7 +168,6 @@ impl ProviderDef for OpenRouterProvider { ), ], ) - .with_unlisted_models() } fn from_env( diff --git a/crates/goose/src/providers/provider_registry.rs b/crates/goose/src/providers/provider_registry.rs index 4c142becc1..d29e64ce7f 100644 --- a/crates/goose/src/providers/provider_registry.rs +++ b/crates/goose/src/providers/provider_registry.rs @@ -127,7 +127,6 @@ impl ProviderRegistry { known_models, model_doc_link: base_metadata.model_doc_link, config_keys, - allows_unlisted_models: false, }; self.entries.insert( diff --git a/crates/goose/tests/agent.rs b/crates/goose/tests/agent.rs index 370d15b829..f00fb000ad 100644 --- a/crates/goose/tests/agent.rs +++ b/crates/goose/tests/agent.rs @@ -372,7 +372,6 @@ mod tests { known_models: vec![], model_doc_link: "".to_string(), config_keys: vec![], - allows_unlisted_models: false, } } diff --git a/crates/goose/tests/compaction.rs b/crates/goose/tests/compaction.rs index e6e421e863..43ac2a6559 100644 --- a/crates/goose/tests/compaction.rs +++ b/crates/goose/tests/compaction.rs @@ -190,7 +190,6 @@ impl ProviderDef for MockCompactionProvider { known_models: vec![], model_doc_link: "".to_string(), config_keys: vec![], - allows_unlisted_models: false, } } diff --git a/ui/desktop/openapi.json b/ui/desktop/openapi.json index 71d5b69936..29188e7d83 100644 --- a/ui/desktop/openapi.json +++ b/ui/desktop/openapi.json @@ -6154,10 +6154,6 @@ "config_keys" ], "properties": { - "allows_unlisted_models": { - "type": "boolean", - "description": "Whether this provider allows entering model names not in the fetched list" - }, "config_keys": { "type": "array", "items": { diff --git a/ui/desktop/src/api/types.gen.ts b/ui/desktop/src/api/types.gen.ts index 936ad95354..ff0f550475 100644 --- a/ui/desktop/src/api/types.gen.ts +++ b/ui/desktop/src/api/types.gen.ts @@ -832,10 +832,6 @@ export type ProviderEngine = 'openai' | 'ollama' | 'anthropic'; * Metadata about a provider's configuration requirements and capabilities */ export type ProviderMetadata = { - /** - * Whether this provider allows entering model names not in the fetched list - */ - allows_unlisted_models?: boolean; /** * Required configuration keys */ diff --git a/ui/desktop/src/components/recipes/shared/RecipeModelSelector.tsx b/ui/desktop/src/components/recipes/shared/RecipeModelSelector.tsx index d318157a74..fe60eb1736 100644 --- a/ui/desktop/src/components/recipes/shared/RecipeModelSelector.tsx +++ b/ui/desktop/src/components/recipes/shared/RecipeModelSelector.tsx @@ -60,13 +60,11 @@ export const RecipeModelSelector = ({ provider: p.name, })); - if (p.metadata.allows_unlisted_models) { - options.push({ - value: `__custom__:${p.name}`, - label: 'Enter a model not listed...', - provider: p.name, - }); - } + options.push({ + value: `__custom__:${p.name}`, + label: 'Enter a model not listed...', + provider: p.name, + }); if (options.length > 0) { groupedOptions.push({ options }); diff --git a/ui/desktop/src/components/settings/models/subcomponents/SwitchModelModal.tsx b/ui/desktop/src/components/settings/models/subcomponents/SwitchModelModal.tsx index 4783e77c75..bd18dbc58c 100644 --- a/ui/desktop/src/components/settings/models/subcomponents/SwitchModelModal.tsx +++ b/ui/desktop/src/components/settings/models/subcomponents/SwitchModelModal.tsx @@ -250,7 +250,7 @@ export const SwitchModelModal = ({ providerType: p.provider_type, })); - if (p.metadata.allows_unlisted_models && p.provider_type !== 'Custom') { + if (p.provider_type !== 'Custom') { options.push({ value: 'custom', label: 'Enter a model not listed...',