Ascultă
Capisce la richiesta nel contesto della conversazione e delle regole dell'azienda.
Agenți vocali AI Platformă
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.
Kallina
Capisce la richiesta nel contesto della conversazione e delle regole dell'azienda.
Prima di rispondere consulta la base di conoscenza e le integrazioni autorizzate.
Completa i dati, esegue l'azione consentita oppure passa la conversazione a una persona.
Domande frequenti, raccolta delle richieste e richiamo di chi ha chiesto di essere ricontattato.
Conferme e coordinamento, con i dati del sistema ordini collegato.
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
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.
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.
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.
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.
`<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)`.
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.
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
Dall'esplorazione all'implementazione
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.
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.
`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.
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`.
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.
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.
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.
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.
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.
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
Uno scenario d'uso, senza dati di clienti né risultati commerciali attribuiti.
Qualcuno chiama il numero dell'azienda alle 23:40, fuori dall'orario della reception.
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.
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
Assistenza vocale su informazioni approvate, con passaggio a un operatore e regole chiare sulla registrazione e sulla conservazione delle conversazioni.
Definiamo un pilota attorno a un processo reale: utenti, dati, integrazioni, costi e criteri di accettazione. L'estensione arriva dopo la valutazione del risultato.
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 pilotUn asistent conectat la informațiile afacerii tale, în canalele în care îți scriu clienții.
PlatformăGrai este direcția noastră de cercetare pentru sinteză vocală și modele adaptate limbilor folosite aici.
Cercetare & dezvoltareMegaforms explorează colectarea de răspunsuri prin formulare conversaționale, inclusiv răspunsuri vocale și transcriere.
Dezvoltare & demonstrațiiRaccontaci il tuo processo. Insieme stabiliamo cosa vale la pena costruire, cosa possiamo collegare e come verifichiamo il risultato.