Componentes da Interface do Usuário

Esses são os componentes disponíveis na categoria Interface do Usuário do editor de fluxo de caixas de diálogo baseado em YAML.

Use estes componentes para exibir texto e interface com o usuário:

System.CommonResponse

O componente System.CommonResponse permite criar mensagens com recursos avançados de interface de usuário, como cenouras de cartão com imagens e botões de ação, ou formulários com tabelas e campos de entrada.

Observação

Este tópico abrange o uso desse componente no modo YAML. Para obter informações sobre como usá-lo no Designer de Fluxo Visual, consulte Modelos de Componentes de Resposta Comuns.

Os modelos para o System.CommonResponse estão disponíveis na seção Mensagens do Usuário da caixa de diálogo Adicionar Componente.

A forma como você cria mensagens com base nesse componente depende do modo de diálogo da habilidade. No modo YAML, você edita os modelos de estado do componente OBotML. O processo é simplificado no Modo Visual, no qual você pode criar essas mensagens de interface de usuário avançada apenas atualizando os campos e os metadados do item de resposta na janela de propriedade dos modelos de mensagens do usuário baseados no componente de Resposta Comum. Para habilidades baseadas em YAML, você pode ver um exemplo do uso do componente System.CommonResponse no CrcPizzaBot, um dos bots de amostra. Nessa volta do PizzaBot, você pode exibir um menu de imagem com os botões da ação rápida Order Now. No contexto do componente System.CommonResponse, os diferentes tipos de mensagens são conhecidos como tipos de resposta e o CrcPizzaBot mostra como, entre outras coisas, eles permitem que os usuários de bot respondam às solicitações usando botões de ação e exibam o menu de pizza como cascata de itens do cartão.

No menu Adicionar Componente, você pode selecionar outros modelos System.CommonResponse para cartões, texto, respostas de anexo e para entidades compostas (demonstradas pelo CbPizzaBot). Esses modelos incluem as duas propriedades comuns a todas essas propriedades de tipo de resposta que são específicas dos tipos de resposta individuais. Embora o menu Adicionar Componente adicione estados distintos para cada tipo de resposta, você possa combinar um ou mais tipos de resposta em um único estado. O CrcPizzaBot mostra exemplos de ambos nos estados ShowMenu (resposta de texto) e OrderPizza (respostas de texto e cartão).

Observação

Teste antecipadamente cada habilidade em seus canais de destino no ciclo de desenvolvimento para ter certeza de que seus componentes sejam renderizados conforme desejado.

As Propriedades do Componente

A configuração de componentes System.CommonResponse envolve a definição de propriedades que direcionam o Mecanismo de Caixa de Diálogo com as propriedades de metadados que descrevem não apenas como o componente entrega mensagens (como prompts de texto, cartões ou anexos), mas também define o conteúdo e o comportamento das mensagens propriamente ditas.

Nome Descrição 0brigatório?
metadata A resposta de chat criada por esse componente é orientada pelo conteúdo da propriedade metadata. Consulte A Propriedade de Metadados em Componentes de Resposta Comuns. Sim
processUserMessage Defina essa propriedade como true para direcionar o Mecanismo de Caixa de Diálogo a retornar ao estado após o usuário digitar texto ou tocar em um botão. Defina essa propriedade como false se nenhuma entrada do usuário for necessária (ou esperada).

Defina essa propriedade como true ao definir um local.

Sim
autoNumberPostbackActions Essa propriedade é usada para repositórios compostos, respostas de texto e respostas de cartão. Quando definido como true, essa opção prefixa números às opções. Mesmo quando você não tiver definido essa opção como true, a numeração automática poderá ser aplicada em itens de cartão quando a configuração Ativar Numeração Automática em Ações de Postback do assistente digital for definida como true. Conforme demonstrado por sua configuração padrão, a numeração automática específica do canal pode ser aplicada a qualquer bot de habilidades registrado em um assistente digital (${(system.channelType=='twilio')?then('true','false')}): Número
variable

Esta variável mantém o nome da variável de contexto ou do usuário que é preenchido quando um usuário responde digitando texto livre em vez de tocar em um botão. Esta propriedade é ignorada quando um usuário toca em um botão, porque o payload do botão determina quais valores de variáveis foram definidos. Se a propriedade da variável já tiver sido definida quando o Mecanismo de Caixa de Diálogo entrar nesse estado, o estado será ignorado.

Para entidades compostas, mencione a variável da entidade composta. Os usuários são solicitados a fornecer valores de entidades individuais no repositório. Quando todos os valores de entidades forem definidos, o componente mudará para o próximo estado.

Número
nlpResultVariable Define a propriedade variable com um valor de entidade (quando o valor da entidade ainda não foi definido para a variável referenciada). Você pode ativar nlpResultVariable para retornar o valor ao defini-lo usando uma variável que armazena os resultados de NLP (como iResult: "nlpresult", que é usado em nossos bots de amostra). Ao fazer isso, a propriedade nlpResultVariable ainda poderá preencher o valor quando ele for nulo se encontrar uma entidade resolvida que corresponda à referenciada pela variável. A caixa de diálogo muda para o próximo estado quando nlpResultVariable define o valor. Você pode usar essa propriedade no lugar do componente System.SetVariable. Número
useFullEntityMatches Quando definidos como true, os valores de entidade personalizados são armazenados como objetos JSON (semelhante aos valores de entidade incorporados). Isso permite que você crie expressões para acessar propriedades como value, primaryLanguageValue e originalString, que são particularmente importantes para habilidades multilíngues no momento ou que eventualmente poderão se tornar multilíngues. Número
maxPrompts Para que o componente System.CommonResponse possa preencher o valor da variável que você especificou para a propriedade variable com base no texto digitado pelo usuário, ele valida o valor conforme o tipo de variável. Essa pode ser a validação do tipo de entidade ou, no caso de um tipo primitivo, é um valor que pode ser convertido no tipo primitivo.

Quando o componente não pode validar o valor, o Mecanismo de Caixa de Diálogo envia o texto da mensagem e as opções novamente. (Você pode modificar essa mensagem para refletir a falha de validação.) Para evitar um loop infinito resultante da incapacidade contínua do usuário de informar um valor válido, use essa propriedade para definir um limite para o número de tentativas fornecidas ao usuário. Quando o usuário excede essa distribuição, o componente System.CommonResponse muda para a ação cancel. Consulte Limitando o Número de Prompts do Usuário.

Conforme descrito em Criar uma Entidade Composta, entidades individuais no repositório composto podem substituir essa definição quando a opção Máximo de Tentativas de Entrada do Usuário é definida.

Número
keepTurn A propriedade keepTurn só se aplica quando você define a propriedade processUserMessage como false. Consulte System.Output para saber como definir essa propriedade. Número
translate Use essa propriedade para substituir o valor booliano que você definiu para a variável de contexto autotranslate. Se você não tiver definido essa variável ou se defini-la como false, poderá definir essa propriedade como true para ativar a tradução automática somente desse componente. Se você definir a variável autotranslation como true, poderá definir essa propriedade como false para excluir esse componente da tradução automática. Consulte Serviços de Tradução em Habilidades. Número
footerText Melhora a saída nos canais somente texto. Conforme descrito em Rodapés, você pode usar expressões do FreeMarker para condicionalizar o texto do rodapé para canais somente texto. Número
transitionAfterMatch (obsoleto) Um booliano que, quando você o define como true, permite uma transição temporária da correspondência de entidade executada por esse componente para outro estado. Esta propriedade não é mais suportada. Para obter essa funcionalidade, use um processador de eventos de entidade Número
cancelPolicy Determina o tempo da transição cancel:
  • immediate — Imediatamente após o valor definido para o Número Máximo de Tentativas de Entrada do Usuário do item do repositório ter sido atingido. Se esse valor não tiver sido definido, o componente acionará essa transição quando o valor maxPrompts no âmbito do componente tiver sido atingido.

  • lastEntity — Quando a última entidade no repositório tiver sido correlacionado com o valor.

Essa propriedade será ignorada se você tiver registrado um handler de eventos de entidade em um handler maxPromptsReached de nível de item ou evento.
Número

Aqui está o YAML para um estado de exemplo com base no componente System.CommonResponse.

  AskPizzaSize:
    component: "System.CommonResponse"
    properties:
      variable: "pizzaSize"
      nlpResultVariable: "iresult"
      maxPrompts: 2
      metadata:
        responseItems:
        - type: "text"
          text: "<#if system.invalidUserInput == 'true'>Invalid size, please try again.\
            \ </#if>What size do you want?"
          name: "What size"
          separateBubbles: true
          actions:
          - label: "${enumValue}"
            type: "postback"
            payload:
              action: ""
              variables:
                pizzaSize: "${enumValue}"
            name: "size"
            iteratorVariable: "pizzaSize.type.enumValues"
      processUserMessage: true
    transitions:
      actions:
        cancel: "Intent"
      next: "AskLocation" 

Dica:

A propriedade text nesse trecho de código é definida usando o Apache FTL (FreeMarker Template Language). Para saber como adicionar expressões FTL e usar operações incorporadas do FreeMarker para transformar valores de variáveis, consulte Sintaxe de Linguagem de Modelo do Apache FreeMarker.

Transições para o Componente System.CommonResponse

Os componentes de Resposta Comum usam as transições a seguir.
Transição Descrição
cancel Acionado quando um usuário excede as tentativas permitidas definidas pela propriedade maxAttempts ou redirecione o fluxo.
textReceived Acionado quando um usuário envia texto ou emojis em vez de tocar em um botão ou link de ação.
attachmentReceived Acionado quando um usuário envia imagem, áudio, vídeo ou anexo de arquivo.
locationReceived Acionado quando o usuário envia uma localização.
system.outOfOrderMessage Defina isso para contornar o comportamento inesperado do usuário. Especificamente, quando um usuário não toca em um item de ação na mensagem atual, mas toca em uma ação que pertence a uma mensagem mais antiga na sessão de chat.

Transições de Repositório Composto no Componente System.CommonResponse

Esses componentes System.CommonResponse acionam as ações match e cancel com base nos valores correspondidos da entrada do usuário e na configuração da propriedade cancelPolicy.
Ação Descrição 0brigatório?
match O componente aciona essa ação para navegar até o estado especificado quando pelo menos uma entidade no repositório corresponder à entrada do usuário. No
cancel O componente aciona esta ação para navegar até o estado especificado com base na definição da propriedade cancelPolicy. No

System.Webview

Observação

Este tópico abrange o uso desse componente no modo YAML. Para obter informações sobre como usá-lo no Visual Flow Designer, consulte Componente Webview.

O componente System.Webview abre uma webview na sua habilidade ou para habilidades que são executadas em um canal Web, em uma guia do browser.

Propriedades do Componente System.WebView

Propriedade Descrição 0brigatório?
sourceVariableList Uma lista separada por vírgulas de nomes de variáveis do contexto ou de usuário. Esses nomes de variáveis são os parâmetros enviados para a webview; são os parâmetros de entrada do seu bot. Você pode definir cada variável adicionando uma série de estados System.SetVariable antes do estado System.Webview. Sim
variable O nome da variável (um valor de string) que identifica o payload da webview que é retornado ao bot depois que o usuário conclui suas interações na webview.

Como o payload é armazenado nessa variável, pode acessá-la posteriormente em sua definição de fluxo de caixas de diálogo. Por exemplo, você pode mencionar isso em um componente de saída.

Sim
prompt Uma string de texto como “Toque para continuar". No
service O nome do serviço do componente webview. No
imageUrl O URL para a imagem que acompanha um prompt. No
linkLabel O label do botão que chama o aplicativo Web. No
cancelLabel O label do botão Cancelar que permite aos usuários sair do estado sem chamar o aplicativo web. No
autoNumberPostbackActions Permite a entrada do usuário em canais SMS, que não suportam botões, adicionando atalhos numéricos aos elementos da IU.
  • false — Substitui a variável autoNumberPostbackActions global.

  • true

    Prefixa o botão Cancelar com um número de sequência que, quando informado, executa o payload de postback do botão como se o usuário tocasse no botão, em vez de digitar seu atalho numérico.
No
translate Use essa propriedade para substituir o valor booliano que você definiu para a variável de contexto autotranslate. Se você não tiver definido essa variável ou se defini-la como false, poderá definir essa propriedade como true para ativar a tradução automática somente desse componente. Se você definir a variável autotranslation como true, poderá definir essa propriedade como false para excluir esse componente da tradução automática. Consulte Serviços de Tradução em Habilidades. Número

Transições para o Componente System.Webview

Transições Descrição
next Nomeia o próximo estado no fluxo de caixas de diálogo após o callback bem-sucedido do aplicativo web.
return Sai da conversa após o callback bem-sucedido do aplicativo web.
error Nomeia o estado que trata erros.
actions
  • cancel — Nomeia o estado que trata o cenário "o usuário toca em cancelar".
  • textReceived - Nome do estado quando os usuários inserem texto, em vez de tocar em um dos botões.

System.IncidentCreation

Você pode usar o componente System.IncidentCreation para criar um incidente em um local de atendimento ao cliente. Observe que você deve criar uma integração de atendimento ao cliente na página Definições > Serviços Adicionais > Integração de Atendimento ao Cliente para poder usar esse componente em sua instância.

Observação

Este tópico abrange o uso desse componente no modo YAML. Para obter informações sobre como usá-lo no Designer de Fluxo Visual, consulte Criação de Incidente.

Este é um exemplo de uso desse componente para transferir a conversa de volta para um site do Oracle B2C Service.

  component: "System.IncidentCreation"
    properties:
      serviceName: "IncidentService"
      subject: "${incident.value.subject}"
      attachmentUrl: <#if (incident.value.Attachment.url)??>${incident.value.Attachment.url}<#else></#if>
      customFields: 
        description: "${incident.value.description}"
        contactInfo: "<#if (profile.contactInfo)??>${profile.contactInfo}<#else></#if>"
      contactProperties: 
        firstName: "${profile.firstName}"
        lastName: "${profile.lastName}"
        email: "${incident.value.email}"
      incidentNumberVariable: "incidentNumber"
    transitions:
      error: "incidentError" 
      next: "exitIncident"

E aqui está um exemplo para o Oracle Fusion Service:

  component: "System.IncidentCreation"
  properties:
    serviceName: "IncidentServiceB2BEndUserAuth"
    subject: "${service.value.subject}"
    attachmentUrl: <#if (service.value.Attachment.url)??>${service.value.Attachment.url}<#else></#if>
    agentReportFilter: "ODAQueue"
    addChatTranscript: "true"      
    customFields: 
      description: "${service.value.description}"
      contactInfo: "<#if (profile.contactInfo)??>${profile.contactInfo}<#else></#if>"
    contactProperties: 
      firstName: "${profile.firstName}"
      lastName: "${profile.lastName}"
      email: "<#if (profile.email)??>${profile.email}<#else></#if>"
    incidentNumberVariable: "incidentNumber"
  transitions:
    error: "incidentError" 
    next: "exitIncident"
Propriedade Descrição 0brigatório?
serviceName O nome da integração, conforme configurado em Definições > Serviços Adicionais > Integração de Atendimento ao Cliente. Sim
subject O texto do assunto do incidente. Sim
attachmentUrl O URL de um documento ou imagem relacionado ao incidente. Observe que a adição de anexos não é suportada para habilidades DA as Agent. No
agentReportFilter (Para incidentes do Oracle Fusion Service), texto para filtrar os incidentes. O valor padrão é ODA. No
addChatTranscript (Somente para incidentes do Oracle Fusion Service.) Quando definido como verdadeiro, a transcrição do chat é adicionada ao incidente. O padrão é falso.

Os insights devem ser ativados para a habilidade para que a transcrição do chat seja disponibilizada.

Uma transcrição só pode ser adicionada ao incidente ao usar um DA como integração de Agente em combinação com o Web Chat for Service ou inlays do Oracle Inlay Toolkit.

No
customFields Um mapa que contém description e, opcionalmente, contactInfo, que pode conter detalhes adicionais sobre o incidente.

O mapa é passado como uma versão de texto do objeto e inserido na mensagem de incidente como uma observação privada.

No
contactProperties Um mapa de pares de nome/valor que contém as informações necessárias para pesquisar ou criar informações de contato de atendimento ao cliente. Ele deve conter email e, opcionalmente, pode conter firstName e lastName.

Se email não for fornecido, você deverá fornecer firstName e lastName.

Somente para o Oracle B2C Service
incidentNumberVariable O nome da variável de contexto da string na qual armazenar o número do incidente. No

System.IntelligentAdvisor

Use esse componente para acessar uma entrevista do Oracle Intelligent Advisor de uma habilidade.

Observação

Este tópico abrange o uso desse componente no modo YAML. Para obter informações sobre como usá-lo no Visual Flow Designer, consulte Intelligent Advisor.

Crie uma integração de serviço do Intelligent Advisor para poder usar esse componente. Consulte Adicionar um Serviço do Intelligent Advisor. Além disso, a entrevista deve ter sido implantada no Intelligent Advisor Hub e ativada no canal de serviço de chat. A entrevista deve ser para usuários anônimos. Não é possível acessar entrevistas para usuários do portal ou usuários do agente.

Você pode usar as propriedades do componente para especificar as seguintes definições de entrevista:

  • Se os títulos e a explicação serão exibidos
  • Os labels dos botões sim, não e incerto
  • As strings que o usuário digita para redefinir, retornar à pergunta anterior (desfazer) e sair da entrevista
  • O texto a ser exibido no final da entrevista
  • Como formar as frases da pergunta sobre se a explicação deve ser exibida
  • A string que o usuário digita para indicar a conclusão do upload dos arquivos
  • Os valores de atributo e os parâmetros de conector a serem transmitidos à entrevista
  • A localidade do projeto a ser usada

Veja aqui um exemplo:

  loanAdvisorIA:
    component: "System.IntelligentAdvisor"
    properties:
      intelligentAdvisorService: "myService"
      deployment: "Loan Advisor"
      # default yesLabel: "yes"
      # default noLabel: "no"
      uncertainLabel: "not sure"
      endLabel: "You can ask me another question if there's something else that I can help
    you with."
      # default doneLabel: "/done"
      # default undoLabel: "/back"
      # default resetLabel: "/reset"
      # default exitLabel: "/exit"
      showExplanation: "ask"
      # default explanationAskLabel: "Do you want to see the explanation?"
      # default removeHtml: false        
    transitions:
      error: "handleIAError"
      next: "endOfFlow"

  handleIAError:
    component: "System.Output"
    properties:
      text: |
        We are having a problem with a connection.
        Can you please send email to 
        contact@example.com to let them know that
        the loan advisor isn't working? Thank you.
    transitions:
      next: "endOfFlow"
      

Consulte Usar o Componente do Intelligent Advisor em Sua Habilidade para obter um exemplo que use o componente em um fluxo de caixas de diálogo.

Dica:

Os valores padrão de todas as propriedades do label são armazenados no pacote de recursos da habilidade. Para alterar um padrão, abra a página Pacote de Recursos da habilidade, clique em Ícone de Pacotes de Recursos, selecione a guia Configuração e altere a mensagem da chave IntelligentAdvisor - <nome da propriedade>. Se você usar o pacote de recursos da habilidade para alterar o padrão, não será necessário incluir a propriedade de label no componente, a menos que queira substituir o padrão.

O pacote de recursos de configuração também permite que você altere as mensagens IntelligentAdvisor - defaultValue, IntelligentAdvisor - doneHelp, IntelligentAdvisor - maskLabel, IntelligentAdvisor - outOfOrderMessage, IntelligentAdvisor - resumeSessionPrompt, IntelligentAdvisor - numberMinMax, IntelligentAdvisor - outOfOrderMessage, IntelligentAdvisor - resumeSessionPrompt e IntelligentAdvisor - yesNoMessage. Por exemplo, a mensagem IntelligentAdvisor - doneHelp é a saída dos campos de anexo e padronizada como When you are done with the upload, say {0}. Talvez você queira alterá-lo para algo como Say {0} to let me know that you are done uploading.

Propriedade Descrição 0brigatório?
currency O código da moeda ISO-4217 para a moeda usada na entrevista. Quando esse código é especificado, o usuário só pode inserir valores de moeda nos formatos permitidos para essa moeda. É possível definir esta propriedade como em branco ou excluí-la se a entrevista não solicitar valores de moeda ou não estiver esperando uma determinada moeda. No
deployment O nome do projeto de implantação ativo no Intelligent Advisor Hub. Sim
doneLabel O texto que os usuários digitam para indicar que fizeram o upload de um arquivo.

O padrão é /done.

No
endLabel Texto a ser exibido no chat no final da entrevista.

O padrão é Interview ended. Você pode definir a propriedade como "" para impedir que o texto seja exibido.

No
exitLabel O texto que os usuários digitam para indicar que desejam sair da entrevista.

O padrão é /exit.

No
explanationAskLabel A pergunta a ser feita quando showExplanation é definido como ask.

O padrão é Do you want to see the explanation?

No
hideScreenTitle Indica se todos os títulos de tela devem ser ocultados na entrevista.

O padrão é false, o que significa que os títulos de tela devem ser exibidos.

No
intelligentAdvisorService O nome do serviço do Intelligent Advisor conforme configurado em Definições > Serviços Adicionais. Sim
interviewAttributes O nome de uma variável de contexto do tipo string na qual os valores de atributo da entrevista serão armazenados. Os valores de atributo são armazenados como uma matriz de pares de chave/valor. No
locale

Essa propriedade afeta a entrevista de destino e a resolução de data e número.

O componente inicia a versão da entrevista nomeada (implantação) associada ao idioma especificado pela propriedade locale do componente. Se não houver uma implantação de Hub para a localidade especificada, o componente usará a localidade padrão associada à implantação.

Para entrada de data e número, os valores são resolvidos de acordo com as definições de entidade DATE e NUMBER. Quando a opção Considerar Localidade do Usuário Final for ativada para a entidade, o valor será resolvido para a localidade especificada por essa propriedade (ou o padrão, se não for especificado). Consulte Resolução de Entidade Baseada em Localidade.

Essa propriedade assume como padrão o valor profile.locale. Se profile.locale não tiver um valor, ele usará a configuração regional do canal.

No
noLabel O rótulo a ser usado para representar valores FALSE boolianos.

O padrão é No.

No
params Um mapa de parâmetros de conexão de valor-chave a serem transmitidos no início da entrevista. Isso geralmente é necessário para entrevistas com integração de dados externa. No
removeHtml Indica se a marcação HTML deve ser removida do texto. O padrão é false. No
resetLabel O texto que os usuários digitam para indicar que desejam voltar à primeira pergunta.

O padrão é /reset.

No
seedData Um mapa de nomes e valores de atributo do Intelligent Advisor a serem transmitidos à entrevista. Para atributos de data e hora, use os formatos padrão de data e hora do Intelligent Advisor. Por exemplo: start_date: "2010-01-31".

O atributo ao qual você está transmitindo o valor deve ter a opção Implantar com base no parâmetro de URL ativada no Policy Modeling.

