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