Logia de agente de Whatsapp

This commit is contained in:
unknown
2026-05-31 22:02:58 -04:00
parent aa7555b49d
commit ef78d9a14c
28 changed files with 12736 additions and 0 deletions

129
mvp/Whatsapp-bot/README.md Normal file
View File

@@ -0,0 +1,129 @@
# Reformix Luisa Bot 🤖
Agente de WhatsApp **Luisa** para **Reformix** — cualifica leads de reforma de forma conversacional, recoge 5 datos clave y cierra el flujo según el flag viable/no_viable.
## Stack
- **NestJS** — framework principal
- **Baileys** — conexión con WhatsApp (sin API oficial)
- **PostgreSQL** — base de datos via TypeORM
- **Claude 4.5** via **OpenRouter** — LLM con soporte de texto, audio e imagen
## Estructura del proyecto
```
/src
/whatsapp ← Módulo Baileys: conexión, QR, recepción y envío
/leads ← Módulo de leads: CRUD y lógica de estados
/conversacion ← Módulo de historial de mensajes por lead
/scheduler ← Cron cada 5 min: dispara apertura a leads nuevos
/claude ← Construye el contexto y llama a Claude 4.5
/media ← Procesa audio e imagen antes de pasar a Claude
/prompts
luisa_core.md ← Identidad y personalidad de Luisa ← RELLENAR
luisa_flujo.md ← Flujo de cualificación paso a paso ← RELLENAR
luisa_casos.md ← Casos edge y ejemplos ← RELLENAR
```
## Configuración rápida
### 1. Variables de entorno
```bash
cp .env.example .env
```
Edita `.env`:
```env
OPENROUTER_API_KEY=sk-or-...
MODEL=anthropic/claude-sonnet-4-5
DATABASE_URL=postgresql://user:password@localhost:5432/reformix_luisa
```
### 2. Base de datos
El proyecto usa `synchronize: true` en modo desarrollo, TypeORM creará las tablas automáticamente al arrancar.
En producción, desactiva `synchronize` y usa migrations:
```bash
npm run migration:generate
npm run migration:run
```
### 3. Prompts de Luisa
Rellena los 3 archivos en `/prompts` antes de arrancar:
- `luisa_core.md` — identidad, tono, límites
- `luisa_flujo.md` — estados, preguntas por estado, condiciones de avance
- `luisa_casos.md` — casos edge, fallbacks, ejemplos de conversación
### 4. Arrancar
```bash
npm install
npm run start:dev
```
Escanea el **QR** que aparece en la terminal con WhatsApp.
Luisa queda conectada y lista.
## Flujo de mensajes
```
Mensaje entrante (texto / audio / imagen)
Identificar lead por teléfono (crear si no existe)
Si audio → Claude 4.5 transcripción
Si imagen → Claude 4.5 Vision (prompt según estado)
Si texto → directo
Guardar mensaje usuario en DB
Construir contexto: estado, datos del lead, historial, prompts MD
Llamar Claude 4.5 via OpenRouter
Extraer entidades del turno → actualizar lead en DB
Evaluar flag viable → cambiar estado si aplica
Guardar respuesta de Claude en DB
Enviar respuesta por Baileys
```
## Scheduler (cron cada 5 min)
- Busca leads con `estado_actual = 'nuevo'`
- Marca como `en_proceso` antes de actuar
- Genera y envía el mensaje de APERTURA de Luisa
- Ignora leads en `completado`, `no_viable`, `perdido`
- Marca como `perdido` leads en `en_proceso` sin actividad > 48h
## Estados del lead
| Estado | Descripción |
|--------|-------------|
| `nuevo` | Lead creado, aún no contactado |
| `en_proceso` | Luisa le ha enviado el primer mensaje |
| `recopilando_datos` | Conversación activa |
| `completado` | Todos los datos recogidos, viable=true |
| `no_viable` | Lead descartado, viable=false |
| `perdido` | Sin actividad > 48h |
## Qué NO hace este servicio
- No genera el presupuesto (lo hace otro worker)
- No renderiza el PDF
- No envía la URL (la inserta el worker en `url_presupuesto`)
- No tiene panel del reformista
---
Desarrollado para Reformix © 2025