Especialização · Telefonia e contact center
A camada de telefonia entre o seu operador e quem responde — humano ou agente.
Construímos a central: trunks SIP, regras de encaminhamento por horário, menus IVR lidos da base de dados, filas de espera, transferência para um humano, gravação e análise das chamadas. A chamada torna-se um registo com transcript e resumo, não uma memória.
Já construídoTrês implementações próprias, citadas abaixo. (1) A camada Asterisk na plataforma Kallina: 5.522 linhas de configuração de dialplan, scripts AGI e pontes de áudio em `asterisk/`, além de modelos de trunk gerados automaticamente por número. (2) `asterisk-manager` — um serviço separado que administra filas, trunks e o fluxo RTP através da interface de gestão da central. (3) O middleware para a central virtual de um operador, que correu em produção: o commit de reconciliação de 14 de julho de 2026 traz para o repositório código que tinha corrido no servidor e estava cerca de 40 dias à frente do git. A reserva, dita antes de perguntar: o anfitrião SIP pelo qual passam as nossas linhas de teste não responde — verificado hoje, 06.09.2026, sem resposta ao ping e sem resposta no HTTP. Não apresentamos um número de demonstração para ligar agora, porque não o poderíamos colocar em funcionamento diante de você.
Entre o seu operador de telefonia e quem responde efetivamente — uma pessoa ou um agente vocal — tem de existir uma camada que toma decisões. Quem recebe a chamada às 23:40. O que acontece se ninguém responder. Para onde vai a chamada quando o cliente pede «uma pessoa». O que fica da conversa depois de ela terminar. Esta camada é uma central, e nós construímo-la para ser da empresa, não do fornecedor de voz: se amanhã mudar o motor do agente, as regras de routing, as filas e o histórico continuam consigo.
Concretamente, o que construímos: doze ficheiros de dialplan — produção, IVR, fila, transferência, voicemail, redirecionamento, chamadas de saída com agente — quatro scripts AGI em Python e duas pontes de áudio, no total 5.522 linhas. O motor de IVR não tem os menus escritos no ficheiro: lê-os da base através de um script AGI e devolve uma de seis decisões — para um agente, para outro menu, para uma fila, transferência para um número externo, mensagem final, ou encerramento. As filas têm o nome do respetivo identificador e não têm membros escritos na configuração: são adicionados e removidos do exterior, através da interface de gestão, o que significa que um operador pode entrar ou sair da fila sem reiniciar a central.
O encaminhamento tem regras reais, não apenas um único «ligue aqui»: horários de funcionamento e fuso horário, funcionamento nocturno do tipo 22:00 → 06:00, e correspondência por prioridade — o cabeçalho SIP `Diversion`, que transporta o número original de onde a chamada foi reencaminhada, depois o próprio número, depois a regra de reserva. Os trunks são gerados por número, com nome construído a partir do fornecedor e do número, por uma função de configuração — não escritos à mão em cada nova linha.
O que sai da chamada é tão importante como a chamada. Para a linha ligada à central virtual de um operador, construí um middleware em Python que consulta a lista de registos a cada minuto, com uma reconciliação ampla a cada seis horas para que uma falha de rede não perca nada, e uma varredura a cada três minutos das chamadas perdidas — essas não têm registo e, de outro modo, seriam completamente invisíveis. Cada registo é descarregado, transcrito, analisado e espelhado na análise de chamadas, e a chamada perdida torna-se um alerta. A idempotência está num conjunto Redis, para que o mesmo registo não seja processado duas vezes.