Volver a la wiki

Migración total IA: Gemini → Gemma 4 vía OpenRouter

⚠️ SUPERSEDED · s55 (11-05-2026) por [[decision—20260511—cleanup-openrouter-monoproveedor-google-genai]].

OpenRouter fue retirado del stack AI tras 8 días de PROD estable con google_genai directo a Google AI Studio Paid Tier (s49 → s55). Los archivos core/services/ai_providers/openrouter.py + monitoring/services/ai_providers/openrouter.py referenciados en sources fueron eliminados en s55 (-1266 LOC). En s58 d21 también se cerró el caller restante del workspace (scripts/translate-wiki.mjs + functions/api/wiki/translate.ts). Solo ai-eval/run.ts mantiene OpenRouter por diseño (tool de comparación multi-proveedor).

ADR conservado como referencia histórica del puente OpenRouter (s44 → s55).


Contexto

El 28 de abril de 2026, durante una sesión sobre el plan registrado en la memoria project_gemma4_openrouter (sesión cierre 28-04 previa), Edu validó subjetivamente en /tools/ai-eval que google/gemma-4-26b-a4b-it:free daba respuestas mejores que gemini-2.5-flash en preguntas largas con prosa libre. Esa observación motivó la propuesta de migrar todos los call sites de IA del proyecto (CreaRack-Pro + workspace) a Gemma 4 vía OpenRouter, hasta entonces no integrado.

La Regla 8 de CLAUDE.md exige que cualquier cambio de modelo requiera un ADR que actualice la tabla canónica. Este es ese ADR.

Decisión

Migrar los 11 call sites de IA del proyecto a google/gemma-4-26b-a4b-it (versión paga vía OpenRouter) a partir del 2026-04-28. La versión :free queda prohibida porque Google AI Studio (provider upstream del free tier) devuelve HTTP 429 sin previo aviso incluso con tráfico bajo.

El cambio unifica todo el stack de IA en un único modelo — anteriormente había 3 modelos Gemini distintos (gemini-3.1-flash-lite-preview para Categoría A, gemini-2.5-flash para Categoría B, y la fallback chain del router). La distinción Categoría A / Categoría B desaparece.

Call sites migrados (11 totales)

CreaRack-Pro (8)

ArchivoServicio / Uso
core/services/ai_providers/openrouter.pyNuevo — provider unificado (texto, JSON, JSON Schema, visión, sync + async)
core/services/ai_providers/router.pyDEFAULT_OPENROUTER_MODEL — fallback chain OpenRouter → DeepSeek → Claude
monitoring/services/ai_providers/openrouter.pyNuevo — OpenRouterProvider para CNS Insight con backoff
blueprints/services/autoplan.pyAuto-Plan AI (visión, JSON object) — nuevo _analyze_with_openrouter
network/services/mib_assistant.pyMIB Assistant (JSON crítico) — _call_gemini → _call_ai
monitoring/services/tutor_service.pyNetwork Tutor (síntesis async con conversation history) — nuevo _ask_openrouter
core/services/ai_operations.pyAIOperations.MODEL = "google/gemma-4-26b-a4b-it"
core/management/commands/finops_report.py + perf_review.pyComandos de gestión — sustituido cliente Gemini directo por ai_fallback

Workspace (3)

ArchivoServicio / Uso
functions/api/mcp/handlers/archivo-core.tsSíntesis del Archivo Maestro / Help Widget (bib_ask)
functions/api/wiki/translate.tsTraducción ES→EN live al editar páginas
scripts/translate-wiki.mjsTraducción ES→EN batch pre-build

Excepción permitida

functions/api/tools/ai-eval/run.ts mantiene la integración Gemini para que la herramienta /tools/ai-eval pueda comparar Gemma vs Gemini en futuras evaluaciones. Esta es la única referencia a Gemini permitida fuera del fallback chain.

Evaluación previa

Subjetiva (Edu en /tools/ai-eval, 27-04-2026)

Probando google/gemma-4-26b-a4b-it:free con preguntas largas y respuestas en prosa: respuestas notablemente más completas y mejor estructuradas que gemini-2.5-flash.

Cuantitativa (scripts/eval_ai_models.py matriz 4×3, 28-04-2026)

Casogemini-3-flashgemini-3.1-flash-litegemma-4-26b A4BObservación
MIB classification (JSON ~1500 chars)15.0s, 6 mon / 5 dd2.3s, 5/422.9s, 4/6Calidad equivalente, latencia 10× peor
Network Tutor (texto ~2-4 KB)6.3s, 2.1 KB3.5s, 2.7 KB8.0s, 3.7 KBGemma +36% chars, todos los keywords
Perf Review (texto largo)8.7s, 15 bullets, 7 kw3.0s, 9 bullets, 8 kw12.2s, 9 bullets, 6 kwFlash-Lite gana en keywords técnicos
Auto-Plan visión (JSON corto)5.0s, 4/4 racks1.5s, 4/42.5s, 4/4Equivalente funcionalmente

Test direcionado de latencia (3 runs por config, prompt MIB largo)

Provider routingminmeanmax
default (Ionstream/Parasail)11.8s22.0s32.5s
sort=latency (Parasail)11.8s22.5s34.1s
only=deepinfra12.5s15.2s17.9s

Test direccionado de latencia (prompt corto, 300 chars output)

Provider routingminmeanmax
sort=latency (Cloudflare)1.1s1.2s1.3s
sort=throughput (Parasail)2.7s3.1s3.8s

Lectura clave

Latencia de Gemma 4 escala lineal con tokens de salida (~60-80 tokens/s en Cloudflare/Parasail/DeepInfra). Para prompts cortos es competitivo con Gemini Flash-Lite. Para JSON largos, Gemma 4 es 10× más lento. La elección de migrar acepta este trade-off porque:

  1. Los sites de output largo son cron / async (no bloquean UI directa).
  2. CreaRack está en modo dev compartido (Edu + Dani), sin clientes que sufran el delay.
  3. Beneficio en stack unificado y coste pesa más que latencia en sites no-UX.

Coste

Métricagemini-3.1-flash-lite-previewgoogle/gemma-4-26b-a4b-itΔ
Input (por M tokens)$0.25$0.06−76%
Output (por M tokens)$1.50$0.33−78%

Implementación

Patrón Python (CreaRack-Pro)

Provider único en core/services/ai_providers/openrouter.py con dos entry points:

from core.services.ai_providers.openrouter import call_openrouter, acall_openrouter

# Texto + JSON
text = call_openrouter(prompt, response_json=True, max_tokens=2048)

# JSON Schema estricto (forza provider con structured_outputs)
text = call_openrouter(prompt, response_schema={...}, provider_prefs={"only": ["deepinfra"]})

# Visión
text = call_openrouter(prompt, images=[img_bytes], image_mime="image/jpeg")

# Async con conversation history (Tutor)
text = await acall_openrouter(messages_list, system_instruction=SYSTEM_PROMPT)

Routing por defecto: provider.sort = "latency". OpenRouter elige Cloudflare/Parasail/DeepInfra/etc. según latencia upstream observada.

Patrón TypeScript (workspace)

Fetch directo a https://openrouter.ai/api/v1/chat/completions con Authorization: Bearer ${env.OPENROUTER_API_KEY} y provider: { sort: "latency" } en el body. Sin SDK.

Configuración

Consecuencias

Positivas

Negativas / Riesgos

Neutrales

Revisión 2026-05-03 (sesión 48): :free desbloqueado vía BYOK para Auto-Plan

La afirmación original “:free queda prohibida” era válida para el pool compartido OpenRouter — efectivamente devuelve 429 sin previo aviso por saturación cross-tenant. Tras pruebas en s48:

Cambio: :free es viable y preferible para Auto-Plan siempre que el OPENROUTER_API_KEY tenga BYOK conectado a una API key personal de Google AI Studio (https://openrouter.ai/settings/integrations). Con BYOK, las requests :free consumen la cuota personal del usuario (no el pool compartido) y no hay 429 mientras la cuota diaria personal alcance.

Por qué :free es preferible para visión:

Estado tras s48:

Doc operativo nuevo: [[crearack-tech—backend—auto-plan-ai-tuning]] cubre el setup actual (Dokploy env vars, prompt, footguns, recetario para iterar prompt con seed fijo).

Riesgo BYOK: la cuota diaria de Google AI Studio personal de Edu (~1500 req/día típico free tier) puede saturar si el uso de Auto-Plan crece mucho. Mitigación: si satura, cambiar OPENROUTER_MODEL=google/gemma-4-26b-a4b-it (paid) — pierde calidad pero recupera funcionalidad. O reactivar self-host EPYC pve-epyc-02 cambiando AUTOPLAN_PROVIDER=ollama.


Reversión

Para revertir a Gemini Flash-Lite:

  1. CreaRack-Pro: en .env de PROD cambiar AUTOPLAN_PROVIDER=gemini y EDGE_AI_PROVIDER=gemini. Los call sites mantienen su path Gemini intacto. Para ai_fallback revertir un commit.
  2. Workspace: revertir el commit (los CF Workers vuelven a usar GOOGLE_AI_API_KEY directo).

Supersedes

Supersedes: [[decision—20260427—gemini-3-1-flash-lite-migration]]

La Regla 8 de CLAUDE.md ha sido actualizada para reflejar esta decisión como la tabla canónica vigente. Las menciones a Categoría A / Categoría B quedan obsoletas.

Véase también

Subir