FOLIO: AUD-20260924-002 Secuencia: Auditoría #002 del día 2026-09-24
📅 2026-09-24 · COT 👤 Auditor: Anderson Mares (AMR TECH) ● VIGENTE
⚡
AMR TECH™ · CRM INTELLIGENCE LAYER

Cascada LLM Multi-Modelo
+ Notificaciones Slack + Fix Send Manual

Implementación de sistema de fallback en cascada para los modelos LLM del Test Suite Global del CRM. Resolución de rate-limit Groq, integración OpenRouter, respuestas canned garantizadas, notificaciones Slack automáticas y corrección del bug de envío manual en modo Toma Manual.

Problema Diagnosticado — 2 Issues Críticos

ISSUE #1 — Test Suite: Rate-limit Groq

El Test Suite (36 conversaciones) usaba exclusivamente llama-3.3-70b-versatile para simular el cliente. Modelo 70B consume alta cuota → rate-limit en Groq → el cliente IA respondía [Sin respuesta Groq] → conversación truncada → 36/36 resultados quedaron como "Conversación abierta", 0 ventas, 0 escalados.

Archivo: whatsapp-crm/public/test_generator.php
ISSUE #2 — send_message.php: JSON vacío

Al enviar mensajes en modo Toma Manual desde el CRM Web, el browser recibía respuesta vacía de send_message.php, causando Unexpected end of JSON input. Sin ob_start() ni try-catch, cualquier excepción PHP mataba el script sin devolver JSON.

Archivo: whatsapp-crm/public/send_message.php

Solución #1 — Cascada LLM en 3 Tiers

1 Groq — Rotación de modelos por cuota
PRIMARIO
llama-3.1-8b-instant
Mayor RPM disponible
gemma2-9b-it
Cuota independiente
llama-3.2-3b-preview
Micro modelo / rápido
llama-3.3-70b-versatile
Último recurso Groq

Cada key en GROQ_API_KEY, GROQ_API_KEY_1, etc. se intenta con cada modelo. 200ms de espera entre reintentos. HTTP 429 → siguiente modelo inmediato.

2 OpenRouter — Modelos gratuitos cloud
FALLBACK
meta-llama/llama-3.2-3b:free
mistralai/mistral-7b:free
google/gemma-2-9b-it:free

Requiere OPENROUTER_API_KEY en .env. Cabecera HTTP-Referer: streamingapps.online incluida.

3 Canned Responses — Garantizado, nunca falla
GARANTÍA
🧠
Experto
SLA/stack/tech
🌱
Novato
¿Cómo funciona?
😤
Difícil
Muy caro/descuento
🤔
Dudoso
Déjeme pensarlo
😨
Miedoso
¿Qué garantía?
🚫
No Compra
Para más adelante

Solución #2 — Fix send_message.php (JSON vacío)

❌ Antes
// Sin ob_start()
// Sin try-catch
$msgRepo->insertMessage(...);
// Si falla → PHP error → respuesta vacía
// JS: "Unexpected end of JSON"
✅ Después
ob_start(); // captura warnings
require_once "auth.php";
ob_clean(); // descarta output
header('Content-Type: application/json');
try {
// toda la lógica aquí
} catch (\Throwable $e) {
echo json_encode(['status'=>'error',...
}
También corregido en JS: res.text() → JSON.parse() con try-catch que muestra el error PHP real en lugar del mensaje genérico.

Solución #3 — Notificaciones Slack (Test Suite)

notify_slack.php

Nuevo endpoint PHP que envía resumen en formato Block Kit a Slack. Soporta webhook URL o Bot Token + Channel ID.

Botón en header UI

Botón Slack en el header del test suite. Se habilita al completar los 36 tests y envía el resumen bajo demanda.

Auto-notify

Al completar los 36 tests, se dispara notifySlack(auto=true) automáticamente para notificación en móvil.

# Configurar en .env del servidor para activar:
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/TU/WEBHOOK/URL
# Alternativa con bot token:
SLACK_BOT_TOKEN=xoxb-...
SLACK_CHANNEL_ID=C0XXXXXXXX

Mejora Adicional — Delay entre tests

0ms
Delay anterior
→
2000ms
Delay nuevo
Agregado en test_suite.php — await sleep(2000) entre cada test del queue. Reduce la presión sobre la API Groq de ~36 requests/segundo a 1 request cada 2 segundos, permitiendo que los tokens se recuperen entre conversaciones.

Inventario Modelos Locales — Mac AMR

Los modelos Ollama del Mac son usables para desarrollo local. El servidor Hostinger no puede alcanzarlos directamente (red diferente). Para testing local, crear test_generator_local.php con endpoint http://localhost:11434.

hermes3
4.7 GB · Conversacional
✅ Disponible
nous-hermes2
6.1 GB · Alta calidad
✅ Disponible
llama3.2
2.0 GB · Rápido
✅ Disponible
qwen2.5-coder:7b
4.7 GB · Código
✅ Disponible
qwen2.5-coder:1.5b
986 MB · Micro
✅ Disponible
Para integrar Ollama en el test suite: hacer tunnel con ngrok http 11434 y agregar OLLAMA_URL al .env del servidor, o correr el test generator localmente vía CLI.

Archivos Modificados / Creados

MOD whatsapp-crm/public/test_generator.php callLLMCascade() + loadEnvVars() + _groqCall() + _openRouterCall() + _cannedResponse()
MOD whatsapp-crm/public/test_suite.php Delay 2s + botón Slack + auto-notify + notifySlack()
NEW whatsapp-crm/public/notify_slack.php Endpoint Slack — webhook URL + Bot Token, Block Kit format
FIX whatsapp-crm/public/send_message.php ob_start() + ob_clean() + try-catch Throwable
FIX whatsapp-crm/public/index.php sendManualMsg(): res.text() → JSON.parse() con try-catch para errores reales

Commits & Deploy

a7e9801 feat(test-suite): LLM cascade fallback + Slack notification
4c4f49f fix(crm): send_message JSON vacío — ob_start + try-catch + JS parse seguro
Branch: main · Repo: anderman1981/amrstreaming · Deploy: Hostinger rsync ✅
⚡ AMR TECH™ · Desarrollado / Auditado por Anderson Mares · AUD-20260924-002 · streamingapps.online