Ascolta
Comprende la richiesta nel contesto della conversazione e delle regole dell’azienda.
Agenti vocali AI Piattaforma
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.
Kallina
Comprende la richiesta nel contesto della conversazione e delle regole dell’azienda.
Consulta la base di conoscenza e le integrazioni autorizzate prima di rispondere.
Completa i dati, esegue l’azione consentita o trasferisce la conversazione a un umano.
Domande frequenti, presa in carico delle richieste e richiamo delle persone che hanno chiesto di essere contattate.
Conferme e coordinamento, con le informazioni del sistema di ordini connesso.
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
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.
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.
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.
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.
`<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)`.
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.
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
Dall’esplorazione all’implementazione
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.
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.
`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.
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`.
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.
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.
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.
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.
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.
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
Uno scenario di utilizzo, senza dati del cliente o risultati commerciali attribuiti.
Qualcuno chiama il numero dell’attività alle 23:40, fuori orario rispetto alla reception.
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.
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
Assistenza vocale su informazioni approvate, con passaggio a un operatore e regole chiare riguardo alla registrazione e alla conservazione delle conversazioni.
Definiamo un pilot attorno a un processo reale: utenti, dati, integrazioni, costi e criteri di accettazione. L’estensione segue dopo la valutazione del risultato.
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 pilotUn assistente connesso alle informazioni della vostra attività, nei canali in cui vi scrivono i clienti.
PiattaformaGrai è la nostra direzione di ricerca per la sintesi vocale e modelli adattati alle lingue usate qui.
Ricerca e sviluppoMegaforms esplora la raccolta di risposte tramite moduli conversazionali, incluse risposte vocali e trascrizione.
Sviluppo & demoRaccontaci il tuo processo. Insieme stabiliamo cosa vale la pena costruire, cosa possiamo collegare e come verifichiamo il risultato.