Skip to content

GitHub Copilot: static default model list shadows live entitlement discovery #88548

Description

@saju01

GitHub Copilot: static default model list shadows live entitlement discovery

Summary

The GitHub Copilot provider ships a live model-discovery hook (fetchCopilotModelCatalog) that fetches ${baseUrl}/models and is explicitly documented as tracking "per-account entitlements + accurate context windows without manifest churn." In practice, however, the static default catalog (extensions/github-copilot/models-defaults.ts DEFAULT_MODEL_IDS + openclaw.plugin.json manifest models) is what seeds the user-facing model picker and openclaw models list.

When Copilot adds a new model (e.g. claude-opus-4.8), entitled accounts can call it successfully, but it does not appear in the picker / models list until the static list is bumped or the user hand-edits config. This defeats the stated purpose of the discovery hook.

Reproduction

  1. Account entitled to a model newer than the static list (e.g. claude-opus-4.8).
  2. GET https://api.githubcopilot.com/models returns it (verified: 41 models incl. claude-opus-4.8).
  3. openclaw models list --provider github-copilot does not show it.
  4. A direct --model github-copilot/claude-opus-4.8 agent call succeeds (no fallback) — proving entitlement and routing both work; only discovery/visibility is missing.

Impact

  • Newly entitled Copilot models are invisible/unselectable until a release bumps the static list.
  • Users must manually add models.providers.github-copilot.models[] entries + aliases to use a model their plan already includes.
  • A confusing ⚠️ Gateway: agents.defaults.models.github-copilot/<model> failed warning can appear for config keys containing the provider/model slash, even when the model resolves and runs fine.

Proposed fix

  1. Picker/catalog should present the union of live-discovered models and static defaults, deduped by id, with live metadata winning (context window, vision, reasoning). The static list becomes a fallback for offline/discovery-failure only.
  2. Keep the 30s live-catalog cache; on discovery success, merge rather than letting static defaults gate visibility.
  3. (Minor) Improve the gateway warning so a model id containing / in a config key path doesn't render as a spurious "failed" path.

Interim

PR #88547 adds claude-opus-4.8 to the static catalog as an immediate unblock.

Environment

  • OpenClaw 2026.5.28
  • Provider: github-copilot
  • Verified live /models returns claude-opus-4.8 for the affected account.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2Normal backlog priority with limited blast radius.clawsweeper:fix-shape-clearClawSweeper found a clear likely implementation shape for this issue.clawsweeper:linked-pr-openClawSweeper found an open linked pull request for this issue.clawsweeper:needs-live-reproClawSweeper needs live local, crabbox, or manual validation to confirm this issue.clawsweeper:needs-maintainer-reviewClawSweeper marked this issue as needing maintainer review before automation.clawsweeper:needs-product-decisionClawSweeper marked this issue as needing a product or behavior decision.clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.impact:auth-providerAuth, provider routing, model choice, or SecretRef resolution may break.issue-rating: 🐚 platinum hermitGood issue quality with a plausible reproduction path needing some confirmation.

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions