Експертиза · Телефонія та контакт-центр
Шар телефонії між вашим оператором і тим, хто відповідає — людиною чи агентом.
Ми будуємо центральний вузол: SIP-транки, правила маршрутизації за графіком, IVR-меню, зчитувані з бази, черги очікування, переадресацію на людину, запис і аналіз дзвінків. Дзвінок стає записом із транскриптом і резюме, а не спогадом.
Вже збудованоТри власні реалізації, наведені нижче. (1) Шар Asterisk у платформі Kallina: 5.522 рядки конфігурації dialplan, AGI-скрипти та аудіомости в `asterisk/`, плюс шаблони trunk, що автоматично генеруються для кожного номера. (2) `asterisk-manager` — окремий сервіс, який адмініструє черги, trunk-и та RTP-потік через інтерфейс керування станції. (3) Middleware для віртуальної станції оператора, який працював у production: коміт reconciliation від 14 липня 2026 року приносить у репозиторій код, що вже працював на сервері й був приблизно на 40 днів раніше git-а. Резерв, сказаний до того, як ви спитаєте: SIP-хост, через який проходять наші тестові лінії, не відповідає — перевірено сьогодні, 06.09.2026, без відповіді на ping і без відповіді по HTTP. Ми не показуємо демо-номер, на який можна зараз подзвонити, бо ми не змогли б підняти його перед вами.
Між вашим телефонним оператором і тим, хто фактично відповідає — людиною чи голосовим агентом — має існувати шар, який ухвалює рішення. Хто приймає дзвінок о 23:40. Що відбувається, якщо ніхто не відповідає. Куди йде дзвінок, коли клієнт просить «людину». Що лишається від розмови після її завершення. Цей шар — це АТС, і ми будуємо його так, щоб він був власністю бізнесу, а не голосового постачальника: якщо завтра ви зміните движок агента, правила маршрутизації, черги й історія залишаться у вас.
Конкретно, що ми побудували: дванадцять файлів dialplan — продакшен, IVR, черга, переадресація, voicemail, перенаправлення, вихідні дзвінки з агентом — чотири скрипти AGI в Python і два аудіомости, разом 5.522 рядки. Двигун IVR не має меню, записаних у файлі: він читає їх із бази через скрипт AGI і повертає одне з шести рішень — до агента, до іншого меню, до черги, переадресацію на зовнішній номер, фінальне повідомлення або завершення. Черги називаються за своїм ідентифікатором і не мають членів, записаних у конфігурації: їх додають і вилучають ззовні, через інтерфейс керування, що означає, що оператор може увійти або вийти з черги без перезапуску АТС.
Маршрутизація має справжні правила, а не одне «дзвонити сюди»: години роботи й часовий пояс, нічний графік на кшталт 22:00 → 06:00, і зіставлення за пріоритетом — SIP-заголовок `Diversion`, який містить оригінальний номер, з якого переадресовано дзвінок, потім власний номер, потім резервне правило. Trunk-и генеруються для кожного номера, з назвою, побудованою з постачальника й номера, функцією конфігурації — не записуються вручну для кожного нового рядка.
Те, що виходить з дзвінка, так само важливе, як і сам дзвінок. Для лінії, пов’язаної з віртуальною АТС оператора, ми побудували middleware на Python, який опитує список записів щохвилини, з широкою звіркою кожні шість годин, щоб мережевий збій нічого не втратив, і перевіркою кожні три хвилини пропущених дзвінків — у них немає запису, інакше вони були б повністю невидимі. Кожен запис завантажується, транскрибується, аналізується і віддзеркалюється в аналітиці дзвінків, а пропущений дзвінок стає сповіщенням. Ідемпотентність тримається в наборі Redis, щоб один і той самий запис не оброблявся двічі.