This is related to #8317, highlighting a broader architectural flaw in how Goose handles model lists from providers.
Currently, Goose fetches the list of available models from a provider's API (e.g., OpenRouter or an OpenAI-compatible proxy like OmniRoute) but then silently drops any model that is not hardcoded in its internal CanonicalModelRegistry.
The Code at Fault (crates/goose/src/providers/base.rs):
async fn fetch_recommended_models(&self) -> Result<Vec<String>, ProviderError> {
let all_models = self.fetch_supported_models().await?;
// ...
let mut models_with_dates: Vec<(String, Option<String>)> = all_models
.iter()
.filter_map(|model| {
// SILENT DROP: If map_to_canonical_model fails, the model is hidden from the UI
let canonical_id = map_to_canonical_model(provider_name, model, registry)?;
// ...
Why this is broken:
- New models are instantly unusable: Models like
claude-opus-4-6-thinking or gemini-3.1-pro cannot be selected in the UI because Goose's internal registry is outdated. Users are forced to type them manually.
- OpenRouter is crippled: OpenRouter returns hundreds of models (e.g.,
openrouter/qwen/qwen3.6-plus:free), but Goose hides almost all of them because it doesn't have a mapping for every OpenRouter ID.
- Custom Proxies (OmniRoute, LiteLLM) break: If a proxy uses prefixes or custom aliases, Goose drops them entirely.
There is a hidden flag skip_canonical_filtering for declarative providers, but it is entirely undocumented and fails to resolve the issue for built-in providers (like OpenRouter) or complex setups.
Expected behavior:
Goose should trust the provider. If an endpoint returns a model, it should be available in the dropdown UI. Filtering by a hardcoded registry should be opt-in (or at least provide a "Show All" toggle in the UI), rather than forcefully dropping models that the user's API key actually has access to.
This is related to #8317, highlighting a broader architectural flaw in how Goose handles model lists from providers.
Currently, Goose fetches the list of available models from a provider's API (e.g., OpenRouter or an OpenAI-compatible proxy like OmniRoute) but then silently drops any model that is not hardcoded in its internal
CanonicalModelRegistry.The Code at Fault (
crates/goose/src/providers/base.rs):Why this is broken:
claude-opus-4-6-thinkingorgemini-3.1-procannot be selected in the UI because Goose's internal registry is outdated. Users are forced to type them manually.openrouter/qwen/qwen3.6-plus:free), but Goose hides almost all of them because it doesn't have a mapping for every OpenRouter ID.There is a hidden flag
skip_canonical_filteringfor declarative providers, but it is entirely undocumented and fails to resolve the issue for built-in providers (like OpenRouter) or complex setups.Expected behavior:
Goose should trust the provider. If an endpoint returns a model, it should be available in the dropdown UI. Filtering by a hardcoded registry should be opt-in (or at least provide a "Show All" toggle in the UI), rather than forcefully dropping models that the user's API key actually has access to.