Edge AI: propagación de google-genai SDK a CNS, Network Tutor y MIB Assistant
Resumen
PR #21 replica el «patrón ganador Auto-Plan s49» — conexión directa a Google AI Studio Paid Tier vía SDK oficial google-genai sin intermediario OpenRouter — en las 3 funciones de IA restantes del producto:
| Función | Archivo afectado | Integración |
|---|---|---|
| CNS Edge Intelligence | monitoring/services/ai_providers/google_genai.py | GoogleGenaiProvider.analyze_incident |
| Network Tutor | monitoring/services/tutor_service.py | _ask_google_genai → acall_google_genai |
| MIB Assistant | network/services/mib_assistant.py | _call_ai → call_google_genai |
El modelo elegido es Gemma 4 26B A4B (gemma-4-26b-a4b-it) — coherencia arquitectónica con Auto-Plan + constraint SaaS comercial cumplido (billing real va a cuenta Google AI Studio Paid Tier de Edu).
Motivación
- Auto-Plan s49 probó que el SDK
google-genaidirecto supera a OpenRouter como intermediario en calidad, latencia y coste (billing directo a cuenta Edu sin markup OR). - Las 3 funciones restantes (CNS, Tutor, MIB) seguían usando OpenRouter o
gemini.pycon modelo Flash-Lite. - Esta PR unifica la capa de IA de Edge bajo un mismo stack, reduciendo deuda técnica y simplificando el troubleshooting en producción.
Archivos cambiados
| Archivo | Tipo | Descripción |
|---|---|---|
monitoring/services/ai_providers/google_genai.py | NUEVO (~259 LOC) | GoogleGenaiProvider + helpers async/sync |
monitoring/services/ai_providers/__init__.py | modificado | Registra google_genai en factory |
monitoring/services/tutor_service.py | modificado | Añade rama google_genai en ask_tutor |
network/services/mib_assistant.py | modificado | _call_ai lee EDGE_AI_PROVIDER y despacha |
config/settings/base.py | modificado | Nueva setting EDGE_AI_GOOGLE_GENAI_MODEL |
compose.yml | modificado | Expone EDGE_AI_GOOGLE_GENAI_MODEL en web |
compose.prod.yml | modificado | Expone EDGE_AI_GOOGLE_GENAI_MODEL en web + worker |
Configuración en producción
Variables de entorno
| Variable | Descripción | Valor recomendado |
|---|---|---|
EDGE_AI_PROVIDER | Selector de provider activo | google_genai |
EDGE_AI_GOOGLE_GENAI_MODEL | Modelo a usar | gemma-4-26b-a4b-it (default) |
GEMINI_API_KEY | API key Google AI Studio (reutilizada) | ya configurada |
Activación off-sesión (Dokploy)
- Panel Dokploy PROD + STAGE → servicio
webyworker - Añadir / editar:
EDGE_AI_PROVIDER=google_genai - Restart ambos servicios
Reversión rápida (~30 s)
EDGE_AI_PROVIDER=openrouter
# restart web + worker
El default del sistema sigue siendo openrouter — la feature es opt-in.
Decisiones técnicas clave
1. Sampling oficial Gemma 4 (no negociable)
temperature=1.0 / top_p=0.95 / top_k=64
Validado en s49. Cambiar sin evidencia empírica degrada calidad.
2. response_mime_type="application/json" obligatorio
Sin este parámetro la calidad de salida JSON baja notablemente (confirmado s49). Aplicado en: analyze_incident (CNS), _call_ai de MIB (cuando response_json=True).
3. Sin safety_settings
Gemma es un modelo open-weights; pasar safety_settings devuelve 400 INVALID_ARGUMENT. A diferencia de GeminiProvider, este provider no los pasa.
4. Backoff 429 en CNS (async)
GoogleGenaiProvider._call_genai implementa exponential backoff (3 reintentos, 2 s → 30 s). Los helpers de Tutor y MIB no incluyen backoff propio — confían en el retry de nivel superior si aplica.
5. MIB usa temperatura 0.1 para JSON estricto
Aunque el sampling oficial Gemma 4 es 1.0, MIB Assistant sobreescribe temperature=0.1 para obtener JSON de clasificación de OIDs más determinista.
6. Reutilización de GEMINI_API_KEY
No se requiere nueva variable de API key. Google AI Studio usa la misma key tanto para modelos Gemini como Gemma.
Patrón de despacho en mib_assistant._call_ai
provider = getattr(settings, "EDGE_AI_PROVIDER", "openrouter")
if provider == "google_genai":
from monitoring.services.ai_providers.google_genai import call_google_genai
text = call_google_genai(prompt, temperature=0.1, max_tokens=8192, response_json=True)
else:
from core.services.ai_providers.openrouter import call_openrouter
text = call_openrouter(prompt, temperature=0.1, max_tokens=8192, response_json=True)
El fallback openrouter se preserva explícitamente.
Test plan (post-merge)
- CI verde (modo B)
- Edu activa
EDGE_AI_PROVIDER=google_genaien Dokploy panel - Prueba CNS: anomaly insight en dispositivo real
- Prueba Tutor: chat de networking
- Prueba MIB Assistant: upload de archivo MIB
- Feedback recogido off-sesión
Véase también
- [[entity—monitoring—service—google-genai-provider]]
- [[entity—monitoring—model—aiinsight]]
- [[entity—monitoring—service—tutor-service]]
- [[entity—network—service—mib-assistant]]
- [[concept—monitoring—cns-edge-intelligence]]