> ## Documentation Index
> Fetch the complete documentation index at: https://docs.volubile.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Configuration dynamique de l'agent

> Personnalisez et configurez votre agent vocal en temps réel

## Vue d'ensemble

La configuration dynamique permet de personnaliser le comportement de votre agent vocal pendant la sonnerie d'un appel. Cette fonctionnalité offre une flexibilité complète pour adapter l'agent aux spécificités de chaque interaction.

<Info>Cette configuration est destinée à être utilisée pendant les [workflows pré-appel](/fr/integrations/workflows/pre-call).</Info>

## Structure de la configuration

La configuration s'articule autour d'un objet JSON structuré permettant de définir l'ensemble des paramètres opérationnels de l'agent :

```json theme={null}
{
    "initialMessage": "Message initial",
    "prompt": "Prompt système",
    "synthesizer": {...},
    "callDurationLimit": "600",
    "rag": {...},
    "extractors": [...],
    "classifiers": [...],
    "actions": [...],
    "recordAudio": false
}
```

## Détail de la configuration

<ResponseField name="initialMessage" type="string">
  Message de salutation que l'agent utilisera pour débuter la conversation avec l'appelant.
</ResponseField>

<ResponseField name="prompt" type="string" required>
  Instructions principales définissant le comportement, la personnalité et les directives que l'agent doit suivre pendant l'appel.
</ResponseField>

<ResponseField name="synthesizer" type="object" required children="blabla">
  Configuration du moteur de synthèse vocale de l'agent.

  <Expandable title="child attributes" defaultOpen="True">
    <ResponseField name="synthesizer.textNormalizationPatterns" type="object">
      Règles de [substitutions vocales](/fr/product/agents/tts#substitutions-vocales) du texte avant synthèse vocale pour améliorer la prononciation.

      Les clés représentent les termes à normaliser. Les valeurs peuvent être :

      * Une chaîne de caractères pour un remplacement simple
      * Un objet avec des traductions spécifiques par locale

      ```json Exemple theme={null}
      {
          "kg": "kilogramme",
          "cm": {
              "fr-FR": "centimètre",
              "en-US": "centimeter"
          }
      }
      ```
    </ResponseField>

    <ResponseField name="synthesizer.voice" type="object" required>
      Paramètres de la voix synthétisée.

      ```json Exemple theme={null}
      {
          "locales": ["fr-FR", "en-US"],
          "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
          "model": "eleven_multilingual_v2"
      }
      ```

      <Expandable title="child attributes" defaultOpen="True">
        <ResponseField name="synthesizer.voice.locales" type="array" required>
          Liste des langues supportées par l'agent (codes `ISO 639-1`).
        </ResponseField>

        <ResponseField name="synthesizer.voice.id" type="string" required>
          Identifiant unique de la voix sélectionnée dans le catalogue Volubile.
        </ResponseField>

        <ResponseField name="synthesizer.voice.model" type="string">
          Identifiant du modèle de synthèse vocale à utiliser pour cette voix.

          Valeurs autorisées :

          * `eleven_v3`
          * `eleven_multilingual_v2`
          * `eleven_flash_v2_5`

          <Info>Ce paramètre n'est pris en compte que pour les voix dont le fournisseur supporte les modèles. En pratique, l'override est appliqué pour les voix ElevenLabs et ignoré pour les autres fournisseurs.</Info>
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="callDurationLimit" type="number" default="1800">
  Durée maximale autorisée pour l'appel avant raccrochage, exprimée en secondes.
</ResponseField>

<ResponseField name="rag" type="object">
  Configuration de la base de données de RAG (Retrieval-Augmented Generation).

  <Expandable title="child attributes" defaultOpen="True">
    <ResponseField name="rag.datasourceIds" type="array" required>
      Liste d'identifiants uniques des bases de données RAG à utiliser pour enrichir les réponses de l'agent.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="extractors" type="array">
  Liste des [extracteurs](/fr/product/calls/extractors) d'informations que l'agent doit utiliser pendant l'appel.

  ```json Exemple theme={null}
  [
      {
          "name": "Prénom du client",
          "description": "Prénom du client"
      },
      {
          "name": "Nom de famille du client",
          "description": "Nom de famille du client"
      }
  ]
  ```

  <Expandable title="child attributes" defaultOpen="True">
    <ResponseField name="extractors[].name" type="string" required>
      Nom de l'information à extraire.
    </ResponseField>

    <ResponseField name="extractors[].description" type="string" required>
      Description détaillée de l'information à extraire pour guider l'agent.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="classifiers" type="array">
  Liste des [classifieurs](/fr/product/calls/classifiers) pour catégoriser automatiquement les appels.

  ```json Exemple theme={null}
  [
      {
          "name": "Classifieur par défaut",
          "labels": ["Prise de RDV", "Informations pratiques", "..."],
          "description": "Prompt de classification détaillé..."
      },
      {
          "name": "Traitement",
          "labels": ["Echec transfert", "Appel transféré", "..."],
          "description": "Prompt de classification détaillé..."
      }
  ]
  ```

  <Expandable title="child attributes" defaultOpen="True">
    <ResponseField name="classifiers[].name" type="string" required>
      Nom du classifieur.
    </ResponseField>

    <ResponseField name="classifiers[].labels" type="string[]" required>
      Liste des étiquettes de classification disponibles.
    </ResponseField>

    <ResponseField name="classifiers[].description" type="string" required>
      Instructions détaillées sous la forme d'un prompt définissant les règles de classification pour chaque étiquette.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="actions" type="array">
  Liste des actions que l'agent peut exécuter pendant l'appel.

  <Expandable title="child attributes" defaultOpen="True">
    <ResponseField name="actions[].name" type="string" required>
      Nom de l'action.
    </ResponseField>

    <ResponseField name="actions[].type" type="string" required>
      Type d'action. Valeurs possibles : `TRANSFER_CALL`.
    </ResponseField>

    <ResponseField name="actions[].description" type="string" required>
      Instructions détaillées sur l'utilisation de l'action sous la forme d'un prompt.
    </ResponseField>

    <ResponseField name="actions[].headers" type="object">
      En-têtes HTTP personnalisés à transmettre lors de l'exécution de l'action.

      <Warning>Uniquement disponible en transfert SIP</Warning>
    </ResponseField>

    <ResponseField name="actions[].ringTimeout" type="number" default="20">
      Durée maximale d'attente lors d'un transfert d'appel, exprimée en secondes.
    </ResponseField>

    <ResponseField name="actions[].sipOutboundConnectionId" type="string">
      Identifiant de la connexion SIP sortante utilisée pour les transferts.
    </ResponseField>

    <ResponseField name="actions[].availability" type="object">
      Disponibilité globale de l'action par jour de la semaine. Peut être `null` si aucune restriction.

      ```json Exemple theme={null}
      {
          "MONDAY": [
              {
                  "startTime": "07:30",
                  "endTime": "12:30"
              },
              {
                  "startTime": "13:15",
                  "endTime": "18:00"
              }
          ]
      }
      ```

      <Expandable title="child attributes" defaultOpen="True">
        <ResponseField name="actions[].availability.MONDAY" type="array">
          Créneaux horaires disponibles le lundi.

          <ResponseField name="actions[].allowedToPhones[].availability.MONDAY[].startTime" type="string">
            Heure de début de disponibilité au format HH:MM.
          </ResponseField>

          <ResponseField name="actions[].allowedToPhones[].availability.MONDAY[].endTime" type="string">
            Heure de fin de disponibilité au format HH:MM.
          </ResponseField>
        </ResponseField>

        <ResponseField name="actions[].availability.TUESDAY" type="array">
          Créneaux horaires disponibles le mardi.
        </ResponseField>

        <ResponseField name="actions[].availability.WEDNESDAY" type="array">
          Créneaux horaires disponibles le mercredi.
        </ResponseField>

        <ResponseField name="actions[].availability.THURSDAY" type="array">
          Créneaux horaires disponibles le jeudi.
        </ResponseField>

        <ResponseField name="actions[].availability.FRIDAY" type="array">
          Créneaux horaires disponibles le vendredi.
        </ResponseField>

        <ResponseField name="actions[].availability.SATURDAY" type="array">
          Créneaux horaires disponibles le samedi.
        </ResponseField>

        <ResponseField name="actions[].availability.SUNDAY" type="array">
          Créneaux horaires disponibles le dimanche.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="actions[].allowedToPhones" type="array">
      Liste des numéros de téléphone ou identifiants SIP autorisés pour les transferts.

      <Expandable title="child attributes" defaultOpen="True">
        <ResponseField name="actions[].allowedToPhones[].phone" type="string" required>
          Numéro de téléphone ou identifiant SIP de destination pour le transfert.

          <Warning>Un identifiant SIP ne peut être utilisé que si une connexion SIP (matérialisée par la référence renseignée dans `actions[].sipOutboundConnectionId`) a été préalablement créée.</Warning>
        </ResponseField>

        <ResponseField name="actions[].allowedToPhones[].description" type="string" required>
          Description de la destination et instructions pour déclencher le transfert.
        </ResponseField>

        <ResponseField name="actions[].allowedToPhones[].availability" type="object">
          Disponibilité spécifique de cette destination par jour de la semaine. Peut être `null` si aucune restriction.

          Structure identique à `actions[].availability` avec les mêmes jours de la semaine.

          ```json Exemple theme={null}
          [
              {
                  "startTime": "07:30",
                  "endTime": "12:30"
              },
              {
                  "startTime": "13:15",
                  "endTime": "18:00"
              }
          ]
          ```

          <ResponseField name="actions[].allowedToPhones[].availability.*[].startTime" type="string">
            Heure de début de disponibilité au format HH:MM.
          </ResponseField>

          <ResponseField name="actions[].allowedToPhones[].availability.*[].endTime" type="string">
            Heure de fin de disponibilité au format HH:MM.
          </ResponseField>
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="recordAudio" type="boolean">
  Permet d'activer (true) ou de désactiver (false) l'enregistrement audio de l'appel.
</ResponseField>

## Exemple concis : changer la voix et la langue

```json theme={null}
{
    "initialMessage": "Hello! I'm your virtual assistant. How can I help you today?",
    "synthesizer": {
        "voice": {
            "locales": ["en-US"],
            "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
        }
    }
}
```

```json theme={null}
{
    "initialMessage": "Bonjour! Je suis votre assistant virtuel. Comment puis-je vous aider aujourd'hui?",
    "synthesizer": {
        "voice": {
            "locales": ["fr-FR"],
            "id": "24b1c3cc-0d44-4b50-8888-8dd25736052a"
        }
    }
}
```

## Exemple complet

```json theme={null}
{
    "initialMessage": "Message initial",
    "prompt": "Prompt",
    "synthesizer": {
        "voice": {
            "locales": ["fr-FR", "en-US"],
            "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
        },
        "textNormalizationPatterns": {
            "kg": "kilogramme",
            "cm": {
            	"fr-FR": "centimètre",
            	"en-US": "centimeter"
            }
        }
    },
    "callDurationLimit": "600",
    "rag": {
        "datasourceIds": ["3c90c3cc-0d44-4b50-8888-8dd25736052a", "4c90c3cc-0d44-4b50-8888-8dd25736052a"]
    },
    "extractors": [
        {
            "name": "Prénom du client",
            "description": "Prénom du client"
        },
        {
            "name": "Nom du client",
            "description": "Nom du client"
        }
    ],
    "classifiers": [
        {
            "name": "Classifieur par défaut",
            "labels": ["Prise de RDV", "Informations pratiques", "..."],
            "description": "Prompt : Tu es un expert en classification d'appels téléphoniques à partir de transcriptions d’appel.\n\nVoici les règles à suivre pour attribuer un label à chaque appel :\n\n- \"Prise de RDV\" : ..."
        },
        {
            "name": "Traitement",
            "labels": ["Echec transfert", "Appel transféré", "..."],
            "description": "Prompt : Tu es un expert en classification d'appels téléphoniques à partir de transcriptions d’appel.\n\nVoici les règles à suivre pour attribuer un label à chaque appel :\n\n- \"Echec transfert\" : ..."
        }
    ],
    "actions": [
        {
            "name": "Transfert vers le support",
            "type": "TRANSFER_CALL",
            "description": "Prompt : Permet de transférer l'appel vers un autre numéro. Confirme bien avec l'interlocuteur une ultime fois qu'il est d'accord pour être transféré avant d'effectuer le transfert pour de bon.",
            "headers": {
                "Volubile-Cli": "12345"
            },
            "ringTimeout": 30,
            "sipOutboundConnectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
            "availability": null,
            "allowedToPhones": [
                {
                    "phone": "sip-cli",
                    "description": "Prompt permettant de déclencher le transfert vers un trunk sip",
                    "availability": null
                },
                {
                    "phone": "+33612345678",
                    "description": "Prompt permettant de déclencher le transfert vers un numéro spécifique, service client, etc.",
                    "availability":
                    {
                        "MONDAY": [
                            {
                                "startTime": "07:30",
                                "endTime": "12:30"
                            },
                            {
                                "startTime": "13:15",
                                "endTime": "18:00"
                            }
                        ],
                        "TUESDAY": [],
                        "WEDNESDAY":  [],
                        "THURSDAY": [
                            {
                                "startTime": "07:30",
                                "endTime": "12:30"
                            },
                            {
                                "startTime": "13:15",
                                "endTime": "18:00"
                            }
                        ],
                        "FRIDAY": [],
                        "SATURDAY": [],
                        "SUNDAY":  []
                    }
                }
            ]
        }
    ],
    "recordAudio": true
}
```
