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 construidoTrei implementări proprii, citate mai jos. (1) Stratul Asterisk din platforma Kallina: 5.522 de linii de configurație de dialplan, scripturi AGI și punți audio în `asterisk/`, plus șabloane de trunk generate automat per număr. (2) `asterisk-manager` — un serviciu separat care administrează cozile, trunkurile și fluxul RTP prin interfața de management a centralei. (3) Middleware-ul pentru centrala virtuală a unui operator, care a rulat în producție: commitul de reconciliere din 14 iulie 2026 aduce în depozit cod care rulase pe server și era cu circa 40 de zile înaintea git-ului. Rezerva, spusă înainte să întrebi: gazda SIP prin care trec liniile noastre de test nu răspunde — verificat azi, 06.09.2026, fără răspuns la ping și fără răspuns pe HTTP. Nu prezentăm un număr de demonstrație pe care să suni acum, pentru că nu l-am putea ridica în fața ta.
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.