Estructura del flujo de diálogo en modo YAML
La definición de OBotML se divide en tres partes principales: context
, defaultTransitions
y states
. Las variables que están disponibles en la sesión se definen en el nodo context
. La definición del flujo en sí mismo se describe en la sección states
.
El flujo de diálogo se presenta de la siguiente manera:
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"
...
Nota
En la plataforma con una versión anterior a la 20.12, el flujo de diálogo se inicia con el nodo
En la plataforma con una versión anterior a la 20.12, el flujo de diálogo se inicia con el nodo
metadata
, que contiene un nodo platformVersion
. A partir de la versión 20.12 de la plataforma, estos nodos están en desuso.
Nodo context
Las variables que defina en el nodo context
pueden ser tipos primitivos, como int
, string
, boolean
, double
o float
. Puede definir una variable como una asignación, que es un objeto de JSON, o bien puede utilizar variables para describir el manejo de errores.
Como se muestra en el siguiente fragmento de la definición del flujo de diálogo de PizzaBot, puede asignar un nombre a las variables para entidades incorporadas o personalizadas (que, en este caso, son las variables
PizzaSize
y PizzaCrust
). Junto con las entidades incorporadas y las entidades personalizadas, también puede declarar una variable para la entidad nlpresult
, que incluye la intención resuelta a partir de la entrada del usuario. Estas variables están acotadas a todo el flujo. En ¿Cómo se escriben los flujos de diálogo en OBotML?, se indica cómo montar las distintas partes del flujo de diálogo. También puede establecer el ámbito de los valores de las variables de usuario para que el bot pueda reconocer al usuario y guardar las preferencias del usuario después de la primera conversación. En Variables con ámbito de usuario en flujos de diálogo de YAML, se describen estas variables.main: true
name: "PizzaBot"
context:
variables:
size: "PizzaSize"
type: "PizzaType"
crust: "PizzaCrust"
iResult: "nlpresult"
Nodo defaultTransitions
Puede definir transiciones en dos lugares: como parte de las definiciones de componente en los estados del flujo de diálogo o en el nodo
defaultTransitions
. Este nodo define la navegación global. Por ejemplo:defaultTransitions
next: "..."
error: "..."
actions:
action_name1: "..."
action_name2: "..."
La transición por defecto actúa como una reserva, en el sentido de que se activa cuando no hay ninguna transición definida en un estado o cuando no se cumplen las condiciones necesarias para activar una transición.Utilice el nodo
defaultTransitions
para definir un enrutamiento que permita al bot de aptitudes manejar con eficacia las acciones de usuario inesperadas. En concreto, puede utilizarlo para permitir que el bot de aptitudes reaccione adecuadamente cuando un usuario pulse una opción de una respuesta anterior, en lugar de una de las opciones presentadas en la respuesta actual (y más adecuada) del bot. Como muestra la acción NONE
en el siguiente fragmento, puede configurar esta transición para establecer el enrutamiento a un estado que maneje todas las acciones inesperadas.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"
Nodo states
En los diálogos basados en YAML, se define cada fragmento del cuadro de diálogo y sus operaciones relacionadas como una secuencia de estados transitorios, que gestionan la lógica del flujo de diálogo. Para guiar la acción, cada nodo
state
de la definición de OBotML asigna un nombre a un componente que proporciona la funcionalidad necesaria en ese punto del diálogo. Los estados se crean, básicamente, alrededor de los componentes. Contienen propiedades específicas del componente y definen las transiciones a otros estados que se disparan tras la ejecución del componente. state_name:
component: "component_name"
properties:
component_property: "value"
component_proprety: "value"
transitions:
actions:
action_string1: "go_to_state1"
action_string2: "go_to_state2"
Una definición de estado puede incluir las transiciones específicas del componente o las transiciones estándar next
, error
, actions
o return
(descritas en Navegación de flujo y transiciones ), que se pueden definir para cualquier componente. Las transiciones definidas en estados se pueden sustituir por las transiciones globales definidas en el nodo defaultTransitions
.
PizzaBot incluye una secuencia de nodos
state
que verifican la edad de un cliente. Estos estados incluyen componentes que toman el valor entero proporcionado por el usuario, lo comprueban y, a continuación, generan la cadena de texto correspondiente. Para iniciar el proceso, el componente de estado askage
solicita la entrada del usuario y, a continuación, se desplaza al estado checkAge
, cuyo componente AgeChecker
valida la entrada del usuario. Aquí, el diálogo se encuentra en una encrucijada: la clave transitions
define los estados block
o allow
. Si se dispara el estado allow
, el usuario puede continuar. Las definiciones de estado posteriores rastrearán la entrada del usuario para mantener el contexto del usuario hasta que termine el pedido. Sin embargo, si la entrada de usuario hace que el componente AgeChecker
dispare la acción block
, la conversación finalizará para el usuario que no alcance la edad mínima, porque el cuadro de diálogo pasará al estado 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"