Skip to content

Goose silently drops unmapped models from /v1/models, breaking OpenRouter, OmniRoute, and cutting off new models #8321

@yart

Description

@yart

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:

  1. 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.
  2. 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.
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions