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
- 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).
- Switch the model to
mimo-v2.5-free (or exhaust the per-IP quota on the default), then send any message.
- Turn fails with
Error: Rate limit exceeded; picking deepseek-v4-flash-free fails because the model is unavailable upstream; big-pickle is likewise 429.
- 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.
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 atpackages/core/src/provider-registry.ts:8-13:nemotron-3-ultra-free,mimo-v2.5-free,big-pickle,deepseek-v4-flash-freenemotron-3-ultra-free,mimo-v2.5-free,deepseek-v4-flash-freeLive probes against
https://opencode.ai/zen/v1/chat/completions(anonymous, 2026-08-21):nemotron-3-ultra-freemimo-v2.5-freeFreeUsageLimitError— "Rate limit exceeded. Please try again later."big-pickleFreeUsageLimitError— samedeepseek-v4-flash-freeserver_error— "Upstream request failed: Model is unavailable."So 3 of the 4 pinned models are dead: users get stuck in
Error: Rate limit exceededloops, and the TUI even logs confusing notices likeModel changed: mimo-v2.5-free → mimo-v2.5-freewhen re-electing within the stale set.At the same time, the free catalog upstream has moved on. models.dev currently lists ~29 free
opencodemodels; 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 anonymouslylaguna-s-2.1-free— 200nemotron-3.5-lightning-free— 200Because 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.tsstill has nox-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, …) answer401 ModelError: Model … is not supportedanonymously, so deriving the free list fromcost.input === 0alone 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):
testConnectionfallback-probe machinery already does most of this)FreeUsageLimitError/ 400 "Model is unavailable" as rotation signals so a dead enabled model doesn't trap the sessionHow to reproduce
opencode-freeconnection 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).mimo-v2.5-free(or exhaust the per-IP quota on the default), then send any message.Error: Rate limit exceeded; pickingdeepseek-v4-flash-freefails because the model is unavailable upstream;big-pickleis likewise 429.Direct curl equivalent:
Environment
57e08d834(main, 2026-08-21)opencode-freeconnection (Desktop / TUI / CLI)Logs, screenshots, or additional context
big-pickle) for another; the pin has rotted again since. A one-off swap will keep recurring.nemotron-3-ultra-free,x-preview-f-free,laguna-s-2.1-free,nemotron-3.5-lightning-free; rate-limited —mimo-v2.5-free,big-pickle; unavailable —deepseek-v4-flash-free; not anonymously served (401 ModelError) — most other-freeids in the snapshot.Diagnosis and endpoint probes above were prepared with assistance from an AI coding agent (opencode); the reporter verified the results.