Wie schreibe ich Dialogabläufe in OBotML?

OBotML verwendet eine einfache Syntax zum Festlegen von Variablen und Definieren von Status. Da es sich um eine Variante von YAML handelt, müssen Sie beim Definieren des Dialogablaufs die YAML-Abstandskonventionen beachten. Sie müssen Dialogabläufe nicht völlig neu erstellen. Stattdessen können Sie die Standard-Dialogablaufdefinition als Basisvorlage verwenden.

Die Vorlage enthält bereits die Knoten context und states, sodass Sie einfach den vorhandenen Boilerplate löschen und Ihren eigenen Inhalt hinzufügen können. Um syntaktisch korrekte Statusdefinitionen zu erstellen, verwenden Sie die Komponentenvorlagen im Menü + Komponente. Tipps zum Festlegen von Variablen und Definieren von Status finden Sie unter Dialogablaufsyntax.

Tipp:

Klicken Sie beim Schreiben des Dialogablaufs auf Validieren, um nach Syntaxfehlern zu suchen und Best Practices anzuwenden.

Dialogablaufsyntax

Im Folgenden finden Sie einige Beispiele für die Verwendung der OBotML-Syntax in Dialogabläufen, die im YAML-Modus entwickelt werden.
Vorgehensweise Dies verwenden
Wie lege ich Variablen fest, die den Kontext über den gesamten Dialogablauf persistieren?
Verwenden Sie im context-Knoten die folgende Syntax: variablename: "variableType" Beispiel:
main: true
name: "FinancialBotMainFlow"
context:
  variables:
    accountType: "AccountType"
    txnType: "TransactionType"
    txnSelector: "TransactionSelector"
    toAccount: "ToAccount"
    spendingCategory: "TrackSpendingCategory"
    paymentAmount: "string"

Sie können Variablen als Entitys (wie AccountType und ToAccount) und als Primitives (paymentAmount: "string") definieren.

Wie definiere ich einen Error Handler für einen Skill?
Definieren Sie den Knoten defaultTransitions, der auf einen Status verweist, der Fehler verarbeitet. In der Regel wird dieser Status am Ende der Dialogablaufdefinition hinzugefügt. Beispiel:
context:
  variables:
    iresult: "nlpresult"
defaultTransitions:
  next: "ImplicitTransitionDetected"
  error: "MyErrorState"
...
states:
...
  MyErrorState
    component: "System.Output"
    properties:
      text: "Problem detected in \"${system.errorState}\" state."
    transitions:
      return: "done"          
  

Siehe Dialogablauf für unerwartete Aktionen konfigurieren.

Wie definiere ich eine Variable, die den Wert für das aufgelöste Intent enthält?
Definieren Sie im context-Knoten eine Variable, die die Entity nlpresult benennt. Wie der Name impliziert ("nlp" steht für Natural Language Processing), extrahiert diese Entity das von der Intent Engine aufgelöste Intent. In nahezu allen Referenzbots werden nlpresult-Variablen deklariert. Beispiel:
main: true
name: "FinancialBotMainFlow"
context:
  variables:
    iResult: "nlpresult"
Wie kann ich den Dialogablauf basierend auf Benutzereingaben steuern?

In der Regel (aber nicht immer) definieren Sie eine Eigenschaft nlpresult variable für die Komponente System.Intent, die das Ergebnis aus der Intent Engine zurückgibt. Siehe System.Intent. Die Dialog-Engine basiert auf dem von der Variablen nlpresult zurückgegebenen Wert (iResult).

Wie unter Dialogablaufstruktur im YAML-Modus beschrieben, können Sie eine Variable nlpresult im Knoten context des Ablaufs deklarieren, um das aufgelöste Intent zu speichern (iResult: "nlpresult" ). Das potenzielle Ergebnis wird durch einen der Status definiert, der im Knoten actions von System.Intent benannt ist. Diese Definition für die Komponente System.Intent weist die Dialog-Engine an, in den nächsten Status überzugehen, in dem mit einem aufgelösten Intent übereinstimmt, dessen Genauigkeit beim Parsen von Benutzerdaten mindestens 70% oder mehr beträgt (der Standardwert für den Konfidenzschwellenwert). Siehe auch Funktionsweise des Konfidenzschwellenwerts und Intent-Auflösung vor Veröffentlichung optimieren.

