Vai al contenuto
megapromotingParliamone
Prodotti Kallina

Agenti vocali AI Piattaforma

Una buona conversazione continua con un’azione.

Costruiamo agenti che prendono e avviano chiamate, usano le informazioni dell’azienda e lavorano con i suoi sistemi. Dalla prima domanda fino a una richiesta completa, una conferma o il trasferimento a un collega.

AscoltaVerificaAgisciVOCE + CONTESTO + AZIONE
Come funziona Kallina

Kallina

Dall’informazione al lavoro svolto.

01

Ascolta

Comprende la richiesta nel contesto della conversazione e delle regole dell’azienda.

02

Verifica

Consulta la base di conoscenza e le integrazioni autorizzate prima di rispondere.

03

Agisci

Completa i dati, esegue l’azione consentita o trasferisce la conversazione a un umano.

Dove diventa utile.

Ricezione e supporto

Domande frequenti, presa in carico delle richieste e richiamo delle persone che hanno chiesto di essere contattate.

Ordini e consegne

Conferme e coordinamento, con le informazioni del sistema di ordini connesso.

Qualifica e prenotazioni

Raccoglie i dettagli necessari. L’accesso al calendario e la prenotazione si stabiliscono per ogni integrazione.

Gli сценарии, il numero di telefono, le lingue e le azioni si configurano per ogni implementazione. Il team mantiene la possibilità di prendere in carico la conversazione.

Kallina in dettaglio

Cosa potete fare con questo progetto.

Kallina è la piattaforma su cui costruiamo agenti che parlano al telefono e nella pagina web. Un agente ha un ruolo scritto, una base di conoscenza approvata, un insieme di strumenti che può richiamare e un limite oltre il quale passa la conversazione a una persona. La conversazione non si conclude nel transcript: la chiamata ha durata, costo per fornitore, registrazione e analisi, tutti collegati all’account dell’azienda.

Il motore vocale non è uno solo. Nella configurazione dell’agente si sceglie tra ElevenLabs Conversational AI, OpenAI Realtime, Gemini Live oppure „auto”, nel qual caso Kallina sceglie il fornitore in base alla lingua, al carico e alla disponibilità. In aggiunta si sceglie separatamente il cervello testuale — il catalogo nel codice contiene 78 voci di OpenAI, Google, Anthropic, xAI ed ElevenLabs, ciascuna con la latenza e il costo al minuto visualizzati nell’interfaccia, così che la scelta sia informata e non basata su sentito dire.

La telefonia è nostra, non noleggiata dal fornitore vocale. Le chiamate passano attraverso un Asterisk proprietario, con instradamento per orario di lavoro e fuso orario, fascia notturna (ad esempio 22:00 → 06:00) e corrispondenza per priorità: l’intestazione SIP Diversion, poi il numero Kallina, poi la regola di riserva. Per OpenAI Realtime esiste un ponte AudioSocket che converte il codec in entrambe le direzioni, 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 il text-to-speech in lingue diverse dall’inglese, l’impostazione predefinita è `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 visualizzati

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 lentamente” riceve una risposta con numeri, non un’opinione.

03

Telefonia proprietaria su Asterisk

Il reindirizzamento delle chiamate si configura per orario di lavoro e fuso orario, con supporto per fascia notturna e corrispondenza per priorità (intestazione SIP Diversion → numero Kallina → regola di riserva). Il ponte `openai-realtime-bridge` effettua la conversione AudioSocket tra g711_ulaw e PCM16 per il flusso audio bidirezionale.

04

Embed vocale su una sola riga, senza id agente nella pagina

`<script src="https://app.kallina.info/embed.js" data-widget="WIDGET_ID"></script>`. La pagina non sa mai quale agente risponde e non conserva alcuna chiave del fornitore: chiede a Kallina una sessione, e Kallina restituisce un URL firmato a breve durata. Esiste anche la modalità `data-mode="inline"`, in cui l’embed non disegna assolutamente nulla e la pagina crea da sola la propria interfaccia sopra l’API `start()` / `stop()` / `toggle()` / `on(event, fn)`.

05

Campagne di chiamate in uscita

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

06

Lingue

La configurazione dell’agente supporta 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 romeno è la lingua predefinita in `DEFAULT_VALUES`.

Dati e funzionamento

Ciò che entra nel sistema. Ciò che deve essere verificato.

Dove stanno i dati
PostgreSQL tramite Supabase, con Row Level Security e pg_cron; 559 migrazioni versionate. La logica server sono funzioni edge Deno — 472 nel repo alla data della verifica.
Ciò che non arriva mai nella pagina del cliente
La chiave del fornitore vocale e l’identificatore dell’agente. L’embed richiede `POST /functions/v1/widget-voice-session` con `widget_id` — la chiave pubblica da `chat_widget_configs.widget_id`, non l’id interno della riga — mentre il server richiede a sua volta a ElevenLabs un URL firmato, tramite `convai/conversation/get_signed_url`, e lo restituisce. La vecchia versione, che inseriva `agentId` direttamente nell’HTML, bypassava completamente Kallina.
Base di conoscenza
Documenti caricati nella piattaforma, sincronizzati con il RAG di ElevenLabs. Su di essi si applicano gate di conversazione, schemi di raccolta dati e criteri di valutazione del successo della chiamata, definiti per agente.
Consumo misurato prima, non dopo
La tabella `usage_events` tiene il consumo suddiviso per fornitore e per agente. Prima di qualsiasi azione che costa, la funzione `check-can-use` verifica il credito — il gate è prima della chiamata, non la fattura di fine mese.

Dall’esplorazione all’implementazione

Come prepariamo un progetto con Kallina.

01

Scegliamo un solo percorso e ne scriviamo i margini

Uno scenario con ingresso chiaro e uscita chiara — chiamata ricevuta alla reception, conferma d’ordine, campagna di chiamate. Scriviamo esplicitamente cosa l’agente non ha il permesso di fare e attraverso quale percorso passa la discussione a una persona.

02

Colleghiamo il numero e verifichiamo in entrambe le direzioni

Il numero entra sul trunk SIP del nostro Asterisk. Le chiamate in entrata e quelle in uscita vengono testate separatamente, perché possono guastarsi separatamente: una restrizione dell’operatore sulle chiamate in uscita lascia gli ingressi funzionare perfettamente.

03

Verifichiamo il percorso senza consumare minuti

`scripts/verify-voice-path.mjs` percorre esattamente il percorso di un browser — la riga nella configurazione, `get-widget-config`, poi `widget-voice-session` — e si ferma all’URL firmato, senza aprire il websocket. Esegue su un solo widget o su tutti quelli con voce attiva, con 1–3 in parallelo, e restituisce un codice di uscita, quindi può entrare direttamente in un cron.

Domande che meritano di essere chiarite.

Quale motore vocale utilizza, concretamente?

Scegli tra ElevenLabs Conversational AI, OpenAI Realtime e Gemini Live, oppure lascia «auto» e Kallina decide in base alla lingua e alla disponibilità. Per la sintesi vocale in altre lingue oltre all’inglese, il modello predefinito è `eleven_flash_v2_5` — 32 lingue, circa 75 ms; se desidera una qualità maggiore e accetta una latenza più elevata, `eleven_turbo_v2_5` è circa 250 ms. Le voci OpenAI Realtime sono dieci, e il loro motore arriva fino a `gpt-realtime-2.1`.

Come si inserisce in 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 ha 13.762 byte. Se desidera la sua interfaccia, `data-mode="inline"` non disegna nulla e le 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 in `embed.js` è: carica l’SDK, richiede il microfono con `getUserMedia({audio:true})`, e solo dopo chiama `widget-voice-session`. Se la persona rifiuta il microfono, la richiesta di sessione non viene più fatta del tutto, quindi non viene emesso alcun URL firmato e non si consuma nulla.

Può chiamare lui per primo, non solo rispondere?

Sì — chiamate in batch, 1–10 simultanee, contatti da CSV, nuovi tentativi e follow-up via SMS. Ma le chiamate in uscita dipendono dall’operatore telefonico, non solo da noi: nel nostro registro problemi è documentato un caso in cui la centrale dell’operatore ha iniziato a restituire `403 Forbidden` a tutte le uscite, con la nostra configurazione invariata e con le chiamate in ingresso funzionanti 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 supporta 32 lingue, la mappa interna delle lingue ha 41 voci, e il pannello di amministrazione è tradotto in 20. Il romeno è 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 repo punta a un progetto Supabase Cloud che è stato eliminato, quindi «push su main = pubblicazione» non è più vero dalla migrazione su infrastruttura propria. La pubblicazione reale avviene via SSH, con copia e riavvio. La conseguenza pratica: una modifica urgente richiede una persona, non solo un commit.

Cosa succede se l’agente non sa la risposta?

Il passaggio a un umano fa parte dello сценарio, non è un’eccezione. Ogni agente ha limiti scritti e un canale di trasferimento configurato sulla telefonia; e nella conversazione ci sono gate e criteri di valutazione del successo, proprio perché un caso fuori ruolo venga fermato, non improvvisato.

Esempio illustrativo

Una chiamata ricevuta di notte, che arriva dove deve

Uno scenario di utilizzo, senza dati del cliente o risultati commerciali attribuiti.

Situazione iniziale

Qualcuno chiama il numero dell’attività alle 23:40, fuori orario rispetto alla reception.

Come funziona

Asterisk applica la regola di orario notturno (ad esempio 22:00 → 06:00) e abbina in base alla priorità: l’intestazione SIP Diversion, poi il numero Kallina, poi la regola di riserva. L’agente notturno risponde sul fornitore scelto nella configurazione, chiarisce la richiesta e chiama gli strumenti che è autorizzato a usare.

Rezultatul

La chiamata rimane nello storico con transcript, registrazione audio, durata e costo ripartito per fornitore. Ciò che supera il ruolo dell’agente si ferma e viene trasferito oltre, invece di essere improvvisato.

Ciò che è necessario:Il numero collegato sul trunk SIP del nostro Asterisk, le chiamate in uscita consentite dall’operatore se lo si desidera e richiamate, più un agente con prompt, base di conoscenze approvata e limiti scritti.

Possibilità di collaborazione

Kallina, nel contesto della Sua organizzazione.

Informazione e presa in carico delle richieste

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

Imprese private

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

Istituzioni e società statali

Stabiliamo i requisiti di accessibilità, hosting, protezione dei dati e interoperabilità. Ogni connessione con servizi AGE o STISC richiede la validazione dell’ammissibilità, dell’accesso e delle approvazioni.

Questi sono scenari di adattamento, non dichiarazioni su contratti o partenariati esistenti. Le funzioni proposte si confermano nell’ambito di lavoro del progetto.

Discuti 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.

Parliamone