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

Agenți vocali AI Platformă

Una buona conversazione prosegue in un'azione.

Costruiamo agenti che ricevono e avviano chiamate, usano le informazioni dell'azienda e lavorano con i tuoi sistemi. Dalla prima domanda fino a una richiesta completa, una conferma o il passaggio a un collega.

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

Kallina

Dall'informazione al lavoro fatto.

01

Ascultă

Capisce la richiesta nel contesto della conversazione e delle regole dell'azienda.

02

Verifică

Prima di rispondere consulta la base di conoscenza e le integrazioni autorizzate.

03

Acționează

Completa i dati, esegue l'azione consentita oppure passa la conversazione a una persona.

Dove diventa utile.

Reception e assistenza

Domande frequenti, raccolta delle richieste e richiamo di chi ha chiesto di essere ricontattato.

Ordini e consegne

Conferme e coordinamento, con i dati del sistema ordini collegato.

Qualifica e appuntamenti

Raccoglie i dettagli necessari. L'accesso al calendario e la prenotazione vera e propria si definiscono per ogni integrazione.

Scenari, numero di telefono, lingue e azioni si configurano per ogni implementazione. Il team mantiene la possibilità di prendere in mano la conversazione.

Kallina in dettaglio

Cosa puoi fare con questo progetto.

Kallina è la piattaforma su cui costruiamo agenti che parlano al telefono e dentro la pagina web. Un agente ha un ruolo scritto, una base di conoscenza approvata, un insieme di strumenti che può richiamare e un confine oltre il quale passa la discussione a una persona. La conversazione non finisce nella trascrizione: una chiamata ha durata, costo suddiviso per fornitore, registrazione e analisi, tutto legato all'account dell'azienda.

Il motore vocale non è uno solo. Nella configurazione dell'agente scegli tra ElevenLabs Conversational AI, OpenAI Realtime, Gemini Live o «auto», dove è Kallina a scegliere il fornitore in base a lingua, carico e disponibilità. Sopra a questo scegli separatamente il cervello testuale — il catalogo nel codice ha 78 voci di OpenAI, Google, Anthropic, xAI ed ElevenLabs, ciascuna con latenza e costo al minuto mostrati nell'interfaccia, perché la scelta sia informata e non per sentito dire.

La telefonia la gestiamo noi, non è noleggiata dal fornitore vocale. Le chiamate passano da un Asterisk nostro, con instradamento per orario di apertura e fuso orario, fasce notturne (per esempio 22:00 → 06:00) e corrispondenza per priorità: l'header SIP Diversion, poi il numero Kallina, poi la regola di riserva. Per OpenAI Realtime c'è un bridge AudioSocket che converte il codec nei due sensi, g711_ulaw ↔ PCM16.

01

Tre fornitori vocali più una posizione «auto»

In `AGENT_PROVIDERS` ci sono quattro opzioni: `elevenlabs` (ConvAI), `openai-realtime`, `gemini-live` e `auto`. Per la sintesi vocale in lingue diverse dall'inglese il valore predefinito è `eleven_flash_v2_5` — 32 lingue, circa 75 ms di latenza; l'alternativa di qualità migliore, `eleven_turbo_v2_5`, costa circa 250 ms. La scelta non è nascosta nel codice, è un campo nella configurazione dell'agente.

02

Catalogo di modelli con latenza e costo in chiaro

78 modelli in `LLM_MODELS`, raggruppati per fornitore nell'interfaccia insieme alla latenza misurata e al costo al minuto — da `gpt-5-nano` a circa 806 ms e circa 0,0004 $/min, fino a `claude-sonnet-4-6` a circa 1,55 s e circa 0,0225 $/min. Un cliente che chiede «perché risponde lento» riceve una risposta con dei numeri, non un'opinione.

03

Telefonia propria su Asterisk

L'inoltro delle chiamate si configura per orario di lavoro e fuso orario, con supporto delle fasce notturne e corrispondenza per priorità (header SIP Diversion → numero Kallina → regola di riserva). Il bridge `openai-realtime-bridge` esegue la conversione AudioSocket tra g711_ulaw e PCM16 per il flusso audio bidirezionale.

04

Embed vocale in una riga, senza id dell'agente nella pagina

`<script src="https://app.kallina.info/embed.js" data-widget="WIDGET_ID"></script>`. La pagina non viene mai a sapere quale agente risponde e non conserva nessuna chiave del fornitore: chiede a Kallina una sessione, e Kallina restituisce un URL firmato a breve scadenza. C'è anche la modalità `data-mode="inline"`, in cui l'embed non disegna assolutamente nulla e la pagina costruisce la propria interfaccia sopra le API `start()` / `stop()` / `toggle()` / `on(event, fn)`.

05

Campagne di chiamate in uscita

Chiamate in batch con 1–10 linee simultanee, importazione dei contatti da CSV, logica di ritentativo, monitoraggio in tempo reale con pausa, ripresa e arresto, più follow-up via SMS.

06

Limbi

La configurazione dell'agente accetta 32 lingue (`LANGUAGES`), la mappa completa delle lingue della piattaforma ha 41 voci e il pannello di amministrazione è tradotto in 20 (`src/i18n/locales`). Il rumeno è la lingua predefinita in `DEFAULT_VALUES`.

Dati e funzionamento

Cosa entra nel sistema. Cosa va verificato.

Dove stanno i dati
PostgreSQL tramite Supabase, con Row Level Security e pg_cron; 559 migrazioni versionate. La logica di server sono funzioni edge Deno — 472 nel repository alla data della verifica.
Cosa non arriva mai nella pagina del cliente
La chiave del fornitore vocale e l'identificativo dell'agente. L'embed invia `POST /functions/v1/widget-voice-session` con `widget_id` — la chiave pubblica presa da `chat_widget_configs.widget_id`, non l'id interno della riga — e il server chiede lui stesso a ElevenLabs un URL firmato, tramite `convai/conversation/get_signed_url`, e lo restituisce. La versione precedente, che metteva `agentId` direttamente nell'HTML, scavalcava del tutto Kallina.
La base di conoscenza
Documenti caricati nella piattaforma, sincronizzati con il RAG di ElevenLabs. Sopra vi si applicano guardrail di conversazione, schemi di raccolta dati e criteri di valutazione della riuscita della chiamata, definiti per ogni agente.
Consumo misurato prima, non dopo
La tabella `usage_events` tiene il consumo suddiviso per fornitore e per agente. Prima di qualsiasi azione a pagamento, la funzione `check-can-use` verifica il credito — il cancello sta davanti alla chiamata, non nella fattura di fine mese.

Dall'esplorazione all'implementazione

Come prepariamo un progetto con Kallina.

01

Scegliamo un solo percorso e ne scriviamo i bordi

Uno scenario con ingresso chiaro e uscita chiara — chiamata ricevuta in reception, conferma di un ordine, campagna in uscita. Mettiamo per iscritto cosa l'agente non ha il permesso di fare e per quale strada passa la discussione a una persona.

02

Colleghiamo il numero e verifichiamo nei due sensi

Il numero entra sul trunk SIP del nostro Asterisk. Le chiamate in entrata e quelle in uscita si testano separatamente, perché si rompono separatamente: una restrizione dell'operatore sulle chiamate in uscita lascia le entranti perfettamente funzionanti.

03

Verifichiamo il percorso senza consumare minuti

`scripts/verify-voice-path.mjs` percorre esattamente la strada di un browser — la riga di configurazione, `get-widget-config`, poi `widget-voice-session` — e si ferma all'URL firmato, senza aprire il websocket. Gira su un singolo widget o su tutti quelli con voce attiva, da 1–3 in parallelo, e restituisce un codice di uscita, quindi entra direttamente in un cron.

Domande che vale la pena chiarire.

Che motore vocale usa, in concreto?

Scegli tra ElevenLabs Conversational AI, OpenAI Realtime e Gemini Live, oppure lasci «auto» e decide Kallina in base a lingua e disponibilità. Per la sintesi vocale in lingue diverse dall'inglese il valore predefinito è il modello `eleven_flash_v2_5` — 32 lingue, attorno ai 75 ms; se vuoi qualità più alta e accetti più ritardo, `eleven_turbo_v2_5` sta attorno ai 250 ms. Le voci di OpenAI Realtime sono dieci e il loro motore arriva fino a `gpt-realtime-2.1`.

Come si mette su un sito?

Una riga: `<script src="https://app.kallina.info/embed.js" data-widget="WIDGET_ID"></script>`, caricata come script normale, non come modulo. Il file è servito oggi e pesa 13.762 byte. Se vuoi la tua interfaccia, `data-mode="inline"` non disegna nulla e ti lascia `start()`, `stop()`, `toggle()` e gli eventi `state`, `message`, `error`. Attenzione all'host: il file sta su `app.kallina.info`, non su `kallina.info` — sono due applicazioni su due server diversi.

