Files
biblioteca_conocimiento_lab…/documentacion/omniroute-guia-autorouting-combos.md

8.1 KiB
Raw Permalink Blame History

OmniRoute — Guía autorouting y combos auto/*

Fecha: 13-sep-2026 · Estado: documentación estable para replicar en cualquier equipo (sobremesa / portátil / VPS)


1. Qué es OmniRoute en este setup

OmniRoute es un proxy/router de modelos self-hosted que corre en local. Hace routing entre tus proveedores conectados con fallback automático, circuit breakers, y combos virtuales.

  • Servidor: paquete npm global omniroute
    • Comando: omniroute serve → lanza node .../omniroute/dist/server-ws.mjs
    • Escucha en: http://localhost:20128 (OpenAI-compatible /v1)
  • Datos: C:\Users\juanm\.omniroute\
    • storage.sqlite (estado, streaks, kv de combos)
    • call_logs\AAAA-MM-DD\*.json (cada request ruteado: modelo real elegido, tokens, fallbacks)
    • logs\application\app.log (routing trace: decisiones, fallbacks, límites)
    • .env (config servidor, secretos — nunca exponer)
    • server\.pid / supervisor\.pid
  • Supervisor: omniroute.mjs serve es el padre; el worker real es server-ws.mjs
  • Sin autostart por tarea programada en sobremesa (se lanza manualmente). Replicar igual en portátil.

2. Estado actual: bug de opencode y los 38 modelos manuales

Problema raíz: el plugin @omniroute/opencode-plugin no puede registrar providers fuera del catálogo models.dev de opencode → los auto/* NO aparecen en el picker por defecto.

  • Issues: anomalyco/opencode #38839 (provider hook skipped for non-catalog providers) y #25630 (Regression: plugin provider.models() hook no longer populates custom providers, post #25167).

Workaround aplicado (decisión: mantener hasta que se arregle el bug):

  • Los 38 modelos auto/* están declarados a mano en ~/.config/opencode/opencode.jsonc → sección provider.omniroute, con label amigable (Auto ♟ Best Coding, etc.) y baseURL: http://localhost:20128/v1, npm: @ai-sdk/openai-compatible.
  • El plugin se carga con: providerId: omniroute, baseURL: http://localhost:20128.
  • El enrutado y el failover funcionan igual aunque los modelos estén a mano: la lógica de routing vive 100% en el servidor OmniRoute, opencode solo manda el nombre auto/... a localhost:20128. El picker manual solo afecta al catálogo visible, NO al comport­amiento de routing.

Check automático del fix:

  • scripts/check_omniroute_fix.ps1 (tarea programada OmnirouteFixCheck, diaria 09:00) consulta los issues #38839/#25630.
  • Si alguno está cerrado → crea documentacion/omniroute_fix_fixed.flag y actualiza documentacion/omniroute_fix_status.txt.
  • Cuando exista ese flag: avisar al usuario → reactivar catálogo dinámico del plugin y quitar los 38 modelos manuales de opencode.jsonc.

3. Cómo funciona el routing auto/* (mecánica por detrás)

Los auto/* no son modelos reales: son alias virtuales de ruta. OmniRoute los materializa al vuelo en cada request sin guardarlos en la BD (tabla combos vacía).

Flujo real (trace de app.log):

POST /v1/chat/completions | auto/best-coding | 28 msgs | 71 tools
Virtual auto-combo created: auto/best-coding (2 candidates)          ← shortlist puntuada
Combo "auto/best-coding" [auto] with 13 models                       ← pool total (nested "auto")
auto with nested resolution: 13 total targets
Auto selection: oc/big-pickle | intent=medium task=default | strategy=lkgp | LKGP
Trying model 1/8: oc/big-pickle
ROUTING oc/big-pickle ⇒ opencode/big-pickle                          ← modelo REAL elegido
Model oc/big-pickle succeeded (880ms, 0 fallbacks)
  • En cada request el Auto-Combo Engine puntúa a los candidatos con 15 factores: salud del provider, cuota restante, coste, latencia, task fit, calidad, disponibilidad de sesión, etc.
  • lkgp = Last-Known-Good: sticky al último target que funcionó mientras siga OK (no cambia por aburrimiento).
  • Fallback automático: si el elegido falla (429/5xx/timeout), re-engancha al siguiente candidato dentro del mismo request (sin que opencode se entere).
  • Recuperación: circuit breakers/cooldowns auto-reset; el primer éxito limpia el estado de error. Un candidato agotado deja de ganar el scoring y vuelve cuando recupera cuota.

Mapa de variantes (catalog real, open-sse/services/autoCombo/builtinCatalog.ts)

Modelo Variante Optimiza
auto default Balanceado (LKGP)
auto/best-coding coding Quality-first para código
auto/best-reasoning smart Calidad + 10% exploración
auto/best-fast fast Menor latencia
auto/best-vision smart (+filtro visión) Calidad en inputs visuales
auto/best-chat default Chat general
auto/best-coding-fast fast Velocidad en código
auto/best-free cheap Solo tier free
auto/best-chaos chaos Despacho paralelo top-N
auto/pro-* idem Tier de pago forzado
auto/coding, auto/fast, auto/cheap, auto/offline, auto/smart, auto/chat idem Variantes básicas
auto/coding:fast, auto/coding:pro, auto/vision, auto/multimodal, auto/reasoning sufijo Categoría[:tier]
auto/gemini, auto/llama, auto/glm, auto/claude-sonnet, auto/claude-opus... familia Solo esa familia como candidatos

Los 38 declarados a mano en opencode.jsonc son este catálogo auto/*.

4. Límites y quotas

  • Límite de contexto del combo auto/*: 200.000 tokens (source=target) — confirmado en logs: Combo context limit: 200000 (source=target).
    • source = lo que opencode envía (conversación + tools)
    • target = lo que el modelo de destino admite
  • Salida (out): sin tope fijo en el combo; depende del modelo real que rute en ese momento.
  • "¿Me bloquean por usarlo varios días?": NO. Los bloqueos (circuit breaker / model lockout) solo saltan ante fallos reales repetidos (429/5xx/timeout) y se auto-recuperan. El único bloqueo real sería agotar la cuota de TODOS los candidatos a la vez (cuenta opencode = big-pickle + reserva del pool).

5. Candidatos actuales para auto/best-coding (13-sep-2026)

  • Shortlist directa: 2 candidatos (log: 2 candidates). Ganador actual estable: oc/big-pickle → provider opencode (cuenta opencode, API key OMNI-1).
  • Pool anidado: 13 targets (combo base auto con "nested resolution").
  • Intentos de fallback por request: hasta 8 (Trying model 1/8); si todos fallan → error al usuario.
  • La identidad exacta del 2º candidato no está persistida en la BD: la construye el engine en runtime puntuando tus conexiones. Para verla en vivo: call_logs o logs/application/app.log (líneas con Auto selection:/VRouting).

6. Replicación en el portátil

Para que el asistente del portátil deje todo igual:

  1. Instalar servidor: npm i -g omniroute (mismo paquete que en sobremesa).
  2. Config .omniroute: copiar C:\Users\juanm\.omniroute\.env (secretos) y, si se quiere historial, storage.sqlite + call_logs.
  3. Lanzar: omniroute serve (debe quedar escuchando en http://localhost:20128).
  4. Config opencode (~/.config/opencode/opencode.jsonc):
    • Plugin: file:///C:/Users/juanm/AppData/Roaming/opencode/plugins/omniroute/dist/index.js con { "providerId": "omniroute", "baseURL": "http://localhost:20128" }
    • Provider omniroute: npm @ai-sdk/openai-compatible, baseURL http://localhost:20128/v1, los 38 modelos auto/* (ver sección 3 para el catálogo; el JSON exacto está en el opencode.jsonc de la sobremesa).
  5. Fix checker: copiar scripts/check_omniroute_fix.ps1 + tarea OmnirouteFixCheck (diaria 09:00).
  6. Comprobar en logs/application/app.log que aparece Combo context limit: 200000 (source=target).

7. Origen de esta guía

Recopilado 13-sep-2026 en sesión RE (sobremesa): logs reales del servidor, builtinCatalog.ts del paquete npm, y verificación en vivo con requests de opencode bajo omniroute/auto/best-coding. Memoria Engram asociada (project biblioteca_conocimiento_laboratorio): "Cómo funcionan los modelos auto/* de OmniRoute (alias virtuales + routing)". Esta guía se sincroniza a todos los equipos vía git + Engram Cloud para que el asistente pueda aplicarla en el portátil.