Mischentitys konfigurieren

Mit Composite Bag-Entitys können Sie wesentlich kürzere, kompaktere Dialogablaufdefinitionen schreiben, da diese mit nur einer Komponente aufgelöst werden können (entweder Entitys auflösen oder eine gemeinsame Antwort).

Diese Vorgehensweise wird empfohlen, da Sie keine Komponenten wie "Switch" oder "Variable festlegen" benötigen, um alle für die Ausführung einer Transaktion erforderlichen Benutzereingaben zu erfassen. Stattdessen kann eine einzelne Komponente Benutzer zur Eingabe von Werten für jedes Element in der Mischentity auffordern. Die Prompts selbst sind bedingungsspezifisch, weil sie auf der individuellen Konfiguration für jedes Mischentityelement basieren. Mit der Mischentity, einem Entity-Event-Handler oder Apache FreeMarker und den Komponenten "Gemeinsame Antwort" oder "Entitys auflösen" kann Ihr Skill:
  • den gesamten freien Text erfassen, Dateiuploads zulassen und den aktuellen Standort des Benutzers mit den Elementen STRING, ATTACHMENT und LOCATION erfassen.

  • individuelles Verhalten für jede Mitgliedsentity in der Mischentity ausführen - Sie können wertespezifische Prompts und Fehlermeldungen für einzelne Entitys innerhalb der Mischentity hinzufügen (dazu gehören benutzerdefinierte Entitys, Systementitys und die Elemente STRING, ATTACHMENT und LOCATION). Sie können auch kontrollieren, welche Entitys mit der Benutzereingabe übereinstimmen sollen (oder nicht). Da Sie eine Prompt-Sequenz erstellen können, kann der Skill unterschiedliche Prompts für jeden Benutzerversuch ausgeben.

  • Mehrfachauswahllisten anzeigen.

  • Wertübereinstimmungen basierend auf Validierungsregeln validieren.

  • den "Unhappy Flow" unterstützen - Benutzer können vorherige Eingaben korrigieren.

  • temporäre, übereinstimmungsbasierte Übergänge ausführen - Der Dialogablauf kann die Komponente vorübergehend verlassen, wenn eine Übereinstimmung für eine Entity vorliegt, sodass ein anderer Status eine unterstützende Funktion wie einen REST-Aufruf ausführen kann. Nach Abschluss der Funktion geht der Dialogablauf wieder zurück zur Komponente, sodass der Wertabgleich fortgesetzt werden kann. Beispiel:
    • Nachdem ein Benutzer eine Quittung hochgeladen hat, muss die Quittung selbst gescannt werden, sodass Werte wie Spesendatum, Betrag und Spesentyp aus der Quittung für die anderen Entitys in der Mischentity extrahiert werden können. Auf diese Weise kann die Komponente die restlichen Werte aus der Quittung ausfüllen, nicht von einer Benutzereingabe.

    • Der Skill gibt zwischen übereinstimmenden Entitysets in der Mischentity eine Nachricht aus, wie "Fast geschafft, nur noch ein paar Fragen".

    • Die Benutzereingabe muss über einen Backend-REST-Aufruf validiert werden. Die Validierung ist möglicherweise sofort erforderlich, da sie bestimmt, welches der Mischentityelemente den Benutzer zur weiteren Eingabe auffordern muss. Alternativ kann der Aufruf Informationen zurückgeben, die mit dem Benutzer geteilt werden müssen, wie eine Out-of-Policy-Warnung.

  • Werte eindeutig erklären - Sie können einen Wert aus der Benutzereingabe über entityspezifische Prompts und Komponenteneigenschaften isolieren. Dies umfasst die Unterstützung von Korrekturen an vorherigen Eingaben (dem "Unhappy Flow") und die Aufforderung des Benutzers zur Eingabe bestimmter Eigenschaften integrierter Entitys.

Mischentity erstellen

  1. Klicken Sie in der seitlichen Navigationsleiste auf Entitys Dieses Bild zeigt das Symbol "Entitys"..

  2. Klicken Sie auf Entitys hinzufügen.

  3. Wählen Sie Mischentity als Entitytyp aus.

  4. Geben Sie einen Namen und eine Beschreibung ein.
  5. Klicken Sie auf + Event-Handler, wenn Sie das Prompting und die Logik der Mischentity programmgesteuert mit Entity-Event-Handlern ausführen möchten.
  6. Klicken Sie auf + Mischentityelement, um das Dialogfeld "Mischentityelement hinzufügen" zu öffnen. Wenn Sie eine integrierte Entity oder eine vorhandene benutzerdefinierte Entity hinzufügen, können Sie einen mischentityspezifischen Namen für sie erstellen und eine Beschreibung der Rolle innerhalb des Kontextes der Mischentity hinzufügen.

  7. Sie können die Tasche mit benutzerdefinierten Entitys, integrierten Entitys sowie folgenden Entitys füllen:
    • STRING - Erfasst freien Text vom Benutzer.

    • LOCATION - erfasst den Standort des Benutzers.

    • ATTACHMENT - Akzeptiert Dateien, Audiodateien, Video- und Bilddateien, die vom Benutzer hochgeladen wurden. Die Mischentity speichert die URL, unter der der Anhang gehostet wird.

    Hinweis

    Sie werden zur Eingabe eines Subtyps aufgefordert, wenn Sie die Entity DATE_TIME hinzufügen.
    Die Elemente werden in der Reihenfolge aufgelöst, in der Sie sie hinzufügen. Die Reihenfolge kann jedoch davon beeinflusst werden, wie Sie die einzelnen Elemente der Mischentity konfigurieren.
  8. Wenn Sie auf Schließen klicken, kehren Sie zur Seite "Entitys" zurück. Zunächst können Sie dem Element jedoch weitere mischentityspezifische Funktionen hinzufügen (oder es später aktualisieren, indem Sie auf der Seite "Entitys" auf Dieses Bild zeigt das Symbol "Bearbeiten". klicken).

  9. Nächste Schritte:
    • Fügen Sie einzelne Fehlermeldungen, Begriffserklärungs-Prompts oder bedingte Eingabeaufforderungen für die Mischentityelemente hinzu.
      Hinweis

      Diese werden überschrieben, wenn Sie die Entity zu einer Mischentity hinzufügen.
    • Fügen Sie die Entity einem Intent hinzu. Informationen hierzu finden Sie unter Entitys zu Intents hinzufügen.

    • Konfigurieren Sie den Dialogablauf für die Verwendung der Mischentity..

Erweiterte Slotfüllung

Wenn Sie die erweiterte Einschubfachfüllung aktivieren, indem Sie unter Einstellungen > Erweiterte Einschubfachfüllung verwenden die Option Konfiguration aktivieren:
  • Nur das aktuell auflösende Element wird aktualisiert. Wenn eine Übereinstimmung für mehrere Mischentityelemente gilt, hat das aktuell auflösende Mischentityelement Vorrang vor anderen Elementen. Wenn Sie die erweiterte Slotfüllung deaktivieren, werden alle Elemente mit demselben Wert aktualisiert.
  • Wenn es sich bei dem aktuell auflösenden Element um ein STRING-Beutelartikel handelt, werden keine anderen Beutelartikel jemals aktualisiert.
  • Wenn eine Entityübereinstimmung für mehrere (nicht auflösende) Mischentityelemente gilt, wird ein Dialogfeld mit einer eindeutigen Definition angezeigt, in dem der Benutzer auswählen kann, welches Element aktualisiert werden soll, anstatt alle Mischentityelemente zu aktualisieren.
  • Der Schalter Prompt für Begriffsklärung der Entity wird ignoriert. Es wird empfohlen, benutzerdefinierte Desambiguation mit einem Entity Event Handler zu implementieren.
Hinweis

Der Schalter Erweiterte Slotfüllungen verwenden ist standardmäßig für Skills aktiviert, die mit Version 22.08 der Plattform erstellt wurden. Es wurde für Skills deaktiviert, die auf diese Version upgegradet wurden.

Prompts hinzufügen

Sie können einen einzelnen Prompt hinzufügen oder eine Sequenz von Prompts erstellen, die jeweils immer spezifischere Informationen angeben, je häufiger der Benutzer einen ungültigen Wert eingibt. Prompting ist standardmäßig aktiviert. So fügen Sie diese Prompts hinzu:
  1. Wenn Sie Prompting aktivieren möchten, lassen Sie das Feld Prompt für Wert leer (Standardstatus). Die Eingabe von false im Feld Prompt für Wert verhindert das Prompting. Um Benutzer zur Eingabe eines bedingten Wertes aufzufordern, fügen Sie einen booleschen FreeMarker-Ausdruck hinzu, der true (für Prompting) oder false ergibt.

    Tipp:

    Wenn Sie Prompt für Wert auf false setzen, kann das Element dennoch als Teil eines anderen Elements aufgelöst werden, zu dessen Eingabe der Benutzer aufgefordert wird, wenn Sie die Option Out-of-Order-Extraktion aktivieren.
  2. Klicken Sie auf Prompt hinzufügen, um die Prompt-Sequenz zu erstellen. Sie können die Reihenfolge ändern, indem Sie die Felder durch Drag-and-Drop-Gesten neu anordnen oder sie neu nummerieren. Sie können die Ausgabe der Prompts zufällig anordnen, indem Sie zwei oder mehr Prompts dieselbe Nummer zuweisen.
    Hinweis

    Sie können Prompts für integrierte Entitys nur hinzufügen, wenn Sie sie einer Mischentity hinzufügen.
    Sie können Prompts in Resource Bundles (z.B. ${rb.askCheese}) speichern oder als Kombinationen aus Text und FreeMarker-Ausdrücken schreiben.

Slotted Values mit Apache FreeMarker-Ausdrücken aktualisieren

Geben Sie im Feld Aktualisierbar einen Apache FreeMarker-Ausdruck ein, der true ergibt, damit der für ein Mischentityelement erstellte Wert aktualisiert werden kann.

Out-of-Order-Export aktivieren

Die Out-of-Order-Extraktion ermöglicht das Einschieben und Aktualisieren von Werten für ein Mischentityelement zu einem beliebigen Zeitpunkt in der Unterhaltung, unabhängig davon, ob die Mischentity den Benutzer zur Eingabe des Wertes aufgefordert hat oder nicht. Mit den folgenden Regeln können Sie festlegen, wie, wann oder ob ein Wert an einem beliebigen Punkt in der Unterhaltung für einen beliebigen Element- oder Elementuntertyp (wie die DATE_TIME-Subtypen) geplatzt oder geändert werden kann.
  • Immer: Die Standardoption. Wenn Sie diese Option für ein Element auswählen, kann der Wert ohne Prompt eingefügt werden. Beispiel: Die PizzaSize-Entity kann aufgelöst werden, wenn ein Kunde Ich möchte eine große Pizza eingibt. Mit dieser Option kann der Elementwert jederzeit geändert werden, sofern der Ausdruck in der Eigenschaft Aktualisierbar nicht als false ausgewertet wird. Beispiel: Wenn die Composite Bag zur Eingabe der Entity PizzaType auffordert, kann der Kunde dann Vegetarisch bitte, aber mittelgroß antworten. Der Skill kann den Wert der PizzaSize-Entity mit "mittelmäßig" aktualisieren, ohne die Unterhaltung neu zu starten, weil Immer für die Elemente PizzaSize und PizzaType der Tasche aktiviert ist.
    Hinweis

    Obwohl diese Option das Standardverhalten ist, ist sie möglicherweise nicht immer für STRING-Elemente geeignet. Wenn Sie diese Option für ein STRING-Element ausgewählt haben, wird beispielsweise die erste Benutzernachricht vom STRING-Element gespeichert, anstatt mit der beabsichtigten Entity abgeglichen zu werden (die als das erste Element in der Tasche angegeben werden kann, um aufgelöst zu werden).
  • Niemals: Wenn Sie diese Option auswählen, wird das Element erst nach der Eingabeaufforderung angezeigt, selbst wenn andere Benutzernachrichten gültige Werte enthalten. Wählen Sie Nie aus, um versehentliche Übereinstimmungen zu verhindern.
  • Nur beim Auflösen der Intent-Äußerung - Schränkt das Out-of-Order-Wert-Slotting auf die erste Benutzeräußerung ein, die in das Intent aufgelöst wurde, das mit der Mischentity verknüpft ist.
Im Folgenden finden Sie Beispiele für Out-of-Order-Extraktionsregeln, die auf ein Mischentityelement PizzaToppings angewendet werden.
Extraktionsregel für Out-of-Order Anfängliche Benutzeräußerung Geschätzter Wert Hinweise
Immer Pizza bestellen mit Thunfisch Thunfisch Der Wert, der für das Element PizzaToppings festgelegt wird, kann immer dann abgeglichen werden, wenn die Benutzernachricht den richtigen Wert enthält ("Mushrooms stattdessen!"). Es kann an jedem Punkt in der Konversation ohne Aufforderung aktiviert oder aktualisiert werden.
Nie Pizza bestellen mit Thunfisch - Der Wert für das Element PizzaTopping kann nicht in der falschen Reihenfolge platziert oder ad hoc aktualisiert werden. Sie kann nur abgeglichen werden, wenn sie dazu aufgefordert wird.
Nur beim Auflösen der Intent-Äußerung Pizza bestellen mit Thunfisch Thunfisch. Wenn der Benutzer jedoch "Große Pizza bestellen" eingegeben hat, muss die Mischentity den Wert PizzaTopping eingeben. Das Element PizzaTopping kann nur dann in der falschen Reihenfolge angeordnet werden, wenn die erste Benutzeräußerung, die in ein Intent aufgelöst wird, einen übereinstimmenden Wert aufweist. Andernfalls muss dieser Wert zur Eingabe aufgefordert werden. Die Mischentity lässt keine Ad-hoc-Aktualisierung oder Verschiebung dieses Artikels zu.

"Export aktivieren mit"

Wenn Sie die Option Extrahieren mit aktivieren, kann Ihr Skill ein Mischentityelement mit der Eingabe auflösen, die für ein zweites Element in der Mischentity eingegeben wurde. Mit dieser Option kann Ihr Skill zugehörige Werte verarbeiten und ermöglicht dadurch eine größere Flexibilität bei der Benutzereingabe. Benutzer können beispielsweise Home statt einer vollständigen Adresse eingeben. Vorgehensweise:
  • Die Mischentity enthält zwei adressbezogene Entitys: "NamedAddress", eine Wertelistenentity mit Werten wie "Home" und "Büro", und "DeliveryAddress", die ADDRESS-Entity.
  • Der Prompt für die Entity "DeliveryAddress" lautet "Wohin soll geliefert werden? "
  • Die Entity "NamedAddress" fordert den Benutzer nicht zur Eingabe auf (in das Feld "Prompt für Wert" wird false eingegeben).
  • Die Entity "NamedAddress" kann mit "DeliveryAddress" extrahiert werden ("DeliveryAddress" wird im Menü Extrahieren mit ausgewählt).

Wenn die Mischentity den Benutzer zur Eingabe der Entity "DeliveryAddress" auffordert, kann er die Entity entweder mit einer physischen Adresse oder mit einem Wert aus der "NamedAddress"-Liste (Home oder "Büro") auflösen.

Validierungsregeln hinzufügen

Jedes Element in der Mischentity kann über eigene Validierungsregeln verfügen. Sie können eine Validierungsregel hinzufügen, indem Sie zuerst auf + Validierungsregel klicken und dann einen FreeMarker-Ausdruck und einen Text-Prompt hinzufügen. Im Ausdruck wird das folgende Muster verwendet, um den Elementwert zu referenzieren. varName ist der Name der Composite Bag-Entity, die in der Dialogablaufdefinition als Variable deklariert ist:
${varName.value.itemName}
Wenn die Auswertung dieses Ausdrucks "false" ergibt, ist die Benutzereingabe nicht gültig.
Im folgenden Beispiel für einen Validierungsausdruck wird ein Element mit dem Namen "Amount" verwendet. Es handelt sich hierbei um die integrierte Entity "CURRENCY". Um einen Zahlenbetrag für den Vergleich zurückzugeben, fügt der Ausdruck die Eigenschaft amount der CURRENCY-Entity hinzu:
${expense.value.Amount.amount > 4}
Die entsprechende Validierungsmeldung kann auch die Benutzereingabe über einen FreeMarker-Ausdruck widerspiegeln. Beispiel: Die folgende Meldung verwendet den Währungstyp, der aus der Benutzereingabe als Teil der Validierungsmeldung extrahiert wurde:
Amounts below 5 ${expense.value.Amount.currency} cannot be expensed. Enter a higher amount or type 'cancel'.
Weitere Informationen zu CURRENCY-Eigenschaften (samt anderen integrierten Entityeigenschaften) finden Sie unter Integrierte Entitys und ihre Eigenschaften.

YAML-Dialogablauf für Composite Bag-Entitys konfigurieren

Wenn Ihr Skill im YAML-Dialogmodus entwickelt wird, müssen Sie Folgendes tun, um den Dialogablauf für Mischentitys zu konfigurieren:

  1. Deklarieren Sie im context-Knoten die Mischentity als Variable:
    ...
    metadata:
      platformVersion: "1.1"
    main: true
    name: "ExpenseBot"
    context:
      variables:
        expense: "Expense"
        iResult: "nlpresult"
  2. Sie können System.ResolveEntities oder System.CommonResponse verwenden. Mit beiden Komponenten können Sie die Mischentity verwenden. Sie bieten beide individuelle Vorteile. System.ResolveEntities ist die einfachere der beiden Komponenten und weist ein kleines Set von Eigenschaften auf. Im Gegensatz zur Komponente System.ResolveEntities bietet System.CommonResponse mehr Kontrolle über die Benutzeroberfläche, mit der die Entitys in der Mischentity aufgelöst werden. Beispiel: Sie können eine bedingte Logik hinzufügen, um Prompts und wertbezogene globale Aktionen zu bestimmen.

    Tipp:

    Da die Metadaten für die Komponente System.CommonResponse sehr komplex werden können, wenn Sie Mischentitys verwenden, wird empfohlen, stattdessen die Komponente System.ResolveEntities zu verwenden und Entity-Event-Handler für UI-Anpassungen zu verwenden.
  3. Referenzieren Sie die Kontextvariable der Composite Bag-Entity in der variable-Eigenschaft der Komponente, und definieren Sie gegebenenfalls die anderen Eigenschaften. Unter System.ResolveEntities und Komponenteneigenschaften werden diese Komponenten beschrieben. Außerdem finden Sie hier weitere Beispiele.

    Nachfolgend ein Beispiel für die Komponente System.ResolveEntities:
    createExpense:
        component: "System.ResolveEntities"
        properties:
          variable: "expense"
          useFullEntityMatches: true
          nlpResultVariable: "iResult"
          cancelPolicy: "immediate"
        transitions:
          actions:
            cancel: "cancelExpense"
          return: "done"          

Die Variable system.entityToResolve

Die Variable system.entityToResolve enthält Informationen zum aktuellen Status des Entityauflösungsprozesses, wie er von den Komponenten "Entitys auflösen" und "Gemeinsame Antwort" ausgeführt wird. In der Regel referenzieren Sie die Eigenschaften dieses Variablenwerts in den Metadaten der Komponente "Allgemeine Antwort", wenn Sie Nachrichten anpassen möchten. Sie können damit die Logik für die Fehlermeldung einer Entity oder für verschiedene Eigenschaften definieren, die zu den Komponenten "Entitys auflösen" und "Gemeinsame Antwort" gehören. Hängen Sie die folgenden Eigenschaften an, um den aktuellen Entitywert zurückzugeben:
  • userInput
  • prompt
  • promptCount
  • updatedEntities
  • outOfOrderMatches
  • disambiguationValues
  • enumValues
  • needShowMoreButton
  • rangeStartVar
  • nextRangeStart
Sie können auch die Eigenschaften in FreeMarker-Ausdrücken referenzieren, die Eigenschaften von Mischentityelementen wie prompt, errorMessage und Validierungsregeln verwenden.
Nachfolgend ein Beispiel für die Verwendung dieser Variablen zur Rückgabe der Benutzereingabe in der Fehlermeldung einer Entity:
Sorry,'${system.entityToResolve.value.userInput!'this'}' is not a valid pizza size.
Nachfolgend ein Beispiel für die Verwendung verschiedener system.entityToResolve-Definitionen. Bei diesen Meldungen handelt es sich um eine Meldung, die für die Eigenschaft text definiert wurde und eine Aktualisierung bestätigt, die an einem zuvor festgelegten Entitywert mit der Apache FreeMarker-Anweisung list und der Eigenschaft updatedEntities vorgenommen wurde.
    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"
Bei globalen Aktionen steuert diese Variable die globale Aktion "Mehr anzeigen" mit den Eigenschaften needShowMoreButton, rangeStartVar und 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"
Das Label "Mehr anzeigen" muss system.showMore (action: "system.showMore") enthalten. Andernfalls funktioniert es nicht.

entityToResolve-Ausdrücke

Ausdruck Beschreibung
${system.entityToResolve.value.resolvingField} Gibt den Namen des Mischentityelements zurück.
${system.entityToResolve.value.allMatches[0].entityName} Gibt den Entitynamen zurück, der durch das Mischentityelement referenziert wird. Das allMatches-Array enthält alle Entitys, deren Werte möglicherweise durch die Benutzernachricht aktualisiert werden.
${<variable>1.value[system.entityToResolve.value.resolvingField]} Gibt den vom Benutzer eingegebenen oder ausgewählten Wert des Mischentityelements zurück.
${system.entityToResolve.value.userInput} Gibt den vom Benutzer eingegebenen Text zurück. Mit diesem Ausdruck können Sie die Benutzereingabe protokollieren oder im Chat anzeigen, beispielsweise wenn ein Benutzer einen ungültigen Wert eingibt.
${system.entityToResolve.value.outOfOrderMatches[n].entityName} Gibt die Namen der Entitys zurück, die bei der Out-of-Order-Extraktion extrahiert werden. Neben den Werten, für die Benutzer von den Komponenten "Entitys auflösen" oder "Gemeinsame Antwort" aufgefordert werden, können Benutzer zusätzliche Werte bereitstellen, die Out-of-Order-Wertsextraktion und Aktualisierungen für andere Entitys in der Composite Bag auslösen.
${system.entityToResolve.value.outOfOrderMatches[n].name} Gibt den Namen des Mischentityelements zurück.
${system.entityToResolve.value.outOfOrderMatches? has_content?then(…,…)} Gibt den Wert einer Entity zurück, die in der falschen Reihenfolge abgeglichen wurde. Da wahrscheinlich keine Entity in der falschen Reihenfolge abgeglichen wurde, verwendet dieser Ausdruck den Operator has_content.

Entity-Event-Handler

Mit Entity Event Handlern können Sie die Validierung, Eingabeaufforderung und Disambiguation der Mischentityelemente programmgesteuert ausführen. Ein Entity Event Handler (EEH) ist eine JavaScript-(oder TypeScript-)Implementierung, die für eine Mischentity erstellt und als benutzerdefinierter Codeservice bereitgestellt wird.
Hinweis

Sie können den für den EEH bereitgestellten Service auf der Seite "Komponenten" Dieses Bild zeigt das Symbol "Komponenten" in der linken Navigationsleiste. verwalten.
Sie können das Auflösungsverhalten sowohl für einzelne Mischentityelemente als auch für die Entity selbst steuern, indem Sie die von der bots-node-sdk bereitgestellten Ereignis-Handler-Funktionen definieren. Beispiel: Das folgende Snippet veranschaulicht die Definition eines validate-Ereignisses für ein Mischentityelement namens ExpenseDate, das verhindert, dass Benutzer bei der Einreichung einer Spesenabrechnung ein zukünftiges Datum eingeben.
ExpenseDate: {

        validate: async (event, context) => {
          if (new Date(event.newValue.date) > new Date()) {
            context.addValidationError("ExpenseDate",context.translate('ExpenseDate.text'));
            return false;
          }          
        }
In der Dokumentation Writing Entity Event Handler von bots-node-sdk werden die Gesamtstruktur des Event Handler-Codes, die Ereignisse auf Element- und Entityebene und die Methoden EntityResolutionContext wie addValidationError und translate im obigen Snippet beschrieben.

Da Entity-Event-Handler in JavaScript geschrieben werden, können Sie erweiterte Logik verwenden, die mit den FreeMarker-Ausdrücken, mit denen Sie die Validierung, Fehler und Prompts auf der Seite "Bag-Element bearbeiten" und im Dialogablauf definieren können, nicht einfach erreicht oder sogar möglich ist. Sie sind auch einfacher zu debuggen. Allerdings müssen Sie Entity-Event-Handler nicht FreeMarker-Ausdrücken vorziehen. Sie können beide Verfahren kombinieren. Beispiel: Sie können FreeMarker-Ausdrücke für einfache Validierungen und Prompts verwenden und einen EEH für komplexere Funktionen wie das Aufrufen einer REST-API reservieren, wenn alle Mischentityelemente aufgelöst wurden.

Entity-Event-Handler mit dem Event Handler-Codeeditor erstellen

Sie können den EEH mit dem Event Handler-Codeeditor erstellen, auf den über die Seite mit den Mischentityeigenschaften oder mit der IDE Ihrer Wahl zugegriffen wird. Während der Event Handler-Codeeditor einige Vorteile gegenüber einem Drittanbietertool bietet, können Sie je nach Größe der Aufgabe und den benötigten Bibliotheken mit einer IDE eines Drittanbieters wechseln. Informationen zum Wiegen der Vor- und Nachteile finden Sie unter Welche IDE sollte ich verwenden?

So greifen Sie auf den Event Handler-Codeeditor zu:
  1. Klicken Sie auf + Event Handler.
  2. Füllen Sie das Dialogfeld "Event Handler erstellen" aus, indem Sie einen Servicenamen und einen Handler-Namen hinzufügen.

Nachdem Sie den Handler erstellt haben, können Sie den Editor öffnen, indem Sie auf Dieses Bild zeigt das Symbol "Bearbeiten". klicken.

Der Editor wird mit dem Startcode aufgefüllt. Das zugehörige handlers-Objekt enthält die Objekte entity, items und custom. Innerhalb dieser Objekte definieren Sie Ereignisse auf Ereignisebene, die für die gesamte Mischentity ausgelöst werden, die Ereignisse auf Elementebene, die die Auflösung der einzelnen Mischentityelemente steuern, und die benutzerdefinierten Ereignisse, die bei Postback-Aktionen ausgelöst werden. Standardmäßig ist für das Objekt handler ein entity-Objekt definiert. Die Objekte items und custom werden aufgefüllt, wenn Sie eine Vorlage auf Elementebene oder eine benutzerdefinierte Vorlage hinzufügen.
Beschreibung von eeh-default-template.png folgt
Beschreibung der Abbildung eeh-default-template.png

Die Ereignisse selbst sind asynchrone JavaScript-Funktionen, die zwei Argumente annehmen:
  • event: Ein JSON-Objekt der ereignisspezifischen Eigenschaften.
  • context: Eine Referenz auf die Klasse EntityResolutionContext, deren Methoden (wie addValidationError im folgenden Snippet) die Ereignis-Handler-Logik bereitstellen.
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'.`);
      }
    }
  }
Sie können auf die Vorlagen zugreifen, indem Sie auf + Ereignis hinzufügen klicken.
Hinweis

Weitere Informationen zu EEH-Startcode, Ereignissen auf Element- und Entityebene, EntityResolutionContext und Codebeispielen finden Sie in der Dokumentation zu bots-node-sdk Writing Entity Event Handlern.
Ereignisse hinzufügen
Wenn Sie auf + Ereignis hinzufügen klicken, können Sie die Vorlagen für Ereignisse, Elemente und benutzerdefinierte Ereignisse hinzufügen.

Beispiel: Wenn Sie eine Vorlage für das Ereignis validate hinzufügen, wird der Editor mit dem folgenden Code aufgefüllt:
validate: async (event, context) => {
        
      },
Dann können Sie diese Vorlage mit Ihrem eigenen Code aktualisieren:
validate: async (event, context) => {
     if (event.newValue.value === 'PEPPERONI')
       context.addValdiationError('Type', "Sorry, no pepperoni pizzas today!");     
      },
Wenn Sie auf Validieren klicken, wird der Code auf Entwurfszeitprobleme geprüft. Klicken Sie also regelmäßig auf diese Option. Wenn der Code ungültig ist, können Sie keine weiteren Ereignisse hinzufügen. Sie können auch keinen ungültigen Code speichern. Da der Code beim Speichern auch bereitgestellt wird, können Sie auch keinen ungültigen Code bereitstellen.

Wenn der Code gültig ist, wird er durch Klicken auf Speichern automatisch bereitgestellt und in einer TGZ-Datei verpackt. Sie können den Status des Deployments überwachen und die TGZ-Datei zur Wiederverwendung in anderen Skills auf der Seite "Komponenten" herunterladen.

Tipp:

Um nach Laufzeitfehlern zu suchen, aktivieren Sie Komponentenlogging aktivieren, und prüfen Sie die Logs (auf die Sie durch Klicken auf Diagnose > Logs anzeigen zugreifen). So ermitteln Sie die Parameter, die die Ereignisse aufgerufen haben.
Auf der Seite "Mischentity" werden der Status "Bereit" Dieses Bild zeigt das Statussymbol "Bereit". und das Symbol Bearbeiten Symbol "Bearbeiten zur Überarbeitung des Codes angezeigt, nachdem Sie den Service bereitgestellt haben.

Ereignishandler auf Entityebene hinzufügen
Für Ereignisse auf Entityebene können Sie die Vorlagen für die Entityebenenereignisse validate, publishMessage, maxPromptsReached, resolved, attachmentReceived und locationReceived aktualisieren.

Ereignis Beschreibung
validate Ein Handler für Validierungen auf Entityebene, der aufgerufen wird, wenn der Wert für mindestens eines der Mischentityelemente geändert wurde.
publishMessage Ein generischer Fallback Handler, der aufgerufen wird, wenn einem Bag-Element keine Prompt-Nachricht oder eine Disambiguationsbehandlung fehlt.
maxPromptsReached Ein generischer Fallback Handler, wenn der elementspezifische Handler zum Erreichen der maximalen Anzahl von Prompts nicht angegeben wurde.
resolved Diese Funktion wird aufgerufen, wenn die Mischentity aufgelöst wurde. In der Regel fügen Sie ein resolved-Ereignis hinzu, um eine Backend-API aufzurufen, die eine Transaktion im Zusammenhang mit den von der Composite Bag-Entity erfassten Werten abschließt. Wenn der API-Aufruf Fehler zurückgibt, weil einige der von der Mischentity erfassten Werte nicht gültig sind, können Sie diese Werte löschen.
attachmentReceived Dieser Handler wird aufgerufen, wenn der Benutzer einen Anhang sendet.
locationReceived Dieser Handler wird aufgerufen, wenn der Benutzer einen Standort sendet.
Standardmäßig wird die Vorlage mit dem Ereignis auf Entityebene publishMessage aufgefüllt. Über die Funktionen updatedItemMessage und outOfOrderItemsMessage (die auch in der Standardvorlage definiert sind) ermöglicht dieses Ereignis dem Skill, Nachrichten auszugeben, die bestätigen, dass ein zuvor aufgelöster Mischentityelementwert aktualisiert wurde oder dass er eine gültige Eingabe für ein Mischentityelement akzeptiert hat, das nicht das von der Entity derzeit angeforderte Mischentityelement ist (Out-of-Order-Eingabe).

Dieses Ereignis ist optional. Sie können ihn löschen, unverändert lassen oder ihm Funktionen hinzufügen. Beispiel: Sie können die Schaltfläche "Abbrechen" hinzufügen, wenn die Versuche eines Benutzers, einen gültigen Wert einzugeben, die maximale Anzahl von Prompts überschritten haben.
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);      }
}
Handler auf Elementebene hinzufügen
Für die im Dialogfeld aufgeführten Mischentityelemente können Sie Vorlagen für die Ereignisse auf Elementebene hinzufügen: shouldPrompt, validate, publishPromptMessage, publishDisambiguateMessage und MaxPromptsReached.

Ereignis Beschreibung
shouldPrompt Fordert basierend auf den Werten der anderen Elemente in der Tasche zur Eingabe eines Elements auf. Dieser Handler hat Vorrang vor dem Prompting, das über das Feld Prompt für Wert konfiguriert wurde.
validate Dieser Handler wird nur aufgerufen, wenn ein Wert für ein Mischentityelement festgelegt wurde. Wenn die Gültigkeit des Wertes von anderen Mischentityelementen abhängt, müssen Sie stattdessen das Ereignis validate auf Entityebene implementieren.
publishPromptMessage Mit dieser Funktion können Sie die von den Komponenten "Allgemeine Antwort" und "Entitys auflösen" generierte Nachricht zur Eingabe des Elements ersetzen oder erweitern.
publishDisambiguateMessage Mit dieser Funktion können Sie die von den Komponenten "Common Response" und "Resolve Entities" generierte Prompt-Nachricht für die Disambiguierung ersetzen oder erweitern.
maxPromptsReached Diese Funktion wird aufgerufen, wenn die maximale Anzahl von Prompts für dieses Element erreicht wurde. Diese wird unter "Maximale Benutzereingabeversuche" im Bildschirm für das Mischentityelement angegeben.

Wenn Sie ein Ereignis auf Elementebene hinzufügen, wird das Objekt items generiert.
Beschreibung von eeh-items-block.png folgt
Beschreibung der Abbildung eeh-items-block.png

Benutzerdefinierte Ereignisse hinzufügen
Sie können benutzerdefinierte Ereignisse erstellen, die über Postback-Aktionen (Schaltflächen oder Listenelemente) mit der benutzerdefinierten Ereignisvorlage aufgerufen werden.

Beim Hinzufügen einer benutzerdefinierten Vorlage wird ein custom-Objekt mit dem Basisereigniscode hinzugefügt. Beispiele für die Implementierung eines benutzerdefinierten Ereignisses finden Sie in der Dokumentation Writing Entity Event Handler von bots-node-sdk.
someCustomEvent: async (event, context) => {
  
}

Entity Event Handler ersetzen oder entfernen

Wenn Sie einen EEH ersetzen oder entfernen müssen:
  1. Wählen Sie im Menü "Event Handler" eine leere Zeile aus, um die Schaltfläche + Event Handler erneut zu aktivieren.

  2. Öffnen Sie die Seite "Komponenten" Dieses Bild zeigt das Symbol "Komponenten" in der linken Navigationsleiste.. Deaktivieren Sie Service aktiviert, oder löschen Sie den Service.
    Hinweis

    Sie können einen Service nicht löschen oder deaktivieren, wenn der EEH noch mit der Mischentity verknüpft ist.
  3. Falls erforderlich, fügen Sie der Mischentity einen neuen EEH hinzu. Wenn Sie sich nicht für einen neuen EEH entscheiden, können Sie die Auflösungslogik mit FreeMarker-Ausdrücken hinzufügen.

Tipp:

Wenn Sie die Mischentity löschen, wird auch der für den EEH bereitgestellte Service gelöscht.

Welche IDE sollte ich verwenden?

Sie können einen EEH mit der IDE Ihrer Wahl erstellen und den Code dann mit einer TGZ-Datei bereitstellen, die Sie manuell mit bots-node-sdk pack verpackt haben. Sie können aber auch den bereitgestellten Event Handler-Codeeditor verwenden. Wenn Sie unseren Editor verwenden, müssen Sie keine Entwicklungsumgebung einrichten und keinen Code verpacken und bereitstellen. Der Code wird automatisch bereitgestellt, nachdem Sie ihn gespeichert haben. Sie können den Code auch direkt ändern, ohne ihn erneut bereitstellen zu müssen. Das ist nicht möglich, wenn Sie einen Handler verpacken und bereitstellen, den Sie mit Ihrer eigenen IDE erstellt haben. Mit dem Event-Handler-Codeeditor können keine weiteren NPM-Packages hinzugefügt werden. Dazu benötigen Sie eine weitere IDE. Beispiel: Wenn Sie Moment.js zum Arbeiten mit Datumsangaben verwenden möchten, müssen Sie die TGZ herunterladen, die Library mit der IDE Ihrer Wahl hinzufügen und dann die TGZ neu verpacken und bereitstellen. Anschließend können Sie wieder den Event-Handler-Codeeditor verwenden.

Tipp:

Der Event-Handler-Codeeditor ist möglicherweise eine bessere Option für kleine Änderungen. Wenn Sie größere Änderungen vornehmen oder zusätzliche NPM-Packages hinzufügen müssen, können Sie die TGZ-Datei von der Seite "Komponenten" herunterladen, sie dekomprimieren und anschließend mit Ihrem bevorzugten Editor den Code ändern, bevor Sie ihn neu verpacken und bereitstellen.

Dialogabläufe mit Entity Event Handlern vereinfachen

Entity-Event-Handler können die Definition des Dialogablaufs vereinfachen, da sie mit der Best Practice zur Dialogverkürzung von Mischentitys verwendet werden. Im Hinblick auf Backend-Services machen sie die Dialogablaufdefinition weniger kompliziert, da Sie keinen separaten Status für die benutzerdefinierte Komponente schreiben müssen, die sie aufruft.

Event-Handler vereinfachen die Dialogablaufdefinition auf eine andere Weise: Sie können damit die von der Komponente "Entitys auflösen" generierten Nachrichten ändern. Beispiel: Sie können ein Karussell von Kartennachrichten erstellen, ohne die komplexe Struktur der Eigenschaft metadata der Komponente "Common Response" zu verwenden. Stattdessen können Sie das Carousel über einfachen Code hinzufügen. Das bedeutet, dass Sie auch Kartenantworten zur Komponente "Entitys auflösen" hinzufügen können. Beispiel: Mit diesem Code kann die Komponente "Entitys auflösen" ein horizontal scrollendes Karousel von Karten für den Pizza-Typ ausgeben, wobei jede Karte die Schaltfläche "Abbrechen" enthält:
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);
        }

Entity-Event-Handler - Tutorials

Befolgen Sie dieses Tutorial, um sich mit Entity-Event-Handlern vertraut zu machen, indem Sie einen mit dem Editor erstellen. Sehen Sie sich dieses Tutorial für fortgeschrittene Benutzer an, um einen Entity-Event-Handler mit einer externen IDE und bots-node-sdk zu erstellen.

Verschachtelte Beutelartikel und Subtypen eindeutig machen

Die Mischentity fordert immer nach Werten für die Artikelreihenfolge auf, die durch die hierarchische Struktur eines verschachtelten Mischentityelements vorgegeben wird. Werte für mehrere Elemente werden nicht blind platziert. Stattdessen wird versucht, den Wert in der Benutzernachricht nur mit dem Element abzugleichen, für das er gerade aufgefordert wird. Wenn die Benutzereingabe nicht mit dem aktuellen Element übereinstimmt oder möglicherweise mehrere Elemente abgleichen könnte, wie dies bei startTime und endTime für einen INTERVAL-Subtyp der Fall sein könnte, werden Benutzer mit dem für die Eigenschaft Label definierten Wert angezeigt, um die angeforderte Eingabe zu verdeutlichen.

Tipp:

Wie bei allen Zeichenfolgen wird empfohlen, den Wert Label als Resource Bundle zu definieren.

DATE_TIME-Entity zu einer Composite Bag hinzufügen

Damit Ihr Skill komplexe Szenarios verarbeiten kann, für die mehrere Benutzereingabeaufforderungen erforderlich sind, wie das Planen einer Besprechung oder das Festlegen eines wiederkehrenden Ereignisses, müssen Sie ein Mischentityelement DATE_TIME erstellen und dann die Attribute der Subtypen "Intervall", "Wiederkehrend", "Datum und Uhrzeit" und der jeweiligen verschachtelten Mischentityelemente konfigurieren.
Hinweis

Obwohl Sie Datum, Uhrzeit und Dauer als eigenständige Entitys verwenden können, wird empfohlen, diese in Mischentitys zu verwenden.
  1. Bevor Sie ein Mischentityelement DATE_TIME erstellen, konfigurieren Sie die für Ihren Anwendungsfall geeigneten Auflösungsregeln für Datum und Uhrzeit. Beispiel: Wenn Sie einen Skill für Spesenabrechnungen erstellen, wählen Sie Vergangen aus. Wenn der Skill ein Besprechungsplaner ist, wählen Sie Zukünftig aus.
  2. Klicken Sie in der Mischentity auf Element hinzufügen.
  3. Wählen Sie im Menü "Typ" die Option Entity aus.
  4. Wählen Sie im Menü "Entityname" die Option DATE_TIME aus.
  5. Wählen Sie im Menü "Subtyp" einen DATE_TIME-Subtyp.

    Die Konfigurationsoptionen auf der Seite "Beutelartikel hinzufügen" ändern sich je nach ausgewähltem Subtyp. Beispiel: Wenn Sie den Subtyp Wiederkehrend auswählen, können Sie auf Konfigurationsoptionen für die verschachtelten Mischentityelemente zugreifen, die spezifisch für das Festlegen eines sich wiederholenden Ereignisses sind, wie z.B. das Objekt Datum und Uhrzeit für das Anfangsdatum und die Anfangszeit und das Objekt Dauer zum Festlegen der Ereignishäufigkeit.

  6. Wenn Sie die Subtypen "Wiederkehrend" oder "Intervall" ausgewählt haben:
    • Legen Sie die Subtypwerte fest, die vom Mischentity-Prompt im Menü Prompt für angefordert werden.
    • Da Besprechungen normalerweise am selben Tag beginnen und enden, aktivieren Sie für den Subtyp startDate das Standardenddatum bis Startdatum. Dadurch wird das Enddatum auf das Startdatum gesetzt, wenn die Benutzernachricht das Enddatum nicht erwähnt (oder wenn das Enddatum nicht in der falschen Reihenfolge extrahiert wird).
      Dieses Bild zeigt den Umschalter "Standardstartdatum bis Enddatum".

  7. Fügen Sie optional ein Begriffslabel hinzu, wenn die Benutzereingabe mehrere Subtypen abgleichen kann.

    Tipp:

    Sie können auch die Eigenschaften konfigurieren, die nicht DATE_TIME-spezifisch sind, wie Erweiterte Slotfüllung, Slotting-Werte aktualisieren mit Apache FreeMarker, benutzerdefinierte Prompts und Fehlermeldungen.
  8. Sie können auf die Konfiguration auf Subtypebene zugreifen, indem Sie auf einen Subtyp klicken. Mit der Traversal kehren Sie zur Konfiguration auf Elementebene zurück.
    Dieses Bild zeigt das Traversal "Beutelartikel bearbeiten".

  9. Nächste Schritte:
    • Ordnen Sie die Mischentity dem Intent zu.
    • Deklarieren Sie eine Variable für die Entity im Dialogablauf.
    • Referenzieren Sie im Dialogablauf die Mischentity mit dem Element DATE_TIME mit dem Status "Composite Bag auflösen".
    • Die DATE_TIME-Werte werden als ISO 8601 dargestellt. Für eine benutzerfreundliche Ausgabe verwenden Sie den Apache FreeMarker .xs integriert. Im folgenden Snippet wird der Wert für den Zeitsubtyp mit .value?time.xs?string['hh:mm a'] formatiert.
      Your pizza will be delivered at ${pizza.value.deliveryTime.value?time.xs?string['hh:mm a']}.
      
      Anstatt das Element DATE_TIME als Zeichenfolge zu referenzieren, können Sie den Best-Practice-Ansatz verfolgen, es in einem Resource Bundle zu referenzieren, wie z.B. DeliveryMessage im folgenden Beispiel.
      ${rb('DeliveryMessage','time',pizza.value.deliveryTime.value?time.xs?string['hh:mm a'])}
      
      Für die Resource Bundle-Nachricht DeliveryMessage wird der Wert über den Parameter {time} wiedergegeben:
      Your pizza will be delivered at {time}.
      

Tutorial: Reale Entitys mit Mischentitys extrahieren

Im Tutorial Reale Entitys mit Mischentitys extrahieren wird das Erstellen einer Mischentity anhand eines praktischen Beispiels erläutert.