Wie richte ich meinen Skill für die Verarbeitung nicht aufgelöster Intents ein?

Definieren Sie einen Status für die unresolvedIntent-Aktion der Komponente System.Intent. unresolvedIntent ist ein Intent, mit dem Sie die Nachrichten verfolgen können, die nicht innerhalb des minimalen Konfidenzschwellenwerts aufgelöst werden konnten.

Beispiel:
unresolvedIntent: "unresolved"
...
  unresolved:
    component: "System.Output"
    properties:
      text: "Sorry I don't understand that question!"
    transitions:
      return: "unresolved"
Wie ermögliche ich Komponenten den Zugriff auf Variablenwerte?
Verwenden Sie die Eigenschaft .value in Ihren Ausdrücken (${crust.value}). Um einen Standardwert zu ersetzen, verwenden Sie ${variable.value!\"default value\"}. Beispiel: thick ist der Standardwert in ${crust.value!\"thick\"}. Beispiel:
context:
  variables:
    size: "PizzaSize"
    confirm: "YES_NO"
    ...
  confirmState:
    component: "System.List"
      properties:
      options: "Yes,No"
      prompt: "You ordered a ${size.value!\"medium\"} pizza. Is this correct?"
      variable: "confirm"
...

Verwenden Sie den Apache FreeMarker-Standardoperator (${variable.value!\"default value\"}), wenn es wahrscheinlich ist, dass ein Nullwert für eine Variable zurückgegeben wird. Sie können diesen Operator verwenden, wenn Sie die Ersetzung einer Variablen in Ihrem Ablauf definieren, wie die value-Definitionen für Variablen, die von System- und benutzerdefinierten Komponenten verwendet werden, oder die Variablen, die Statuswerte in einer transitions-Definition benennen. Siehe Wertausdrücke für die System.Output-Komponente definieren.

Wie kann ich Benutzerwerte für Folgebesuche speichern?
Fügen Sie in einer Statusdefinition eine Variablendefinition mit dem Präfix user. hinzu. Siehe Integrierte YAML-Komponenten zum Festlegen von Benutzerwerten. Beispiel:
 checklastorder:
    component: "System.ConditionExists"
    properties:
      variable: "user.lastpizza"

Weitere Informationen zu Benutzervariablen finden Sie im Dialogablauf des Referenzbots "PizzaBotWithMemory".

Wie kann ich einen Dialogablauf verlassen und die Benutzersession beenden?

Verwenden Sie einen return-Übergang.

Beispiel:
  printBalance:
    component: "BalanceRetrieval"
    properties:
      accountType: "${accountType.value}"
    transitions:
      return: "printBalance"

Ablaufnavigation und Übergänge

Sie können die Dialog-Engine auf einen bestimmten Pfad im Dialogablauf setzen, indem Sie die Übergangseigenschaft für einen Status festlegen. Übergänge beschreiben, wie sich der Dialog verzweigt, wenn Variablenwerte festgelegt sind oder nicht. Mit ihnen können Sie die typische Route der Unterhaltung (den "Happy Flow") darstellen und alternative Routen festlegen, die fehlende Werte oder unvorhersehbares Benutzerverhalten aufgreifen.

Die Übergangsdefinition hängt von der Ablaufabfolge und der Komponente ab.
Gehen Sie folgendermaßen vor... ... Verwenden Sie diesen Übergang
Nächsten auszuführenden Status angeben Legen Sie einen next-Übergang (next: "statename") feat, um die Dialog-Engine anzuweisen, in den Status zu wechseln, der mit dem Schlüssel next benannt wird. Wie unter nächster Übergang beschrieben, können Sie einen next-Übergang zu jedem Status hinzufügen, sofern er nicht den Übergang return enthält.
Unterhaltung zurücksetzen Mit einem return-Übergang können Sie alle für die Kontextvariablen festgelegten Werte löschen und den Dialogablauf zurücksetzen. Sie können diesem Übergang einen beliebigen Zeichenfolgenwert zuweisen.
  unresolved:
    component: "System.Output"
    properties:
      text: "Sorry! I don't understand that question!"
    transitions:
      return: "unresolved"
Wenn Sie einen return: "done"-Übergang definieren, wird die Benutzersession beendet, und die Dialog-Engine wird zurück an den Anfang des Ablaufs geleitet.
Bedingte Aktionen auslösen Definieren Sie actions-Schlüssel, um die Navigation zu einem bestimmten Status auszulösen. Wenn die Verarbeitung einer Komponente abgeschlossen ist, gibt sie eine Aktionszeichenfolge zurück, mit der die Dialog-Engine angewiesen wird, welche Aktion sie als nächstes ausführen soll. Wenn Sie keine Aktionsschlüssel definieren, verwendet die Dialog-Engine einen Standardübergang oder einen next-Übergang (sofern vorhanden). Sie können beliebig viele Aktionen definieren. Einige integrierte Komponenten enthalten spezifische Aktionen. Beispiel: Eine Komponente wie System.MatchEntity, die einen Apache FreeMarker-Ausdruck auswertet, verwendet match- und nomatch-Aktionen. System.OAuthAccountLink enthält textReceived-, pass- und fail-Aktionen, und die Benutzeroberflächenkomponenten verwenden ihre eigenen Aktionen (wie unter Übergänge für gemeinsame Antwortkomponenten beschrieben). Verwenden Sie die Komponentenvorlagen als Richtlinie. Sie können einen actions-Übergang für jeden Status definieren, sofern er nicht den Übergang return enthält.
Fehler beheben. Komponenten lösen gelegentlich Fehler aus. Ursache sind häufig systembezogene Probleme oder Fehler (ungültige Kennwörter, ungültige Hostnamen oder Kommunikationsfehler). Wenn Sie einen error-Übergang festlegen, der einen Fehlerbehandlungsstatus benennt, kann Ihr Skill Probleme ordnungsgemäß verarbeiten:
transitions:
    error: "handleMe"
Wenn Sie keinen error-Übergang festlegen, gibt der Skill den Prompt für unerwartete Fehler aus (Hoppla! Ich habe ein Problem erkannt) und beendet die Session. Sie können einen error-Übergang in jedem Status definieren, sofern er nicht den Übergang return enthält.
Bei einigen Komponenten tritt ein Fehler auf, der als Aktion definiert ist. Diese integrierten Fehlerübergänge verarbeiten komponentenspezifische Fehler:
transitions:
  actions:
    error: "handleMe"
Sie können verschiedene Typen von Übergängen in demselben Status verwenden. Im folgenden Beispiel basiert die Navigation in der Dialog-Engine auf einer Aktion oder einem Fehler. Wenn die Auswertung der Komponente keine der beiden Möglichkeiten ergibt, folgt die Dialog-Engine dem Übergang next:
state_name:
  component: "component name"
  properties:
    component_property: "value"
    component_proprety: "value"
  transitions:
    next: "go_to_state"
    error: "go_to_error_handler"
    actions:
      action_string1: "go_to_state1"
      action_string2: "go_to_state2"
Hinweis

Obwohl Sie mehrere Übergänge definieren können, stellt der return-Übergang hierzu eine Ausnahme dar: Sie können einen return-Übergang nicht mit den Übergängen error, next oder actions kombinieren.

Nächster Übergang

Mit dem Übergang next geben Sie den nächsten Standardstatus an. Wenn ein Status die Übergänge error, actions und next kombiniert, wird der Übergang next nur ausgelöst, wenn die Komponente keine Zeichenfolge zurückgeben kann, die den Übergang error oder actions erfüllt.

Um sicherzustellen, dass ein next-Übergang ausgelöst wird, wenn Fehler oder Aktionen vorhanden sind, definieren Sie eine next-Aktion im defaultTransition-Knoten.
context:
  variables:
    name: "string"
defaultTransitions:
  next: "nextRules"
states: 
  getName:
    component: "System.Text"
    properties:
      prompt: "What's your name please?"
      variable: "name"
    transitions: 
      next: "printName"
  printName:
    component: "System.Output"
    properties:
      text: "Hello ${name.value}." 
    transitions:
      return: "done"
  nextRules:
    component: "System.Output"
    properties:
      text: "Hello ${name.value}. I told you! Next transitions rule the game!" 
    transitions:
      return: "done"

Dialogablauf für unerwartete Aktionen konfigurieren

Beim Erstellen des Dialogablaufs beginnen Sie normalerweise mit der Modellierung des "Happy Flows", dem Pfad, dem der Benutzer wahrscheinlich folgt. Hier sind einige Lösungen, wenn Benutzer dem "Unhappy"-Pfad folgen, da ihre Aktionen nicht dem aktuellen Dialogablaufstatus entsprechen.
Szenario Lösung
Anstatt auf Schaltflächen zu tippen, antwortet der Benutzer unpassenderweise mit einer Texteingabe. Damit Ihr Bot dieses Verhalten ordnungsgemäß verarbeiten kann, leiten Sie ihn zu einem Status weiter, bei dem die Komponente System.Intent die Texteingabe auflösen kann, wie textReceived: Intent im folgenden Snippet aus dem CrcPizzaBot:
ShowMenu:
 component: System.CommonResponse
 properties:
   metadata: ...
   processUserMessage: true
 transitions:
   actions:
     pizza: OrderPizza
     pasta: OrderPasta
     textReceived: Intent
Benutzer scrollen zu einer früheren Nachricht zurück und tippen auf die zugehörigen Optionen, auch wenn sie auf die Schaltflächen in der aktuellen Antwort tippen müssen.
Standardmäßig verarbeitet Digital Assistant Out-of-Order-Nachrichten. Sie können dieses Verhalten jedoch überschreiben oder anpassen, wie unter So werden Out-of-Order-Aktionen erkannt beschrieben.
context:
  variables:
    iresult: "nlpresult"
defaultTransitions:
  next: "ImplicitTransitionDetected"
  error: "MyErrorState"
  actions:
    system.outOfOrderMessage: "HandleUnexpectedAction"

...

  HandleOutOfOrderMessage:
    component: "System.Switch"
    properties:
      variable: "system.actualState"
      values:
        - "ShowMenu"
        - "OrderPizza"
        - "AskPizzaSize"
    transitions:
      actions:
        NONE: "ActionNoLongerAvailable"
        ShowMenu: "${system.actualState}"
Beispiel: Wenn Sie einen system.outofOrderMessage-Standardübergang hinzufügen, wird die Dialog-Engine angewiesen, zu einem einzigen Status überzugehen, der alle Out-of-Order-Nachrichten verarbeitet, wie den Status HandleUnexpectedAction im OBotML-Snippet oben. Sie können verschiedene Methoden verwenden, um diesen Status zu erstellen:
  • Sie können die Komponente System.Output oder System.CommonResponse verwenden, die eine Nachricht wie "Leider ist diese Option nicht mehr verfügbar" sowie einen return: "done"-Übergang ausgibt, um die Session ungültig zu machen, damit der Benutzer von vorne beginnen kann. Beispiel:
    ActionNoLongerAvailable:
        component: "System.Output"
        properties:
          text: "Sorry, this action is no longer available"
        transitions:
          return: "done"
    
  • Mit einer System.Switch-Komponente können Sie Ihrem Bot ermöglichen, einige der Anforderungsaktionen anzunehmen, indem er in einen anderen Status übergeht. Je nach den Faktoren, die an der Annahme der Anforderung beteiligt sind, müssen Sie möglicherweise eine benutzerdefinierte Komponente erstellen, um das Routing zu implementieren.

Skill von einem anderen Skill aus einem YAML-Dialogablauf aufrufen

In bestimmten Situationen möchten Sie Benutzern unter Umständen die Möglichkeit geben, den Skill vorübergehend zu verlassen, mit dem sie gerade interagieren, um einen Vorgang in einem zweiten Skill innerhalb desselben digitalen Assistenten auszuführen. Beispiel: Wenn Benutzer einen Shoppingskill verwenden, in dem sie bereits Artikel ausgewählt haben, könnten Sie eine Schaltfläche anzeigen, mit dem Benutzer zu einem Bankingskill wechseln (um sicherzustellen, dass sie genügend Geld für den Einkauf haben) und dann zum Shoppingskill zurückkehren können, um die Bestellung abzuschließen.

Dazu können Sie in einem YAML-Dialogablauf eine Aktion in einem Skill konfigurieren, um die Interaktion mit einem anderen Skill in demselben digitalen Assistenten zu initiieren und dann zum ursprünglichen Ablauf zurückzukehren.

Funktionsweise:

  1. Mit der Komponente System.CommonResponse stellen Sie dem Benutzer eine Schaltfläche zur Verfügung, um Aufgaben in einem anderen Skill auszuführen.

    Die Schaltfläche basiert auf einer Postback-Aktion, in der Sie die Payload so konfigurieren, dass sie eine Äußerung tätigt, die an den Zielskill geleitet wird. Idealerweise sollte diese Äußerung den Aufrufnamen des Zielskills (d.h. einen expliziten Aufruf) enthalten, um die Wahrscheinlichkeit zu erhöhen, dass ein Routing an diesen Skill erfolgt. Dadurch können Sie im Wesentlichen eine Äußerung hartcodieren, um das gewünschte Intent auszulösen.

    Format dieses Codes:

    
      component: "System.CommonResponse"
      properties:
        metadata:
        ...
          responseItems:
            - type: "cards"
              ...
              actions:
                  ...
                - label: "Press me to switch to different skill"
                  type: "postback"
                  payload:
                    action: "system.textReceived"
                    variables:
                      system.text: "utterance with invocation name that you want passed to the digital assistant"
                    ...

    Wenn Sie die system.textReceived-Aktion verwenden und den Text in der Variable system.text angeben, stellen Sie sicher, dass der Postback wie eine Benutzernachricht behandelt wird, die vom digitalen Assistenten ordnungsgemäß weitergeleitet werden kann.

    Hinweis

    Wenn Sie system.textReceived auf diese Weise verwenden, ist system.text die einzige Variable, die Sie in der Postback Payload definieren können. Alle anderen Variablen in der Payload werden ignoriert.
  2. Setzen Sie den textReceived-Übergang auf den Status mit der Komponente System.Intent.
    
      transitions:
        actions:
          ....
          textReceived: "Name of the state for the System.Intent component"

    So wird sichergestellt, dass der digitale Assistent eine geeignete Fallback-Antwort ausgibt, wenn der digitale Assistent den Zielskill nicht enthält.

    Dazu muss die Eigenschaft daIntercept der Komponente System.Intent des Skills auf "always" (der Standardwert) gesetzt sein.

Wenn der Zielskill im digitalen Assistenten enthalten ist, erkennt der digitale Assistent den expliziten Aufruf, übernimmt die Kontrolle über die Anforderung (die normalerweise von der Komponente verarbeitet wird) und leitet die Anforderung an die System.Intent-Komponente des Zielskills weiter. Sobald der Ablauf des Zielskills abgeschlossen ist, wird der Benutzer an den aufrufenden Skill zurückgeleitet.

Wenn der Zielskill nicht im digitalen Assistenten enthalten ist (oder der aufrufende Skill ohne einen digitalen Assistenten bereitgestellt wird), wird die Komponente System.Intent des aufrufenden Skills aufgerufen, und das Intent sollte als unresolvedIntent aufgelöst werden.

Tipp:

Falls der Aufrufname des Zielskills geändert wird, wenn er einem digitalen Assistenten hinzugefügt wird, können Sie einen benutzerdefinierten Parameter verwenden, um den Aufrufnamen des Skills an die Variable system.text zu übergeben.

Beispiel: Sie können einen Parameter mit dem Namen da.CrcPizzaCashBankInvocationName im Pizzaskill erstellen und ihm den Standardwert CashBank zuweisen. Anschließend können Sie den Parameter wie folgt referenzieren:

system.text: "ask  ${system.config.daCrcPizzaFinSkillInvocationName}, what is my balance"

Wenn der Aufrufname des Skills geändert wird, ändern Sie einfach den Wert des benutzerdefinierten Parameters so, dass er mit dem neuen Aufrufnamen übereinstimmt.

Siehe Benutzerdefinierte Parameter.

Hinweis

Wenn Sie einen ausdrücklichen Aufruf in der Variable system.text verwenden, kann der Benutzer die Nachricht mit dieser Schaltfläche zweimal sehen:
  • Wenn ihnen die Schaltfläche angezeigt wird, um zum anderen Skill zu navigieren.
  • Wenn sie den Ablauf im anderen Skill abschließen.
Wenn die Nachricht beim zweiten Mal nicht angezeigt werden soll, verwenden Sie einen impliziten Aufruf in der Variable system.text anstelle eines ausdrücklichen Aufrufs. Ein impliziter Aufruf ist eine Äußerung, die gut mit einem bestimmten Skill übereinstimmt, ohne den Aufrufnamen des Skills (oder eine Variante des Aufrufnamens mit unterschiedlichem Zeichenabstand oder anderer Großschreibung) zu verwenden.

Beispiel: Skill von einem anderen Skill aufrufen

Beispiel: Nachfolgend ist ein Intent zum Bestellen von Pizza (OrderPizza) dargestellt, mit dem der Benutzer sein Bankkontensaldo prüfen kann, bevor er seine Bestellung abschließt. Der Kontensaldo wird durch einen anderen Skill bereitgestellt (CashBank). Wenn der Benutzer die Option Saldo prüfen auswählt, wird der Text "Frage CashBank nach meinem Saldo" per Postback an den digitalen Assistenten übertragen, und der Benutzer wird zum entsprechenden Intent im CashBank-Skill weitergeleitet.

OrderPizza:
  component: "System.CommonResponse"
  properties:
    metadata:
    ...
      responseItems:
        - type: "cards"
          headerText: "Our pizzas:"
          cardLayout: "vertical"
          name: "PizzaCards"
          actions:
            - label: "More Pizzas"
              ...
            - label: "Check bank account balance"
              type: "postback"
              payload:
                action: "system.textReceived"
                variables:
                  system.text: "ask CashBank, do I have enough money?"
                ...
    processUserMessage: true
  transitions:
    actions:
      order: "AskPizzaSize"
      more: "OrderPizza"
      textReceived: "Intent" # where the value of textReceived is the name CashBank's System.Intent state
  ...

Angenommen, Ihr Pizzaskill befindet sich in demselben digitalen Assistenten wie der CashBank-Skill. Im folgenden Beispiel wird gezeigt, wie Sie den digitalen Assistenten im Tester öffnen, den Pizzaskill aufrufen und dann auf Bankkontensaldo prüfen klicken.

Eine Beschreibung von skill-skill.png folgt
Beschreibung der Abbildung skill-skill.png

Auf der Registerkarte "Routing" des Testers können Sie sehen, dass der explizite Aufruf erkannt wurde und vorrangig behandelt wird:



Unten können Sie sehen, dass für das Intent "Saldo prüfen" des CashBank-Skills eine Übereinstimmung vorliegt:



Benutzerbezogene Variablen in YAML-Dialogabläufen

Wenn die Unterhaltung beendet wird, werden die durch die Benutzereingabe festgelegten Variablenwerte zerstört. Wenn diese Werte nicht mehr verfügbar sind, müssen Ihre Skillbenutzer ihre Schritte jedes Mal zurückverfolgen, wenn sie zu Ihrem Skill zurückkehren Sie können Ihren Benutzern diesen Aufwand ersparen, indem Sie im Dialogablauf benutzerspezifische Variablen definieren. Ihr Skill kann diese Variablen verwenden, die die Benutzereingabe aus vorherigen Sessions speichern, um Benutzer schnell durch die Unterhaltung zu führen.

Variablen mit benutzerdefiniertem Geltungsbereich, die Sie innerhalb der einzelnen Status definieren, und nicht im Knoten context, erhalten das Präfix user. Der Status checklastorder im folgenden Auszug aus dem Dialogablauf PizzaBotWithMemory enthält die Variable user.lastsize, bei der die Pizza-Größe aus der vorherigen Benutzersession beibehalten wird. Die Variable user. persistiert die Benutzer-ID. Diese ID ist kanalspezifisch, d.h. Sie können zwar zu einer Unterhaltung zurückkehren oder mit Ihren vorherigen Einträgen in Skills, die auf demselben Kanal ausgeführt werden, eine Bestellung durchlaufen, aber über verschiedene Kanäle hinweg ist das nicht möglich.
main: true
name: "PizzaBot"
parameters:
  age: 18
context:
  variables:
    size: "PizzaSize"
    type: "PizzaType"
    crust: "PizzaCrust"
    iResult: "nlpresult"
    sameAsLast: "YesNo"
states:
  intent:
    component: "System.Intent"
    properties:
      variable: "iResult"
    transitions:
      actions:
        OrderPizza: "checklastorder"
        CancelPizza: "cancelorder"
        unresolvedIntent: "unresolved"
  checklastorder:
    component: "System.ConditionExists"
    properties:
      variable: "user.lastsize"
    transitions:
      actions:
        exists: "lastorderprompt"
        notexists: "resolvesize"
  lastorderprompt:
    component: "System.List"
    properties:
      options: "Yes,No"
      prompt: "Same pizza as last time?"
      variable: "sameAsLast"
    transitions: 
      next: "rememberchoice"
  rememberchoice:
    component: "System.ConditionEquals"
    properties:
      variable: "sameAsLast"
      value: "No"
    transitions:
      actions:
        equal: "resolvesize"
        notequal: "load"
...


  load:
    component: "System.CopyVariables"
    properties:
      from: "user.lastsize,user.lasttype,user.lastcrust"
      to: "size,type,crust"
    transitions:
      ...

Integrierte YAML-Komponenten zum Festlegen von Benutzerwerten

Definieren Sie die value-Eigenschaft der folgenden Komponenten mit Ausdrücken wie "${user.age.value}", um gespeicherte Benutzerwerte festzulegen.

Komponente Verwendungen
System.SetVariable Legt den gespeicherten Benutzerwert fest.
System.ResetVariables Setzt einen gespeicherten Benutzerwert zurück.
System.CopyVariables Kopiert den gespeicherten Benutzerwert und fügt ihn ein.
System.Output Gibt den gespeicherten Benutzerwert als Text aus.
System.ConditionExists Prüft, ob die benutzerspezifische Variable bereits im Kontext vorhanden ist.
System.ConditionEquals Sucht nach der benutzerspezifischen Variable.
System.Switch Verwendet den gespeicherten Wert, um von einem Status in einen anderen zu wechseln.

Automatische Nummerierung für Nur-Text-Kanäle in YAML-Dialogabläufen

Mit dem Framework für automatische Nummerierung kann Ihr Skillbot in Nur-Text-Kanälen ausgeführt werden, weil Schaltflächen und Listenoptionen Nummern als Präfixe vorangestellt werden. Wenn Benutzer keine Tippgesten verwenden können, können sie die Postback-Aktionen der Schaltfläche trotzdem durch Eingeben einer Nummer auslösen. Beispiel: Wenn der CrcPizzaBot in einem Kanal ausgeführt wird, der Schaltflächen unterstützt, werden die Optionen "Pizzas" und "Pastas" angezeigt.
Ein Laufzeitbild von Optionen im Nicht-Nur-Text-Kanal.
Wenn er jedoch auf einem Nur-Text-Kanal ausgeführt wird, werden die Optionen "Pizza" und "Pasta" als Text dargestellt, dem fortlaufende Nummern als Präfixe vorangestellt sind (1. Pizza 2. Pasta).
Ein Laufzeitbild von Optionen in einem Nur-Text-Kanal.

Die automatische Nummerierung ist nicht auf Nur-Text-Kanäle beschränkt. Durch Aktivierung dieses Frameworks in Kanälen, in denen Schaltflächen unterstützt werden, erhalten Benutzer eine weitere Möglichkeit zur Eingabe ihrer Optionen. Beispiel: Benutzer können entweder auf "Pizza" tippen oder 1 eingeben.
Ein Laufzeitbild der automatischen Nummerierung mit Schaltflächen.

Automatische Nummerierung für YAML-Dialogabläufe festlegen

Bei YAML-Dialogabläufen können Sie das Feature für die automatische Nummerierung auf globaler Ebene festlegen (d.h. es wirkt sich auf alle Komponenten aus, die in der Dialogablaufdefinition benannt sind) oder auf Komponentenebene für die Komponenten, die Postback-Aktionen auslösen, nämlich die Komponenten System.List, System.CommonResponse, System.ResolveEntities, System.QnA, System.Webview, System.OAuthAccountLinkComponent und System.OAuth2AccountLinkComponent.

So stellen Sie den Optionen automatisch fortlaufende Nummern als Präfixe voran:
  1. Fügen Sie im Kontextknoten autoNumberPostbackActions: "boolean" hinzu. Diese Variable ist wie textOnly und autoTranslate eine gemeinsame Variable, die in allen Bots verwendet werden kann.
    context:
      variables:
        pizzaSize: "PizzaSize"
        pizzaType: "PizzaType"
        pizzaCrust: "PizzaCrust"
        pizzaCheese: "CheeseType"
        autoNumberPostbackActions: "boolean"
        iResult: "nlpresult"
  2. Setzen Sie die Eigenschaft autoNumberPostbackActions auf true:
      type:
        component: "System.List"
        properties:
          prompt: "What Type of Pizza do you want?"
          options: "${pizzaType.type.enumValues}"
          variable: "pizzType"
          autoNumberPostbackActions: "true"
          footerText: "Enter a number or tap your selection."
        transitions:
          ...
    Wenn Sie die automatische Nummerierung für eine bestimmte Komponente (eine Systemkomponente oder eine benutzerdefinierte Komponente) außer Kraft setzen müssen, setzen Sie die Eigenschaft autoNumberPostbackActions auf false. Um die automatische Nummerierung für eine bestimmte Postback-Aktion in der Komponente System.CommonResponse außer Kraft zu setzen, fügen Sie eine skipAutoNumber-Eigenschaft hinzu, und benennen Sie die Aktion.
    Hinweis

    Weil die automatische Nummerierung über die serverseitige Verarbeitung angewendet wird, funktioniert sie nur für Postback-Aktionen, nicht für die clientseitigen URL-Aktionen. Folglich führen Komponenten, die zwei Schaltflächenaktionen, eine URL-Aktion und eine Postback-Aktion wiedergeben, zu einer suboptimalen Benutzererfahrung aufgrund der inkonsistenten Nummerierung der verschiedenen UI-Elemente. Für die OAuth-Komponenten, die sowohl eine Anmelde-URL-Aktion als auch eine Postback-Aktion wiedergeben, wird nur der Abbruchaktion eine Nummer als Präfix vorangestellt. Um in solchen Fällen die Konsistenz zu gewährleisten, setzen Sie die Eigenschaft autoNumberPostbackActions auf false.
  3. Sie können die automatische Nummerierung bedingt aktivieren, indem Sie die Variable autoNumberPostbackActions mit dem aktuellen Kanal festlegen. Beispiel:
    setAutoNumbering:
      component: "System.SetVariable"
      properties:
        variable: "autoNumberPostbackActions" 
        value: "${(system.channelType=='facebook')?then('true','false')}"
    Nachdem Sie die Variable autoNumberPostbackActions festgelegt haben, können Sie sie referenzieren, um den prompt-Text zu ändern:
    prompt: "Hello ${profile.firstName}, this is our menu today<#if autoNumberPostbackActions.value>. Make your choice by entering the menu option number</#if>:"
    Ebenso können Sie den Footertext konditionalisieren:
    footerText: <#if autoNumberPostbackActions.value>"Make your choice by entering the menu option number."</#if>

Inhalt für schreibgeschützte Kanäle in YAML-Dialogabläufen wiedergeben

Sie können kanalspezifische Nachrichten ein- oder ausblenden, wenn Sie die Variable textOnly in den verzweigenden Komponenten des Dialogablaufs referenzieren, wie System.ConditionEquals oder System.Switch. Bevor Sie Ihren Ablauf basierend auf Nur-Text-Nachrichten verzweigen können, müssen Sie textOnly als Kontextvariable deklarieren und dann den Wert festlegen. Hierzu sind die folgenden grundlegenden Schritte erforderlich:
  1. Fügen Sie die Variable textOnly: "boolean" zum context-Knoten hinzu.
    context:
      variables:
        autoNumberingPostbackActions: "boolean"
        textOnly: "boolean"
  2. Referenzieren Sie textOnly in den Variableneinstellungskomponenten, wie System.SetVariable und System.Switch.

  3. Verwenden Sie die Eigenschaft system.message, um die vollständige Benutzernachricht anzuzeigen. Das folgende Snippet zeigt, wie Sie einen booleschen Wert innerhalb des Ausdrucks system.channelType festlegen, der angibt, ob ein Nur-Text-Kanal (in diesem Fall Twilio) verwendet wird oder nicht.
    setTextOnly:
      component: "System.SetVariable"
      properties:
        variable: "textOnly" 
        value: "${(system.channelType=='twilio')?then('true','false')}"
    Sie können die automatische Nummerierung bedingt aktivieren, indem Sie den Benutzernachrichtenkanal referenzieren. Beispiel:
    setAutoNumbering:
      component: "System.SetVariable"
      properties
        variable: autoNumeringPostbackActions
        value: "${(system.channelType=='twilio')?then('true','false')}"