Comment nous avons créé facilement un agent IA vocal francophone avec Rounded
Lors d'un appel téléphonique à une entreprise, vous avez forcément déjà entendu le fameux "Tapez 1, Tapez 2". Après avoir fait votre choix, vous avez été redirigé automatiquement vers le bon service. Les agents vocaux IA vont encore plus loin. Ils comprennent et répondent aux appels en temps réel, de façon fluide et spontanée. Ils peuvent pour cela mettre en place des actions comme la prise de rendez-vous ou la qualification d'une demande.
Pour tester la mise en place d'un agent vocal francophone, nous allons essayer d'en mettre en place un sur Rounded. Cette plateforme no code connecte automatiquement les trois éléments essentiels d'un agent vocal. A savoir, un transcripteur vocal, qui convertit la voix de l'appelant en texte pour permettre l'analyse du contenu, un modèle de langage pour formuler par écrit la réponse et un synthétiseur vocal. Ce dernier transforme la réponse en une voix naturelle pour restituer l'information à l'appelant. La mission de notre agent sera de vérifier la disponibilité de l'appelé et de prendre un rendez-vous. Notons que l'inscription à Rounded fait bénéficier de 10 euros de crédit. Cela permet d'assembler un prototype en utilisant le Studio, de déployer environ 30 minutes de conversations gratuites, et de bénéficier d'un numéro gratuit.
Elaborer un scénario
Une fois sur le studio d'agent vocal IA, vous pouvez vous appuyer sur un template existant ou en mettre en place un à partir de zéro. Nous allons en construire un nommé "Agent prise de rendez-vous." Afin de partir dans la bonne direction, il est d'abord conseillé d'essayer de répondre à différentes questions pour structurer l'agent. A savoir : quel est son objectif principal, son public cible, quel ton et personnalité doit-il prendre, à quelles demandes devra-t-il répondre, quelles informations ne doit-il pas divulguer ?
Une fois ces fondations posées, rendez-vous sur l'interface graphique de la création d'agent, à la section "Global settings". Vous pouvez y configurer les paramètres généraux. Le but est de permettre à l'agent vocal de bien fonctionner. Choisissez pour cela votre LLM : la nouvelle suite de modèles GPT-4.1 se révèle particulièrement performante, le modèle Gemini 2.0 flash-offre un bon compromis entre latence et coût d'utilisation. Egalement, optez pour une voix, un rôle, une posture, élaborez le contexte et la transition entre les tâches. Vous pouvez vous aider de ChatGPT ou un autre assistant IA construire le prompt. Cela donne dans notre exemple.
On note l'ajout de la variable {{call_start_time}} pour mettre automatiquement à jour l'heure de l'appel.
Des instructions concrètes
Une fois la configuration générale terminée, il est temps de créer des instructions plus directes avec l'agent. Nous allons directement dans la tâche intitulée "prise_rdv", liée aux sections "Call context" et "Call starts". La configuration de ce module demande l'écriture d'un prompt précis. On rentre ici dans le détail sur l'objectif de l'agent. Le script se compose des objectifs, des instructions à suivre ou des "choses à faire ou à ne pas faire".
L'objectif est celui que l'agent doit atteindre, dans notre exemple : "réserver un rendez-vous pour l'appelant. Une fois que le créneau est choisi tu dois demander, prénom, nom de famille et adresse e-mail de l'appelant puis confirmer le rendez-vous."
Ensuite, les instructions dérivent des actions à entreprendre pour accéder à l'objectif. Ici, notamment : "commence par demander à partir de quand la personne souhaite prendre rendez-vous. Pour rappel l'appel a commencé à {{call_start_time}}."
Les fonctions demandent davantage de réglages
Toujours d'après notre exemple, on note que deux des instructions font appel à des fonctions : "2. utilises la fonction 'get_availabilities' pour obtenir les disponibilités. Tu dois remplir un start, et un end. Fais en sorte que le end soit au maximum une semaine après le start." Et : "5. Utilises la fonction 'confirm_appointment' pour confirmer le rendez-vous et l'enregistrer."
La mise en place de ces fonctions est un peu plus technique. Elle mérite que l'on s'attarde davantage dessus. Pour les configurer, nous passons par n8n, une plateforme d'automatisation de workflows en open source. Elle permet d'élaborer des scénarios d'automatisation, avec différents nœuds interconnectés. Vous pouvez aussi passer par Make par exemple.
Configurer sur n8n et cal.com pour connaitre les disponibilités
Pour la fonction 'get_availabilities', nous créons un flux spécifique sur n8n. Le but est d'aller voir les disponibilités de l'appelé via son agenda et d'envoyer le résultat à Rounded. Pour cela, après avoir créé votre compte sur la plateforme n8n, qui offre un essai gratuit, nous allons dans "Personal". Nous cliquons sur la croix en dessous de "Add first step", puis choisissons dans le menu déroulant "Webhook". Sur le nœud webhook, dans "Paramètres" et "Production URL", nous copions la "Production URL" en "GET".

Nous la collons dans la section "Tools" en bas de la tâche "prise_rdv" sur Rounded, dans la section "get_avalabilities" créée. Cela permet de connecter n8n à Rounded.

