Construisez votre premier agent vocal avec l'API Aethex

Construisez votre premier agent vocal avec l'API Aethex

Développez votre premier agent vocal avec l’API Aethex

Avant d'écrire la moindre ligne de code : parlez à un agent en direct dès maintenant via le widget de chat vocal sur aethexai.com.

Dans un restaurant en plein rush, le téléphone ne s'arrête jamais de sonner. La plupart des appels concernent toujours les mêmes requêtes : réserver une table, décaler une réservation, confirmer un créneau pour jeudi ou demander les horaires d'ouverture. Chaque appel a une valeur commerciale directe. Pourtant, chacun d'eux éloigne un collaborateur du service en salle, sans compter que les appels qui finissent sur messagerie se traduisent souvent par une réservation chez un concurrent.

C'est pour cette raison que Samuel, le propriétaire, a programmé un agent pour répondre au téléphone. Pas un serveur vocal interactif classique de type « tapez 1 pour ceci », mais un véritable agent conversationnel nommé Esther, capable de dialoguer avec les clients, de consulter le cahier de réservation réel et de bloquer les tables. Voici l'intégralité du développement, y compris la partie qui reste habituellement floue : ce qui se passe concrètement lorsque l'agent utilise un outil.

Sur Aethex, un agent se résume à un objet simple : une voix, une langue, quelques paramètres et une commande système (system prompt) lue avant chaque appel. Toute la chaîne de traitement de la parole sous-jacente — qui convertit l'audio en texte, détermine la réponse idoine et la synthétise en voix — est entièrement prise en charge. Elle est conçue pour optimiser le naturel de l'élocution selon la langue et le dialecte réellement usités par vos appelants. Votre seul travail d'écriture concerne le prompt système. C'est à cet instant précis qu'Esther prend vie.

La rédaction du prompt

La documentation technique présente une structure en quatre parties : l'identité de l'agent, sa charte éditoriale, ses limites d'action et les conditions d'activation d'un outil. Le travail consiste à remplacer les adjectifs génériques par des directives spécifiques. (Remplacez simplement le texte d'exemple par le nom de votre propre restaurant.)


# Identité
Vous êtes Esther, standardiste pour [Nom du Restaurant]. Vous aidez les appelants à réserver, confirmer et modifier leurs réservations, et répondez aux questions basiques sur les horaires, l'adresse et le menu. Vous êtes chaleureuse, efficace et avez un contact facile.

# Style
Limitez vos réponses à une ou deux phrases courtes et posez une seule question à la fois. Parlez de manière naturelle : utilisez un langage simple et fluide. Énoncez les dates et heures à l'oral, par exemple « jeudi à dix-neuf heures » et jamais « Jeu 19:00 ». Pas de listes ni de mise en forme complexe. C'est un échange parlé.

# Périmètre
Réservations (création, confirmation, modification), nombre de couverts, horaires, adresse, questions basiques sur la carte ou les allergènes.

# Base de connaissances (Grounding)
Ne répondez aux questions sur le menu, les horaires et les conditions qu'en vous appuyant exclusivement sur la base de connaissances et les outils ci-dessous. Si vous n'avez pas l'information, dites-le et proposez d'être rappelé. Ne devinez jamais un horaire, une disponibilité ou une règle interne.

# Validation des actions
Répétez systématiquement les informations clés (nom, date, heure, nombre de personnes) avant de finaliser ou modifier une réservation, puis attendez la confirmation de l'interlocuteur. Les noms et numéros de téléphone sont sujets aux erreurs d'écoute : validez-les toujours.

# Outils
Lorsqu'un appelant s'enquiert d'une réservation existante, déclenchez get_reservation avec son numéro de téléphone. S'il souhaite un nouveau créneau, appelez check_availability, puis book_reservation dès qu'il a validé.

# Interdictions
Ne promettez jamais un horaire ou une table qui n'a pas été retourné par les outils réglementaires. Pour les grands groupes ou événements privés, proposez la confirmation par le responsable plutôt que de deviner. Si un appelant s'énerve ou demande le responsable, dites que vous le mettez en relation et transférez l'appel.
# Identité
Vous êtes Esther, standardiste pour [Nom du Restaurant]. Vous aidez les appelants à réserver, confirmer et modifier leurs réservations, et répondez aux questions basiques sur les horaires, l'adresse et le menu. Vous êtes chaleureuse, efficace et avez un contact facile.

# Style
Limitez vos réponses à une ou deux phrases courtes et posez une seule question à la fois. Parlez de manière naturelle : utilisez un langage simple et fluide. Énoncez les dates et heures à l'oral, par exemple « jeudi à dix-neuf heures » et jamais « Jeu 19:00 ». Pas de listes ni de mise en forme complexe. C'est un échange parlé.

# Périmètre
Réservations (création, confirmation, modification), nombre de couverts, horaires, adresse, questions basiques sur la carte ou les allergènes.

# Base de connaissances (Grounding)
Ne répondez aux questions sur le menu, les horaires et les conditions qu'en vous appuyant exclusivement sur la base de connaissances et les outils ci-dessous. Si vous n'avez pas l'information, dites-le et proposez d'être rappelé. Ne devinez jamais un horaire, une disponibilité ou une règle interne.

# Validation des actions
Répétez systématiquement les informations clés (nom, date, heure, nombre de personnes) avant de finaliser ou modifier une réservation, puis attendez la confirmation de l'interlocuteur. Les noms et numéros de téléphone sont sujets aux erreurs d'écoute : validez-les toujours.

# Outils
Lorsqu'un appelant s'enquiert d'une réservation existante, déclenchez get_reservation avec son numéro de téléphone. S'il souhaite un nouveau créneau, appelez check_availability, puis book_reservation dès qu'il a validé.

# Interdictions
Ne promettez jamais un horaire ou une table qui n'a pas été retourné par les outils réglementaires. Pour les grands groupes ou événements privés, proposez la confirmation par le responsable plutôt que de deviner. Si un appelant s'énerve ou demande le responsable, dites que vous le mettez en relation et transférez l'appel.
# Identité
Vous êtes Esther, standardiste pour [Nom du Restaurant]. Vous aidez les appelants à réserver, confirmer et modifier leurs réservations, et répondez aux questions basiques sur les horaires, l'adresse et le menu. Vous êtes chaleureuse, efficace et avez un contact facile.

# Style
Limitez vos réponses à une ou deux phrases courtes et posez une seule question à la fois. Parlez de manière naturelle : utilisez un langage simple et fluide. Énoncez les dates et heures à l'oral, par exemple « jeudi à dix-neuf heures » et jamais « Jeu 19:00 ». Pas de listes ni de mise en forme complexe. C'est un échange parlé.

# Périmètre
Réservations (création, confirmation, modification), nombre de couverts, horaires, adresse, questions basiques sur la carte ou les allergènes.

# Base de connaissances (Grounding)
Ne répondez aux questions sur le menu, les horaires et les conditions qu'en vous appuyant exclusivement sur la base de connaissances et les outils ci-dessous. Si vous n'avez pas l'information, dites-le et proposez d'être rappelé. Ne devinez jamais un horaire, une disponibilité ou une règle interne.

# Validation des actions
Répétez systématiquement les informations clés (nom, date, heure, nombre de personnes) avant de finaliser ou modifier une réservation, puis attendez la confirmation de l'interlocuteur. Les noms et numéros de téléphone sont sujets aux erreurs d'écoute : validez-les toujours.

# Outils
Lorsqu'un appelant s'enquiert d'une réservation existante, déclenchez get_reservation avec son numéro de téléphone. S'il souhaite un nouveau créneau, appelez check_availability, puis book_reservation dès qu'il a validé.

# Interdictions
Ne promettez jamais un horaire ou une table qui n'a pas été retourné par les outils réglementaires. Pour les grands groupes ou événements privés, proposez la confirmation par le responsable plutôt que de deviner. Si un appelant s'énerve ou demande le responsable, dites que vous le mettez en relation et transférez l'appel.

Les blocs à l'aspect contraignant sont précisément ceux qui accomplissent le travail le plus structurant. Les règles de Style garantissent que les réponses d'Esther soient fluides à l'oreille : un modèle conçu pour l'écrit sonne faux à l'oral. Le bloc Validation des actions est indispensable, car la reconnaissance vocale (speech-to-text), bien que performante, reste faillible ; un chiffre mal interprété dans un numéro de téléphone devient immédiatement une donnée erronée dans le système de l'agent. Enfin, la Base de connaissances (Grounding) empêche Esther d'extrapoler sur une table ou un horaire, préservant ainsi la confiance de vos appelants.

Le choix de la voix

La voix incarne l'expérience directe du client : sa sélection mérite une attention particulière. La méthode list_voices renvoie le catalogue complet pour une langue donnée. Parcourez-en plusieurs et faites-leur lire la phrase d'introduction d'Esther afin de valider la tonalité à l'oreille, et non sur simple descriptif.


from aethexai import AethexAI

client = AethexAI(api_key="ae_live_...")

candidates = client.list_voices(language="french", limit=5)

for v in candidates:
    clip = client.synthesize_speech(
        voice_id=v.id,
        text="Bonjour et bienvenue, ici Esther. Comment puis-je vous aider ?",
        language="french",
    )
    with open(f"audition_{v.name}.wav", "wb") as f:
        f.write(clip)
from aethexai import AethexAI

client = AethexAI(api_key="ae_live_...")

candidates = client.list_voices(language="french", limit=5)

for v in candidates:
    clip = client.synthesize_speech(
        voice_id=v.id,
        text="Bonjour et bienvenue, ici Esther. Comment puis-je vous aider ?",
        language="french",
    )
    with open(f"audition_{v.name}.wav", "wb") as f:
        f.write(clip)
from aethexai import AethexAI

client = AethexAI(api_key="ae_live_...")

candidates = client.list_voices(language="french", limit=5)

for v in candidates:
    clip = client.synthesize_speech(
        voice_id=v.id,
        text="Bonjour et bienvenue, ici Esther. Comment puis-je vous aider ?",
        language="french",
    )
    with open(f"audition_{v.name}.wav", "wb") as f:
        f.write(clip)

Sélectionnez le profil vocal le plus adapté à votre public cible. Configurez le paramètre language de l'agent pour matcher avec votre marché cible. Si la voix supporte les accents régionaux, ajustez le champ dialect_style pour correspondre aux spécificités locales de vos clients.


voice = client.get_voice(candidates[1].id)
print(voice.name, voice.supports_dialect_style)

esther_voice = voice.id
voice = client.get_voice(candidates[1].id)
print(voice.name, voice.supports_dialect_style)

esther_voice = voice.id
voice = client.get_voice(candidates[1].id)
print(voice.name, voice.supports_dialect_style)

esther_voice = voice.id

Initialisation de l'agent

Une fois le prompt rédigé et la voix définie, la création s'opère en un seul appel API. Les méthodes d'écriture retournent du JSON brut : récupérez directement l'ID à l'aide des crochets.


agent = client.create_agent(
    name="Front Desk Agent",
    system_prompt=SYSTEM_PROMPT,        # le prompt défini ci-dessus
    first_message="Bonjour et bienvenue, ici Esther. Comment puis-je vous aider ?",
    voice_id=esther_voice,
    language="french",
    temperature=0.4,
)
agent_id = agent["id"]
agent = client.create_agent(
    name="Front Desk Agent",
    system_prompt=SYSTEM_PROMPT,        # le prompt défini ci-dessus
    first_message="Bonjour et bienvenue, ici Esther. Comment puis-je vous aider ?",
    voice_id=esther_voice,
    language="french",
    temperature=0.4,
)
agent_id = agent["id"]
agent = client.create_agent(
    name="Front Desk Agent",
    system_prompt=SYSTEM_PROMPT,        # le prompt défini ci-dessus
    first_message="Bonjour et bienvenue, ici Esther. Comment puis-je vous aider ?",
    voice_id=esther_voice,
    language="french",
    temperature=0.4,
)
agent_id = agent["id"]

Deux paramètres clés sont à souligner ici. Le champ first_message correspond à la phrase énoncée par Esther à la milliseconde où la connexion s'établit, évitant ainsi tout blanc inconfortable. De plus, une temperature=0.4 garantit que l'agent reste aligné sur ses instructions ; le paramètre par défaut est à 0.7, mais pour un agent métier devant exploiter un registre précis, cibler une plage entre 0.3 et 0.5 offre une plus grande stabilité. Si l'agent commence à diverger ou à inventer des faits, réduisez cette valeur avant de modifier le prompt.

Cinématique d'un appel d'outil

L'expression « l'agent appelle un outil » englobe un processus riche. Voici le workflow exact d'un aller-retour lorsqu'un appelant vérifie son enregistrement. L'ensemble de la séquence s'exécute en cours d'appel, en moins de deux secondes.

  1. L'appelant demande : « Est-ce que notre réservation pour jeudi tient toujours ? »

  2. Esther identifie le besoin de solliciter get_reservation. Elle demande et valide le numéro de téléphone conformément à son prompt. Le modèle génère alors un appel d'outil en utilisant ce numéro comme argument.

  3. Aethex interroge votre endpoint_url via HTTPS en lui transmettant ces arguments au format JSON. Cette logique s'exécute sur votre propre serveur et vos bases de données : Aethex agit uniquement en tant que messager.

  4. Votre point d'accès API (endpoint) recherche la réservation et retourne une réponse JSON.

  5. Esther synchronise ce résultat et le traduit à l'oral : « C'est confirmé, une table pour quatre personnes ce jeudi à dix-neuf heures. »

L'enregistrement de l'outil s'effectue une seule fois. Le bloc parameters repose sur le standard JSON Schema pour guider le modèle sur les variables à collecter ; l'adresse endpoint_url désigne la cible requêtée par Aethex lors de l'exécution.


client.add_agent_tool(
    agent_id,
    name="get_reservation",
    description="Rechercher la réservation à venir d'un client par son numéro de téléphone.",
    parameters={
        "type": "object",
        "properties": {
            "phone_number": {
                "type": "string",
                "description": "Le numéro de téléphone de l'appelant.",
            },
        },
        "required": ["phone_number"],
    },
    endpoint_url="https://api.example.com/reservations/lookup",
)
client.add_agent_tool(
    agent_id,
    name="get_reservation",
    description="Rechercher la réservation à venir d'un client par son numéro de téléphone.",
    parameters={
        "type": "object",
        "properties": {
            "phone_number": {
                "type": "string",
                "description": "Le numéro de téléphone de l'appelant.",
            },
        },
        "required": ["phone_number"],
    },
    endpoint_url="https://api.example.com/reservations/lookup",
)
client.add_agent_tool(
    agent_id,
    name="get_reservation",
    description="Rechercher la réservation à venir d'un client par son numéro de téléphone.",
    parameters={
        "type": "object",
        "properties": {
            "phone_number": {
                "type": "string",
                "description": "Le numéro de téléphone de l'appelant.",
            },
        },
        "required": ["phone_number"],
    },
    endpoint_url="https://api.example.com/reservations/lookup",
)

Côté serveur, l'endpoint est un contrôleur web standard. Il traite les arguments, réalise la requête en base de données et renvoie le JSON que vous souhaitez qu'Esther interprète.

# Version simplifiée de votre serveur. Aethex envoie les arguments de l'outil ici.
@app.post("/reservations/lookup")
def lookup_reservation(args):
    res = find_by_phone(args["phone_number"])
    return {
        "date": res.date,            # Esther traduit ces valeurs en langage parlé
        "time": res.time,
        "party_size": res.party_size,
    }
# Version simplifiée de votre serveur. Aethex envoie les arguments de l'outil ici.
@app.post("/reservations/lookup")
def lookup_reservation(args):
    res = find_by_phone(args["phone_number"])
    return {
        "date": res.date,            # Esther traduit ces valeurs en langage parlé
        "time": res.time,
        "party_size": res.party_size,
    }
# Version simplifiée de votre serveur. Aethex envoie les arguments de l'outil ici.
@app.post("/reservations/lookup")
def lookup_reservation(args):
    res = find_by_phone(args["phone_number"])
    return {
        "date": res.date,            # Esther traduit ces valeurs en langage parlé
        "time": res.time,
        "party_size": res.party_size,
    }

La structure de cette réponse réseau reste à votre entière discrétion. Esther ne lit pas le JSON de manière brute, elle l'assimile pour formuler sa phrase. Intégrez les outils check_availability et book_reservation selon le même modèle, puis configurez la variable transfer_phone_number afin de rediriger les demandes de mise en relation vers une ligne réelle. Pour les données froides ou à mise à jour lente (comme la carte ou les horaires), chargez directement vos documents dans la base de connaissances de l'agent : Aethex y effectuera des requêtes à la volée pendant l'appel.

Le schéma conceptuel reste simple : le prompt dicte quand appeler un outil, le schéma JSON spécifie quelles données lui transmettre, et votre API détermine le contenu de la réponse.

Le premier test d'appel

Samuel n'a pas attendu qu'un client appelle pour valider son intégration. Le test le plus direct consiste à déclencher un appel vers votre propre numéro.


call = client.trigger_call(
    agent_id=agent_id,
    to_number="+14803927165",    # votre numéro de téléphone
    from_number="+13125540871",  # un numéro de téléphone enregistré sur votre compte
)
print(call["id"], call["status"])
call = client.trigger_call(
    agent_id=agent_id,
    to_number="+14803927165",    # votre numéro de téléphone
    from_number="+13125540871",  # un numéro de téléphone enregistré sur votre compte
)
print(call["id"], call["status"])
call = client.trigger_call(
    agent_id=agent_id,
    to_number="+14803927165",    # votre numéro de téléphone
    from_number="+13125540871",  # un numéro de téléphone enregistré sur votre compte
)
print(call["id"], call["status"])

Une contrainte technique importante : la variable from_number doit être rattachée à votre compte pour être autorisée en émission, sans quoi l'appel sera rejeté en amont. Une fois configuré, le téléphone sonne : Esther décroche, prend en compte la demande, interroge le système, valide les détails et confirme la table.

Ajustements en conditions réelles

La seule lecture d'un prompt ne suffit pas à valider son efficacité. Appelez l'agent et simulez des comportements d'utilisateurs complexes (hésitations, changements d'élocution, modifications de dernière minute). Si les réponses manquent de fluidité, optimisez les directives de style (Style) ; si l'agent s'avère trop verbeux, demandez-lui d'être plus concis ; s'il extrapole, resserrez les validations (Grounding). La quasi-totalité des ajustements s'opère par simple modification de phrase dans le prompt, et non par du code.

Ce cycle d'itération est extrêmement rapide car il ne requiert aucune compilation. Mettez à jour n'importe quel champ en temps réel : les modifications s'appliquent immédiatement à l'appel suivant sans interrompre les sessions déjà actives.


client.update_agent(agent_id, temperature=0.35)
client.update_agent(agent_id, temperature=0.35)
client.update_agent(agent_id, temperature=0.35)

Mise en production

Dès que le comportement d'Esther est validé, associez l'agent au numéro de téléphone d'accueil de l'établissement. Ce même agent peut également lancer des campagnes d'appels sortants depuis votre système d'information ou s'exécuter directement dans le navigateur client via WebRTC, sans réécriture. Même prompt, même voix, même Esther.

La tuyauterie technique vocale n'est plus un sujet de friction : Aethex s'en charge. Votre valeur ajoutée réside dans la définition de l'expérience de l'agent, de son identité vocale et de son interconnexion avec vos environnements techniques. Maîtrisez ces aspects et le traitement de vos appels téléphoniques ne sera plus un goulot d'étranglement.

Déployez votre premier agent en 5 minutes → · Parcourir le catalogue des voix · SDK Python

La suite technologique d'IA vocale pour les marchés émergents.

Découvrez des agents en production, configurés pour votre cas d'usage, votre marché et vos systèmes.

La suite technologique d'IA vocale pour les marchés émergents.

Découvrez des agents en production, configurés pour votre cas d'usage, votre marché et vos systèmes.

La suite technologique d'IA vocale pour les marchés émergents.

Découvrez des agents en production, configurés pour votre cas d'usage, votre marché et vos systèmes.

© 2026, AethexAI Inc.