Tab de Licencias · Matriz Key × Modelo · Gemini Dynamic Discovery
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.
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.
ai_settings
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.
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.
generateContent en supportedGenerationMethodsembed, tts, aqa, live, robotics, guardinputTokenLimit desc (mayor contexto = más disponible)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.
status, scan, cache, hide, unhide, validate. CSRF protegido en todas las acciones POST.
🔐 Licencias. Sub-tabs por proveedor, matriz HTML, modal de validación, JS completo para licScan/licLoadCache/licHide/licValidate.
| 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 |
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.
Actualizar keys Gemini y OpenRouter
Keys actuales retornan HTTP 400/404. Configurar nuevas keys en Hostinger .env directamente por SSH.
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.