No
showExplanation Especifica se a explicação do Intelligent Advisor deve ser mostrada. Os valores permitidos são never, always e ask.

Se você definir como ask, use a propriedade explanationAskLabel para especificar o texto para perguntar se o usuário deseja ver a explicação.

O padrão é never.

No
uncertainLabel O label que o usuário poderá digitar se não souber o valor. Esse label é exibido para os botões de opção boolianos opcionais.

O padrão é Uncertain.

No
undoLabel O texto que os usuários digitam para indicar que desejam voltar à pergunta anterior.

O padrão é /back.

No
yesLabel O label a ser usado para representar valores boolianos TRUE.

O padrão é Sim.

No

Exemplo: Usar o Componente do Intelligent Advisor na Sua Qualificação

  ####################    
  # Loan Advisor
  ####################

  loanAdvisorStart:
    component: "System.Output"
    properties:
      keepTurn: true
      text: |
        OK, I can initiate a loan request for you.
        But first I'll transfer you to an 
        automated advisor that will ask some
        questions about the loan that you want, 
        your assets, your liabilities, and your 
        financial history. It shouldn't take 
        more than 5 minutes.
        <#if (user.notFirstTime)??><#else>
        At any time, you can say 
        /back to go to the previous question, 
        /reset to start over or 
        /exit to stop the questions.</#if>
    transitions:
      next: "setNotFirstTime"
      
  setNotFirstTime:
    component: "System.SetVariable"
    properties:
      variable: "user.notFirstTime"
      value: true
    transitions:
      next: "loanAdvisorIA"  
      
  loanAdvisorIA:
    component: "System.IntelligentAdvisor"
    properties:
      intelligentAdvisorService: "myService"
      deployment: "Loan Qualifier"
      # default yesLabel: "yes"
      # default noLabel: "no"
      uncertainLabel: "not sure"
      endLabel: " "
      # default doneLabel: "/done"
      # default undoLabel: "/back"
      # default resetLabel: "/reset"
      # default exitLabel: "/exit"
      showExplanation: "ask"
      # default explanationAskLabel: "Do you want to see the explanation?"
      interviewAttributes: "interviewDetails"      
    transitions:
      error: "handleIAError"
      next: "handleEligibility"

  handleEligibility:
    component: "System.Switch"
    properties:
      source: <#list interviewDetails.value as i><#if i.key = 'eligibility'>${i.val}</#if></#list>
      # The values that are matched against the value of the variable or source property. The value that matches is set as transition action
      values:
      - "eligible"
      - "noteligible"
    transitions:
      actions:
        eligible: "initiateLoan"
        noteligible: "suggestNextSteps"
        NONE: "handleUnexpectedAttributeValue" # the attribute value was other than eligible or noteligible or the user exited interview
      error: "handleAttributeNotSet" # the attribute wasn't set during the interview or the key is incorrect

  handleIAError:
    component: "System.Output"
    properties:
      text: |
        We are having a problem with a connection.
        Can you please send email to 
        contact@example.com to let them know that
        the loan advisor isn't working? Thank you.
    transitions:
      next: "endOfFlow"
...
      

Exemplo: Acessar Atributos da Entrevista

Veja um exemplo simples de acessar os valores de atributo de uma entrevista:

context:
  variables:
    iResult: "nlpresult"
    interviewDetails: "string"

states:
  ...
  loanAdvisorIA:
    component: "System.IntelligentAdvisor"
    properties:
      intelligentAdvisorService: "myService"
      deployment: "Loan Qualifier"
      # default yesLabel: "yes"
      # default noLabel: "no"
      uncertainLabel: "not sure"
      endLabel: " "
      # default doneLabel: "/done"
      # default undoLabel: "/back"
      # default resetLabel: "/reset"
      # default exitLabel: "/exit"
      showExplanation: "ask"
      # default explanationAskLabel: "Do you want to see the explanation?"
      interviewAttributes: "interviewDetails"      
    transitions:
      error: "handleIAError"
      next: "handleEligibility"

  handleEligibility:
    component: "System.Switch"
    properties:
      source: <#list interviewDetails.value as i><#if i.key = 'eligibility'>${i.val}</#if></#list>
      # the values that are matched against the value of the variable or source property. The value that matches is set as transition action
      values:
      - "eligible"
      - "noteligible"
    transitions:
      actions:
        eligible: "initiateLoan"
        noteligible: "suggestNextSteps"
        NONE: "handleUnexpectedAttributeValue" # the attribute value was other than eligible or noteligible or the user exited interview
      error: "handleAttributeNotSet" # the attribute wasn't set during the interview or the key is incorrect
  ...

System.KnowledgeSearch

Observação

Este tópico abrange o uso desse componente no modo YAML. Para obter informações sobre como usá-lo no Designer de Fluxo Visual, consulte Pesquisa de Conhecimento.

Use este componente para pesquisar o Oracle B2C Service Knowledge Foundation ou o Oracle Fusion Service Knowledge Management para obter informações sobre um determinado termo de pesquisa e exibir os resultados.

Para o Oracle B2C Service, os resultados retornados pelo serviço dependem de as respostas serem públicas e de quais são as definições de nível de acesso, produto ou categoria.

Observe que você deve criar um serviço de pesquisa de conhecimento para poder usar este componente. Consulte Adicionar um Serviço de Pesquisa de Conhecimento.

Veja aqui um exemplo de como usar este componente. Ele pesquisa em um serviço de Gerenciamento de Conhecimento todas as informações relacionadas à última declaração do usuário. Para obter exemplos adicionais, consulte Usar o Componente de Pesquisa de Conhecimento.

  searchFor:  knowledgeSearch:
    component: "System.KnowledgeSearch"
    properties:
      searchServiceName: "myKnowledgeSearch"
      searchTerm: "${iResult.value.query}"
      searchPrelude: "I don't know the answer for that. Let me search for an answer."
      resultSizeLimit: 5
      resultVersion: "Special Response"
      resultVersionExclusive: true
      resultLinkLabel: "Show More"
      searchLinkLabel: "Open Page with All Answers" # For B2B set to "Go to search home page"
      noResultText: "I don't have an answer for that. Try rephrasing your question."
    transitions:
      actions:
        resultSent: "reset"
        noResult: "reset"
        serverError: "handleSearchServerProblem"
      error: "handleSearchError"
      next: "reset"  

Dica:

Os valores padrão das propriedades defaultAttachmentLabel, noResultText e resultLinkLabel são armazenados no pacote de recursos da habilidade. Para alterar um padrão, abra a página Pacote de Recursos da habilidade, clique em Ícone de Pacotes de Recursos, selecione a guia Configuração e altere a mensagem da chave KnowledgeSearch - <nome da propriedade>. Se você usar o pacote de recursos da habilidade para alterar o padrão, não será necessário incluir a propriedade no componente, a menos que queira substituir o padrão.
Propriedade Descrição 0brigatório?
cardLayout Especifica se os cartões de resultado devem ser exibidos na vertical ou na horizontal. O padrão é horizontal. Número
customFilters Uma lista de filtros de resultados de pesquisa apresentados como pares nome-valor. Os nomes de filtro permitidos são product e category. Cada um deles permite apenas uma declaração de filtro. Consulte Filtrar Resultados por Produto e Categoria. Número
customProperties Somente Oracle B2C Service: Um mapa de pares de chave/valor a serem enviados ao serviço de pesquisa. No momento, essa propriedade suporta apenas a chave word_connector. Use a propriedade word_connector definida como AND para pré-anexar cada palavra no termo de pesquisa com +. Número
defaultAttachmentLabel

O label padrão a ser usado para a ação de URL do cartão de resultados vinculada a um anexo sempre que o anexo não tiver um nome para exibição configurado. Quando usado, ele é anexado por um número de índice. Por exemplo, se o segundo anexo não tiver um nome para exibição, o label do anexo padrão será anexado com 2.

O padrão é Download.

Número
locale O padrão é o valor da variável profile.locale.

Para serviços de integração de conhecimento multiinterfacetado do Oracle B2C Service, o código de localidade ISO ou BCP de cinco caracteres que especifica qual interface usar para executar a pesquisa (exemplo: en_GB). Se não houver uma interface que suporte a localidade, a interface padrão será usada. Consulte Implementar Pesquisa de Conhecimento Multilíngue.

Para o Oracle Fusion Service, ele extrai os artigos que estão associados à localidade especificada. Se não houver artigos correspondentes para a localidade, ele retornará noResult.

No
noResultText

O texto a ser gerado quando nenhum resultado de pesquisa estiver disponível.

O padrão é o texto da entrada do pacote de recursos KnowledgeSearch - noResultText

No
resultLinkLabel

O label a ser usado para a ação de URL (botão) do cartão de resultados que vincula à versão Web das informações.

O padrão é o texto da entrada do pacote de recursos KnowledgeSearch - resultLinkLabel

Se você definir essa propriedade como ${r""}, o botão de link de resultado não será exibido e o texto completo será gerado. Isso não é recomendado se você tiver artigos muito longos que seriam difíceis de ler em um widget de habilidade de tamanho normal.

No
resultSizeLimit

O número máximo de resultados a serem exibidos.

O padrão é 10.

No
resultVersion

Somente Oracle B2C Service: A versão preferencial a ser retornada quando há várias versões para um resultado.

Você pode definir essa propriedade como Answer ou Special Response.

Você pode aproveitar respostas especiais para exibir saída especificamente personalizada para conversas de chat, em vez de páginas web.

A versão padrão é Answer. O padrão pode ser alterado em uma release posterior.

No
resultVersionExclusive

Somente Oracle B2C Service: Especifica se somente os resultados disponíveis na versão preferencial devem ser exibidos.

Quando false, ele inclui primeiro todas as respostas correspondentes disponíveis com a versão preferencial (resultVersion). Se o número de respostas incluídas for menor que o limite, ele continuará a incluir respostas na versão não preferencial até que o limite seja atingido.

O padrão é false.

No
searchLinkLabel

Oracle B2C Service: O label a ser usado para a ação de payload da mensagem do cartão que está vinculada à página Web com a lista completa de resultados da pesquisa.

Oracle Fusion Service: O label a ser usado para a ação de carga útil da mensagem do cartão vinculada à página de pesquisa inicial.

Se esta propriedade não for definida, o payload da mensagem do cartão não exibirá a ação.

No
searchPrelude

O texto a ser gerado antes que o resultado da pesquisa seja exibido.

Se essa propriedade não for definida, o texto da entrada do pacote de recursos KnowledgeSearch - searchPrelude será gerado.

Se você não quiser que o prelúdio de pesquisa seja exibido, defina essa propriedade como ${r""}.

No
searchServiceName O nome da integração de pesquisa de conhecimento conforme configurado em Definições. Sim
searchTerm O texto a ser usado como o termo de pesquisa para a chamada de pesquisa de conhecimento. Um termo de pesquisa é obrigatório para o Oracle Fusion Service Knowledge Management. Para o Oracle B2C Service Knowledge Foundation, ele retornará os artigos mais populares se nenhum termo de pesquisa for fornecido.

Para técnicas de termo de pesquisa, consulte Usar o Componente de Pesquisa de Conhecimento.

Sim

System.KnowledgeSearch Transições

Ação Descrição
resultSent A pesquisa retornou pelo menos um resultado.
noResult Não houve resultados para o termo de pesquisa.
serverError Ocorreu um erro no servidor do serviço de pesquisa de conhecimento durante a chamada, como uma falha de erro do servidor ou uma falha de erro inesperada.

Quando esse erro ocorre, a mensagem de erro é armazenada em system.state.<state-name>.serverError.message.

Exemplo: Associar Perguntas Relacionadas a um Termo de Pesquisa em um Fluxo de Caixas de Diálogo YAML

O diagrama a seguir ilustra como implementar o método de estado único se seu fluxo de caixas de diálogo for criado no modo YAML. 1) Use uma variável de contexto de mapa para associar as intenções de conhecimento aos termos de pesquisa. 2) Defina cada intenção de conhecimento ação no estado Intent para fazer a transição para um fluxo de dados que usa o mapa para definir a variável de contexto searchTerm como o termo de pesquisa da intenção. 3) Em seguida, faça a transição para um estado que pesquisa o valor searchTerm na base de conhecimento.

Veja a seguir a descrição da ilustração kf-assoc-intent-term.png
Descrição da ilustração kf-assoc-intent-term.png

Veja um exemplo de fluxo de caixas de diálogo em que há intenções individuais para cada resposta da base de conhecimento.

context:
  variables:
    iResult: "nlpresult"
    intentName: "string"
    searchTerm: "string"
    searchTerms: "map"
    someVariable: "string" # For the reset state

states:

  #
  # Set search term for each knowledge intent
  #

  setSearchTerms:
    component: "System.SetVariable"
    properties:
      variable: "searchTerms"
      value:
        knowledge.Shipping Return Costs: "Shipping Return Costs"
        knowledge.Locate Service Tag or Serial: "Locating Your Service Tag or Asset Serial Number"
        knowledge.Support Account: "My Support Account"
        knowledge.Product Registration: "How do I register my product?" # (1)
        knowledge.Noncontiguous Delivery Time: "What is the delivery time to Alaska, Hawaii and the U.S. Territories?"
        knowledge.Return Policy: "What is your return policy?"
    transitions:
      next: "intent"
  
  intent:
    component: "System.Intent"
    properties:
      variable: "iResult"
    transitions:
      actions:
        system.Greeting: "welcome"
        system.Unsatisfactory Response: "transferToAgent"
        system.Request Agent: "transferToAgent"
        knowledge.Shipping Return Costs: "startIntentKnowledgeSearch"
        knowledge.Locate Service Tag or Serial: "startIntentKnowledgeSearch"
        knowledge.Support Account: "startIntentKnowledgeSearch"
        knowledge.Product Registration: "startIntentKnowledgeSearch" # (2)
        knowledge.Noncontiguous Delivery Time: "startIntentKnowledgeSearch"
        knowledge.Return Policy: "startIntentKnowledgeSearch"
        unresolvedIntent: "genericKnowledgeSearch"

  #
  # Start knowledge search for a knowledge intent's search term
  # based on searchTerms context variable
  # 
  # First, reset variables
  #
  
  startIntentKnowledgeSearch: # (2)
    component: "System.ResetVariables"
    properties:
      variableList: "searchTerm, intentName"
    transitions:
      next: "setIntentName"
      
  # 
  # Set the intentName context variable
  #
  
  setIntentName:     
    component: "System.SetVariable"
    properties:
      variable: "intentName"
      value: "${iResult.value.intentMatches.summary[0].intent}"
    transitions:
      next: "setSearchTerm"      
    
  # 
  # Get the search term to use for the intent
  #
  
  setSearchTerm:
    component: "System.SetVariable"
    properties:
      variable: "searchTerm"
      value: "${searchTerms.value[intentName.value]}"
    transitions:
      next: "knowledgeSearchForGivenSearchTerm" # (3)            
      
  # 
  # This state searches for the searchTerm variable's value
  #
  
  knowledgeSearchForGivenSearchTerm:   
    component: "System.KnowledgeSearch"
    properties:
      # Set to the name of the search service that is configured in Settings
      searchServiceName: "KnowledgeSearch"
      searchTerm: "${searchTerm.value}" # put the search term here (3)
      # searchPrelude: Optional property. If missing, there's no search prelude.      
      resultSizeLimit: 1 # Change to how many articles to show. 
      # resultVersion: Optional property. Defaults to "Answer".
      # resultVersionExclusive: Optional property. Defaults to false.
      resultLinkLabel: "Show More"
      # defaultAttachmentLabel: Optional property. Defaults to "Download"
      searchLinkLabel: "Search for Similar Answers"
      noResultText: >
        I don't have an answer for that. Try rephrasing your question 
        (or you can ask to speak to a live agent).
      # cardLayout: Optional property. Defaults to "horizontal"
    transitions:
      actions:
        resultSent: "offerMoreHelp"
        noResult: "reset"
        serverError: "handleSearchServerProblem"
      error: "handleSearchError"
      next: "reset"    

  #
  # This state is called after knowledge search returns its results.
  #
  
  offerMoreHelp:
    component: "System.Output"
    properties:
      text: > 
        You can ask me another question if there's something 
        else that I can help you with.
    transitions:
      return: "offerMoreHelp"

  #
  # This state is called when there's a problem accessing the knowledge base such
  # as a server error fault or an unexpected error fault. When this error occurs,
  # the error message is stored in system.state.<state-name>.serverError.message. 
  # 
  
  handleSearchServerProblem:
    component: "System.Output"
    properties:
      text: >
        I'm not able to get an answer for that question. Let me know 
        if there's anything else I can help you with.
    transitions:
      return: "handleSearchServerProblem"      
  
  #
  # This state is called when there's a problem using the knowledge search component
  # such as when there's a problem with the knowledge search integration configuration
  # 
  
  handleSearchError:
    component: "System.Output"
    properties:
      text: >
        Oops, my answer mechanism for that isn't working properly.
        You can ask a different question or ask to speak to an agent?
    transitions:
      return: "handleSearchError"      

  #
  # This state ends the conversation
  #
  
  reset:
    component: "System.SetVariable"
    properties:
      variable: "someVariable"
      value: "x"
    transitions:
      return: "reset"

Exemplo: Utilizar Declaração do Usuário como Termo de Pesquisa

O exemplo a seguir mostra como definir o searchTerm como a declaração do usuário em uma habilidade de caixa de diálogo YAML. Para uma habilidade de caixa de diálogo visual, use ${skill.system.nlpresult.value.query}.

context:
  variables:
    iResult: "nlpresult"
    someVariable: "string" # For the reset state

states:

  intent:
    component: "System.Intent"
    properties:
      variable: "iResult"
    transitions:
      actions:
        system.Greeting: "welcome"
        system.Unsatisfactory Response: "transferToAgent"
        ...
        unresolvedIntent: "genericKnowledgeSearch"
  
  #
  # This state searches the knowledge base with the user input as the search term.
  #

  genericKnowledgeSearch: 
    component: "System.KnowledgeSearch"
    properties:
      # Set to the name of the search service that is configured in Settings
      searchServiceName: "KnowledgeSearch"
      searchTerm: "${iResult.value.query}"
      searchPrelude: "I don't know the answer offhand. Let's see what articles we have..."      
      resultSizeLimit: 3 # Change to how many articles to show. Defaults to 10.
      # resultVersion: Optional property. Defaults to "Answer".
      # resultVersionExclusive: Optional property. Defaults to false.
      resultLinkLabel: "Show More"
      # defaultAttachmentLabel: Optional property. Defaults to "Download"
      searchLinkLabel: "Open Page with All Answers"
      noResultText: >
        I couldn't find any articles about that. Try rephrasing your 
        question (or you can ask to speak to a live agent).
      # cardLayout: Optional property. Defaults to "horizontal"
    transitions:
      actions:
        resultSent: "offerMoreHelp"
        noResult: "reset"
        serverError: "handleSearchServerProblem"
      error: "handleSearchError"
      next: "reset"

  #
  # This state is called after knowledge search returns its results.
  #
  
  offerMoreHelp:
    component: "System.Output"
    properties:
      text: > 
        You can ask me another question if there's something 
        else that I can help you with.
    transitions:
      return: "offerMoreHelp"

  #
  # This state is called when there's a problem accessing the knowledge base such
  # as a server error fault or an unexpected error fault. When this error occurs,
  # the error message is stored in system.state.<state-name>.serverError.message. 
  # 
  
  handleSearchServerProblem:
    component: "System.Output"
    properties:
      text: >
        I'm not able to get an answer for that question. Let me know 
        if there's anything else I can help you with.
    transitions:
      return: "handleSearchServerProblem"      
  
  #
  # This state is called when there's a problem using the knowledge search component
  # such as when there's a problem with the knowledge search integration configuration
  # 
  
  handleSearchError:
    component: "System.Output"
    properties:
      text: >
        Oops, my answer mechanism for that isn't working properly.
        You can ask a different question or ask to speak to an agent?
    transitions:
      return: "handleSearchError"      

  #
  # This state ends the conversation
  #
  
  reset:
    component: "System.SetVariable"
    properties:
      variable: "someVariable"
      value: "x"
    transitions:
      return: "reset"

System.AgentTransfer

Use o componente System.AgentTransfer em assistentes digitais DA-as-agent para transferir a conversa de volta para o serviço de chat. A conversa será roteada para um agente ao vivo de acordo com as regras de chat configuradas no serviço de chat.

Observação

Este tópico abrange o uso desse componente no modo YAML. Para obter informações sobre como usá-lo no Visual Flow Designer, consulte Transferência do Agente.

Esse componente se destina a conversas originadas em um chat de serviço, conforme descrito em O Digital Assistant as Agent Framework em Ação. Para conversas originadas na habilidade, use System.AgentConversation.

Veja um exemplo de como usar esse componente para transferir a conversa de volta para o serviço de chat.

  transferToAgent:
    component: "System.AgentTransfer"
    properties:
      maxEngagementsInQueue: "8"
      maxWaitSeconds: "300"
      waitingMessage: "Let me see if a human agent is available to help you. Hold tight."
      rejectedMessage: "No agents are available at this time. Please try again later."
      errorMessage: "We're unable to transfer you to a human agent because there was a system error."
    transitions:
      actions:
        accepted: "reset"
        rejected: "handleRejected"
        error: "offerMoreHelp"
      next:
        "reset"

Dica:

Em habilidades com a versão 21.04 e mais recente da plataforma, os valores padrão das propriedades acceptedMessage, errorMessage, rejectedMessage e waitingMessage são armazenados no pacote de recursos da habilidade. Para alterar um padrão, abra a página Pacote de Recursos da habilidade, clique em Ícone de Pacotes de Recursos, selecione a guia Configuração e altere a mensagem da chave AgentTransfer - <nome da propriedade>. Se você usar o pacote de recursos da habilidade para alterar a mensagem padrão, não será necessário incluir a propriedade de mensagem no componente, a menos que deseje substituir o padrão.
Propriedade Descrição 0brigatório?
agentStatusVariable O nome da variável de contexto do tipo mapa a ser usado para armazenar as informações de status de disponibilidade do agente. Nenhuma informação é armazenada se a propriedade não for especificada. Para referenciar uma variável de mapa, use uma expressão de valor como esta: ${<mapVariableName>.value.<key>}. Por exemplo, agentStatus.value.expectedWaitMinutes.

Para saber mais sobre os valores retornados nessa variável, consulte System.AgentTransferCondition.

No
allowTransferIf Especifica as condições em que a habilidade deve transferir a sessão de chat.
  • agentsAreRequestingNewEngagements: (padrão) Para agentes do Oracle B2C Service que devem obter chats (solicitar novas participações), esse é o conjunto mais restritivo de condições, e o usuário não precisa esperar muito tempo para falar com um agente. A habilidade só tentará transferir a conversa se houver agentes que solicitaram novas participações. Em todos os outros casos, essa opção tem o mesmo comportamento que agentSessionsAreAvailable. Não use esta opção forOracle Chat do Fusion Service, pois o total de agentes do Oracle Fusion Service que solicitam novos engajamentos é sempre 0.
  • agentSessionsAreAvailable: A habilidade tenta transferir a conversa se algum dos agentes disponíveis não tiver atingido o número máximo de chats que eles podem ter de uma vez. O usuário pode ter que esperar se os agentes estiverem envolvidos em conversas de longa duração ou estiverem fazendo algum acompanhamento pós-chat.
  • agentsAreAvailable: A habilidade tenta transferir a conversa se houver agentes on-line, independentemente de terem atingido seu número máximo de chats ou de estarem solicitando novas participações. Com essa opção, os usuários podem ter longas esperas.

Se as condições especificadas não forem atendidas, a ação rejected ocorrerá.

No
customProperties Um mapa que contém informações a serem transmitidas ao serviço. Consulte Transmitir Informações ao Serviço. No
errorMessage A mensagem que é mostrada ao usuário quando ocorre um erro do sistema ao transferir a sessão de chat para um agente. O padrão é We were unable to transfer you because there was a system error. Você pode definir a propriedade como uma string vazia ou vazia para suprimir a saída da mensagem. No
maxEngagementsInQueue O número máximo permitido de participações aguardando na fila de destino. Quando a solicitação de chat é enviada, o serviço de chat responde com o número atual de participações aguardando na fila. Se o valor exceder maxEngagementsInQueue, a ação rejected ocorrerá. O padrão é -1, o que significa que não há limite de participação.

Observe que, para o Chat do Oracle Fusion Service, a resposta é sempre 0, portanto, essa propriedade não tem valor para o Oracle Fusion Service.

No
maxWaitSeconds O número máximo de segundos de espera estimados permitidos. Quando o serviço de chat recebe a solicitação de transferência, ele responde com o tempo de espera estimado. Se esse valor exceder maxWaitSeconds, a ação rejected ocorrerá. O padrão dessa propriedade é -1, o que significa que não há tempo máximo de espera. Quando definido como -1, o assistente digital transfere o usuário para um agente humano independentemente do tempo de espera estimado.

Observe que a ação rejected se baseia no tempo de espera estimado e não no tempo de espera real. Depois que a conversa é transferida, o assistente digital não tem controle sobre a conversa, nem tem acesso a informações sobre ela. Portanto, é possível que o tempo de espera real exceda o tempo de espera estimado.

No
rejectedMessage A mensagem mostrada aos usuários sempre que ocorre uma das seguintes situações:
  • As condições allowTransferIf não foram atendidas.
  • O tempo de espera estimado excede maxWaitSeconds.
  • O número de participações na fila excede maxEngagementsInQueue.
O padrão é Agent rejected. Você pode definir a propriedade como uma string vazia ou vazia para suprimir a saída da mensagem.
No
waitingMessage A mensagem mostrada aos usuários quando eles são transferidos para uma fila. O padrão é Agent chat session established. Waiting for agent to join. Você pode definir a propriedade como uma string vazia ou vazia para suprimir a saída da mensagem. Número

Esse componente pode retornar as seguintes ações:

Ação Descrição
accepted A transição accepted é definida quando o chat é transferido com sucesso para uma fila.

Observe que depois que uma solicitação de chat é aceita, a conversa deve terminar com return. Por exemplo, você pode navegar até um estado que gera uma string (que não é vista pelo usuário) ou define uma variável.

    transitions:
      actions:
        accepted: "reset"
        rejected: "handleRejected"
        error: "offerMoreHelp"
      next: "reset"
rejected A transição rejected é definida quando ocorre uma das seguintes situações:
  • As condições allowTransferIf não foram atendidas.
  • O tempo de espera estimado excede maxWaitSeconds.
  • O número de participações na fila excede maxEngagementsInQueue.
error A transição error é definida quando há um erro do sistema que impede a transferência para um agente humano.

Exemplo: Transferir para um Agente Humano

Este é um exemplo de fluxo de caixas de diálogo que é transferido para um agente quando o cliente pede para falar com um agente:

metadata:
  platformVersion: "1.1"
main: true
name: "AutomatedAgentConversation"
context:
  variables:
    iResult: "nlpresult"
    someVariable: "string"
states:
  intent:
    component: "System.Intent"
    properties:
      variable: "iResult"
    transitions:
      actions:
        ...
        system.Unsatisfactory Response: "transferToAgent"
        system.Request Agent: "transferToAgent"
        ...
  
  #
  # This state tries to transfer the user to another agent when the user explicitly requests for it.
  #
  transferToAgent:
    component: "System.AgentTransfer"
    properties:
      maxWaitSeconds: "300"
      waitingMessage: "I'm transferring you to a human agent. Hold tight."
      rejectedMessage: "I wasn't able to transfer you to a human agent. Please try again later."
      errorMessage: "We're unable to transfer you to a human agent because there was a system error."
    transitions:
      actions:
        accepted: "reset"
        rejected: "handleRejected"
        error: "offerMoreHelp"
      next: "reset"
  #
  # This state is called when an agent transfer is rejected. 
  # It lets the customer know they can ask for something else.
  # 
  handleRejected:
    component: "System.Output"
    properties:
      text: "Meanwhile, let me know if there's anything else I can help you with."
    transitions:
      return: "handleRejected"
  
  #
  # This state is called when an agent transfer encounters a system error. 
  # It lets the customer know they can ask for something else.
  #
  offerMoreHelp:
    component: "System.Output"
    properties:
      text: > 
        You can ask me another question if there's something 
        else that I can help you with.
    transitions:
      return: "offerMoreHelp"
      
  #
  # This state ends the conversation with a return transition for insights purposes, 
  # after the user has been transferred to another agent.
  #
  reset:
    component: "System.SetVariable"
    properties:
      variable: "someVariable"
      value: "x"
    transitions:
      return: "reset"

Exemplo: Transmitir Informações ao Serviço

Ao transferir uma conversa de um assistente digital para um agente ao vivo, você pode usar propriedades personalizadas no componente System.AgentTransfer para transmitir essas informações.

Esta é a estrutura do Oracle B2C Service:


      customProperties:
        - name: 
          value: 
          type:

A propriedade type é obrigatória para campos personalizados; caso contrário, é opcional.

Esta é a estrutura do Oracle Fusion Service:


      customProperties:
        - name: 
          value:

Veja um exemplo de definição customProperties para o Oracle Fusion Service:

  doTransfer:
    component: "System.AgentTransfer"
    properties:
      maxWaitSeconds: "300"
      allowTransferIf: "agentSessionsAreAvailable"
      # Example of passing a custom property to Oracle Fusion
                                Service      
      customProperties:
        # This is a checkbox custom field in the Universal Work Object.
        # Checkboxes take the value of Y (selected) or N (unselected).
        - name: "TriagedByODA_c"
          value: "Y"
      acceptedMessage: "The conversation has been transferred to a live agent."
      waitingMessage: "I'm transferring you to a human. Hold tight"
      rejectedMessage: "Looks like no one is available. Please try later"
      errorMessage: "We're unable to transfer you to a live agent because there was a system error."
    transitions:
      actions:
        accepted: "reset"
        rejected: "handleRejected"
        error: "offerMoreHelp"
      next: "reset"

Dica:

Para o Oracle Fusion Service, a avaliação de regras é interrompida na primeira regra em que todas as condições são atendidas. Quando você configurar suas regras, certifique-se de que a conversa transferida não seja roteada de volta para o agente do assistente digital. No exemplo doTransfer, a propriedade personalizada TriagedByODA_c é definida como Y e as regras podem usar essa propriedade personalizada para garantir que, quando definida como Y, a conversa não seja roteada para o agente do assistente digital. (Para Oracle B2C Service, a configuração Mudar Estado e parar determina o roteamento.)

System.AgentTransferCondition

Você pode usar o componente System.AgentTransferCondition nos assistentes digitais DA-as-agent para determinar se os agentes estão disponíveis e, em caso afirmativo, o tempo de espera esperado.

Observação

Este tópico abrange o uso desse componente no modo YAML. Para obter informações sobre como usá-lo no Visual Flow Designer, consulte Condição de Transferência do Agente.

Você usa as propriedades do componente para especificar as condições de transferência e retorna uma ação que indica se as condições foram atendidas. Além disso, define os valores da variável de mapa de contexto nomeada da seguinte forma:

queueId (integer, optional): The engagement queue ID,
expectedTotalWaitSeconds (integer, optional): Expected wait time in the queue in seconds
        ( -1 if there's inadequate information, zero or greater otherwise ).,
expectedWaitSeconds (integer, optional): The number representing the "ss" segment of the expected wait time of format mm:ss 
        ( -1 if there's inadequate information, zero or greater otherwise ).,
expectedWaitMinutes (integer, optional): The number representing the "mm" segment of the expected wait time of format mm:ss 
        ( -1 if there's inadequate information, zero or greater otherwise ).,
availableAgentSessions (integer, optional): Total number of sessions available across all agents.,
totalAvailableAgents (integer, optional): Total number of agents whose status is available.,
totalUnavailableAgents (integer, optional): Total number of agents whose status is unavailable.,
totalAgentsRequestingNewEngagement (integer, optional): Total number of agents who are available and have capacity.,
outsideOperatingHours (boolean, optional): True if outside operating hours. False if inside operating hours.,
engagementsInQueue (integer, optional): The number of engagements currently in the queue.,
sessionId (string, optional): The session ID.,
clientId (integer, optional): The client ID.

Veja um exemplo de como usar esse componente para descobrir se os agentes estão disponíveis, relatar o tempo de espera e permitir que os usuários cancelem a solicitação de transferência se não quiserem esperar tanto tempo.

  handleAgentRequest:
    component: "System.CommonResponse"
    properties:
      keepTurn: true
      metadata:
        responseItems:        
        - type: "text" 
          text: "I understand. Give me a moment while I see who might be available to help you."
    transitions:
      next: "evaluateAgentTransferCondition"

  ############################
  # Agent Transfer
  ############################  

  # See if there are any agents available 
  
  evaluateAgentTransferCondition:
    component: "System.AgentTransferCondition"
    properties:
      maxWaitSeconds: 300
      maxEngagementsInQueue: 20
      allowTransferIf: "agentsAreAvailable"
      agentStatusVariable: "agentStatus"
    transitions:
      actions:
        conditionsMet: "askIfWillWait"
        conditionsNotMet: "handleRejected"
        error: "handleTransferError"
      next: "done"
            
  askIfWillWait:
    component: "System.CommonResponse"
    properties:
      processUserMessage: true
      metadata:
        responseItems:
          - type: "text"
            text:  "${rb('promptTextForTransferDecision','minutes,seconds',agentStatus.value.expectedWaitMinutes,agentStatus.value.expectedWaitSeconds)}"
            separateBubbles: true
            actions:
              - label: "Yes, I'll wait"
                type: "postback"
                keyword: "yes"
                payload:
                  action: "yes"
                name: "Yes"
              - label: "No, nevermind"
                keyword: "no"
                type: "postback"
                payload:
                  action: "no"
                name: "No"
    transitions:
      actions:
        yes: "transferToAgent"
        no: "handleCancelled"
        textReceived: "intent"
      next: "handleCancelled"     
      
  # Perform the actual transfer
  #
  # The maxWaitSeconds, maxEngagementsInQueue, allowTransferIf,
  # and customProperties, if any, should match those used for 
  # System.AgentTransferCondition 
  
  transferToAgent:
    component: "System.AgentTransfer"
    properties:
      maxWaitSeconds: 300
      maxEngagementsInQueue: 20
      allowTransferIf: "agentsAreAvailable"
    transitions:
      actions:
        accepted: "done"
        rejected: "handleRejected"
        error: "handleTransferError"
      next: "handleTransferError"

Dica:

Aqui está uma definição de pacote de recursos sugerida que você pode usar para exibir o tempo de espera esperado:
This might take {minutes, plural,
     =-1 {}
     =0 {}
     =1 {1 minute and }
     other {# minutes and }
}{seconds, plural,
     =-1 {a while}
     =0 {{minutes, plural,
          =0 {a short wait time}
          other {0 seconds}
        }}
     =1 {1 second}
     other {# seconds}
} to connect. Are you willing to wait?
Propriedade Descrição 0brigatório?
agentStatusVariable O nome da variável de contexto do tipo mapa a ser usado para armazenar as informações de status de disponibilidade do agente. Nenhuma informação é armazenada se a propriedade não for especificada. Para referenciar uma variável de mapa, use uma expressão de valor como esta: ${<mapVariableName>.value.<key>}. Por exemplo, agentStatus.value.expectedWaitMinutes. No
allowTransferIf Especifica o conjunto base de condições que devem ser atendidas.
  • agentsAreRequestingNewEngagements: (padrão) Para agentes B2C que devem extrair chats (solicitar novos engajamentos), requer que os agentes tenham extraído chats. Em todos os outros casos, essa opção tem o mesmo comportamento que agentSessionsAreAvailable.
  • agentSessionsAreAvailable: Requer que os agentes estejam solicitando chats.
  • agentsAreAvailable: Requer que pelo menos um agente esteja ativo, independentemente de ter atingido o número máximo de chats ou de estar solicitando novos envolvimentos.

Se as condições especificadas não forem atendidas, a ação conditionsNotMet ocorrerá.

No
customProperties Um mapa que contém informações a serem transmitidas ao serviço. Consulte Transmitir Informações ao Serviço. Essa propriedade é suportada na versão 21.04 e mais recente. No
errorMessage A mensagem mostrada ao usuário quando o Digital Assistant apresenta problemas com o serviço de chat do agente. O padrão é We were unable to check the agent transfer conditions because there was a system error. Essa string padrão é armazenada no pacote de recursos de configuração na chave systemComponent_AgentTransferCondition_errorMessage. Você pode definir a propriedade como uma string vazia ou vazia para suprimir a saída da mensagem. No
maxEngagementsInQueue O número máximo permitido de participações aguardando na fila de destino. Quando a solicitação é enviada, o serviço de chat responde com o número atual de participações aguardando na fila. Se o valor exceder maxEngagementsInQueue, a ação conditionsNotMet ocorrerá. O padrão é -1, o que significa que não há limite de participação. No
maxWaitSeconds O número máximo de segundos de espera estimados permitidos. Quando o serviço de chat recebe a solicitação, ele responde com o tempo de espera estimado. Se esse valor exceder maxWaitSeconds, a ação conditionsNotMet ocorrerá. O padrão dessa propriedade é -1, o que significa que não há tempo máximo de espera.

Observe que a ação conditionsNotMet se baseia no tempo de espera estimado e não no tempo de espera real.

No

Esse componente pode retornar as seguintes ações:

Ação Descrição
conditionsMet A transição conditionsMet é definida quando está dentro do horário comercial e as condições maxWaitSeconds, maxEngagementsInQueue e allowTransferIf são atendidas.
conditionsNotMet A transição conditionsNotMet é definida quando ocorre uma das seguintes situações:
  • Está fora do horário comercial.
  • As condições allowTransferIf não foram atendidas.
  • O tempo de espera estimado excede maxWaitSeconds.
  • O número de participações na fila excede maxEngagementsInQueue.
error A transição error é definida quando há um problema com a conexão com o serviço de chat do agente durante a verificação de condições do agente.

Exemplo: Obter Disponibilidade do Agente e Tempo de Espera

Veja um exemplo de fluxo de caixas de diálogo que chama o componente, exibe o tempo de espera e dá ao usuário a oportunidade de cancelar sua solicitação de transferência.

  ############################
  # Agent Transfer
  ############################  

  # See if there are any agents available 
  
  evaluateAgentTransferCondition:
    component: "System.AgentTransferCondition"
    properties:
      maxWaitSeconds: 300
      maxEngagementsInQueue: 20
      allowTransferIf: "agentsAreAvailable"
      agentStatusVariable: "agentStatus"
    transitions:
      actions:
        conditionsMet: "askIfWillWait"
        conditionsNotMet: "setInsightsCustomMetricsConditionsNotMet"
        error: "handleTransferError"
      next: "done"
      
  # Measure when agents aren't available

  setInsightsCustomMetricsConditionsNotMet:
    component: "System.SetCustomMetrics"
    properties:
      dimensions: 
      - name: "Agent Transfer Choice"
        value: "No agents available for new chats"
    transitions:
      next: "handleRejected"      
                  
  askIfWillWait:
    component: "System.CommonResponse"
    properties:
      processUserMessage: true
      metadata:
        responseItems:
          - type: "text"
            text:  "${rb('promptTextForTransferDecision','minutes,seconds',agentStatus.value.expectedWaitMinutes,agentStatus.value.expectedWaitSeconds)}"
            separateBubbles: true
            actions:
              - label: "Yes, I'll wait"
                type: "postback"
                keyword: "yes"
                payload:
                  action: "yes"
                name: "Yes"
              - label: "No, nevermind"
                keyword: "no"
                type: "postback"
                payload:
                  action: "no"
                name: "No"
    transitions:
      actions:
        yes: "setInsightsCustomMetricsAgentTransferInitiated"
        no: "setInsightsCustomMetricsAgentTransferCancelled"
        textReceived: "intent"
      next: "handleCancelled"
      
  # Measure when user chooses to wait for transfer

  setInsightsCustomMetricsAgentTransferInitiated:
    component: "System.SetCustomMetrics"
    properties:
      dimensions: 
      - name: "Agent Transfer Choice"
        value: "User chose to wait"
    transitions:
      next: "transferToAgent"        
      
  # Measure when user chooses to not wait for transfer

  setInsightsCustomMetricsAgentTransferCancelled:
    component: "System.SetCustomMetrics"
    properties:
      dimensions: 
      - name: "Agent Transfer Choice"
        value: "User didn't want to wait"
    transitions:
      next: "handleCancelled"
      
  # Perform the actual transfer
  #
  # The maxWaitSeconds, maxEngagementsInQueue, allowTransferIf,
  # and customProperties, if any, should match those used for 
  # System.AgentTransferCondition 
  
  transferToAgent:
    component: "System.AgentTransfer"
    properties:
      maxWaitSeconds: 300
      maxEngagementsInQueue: 20
      allowTransferIf: "agentsAreAvailable"
    transitions:
      actions:
        accepted: "done"
        rejected: "handleRejected"
        error: "handleTransferError"
      next: "handleTransferError"
     
  ############################
  # All done
  ############################
                  
  done:
    component: "System.Output"
    properties:
      text: "Let me know if you need help on anything else."
    transitions:
      return: "done"  
      
  handleRejected:
    component: "System.CommonResponse"
    properties:
      keepTurn: true
      metadata:
        responseItems:        
        - type: "text"
          text: > 
            Unfortunately, none of my colleagues are currently available to assist with this.
            Still, we’d love to see this through for you. 
            Please feel free to reach us through email@example.com.
    transitions:
      next: "done"
      
  handleCancelled:
    component: "System.CommonResponse"
    properties:
      keepTurn: true
      metadata:
        responseItems:        
        - type: "text" 
          text: "OK. Maybe some other time. Please feel free to reach us through email@example.com."
    transitions:
      next: "done"
      
  handleTransferError:
    component: "System.CommonResponse"
    properties:
      keepTurn: true
      metadata:
        responseItems:        
        - type: "text" 
          text: "Unfortunately, we can't transfer you at this time. Please try again later."
    transitions:
      next: "done"
      
  ############################
  # Global error handler
  ############################
  
  globalErrorHandler:
    component: "System.Output"
    properties:
     text: "Sorry, we were unable to do the action that you requested." 
    transitions:
      next: "done"

O estado askIfWillWait usa uma entrada de pacote de recursos para formar a mensagem de tempo de espera, de modo que a mensagem faça sentido se o tempo é maior ou menor que um minuto e se um número é 0, um ou mais.

There are some experts online. But it might take {minutes, plural,
     =-1 {}
     =0 {}
     =1 {1 minute and }
     other {# minutes and }
}{seconds, plural,
     =-1 {a while}
     =0 {{minutes, plural,
          =0 {a very short wait time}
          other {0 seconds}
        }}
     =1 {1 second}
     other {# seconds}
} for one to join. Are you willing to wait?

Observe que este exemplo usa System.SetCustomMetrics para rastrear se os agentes estavam disponíveis e, em caso afirmativo, quantos usuários escolheram aguardar e quantos cancelaram a solicitação de transferência.

Componentes Live-Agent-Transfer

System.AgentInitiation

Se você quiser transferir a conversa de uma habilidade para um agente do Oracle B2C Service, adicione esse componente ao fluxo de caixas de diálogo para iniciar o handshake com o canal de integração do agente especificado pela propriedade agentChannel. Chame esse componente antes de chamar o componente System.AgentConversation.

Esse componente destina-se às conversas originadas na habilidade. Não use esse componente para conversas originadas no chat do Oracle B2C Service, conforme descrito em O Digital Assistant as Agent Framework em Ação.

Este é um exemplo de uso desse componente para iniciar o handshake com a instância do Oracle B2C Service definida pelo canal de integração do agente chamado ServiceCloudIntegration.

  agentInitiation:
    component: "System.AgentInitiation"
    properties:
      agentChannel: "ServiceCloudIntegration"
      nlpResultVariable: "iResult"
      waitingMessage: "Waiting for an agent..."
      rejectedMessage: "Agents are not available right now."
      resumedMessage: "We're connecting you to an agent..."
      errorMessage: "Oops! We're having system issues. We're sorry, but we can't connect you with an agent right now."
    transitions:
      actions:
        accepted: "agentConversation"
        rejected: "tryAgain"
        error: "tryAgain"
   agentConversation:
    component: "System.AgentConversation"
    properties:
      agentChannel: "ServiceCloudIntegration"
      nlpResultVariable: "iResult"
      exitKeywords: "bye, exit, take care, goodbye, quit"
      expiryMessage: "Your chat with the agent timed out."
      conclusionMessage: "Your chat with the agent has ended."
      waitMessage: "You are number ${system.message.messagePayload.position} in the queue. Your waiting time is ${(system.message.messagePayload.waitTime>60)?then('${(system.message.messagePayload.waitTime/60)?int} mins','${system.message.messagePayload.waitTime} seconds')}."
    transitions:
      next: "endPrompt"
      actions:
        agentLeft: "endPrompt"
        expired: "sessionExpired"
        error" "agentConversationError"

Dica:

Em habilidades com a versão 21.04 e mais recente da plataforma, os valores padrão das propriedades agentActionsMessage, errorMessage, rejectedMessage, resumedMessage e waitingMessage são armazenados no pacote de recursos da habilidade. Para alterar um padrão, abra a página Pacote de Recursos da habilidade, clique em Ícone de Pacotes de Recursos, selecione a guia Configuração e altere a mensagem da chave AgentInitiation - <nome da propriedade>. Se você usar o pacote de recursos da habilidade para alterar a mensagem padrão, não será necessário incluir a propriedade de mensagem no componente, a menos que deseje substituir o padrão.
Propriedade Descrição 0brigatório?
agentActions Uma lista de ações que o agente pode acionar para encerrar o chat e mover o fluxo para o estado definido para a ação de transição. Na console do representante de serviços ao cliente, essas ações são exibidas como comandos de barra quando a conversa do agente é iniciada, conforme mostrado neste exemplo:
Here are the available actions that you can send to transfer the conversation
back to the bot. Prepend the action with a forward slash (for example, /actionName).
/OrderPizza : Order Pizza : Order a pizza.
/ShowMenu : Show Menu : Show order options.

Os nomes das ações devem corresponder às propriedades actions do System.AgentConversation. Por exemplo, no estado agentInitiation a seguir, as entradas ShowMenu e OrderPizza na propriedade agentActions correspondem às ações definidas para o estado agentConversation:

  agentInitiation:
    component: "System.AgentInitiation"
    ...
    properties:
      agentChannel: "ServiceCloudIntegration"
      agentActions:
      - action: "OrderPizza"
        label: "Order Pizza"
        description: "Order a pizza."
      - action: "ShowMenu"
        label: "Show Menu"
        description: "Show order options. "
      …
  agentConversation:
    component: "System.AgentConversation"
    ...
    transitions:
      next: "terminatedWithoutAction"
      actions:
        ShowMenu: "ShowMenu"
        OrderPizza: "OrderPizza"

Você pode definir os elementos da lista agentActions de diversas maneiras:

  • Como lista de mapas, em que cada mapa deve conter uma propriedade de ação, uma propriedade de valor e uma propriedade de descrição opcional. Por exemplo :
          - action: "action1"
            label: "label1"
            description: "description1"
          - action: "action2" 
            label: "label2"
            description: "description2"
  • Como array JSON, em que cada objeto no array deve conter uma propriedade de ação, uma propriedade de valor e uma propriedade de descrição opcional. Por exemplo :
          [
          {action: "action1",
          label: "label1",
          description: "description1"},
          {action: "action2",
          label: "label2",
          description: "description2"}      
          ]
  • Como string de valores de ação delimitada por vírgulas. O label e a descrição equivalem ao valor da ação. Por exemplo :
    "action1, action2"
No
agentActionsMessage Se a propriedade agentActions estiver definida, a console do agente exibirá esse valor em vez da mensagem padrão. Por exemplo :

agentActionsMessage: "\nYou can terminate when done or send one of these actions.\n"

No
agentChannel Nomeia o canal de Integração do Agente. Esse valor, o nome do canal de Integração do Agente e a propriedade agentChannel definida para o componente System.AgentConversation devem corresponder. Sim
allowTransferIf Especifica as condições em que a habilidade deve transferir a sessão de chat. O componente usa o valor queueId para identificar a fila da qual obter as estatísticas. Verifique se as regras de chat irão realmente transferir a conversa para a fila identificada e não para alguma outra fila.
  • agentsAreRequestingNewEngagements: Esse é o conjunto de condições mais restritivo. A habilidade só tentará transferir a conversa se houver agentes que solicitaram novas participações (chats marcados) e foram designados à fila especificada ou se o servidor de chat enviar automaticamente chats para agentes, houver agentes disponíveis para receber os chats, não atingiram o número máximo de chats e foram designados à fila especificada. Com essa opção, o usuário não precisa esperar muito tempo para falar com o agente.
  • agentSessionsAreAvailable: A habilidade tentará transferir a conversa se houver agentes disponíveis que não atingiram o número máximo de chats e foram designados à fila especificada. O usuário pode ter que esperar se os agentes estiverem envolvidos em conversas de longa duração ou estiverem fazendo algum acompanhamento pós-chat.
  • agentsAreAvailable: A habilidade tentará transferir a conversa se houver algum agente on-line designado à fila especificada, independentemente de terem atingido seu número máximo de chats ou de estarem solicitando novas participações. Com essa opção, os usuários podem ter longas esperas.

Se a condição especificada não for atendida, o componente retornará rejected.

Ao incluir essa propriedade, inclua também a propriedade queueId.

Esta propriedade só está disponível em instâncias do Oracle Digital Assistant provisionadas no Oracle Cloud Infrastructure (às vezes chamadas de infraestrutura de nuvem Geração 2).

Número
chatResponseVariable Nomeia a variável de mapa que armazena as informações de resposta do agente. Depois que o componente System.AgentInitiation estabelece conexão com sucesso, o mapa contém as seguintes propriedades:
{
  "sessionID": "string", // agent session id

  "completedSurveyID": {
    "id": "int"
  },

  "engagementID": { // survey id
    "id": "int"
  },

  "cancelledSurveyID": {
    "id": "int"
  }
}
Número
customProperties Um mapa que contém o ID do incidente, a interface, o contato ou os campos personalizados (ou uma combinação deles) a serem transmitidos ao serviço. Para referenciar uma variável de mapa, use uma expressão de valor como esta: ${mapVariableName.value}. Consulte Transmitir Informações do Cliente a um Chat ao Vivo. Número
errorMessage A mensagem a ser exibida quando há um problema ao estabelecer uma conexão com o Oracle B2C Service. Por exemplo, a senha no canal de Integração do Agente não é mais válida ou há um problema com o servidor. Número
nlpResultVariable A variável que armazena a mensagem de consulta do cliente. Número
rejectedMessage Uma mensagem exibida se o handshake AgentInitiation foi rejeitado, como se estivesse fora das horas operacionais configuradas. Por exemplo :

rejectedMessaage: "Sorry, no agents are available at this time."

Número
resumedMessage Uma mensagem (como, Só um minuto... estamos conectando você a um agente.) que é exibida quando o chat do cliente com o representante de serviços ao cliente é retomado. A adição dessa propriedade impede que os clientes cujas solicitações já tenham sido enfileiradas recebam uma mensagem enganosa Retomando o chat com o agente quando solicitarem repetidamente um chat ao vivo. Número
subject A linha de assunto que é exibida no console do agente após a entrega à plataforma do agente. Por padrão, esta é a última mensagem do cliente armazenada na propriedade nlpResultVariable, mas você também pode definir isso usando uma variável estabelecida anteriormente na definição do fluxo de caixas de diálogo. Por exemplo, você pode definir uma variável de contexto do tipo string cujo valor é definido antes do componente System.AgentInitiation:

subject: "A customer needs help regarding ${context_variable.value}"

Número
queueId O ID da fila que o componente deve usar para determinar se a condição allowTransferIf especificada foi atendida. Esse deve ser o ID da fila para a qual as regras de chat do Oracle B2C Service rotearão essa conversa.

Essa propriedade será ignorada se a propriedade allowTransferIf não estiver presente.

Obrigatório quando a propriedade allowTransferIf está presente.
transcriptDateTimeFormat O formato da data e hora nas mensagens de transcrição de conversa encaminhadas ao agente. Consulte a classe Java DateTimeFormatter para obter os padrões válidos. Exemplo: dd/MM/yyyy HH:mm. O padrão é yyyy-mmm-ddThh:mm:ssZ. Número
transcriptTimezoneName O nome da IANA (Internet Assigned Numbers Authority) do fuso horário a ser usado para formatar a transcrição da conversa usando a propriedade transcriptDateTimeFormat. Exemplo: America/Sao_Paulo. O padrão é Europe/London. Se você não incluir a propriedade transcriptDateTimeFormat, essa propriedade será ignorada. No
waitingMessage Uma mensagem exibida enquanto os clientes aguardam a conexão com um agente. Por exemplo :

waitingMessage: "You’ve joined the chat session. An agent will be right with you.

No

System.AgentInitiation Transições

O componente System.AgentInitiation retorna as ações accepted, rejected e error. Essas ações podem apontar para outro estado, com a ação accepted geralmente nomeando o estado para o componente System.AgentConversation:
  agentInitiation:
    component: "System.AgentInitiation"
    properties:
      agentChannel: "ServiceCloudIntegration"
      ...
    transitions:
      actions:
        accepted: "agentConversation"
        rejected: "noAgentsAvailable"
        error: "handshakeError"
Ação Descrição
accepted O handshake foi concluído com sucesso e o estado pode fazer a transição para o estado com o componente System.AgentConversation.
error Há um problema ao estabelecer uma conexão com o Oracle B2C Service. Por exemplo, a senha no canal de Integração do Agente não é mais válida ou há um problema com o servidor do Service Cloud.
rejected O Oracle B2C Service rejeitou a solicitação de conexão. Estes são alguns dos motivos para rejeitar uma solicitação de conexão:
  • Nenhum agente está disponível (requer propriedades allowTransferIf e queueId)
  • Está fora das horas operacionais configuradas
  • É um feriado
  • Ocorreu um problema com o servidor de chat.

Observe que, se você não definir allowTransferIf e queueId, a ação rejeitada não ocorrerá quando nenhum agente estiver disponível; em vez disso, a transferência permanecerá em uma condição de espera.

Exemplo: Tratar Rejeição de Inicialização do Agente e Erros do Sistema

Veja um exemplo de como tratar erros do sistema e as ações error e rejected.

  agentInitiation:
    component: "System.AgentInitiation"
    properties:
      agentChannel: "B2CServiceIntegration"
      nlpResultVariable: "iResult"
      waitingMessage: "Let me connect you with someone who can further assist you."
      resumedMessage: "Someone will be with you shortly."
      errorMessage: "Oops! We're having system issues and we can't connect you with an agent right now."
      rejectedMessage: "Unfortunately, no one's available right now."     
    transitions:
      actions:
        accepted: "agentConversation"
        rejected: "initiationRejected"
        error: "tryAgain"
      error: "agentInitiationSystemError"
  initiationRejected:
    component: "System.Output"
    properties:
      text: "Perhaps it's outside their working hours or it's a holiday."
    transitions:
      return: "initiationRejected"
  tryAgain:
    component: "System.Output"
    properties:
      text: "Please try again later."
    transitions:
      return: "tryAgain"
  agentInitiationSystemError:
    component: "System.Output"
    properties:
      text: "I seem to be having a connection problem. Can you please email email@example.com to let them know?"
    transitions:
      return: "done"

Exemplo: A Propriedade incidentID

context:
  variables:
    liveChatInfo: "map"
    customerTicketId: "int"
...
  setCustomFields:
    component: "System.SetVariable"
    properties:
      variable: "liveChatInfo"
      value:
        incidentID: "${customerTicketId}" # long value
  ...
  agentInitiation:
    component: "System.AgentInitiation"
    properties:
      ...
      customProperties: "${liveChatInfo.value}"

Exemplo: O Objeto customerInformation Padrão

Este exemplo define o contactID.

context:
  variables:
    liveChatInfo: "map"
    contactId: "int"
...
  setCustomFields:
    component: "System.SetVariable"
    properties:
      variable: "liveChatInfo"
      value:
        customerInformation:
          contactID:
            id: "${customerId}"
  ...
  agentInitiation:
    component: "System.AgentInitiation"
    properties:
      ...
      customProperties: "${liveChatInfo.value}"

Exemplo: O Objeto customerInformation Legado

Este exemplo define interfaceID e contactID.

Dica:

Como o WSDL especifica que interfaceID é do tipo NamedID, nós podíamos ter usado name: "myInterfaceName" em vez de id: id: "${interfaceId}".
context:
  variables:
    liveChatInfo: "map"
    interfaceId: "int"
    contactId: "int"
...
  setCustomFields:
    component: "System.SetVariable"
    properties:
      variable: "liveChatInfo"
      value:
        customerInformation:
          interfaceID:
            id:
              id: "${interfaceId}"
          contactID:
            id: "${customerId}"
  ...
  agentInitiation:
    component: "System.AgentInitiation"
    properties:
      ...
      customProperties: "${liveChatInfo.value}"

Exemplo: O Objeto customFields Padrão

context:
  variables:
    liveChatInfo: "map"
...
  setupCustomFields:
    component: "System.SetVariable"
    properties:
      variable: "liveChatInfo"
      value:
        customFields:
          - name: "c$text_field"        # text field
            type: "STRING"
            value: "SILVER"
          - name: "c$text_area"         # text area
            type: "STRING"
            value: "My package arrived but there were no contents in the box. Just bubble wrap."
          - name: "c$integer"           # integer
            type: "INTEGER"
            value: 21
          - name: "c$yes_no"  # yes/no (1=yes and 0=no)
            type: "BOOLEAN"
            value: 1
          - name: "c$date_field"        # date (yyyy-MM-dd'T'00:00:00. Use 0 for time)
            type: "DATE"
            value: "2020-02-04T00:00:00+00:00" 
          - name: "c$date_time"         # datetime (yyyy-MM-dd'T'HH:mm:ssXXX)
            type: "DATETIME"
            value: "2020-02-04T21:24:18+00:00" 
          - name: "c$menu"              # menu (no type property, you can pass the string or the ID for the value property)
            value: "12"
    transitions:
      ...
  ...
  agentInitiation:
    component: "System.AgentInitiation"
    properties:
      ...
      customProperties: "${liveChatInfo.value}"

Exemplo: O Objeto customFields Legado

context:
  variables:
    liveChatInfo: "map"
    skillType: "string"
...
  setupCustomFields:
    component: "System.SetVariable"
    properties:
      variable: "liveChatInfo"
      value:
        customerInformation: 
          interfaceID:
            id:
              id: 1     
        customFields:
# Text Field
          - name: "c$da_text_field"
            dataType: "STRING"
            dataValue:
              stringValue: "SILVER"
# Text Area
          - name: "c$da_text_area"
            dataType: "STRING"
            dataValue:
              stringValue: "This is a very long string that is more than 32 characters."
# Integer
          - name: "c$da_integer"
            dataType: "INTEGER"
            dataValue:
              integerValue: 21
# Menu
          - name: "c$da_menu"
            dataType: "NAMED_ID"
            dataValue: 
              namedIDValue:
                name: "Item 1"
# Instead of name, you can use
#                id:
#                  id: 1
#
# Yes/No
          - name: "c$da_is_from_skill"
            dataType: "BOOLEAN"
            dataValue:
              booleanValue: true
# Date (XML Schema Date)
          - name: "c$da_date"
            dataType: "DATE"
            dataValue:
              dateValue: "2019-10-26" 
# DateTime (XML Schema DateTime)
          - name: "c$da_datetime"
            dataType: "DATETIME"
            dataValue:
              dateTimeValue: "2019-10-26T21:32:52"               
    transitions:
      ...
  ...
  agentInitiation:
    component: "System.AgentInitiation"
    properties:
      ...
      customProperties: "${liveChatInfo.value}"

Exemplo: Montar o Objeto de Propriedades Personalizadas

Essas etapas descrevem como você pode declarar o objeto customProperties e definir seus vários valores.

Etapa 1: Declarar a Variável de Propriedades Personalizadas
No nó de contexto, defina uma variável de mapa para a propriedade customProperties no componente System.AgentInitiation. É um objeto JSON que pode conter as informações do cliente de bate-papo e os valores de campos personalizados. No seguinte exemplo, essa variável é declarada como liveChatInfo:
context:
  variables:
    size: "PizzaSize"
    type: "PizzaType"
    crust: "PizzaCrust"
    iResult: "nlpresult"
    interfaceId: "string"
    categoryId: "string"
    skillType: "string"
    liveChatInfo: "map"
Etapa 2: Definir os Valores para a Variável de Mapa customProperties
No nó de contexto, defina uma variável de mapa para a propriedade customProperties no componente System.AgentInitiation. É um objeto JSON que pode conter as informações do cliente de bate-papo e os valores de campos personalizados. No seguinte exemplo, essa variável é declarada como liveChatInfo:
context:
  variables:
    size: "PizzaSize"
    type: "PizzaType"
    crust: "PizzaCrust"
    iResult: "nlpresult"
    interfaceId: "string"
    categoryId: "string"
    skillType: "string"
    liveChatInfo: "map"
Etapa 3: Definir os Campos da Variável de Mapa customProperties
Se você definir os valores do mapa por meio de um componente personalizado ou do fluxo de caixas de diálogo, será necessário estruturar o objeto do mapa. Use os formatos de objeto padrão a menos que o canal de integração do agente tenha sido criado antes da versão 20.1 ou o canal estabeleça conexão com uma versão do Oracle B2C Service anterior à versão 19A. Veja aqui um exemplo do formato padrão:

  setLiveChatInfo:
    component: "System.SetVariable"
    properties:
      variable: "liveChatInfo"
      value:
        customerInformation: 
          categoryID:
            id: "${categoryId}"             
        customFields: 
          - name: "c$skilltype"
            type: "STRING"
            value: "${skillType}"
    transitions:
      next: "agentInitiation"
Etapa 4: Adicionar customProperties ao Componente System.AgentInitiation
Por fim, adicione a propriedade customProperties ao componente System.AgentInitiation e defina-a usando uma expressão que acesse o valor da variável de mapa.
  agentInitiation:
    component: "System.AgentInitiation"
    properties:
      subject: "A customer needs help regarding ${skillType}."
      agentChannel: "ServiceCloudIntegration"
      waitingMessage: "Let me connect you with someone who can further assist you."
      resumedMessage: "Please wait, someone will be with you shortly."
      rejectedMessage: "Sorry no one is available now."
      errorMessage: "We're sorry! We're having system issues and we can't connect you with an agent."
      customProperties: "${liveChatInfo.value}"
    transitions:
      actions:
        accepted: "agentConversation"
        rejected: "initiationRejected"
        error: "tryAgain"
  initiationRejected:
    component: "System.Output"
    properties:
      text: "Perhaps it's outside their working hours or it's a holiday."
    transitions:
      return: "tryAgain"
  tryAgain:
    component: "System.Output"
    properties:
      text: "Please try again later."
    transitions:
      return: "tryAgain"

System.AgentConversation

Use esse componente para transferir a conversa de uma habilidade para um agente ao vivo do Oracle B2C Service e para gerenciar o intercâmbio entre a habilidade e o agente ao vivo. Observe que você deve chamar o componente System.AgentInitiation para que possa usar esse componente.

O componente System.AgentConversation destina-se às conversas originadas na habilidade. Não use esse componente para conversas originadas no chat do Oracle B2C Service, conforme descrito em O Digital Assistant as Agent Framework em Ação.

Este é um exemplo de uso desse componente para transferir a conversa para a instância do Oracle B2C Service definida pelo canal de integração do agente chamado ServiceCloudIntegration.

  agentConversation:
    component: "System.AgentConversation"
    properties:
      agentChannel: "ServiceCloudIntegration"
      nlpResultVariable: "iResult"
      errorMessage: "Oops, we lost connection with the agent. If you need further help, please call customer support."
      exitKeywords: "bye, exit, take care, goodbye, quit"
      expiryMessage: "Your chat with the agent timed out"
      waitExpiryMessage: "The chat expired while waiting for an agent"
      conclusionMessage: "Your chat with the agent has ended."
      waitMessage: "You are number ${system.message.messagePayload.position} in the queue. Your waiting time is ${(system.message.messagePayload.waitTime>60)?then('${(system.message.messagePayload.waitTime/60)?int} mins','${system.message.messagePayload.waitTime} seconds')}."
    transitions:
      next: "endPrompt"
      actions:
        agentLeft: "endPrompt"
        expired: "sessionExpired"
        waitExpired: "expiredWhileWaiting"
        error: "handleConnectionError"
Propriedade Descrição 0brigatório?
agentChannel Nomeia o canal de Integração do Agente. Esse valor, o nome do canal de Integração do Agente e a propriedade agentChannel definida para o componente System.AgentInitiation devem corresponder. Sim
conclusionMessage Uma mensagem automatizada enviada ao cliente quando o usuário digita uma palavra-chave de saída, a ação agentLeft é acionada ou o agente encerra a conversa sem enviar uma das propriedades agentActions. Por exemplo, Your chat with the agent has ended. No
errorMessage A mensagem que o chat exibe se houver um problema com a conexão com o Oracle B2C Service.

A mensagem padrão é Chat session error. The reason is {cause}.

Esta propriedade só funciona com instâncias do Oracle Digital Assistant provisionadas no Oracle Cloud Infrastructure (às vezes chamadas de infraestrutura de nuvem Geração 2).

No
exitKeywords Uma lista separada por vírgulas de palavras de saída típicas usadas por um cliente para encerrar a conversa com o agente ao vivo. Por exemplo :

exitKeywords: "bye, exit, take care, goodbye, quit"

O valor da propriedade assume como padrão bye, take care, see you, goodbye.

No
expiryMessage Uma mensagem que é exibida quando a ação expired é acionada. A mensagem padrão é Chat session expired. Thanks for chatting with us.

Observe que o conclusionMessage não será gerado se o expiryMessage for gerado.

A mensagem de expiração não é gerada quando a conversa é concluída porque o USER_WAIT_QUEUE_TIMEOUT do Service Cloud foi excedido.

No
nlpResultVariable A variável nlpResultVariable que contém a mensagem de consulta do cliente. No
waitExpiryMessage A mensagem que é mostrada ao usuário quando o chat expira enquanto aguarda um agente. A mensagem padrão é The request for live chat expired while waiting for an agent. No
waitMessage Por padrão, depois que a transferência de conversa é iniciada, a habilidade exibe a mensagem de espera que o serviço de chat ao vivo envia para a habilidade, como a posição da fila e o tempo de espera. Use esta propriedade para personalizar a mensagem. Por exemplo :

waitMessage: "You are number ${system.message.messagePayload.position} in the queue. Your waiting time is ${(system.message.messagePayload.waitTime>60)?then('${(system.message.messagePayload.waitTime/60)?int} mins','${system.message.messagePayload.waitTime} seconds')}."

No

System.AgentConversation Transições

O componente System.AgentConversation pode acionar a ação expired, agentLeft, error ou waitExpired. Além disso, ele pode acionar qualquer ação da propriedade System.AgentInitiation do componente agentActions. Adicione também uma transição next, porque um cliente pode digitar uma das exitKeywords para sair do chat para que qualquer uma dessas ações possa ser acionada.


  agentConversation:
    component: "System.AgentConversation"
    properties:
      agentChannel: "ServiceCloudIntegration"
      nlpResultVariable: "iResult"
      exitKeywords: "bye, adios, take care, goodbye"
      ...
    transitions:
      next: "endPrompt"
      actions:
        agentLeft: "endPrompt"
        expired: "endPrompt"
        waitExpired: "endPrompt"
        error: "agentConversationError"
  ...
  endPrompt:
    component: "System.List"
    properties: 
      prompt: "Your session has ended. What would you like to do?"
      options: 
      - label: "Order a Pizza"
        value: "OrderPizza" 
      - label: "Nothing. I'm done here."
        value: "Finished" 
      autoNumberPostbackActions: true
    transitions:
      actions:
        OrderPizza: "resolvePizzaSize"
        Finished: "done"
...
      
    
Ação Descrição
agentActions Se o componente System.AgentInitiation tiver uma propriedade agentActions, esse componente deverá ter uma ação de transição para cada ação suportada que for especificada por agentActions.
agentLeft O agente encerrou a sessão sem usar uma ação de barra (por exemplo, /Order). Como alternativa, a sessão foi encerrada porque não houve atividade dentro do tempo especificado pela configuração CS_IDLE_TIMEOUT do Oracle B2C Service e essa configuração é inferior à definição Expiração da Sessão para o canal de integração do agente. Consulte a ação expired para obter mais informações.

Observe que esta ação não é retornada quando o usuário sai da conversa inserindo uma palavra-chave de saída. Nesse caso, o fluxo faz a transição para o estado nomeado pela transição next ou, se não houver transição next, para o próximo estado no fluxo.

error

Ocorreu um problema ao estabelecer conexão com o serviço de agente ao vivo.

Esta ação só funciona com instâncias do Oracle Digital Assistant provisionadas no Oracle Cloud Infrastructure (às vezes chamadas de infraestrutura de nuvem Geração 2).

expired

Se a definição CS_IDLE_TIMEOUT do Oracle B2C Service for igual ou superior à definição Expiração da Sessão para o canal de integração do agente, essa ação será acionada quando nem o usuário final nem o agente enviarem uma mensagem dentro do limite de expiração da sessão. Se a configuração CS_IDLE_TIMEOUT for inferior à configuração Expiração da Sessão para o canal de integração do agente e não houver atividade, o Oracle B2C Service encerrará o chat e a ação agentLeft será acionada.

Por padrão, a configuração CS_IDLE_TIMEOUT é de 10 minutos.

A ação expired não é retornada quando a conversa é concluída porque o USER_WAIT_QUEUE_TIMEOUT do Service Cloud foi excedido. Considere definir essa configuração com um valor alto, como 7200 segundos (2 horas).

Para exibir ou alterar as definições da instância do Oracle B2C Service, abra a Console do Desktop, clique em Navegação, clique no primeiro item de Configuração no menu e clique em Definições de Configuração. Em seguida, procure a definição na pasta Chat.

waitExpired A solicitação de chat expirou enquanto aguardava um agente. Isso acontece quando o tempo de espera excede o valor na definição USER_WAIT_QUEUE_TIMEOUT do cliente de chat.

Exemplo: Configurar o Fluxo de Caixas de Diálogo de Transferência para Agente

Neste exemplo, a intenção GetAgent foi treinada para compreender chamadas de pedido de socorro, como help me please!

intent:
    component: "System.Intent"
    properties:
      variable: "iResult"
    transitions:
      actions:
        OrderPizza: "resolvesize"
        CancelPizza: "cancelorder"
        GetAgent: "agentInitiation"
        unresolvedIntent: "agentInitiation"

Veja aqui as etapas básicas para configurar o fluxo de caixas de diálogo:

  1. Inicie a transferência para agente ao vivo:

    1. Adicione um estado para o componente System.AgentInitiation.

    2. Defina a propriedade agentChannel do estado com o nome do canal de Integração do Agente que você configurou para o sistema de agente ao vivo.

    Depois que o canal de Integração do Agente estabelece uma conexão e o Oracle B2C Service envia a solicitação de chat para a fila (isto é, após criar um ticket de ajuda), o componente System.AgentInitiation permite a transição para o próximo estado, que geralmente é definido para o componente System.AgentConversation (agentConversation no exemplo a seguir).
    
      agentInitiation:
        component: "System.AgentInitiation"
        properties:
          agentChannel: "ServiceCloudIntegration"
          nlpResultVariable: "iResult"
          waitingMessage: "Waiting for an agent..."
          rejectedMessage: "Agents are not available right now."
          resumedMessage: "We're connecting you to an agent..."
          errorMessage: "Oops! We're having system issues. We're sorry, but we can't connect you with an agent right now."
        transitions:
          actions:
            accepted: "agentConversation"
            rejected: "tryAgain"
            error: "tryAgain"
      tryAgain:
        component: "System.Output"
        properties:
          text: "Please try again later."
        transitions:
          return: "tryAgain"

    Dica:

    Os clientes podem solicitar repetidamente um bate-papo ao vivo, mesmo que suas solicitações já tenham sido enfileiradas na console de bate-papo do agente. Adicione uma propriedade resumedMessage ao estado System.AgentInitiation para impedir que esses clientes recebam uma mensagem enganosa Retomando o bate-papo com o agente.
  2. Adicione e configure o componente System.AgentConversation. Embora o mecanismo de caixa de diálogo esteja no estado definido para esse componente, a habilidade transmite as mensagens para frente e para trás entre o cliente e o agente. A habilidade atende às palavras-chave de saída na entrada do cliente, como bye. Quando a habilidade detecta uma dessas palavras-chave, o componente System.AgentConversation encerra a sessão de bate-papo ao vivo e aciona sua transição next.

    Veja aqui um exemplo:

      agentConversation:
        component: "System.AgentConversation"
        properties:
          agentChannel: "ServiceCloudIntegration"
          nlpResultVariable: "iResult"
          errorMessage: "Oops, we lost connection with the agent. If you need further help, please call customer support."
          exitKeywords: "bye, exit, take care, goodbye, quit"
          expiryMessage: "Your chat with the agent timed out."
          conclusionMessage: "Your chat with the agent has ended."
          waitMessage: "You are number ${system.message.messagePayload.position} in the queue. Your waiting time is ${(system.message.messagePayload.waitTime>60)?then('${(system.message.messagePayload.waitTime/60)?int} mins','${system.message.messagePayload.waitTime} seconds')}."
        transitions:
          next: "endPrompt"
          actions:
            agentLeft: "endPrompt"
            expired: "endPrompt"
            error: "endPrompt"
      endPrompt:
        component: "System.Output"
        properties:
          text: "Returning you to your bot."
        transitions:
          return: "endPrompt"

Exemplo: Obter Informações de Pesquisa

No exemplo a seguir que usa o formato padrão, o componente AgentConversation gera um link de pesquisa após o término da conversa do agente. O link inclui o ID da sessão e da participação do mapa que foi nomeado pela propriedade chatResponseVariable.

context:
  variables:
    agentSystemResponse: "map" # chat request response is stored in this variable.
    ...
states:
  ...
  agentInitiation:
    component: "System.AgentInitiation"
    properties:
      agentChannel: "B2CServiceIntegration"
      nlpResultVariable: "iResult"
      chatResponseVariable: "agentSystemResponse"  
    transitions:
      actions:
        accepted: "agentConversation"
        rejected: "tryAgain"
        error: "tryAgain"
  agentConversation:
    component: "System.AgentConversation"
    properties:
      agentChannel: "B2CServiceIntegration"
      nlpResultVariable: "iResult"
      exitKeywords: "bye, exit, take care, goodbye, quit"
      expiryMessage: "Your chat with the agent timed out."
      conclusionMessage: "Can you please fill out this survey: <PUT SURVEY URL HERE>?session=${agentSystemResponse.value.sessionId}&surveyid=${agentSystemResponse.value.engagementId}"
    transitions:
      next: "endPrompt"
      actions:
        agentLeft: "endPrompt"
        expired: "sessionExpired"
        error: "agentConversationError"

Exemplo: Transferir o Chat para uma Fila Específica do Oracle B2C Service

  1. Se não tiver feito isso ainda, no nó de contexto, defina uma variável de mapa a ser usada com a propriedade customProperties do componente System.AgentInitiation. Por exemplo :

    context:
      variables:
        greeting: "string"
        name: "string"
        liveChatInfo: "map"
    
  2. Defina os campos da variável de mapa.

    Aqui está um exemplo do formato padrão para canais de integração do agente que foram criados na versão 20.01 ou posterior e que estabelecem conexão com o Oracle B2C Service versão 19A ou posterior.

      setLiveChatInfo:
        component: "System.SetVariable"
        properties:
          variable: "liveChatInfo"
          value:
            customFields: 
              - name: "c$frombot"
                type: "BOOLEAN"
                value: 1
        transitions:
          next: "agentInitiation"

    Aqui está um exemplo do formato legado para canais de integração do agente que foram criados antes da versão 20.01 ou que estabelecem conexão com uma versão anterior à versão 19A do Oracle B2C Service.

      setLiveChatInfo:
        component: "System.SetVariable"
        properties:
          variable: "liveChatInfo"
          value:
            customFields: 
              - name: "c$frombot"
                dataType: "BOOLEAN"
                dataValue:
                  booleanValue: true
        transitions:
          next: "agentInitiation"
  3. Adicione a propriedade customProperties ao componente System.AgentInitiation e defina-a com o valor da variável de mapa. Por exemplo :

      agentInitiation:
        component: "System.AgentInitiation"
        properties:
          agentChannel: "B2CServiceIntegration"
          nlpResultVariable: "iResult"
          customProperties: "${liveChatInfo.value}"
          waitingMessage: "Waiting for an agent..."
          rejectedMessage: "Agents are not available right now."
          resumedMessage: "We're connecting you to an agent..."
          errorMessage: "Oops! We're having system issues. We're sorry, but we can't connect you with an agent right now."
        transitions:
          actions:
            accepted: "agentConversation"
            rejected: "tryAgain"
            error: "tryAgain"
      tryAgain:
        component: "System.Output"
        properties:
          text: "Please try again later."
        transitions:
          return: "tryAgain"

System.ResolveEntities

Observação

Este tópico abrange o uso desse componente no modo YAML. Para obter informações sobre como usá-lo no Designer de Fluxo Visual, consulte Resolver Entidade.

Faz a iteração por todos os campos de entidade no repositório composto, conversa com o usuário e resolve todos os campos. O componente escolhe aleatoriamente os prompts que você fornece para cada entidade ao resolver essa entidade.

Propriedade Descrição Obrigatório
variable Refere-se à variável de contexto da entidade composta que é preenchida por esse componente. Se todas as entidades filhas da variável de entidade composta já tiverem um valor, o fluxo de caixas de diálogo fará a transição para o próximo estado sem enviar uma mensagem ao usuário. Sim
nlpResultVariable Preenche a propriedade variable (que menciona a variável de entidade composta) usando os valores armazenados na variável de contexto nlpresult. Você pode definir essa propriedade nomeando a variável nlpresult (normalmente, iResult). Quando a estrutura resolve uma única entidade filha, a propriedade variable é preenchida apenas com esse valor de entidade. Quando a variável nlpresult mantém valores de todas as entidades filhas, o fluxo de caixas de diálogo muda para o próximo estado. Você pode usar essa propriedade no lugar dos estados SetVariable que preenchem os valores da entidade filha. No
maxPrompts Especifica o número de tentativas permitidas ao usuário para digitar um valor válido que corresponda ao tipo de entidade filha. Se o número máximo de tentativas for excedido para a primeira entidade filha, essa propriedade será redefinida como 0 e o bot gerará a solicitação da próxima entidade filha. Conforme descrito em Criar uma Entidade Composta, entidades individuais no repositório composto podem substituir essa definição quando a opção Máximo de Tentativas de Entrada do Usuário é definida. No
autoNumberPostbackActions Quando você define como true, essa opção prefixa números às opções. Mesmo quando você não definir essa opção como true, a numeração automática poderá ser aplicada em itens de lista quando a configuração Ativar Numeração Automática em Ações de Postback do assistente digital for definida como true. A numeração automática específica do canal pode ser aplicada a qualquer bot de habilidade registrado em um assistente digital:
${(system.channelType=='twilio')?then('true','false')}
No
useFullEntityMatches Quando definidos como true, os valores de entidade personalizados são armazenados como objetos JSON (semelhante aos valores de entidade incorporados). Isso permite que você crie expressões para acessar propriedades como value, primaryLanguageValue e originalString, que são particularmente importantes para habilidades multilíngues no momento ou que eventualmente poderão se tornar multilíngues.  
footerText Melhora a saída nos canais somente texto. Conforme descrito em Rodapés, você pode usar expressões do FreeMarker para condicionalizar o texto do rodapé para canais somente texto. No
headerText Uma mensagem que é exibida antes de o componente solicitar ao usuário o próximo item no repositório. Você pode usar esse cabeçalho para fornecer feedback sobre as entidades anteriores no repositório que foram correlacionadas (ou atualizadas).
headerText: "<#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>"
No
transitionAfterMatch Um booliano que, quando você o define como true, permite uma transição temporária da correspondência de entidade executada por esse componente para um componente personalizado. Por padrão, isso é false. Se você registrou um handler de eventos de entidade, essa propriedade será ignorada (e a transição match não será acionada). No
cancelPolicy Determina o tempo da transição cancel:
  • immediate — Imediatamente após as tentativas maxPrompts permitidas terem sido atingidas para uma entidade no repositório.

  • lastEntity — Quando a última entidade no repositório tiver sido correlacionada com um valor.

Essa propriedade será ignorada se você tiver registrado um handler de eventos de entidade em um handler maxPromptsReached de nível de item ou evento.
No

Componentes do Calendário

Use estes componentes de calendário para interagir com calendários do Outlook e do Google:

Autorização do Calendário

Para ativar a interação entre uma habilidade e um provedor de calendário, configure um serviço e modificar a habilidades e o fluxo de caixas de diálogo para permitir que o usuário acesse o calendário por meio desse serviço.

Antes de usar qualquer componente do calendário, registre um aplicativo no provedor do calendário e crie um serviço de código de autorização. Consulte estes tópicos para saber como:

No seu fluxo de caixas de diálogo, você usa o componente System.OAuth2AccountLink para solicitar que o usuário acesse o calendário por meio do serviço de código de autorização que você criou. Observe que não é possível definir a propriedade enableSingleSignOn do componente como true quando você usa o componente para autorização de componente do calendário.

Você pode aproveitar o recurso "exige autorização" para garantir automaticamente que o usuário tenha acessado (obtido um token de acesso) antes de chamar qualquer componente do calendário. Esse recurso só pedirá que o usuário acesse se ele ainda não tiver um token de acesso ou se tiver expirado e não puder ser atualizado. Você pode usar a configuração Exige Autorização da habilidade para definir o padrão para toda a habilidade e, em seguida, usar a definição requiresAuthorization de nível de estado para substituir o padrão. Ou seja, você usa a definição da habilidade para definir o padrão e depois apenas inclui a definição requiresAuthorization do componente nos estados cujo padrão não se aplica.

Para usar o recurso de autorização necessária, adicione uma ação system.authorizeUser ao nó defaultTransitions para nomear o estado que inicia o fluxo de autorização. Por exemplo :

defaultTransitions:
  error: "globalErrorHandler"
  actions:
    system.authorizeUser: "userAuthN.performOAuth"

Antes da transição de uma habilidade para um estado que exige autorização, ela verifica se há um token de acesso válido para o serviço de calendário. Caso contrário, ela executará as seguintes ações:

  1. Chama o estado que você definiu para a ação system.authorizedUser no nó defaultTransitions.

  2. Pede ao usuário que acesse o sistema.

  3. Faz a transição para o estado que exigiu a autorização (ou seja, o estado definido por ${system.requestedState}).

Veja um exemplo de fluxo de caixas de diálogo de autorização:

defaultTransitions:
  error: "globalErrorHandler"
  actions:
    system.authorizeUser: "userAuthN.performOAuth"

...

  ############################
  # Authenticate
  ############################
     
  userAuthN.performOAuth:
    component: "System.OAuth2AccountLink"
    properties:
      prompt: "User Authentication"
      variable: "code"
      linkLabel: "Sign into ${system.config.calendarProvider}"
      authenticationService: "${system.config.authService}"
      accessTokenVariableName: "user.accessToken"
      authenticatedUserVariableName: "user.authenticatedUser"
      enableSingleSignOn: false # SSO not supported for calendar components
    transitions:
      actions:
        pass : "${system.requestedState}"
        fail : "handleFailedLogin"
        textReceived: "intent"
  handleFailedLogin:
    component: "System.Output"
    requiresAuthorization: false
    properties:
      text: "Sorry, you aren't authorized to do that"
    transitions:
      return: "doneHandleFailedLogin" 

Para uma habilidade que se concentra principalmente nos componentes do calendário, considere definir a configuração Exige Autorização da habilidade como true e, em seguida, definir o valor como falso somente para os estados que não exigem autorização. Neste exemplo, qualquer usuário pode executar os estados initTimezoneOffset e intent. Portanto, requiresAuthorization é definido como false para esses estados. Os estados que funcionam com os componentes do calendário não precisam incluir requiresAuthorization porque o padrão é true.

  initTimezoneOffset:
    requiresAuthorization: false
    component: "System.SetVariable"
    properties:
      variable: "timezoneOffset"
      value: <#attempt>${profile.timezoneOffset}<#recover>0</#attempt>      
    transitions:
      next: "intent"

  intent:
    component: "System.Intent"
    requiresAuthorization: false
    properties:
      variable: "iResult"
    transitions:
      actions:
        SetupMeeting: "setUpMeeting"
        CancelMeeting: "cancelMeeting"
        ListMeetings: "listMeetings"
        UpdateMeeting: "updateMeeting"
        ListInvites: "listInvites"
        RespondInvites: "respondInvites"
        LogoutUser: "logoutUser"
        unresolvedIntent: "greeting"

...
  cancelMeeting.performDelete:
    component: "System.DeleteCalendarEvent"
    properties:
      eventId: "${eventId}"
      provider: "${system.config.calendarProvider}"
      calendarOwner: "${user.authenticatedUser}"
      calendarId: "${user.authenticatedUser}"
      credential: "${user.accessToken}"
    transitions:
      next: "cancelMeeting.printSuccessMessage"
  cancelMeeting.printSuccessMessage:
    component: "System.Output"
    properties:
      text: "I've cancelled the meeting"
    transitions:
      return: "doneCancel"

Como Trabalhar com Datas e Horas do Calendário

Ao trabalhar com os componentes do calendário, é importante entender o relacionamento entre os horários inicial e final, as entidades DATE e TIME, e o fuso horário local.

Ao criar, atualizar ou recuperar eventos, você usa a data/hora local dos valores start e end e usa a propriedade timezoneOffset ou timezone para informar ao componente como calcular o horário universal (UTC).

O componente do calendário timezoneOffset é diferente do profile.timezoneOffset. Para componentes de calendário, timezoneOffset é o valor que o componente deve adicionar aos valores start e end para obter o UTC. Você pode derivar o valor da propriedade timezoneOffset do componente do calendário multiplicando profile.timezoneOffset por -1.

O profile.timezoneOffset pode nem sempre estar disponível. Isso depende de se o cliente forneceu o deslocamento. Por exemplo, alguém pode criar um aplicativo Oracle Web que não define profile.timezoneOffset. Portanto, é uma boa ideia criar um fuso horário padrão para casos em que o profile.timezoneOffset não foi definido. Por exemplo :

  initTimezoneOffset:
    requiresAuthorization: false
    component: "System.SetVariable"
    properties:
      variable: "timezoneOffset"
      value: <#attempt>${profile.timezoneOffset}<#recover>${system.config.defaultTimezoneOffset}</#attempt>      
    transitions:
      next: "intent

Quando você recupera um evento, o componente retorna os valores de data e hora no formato UTC. Por exemplo: 2021-04-15T22:00:00.000Z. Sua habilidade precisa converter o valor na hora local.

  updateMeeting.printEventDetails:
    component: "System.Output"
    properties:
      keepTurn: true
      text: |
        You selected:
        ${eventDetails.value.subject}
        ${(eventDetails.value.start?datetime.iso?long - timezoneOffset?number?long)?number_to_date?string['MMM d']}
        ${(eventDetails.value.start?datetime.iso?long - timezoneOffset?number?long)?number_to_date?string['hh:mm a']}-${(eventDetails.value.end?datetime.iso?long - timezoneOffset?number?long)?number_to_date?string['hh:mm a']}
        Location: ${eventDetails.value.location}        
        Attendees: ${eventDetails.value.attendees?join(', ')}     
    transitions:
      next: "updateMeeting.selectItemToChange"

Quando você usar as entidades DATE e TIME, considere o seguinte:

  • Se usar uma entidade composta que tenha uma entidade DATE e uma ou mais entidades TIME, desative Extração Fora da Ordem. Caso contrário, quando as entidades forem resolvidas, você não terá controle sobre quais valores são resolvidos como entidade DATE e quais são resolvidos como entidade TIME (ou ambos). Por exemplo, quando TIME for resolvido, poderá alterar o valor da entidade DATE.

  • Quando uma declaração contém texto, como "ontem", "hoje" ou "manhã", o parser não leva em consideração o fuso horário local. Portanto, é possível que, no início da manhã e no final da tarde, a data errada seja usada. Por esse motivo, é uma boa ideia refletir de volta a data resolvida para que o usuário possa verificá-la antes de a habilidade adicionar um evento ou atualizar a hora inicial ou final de um evento.

  • Para definir os valores de propriedade start e end de um calendário, use a data da entidade DATE e o horário da entidade TIME. Por exemplo :

          start: "${newEvent.value.date.date?number_to_date?string['yyyy-MM-dd']}T${newEvent.value.startTime.date?number_to_date?string['HH:mm:ss']}"
          end: "${newEvent.value.date.date?number_to_date?string['yyyy-MM-dd']}T${newEvent.value.endTime.date?number_to_date?string['HH:mm:ss']}"

Tratando Erros do Calendário

O provedor de calendário pode rejeitar uma solicitação de evento. Por exemplo, ele poderá retornar um erro se o usuário tentar criar um evento que tenha um horário final anterior ao horário inicial. Na maioria dos casos, o provedor de calendário retorna um erro 400, que, por sua vez, faz a transição da habilidade para o handler de erro global.

Considere a validação dos valores para evitar que esses erros ocorram. Aqui estão exemplos de validações de entidade composta:

  • Entidade DATE: Para reuniões novas e atualizadas, confirme se a data é igual ou posterior à data atual.

    ${(meetingSlot.value.date.date?number?long gte  ((.now?date?long - timezoneOffset?number?long)?number_to_date?string['yyyy-MM-dd']+'T00:00:00')?datetime.iso?long)?then('true','false')}
  • Entidade TIME: Para reuniões novas e atualizadas, confirme se a data e o horário inicial são iguais ou posteriores à data e hora atuais.

    ${(((meetingSlot.value.date.date?number_to_date?string['yyyy-MM-dd']+'T'+meetingSlot.value.startTime.date?number_to_date?string['HH:mm:ss'])?datetime.iso?long) gte (.now?date?long - timezoneOffset?number))?then('true','false')}

    Para todos os horários finais, confirme se o horário final é posterior ao horário inicial.

    ${(newEvent.value.startTime.date?number_to_time < newEvent.value.endTime.date?number_to_time)?then('true','false')}

Para tratar as rejeições do provedor de calendário normalmente, adicione seu próprio handler de erro global. Por exemplo :

defaultTransitions:
  error: "globalErrorHandler"
  actions:
    system.authorizeUser: "userAuthN.performOAuth"

...

  globalErrorHandler:
    requiresAuthorization: false
    component: "System.Output"
    properties:
      text: "Sorry, we were unable to do the action that you requested."
    transitions:
      return: "done"

Se preferir, use a transição de erro para criar handlers de erro apropriados para cada caso:

  setUpMeeting.performSchedule:
    component: "System.CreateCalendarEvent"
    properties:
      start: "${newEvent.value.date.date?number_to_date?string['yyyy-MM-dd']}T${newEvent.value.startTime.date?number_to_date?string['HH:mm:ss']}"
      end: "${newEvent.value.date.date?number_to_date?string['yyyy-MM-dd']}T${newEvent.value.endTime.date?number_to_date?string['HH:mm:ss']}"
      subject: "${newEvent.value.subject}"
      location: "${newEvent.value.location}"
      attendees: "${newEvent.value.attendees}"
      provider: "${system.config.calendarProvider}"
      timezoneOffset: ${timezoneOffset?number * -1}
      calendarOwner: "${user.authenticatedUser}"
      calendarId: "${user.authenticatedUser}"
      credential: "${user.accessToken}"
    transitions:
      next: "setUpMeeting.printResults"
      error: "handleCreateEventError"

...

  handleCreateEventError:
    requiresAuthorization: false
    component: "System.Output"
    properties:
      text: "Sorry, there's a problem with the event that you wanted to create."
    transitions:
      return: "done"

System.CreateCalendarEvent

Use esse componente para adicionar um evento a um calendário do Outlook ou do Google. Observe que não é possível criar eventos recorrentes ou de dia inteiro.

O usuário deve ter acessado o provedor de calendário para acessar esse componente. Você pode usar o recurso "exige autorização" para gerenciar o acesso do usuário, conforme descrito em Autorização do Calendário.

Para saber como definir os valores start e end, consulte Como Trabalhar com Datas e Horas do Calendário.

Veja aqui um exemplo de como usar esse componente. Nesse exemplo, uma entidade composta é usada para obter a data, os horários inicial e final, o assunto, o local e os participantes.


  ####################
  # Create Meeting 
  ####################

  setUpMeeting:
    component: "System.CommonResponse"
    properties:
      keepTurn: true
      processUserMessage: true
      variable: "newEvent"
      nlpResultVariable: "iResult"     
      cancelPolicy: "immediate"
      transitionAfterMatch: "false"
      metadata:
        responseItems:       
          - type: "text"
            text: "${system.entityToResolve.value.prompt}"
            actions:
              - label: "${enumValue}"
                type: "postback"
                iteratorVariable: "system.entityToResolve.value.enumValues"
                payload:
                  variables:
                    newEvent: "${enumValue}"
        globalActions:
          - label: "Cancel"
            type: "postback"
            visible:
              onInvalidUserInput: false
            payload:
             action: "cancel"
    transitions:
      actions:
        cancel: "allDone"
      next: "setUpMeeting.askConfirm"       
  setUpMeeting.askConfirm:
    component: "System.CommonResponse"
    properties:
      processUserMessage: true
      metadata:
        responseItems:
          - type: "text"
            text: |
              Create ${newEvent.value.subject} meeting on ${newEvent.value.date.date?number_to_date?string['MMM d']}
              from ${newEvent.value.startTime.date?number_to_date?string['hh:mm a']} to ${newEvent.value.endTime.date?number_to_date?string['hh:mm a']}
              at ${newEvent.value.location} with ${newEvent.value.attendees}?
            name: "confirmCreate"
            separateBubbles: true
            actions:
              - label: "Yes"
                type: "postback"
                keyword: "yes"
                payload:
                  action: "yes"
                name: "Yes"
              - label: "No"
                keyword: "no"
                type: "postback"
                payload:
                  action: "no"
                name: "No"
    transitions:
      next: "intent"
      actions:
        yes: "setUpMeeting.performSchedule"
        no: "allDone"
        textReceived: "intent"      
  setUpMeeting.performSchedule:
    component: "System.CreateCalendarEvent"
    properties:
      start: "${newEvent.value.date.date?number_to_date?string['yyyy-MM-dd']}T${newEvent.value.startTime.date?number_to_date?string['HH:mm:ss']}"
      end: "${newEvent.value.date.date?number_to_date?string['yyyy-MM-dd']}T${newEvent.value.endTime.date?number_to_date?string['HH:mm:ss']}"
      subject: "${newEvent.value.subject}"
      location: "${newEvent.value.location}"
      attendees: "${newEvent.value.attendees}"
      provider: "${system.config.calendarProvider}"
      timezoneOffset: ${timezoneOffset?number * -1}
      calendarOwner: "${user.authenticatedUser}"
      calendarId: "${user.authenticatedUser}"
      credential: "${user.accessToken}"
    transitions:
      next: "setUpMeeting.printResults"
      error: "handleCreateCalendarError"
  setUpMeeting.printResults:
    component: "System.Output"
    properties:
      text: "The ${newEvent.value.date.date?number_to_date?string['MMM d']} meeting is now on your calendar."
      keepTurn: true
    transitions:
      next: "setUpMeeting.getMeetings"
...
Observação

Esse componente é suportado no Oracle Digital Assistant Versão 21.02 e mais recente.
Propriedade Descrição 0brigatório?
provider O provedor de calendário. Os valores permitidos são Google e Outlook. Sim
calendarOwner O ID do usuário do proprietário do calendário. Deve ser um ID de conta válido para o provedor de calendário, como o valor da variável identificada pela propriedade authenticatedUserVariable do componente System.OAuth2AccountLink, que é definida quando o usuário se autentica. Sim
calendarId O nome do calendário. Para o calendário padrão do usuário, defina com o mesmo valor da propriedade calendarOwner. Sim
credential O token de acesso do provedor. Esse é o valor da variável identificado pela propriedade accessTokenVariableName do componente System.OAuth2AccountLink, que é definida quando o usuário se autentica. Sim
start A data e hora iniciais da reunião no formato yyyy-MM-dd'T'HH:mm:ss Por exemplo, 2021-02-26T09:55:00. Sim
end A data e hora finais da reunião no formato yyyy-MM-dd'T'HH:mm:ss. Por exemplo, 2021-02-26T09:55:00. Sim
subject O assunto da reunião. Sim
attendees Uma lista de participantes separados por vírgulas. Observe que o provedor de calendário não poderá enviar uma notificação a um participante se o ID não for um ID de conta válido para esse provedor. Sim
timezoneOffset O tempo em milissegundos a ser adicionado ao horário universal (UTC) a fim de obter o horário padrão no fuso horário do usuário. Por exemplo, se o fuso horário local for UTC-2, o timezoneOffset será -7200000. O valor padrão é 0.
Observação

Você pode derivar a propriedade timezoneOffset para o usuário atual com base no valor da variável de contexto do usuário profile.timezoneOffset. No entanto, se fizer isso, multiplique profile.timezoneOffset por -1.

Você pode especificar timezoneOffset ou timezone, mas não ambos.

No
timezone

O ID do fuso horário local identificado por https://www.iana.org/time-zones. Também chamado de nome do banco de dados TZ. Por exemplo: America/Los_Angeles. O padrão é UTC. Você pode especificar timezoneOffset ou timezone, mas não ambos.

No

System.DeleteCalendarEvent

Use esse componente para excluir um evento de um calendário do Outlook ou do Google. Observe que não é possível excluir eventos recorrentes ou de dia inteiro.

O usuário deve ter acessado o provedor de calendário para acessar esse componente. Você pode usar o recurso "exige autorização" para gerenciar o acesso do usuário, conforme descrito em Autorização do Calendário.

Veja aqui um exemplo de como usar esse componente.


  ####################
  # Cancel Meeting
  ####################
  
  # Want to select from deletable meetings

  cancelMeeting:
    component: "System.SetVariable"
    properties:
      variable: "stateAfterList"
      value: "cancelMeeting.confirmCancel"
    transitions:
      next: "cancelMeeting.setListType"
  cancelMeeting.setListType:
    component: "System.SetVariable"
    properties:
      variable: "listType"
      # Only show deletable meetings
      value: "DELETE"
    transitions:
      next: "cancelMeeting.setListPrompt"
  cancelMeeting.setListPrompt:
    component: "System.SetVariable"
    properties:
      variable: "listPrompt"
      value: "to cancel"
    transitions:
      next: "listMeetings.commonEntryPoint"

  # List meetings common code returns to this state
  cancelMeeting.confirmCancel:
    component: "System.ResetVariables"
    properties:
      variableList: "confirmAction"
    transitions:
      next: "cancelMeeting.askConfirm"      
  cancelMeeting.askConfirm:
    component: "System.CommonResponse"
    properties:
      processUserMessage: true
      metadata:
        responseItems:
          - type: "text"
            text: "Are you sure you want to cancel this meeting?"
            name: "confirmCcancel"
            separateBubbles: true
            actions:
              - label: "Yes"
                type: "postback"
                keyword: "yes"
                payload:
                  action: "yes"
                name: "Yes"
              - label: "No"
                keyword: "no"
                type: "postback"
                payload:
                  action: "no"
                name: "No"
    transitions:
      next: "intent"
      actions:
        yes: "cancelMeeting.performDelete"
        no: "allDone"
        textReceived: "intent"
  cancelMeeting.performDelete:
    component: "System.DeleteCalendarEvent"
    properties:
      eventId: "${eventId}"
      provider: "${system.config.calendarProvider}"
      calendarOwner: "${user.authenticatedUser}"
      calendarId: "${user.authenticatedUser}"
      credential: "${user.accessToken}"
    transitions:
      next: "cancelMeeting.printSuccessMessage"
  cancelMeeting.printSuccessMessage:
    component: "System.Output"
    properties:
      text: "I've cancelled the meeting"
    transitions:
      return: "doneCancel"
  ...

  ############################
  # List Meetings Shared Code
  ############################
  
  listMeetings.commonEntryPoint:
    component: "System.SetVariable"
    properties:
      variable: "inputDate"
      value: "${iResult.value.entityMatches['DATE'][0]}"
    transitions:
      next: "listMeetings.setDate"
  listMeetings.setDate:
    component: "System.SetVariable"
    properties:
      variable: "start"
      value: "${inputDate.value?has_content?then(inputDate.value.date?number_to_date?string['yyyy-MM-dd'], (.now?date?long - timezoneOffset?number?long)?number_to_date?string['yyyy-MM-dd'])}T00:00:00"
    transitions:
      next: "listMeetings.clearInputDate"  
  listMeetings.clearInputDate:
    component: "System.ResetVariables"
    properties:
      variableList: "inputDate"
    transitions:
      next: "listMeetings.filterByAttendees"
  listMeetings.filterByAttendees:
    component: "System.CommonResponse"
    properties:
      processUserMessage: true
      metadata:
        responseItems:
          - type: "text"
            text: "Do you want to list only meetings with a particular attendee?"
            name: "confirmFilter"
            separateBubbles: true
            actions:
              - label: "Yes"
                type: "postback"
                keyword: "yes"
                payload:
                  action: "yes"
                name: "Yes"
              - label: "No"
                keyword: "no"
                type: "postback"
                payload:
                  action: "no"
                name: "No"
    transitions:
      next: "intent"
      actions:
        yes: "listMeetings.resolveAttendeesFilter"
        no: "listMeetings.clearAttendeesFilter"
        textReceived: "intent"

  # clear filter 
  
  listMeetings.clearAttendeesFilter:
    component: "System.ResetVariables"
    properties:
      variableList: "attendees"
    transitions:
      next: "listMeetings.performList"

  # resolve filter

  listMeetings.resolveAttendeesFilter:
    component: "System.CommonResponse"
    properties:
      keepTurn: true
      processUserMessage: true
      variable: "attendees"
      nlpResultVariable: "iResult"
      metadata:
        responseItems:
          - type: "text"
            text: "Who is the attendee?"
    transitions:
      next: "listMeetings.performAttendeesList"
      actions:
        textReceived: "listMeetings.performAttendeesList"

  # perform attendees list 

  listMeetings.performAttendeesList:
    component: "System.SelectCalendarEvent"
    properties:
      listType: "${listType}"
      start: "${start}"
      attendees: "${attendees}"
      prompt: "Choose the ${start?datetime.iso?long?number_to_date?string['MMM d']} meeting ${listPrompt}:"
      eventIdVariableName: "eventId"
      provider: "${system.config.calendarProvider}"
      timezoneOffset: ${timezoneOffset?number * -1}
      calendarOwner: "${user.authenticatedUser}"
      calendarId: "${user.authenticatedUser}"
      credential: "${user.accessToken}"
    transitions:
      actions:
        found: "${stateAfterList}"
        notfound: "listMeetings.printNotFoundMessage"
      next: "globalErrorHandler"

  # perform list 

  listMeetings.performList:
    component: "System.SelectCalendarEvent"
    properties:
      listType: "${listType}"
      start: "${start}"
      prompt: "Choose the ${start?datetime.iso?long?number_to_date?string['MMM d']} meeting ${listPrompt}:"
      eventIdVariableName: "eventId"
      provider: "${system.config.calendarProvider}"
      timezoneOffset: ${timezoneOffset?number * -1}
      calendarOwner: "${user.authenticatedUser}"
      calendarId: "${user.authenticatedUser}"
      credential: "${user.accessToken}"
    transitions:
      actions:
        found: "${stateAfterList}"
        notfound: "listMeetings.printNotFoundMessage"
      next: "globalErrorHandler"

  listMeetings.printNotFoundMessage:
    component: "System.Output"
    properties:
      text: "There are no meetings on ${start?datetime.iso?long?number_to_date?string['MMM d']}"
    transitions:
      return: "doneListMeetings"
...
Observação

Esse componente é suportado no Oracle Digital Assistant Versão 21.02 e mais recente.
Propriedade Descrição 0brigatório?
provider O provedor de calendário. Os valores permitidos são Google e Outlook. Sim
calendarOwner O ID do usuário do proprietário do calendário. Deve ser um ID de conta válido para o provedor de calendário, como o valor da variável identificada pela propriedade authenticatedUserVariable do componente System.OAuth2AccountLink, que é definida quando o usuário se autentica. Sim
calendarId O nome do calendário. Para o calendário padrão do usuário, defina com o mesmo valor da propriedade calendarOwner. Sim
credential O token de acesso do provedor. Esse é o valor da variável identificado pela propriedade accessTokenVariableName do componente System.OAuth2AccountLink, que é definida quando o usuário se autentica. Sim
eventId O ID do evento a ser excluído. Você pode usar System.ListCalendarEvents ou System.SelectCalendarEvent para obter um eventId. Sim

System.GetCalendarEventDetails

Use esse componente para obter os detalhes de um evento do calendário do Outlook ou do Google.

O usuário deve ter acessado o provedor de calendário para acessar esse componente. Você pode usar o recurso "exige autorização" para gerenciar o acesso do usuário, conforme descrito em Autorização do Calendário.

Os detalhes são retornados na variável especificada pela propriedade eventDetailsVariableName no seguinte formato JSON:

{
  "isAllDay": boolean,
  "subject": string,
  "inviteResponse": string,
  "attendees": [
    "string",
      ...
  ],
  "start": format yyyy-MM-dd'T'HH:mm:ss.SSSZ,
  "end":  format yyyy-MM-dd'T'HH:mm:ss.SSSZ,
  "location": string,
  "isRecurring": boolean,
  "id": string
}

As propriedades start e end são valores do UTC. Para saber como converter os valores start e end em horário local, consulte Como Trabalhar com Datas e Horas do Calendário.

Veja aqui um exemplo de como usar esse componente.

  listMeetings.performGetDetails:
    component: "System.GetCalendarEventDetails"
    properties:
      eventId: "${eventId}"
      eventDetailsVariableName: "eventDetails"
      provider: "${system.config.calendarProvider}"
      calendarOwner: "${user.authenticatedUser}"
      calendarId: "${user.authenticatedUser}"
      credential: "${user.accessToken}"
    transitions:
      next: "listMeetings.checkIfResults"
  # In case the eventId is no longer valid
  listMeetings.checkIfResults:
    component: "System.ConditionExists"
    properties:
      variable: "eventDetails"
    transitions:
      actions:
        exists: "listMeetings.printEventDetails"
        notexists: "globalErrorHandler" 
  listMeetings.printEventDetails:
    component: "System.Output"
    properties:
      text: |
        ${eventDetails.value.subject}
        ${(eventDetails.value.start?datetime.iso?long - timezoneOffset?number?long)?number_to_date?string['MMM d']}
        ${(eventDetails.value.start?datetime.iso?long - timezoneOffset?number?long)?number_to_date?string['hh:mm a']}-${(eventDetails.value.end?datetime.iso?long - timezoneOffset?number?long)?number_to_date?string['hh:mm a']}
        Location: ${eventDetails.value.location}        
        Attendees: ${eventDetails.value.attendees?join(', ')} 
    transitions:
      return: "doneGetDetails"
Observação

Esse componente é suportado no Oracle Digital Assistant Versão 21.02 e mais recente.
Propriedade Descrição 0brigatório?
provider O provedor de calendário. Os valores permitidos são Google e Outlook. Sim
calendarOwner O ID do usuário do proprietário do calendário. Deve ser um ID de conta válido para o provedor de calendário, como o valor da variável identificada pela propriedade authenticatedUserVariable do componente System.OAuth2AccountLink, que é definida quando o usuário se autentica. Sim
calendarId O nome do calendário. Para o calendário padrão do usuário, defina com o mesmo valor da propriedade calendarOwner. Sim
credential O token de acesso do provedor. Esse é o valor da variável identificado pela propriedade accessTokenVariableName do componente System.OAuth2AccountLink, que é definida quando o usuário se autentica. Sim
eventId O ID do evento a ser recuperado. Você pode usar System.ListCalendarEvents ou System.SelectCalendarEvent para obter um eventId. Sim
eventDetailsVariableName O nome da variável de contexto na qual armazenar os detalhes. Sim

System.ListCalendarEvents

Use este componente para obter uma matriz de eventos do Outlook ou do Google para um proprietário de calendário nomeado. Você pode filtrar a lista por estes atributos:

  • O evento pode ser excluído
  • O evento pode ser atualizado
  • O usuário foi convidado para o evento
  • Como o usuário respondeu a um convite
  • O evento inclui um ou mais participantes nomeados
  • A reunião começa depois de uma data e hora
  • A reunião termina antes de uma data e hora

O usuário deve ter acessado o provedor de calendário para acessar esse componente. Você pode usar o recurso "exige autorização" para gerenciar o acesso do usuário, conforme descrito em Autorização do Calendário.

A lista é retornada na variável especificada pela propriedade eventListVariableName no seguinte formato JSON:

[{
  "isAllDay": boolean,
  "subject": string,
  "inviteResponse": string,
  "start": format yyyy-MM-dd'T'HH:mm:ss.SSSZ,
  "end":  format yyyy-MM-dd'T'HH:mm:ss.SSSZ,
  "isRecurring": boolean,
  "id": string
}, …]

Para saber como definir os valores start e end, consulte Como Trabalhar com Datas e Horas do Calendário. Esse tópico também mostra como converter os valores de propriedade start e end JSON em horário local.

Veja aqui um exemplo de como usar esse componente.

  ############################
  # List Invites
  ############################

  listInvites:
    component: "System.ListCalendarEvents"
    properties:
      provider: "${system.config.calendarProvider}"
      timezoneOffset: ${timezoneOffset?number * -1}
      calendarOwner: "${user.authenticatedUser}"
      calendarId: "${user.authenticatedUser}"
      credential: "${user.accessToken}"
      listType: "INVITED"
      response: "PENDING,ACCEPTED,TENTATIVE,DECLINED"
      eventListVariableName: "eventList"
      start: "${(.now?date?long - timezoneOffset?number?long)?number_to_date?string['yyyy-MM-dd']}T00:00:00"
    transitions:
      next: "globalErrorHandler"
      actions:
        found: "listInvites.printMeetings"
        notfound: "listInvites.notFound"
  listInvites.printMeetings:
    component: "System.CommonResponse"
    properties:
      keepTurn: true
      metadata:
        responseItems:
        - type: "text"
          # display the local time
          text: |
            ${eventList.subject} [${eventList.inviteResponse}]
            ${(eventList.start?datetime.iso?long - timezoneOffset?number?long)?number_to_date?string['MMM d hh:mm a']} to ${(eventList.end?datetime.iso?long - timezoneOffset?number?long)?number_to_date?string['hh:mm a']}           
          name: "event"
          separateBubbles: true
          iteratorVariable: "eventList"
      processUserMessage: false
    transitions:
      return: "listInvitesDone"
  listInvites.notFound:
    component: "System.Output"
    properties:
      keepTurn: true
      text: "You don't have any invitations for the next 14 days"
    transitions:
      return: "listInvitesDone"      
Observação

Esse componente é suportado no Oracle Digital Assistant Versão 21.02 e mais recente.
Propriedade Descrição 0brigatório?
provider O provedor de calendário. Os valores permitidos são Google e Outlook. Sim
calendarOwner O ID do usuário do proprietário do calendário. Deve ser um ID de conta válido para o provedor de calendário, como o valor da variável identificada pela propriedade authenticatedUserVariable do componente System.OAuth2AccountLink, que é definida quando o usuário se autentica. Sim
calendarId O nome do calendário. Para o calendário padrão do usuário, defina com o mesmo valor da propriedade calendarOwner. Sim
credential O token de acesso do provedor. Esse é o valor da variável identificado pela propriedade accessTokenVariableName do componente System.OAuth2AccountLink, que é definida quando o usuário se autentica. Sim
listType Indica o tipo de lista. Deve ser um dos seguintes:
  • ALL: Todos os tipos de reuniões do proprietário do calendário
  • DELETE: Todas as reuniões que o proprietário do calendário pode excluir
  • UPDATE: Todas as reuniões que o proprietário do calendário pode atualizar
  • INVITED: Todas as reuniões cujo proprietário do calendário foi convidado
Sim
eventListVariableName O nome da variável de contexto na qual armazenar a lista de eventos. Sim
start A data e hora mais antigas nas quais as reuniões devem ser incluídas na lista (formato: yyyy-MM-dd'T'HH:mm:ss). Por exemplo, 2021-02-26T09:55:00. Sim
end A data e hora mais recentes nas quais as reuniões devem ser incluídas na lista (formato: yyyy-MM-dd'T'HH:mm:ss). Por exemplo, 2021-02-26T09:55:00.

Para o tipo de lista INVITED, o padrão é 14 dias após a data e a hora iniciais. Para todos os outros tipos, o padrão é 24 horas após a data e a hora iniciais.

No
attendees Uma lista de strings separadas por vírgulas e sem distinção entre maiúsculas e minúsculas a serem usadas para filtrar a lista por participantes. Somente as reuniões em que um ou mais valores de participante contêm uma ou mais strings na lista são incluídas na saída. No
response Uma lista de status de convite separados por vírgulas para filtrar a lista quando listType for INVITED. Os status permitidos são:
  • ACCEPTED
  • TENTATIVE
  • DECLINED
  • PENDING

O padrão é PENDING,TENTATIVE, que exibe somente convites que estão aguardando resposta ou que foram aceitos temporariamente.

No
timezoneOffset O tempo em milissegundos a ser adicionado ao horário universal (UTC) a fim de obter o horário padrão no fuso horário do usuário. Por exemplo, se o fuso horário local for UTC-2, o timezoneOffset será -7200000. O valor padrão é 0.
Observação

Você pode derivar a propriedade timezoneOffset para o usuário atual com base no valor da variável de contexto do usuário profile.timezoneOffset. No entanto, se fizer isso, multiplique profile.timezoneOffset por -1.

Você pode especificar timezoneOffset ou timezone, mas não ambos.

No
timezone O ID do fuso horário local identificado por https://www.iana.org/time-zones. Também chamado de nome do banco de dados TZ. Por exemplo: America/Los_Angeles. O padrão é UTC. Você pode especificar timezoneOffset ou timezone, mas não ambos. No

Esse componente pode retornar as seguintes ações:

Ação Descrição
found Um ou mais eventos foram retornados.
notfound Não há eventos correspondentes.

System.SelectCalendarEvent

Use esse componente para exibir uma lista de eventos do Outlook ou do Google entre os quais o usuário pode selecionar. O componente salva o ID do evento selecionado na variável especificada pela propriedade eventIdVariableName.

Você pode filtrar a lista de seleção entre estes atributos:

  • O evento pode ser excluído
  • O evento pode ser atualizado
  • O usuário foi convidado para o evento
  • Como o usuário respondeu a um convite
  • O evento inclui um ou mais participantes nomeados
  • A reunião começa depois de uma data e hora
  • A reunião termina antes de uma data e hora

O usuário deve ter acessado o provedor de calendário para acessar esse componente. Você pode usar o recurso "exige autorização" para gerenciar o acesso do usuário, conforme descrito em Autorização do Calendário.

Para saber como definir os valores start e end, consulte Como Trabalhar com Datas e Horas do Calendário.

Veja aqui um exemplo de como usar esse componente.

  ############################
  # Respond Invites
  ############################
      
  respondInvites.performList:
    component: "System.SelectCalendarEvent"
    properties:
      listType: "INVITED"
      response: "${inviteFilter}"
      # Note: For list type INVITED the default end date is 14 days after the start date and time.
      start: "${(.now?date?long - timezoneOffset?number?long)?number_to_date?string['yyyy-MM-dd']}T00:00:00"
      prompt: "Select the invitation to send the response to:"
      eventIdVariableName: "eventId"
      provider: "${system.config.calendarProvider}"
      timezoneOffset: ${timezoneOffset?number * -1}
      calendarOwner: "${user.authenticatedUser}"
      calendarId: "${user.authenticatedUser}"
      credential: "${user.accessToken}"
    transitions:
      next: "globalErrorHandler"
      actions:
        found: "respondInvites.resolveInviteResponse"
        notfound: "respondInvites.printNotFoundMessage"

  respondInvites.printNotFoundMessage:
    component: "System.Output"
    properties:
      text: "There are no meeting invites."
    transitions:
      return: "allDone"
  ...

Observação

Esse componente é suportado no Oracle Digital Assistant Versão 21.02 e mais recente.
Propriedade Descrição 0brigatório?
provider O provedor de calendário. Os valores permitidos são Google e Outlook. Sim
calendarOwner O ID do usuário do proprietário do calendário. Deve ser um ID de conta válido para o provedor de calendário, como o valor da variável identificada pela propriedade authenticatedUserVariable do componente System.OAuth2AccountLink, que é definida quando o usuário se autentica. Sim
calendarId O nome do calendário. Para o calendário padrão do usuário, defina com o mesmo valor da propriedade calendarOwner. Sim
credential O token de acesso do provedor. Esse é o valor da variável identificado pela propriedade accessTokenVariableName do componente System.OAuth2AccountLink, que é definida quando o usuário se autentica. Sim
listType Indica o tipo de lista. Deve ser um dos seguintes:
  • ALL: Todos os tipos de reuniões do proprietário do calendário
  • DELETE: Todas as reuniões que o proprietário do calendário pode excluir
  • UPDATE: Todas as reuniões que o proprietário do calendário pode atualizar
  • INVITED: Todas as reuniões não organizadas pelo proprietário do calendário, mas que o proprietário foi convidado a participar.
Sim
eventIdVariableName O nome da variável de contexto na qual armazenar o ID do evento. Sim
start A data e hora mais antigas nas quais as reuniões devem ser incluídas na lista (formato: yyyy-MM-dd'T'HH:mm:ss). Por exemplo, 2021-02-26T09:55:00. Sim
end A data e hora mais recentes nas quais as reuniões devem ser incluídas na lista (formato: yyyy-MM-dd'T'HH:mm:ss). Por exemplo, 2021-02-26T09:55:00.

Para o tipo de lista INVITED, o padrão é 14 dias após a data e a hora iniciais. Para todos os outros tipos, o padrão é 24 horas após a data e a hora iniciais.

No
attendees Uma lista de strings separadas por vírgulas e sem distinção entre maiúsculas e minúsculas a serem usadas para filtrar a lista por participantes. Somente as reuniões em que um ou mais valores de participante contêm uma ou mais strings na lista são incluídas na saída. No
response Uma lista de status de convite separados por vírgulas para filtrar a lista quando listType for INVITED. Os status permitidos são:
  • ACCEPTED
  • TENTATIVE
  • DECLINED
  • PENDING

O padrão é PENDING,TENTATIVE, que exibe somente convites que estão aguardando resposta ou que foram aceitos temporariamente.

Número
prompt O texto que aparece antes da lista. O padrão é You have the following meeting(s): Não é necessário incluir essa propriedade, a menos que você queira substituir o padrão.

Dica:

Em habilidades com a versão 21.04 e mais recente da plataforma, o valor padrão é armazenado no pacote de recursos da habilidade. Para alterar o padrão, abra a página Pacote de Recursos da habilidade, clique em Ícone de Pacotes de Recursos, selecione a guia Configuração e altere a mensagem da chave SelectCalendarEvent - prompt.
Número
allDayLabel O texto para indicar eventos de dia inteiro. O padrão é All day. Número
recurringLabel O texto para indicar um evento recorrente. O padrão é Recurring. Número
acceptedLabel O texto para indicar que o proprietário do calendário aceitou o convite. O padrão é Accepted. Número
tentativeLabel O texto para indicar que o proprietário do calendário aceitou temporariamente o convite. O padrão é Tentative. Número
declinedLabel O texto para indicar que o proprietário do calendário recusou o convite. O padrão é Declined. Número
pendingLabel O texto para indicar que o proprietário do calendário não respondeu ao convite. O padrão é Pending. Número
timezoneOffset O tempo em milissegundos a ser adicionado ao horário universal (UTC) a fim de obter o horário padrão no fuso horário do usuário. Por exemplo, se o fuso horário local for UTC-2, o timezoneOffset será -7200000. O valor padrão é 0.
Observação

Você pode derivar a propriedade timezoneOffset para o usuário atual com base no valor da variável de contexto do usuário profile.timezoneOffset. No entanto, se fizer isso, multiplique profile.timezoneOffset por -1.

Você pode especificar timezoneOffset ou timezone, mas não ambos.

Número
timezone O ID do fuso horário local identificado por https://www.iana.org/time-zones. Também chamado de nome do banco de dados TZ. Por exemplo: America/Los_Angeles. O padrão é UTC. Você pode especificar timezoneOffset ou timezone, mas não ambos. Número

Esse componente pode retornar as seguintes ações:

Ação Descrição
found Um ou mais eventos foram retornados.
notfound Não há eventos correspondentes.

System.SendInviteResponse

Use este componente para aceitar, aceitar temporariamente ou recusar um convite para um evento de calendário do Outlook ou do Google.

O usuário deve ter acessado o provedor de calendário para acessar esse componente. Você pode usar o recurso "exige autorização" para gerenciar o acesso do usuário, conforme descrito em Autorização do Calendário.

Veja aqui um exemplo de como usar esse componente.


  ############################
  # Respond Invites
  ############################
      
  respondInvites:
    component: "System.CommonResponse"
    properties:
      processUserMessage: true
      metadata:
        responseItems:
          - type: "text"
            text: "Which types of meeting invitations do you want to respond to?"
            name: "getInviteFilter"
            separateBubbles: true
            actions:
              - label: "Pending and tentatively accepted invitations"
                type: "postback"
                keyword: "PENDING,TENTATIVE"
                payload:
                  variables: 
                    inviteFilter: "PENDING,TENTATIVE"
              - label: "All invitations"
                keyword: "PENDING,ACCEPTED,TENTATIVE,DECLINED"
                type: "postback"                
                payload:
                  variables: 
                    inviteFilter: "PENDING,ACCEPTED,TENTATIVE,DECLINED"
              - label: "Cancel"
                keyword: "cancel"
                type: "postback"                
                payload:
                  action: "allDone" 
    transitions:
      actions:
        allDone: "allDone"
        textReceived: "intent" 
      next: "respondInvites.performList"
  respondInvites.performList:
    component: "System.SelectCalendarEvent"
    properties:
      listType: "INVITED"
      response: "${inviteFilter}"
      # Note: For list type INVITED the default end date is 14 days after the start date and time.
      start: "${(.now?date?long - timezoneOffset?number?long)?number_to_date?string['yyyy-MM-dd']}T00:00:00"
      prompt: "Select the invitation to send the response to:"
      eventIdVariableName: "eventId"
      provider: "${system.config.calendarProvider}"
      timezoneOffset: ${timezoneOffset?number * -1}
      calendarOwner: "${user.authenticatedUser}"
      calendarId: "${user.authenticatedUser}"
      credential: "${user.accessToken}"
    transitions:
      next: "globalErrorHandler"
      actions:
        found: "respondInvites.resolveInviteResponse"
        notfound: "respondInvites.printNotFoundMessage"
  respondInvites.printNotFoundMessage:
    component: "System.Output"
    properties:
      text: "There are no meeting invites."
    transitions:
      return: "allDone"

  ############################
  # Invite Response
  ############################
      
  respondInvites.resolveInviteResponse:
    component: "System.CommonResponse"
    properties:
      processUserMessage: true
      metadata:
        responseItems:
          - type: "text"
            text: "Choose a response:"
            name: "getInviteResponse"
            separateBubbles: true
            actions:
              - label: "Accept"
                type: "postback"
                keyword: "ACCEPTED"
                payload:
                  variables: 
                    inviteResponse: "ACCEPTED"
              - label: "Tentatively accept"
                keyword: "TENTATIVE"
                type: "postback"                
                payload:
                  variables: 
                    inviteResponse: "TENTATIVE"
              - label: "Decline"
                keyword: "DECLINED"
                type: "postback"                
                payload:
                  variables: 
                    inviteResponse: "DECLINED"
              - label: "Don't send a response"
                keyword: "CANCEL"
                type: "postback"                
                payload:
                  action: "allDone" 
    transitions:
      actions:
        allDone: "allDone"
        textReceived: "intent" 
      next: "respondInvites.performRespond"
  respondInvites.performRespond:
    component: "System.SendInviteResponse"
    properties:
      eventId: "${eventId}"
      response: "${inviteResponse}"
      provider: "${system.config.calendarProvider}"
      calendarOwner: "${user.authenticatedUser}"
      calendarId: "${user.authenticatedUser}"
      credential: "${user.accessToken}"
    transitions: 
      next: "respondInvites.printSuccessMessage"
  respondInvites.printSuccessMessage:
    component: "System.Output"
    properties:
      text: "I've sent the meeting invitation response"
    transitions:
      return: "doneSendInviteResponse"
Observação

Esse componente é suportado no Oracle Digital Assistant Versão 21.02 e mais recente.
Propriedade Descrição 0brigatório?
provider O provedor de calendário. Os valores permitidos são Google e Outlook. Sim
calendarOwner O ID do usuário do proprietário do calendário. Deve ser um ID de conta válido para o provedor de calendário, como o valor da variável identificada pela propriedade authenticatedUserVariable do componente System.OAuth2AccountLink, que é definida quando o usuário se autentica. Sim
calendarId O nome do calendário. Para o calendário padrão do usuário, defina com o mesmo valor da propriedade calendarOwner. Sim
credential O token de acesso do provedor. Esse é o valor da variável identificado pela propriedade accessTokenVariableName do componente System.OAuth2AccountLink, que é definida quando o usuário se autentica. Sim
eventId O ID do evento ao qual enviar a resposta. Você pode usar System.ListCalendarEvents ou System.SelectCalendarEvent para obter o ID dos eventos do calendário cujo proprietário do calendário foi convidado. Sim
response A resposta a ser enviada. As respostas permitidas são:
  • ACCEPTED
  • TENTATIVE
  • DECLINED
Sim

System.UpdateCalendarEvent

Use esse componente para fazer alterações em um evento de calendário do Outlook ou do Google. Observe que não é possível atualizar eventos recorrentes ou de dia inteiro.

O usuário deve ter acessado o provedor de calendário para acessar esse componente. Você pode usar o recurso "exige autorização" para gerenciar o acesso do usuário, conforme descrito em Autorização do Calendário.

Para saber como definir os valores start e end, consulte Como Trabalhar com Datas e Horas do Calendário.

Veja aqui um exemplo de como usar esse componente. Neste exemplo, uma entidade composta é usada para obter a data e os horários inicial e final.


  ####################
  # Update Meeting 
  ####################
 
  updateMeeting:
    component: "System.SetVariable"
    properties:
      variable: "stateAfterList"
      value: "updateMeeting.performGetDetails"
    transitions:
      next: "updateMeeting.setListType"
  updateMeeting.setListType:
    component: "System.SetVariable"
    properties:
      variable: "listType"
      # Only show updateable meetings
      value: "UPDATE"
    transitions:
      next: "updateMeeting.setListPrompt"
  updateMeeting.setListPrompt:
    component: "System.SetVariable"
    properties:
      variable: "listPrompt"
      value: "to update"
    transitions:
      next: "listMeetings.commonEntryPoint"

  # List meetings common code returns to this state
  updateMeeting.performGetDetails:
    component: "System.GetCalendarEventDetails"
    properties:
      eventId: "${eventId}"
      eventDetailsVariableName: "eventDetails"
      provider: "${system.config.calendarProvider}"
      calendarOwner: "${user.authenticatedUser}"
      calendarId: "${user.authenticatedUser}"
      credential: "${user.accessToken}"
    transitions:
      next: "updateMeeting.checkIfResults"      
  updateMeeting.checkIfResults:
    component: "System.ConditionExists"
    properties:
      variable: "eventDetails"
    transitions:
      actions:
        exists: "updateMeeting.printEventDetails"
        notexists: "globalErrorHandler"  
  updateMeeting.printEventDetails:
    component: "System.Output"
    properties:
      keepTurn: true
      text: |
        You selected:
        ${eventDetails.value.subject}
        ${(eventDetails.value.start?datetime.iso?long - timezoneOffset?number?long)?number_to_date?string['MMM d']}
        ${(eventDetails.value.start?datetime.iso?long - timezoneOffset?number?long)?number_to_date?string['hh:mm a']}-${(eventDetails.value.end?datetime.iso?long - timezoneOffset?number?long)?number_to_date?string['hh:mm a']}
        Location: ${eventDetails.value.location}        
        Attendees: ${eventDetails.value.attendees?join(', ')}     
    transitions:
      next: "updateMeeting.updateTime"

  # Change meeting time
      
  updateMeeting.updateTime:
    component: "System.ResolveEntities"
    properties:
      variable: "meetingSlot"
      nlpResultVariable: "iResult"      
      maxPrompts: 5
      cancelPolicy: "immediate" 
    transitions:
      actions:
        cancel: "allDone"
      next: "updateMeeting.setStart"      
  updateMeeting.setStart:
    component: "System.SetVariable"
    properties:
      variable: "start"
      value: "${meetingSlot.value.date.date?number_to_date?string['yyyy-MM-dd']}T${meetingSlot.value.startTime.date?number_to_date?string['HH:mm:ss']}"
    transitions:
      next: "updateMeeting.setEnd"
  updateMeeting.setEnd:
    component: "System.SetVariable"
    properties:
      variable: "end"
      value: "${meetingSlot.value.date.date?number_to_date?string['yyyy-MM-dd']}T${meetingSlot.value.endTime.date?number_to_date?string['HH:mm:ss']}"
    transitions:
      next: "updateMeeting.updateTime.performUpdate"
  updateMeeting.updateTime.performUpdate:
    component: "System.UpdateCalendarEvent"
    properties:
      eventId: "${eventId}"
      start: "${start}"
      end: "${end}"
      provider: "${system.config.calendarProvider}"
      #timezone: "${system.config.timezoneID}"
      timezoneOffset: ${timezoneOffset?number * -1}
      calendarOwner: "${user.authenticatedUser}"
      calendarId: "${user.authenticatedUser}"
      credential: "${user.accessToken}"
    transitions:
      next: "updateMeeting.printSuccessMessage"
      error: "handleUpdateCalendarError"
  ...

  ############################
  # List Meetings Shared Code
  ############################
  
  listMeetings.commonEntryPoint:
    component: "System.SetVariable"
    properties:
      variable: "inputDate"
      value: "${iResult.value.entityMatches['DATE'][0]}"
    transitions:
      next: "listMeetings.setDate"
  listMeetings.setDate:
    component: "System.SetVariable"
    properties:
      variable: "start"
      value: "${inputDate.value?has_content?then(inputDate.value.date?number_to_date?string['yyyy-MM-dd'], (.now?date?long - timezoneOffset?number?long)?number_to_date?string['yyyy-MM-dd'])}T00:00:00"
    transitions:
      next: "listMeetings.clearInputDate"  
  listMeetings.clearInputDate:
    component: "System.ResetVariables"
    properties:
      variableList: "inputDate"
    transitions:
      next: "listMeetings.filterByAttendees"
  listMeetings.filterByAttendees:
    component: "System.CommonResponse"
    properties:
      processUserMessage: true
      metadata:
        responseItems:
          - type: "text"
            text: "Do you want to list only meetings with a particular attendee?"
            name: "confirmFilter"
            separateBubbles: true
            actions:
              - label: "Yes"
                type: "postback"
                keyword: "yes"
                payload:
                  action: "yes"
                name: "Yes"
              - label: "No"
                keyword: "no"
                type: "postback"
                payload:
                  action: "no"
                name: "No"
    transitions:
      next: "intent"
      actions:
        yes: "listMeetings.resolveAttendeesFilter"
        no: "listMeetings.clearAttendeesFilter"
        textReceived: "intent"

  # clear filter 
  
  listMeetings.clearAttendeesFilter:
    component: "System.ResetVariables"
    properties:
      variableList: "attendees"
    transitions:
      next: "listMeetings.performList"

  # resolve filter

  listMeetings.resolveAttendeesFilter:
    component: "System.CommonResponse"
    properties:
      keepTurn: true
      processUserMessage: true
      variable: "attendees"
      nlpResultVariable: "iResult"
      metadata:
        responseItems:
          - type: "text"
            text: "Who is the attendee?"
    transitions:
      next: "listMeetings.performAttendeesList"
      actions:
        textReceived: "listMeetings.performAttendeesList"

  # perform attendees list 

  listMeetings.performAttendeesList:
    component: "System.SelectCalendarEvent"
    properties:
      listType: "${listType}"
      start: "${start}"
      attendees: "${attendees}"
      prompt: "Choose the ${start?datetime.iso?long?number_to_date?string['MMM d']} meeting ${listPrompt}:"
      eventIdVariableName: "eventId"
      provider: "${system.config.calendarProvider}"
      timezoneOffset: ${timezoneOffset?number * -1}
      calendarOwner: "${user.authenticatedUser}"
      calendarId: "${user.authenticatedUser}"
      credential: "${user.accessToken}"
    transitions:
      actions:
        found: "${stateAfterList}"
        notfound: "listMeetings.printNotFoundMessage"
      next: "globalErrorHandler"

  # perform list 

  listMeetings.performList:
    component: "System.SelectCalendarEvent"
    properties:
      listType: "${listType}"
      start: "${start}"
      prompt: "Choose the ${start?datetime.iso?long?number_to_date?string['MMM d']} meeting ${listPrompt}:"
      eventIdVariableName: "eventId"
      provider: "${system.config.calendarProvider}"
      timezoneOffset: ${timezoneOffset?number * -1}
      calendarOwner: "${user.authenticatedUser}"
      calendarId: "${user.authenticatedUser}"
      credential: "${user.accessToken}"
    transitions:
      actions:
        found: "${stateAfterList}"
        notfound: "listMeetings.printNotFoundMessage"
      next: "globalErrorHandler"

  listMeetings.printNotFoundMessage:
    component: "System.Output"
    properties:
      text: "There are no meetings on ${start?datetime.iso?long?number_to_date?string['MMM d']}"
    transitions:
      return: "doneListMeetings"
...
Observação

Esse componente é suportado no Oracle Digital Assistant Versão 21.02 e mais recente.
Propriedade Descrição 0brigatório?
provider O provedor de calendário. Os valores permitidos são Google e Outlook. Sim
calendarOwner O ID do usuário do proprietário do calendário. Deve ser um ID de conta válido para o provedor de calendário, como o valor da variável identificada pela propriedade authenticatedUserVariable do componente System.OAuth2AccountLink, que é definida quando o usuário se autentica. Sim
calendarId O nome do calendário. Para o calendário padrão do usuário, defina com o mesmo valor da propriedade calendarOwner. Sim
credential O token de acesso do provedor. Esse é o valor da variável identificado pela propriedade accessTokenVariableName do componente System.OAuth2AccountLink, que é definida quando o usuário se autentica. Sim
eventId O ID do evento a ser atualizado. Você pode usar System.ListCalendarEvents ou System.SelectCalendarEvent para obter um eventId. Sim
start A nova data e hora iniciais no formato yyyy-MM-dd'T'HH:mm:ss Por exemplo, 2021-02-26T09:55:00. No
end A nova data e hora finais no formato yyyy-MM-dd'T'HH:mm:ss Por exemplo, 2021-02-26T09:55:00. No
subject O novo assunto da reunião. Sim
attendees Uma lista de participantes separados por vírgulas. Essa lista substitui a lista anterior. Observe que o provedor de calendário não poderá enviar uma notificação a um participante se o ID não for um ID de conta válido para esse provedor. Sim
timezoneOffset O tempo em milissegundos a ser adicionado ao horário universal (UTC) a fim de obter o horário padrão no fuso horário do usuário. Por exemplo, se o fuso horário local for UTC-2, o timezoneOffset será -7200000. O valor padrão é 0.
Observação

Você pode derivar a propriedade timezoneOffset para o usuário atual com base no valor da variável de contexto do usuário profile.timezoneOffset. No entanto, se fizer isso, multiplique profile.timezoneOffset por -1.

Você pode especificar timezoneOffset ou timezone, mas não ambos.

No
timezone O ID do fuso horário local identificado por https://www.iana.org/time-zones. Também chamado de nome do banco de dados TZ. Por exemplo: America/Los_Angeles. O padrão é UTC. Você pode especificar timezoneOffset ou timezone, mas não ambos. No

Rodapés

Use rodapés em System.List e em System.CommonResponse para obter orientação adicional do usuário quando seu bot for executado em canais somente texto
Imagem do runtime do texto de rodapé.
Esse rodapé é exibido em todos os canais, mesmo naqueles que suportam botões como o Facebook. No entanto, você pode configurar a renderização específica do canal para o rodapé. Para isso:
  • Defina a variável autoNumberPostbackActions usando a expressão system.message.
    setAutoNumbering:
      component: "System.SetVariable"
      properties:
        variable: "autoNumberPostbackActions" 
        value: "${(system.channelType=='facebook')?then('true','false')}" 
  • Defina a opção footerText com uma diretiva if do Apache FreeMarker para exibir ou ocultar o rodapé com base no tipo de canal.
    footerText: <#if autoNumberPostbackActions.value>"Make your choice by entering the menu option number."</#if>
Observação

No Facebook, System.CommonResponse renderiza o texto de rodapé em sua própria bolha de texto que aparece um pouco antes das ações globais (as respostas rápidas). O rodapé não pode ser exibido após essas ações, porque isso exige uma segunda bolha de texto de rodapé que faz com que as ações desapareçam.

A Propriedade de tradução

Todos os componentes de interface e entrada baseados em YAML têm uma propriedade translate que substitui a definição de variável autoTranslate global:
  • Se você definir a variável autoTranslate como false (o padrão), nenhuma tradução automática ocorrerá no componente, a menos que você defina a propriedade translate como true.

  • Se você definir a variável autoTranslate como true, a propriedade translate será implicitamente definida como true também, o que significa que o label, o título, a descrição, o prompt e as strings de texto serão traduzidos.

Por exemplo, se você tiver ativado autotranslate definindo-a como true, a definição da propriedade translate de um componente como false excluirá prompt, título, descrição, label e strings de texto da tradução. Por outro lado, se você não ativar autotranslate, mas a propriedade translate de um componente for definida como true, o prompt, o título, a descrição, o label e a string de texto do componente serão traduzidos para o idioma do usuário detectado, usando o serviço de tradução configurado. (Os componentes de entrada traduzem a entrada do usuário para o inglês.)
autoTranslate é definido como... ...e a propriedade translate do componente é definida como... ...então, a entrada do usuário, o prompt, o label, o texto, o título e a descrição são traduzidos
true não definida sim
true true sim
true false nenhum
false não definida nenhum
false false nenhum
false true sim
Observação

Os fluxos projetados com o Designer de Fluxo Visual não têm a propriedade translate ou a variável de contexto autoTranslate. Para configurar a conversão dessas habilidades, use as propriedades Traduzir Mensagem de Entrada do Usuário e Traduzir Mensagem de Resposta do Bot.

System.Feedback

Observação

Este tópico abrange o uso desse componente no modo YAML. Para obter informações sobre como usá-lo no Editor de Fluxo Visual, consulte Feedback do Usuário.

O componente System.Feedback permite coletar dados de feedback para Insights apresentando aos usuários uma escala de classificação depois que eles concluírem um fluxo transacional. Se você estiver usando o SDK 21.10 ou posterior, esse componente gerará um sistema de classificação por estrelas horizontal. Se você estiver usando um SDK anterior, o componente gerará essa escala de classificação como uma lista simples que permite aos usuários tocar no botão que corresponde à classificação deles.

Embora seja possível alterar o comportamento desse componente usando as propriedades do componente, você pode alterar sua aparência ao usar o SDK (versão 21.10 ou posterior). Por exemplo, você pode substituir os ícones de estrela padrão usados para os botões de feedback por outro ícone.

System.Feedback Propriedades do Componente

Propriedade Descrição
maxRating A classificação máxima que um usuário pode enviar. Por padrão, o valor máximo é 5. Você pode ajustar esse valor para baixo.
enableTextFeedback Um booliano, que se definido como true, permite que o usuário envie feedback de texto se a classificação for menor ou igual ao valor threshold. Por padrão, essa propriedade é definida como false (nenhum feedback ativado).
threshold O valor para avaliar a transição entre as ações above e below. Por padrão, o limite entre feedback positivo e negativo é definido como 2 para o valor maxRating padrão, que é 5.
footerText O texto que é exibido na parte inferior da caixa de diálogo de feedback.

System.Feedback Transições de Componentes

Cada ação de transição deve nomear um estado no fluxo de caixas de diálogo que encerra a conversa com uma transição return: "done".
Ação Descrição
above Defina quando a entrada do usuário for um valor válido que esteja acima do valor threshold.
below Defina quando a entrada do usuário for um valor válido igual ou inferior ao valor threshold. ).
cancel Defina quando os usuários recusarem a classificação clicando em Ignorar.
Você pode usar as seguintes variáveis do sistema para a saída de mensagens pelos estados de transição:
  • system.userFeedbackRating - Retorna a classificação do usuário.
  • system.userFeedbackText - Quando enableTextFeedback é definido como true, sua habilidade pode solicitar feedback quando as classificações ficam abaixo do valor threshold. system.userFeedbackText retorna a entrada do usuário (${system.userFeedbackText.value}).
...
  getUserFeedback:
    component: "System.Feedback"
    properties: 
      threshold: 2
      maxRating: 5
      enableTextFeedback: true
    transitions:
      actions:
        above: "positiveFeedback"
        below: "negativeFeedback"
        cancel: "cancelFeedback"
  positiveFeedback:
    component: "System.Output"
    properties:
      text: "Thank you for your rating of ${system.userFeedbackRating.value}."
    transitions:
      return: "done"
  negativeFeedback:
    component: "System.Output"
    properties:
      text: "You gave us a score of ${system.userFeedbackRating.value} and entered ${system.userFeedbackText.value}. We appreciate your feedback."
    transitions:
      return: "done"
  cancelFeedback:
    component: "System.Output"
    properties:
      text: "Feedback canceled."
    transitions:
      return: "done"
...

System.Text

Observação

Este componente está obsoleto e não há mais um modelo disponível para ele. Em vez disso, você pode usar um dos muitos modelos com base no componente Resposta Comum que são oferecidos na seção Mensagens do Usuário da caixa de diálogo Adicionar Componente.

O componente System.Text permite que seu bot defina uma variável de contexto ou do usuário solicitando que o usuário digite um texto.

Quando o Mecanismo de Caixa de Diálogo entra em um estado System.Text pela primeira vez, ele solicita que o usuário digite um texto. Quando o usuário digita um valor, o Mecanismo de Caixa de Diálogo retorna para esse estado. O componente processa a resposta do usuário e, se for possível converter a entrada do usuário no tipo de variável, ele armazenará o valor na variável. O Mecanismo de Caixa de Diálogo é movido para outro estado quando essa variável tem um valor.
Observação

O Mecanismo de Caixa de Diálogo ignora o estado System.Text da variável que já tem um valor.
Propriedade Descrição 0brigatório?
prompt Uma string de texto que descreve a entrada exigida do usuário. É possível adicionar valores dinamicamente a ela usando uma expressão de valor. Por exemplo: Hello ${profile.firstName}, how many pizzas do you want? Sim
variable O nome da variável, que pode ser de usuário ou uma das variáveis declaradas no nó context. Sim
nlpResultVariable Define a propriedade variable com um valor de entidade (quando o valor da entidade ainda não foi definido para a variável referenciada). Você pode ativar nlpResultVariable para retornar um valor usando uma variável que armazena os resultados de NLP (como iresult: "nlpresult", que é usado em nossos bots de amostra). Ao fazer isso, a propriedade nlpResultVariable ainda poderá preencher o valor quando ele for nulo se encontrar uma entidade resolvida que corresponda à referenciada pela variável. A caixa de diálogo muda para o próximo estado quando nlpResultVariable define o valor. Você pode usar essa propriedade no lugar do componente System.SetVariable. No
maxPrompts O número de vezes que o componente solicita que o usuário insira uma entrada válida. Consulte Limitando o Número de Prompts do Usuário. No
translate Use essa propriedade para substituir o valor booliano que você definiu para a variável de contexto autotranslate. Se você não tiver definido essa variável ou se defini-la como false, poderá definir essa propriedade como true para ativar a tradução automática somente desse componente. Se você definir a variável autotranslation como true, poderá definir essa propriedade como false para excluir esse componente da tradução automática. Consulte Serviços de Tradução em Habilidades. No

Consulte Transições para Componentes de Resposta Comuns para os tipos de ação predefinidos que você pode usar com esse componente.

Como Uso o Componente System.Text?

Neste exemplo, a variável type contém os valores esperados pela entidade PizzaType, como cheese, Veggie Lover e Hawaiian. Quando essas informações não estiverem presentes na entrada do usuário, o bot ainda poderá obtê-las porque o fluxo de caixas de diálogo muda para o estado type, cujo componente System.Text as solicita para informar explicitamente o que elas desejam. Lembre-se de que mesmo neste ponto, a entrada do usuário ainda precisa ser resolvida com a entidade PizzaType para fazer a transição para o próximo estado.

main: true
name: "PizzaBot"
parameters:
  age: 18
context:
  variables:
    size: "PizzaSize"
    type: "PizzaType"
    crust: "PizzaCrust"
    iResult: "nlpresult"

...

  type:
    component: "System.Text"
    properties:
      prompt: "What Type of Pizza do you want?"
      variable: "type"
    transitions:
      ...

System.List

Observação

Este componente está obsoleto e não há mais um modelo disponível para ele. Em vez disso, você pode usar um dos muitos modelos com base no componente Resposta Comum que são oferecidos na seção Mensagens do Usuário da caixa de diálogo Adicionar Componente.

O componente System.List foi projetado para gerar uma lista de opções. Dependendo se um valor de variável tiver sido definido (ou mesmo definido para esse componente), a navegação do componente poderá ser acionada pela escolha do usuário ou pelo valor definido para o usuário ou a variável de contexto.

Propriedade Descrição 0brigatório?
options Você pode especificar options usando strings de texto separadas por vírgulas, expressões do Apache FreeMarker e como lista de mapas. As opções Propriedades e Listas de Ações fornecem exemplos da última abordagem. Sim
prompt A string de texto que solicita ação do usuário. Sim
variable O nome da variável cujo valor é preenchido pela entrada do usuário. O Mecanismo de Caixa de Diálogo vai ignorar esse estado se o valor da variável já tiver sido definido e não vai gerar as opções da lista para o usuário. No
nlpResultVariable Define a propriedade variable com um valor de entidade (quando o valor da entidade ainda não foi definido para a variável referenciada). Você pode ativar nlpResultVariable para retornar um valor ao defini-lo com a variável que armazena os resultados de NLP (como iResult: "nlpresult", que é usado em nossas habilidades de amostra). Ao fazer isso, a propriedade nlpResultVariable ainda poderá preencher o valor quando ele for nulo se encontrar uma entidade resolvida que corresponda à referenciada pela variável. A caixa de diálogo muda para o próximo estado quando nlpResultVariable define o valor. Você pode usar essa propriedade no lugar do componente System.SetVariable. A opção Listas de Ações descreve como você pode usar as propriedades variable e nlpResultVariable para alterar o comportamento de exibição da lista. Não — Use essa propriedade quando a propriedade de variável nomear uma variável de tipo de entidade.
maxPrompts O número de vezes que o componente solicita que o usuário insira uma entrada válida. Consulte Limitando o Número de Prompts do Usuário. No
translate Use essa propriedade para substituir o valor booliano que você definiu para a variável de contexto autotranslate. Se você não tiver definido essa variável ou se defini-la como false, poderá definir essa propriedade como true para ativar a tradução automática somente desse componente. Se você definir a variável autotranslation como true, poderá definir essa propriedade como false para excluir esse componente da tradução automática. Consulte Serviços de Tradução em Habilidades. No
autoNumberPostbackActions Quando definido como true, essa opção prefixa números às opções. Mesmo quando você não definir essa opção como true, a numeração automática poderá ser aplicada em itens de lista quando a configuração Ativar Numeração Automática em Ações de Postback do assistente digital for definida como true. A numeração automática específica do canal pode ser aplicada a qualquer habilidade registrada em um assistente digital:${(system.channelType=='twilio')?then('true','false')} No
footerText Melhora a saída nos canais somente texto. Conforme descrito em Rodapés, você pode usar expressões do FreeMarker para condicionalizar o texto do rodapé para canais somente texto. No
Consulte Transições para Componentes de Resposta Comuns para os tipos de ação predefinidos que você pode usar com esse componente.

Listas de Valores

Você pode usar o componente System.List para retornar um valor que atenda a uma variável de contexto definida como primitiva (como greeting: "string" no modelo de fluxo de caixas de diálogo) ou como entidade, conforme mostrado no trecho de código a seguir. Nesse fluxo de caixas de diálogo, a definição options: "Thick,Thin,Stuffed,Pan" retorna um valor que corresponde à variável crust. A propriedade options definida para o tamanho é uma expressão de valor (${size.type.enumValues}) que retorna os valores da lista Grande, Médio, Pequeno e Pessoal como opções. Consulte Sintaxe de Linguagem de Modelo do FreeMarker Apache.

Esse exemplo também mostra como a definição iResult da propriedade nlpResultVariable permite que o componente defina os valores da entidade para as propriedades variable dos estados crust e size quando esses valores não foram definidos anteriormente. Assim como o componente Text, o componente System.List não exige transições.
main: true
name: "PizzaBot"

...

context:
  variables:
    size: "PizzaSize"
    crust: "PizzaCrust"
    iResult: "nlpresult"

...

states:

...

crust:
  component: "System.List"
  properties:
    options: "Thick,Thin,Stuffed,Pan"
    prompt: "What crust do you want for your pizza?"
    variable: "crust"
main: true
name: "PizzaBot"

...

context:
  variables:
    size: "PizzaSize"
    crust: "PizzaCrust"
    iResult: "nlpresult"
...

states:

...

crust:
   component: "System.List"
   properties:
     options: "Thick,Thin,Stuffed,Pan"
     prompt: "What crust do you want for your pizza?"
     variable: "crust"
     nlpResultVariable: "iresult"
   transitions:
     next: "size"
size:
   component: "System.List"
   properties:
     options: "${size.type.enumValues}"
       prompt: "What size Pizza do you want?"
       variable: "size"
       nlpResultVariable: "iresult"
    transitions:
      ...

O componente de lista em um chat ao vivo.
Observação

Os usuários não estão limitados às opções exibidas na lista. Eles podem resolver a entidade digitando uma palavra que a entidade reconheça, como um sinônimo. Em vez de escolher entre as opções de tamanho de pizza na lista, por exemplo, os usuários podem, em vez disso, digitar big, um sinônimo definido para a opção Large da entidade PizzaSize. Consulte Entidades Personalizadas.
O componente de lista com entrada do usuário.

A Propriedade options

Você pode definir a propriedade options usando qualquer uma das seguintes opções:
  • Uma lista de mapas — embora você possa definir a propriedade de opções como string de texto ou expressão de valor, você também pode configurar a propriedade options como lista de mapas. Cada uma tem uma propriedade label, uma propriedade value e uma propriedade opcional keyword. Você pode localizar suas opções de lista quando segue essa abordagem porque, conforme indicado pelo exemplo a seguir, você pode mencionar um pacote de recursos. Consulte Pacotes de Recursos de Habilidades para obter mais informações sobre como usar a notação de ponto. Quando os usuários digitam um valor que corresponde a um dos valores especificados na propriedade keyword, o bot reage da mesma forma como se o usuário tocasse na própria opção da lista.
    askPizzaSize:
      component: "System.List" 
      properties:
        prompt: What size do you want?"
        options:
        - value: "small"
          label: "${rb.pizza_size_small}"
          keyword: "1"
        - value: "medium"
          label: "${rb.pizza_size_medium}"
          keyword: "2" 
        - value: "large"
          label: "${rb.pizza_size_large}"
          keyword: "3" 
       variable: "pizzaSize"
  • Uma string de texto de opções separadas por vírgulas, como "small, medium, large" no trecho de código a seguir. Não é possível adicionar as propriedades label e value ao definir options como string.
    askPizzaSize:
      component: "System.List"
      properties: 
        prompt: "What size do you want?"
        options: "small, medium, large"
        variable: "pizzaSize"
    
  • Uma expressão de valor do Apache FreeMarker que passa por uma lista de strings ou uma lista de mapas, em que cada mapa deve conter as propriedades label e value e opcionalmente uma propriedade keyword.
    askPizzaSize:
      component: "System.List" 
      properties:
        prompt: "What size do you want?"
        options: "${pizzaSize.value.enumValues}"
        variable: "pizzaSize"
Consulte o Manual do Apache FreeMarker para obter mais informações sobre a sintaxe.

Listas de Ações

Em vez de usar o componente System.Switch para navegação condicional, você pode usar listas de ações. As propriedades variable e nlpResultVariable opcionais do componente System.Listdefinem o comportamento de exibição da lista e a transição subsequente com base na entrada do usuário.
  • Quando você não configura essas propriedades, a ação de transição é baseada na opção selecionada pelo usuário da habilidade:
    showMenu:
      component: "System.List" 
      properties:
        prompt: "Hello, this is our menu today"  
        options:
    
        - value: "pasta"
          label: "Pasta"
        - value: "pizza"
          label: "Pizza"
    
      transitions:
        actions:
          pasta: "orderPasta"
          pizza: "orderPizza"
  • Quando você adiciona as propriedades variable e nlpResultVariable, a exibição da lista é ignorada quando a entrada do usuário é correspondida. No trecho de código a seguir, a lista de opções é ignorada quando nlpResultVariable define a variável size da entrada do usuário como Quero pedir uma pizza grande. A transição apropriada ao valor é acionada.
    getPizzaSize:
      component: "System.List"
      properties:
        prompt: "What size of pizza"
        variable: "size"
        nlpResultVariable: "iResult"
        options:
    
        - label: "Small"
          value: "Small"
        - label: "Large"
          value: "Large"
        transitions:
          actions:
            Large: "Large"
            Small: "Small"

System.Output

Use o componente System.Output para gerar uma mensagem que não exija uma resposta do usuário ou que sua habilidade processe a resposta do usuário.
Observação

Este componente está obsoleto e não há mais um modelo disponível para ele. Em vez disso, você pode usar um dos muitos modelos com base no System.CommonResponse oferecido na seção Mensagens do Usuário da caixa de diálogo Adicionar Componente.
Propriedade Descrição 0brigatório?
text Uma string de texto Sim – Este campo requer um valor.
keepTurn Um valor booliano para renunciar (false) ou manter o controle da habilidade do fluxo de caixas de diálogo (true). Use keepTurn: true quando quiser gerar uma sequência ininterrupta de mensagens de habilidade na qual nenhuma interposição do usuário é aceita. No
translate Use essa propriedade para substituir o valor booliano que você definiu para a variável de contexto autotranslate. Se você não tiver definido essa variável ou se defini-la como false, poderá definir essa propriedade como true para ativar a tradução automática somente desse componente. Se você definir a variável autotranslation como true, poderá definir essa propriedade como false para excluir esse componente da tradução automática. Consulte Serviços de Tradução em Habilidades. No

Como Faço para Usar o Componente System.Output

O componente System.Output requer a definição de string para a propriedade text. Conforme ilustrado no exemplo a seguir de uma mensagem de confirmação, você pode adicionar expressões de valor a essa string.
done:
    component: "System.Output"
    properties:
      text: "Your ${size.value}, ${type.value} pizza with ${crust.value} crust is on its way. Thank you for your order."
Por padrão, o Mecanismo de Caixa de Diálogo aguarda a entrada do usuário após gerar uma instrução da sua habilidade. Se você substituir esse comportamento, adicione a propriedade opcional keepTurn e defina-a como true para direcionar o Mecanismo de Caixa de Diálogo para o próximo estado definido pela propriedade transitions. Quando nenhuma transição tiver sido definida, o Mecanismo de Caixa de Diálogo passará para o próximo estado na sequência.
  wait:
    component: "System.Output"
    properties:
      text: "Please wait, we're reviewing your order"
      keepTurn: true
    transitions:
      next: "ready"
 waitmore:
    component: "System.Output"
    properties:
      text: "Almost done..."
      keepTurn: true
    transitions:
      next: "done"
  done:
    component: "System.Output"
    properties:
      text: "Your ${size.value}, ${type.value} pizza with ${crust.value} crust is on its way. Thank you for your order."
    transitions:
      return: "done"

Definindo Expressões de Valor para o Componente System.Output

Você pode definir uma ou mais expressões de valor para a propriedade text. Por exemplo, o seguinte trecho de código usa expressões diferentes para gerar o texto de uma confirmação de pedido (tamanho e tipo da pizza).
confirmation:
    component: "System.Output"
    properties:
      text: "Your ${size.value} ${type.value} pizza is on its way."
    transitions:
      return: "done" 
Cada expressão deve sempre retornar um valor. Se apenas uma expressão retornar um valor nulo, a habilidade gerará texto bruto para cada expressão na string e exibirá aos seus usuários uma saída semelhante a esta:
Your ${size.value} ${type.value} is on its way.
É tudo ou nada. Para se certificar de que sua habilidade sempre gere texto que os usuários possam entender, substitua um valor padrão por um valor nulo usando o operador de valor padrão do Apache Freemarker: ${size.value!\”piping\”} ${type.value!\”hot\”}. As aspas duplas indicam que o valor padrão não é uma referência de variável, mas o valor constante que o operador espera. Por exemplo :
text: "Your ${size.value!\"piping\"} ${type.value!\"hot\"} pizza is on its way."
Observação

Sempre escape as aspas (\"...\") que delimitam o valor padrão quando você usar o operador do Freemarker. A sintaxe OBotML do fluxo de caixas de diálogo não será válida, a menos que você use essa sequência de escape sempre que definir uma operação de valor padrão ou ativar texto de saída com aspas duplas. Por exemplo, a definição do componente System.Output a seguir permite que os usuários leiam a mensagem como Você disse, “Cancelar este pedido".
confirmCancel:
    component: "System.Output"
    properties:
      text: "You said, \"Cancel this order.\""
    transitions:
      return: "cancelOrder"

Traduzindo o Texto de Saída

Você pode suprimir ou ativar texto traduzido automaticamente do componente System.Output de acordo com o componente, usando a propriedade translate. Definindo-a como false, como no trecho de código a seguir, os componentes geram o texto como está, sem tradução. Definindo essa propriedade como true, você poderá ativar a tradução automática quando a variável autoTranslate estiver definida como false ou não estiver definida. Consulte Serviços de Tradução em Habilidades.
Observação

Normalmente, você não definirá a variável autoTranslate como true se estiver traduzindo texto com pacotes de recursos. Nós não recomendamos essa abordagem.
setAutoTranslate:
    component: "System.SetVariable"
    properties:
      variable: "autoTranslate"
      value: "true"
    transitions: 
      ...
...
pizzaType:
   component: "System.Output"
   properties:
     text: "What type of pizza do you want?"
     translate: false
   transitions:
     ...