Sari la conținut
megapromotingHai să discutăm
Produse Kallina

Agenți vocali AI Platformă

Добра розмова продовжується дією.

Будуємо агентів, які приймають та ініціюють дзвінки, використовують інформацію бізнесу і працюють з вашими системами. Від першого запитання до повної заявки, підтвердження або передавання колезі.

AscultăVerificăAcționeazăVOCE + CONTEXT + ACȚIUNE
Cum funcționează Kallina

Kallina

Від інформації до зробленої роботи.

01

Ascultă

Розуміє запит у контексті розмови та правил бізнесу.

02

Verifică

Звертається до бази знань і дозволених інтеграцій, перш ніж відповісти.

03

Acționează

Заповнює дані, виконує дозволену дію або передає розмову людині.

Де це стає корисним.

Приймання дзвінків і підтримка

Часті запитання, приймання заявок і зворотні дзвінки тим, хто просив зв'язатися.

Замовлення та доставка

Підтвердження і координація — з даними з підключеної системи замовлень.

Кваліфікація та запис

Збирає потрібні деталі. Доступ до календаря і бронювання визначаються для кожної інтеграції.

Сценарії, номер телефону, мови та дії налаштовуються під кожне впровадження. За командою лишається можливість перехопити розмову.

Kallina в деталях

Що можна зробити з цим проєктом.

Kallina — це платформа, на якій ми будуємо агентів, що говорять телефоном і на вебсторінці. Агент має написану роль, затверджену базу знань, набір інструментів, які може викликати, і межу, за якою передає розмову людині. Розмова не закінчується транскриптом: дзвінок має тривалість, вартість за кожним провайдером, запис і розбір — усе прив'язане до облікового запису бізнесу.

Голосовий рушій не один. У конфігурації агента ви обираєте між ElevenLabs Conversational AI, OpenAI Realtime, Gemini Live або «auto» — тоді Kallina сама добирає провайдера за мовою, навантаженням і доступністю. Поверх цього окремо обирається текстовий «мозок»: каталог у коді містить 78 записів від OpenAI, Google, Anthropic, xAI та ElevenLabs, і в кожного в інтерфейсі показані затримка і вартість хвилини — щоб вибір був свідомий, а не з чуток.

Телефонія наша, а не орендована в постачальника голосу. Дзвінки йдуть через власний Asterisk, з маршрутизацією за годинами роботи і часовим поясом, нічним розкладом (наприклад, 22:00 → 06:00) і добором за пріоритетом: заголовок SIP Diversion, потім номер Kallina, потім резервне правило. Для OpenAI Realtime є міст AudioSocket, який конвертує кодек в обидва боки, g711_ulaw ↔ PCM16.

01

Три голосові провайдери плюс позиція «auto»

У `AGENT_PROVIDERS` чотири варіанти: `elevenlabs` (ConvAI), `openai-realtime`, `gemini-live` та `auto`. Для синтезу мовлення мовами, крім англійської, типово стоїть `eleven_flash_v2_5` — 32 мови, затримка близько 75 мс; якісніша альтернатива, `eleven_turbo_v2_5`, обходиться приблизно у 250 мс. Вибір не схований у коді — це поле в конфігурації агента.

02

Каталог моделей із показаними затримкою і вартістю

78 моделей у `LLM_MODELS`, згрупованих за провайдером в інтерфейсі разом із виміряною затримкою і вартістю хвилини — від `gpt-5-nano` з приблизно 806 мс і близько 0,0004 $/хв до `claude-sonnet-4-6` з приблизно 1,55 с і близько 0,0225 $/хв. Клієнт, який запитує «чому відповідає повільно», отримує відповідь із цифрами, а не думку.

03

Власна телефонія на Asterisk

Переадресація дзвінків налаштовується за робочими годинами і часовим поясом, з підтримкою нічного розкладу і добором за пріоритетом (заголовок SIP Diversion → номер Kallina → резервне правило). Міст `openai-realtime-bridge` виконує конвертацію AudioSocket між g711_ulaw і PCM16 для двостороннього аудіопотоку.

04

Голосовий embed в один рядок, без id агента на сторінці

`<script src="https://app.kallina.info/embed.js" data-widget="WIDGET_ID"></script>`. Сторінка ніколи не дізнається, який агент відповідає, і не тримає жодного ключа провайдера: вона просить у Kallina сесію, а Kallina повертає підписаний URL із коротким строком життя. Є і режим `data-mode="inline"`, у якому embed не малює взагалі нічого, а сторінка сама будує інтерфейс поверх API `start()` / `stop()` / `toggle()` / `on(event, fn)`.

05

Кампанії вихідних дзвінків

Обдзвін партіями по 1–10 одночасних дзвінків, імпорт контактів із CSV, логіка повторних спроб, стеження в реальному часі з паузою, відновленням і зупинкою, плюс наступне SMS.

06

Limbi

Конфігурація агента приймає 32 мови (`LANGUAGES`), повна карта мов платформи містить 41 запис, а панель адміністрування перекладена на 20 (`src/i18n/locales`). Румунська — мова за замовчуванням у `DEFAULT_VALUES`.

Дані та робота системи

Що потрапляє в систему. Що потрібно перевірити.

Де зберігаються дані
PostgreSQL через Supabase, з Row Level Security і pg_cron; 559 версіонованих міграцій. Серверна логіка — edge-функції на Deno, 472 у репозиторії на дату перевірки.
Що ніколи не потрапляє на сторінку клієнта
Ключ голосового провайдера та ідентифікатор агента. Embed робить `POST /functions/v1/widget-voice-session` з `widget_id` — публічним ключем із `chat_widget_configs.widget_id`, а не внутрішнім id рядка, — а сервер сам просить в ElevenLabs підписаний URL через `convai/conversation/get_signed_url` і повертає його. Старий варіант, який клав `agentId` просто в HTML, повністю обходив Kallina.
База знань
Документи, завантажені в платформу і синхронізовані з RAG ElevenLabs. Поверх них ставляться огорожі розмови, схеми збору даних і критерії оцінювання успішності дзвінка, задані для кожного агента.
Витрата рахується до, а не після
Таблиця `usage_events` тримає витрату з розбивкою за провайдером і агентом. Перед будь-якою платною дією функція `check-can-use` перевіряє кредит — ворота стоять перед дзвінком, а не в рахунку наприкінці місяця.

Від вивчення до впровадження

Як ми готуємо проєкт на Kallina.

01

Обираємо один маршрут і прописуємо його межі

Один сценарій із ясним входом і ясним виходом — вхідний дзвінок на ресепшн, підтвердження замовлення, кампанія обдзвону. Прямо пишемо, чого агентові робити не можна і яким шляхом він передає розмову людині.

02

Підключаємо номер і перевіряємо в обидва боки

Номер заводиться на SIP-транк нашого Asterisk. Вхідні та вихідні дзвінки тестуються окремо, бо й ламаються вони окремо: обмеження оператора на вихідні лишає вхідні працювати бездоганно.

03

Перевіряємо маршрут, не витрачаючи хвилин

`scripts/verify-voice-path.mjs` проходить рівно той шлях, що й браузер — рядок у конфігурації, `get-widget-config`, потім `widget-voice-session` — і зупиняється на підписаному URL, не відкриваючи websocket. Запускається на одному віджеті або на всіх з увімкненим голосом, по 1–3 паралельно, і повертає код виходу, тобто може стояти просто в cron.

Запитання, які варто прояснити.

Який саме голосовий рушій використовується?

Ви обираєте між ElevenLabs Conversational AI, OpenAI Realtime і Gemini Live або лишаєте «auto», і тоді вирішує Kallina — за мовою і доступністю. Для синтезу мовлення мовами, крім англійської, типово стоїть модель `eleven_flash_v2_5` — 32 мови, близько 75 мс; якщо потрібна вища якість і прийнятна більша затримка, `eleven_turbo_v2_5` — близько 250 мс. Голосів у OpenAI Realtime десять, а їхній рушій доходить до `gpt-realtime-2.1`.

Як поставити це на сайт?

Один рядок: `<script src="https://app.kallina.info/embed.js" data-widget="WIDGET_ID"></script>`, підключається як звичайний скрипт, не як модуль. Файл віддається вже сьогодні і важить 13 762 байти. Якщо потрібен свій інтерфейс, `data-mode="inline"` не малює нічого і лишає вам `start()`, `stop()`, `toggle()` та події `state`, `message`, `error`. Увага до хоста: файл лежить на `app.kallina.info`, а не на `kallina.info` — це два застосунки на двох різних серверах.

