Logia de agente de Whatsapp
This commit is contained in:
129
mvp/Whatsapp-bot/README.md
Normal file
129
mvp/Whatsapp-bot/README.md
Normal 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
|
||||
Reference in New Issue
Block a user