Agente de voz con inteligencia artificial que llama a los leads en el primer minuto despues de que se registran, los califica, despierta deseo de compra y agenda una llamada estrategica para cerrar. Construido sobre Retell + Twilio + Supabase + Cal.com + Modal.
Creado y operado por Diego Osorio — Imperio (comunidad de IA y automatizaciones para vender mas).
- Contesta llamadas y llama leads como un setter experto las 24 horas.
- Descubre el dolor del prospecto con preguntas estrategicas antes de pitchar.
- Despierta deseo de compra activando meta-dolor + dolores operativos + dolores identitarios.
- Resuelve objeciones con 14+ respuestas listas (precio, "es estafa", "ya tengo ChatGPT", etc.).
- Agenda la llamada estrategica con dia y hora concretos en Cal.com (cierre asumido).
- Guarda todo en Supabase (lead + transcripcion + analisis post-llamada con Claude).
- Puede hacer hand-off en vivo a un humano del equipo si el lead viene muy caliente.
| Servicio | Para que |
|---|---|
| Retell AI | Motor del agente de voz (latencia baja, deteccion de turnos, deteccion de buzon) |
| OpenAI GPT-4o | Cerebro del agente durante la llamada (via Retell) |
| ElevenLabs | Voz natural (11labs-Alejandro para Alfred). Incluida via Retell. |
| Twilio | Telefonia / numero / SIP trunk |
| Supabase | CRM / base de datos (3 tablas: products, leads, calls) |
| Cal.com | Agendar llamadas estrategicas |
| Anthropic Claude | Analisis post-llamada (scoring + resumen del lead) |
| Modal | Hosting serverless del backend Python |
| Next.js + shadcn/ui | Dashboard de leads y llamadas |
alfred-imperio/
├── alfred.config.yaml ← Configuracion principal (Imperio / Diego) — el "cerebro" de Alfred vive aqui
├── sara.config.yaml ← Despliegue paralelo: cliente externo (Francia Salazar Estetica)
├── .env ← Credenciales (NUNCA subir a git)
├── .env.example ← Template de referencia
├── prompts/ ← Templates por industria (estructura del prompt, no contenido especifico)
│ ├── inmobiliaria.yaml
│ ├── dental.yaml
│ ├── abogados.yaml
│ ├── gimnasio.yaml
│ ├── restaurante.yaml
│ ├── estetica.yaml
│ └── infoproductos.yaml
├── app/ ← Backend Python + Modal
│ ├── config.py ← Carga alfred.config.yaml + template + reglas universales
│ ├── main.py ← Endpoints FastAPI (/register-lead, /retell-webhook, /health)
│ ├── outbound_worker.py ← Cron: llamadas de seguimiento automaticas
│ ├── services/ ← Retell, Twilio, Supabase, Cal.com, Anthropic
│ └── webhooks/ ← Handler post-llamada (Claude analiza la transcripcion)
├── scripts/ ← Setup + iteracion + tests
│ ├── deploy_imperio_test.py ← Setup INICIAL de Alfred en Retell (LLM + agente)
│ ├── iterate_imperio.py ← Re-pushea el prompt y dispara llamada de prueba
│ ├── redial_imperio.py ← Solo dispara llamada (sin tocar prompt)
│ ├── inspect_call.py ← Diagnostica una llamada (latencia, silencios, transcript)
│ ├── setup.py ← Setup automatizado completo (usar SDK Retell, no API v2)
│ ├── customize.py ← Cambios puntuales post-setup
│ ├── status.py ← Estado actual de todos los servicios
│ └── test_services.py ← Verificar que todo funciona
├── docs/ ← Playbooks de setter y guion para validar en voz alta
│ ├── playbook-setter-imperio.md
│ ├── playbook-setter-estetica.md
│ └── guion-alfred-voz-alta.md
├── supabase/migrations/ ← Esquema SQL (products, leads, calls con JSONB)
└── dashboard/ ← Panel de control Next.js
Cuando editas el alfred.config.yaml (el cerebro), no necesitas recrear nada en Retell. Un solo comando re-empuja el prompt y dispara una llamada de prueba:
python scripts/iterate_imperio.pyEsto ejecuta:
- Lee
alfred.config.yaml+ templateinfoproductos.yaml - Compone el prompt con todas las reglas universales
client.llm.update(llm_id, general_prompt=...)al LLM existenteclient.call.create_phone_call(...)al numero verificado
Tiempo total: ~3 segundos. Si Alfred sonaba raro al decir las fechas, editas el knowledge, corres el script, y a los pocos segundos esta llamando con la nueva version.
Este repo soporta multiples agentes activos en simultaneo. Hoy hay 2:
| Despliegue | Config | Industria | Estado |
|---|---|---|---|
| Alfred / Imperio (principal) | alfred.config.yaml |
infoproductos | Test en Retell ✓ |
| Sara / Francia Salazar (cliente externo) | sara.config.yaml |
estetica | En produccion en Modal |
Cuando quieras montar un tercer despliegue paralelo (otro cliente, otro negocio), creas <nombre>.config.yaml y replica el patron de los scripts dedicados.
- Llamada conectada: ~$0.21 USD/min (Retell ~$0.17 + Twilio ~$0.04) + ~$0.01 por llamada contestada (Claude analiza la transcripcion).
- Llamada no contestada: $0.
- Buzon detectado: $0 (Retell cuelga antes de hablar).
- Numero Twilio: ~$1.15/mes fijo.
- Supabase, Modal, Cal.com: gratis hasta cierto volumen.
Ejemplo real: 100 llamadas outbound donde solo 1 contesta y dura 8 minutos ≈ $1.50 USD total.
Estas son las gotchas que evitan reventar el sistema (todas estan documentadas en CLAUDE.md):
- NO uses la API REST v2 de Retell — esta descontinuada. Usar el SDK:
client.llm.create(),client.agent.create(),client.call.create_phone_call(),client.llm.update(). - Inyecta
{{current_time_America/Bogota}}y{{current_calendar}}en el prompt outbound, o el modelo no sabe la fecha de hoy. - El agente debe decir fechas y horas en palabras completas: "el viernes treinta de mayo a las dos y media de la tarde", nunca "30/05 a las 14:30". El TTS suena horrible con formato numerico.
- NUNCA pidas el correo en la llamada. Viene del registro a la landing. Deletrearlo en voz introduce errores constantes.
- Limites en TODOS los agentes:
max_call_duration_ms = 900000(15 min cap) yvoicemail_option = {action: {type: "hangup"}}(cuelga al detectar buzon). - Windows: forzar
PYTHONUTF8=1al correr scripts (la consola cp1252 rompe emojis).
Como pruebo cambios al cerebro rapido sin recrear todo?
python scripts/iterate_imperio.py — re-empuja el prompt y dispara llamada de prueba en ~3 segundos.
El agente se enreda al pedir correos. Que hago? No lo pidas en la llamada. Deletrear correos en voz es un agujero de errores. El correo viene del registro a la landing → almacenado en Supabase cuando entra el lead. En la llamada solo confirma: "te llega la invitacion al correo con el que te registraste".
Como hago que el agente diga bien las fechas y horas?
Dos cosas: (1) Inyecta {{current_time_America/Bogota}} y {{current_calendar}} (variables automaticas de Retell) en el prompt. (2) Agrega reglas absolutas al prompt para decir TODO en palabras: "el viernes treinta de mayo a las dos y media de la tarde", nunca "30/05" ni "14:30".
Tengo varios negocios. Como manejo cada uno?
Tres caminos: (1) Repos separados — clona uno por cliente. (2) Despliegues paralelos en el mismo repo con <nombre>.config.yaml (asi esta montado hoy con Alfred + Sara). (3) Mismo Retell account, multiples agentes — la API soporta crear varios LLM + agentes independientes en la misma cuenta.
Como controlo costos de llamadas largas o de buzon?
Los agentes ya tienen 2 limites: duracion maxima de 15 min (max_call_duration_ms = 900000) y hangup en buzon (voicemail_option = {action: {type: "hangup"}}). Cambialos con client.agent.update(...).
Que pasa si algo deja de funcionar?
python scripts/status.py para ver el estado actual. python scripts/test_services.py para diagnosticar.
Como diagnostico una llamada que sono rara (silencios, cortes, latencia)?
python scripts/inspect_call.py <call_id> muestra: latencias LLM/TTS/E2E (p50/p90/p99/max), transcript con timestamps, gaps mayores a 2s marcados como
Alfred suena lento en la primera llamada del dia pero rapido despues. Por que?
Es el cache de prompts de OpenAI. Con un prompt grande (~50k chars) la primera llamada tiene LLM p99 ≈ 4s (silencios notables). Las siguientes bajan a p99 ≈ 1.4s gracias al cache. Soluciones: (1) hacer una llamada dummy para calentar el cache antes de la primera real, (2) activar enable_backchannel en el agente Retell para que Alfred emita "mhm" mientras GPT piensa, (3) comprimir las objeciones del knowledge (la seccion mas pesada, 25% del total).
Sistema construido por Diego Osorio para la comunidad Imperio.
Cerebro de venta + soporte para despliegues paralelos + correcciones para la API actual de Retell.