Чи витрачаються хвилини, якщо відвідувач відмовить у доступі до мікрофона?

Ні. Порядок в `embed.js` такий: завантажити SDK, попросити мікрофон через `getUserMedia({audio:true})`, і лише потім викликати `widget-voice-session`. Якщо людина відмовляє в мікрофоні, запит сесії не робиться взагалі — отже, підписаний URL не видається і нічого не витрачається.

Чи може він дзвонити першим, а не лише відповідати?

Так — обдзвін партіями, 1–10 одночасно, контакти з CSV, повторні спроби і наступне SMS. Але вихідні дзвінки залежать від телефонного оператора, а не лише від нас: у нашому реєстрі проблем задокументований випадок, коли станція оператора почала повертати `403 Forbidden` на всі вихідні — за незмінної нашої конфігурації і нормально працюючих вхідних. Тому вихідні ми тестуємо окремо, перш ніж обіцяти кампанію.

Скількома мовами говорить і скількома адмініструється?

Конфігурація агента приймає 32 мови, внутрішня карта мов містить 41 запис, а панель адміністрування перекладена на 20. Румунська — мова за замовчуванням для нових агентів.

Чи публікується автоматично за кожної зміни коду?

Ні, і це варто знати до планування запуску. GitHub-workflow у репозиторії націлений на проєкт Supabase Cloud, який було видалено, тому «push у main = публікація» перестало бути правдою після переїзду на власну інфраструктуру. Справжня публікація робиться через SSH — копіюванням і перезапуском. Практичний наслідок: термінова зміна потребує людини, а не лише коміту.

Що відбувається, якщо агент не знає відповіді?

Передавання людині — частина сценарію, а не виняток. Кожен агент має написані межі і шлях передавання, налаштований на телефонії; а в самій розмові є огорожі та критерії оцінювання успіху — саме щоб випадок поза роллю був зупинений, а не зімпровізований.

Ілюстративний приклад

Нічний вхідний дзвінок, який потрапляє куди треба

Сценарій використання — без клієнтських даних і без приписаних комерційних результатів.

Початкова ситуація

Хтось дзвонить на номер бізнесу о 23:40, поза робочим часом ресепшн.

Як це працює

Asterisk застосовує правило нічного розкладу (наприклад, 22:00 → 06:00) і добирає за пріоритетом: заголовок SIP Diversion, потім номер Kallina, потім резервне правило. Нічний агент відповідає через обраного в конфігурації провайдера, уточнює запит і викликає ті інструменти, які йому дозволені.

Rezultatul

Дзвінок лишається в історії з транскриптом, аудіозаписом, тривалістю і вартістю в розбивці за провайдером. Те, що виходить за роль агента, зупиняється і передається далі, замість того щоб бути зімпровізованим.

Ce este necesar:Numărul conectat pe trunkul SIP al Asterisk-ului nostru, apelurile ieșite permise de operator dacă se dorește și sunat înapoi, plus un agent cu prompt, bază de cunoștințe aprobată și limite scrise.

Можливості співпраці

Kallina в контексті вашої організації.

Інформування і приймання звернень

Голосова допомога на затвердженій інформації, з переходом до оператора і ясними правилами запису та зберігання розмов.

Приватні компанії

Визначаємо пілот навколо реального процесу: користувачі, дані, інтеграції, витрати і критерії приймання. Розширення — після оцінювання результату.

Державні установи та компанії

Визначаємо вимоги до доступності, розміщення, захисту даних та інтероперабельності. Будь-яке підключення до сервісів AGE (Агентство електронного урядування Молдови) або STISC (Служба інформаційних технологій і кібербезпеки) потребує підтвердження права на доступ, самого доступу і погоджень.

Це сценарії адаптації, а не заяви про наявні контракти чи партнерства. Запропоновані функції підтверджуються в обсязі робіт за проєктом.

Discută un pilot

Частина екосистеми.

Що вам хотілося б налагодити?

Розкажіть про свій процес. Разом визначимо, що варто збудувати, що можна підключити і як перевіримо результат.

Hai să discutăm