Configuration d'entités de conteneur composite

Les entités de conteneur composite permettent d'écrire des définitions de flux de dialogue plus courtes, car elles peuvent être résolues à l'aide d'un seul composant (Resolve Entities ou Common Response).

Nous vous recommandons d'utiliser cette approche, car vous n'avez pas besoin que des composants comme Commutateur ou Définir une variable capturent l'ensemble des saisies utilisateur nécessaires à l'exécution d'une business transaction. Au lieu de cela, un composant unique peut inviter les utilisateurs à fournir des valeurs pour chaque élément du conteneur. Les invites elles-mêmes sont propres à des conditions car elles reposent sur la configuration individuelle de chaque élément du conteneur. A l'aide de l'entité de conteneur composite, d'un gestionnaire d'événements d'entité ou d'Apache FreeMarker, et des composants Réponse commune ou Entités de résolution, votre brique peut effectuer les opérations suivantes :
  • Capturer tout le texte libre, autoriser les téléchargements de fichier et collecter la position actuelle de l'utilisateur avec les éléments STRING, ATTACHMENT et LOCATION.

  • Exécuter le comportement individuel de chaque entité membre du conteneur : vous pouvez ajouter des invites spécifiques à une valeur et des messages d'erreur aux entités individuelles du conteneur composite (y compris aux entités personnalisées, aux entités système, et aux éléments STRING, ATTACHMENT et LOCATION). Vous pouvez également contrôler les entités qui doivent (ou qui ne doivent pas) correspondre à la saisie utilisateur. Etant donné que vous pouvez créer une séquence d'invites, la brique pourra générer différentes invites pour chaque tentative utilisateur.

  • Afficher des listes à sélection multiple.

  • Valider les correspondances de valeurs en fonction des règles de validation.

  • Prendre en charge les flux imparfaits : les utilisateurs peuvent corriger les entrées précédentes.

  • Exécuter des transitions temporaires basées sur des correspondances : le flux de dialogue peut quitter temporairement le composant lorsqu'une entité a été mise en correspondance. Cela permet à autre état d'exécuter une fonction d'aide telle qu'un appel REST. Une fois la fonction terminée, le flux de dialogue revient au composant afin que la mise en correspondance des valeurs puisse continuer. Par exemple :
    • Lorsqu'un utilisateur télécharge un justificatif, celui-ci doit être numérisé de sorte que des valeurs telles que la date, le montant et le type des frais puissent être extraites pour les autres entités du conteneur. Cela permet au composant de renseigner les autres valeurs à partir du justificatif, et non à partir de la saisie utilisateur.

    • La brique génère un message tel que "Almost there, just a few more questions" entre la mise en correspondance des ensembles d'entités au sein du conteneur.

    • La saisie utilisateur doit être validée via un appel REST back-end. La validation peut nécessiter d'être exécutée immédiatement, car elle détermine les éléments du conteneur qui doivent envoyer une invite pour obtenir d'autres saisies utilisateur. L'appel peut également renvoyer des informations devant être partagées avec l'utilisateur, comme un avertissement de manquement à un contrat.

  • Lever les ambiguïtés des valeurs : vous pouvez isoler une valeur de la saisie utilisateur via des propriétés d'invite et de composant propres à l'entité. Cela comprend la prise en charge des corrections apportées à l'entrée précédente (flux imparfait) et l'envoi d'invites sollicitant des saisies utilisateur pour des propriétés d'entité intégrée spécifiques.

Création d'une entité de conteneur composite

  1. Cliquez sur Entités Il s'agit d'une image de l'icône Entités. dans la barre de navigation latérale.

  2. Cliquez sur Ajouter des entités.

  3. Choisissez Conteneur composite comme type d'entité.

  4. Entrez un nom et une description.
  5. Cliquez sur + Gestionnaire d'événements pour exécuter l'invite et la logique du conteneur composite par programmation à l'aide de gestionnaires d'événements d'entité.
  6. Cliquez sur + Elément de conteneur pour ouvrir la boîte de dialogue Ajouter un élément de conteneur. Si vous ajoutez une entité intégrée ou une entité personnalisée existante, vous pouvez créer un nom propre au conteneur pour cette entité et y ajouter une description de son rôle dans le contexte du conteneur composite.

  7. Vous pouvez remplir le conteneur avec des entités personnalisées, des entités intégrées et les éléments suivants :
    • STRING : capture le texte libre de l'utilisateur.

    • LOCATION : capture la localisation de l'utilisateur.

    • ATTACHMENT : accepte les fichiers, les fichiers audio, les fichiers vidéo ou les fichiers image téléchargés par l'utilisateur. L'entité de conteneur composite stocke l'URL qui héberge la pièce jointe.

    Remarque

    Lorsque vous ajoutez l'entité DATE_TIME, vous êtes invité à saisir un sous-type.
    Les éléments sont résolus dans l'ordre dans lequel vous les ajoutez. Toutefois, cette séquence peut varier en fonction de la manière dont vous configurez les membres individuels du conteneur composite.
  8. Si vous cliquez sur Fermer, vous revenez à la page Entités, mais avant cela, vous pouvez ajouter d'autres fonctionnalités propres aux conteneurs à l'élément (ou mettre ce dernier à jour ultérieurement en cliquant sur Il s'agit d'une image de l'icône Modifier. sur la page Entités).

  9. Les étapes suivantes :
    • Ajoutez des messages d'erreur individuels, des invites de désambiguïsation ou des invites conditionnelles aux éléments du conteneur.
      Remarque

      Ceux-ci seront écrasés si vous ajoutez l'entité à un conteneur composite.
    • Ajoutez l'entité à une intention. Reportez-vous à Ajout d'entités aux intentions.

    • Configurez le flux de dialogue de façon à utiliser l'entité de conteneur composite..

Remplissage de créneau amélioré

Lorsque vous activez le remplissage amélioré des emplacements en activant Utiliser le remplissage amélioré des emplacements dans Paramètres > Configuration :
  • Seul l'élément en cours de résolution sera mis à jour. Lorsqu'une correspondance s'applique à plusieurs éléments de conteneur, l'élément de conteneur en cours de résolution est prioritaire sur les autres éléments. Si vous désactivez le remplissage amélioré des créneaux, tous les éléments sont mis à jour avec la même valeur.
  • Si l'élément de résolution actuel est un élément de conteneur STRING, aucun autre élément de conteneur n'est jamais mis à jour.
  • Si une correspondance d'entité s'applique à plusieurs éléments de conteneur (non résolus), une boîte de dialogue de déshomonymie s'affiche, permettant à l'utilisateur de choisir l'élément à mettre à jour au lieu de mettre à jour tous les éléments de conteneur.
  • Le commutateur Invite de déshomonymie de l'entité est ignoré. Nous vous recommandons d'implémenter une déshomonymie personnalisée avec un gestionnaire d'événements d'entité.
Remarque

La bascule Utiliser le remplissage d'emplacement amélioré est activée par défaut pour les briques créées à l'aide de la version 22.08 de la plate-forme. Il est désactivé pour les briques qui ont été mises à niveau vers cette version.

Ajouter des invites

Vous pouvez ajouter une invite unique ou créer une séquence d'invites, où chacune fournit des informations de plus en plus spécifiques chaque fois que l'utilisateur saisit une valeur non valide. Par défaut, les invites sont activées. Pour ajouter ces invites, procédez comme suit :
  1. Si vous voulez activer les invites, laissez le champ Invite pour la valeur vide (état par défaut). La saisie de false dans le champ Invite pour la valeur empêche l'affichage des invites. Afin d'envoyer une invite pour une valeur conditionnelle, ajoutez une expression FreeMarker booléenne qui peut prendre la valeur true (pour envoyer les invites) ou false.

    Conseil :

    Lorsque vous définissez Invite pour la valeur sur false, l'élément peut toujours être résolu comme une partie d'un autre élément pour lequel une invite est envoyée lorsque vous activez l'option Extraction dans le désordre.
  2. Cliquez sur Ajouter une invite pour créer la séquence d'invites. Vous pouvez réorganiser les champs en les faisant glisser ou en les renumérotant. Vous pouvez rendre la sortie des invites aléatoire lorsque vous attribuez le même numéro à deux invites ou plus.
    Remarque

    Vous ne pouvez ajouter des invites aux entités intégrées que lorsque vous les ajoutez à un conteneur composite.
    Vous pouvez stocker les invites dans des groupes de ressources (par exemple, ${rb.askCheese}) ou les écrire comme des combinaisons de texte et d'expressions FreeMarker.

Mise à jour des valeurs à créneaux avec des expressions Apache FreeMarker

Dans le champ Mise à jour possible, entrez une expression Apache FreeMarker qui prend la valeur true pour permettre la mise à jour de la valeur insérée pour un élément de conteneur composite.

Activation de l'extraction dans le désordre

L'extraction dans le désordre active le créneau et la mise à jour des valeurs pour un élément de conteneur composite à n'importe quel moment de la conversation, que le conteneur composite ait ou non demandé la valeur à l'utilisateur. A l'aide des règles suivantes, vous pouvez définir comment, quand ou si une valeur peut être insérée ou modifiée à n'importe quel moment de la conversation pour n'importe quel sous-type d'élément ou d'élément (par exemple, les sous-types DATE_TIME).
  • Always : option par défaut. Lorsque vous choisissez cette option pour un élément, sa valeur peut être insérée sans invite. Par exemple, l'entité PizzaSize peut être résolue lorsqu'un client saisit I want a large pizza. Cette option permet également de modifier la valeur de l'élément à tout moment, à condition que l'expression de la propriété Modifiable ne renvoie pas la valeur false. Par exemple, lorsque le conteneur composite envoie une invite pour l'entité PizzaType, le client peut alors répondre Veggie please, but make it a medium. La brique peut mettre à jour la valeur de l'entité PizzaSize avec la valeur medium sans redémarrer la conversation car l'option Toujours est activée pour les éléments PizzaSize et PizzaType du conteneur.
    Remarque

    Bien que cette option soit le comportement par défaut, elle peut ne pas toujours être appropriée pour les éléments STRING. Par exemple, si vous avez choisi cette option pour un élément STRING, le premier message utilisateur sera stocké par l'élément STRING au lieu d'être mis en correspondance par l'entité prévue (qui peut être désignée comme le premier élément du conteneur à résoudre).
  • Jamais : lorsque vous choisissez cette option, l'élément n'est inséré qu'une fois qu'il a été demandé, même lorsque d'autres messages utilisateur contiennent des valeurs valides. Sélectionnez Jamais pour empêcher les correspondances par inadvertance.
  • Uniquement lors de la résolution de la variation d'intention : limite le slot de valeur hors séquence à la première variation utilisateur qui a été résolue en intention associée à l'entité de conteneur composite.
Voici des exemples de règles d'extraction hors séquence lorsqu'elles sont appliquées à un élément de conteneur composite PizzaToppings.
Règle d'extraction dans le désordre Variation utilisateur initiale Valeur insérée Remarques
Toujours Commander une pizza au thon Thon L'emplacement de la valeur pour l'élément PizzaToppings peut être mis en correspondance chaque fois que le message utilisateur contient la valeur correcte ("Champignons à la place !"). Il peut s'agir d'un créneau ou d'une mise à jour à tout moment de la conversation sans invite.
jamais Commander une pizza au thon Aucune. La valeur de l'élément PizzaTopping ne peut pas être insérée dans le désordre ou mise à jour ad hoc. Elle ne peut être mise en correspondance que lorsqu'elle est demandée.
Uniquement lors de la résolution de la variation d'intention Commander une pizza au thon Thon. Toutefois, si l'utilisateur a saisi "Commander une grande pizza", le conteneur composite doit demander la valeur PizzaTopping. L'élément PizzaTopping ne peut être inséré dans le désordre que lorsque la première variation utilisateur résolue en intention a une valeur correspondante. Sinon, cette valeur doit être demandée. Le conteneur composite n'autorisera pas la mise à jour ad hoc ou le créneau de cet élément.

Activation de l'option Extraire avec

Utilisez l'option Extraire avec pour permettre à votre brique de résoudre un élément de conteneur à l'aide de l'entrée saisie pour un autre élément du conteneur. Cette option, qui permet à votre brique de gérer les valeurs associées, offre plus de flexibilité pour les saisies utilisateur. Par exemple, les utilisateurs peuvent saisir domicile au lieu d'une adresse complète. Pour ce faire, procédez comme suit :
  • Le conteneur composite comporte deux entités liées à l'adresse : NamedAddress, une entité de valeur de liste contenant des valeurs comme home et office, et DeliveryAddress, une entité ADDRESS.
  • L'invite de l'entité DeliveryAddress est Where do you want that delivered?
  • L'entité NamedAddress ne vous invite pas à saisir des informations (la valeur false est indiquée dans le champ Invite pour la valeur).
  • L'entité NamedAddress peut être extraite avec DeliveryAddress (DeliveryAddress est sélectionné dans le menu Extraire avec).

Lorsque le conteneur composite invite à saisir l'entité DeliveryAddress, il peut résoudre l'entité à l'aide d'une adresse physique ou de l'une des valeurs de liste NamedAddress (home ou office).

Ajout de règles de validation

Chaque élément du conteneur peut comporter ses propres règles de validation. Vous pouvez ajouter une règle de validation en cliquant tout d'abord sur + Règle de validation, puis en ajoutant une expression FreeMarker et une invite de texte. L'expression utilise le modèle suivant pour référencer la valeur de l'élément, où varName est le nom de l'entité de conteneur composite déclarée comme variable dans la définition de flux de dialogue :
${varName.value.itemName}
Si l'expression renvoie la valeur False, la saisie utilisateur n'est pas valide.
L'exemple suivant d'expression de validation concerne un élément nommé Amount. Il s'agit d'une entité intégrée CURRENCY. Pour renvoyer un montant chiffré destiné à la comparaison, l'expression ajoute la propriété amount de l'entité CURRENCY :
${expense.value.Amount.amount > 4}
Le message de validation correspondant peut également refléter la saisie utilisateur via une expression FreeMarker. Par exemple, le message suivant utilise le type de devise extrait à partir de la saisie utilisateur dans le cadre du message de validation :
Amounts below 5 ${expense.value.Amount.currency} cannot be expensed. Enter a higher amount or type 'cancel'.
Pour en savoir plus sur les autres propriétés de devise (et sur les autres propriétés des entités intégrées), reportez-vous à Entités intégrées et leurs propriétés.

Configuration d'un flux de dialogue YAML pour les entités de conteneur composite

Si votre brique est développée en mode de boîte de dialogue YAML, voici ce que vous devez faire pour configurer le flux de dialogue pour les entités de conteneur composite :

  1. Dans le noeud context, déclarez l'entité de conteneur composite en tant que variable :
    ...
    metadata:
      platformVersion: "1.1"
    main: true
    name: "ExpenseBot"
    context:
      variables:
        expense: "Expense"
        iResult: "nlpresult"
  2. Vous pouvez utiliser System.ResolveEntities ou System.CommonResponse. Ces deux composants permettent de tirer parti de l'entité de conteneur composite tout en offrant leurs propres avantages. Le composant System.ResolveEntities est le plus simple des deux. Il contient un petit ensemble de propriétés. Contrairement au composant System.ResolveEntities, System.CommonResponse vous offre plus de contrôle sur l'interface utilisateur employée pour résoudre les entités du conteneur. Par exemple, vous pouvez ajouter une logique conditionnelle afin de déterminer les invites et les actions globales liées aux valeurs.

    Conseil :

    Etant donné que les métadonnées du composant System.CommonResponse peuvent devenir très complexes lorsque vous utilisez des entités de conteneur composite, nous vous recommandons d'utiliser le composant System.ResolveEntities à la place et d'utiliser des gestionnaires d'événements d'entité pour toutes les personnalisations d'interface utilisateur.
  3. Reportez-vous à la variable de contexte d'entité de conteneur composite dans la propriété variable du composant, puis définissez les autres propriétés si nécessaire. System.ResolveEntities et Propriétés de composant décrivent ces propriétés et fournissent d'autres exemples.

    Voici un exemple de composant System.ResolveEntities :
    createExpense:
        component: "System.ResolveEntities"
        properties:
          variable: "expense"
          useFullEntityMatches: true
          nlpResultVariable: "iResult"
          cancelPolicy: "immediate"
        transitions:
          actions:
            cancel: "cancelExpense"
          return: "done"          

Variable system.entityToResolve

La variable system.entityToResolve fournit des informations sur le statut en cours du processus de résolution d'entité tel qu'exécuté par les composants Résoudre les entités et Réponse commune. Vous référencez généralement les propriétés de cette valeur de variable dans les métadonnées du composant Réponse commune lorsque vous souhaitez personnaliser les messages. Vous pouvez l'utiliser pour définir la logique du message d'erreur d'une entité, ou pour diverses propriétés appartenant aux composants Résoudre les entités et Réponse commune. Ajoutez les propriétés suivantes pour renvoyer la valeur d'entité actuelle :
  • userInput
  • prompt
  • promptCount
  • updatedEntities
  • outOfOrderMatches
  • disambiguationValues
  • enumValues
  • needShowMoreButton
  • rangeStartVar
  • nextRangeStart
Vous pouvez également référencer les propriétés des expressions FreeMarker utilisées pour les propriétés d'élément de conteneur, telles que prompt, errorMessage et les règles de validation.
Voici un exemple d'utilisation de cette variable pour renvoyer la saisie utilisateur actuelle dans le message d'erreur d'une entité :
Sorry,'${system.entityToResolve.value.userInput!'this'}' is not a valid pizza size.
Voici un exemple d'utilisation de diverses définitions de system.entityToResolve. Parmi ces définitions se trouve un message défini pour la propriété text, qui confirme la mise à jour d'une valeur d'entité précédemment définie à l'aide d'une directive Apache FreeMarker list et de la propriété updatedEntities.
    metadata:
      responseItems:        
      - type: "text" 
        text: "<#list system.entityToResolve.value.updatedEntities>I have updated <#items as ent>${ent.description}<#sep> and </#items>. </#list><#list system.entityToResolve.value.outOfOrderMatches>I got <#items as ent>${ent.description}<#sep> and </#items>. </#list>"
      - type: "text" 
        text: "${system.entityToResolve.value.prompt}"
        actions:
        - label: "${enumValue}"
          type: "postback"
          iteratorVariable: "system.entityToResolve.value.enumValues"
Pour les actions globales, cette variable contrôle l'action globale Afficher plus avec les propriétés needShowMoreButton, rangeStartVar et nextRangeStart :
        globalActions: 
        - label: "Show More"
          type: "postback" 
          visible:
            expression: "${system.entityToResolve.value.needShowMoreButton}"
          payload:
            action: "system.showMore"
            variables: 
              ${system.entityToResolve.value.rangeStartVar}: ${system.entityToResolve.value.nextRangeStart} 
        - label: "Cancel"
          type: "postback" 
          visible:
            onInvalidUserInput: true
          payload:
            action: "cancel"
Le libellé Afficher plus doit inclure une valeur system.showMore (action: "system.showMore"). Sinon, il ne fonctionne pas.

Expressions entityToResolve

Expression : Description
${system.entityToResolve.value.resolvingField} Renvoie le nom de l'élément de conteneur.
${system.entityToResolve.value.allMatches[0].entityName} Renvoie le nom d'entité référencé par l'élément de conteneur. Le tableau allMatches contient toutes les entités dont les valeurs peuvent potentiellement être mises à jour par le message utilisateur.
${<variable>1.value[system.entityToResolve.value.resolvingField]} Renvoie la valeur d'élément de conteneur entrée ou sélectionnée par les utilisateurs.
${system.entityToResolve.value.userInput} Renvoie le texte saisi par l'utilisateur. Vous pouvez utiliser cette expression pour consigner la saisie utilisateur ou l'afficher dans la discussion, par exemple, lorsqu'un utilisateur entre une valeur non valide.
${system.entityToResolve.value.outOfOrderMatches[n].entityName} Renvoie le nom des entités extraites dans le désordre. Outre les valeurs demandées par les composants Resolve Entities ou Common Response, les utilisateurs peuvent fournir des valeurs supplémentaires qui déclenchent une extraction de valeurs dans le désordre et mettent à jour d'autres entités dans le conteneur composite.
${system.entityToResolve.value.outOfOrderMatches[n].name} Renvoie le nom de l'élément de conteneur composite.
${system.entityToResolve.value.outOfOrderMatches? has_content?then(…,…)} Renvoie la valeur d'une entité ayant été mise en correspondance dans le désordre. Etant donne qu'il est probable qu'aucune entité n'ait été mise en correspondance dans le désordre, cette expression utilise l'opérateur has_content.

Gestionnaires d'événements d'entité

Vous pouvez exécuter la validation, l'invite et la déshomonymie des éléments d'entité de conteneur composite par programmation à l'aide des gestionnaires d'événements d'entité. Un gestionnaire d'événements d'entité (EEH) est une implémentation JavaScript (ou TypeScript) créée pour une entité de conteneur composite et déployée en tant que service de code personnalisé.
Remarque

Vous pouvez gérer le service déployé pour l'EEH à partir de la page Composants Il s'agit d'une image de l'icône Composants dans la barre de navigation de gauche..
Vous pouvez contrôler le comportement de résolution pour les éléments de conteneur individuels et pour l'entité elle-même en définissant les fonctions de gestionnaire d'événements fournies par bots-node-sdk. Par exemple, le fragment de code suivant illustre la définition d'un événement validate sur un élément de conteneur appelé ExpenseDate qui empêche les utilisateurs de saisir une date future lors de la déclaration d'une note de frais.
ExpenseDate: {

        validate: async (event, context) => {
          if (new Date(event.newValue.date) > new Date()) {
            context.addValidationError("ExpenseDate",context.translate('ExpenseDate.text'));
            return false;
          }          
        }
La documentation Gestionnaires d'événements d'entité d'écriture de bots-node-sdk décrit la structure globale du code de gestionnaire d'événements, les événements de niveau élément et entité, ainsi que les méthodes EntityResolutionContext telles que addValidationError et translate dans le fragment de code ci-dessus.

Etant donné que les gestionnaires d'événements d'entité sont écrits dans JavaScript, vous pouvez utiliser une logique avancée difficilement réalisable, voire impossible, avec les expressions FreeMarker que vous pouvez utiliser pour définir la validation, les erreurs et les invites dans la page Modifier l'élément de conteneur et le flux de dialogue. Ils sont également plus faciles à déboguer. Vous n'avez toutefois pas besoin de choisir entre les gestionnaires d'événements d'entité et les expressions FreeMarker. Vous pouvez les combiner. Par exemple, vous pouvez utiliser des expressions FreeMarker pour des validations et des invites simples et réserver un EEH pour des fonctions plus complexes telles que l'appel d'une API REST lorsque tous les éléments de conteneur ont été résolus.

Création de gestionnaires d'événements d'entité à l'aide de l'éditeur de code de gestionnaire d'événements

Vous pouvez créer l'EEH à l'aide de l'éditeur de code de gestionnaire d'événements accessible à partir de la page de propriétés du conteneur composite ou à l'aide de l'IDE de votre choix. Bien que l'éditeur de code de gestionnaire d'événements présente certains avantages par rapport à un outil tiers, vous pouvez alterner avec un IDE tiers en fonction de la taille de la tâche et des bibliothèques dont vous avez besoin. Pour évaluer les avantages et les inconvénients, reportez-vous à la section Quel IDE dois-je utiliser ?

Pour accéder à l'éditeur de code de gestionnaire d'événements, procédez comme suit :
  1. Cliquez sur + Gestionnaire d'événements.
  2. Renseignez la boîte de dialogue Créer un gestionnaire d'événement en ajoutant un nom de service et un nom de gestionnaire.

Une fois le gestionnaire créé, vous pouvez ouvrir l'éditeur en cliquant sur Il s'agit d'une image de l'icône Modifier..

L'éditeur contient le code de démarrage. Son objet handlers contient les objets entity, items et custom. Au sein de ces objets, vous définissez les événements au niveau de l'événement, qui sont déclenchés pour l'ensemble du conteneur composite, les événements au niveau de l'élément, qui contrôlent la résolution des éléments de conteneur individuels, et les événements personnalisés qui sont déclenchés lors des actions de postback. Par défaut, un objet entity est défini pour l'objet handler. Les objets items et custom sont remplis lorsque vous ajoutez un modèle personnalisé ou de niveau élément.
Description de l'image eeh-default-template.png
Description de l'illustration eeh-default-template.png

Les événements eux-mêmes sont des fonctions JavaScript asynchrones qui prennent deux arguments :
  • event : objet JSON des propriétés propres aux événements.
  • context : référence à la classe EntityResolutionContext, dont les méthodes (telles que addValidationError dans le fragment de code suivant) fournissent la logique du gestionnaire d'événements.
items: {
  Amount: { 
    validate: async (event, context) => {
      let amount = event.newValue.amount;
      if (amount < 5) {
        context.addValidationError("Amount",`Amounts below 5 ${event.newValue.currency} cannot be expensed. Enter a higher amount or type 'cancel'.`);
      }
    }
  }
Pour accéder aux modèles, cliquez sur + Ajouter un événement.
Remarque

Pour plus d'informations sur le code de démarrage EEH, les événements de niveau élément et entité, EntityResolutionContext et les exemples de code, reportez-vous à la documentation bots-node-sdk sur l'écriture des gestionnaires d'événements d'entité.
Ajout d'événements
Cliquez sur + Ajouter un événement pour ajouter les modèles d'événement, d'élément et d'événement personnalisé.

Par exemple, l'ajout d'un modèle d'événement validate alimente l'éditeur avec le code suivant :
validate: async (event, context) => {
        
      },
Vous pouvez ensuite mettre à jour ce modèle avec votre propre code :
validate: async (event, context) => {
     if (event.newValue.value === 'PEPPERONI')
       context.addValdiationError('Type', "Sorry, no pepperoni pizzas today!");     
      },
Si vous cliquez sur Valider, votre code est analysé à la recherche de problèmes de conception. Cliquez donc régulièrement sur cette option. Vous ne pouvez pas ajouter d'autres événements si le code n'est pas valide, et vous ne pouvez pas enregistrer du code non valide. Etant donné que l'enregistrement du code implique également son déploiement, vous ne pouvez pas non plus déployer du code non valide.

Lorsque le code est valide, cliquez sur Enregistrer pour le déployer automatiquement et le packager dans un fichier TGZ. Vous pouvez surveiller le statut du déploiement et télécharger le fichier TGZ pour le réutiliser dans d'autres briques à partir de la page Composants.

Conseil :

Pour rechercher les erreurs d'exécution, activez l'option Activer la journalisation de composant, puis consultez les journaux (accessibles en cliquant sur Diagnostics > Visualiser les journaux) afin d'en savoir plus sur les paramètres qui ont appelé les événements.
Sur la page du conteneur composite, le statut Prêt Il s'agit d'une image de l'icône Prêt. et l'icône Modifier Icône Modifier pour la révision du code deviennent disponibles une fois le service déployé.

Ajouter des gestionnaires d'événements de niveau entité
Pour les événements de niveau entité, vous pouvez mettre à jour les modèles des événements de niveau entité validate, publishMessage, maxPromptsReached, resolved, attachmentReceived et locationReceived.

Evénement Description
validate Gestionnaire de validations de niveau entité appelé lorsque la valeur d'au moins un des éléments de conteneur a été modifiée.
publishMessage Gestionnaire de secours générique appelé chaque fois qu'un élément de conteneur n'a pas de message d'invite ou de gestion de l'homonymie.
maxPromptsReached Gestionnaire de secours générique appelé lorsque le gestionnaire propre à l'élément en cas de nombre maximal d'invites atteint n'a pas été spécifié.
resolved Cette fonction est appelée lorsque l'entité de conteneur composite a été résolue. En général, vous ajoutez un événement resolved pour appeler une API back-end qui termine une transaction liée aux valeurs collectées par l'entité de conteneur composite. Si l'appel d'API renvoie des erreurs car certaines valeurs collectées par le conteneur composite ne sont pas valides, vous pouvez effacer ces valeurs.
attachmentReceived Ce gestionnaire est appelé lorsque l'utilisateur envoie une pièce jointe.
locationReceived Ce gestionnaire est appelé lorsque l'utilisateur envoie un emplacement.
Par défaut, le modèle est rempli avec un événement de niveau entité, publishMessage. Grâce aux fonctions updatedItemMessage et outOfOrderItemsMessage (qui sont également définies dans le modèle par défaut), cet événement permet à la brique de générer des messages confirmant qu'une valeur d'élément de conteneur précédemment résolue a été mise à jour ou qu'elle a accepté une entrée valide pour un élément de conteneur autre que celui que l'entité demande actuellement (entrée hors séquence).

Cet événement est facultatif. Vous pouvez la supprimer, la conserver telle quelle ou y ajouter des fonctionnalités. Par exemple, vous pouvez ajouter un bouton d'annulation lorsque les tentatives de saisie d'une valeur valide d'un utilisateur ont dépassé le nombre maximal d'invites.
publishMessage: async (event, context) => {
        updatedItemsMessage(context);
        outOfOrderItemsMessage(context);
        //Add Cancel button for invalid values entered by users
        let message = context.getCandidateMessageList()[0];
      }
…
message.addGlobalAction(context.getMessageFactory().createPostbackAction('Cancel', {action:'cancel'}));
        context.addMessage(message);      }
}
Ajouter des gestionnaires de niveau élément
Pour les éléments de conteneur répertoriés dans la boîte de dialogue, vous pouvez ajouter des modèles pour les événements de niveau élément : shouldPrompt, validate, publishPromptMessage, publishDisambiguateMessage et MaxPromptsReached.

Evénement Description
shouldPrompt Invite un élément en fonction des valeurs des autres éléments du conteneur. Ce gestionnaire est prioritaire sur les invites configurées via le champ Invite pour la valeur.
validate Ce gestionnaire est appelé uniquement lorsqu'une valeur a été définie pour un élément de conteneur. Si la validité de la valeur dépend d'autres éléments de conteneur, vous devez implémenter l'événement validate de niveau entité à la place.
publishPromptMessage Utilisez cette fonction afin de remplacer ou d'étendre le message généré par les composants Réponse commune et Résoudre les entités pour demander l'élément.
publishDisambiguateMessage Utilisez cette fonction pour remplacer ou étendre le message d'invite de désambiguïsation généré par les composants Réponse commune et Résoudre les entités.
maxPromptsReached Cette fonction est appelée lorsque le nombre maximal d'invites, spécifié par l'option Nombre maximal de tentatives de saisie utilisateur sur l'écran de l'élément de conteneur composite, a été atteint pour cet élément.

L'ajout d'un événement de niveau élément génère l'objet items.
Description de l'image eeh-items-block.png
Description de l'illustration eeh-items-block.png

Ajouter des événements personnalisés
Vous pouvez créer des événements personnalisés appelés à partir d'actions de postback (boutons ou éléments de liste) à l'aide du modèle d'événement personnalisé.

L'ajout d'un modèle personnalisé ajoute un objet custom avec l'event code de base. Pour obtenir des exemples d'implémentation d'un événement personnalisé, reportez-vous à la documentation bots-node-sdk sur l'écriture de gestionnaires d'événements d'entité.
someCustomEvent: async (event, context) => {
  
}

Remplacer ou supprimer un gestionnaire d'événements d'entité

Si vous devez remplacer ou supprimer un EEH :
  1. Sélectionnez une ligne vide dans le menu Gestionnaire d'événements pour réactiver le bouton + Gestionnaire d'événements.

  2. Ouvrez la page Composants Il s'agit d'une image de l'icône Composants dans la barre de navigation de gauche.. Désactivez Service activé ou supprimez le service.
    Remarque

    Vous ne pouvez pas supprimer ou désactiver un service si l'EEH est toujours associé à l'entité de conteneur composite.
  3. Si nécessaire, ajoutez un nouvel EEH au conteneur composite ou, si vous n'optez pas pour un nouvel EEH, vous pouvez ajouter la logique de résolution avec les expressions FreeMarker.

Conseil :

La suppression de l'entité de conteneur composite supprimera également le service déployé pour l'EEH.

Quel IDE utiliser ?

Vous pouvez créer un EEH à l'aide de l'IDE de votre choix, puis déployer le code à l'aide d'un fichier TGZ packagé manuellement avec bots-node-sdk pack, ou vous pouvez utiliser l'éditeur de code de gestionnaire d'événements que nous fournissons. Lorsque vous utilisez notre éditeur, vous n'avez pas besoin de configurer votre environnement de développement, ou de packager et de déployer votre code. Le code est déployé automatiquement une fois que vous l'avez enregistré. Vous pouvez également réviser le code directement sans avoir à le déployer, ce qui n'est pas possible lorsque vous packagez et déployez un gestionnaire créé avec votre propre IDE. Vous ne pouvez pas ajouter des packages NPM supplémentaires à l'aide de l'éditeur de code de gestionnaire d'événements. Vous aurez besoin d'un autre IDE. Par exemple, si vous voulez utiliser Moment.js pour travailler sur des dates, vous devez télécharger le TGZ, ajouter la bibliothèque à l'aide de l'IDE de votre choix, puis repackager et déployer le TGZ. Ensuite, vous pouvez continuer à utiliser l'éditeur de code de gestionnaire d'événements.

Conseil :

L'éditeur de code de gestionnaire d'événements peut être une meilleure option pour de petites modifications. Si vous avez besoin d'apporter des modifications plus importantes ou d'ajouter des packages NPM supplémentaires, vous pouvez télécharger le fichier TGZ à partir de la page Composants, le décompresser, puis utiliser votre éditeur favori pour modifier le code avant de le repackager et de le déployer.

Simplifier les flux de dialogue avec les gestionnaires d'événements d'entité

Les gestionnaires d'événements d'entité peuvent simplifier votre définition de flux de dialogue car ils sont utilisés avec les meilleures pratiques de raccourcissement de dialogue qui sont des entités de conteneur composite. En ce qui concerne les services back-end, ils rendent la définition de flux de dialogue moins compliquée car vous n'avez pas besoin d'écrire un état distinct pour le composant personnalisé qui les appelle.

Les gestionnaires d'événements simplifient la définition du flux de dialogue d'une autre manière : ils permettent de modifier les messages générés par le composant Résoudre les entités. Par exemple, vous pouvez créer un carrousel de messages de carte sans utiliser la structure complexe de la propriété metadata du composant de réponse commune. A la place, vous pouvez ajouter le carrousel via du code simple, ce qui signifie que vous pouvez également ajouter des réponses de carte au composant Résoudre les entités. Par exemple, le code suivant permet au composant Résoudre les entités de générer un carrousel de cartes à défilement horizontal pour le type de pizza, chaque carte comportant un bouton Annuler :
Type: {

        publishPromptMessage: async (event, context) => {
          let candidateMessage = context.getCandidateMessageList()[0];
          const mf = context.getMessageFactory();
          const message = mf.createCardMessage()
            .setLayout(horizontal)
            .setCards(context.getEnumValues().map(p => {
                      mf.createCard(p.value)
                        .setDescription(pizzaInfo[p.value].description)
                        .setImageUrl(pizzaInfo[p.value].image)
                        .addAction(mf.createPostbackAction('Order',{variables: {pizza: p.value}}));
                      })
            .setGlobalActions(candidateMessage.getGlobalActions());
          context.addMessage(message);
        }

Tutoriels sur les gestionnaires d'événements d'entité

Suivez ce tutoriel pour vous familiariser avec les gestionnaires d'événements d'entité en créant un gestionnaire à l'aide de l'éditeur. Consultez ensuite ce tutoriel avancé pour créer un gestionnaire d'événements d'entité avec un IDE externe et bots-node-sdk.

Désambiguïté des éléments et sous-types de poche imbriquée

Le conteneur composite invite toujours à saisir les valeurs correspondant à l'ordre d'article dicté par la structure hiérarchique d'un article de conteneur imbriqué. Il ne crée pas de créneaux aveugles pour plusieurs éléments. Il tente plutôt de faire correspondre la valeur du message utilisateur uniquement à l'élément qu'il invite actuellement. Lorsque l'entrée utilisateur ne correspond pas à l'élément en cours ou peut éventuellement correspondre à plusieurs éléments, comme cela peut être le cas pour startTime et endTime pour un sous-type INTERVAL, elle présente aux utilisateurs la valeur définie pour la propriété Libellé afin de clarifier l'entrée demandée.

Conseil :

Comme pour toutes les chaînes, nous vous recommandons de définir la valeur Libellé en tant que regroupement de ressources.

Ajout de l'entité DATE_TIME à un conteneur composite

Pour permettre à votre brique de gérer des scénarios complexes nécessitant plusieurs invites utilisateur, telles que la planification d'une réunion ou la définition d'un événement récurrent, vous devez créer un élément de conteneur composite DATE_TIME, puis configurer les attributs des sous-types Intervalle, Récurrent, Date et Heure et leurs éléments de conteneur imbriqué respectifs.
Remarque

Bien que vous puissiez utiliser la date, l'heure et la durée comme entités autonomes, nous vous recommandons de les utiliser dans les entités de conteneur composite.
  1. Avant de créer un élément de conteneur DATE_TIME, configurez les règles de résolution des ambiguïtés de date et d'heure appropriées à votre cas d'emploi. Par exemple, si vous créez une brique de note de frais, sélectionnez Passé. Si la brique est un planificateur de réunions, sélectionnez Futur.
  2. Dans l'entité de conteneur composite, cliquez sur Ajouter un élément.
  3. Sélectionnez Entité dans le menu Type.
  4. Sélectionnez DATE_TIME dans le menu Nom de l'entité.
  5. Choisissez un sous-type DATE_TIME dans le menu Sous-type.

    Les options de configuration de la page Ajouter un élément de poche varient en fonction du sous-type sélectionné. Par exemple, si vous sélectionnez le sous-type Récurrent, vous pouvez accéder aux options de configuration des éléments de conteneur imbriqué spécifiques à la définition d'un événement récurrent, telles que l'objet Date et heure pour la date et l'heure de début initiales et l'objet Durée pour la définition de la fréquence d'événement.

  6. Si vous avez sélectionné les sous-types Récurrent ou Intervalle :
    • Définissez les valeurs de sous-type que le conteneur composite invite à saisir dans le menu Invite pour.
    • Etant donné que les réunions commencent et se terminent généralement le même jour, activez l'option Date de fin par défaut à la date de début pour le sous-type startDate. La date de fin est alors identique à la date de début lorsque le message utilisateur ne mentionne pas la date de fin (ou lorsque la date de fin n'est pas extraite dans l'ordre).
      Image de la bascule Date de début par défaut - Date de fin.

  7. Ajoutez éventuellement une étiquette d'homonymie si l'entrée utilisateur peut correspondre à plusieurs sous-types.

    Conseil :

    Vous pouvez également configurer les propriétés qui ne sont pas spécifiques à DATE_TIME, telles que renseignement amélioré des emplacements, mise à jour des valeurs d'emplacement avec Apache FreeMarker, des invites personnalisées et des messages d'erreur.
  8. Vous pouvez accéder à la configuration de niveau sous-type en cliquant sur un sous-type. Utilisez la traversée pour revenir à la configuration de niveau article.
    Image du parcours Modifier l'élément de sac.

  9. Les étapes suivantes :
    • Associez l'entité de conteneur composite à l'intention.
    • Déclarez une variable pour l'entité dans le flux de dialogue.
    • Dans le flux de dialogue, référencez l'entité de conteneur composite avec l'élément DATE_TIME à l'aide de l'état Résoudre le conteneur composite.
    • Les valeurs DATE_TIME sont représentées au format ISO 8601. Pour une sortie conviviale, utilisez Apache FreeMarker .xs intégré. Dans le fragment de code suivant, la valeur du sous-type Heure est formatée à l'aide de .value?time.xs?string['hh:mm a'].
      Your pizza will be delivered at ${pizza.value.deliveryTime.value?time.xs?string['hh:mm a']}.
      
      Au lieu de référencer l'élément DATE_TIME en tant que chaîne, vous pouvez suivre l'approche recommandée pour le référencer dans un groupe de ressources, comme DeliveryMessage dans l'exemple suivant.
      ${rb('DeliveryMessage','time',pizza.value.deliveryTime.value?time.xs?string['hh:mm a'])}
      
      Pour le message de groupe de ressources DeliveryMessage, la valeur est affichée via le paramètre {time} :
      Your pizza will be delivered at {time}.
      

Tutoriel : extraction d'entités réelles à l'aide d'entités de conteneur composite

Vous pouvez obtenir un aperçu pratique de la création d'un conteneur composite en suivant ce tutoriel : Activation de l'extraction d'entités réelles à l'aide d'entités de conteneur composite.