Огляд
Клієнт керує кол-центром продажів і підтримки та фактично «тонув» у необробленому аудіо. Записи розмов потрапляли на FTP-сервер, але керівники не мали способу — окрім прослуховування сотень MP3 щодня — зрозуміти, які дзвінки були якісними, які порушили скрипт, а які залишили клієнта незадоволеним.
Потрібен був єдиний внутрішній веб-застосунок, який автоматично приймає кожен дзвінок від телефонного провайдера, транскрибує його, оцінює за конфігурованим списком питань якості та представляє результати у швидкому дашборді з фільтрами, з яким реально можна працювати.

Мій внесок
Я спроєктував і реалізував усю систему від початку до кінця на Go.
Бекенд і пайплайн
Webhook-ендпоінт (POST /call) приймає метадані дзвінків, які надсилає телефонний провайдер, і ставить фонові задачі в чергу. П’ять незалежних фонових воркерів, кожен спирається на чергу в БД зі статусами pending → done / failed, лічильниками спроб, логікою повторів та збереженням помилок по кожному завданню:
- Duration worker — підключається до FTP клієнта, потоково читає MP3 і визначає реальну тривалість аудіо.
- Transcription worker — надсилає аудіо до AssemblyAI і зберігає транскрипт, з захистом від «надто коротких» записів.
- AI evaluation worker — формує промпт із транскрипту та динамічного списку питань якості, керованих через UI, викликає OpenAI, валідує структуровану JSON-відповідь і зберігає її з хешем для детекту змін (повторна оцінка запускається лише тоді, коли реально змінилися вхідні дані).
- Webhook log cleanup worker — застосовує гнучку політику зберігання логів вебхуків.
- Error log cleanup worker — те саме для історії помилок.
Веб-застосунок
- HTTP-шар на Echo v4 з чітким поділом handler → service → repository.
- Серверний рендеринг UI на Templ (компільовані типобезпечні Go-шаблони) — без накладних витрат SPA, швидкий перший рендер.
- DataTables з повноцінним server-side processing (пагінація, фільтрація, сортування виконуються в PostgreSQL, а не в браузері) для таблиць дзвінків та логів вебхуків.
- Налаштування видимості колонок зберігаються окремо для кожного користувача в БД — кожен менеджер бачить свій звичний вид.
- Рольовий доступ (адміністратор / звичайний користувач), сесії в Redis через
scs, безпечний флоу зміни пароля. - Налаштування у самому застосунку для ключів AssemblyAI, моделі та параметрів OpenAI, питань AI та зберігання логів — тонке налаштування пайплайну без жодних редеплоїв.
- Вбудоване відтворення MP3, що проксується з FTP, — менеджер слухає дзвінок поряд із транскриптом та AI-оцінкою.

Інфраструктура
- PostgreSQL (
sqlx) з 25+ версіонованими міграціями, що застосовуються автоматично при старті черезgolang-migrate. - Redis для сесій.
- Docker Compose для локальної розробки; один бінарник для продакшну.
- Робота з часовою зоною (Europe/Kyiv), структурне логування через
logrus.

Налаштування з UI
Кожну частину пайплайна можна підлаштувати з інтерфейсу — без редеплоїв. Керівники задають ключі AssemblyAI, параметри моделі OpenAI, мінімальну тривалість аудіо, типи маршрутів транскрибування та політику зберігання логів прямо в екрані налаштувань.

Список AI-питань якості — це окрема CRUD-сутність. Додати новий критерій («чи привітався оператор?», «чи був конфлікт?», «чи запропонували TG-бот?») — питання секунд: вводимо у відповідний екран — і наступна партія дзвінків уже оцінюється за ним.

Технологічний стек
| Шар | Технологія |
|---|---|
| Мова | Go (Golang) |
| HTTP-фреймворк | Echo v4 |
| Рендеринг UI | Templ (компільовані типобезпечні Go-шаблони) |
| База даних | PostgreSQL із sqlx, 25+ версіонованих міграцій через golang-migrate |
| Сесії | Redis (через scs) |
| AI / ML | OpenAI API, AssemblyAI |
| Інтеграції | Приймання аудіо з FTP, вебхуки телефонії |
| Frontend-інтерактив | DataTables зі server-side processing |
| Інфраструктура | Docker Compose, продакшн-деплой одним бінарником |
| Спостережуваність | Структурне логування logrus, часова зона Europe/Kyiv |
Результат
Замість годин ручного прослуховування клієнт отримав автоматизований пайплайн, який обробляє кожен записаний дзвінок упродовж кількох хвилин після появи файлу на FTP.
- Керівники відкривають єдиний дашборд, фільтрують за датою, оператором або вердиктом AI — і відразу провалюються до транскрипту з оцінками по кожному питанню.
- Додати новий критерій якості — секунди: ввели питання в UI налаштувань, і наступний пакет дзвінків уже оцінюється з його урахуванням.
- Платформа стабільно працює в продакшні та є основним інструментом команди для контролю якості розмов.