Configurar Entidades Compostas

As entidades compostas permitem que você grave definições de fluxo de caixas de diálogo mais compactas e muito mais curtas, uma vez que elas podem ser resolvidas usando apenas um componente (Resolver Entidades ou uma Resposta Comum).

É recomendável que você use essa abordagem porque não precisa de componentes como Alternar ou Definir Variável para capturar toda a entrada do usuário que é necessária para executar uma transação comercial. Em vez disso, um único componente pode solicitar que os usuários forneçam valores para cada item no repositório. Os próprios prompts são de condição específica, porque se baseiam na configuração individual de cada item do repositório. Usando a entidade composta, um manipulador de eventos de entidade ou o Apache FreeMarker e os componentes Resposta Comum ou Resolver Entidades, sua habilidade pode:
  • Capturar todo o texto livre, permitir uploads de arquivos e coletar a localização atual do usuário com os itens STRING, ATTACHMENT e LOCATION.

  • Executar comportamento individual para cada entidade membro no repositório – Você pode adicionar prompts de valores específicos e mensagens de erro para entidades individuais dentro do repositório composto (que inclui entidades personalizadas, entidades do sistema e os itens STRING, ATTACHMENT e LOCATION). Você também pode controlar quais entidades devem (ou não) corresponder à entrada do usuário. Como você pode criar uma sequência de prompts, a habilidade poderá gerar diferentes prompts para cada tentativa do usuário.

  • Apresentar listas de seleção com várias escolhas.

  • Validar correspondências de valores com base em regras de validação.

  • Oferecer suporte para o fluxo não feliz - Os usuários podem corrigir entradas anteriores.

  • Executar transições temporárias baseadas em correspondência - O fluxo de caixas de diálogo pode sair temporariamente do componente quando uma entidade tiver sido correspondida, de modo que outro estado possa executar uma função de suporte como uma chamada REST. Depois que a função é concluída, o fluxo de caixas de diálogo faz a transição de volta para o componente para que a correspondência de valor possa continuar. Por exemplo :
    • Depois que um usuário faz upload de um recibo, o próprio recibo precisa ser digitalizado para que valores como data da despesa, valor e tipo de despesa possam ser extraídos dele para outras entidades do repositório. Isso permite que o componente preencha o restante dos valores do recibo e não de qualquer entrada do usuário.

    • A habilidade gera uma mensagem como “Almost there, just a few more questions” entre conjuntos correspondentes de entidades no repositório.

    • A entrada do usuário deve ser validada por meio de uma chamada REST de backend. A validação pode ser necessária imediatamente porque determina qual dos itens do repositório deve solicitar mais informações do usuário. Como alternativa, a chamada pode retornar informações que precisam ser compartilhadas com o usuário, como uma advertência de descumprimento da política.

  • Valores sem ambiguidade - Você pode isolar um valor da entrada do usuário por meio de prompts específicos da entidade e propriedades do componente. Estes incluem suporte para correções feitas na entrada anterior (o fluxo “não feliz”) e para solicitar entrada do usuário para propriedades específicas da entidade incorporada.

Criar uma Entidade Composta

  1. Clique em Entidades Esta é uma imagem do ícone Entidades. na barra de navegação esquerda.

  2. Clique em Adicionar Entidades.

  3. Escolha Repositório Composto como tipo de entidade.

  4. Digite o nome e a descrição.
  5. Clique em + Handler de Eventos se desejar usar o prompt e a lógica da entidade composta de forma programática usando handlers de evento de entidade.
  6. Clique em + Item de Repositório para abrir a caixa de diálogo Adicionar Item de Repositório. Se você estiver adicionando uma entidade incorporada ou uma entidade personalizada existente, poderá criar um nome específico do repositório para ela e adicionar uma descrição de sua atribuição dentro do contexto do repositório composto.

  7. Você pode preencher o repositório com entidades personalizadas, entidades incorporadas e o seguinte:
    • STRING — Captura o texto livre do usuário.

    • LOCATION — Captura a localização do usuário.

    • ATTACHMENT — Aceita arquivos, arquivos de áudio, vídeo ou arquivos de imagem submetidos a upload pelo usuário. A entidade composta armazena o URL no qual o anexo é hospedado.

    Observação

    Será solicitado que você informe um subtipo quando adicionar a entidade DATE_TIME.
    Os itens são resolvidos na ordem em que são adicionados. No entanto, a sequência pode ser afetada, dependendo de como você configura membros individuais do repositório composto.
  8. Se você clicar em Fechar, retornará à página Entidades, mas poderá primeiro adicionar outros recursos específicos do repositório ao item (ou atualizá-lo posteriormente, clicando em Esta é uma imagem do ícone Editar. na página Entidades).

  9. Próximas etapas:
    • Adicione mensagens de erro individuais, prompts de desambiguação ou prompts condicionais para os itens do repositório.
      Observação

      Elas serão substituídas se você adicionar a entidade a uma entidade composta.
    • Adicione a entidade a uma intenção. Consulte Adicionar Entidades a Intenções.

    • Configure o fluxo de caixas de diálogo para usar a entidade composta..

Preenchimento de slot aprimorado

Quando você ativa o preenchimento de slot aprimorado ativando Usar Preenchimento de Slot Aprimorado em Definições > Configuração:
  • Somente o item que está resolvendo no momento será atualizado. Quando uma correspondência se aplica a mais de um item de bolsa, o item de bolsa que está resolvendo no momento tem precedência sobre outros itens. Se você desativar o preenchimento de slot aprimorado, todos os itens serão atualizados com o mesmo valor.
  • Se o item de resolução atual for um item de repositório STRING, nenhum outro item de repositório será atualizado.
  • Se uma correspondência de entidade se aplicar a vários itens de repositório (não resolvidos), uma caixa de diálogo de desambiguação será exibida, permitindo que o usuário escolha qual item deve ser atualizado em vez de atualizar todos os itens de repositório.
  • A chave Prompt para Desambiguação da entidade é ignorada. Recomendamos que você implemente a desambiguação personalizada com um handler de eventos de entidade.
Observação

A opção Usar Preenchimento Aprimorado de Slot é ativada por padrão para habilidades criadas usando a Versão 22.08 da plataforma. Ele está desativado para habilidades que foram atualizadas para esta versão.

Adicionar Prompts

Você pode adicionar um único prompt ou criar uma sequência de prompts, cada um fornecendo informações cada vez mais específicas para toda vez que o usuário digitar um valor inválido. Por padrão, os prompts são ativados. Para adicionar esses prompts:
  1. Se quiser ativar os prompts, deixe o campo Solicitar Valor em branco (seu estado padrão). Se você digitar false no campo Solicitar Valor vai impedir os prompts. Para solicitar um valor condicional, adicione uma expressão booliana do FreeMarker que seja avaliada como true (para prompts) ou false.

    Dica:

    Quando você define Solicitar Valor como false, o item ainda pode ser resolvido como parte de outro item que está sendo solicitado ao ativar Extração Fora da Ordem.
  2. Clique em Adicionar Prompt para criar a sequência de prompts. É possível reordená-los misturando os campos com gestos de arrastar e soltar ou renumerando-os. Você pode tornar aleatória a saída dos prompts quando dá a dois ou mais prompts o mesmo número.
    Observação

    Você só pode adicionar prompts para entidades incorporadas quando adicioná-los a um repositório composto.
    Os prompts podem ser armazenados em pacotes de recursos (por exemplo, ${rb.askCheese}) ou gravados como combinações de expressões de texto e do FreeMarker.

Atualizando Valores com Slot com Expressões FreeMarker do Apache

No campo Atualizável, digite uma expressão FreeMarker do Apache que é avaliada como true para permitir que o valor com slot para um item de repositório composto seja atualizado.

Ativar Extração Fora da Ordem

A extração fora de ordem permite a alocação de valores e a atualização de um item de entidade composta em qualquer ponto da conversa, independentemente de a entidade composta ter solicitado ou não o valor ao usuário. Usando as regras a seguir, você pode definir como, quando ou se um valor pode ser encaixado ou alterado em qualquer ponto da conversa para qualquer item ou subtipo de item (como os subtipos DATE_TIME).
  • Sempre - A opção padrão. Quando você escolhe essa opção para um item, seu valor pode ser preenchido no slot sem qualquer prompt. Por exemplo, a entidade PizzaSize pode ser resolvida quando um cliente digita I want a large pizza. Essa opção também permite que o valor do item seja alterado a qualquer momento, desde que a expressão na propriedade Atualizável não seja avaliada como false. Por exemplo, quando o repositório composto solicita a entidade PizzaType, o cliente pode responder Pizza vegetariana, mas torná-la média. A habilidade pode atualizar o valor da entidade PizzaSize com média sem reiniciar a conversa porque Sempre está ativado para os itens PizzaSize e PizzaType do bag.
    Observação

    Embora essa opção seja o comportamento padrão, pode nem sempre ser apropriada para itens STRING. Se você escolher essa opção para um item STRING, por exemplo, a primeira mensagem do usuário será armazenada pelo item STRING em vez de ser correspondida pela entidade pretendida (que pode ser designada como o primeiro item no repositório a ser resolvido).
  • Nunca - Quando você escolhe essa opção, o item só é colocado no slot após ser solicitado, mesmo quando outras mensagens do usuário contêm valores válidos. Escolha Nunca para evitar correspondências inadvertidas.
  • Somente ao resolver a declaração de intenção - Restringe o slot de valor fora da ordem à primeira declaração do usuário que foi resolvida para a intenção associada à entidade composta.
Aqui estão exemplos das regras de extração fora da ordem à medida que são aplicadas a um item composto PizzaToppings.
Regra de Extração Fora da Ordem Declaração Inicial do Usuário Valor com Slot Observações
Sempre Pedir pizza com atum Atum O slot de valor do item PizzaToppings pode ser correspondido sempre que a mensagem do usuário contiver o valor correto ("Cogumelos!). Ele pode ser encaixado ou atualizado em qualquer ponto da conversa sem aviso.
Nunca Pedir pizza com atum Nenhuma O valor do item PizzaTopping não pode ser colocado fora de ordem ou atualizado ad hoc. Ele só pode ser correspondido quando solicitado.
Somente ao resolver a declaração de intenção Pedir pizza com atum Atum. No entanto, se o usuário inserir "Ordem de pizza grande", o repositório composto terá que solicitar o valor PizzaTopping. O item PizzaTopping só pode ser colocado fora de ordem quando a primeira declaração do usuário resolvida para uma intenção tiver um valor correspondente. Caso contrário, esse valor deverá ser solicitado. A entidade composta não permitirá atualização ou alocação de espaço ad hoc deste item.

Ativar Extração com

Use a opção Extrair com para permitir que sua habilidade resolva um item do repositório usando a entrada digitada para um segundo item no repositório. Essa opção, que permite à sua habilidade tratar valores relacionados, oferece maior flexibilidade para entrada do usuário. Por exemplo, os usuários podem digitar home em vez do endereço completo. Veja como:
  • O repositório composto tem duas entidades relacionadas a endereço: NamedAddress, uma entidade de valor de lista com valores como casa e escritório, e DeliveryAddress, uma entidade ADDRESS.
  • O prompt da entidade DeliveryAddress é Where do you want that delivered?
  • A entidade NamedAddress não solicita entrada (false foi informado no campo Prompt de Valor).
  • A entidade NamedAddress pode ser extraída com DeliveryAddress (DeliveryAddress está selecionado no menu Extrair com).

Quando o repositório composto solicita a entidade DeliveryAddress, ela pode resolver a entidade usando um endereço físico ou um dos valores da lista NamedAddress ( casa ou escritório).

Adicionar Regras de Validação

Cada item no repositório pode ter suas próprias regras de validação. Você pode adicionar uma regra de validação clicando primeiro em + Regra de Validação e, em seguida, adicionando expressões do FreeMarker e um prompt de texto. A expressão usa o seguinte padrão para fazer referência ao valor do item, em que varName é o nome da entidade composta que é declarada como variável na definição do fluxo de caixas de diálogo:
${varName.value.itemName}
Se essa expressão for avaliada como falsa, a entrada do usuário não será válida.
O exemplo a seguir de uma expressão de validação se refere a um item chamado Amount. É uma entidade incorporada, CURRENCY. Para retornar um valor numérico para a comparação, a expressão adiciona a propriedade amount da entidade CURRENCY:
${expense.value.Amount.amount > 4}
A mensagem de validação correspondente também pode refletir a entrada do usuário por meio de uma expressão do FreeMarker. Por exemplo, a seguinte mensagem usa o tipo de moeda extraída da entrada do usuário como parte da mensagem de validação:
Amounts below 5 ${expense.value.Amount.currency} cannot be expensed. Enter a higher amount or type 'cancel'.
Para saber mais sobre outras propriedades CURRENCY (e as outras propriedades de entidade incorporada também), consulte Entidades Incorporadas e Suas Propriedades.

Configurar um Fluxo de Caixas de Diálogo YAML para Entidades Compostas

Se sua habilidade estiver sendo desenvolvida no modo de caixa de diálogo YAML, aqui estão as coisas que você precisa fazer para configurar o fluxo de caixas de diálogo para entidades compostas:

  1. No nó context, declare a entidade composta como uma variável:
    ...
    metadata:
      platformVersion: "1.1"
    main: true
    name: "ExpenseBot"
    context:
      variables:
        expense: "Expense"
        iResult: "nlpresult"
  2. Você pode usar System.ResolveEntities ou System.CommonResponse. Esses dois componentes permitem que você aproveite a entidade composta e ambos oferecem seus próprios benefícios. O componente System.ResolveEntities é o mais simples do dois, tendo um pequeno conjunto de propriedades. Ao contrário do componente System.ResolveEntities, o System.CommonResponse fornece mais controle sobre a interface de usuário que é usada para resolver as entidades no repositório. Por exemplo, você pode adicionar lógica condicional para determinar prompts e ações globais relacionadas a valores.

    Dica:

    Como os metadados do componente System.CommonResponse podem se tornar muito complexos quando você usa entidades compostas, recomendamos que você use o componente System.ResolveEntities e use handlers de eventos de entidade para quaisquer personalizações de IU.
  3. Referencie a variável de contexto da entidade composta na propriedade variable do componente e, em seguida, defina as outras propriedades conforme necessário. System.ResolveEntities e As Propriedades do Componente as descrevem e fornecem exemplos adicionais.

    Este é um exemplo do componente System.ResolveEntities:
    createExpense:
        component: "System.ResolveEntities"
        properties:
          variable: "expense"
          useFullEntityMatches: true
          nlpResultVariable: "iResult"
          cancelPolicy: "immediate"
        transitions:
          actions:
            cancel: "cancelExpense"
          return: "done"          

A Variável system.entityToResolve

A variável system.entityToResolve fornece informações sobre o status atual do processo de resolução de entidade, conforme executado pelos componentes Resolver Entidades e Resposta Comum. Normalmente, você fará referência às propriedades desse valor de variável nos metadados do componente Resposta Comum quando quiser personalizar mensagens. Você pode usá-la para definir a lógica da mensagem de erro de uma entidade ou para várias propriedades que pertencem aos componentes Resolver Entidades e Resposta Comum. Anexe as seguintes propriedades para retornar o valor da entidade atual:
  • userInput
  • prompt
  • promptCount
  • updatedEntities
  • outOfOrderMatches
  • disambiguationValues
  • enumValues
  • needShowMoreButton
  • rangeStartVar
  • nextRangeStart
Você também pode fazer referência às propriedades nas expressões FreeMarker usadas nas propriedades do item do repositório, como prompt, errorMessage e regras de validação.
Veja um exemplo de uso dessa variável para retornar a entrada do usuário atual em uma mensagem de erro da entidade:
Sorry,'${system.entityToResolve.value.userInput!'this'}' is not a valid pizza size.
Veja um exemplo do uso de várias definições de system.entityToResolve. Entre elas está uma mensagem definida para a propriedade text, que confirma uma atualização feita em um valor de entidade definido anteriormente usando uma diretiva list do Apache FreeMarker e a propriedade updatedEntities.
    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"
Para ações globais, essa variável controla a ação global Mostrar Mais com as propriedades needShowMoreButton, rangeStartVar e 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"
O label Mostrar Mais deve incluir um system.showMore (action: "system.showMore"). Caso contrário, ele não funcionará.

entityToResolve Expressões

Expressão Descrição
${system.entityToResolve.value.resolvingField} Retorna o nome do item do repositório.
${system.entityToResolve.value.allMatches[0].entityName} Retorna o nome da entidade referenciado pelo item do repositório. O array allMatches contém todas as entidades cujos valores podem ser potencialmente atualizados pela mensagem do usuário.
${<variable>1.value[system.entityToResolve.value.resolvingField]} Retorna o valor do item do repositório que os usuários digitam ou selecionam.
${system.entityToResolve.value.userInput} Retorna o texto digitado pelo usuário. Você pode usar essa expressão para registrar a entrada do usuário ou exibi-la no chat, por exemplo, quando um usuário digita um valor inválido.
${system.entityToResolve.value.outOfOrderMatches[n].entityName} Retorna os nomes das entidades que são extraídas fora da ordem. Com os valores que os componentes Resolver Entidades ou Resposta Comum solicitam, os usuários podem fornecer valores adicionais que acionam a extração de valor fora da ordem e atualizações para outras entidades no composto.
${system.entityToResolve.value.outOfOrderMatches[n].name} Retorna o nome do item de repositório composto.
${system.entityToResolve.value.outOfOrderMatches? has_content?then(…,…)} Retorna o valor de uma entidade que foi correspondida fora da ordem. Como é provável que nenhuma entidade tenha sido correspondida fora da ordem, essa expressão usa o operador has_content.

Handlers de Eventos de Entidade

Você pode executar validação, solicitação e desambiguação para os itens de entidade composta programaticamente usando Handlers de Eventos de Entidade. Um Handler de Evento de Entidade (EEH) é uma implementação JavaScript (ou TypeScript) criada para uma entidade composta e implantada como um serviço de código personalizado.
Observação

Você pode gerenciar o serviço implantado para o EEH na página Componentes Esta é uma imagem do ícone Componentes na barra de navegação esquerda..
Você pode controlar o comportamento de resolução para itens de repositório individuais e para a própria entidade definindo as funções do handler de eventos fornecidas pelo bots-node-sdk. Por exemplo, o trecho de código a seguir ilustra a definição de um evento validate em um item de repositório chamado ExpenseDate que impede que os usuários informem uma data futura ao preencher um relatório de despesas.
ExpenseDate: {

        validate: async (event, context) => {
          if (new Date(event.newValue.date) > new Date()) {
            context.addValidationError("ExpenseDate",context.translate('ExpenseDate.text'));
            return false;
          }          
        }
A documentação Writing Entity Event Handlers do bots-node-sdk descreve a estrutura geral do código do handler de eventos, os eventos no nível do item e da entidade e os métodos EntityResolutionContext, como addValidationError e translate no trecho de código acima.

Como os Handlers de Eventos de Entidade são gravados em JavaScript, você pode usar uma lógica avançada que não é facilmente alcançada - ou mesmo viável - com as expressões FreeMarker que você pode usar para definir a validação, os erros e os prompts na página de edição do item de repositório e no fluxo de caixas de diálogo. Eles também são mais fáceis de depurar. Ou seja, você não precisa escolher Handlers de Eventos de Entidade nas expressões FreeMarker. Você pode combinar os dois. Por exemplo, você pode usar expressões FreeMarker para validações e prompts simples e reservar um EEH para funções mais complicadas, como chamar uma API REST quando todos os itens de repositório tiverem sido resolvidos.

Criar Handlers de Eventos de Entidade com o Code Editor do Handler de Eventos

Você pode criar o EEH usando o editor de Código do Handler de Eventos que é acessado na página de propriedades do repositório composto ou com o IDE de sua escolha. Embora o editor de Código do Processador de Eventos tenha algumas vantagens em relação a uma ferramenta de terceiros, talvez você queira alternar com um IDE de terceiros, dependendo do tamanho da tarefa e das bibliotecas necessárias. Para avaliar os prós e contras, consulte Qual IDE devo usar?

Para acessar o editor de Código do Processador de Eventos:
  1. Clique em + Handler de Eventos.
  2. Preencha a caixa de diálogo Criar Handler de Evento adicionando um nome de serviço e um nome de handler.

Depois de criar o handler, você poderá abrir o editor clicando em Esta é uma imagem do ícone Editar..

O editor é preenchido com o código inicial. Seu objeto handlers contém objetos entity, items e custom. Nesses objetos, você define eventos no nível do evento, que são acionados para todo o repositório composto, os eventos no nível do item, que controlam a resolução dos itens do repositório individuais e os eventos personalizados que são acionados em ações de postback. Por padrão, o objeto handler tem um objeto entity definido. Os objetos items e custom são preenchidos quando você adiciona um modelo personalizado ou no nível do item.
Veja a seguir a descrição da eeh-default-template.png
Descrição da ilustração eeh-default-template.png

Os próprios eventos são funções JavaScript assíncronas que utilizam dois argumentos:
  • event: Um objeto JSON das propriedades específicas do evento.
  • context: Uma referência à classe EntityResolutionContext, cujos métodos (como addValidationError no trecho de código a seguir) fornecem a lógica do handler de eventos.
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'.`);
      }
    }
  }
Você acessa os modelos clicando em + Adicionar Evento.
Observação

Consulte a documentação Gravando Handlers de Eventos de Entidade do bots-node-sdk para obter mais informações sobre o código inicial EEH, eventos no nível do item e da entidade, EntityResolutionContext e amostras de código.
Adicionar Eventos
Clicar em + Adicionar Evento permite adicionar os modelos de evento, item e eventos personalizados.

Por exemplo, a adição de um modelo de evento validate preenche o editor com o seguinte código:
validate: async (event, context) => {
        
      },
Em seguida, você pode atualizar esse modelo com seu próprio código:
validate: async (event, context) => {
     if (event.newValue.value === 'PEPPERONI')
       context.addValdiationError('Type', "Sorry, no pepperoni pizzas today!");     
      },
Clique regularmente em Validar para verificar o código em busca de problemas de design time. Você não poderá adicionar outros eventos se o código for inválido, nem poderá salvar um código inválido. Como salvar código significa também implantá-lo, não é possível implantar código inválido também.

Quando seu código é válido, um clique em Salvar automaticamente o implanta e o compacta em um arquivo TGZ. Você pode monitorar o status da implantação e fazer download do arquivo TGZ para reutilização em outras habilidades na página Componentes.

Dica:

Para verificar erros de runtime, ative Ativar Registro em Log de Componentes e, em seguida, revise os logs (acessados ao clicar em Diagnóstico > Exibir Logs) para descobrir os parâmetros que chamaram os eventos.
Na página da entidade composta, um status Pronto Esta é uma imagem do ícone de status Pronto. e um ícone Editar Ícone Editar para revisar seu código fica disponível depois que você implantou o serviço.

Adicionar Handlers de Eventos no Nível da Entidade
Em eventos no nível de entidade, você pode atualizar os modelos para os eventos no nível de entidade validate, publishMessage, maxPromptsReached, resolved, attachmentReceived e locationReceived.

Evento Descrição
validate Um handler para validações no nível da entidade que é chamado quando o valor de pelo menos um dos itens de repositório foi alterado.
publishMessage Um manipulador de fallback genérico que é chamado sempre que um item da bolsa não tem uma mensagem de prompt ou tratamento de desambiguação.
maxPromptsReached Um handler de fallback genérico quando o handler específico do item para atingir os prompts de número máximo não tiver sido especificado.
resolved Essa função é chamada quando a entidade composta foi resolvida. Em geral, você adicionaria um evento resolved para chamar uma API de backend que completa uma transação relacionada aos valores coletados pela entidade composta. Se a chamada de API retornar erros porque alguns valores coletados pela entidade composta não são válidos, você poderá limpar esses valores.
attachmentReceived Esse handler é chamado quando o usuário envia um anexo.
locationReceived Este manipulador é chamado quando o usuário envia uma localização.
Por padrão, o modelo é preenchido com um evento no nível da entidade, publishMessage. Por meio das funções updatedItemMessage e outOfOrderItemsMessage (que também são definidas no modelo padrão), esse evento permite que a habilidade exiba mensagens que confirmam que um valor de item de repositório resolvido anteriormente foi atualizado ou que aceitou uma entrada válida para um item de repositório diferente daquele que a entidade está solicitando no momento (entrada fora da ordem).

Este evento é opcional. Você pode excluí-lo, deixá-lo como está ou adicionar funcionalidade a ele. Por exemplo, é possível adicionar um botão cancelar quando as tentativas de um usuário de digitar um valor válido excederem o número máximo de prompts.
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);      }
}
Adicionar Handlers no Nível do Item
Para os itens de repositório listados na caixa de diálogo, você pode adicionar modelos para os eventos no nível do item: shouldPrompt, validate, publishPromptMessage, publishDisambiguateMessage e MaxPromptsReached .

Evento Descrição
shouldPrompt Solicita um item com base nos valores dos outros itens na bolsa. Esse processador tem precedência sobre os prompts configurados por meio do campo Solicitar Valor.
validate Esse handler só é chamado quando um valor é definido para um item do repositório. Se a validade do valor depender de outros itens de repositório, você deverá implementar o evento validate no nível da entidade.
publishPromptMessage Use esta função para substituir ou estender a mensagem gerada pelos componentes Resposta Comum e Resolver Entidades para solicitar o item.
publishDisambiguateMessage Use esta função para substituir ou estender a mensagem de prompt de desambiguação gerada pelos componentes Resposta Comum e Resolver Entidades.
maxPromptsReached Esta função é chamada quando o número máximo de prompts para este item, que foi especificado pelo Máximo de Tentativas de Entrada do Usuário na tela do item da entidade composta, foi atingido.

A adição de um evento no nível do item gera o objeto items.
A seguir, descrição de eeh-items-block.png
Descrição da ilustração eeh-items-block.png

Adicionar eventos personalizados
É possível criar eventos personalizados chamados a partir de ações de postback (botões ou itens de lista) usando o modelo de evento personalizado.

A adição de um modelo personalizado adiciona um objeto custom com o código de evento básico. Consulte a documentação Gravando Handlers de Eventos de Entidade do bots-node-sdk para obter exemplos de implementação de um evento personalizado.
someCustomEvent: async (event, context) => {
  
}

Substituir ou Remover um Handler de Evento de Entidade

Se você precisar substituir ou remover um EEH:
  1. Selecione uma linha vazia no menu Manipulador de Eventos para reativar o botão + Manipulador de Eventos.

  2. Abra a página Componentes Esta é uma imagem do ícone Componentes na barra de navegação esquerda.. Desative o Serviço Ativado ou exclua o serviço.
    Observação

    Não será possível excluir ou desativar um serviço se o EEH ainda estiver associado à entidade composta.
  3. Se necessário, adicione um novo EEH ao repositório composto ou, se você não estiver optando por um novo EEH, poderá adicionar a lógica de resolução com expressões FreeMarker.

Dica:

A exclusão da entidade composta também excluirá o serviço implantado para o EEH.

Que IDE devo usar?

Você pode criar um EEH usando o IDE de sua escolha e, em seguida, implantar o código usando um arquivo TGZ que você compactou manualmente com bots-node-sdk pack ou pode usar o editor de Código do Handler de Evento que fornecemos. Ao usar nosso editor, você não precisa configurar seu ambiente de desenvolvimento ou compactar e implantar seu código. O código é implantado automaticamente depois que você o salva. Também é possível revisar o código diretamente sem precisar reimplantá-lo, algo que você não pode fazer ao compactar e implantar um handler criado com seu próprio IDE. Não é possível adicionar mais pacotes NPM usando o editor de Código do Processador de Eventos. Você precisará de outro IDE. Por exemplo, se você quiser usar Moment.js para trabalhar com datas, faça download do TGZ, adicione a biblioteca usando o IDE de sua escolha e, em seguida, recompacte e implante o TGZ. Depois disso, você pode continuar usando o editor de Código do Handler de Eventos.

Dica:

O editor de Código do Handler de Eventos pode ser uma opção melhor para pequenas alterações. Se você precisar fazer alterações maiores ou adicionar mais pacotes NPM, poderá fazer download do TGZ na página Componentes, descompactá-lo e, em seguida, usar seu editor favorito para modificar o código antes de recompactá-lo e implantá-lo.

Simplificar Fluxos de Caixas de Diálogo com Handlers de Eventos de Entidade

Os handlers de eventos de entidade podem simplificar sua definição de fluxo de caixas de diálogo porque são usados com a melhor prática de encurtamento de caixas de diálogo que são entidades compostas. Quando se trata de serviços de backend, eles tornam a definição do fluxo de caixas de diálogo menos complicada, porque você não precisa escrever um estado diferente para o componente personalizado que os chama.

Os handlers de eventos simplificam a definição do fluxo de caixas de diálogo de outra forma: permitem modificar as mensagens geradas pelo componente Resolver Entidades. Por exemplo, você pode criar um carrossel de mensagens de cartão sem usar a estrutura complexa da propriedade metadata do componente Resposta Comum. Em vez disso, você pode adicionar o carrinho por meio de código simples, o que significa que também pode adicionar respostas de cartão ao componente Resolver Entidades. Por exemplo, esse código permite que o componente Resolver Entidades gere um carrossel de rolagem horizontalmente de cartões para tipo de pizza, com cada cartão tendo um botão de cancelamento:
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);
        }

Tutoriais do Handler de Eventos de Entidade

Siga este tutorial para conhecer os handlers de eventos de entidade criando um com o uso do editor. Em seguida, consulte este tutorial avançado para criar um handler de eventos de entidade com um IDE externo e bots-node-sdk.

Desambiguar itens e subtipos de bolsa aninhada

A entidade composta sempre solicitará valores por ordem de item ditada pela estrutura hierárquica de um item de entidade aninhado. Ela não colocará valores de slot cegos para vários itens. Em vez disso, ele tenta corresponder o valor na mensagem do usuário apenas ao item que está solicitando no momento. Quando a entrada do usuário não corresponde ao item atual ou pode corresponder potencialmente a mais de um item, como pode ser o caso de startTime e endTime para um subtipo INTERVAL, ela apresenta aos usuários o valor definido para a propriedade Label para esclarecer a entrada solicitada.

Dica:

Como acontece com todas as strings, recomendamos que você defina o valor Label como um pacote de recursos.

Adicionar a Entidade DATE_TIME a um Composto

Para permitir que sua habilidade lide com cenários complexos que exigem vários prompts do usuário, como programar uma reunião ou definir um evento recorrente, você precisa criar um item de repositório composto DATE_TIME e, em seguida, configurar os atributos dos subtipos Intervalo, Recorrente e Data e Hora e seus respectivos itens de repositório aninhados.
Observação

Embora você possa usar a Data, a Hora e a Duração como entidades independentes, recomendamos que você as use dentro de entidades compostas.
  1. Antes de criar um item de repositório DATE_TIME, configure as regras de resolução de ambiguidade de data e hora apropriadas para seu caso de uso. Por exemplo, se você estiver criando uma habilidade de relatório de despesas, selecione Passado. Se a habilidade for um programador de reuniões, selecione Futuro.
  2. Na entidade composta, clique em Adicionar item.
  3. Selecione Entidade no menu Tipo.
  4. Selecione DATE_TIME no menu Nome da Entidade.
  5. Escolha um subtipo DATE_TIME no menu Subtipo.

    As opções de configuração na página Adicionar Item Bolsa são alteradas, dependendo do subtipo selecionado. Por exemplo, se você selecionar o subtipo Recorrente, poderá acessar opções de configuração para os itens de repositório aninhados que são específicos para definir um evento repetido, como o objeto Data e Hora para a data e hora iniciais e o objeto Duração para definir a frequência do evento.

  6. Se você selecionou os subtipos Recorrente ou Intervalo:
    • Defina os valores de subtipo que o repositório composto solicita no menu Solicitar.
    • Como as reuniões geralmente começam e terminam no mesmo dia, ative Data final padrão para a data inicial para o subtipo startDate. Isso define a data de término como igual à data de início quando a mensagem do usuário não menciona a data de término (ou quando a data de término não é extraída fora de ordem).
      Esta é uma imagem da alternância de data inicial padrão para data final.

  7. Opcionalmente, adicione um label de desambiguação se a entrada do usuário puder corresponder a mais de um subtipo.

    Dica:

    Você também pode configurar as propriedades que não são específicas de DATE_TIME, como preenchimento de slot aprimorado, atualização de valores de slot com Apache FreeMarker, prompts personalizados e mensagens de erro.
  8. Você pode acessar a configuração no nível do subtipo clicando em um subtipo. Use a travessia para retornar à configuração no nível do item.
    Esta é uma imagem da passagem Editar item da bolsa.

  9. Próximas etapas:
    • Associe a entidade composta à intenção.
    • Declare uma variável para a entidade no fluxo de caixas de diálogo.
    • No fluxo de caixas de diálogo, faça referência à entidade composta com o item DATE_TIME usando um estado Resolver Entidade Composta.
    • Os valores DATE_TIME são representados como ISO 8601. Para uma saída amigável, use o Apache FreeMarker .xs built-in. No trecho de código a seguir, o valor do subtipo Tempo é formatado usando .value?time.xs?string['hh:mm a'].
      Your pizza will be delivered at ${pizza.value.deliveryTime.value?time.xs?string['hh:mm a']}.
      
      Em vez de fazer referência ao item DATE_TIME como uma string, você pode seguir a abordagem de melhores práticas de referenciá-lo em um pacote de recursos, como DeliveryMessage no exemplo a seguir.
      ${rb('DeliveryMessage','time',pizza.value.deliveryTime.value?time.xs?string['hh:mm a'])}
      
      Para a mensagem do pacote de recursos DeliveryMessage, o valor é renderizado por meio do parâmetro {time}:
      Your pizza will be delivered at {time}.
      

Tutorial: Extração de Entidade do Mundo Real com Entidades Compostas

Você pode obter uma visão prática da criação de um repositório composto por meio deste tutorial: Ativar Extração de Entidade do Mundo Real com Entidades Compostas.