Guía de diagnóstico y reparación cuando OpenCode no funciona con una suscripción
OpenCode Go: prompts que no responden, Insufficient balance, Rate limit exceeded
o Authentication Fails.
Probado en: OpenCode CLI 1.18.11 (npm) sobre WSL/Ubuntu, agosto 2026.
- Síntomas
- Causas raíz (4)
- Explicación detallada
- Diagnóstico reproducible
- Verificación final
- Archivos tocados
- Lecciones
- El prompt se escribe y "no pasa nada" (o error silencioso).
opencode run "..."termina sin respuesta del modelo.- Errores en consola:
Insufficient balance. Manage your billing here: https://opencode.ai/workspace/<WS_ID>/billingRate limit exceeded. Please try again later.Unauthorized: Authentication Fails (governor)(solo providers custom)
| # | Causa | Efecto |
|---|---|---|
| 1 | Base de datos SQLite de sesiones corrupta | TODO mensaje falla al insertarse: opencode parece muerto |
| 2 | Modelo con prefijo opencode/* (Zen prepago) en vez de opencode-go/* |
"Insufficient balance" aunque la suscripción Go esté activa |
| 3 | Paquete npm @ai-sdk/openai-compatible no instalado (auto-install falló) |
Providers custom (DeepSeek/Groq directos) fallan |
| 4 | {env:VAR} en config solo resuelve si la variable está exportada en el shell |
Peticiones SIN header Authorization → "Authentication Fails" |
OpenCode guarda sesiones y mensajes en SQLite:
~/.local/share/opencode/opencode.db (junto a -wal y -shm)
Firma en el log (~/.local/share/opencode/log/opencode.log):
level=ERROR ... SQLiteError: database disk image is malformed
... Failed query: insert into "message" ...
Cada prompt dispara un INSERT; si la DB está corrupta, la conversación no arranca —
aparenta un problema de proveedor/key cuando en realidad el CLI no puede persistir nada.
Causas típicas: WSL shutdown con opencode abierto, crashes, WAL dañado.
El sqlite3 del sistema puede dar "header and source version mismatch" (versión vieja):
el error real está en el log de opencode.
Reparación: respaldar y recrear:
mkdir -p ~/opencode-db-backup
cd ~/.local/share/opencode
cp opencode.db opencode.db-wal opencode.db-shm ~/opencode-db-backup/ 2>/dev/null
rm opencode.db opencode.db-wal opencode.db-shm
# opencode recrea la DB limpia en el próximo arranqueSe pierde el historial de sesiones (el respaldo queda para recuperación).
El catálogo models.dev define DOS providers para el mismo servicio:
| Provider | Endpoint | Modelos | Facturación |
|---|---|---|---|
opencode |
https://opencode.ai/zen/v1 |
85 | Saldo prepago (balance USD > 0) |
opencode-go |
https://opencode.ai/zen/go/v1 |
23 | Suscripción Go ($5 1er mes, $10/mes, límites de uso) |
Lógica del gateway (packages/console/app/src/routes/zen/util/handler.ts):
- modelo "lite" (Go) → requiere billing.lite (suscripción activa) → funciona
- modelo "full" (Zen) → si billing.balance <= 0 → "Insufficient balance"
Con suscripción Go activa, los modelos opencode/* SIEMPRE dan
"Insufficient balance" porque /zen/v1 chequea el saldo prepago, no la suscripción.
Verificación con la misma API key:
# Endpoint Zen (full) — falla con balance 0:
curl -X POST https://opencode.ai/zen/v1/chat/completions \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"model":"deepseek-v4-flash","messages":[{"role":"user","content":"hi"}],"max_tokens":1}'
# → CreditsError "Insufficient balance" (HTTP 401)
# Endpoint Go (lite) — funciona con suscripción activa:
curl -X POST https://opencode.ai/zen/go/v1/chat/completions \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"model":"deepseek-v4-flash","messages":[{"role":"user","content":"hi"}],"max_tokens":1}'
# → chat.completion normal, "cost":"0" (HTTP 200)Fix:
Modelos Go (17): deepseek-v4-flash, deepseek-v4-pro, grok-4.5, kimi-k3,
kimi-k2.7-code, glm-5.2, glm-5.1, gpt-5.6-luna, qwen3.7-max, qwen3.7-plus,
qwen3.6-plus, minimax-m3, minimax-m2.7, mimo-v2.5, mimo-v2.5-pro, hy3.
Notas de facturación Go:
- Límites: $12 de uso por 5h, $30/semana, $60/mes (en USD de uso, no requests).
- Modelos free (
opencode/*-free) como fallback, con rate-limit agresivo. - El cargo Stripe puede tardar ~1h en propagar.
- Solo un miembro por workspace puede suscribirse a Go.
"provider": {
"deepseek": {
"npm": "@ai-sdk/openai-compatible",
...
}
}El auto-install puede fallar silenciosamente (log: background dependency install failed).
Fix:
cd ~/.config/opencode && npm install @ai-sdk/openai-compatibleEn opencode ≥1.18, {env:VAR} solo se resuelve si la variable está exportada en el
entorno del proceso — NO lee ~/.config/opencode/.env automáticamente. Resultado:
peticiones sin header Authorization → Authentication Fails (governor).
Fix: exportar en ~/.bashrc:
export api_deepseek="$(grep -oP 'api_deepseek=\K\S+' ~/.config/opencode/.env)"
export api_groq="$(grep -oP 'api_groq=\K\S+' ~/.config/opencode/.env)"# 1. Versión y binario
opencode --version; which -a opencode
# 2. Credenciales registradas
opencode auth list # → ~/.local/share/opencode/auth.json
# 3. Catálogo de modelos (ojo: lista TODO aunque no tengas saldo)
opencode models | grep -E "^(opencode|opencode-go)/"
# 4. Log de errores (BUSCAR: database disk image is malformed)
tail -100 ~/.local/share/opencode/log/opencode.log
# 5. Estado de la DB
ls -la ~/.local/share/opencode/opencode.db*
# 6. Endpoints de los providers (models.dev)
curl -s https://models.dev/api.json | python3 -c "
import sys, json
d = json.load(sys.stdin)
for pid in ['opencode', 'opencode-go']:
print(pid, '->', d[pid]['api'])"
# 7. Prueba directa del gateway Go (key real, max_tokens=1)
KEY=$(python3 -c "import json;print(json.load(open('$HOME/.local/share/opencode/auth.json'))['opencode-go']['key'])")
curl -s -X POST https://opencode.ai/zen/go/v1/chat/completions \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"model":"deepseek-v4-flash","messages":[{"role":"user","content":"hi"}],"max_tokens":1}'
# 8. Captura de petición real (si el problema es de headers):
python3 scripts/dbg_proxy.py &
# config temporal con baseURL http://127.0.0.1:9999/v1 → revisar /tmp/proxy_capture.logcd ~ && opencode run 'Respond with exactly: OK' 2>&1
# Esperado:
# > build · deepseek-v4-flash
# OKCriterios:
- El modelo responde (no un error).
- Sin errores nuevos en
~/.local/share/opencode/log/opencode.log. opencode run --model opencode-go/deepseek-v4-flash 'hi'→ responde.opencode run --model deepseek/deepseek-v4-flash 'hi'→ responde (provider directo).
| Archivo | Cambio |
|---|---|
~/.local/share/opencode/opencode.db |
Corrupta → respaldo + recreada |
~/.config/opencode/opencode.jsonc |
model/small_model → opencode-go/deepseek-v4-flash |
~/.config/opencode/node_modules |
npm install @ai-sdk/openai-compatible |
~/.bashrc |
exports de api_deepseek y api_groq |
- "Insufficient balance" no siempre significa que no pagaste — puede ser el
catálogo equivocado (
opencode/*Zen prepago vsopencode-go/*Go). - Los errores de cuenta del gateway son respuestas de estado, no de auth.
opencode modelsNO valida auth — lista el catálogo completo siempre.- La DB corrupta es el "falso muerto" de opencode: revisa el log antes de tocar proveedores.
- El
.envdel config no se carga solo en opencode ≥1.18: exporta las vars.
Síntoma: en el TUI (con modelo OpenCode Go correcto) aparece de vez en cuando:
Upstream request failed: [invalid_request_error] Insufficient Balance
Diagnóstico: error TRANSITORIO del gateway de OpenCode, NO de tu cuenta.
- Ocurrió UNA sola vez en el log (
grep -c "Insufficient Balance" ~/.local/share/opencode/log/opencode.log→ 2 líneas = mismo evento). - La misma sesión del TUI tuvo 7 requests exitosos antes con el mismo modelo.
- ~13 minutos después, todas las pruebas pasaban (curl gateway,
opencode runnormal, con--variant high, y con contexto de ~24K tokens). - Formato
invalid_request_error+ "Insufficient Balance" capital B = estilo del proveedor upstream del gateway (blip interno), no elCreditsErrorde tu cuenta.
Cómo distinguir los DOS errores "Insufficient":
| Error | Es de tu cuenta | Qué hacer |
|---|---|---|
CreditsError: Insufficient balance. Manage your billing here: <URL> (b minúscula + URL) |
✅ Sí | Verificar saldo Zen / suscripción del workspace |
[invalid_request_error] Insufficient Balance (B mayúscula, sin URL) |
❌ No | Reintentar; es transitorio |
Si se repite con frecuencia:
- Revisa el medidor de uso: consola → pestaña "Uso" (límite $12 por 5h — con DeepSeek V4 Flash estás lejísimos: ~$0.004/request de 24K tokens).
- Activa "Use balance" en la pestaña Go de la consola y carga un saldo Zen pequeño (ej. $5) como red de seguridad: si el gateway falla el chequeo de suscripción, cobra del saldo en vez de bloquear.
- Si persiste: reporta en https://github.com/anomalyco/opencode/issues con el
timestamp del log (
~/.local/share/opencode/log/opencode.log).
Suite de verificación "como humano" (todas deben pasar):
# 1. Gateway directo (cuesta ~0 con max_tokens=1)
curl -s -X POST https://opencode.ai/zen/go/v1/chat/completions \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"model":"deepseek-v4-flash","messages":[{"role":"user","content":"hi"}],"max_tokens":1}'
# 2. Run normal
opencode run 'Respond with exactly: PRUEBA_OK'
# 3. Variant de razonamiento (como el TUI)
opencode run --variant high 'Respond with exactly: VARIANT_HIGH_OK'
# 4. Contexto grande (~24K tokens, como sesión real)
opencode run 'Responde SOLO con: OK. Ignora el archivo.' -f <archivo_grande>Este repo incluye:
README.md— este tutorial.SKILL.md— skill de Hermes Agent reutilizable (mismo contenido operativo).scripts/dbg_proxy.py— proxy de depuración para capturar peticiones HTTP.
Licencia MIT.