#4788·openwork

[Bug]: Model list and capabilities are hardcoded/stale - new models require manual opencode.jsonc edits; add a 'Refresh models' action

Author: krixx646Created Sep 10, 2026Updated Sep 17, 2026

Summary

OpenWork's model list and per-model capabilities are effectively hardcoded / cached as a snapshot. When a provider releases a new model — or changes an existing model's capabilities (e.g. adds vision/multimodal input) — the app does not pick it up automatically. Even when the user supplies their own API key via a custom provider, the new model does not become usable (or usable with its real capabilities) until the user manually edits opencode.jsonc. There is no "refresh / fetch latest models" action.

Environment

  • OpenWork Desktop: 0.18.42
  • opencode sidecar: 1.18.18
  • OS: Windows 11 Pro (10.0.26200)
  • Provider: custom DeepSeek (user-supplied API key)
  • Example model: deepseek/deepseek-v4-flash

Steps to reproduce

  1. Configure a provider using your own API key (e.g. DeepSeek).
  2. A new model is released upstream. Concrete example: DeepSeek V4.1-Flash (released 2026-09-10), a natively multimodal model. Per DeepSeek's own docs, deepseek-v4-flash is now a legacy alias whose requests are served by V4.1-Flash.
  3. Open the model picker / provider model list.
  4. The new model is missing, and/or its changed capabilities (image input) are not reflected.

Expected

  • The app fetches the live model list and capabilities for each configured provider (models.dev and/or the provider's /models endpoint) and the picker reflects new models and capability changes without editing config files.
  • There is a visible "Refresh models" action, plus automatic refresh on provider connect and app start.

Actual

  • The model list / capability map is effectively static. To use a newly released model, or to correct its capabilities, the user must hand-write provider.<id>.models.<model> overrides in opencode.jsonc.

Evidence

  • ~/.config/opencode/opencode.jsonc contains hand-written overrides added solely to work around this, including the comment:
    jsonc
    // Models-only override (no npm/baseURL) so Disconnect stays auth-based.
    // OpenCode's models.dev cache still marks Flash as text-only; V4.1 Flash is multimodal.
    "deepseek": {
      "models": {
        "deepseek-flash": { "name": "DeepSeek V4.1 Flash", "attachment": true, "modalities": { "input": ["text", "image"], "output": ["text"] } },
        "deepseek-v4-flash": { "attachment": true, "modalities": { "input": ["text", "image"], "output": ["text"] } }
      }
    }
  • The catalog is stored as a cached snapshot with a fixed name (~/.cache/opencode/models-<hash>.json), refreshed on an unclear trigger rather than on demand.

Impact

  • Users cannot use a newly released model through their own API key without manual config surgery.
  • Every upstream release creates manual integration work; non-technical users are stuck until the app is updated.
  • Capability changes (e.g. a model gaining vision) are not surfaced, so functionality silently appears unavailable.

Proposed fix

  • Fetch model lists and capabilities dynamically per provider (models.dev + provider /models endpoints), with a "Refresh models" button and automatic refresh on connect/startup.
  • Do not hardcode model IDs or capability flags in the backend; treat cached data as a fallback only.
  • Keep user overrides available but make them optional, never required.

Related issues

  • #4035 [Bug]: Opencode go models are outdated (do not update automatically)
  • #3553 [Bug]: Provider Cortecs.ai does not update the table of available models
  • #4166 [Bug]: Vision model not available in model picker even when provider exposes one
  • #2346 Cloud provider re-import doesn't update model list (closed)
  • #2345 Add manual 'Reload OpenCode config' action to command palette (closed)