Retour sur n8n. Toujours en appuyant sur la flèche en haut à droite du module get-avalabilities de n8n, nous créons un nœud "http request". Il permet d'effectuer des requêtes HTTP pour interroger les données de cal.com via une API REST. Cela nécessite évidemment l'inscription préalable à Cal.com pour se connecter à son calendrier, un Google Calendar dans notre cas. Nous choisissons dans cette section la méthode "GET" et nous mentionnons comme URL : https://api.cal.com/v2/slots. Notons qu'au niveau des paramètres de requête de ce module, nous mentionnons des expressions de début et de fin d'action avec les fonctions fx{{ $json.query.start}} et fx{{ $json.query.end}}
Nous terminons ensuite le workflow par un module "Respond to Webhook". Les données envoyées à Rounded le seront au format JSON.

Confirmer le rendez-vous
La deuxième fonction à mettre en place dans n8n est confirm_appointment . Elle permet de confirmer le rendez-vous et de l'enregistrer. Elle nécessite aussi la mise en place d'un webhook. L'URL s'obtient avec la méthode "Post". Elle est mise sur le "Tool" correspondant dans Rounded. La création d'un nœud "Code" permet ensuite de mentionner ce code JavaScript, qui gère notamment les fuseaux horaires :
"const input = $input.first().json.body.slotStartTime; const zone = $input.first().json.body.timeZone || "Europe/Rome";const dt = DateTime.fromISO(input, { zone });const utc = dt.setZone('UTC').toFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");return [{ formattedDate: utc }];"
Le troisième nœud généré est nommé "HTTP Request". Avec la méthode "Post", on mentionne l'URL https://api.cal.com/v2/bookings. Le quatrième nœud est un "IF ". Il permet de diviser le flux de travail de manière conditionnelle en fonction d'opérations de comparaison. On mentionne dans les conditions : fx {{ $json.status }} "is equal to" "success". Indiquons qu'en termes simples, fx {{ $json.status }} signifie : "Evaluez cette expression, puis récupérez la valeur de la propriété "status" de l'objet "$json", et intégrez cette valeur ici."
Pour répondre de façon positive ou négative à la confirmation de rendez-vous, le nœud final se divise en deux autres nœuds, des "Respond to webhook". Le premier contient la demande de répondre en JSON à Rounded avec la fonction : "{"instructions": "You can confirm to the caller that the appointment has been booked successfully"} (avec. Le deuxième, toujours avec une réponse en JSON à Rounded: {
"instructions": "Error: the appointment was not confirmed, you either made mistake and entered the timeslot in the wrong format or it's not available, try again with the right format, and if it's a failure propose new timeslots." }

Voilà, les grandes étapes de mise en place des appels pour regarder les disponibilités et confirmer le rendez-vous ont été mises en place. Notons que les outils "Wait" et "hang_up", pour attendre ou raccrocher, ont aussi été activés dans les "tools" de la tâche "prise_rdv" dans Rounded.
Tester l'agent
Une fois l'agent configuré, le tester doit permettre de s'assurer qu'il répond correctement. Cela peut aussi permettre d'affiner le workflow et les prompts. Pour l'essayer efficacement, il est conseillé de lancer des appels de tests avec des requêtes diverses puis d'analyser les réponses. L'itération doit permettre d'améliorer l'agent. Pour cela, cliquez en haut à droite de l'interface de Rounded sur "Talk to agent" et "Start Call"
Autorisez l'utilisation des micros par "app.callrounded.com." Vous pouvez alors simuler la prise de rendez-vous. Une façon d'observer comment l'agent se comporte plus en détail. Ici, nous testons une prise de rendez-vous "classique", dont voici la transcription.

On voit que l'appel se passe relativement bien. Le rendez-vous est pris et confirmé. La voix de l'agent est agréable, la conduite de la prise de rendez-vous est plutôt cohérente. La prise de note n'est pas parfaite pour l'écriture du mail. On note sur la transcription qu'au moment de chercher les disponibilités, l'agent fait appel à la fonction "get_availabilities", et au moment de la confirmation du rendez-vous, à la fonction confirm_appointment. La confirmation du rendez-vous est aussi envoyée dans la boite mail de l'appelé.

N'oubliez pas de bien régler les paramètres, notamment "Timezone" dans l'outil confirm_appointment.

Lorsque vous trouvez que l'agent fonctionne suffisamment bien, vous pouvez le déployer afin de la rendre opérationnel. Cliquez pour cela sur "Deploy" en haut à droite de l'interface. Vous pouvez ensuite attribuer un numéro de téléphone pour rendre joignable l'agent par téléphone, en cliquant sur l'onglet "Phone numbers", à gauche du module. Sélectionnez votre agent sous "Agent Appel entrant." Vous pouvez désormais l'appeler.
Bien sûr, vous pouvez aller plus loin. Par exemple, en connectant l'agent à votre CRM. Ou en important des Knowledge Bases pour le faire répondre à certaines questions. Ou bien en automatisant les campagnes d'appels avec un fichier CSV contenant des informations sur vos contacts.