Tables de correspondance
========================

Une **table de correspondance** (*lookup table*) est une petite liste dans laquelle votre agent peut chercher une valeur pendant un appel : le numéro composé par l'appelant donne la marque à annoncer dans l'accueil, un code postal donne l'atelier le plus proche et son téléphone, un code d'offre donne son libellé. L'agent trouve la ligne et récupère ses valeurs sous forme de variables ordinaires.

Quand l'utiliser
----------------

Utilisez une table de correspondance dès que la réponse est une **correspondance exacte** que l'on peut écrire dans un tableur : « telle valeur donne telle réponse ». Cas typiques :

- **Plusieurs numéros, un seul agent.** Chacun de vos numéros appartient à une marque, une boutique ou un service, et l'accueil doit annoncer le bon.
- **Orientation par zone.** Un code postal donne l'agence, l'atelier ou le conseiller vers qui transférer.
- **Codes et références.** Un code d'offre, un code produit ou un code de statut donne un libellé que l'agent peut prononcer.

**Pourquoi pas le prompt ou une base de connaissances ?** L'IA de l'agent ne peut pas remplir de variables, et l'accueil est prononcé avant que l'IA ne s'exécute : une consigne du type « si le numéro est X, annonce la marque Y » ne fonctionne donc pas. Une base de connaissances est interrogée avec ce que l'appelant *dit*, et ne sait pas distinguer deux numéros de téléphone. Une table de correspondance donne la même réponse exacte à chaque appel, avant que l'agent ne prononce un mot.

Étape 1 : créer la table
------------------------

Les tables appartiennent à un **compte** et sont partagées par tous les agents de ce compte. Ouvrez **Accounts**, choisissez le compte, puis l'onglet **Lookup tables**, et cliquez sur **New table**.

![Création d'une table de correspondance : nom Shop numbers, comparaison Phone number, trois lignes collées depuis un tableur, une valeur par défaut, un essai avec Try a value, puis Save](/docs/lookup-table-create-dark.gif)

1. **Table name** : le nom sous lequel vous choisirez la table dans un agent, par exemple *Shop numbers*. Le **Result name** en dessous se remplit tout seul.
2. **How values are compared** : choisissez l'une des trois façons décrites [plus bas](#match-types). Pour des numéros de téléphone, choisissez **Phone number**.
3. **Rows** : la **première colonne est la clé**, c'est-à-dire la valeur que l'agent cherche. Chaque autre colonne est une réponse, et devient une variable du même nom. Saisissez les lignes, ou cliquez sur **Import** et choisissez un fichier CSV, ou copiez les cellules dans Excel ou Google Sheets et collez-les. La première ligne doit contenir les noms des colonnes.
4. **If nothing matches** (dernière ligne, facultative) : les valeurs à utiliser quand la valeur n'est pas dans la table, par exemple le nom de la marque principale. Laissez-la vide pour obtenir des variables vides.
5. **Try a value** : saisissez une valeur et cliquez sur **Try** pour voir quelle ligne elle trouve. C'est exactement la même recherche que pendant un vrai appel.
6. Cliquez sur **Save**.

Les noms de colonnes deviennent des noms de variables : utilisez des minuscules, des chiffres et `_`, en commençant par une lettre (par exemple `shop_name`). Une table peut contenir jusqu'à 20 colonnes et 5 000 lignes, et un compte jusqu'à 50 tables. **Export CSV** télécharge la table : vous pouvez la modifier dans un tableur puis la réimporter.

**Les modifications s'appliquent dès l'appel suivant.** Une table ne fait pas partie des versions d'un agent : dès que vous l'enregistrez, chaque agent qui l'utilise lit les nouvelles lignes à partir de l'appel suivant, sans rien republier. La colonne **Used by** de la liste indique quels agents utilisent chaque table.

### Comment les valeurs sont comparées

ChoixCe qui correspondÀ utiliser pour   **Phone number**`01 99 00 01 01`, `+33 1 99 00 01 01` et `33199000101` sont le même numéro : les espaces, les points et l'indicatif pays n'ont pas d'importance.Numéros appelés, numéros des appelants. **Exact text**Le même texte, sans tenir compte des majuscules et des espaces en trop.Codes, références, noms. **Starts with**Les lignes dont la clé est le début de la valeur : `75` correspond à `75011` et à `75019`. Si plusieurs lignes correspondent, la clé la plus longue l'emporte.Codes postaux, plages de numéros. 

Étape 2a : chercher une valeur avant l'accueil
----------------------------------------------

Pour utiliser la réponse dans l'accueil, faites la recherche au début de l'appel. Dans l'éditeur d'agent, ouvrez l'onglet **Initialization**, allez dans **Startup Actions** et cliquez sur **Add Initializer** :

![Ajout d'une action de démarrage Lookup table : la table Shop numbers, la valeur à chercher réglée sur le numéro composé par l'appelant, et la liste des variables créées](/docs/lookup-table-startup-action-dark.gif)

1. Donnez un nom à l'action (cliquez sur le cadenas), par exemple *Boutique du numéro appelé*.
2. Choisissez le type **Lookup table**.
3. **Table** : choisissez votre table.
4. **Value to look up** : cliquez sur `{{to_number}}` (le numéro composé par l'appelant) ou `{{from_number}}` (le numéro de l'appelant), ou saisissez n'importe quelle variable déjà connue à ce moment.
5. Lisez l'encadré **This lookup creates** : ce sont les variables que vous pouvez maintenant utiliser.

L'accueil peut alors dire, par exemple : *« Bonjour, vous êtes bien chez {{shop\_name}}. Nous sommes ouverts de {{opening\_hours}}. »* La recherche n'envoie aucune requête, elle n'ajoute donc aucune attente à l'appel.

**Numéros renvoyés vers un seul numéro Manivox.** Si vos numéros sont renvoyés vers un seul numéro Manivox, `{{to_number}}` vaut ce numéro Manivox à chaque appel. Le numéro réellement composé par l'appelant arrive dans l'en-tête SIP `Diversion`. Ajoutez une action de démarrage **SIP Header** qui place `Diversion` dans une variable (par exemple `dialed_number`), placez la recherche **après** elle, et cherchez `{{dialed_number}}`. Voir [En-têtes SIP → Diversion](https://www.manivox.ai/docs/calls/sip-headers#diversion).

Étape 2b : chercher une valeur pendant l'appel
----------------------------------------------

Quand la valeur n'est connue que plus tard (un code postal donné par l'appelant, une référence lue dans une API), utilisez une étape **Variable** dans le flow, avec l'opération **Look up in a table**. L'étape Variable fait partie des [nœuds de Flow](https://www.manivox.ai/docs/agents/nodes#flow-nodes) optionnels : si elle n'apparaît pas dans votre palette, demandez à votre contact Manivox de l'activer.

![Glisser une étape Variable sur le canevas, choisir Look up in a table, la table Repair workshops et la valeur postcode, puis les variables créées par l'étape](/docs/lookup-table-variable-step-dark.gif)

1. Glissez une étape **Variable** sur le canevas et ouvrez-la.
2. **Operation** : **Look up in a table**.
3. **Table** : choisissez votre table, par exemple *Repair workshops*.
4. **Value to look up** : tapez `{{` et choisissez la variable, par exemple `@{{postcode}}` collectée par une étape Agent précédente.
5. Cliquez sur **OK**, puis reliez l'étape dans le flow.

Un flow typique : une étape Agent recueille le code postal, l'étape Variable cherche l'atelier, une étape Branch vérifie s'il a été trouvé, et une étape Transfer appelle `{{workshop_phone}}`.

Ce que vous obtenez
-------------------

Pour une table dont le nom de résultat est `workshops` et dont les colonnes sont `postcode`, `workshop` et `workshop_phone`, une recherche crée :

VariableContenu   `{{workshop}}`, `{{workshop_phone}}`, ...Une variable par colonne, issue de la ligne trouvée. Si rien ne correspond, les valeurs de la ligne *If nothing matches*, ou vide. `{{workshops}}`Toutes les lignes trouvées, une ligne chacune dans un prompt (utile avec **Starts with**, où plusieurs lignes peuvent correspondre). `{{workshops_count}}`Le nombre de lignes trouvées. **0 signifie « introuvable »**, même si la ligne par défaut a été utilisée. 

Utilisez-les comme n'importe quelle variable : dans les prompts, les messages, les règles de sortie, les étapes Branch et Condition, les transferts et les appels d'API. Pour gérer le cas « introuvable », routez sur le nombre, par exemple avec une règle de sortie `{{workshops_count}}` *égal à* `0`. Le champ **Result name** de l'action ou de l'étape renomme la liste et son nombre si vous utilisez deux fois la même table.

Si la recherche ne trouve rien
------------------------------

1. Collez la valeur dans **Try a value** sur la table : la réponse est la même que pendant un appel.
2. Vérifiez la comparaison : un numéro de téléphone dans une table réglée sur **Exact text** ne correspondra pas à `33199000101`. Passez la table en **Phone number**.
3. Ouvrez l'appel dans [Appels](https://www.manivox.ai/docs/calls/index) et regardez les variables reçues : la variable cherchée (par exemple `{{to_number}}`) montre la valeur utilisée. Si ce n'est pas celle attendue (un numéro renvoyé, par exemple), corrigez la valeur, pas la table.