# fibromuebles-whatsapp-agent

Agente de WhatsApp multimodal para atención al público de Fibromuebles.

## Contexto

- **Canal:** WhatsApp Business (Meta Cloud API)
- **Persona:** Richard — asistente comercial de Fibromuebles
- **Modelo:** Gemini 2.0 Flash (Google AI Studio — gratuito)
- **Orquestación:** n8n self-hosted (`n8n.edd-os.com.ar`)
- **Capacidades:** Texto + Imágenes + Audio (voice notes)
- **Outputs:** Presupuesto estimado + Render visual del mueble

## Estructura

```
fibromuebles-whatsapp-agent/
├── CLAUDE.md                          ← Este archivo
├── README.md                          ← Setup e instrucciones
├── .env.example                       ← Variables de entorno requeridas
├── business-context/
│   └── fibromuebles.md               ← Reglas de negocio y calificación de leads
├── manual/
│   └── MANUAL_FIBROMUEBLES.md        ← Conocimiento del negocio para el agente
├── workflows/
│   ├── system-prompt-richard.md      ← System prompt completo del agente
│   ├── create_agent.py               ← Script que crea todos los workflows en n8n
│   └── code-nodes/
│       ├── tool-get-prices.js        ← Precios desde Google Sheets CSV
│       ├── tool-calculate-budget.js  ← Cálculo de presupuesto por pieza
│       ├── tool-qualify-lead.js      ← Calificación y scoring de leads
│       ├── tool-escalate-to-edd.js   ← Escalamiento a Edd por WhatsApp
│       ├── tool-analyze-image.js     ← Análisis de imágenes con Claude Vision
│       ├── tool-transcribe-audio.js  ← Transcripción de audio con Whisper
│       ├── tool-generate-render.js   ← Generación de renders con FLUX
│       └── tool-generate-budget.js   ← Presupuesto formateado para enviar
└── docs/
    ├── cases/                        ← Casos de conversaciones problemáticas
    ├── audits/                       ← Reportes de auditoría del agente
    └── tracelog/                     ← Log inmutable de eventos
```

## IDs de Workflows en n8n

| Workflow | ID |
|---|---|
| fibro-tool-get-prices | `AWxBTC9ATvc1LV48` |
| fibro-tool-calculate-budget | `2n5LqLQaCEeh9hHw` |
| fibro-tool-qualify-lead | `UPelkf0QsPfgLm95` |
| fibro-tool-escalate-to-edd | `B95tk4wTSn3aoP5c` |
| fibro-tool-analyze-image | `VqUOtYvVkaI9O6ne` |
| fibro-tool-transcribe-audio | `7aCvhbq1Pl63qb4C` |
| fibro-tool-generate-render | `ZDhND3EkCZmGofbn` |
| fibro-tool-generate-budget | `h24hRpAKn0r9WTn4` |
| fibro-get-logica-tool | `1Vr2GvelcY1f9py2` |
| fibro-tool-prepare-budget | `v4L6jrljF9vRQ3II` |
| fibro-sync-odoo-crm | `fibroSyncOdooCRM` |
| richard-chatwoot-fibromuebles | `XoRXrhG7xb5jfHEl` |
| richard-seguimiento-fibromuebles | `WT6Wf8HnKm0VFPT7` |

## Endpoints

| Ambiente | URL |
|---|---|
| SANDBOX (test) | `http://localhost:5678/webhook/fibromuebles-whatsapp-sandbox` |
| Producción | `https://n8n.edd-os.com.ar/webhook/fibromuebles-whatsapp` |

## Comandos rápidos

```bash
# Crear/recrear todos los workflows en n8n
cd workflows && python3 create_agent.py

# Probar el agente en SANDBOX (texto)
curl -X POST http://localhost:5678/webhook/fibromuebles-whatsapp-sandbox \
  -H "Content-Type: application/json" \
  -d '{"input": "Hola, necesito un placard", "sessionId": "test-001", "phone": "5491100000000"}'

# Probar con imagen
curl -X POST http://localhost:5678/webhook/fibromuebles-whatsapp-sandbox \
  -H "Content-Type: application/json" \
  -d '{"input": "[imagen adjunta]", "sessionId": "test-002", "phone": "5491100000000", "media_type": "image", "media_url": "https://..."}'
```

## Setup manual requerido por Edelmar

### En Chatwoot (`https://chat.bah-ia.com.ar`)

Nota vigente: no usar `aprendizaje-total`. Esa prueba fue eliminada de Chatwoot; por ahora Richard atiende solo `WA 2439` y `WA 6690` queda manual.

1. **Crear labels** → Settings → Labels:
   - `bot-pausa` (color rojo) — pausa el bot para esa conversación sin cambiar status
   - `aprendizaje-total` (color amarillo) — bot responde pero todo va como nota privada (Edelmar ve cómo respondería sin que llegue al cliente)

2. **Crear automation rule** → Settings → Automation → New Rule:
   - Nombre: `Aprendizaje Richard`
   - Evento: `Conversation Created`
   - Condición: Inbox = Fibromuebles (Inbox 3)
   - Acción: Add Label `aprendizaje-total`
   - ⚠️ Dejar activa durante la semana inicial. Desactivarla cuando estés conforme con las respuestas de Richard.

3. **Instalar Chatwoot Mobile App** en el celular del local:
   - iOS/Android → buscar "Chatwoot"
   - Login con `info@bah-ia.com.ar`
   - Activar push notifications para "Private Notes" y "Conversation Status Changes"
   - Así Richard te notifica cada vez que hay un presupuesto para revisar

### En n8n (`https://n8n.edd-os.com.ar`)

1. **Credencial Google People API** → Settings → Credentials → New:
   - Tipo: Google OAuth2 API
   - Scope: `https://www.googleapis.com/auth/contacts`
   - Cuenta: `fibromuebles.bahiablanca@gmail.com`
   - Nombre a usar: `Google People API — Fibromuebles`
   - Luego asignarla al nodo `Sincronizar Gmail Contacts` en `richard-chatwoot-fibromuebles`

### Cómo controlar el bot por conversación

| Acción en Chatwoot | Efecto |
|---|---|
| Cambiar status a `pending` | Bot ignora esa conversación hasta que la abras a `open` |
| Hacer snooze con timer | Bot ignora X horas, se reactiva solo |
| Asignarse la conversación | Bot ignora (humano tomó el control) |
| Agregar label `bot-pausa` | Bot ignora mientras tenga esa label |
| Agregar label `aprendizaje-total` | Bot responde pero como nota privada (solo Edelmar la ve) |
| Escribir nota privada `@richard: [instrucción]` | Richard incorpora esa instrucción en su próxima respuesta en esa conversación |

---

## Pendiente de configurar en n8n (UI)

1. **Credencial Gemini** → Settings → Credentials → Add → "Google Gemini (Palm) API" → API Key: `<GEMINI_API_KEY>`
2. **Asignar credencial** en el workflow SANDBOX → nodo "Gemini Flash" → seleccionar la credencial
3. **Variable de entorno** → Settings → Variables → Add → `GEMINI_API_KEY` = `<GEMINI_API_KEY>`
4. **Activar** los 9 workflows con el toggle (arriba a la derecha en cada uno)

## Manual de conocimiento

Ver `manual/MANUAL_FIBROMUEBLES.md` — documento base para que el agente entienda el negocio.
Las secciones marcadas `[EDD: completar]` requieren info que Edd debe agregar.