Si consumano minuti se il visitatore rifiuta il microfono?

No. L'ordine dentro `embed.js` è: carica l'SDK, chiede il microfono con `getUserMedia({audio:true})` e solo dopo chiama `widget-voice-session`. Se la persona rifiuta il microfono, la richiesta di sessione non parte affatto, quindi non viene emesso nessun URL firmato e non si consuma niente.

Può chiamare per primo, non solo rispondere?

Sì — chiamate in batch, 1–10 simultanee, contatti da CSV, ritentativi e follow-up via SMS. Ma le chiamate in uscita dipendono dall'operatore telefonico, non solo da noi: nel nostro registro dei problemi è documentato un caso in cui il centralino dell'operatore ha iniziato a restituire `403 Forbidden` su tutte le uscite, con la nostra configurazione invariata e con le chiamate in entrata che funzionavano normalmente. Per questo testiamo le uscite separatamente prima di promettere una campagna.

In quante lingue parla e in quante si amministra?

La configurazione dell'agente accetta 32 lingue, la mappa interna delle lingue ha 41 voci e il pannello di amministrazione è tradotto in 20. Il rumeno è la lingua predefinita dei nuovi agenti.

Si pubblica automaticamente a ogni modifica del codice?

No, ed è bene saperlo prima di pianificare un lancio. Il workflow GitHub nel repository punta a un progetto Supabase Cloud che è stato cancellato, quindi «push su main = pubblicazione» non è più vero dal passaggio a infrastruttura propria. La pubblicazione vera avviene via SSH, copiando e riavviando. Conseguenza pratica: una modifica urgente ha bisogno di una persona, non solo di un commit.

Cosa succede se l'agente non sa la risposta?

Il passaggio a una persona fa parte dello scenario, non è un'eccezione. Ogni agente ha confini scritti e una via di trasferimento configurata sulla telefonia; e dentro la conversazione ci sono guardrail e criteri di valutazione, proprio perché un caso fuori dal ruolo venga fermato e non improvvisato.

Esempio illustrativo

Una chiamata ricevuta di notte, che arriva dove deve

Uno scenario d'uso, senza dati di clienti né risultati commerciali attribuiti.

La situazione di partenza

Qualcuno chiama il numero dell'azienda alle 23:40, fuori dall'orario della reception.

Come lavora

Asterisk applica la regola della fascia notturna (per esempio 22:00 → 06:00) e fa la corrispondenza per priorità: l'header SIP Diversion, poi il numero Kallina, poi la regola di riserva. L'agente notturno risponde sul fornitore scelto in configurazione, chiarisce la richiesta e richiama gli strumenti che ha il permesso di usare.

Rezultatul

La chiamata resta nello storico con trascrizione, registrazione audio, durata e costo suddiviso per fornitore. Ciò che eccede il ruolo dell'agente viene fermato e trasferito più avanti, invece di essere improvvisato.

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.

Possibilità di collaborazione

Kallina, nel contesto della tua organizzazione.

Informazione e raccolta delle richieste

Assistenza vocale su informazioni approvate, con passaggio a un operatore e regole chiare sulla registrazione e sulla conservazione delle conversazioni.

Aziende private

Definiamo un pilota attorno a un processo reale: utenti, dati, integrazioni, costi e criteri di accettazione. L'estensione arriva dopo la valutazione del risultato.

Pubblica amministrazione e aziende a partecipazione statale

Stabiliamo i requisiti di accessibilità, hosting, protezione dei dati e interoperabilità. Qualsiasi connessione con i servizi di AGE — Agenția de Guvernare Electronică, l'agenzia moldava per il governo elettronico — o di STISC, cioè Serviciul Tehnologia Informației și Securitate Cibernetică, il servizio statale per l'IT e la cybersicurezza, richiede la validazione di ammissibilità, accessi e approvazioni.

Questi sono scenari di adattamento, non dichiarazioni su contratti o partnership esistenti. Le funzioni proposte si confermano nel perimetro di lavoro del progetto.

Discută un pilot

Parte di un ecosistema.

Cosa vorresti che funzionasse meglio?

Raccontaci il tuo processo. Insieme stabiliamo cosa vale la pena costruire, cosa possiamo collegare e come verifichiamo il risultato.

Hai să discutăm