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).
-
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
-
Clique em Entidades
na barra de navegação esquerda.
-
Clique em Adicionar Entidades.
-
Escolha Repositório Composto como tipo de entidade.
- Digite o nome e a descrição.
- 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.
-
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.
-
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.
-
-
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
na página Entidades).
-
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..
- Adicione mensagens de erro individuais, prompts de desambiguação ou prompts condicionais para os itens do repositório.
Preenchimento de slot aprimorado
- 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.
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
-
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 comotrue
(para prompts) oufalse
.Dica:
Quando você define Solicitar Valor comofalse
, o item ainda pode ser resolvido como parte de outro item que está sendo solicitado ao ativar Extração Fora da Ordem. -
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çãoOs prompts podem ser armazenados em pacotes de recursos (por exemplo,
Você só pode adicionar prompts para entidades incorporadas quando adicioná-los a um repositório composto.${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
- 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.
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
- 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
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.amount
da entidade CURRENCY:${expense.value.Amount.amount > 4}
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:
-
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"
-
Você pode usar
System.ResolveEntities
ouSystem.CommonResponse
. Esses dois componentes permitem que você aproveite a entidade composta e ambos oferecem seus próprios benefícios. O componenteSystem.ResolveEntities
é o mais simples do dois, tendo um pequeno conjunto de propriedades. Ao contrário do componenteSystem.ResolveEntities
, oSystem.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 componenteSystem.CommonResponse
podem se tornar muito complexos quando você usa entidades compostas, recomendamos que você use o componenteSystem.ResolveEntities
e use handlers de eventos de entidade para quaisquer personalizações de IU. -
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 componenteSystem.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
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
prompt
, errorMessage
e regras de validação.
Sorry,'${system.entityToResolve.value.userInput!'this'}' is not a valid pizza size.
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"
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 gerenciar o serviço implantado para o EEH na página Componentes

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?
- Clique em + Handler de Eventos.
- 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 .
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.
Descrição da ilustração eeh-default-template.png
event
: Um objeto JSON das propriedades específicas do evento.context
: Uma referência à classe EntityResolutionContext, cujos métodos (comoaddValidationError
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'.`);
}
}
}
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
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!");
},
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.

Adicionar Handlers de Eventos no Nível da 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. |
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
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
.
Descrição da ilustração eeh-items-block.png
Adicionar eventos personalizados
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
- Selecione uma linha vazia no menu Manipulador de Eventos para reativar o botão + Manipulador de Eventos.
- Abra a página Componentes
. 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. - 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?
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.
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
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
Embora você possa usar a Data, a Hora e a Duração como entidades independentes, recomendamos que você as use dentro de entidades compostas.
- 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.
- Na entidade composta, clique em Adicionar item.
- Selecione Entidade no menu Tipo.
- Selecione DATE_TIME no menu Nome da Entidade.
- 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. - 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).
- 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. - 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.
- 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']
.
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, comoYour pizza will be delivered at ${pizza.value.deliveryTime.value?time.xs?string['hh:mm a']}.
DeliveryMessage
no exemplo a seguir.
Para a mensagem do pacote de recursos${rb('DeliveryMessage','time',pizza.value.deliveryTime.value?time.xs?string['hh:mm a'])}
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.