Transformez votre chatbot en voice bot
======================================

Si vous exploitez déjà un chatbot — une application Dify, un point de terminaison compatible OpenAI Chat ou n'importe quel service qui streame ses réponses en Server-Sent Events (SSE) — Manivox peut le mettre **au téléphone**. Vous le connectez comme **fournisseur Chatbot** et déposez un **nœud Chatbot** dans un flux : votre bot mène la conversation, et la pipeline vocale Manivox (reconnaissance vocale en entrée, synthèse vocale en sortie) le transforme en voice bot auquel les appelants parlent. Vous concevez et configurez le chatbot ; Manivox s'occupe de tout le volet vocal.

Le trajet d'un appel à travers votre bot
----------------------------------------

À chaque tour de conversation :

1. L'appelant parle ; Manivox transcrit la parole en temps réel (STT).
2. La phrase transcrite est envoyée en `POST` à votre point de terminaison.
3. Votre bot streame sa réponse en événements SSE.
4. Manivox convertit la réponse en voix au fil des tokens (TTS) — l'appelant commence à entendre la réponse avant même que votre bot ait fini de l'écrire.

**La latence se joue chez vous.** Manivox streame votre réponse à l'appelant dès qu'elle arrive : ce qui compte, c'est le délai jusqu'à votre *premier* token, pas la réponse complète. Visez le premier événement SSE en moins d'une seconde — au téléphone, chaque seconde supplémentaire est un blanc.

En quoi cela diffère des autres intégrations
--------------------------------------------

Les intégrations Manivox se répartissent en deux familles. Les Web Services et Composio fournissent au LLM de l'agent des *outils* qu'il peut invoquer en cours de conversation, le LLM reste maître du dialogue. Un fournisseur Chatbot fait l'inverse : il devient le **cerveau** d'un nœud Chatbot, où un bot externe répond à tout le tour à la place du LLM intégré.

IntégrationRôle dans la conversationQui répond à l'appelant    [**Web Services**](https://www.manivox.ai/docs/integrations/web-services) Un outil que l'agent appelle en cours de conversation Le LLM de l'agent (utilise le résultat de l'outil)   [**Composio**](https://www.manivox.ai/docs/integrations/composio) Un outil que l'agent appelle en cours de conversation Le LLM de l'agent (utilise le résultat de l'action)   **Fournisseur Chatbot** Le cerveau d'un nœud Chatbot Le bot externe (sa réponse est restituée telle quelle)  Consultez la [vue d'ensemble des intégrations](https://www.manivox.ai/docs/integrations/index) pour comparer tous les types d'intégration.

Configurer un fournisseur
-------------------------

![Ajout d'un fournisseur Chatbot SSE : endpoint, format, mapping et délégation aux comptes](/docs/chatbot-provider-config-dark.gif)

Les fournisseurs chatbot sont **gérés par votre organisation**, et non par un administrateur de la plateforme. Dans le tableau de bord, allez dans **Paramètres → Fournisseurs** (l'onglet Fournisseurs est accessible aux administrateurs de l'organisation), cliquez sur **Ajouter un fournisseur** et choisissez le type **Chatbot SSE**. L'**URL du point de terminaison SSE** est l'URL du chatbot qui accepte les requêtes `POST` et retourne un flux SSE de texte (par exemple `https://chatbot.example.com/api/chat`).

Les autres champs indiquent à Manivox comment dialoguer avec ce point de terminaison :

ChampObjet    **Format** Choisissez **Personnalisé (SSE clé/valeur)** ou **OpenAI Chat (flux)** (un point de terminaison `chat/completions` en streaming compatible OpenAI). Les mappages de champs ci-dessous ne s'appliquent qu'au format Personnalisé.   **Champ message** Nom du champ JSON pour le message utilisateur dans le corps POST. Par défaut `message`. (Format personnalisé uniquement.)   **Champ texte** Nom du champ JSON pour extraire les tokens de texte de chaque événement SSE. Par défaut `text`. (Format personnalisé uniquement.)   **Marqueur de fin** Valeur SSE qui signale la fin du flux. Par défaut `[DONE]`.   **Champs supplémentaires (JSON)** Objet JSON optionnel fusionné dans le corps de chaque requête POST, par exemple `{"bot_id": "my-bot"}`.  Les champs de mappage (champ message, champ texte) ne s'appliquent qu'au format **Personnalisé**. Avec **OpenAI Chat**, la forme des requêtes et des réponses suit la convention de streaming `chat/completions` d'OpenAI ; ces mappages sont donc inutiles.

Le contrat du point de terminaison
----------------------------------

Voici ce que votre endpoint doit accepter et renvoyer. Chaque requête est un `POST` HTTP avec `Content-Type: application/json` et `Accept: text/event-stream` ; si vous avez renseigné une clé API sur le fournisseur, elle est envoyée en `Authorization: Bearer <clé>`. La réponse doit être un flux SSE (lignes `data:`), clos par un événement final `data: [DONE]` (le marqueur de fin est configurable). Votre bot dispose de 60 secondes maximum pour streamer un tour.

### Format Personnalisé

Manivox envoie **uniquement la dernière phrase de l'appelant**, accompagnée d'un identifiant de session stable — **c'est votre bot qui conserve le contexte de la conversation**, indexé sur cet identifiant, identique pendant toute la durée de l'appel :

```
POST https://chatbot.example.com/api/chat
{
"message": "Je voudrais changer mon adresse de livraison",
"session_id": "clx123abc456"
}
```

Les noms de champs sont ceux configurés sur le fournisseur (`message` et `session_id` par défaut ; le champ de session est toujours `session_id`), et les **champs supplémentaires** sont fusionnés dans ce corps. Votre bot répond avec un événement SSE par fragment de texte ; le texte est lu dans le **champ texte** configuré (`text` par défaut) :

```
data: {"text": "Bien sûr."}
data: {"text": " Quelle est la nouvelle"}
data: {"text": " adresse ?"}
data: [DONE]
```

Une ligne SSE `data:` qui n'est pas du JSON valide est restituée telle quelle : un flux en texte brut fonctionne donc aussi.

### Format OpenAI Chat

Manivox envoie une requête de streaming `chat/completions` standard portant **l'historique complet de la conversation** du nœud (les messages système sont retirés — votre bot définit son propre comportement), et lit la réponse dans la forme de streaming standard (`choices[0].delta.content`, terminé par `data: [DONE]`) :

```
POST https://chatbot.example.com/v1/chat/completions
{
"messages": [
{"role": "user", "content": "Je voudrais changer mon adresse de livraison"},
{"role": "assistant", "content": "Bien sûr. Quelle est la nouvelle adresse ?"},
{"role": "user", "content": "12 rue des Roses à Lyon"}
],
"stream": true
}
```

Les tours Chatbot n'ont **pas de tool calling** : votre bot reçoit du texte et renvoie du texte. Si la conversation doit déclencher des actions (réservations, recherches…), gérez-les dans votre bot, ou faites transiter le flux vers un nœud Agent avec des [Web Services](https://www.manivox.ai/docs/integrations/web-services).

Écrire des réponses adaptées à la voix
--------------------------------------

Une réponse agréable à lire dans une fenêtre de chat peut être pénible au téléphone. Quand votre bot sert un appel vocal :

- **Restez court.** Une ou deux phrases par tour ; les monologues invitent l'appelant à couper la parole.
- **Aucune mise en forme.** Pas de Markdown, de listes à puces, d'émojis ni d'URL — tout ce que vous streamez est prononcé littéralement.
- **Du texte prononçable.** Écrivez les nombres, dates et références comme ils doivent être dits.
- **Streamez tôt.** Envoyez les premiers tokens dès que possible plutôt que d'attendre la réponse complète.

Déléguer à des comptes
----------------------

Lorsque le type est **Chatbot SSE**, la même fenêtre de fournisseur affiche une liste **Comptes**, une case à cocher par compte client de votre organisation. Cela permet de partager un même chatbot externe avec un ou plusieurs clients précis. Si vous ne cochez aucun compte, le fournisseur est **à l'échelle de l'organisation**, disponible pour tous les comptes ; si vous en cochez un ou plusieurs, il est restreint à ces comptes précis. Cette délégation est enregistrée sur le fournisseur lui-même, et à chaque appel, la plateforme résout le fournisseur chatbot de l'agent en fonction de son propre compte.

Vous pouvez modifier la délégation à tout moment en éditant le fournisseur : la liste de cases se pré-remplit avec les comptes auxquels il est actuellement délégué. Si votre organisation n'a pas encore de compte client, le fournisseur est simplement à l'échelle de l'organisation.

Les fournisseurs chatbot n'apparaissent **pas** dans la liste Connexions d'un compte. Ils n'apparaissent que dans la palette de nœuds de l'éditeur de flux, comme options de nœud de départ Chatbot, pour les comptes auxquels ils sont délégués.

Utilisation dans un flux
------------------------

Dans l'[éditeur de flux](https://www.manivox.ai/docs/agents/flow-editor) visuel, le nœud de départ Chatbot apparaît une fois par fournisseur chatbot disponible. Faites glisser celui que vous voulez sur le canevas : le fournisseur est lié au moment où vous déposez le nœud.

Ouvrez la fenêtre du nœud et vous y trouverez :

- **Fournisseur Chatbot** (onglet Général), en lecture seule. Il est défini lors de l'ajout du nœud. Pour utiliser un autre fournisseur, ajoutez un nouveau nœud Chatbot.
- **Message d'accueil** (optionnel), restitué par TTS au début de l'appel, avant la première prise de parole de l'utilisateur.
- Des réglages **TTS** et **STT** propres au nœud : laissez-les vides pour hériter des valeurs par défaut du workflow.
- Des **routes de sortie** : chaque route ajoute un point de sortie pour que la conversation puisse quitter le nœud chatbot et se poursuivre ailleurs dans le flux. Les nœuds Chatbot ne supportent que les routes *conversationnelles* (un classificateur observe la conversation) ; les routes basées sur des règles n'y sont pas disponibles.

Pour la référence complète des nœuds, voir [Nœuds](https://www.manivox.ai/docs/agents/nodes).