Skip to content

Repository files navigation

Alfred — Sistema de Agente de Voz con IA para Imperio

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).


Que hace este sistema

  1. Contesta llamadas y llama leads como un setter experto las 24 horas.
  2. Descubre el dolor del prospecto con preguntas estrategicas antes de pitchar.
  3. Despierta deseo de compra activando meta-dolor + dolores operativos + dolores identitarios.
  4. Resuelve objeciones con 14+ respuestas listas (precio, "es estafa", "ya tengo ChatGPT", etc.).
  5. Agenda la llamada estrategica con dia y hora concretos en Cal.com (cierre asumido).
  6. Guarda todo en Supabase (lead + transcripcion + analisis post-llamada con Claude).
  7. Puede hacer hand-off en vivo a un humano del equipo si el lead viene muy caliente.

Stack tecnico

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

Estructura del proyecto

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

Iteracion rapida del prompt (lo mas importante)

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.py

Esto ejecuta:

  1. Lee alfred.config.yaml + template infoproductos.yaml
  2. Compone el prompt con todas las reglas universales
  3. client.llm.update(llm_id, general_prompt=...) al LLM existente
  4. client.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.


Despliegues paralelos en el mismo repo

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.


Costos de operacion

  • 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.


Reglas criticas aprendidas en produccion

Estas son las gotchas que evitan reventar el sistema (todas estan documentadas en CLAUDE.md):

  1. 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().
  2. Inyecta {{current_time_America/Bogota}} y {{current_calendar}} en el prompt outbound, o el modelo no sabe la fecha de hoy.
  3. 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.
  4. NUNCA pidas el correo en la llamada. Viene del registro a la landing. Deletrearlo en voz introduce errores constantes.
  5. Limites en TODOS los agentes: max_call_duration_ms = 900000 (15 min cap) y voicemail_option = {action: {type: "hangup"}} (cuelga al detectar buzon).
  6. Windows: forzar PYTHONUTF8=1 al correr scripts (la consola cp1252 rompe emojis).

Preguntas frecuentes

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 ⚠️ SILENCIO, disconnection_reason y URL de la grabacion. Util cuando el lead te dice "se quedo mudo un momento" — te dice exactamente cuando paso y si fue latencia del LLM, el lead pensando, o un bug del parser.

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).


Creditos

Sistema construido por Diego Osorio para la comunidad Imperio.

Cerebro de venta + soporte para despliegues paralelos + correcciones para la API actual de Retell.

About

Agente de voz IA (Alfred) que llama a leads de Imperio en el primer minuto + sistema completo de setter para automatizar ventas. Fork privado de santmun/mega-sistema-ia con cerebro propio de Diego.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages