Skip to content

console: custom provider reasoning settings are dropped by /api/v2/config, leaving no variants #57433

Closed

Description

@YifePlayte

Description

Reasoning settings configured in the Console UI for custom providers are stored correctly, but never reach the client, so those models report "No variants available" and /thinking (Ctrl+T) cannot select anything.

The Console export endpoint GET /api/v2/config omits capabilities.reasoning for providers that are not backed by a models.dev catalog entry. The client's Console plugin only derives variants while that field is defined, and that branch has no fallback:

// Console plugin, model transform
if (config.capabilities?.reasoning !== undefined)
  model.variants = deriveVariants(model, reasoningOptions(config.capabilities.reasoning))

Providers declared locally in opencode.json go through a different transform that does have a fallback (when the incoming entry has neither variants nor capabilities.reasoning, the defaults are derived). That is why the same model definition works when it comes from a config document instead of Console.

The setting itself is persisted — the provider detail API returns it in full:

// GET /console/api/providers/<conn_id>
"capabilities": {
  "reasoning": { "supported": true, "toggle": true, "effort": ["low", "high", "max"] },
  "tools": true, "input": ["text", "image"], "output": ["text"]
}

but the v2 config payload contains no reasoning, effort, variants, request or compatibility keys anywhere:

// GET /api/v2/config
"my-provider": {
  "name": "...",
  "package": "aisdk:@ai-sdk/openai-compatible",
  "settings": { "baseURL": "https://opencode.ai/inference/custom/conn_..." },
  "headers": { "x-org-id": "org_..." },
  "models": {
    "my-model": {
      "name": "My Model",
      "capabilities": { "tools": true, "input": ["text", "image"], "output": ["text"] },
      "cost": [ { "input": 0, "output": 0, "cache": { "read": 0, "write": 0 } } ],
      "limit": { "context": 1000000, "output": 393216 }
    }
  }
}

Resulting client state — models coming from a Console provider with a models.dev catalog entry keep their variants (inherited from the catalog), models from custom Console providers always end up empty:

catalog-backed-provider / model-a   variants=[none, low, high, max]
custom-provider-1 / model-a         variants=[]
custom-provider-1 / model-b         variants=[]
custom-provider-2 / model-c         variants=[]
custom-provider-3 / model-d         variants=[]

Verification that the missing field is the cause: taking a provider object exactly as the Console returns it and writing it into a local config file yields variants=[]; adding only capabilities.reasoning to the same object yields ['low', 'high', 'max']. Nothing else about the entry changes.

Expected: the v2 export forwards the stored capabilities.reasoning (the v2 model schema already accepts capabilities.reasoning and variants), so the client expands it the same way it does for local config.

Plugins

opencode-mem@2.32.0

OpenCode version

2.1.1

Steps to reproduce

  1. In Console, create a custom OpenAI-compatible provider that has no models.dev catalog entry (base URL pointing at any compatible endpoint) and add a model.
  2. Open the model's Reasoning panel, enable "Reasoning support" and add effort levels Low, High, Max. Save.
  3. Confirm the setting persisted: GET /console/api/providers/<conn_id> shows capabilities.reasoning.effort = ["low","high","max"].
  4. In the CLI signed in to the same account, select that model and run /thinking, or inspect GET /api/v2/config and GET /api/model.

Screenshot

  • Console Reasoning panel with "Effort levels: Low / High / Max" enabled.
  • CLI toast: "No variants available — The current model does not support any variants."

Operating System

Linux (x64)

Terminal

TERM=xterm-256color, zsh

Activity

  1. opencode-agent commented on Oct 20, 2026

    @opencode-agent
    Contributor

    Thanks for the detailed report and for checking the cause yourself.

    I couldn't reproduce this here. From the client code, the missing field is the issue: the Console provider plugin only builds variants when capabilities.reasoning is in the /api/v2/config payload, and the local config path follows the same rule. That matches your test, where adding only capabilities.reasoning to the Console object gives low/high/max.

    The part that seems to be dropping the field is the Console server's v2 config export. That code isn't in this repository, and checking it needs a real Console account with a custom provider, which this sandbox doesn't have. A maintainer with Console access will need to look at it.

    Related:

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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions