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

Agenți vocali AI Platformă

Une bonne conversation se poursuit par une action.

Nous construisons des agents qui prennent et passent des appels, utilisent les informations de l'entreprise et travaillent avec vos systèmes. De la première question jusqu'à une demande complète, une confirmation ou le transfert à un collègue.

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

Kallina

De l'information au travail fait.

01

Ascultă

Il comprend la demande dans le contexte de la conversation et des règles de l'entreprise.

02

Verifică

Il consulte la base de connaissances et les intégrations autorisées avant de répondre.

03

Acționează

Il complète les données, exécute l'action permise ou transfère la conversation à un humain.

Là où cela devient utile.

Accueil et support

Questions fréquentes, prise en charge des demandes et rappel des personnes qui ont demandé à être contactées.

Commandes et livraisons

Confirmations et coordination, avec les informations du système de commandes connecté.

Qualification et rendez-vous

Il rassemble les détails nécessaires. L'accès à l'agenda et la réservation se règlent pour chaque intégration.

Les scénarios, le numéro de téléphone, les langues et les actions se configurent pour chaque mise en œuvre. L'équipe garde la possibilité de reprendre la conversation.

Kallina en détail

Ce que vous pouvez faire avec ce projet.

Kallina est la plateforme sur laquelle nous construisons des agents qui parlent au téléphone et dans la page web. Un agent a un rôle écrit, une base de connaissances approuvée, un jeu d'outils qu'il peut appeler et une limite au-delà de laquelle il passe la discussion à un humain. La conversation ne s'arrête pas au transcript : l'appel a une durée, un coût par fournisseur, un enregistrement et une analyse, tous rattachés au compte de l'entreprise.

Le moteur vocal n'est pas unique. Dans la configuration de l'agent, vous choisissez entre ElevenLabs Conversational AI, OpenAI Realtime, Gemini Live ou « auto », auquel cas Kallina choisit le fournisseur selon la langue, la charge et la disponibilité. Par-dessus, vous choisissez séparément le cerveau textuel — le catalogue dans le code a 78 entrées d'OpenAI, Google, Anthropic, xAI et ElevenLabs, chacune avec sa latence et son coût par minute affichés dans l'interface, pour que le choix soit informé et non de seconde main.

La téléphonie est la nôtre, pas louée au fournisseur de voix. Les appels passent par un Asterisk à nous, avec routage sur les heures d'ouverture et le fuseau horaire, horaire de nuit (par exemple 22:00 → 06:00) et correspondance par priorité : l'en-tête SIP Diversion, puis le numéro Kallina, puis la règle de repli. Pour OpenAI Realtime, il existe un pont AudioSocket qui convertit le codec dans les deux sens, g711_ulaw ↔ PCM16.

01

Trois fournisseurs vocaux, plus une position « auto »

Dans `AGENT_PROVIDERS` il y a quatre options : `elevenlabs` (ConvAI), `openai-realtime`, `gemini-live` et `auto`. Pour le text-to-speech dans d'autres langues que l'anglais, la valeur par défaut est `eleven_flash_v2_5` — 32 langues, environ 75 ms de latence ; l'alternative de meilleure qualité, `eleven_turbo_v2_5`, coûte environ 250 ms. Le choix n'est pas caché dans le code, c'est un champ de la configuration de l'agent.

02

Catalogue de modèles avec latence et coût affichés

78 modèles dans `LLM_MODELS`, groupés par fournisseur dans l'interface avec la latence mesurée et le coût par minute — de `gpt-5-nano` à environ 806 ms et quelque 0,0004 $/min, jusqu'à `claude-sonnet-4-6` à environ 1,55 s et quelque 0,0225 $/min. Un client qui demande « pourquoi il répond lentement » reçoit une réponse avec des chiffres, pas un avis.

03

Téléphonie à nous, sur Asterisk

Le renvoi des appels se configure sur les heures de travail et le fuseau horaire, avec prise en charge de l'horaire de nuit et correspondance par priorité (en-tête SIP Diversion → numéro Kallina → règle de repli). Le pont `openai-realtime-bridge` fait la conversion AudioSocket entre g711_ulaw et PCM16 pour le flux audio bidirectionnel.

04

Embed vocal en une seule ligne, sans id d'agent dans la page

`<script src="https://app.kallina.info/embed.js" data-widget="WIDGET_ID"></script>`. La page n'apprend jamais quel agent répond et ne détient aucune clé de fournisseur : elle demande une session à Kallina, et Kallina renvoie une URL signée de courte durée. Il existe aussi le mode `data-mode="inline"`, où l'embed ne dessine absolument rien et où la page fait elle-même son interface par-dessus l'API `start()` / `stop()` / `toggle()` / `on(event, fn)`.

05

Campagnes d'appels sortants

Appel par lots avec 1–10 appels simultanés, import de contacts depuis un CSV, logique de relance, suivi en temps réel avec pause, reprise et arrêt, plus relance par SMS.

06

Limbi

La configuration de l'agent accepte 32 langues (`LANGUAGES`), la carte complète des langues de la plateforme a 41 entrées, et le panneau d'administration est traduit en 20 (`src/i18n/locales`). Le roumain est la langue par défaut dans `DEFAULT_VALUES`.

Données et fonctionnement

Ce qui entre dans le système. Ce qui doit être vérifié.

Où sont les données
PostgreSQL via Supabase, avec Row Level Security et pg_cron ; 559 migrations versionnées. La logique serveur, ce sont des fonctions edge Deno — 472 dans le dépôt à la date de la vérification.
Ce qui n'arrive jamais dans la page du client
La clé du fournisseur de voix et l'identifiant de l'agent. L'embed appelle `POST /functions/v1/widget-voice-session` avec `widget_id` — la clé publique de `chat_widget_configs.widget_id`, pas l'id interne de la ligne — et le serveur demande lui-même à ElevenLabs une URL signée, via `convai/conversation/get_signed_url`, puis la renvoie. L'ancienne variante, qui mettait `agentId` directement dans le HTML, contournait complètement Kallina.
La base de connaissances
Des documents chargés dans la plateforme, synchronisés avec le RAG d'ElevenLabs. Par-dessus se posent des garde-fous de discussion, des schémas de collecte de données et des critères d'évaluation de la réussite de l'appel, définis par agent.
Consommation mesurée avant, pas après
La table `usage_events` tient la consommation ventilée par fournisseur et par agent. Avant toute action qui coûte, la fonction `check-can-use` vérifie le crédit — la porte est avant l'appel, pas la facture de fin de mois.

De l'exploration à la mise en œuvre

Comment nous préparons un projet avec Kallina.

01

Nous choisissons un seul parcours et nous lui écrivons ses bords

Un scénario à entrée claire et sortie claire — appel reçu à l'accueil, confirmation de commande, campagne d'appels. Nous écrivons explicitement ce que l'agent n'a pas le droit de faire et par quel chemin il passe la discussion à un humain.

02

Nous connectons le numéro et nous vérifions dans les deux sens

Le numéro entre sur le trunk SIP de notre Asterisk. Les appels entrants et les appels sortants se testent séparément, parce qu'ils peuvent casser séparément : une restriction de l'opérateur sur les appels sortants laisse les entrants fonctionner parfaitement.

03

Nous vérifions le parcours sans consommer de minutes

`scripts/verify-voice-path.mjs` parcourt exactement le chemin d'un navigateur — la ligne de configuration, `get-widget-config`, puis `widget-voice-session` — et s'arrête à l'URL signée, sans ouvrir le websocket. Il tourne sur un seul widget ou sur tous ceux qui ont la voix active, avec 1–3 en parallèle, et renvoie un code de sortie, donc il peut entrer directement dans un cron.

Des questions qui méritent d'être clarifiées.

Quel moteur vocal utilise-t-il, concrètement ?

Vous choisissez entre ElevenLabs Conversational AI, OpenAI Realtime et Gemini Live, ou vous laissez « auto » et Kallina décide selon la langue et la disponibilité. Pour la synthèse vocale dans d'autres langues que l'anglais, la valeur par défaut est le modèle `eleven_flash_v2_5` — 32 langues, autour de 75 ms ; si vous voulez une qualité supérieure et acceptez plus de latence, `eleven_turbo_v2_5` est autour de 250 ms. Les voix OpenAI Realtime sont au nombre de dix, et leur moteur va jusqu'à `gpt-realtime-2.1`.

Comment on le met sur un site ?

Une ligne : `<script src="https://app.kallina.info/embed.js" data-widget="WIDGET_ID"></script>`, chargée comme un script ordinaire, pas comme un module. Le fichier est servi aujourd'hui et fait 13 762 octets. Si vous voulez votre propre interface, `data-mode="inline"` ne dessine rien et vous laisse `start()`, `stop()`, `toggle()` et les événements `state`, `message`, `error`. Attention à l'hôte : le fichier est sur `app.kallina.info`, pas sur `kallina.info` — ce sont deux applications sur deux serveurs différents.

Est-ce que des minutes sont consommées si le visiteur refuse le micro ?

Non. L'ordre dans `embed.js` est : charger le SDK, demander le micro avec `getUserMedia({audio:true})`, et seulement ensuite appeler `widget-voice-session`. Si la personne refuse le micro, la demande de session n'est plus faite du tout, donc aucune URL signée n'est émise et rien n'est consommé.

Peut-il appeler le premier, et pas seulement répondre ?

Oui — appel par lots, 1–10 simultanés, contacts depuis un CSV, relances et suivi par SMS. Mais les appels sortants dépendent de l'opérateur téléphonique, pas seulement de nous : dans notre registre d'incidents est documenté un cas où le central de l'opérateur s'est mis à renvoyer `403 Forbidden` sur toutes les sorties, notre configuration étant inchangée et les appels entrants fonctionnant normalement. C'est pour cela que nous testons les sorties séparément avant de promettre une campagne.

En combien de langues parle-t-il et en combien s'administre-t-il ?

La configuration de l'agent accepte 32 langues, la carte interne des langues a 41 entrées, et le panneau d'administration est traduit en 20. Le roumain est la langue par défaut des nouveaux agents.

Est-ce que ça se publie automatiquement à chaque modification de code ?

Non, et il vaut mieux le savoir avant de planifier un lancement. Le workflow GitHub du dépôt vise un projet Supabase Cloud qui a été supprimé, donc « push sur main = publication » n'est plus vrai depuis la migration sur infrastructure à nous. La publication réelle se fait par SSH, avec copie et redémarrage. Conséquence pratique : un changement urgent a besoin d'une personne, pas seulement d'un commit.

Que se passe-t-il si l'agent ne connaît pas la réponse ?

Le passage à un humain fait partie du scénario, ce n'est pas une exception. Chaque agent a des limites écrites et un chemin de transfert configuré sur la téléphonie ; et dans la conversation il y a des garde-fous et des critères d'évaluation de la réussite, précisément pour qu'un cas hors rôle soit arrêté et non improvisé.

Exemple illustratif

Un appel reçu la nuit, qui arrive là où il faut

Un scénario d'usage, sans données de client ni résultats commerciaux attribués.

La situation de départ

Quelqu'un appelle le numéro de l'entreprise à 23:40, en dehors des heures de l'accueil.

Comment ça travaille

Asterisk applique la règle d'horaire de nuit (par exemple 22:00 → 06:00) et fait la correspondance par priorité : l'en-tête SIP Diversion, puis le numéro Kallina, puis la règle de repli. L'agent de nuit répond sur le fournisseur choisi dans la configuration, clarifie la demande et appelle les outils qu'il a le droit d'utiliser.

Rezultatul

L'appel reste dans l'historique avec transcript, enregistrement audio, durée et coût ventilé par fournisseur. Ce qui dépasse le rôle de l'agent est arrêté et transféré plus loin, au lieu d'être improvisé.

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és de collaboration

Kallina, dans le contexte de votre organisation.

Information et prise en charge des demandes

Assistance vocale sur des informations approuvées, avec passage à un opérateur et des règles claires concernant l'enregistrement et la conservation des conversations.

Entreprises privées

Nous définissons un pilote autour d'un processus réel : utilisateurs, données, intégrations, coûts et critères de recette. L'extension vient après l'évaluation du résultat.

Institutions et entreprises publiques

Nous fixons les exigences d'accessibilité, d'hébergement, de protection des données et d'interopérabilité. Toute connexion avec les services de l'Agence moldave de la gouvernance électronique (AGE) ou du service national des technologies de l'information (STISC) exige la validation de l'éligibilité, de l'accès et des approbations.

Ce sont des scénarios d'adaptation, pas des déclarations sur des contrats ou des partenariats existants. Les fonctions proposées se confirment dans le périmètre de travail du projet.

Discută un pilot

Partie d'un écosystème.

Qu'est-ce que vous voudriez voir mieux fonctionner ?

Racontez-nous votre processus. Ensemble, nous décidons ce qui vaut la peine d'être construit, ce que nous pouvons connecter et comment nous vérifions le résultat.

Hai să discutăm