ADR — Retirada de OpenRouter: stack IA 100% google-genai (v1.0.72 · s55)
Contexto
Desde la sesión 48 (03-05-2026), CreaRack Pro había migrado progresivamente el stack de IA:
| Sesión | Cambio |
|---|---|
| s48 | Auto-Plan pasa a OpenRouter :free BYOK (Gemma 4 26B-A4B, calidad 100%, coste $0) |
| s49 | AUTOPLAN_PROVIDER y EDGE_AI_PROVIDER cambian el default a google_genai (Google AI Studio Paid Tier). OpenRouter queda como fallback configurable en código pero desactivado en PROD (Dokploy ya usa google_genai). |
| s50 | Investigación Vertex AI región EU postpuesta: Gemma 4 maas solo tiene endpoint global, no cumple GDPR EU estricto. |
| s53 | Server EPYC pve-epyc-02 dado de baja con wipe NIST SP 800-88 y cancelado en Hetzner. |
| s55 | Este ADR: con 8 días de PROD estable en google_genai sin ninguna caída, se retira todo el código OpenRouter del repositorio. Cleanup quirúrgico —no es una migración, el código ya era dead code en runtime. |
Alcance · scope clarificado en s58 d21 (2026-05-12)
Aclaración crítica: cuando se redactó este ADR (s55, 11-05-2026), el scope era únicamente el repo
CreaRack-Pro(los-1285 LOCenumerados abajo son todos de ese repo). El repoCreaRackSL-workspacequedó FUERA de esta limpieza y conservó 2 callers de runtime productivos a OpenRouter para la traducción wiki ES→EN:scripts/translate-wiki.mjs+functions/api/wiki/translate.ts.En s58 d21 (2026-05-12) se cierra ese hueco: ambos archivos del workspace migrados a Google AI Studio Paid Tier directo (REST
fetchagenerativelanguage.googleapis.com, mismo patrón canónico quearchivo-core.ts). El stack queda 100% alineado con Regla 8.Caller legítimo de OpenRouter que SE CONSERVA por diseño:
functions/api/tools/ai-eval/run.ts(herramienta/tools/ai-eval) — su propósito es comparar modelos entre proveedores, así que tener OpenRouter como uno de los providers seleccionables es coherente. La env varOPENROUTER_API_KEYse queda enfunctions/types.tssolo para ese caller.Lección sistémica grabada en s58: cuando se hace una limpieza de stack (retirar dep/proveedor), el ADR debe declarar EXPLÍCITAMENTE el scope de repos cubiertos. Sin ese paso, el ADR sugiere “limpieza total” cuando solo cubrió un repo, y la deuda queda invisible varios días.
Decisión
Eliminar completamente el soporte OpenRouter del codebase. La stack IA queda monoproveedor:
- Proveedor activo:
google-genaiSDK directo a Google AI Studio Paid Tier - Modelo:
gemma-4-26b-a4b-it(Gemma 4 26B-A4B IT) - API key:
GEMINI_API_KEY(la misma key sirve para Gemini y Gemma 4 en AI Studio Paid) - Chain
ai_fallbackencore/services/ai_providers/router.py:google_genai → DeepSeek → Claude
Call sites activos post-s55
| Función | Módulo | Driver |
|---|---|---|
| Auto-Plan visión (análisis de plano) | blueprints/api/autoplan.py → blueprints/services/autoplan.py | blueprints/services/google_genai_driver.py |
| CNS Insight (anomalías/capacidad/resumen) | monitoring/services/ai_providers/google_genai.py | GoogleGenaiProvider |
| IT Tutor CNS | monitoring/services/tutor_service.py | _ask_google_genai |
| MIB Assistant | network/services/mib_assistant.py | call_google_genai sync |
| AIOperations (ops IA genéricas) | core/services/ai_operations.py | ai_fallback chain vía router.py |
| FinOps report | core/management/commands/finops_report.py | línea coste → “Google AI Studio Paid Tier” |
Archivos eliminados (-1285 LOC netas)
Drivers y proveedores (-500 LOC)
blueprints/services/openrouter_driver.py— driver visión Auto-Plan para OpenRouter (pareja degoogle_genai_driver.py)core/services/ai_providers/openrouter.py—call_openrouter,acall_openrouter,OpenRouterErrormonitoring/services/ai_providers/openrouter.py—OpenRouterProvider
Scripts eval offline (-766 LOC)
scripts/eval_ai_models.py— A/B histórico s40-s48, ya cerradoscripts/eval_qwen_vs_gemini.py— A/B histórico s40-s48, ya cerrado
Configuración
OPENROUTER_API_KEYretirado deconfig/settings/base.py- Bloque de 7 env vars
OPENROUTER_*borrado decompose.ymlycompose.prod.yml(web dev + web prod + worker prod)
Archivos modificados (callers limpiados)
core/services/ai_providers/router.py:_try_openrouter→_try_google_genaiinline (SDK directo, sin import cruzadocore←monitoring)blueprints/services/autoplan.py: borrado_analyze_with_openrouter+ defaultprovider="openrouter"→"google_genai"enanalyze_blueprint_imageblueprints/api/autoplan.py: borrado bloqueelse: openroutery dependenciaOPENROUTER_API_KEYmonitoring/services/tutor_service.py: borrado_ask_openrouterasync + entry"openrouter"de whitelist + rama dispatchermonitoring/services/ai_providers/__init__.py: borrado importOpenRouterProvider+ entry factory + fallback default"openrouter"→"google_genai"network/services/mib_assistant.py: simplificado a monoproveedorgoogle_genai(borrada rama OpenRouter)core/services/ai_operations.py: slug modelo"google/gemma-4-26b-a4b-it"(slug OpenRouter) →"gemma-4-26b-a4b-it"(slug google-genai SDK)core/management/commands/finops_report.py: línea coste"OpenRouter API"→"Google AI Studio Paid Tier"
Consecuencias
Positivas
- -1285 LOC netas: codebase más pequeño, sin dead code.
- Sin complejidad de multi-proveedor: no hay bifurcaciones
if provider == "openrouter"desperdigadas. - Sin dependencia a tercero intermediario: llamadas directas a Google AI Studio, sin pasar por OpenRouter como proxy.
- Coste operativo: Google AI Studio Paid Tier para Gemma 4 26B-A4B es prácticamente gratuito (confirmado s50: el coste $0 se debe a que Gemma 4 en AI Studio Paid es casi free, no a free tier).
- Reproducibilidad:
GEMMA4_GENAI_SEEDconfirmado que Google AI Studio respetaseeddisparo a disparo (confirmado s48).
Negativas / Riesgos asumidos
- Sin fallback a OpenRouter: si Google AI Studio falla, la chain
ai_fallbackpasa directamente a DeepSeek → Claude (ambos de pago). No existe la opción:freeque había en OpenRouter. - GDPR EU pendiente: Vertex AI región EU sigue postpuesta (endpoint
globalno cumple GDPR estricto). Reactivar si cliente firma cláusula GDPR estricta o Google promueve Gemma 4 maas a regional EU. Detalle:context/AUTOPLAN_VERTEX_RESEARCH.md. - API key OpenRouter: sigue viva en Dokploy + cuenta openrouter.ai durante 1 semana como red de seguridad. Acción manual pendiente: borrar env vars del panel Dokploy + revocar en openrouter.ai.
Pendiente de validación post-deploy
- Auto-Plan (1 plano test) —
blueprints/services/google_genai_driver.py - IT Tutor CNS (1 pregunta) —
tutor_service._ask_google_genai - CNS Insight (1 anomalía real o forzada) —
GoogleGenaiProvider - MIB Assistant (1 query) —
call_google_genaisync -
manage.py finops_report --ai— chainai_fallback
Relación con ADR anterior
El ADR decision--20260428-gemma-4-via-openrouter-migration (workspace) documenta la decisión original de migrar a OpenRouter :free BYOK en s48. Este ADR lo supersede en lo que respecta al estado activo de la stack IA: ese ADR queda como registro histórico del período s48-s55, pero la arquitectura vigente es la descrita aquí.
Acción pendiente (Edu): marcar
decision--20260428-gemma-4-via-openrouter-migrationcomostatus: superseded+ añadirsuperseded_by: decision--20260511--cleanup-openrouter-monoproveedor-google-genaien el workspace.
Véase también
- [[feature—blueprints—auto-plan-ai]]
- [[entity—blueprints—service—google-genai-driver]]
- [[entity—monitoring—service—ai-providers]]
- [[entity—core—service—ai-router]]
- [[concept—ai—monoproveedor-google-genai]]