Repository navigation
Description
Description
Summary
capabilities.reasoning declared on a configured model in opencode.jsonc is silently dropped when building the model catalog: GET /api/model returns capabilities without the reasoning member, and the desktop model picker tooltip consequently shows "no reasoning" for a model that is a reasoning model. The config schema (https://opencode.ai/config.json, $defs/Config.Model.Capabilities) defines reasoning (Config.Model.Reasoning: supported, toggle, effort, budget), and $defs.Config.Model.Capabilities sets "additionalProperties": false at the capabilities level, so reasoning is an intended member — but the runtime never honors it.
Environment
- opencode version: 2.1.4 (desktop client 2.1.4, bundled CLI 2.1.4)
- OS: Windows_NT 10.0.19045 (win32 x64)
- Terminal: xterm-256color (desktop app UI; service spawned by Desktop)
- Shell: pwsh (PowerShell 7)
- Install/channel: latest (desktop auto-updater), shared background service (
opencode-cli serve --service) - Active plugins: one local V2 plugin (
file:///%USERPROFILE%/.config/opencode/plugins/searxng) — unrelated to this issue but loaded at the same time; removing it does not change the symptom (reasoning is dropped with plugins unrelated/absent)
Reproduction
-
In the global config
~/.config/opencode/opencode.jsonc, configure an OpenAI-compatible (non-catalog) provider with a model that declares reasoning capabilities:"providers": { "vllm": { "name": "vLLM (example-host)", "package": "aisdk:@ai-sdk/openai-compatible", "settings": { "baseURL": "http://<vllm-host>:18300/v1" }, "models": { "Qwen3.8-Flash-Next": { "name": "Qwen 3.8 FN", "capabilities": { "tools": true, "input": ["text", "image"], "output": ["text"], "reasoning": { "supported": true, "effort": ["low", "medium", "high"] } }, "limit": { "context": 524288, "output": 65536 }, "settings": { "reasoningEffort": "medium" }, "variants": [ { "id": "low", "settings": { "reasoningEffort": "low" } }, { "id": "medium", "settings": { "reasoningEffort": "medium" } }, { "id": "high", "settings": { "reasoningEffort": "high" } } ] } } } }
-
Restart the shared background service (
opencode service restart) so the config is loaded from scratch. -
Query the catalog from the running service:
GET http://127.0.0.1:<port>/api/model(Basic auth,opencode+ service password from~/.local/state/opencode/service.json). -
Inspect
data[].capabilitiesfor the configured model.
Expected Behavior
The catalog entry contains the declared reasoning capabilities (at least supported: true, ideally the effort list), and the model picker / tooltip reflects that the model supports reasoning.
Actual Behavior
The reasoning member is missing from every model's capabilities in the API response, and the desktop model tooltip shows "no reasoning". Observed for three independently configured models. The server logs nothing about reasoning or capabilities at startup — the field is dropped silently.
"capabilities":{"tools":true,"input":["text","image"],"output":["text"]}(All other fields of the same config entry — settings, variants, limit — ARE reflected in the response after restart, so the config file is demonstrably being read fresh.)
Additional Context
-
Config schema reference (
https://opencode.ai/config.json):"Config.Model.Capabilities": { "type": "object", "properties": { "tools": { "type": "boolean" }, "input": { "type": "array", "items": { "type": "string" } }, "output": { "type": "array", "items": { "type": "string" } }, "temperature": { "type": "boolean" }, "reasoning": { "$ref": "#/$defs/Config.Model.Reasoning" } }, "additionalProperties": false }
-
Per the V2 migration guide, V1's boolean
reasoningmodel field is intentionally ignored — but that is the V1 shape; this report is about the native V2capabilities.reasoningobject defined in the current schema. -
Practical impact: declared reasoning support is invisible to the UI (misleading "no reasoning" badge). Functionally, effort variants still work because they are driven by
settings.reasoningEffort— so this is a display/catalog-fidelity bug, not a total loss of reasoning. -
Reproduced consistently on 2.1.4 (Windows desktop client), across full service restarts, for 3/3 configured models with identical structure.
-
Model is not in the models.dev catalog (self-hosted vLLM); suspected the catalog-merge path drops
reasoningfor config-only models, but the same shape is also absent for the provider that overrides the built-invllmID. -
Workaround status: none for the UI badge; variants remain usable.
Plugins
No response
OpenCode version
No response
Steps to reproduce
No response
Screenshot
No response
Operating System
No response
Terminal
No response
Activity
opencode-agent commentedon Oct 25, 2026
Thanks for the detailed report! I think this is a duplicate of #50257.
Your config's
capabilities.reasoningisn't actually being ignored. In v2 it is used to build the model's reasoning variants, which is why your effort variants work. The v2 model catalog has noreasoningfield incapabilities, though, and the desktop/web app hard-codesreasoning: falsewhen it maps v2 models. So the tooltip shows "No reasoning" for every v2 model, built-in catalog models included, not only ones defined in config.Possible duplicates and related issues, most likely first:
capabilities.reasoningis never set. It includes reports from custom openai-compatible providers.reasoningto the model capabilities and passes it through to the app. It is the proposed fix for desktop: model picker shows "No reasoning" for all V2 models — capabilities.reasoning is never set #50257.capabilities.reasoningfrom config to build variants.If your config-only case needs anything beyond #50257, a comment there noting that the config's
capabilities.reasoningshould also feed the catalog would help. The bot will close this issue as a duplicate in 1 day unless you reply explaining how your problem is different.opencode-agent commentedon Oct 26, 2026
We haven't heard back, so I'm closing this as a duplicate of #50257. That issue tracks the "No reasoning" tooltip for v2 models, including custom openai-compatible providers. The desktop/web app hard-codes
reasoning: false, and the v2 catalog doesn't exposecapabilities.reasoning. Your configured reasoning still drives the effort variants, so only the tooltip is wrong.Please follow #50257 and the proposed fix in #55100 for updates. If your config-only case needs more than that, for example the config's
capabilities.reasoningfeeding the catalog, a comment on #50257 would help. If your problem turns out to be different, reply here and we can reopen.