Repository navigation
Description
Summary
On 2.2.3 (CLI and background service), the models of a custom openai-compatible provider never appear in the TUI /model picker: the dialog is empty, while chat keeps working with the session's current model. Every endpoint that the picker's catalog loader depends on returns the models correctly for the same directory, so the failure appears to be in the TUI/ACP catalog layer rather than in provider configuration.
Environment
- opencode version: 2.2.3 (both
opencode --versionand the runningopencode serve --service) - OS: Darwin 27.2.0 (arm64, Apple silicon)
- Terminal: TERM_PROGRAM=vscode, TERM=xterm-256color, COLORTERM=truecolor
- Shell: /bin/zsh
- Install/channel: Homebrew stable bottle (2.2.3)
- Active plugins: none found (no
~/.config/opencode/plugin, no.opencode/plugin);GET /api/pluginreturns only builtin plugins (non-empty)
Reproduction
- Configure a custom provider with three chat models in
~/.config/opencode/opencode.json:
{
"providers": {
"WestlakeHPC": {
"name": "Westlake HPC",
"package": "@opencode/ai/providers/openai-compatible",
"settings": { "baseURL": "https://<campus-endpoint>/v1", "apiKey": "{env:WESTLAKE_API_KEY}" },
"models": {
"deepseek-flash": { "name": "DeepSeek-V4.1-Flash" },
"glm-flash": { "name": "GLM-5.3-Flash" },
"Qwen": { "name": "Qwen 3.8" }
}
}
}
}- Start the background service, then start the TUI in a project whose own
opencode.jsononly sets permissions and compaction. - Type
/model(or the bound model-list action).
Expected Behavior
The picker lists the three configured models.
Actual Behavior
The picker is empty. Chat still works because the model id is persisted on the session. The TUI-side error class is ACPCatalogNotReadyError (user-facing text No models are available).
Additional Context
All inputs of the ACP catalog loader return valid data for the same directory (requested with header x-opencode-directory: <project>):
| endpoint | result |
|---|---|
GET /api/model |
3 models, enabled: true, status: active |
GET /api/model with types=chat |
same 3 models |
GET /api/model/default |
resolves the configured model |
GET /api/agent |
returns the primary agents |
GET /api/command |
returns commands |
GET /api/plugin |
returns builtin plugins (non-empty) |
The loader in the 2.2.3 bundle:
catalog.load = plugin.list(… wait until data.length > 0, 25ms, max 5s)
→ model.list + model.default + agent.list + command.listSince the plugin list is non-empty and the other three calls return data, the readiness conditions appear satisfied, yet the picker still reports the catalog as not ready.
Tried without effect:
- restarting the TUI after the service was on 2.2.3 (so it is not a stale-connection issue);
opencode service restart;- upgrading 2.2.1 → 2.2.3;
- clearing/refreshing the
models.devcatalog cache; - giving the service
HTTPS_PROXY/NO_PROXYso the catalog fetch succeeds (cache present; noFailed to fetch models.devsince restart).
The provider is intentionally absent from models.dev (it is a private endpoint), which should be supported.
Activity
opencodejr commentedon Oct 30, 2026
Thanks for the detailed report. I reproduced an empty
/modelpicker with a custom provider like yours, but only with the experimentalnew-designsTUI setting turned on.What I did on 2.2.3:
providers.WestlakeHPCentry (@opencode/ai/providers/openai-compatible) with your three models, and saved no/connectconnection.experimental: { "new-designs": true }in the TUI config,/modelopens "Free models — Connect a provider for access to more models" with "No items available", and searching for "Qwen" finds nothing. The TUI counts only saved integration connections as "connected". A provider declared only in config doesn't count, so the dialog falls back to the free-models list, which leaves out your custom models.It still happens on the latest
dev(95fc3c8). The recording and screenshots below show it, and the script below reproduces it.Two questions to confirm this is your case:
experimental.new-designsturned on in your TUI config?ACPCatalogNotReadyErrorcome from OpenCode's ACP integration (used by editor clients), not from the TUI's/modeldialog. If it came from an editor or ACP client inside VS Code, please say which one.Related: #49309 (configured providers treated as disconnected in the model dialogs).
recording.mp4
Reproduction script (drive-nd.ts)
Run it with opencode-drive:
opencode-drive run ./drive-nd.ts. It drivesopencodefrom yourPATH; setOC_DEVto the path of an OpenCode checkout to run that from source instead.myhsia commentedon Oct 30, 2026
Confirmed, that's exactly it — thanks for the repro.
experimental.new-designs: truewas set in my TUI config. Turning it off restores the normal "Select model" dialog with all three models listed; turning it back on reproduces the empty picker.No models are availablein the TUI. I extracted that string andACPCatalogNotReadyErrorfrom the 2.2.3 bundle while tracing the failure path and wrongly inferred it was the dialog's error. The dialog itself just showed an empty list (your "No items available"). Sorry for the red herring — the ACP path is unrelated to this.Separately, the server side is correct in my setup: for the same directory (
x-opencode-directory: <project>)GET /api/model,/api/model/default,/api/agent,/api/commandand/api/pluginall return valid data, which is consistent with your finding that the new picker treats a config-only provider as "disconnected" and falls back to free models.Treating #49309 as the canonical reference. Happy to test a build when a fix lands.