Repository navigation
Description
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
- 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.
- Open the model's Reasoning panel, enable "Reasoning support" and add effort levels
Low,High,Max. Save. - Confirm the setting persisted:
GET /console/api/providers/<conn_id>showscapabilities.reasoning.effort = ["low","high","max"]. - In the CLI signed in to the same account, select that model and run
/thinking, or inspectGET /api/v2/configandGET /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
opencode-agent commentedon Oct 20, 2026
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.reasoningis in the/api/v2/configpayload, and the local config path follows the same rule. That matches your test, where adding onlycapabilities.reasoningto the Console object giveslow/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: