Skip to content

model: capabilities.reasoning from config is dropped from the catalog (tooltip shows "no reasoning") #58901

Closed as duplicate

Description

@eugenevt

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

  1. 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" } }
            ]
          }
        }
      }
    }
  2. Restart the shared background service (opencode service restart) so the config is loaded from scratch.

  3. 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).

  4. Inspect data[].capabilities for 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 reasoning model field is intentionally ignored — but that is the V1 shape; this report is about the native V2 capabilities.reasoning object 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 reasoning for config-only models, but the same shape is also absent for the provider that overrides the built-in vllm ID.

  • 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

  1. opencode-agent commented on Oct 25, 2026

    @opencode-agent
    Contributor

    Thanks for the detailed report! I think this is a duplicate of #50257.

    Your config's capabilities.reasoning isn'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 no reasoning field in capabilities, though, and the desktop/web app hard-codes reasoning: false when 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:

    If your config-only case needs anything beyond #50257, a comment there noting that the config's capabilities.reasoning should 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.

  2. opencode-agent commented on Oct 26, 2026

    @opencode-agent
    Contributor

    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 expose capabilities.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.reasoning feeding the catalog, a comment on #50257 would help. If your problem turns out to be different, reply here and we can reopen.

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions