FOLIO: AUD-20260925-009 Secuencia: Auditoría #009 del día 2026-09-25
📅 2026-09-25 18:00:00 COT 👤 Auditor: Anderson Mares (AMR TECH) ● VIGENTE
🔐

License Audit Dashboard

Tab de Licencias · Matriz Key × Modelo · Gemini Dynamic Discovery

NUEVO FEATURE DEPLOYADO v1.0.0

Resumen Ejecutivo

Se implementaron dos funcionalidades mayores al CRM WhatsApp: (1) el tab 🔐 Licencias con una matriz interactiva Key × Modelo por proveedor, y (2) el discovery dinámico de modelos Gemini usando el endpoint real /v1beta/models en lugar de una lista hardcodeada.

3
Archivos modificados
5
Proveedores en matriz
6
Acciones en backend
~40
Modelos Gemini vía API

Feature 1 — Tab 🔐 Licencias

Descripción

Nuevo tab en config.php (Option B — panel separado sin tocar los tabs existentes). Muestra una matriz interactiva donde las filas son modelos y las columnas son keys configuradas, con el estado real de cada combinación.

Sub-tabs por proveedor

  • ⚡ Groq — hasta 10 keys
  • 🌟 Gemini — hasta 10 keys (discovery dinámico)
  • 🔀 OpenRouter — hasta 5 keys
  • 🤖 OpenAI — hasta 5 keys
  • 🧡 Claude — 1 key

Controles admin

  • 🔍 Escanear — prueba todas las combinaciones
  • 📂 Cargar caché — resultado anterior en DB
  • 🙈 Ocultar modelo — persiste en ai_settings
  • 👁 Mostrar ocultos — filtro toggle
  • ⛔ Ocultar sin cuota — filtro toggle

Modal de Validación en tiempo real

Al hacer clic en cualquier celda de la matriz se abre un modal con el par (Key, Modelo) y un botón ▶ Probar Ahora que ejecuta audit_licenses.php?action=validate y muestra el resultado real (status, HTTP code, latencia, mensaje de error) al instante.

Estados de la matriz

✅ OK ⛔ Sin cuota 🔑 Auth err — No existe ❌ Error

Feature 2 — Gemini Dynamic Discovery

Endpoint real usado

GET https://generativelanguage.googleapis.com/v1beta/models?key=KEY&pageSize=100

Retorna todos los modelos disponibles para la key dada. Ya no se depende de una lista hardcodeada que puede quedar desactualizada.

Filtros aplicados al discovery

  • ✅ Solo modelos con generateContent en supportedGenerationMethods
  • ❌ Excluye: embed, tts, aqa, live, robotics, guard
  • ↕️ Ordenados por inputTokenLimit desc (mayor contexto = más disponible)

Fallback automático

Si el discovery falla (key inválida, red, timeout), el sistema usa la lista estable de 9 modelos conocidos. La fila [discovery] en el scan muestra si se usó API o fallback.

Archivos afectados

scan_models.php Sección Gemini reescrita: discovery dinámico, fila informativa de source, vision test con primeros 5 modelos del discovery
audit_licenses.php Nuevo endpoint. Acciones: status, scan, cache, hide, unhide, validate. CSRF protegido en todas las acciones POST.
config.php Nuevo tab 🔐 Licencias. Sub-tabs por proveedor, matriz HTML, modal de validación, JS completo para licScan/licLoadCache/licHide/licValidate.

Backend — audit_licenses.php

Acción Método CSRF Descripción
status GET No Lista keys configuradas (mascaradas) por proveedor
scan POST ✅ Sí Prueba key × modelo, guarda caché en ai_settings
cache GET No Carga último scan guardado en DB
hide/unhide POST ✅ Sí Oculta o restaura modelo para ese proveedor (persiste en DB)
validate POST ✅ Sí Test en tiempo real de key_index + modelo específico

Próximos Pasos

1.

CI/CD Pipeline (GitLab + GitHub)

Configurar pipeline: push a dev → deploy automático a dev local / staging · push a main → deploy a producción Hostinger via rsync + SSH.

2.

Actualizar keys Gemini y OpenRouter

Keys actuales retornan HTTP 400/404. Configurar nuevas keys en Hostinger .env directamente por SSH.

3.

Slack + Webhook de pagos

Integración audio/imagen → detección de pago → notificación Slack → botón de respuesta → compra automática de cuenta streaming.

⚡ AMR TECH™ · Desarrollado / Auditado por Anderson Mares
AUD-20260925-009 · streamingapps.online · WhatsApp CRM v4.1