Skip to content

bug(core): OpenCode Free pinned model list has rotted — 3 of 4 pinned models fail (429/400) and new free models never appear #3409

Description

@me2seeks

What happened

OpenCode Free (the zero-credential default) is largely broken because its free-model set is a hardcoded pin that has rotted, and new free models never reach users.

The pin lives in packages/core/src/provider-registry.ts:604-609 (opencodeFreeModelIds) and the default enabled set at packages/core/src/provider-registry.ts:8-13:

  • pinned: nemotron-3-ultra-free, mimo-v2.5-free, big-pickle, deepseek-v4-flash-free
  • default enabled: nemotron-3-ultra-free, mimo-v2.5-free, deepseek-v4-flash-free

Live probes against https://opencode.ai/zen/v1/chat/completions (anonymous, 2026-08-21):

model result
nemotron-3-ultra-free 200 OK
mimo-v2.5-free 429 FreeUsageLimitError — "Rate limit exceeded. Please try again later."
big-pickle 429 FreeUsageLimitError — same
deepseek-v4-flash-free 400 server_error — "Upstream request failed: Model is unavailable."

So 3 of the 4 pinned models are dead: users get stuck in Error: Rate limit exceeded loops, and the TUI even logs confusing notices like Model changed: mimo-v2.5-free → mimo-v2.5-free when re-electing within the stale set.

At the same time, the free catalog upstream has moved on. models.dev currently lists ~29 free opencode models; several work anonymously today but are absent from the pin, e.g.:

  • x-preview-f-free — displayed as "Ox Alpha Free (Unlimited)", tool-capable, answers 200 anonymously
  • laguna-s-2.1-free — 200
  • nemotron-3.5-lightning-free — 200

Because the pin is as const, none of these ever appear in the model picker until someone edits the list by hand. The repo's own generated snapshot lags too: as of today's refresh (#3324) model-metadata.generated.ts still has no x-preview-f-free.

One more wrinkle for whoever fixes this: the anonymous-served set is strictly smaller than the models.dev free set. Many snapshot-listed free ids (glm-5-free, kimi-k2.5-free, grok-code, minimax-m3-free, …) answer 401 ModelError: Model … is not supported anonymously, so deriving the free list from cost.input === 0 alone would over-offer. Validation needs to hit the live endpoint (or at least treat 401 ModelError as "not anonymously served").

Suggested directions (maintainer's call):

  • stop hardcoding the free set; derive candidates from the models.dev snapshot and health-check them (the testConnection fallback-probe machinery already does most of this)
  • or keep a pin but add a scheduled check that fails CI/lint when a pinned id stops answering 200 anonymously
  • treat 429 FreeUsageLimitError / 400 "Model is unavailable" as rotation signals so a dead enabled model doesn't trap the session

How to reproduce

  1. Start Maka fresh with no credentials — the bootstrap seeds the opencode-free connection with enabled models [nemotron-3-ultra-free, mimo-v2.5-free, deepseek-v4-flash-free] (packages/runtime-host/src/server/bootstrap-runtime-policy.ts:76-83).
  2. Switch the model to mimo-v2.5-free (or exhaust the per-IP quota on the default), then send any message.
  3. Turn fails with Error: Rate limit exceeded; picking deepseek-v4-flash-free fails because the model is unavailable upstream; big-pickle is likewise 429.
  4. Open the model picker on the OpenCode Free connection — only the stale four are offered; none of the newly added free models (e.g. Ox Alpha Free) exist.

Direct curl equivalent:

curl -s https://opencode.ai/zen/v1/chat/completions \
  -H 'content-type: application/json' \
  -d '{"model":"mimo-v2.5-free","messages":[{"role":"user","content":"hi"}],"max_tokens":1}'
# {"type":"error","error":{"type":"FreeUsageLimitError","message":"… Rate limit exceeded …"}}

Environment

  • Maka version or commit: 57e08d834 (main, 2026-08-21)
  • OS and version: Linux
  • Surface: all surfaces that use the opencode-free connection (Desktop / TUI / CLI)
  • Node.js version, if running from source: 22.x

Logs, screenshots, or additional context

Diagnosis and endpoint probes above were prepared with assistance from an AI coding agent (opencode); the reporter verified the results.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workinghelp wantedExtra attention is needed

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions