Servicio MibAssistant (análisis Gemma 4 con sanitización de prompt injection)
Propósito
MibAssistant (en network/services/mib_assistant.py) integra Gemma 4 (google_genai) para analizar OIDs extraídos de MIBs subidos y proponer categorías:
- monitoring_oids: para Zabbix/Prometheus (métricas principales)
- deep_discovery_oids: para SNMP polling profundo (diagnostics, detalle)
Acepta OIDs de MIBs subidos (input no confiable) y los envía al LLM con sanitización de prompt injection (s114).
Funciones principales
analyze_mib_oids(extracted_oids, vendor_name, device_type, sys_descr) → dict
Analiza OIDs extraídos de un MIB custom y propone categorías.
Entrada:
extracted_oids: lista de dicts (nombre, OID, tipo, sintaxis)vendor_name: nombre del vendor (para contexto)device_type: tipo de dispositivo (router, switch, etc.)sys_descr: descripción de sistema (opcional, para SNMP fingerprinting)
Salida: dict con:
{
"monitoring_oids": [
{"name": "sysUpTime", "oid": "1.3.6.1.2.1.1.3", "category": "uptime"},
...
],
"deep_discovery_oids": {
"interfaces": [
{"name": "ifInOctets", "oid": "1.3.6.1.2.1.2.2.1.10.1"},
...
],
...
},
"analysis": "Explicación texto (para UI)"
}
_format_oid_list(oids) → str
Formatea la lista de OIDs para el prompt de Gemma 4 (limita a 200 OIDs para caber en contexto).
s114 change: Los nombres/sintaxis se encapsulan con wrap_untrusted() (reutiliza sanitize.py de CNS) antes de pasar a la IA:
from monitoring.services.ai_providers.sanitize import wrap_untrusted
oid_list = wrap_untrusted("mib_oids", _format_oid_list(extracted_oids))
wrap_untrusted() marca los datos como “datos, no instrucciones” para que un OID malicioso no pueda inyectar prompts o comandos.
apply_proposal(vendor_slug, proposal) → dict
Aplica la propuesta de análisis al VendorProfile (merge sin sobrescribir OIDs existentes).
s114 robustness: Ahora omite entries sin oid en vez de lanzar KeyError:
for entry in oids:
oid_value = entry.get("oid") if isinstance(entry, dict) else None
if oid_value and oid_value not in existing_set:
existing.append(entry)
existing_set.add(oid_value)
_fallback_classify(oids, device_type) → dict
Clasificación rule-based cuando Gemma 4 no está disponible (fallback).
Endpoints
Ambos endpoints requieren admin only (s114):
-
POST /api/vendor-profiles/{slug}/mib-assistant/analyze- Análisis con Gemma 4 (consume crédito de IA)
- Requiere:
if not is_admin(request.user): return 403
-
POST /api/vendor-profiles/{slug}/mib-assistant/apply- Aplica propuesta al VendorProfile
- Requiere: admin only
Docstrings
s114 corrige la documentación (decía “Gemini Flash”, usa “Gemma 4 (google_genai)”):
analyze_mib_oids: “Analyze extracted OIDs using Gemma 4 (google_genai)…”_format_oid_list: “Format extracted OIDs for the Gemma 4 prompt.”_fallback_classify: “Rule-based fallback when Gemma 4 is unavailable.”
Error handling
Previo: except Exception as e: return 400, {"message": f"Analysis failed: {str(e)}"}
Ahora: return 400, {"message": "MIB analysis failed. See server logs for details."}
Evita filtrar detalles internos que podrían ser sensibles.
Véase también
- [[entity—network—model—custom-mib]]
- [[entity—network—service—mib-manager]]
- [[feature—network—sa3-auditoria-vendor-mib]]