Skip to content

codex models fail with unsupported_api_for_model when model list fetch is rate-limited #1637

Description

@chcaru

Describe the bug

When multiple concurrent copilot processes use gpt-5.3-codex, they fail with unsupported_api_for_model because the CLI sends requests to /chat/completions instead of /responses.

The issue occurs when the listModels API call is rate-limited (HTTP 429). A single CLI instance works fine because the model list loads successfully.

Root cause (from inspecting the 0.0.415 bundle):

The responses API routing in KXe.getCompletionWithTools requires both conditions to be true:

U7e(settings, clientOptions) && model?.supported_endpoints?.includes("/responses")
  • U7e() checks clientOptions.thinkingMode || featureFlag("copilot_swe_agent_enable_responses_api")
  • model comes from chatClient.modelPromise — a model list fetch from the API

When the model list fetch fails (HTTP 429), model is null, so supported_endpoints?.includes("/responses") is falsy. The CLI falls back to /chat/completions, which rejects codex models. It then retries the same failing endpoint 5 times without re-attempting the model list fetch.

Affected version

0.0.415

Steps to reproduce the behavior

  1. Run multiple concurrent copilot -p processes with --model gpt-5.3-codex
  2. The listModels endpoint gets rate-limited (429)
  3. All instances fall back to /chat/completions and fail with:
    {"error":{"message":"model \"gpt-5.3-codex\" is not accessible via the /chat/completions endpoint","code":"unsupported_api_for_model"}}

Expected behavior

When the model list is unavailable, the CLI should either:

  • Handle the unsupported_api_for_model error by retrying with the /responses endpoint
  • Retry the model list fetch with backoff before giving up
  • Treat thinkingMode alone (without model metadata) as sufficient to route to /responses

Additional context

From the process logs:

[ERROR] Error loading models: Error: Failed to list models: 429

Followed by 6 consecutive failures on /chat/completions with unsupported_api_for_model, then exit code 1.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:modelsModel selection, availability, switching, rate limits, and model-specific behavior

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions