Experiencia · Telefonía y contact center
La capa de telefonía entre tu operador y quien responde — humano o agente.
Construimos la central: trunkes SIP, reglas de enrutamiento por horario, menús IVR leídos desde la base de datos, colas de espera, transferencia a una persona, grabación y análisis de las llamadas. La llamada se convierte en un registro con transcript y resumen, no en un recuerdo.
Ya construidoTres implementaciones propias, citadas abajo. (1) La capa Asterisk de la plataforma Kallina: 5.522 líneas de configuración de dialplan, scripts AGI y puentes de audio en `asterisk/`, más plantillas de trunk generadas automáticamente por número. (2) `asterisk-manager` — un servicio aparte que administra las colas, los trunks y el flujo RTP mediante la interfaz de gestión de la central. (3) El middleware para la central virtual de un operador, que se ejecutó en producción: el commit de reconciliación del 14 de julio de 2026 incorpora al repositorio código que se había ejecutado en el servidor y estaba con unos 40 días de adelanto respecto al git. La reserva, dicha antes de que preguntes: el host SIP por el que pasan nuestras líneas de prueba no responde — verificado hoy, 06.09.2026, sin respuesta al ping y sin respuesta por HTTP. No presentamos un número de demostración al que puedas llamar ahora, porque no podríamos levantarlo ante ti.
Entre tu operador de telefonía y quien responde realmente — una persona o un agente vocal — tiene que existir una capa que tome decisiones. Quién recibe la llamada a las 23:40. Qué ocurre si nadie responde. A dónde va la llamada cuando el cliente pide «una persona». Qué queda de la conversación después de que se cuelga. Esa capa es una central, y nosotros la construimos para que sea del negocio, no del proveedor de voz: si mañana cambias el motor del agente, las reglas de enrutamiento, las colas y el historial se quedan contigo.
Concretamente, qué hemos construido: doce archivos de dialplan — producción, IVR, cola, transferencia, voicemail, redirección, llamadas salientes con agente — cuatro scripts AGI en Python y dos puentes de audio, en total 5.522 líneas. El motor de IVR no tiene los menús escritos en el archivo: los lee de la base mediante un script AGI y devuelve una de seis decisiones — hacia un agente, hacia otro menú, hacia una cola, transferencia a un número externo, mensaje final, o cierre. Las colas se nombran según su identificador y no tienen miembros escritos en la configuración: se añaden y se quitan desde fuera, mediante la interfaz de gestión, lo que significa que un operador puede entrar o salir de la cola sin reiniciar la central.
El enrutamiento tiene reglas reales, no un solo «llama aquí»: horarios de atención y zona horaria, horario nocturno del tipo 22:00 → 06:00, y coincidencia por prioridad — el encabezado SIP `Diversion`, que lleva el número original desde el que se desvió la llamada, luego el número propio, luego la regla de reserva. Los trunks se generan por número, con un nombre construido a partir del proveedor y el número, por una función de configuración — no escritos a mano en cada nueva línea.
Lo que sale de la llamada es tan importante como la llamada. Para la línea vinculada a la central virtual de un operador construimos un middleware en Python que consulta la lista de registros cada minuto, con una reconciliación amplia cada seis horas para que un corte de red no pierda nada, y un escaneo cada tres minutos de las llamadas perdidas — esas no tienen registro y, de otro modo, serían completamente invisibles. Cada registro se descarga, se transcribe, se analiza y se refleja en el análisis de llamadas, y la llamada perdida se convierte en una alerta. La idempotencia está en un set de Redis, para que el mismo registro no se procese dos veces.