

Aviso de fin de soporte: el 15 de septiembre de 2025, AWS dejaremos de ofrecer soporte para Amazon Lex V1. Después del 15 de septiembre de 2025, ya no podrá acceder a la consola de Amazon Lex V1 ni a los recursos de Amazon Lex V1. Si utiliza Amazon Lex V2, consulte en su lugar la [guía Amazon Lex V2](https://docs.aws.amazon.com/lexv2/latest/dg/what-is.html). 

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.

# Programación de citas
<a name="ex1-sch-appt"></a>

El bot de ejemplo en este ejercicio programa citas para un dentista. El ejemplo también muestra el uso de tarjetas de respuesta para obtener las entradas del usuario con botones. En concreto, el ejemplo ilustra cómo se generan tarjetas de respuesta de forma dinámica en el tiempo de ejecución. 

Puede configurar las tarjetas de respuesta en el momento de la creación (también denominadas tarjetas de respuesta estática) o generarlas dinámicamente en una AWS Lambda función. En este ejemplo, el bot utiliza las siguientes tarjetas de respuesta:
+ Una tarjeta de respuesta que enumera los botones para el tipo de cita. Para ver un ejemplo, consulte la siguiente imagen:  
![\[Tarjeta de respuesta en la que se pide el tipo de cita para programar y tres opciones: “cleaning (30 minutes)”, “root canal (60 minutes)” y “whitening (90 minutes)”.\]](http://docs.aws.amazon.com/es_es/lex/latest/dg/images/respcard-10.png)
+ Una tarjeta de respuesta que enumera los botones para la fecha de la cita. Para ver un ejemplo, consulte la siguiente imagen:  
![\[Tarjeta de respuesta en la que pregunta por la fecha en la que se desea programar la cita y tres opciones: 2-15, 2-16 y 2-17.\]](http://docs.aws.amazon.com/es_es/lex/latest/dg/images/respcard-20.png)
+ Una tarjeta de respuesta que enumera botones para confirmar una propuesta de hora para la cita. Para ver un ejemplo, consulte la siguiente imagen:  
![\[Tarjeta de respuesta en la que se solicita confirmación de la fecha y hora de la cita, con dos opciones: yes y no.\]](http://docs.aws.amazon.com/es_es/lex/latest/dg/images/respcard-30.png)

  

Las fechas y horas disponibles para la cita varían, por lo que debe generan tarjetas de respuesta en el tiempo de ejecución. Puede utilizar una AWS Lambda función para generar estas tarjetas de respuesta de forma dinámica. La función de Lambda devuelve tarjetas de respuesta en su respuesta a Amazon Lex. Amazon Lex incluye la tarjeta de respuesta en su respuesta al cliente. 

Si un cliente (por ejemplo, Facebook Messenger) admite tarjetas de respuesta, el usuario puede seleccionarlas en la lista de botones o escribir la respuesta. Si no las admite, el usuario simplemente escribe la respuesta.

Además del botón que se muestra en el ejemplo anterior, también puede incluir imágenes, archivos adjuntos y otra información útil en las tarjetas de respuesta. Para obtener más información sobre las tarjetas de respuesta, consulte [Tarjetas de respuesta](howitworks-manage-prompts.md#msg-prompts-resp-card).

En este ejercicio, hará lo siguiente:
+ Crea y prueba un bot (usando el ScheduleAppointment plano). Para este ejercicio deberá utilizar un proyecto de bot para configurar y probar rápidamente el bot. Para ver una lista de los proyectos disponibles, consulte [Amazon Lex y AWS Lambda planos](lex-lambda-blueprints.md). Este bot está preconfigurado con una intención (`MakeAppointment`). 

   
+ Cree y pruebe una función Lambda (utilizando el lex-make-appointment-python esquema proporcionado por Lambda). A continuación, deberá configurar la intención `MakeAppointment` para utilizar esta función de Lambda como enlace de código para realizar las tareas de inicialización, validación y cumplimiento.
**nota**  
La función de Lambda del ejemplo muestra una conversación dinámica basada en la disponibilidad simulada de una cita en un dentista. En una aplicación real, se suele utilizar un calendario para programar una cita.
+ Actualizar la configuración de la intención `MakeAppointment` para utilizar la función de Lambda como enlace de código. A continuación, ponga a prueba la experiencia. end-to-end 
+ Publicar el bot de programación de citas en Facebook Messenger para ver las tarjetas de respuesta en acción (actualmente, el cliente en la consola de Amazon Lex no admite tarjetas de respuesta).

En las siguientes secciones se incluye información resumida sobre los proyectos que va a utilizar en este ejercicio.

**Topics**
+ [Descripción general del plan de bots () ScheduleAppointment](#ex1-sch-appt-bp-summary-bot)
+ [Descripción general del esquema de funciones Lambda () lex-make-appointment-python](#ex1-sch-appt-summary-lambda)
+ [Paso 1: creación de un bot de Amazon Lex](ex1-sch-appt-create-bot.md)
+ [Paso 2: creación de una función de Lambda](ex1-sch-appt-create-lambda-function.md)
+ [Paso 3: actualización de la intención - configuración de un enlace de código](ex1-sch-appt-create-integrate.md)
+ [Paso 4: implementación del bot en la plataforma Facebook Messenger](ex-sch-appt-fb-integration.md)
+ [Detalles del flujo de información](ex1-sch-appt-info-flow-details.md)

## Descripción general del plan de bots () ScheduleAppointment
<a name="ex1-sch-appt-bp-summary-bot"></a>

El ScheduleAppointment esquema que se utiliza para crear un bot para este ejercicio viene preconfigurado con lo siguiente:
+ **Tipos de slot**: un tipo de slot personalizado denominado `AppointmentTypeValue` con los valores de enumeración `root canal`, `cleaning` y `whitening`.
+ **Intención**: una intención (`MakeAppointment`), que está preconfigurada de la siguiente manera:
  + **Slots**: la intención está configurada con los siguientes slots:
    + Slot `AppointmentType` del tipo personalizado `AppointmentTypes`.
    + Slot `Date` del tipo integrado `AMAZON.DATE`.
    + Slot `Time` del tipo integrado `AMAZON.TIME`.
  + **Enunciados**: la intención está preconfigurada con los siguientes enunciados: 
    + "Me gustaría concertar una cita"
    + "Concertar una cita" 
    + «Reserva un \$1\$1AppointmentType»

    Si el usuario utiliza uno de estos enunciados, Amazon Lex determina que `MakeAppointment` es la intención y, a continuación, utiliza las preguntas para obtener datos de ranura.
  + **Preguntas**: la intención está preconfigurada con las siguientes preguntas:
    + Pregunta para el slot `AppointmentType`: "¿Qué tipo de cita desea concertar?"
    + Pregunta sobre el `Date` espacio: «¿Cuándo debo programar tu \$1AppointmentType\$1?»
    + Pregunta para el `Time` horario: «¿A qué hora quieres programar el \$1AppointmentType\$1?» and 

      "¿A qué hora el \$1Date\$1?"
    + Pregunta de confirmación: "\$1Time\$1 está disponible. ¿Desea que continúe y programe la cita?" 
    + Mensaje de cancelación: "De acuerdo, no programaré ninguna cita".

## Descripción general del esquema de funciones Lambda () lex-make-appointment-python
<a name="ex1-sch-appt-summary-lambda"></a>

La función Lambda blueprint (lex-make-appointment-python) es un enlace de código para bots que se crea con el blueprint del ScheduleAppointment bot.

Este código de esquema de función Lambda puede realizar tanto tareas como initialization/validation tareas de cumplimiento. 
+ El código de la función de Lambda muestra una conversación dinámica que se basa en un ejemplo de disponibilidad de una cita con el dentista (en aplicaciones reales, se suele utilizar un calendario). Para el día o la fecha que el usuario especifica, el código está configurado como sigue:
  +  Si no hay citas disponibles, la función de Lambda devuelve una respuesta que indica a Amazon Lex que debe preguntar al usuario otro día o fecha (se establece el tipo `dialogAction` en `ElicitSlot)`). Para obtener más información, consulte [Formato de respuesta](lambda-input-response-format.md#using-lambda-response-format).
  + Si solo hay una cita disponible en el día o fecha especificada, la función de Lambda sugiere la hora disponible en la respuesta e indica a Amazon Lex que obtenga la confirmación del usuario fijando `dialogAction` en la respuesta a `ConfirmIntent`. Esto muestra cómo puede mejorar la experiencia del usuario al sugerir de forma proactiva la hora disponible para una cita. 
  + Si hay varias citas disponibles, la función de Lambda devuelve una lista de horas disponibles en la respuesta a Amazon Lex. Amazon Lex devuelve una respuesta al cliente con el mensaje de la función de Lambda.
+ Como enlace de código de cumplimiento, la función de Lambda devuelve un mensaje de resumen que indica que hay una cita programada (es decir, se ha cumplido la intención).

**nota**  
En este ejemplo le mostramos cómo utilizar tarjetas de respuesta. La función de Lambda crea y devuelve una tarjeta de respuesta a Amazon Lex. La tarjeta de respuesta enumera los días y las horas disponibles como botones entre los que elegir. Al probar el bot con el cliente proporcionado por la consola de Amazon Lex, no es posible ver la tarjeta de respuesta. Para verla, debe integrar el bot en una plataforma de mensajería, como Facebook Messenger. Para obtener instrucciones, consulte [Integración de un bot de Amazon Lex con Facebook Messenger](fb-bot-association.md). Para obtener más información sobre las tarjetas de respuesta, consulte [Administración de mensajes](howitworks-manage-prompts.md). 

Cuando Amazon Lex invoca la función de Lambda, le pasa los datos del evento como entrada. Uno de los campos de evento es `invocationSource`, que la función de Lambda utiliza para elegir entre la actividad de validación de la entrada y la de cumplimiento. Para obtener más información, consulte [Formato del evento de entrada](lambda-input-response-format.md#using-lambda-input-event-format).

**Paso siguiente**  
[Paso 1: creación de un bot de Amazon Lex](ex1-sch-appt-create-bot.md)

# Paso 1: creación de un bot de Amazon Lex
<a name="ex1-sch-appt-create-bot"></a>

En esta sección, creará un bot de Amazon Lex utilizando el ScheduleAppointment plano que se proporciona en la consola de Amazon Lex.

1. Inicie sesión en la consola Amazon Lex Consola de administración de AWS y ábrala en [https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/).

1. En la página **Bots**, elija **Crear**.

1. En la página **Create your Lex bot**, haga lo siguiente:
   + Elija el proyecto **ScheduleAppointment**.
   + Deje el nombre del bot predeterminado (ScheduleAppointment).

1. Seleccione **Crear**.

   Este paso guarda y crea el bot. La consola envía las siguientes solicitudes a Amazon Lex durante el proceso de creación: 
   + Crear una nueva versión de los tipos de slot (a partir de la versión \$1LATEST). Para obtener más información sobre los tipos de slot en este proyecto de bot, consulte [Descripción general del plan de bots () ScheduleAppointment](ex1-sch-appt.md#ex1-sch-appt-bp-summary-bot).
   + Crear una versión de la intención `MakeAppointment` (a partir de la versión \$1LATEST). En algunos casos, la consola envía una solicitud para la operación de la API `update` antes de crear una nueva versión. 
   + Actualizar la última versión \$1LATEST del bot. 

     En ese momento, Amazon Lex crea un modelo de machine learning para el bot. Al probar el bot en la consola, esta utiliza la API en tiempo de ejecución para enviar las entradas del usuario de nuevo a Amazon Lex. A continuación, Amazon Lex utiliza el modelo de machine learning para interpretar las entradas del usuario. 

1. La consola muestra el ScheduleAppointment bot. En la pestaña **Editor**, revise los detalles de la intención preconfigurada (`MakeAppointment`).

1. Pruebe el bot en la ventana de pruebas. Utilice la siguiente captura de pantalla para entablar una conversación de prueba con su bot:   
![\[Una conversación con un agente en la que este solicita el tipo, la fecha y la hora de la cita y, a continuación, confirma los detalles de la cita.\]](http://docs.aws.amazon.com/es_es/lex/latest/dg/images/appt-test-no-lambda.png)

   Tenga en cuenta lo siguiente:
   + El bot deduce la intención (`MakeAppointment`) a partir de la entrada inicial del usuario ("Concertar una cita"). 
   + A continuación, el bot utiliza las preguntas configuradas para obtener datos de slot del usuario. 
   + El proyecto de bot tiene la intención `MakeAppointment` configurada con la siguiente pregunta de confirmación:

     ```
     {Time} is available, should I go ahead and book your appointment?
     ```

     Después de que el usuario proporcione todos los datos de ranura, Amazon Lex devuelve una respuesta al cliente con una pregunta de confirmación en forma de mensaje. El cliente muestra el mensaje al usuario:

     ```
     16:00 is available, should I go ahead and book your appointment? 
     ```

   Observe que el bot acepta cualquier valor de fecha y hora para la cita, pues no dispone de ningún código para inicializar o validar los datos del usuario. En la siguiente sección, añadirá una función de Lambda para que lo haga. 

**Paso siguiente**  
[Paso 2: creación de una función de Lambda](ex1-sch-appt-create-lambda-function.md)

# Paso 2: creación de una función de Lambda
<a name="ex1-sch-appt-create-lambda-function"></a>

En esta sección, se crea una función de Lambda mediante un blueprint (lex-make-appointment-python) que se proporciona en la consola de Lambda. También invocará la función de Lambda para probarla con ejemplos de datos de evento de Amazon Lex de muestra proporcionados por la consola.

1. Inicie sesión en Consola de administración de AWS y abra la consola en AWS Lambda . [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)

1. Seleccione **Create a Lambda function (Crear una función Lambda)**.

1. En **Select blueprint**, escriba **lex** para buscar el blueprint y, a continuación, elija el **lex-make-appointment-python**blueprint.

1. Configure la función de Lambda de la siguiente forma.
   + Escriba el nombre de la función de Lambda (`MakeAppointmentCodeHook`).
   + Para el rol, elija **Create a new role from template(s)** y luego escriba el nombre del rol.
   + Deje los demás valores predeterminados.

1. Elija **Crear función**.

1. Si utiliza una configuración regional que no sea Inglés (EE. UU.) (en-US), actualice los nombres de las intenciones tal como se indica en [Actualización de un esquema para una configuración regional específica](lex-lambda-blueprints.md#blueprint-update-locale).

1. Pruebe la función de Lambda.

   1. Elija **Actions** y, a continuación, elija **Configure test event**.

   1. En la lista **Sample event template**, elija **Lex-Make Appointment (preview)**. Este evento de ejemplo utiliza el request/response modelo Amazon Lex, con valores configurados para que coincidan con una solicitud del bot de Amazon Lex. Para obtener información sobre el request/response modelo Amazon Lex, consulte[Uso de funciones de Lambda](using-lambda.md).

   1. Elija **Guardar y probar**.

   1. Compruebe que la función de Lambda se ha ejecutado correctamente. En este caso, la respuesta sigue el modelo de respuesta de Amazon Lex.





**Paso siguiente**  
[Paso 3: actualización de la intención - configuración de un enlace de código](ex1-sch-appt-create-integrate.md)

# Paso 3: actualización de la intención - configuración de un enlace de código
<a name="ex1-sch-appt-create-integrate"></a>

En esta sección, va a actualizar la configuración de la intención `MakeAppointment` para utilizar la función de Lambda como enlace de código para las actividades de validación y cumplimiento. 



1. En la consola Amazon Lex, selecciona el ScheduleAppointment bot. La consola muestra la **MakeAppointment**intención. Modifique la configuración de la intención de la siguiente manera. 
**nota**  
Solo puede actualizar las versiones \$1LATEST de cualquiera de los recursos de Amazon Lex, incluidas las intenciones. Asegúrese de que la versión de la intención esté configurada en \$1LATEST. Aún no ha publicado ninguna versión de su bot, por lo que todavía debería ser la versión \$1LATEST de la consola.

   1. En la sección **Opciones**, elija **Enlace de código de inicialización y validación** y, a continuación, seleccione la función de Lambda en la lista.

   1. En la sección **Cumplimiento**, elija **Función de AWS Lambda** y, a continuación, seleccione la función de Lambda en la lista.

   1. Elija **Goodbye message** y escriba un mensaje.

1. Elija **Save** y, a continuación, elija **Build**.

1. Pruebe el bot, tal como se indica en la siguiente imagen:  
![\[Una conversación con un agente en la que este solicita el tipo, la fecha y la hora de la cita y, a continuación, confirma la cita.\]](http://docs.aws.amazon.com/es_es/lex/latest/dg/images/appt-test-with-lambda.png)

**Paso siguiente**  
[Paso 4: implementación del bot en la plataforma Facebook Messenger](ex-sch-appt-fb-integration.md)

# Paso 4: implementación del bot en la plataforma Facebook Messenger
<a name="ex-sch-appt-fb-integration"></a>

En la sección anterior, probó el ScheduleAppointment bot con el cliente de la consola Amazon Lex. En la actualidad, la consola de Amazon Lex no admite tarjetas de respuesta. Para probar las tarjetas de respuesta generadas dinámicamente que admite el bot, implemente el bot en la plataforma Facebook Messenger y pruébela.

Para obtener instrucciones, consulte [Integración de un bot de Amazon Lex con Facebook Messenger](fb-bot-association.md).

**Paso siguiente**  
[Detalles del flujo de información](ex1-sch-appt-info-flow-details.md)

# Detalles del flujo de información
<a name="ex1-sch-appt-info-flow-details"></a>

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:
+ El flujo de datos entre el cliente y Amazon Lex.

   

  En la sección se asume que el cliente envía las solicitudes a Amazon Lex mediante la API `PostText` de tiempo de ejecución y se muestran request/response los detalles correspondientes. Para obtener más información acerca de la API en tiempo de ejecución `PostText`, consulte [PostText](API_runtime_PostText.md).
**nota**  
Para ver un ejemplo de flujo de la información entre el cliente y Amazon Lex en el que el usuario usa la API `PostContent`, consulte [Paso 2a (opcional): revisión de los detalles del flujo de información escrita (consola)](gs-bp-details-postcontent-flow.md).

   
+ El flujo de datos entre Amazon Lex y la función de Lambda. Para obtener más información, consulte [Formato del evento de entrada y de la respuesta de la función de Lambda](lambda-input-response-format.md).

**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](API_runtime_PostContent.md) 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 URI de la solicitud como el cuerpo proporcionan información a Amazon Lex:
      + URI de la solicitud: proporciona el nombre del bot (ScheduleAppointment), el alias del bot (\$1LATEST) y el ID del nombre de usuario. El `text` de cola indica que se trata de una solicitud de API `PostText` (no `PostContent`).
      + Cuerpo de la solicitud: incluye la entrada del usuario (`inputText`). No hay `sessionAttributes`. 

   1. 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](lambda-input-response-format.md#using-lambda-input-event-format).

      ```
      {
          "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. 

   1. 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](lambda-input-response-format.md#using-lambda-response-format). 

      ```
      {
          "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)”.\]](http://docs.aws.amazon.com/es_es/lex/latest/dg/images/respcard-10.png)

   1. Tal como indica `dialogAction.type` en la respuesta de la función de Lambda, Amazon Lex envía la siguiente respuesta al cliente:   
![\[Respuesta en formato JSON que contiene información acerca de la intención de programar una cita y la ranura del tipo de cita que se debe obtener.\]](http://docs.aws.amazon.com/es_es/lex/latest/dg/images/appt-10.png)

      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).

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

   1. 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.

   1. 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).\]](http://docs.aws.amazon.com/es_es/lex/latest/dg/images/respcard-20.png)

        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.

   1. 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.  
![\[Respuesta en formato JSON que contiene la intención de programar una cita, el tipo de cita rellenado y un mensaje en el que se obtiene la fecha de la cita.\]](http://docs.aws.amazon.com/es_es/lex/latest/dg/images/appt-20.png)

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

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

   1. 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.

   1. 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).

   1. 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.  
![\[Respuesta en formato JSON que indica la intención de programar una cita y un mensaje en el que se comunica que no hay disponibilidad en la fecha que ha solicitado el cliente.\]](http://docs.aws.amazon.com/es_es/lex/latest/dg/images/appt-30.png)

      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).

1. 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.

   1. 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`. 

   1. 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 yes/no valores entre los que puede elegir el usuario. 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.\]](http://docs.aws.amazon.com/es_es/lex/latest/dg/images/respcard-30.png)
      + `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.

        

   1. Como se indica en `dialogAction.type` en la respuesta de la función de Lambda, Amazon Lex devuelve la siguiente respuesta al cliente:   
![\[Respuesta en formato JSON en la que se muestra la intención de programar la cita y todas las ranuras rellenadas.\]](http://docs.aws.amazon.com/es_es/lex/latest/dg/images/appt-40.png)

      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?**

   

1. 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**.





