CreaRack-SL

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ónCambio
s48Auto-Plan pasa a OpenRouter :free BYOK (Gemma 4 26B-A4B, calidad 100%, coste $0)
s49AUTOPLAN_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).
s50Investigación Vertex AI región EU postpuesta: Gemma 4 maas solo tiene endpoint global, no cumple GDPR EU estricto.
s53Server EPYC pve-epyc-02 dado de baja con wipe NIST SP 800-88 y cancelado en Hetzner.
s55Este 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 LOC enumerados abajo son todos de ese repo). El repo CreaRackSL-workspace quedó 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 fetch a generativelanguage.googleapis.com, mismo patrón canónico que archivo-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 var OPENROUTER_API_KEY se queda en functions/types.ts solo 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-genai SDK 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_fallback en core/services/ai_providers/router.py: google_genai → DeepSeek → Claude

Call sites activos post-s55

FunciónMóduloDriver
Auto-Plan visión (análisis de plano)blueprints/api/autoplan.py → blueprints/services/autoplan.pyblueprints/services/google_genai_driver.py
CNS Insight (anomalías/capacidad/resumen)monitoring/services/ai_providers/google_genai.pyGoogleGenaiProvider
IT Tutor CNSmonitoring/services/tutor_service.py_ask_google_genai
MIB Assistantnetwork/services/mib_assistant.pycall_google_genai sync
AIOperations (ops IA genéricas)core/services/ai_operations.pyai_fallback chain vía router.py
FinOps reportcore/management/commands/finops_report.pylí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 de google_genai_driver.py)
  • core/services/ai_providers/openrouter.py — call_openrouter, acall_openrouter, OpenRouterError
  • monitoring/services/ai_providers/openrouter.py — OpenRouterProvider

Scripts eval offline (-766 LOC)

  • scripts/eval_ai_models.py — A/B histórico s40-s48, ya cerrado
  • scripts/eval_qwen_vs_gemini.py — A/B histórico s40-s48, ya cerrado

Configuración

  • OPENROUTER_API_KEY retirado de config/settings/base.py
  • Bloque de 7 env vars OPENROUTER_* borrado de compose.yml y compose.prod.yml (web dev + web prod + worker prod)

Archivos modificados (callers limpiados)

  • core/services/ai_providers/router.py: _try_openrouter → _try_google_genai inline (SDK directo, sin import cruzado core←monitoring)
  • blueprints/services/autoplan.py: borrado _analyze_with_openrouter + default provider="openrouter" → "google_genai" en analyze_blueprint_image
  • blueprints/api/autoplan.py: borrado bloque else: openrouter y dependencia OPENROUTER_API_KEY
  • monitoring/services/tutor_service.py: borrado _ask_openrouter async + entry "openrouter" de whitelist + rama dispatcher
  • monitoring/services/ai_providers/__init__.py: borrado import OpenRouterProvider + entry factory + fallback default "openrouter" → "google_genai"
  • network/services/mib_assistant.py: simplificado a monoproveedor google_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_SEED confirmado que Google AI Studio respeta seed disparo a disparo (confirmado s48).

Negativas / Riesgos asumidos

  • Sin fallback a OpenRouter: si Google AI Studio falla, la chain ai_fallback pasa directamente a DeepSeek → Claude (ambos de pago). No existe la opción :free que había en OpenRouter.
  • GDPR EU pendiente: Vertex AI región EU sigue postpuesta (endpoint global no 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_genai sync
  • manage.py finops_report --ai — chain ai_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-migration como status: superseded + añadir superseded_by: decision--20260511--cleanup-openrouter-monoproveedor-google-genai en 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]]