Detalles del flujo de información - Amazon Lex V1

Si utiliza Amazon Lex V2, consulte la guía de Amazon Lex V2.

 

Si utiliza Amazon Lex V1, le recomendamos que actualice los bots a Amazon Lex V2. Hemos dejado de agregar nuevas características a V1, por lo que recomendamos encarecidamente utilizar V2 para todos los nuevos bots.

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Detalles del flujo de información

El proyecto de bot ScheduleAppointment muestra principalmente el uso de tarjetas de respuesta generadas dinámicamente. En este ejercicio, la función de Lambda incluye tarjetas de respuesta en su respuesta a Amazon Lex. Amazon Lex incluye las tarjetas de respuesta en su respuesta al cliente. En esta sección se explican los dos flujos siguientes:

nota

El ejemplo asume que está utilizando el cliente Facebook Messenger, que no transfiere los atributos de la sesión en la solicitud a Amazon Lex. En consecuencia, las solicitudes de ejemplo que aparecen en esta sección mostrarán los sessionAttributes vacíos. Si prueba el bot con el cliente proporcionado en la consola de Amazon Lex, el cliente incluirá los atributos de la sesión.

En esta sección se describe lo que ocurre después de cada entrada del usuario.

  1. Usuario: escribe Book an appointment.

    1. El cliente (la consola) envía la siguiente solicitud PostContent a Amazon Lex:

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

      Tanto la solicitud URI como el organismo proporcionan información a Amazon Lex:

      • SolicitudURI: proporciona el nombre del bot (ScheduleAppointment), el alias del bot ($LATEST) y el ID del nombre de usuario. Al final text indica que se trata de una PostText (noPostContent) API solicitud.

      • Cuerpo de la solicitud: incluye la entrada del usuario (inputText). No hay sessionAttributes.

    2. Amazon Lex deduce la intención (MakeAppointment) a partir de inputText. El servicio invoca la función de Lambda, que está configurada como enlace de código, para que lleve a cabo la inicialización y la validación al transferir el siguiente evento. Para obtener más información, consulte Formato del evento 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": {} }

      Además de la información que envía el cliente, Amazon Lex también incluye los siguientes datos:

      • currentIntent: proporciona información sobre la intención actual.

      • invocationSource: indica la finalidad de la invocación de la función de Lambda. En este caso, la finalidad consiste en inicializar y validar los datos del usuario. Amazon Lex sabe que el usuario no ha proporcionado todos los datos de ranura para cumplir la intención.

      • messageVersion: actualmente Amazon Lex solo es compatible con la versión 1.0.

    3. En este momento, todos los valores de slot son nulos (no hay nada que validar). La función de Lambda devuelve la siguiente respuesta a Amazon Lex para que el servicio obtenga información para la ranura AppointmentType. Para obtener más información sobre el formato de la respuesta, consulte Formato de respuesta.

      { "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": {} }

      La respuesta incluye los campos dialogAction y sessionAttributes. Entre otras cosas, el campo dialogAction devuelve los siguientes campos:

      • type: al configurar este campo con ElicitSlot, la función de Lambda indica a Amazon Lex que obtenga el valor de la ranura especificado en el campo slotToElicit. La función de Lambda también proporciona un valor message que transmitir al usuario.

      • responseCard: identifica una lista de valores posibles para la ranura AppointmentType. Un cliente que admite tarjetas de respuesta (por ejemplo, Facebook Messenger) muestra una tarjeta de respuesta para permitir al usuario que elija un tipo de cita, tal como se muestra en la siguiente imagen:

        Tarjeta de respuesta en la que se pide el tipo de cita a programar y tres opciones: “cleaning (30 minutes)”, “root canal (60 minutes)” y “whitening (30 minutes)”.
    4. Tal como indica dialogAction.type en la respuesta de la función de Lambda, Amazon Lex envía la siguiente respuesta al cliente:

      JSONrespuesta que contiene información sobre la intención de concertar una cita y el tipo de cita que se va a solicitar.

      El cliente lee la respuesta y, a continuación, muestra el mensaje: “¿Qué tipo de cita desea concertar?” y la tarjeta de respuesta (si el cliente admite tarjetas de respuesta).

  2. Usuario: dependiendo del cliente, el usuario tiene dos opciones:

    • Si se muestra la tarjeta de respuesta, elija root canal (60 min) o escriba root canal.

    • Si el cliente no admite tarjetas de respuesta, escriba root canal.

    1. El cliente envía la siguiente solicitud PostText a Amazon Lex (se han añadido saltos de línea para facilitar la lectura):

      POST /bot/BookTrip/alias/$LATEST/user/bijt6rovckwecnzesbthrr1d7lv3ja3n/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText": "root canal", "sessionAttributes": {} }
    2. Amazon Lex invoca la función de Lambda para que valide los datos del usuario mediante el envío del siguiente 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": {} }

      En los datos de evento, tenga en cuenta lo siguiente:

      • invocationSource sigue siendo DialogCodeHook. En este paso, solo se validan los datos del usuario.

      • Amazon Lex establece el campo AppointmentType de la ranura currentIntent.slots en root canal.

      • Amazon Lex simplemente transfiere el campo sessionAttributes entre el cliente y la función de Lambda.

    3. La función de Lambda valida la entrada del usuario y devuelve la siguiente respuesta a Amazon Lex para que el servicio obtenga un valor para la fecha de la cita.

      { "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": {} }

      De nuevo, la respuesta incluye los campos dialogAction y sessionAttributes. Entre otras cosas, el campo dialogAction devuelve los siguientes campos:

      • type: al configurar este campo con ElicitSlot, la función de Lambda indica a Amazon Lex que obtenga el valor de la ranura especificado en el campo slotToElicit. La función de Lambda también proporciona un valor message que transmitir al usuario.

      • responseCard: identifica una lista de valores posibles para la ranura Date. Un cliente que admite tarjetas de respuesta (por ejemplo, Facebook Messenger) muestra una tarjeta de respuesta para permitir al usuario que elija un tipo de cita, tal como se muestra en la siguiente imagen:

        Tarjeta de respuesta en la que se obtiene la fecha en la que se desea programar la endodoncia y tres opciones: 2-15 (Wed), 2-16 (Thu) y 2-17 (Fri).

        Aunque la función de Lambda devuelva cinco fechas, el cliente (Facebook Messenger) tiene un límite de tres botones por tarjeta de respuesta. Por lo tanto, en la captura de pantalla solo verá los primeros tres valores.

        Estas fechas están codificadas de forma rígida en la función de Lambda. En una aplicación de producción, puede utilizar un calendario para ver las fechas disponibles en tiempo real. Dado que las fechas son dinámicas, debe generar la tarjeta de respuesta dinámicamente en la función de Lambda.

    4. Amazon Lex detecta el valor de dialogAction.type y devuelve la siguiente respuesta al cliente que incluye información de la respuesta de la función de Lambda.

      JSONrespuesta que contiene la intención de concertar una cita, el tipo de cita cumplimentado y un mensaje con la fecha de la cita.

      El cliente muestra el mensaje: ¿Cuándo desea concertar su endodoncia? y la tarjeta de respuesta (si el cliente admite tarjetas de respuesta).

  3. Usuario: escribe Thursday.

    1. El cliente envía la siguiente solicitud PostText a Amazon Lex (se han añadido saltos de línea para facilitar la lectura):

      POST /bot/BookTrip/alias/$LATEST/user/bijt6rovckwecnzesbthrr1d7lv3ja3n/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText": "Thursday", "sessionAttributes": {} }
    2. Amazon Lex invoca la función de Lambda para que valide los datos del usuario mediante el envío del siguiente 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": {} }

      En los datos de evento, tenga en cuenta lo siguiente:

      • invocationSource sigue siendo DialogCodeHook. En este paso, solo se validan los datos del usuario.

      • Amazon Lex establece el campo Date de la ranura currentIntent.slots en 2017-02-16.

      • Amazon Lex simplemente transfiere sessionAttributes entre el cliente y la función de Lambda.

    3. La función de Lambda valida la entrada del usuario. Esta vez, la función de Lambda determina que no hay citas disponibles en la fecha especificada. Por ello, devuelve la siguiente respuesta a Amazon Lex para que el servicio obtenga un nuevo valor para la fecha de la cita.

      { "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\": []}" } }

      De nuevo, la respuesta incluye los campos dialogAction y sessionAttributes. Entre otras cosas, dialogAction devuelve los siguientes campos:

      • dialogAction field:

        • type: la función de Lambda establece este valor en ElicitSlot y restablece el campo slotToElicit con Date. La función de Lambda también proporciona un valor de message adecuado para el usuario.

        • responseCard: devuelve una lista de valores para el slot Date.

      • :sessionAttributes: esta vez, la función de Lambda incluye el atributo de la sesión bookingMap. Su valor es la fecha solicitada de la cita y las citas disponibles (un objeto vacío significa que no hay citas disponibles).

    4. Amazon Lex detecta el valor de dialogAction.type y devuelve la siguiente respuesta al cliente que incluye información de la respuesta de la función de Lambda.

      JSONrespuesta que muestre la intención de concertar una cita y mensaje en el que se aclare que no hay disponibilidad en la fecha solicitada por el cliente.

      El cliente muestra el mensaje: We do not have any availability on that date, is there another day which works for you? y la tarjeta de respuesta (si el cliente admite tarjetas de respuesta).

  4. Usuario: dependiendo del cliente, el usuario tiene dos opciones:

    • Si se muestra la tarjeta de respuesta, elija 2-15 (Wed) o escriba Wednesday.

    • Si el cliente no admite tarjetas de respuesta, escriba Wednesday.

    1. El cliente envía la siguiente solicitud PostText a Amazon Lex:

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

      nota

      El cliente Facebook Messenger no establece atributos de la sesión. Si desea conservar los estados de sesión entre las solicitudes, debe hacerlo en la función de Lambda. En una aplicación real, es posible que tenga que almacenar estos atributos de la sesión en una base de datos back-end.

    2. Amazon Lex invoca la función de Lambda para que valide los datos del usuario mediante el envío del siguiente 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 ha actualizado currentIntent.slots al configurar la ranura Date con 2017-02-15.

    3. La función de Lambda valida la entrada del usuario y devuelve la siguiente respuesta a Amazon Lex para que obtenga un valor para la hora de la cita.

      { "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\"]}" } }

      De nuevo, la respuesta incluye los campos dialogAction y sessionAttributes. Entre otras cosas, dialogAction devuelve los siguientes campos:

      • dialogAction field:

        • type: la función Lambda establece este valor en ConfirmIntent para que Amazon Lex obtenga la confirmación por parte del usuario de la hora de la cita sugerida en message.

        • responseCard: devuelve una lista de valores sí/no para que el usuario elija. Si el cliente admite tarjetas de respuesta, mostrará la tarjeta de respuesta, tal y como aparece en el ejemplo siguiente:

          Tarjeta de respuesta en la que se muestra la confirmación de la cita y dos opciones: yes y no.
      • sessionAttributes: la función de Lambda establece como valor del atributo de sesión bookingMap la fecha de la cita y las citas disponibles en esa fecha. En este ejemplo, trabajamos con citas de 30 minutos. Para una endodoncia se necesita una hora y solo está disponible las 16:00 horas.

    4. Como se indica en dialogAction.type en la respuesta de la función de Lambda, Amazon Lex devuelve la siguiente respuesta al cliente:

      JSONrespuesta que muestre la intención de concertar una cita y todos los espacios ocupados.

      El cliente muestra el siguiente mensaje: What time on 2017-02-15 works for you? 4:00 p.m. is our only availability, does that work for you?

  5. Usuario: elija yes.

    Amazon Lex invoca la función de Lambda con los siguientes datos del evento. Dado que el usuario ha contestado yes, Amazon Lex establece confirmationStatus en Confirmed y el campo Time en currentIntent.slots para 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": { } }

    Puesto que confirmationStatus está confirmado, la función de Lambda procesa la intención (programa una cita con el dentista) y devuelve la siguiente respuesta a 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\"]}" } }

    Tenga en cuenta lo siguiente:

    • La función Lambda ha actualizado los sessionAttributes.

    • dialogAction.type se establece en Close, por lo que Amazon Lex no esperará ninguna respuesta del usuario.

    • dialogAction.fulfillmentState se establece en Fulfilled, lo que indica que se ha cumplido la intención correctamente.

    El cliente muestra el mensaje: Okay, I have booked your appointment. We will see you at 4:00 p.m. on 2017-02-15.