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

Agenți vocali AI Platformă

O conversație bună continuă cu o acțiune.

Construim agenți care preiau și inițiază apeluri, folosesc informațiile afacerii și lucrează cu sistemele tale. De la prima întrebare până la o solicitare completă, o confirmare sau transferul către un coleg.

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

Kallina

De la informație la lucru făcut.

01

Ascultă

Înțelege cererea în contextul conversației și al regulilor afacerii.

02

Verifică

Consultă baza de cunoștințe și integrările autorizate înainte să răspundă.

03

Acționează

Completează datele, execută acțiunea permisă sau transferă conversația către om.

Unde devine util.

Recepție și suport

Întrebări frecvente, preluarea solicitărilor și revenirea către persoanele care au cerut să fie contactate.

Comenzi și livrări

Confirmări și coordonare, cu informațiile din sistemul de comenzi conectat.

Calificare și programări

Adună detaliile necesare. Accesul la calendar și rezervarea se stabilesc pentru fiecare integrare.

Scenariile, numărul de telefon, limbile și acțiunile se configurează pentru fiecare implementare. Echipa păstrează posibilitatea de a prelua conversația.

Kallina în detaliu

Ce poți face cu acest proiect.

Kallina este platforma pe care construim agenți care vorbesc la telefon și în pagina web. Un agent are un rol scris, o bază de cunoștințe aprobată, un set de unelte pe care le poate chema și o limită dincolo de care predă discuția unui om. Conversația nu se termină în transcript: apelul are durată, cost pe furnizor, înregistrare și analiză, toate legate de contul afacerii.

Motorul vocal nu e unul singur. În configurația agentului alegi între ElevenLabs Conversational AI, OpenAI Realtime, Gemini Live sau „auto”, caz în care Kallina alege furnizorul în funcție de limbă, încărcare și disponibilitate. Peste asta alegi separat creierul textual — catalogul din cod are 78 de intrări de la OpenAI, Google, Anthropic, xAI și ElevenLabs, fiecare cu latența și costul pe minut afișate în interfață, ca alegerea să fie una informată, nu una din auzite.

Telefonia e a noastră, nu închiriată de la furnizorul de voce. Apelurile trec printr-un Asterisk propriu, cu rutare pe ore de program și fus orar, program peste noapte (de exemplu 22:00 → 06:00) și potrivire pe prioritate: antetul SIP Diversion, apoi numărul Kallina, apoi regula de rezervă. Pentru OpenAI Realtime există o punte AudioSocket care convertește codecul în ambele sensuri, g711_ulaw ↔ PCM16.

01

Trei furnizori vocali plus o poziție „auto”

În `AGENT_PROVIDERS` sunt patru opțiuni: `elevenlabs` (ConvAI), `openai-realtime`, `gemini-live` și `auto`. Pentru text-to-speech în alte limbi decât engleza, implicit este `eleven_flash_v2_5` — 32 de limbi, aproximativ 75 ms latență; alternativa de calitate mai bună, `eleven_turbo_v2_5`, costă aproximativ 250 ms. Alegerea nu e ascunsă în cod, e un câmp în configurația agentului.

02

Catalog de modele cu latență și cost afișate

78 de modele în `LLM_MODELS`, grupate pe furnizor în interfață împreună cu latența măsurată și costul pe minut — de la `gpt-5-nano` la aproximativ 806 ms și circa 0,0004 $/min, până la `claude-sonnet-4-6` la aproximativ 1,55 s și circa 0,0225 $/min. Un client care întreabă „de ce răspunde încet” primește un răspuns cu cifre, nu o părere.

03

Telefonie proprie pe Asterisk

Redirecționarea apelurilor se configurează pe ore de lucru și fus orar, cu suport pentru program peste noapte și potrivire pe prioritate (antet SIP Diversion → număr Kallina → regulă de rezervă). Puntea `openai-realtime-bridge` face conversia AudioSocket între g711_ulaw și PCM16 pentru fluxul audio bidirecțional.

04

Embed vocal într-o singură linie, fără id de agent în pagină

`<script src="https://app.kallina.info/embed.js" data-widget="WIDGET_ID"></script>`. Pagina nu află niciodată ce agent răspunde și nu ține nicio cheie de furnizor: cere lui Kallina o sesiune, iar Kallina întoarce un URL semnat de scurtă durată. Există și modul `data-mode="inline"`, în care embedul nu desenează absolut nimic și pagina își face singură interfața peste API-ul `start()` / `stop()` / `toggle()` / `on(event, fn)`.

05

Campanii de apeluri ieșite

Apelare în loturi cu 1–10 apeluri simultane, import de contacte din CSV, logică de reîncercare, urmărire în timp real cu pauză, reluare și oprire, plus follow-up prin SMS.

06

Limbi

Configurația agentului acceptă 32 de limbi (`LANGUAGES`), harta completă de limbi din platformă are 41 de intrări, iar panoul de administrare este tradus în 20 (`src/i18n/locales`). Româna e limba implicită în `DEFAULT_VALUES`.

Date și funcționare

Ce intră în sistem. Ce trebuie verificat.

Unde stau datele
PostgreSQL prin Supabase, cu Row Level Security și pg_cron; 559 de migrări versionate. Logica de server sunt funcții edge Deno — 472 în repo la data verificării.
Ce nu ajunge niciodată în pagina clientului
Cheia furnizorului de voce și identificatorul agentului. Embedul cere `POST /functions/v1/widget-voice-session` cu `widget_id` — cheia publică din `chat_widget_configs.widget_id`, nu id-ul intern al rândului — iar serverul cere el însuși de la ElevenLabs un URL semnat, prin `convai/conversation/get_signed_url`, și îl întoarce. Varianta veche, care punea `agentId` direct în HTML, ocolea complet Kallina.
Baza de cunoștințe
Documente încărcate în platformă, sincronizate cu RAG-ul ElevenLabs. Peste ele se pun garduri de discuție, scheme de colectare de date și criterii de evaluare a reușitei apelului, definite per agent.
Consum măsurat înainte, nu după
Tabela `usage_events` ține consumul defalcat pe furnizor și pe agent. Înainte de orice acțiune care costă, funcția `check-can-use` verifică creditul — poarta e înaintea apelului, nu factura de la sfârșitul lunii.

De la explorare la implementare

Cum pregătim un proiect cu Kallina.

01

Alegem un singur traseu și îi scriem marginile

Un scenariu cu intrare clară și ieșire clară — apel primit la recepție, confirmare de comandă, campanie de sunat. Scriem explicit ce nu are voie agentul să facă și pe ce cale predă discuția unui om.

02

Conectăm numărul și verificăm în ambele sensuri

Numărul intră pe trunkul SIP al Asterisk-ului nostru. Apelurile primite și cele ieșite se testează separat, pentru că se pot strica separat: o restricție a operatorului pe apeluri ieșite lasă intrările să funcționeze perfect.

03

Verificăm traseul fără să consumăm minute

`scripts/verify-voice-path.mjs` parcurge exact drumul unui browser — rândul din configurație, `get-widget-config`, apoi `widget-voice-session` — și se oprește la URL-ul semnat, fără să deschidă websocketul. Rulează pe un singur widget sau pe toate cele cu voce activă, cu 1–3 în paralel, și întoarce cod de ieșire, deci poate intra direct într-un cron.

Întrebări care merită clarificate.

Ce motor vocal folosește, concret?

Alegi între ElevenLabs Conversational AI, OpenAI Realtime și Gemini Live, sau lași „auto” și decide Kallina după limbă și disponibilitate. Pentru sinteza vocii în alte limbi decât engleza, implicit este modelul `eleven_flash_v2_5` — 32 de limbi, în jur de 75 ms; dacă vrei calitate mai mare și accepți întârziere mai mare, `eleven_turbo_v2_5` e în jur de 250 ms. Vocile OpenAI Realtime sunt zece, iar motorul lor merge până la `gpt-realtime-2.1`.

Cum se pune pe un site?

O linie: `<script src="https://app.kallina.info/embed.js" data-widget="WIDGET_ID"></script>`, încărcată ca script obișnuit, nu ca modul. Fișierul e servit azi și are 13.762 de octeți. Dacă vrei interfața ta, `data-mode="inline"` nu desenează nimic și îți lasă `start()`, `stop()`, `toggle()` și evenimentele `state`, `message`, `error`. Atenție la gazdă: fișierul stă pe `app.kallina.info`, nu pe `kallina.info` — sunt două aplicații pe două servere diferite.

Se consumă minute dacă vizitatorul refuză microfonul?

Nu. Ordinea din `embed.js` este: încarcă SDK-ul, cere microfonul cu `getUserMedia({audio:true})`, și abia apoi cheamă `widget-voice-session`. Dacă omul refuză microfonul, cererea de sesiune nu se mai face deloc, deci nu se emite niciun URL semnat și nu se consumă nimic.

Poate suna el primul, nu doar să răspundă?

Da — apelare în loturi, 1–10 simultan, contacte din CSV, reîncercări și follow-up prin SMS. Dar apelurile ieșite depind de operatorul telefonic, nu doar de noi: în registrul nostru de probleme e documentat un caz în care centrala operatorului a început să întoarcă `403 Forbidden` la toate ieșirile, cu configurația noastră neschimbată și cu apelurile primite funcționând normal. De aceea testăm ieșirile separat înainte de a promite o campanie.

În câte limbi vorbește și în câte se administrează?

Configurația agentului acceptă 32 de limbi, harta internă de limbi are 41 de intrări, iar panoul de administrare e tradus în 20. Româna e limba implicită a agenților noi.

Se publică automat la fiecare modificare de cod?

Nu, și e bine de știut înainte de a planifica o lansare. Workflow-ul GitHub din repo țintește un proiect Supabase Cloud care a fost șters, deci „push pe main = publicare” nu mai e adevărat de la migrarea pe infrastructură proprie. Publicarea reală se face prin SSH, cu copiere și repornire. Consecința practică: o schimbare urgentă are nevoie de o persoană, nu doar de un commit.

Ce se întâmplă dacă agentul nu știe răspunsul?

Predarea către om face parte din scenariu, nu e o excepție. Fiecare agent are limite scrise și o cale de transfer configurată pe telefonie; iar în conversație există garduri și criterii de evaluare a reușitei, tocmai ca un caz în afara rolului să fie oprit, nu improvizat.

Exemplu ilustrativ

Un apel primit noaptea, care ajunge unde trebuie

Un scenariu de utilizare, fără date de client sau rezultate comerciale atribuite.

Situația inițială

Cineva sună la numărul afacerii la 23:40, în afara programului de la recepție.

Cum lucrează

Asterisk aplică regula de program peste noapte (de exemplu 22:00 → 06:00) și potrivește pe prioritate: antetul SIP Diversion, apoi numărul Kallina, apoi regula de rezervă. Agentul de noapte răspunde pe furnizorul ales în configurație, clarifică cererea și cheamă uneltele pe care are voie să le folosească.

Rezultatul

Apelul rămâne în istoric cu transcript, înregistrare audio, durată și cost defalcat pe furnizor. Ce depășește rolul agentului se oprește și se transferă mai departe, în loc să fie improvizat.

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.

Posibilități de colaborare

Kallina, în contextul organizației tale.

Informare și preluarea solicitărilor

Asistență vocală pe informații aprobate, cu trecere către un operator și reguli clare privind înregistrarea și păstrarea conversațiilor.

Companii private

Definim un pilot în jurul unui proces real: utilizatori, date, integrări, costuri și criterii de acceptare. Extinderea urmează după evaluarea rezultatului.

Instituții și companii de stat

Stabilim cerințele de accesibilitate, găzduire, protecție a datelor și interoperabilitate. Orice conexiune cu servicii AGE sau STISC necesită validarea eligibilității, accesului și aprobărilor.

Acestea sunt scenarii de adaptare, nu declarații despre contracte sau parteneriate existente. Funcțiile propuse se confirmă în domeniul de lucru al proiectului.

Discută un pilot

Parte dintr-un ecosistem.

Ce ai vrea să funcționeze mai bine?

Povestește-ne despre procesul tău. Împreună stabilim ce merită construit, ce putem conecta și cum verificăm rezultatul.

Hai să discutăm