Detalhes do fluxo de informações - Amazon Lex V1

Se você estiver usando o Amazon Lex V2, consulte o Guia do Amazon Lex V2.

 

Se você estiver usando o Amazon Lex V1, recomendamos atualizar seus bots para o Amazon Lex V2. Não estamos mais adicionando novos atributos à V1 e recomendamos o uso da V2 para todos os novos bots.

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Detalhes do fluxo de informações

O esquema de bot ScheduleAppointment exibe, principalmente, o uso de cartões de resposta gerados dinamicamente. A função do Lambda neste exercício inclui cartões de resposta em sua resposta ao Amazon Lex. Amazon Lex inclui os cartões de resposta em sua resposta ao cliente. Esta seção explica o seguinte:

nota

O exemplo supõe que você esteja usando o cliente Facebook Messenger, que não passa atributos de sessão na solicitação para Amazon Lex. Dessa forma, os exemplos de solicitações desta seção mostram sessionAttributes vazio. Se você testar o bot usando o cliente fornecido no console Amazon Lex, o cliente incluirá os atributos de sessão.

Esta seção descreve o que acontece após cada entrada do usuário.

  1. Usuário: tipos Book an appointment

    1. O cliente (console) envia a seguinte solicitação PostContent para o Amazon Lex:

      POST /bot/ScheduleAppointment/alias/$LATEST/user/bijt6rovckwecnzesbthrr1d7lv3ja3n/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText":"book appointment", "sessionAttributes":{} }

      Tanto a solicitação URI quanto o órgão fornecem informações ao Amazon Lex:

      • Solicitação URI — Fornece o nome do bot (ScheduleAppointment), o alias do bot ($LATEST) e o ID do nome do usuário. O final text indica que é PostText (nãoPostContent) uma API solicitação.

      • Corpo da solicitação: inclui a entrada do usuário (inputText) e sessionAttributes vazio.

    2. A partir de inputText, o Amazon Lex detecta a intenção (MakeAppointment). O serviço invoca a função do Lambda, que está configurada como um hook de código, para executar a inicialização e a validação passando o seguinte evento. Para obter detalhes, consulte Formato de eventos de entrada.

      { "currentIntent": { "slots": { "AppointmentType": null, "Date": null, "Time": null }, "name": "MakeAppointment", "confirmationStatus": "None" }, "bot": { "alias": null, "version": "$LATEST", "name": "ScheduleAppointment" }, "userId": "bijt6rovckwecnzesbthrr1d7lv3ja3n", "invocationSource": "DialogCodeHook", "outputDialogMode": "Text", "messageVersion": "1.0", "sessionAttributes": {} }

      Além das informações enviadas pelo cliente, o Amazon Lex também inclui os seguintes dados:

      • currentIntent - Fornece informações de intenção atuais.

      • invocationSource: indica o objetivo da invocação da função do Lambda. Nesse caso, o objetivo é executar os dados de inicialização e validação do usuário. (Amazon Lex sabe que o usuário não forneceu todos os dados de slot para cumprir a intenção.)

      • messageVersion: atualmente, o Amazon Lex oferece suporte apenas à versão 1.0.

    3. No momento, todos os valores de slot são nulos (não há nada para validar). A função do Lambda retorna a seguinte resposta para o Amazon Lex direcionando o serviço a obter informações para o slot AppointmentType. Para obter mais informações sobre o formato de resposta, consulte Formato de resposta.

      { "dialogAction": { "slotToElicit": "AppointmentType", "intentName": "MakeAppointment", "responseCard": { "genericAttachments": [ { "buttons": [ { "text": "cleaning (30 min)", "value": "cleaning" }, { "text": "root canal (60 min)", "value": "root canal" }, { "text": "whitening (30 min)", "value": "whitening" } ], "subTitle": "What type of appointment would you like to schedule?", "title": "Specify Appointment Type" } ], "version": 1, "contentType": "application/vnd.amazonaws.card.generic" }, "slots": { "AppointmentType": null, "Date": null, "Time": null }, "type": "ElicitSlot", "message": { "content": "What type of appointment would you like to schedule?", "contentType": "PlainText" } }, "sessionAttributes": {} }

      A resposta inclui os campos dialogAction e sessionAttributes. Dentre outras coisas, o campo dialogAction retorna os seguintes campos:

      • type: ao definir esse campo como ElicitSlot, a função do Lambda direciona o Amazon Lex a escolher o valor para o slot especificado no campo slotToElicit. A função do Lambda também fornece uma message para transmitir ao usuário.

      • responseCard: identifica uma lista de valores possíveis para o slot AppointmentType. Um cliente que oferece suporte a cartões de resposta (por exemplo, Facebook Messenger) exibe um cartão de resposta para permitir que o usuário escolha um tipo de consulta da seguinte forma:

        Cartão de resposta perguntando o tipo de consulta a ser agendada e três opções: limpeza (30 minutos), canal radicular (60 minutos) e clareamento (30 minutos).
    4. Como indicado pelo dialogAction.type na resposta da função do Lambda, Amazon Lex envia a seguinte resposta de volta para o cliente:

      JSONresposta contendo informações sobre a intenção de marcar uma consulta e o tipo de horário a ser obtido.

      O cliente lê a resposta e, em seguida, exibe a mensagem: "Que tipo de consulta você deseja marcar?" e o cartão de resposta (se o cliente oferece suporte a cartões de resposta).

  2. Usuário: dependendo do cliente, o usuário tem duas opções:

    • Se o cartão de resposta for exibido, escolha root canal (60 min) (canal de raiz (60 min)) ou digite root canal.

    • Se o cliente não oferecer suporte a cartões de resposta, digite root canal.

    1. O cliente envia a seguinte solicitação PostText ao Amazon Lex (quebras de linha foram adicionadas para legibilidade):

      POST /bot/BookTrip/alias/$LATEST/user/bijt6rovckwecnzesbthrr1d7lv3ja3n/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText": "root canal", "sessionAttributes": {} }
    2. O Amazon Lex invoca a função do Lambda para validação dos dados do usuário enviando o seguinte evento como parâmetro:

      { "currentIntent": { "slots": { "AppointmentType": "root canal", "Date": null, "Time": null }, "name": "MakeAppointment", "confirmationStatus": "None" }, "bot": { "alias": null, "version": "$LATEST", "name": "ScheduleAppointment" }, "userId": "bijt6rovckwecnzesbthrr1d7lv3ja3n", "invocationSource": "DialogCodeHook", "outputDialogMode": "Text", "messageVersion": "1.0", "sessionAttributes": {} }

      Nos dados de evento, observe o seguinte:

      • invocationSource continua sendo DialogCodeHook. Nesta etapa, estamos apenas validando os dados do usuário.

      • O Amazon Lex define o campo AppointmentType no slot currentIntent.slots como root canal.

      • Amazon Lex simplesmente passa o campo sessionAttributes entre o cliente e a função do Lambda.

    3. A função do Lambda valida a entrada do usuário e retorna a seguinte resposta ao Amazon Lex, direcionando o serviço a escolher um valor para a data da consulta.

      { "dialogAction": { "slotToElicit": "Date", "intentName": "MakeAppointment", "responseCard": { "genericAttachments": [ { "buttons": [ { "text": "2-15 (Wed)", "value": "Wednesday, February 15, 2017" }, { "text": "2-16 (Thu)", "value": "Thursday, February 16, 2017" }, { "text": "2-17 (Fri)", "value": "Friday, February 17, 2017" }, { "text": "2-20 (Mon)", "value": "Monday, February 20, 2017" }, { "text": "2-21 (Tue)", "value": "Tuesday, February 21, 2017" } ], "subTitle": "When would you like to schedule your root canal?", "title": "Specify Date" } ], "version": 1, "contentType": "application/vnd.amazonaws.card.generic" }, "slots": { "AppointmentType": "root canal", "Date": null, "Time": null }, "type": "ElicitSlot", "message": { "content": "When would you like to schedule your root canal?", "contentType": "PlainText" } }, "sessionAttributes": {} }

      Novamente, a resposta inclui os campos dialogAction e sessionAttributes. Dentre outras coisas, o campo dialogAction retorna os seguintes campos:

      • type: ao definir esse campo como ElicitSlot, a função do Lambda direciona o Amazon Lex a escolher o valor para o slot especificado no campo slotToElicit. A função do Lambda também fornece uma message para transmitir ao usuário.

      • responseCard: identifica uma lista de valores possíveis para o slot Date. Um cliente que oferece suporte a cartões de resposta (por exemplo, Facebook Messenger) exibe um cartão de resposta que permite que o usuário escolha uma data de consulta:

        Cartão de resposta com a data para programar o canal radicular e três opções: 2-15, 2-16 e 2-17.

        Apesar de a função do Lambda ter retornado cinco datas, o cliente (Facebook Messenger) tem um limite de três botões por cartão de resposta. Portanto, você verá apenas os primeiros três valores na captura de tela.

        Essas datas são codificadas na função do Lambda. Em uma aplicação de produção, você pode usar um calendário para obter datas disponíveis em tempo real. Como as datas são dinâmicas, você deve gerar o cartão de resposta dinamicamente na função do Lambda.

    4. O Amazon Lex observa o dialogAction.type e retorna a resposta a seguir ao cliente que inclui informações da reposta da função do Lambda.

      JSONresposta contendo a intenção de marcar uma consulta, o tipo de compromisso preenchido e uma mensagem indicando a data da consulta.

      O cliente exibe a mensagem: When would you like to schedule your root canal? (Quando você deseja agendar seu canal de raiz?) e o cartão de resposta (se o cliente oferecer suporte a cartões de resposta).

  3. Usuário: tipos Thursday

    1. O cliente envia a seguinte solicitação PostText ao Amazon Lex (quebras de linha foram adicionadas para legibilidade):

      POST /bot/BookTrip/alias/$LATEST/user/bijt6rovckwecnzesbthrr1d7lv3ja3n/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText": "Thursday", "sessionAttributes": {} }
    2. O Amazon Lex invoca a função do Lambda para validação dos dados do usuário enviando o seguinte evento como parâmetro:

      { "currentIntent": { "slots": { "AppointmentType": "root canal", "Date": "2017-02-16", "Time": null }, "name": "MakeAppointment", "confirmationStatus": "None" }, "bot": { "alias": null, "version": "$LATEST", "name": "ScheduleAppointment" }, "userId": "u3fpr9gghj02zts7y5tpq5mm4din2xqy", "invocationSource": "DialogCodeHook", "outputDialogMode": "Text", "messageVersion": "1.0", "sessionAttributes": {} }

      Nos dados de evento, observe o seguinte:

      • invocationSource continua sendo DialogCodeHook. Nesta etapa, estamos apenas validando os dados do usuário.

      • O Amazon Lex define o campo Date no slot currentIntent.slots como 2017-02-16.

      • Amazon Lex simplesmente passa o campo sessionAttributes entre o cliente e a função do Lambda.

    3. A função do Lambda valida a entrada do usuário. Desta vez, a função do Lambda determina que não há consultas disponíveis na data especificada. Ela retorna a seguinte resposta ao Amazon Lex direcionando o serviço a escolher novamente um valor para a data da consulta.

      { "dialogAction": { "slotToElicit": "Date", "intentName": "MakeAppointment", "responseCard": { "genericAttachments": [ { "buttons": [ { "text": "2-15 (Wed)", "value": "Wednesday, February 15, 2017" }, { "text": "2-17 (Fri)", "value": "Friday, February 17, 2017" }, { "text": "2-20 (Mon)", "value": "Monday, February 20, 2017" }, { "text": "2-21 (Tue)", "value": "Tuesday, February 21, 2017" } ], "subTitle": "When would you like to schedule your root canal?", "title": "Specify Date" } ], "version": 1, "contentType": "application/vnd.amazonaws.card.generic" }, "slots": { "AppointmentType": "root canal", "Date": null, "Time": null }, "type": "ElicitSlot", "message": { "content": "We do not have any availability on that date, is there another day which works for you?", "contentType": "PlainText" } }, "sessionAttributes": { "bookingMap": "{\"2017-02-16\": []}" } }

      Novamente, a resposta inclui os campos dialogAction e sessionAttributes. Dentre outras coisas, o dialogAction retorna os seguintes campos:

      • campo dialogAction:

        • type - A função do Lambda define esse valor como ElicitSlot e redefine o campo slotToElicit como Date. A função do Lambda também fornece um message adequado para transmitir ao usuário.

        • responseCard - Retorna uma lista de valores para o slot Date.

      • sessionAttributes: dessa vez, a função do Lambda inclui o atributo de sessão bookingMap. Seu valor é a data solicitada da consulta e das consultas disponíveis (um objeto vazio indica que não há consultas disponíveis).

    4. O Amazon Lex observa o dialogAction.type e retorna a resposta a seguir ao cliente que inclui informações da reposta da função do Lambda.

      JSONresposta mostrando a intenção de marcar uma consulta e mensagem esclarecendo que não há disponibilidade na data solicitada pelo cliente.

      O cliente exibe a mensagem: We do not have any availability on that date, is there another day which works for you? (Não temos nenhuma disponibilidade nessa data, há outro dia que funcione para você?) e o cartão de resposta (se o cliente oferecer suporte a cartões de resposta).

  4. Usuário: dependendo do cliente, o usuário tem duas opções:

    • Se o cartão de resposta for exibido, escolha 2-15 (Wed) (15/2 (quarta)) ou digite Wednesday.

    • Se o cliente não oferecer suporte a cartões de resposta, digite Wednesday.

    1. O cliente envia a seguinte solicitação PostText para o Amazon Lex:

      POST /bot/BookTrip/alias/$LATEST/user/bijt6rovckwecnzesbthrr1d7lv3ja3n/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText": "Wednesday", "sessionAttributes": { } }

      nota

      O cliente Facebook Messenger não define atributos de sessão. Se desejar manter estados de sessão entre as solicitações, você deverá fazer isso na função do Lambda. Em uma aplicação real, talvez você precise manter esses atributos de sessão em banco de dados de back-end.

    2. O Amazon Lex invoca a função do Lambda para validação dos dados do usuário enviando o seguinte evento como parâmetro:

      { "currentIntent": { "slots": { "AppointmentType": "root canal", "Date": "2017-02-15", "Time": null }, "name": "MakeAppointment", "confirmationStatus": "None" }, "bot": { "alias": null, "version": "$LATEST", "name": "ScheduleAppointment" }, "userId": "u3fpr9gghj02zts7y5tpq5mm4din2xqy", "invocationSource": "DialogCodeHook", "outputDialogMode": "Text", "messageVersion": "1.0", "sessionAttributes": { } }

      Amazon Lex atualizou currentIntent.slots definindo o slot Date como 2017-02-15.

    3. A função do Lambda valida a entrada do usuário e retorna a seguinte resposta ao Amazon Lex, direcionando-o a escolher o valor para o horário da consulta.

      { "dialogAction": { "slots": { "AppointmentType": "root canal", "Date": "2017-02-15", "Time": "16:00" }, "message": { "content": "What time on 2017-02-15 works for you? 4:00 p.m. is our only availability, does that work for you?", "contentType": "PlainText" }, "type": "ConfirmIntent", "intentName": "MakeAppointment", "responseCard": { "genericAttachments": [ { "buttons": [ { "text": "yes", "value": "yes" }, { "text": "no", "value": "no" } ], "subTitle": "Is 4:00 p.m. on 2017-02-15 okay?", "title": "Confirm Appointment" } ], "version": 1, "contentType": "application/vnd.amazonaws.card.generic" } }, "sessionAttributes": { "bookingMap": "{\"2017-02-15\": [\"10:00\", \"16:00\", \"16:30\"]}" } }

      Novamente, a resposta inclui os campos dialogAction e sessionAttributes. Dentre outras coisas, o dialogAction retorna os seguintes campos:

      • campo dialogAction:

        • type: a função do Lambda define esse valor como ConfirmIntent, direcionando o Amazon Lex a obter a confirmação do usuário do horário da consulta sugerido na message.

        • responseCard - Retorna uma lista de valores sim/não para o usuário escolher. Se o cliente for compatível com cartões de resposta, ele exibirá o cartão de resposta, como mostrado no exemplo a seguir:

          Cartão de resposta mostrando a confirmação da consulta e duas opções: sim e não.
      • sessionAttributes: a função do Lambda define o atributo de sessão bookingMap com o valor definido como a data da consulta e as consultas disponíveis naquela data. Neste exemplo, são consultas de 30 minutos. Para um canal de raiz que leva uma hora, apenas 16h pode ser marcada.

    4. Como indicado no dialogAction.type na resposta da função do Lambda, o Amazon Lex retorna a seguinte resposta ao cliente:

      JSONresposta mostrando a intenção de marcar uma consulta e todas as vagas preenchidas.

      O cliente exibe a mensagem: Qual é o melhor horário para você em 15/02/2017? Nossa única disponibilidade é às 16h. Tudo bem para você?

  5. Usuário: selecione yes.

    Amazon Lex invoca a função do Lambda com os seguintes dados de evento: Como o usuário respondeu yes, o Amazon Lex define confirmationStatus como Confirmed e define o campo Time no currentIntent.slots como 4 p.m.

    { "currentIntent": { "slots": { "AppointmentType": "root canal", "Date": "2017-02-15", "Time": "16:00" }, "name": "MakeAppointment", "confirmationStatus": "Confirmed" }, "bot": { "alias": null, "version": "$LATEST", "name": "ScheduleAppointment" }, "userId": "u3fpr9gghj02zts7y5tpq5mm4din2xqy", "invocationSource": "FulfillmentCodeHook", "outputDialogMode": "Text", "messageVersion": "1.0", "sessionAttributes": { } }

    Como o confirmationStatus é confirmado, a função do Lambda processa a intenção (marca uma consulta odontológica) e retorna a seguinte resposta ao Amazon Lex:

    { "dialogAction": { "message": { "content": "Okay, I have booked your appointment. We will see you at 4:00 p.m. on 2017-02-15", "contentType": "PlainText" }, "type": "Close", "fulfillmentState": "Fulfilled" }, "sessionAttributes": { "formattedTime": "4:00 p.m.", "bookingMap": "{\"2017-02-15\": [\"10:00\"]}" } }

    Observe o seguinte:

    • A função do Lambda atualizou o sessionAttributes.

    • dialogAction.type é definido como Close, que direciona Amazon Lex a não esperar uma resposta do usuário.

    • dialogAction.fulfillmentState é definido como Fulfilled, indicando que a intenção foi cumprida com êxito.

    O cliente exibe a mensagem: Ok, já agendei sua consulta. Nos vemos às 16h do dia 15/02/2017.