Voice agent avec Claude Code et ElevenLabs : build complet
L'agent a répondu à l'appel test avec ma propre voix, puis a fait quelque chose auquel je ne m'attendais pas. Il s'est arrêté. Assez longtemps pour que j'ai failli parler. Puis il m'a demandé gentiment l'orthographe du nom de l'entreprise que je venais de prononcer. Pas l'e-mail. L'entreprise. Parce que deux minutes plus tôt, j'avais dit à Claude Code d'arrêter de laisser l'agent deviner les noms propres, et Claude Code avait discrètement ajouté une ligne à l'invite système qui poussait l'agent à demander, à chaque fois.
Cette seule pause est le moment où j'ai arrêté de considérer cette chose comme un script et j'ai commencé à la traiter comme un employé.
J'avais passé l'après-midi précédent à construire un voice agent complet avec Claude Code comme cerveau d'orchestration, ElevenLabs comme moteur de voix et de conversation et Cal.com comme backend de réservation. Aucun service de colle. Non Faites des scénarios. Pas de Zapier au milieu. Juste trois API, un fichier .env, un extrait de code widget sur une page de destination et Claude Code lisant la documentation pour moi pendant que je décrivais ce que je voulais dans un anglais simple.
À la fin, j'avais un agent commercial capable de répondre avec une version clonée de ma propre voix, de qualifier un prospect dans cinq domaines, de consulter mon calendrier dans Central Time, de réserver un appel de découverte de 30 minutes et d'envoyer l'e-mail de confirmation, le tout à partir d'une bulle en forme de téléphone dans le coin d'un site Web. La première version a été brisée de cinq manières différentes. La cinquième version fonctionne. Cet article est une présentation complète de ce à quoi ressemble une véritable version de voice agent en 2026 – y compris les bugs, les calculs de crédit et les failles de sécurité que j'ai presque expédiées.
Pourquoi j'ai arrêté de penser aux agents vocaux comme une chose d'avenir
Pendant deux ans, j'avais traité les voice agent comme un problème de demain. Les démos étaient impressionnantes sur scène et bizarres en production. Cadence robotique. Disponibilité hallucinée. Le genre d'énergie « appuyez sur un pour vendre » qui fait que les humains raccrochent avant la deuxième invite.
Cela a changé tranquillement. Trois choses s'alignaient en même temps. ElevenLabs Agents est devenu un véritable produit : un clonage vocal qui traverse l'étrange vallée avec Clonage vocal professionnel à plus de 30 minutes d'audio, une latence de conversation qui ne ressemble plus à un retard satellite et une facturation à la minute qui correspond en réalité à une analyse de rentabilisation. Cal.com expédié un v2 API propre où la création de réservation ne nécessite pas d'authentification et la disponibilité des emplacements est un seul GET. Et Claude Code a appris à lire une page de documentation API tierce, à me poser trois questions pointues et à écrire le code d'intégration sans que je quitte VS Code.
Cette dernière partie est le déverrouillage. Les connaissances techniques requises pour câbler ElevenLabs à Cal.com constituaient autrefois le goulot d'étranglement. Maintenant, le goulot d’étranglement est de savoir ce que vous voulez que l’agent fasse.
Écoutez, je ne vous vends pas une vision selon laquelle la voix remplacerait les humains. Je vous vends un cas d'utilisation unique et précis où les calculs sont si simples que ce serait une faute professionnelle de ne pas l'expédier : un agent qui répond au trafic entrant de votre site un dimanche à 23 heures, qualifie le prospect et réserve la réunion sur votre calendrier réel avant que le visiteur ne ferme l'onglet. C'est ce que j'ai construit. C’est ce que je vais vous expliquer.
Mais avant de passer à la construction, vous devez comprendre quelque chose que la plupart des didacticiels ignorent. Un voice agent n’est pas une chose. Il s'agit de quatre éléments assemblés ensemble - et si vous ne comprenez pas les quatre éléments, la construction ressemble à de la magie et le débogage ressemble à une devinette.
Les quatre éléments de tout agent vocal
Chaque voice agent sur le marché – le vôtre, le mien, celui que l'arbre téléphonique de votre banque souhaite – est une combinaison de quatre composants. Si vous vous trompez sur l’un de ces éléments, tout s’effondre. Si les quatre sont réussis, l'agent se sent comme un collègue.
Persona est l'invite du système. Le ton, le style, le vocabulaire, ce que l'agent dira et ne dira pas, comment il gère les objections, ce qu'il fait lorsqu'il ne connaît pas de réponse. C’est la partie où la plupart des builds se trompent de manière embarrassante. Ils collent "Vous êtes un assistant utile" et se demandent pourquoi l'agent ressemble à tous les autres AI sur Internet. Le persona est l’endroit où vit votre marque. C'est la différence entre un agent qui dit "Je serais heureux de vous aider" et un agent qui dit "Expliquez-moi ce que vous essayez de réparer et je verrai si nous sommes d'accord".
Voice est la voix synthétique qui pilote l'audio. ElevenLabs vous offre trois options réelles : une voix stock de leur bibliothèque, un Instant Voice Clone construit à partir d'une à cinq minutes d'audio propre, ou un Professional Voice Clone construit à partir de 30 minutes minimum et idéalement plusieurs heures de matériel source. J'y suis allé avec un Professional Voice Clone formé sur environ quatre heures de ma propre voix – anciens épisodes de podcast, enregistrements d'écran, tutoriels commentés. Le chiffre de quatre heures n’est pas arbitraire. Après environ deux heures, le modèle capte la cadence et les schémas respiratoires qui manquent aux clones d'une heure. Au-delà de quatre heures, les retours s'aplatissent durement. Cela ne sert à rien de lui en donner vingt.
La base de connaissances est ce que l'agent sait. Le mien était constitué de toutes les transcriptions de ma chaîne YouTube, ainsi que d'un document structuré décrivant mes services, mes tarifs et les types de projets que j'entreprends. ElevenLabs les ingère en tant que documents RAG joints à l'agent. L'agent peut les citer, les résumer, refuser de répondre à des questions extérieures à eux. Pour un agent commercial, la base de connaissances est principalement constituée de votre propre argumentaire. Pour un agent d'assistance, il s'agit de la documentation produit.
Les outils sont les choses que l'agent peut réellement faire. C’est là que la plupart des agents de démonstration tombent face contre terre. Ils peuvent parler. Ils ne peuvent pas agir. Un véritable agent est associé à des outils : un point de terminaison de réservation Cal.com, un webhook CRM, une recherche de dépôt GitHub, un serveur MCP, un script Python qui interroge une base de données client, un webhook Zapier qui déclenche l'étape suivante d'un flux de travail. Ce sont les outils qui rendent l’agent utile plutôt que théâtral.
La version que je parcoure utilise les quatre. Persona est une voix commerciale chaleureuse et professionnelle B2B. La voix est mon propre clone. La base de connaissances est mon document de transcriptions et de services YouTube. Il existe deux outils : la disponibilité des emplacements Cal.com et la création de réservation Cal.com, directement contre le v2 API.
C'est l'architecture. Voici maintenant ce qu’il a fallu pour le construire.
La configuration avant que Claude Code ne touche quoi que ce soit
J'ai commencé dans VS Code avec une petite page de destination Next.js déjà exécutée sur localhost:3000. Rien d'extraordinaire - une section héros, un bouton CTA, un div vide où la voix widget finirait par monter. La page existait parce que je voulais que Claude Code ait un endroit réel où déposer le widget une fois sur place. Construire un voice agent sans page hôte revient à insonoriser une pièce avant de construire les murs.
J'ai ouvert l'extension Claude Code dans VS Code. Si vous ne l'avez jamais utilisé dans l'EDI auparavant, l'expérience est différente de celle du terminal sur un point important : Claude Code peut voir votre arborescence de fichiers, lire le code existant et écrire directement dans le projet sans que vous ayez à copier-coller quoi que ce soit. L'extension est la manière recommandée d'utiliser Claude Code dans VS Code, et pour une version comme celle-ci, la vue différentielle côte à côte gagne sa place dans les dix premières minutes.
Ensuite, j'ai tapé un paragraphe dans Claude Code. À peu près:
Je souhaite créer un agent de vente vocal pour mon site Web. Il doit répondre aux questions sur mes services, qualifier le prospect en lui demandant son nom complet, son adresse e-mail, le nom de l'entreprise, le problème qu'il essaie de résoudre et la taille de l'équipe, puis réserver un appel de découverte de 30 minutes sur mon calendrier Cal.com. La voix devrait être mon Professional Voice Clone dans ElevenLabs — je vous donnerai l'identifiant vocal. Le ton doit être chaleureux mais professionnel, des ventes B2B, pas de simulation d'enthousiasme, pas de langage cliché AI. Commençons par me demander ce que vous devez savoir.
Claude Code n'a pas commencé le codage. Il posait cinq questions dans un seul message. Quel est mon slug de type d’événement Cal.com ? Dans quel fuseau horaire dois-je souhaiter la disponibilité ? Est-ce que je souhaite une fenêtre d'heures de travail spécifique ou utiliser la fenêtre par défaut du calendrier ? Que doit faire l'agent lorsque le visiteur souhaite réserver en dehors de mes horaires ? Ai-je une clé ElevenLabs API et une clé Cal.com API, ou dois-je m'aider à les générer ?
C’est la partie qui compte tranquillement. Un développeur junior aurait commencé à écrire du code immédiatement et aurait passé une heure à réécrire le flux de qualification lorsque je lui ai dit à mi-chemin que j'avais besoin de la taille de l'entreprise sous forme de plage numérique, et non d'un champ de texte libre. Claude Code a demandé en premier.
J'ai répondu. Le type d'événement Cal.com était discovery-call-30. Fuseau horaire Central Time. Horaires de travail de 9h à 21h en semaine. Si en dehors des heures d'ouverture, proposez le prochain créneau disponible. J'avais les deux clés API prêtes. Ensuite, Claude Code a écrit un plan sous forme de fichier de démarque et l'a déposé dans le dépôt. Le plan répertoriait chaque fichier qu'il créerait, chaque appel API qu'il effectuerait, chaque variable d'environnement dont il aurait besoin et l'ordre dans lequel il serait intégré. J'ai lu le plan, demandé un changement - stocker les réponses de qualification sous forme d'objet JSON structuré qui est envoyé à un webhook avant la réservation, afin que je puisse diriger les prospects vers mon CRM plus tard - et j'ai donné le feu vert.
La construction, dans l'ordre dans lequel elle s'est réellement produite
C'est là que la plupart des tutoriels sont présentés à la main. Ils disent "Claude Code a généré l'intégration" et passent à la démo. Je veux vous donner l'ordre réel, car c'est l'ordre qui fait fonctionner la boucle d'itération.
Tout d'abord, le fichier .env. Claude Code a créé .env.local avec trois variables supprimées : ELEVENLABS_API_KEY, CAL_COM_API_KEY, ELEVENLABS_AGENT_ID laissées vides pour l'instant. Il a également ajouté .env.local à .gitignore sans que je le demande. Petite chose, mais chaque fois qu'un LLM se souvient des règles d'hygiène de sécurité de base sans invite, je le remarque.
Deuxièmement, l'agent ElevenLabs lui-même. Claude Code a appuyé sur ElevenLabs Agents API pour créer un nouvel agent, par programme et non via le tableau de bord. L'appel create-agent accepte un corps JSON avec l'invite système, l'ID vocal, les ID de document de la base de connaissances et les définitions d'outils. Claude Code a écrit l'invite système en tant que fichier de démarque distinct (prompts/sales-agent-system.md) afin que je puisse l'itérer dans le contrôle de version. Voici à peu près à quoi ressemblait la première ébauche :
You are a sales voice agent for Mejba, a software engineer who builds AI
systems, automates workflows, and ships custom Claude Code integrations.
# Goal
Qualify the prospect. Answer their questions about Mejba's services. If they
seem like a fit, book a 30-minute discovery call on Mejba's calendar.
# Voice & Tone
- Warm but professional. B2B sales, not retail support.
- Never use the words "absolutely", "amazing", "I'd be happy to", or any
variation that signals AI-cliche language.
- Speak in short sentences. Pause after asking a question.
- If the prospect goes on a tangent, listen. Do not interrupt to redirect.
# Qualification Fields (collect in this order, naturally)
1. Full name (ask them to spell the last name back if uncertain)
2. Email (read it back to confirm)
3. Company name (ask for the spelling, every time)
4. The problem they're trying to solve, in their own words
5. Team size (ask for an approximate number of people)
# Booking
- Once qualified, offer the next three available 30-minute slots from
Cal.com via the get_available_slots tool.
- Confirm the slot in Central Time before calling create_booking.
- After booking, confirm the email confirmation will arrive within minutes.
# Boundaries
- Do not quote prices. Tell the prospect Mejba reviews scope before quoting.
- Do not promise specific delivery timelines.
- If asked something you don't know, say so plainly and offer to follow up.
Cette invite a été réécrite quatre fois avant que l'agent ne se sente bien. Je reviendrai sur les réécritures dans la section suivante. Mais la structure – rôle, objectif, voix, qualification, réservation, limites – n’est que l’os. Chaque invite système voice agent que j'écris suit maintenant exactement cette forme en six sections.
Troisièmement, les outils. Claude Code a défini deux outils personnalisés sur l'agent. get_available_slots accepte une plage de dates et un fuseau horaire, atteint le point de terminaison /v2/slots de Cal.com et renvoie une liste des fenêtres de 30 minutes disponibles. create_booking accepte le nom du participant, l'adresse e-mail, les champs de qualification comme métadonnées et un créneau choisi, et atteint le point de terminaison /v2/bookings de Cal.com. Les deux outils fonctionnent sous forme de fonctions sans serveur dans l'application Next.js sous app/api/. L'agent ElevenLabs appelle ces points de terminaison via des outils webhook, ce qui signifie que ElevenLabs envoie un HTTPS POST à mon point de terminaison, mon point de terminaison atteint Cal.com et la réponse revient via l'agent.
La raison de l'indirection (l'agent appelle mon serveur, mon serveur appelle Cal.com) est critique et mérite d'être ralentie. Si vous placez la clé Cal.com API directement dans la configuration de l'outil ElevenLabs, cette clé se trouve dans la définition de l'agent. Toute personne pouvant voir la configuration de l’agent peut voir la clé. En routant via mes propres points de terminaison, la clé Cal.com ne réside que dans .env.local sur Vercel. L’agent ne dispose d’aucune information d’identification propre. Il parle juste à mon webhook. Ce modèle apparaît à nouveau dans la section sécurité, mais il commence ici.
Quatrièmement, le widget. Une fois l'ID d'agent renvoyé du ElevenLabs API, Claude Code a déposé l'extrait d'intégration dans la page de destination. L'extrait ressemble à peu près à ceci :
<elevenlabs-convai
agent-id="agent_xxxxxxxxxxxxxxxxxxxxx"
></elevenlabs-convai>
<script
src="https://unpkg.com/@elevenlabs/convai-widget-embed"
async
type="text/javascript"
></script>
Deux balises. C’est toute la surface côté client. Le widget monte un bouton d'icône de téléphone flottant dans le coin inférieur de la page. Cliquez dessus et une conversation vocale en temps réel démarre. Tout le reste (le flux de qualification, la logique du calendrier, la réservation) s'exécute côté serveur ou dans le cerveau de l'agent.
J'ai appuyé sur Enregistrer. localhost:3000 actualisé. La bulle du téléphone est apparue. J'ai cliqué dessus. Et puis les bugs ont commencé.
Cinq choses cassées. Voici ce que chacun m'a appris.
C'est la section que j'aimerais que chaque tutoriel voice agent ait. Parce que la construction est la partie la plus facile. Le premier appel est l’endroit où vous apprenez qui est réellement votre agent.
Premier bug : l'agent n'a rien dit au début de l'appel. J'ai cliqué sur l'icône du téléphone, la connexion s'est ouverte, puis il y a eu le silence. L'agent m'attendait. Comme un appel Zoom gênant. ElevenLabs Agents a un champ first_message dans la configuration de l'agent - une chaîne littérale que l'agent prononce au moment de l'ouverture d'une session - et Claude Code l'avait laissé vide car je n'en avais pas spécifié dans mon mémoire. J'ai dit à Claude Code "Réglez le premier message sur quelque chose comme : Hé, c'est l'assistant AI de Mejba - qu'est-ce que tu penses ?" Claude Code a mis à jour la configuration de l'agent via API, aucun redéploiement n'est nécessaire. L'appel suivant a commencé par un bonjour chaleureux.
Deuxième bug : la voix était fausse. Pas techniquement fausse : il s'agissait bien de mon voice clone. Mais la cadence était celle que fait chaque Instant Voice Clone où chaque phrase se termine par une légère cadence ascendante, comme si l'agent souriait à travers chaque mot. Cela ressemblait à un enregistrement du support client. Pour un agent commercial B2B, cette énergie était éteinte. Trop impatient. Légèrement faux.
Le correctif résidait dans les paramètres vocaux, pas dans l'invite. ElevenLabs vous propose quatre curseurs importants : vitesse, stabilité, similarité et exagération de style. J'ai demandé à Claude Code d'ouvrir la configuration de l'agent et de modifier les paramètres vocaux : stabilité jusqu'à 0,75 (variation plus cohérente et moins expressive), similarité jusqu'à 0,85 (plus proche des enregistrements source), exagération de style jusqu'à 0,3 (moins performative). J'ai ajouté une ligne à l'invite du système : "Parlez sur un ton calme et mesuré. Vous ne vendez pas. Vous écoutez." L’appel test suivant ressemblait à une vraie personne qui parlait – plus lentement, plus délibéré, sans sourire. Cette combinaison unique de réglage du curseur et d’instructions de tonalité s’est avérée être le plus grand levier de qualité de toute la construction.
Troisième bug : le fuseau horaire était erroné. Celui-ci a mis une heure à être trouvé. J'ai demandé à l'agent de vérifier la disponibilité pour « demain après-midi ». L'agent a déclaré que le premier créneau était 18 heures. Mon agenda était en fait grand ouvert à 11 heures du matin. J'ai supposé que Cal.com était cassé. Ce n’était pas le cas. v2 slots endpoint de Cal.com nécessite les paramètres de temps dans UTC, mais il accepte un paramètre timeZone pour le formatage de sortie. Claude Code avait correctement câblé la demande dans UTC mais n'avait pas défini le paramètre timeZone sur la réponse. L'agent relisait donc les horaires dans UTC et les annonçait comme Central Time. 11h00 Le centre de UTC est 16h00. Ajoutez la politique de préavis minimum de deux heures de Cal.com et le premier créneau que l'agent a pu voir est passé à 18 heures.
Le correctif consistait en quatre lignes de code. Claude Code a ajouté timeZone=America/Chicago à la requête d'emplacements, analysé le champ time de la réponse (qui est maintenant revenu déjà converti) et a mis à jour l'invite système pour dire "Toujours lire les heures au prospect dans Central Time". Ensuite, nous avons testé. 11 heures du matin sont arrivées. L'agent a dit "J'ai 11 heures du matin au centre demain". Je pousse un petit soupir de soulagement.
Si vous ne vous souvenez de rien d'autre de cet article, rappelez-vous ceci : lorsqu'un agent piloté par LLM fait quelque chose de bizarre avec le temps, il s'agit presque toujours d'un bug de fuseau horaire, et ce n'est presque jamais la faute du modèle.
Bogue n°4 : l'e-mail était mal formaté et le nom de l'entreprise était mal orthographié. J'ai testé le flux de réservation en prononçant mon e-mail à voix haute : "mejba dot one three at gmail dot com". L'agent a confirmé "M-E-G-B-A sur gmail dot com". Faux. La transcription vocale confond régulièrement M-E-J avec M-E-G lorsqu'il n'y a pas de contexte de dictionnaire. Même problème avec les noms d'entreprises. L'agent n'avait aucun moyen de savoir si j'avais dit « Acme Inc » ou « Acne Inc ».
Le correctif était au niveau de l'invite et non au niveau du code. J'ai demandé à Claude Code d'ajouter ce bloc à l'invite système :
# Spelling Discipline
For any proper noun the prospect provides — full name, email, company —
do NOT trust your transcription. Always:
1. Repeat the value back, letter by letter for short tokens (names, the
local part of an email, company names under 8 characters).
2. For longer values, repeat back and ask: "Did I get the spelling right?"
3. For email addresses, separate the local part and the domain when
reading back: "M-E-J-B-A dot one-three, at G-mail dot com — correct?"
4. If the prospect corrects you, accept the correction and read the new
spelling back one more time before moving on.
Lors du prochain appel test, j'ai dit "mejba dot one three at gmail dot com". L'agent fit une pause, puis le relut lettre par lettre. J'ai confirmé. La réservation s'est déroulée proprement. C'est la pause qui a ouvert cet article. C'est aussi le genre de changement de comportement qu'il est presque libre d'ajouter et qui améliore considérablement l'intelligence perçue par l'agent.
Bogue cinq : Cal.com a refusé de réserver "à tout moment dans les deux prochaines heures." L'agent n'arrêtait pas de répéter que le premier créneau était à deux heures et demie, même sur un calendrier clairement ouvert. Ce n'était pas un bug. Cal.com a une période de préavis minimale par défaut de 120 minutes pour les types d'événements – un paramètre conçu pour empêcher les humains de se réserver accidentellement quelque chose dans trois minutes. Je suis allé dans les paramètres du type d'événement Cal.com, j'ai réduit le préavis minimum à 30 minutes et j'ai testé à nouveau. L'agent proposait désormais des créneaux à partir de 35 minutes. Connaître les politiques par défaut de la plateforme fait partie de l'intégration avec celle-ci. Claude Code n'a pas inventé cette règle des 120 minutes ; Cal.com l'a fait. Mais Claude Code ne pouvait pas non plus savoir que je voulais l'ignorer, car je ne le lui avais pas dit.
Cinq bugs. Cinq correctifs. Temps total pour déboguer les cinq : environ quatre-vingt-dix minutes, Claude Code lisant à chaque fois la page de documentation correspondante et proposant le correctif avant d'avoir fini de lire l'erreur.
Mi-construction de côté
Si vous préférez que quelqu'un construise un voice agent comme celui-ci de bout en bout sur votre pile - voice clone, invite système, Cal.com ou HubSpot ou quel que soit le backend de réservation que vous utilisez, le verrouillage du nom d'hôte, l'ensemble du kit - c'est exactement le genre de projet que j'entreprends. Vous pouvez voir ce que j'ai construit et réserver un appel sur fiverr.com/s/EgxYmWD.
Sécurité : la conversation qui a failli ne pas avoir lieu
J'ai failli expédier ce truc sans penser à la sécurité. Le widget a fonctionné. Le calendrier a fonctionné. J'avais le doigt sur le bouton de déploiement.
Puis une petite voix utile au fond de ma tête m'a dit : toute personne disposant d'un navigateur peut ouvrir ce site, cliquer sur widget et commencer à graver mes crédits ElevenLabs.
Les agents vocaux ne sont pas comme les chatbots textuels. Chaque minute de conversation coûte de l’argent réel. Factures ElevenLabs Agents par minute de conversation, entre 0,08 $ et 0,12 $ selon le niveau, distinctes du quota de caractères de votre abonnement de base. Un appel abusif d’une heure coûte environ 5 à 7 dollars. Un botnet effectuant dix appels parallèles d’une heure chaque soir est le genre de facture qui gâche un mardi matin.
J'ai donc demandé à Claude Code d'ajouter quatre couches de sécurité avant le déploiement.
Liste autorisée de nom d'hôte. La plate-forme d'agent ElevenLabs prend en charge un hostname allowlist dans l'onglet Sécurité — vous spécifiez jusqu'à dix domaines, et toute connexion widget à partir d'un domaine ne figurant pas sur cette liste est rejetée lors de la négociation WebSocket. J'ai ajouté mejba.me, www.mejba.me et localhost:3000. Quiconque copie mon extrait widget sur son propre site ne peut pas utiliser mon agent.
Limitation de la durée des conversations. J'ai limité toute conversation à 8 minutes. Si un vrai prospect a besoin de plus de temps, il devrait passer un appel Zoom avec moi, sans abuser de mon robot vocal. Huit minutes suffisent pour se qualifier et réserver. Cela signifie également que le pire des cas pour un agresseur est d'environ 0,96 $ par séance.
Limitation du débit par IP. Claude Code a ajouté une petite fonction Vercel Edge devant le widget qui limite les connexions par IP. Trois séances par heure. La dixième séance en une heure donne un 429. Je n'ai pas inventé ce tarif. J'ai demandé à Claude Code de choisir des numéros qui bloquent une automatisation évidente sans rejeter un véritable utilisateur qui a raccroché et rappelé.
Escalade sécurisée. Pour la première version, j'ai laissé le widget public : un agent commercial qui nécessite une connexion est un agent commercial à qui personne ne parle. Mais Claude Code a écrit un indicateur de fonctionnalité pour signed URLs (la valeur par défaut recommandée selon la documentation d'authentification ElevenLabs) afin que je puisse faire passer l'agent en mode authentifié en 30 secondes si je constate un abus. Les URL signées nécessitent un jeton côté serveur avant que l'agent n'accepte une connexion. Si vous utilisez un agent interne (service d'assistance aux employés, portail partenaire), commencez par signed URLs et ne regardez jamais en arrière.
Je n'aime pas le calcul de sécurité sur les voice agent publics. Les aspects économiques rendent les abus trivialement faciles et la défense à plusieurs niveaux ennuyeuse. Mais les quatre contrôles ci-dessus font passer les dommages quotidiens du pire des cas de « potentiellement illimités » à « ennuyeux mais plafonnés ». C'est la ligne que vous devez franchir avant de mettre voice agent dans le domaine public.
Le calcul des coûts, honnêtement
La plupart des tutoriels évitent la facture. Je ne le ferai pas. Here is what running this agent actually costs as of May 2026.
La configuration du clonage vocal est unique. Le clonage vocal professionnel est inclus dans le forfait ElevenLabs Creator (22 $/month) et supérieur. The four hours of source audio I uploaded was processed once. The clone itself does not cost ongoing money — only the synthesized output does.
Facturation des conversations d'agent par minute. ElevenLabs Agents coûte 0,08 $ par minute au niveau standard et jusqu'à 0,12 $ par minute au niveau premium (qui utilise un LLM haut de gamme et le Flash voice model). Mon agent fonctionne au niveau standard. A typical sales conversation runs four to six minutes — say, $0.32 to $0.48 per qualified call.
Les crédits sont renouvelables pendant deux mois sur les forfaits payants. Les crédits inutilisés ne s'accumulent pas pour toujours. Planifiez votre consommation mensuelle en fonction du trafic réel attendu, et non de votre fantasme de croissance le plus fou.
Cal.com est gratuit à mon volume. Le niveau gratuit couvre un seul utilisateur avec un type d'événement de 30 minutes et un accès direct à API. Si vous avez besoin d’une planification d’équipe ou d’une affectation à tour de rôle, il s’agit d’un niveau payant – mais pour un opérateur solo, zéro.
Vercel est gratuit à mon volume. Le niveau hobby gère la page de destination et les deux routes API qui proxy vers Cal.com sans transpirer.
Ainsi, le coût de fonctionnement d'une version à faible trafic de cet agent est d'environ 22 $/month sur ElevenLabs (plan Creator, qui inclut le clonage vocal professionnel), plus les coûts de conversation par minute. Si l'agent traite dix appels par jour à raison de cinq minutes chacun, cela représente environ cinquante minutes par jour, soit 4 $ par jour, soit environ 120 /month $ en frais de conversation. Total : environ 142 $/month pour un agent commercial pleinement opérationnel qui planifie des réunions pendant votre sommeil.
À titre de comparaison, un BDR humain à temps partiel – quelqu'un qui répond aux appels entrants et qualifie les prospects – vous coûte environ 3 000 à 5 000 $ par mois et ne travaille pas le week-end. L'agent ne remplace pas un bon BDR. Il capte les appels qui autrement arriveraient sur la messagerie vocale et s'échapperaient dans le vide.
Le déployer là où les vrais visiteurs peuvent le trouver
Une fois que localhost:3000 a cessé de fonctionner, le déploiement était presque ennuyeux.
Synchronisation GitHub. Claude Code a initialisé un dépôt git s'il n'existait pas, a créé un dépôt GitHub privé via la CLI gh et a poussé le code. .env.local est resté local, n'a jamais touché la télécommande. Les variables d'environnement pour la production résidaient uniquement dans le tableau de bord de Vercel.
Déploiement de Vercel. Connecté le dépôt GitHub à un nouveau projet Vercel, ajouté les trois variables d'environnement (ELEVENLABS_API_KEY, CAL_COM_API_KEY, ELEVENLABS_AGENT_ID) dans les paramètres du projet de Vercel, appuyez sur déployer. Deux minutes plus tard, le site était en ligne sur un sous-domaine vercel.app. Ensuite, j'ai pointé voice.mejba.me vers le déploiement via DNS. Temps total de déploiement : environ six minutes.
Twilio pour téléphone. C'est la pièce que je n'ai pas encore livrée en production, mais l'architecture est en place. ElevenLabs Agents prend en charge l'intégration des numéros de téléphone Twilio dès le départ. Vous achetez un numéro, le collez dans l'onglet « Numéros de téléphone » de l'agent ElevenLabs, et le même agent qui répond à votre widget répond désormais aux appels téléphoniques réels. Même personnage. Même voix. Mêmes outils. Même intégration Cal.com. L'agent ne se soucie pas de savoir si l'audio provient d'un microphone de navigateur ou d'une ligne téléphonique. C'est la partie à laquelle je reviens sans cesse comme étant celle qui change discrètement l'analyse de rentabilisation : un agent, trois surfaces (widget, tableau de bord, téléphone), une invite, une base de connaissances.
Si vous avez déjà créé un flux de travail Claude Code piloté par MCP, vous vous demandez peut-être où se situe MCP dans cette version. La réponse courte est : ce n'est pas encore le cas – mais la réponse plus longue est que les mêmes modèles que j'ai parcourus dans ma répartition des MCP indispensables pour Claude Code s'appliquent directement aux voice agent au moment où vous souhaitez que l'agent interroge une base de données, lise votre Notion ou extraie un enregistrement client. Aujourd’hui, tout cela passe par mes webhooks côté serveur. Demain, ElevenLabs' MCP integration permettra à l'agent d'appeler ces serveurs directement avec l'authentification appropriée. L'architecture converge.
La boucle d'itération est la compétence
Voici la partie que je souhaite souligner avant de fermer cet onglet. La construction n’a pas été la partie la plus difficile. Claude Code a réalisé la construction. N'importe qui disposant de deux clés API et d'un brief clair aurait pu produire le même premier brouillon.
La compétence – la véritable compétence transférable – est la boucle d’itération. Les cinq bugs que j'ai décrits ci-dessus ne sont pas des échecs de Claude Code. Ils constituent la friction naturelle liée à l’intégration d’un agent LLM généraliste dans un contexte commercial spécifique. Chaque correction de bogue prenait la forme : remarquez le mauvais comportement, décrivez-le précisément à Claude Code, laissez Claude Code proposer le correctif, vérifiez l'intégrité du correctif, déployez, retestez. Cinq tours de cette boucle ont transformé un agent qui s'est arrêté maladroitement lors de l'ouverture d'un appel et a mal orthographié mon e-mail en un agent qui réserve de vraies réunions sur de vrais calendriers.
Il s'agit de la même boucle d'itération sur laquelle j'écris depuis des mois - celle où la valeur passe de "le AI peut-il le faire" à "l'humain peut-il repérer ce qui ne va pas assez rapidement pour diriger le prochain changement". J'ai approfondi cette dynamique exacte dans pourquoi le contexte bat la configuration lorsque vous créez des agents, et les leçons qui s'y déroulent battement pour battement dans cette version voice agent. Chaque modification rapide que j'ai apportée était une correction de contexte, pas une mise à niveau du modèle.
Les voice agent qui fonctionnent en production en 2026 ne sont pas ceux avec le meilleur voice clone ou le code d'intégration le plus propre. Ce sont eux dont les constructeurs ont exécuté la boucle d'itération quinze fois avant de mettre en ligne. La plupart des constructeurs abandonnent à trois heures.
Questions fréquemment posées
Combien coûte la création et l'exécution d'un voice agent avec ElevenLabs et Claude Code ?
Attendez-vous à environ 142 $ /month au total pour une production à faible trafic : 22 $ /month pour le plan ElevenLabs Creator (qui débloque le clonage vocal professionnel), plus environ 0,08 $ par minute de conversation, plus des niveaux gratuits sur Cal.com et Vercel. Un opérateur solo traitant dix appels qualifiés par jour à cinq minutes chacun rapporte près de 4/day $ en coûts de conversation.
De quelle quantité d'audio ai-je besoin pour cloner ma voix pour un agent ElevenLabs ?
Le clonage vocal professionnel ElevenLabs nécessite un minimum de 30 minutes, mais la qualité augmente sensiblement entre deux et quatre heures d'audio source propre. J'ai utilisé quatre heures et j'ai vu la cadence et les schémas respiratoires se verrouiller. Au-delà de quatre heures, les retours s'aplatissent. Pour le clonage vocal instantané, une à cinq minutes suffisent, mais le résultat est nettement moins naturel pour les conversations commerciales.
Le même agent ElevenLabs peut-il répondre aux appels téléphoniques et au site Web widget ?
Oui. ElevenLabs Agents prend en charge l'intégration du téléphone Twilio dans la même configuration d'agent qui alimente le site Web widget. Un personnage, une voix, une base de connaissances, un ensemble d'outils — trois surfaces. Vous achetez un numéro Twilio, le collez dans l'onglet des numéros de téléphone de l'agent et les appels entrants atteignent le même moteur de conversation que celui utilisé par votre widget.
Comment puis-je empêcher des visiteurs aléatoires de graver mes crédits ElevenLabs sur le widget public ?
Utilisez quatre couches : hostname allowlist dans l'onglet Sécurité de l'agent ElevenLabs (plafond sur vos domaines réels plus localhost), un plafond de durée par conversation (j'utilise 8 minutes), une limitation de débit par IP sur une fonction Vercel Edge devant le widget et un indicateur de fonctionnalité pour signed URLs si vous devez passer en mode authentifié lors d'une attaque. Voir la section sécurité ci-dessus pour la configuration exacte.
Why is my voice agent reading calendar times in the wrong timezone?
This is almost always a Cal.com /v2/slots configuration issue. The endpoint requires UTC time parameters on input but accepts a timeZone parameter for output formatting. Si vous oubliez de définir timeZone=America/Chicago (ou votre zone concernée) sur la requête, la réponse revient dans UTC et l'agent la lit comme si elle était déjà locale. Fix the request parameter and add a system-prompt line forcing the agent to always read times in the prospect's local zone.
Travaillons ensemble
Vous cherchez à créer des systèmes AI, à automatiser les flux de travail ou à faire évoluer votre infrastructure technologique ? J'aimerais aider.
- Fiverr (versions et intégrations personnalisées) : fiverr.com/s/EgxYmWD
- Portefeuille : mejba.me
- Ramlit Limited (solutions d'entreprise) : ramlit.com
- ColorPark (conception et image de marque) : colorpark.io
- xCyberSecurity (services de sécurité) : xcybersecurity.io