Ekspertyza · Telefonia i contact center
Warstwa telefonii między Twoim operatorem a osobą, która odbiera — człowiekiem albo agentem.
Budujemy centralę: trunky SIP, reguły routingu według harmonogramu, menu IVR odczytywane z bazy, kolejki oczekiwania, przekierowanie do człowieka, nagrywanie i analiza połączeń. Połączenie staje się nagraniem z transkrypcją i podsumowaniem, a nie wspomnieniem.
Już zbudowaneTrzy własne implementacje, cytowane poniżej. (1) Warstwa Asterisk w platformie Kallina: 5.522 linii konfiguracji dialplan, skryptów AGI i mostów audio w `asterisk/`, plus szablony trunków generowane automatycznie dla każdego numeru. (2) `asterisk-manager` — osobna usługa, która zarządza kolejkami, trunkami i strumieniem RTP przez interfejs zarządzania centrali. (3) Middleware dla wirtualnej centrali operatora, który działał w produkcji: commit reconciling z 14 lipca 2026 wprowadza do repozytorium kod, który działał na serwerze i był o około 40 dni przed gitem. Zastrzeżenie, powiedziane zanim zapytasz: host SIP, przez który przechodzą nasze linie testowe, nie odpowiada — sprawdzone dziś, 06.09.2026, bez odpowiedzi na ping i bez odpowiedzi po HTTP. Nie prezentujemy numeru demonstracyjnego, pod który można teraz zadzwonić, ponieważ nie moglibyśmy go uruchomić przed Tobą.
Między Twoim operatorem telefonii a osobą, która faktycznie odbiera — człowiekiem lub agentem głosowym — musi istnieć warstwa, która podejmuje decyzje. Kto odbiera połączenie o 23:40. Co się dzieje, jeśli nikt nie odbiera. Gdzie trafia połączenie, gdy klient prosi o „człowieka”. Co zostaje z rozmowy po jej zakończeniu. Ta warstwa to centrala, a my budujemy ją tak, aby była własnością biznesu, a nie dostawcy głosu: jeśli jutro zmienisz silnik agenta, reguły routingu, kolejki i historia pozostają u Ciebie.
Konkretnie, co zbudowaliśmy: dwanaście plików dialplanu — produkcja, IVR, kolejka, transfer, voicemail, przekierowanie, połączenia wychodzące z agentem — cztery skrypty AGI w Pythonie i dwa mostki audio, łącznie 5.522 linii. Silnik IVR nie ma menu zapisanych w pliku: czyta je z bazy przez skrypt AGI i zwraca jedną z sześciu decyzji — do agenta, do innego menu, do kolejki, transfer na numer zewnętrzny, komunikat końcowy albo zamknięcie. Kolejki są nazwane według swojego identyfikatora i nie mają członków wpisanych w konfigurację: dodaje się ich i usuwa z zewnątrz, przez interfejs zarządzania, co oznacza, że operator może wejść do kolejki lub z niej wyjść bez restartu centrali.
Trasowanie ma rzeczywiste reguły, a nie jedno „dzwoń tutaj”: godziny pracy i strefa czasowa, tryb nocny typu 22:00 → 06:00 oraz dopasowanie według priorytetu — nagłówek SIP `Diversion`, który niesie oryginalny numer, z którego przekierowano połączenie, potem własny numer, a potem reguła rezerwowa. Trunki są generowane per numer, z nazwą zbudowaną z dostawcy i numeru, przez funkcję konfiguracji — nie wpisywane ręcznie przy każdej nowej linii.
To, co wychodzi z połączenia, jest równie ważne jak samo połączenie. Dla linii powiązanej z wirtualną centralą operatora zbudowaliśmy middleware w Pythonie, który odpyta listę nagrań co minutę, z szeroką rekoncyliacją co sześć godzin, aby awaria sieci niczego nie zgubiła, oraz skan co trzy minuty połączeń nieodebranych — te nie mają nagrania i inaczej byłyby całkowicie niewidoczne. Każde nagranie jest pobierane, transkrybowane, analizowane i odzwierciedlane w analizie połączeń, a połączenie nieodebrane staje się alertem. Idempotencja opiera się na zbiorze Redis, aby to samo nagranie nie zostało przetworzone dwa razy.