Structure du flux de dialogue en mode YAML
La définition OBotML est divisée en trois parties principales : context
, defaultTransitions
et states
. Vous définissez les variables disponibles dans l'ensemble de la session à l'intérieur du noeud context
. La définition du flux lui-même est décrite dans la section states
.
Le flux de dialogue est disposé comme suit :
main: true
name: "HelloKids"
context:
variables:
variable1: "entity1"
variable2: "error"
...
States
state1:
component: "a custom or built-in component"
properties:
property1: "component-specific property value"
property2: "component-specific property value"
transitions:
actions:
action1: "value1"
action2: "value2"
state2:
component: "a custom or built-in component"
properties:
property1: "component-specific property value"
property2: "component-specific property value"
transitions:
actions:
action1: "value1"
action2: "value2"
...
Note
Dans les versions de plate-forme précédant 20.12, le flux de dialogue commence par le noeud
Dans les versions de plate-forme précédant 20.12, le flux de dialogue commence par le noeud
metadata
, qui contient un noeud platformVersion
. Depuis la version 20.12 de la plate-forme, ces noeuds sont obsolètes.
Noeud context
Les variables que vous définissez dans le noeud context
peuvent être des types primitifs, comme int
, string
, boolean
, double
ou float
. Vous pouvez définir une variable en tant que mappage, qui est un objet JSON, ou utiliser des variables pour décrire le traitement des erreurs.
À l'aide de l'extrait de code suivant provenant de la définition du flux de dialogue PizzaBot, vous pouvez nommer des variables pour des entités intégrées ou personnalisées (dans ce cas, les variables
PizzaSize (Taille de pizza)
et PizzaCrust (Type de croûte)
). Outre des entités intégrées et des entités personnalisées, vous pouvez également déclarer une variable pour l'entité nlpresult
, qui contient l'intention résolue à partir de l'entrée utilisateur. Ces variables portent sur l'ensemble du flux. La rubrique Comment écrire des flux de dialogue dans OBotML? indique comment assembler les différentes parties du flux de dialogue. Vous pouvez également définir les valeurs de variable avec une portée utilisateur pour permettre à votre robot de reconnaître l'utilisateur et de conserver ses préférences après la première conversation. La rubrique Variables de taille utilisateur dans les flux de dialogue YAML décrit ces variables.main: true
name: "PizzaBot"
context:
variables:
size: "PizzaSize"
type: "PizzaType"
crust: "PizzaCrust"
iResult: "nlpresult"
Noeud defaultTransitions
Vous pouvez définir des transitions à deux endroits : au sein des définitions de composant dans les états du flux de dialogue ou dans le noeud
defaultTransitions
. Ce noeud définit la navigation globale. Par exemple :defaultTransitions
next: "..."
error: "..."
actions:
action_name1: "..."
action_name2: "..."
La transition par défaut agit comme un recours car elle est déclenchée lorsqu'aucune transition n'est définie dans un état ou que les conditions requises pour déclencher une transition ne sont pas remplies.Utilisez le noeud
defaultTransitions
pour définir l'acheminement qui permet au robot de compétence de traiter correctement les actions inattendues de l'utilisateur. Vous pouvez l'utiliser, en particulier, pour permettre à votre robot de réagir comme il faut lorsqu'un utilisateur touche une option dans une réponse antérieure et non dans la réponse courante (et plus appropriée) du robot. Comme indiqué par l'action NONE
dans l'extrait de code suivant, vous pouvez configurer cette transition pour qu'elle mène à un état qui traite toutes les actions inattendues.defaultTransitions:
error: "globalErrorHandler"
...
globalErrorHandler:
component: System.Switch
properties:
source: "${system.errorState}"
values:
- "getOrderStatus"
- "displayOrderStatus"
- "createOrder"
transitions:
actions:
NONE: "unhandledErrorToHumanAgent"
getOrderStatus: "handleOrderStatusError"
displayOrderStatus: "handleOrderStatusError"
createOrder: "handleOrderStatusError"
Noeud states
Dans les dialogues basés sur YAML, vous définissez chaque partie du dialogue et les opérations connexes en tant que séquence d'état transitoire, qui gère la logique dans le flux de dialogue. Pour appeler une action, chaque noeud
state
de la définition OBotML nomme un composant qui fournit la fonctionnalité nécessaire à ce point du dialogue. Les états sont essentiellement basés sur les composants. Ils contiennent des propriétés propres au composant et définissent les transitions à d'autres états qui seront déclenchés après l'exécution du composant. state_name:
component: "component_name"
properties:
component_property: "value"
component_proprety: "value"
transitions:
actions:
action_string1: "go_to_state1"
action_string2: "go_to_state2"
La définition d'un état peut inclure les transitions propres au composant ou les transitions standard next
, error
, actions
ou return
(décrites dans Navigation de flux et transitions) que vous pouvez définir pour n'importe quel composant. Les transitions définies dans les états peuvent être remplacées par les transitions globales définies dans le noeud defaultTransitions
.
PizzaBot comporte une séquence de noeuds
state
qui vérifient l'âge du client. Ces états incluent des composants qui prennent le nombre entier indiqué par l'utilisateur, le vérifient, puis produisent une chaîne de texte appropriée. Pour démarrer le processus, le composant de l'état askage
demande une information à l'utilisateur, puis passe à l'état checkAge
dont le composant AgeChecker
valide l'entrée de l'utilisateur. Le dialogue est alors à un branchement : sa clé transitions
définit les états block
ou allow
. Si l'état allow
est déclenché, l'utilisateur peut continuer. Les définitions d'état suivantes feront le suivi de l'entrée de l'utilisateur afin de conserver le contexte de ce dernier jusqu'à la fin de la commande. Cependant, si l'entrée de l'utilisateur amène le composant AgeChecker
à déclencher l'action block
, la conversation se termine pour l'utilisateur mineur car le dialogue passe à l'état underage
.main: true
name: "PizzaBot"
context:
variables:
size: "PizzaSize"
type: "PizzaType"
crust: "PizzaCrust"
cheese: "CheeseType"
iResult: "nlpresult"
...
askage:
component: "System.Output"
properties:
text: "How old are you?"
transitions:
next: checkage
checkage:
component: "AgeChecker"
properties:
minAge: 18
transitions:
actions:
allow: "crust"
block: "underage"
crust:
component: "System.List"
properties:
options: "Thick,Thin,Stuffed,Pan"
prompt: "What crust do you want for your Pizza?"
variable: "crust"
transitions:
...
underage:
component: "System.Output"
properties:
text: "You are too young to order a pizza"
transitions:
return: "underage"