A Estrutura do Fluxo de Diálogo no Modo YAML

A definição do OBotML é dividida em três partes principais: context, defaultTransitions e states. Você define as variáveis que estão disponíveis na sessão no nó context. A definição do fluxo em si é descrita na seção states.

Este é o layout do fluxo de caixas de diálogo:

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"
...
Observação

Na versão da plataforma anterior à 20.12, o fluxo de caixas de diálogo começa com o nó metadata, que contém um nó platformVersion. A partir da versão 20.12 da plataforma, esses nós estão obsoletos.

O Nó context

As variáveis que você define no nó context podem ser tipos primitivos, como int, string, boolean, double ou float. Você pode definir uma variável como mapa, que é um objeto JSON, ou pode usar variáveis para descrever o tratamento de erros.

Conforme ilustrado pelo seguinte trecho de código da definição de fluxo de caixas de diálogo PizzaBot, você pode nomear variáveis para entidades incorporadas ou personalizadas (que nesse caso são as variáveis PizzaSize e PizzaCrust). Com entidades incorporadas e as entidades personalizadas, você também pode declarar uma variável para a entidade nlpresult, que contém a intenção resolvida da entrada do usuário. Essas variáveis têm como escopo o fluxo inteiro. Como eu Gravo Fluxos de Caixas de Diálogo no OBotML? informa como montar as diversas partes do fluxo de caixas de diálogo. Você também pode definir como escopo os valores de variáveis do usuário para permitir que seu bot reconheça o usuário e persista as preferências dele após a primeira conversa. Variáveis com Escopo do Usuário em Fluxos de Caixas de Diálogo YAML descreve essas variáveis.
main: true
name: "PizzaBot"
context:
  variables:
    size: "PizzaSize"
    type: "PizzaType"
    crust: "PizzaCrust"
    iResult: "nlpresult"

O Nó defaultTransitions

Você pode definir transições em dois locais: como parte das definições do componente nos estados do fluxo de caixas de diálogo ou no nó defaultTransitions. Esse nó define a navegação global. Por exemplo :
defaultTransitions
  next: "..."
  error: "..."
  actions:
    action_name1: "..."
    action_name2: "..."
   
A transição padrão age como fallback no sentido de que é acionada quando não há transições definidas em um estado ou as condições exigidas para acionar uma transição não podem ser atendidas.
Use o nó defaultTransitions para definir o roteamento que permitirá ao seu bot de habilidades tratar de forma natural ações inesperadas do usuário. Especificamente, você pode usá-lo para permitir que seu bot de habilidades reaja adequadamente quando um usuário tocar em uma opção de uma resposta anterior, em vez de em uma das opções apresentadas na resposta atual (e mais adequada) do bot. Conforme mostrado pela ação NONE no trecho de código a seguir, você pode configurar essa transição para rotear para um estado que trate todas as ações 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"

O Nó states

Em caixas de diálogo baseadas em YAML, você define cada bit da caixa de diálogo e suas operações relacionadas como sequência de estados transitórios, que gerenciam a lógica no fluxo de caixas de diálogo. Para dar uma pista da ação, cada nó state da definição do OBotML nomeia um componente que oferece a funcionalidade necessária nesse ponto da caixa de diálogo. Os estados são essencialmente criados ao redor dos componentes. Elas contêm as propriedades específicas do componente e definem as transições para outros estados que são acionadas após a execução do 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"
Uma definição de estado pode incluir as transições específicas do componente ou as transições padrão next, error, actions ou return (descritas em Navegação e Transições de Fluxo) que você pode definir para qualquer componente. As transições definidas nos estados podem ser substituídas pelas transições globais definidas no nó defaultTransitions.
O PizzaBot inclui uma sequência de nós state que verificam a idade de um cliente. Esses estados incluem componentes que usam o valor inteiro fornecido pelo usuário, verificam esse valor e depois geram uma string de texto, conforme apropriado. Para iniciar o processo, o componente do estado askage solicita a entrada do usuário e, em seguida, muda para o estado checkAge, cujo componente AgeChecker valida a entrada do usuário. Aqui, a caixa de diálogo está em uma flutuação: sua chave transitions define os estados block ou allow. Se o estado allow for acionado, o usuário poderá continuar. As definições de estado subsequentes rastrearão a entrada do usuário para preservar o contexto do usuário até que ele conclua seu pedido. Se a entrada do usuário fizer com que o componente AgeChecker dispare a ação block, no entanto, a conversa será encerrada para o usuário menor de idade, uma vez que a caixa de diálogo muda para o 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"