feat(whatsapp): QWEN primary AI backend, Hermes fallback, conversation history, vehicle persistence, demo prompts

- Add QWEN (qwen3.6) as primary AI backend with short system prompt
- Hermes remains as fallback with 45s timeout
- Increase QWEN timeout to 35s, max_tokens to 4000
- Add conversation history loading from whatsapp_messages (last 4 msgs)
- Persist detected vehicle in whatsapp_sessions table
- Add 'limpiar chat' / 'nuevo chat' / 'reset' commands to clear history
- Fix CSS conflict: rename whatsapp chat-panel classes to wa-chat-panel
- Fix JS ID conflicts with chat.js widget (waChatPanel, waChatMessages, etc.)
- Improve no-stock response: conversational with alternatives
- Split search_query by | for multi-part lookups
- Add DEMO_PROMPTS.md and DEMO_PROMPTS_V2.md
This commit is contained in:
2026-05-06 20:27:14 +00:00
parent 371d72887e
commit ff45905b49
33 changed files with 3040 additions and 445 deletions

181
DEMO_PROMPTS.md Normal file
View File

@@ -0,0 +1,181 @@
# 🧪 Prompts de Prueba — Demo WhatsApp Agent
> **Fecha:** mañana
> **Backend primario:** QWEN (qwen3.6) — ~1-3 segundos
> **Fallback:** Hermes (hermes-agent) — ~10-30 segundos si QWEN falla
> **Contexto persistente:** vehículo guardado en sesión, historial de últimos 4 mensajes
---
## 1. Saludo + búsqueda simple con vehículo
**Prompt:**
```
hola, necesito balatas para un Nissan Tsuru 2015
```
**¿Qué validar?**
- Responde en ~2-4 segundos
- Detecta vehículo: `{"brand": "Nissan", "model": "Tsuru", "year": 2015}`
- `search_query`: `Brake Pad` (o similar en inglés)
- Muestra resultados de inventario si hay stock
---
## 2. Síntoma mecánico (diagnóstico)
**Prompt:**
```
mi carro vibra al frenar, que puede ser?
```
**¿Qué validar?**
- Responde en ~2-5 segundos
- Identifica síntoma: discos de freno / balatas desgastadas
- `search_query`: `Brake Disc`
- Da diagnóstico + lista de partes probables
---
## 3. Tune-up completo (cotización múltiple)
**Prompt:**
```
quiero hacer el tune up a mi Renault Duster 2018
```
**¿Qué validar?**
- Responde en ~15-20 segundos (el prompt más complejo, paciencia aquí)
- Detecta vehículo: `{"brand": "RENAULT", "model": "Duster", "year": 2018}`
- `search_query`: `Spark Plug|Air Filter|Oil Filter|Fuel Filter` (separado por `|`)
- Muestra tabla de partes recomendadas
---
## 4. Seguimiento — "Sí, pásame la cotización"
**Prompt:**
```
si, pasame la cotizacion
```
**¿Qué validar?**
- **Crítico:** Recuerda el contexto (Renault Duster 2018 + tune-up)
- No pida "¿qué vehículo?" de nuevo
- `search_query` contiene múltiples partes separadas por `|`
- Responde en ~2-5 segundos (muy rápido porque ya tiene historial)
---
## 5. Agregar a cotización
**Prompt:**
```
cotizar
```
**¿Qué validar?**
- Detecta intent de cotización
- Agrega la última parte mostrada a la cotización abierta
- Responde con conteo de ítems y total parcial
- Incluye botón "Enviar Cotización" si se usa web
---
## 6. Preguntar por otra parte (contexto mixto)
**Prompt:**
```
y cuanto cuesta un alternador para el mismo carro?
```
**¿Qué validar?**
- Recuerda "el mismo carro" = Renault Duster 2018
- `search_query`: `Alternator`
- Muestra precio + stock del alternador
---
## 7. Enviar cotización final
**Prompt:**
```
enviar cotizacion
```
**¿Qué validar?**
- Envía la cotización completa formateada
- Muestra todos los ítems agregados con precios
- Incluye mensaje: *"Escribe 'sí' para confirmar tu pedido"*
---
## 8. Confirmar pedido
**Prompt:**
```
si
```
**¿Qué validar?**
- Confirma la cotización como pedido
- Responde: *"✅ Pedido confirmado! Tu cotización #X fue registrada..."*
- Guarda la cotización con estado `confirmed`
---
## 9. Limpiar conversación
**Prompt:**
```
limpiar chat
```
**¿Qué validar?**
- Borra historial de mensajes de la DB
- Responde: *"🗑️ Conversación reiniciada. ¡Hola de nuevo! ¿En qué puedo ayudarte?"*
- Próximo mensaje debe comportarse como conversación nueva
---
## 10. Parte sin stock / no en inventario
**Prompt:**
```
necesito un turbo para BMW X5 2022
```
**¿Qué validar?**
- Detecta vehículo: `{"brand": "BMW", "model": "X5", "year": 2022}`
- Si no hay en inventario, responde de forma conversacional:
- *"No encontré ese turbo en stock, pero puedo..."*
- Ofrece: pedido por encargo, alternativas, o sugerir tiendas
- **NO** responde con mensaje seco tipo *"❌ No tenemos esa parte"*
---
## ⚡ Checklist rápido antes de la demo
- [ ] WhatsApp Bridge está `state: open` (verificar en UI)
- [ ] Gunicorn está corriendo (`systemctl status nexus-pos`)
- [ ] El QR está escaneado y la instancia está conectada
- [ ] Limpiar historial de conversaciones de prueba anteriores
- [ ] Probar al menos 3 prompts de los de arriba en vivo
- [ ] Tener plan B: si QWEN falla, Hermes responderá (más lento pero funciona)
## 🚨 Qué hacer si algo falla durante la demo
1. **Timeout / "El asistente tardó mucho"**
- Esperar 10-15 segundos y reenviar el mensaje
- QWEN a veces tiene picos de latencia
2. **El agente "olvida" el vehículo**
- Escribir `limpiar chat` y empezar de nuevo
- O mencionar el vehículo explícitamente en cada mensaje
3. **No abre el panel de WhatsApp en la web**
- Hard refresh: **Ctrl+F5**
- O abrir en pestaña de incógnito
4. **Error de conexión del Bridge**
- En la UI de WhatsApp, clic en **"Conectar WhatsApp"** y re-escanear QR