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

Agenți vocali AI Platformă

Dobra rozmowa przechodzi w działanie.

Budujemy agentów, którzy odbierają i inicjują połączenia, korzystają z wiedzy firmy i pracują z Twoimi systemami. Od pierwszego pytania po kompletne zgłoszenie, potwierdzenie albo przekazanie rozmowy człowiekowi.

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

Kallina

Od informacji do zrobionej roboty.

01

Ascultă

Rozumie prośbę w kontekście rozmowy i reguł firmy.

02

Verifică

Zanim odpowie, sięga do bazy wiedzy i autoryzowanych integracji.

03

Acționează

Uzupełnia dane, wykonuje dozwoloną akcję albo przekazuje rozmowę człowiekowi.

Gdzie zaczyna być przydatna.

Recepcja i wsparcie

Najczęstsze pytania, przyjmowanie zgłoszeń i oddzwanianie do osób, które o to poprosiły.

Zamówienia i dostawy

Potwierdzenia i koordynacja, na danych z podłączonego systemu zamówień.

Kwalifikacja i umawianie terminów

Zbiera potrzebne szczegóły. Dostęp do kalendarza i samą rezerwację ustalamy osobno przy każdej integracji.

Scenariusze, numer telefonu, języki i dozwolone akcje konfigurujemy dla każdego wdrożenia osobno. Zespół zachowuje możliwość przejęcia rozmowy.

Kallina w szczegółach

Co da się zrobić z tym projektem.

Kallina to platforma, na której budujemy agentów rozmawiających przez telefon i na stronie internetowej. Agent ma spisaną rolę, zatwierdzoną bazę wiedzy, zestaw narzędzi, które wolno mu wywołać, i granicę, za którą oddaje rozmowę człowiekowi. Rozmowa nie kończy się na transkrypcji: połączenie ma czas trwania, koszt w rozbiciu na dostawców, nagranie i analizę — wszystko powiązane z kontem firmy.

Silnik głosowy nie jest jeden. W konfiguracji agenta wybierasz między ElevenLabs Conversational AI, OpenAI Realtime, Gemini Live albo „auto”, gdzie Kallina sama dobiera dostawcę zależnie od języka, obciążenia i dostępności. Osobno wybierasz mózg tekstowy — katalog w kodzie ma 78 pozycji od OpenAI, Google, Anthropic, xAI i ElevenLabs, każda z latencją i kosztem za minutę pokazanymi w interfejsie, żeby wybór był świadomy, a nie zasłyszany.

Telefonię prowadzimy sami, nie wynajmujemy jej od dostawcy głosu. Połączenia idą przez własnego Asteriska, z routingiem po godzinach pracy i strefie czasowej, harmonogramem nocnym (na przykład 22:00 → 06:00) i dopasowaniem po priorytecie: nagłówek SIP Diversion, potem numer Kallina, potem reguła zapasowa. Dla OpenAI Realtime działa mostek AudioSocket, który konwertuje kodek w obie strony, g711_ulaw ↔ PCM16.

01

Trzej dostawcy głosu plus pozycja „auto”

W `AGENT_PROVIDERS` są cztery opcje: `elevenlabs` (ConvAI), `openai-realtime`, `gemini-live` i `auto`. Dla syntezy mowy w językach innych niż angielski domyślny jest `eleven_flash_v2_5` — 32 języki, około 75 ms latencji; lepszy jakościowo `eleven_turbo_v2_5` kosztuje około 250 ms. Wybór nie jest schowany w kodzie, to pole w konfiguracji agenta.

02

Katalog modeli z pokazaną latencją i kosztem

78 modeli w `LLM_MODELS`, pogrupowanych w interfejsie po dostawcy, razem ze zmierzoną latencją i kosztem za minutę — od `gpt-5-nano` przy około 806 ms i mniej więcej 0,0004 $/min, po `claude-sonnet-4-6` przy około 1,55 s i mniej więcej 0,0225 $/min. Klient, który pyta „dlaczego odpowiada wolno”, dostaje odpowiedź z liczbami, a nie opinię.

03

Własna telefonia na Asterisku

Przekierowanie połączeń konfiguruje się po godzinach pracy i strefie czasowej, z obsługą harmonogramu nocnego i dopasowaniem po priorytecie (nagłówek SIP Diversion → numer Kallina → reguła zapasowa). Mostek `openai-realtime-bridge` odpowiada za konwersję AudioSocket między g711_ulaw a PCM16 dla dwukierunkowego strumienia audio.

04

Osadzenie głosu w jednej linii, bez id agenta na stronie

`<script src="https://app.kallina.info/embed.js" data-widget="WIDGET_ID"></script>`. Strona nigdy nie dowiaduje się, który agent odpowiada, i nie trzyma żadnego klucza dostawcy: prosi Kallinę o sesję, a Kallina zwraca krótkotrwały podpisany URL. Jest też tryb `data-mode="inline"`, w którym osadzenie nie rysuje zupełnie niczego, a strona buduje własny interfejs na API `start()` / `stop()` / `toggle()` / `on(event, fn)`.

05

Kampanie połączeń wychodzących

Dzwonienie partiami, 1–10 połączeń równocześnie, import kontaktów z CSV, logika ponawiania, podgląd na żywo z pauzą, wznowieniem i zatrzymaniem, plus follow-up SMS-em.

06

Limbi

Konfiguracja agenta przyjmuje 32 języki (`LANGUAGES`), pełna mapa języków platformy ma 41 pozycji, a panel administracyjny jest przetłumaczony na 20 (`src/i18n/locales`). Rumuński jest językiem domyślnym w `DEFAULT_VALUES`.

Dane i działanie

Co wchodzi do systemu. Co trzeba sprawdzić.

Gdzie leżą dane
PostgreSQL przez Supabase, z Row Level Security i pg_cron; 559 wersjonowanych migracji. Logika serwerowa to funkcje edge w Deno — 472 w repozytorium na dzień weryfikacji.
Co nigdy nie trafia na stronę klienta
Klucz dostawcy głosu i identyfikator agenta. Osadzenie wysyła `POST /functions/v1/widget-voice-session` z `widget_id` — publicznym kluczem z `chat_widget_configs.widget_id`, a nie wewnętrznym id wiersza — a serwer sam prosi ElevenLabs o podpisany URL przez `convai/conversation/get_signed_url` i go zwraca. Stary wariant, który wstawiał `agentId` wprost do HTML-a, omijał Kallinę całkowicie.
Baza wiedzy
Dokumenty wgrane do platformy, zsynchronizowane z RAG-iem ElevenLabs. Na nich zakładamy bariery rozmowy, schematy zbierania danych i kryteria oceny udanego połączenia, definiowane osobno dla każdego agenta.
Zużycie mierzone przed, nie po
Tabela `usage_events` trzyma zużycie w rozbiciu na dostawcę i agenta. Przed każdą płatną akcją funkcja `check-can-use` sprawdza saldo — bramka stoi przed połączeniem, a nie na fakturze na koniec miesiąca.

Od rozpoznania do wdrożenia

Jak przygotowujemy projekt z Kalliną.

01

Wybieramy jedną ścieżkę i wyznaczamy jej granice

Jeden scenariusz z jasnym wejściem i jasnym wyjściem — odebrane połączenie na recepcji, potwierdzenie zamówienia, kampania wychodząca. Spisujemy wprost, czego agentowi nie wolno i którą drogą oddaje rozmowę człowiekowi.

02

Podłączamy numer i testujemy w obie strony

Numer wchodzi na trunk SIP naszego Asteriska. Połączenia przychodzące i wychodzące testujemy osobno, bo osobno się psują: ograniczenie operatora na ruchu wychodzącym zostawia przychodzący w idealnym stanie.

03

Sprawdzamy ścieżkę bez zużywania minut

`scripts/verify-voice-path.mjs` przechodzi dokładnie tę drogę co przeglądarka — wiersz konfiguracji, `get-widget-config`, potem `widget-voice-session` — i zatrzymuje się na podpisanym URL-u, nie otwierając websocketu. Działa na pojedynczym widżecie albo na wszystkich z aktywnym głosem, po 1–3 równolegle, i zwraca kod wyjścia, więc wchodzi wprost do crona.

Pytania, które warto wyjaśnić.

Z jakiego silnika głosowego korzysta, konkretnie?

Wybierasz między ElevenLabs Conversational AI, OpenAI Realtime i Gemini Live, albo zostawiasz „auto” i decyduje Kallina, po języku i dostępności. Dla syntezy mowy w językach innych niż angielski domyślny jest model `eleven_flash_v2_5` — 32 języki, w okolicach 75 ms; jeśli chcesz wyższej jakości i godzisz się na większe opóźnienie, `eleven_turbo_v2_5` to około 250 ms. Głosów OpenAI Realtime jest dziesięć, a ich silnik sięga `gpt-realtime-2.1`.

Jak się to wstawia na stronę?

Jedna linia: `<script src="https://app.kallina.info/embed.js" data-widget="WIDGET_ID"></script>`, ładowana jako zwykły skrypt, nie jako moduł. Plik jest serwowany dzisiaj i ma 13 762 bajty. Jeśli chcesz własnego interfejsu, `data-mode="inline"` nie rysuje nic i zostawia Ci `start()`, `stop()`, `toggle()` oraz zdarzenia `state`, `message`, `error`. Uwaga na hosta: plik leży na `app.kallina.info`, a nie na `kallina.info` — to dwie aplikacje na dwóch różnych serwerach.

Czy zużywają się minuty, gdy odwiedzający odmówi dostępu do mikrofonu?

Nie. Kolejność w `embed.js` jest taka: ładuje SDK, prosi o mikrofon przez `getUserMedia({audio:true})` i dopiero potem wywołuje `widget-voice-session`. Jeśli człowiek odmówi mikrofonu, żądanie sesji w ogóle nie powstaje, więc nie wydaje się żaden podpisany URL i nic się nie zużywa.

Czy może zadzwonić pierwsza, a nie tylko odbierać?

Tak — dzwonienie partiami, 1–10 równocześnie, kontakty z CSV, ponowienia i follow-up SMS-em. Ale połączenia wychodzące zależą od operatora telekomunikacyjnego, nie tylko od nas: w naszym rejestrze problemów jest udokumentowany przypadek, w którym centrala operatora zaczęła zwracać `403 Forbidden` na wszystkich połączeniach wychodzących, przy niezmienionej konfiguracji po naszej stronie i przy poprawnie działających połączeniach przychodzących. Dlatego ruch wychodzący testujemy osobno, zanim obiecamy kampanię.

W ilu językach mówi, a w ilu się ją administruje?

Konfiguracja agenta przyjmuje 32 języki, wewnętrzna mapa języków ma 41 pozycji, a panel administracyjny jest przetłumaczony na 20. Rumuński jest domyślnym językiem nowych agentów.

Czy każda zmiana w kodzie publikuje się automatycznie?

Nie, i warto to wiedzieć przed planowaniem premiery. Workflow GitHub w repozytorium celuje w projekt Supabase Cloud, który został usunięty, więc „push na main = publikacja” przestało być prawdą po przejściu na własną infrastrukturę. Realna publikacja idzie przez SSH, przez skopiowanie plików i restart. Praktyczna konsekwencja: pilna zmiana potrzebuje człowieka, nie samego commita.

Co się dzieje, gdy agent nie zna odpowiedzi?

Przekazanie człowiekowi jest częścią scenariusza, nie wyjątkiem. Każdy agent ma spisane granice i skonfigurowaną na telefonii drogę przekazania; w samej rozmowie są bariery i kryteria oceny, właśnie po to, żeby sprawa spoza roli została zatrzymana, a nie zaimprowizowana.

Przykład poglądowy

Nocne połączenie, które trafia tam, gdzie trzeba

Scenariusz użycia, bez danych klienta i bez przypisanych wyników handlowych.

Sytuacja wyjściowa

Ktoś dzwoni na numer firmy o 23:40, poza godzinami pracy recepcji.

Jak to działa

Asterisk stosuje regułę harmonogramu nocnego (na przykład 22:00 → 06:00) i dopasowuje po priorytecie: nagłówek SIP Diversion, potem numer Kallina, potem reguła zapasowa. Nocny agent odbiera na dostawcy wybranym w konfiguracji, doprecyzowuje prośbę i wywołuje narzędzia, których wolno mu użyć.

Rezultatul

Połączenie zostaje w historii z transkrypcją, nagraniem, czasem trwania i kosztem w rozbiciu na dostawców. To, co wykracza poza rolę agenta, zostaje zatrzymane i przekazane dalej, zamiast być improwizowane.

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.

Możliwości współpracy

Kallina w kontekście Twojej organizacji.

Informacja i przyjmowanie zgłoszeń

Obsługa głosowa na zatwierdzonych informacjach, z przekazaniem do operatora i jasnymi regułami nagrywania oraz przechowywania rozmów.

Firmy prywatne

Definiujemy pilotaż wokół realnego procesu: użytkownicy, dane, integracje, koszty i kryteria odbioru. Rozszerzenie przychodzi po ocenie wyniku.

Instytucje publiczne i spółki skarbu państwa

Ustalamy wymagania dotyczące dostępności, hostingu, ochrony danych i interoperacyjności. Każde połączenie z usługami AGE — Agenția de Guvernare Electronică, mołdawskiej agencji e-administracji — albo STISC, państwowej służby IT i cyberbezpieczeństwa, wymaga potwierdzenia uprawnień, dostępu i zgód.

To są scenariusze dopasowania, a nie oświadczenia o istniejących kontraktach czy partnerstwach. Proponowane funkcje potwierdzamy w zakresie prac projektu.

Discută un pilot

Część ekosystemu.

Co chciałbyś, żeby działało lepiej?

Opowiedz nam o swoim procesie. Wspólnie ustalimy, co warto zbudować, co da się połączyć i jak sprawdzimy wynik.

Hai să discutăm