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:
-
Fluxo de dados entre o cliente e Amazon Lex.
A seção pressupõe que o cliente envie solicitações para o Amazon Lex usando o
PostText
tempo de execução API e mostre os detalhes da solicitação/resposta adequadamente. Para obter mais informações sobre oPostText
tempo de execuçãoAPI, consultePostText.nota
Para obter um exemplo de fluxo de informações entre o cliente e o Amazon Lex no qual o cliente usa o
PostContent
API, consulteEtapa 2a (opcional): revisar os detalhes do fluxo de informações falado (console) . -
Fluxo de dados entre Amazon Lex e a função do Lambda. Para obter mais informações, consulte Evento de entrada de função do Lambda e formato de resposta.
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.
-
Usuário: tipos
Book an appointment
-
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
) esessionAttributes
vazio.
-
-
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.
-
-
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
esessionAttributes
. Dentre outras coisas, o campodialogAction
retorna os seguintes campos:-
type
: ao definir esse campo comoElicitSlot
, a função do Lambda direciona o Amazon Lex a escolher o valor para o slot especificado no camposlotToElicit
. A função do Lambda também fornece umamessage
para transmitir ao usuário. -
responseCard
: identifica uma lista de valores possíveis para o slotAppointmentType
. 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:
-
-
Como indicado pelo
dialogAction.type
na resposta da função do Lambda, Amazon Lex envia a seguinte resposta de volta para o cliente: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).
-
-
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
.
-
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": {} } -
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 sendoDialogCodeHook
. Nesta etapa, estamos apenas validando os dados do usuário. -
O Amazon Lex define o campo
AppointmentType
no slotcurrentIntent.slots
comoroot canal
. -
Amazon Lex simplesmente passa o campo
sessionAttributes
entre o cliente e a função do Lambda.
-
-
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
esessionAttributes
. Dentre outras coisas, o campodialogAction
retorna os seguintes campos:-
type
: ao definir esse campo comoElicitSlot
, a função do Lambda direciona o Amazon Lex a escolher o valor para o slot especificado no camposlotToElicit
. A função do Lambda também fornece umamessage
para transmitir ao usuário. -
responseCard
: identifica uma lista de valores possíveis para o slotDate
. 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: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.
-
-
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.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).
-
-
Usuário: tipos
Thursday
-
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": {} } -
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 sendoDialogCodeHook
. Nesta etapa, estamos apenas validando os dados do usuário. -
O Amazon Lex define o campo
Date
no slotcurrentIntent.slots
como2017-02-16
. -
Amazon Lex simplesmente passa o campo
sessionAttributes
entre o cliente e a função do Lambda.
-
-
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
esessionAttributes
. Dentre outras coisas, odialogAction
retorna os seguintes campos:-
campo
dialogAction
:-
type
- A função do Lambda define esse valor comoElicitSlot
e redefine o camposlotToElicit
comoDate
. A função do Lambda também fornece ummessage
adequado para transmitir ao usuário. -
responseCard
- Retorna uma lista de valores para o slotDate
.
-
-
sessionAttributes
: dessa vez, a função do Lambda inclui o atributo de sessãobookingMap
. Seu valor é a data solicitada da consulta e das consultas disponíveis (um objeto vazio indica que não há consultas disponíveis).
-
-
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.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).
-
-
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
.
-
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.
-
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 slotDate
como2017-02-15
. -
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
esessionAttributes
. Dentre outras coisas, odialogAction
retorna os seguintes campos:-
campo
dialogAction
:-
type
: a função doLambda
define esse valor comoConfirmIntent
, direcionando o Amazon Lex a obter a confirmação do usuário do horário da consulta sugerido namessage
. -
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:
-
-
sessionAttributes
: a função do Lambda define o atributo de sessãobookingMap
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.
-
-
Como indicado no
dialogAction.type
na resposta da função do Lambda, o Amazon Lex retorna a seguinte resposta ao cliente: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ê?
-
-
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 defineconfirmationStatus
comoConfirmed
e define o campoTime
nocurrentIntent.slots
como4 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 comoClose
, que direciona Amazon Lex a não esperar uma resposta do usuário. -
dialogAction.fulfillmentState
é definido comoFulfilled
, 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.
-