130 lines
3.5 KiB
Markdown
130 lines
3.5 KiB
Markdown
# 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
|