AIService.php + WebhookHandler.php + Panel Admin — Análisis de arquitectura, seguridad y rendimiento del CRM conversacional con cascada de 5 proveedores IA.
El componente auditado es el más sofisticado arquitecturalmente del proyecto. Implementa una cascada multi-proveedor de producción (Groq → Gemini → OpenRouter → OpenAI → Ollama) con post-procesamiento de humanización y guardas anti-loop. Cuenta con 10 cerebros (personas IA) para diferentes contextos de negocio y soporte de hasta 10 claves API por proveedor para alta disponibilidad. El panel admin tiene protección CSRF. Las brechas clave son: TRM hardcodeado, ausencia de verificación de firma webhook, métricas a nivel de conversación inexistentes, y la arquitectura PHP de 1-proceso-por-request que limita la concurrencia bajo carga alta.
Context Injectors (paralelo al cascade):
WebhookHandler.php procesa mensajes entrantes
sin verificar la firma HMAC del proveedor WhatsApp/WAHA.
Cualquier actor externo puede hacer POST a la URL del webhook y disparar respuestas IA reales —
abusando de cuotas de API y potencialmente inyectando conversaciones falsas al CRM.
X-Hub-Signature-256
contra HMAC-SHA256(body, WAHA_SIGNING_SECRET) antes de procesar cualquier payload.
Línea 104: $trm = 4100; // Valor fallback.
Si la API de TRM falla, todos los cálculos de precio en conversaciones activas
utilizan una tasa potencialmente obsoleta. Para un CRM de ventas, el pricing incorrecto
en conversaciones puede generar pérdidas de ingresos directas.
dolarapi.com o API Bancolombia.
Alertar vía Telegram si el fetch falla más de 2 horas consecutivas.
El endpoint webhook es públicamente accesible sin control de velocidad. Un flood de requests podría agotar cuotas de API IA (costo $$$) o causar un DoS efectivo sobre la cascada de proveedores. WAHA debería ser el único caller legítimo.
Las claves API de todos los proveedores (Groq, Gemini, OpenRouter, OpenAI) se almacenan
como texto plano en la tabla ai_settings.
Si la base de datos es comprometida (SQL injection, backup leak, acceso físico),
todas las claves quedan expuestas de inmediato sin capa adicional de protección.
La función ejecuta la cascada completa (5 proveedores) pero se llama callGroqAPI().
Confunde al leer logs y al mantener el código. Debe renombrarse a
callAICascade().
No hay tracking de: qué cerebro manejó qué conversación, tasa de conversión por persona, longitud promedio de respuesta, ni señales de satisfacción del usuario. Datos críticos para optimizar.
Cada webhook dispara un proceso PHP síncrono. Con 100+ mensajes simultáneos, Apache/PHP-FPM encolará. No hay sistema de colas (Redis Queue, RabbitMQ) para procesamiento async.
10+ reemplazos regex hardcodeados en PHP. Cada nuevo modelo IA puede requerir nuevos patrones. Debería ser configuration-driven (tabla DB o JSON configurable), no PHP hardcodeado.
El servicio existe pero la profundidad de integración es incierta. Necesita verificarse que cubre todos los paths incluyendo el flujo de análisis de imágenes (vision).
La capacidad de embeddings/vectores existe pero no es claro si está en producción. Si no se usa, agrega carga de mantenimiento. Si se usa, necesita documentación clara del flujo.
Groq → Gemini → OpenRouter → OpenAI → Ollama. Cero vendor lock-in. Fallback automático si un proveedor falla.
Alta disponibilidad y pooling de cuotas. Rotación automática ante rate limits.
Detección de auto-respuestas del bot para evitar loops infinitos de IA respondiendo a IA.
Previene procesar el mismo mensaje dos veces. Evita doble-respuesta al cliente.
10 patrones regex eliminan frases de auto-identificación IA. Respuestas más naturales.
Freno de emergencia cuando un humano toma control. IA deja de responder automáticamente.
Panel admin con tokens de sesión CSRF. Protección básica contra cross-site request forgery.
DolibarrService inyecta contexto de ERP en el prompt. IA tiene datos de pedidos, clientes, inventario.
Inyección de contexto de catálogo de productos en el prompt. IA conoce precios y disponibilidad.
Análisis de imágenes via Gemini + OpenRouter. Clientes pueden enviar fotos y la IA las interpreta.
Personas especializadas para diferentes contextos de negocio. Selección inteligente según intent.
Clasificación de intención en 17 escenarios de negocio. Routing preciso al cerebro correcto.
Capacidad de búsqueda semántica por embeddings presente. Potencial para RAG y búsqueda contextual.
Usar el signing secret de WAHA para verificar X-Hub-Signature-256
antes de procesar cualquier payload. Rechazar con 401 si falla.
Esfuerzo: 2h.
100 req/min por IP. Whitelist IP del servidor WAHA. Header 429 con Retry-After. Protege cuotas IA y disponibilidad del servicio. Esfuerzo: 3h.
Implementar cola simple (SQLite queue o Redis) para procesar webhooks async. Webhook responde 200 inmediatamente, worker procesa en background. Esfuerzo: 1 día.
Cierre 2026-09-27 — decisión del cliente: NO APLICA.
El canal vivo es AutoResponder, que consume la respuesta {"reply"}
del body HTTP (176 msgs / 7 días, 0 con wamid): un 200 inmediato con cola rompería el bot activo.
Contrato síncrono POST /whatsapp-crm/public/webhook.php → {"reply"} preservado y verificado en vivo.
AES-256-GCM usando APP_KEY del .env como clave maestra. Descifrar en runtime. Migración: script one-time para cifrar keys existentes. Esfuerzo: 4h.
Tabla cerebro_metrics: conv_count, avg_turns, manual_takeover_rate, avg_response_ms.
Dashboard en el panel admin para optimizar qué cerebro funciona mejor por escenario.
Esfuerzo: 1 día.
Fetch a dolarapi.com con APCu/Redis cache de 1 hora.
Si falla > 2h consecutivas, alertar vía Telegram al admin.
Esfuerzo: 3h.
Refactor de naming para claridad. Actualizar todos los callers y logs. Esfuerzo: 30min.
Notificar al admin vía Telegram/WhatsApp cuando EmergencyBrake se activa (manual takeover). Incluir número del cliente y motivo. Esfuerzo: 2h.
| Componente | Riesgo | Probabilidad | Impacto | Estado |
|---|---|---|---|---|
| WebhookHandler.php | Sin HMAC | ALTA | CRÍTICO | ABIERTO |
| ai_settings (DB) | Keys plaintext | MEDIA | CRÍTICO | ABIERTO |
| Webhook endpoint | Sin rate limit | ALTA | ALTO | ABIERTO |
| Panel admin | CSRF token | BAJA | MEDIO | MITIGADO |
| AIService (cascade) | Timeout handling | BAJA | MEDIO | CUBIERTO |
| EmergencyBrake | Cobertura parcial | MEDIA | ALTO | REVISAR |