Aviso de fim do suporte: em 15 de setembro de 2025, o suporte para o Amazon Lex V1 AWS será interrompido. Depois de 15 de setembro de 2025, você não poderá mais acessar o console do Amazon Lex V1 ou os recursos do Amazon Lex V1. Se você estiver usando o Amazon Lex V2, consulte o guia do Amazon Lex V2 em vez disso.
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 supõe que o cliente envia solicitações ao Amazon Lex usando a API de runtime
PostText
e exibe os detalhes de solicitação/resposta adequadamente. Para obter mais informações sobre a API de runtimePostText
, consulte PostText.nota
Para obter um exemplo do fluxo de informações entre o cliente e Amazon Lex em que o cliente usa a API
PostContent
, consulte Etapa 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":{} }O URI de solicitação e o corpo fornecem informações ao Amazon Lex:
-
URI de solicitação — fornece o nome do bot (ScheduleAppointment), o alias do bot ($LATEST) e o ID do nome do usuário. O
text
final indica que esta é uma solicitação de APIPostText
(nãoPostContent
). -
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.
-