Configuración de entidades de bolsa compuestas

Las entidades de bolsa compuesta permiten escribir definiciones de flujo de diálogo mucho más cortas y compactas, ya que se pueden resolver utilizando solo un componente (resolver entidades o una respuesta común).

Le recomendamos que utilice este enfoque, ya que no necesita componentes como Switch o Set Variable para capturar todas las entradas de usuario necesarias para realizar algunas transacciones empresariales. En su lugar, un solo componente puede pedir a los usuarios que proporcionen valores para cada elemento de la bolsa. Las peticiones de datos son específicas de las condiciones, ya que se basan en la configuración individual de cada elemento de la bolsa. Mediante la entidad de bolsa compuesta, un manejador de eventos de entidad o Apache FreeMarker, y los componentes Respuesta común o Resolución de entidades, la aptitud puede:
  • Capturar todo el texto libre, permitir cargas de archivos y recopilar la ubicación actual del usuario con los elementos STRING, ATTACHMENT y LOCATION.

  • Ejecutar el comportamiento individual de cada entidad miembro en la bolsa: puede agregar peticiones de datos específicas de un valor y mensajes de error para entidades individuales de la bolsa compuesta (que incluye entidades personalizadas, entidades del sistema y elementos STRING, ATTACHMENT y LOCATION). También puede controlar qué entidades deben coincidir (o no) con la entrada del usuario. Dado que puede crear una secuencia de petición de datos, la aptitud puede generar distintas peticiones de datos para cada intento del usuario.

  • Presente listas de selección múltiple.

  • Valide las coincidencias de valores según las reglas de validación.

  • Soporte al flujo "infeliz": los usuarios pueden corregir las entradas anteriores.

  • Ejecute transiciones temporales basadas en coincidencias: el flujo de diálogo puede salir temporalmente del componente cuando se parea una entidad, de manera que otro estado pueda realizar una función complementaria, como una llamada REST. Una vez completada la función, el flujo de diálogo vuelve al componente para que la coincidencia de valores pueda continuar. Por ejemplo:
    • Cuando un usuario carga un recibo, es necesario escanearlo para que se puedan extraer de él valores como la fecha de gasto, el importe y el tipo de gasto, que se pasarán a las restantes entidades de la bolsa. De este modo, el componente puede rellenar el resto de valores a partir del recibo, no a partir de la entrada de usuario.

    • La aptitud genera un mensaje como, por ejemplo, “Casi hemos acabado, solo quedan unas preguntas”, entre los juegos de entidades coincidentes de la bolsa.

    • La entrada de usuario debe validarse mediante una llamada REST de backend. Es posible que sea necesario efectuar la validación de inmediato, ya que determina cuál de los elementos de la bolsa debe solicitar más entradas del usuario. Otra opción es que la llamada devuelva la información que se deba compartir con el usuario, como un aviso de tipo "incumplimiento de la política".

  • Desambiguación de valores: puede aislar un valor de la entrada de usuario mediante peticiones de datos específicas de la entidad y propiedades de componentes. Permiten efectuar correcciones en entradas anteriores (flujo “infeliz”) y solicitar entradas de usuario para propiedades de entidad incorporadas específicas.

Creación de una entidad de bolsa compuesta

  1. Haga clic en Entidades Imagen del icono Entidades. en la barra de navegación lateral.

  2. Haga clic en Agregar entidades.

  3. Seleccione Bolsa compuesta como tipo de entidad.

  4. Introduzca el nombre y la descripción.
  5. Haga clic en + Manejador de eventos si desea utilizar la petición de datos y la lógica de la bolsa compuesta mediante programación mediante manejadores de eventos de entidades.
  6. Haga clic en Agregar elemento de bolsa para abrir el cuadro de diálogo Agregar elemento de bolsa. Si va a agregar una entidad incorporada o una entidad personalizada existente, puede crear un nombre específico de la bolsa y agregar una descripción del rol dentro del contexto de la bolsa compuesta.

  7. Puede rellenar la bolsa con entidades personalizadas, entidades incorporadas y los siguientes elementos:
    • STRING: captura el texto libre del usuario.

    • LOCATION: captura la ubicación del usuario.

    • ATTACHMENT: acepta archivos, archivos de audio, vídeos o archivos de imagen cargados por el usuario. La entidad de bolsa compuesta almacena el URL donde se aloja el anexo.

    Nota

    Al agregar la entidad DATE_TIME, se le solicitará un subtipo.
    Los elementos se resuelven en el orden en el que se agregan. Sin embargo, la secuencia puede verse afectada según cómo se configuren los miembros individuales de la bolsa compuesta.
  8. Al hacer clic en Cerrar, volverá a la página Entidades, pero antes podrá agregar otras capacidades específicas de la bolsa al elemento (o actualizarlo más tarde haciendo clic en Imagen del icono Editar. en la página Entidades).

  9. siguientes pasos:
    • Agregue mensajes de error individuales, peticiones de datos de desambiguación o peticiones de datos condicionales para los elementos de la bolsa.
      Nota

      Estos se sobrescribirán si agrega la entidad a una bolsa compuesta.
    • Agregue la entidad a una intención. Consulte Agregar entidades a intenciones.

    • Configure el flujo de diálogo para que utilice la entidad de bolsa compuesta..

Relleno de espacios mejorado

Al activar el relleno de ranuras mejorado, active Usar relleno de ranuras mejorado en Configuración > Configuración:
  • Solo se actualizará el elemento que se está resolviendo actualmente. Cuando una coincidencia se aplica a más de un elemento de bolsa, el elemento de bolsa que se está resolviendo actualmente tiene prioridad sobre otros elementos. Si desactiva el relleno de espacio mejorado, todos los elementos se actualizarán con el mismo valor.
  • Si el artículo de resolución actual es un artículo de bolsa STRING, no se actualizará ningún otro artículo de bolsa.
  • Si una coincidencia de entidad se aplica a varios elementos de bolsa (no resueltos), se muestra un cuadro de diálogo de desambiguación, que permite al usuario elegir qué elemento se debe actualizar en lugar de actualizar todos los elementos de bolsa.
  • Se ignora el conmutador Petición de datos para desambiguación de la entidad. Recomendamos implantar la desambiguación personalizada con un manejador de eventos de entidad.
Nota

El conmutador Usar relleno de espacio mejorado está activado por defecto para las aptitudes creadas con la versión 22.08 de la plataforma. Está desactivado para las aptitudes que se han actualizado a esta versión.

Agregar peticiones de datos

Puede agregar una petición de datos única o crear una secuencia de peticiones de datos, de modo que cada una proporcione información cada vez más específica siempre que el usuario introduzca un valor no válido. Por defecto, la petición de datos está activada. Para agregar estas peticiones de datos:
  1. Si desea activar la petición de datos, deje el campo Petición de valor en blanco (su estado por defecto). Si se introduce false en el campo Petición de valor, se evita la petición de datos. Para pedir un valor condicional, agregue una expresión booleana de FreeMarker que se evalúe como true (para la petición de datos) o false.

    Consejo:

    Al definir Petición de valor en false, el elemento podrá resolverse como parte de otro elemento para el que se realice una petición de datos si se activa Extracción en secuencia incorrecta.
  2. Haga clic en Agregar petición de datos para crear la secuencia de peticiones de datos. Si necesita cambiar el orden de la secuencia, puede hacerlo moviendo los campos con gestos de arrastrar y soltar o volviendo a numerarlos. Para aleatorizar la salida de las peticiones de datos, asigne el mismo número a dos o más peticiones de datos.
    Nota

    Solo se pueden agregar peticiones de datos para entidades incorporadas si se agregan a una bolsa compuesta.
    Puede almacenar peticiones de datos en grupos de recursos (por ejemplo, ${rb.askCheese}) o escribirlas como combinaciones de texto y expresiones de FreeMarker.

Actualización de valores ranurados con expresiones FreeMarker de Apache

En el campo Actualizable, introduzca una expresión FreeMarker de Apache que se evalúe en true para permitir que se actualice el valor con espacio para un elemento de bolsa compuesta.

Activación de la extracción en secuencia incorrecta

La extracción fuera de orden permite ubicar y actualizar valores para un elemento de bolsa compuesta en cualquier momento de la conversación, independientemente de si la bolsa compuesta ha solicitado o no el valor al usuario. Con las siguientes reglas, puede definir cómo, cuándo o si un valor se puede colocar o cambiar en cualquier momento de la conversación para cualquier elemento o subtipo de elemento (como los subtipos DATE_TIME).
  • Siempre: la opción por defecto. Al seleccionar esta opción para un elemento, se puede asignar espacio a su valor sin ninguna petición de datos. Por ejemplo, la entidad PizzaSize se puede resolver cuando un cliente introduce Quiero una pizza grande. Esta opción también permite cambiar el valor del elemento en cualquier momento, siempre que la expresión de la propiedad Actualizable no se evalúe como false. Por ejemplo, cuando la bolsa compuesta solicita la entidad PizzaType, el cliente puede responder Vegría, por favor, pero que sea mediana. La aptitud puede actualizar el valor de la entidad PizzaSize con el medio sin necesidad de reiniciar la conversación, ya que Siempre se ha activado para los elementos PizzaSize y PizzaType de la bolsa.
    Nota

    Aunque esta opción es el comportamiento por defecto, puede que no siempre sea adecuado para elementos STRING. Si se selecciona esta opción para un elemento de tipo STRING, por ejemplo, el primer mensaje de usuario sería almacenado por el elemento de tipo STRING, en lugar de parearse con la entidad prevista (que podría designarse como el primer elemento de la bolsa que se va a resolver).
  • Nunca: al seleccionar esta opción, el elemento solo se coloca después de que se le solicite, incluso cuando otros mensajes de usuario contienen valores válidos. Seleccione Nunca para evitar coincidencias involuntarias.
  • Solo al resolver la expresión de intención: restringe el espacio de valores fuera de orden a la primera expresión de usuario que se ha resuelto en la intención asociada a la entidad de bolsa compuesta.
A continuación, se muestran ejemplos de las reglas de extracción en orden a medida que se aplican a un elemento de bolsa compuesta PizzaToppings.
Regla de extracción en secuencia incorrecta Expresión inicial del usuario Valor asignado Notas:
Siempre Pedir pizza con atún Atún El espacio de valores para el elemento PizzaToppings se puede hacer coincidir siempre que el mensaje de usuario contenga el valor correcto ("¡En su lugar, setas!). Se puede colocar o actualizar en cualquier momento de la conversación sin preguntar.
Nunca Pedir pizza con atún Ninguna. El valor del artículo PizzaTopping no se puede colocar fuera de servicio ni actualizar ad hoc. Solo se puede hacer coincidir cuando se le solicite.
Solo al resolver la expresión de intención Pedir pizza con atún Atún. Sin embargo, si el usuario introduce "Ordenar pizza grande", la bolsa compuesta tendría que solicitar el valor PizzaTopping. El elemento PizzaTopping se puede colocar fuera de orden solo cuando la primera expresión de usuario que se resuelve en una intención tiene un valor coincidente. De lo contrario, se debe solicitar este valor. La bolsa compuesta no permitirá la actualización o colocación ad hoc de este artículo.

Activación de Extraer con

Utilice la opción Extraer con para permitir a la aptitud resolver un elemento de bolsa utilizando la entrada introducida para un segundo elemento de la bolsa. Esta opción, que permite a la aptitud gestionar valores relacionados, aporta flexibilidad a las entradas de usuario. Por ejemplo, los usuarios pueden introducir domicilio en lugar de una dirección completa. Aquí se muestra cómo:
  • La bolsa compuesta tiene dos entidades relacionadas con la dirección: NamedAddress, una entidad de valor de lista con valores como domicilio y oficina, y DeliveryAddress, una entidad ADDRESS.
  • La petición de datos de la entidad DeliveryAddress es ¿Dónde quiere que le entreguemos el pedido?
  • La entidad NamedAddress no solicita una entrada (se introduce false en el campo Petición de datos de valor).
  • La entidad NamedAddress se puede extraer con DeliveryAddress (se selecciona DeliveryAddress en el menú Extraer con ).

Si la bolsa compuesta solicita la entidad DeliveryAddress, puede resolver la entidad utilizando una dirección física o uno de los valores de NamedAddress ( domicilio u oficina).

Agregar reglas de validación

Cada elemento de la bolsa puede tener sus propias reglas de validación. Para agregar una regla de validación, primero debe hacer clic en Agregar regla de validación y, a continuación, agregar expresiones de FreeMarker y una petición de datos de texto. La expresión utiliza el siguiente patrón para hacer referencia al valor del elemento, donde varName es el nombre de la entidad de bolsa compuesta que se declara como variable en la definición del flujo de diálogo:
${varName.value.itemName}
Si esta expresión se evalúa en false, la entrada de usuario no es válida.
El siguiente ejemplo de expresión de validación se centra en un elemento denominado Amount. Se trata de una propiedad de la entidad incorporada CURRENCY. Para que se devuelva un importe numérico para la comparación, la expresión agrega la propiedad amount de la entidad CURRENCY:
${expense.value.Amount.amount > 4}
El mensaje de validación correspondiente también puede reflejar la entrada del usuario mediante una expresión de FreeMarker. Por ejemplo, el siguiente mensaje utiliza el tipo de moneda extraído de la entrada del usuario como parte del mensaje de validación:
Amounts below 5 ${expense.value.Amount.currency} cannot be expensed. Enter a higher amount or type 'cancel'.
Para obtener más información sobre otras propiedades de CURRENCY (así como sobre otras propiedades de entidad incorporadas), consulte Entidades incorporadas y sus propiedades.

Configuración de un flujo de diálogo YAML para entidades de bolsa compuestas

Si la aptitud se está desarrollando en modo de diálogo YAML, estas son las acciones que debe realizar para configurar el flujo de diálogo para entidades de bolsa compuesta:

  1. En el nodo context, declare la entidad de bolsa compuesta como una variable:
    ...
    metadata:
      platformVersion: "1.1"
    main: true
    name: "ExpenseBot"
    context:
      variables:
        expense: "Expense"
        iResult: "nlpresult"
  2. Puede utilizar System.ResolveEntities o System.CommonResponse. Ambos componentes permiten utilizar la entidad de bolsa compuesta y cada uno de ellos tiene sus ventajas. System.ResolveEntities es el más sencillo de los dos, ya que cuenta con un conjunto de propiedades pequeño. A diferencia del componente System.ResolveEntities, System.CommonResponse proporciona más control sobre la interfaz de usuario que se utiliza para resolver las entidades de la bolsa. Por ejemplo, puede agregar lógica condicional para determinar las peticiones de datos y las acciones globales relacionadas con los valores.

    Consejo:

    Debido a que los metadatos para el componente System.CommonResponse pueden volverse muy complejos cuando se utilizan entidades de bolsa compuesta, se recomienda utilizar el componente System.ResolveEntities en su lugar y utilizar manejadores de eventos de entidades para cualquier personalización de la interfaz de usuario.
  3. Haga referencia a la variable de contexto de la entidad de bolsa compuesta en la propiedad variable del componente y, a continuación, defina las propiedades restantes según sea necesario. En System.ResolveEntities y Propiedades component, se describen y se ofrecen más ejemplos.

    A continuación, se muestra un ejemplo del componente System.ResolveEntities:
    createExpense:
        component: "System.ResolveEntities"
        properties:
          variable: "expense"
          useFullEntityMatches: true
          nlpResultVariable: "iResult"
          cancelPolicy: "immediate"
        transitions:
          actions:
            cancel: "cancelExpense"
          return: "done"          

Variable system.entityToResolve

La variable system.entityToResolve proporciona información sobre el estado actual del proceso de resolución de entidades, tal y como lo realizan los componentes Resolver entidades y Respuesta común. Normalmente, hará referencia a las propiedades de este valor de variable en los metadatos del componente de respuesta común cuando desee personalizar los mensajes. Puede utilizarla para definir la lógica del mensaje de error de una entidad, o para varias propiedades que pertenecen a los componentes Resolver entidades y Respuesta común. Agregue las siguientes propiedades para devolver el valor de la entidad actual:
  • userInput
  • prompt
  • promptCount
  • updatedEntities
  • outOfOrderMatches
  • disambiguationValues
  • enumValues
  • needShowMoreButton
  • rangeStartVar
  • nextRangeStart
También puede hacer referencia a las propiedades de las expresiones FreeMarker que han utilizado propiedades de elementos de bolsa como prompt, errorMessage y reglas de validación.
A continuación, se muestra un ejemplo del uso de esta variable para devolver la entrada del usuario actual en un mensaje de error de la entidad:
Sorry,'${system.entityToResolve.value.userInput!'this'}' is not a valid pizza size.
A continuación, se muestra un ejemplo del uso de varias definiciones system.entityToResolve. Entre ellas, se encuentra un mensaje definido para la propiedad text, que confirma una actualización realizada en un valor de entidad definido previamente mediante una directiva list de Apache FreeMarker y la propiedad updatedEntities.
    metadata:
      responseItems:        
      - type: "text" 
        text: "<#list system.entityToResolve.value.updatedEntities>I have updated <#items as ent>${ent.description}<#sep> and </#items>. </#list><#list system.entityToResolve.value.outOfOrderMatches>I got <#items as ent>${ent.description}<#sep> and </#items>. </#list>"
      - type: "text" 
        text: "${system.entityToResolve.value.prompt}"
        actions:
        - label: "${enumValue}"
          type: "postback"
          iteratorVariable: "system.entityToResolve.value.enumValues"
Para las acciones globales, esta variable controla la acción global Mostrar más con las propiedades needShowMoreButton, rangeStartVar y nextRangeStart:
        globalActions: 
        - label: "Show More"
          type: "postback" 
          visible:
            expression: "${system.entityToResolve.value.needShowMoreButton}"
          payload:
            action: "system.showMore"
            variables: 
              ${system.entityToResolve.value.rangeStartVar}: ${system.entityToResolve.value.nextRangeStart} 
        - label: "Cancel"
          type: "postback" 
          visible:
            onInvalidUserInput: true
          payload:
            action: "cancel"
La etiqueta Mostrar más debe incluir una propiedad system.showMore (action: "system.showMore"). De lo contrario, no funcionará.

Expresiones entityToResolve

Expresión Descripción
${system.entityToResolve.value.resolvingField} Devuelve el nombre del elemento de la bolsa.
${system.entityToResolve.value.allMatches[0].entityName} Devuelve el nombre de entidad al que hace referencia el elemento de la bolsa. La matriz allMatches contiene todas las entidades cuyos valores podría actualizar el mensaje del usuario.
${<variable>1.value[system.entityToResolve.value.resolvingField]} Devuelve el valor del elemento de bolsa que los usuarios introducen o seleccionan.
${system.entityToResolve.value.userInput} Devuelve el texto introducido por el usuario. Puede utilizar esta expresión para registrar la entrada del usuario o mostrarla en el chat, por ejemplo, cuando un usuario introduce un valor no válido.
${system.entityToResolve.value.outOfOrderMatches[n].entityName} Devuelve los nombres de las entidades extraídas en secuencia incorrecta. Junto con los valores que solicitan las entidades de resolución o los componentes de respuesta común, los usuarios pueden proporcionar valores adicionales que disparan la extracción en secuencia incorrecta del valor y la actualización de otras entidades de la bolsa compuesta.
${system.entityToResolve.value.outOfOrderMatches[n].name} Devuelve el nombre del elemento de bolsa compuesta.
${system.entityToResolve.value.outOfOrderMatches? has_content?then(…,…)} Devuelve el valor de una entidad cuya coincidencia se ha ejecutado en secuencia incorrecta. Debido a que es probable que no haya ninguna entidad cuya coincidencia se haya ejecutado en secuencia incorrecta, esta expresión utiliza el operador has_content.

Manejadores de eventos de entidades

Puede ejecutar la validación, petición de datos y desambiguación para los elementos de entidad de bolsa compuesta mediante programación mediante los gestores de eventos de entidad. Un manejador de eventos de entidad (EEH) es una implantación JavaScript (o TypeScript) que se crea para una entidad de bolsa compuesta y se despliega como un servicio de código personalizado.
Nota

Puede gestionar el servicio desplegado para EEH desde la página Componentes Imagen del icono Componentes de la barra de navegación izquierda..
Puede controlar el comportamiento de resolución de los elementos de bolsa individuales y de la propia entidad definiendo las funciones del manejador de eventos proporcionadas por bots-node-sdk. Por ejemplo, el siguiente fragmento ilustra la definición de un evento validate en un elemento de bolsa denominado ExpenseDate que evita que los usuarios introduzcan una fecha futura al presentar un informe de gastos.
ExpenseDate: {

        validate: async (event, context) => {
          if (new Date(event.newValue.date) > new Date()) {
            context.addValidationError("ExpenseDate",context.translate('ExpenseDate.text'));
            return false;
          }          
        }
La documentación de Writing Entity Event Handlers de bots-node-sdk describe la estructura general del código del manejador de eventos, los eventos de nivel de elemento y entidad y los métodos EntityResolutionContext como addValidationError y translate en el fragmento anterior.

Debido a que los manejadores de eventos de entidad están escritos en JavaScript, puede utilizar una lógica avanzada que no se logra fácilmente, o incluso es factible, con las expresiones FreeMarker que puede utilizar para definir la validación, los errores y las peticiones de datos en la página de edición de elementos de bolsa y el flujo de diálogo. También son más fáciles de depurar. Dicho esto, no es necesario que seleccione manejadores de eventos de entidades en expresiones FreeMarker. Puede combinar los dos. Por ejemplo, puede utilizar expresiones FreeMarker para validaciones y peticiones de datos simples y reservar un EEH para funciones más complicadas como llamar a una API de REST cuando se hayan resuelto todos los elementos de bolsa.

Creación de controladores de eventos de entidades con el editor de códigos de controladores de eventos

Puede crear EEH utilizando el editor de códigos de gestores de eventos al que se accede desde la página de propiedades de bolsa compuesta o con el IDE que desee. Aunque el editor de códigos de manejador de eventos tiene algunas ventajas sobre una herramienta de terceros, puede que desee alternar con un IDE de terceros según el tamaño de la tarea y las bibliotecas que necesite. Para evaluar las ventajas y las desventajas, consulte ¿Qué IDE debo utilizar?

Para acceder al editor de códigos del manejador de eventos:
  1. Haga clic en + Manejador de eventos.
  2. Complete el cuadro de diálogo Crear manejador de eventos agregando un nombre de servicio y un nombre de manejador.

Después de crear el manejador, puede abrir el editor haciendo clic en Imagen del icono Editar..

El editor se rellena con el código de inicio. Su objeto handlers contiene los objetos entity, items y custom. Dentro de estos objetos, se definen los eventos de nivel de evento, que se disparan para toda la bolsa compuesta, los eventos de nivel de elemento, que controlan la resolución de los elementos de bolsa individuales y los eventos personalizados que se disparan en las acciones de devolución. Por defecto, el objeto handler tiene un objeto entity definido. Los objetos items y custom se rellenan al agregar una plantilla personalizada o de nivel de elemento.
A continuación se muestra la descripción de eeh-default-template.png
Descripción de la ilustración eeh-default-template.png

Los eventos en sí son funciones JavaScript asíncronas que toman dos argumentos:
  • event: un objeto JSON de las propiedades específicas del evento.
  • context: referencia a la clase EntityResolutionContext, cuyos métodos (como addValidationError en el siguiente fragmento) proporcionan la lógica del manejador de eventos.
items: {
  Amount: { 
    validate: async (event, context) => {
      let amount = event.newValue.amount;
      if (amount < 5) {
        context.addValidationError("Amount",`Amounts below 5 ${event.newValue.currency} cannot be expensed. Enter a higher amount or type 'cancel'.`);
      }
    }
  }
Para acceder a las plantillas, haga clic en + Agregar evento.
Nota

Consulte la documentación Manejadores de eventos de entidades de escritura de bots-node-sdk para obtener más información sobre el código inicial de EEH, los eventos de nivel de entidad y elemento, EntityResolutionContext y los ejemplos de código.
Adición de Eventos
Al hacer clic en + Agregar evento, puede agregar las plantillas para eventos, elementos y eventos personalizados.

Por ejemplo, al agregar una plantilla de evento validate, se rellena el editor con el siguiente código:
validate: async (event, context) => {
        
      },
A continuación, puede actualizar esta plantilla con su propio código:
validate: async (event, context) => {
     if (event.newValue.value === 'PEPPERONI')
       context.addValdiationError('Type', "Sorry, no pepperoni pizzas today!");     
      },
Al hacer clic en Validar, se comprueba el código para detectar las incidencias de tiempo de diseño, por lo que debe hacer clic en esta opción habitualmente. No puede agregar más eventos si el código no es válido, ni tampoco puede guardar un código no válido. Puesto que guardar código significa también desplegarlo, tampoco puede desplegar código no válido.

Cuando el código es válido, al hacer clic en Guardar, se despliega automáticamente y se empaqueta en un archivo TGZ. Puede supervisar el estado del despliegue y descargar el archivo TGZ para volver a utilizarlo en otras aptitudes de la página Componentes.

Consejo:

Para comprobar si hay errores de tiempo de ejecución, active Activar registro de componentes y, a continuación, revise los logs (a los que se accede haciendo clic en Diagnóstico > Ver logs) para conocer los parámetros que han llamado a los eventos.
En la página de bolsa compuesta, un icono Listo Esta es una imagen del icono de estado Listo. y el icono Editar Icono Editar para revisar el código estarán disponibles después de desplegar el servicio.

Agregar manejadores de eventos de nivel de entidad
En los eventos de nivel de entidad, puede actualizar las plantillas para los eventos de nivel de entidad validate, publishMessage, maxPromptsReached, resolved, attachmentReceived y locationReceived.

Evento Descripción
validate Un manejador para validaciones de nivel de entidad que se llama cuando se cambia el valor de al menos uno de los elementos de bolsa.
publishMessage Un manejador de reserva genérico que se llama cuando un elemento de bolsa carece de un mensaje de petición de datos o de un manejo de desambiguación.
maxPromptsReached Manejador de reserva genérico que se llama cuando no se ha especificado el manejador específico del elemento para alcanzar el número máximo de peticiones de datos.
resolved Esta función se llama cuando se haya resuelto la entidad de bolsa compuesta. Normalmente agregaría un evento resolved para llamar a una API de backend que termine una transacción relacionada con los valores recopilados por la entidad de bolsa compuesta. Si la llamada de API devuelve errores porque algunos de los valores recopilados por la bolsa compuesta no son válidos, puede borrar estos valores.
attachmentReceived Se llama a este manejador cuando el usuario envía un anexo.
locationReceived Este manejador se llama cuando el usuario envía una ubicación.
Por defecto, la plantilla se rellena con un evento de nivel de entidad, publishMessage. Mediante las funciones updatedItemMessage y outOfOrderItemsMessage (que también se definen en la plantilla por defecto), este evento permite a la aptitud generar mensajes que confirmen que se ha actualizado un valor de elemento de bolsa resuelto anteriormente o que ha aceptado una entrada válida para un elemento de bolsa que no sea la que solicita actualmente la entidad (entrada en desorden).

Este evento es opcional. Puede eliminarla, dejarla como está o agregarle una funcionalidad. Por ejemplo, puede agregar un botón Cancelar si un usuario ha superado el número máximo de peticiones de datos al intentar introducir un valor válido.
publishMessage: async (event, context) => {
        updatedItemsMessage(context);
        outOfOrderItemsMessage(context);
        //Add Cancel button for invalid values entered by users
        let message = context.getCandidateMessageList()[0];
      }
…
message.addGlobalAction(context.getMessageFactory().createPostbackAction('Cancel', {action:'cancel'}));
        context.addMessage(message);      }
}
Agregar manejadores de nivel de elemento
Para los elementos de bolsa que aparecen en el cuadro de diálogo, puede agregar plantillas para los eventos de nivel de elemento: shouldPrompt, validate, publishPromptMessage, publishDisambiguateMessage y MaxPromptsReached.

Evento Descripción
shouldPrompt Solicita un elemento en función de los valores de los otros elementos de la bolsa. Este manejador tiene prioridad sobre la petición de datos configurada mediante el campo Petición de valor.
validate Este manejador solo se llama cuando se define un valor para un elemento de bolsa. Si la validez del valor depende de otros elementos de bolsa, debe implantar el evento validate de nivel de entidad en su lugar.
publishPromptMessage Use esta función para reemplazar o ampliar el mensaje generado por los componentes Respuesta común y Entidades de resolución para solicitar el artículo.
publishDisambiguateMessage Utilice esta función para sustituir o ampliar el mensaje de la petición de datos de desambiguación generado por los componentes Respuesta común y Entidades de resolución.
maxPromptsReached Esta función se llama cuando se ha alcanzado el número máximo de peticiones de datos para este elemento, especificado por Máximo de intentos de entrada de usuario en la pantalla del elemento de bolsa compuesta.

La adición de un evento de nivel de elemento genera el objeto items.
Descripción de eeh-items-block.png
Descripción de la ilustración eeh-items-block.png

Agregar eventos personalizados
Puede crear eventos personalizados que se llamen desde acciones de devolución (botones o elementos de lista) mediante la plantilla de eventos personalizada.

Al agregar una plantilla personalizada, se agrega un objeto custom con el event code básico. Consulte la documentación Manejadores de eventos de entidades de escritura de bots-node-sdk para obtener ejemplos de implantación de un evento personalizado.
someCustomEvent: async (event, context) => {
  
}

Sustitución o eliminación de un manejador de eventos de entidad

Si necesita reemplazar o quitar una EEH:
  1. Seleccione una línea vacía del menú Manejador de Eventos para reactivar el botón + Manejador de Eventos.

  2. Abra la página Components Imagen del icono Componentes de la barra de navegación izquierda.. Desactive Servicio activado o suprima el servicio.
    Nota

    No puede suprimir ni desactivar un servicio si EEH sigue asociado a la entidad de bolsa compuesta.
  3. Si es necesario, agregue un nuevo EEH a la bolsa compuesta o, si no está optando por un nuevo EEH, puede agregar la lógica de resolución con expresiones FreeMarker.

Consejo:

La supresión de la entidad de bolsa compuesta también suprimirá el servicio desplegado para EEH.

¿Qué IDE debo utilizar?

Puede crear un EEH con el IDE que desee y, a continuación, desplegar el código utilizando un archivo TGZ empaquetado manualmente con bots-node-sdk pack, o puede utilizar el editor de códigos de manejador de eventos que proporcionamos. Cuando utilice nuestro editor, no tiene que configurar su entorno de desarrollo ni empaquetar ni desplegar su código. El código se despliega automáticamente después de guardarlo. También puede revisar el código directamente sin tener que volver a desplegarlo, algo que no puede hacer al empaquetar y desplegar un manejador creado con su propio IDE. No puede agregar paquetes de NPM adicionales mediante el editor de códigos del manejador de eventos. Necesitará otro IDE. Por ejemplo, si desea utilizar Moment.js para trabajar con fechas, debe descargar el TGZ, agregar la biblioteca con el IDE que desee y, a continuación, volver a empaquetar y desplegar el TGZ. Después de esto, puede seguir utilizando el editor de códigos del manejador de eventos.

Consejo:

El editor de códigos del manejador de eventos puede ser una mejor opción para los cambios poco importantes. Si necesita realizar cambios importantes o agregar más paquetes de NPM, puede descargar el TGZ desde la página Componentes, descomprimirlo y, a continuación, utilizar su editor favorito para modificar el código antes de volver a empaquetarlo y desplegarlo.

Simplificar flujos de diálogo con manejadores de eventos de entidades

Los gestores de eventos de entidad pueden simplificar la definición del flujo de diálogo porque se utilizan con las mejores prácticas de abreviado de diálogo que son entidades de bolsa compuesta. Cuando se trata de servicios de backend, hacen que su definición de flujo de diálogo sea menos complicada porque no es necesario escribir un estado independiente para el componente personalizado que los llama.

Los controladores de eventos simplifican la definición del flujo de diálogo de otra manera: permiten modificar los mensajes generados por el componente Resolver Entidades. Por ejemplo, puede crear un carrusel de mensajes de tarjeta sin utilizar la compleja estructura de la propiedad metadata del componente de respuesta común. En su lugar, puede agregar el carrousel mediante código simple, lo que significa que también puede agregar respuestas de tarjeta al componente Resolución de Entidades. Por ejemplo, este código permite que el componente Resolución de Entidades muestre un carrusel con desplazamiento horizontal de tarjetas para el tipo de pizza, con una tarjeta con un botón de cancelación:
Type: {

        publishPromptMessage: async (event, context) => {
          let candidateMessage = context.getCandidateMessageList()[0];
          const mf = context.getMessageFactory();
          const message = mf.createCardMessage()
            .setLayout(horizontal)
            .setCards(context.getEnumValues().map(p => {
                      mf.createCard(p.value)
                        .setDescription(pizzaInfo[p.value].description)
                        .setImageUrl(pizzaInfo[p.value].image)
                        .addAction(mf.createPostbackAction('Order',{variables: {pizza: p.value}}));
                      })
            .setGlobalActions(candidateMessage.getGlobalActions());
          context.addMessage(message);
        }

Tutoriales del manejador de eventos de entidades

Realice este tutorial para familiarizarse con los manejadores de eventos de entidades mediante la creación de uno con el editor. A continuación, consulte este tutorial avanzado para crear un manejador de eventos de entidades con un IDE externo y bots-node-sdk.

Desambiguar elementos y subtipos de bolsas anidadas

La bolsa compuesta siempre solicitará valores por orden de artículo que dicte la estructura jerárquica de un artículo de bolsa anidado. No colocará valores a ciegas para varios elementos. En su lugar, intenta hacer coincidir el valor del mensaje de usuario solo con el elemento para el que está solicitando actualmente. Cuando la entrada del usuario no coincide con el elemento actual o puede coincidir con más de un elemento, como podría ser el caso de startTime y endTime para un subtipo INTERVAL, presenta a los usuarios el valor definido para la propiedad Etiqueta para aclarar la entrada solicitada.

Consejo:

Al igual que con todas las cadenas, se recomienda definir el valor Etiqueta como un grupo de recursos.

Agregar la entidad DATE_TIME a una bolsa compuesta

Para permitir que la aptitud maneje escenarios complejos que requieren varias peticiones de datos de usuario, como la programación de una reunión o la definición de un evento recurrente, debe crear un elemento de bolsa compuesta DATE_TIME y, a continuación, configurar los atributos de los subtipos Intervalo, Recurrente y Fecha y hora y sus respectivos elementos de bolsa anidados.
Nota

Aunque puede utilizar la fecha, la hora y la duración como entidades independientes, le recomendamos que las utilice en entidades de bolsa compuesta.
  1. Antes de crear un elemento de bolsa DATE_TIME, configure las reglas de resolución de ambigüedad de fecha y hora adecuadas para su caso de uso. Por ejemplo, si está creando una aptitud de generación de informes de gastos, seleccione Pasado. Si la aptitud es un programador de reuniones, seleccione Futuro.
  2. En la entidad de bolsa compuesta, haga clic en Agregar elemento.
  3. Seleccione Entidad en el menú Tipo.
  4. Seleccione DATE_TIME en el menú Nombre de entidad.
  5. Seleccione un subtipo DATE_TIME en el menú Subtype.

    Las opciones de configuración de la página Agregar Elemento de Bolsa cambian según el subtipo que seleccione. Por ejemplo, si selecciona el subtipo Recurrente, puede acceder a las opciones de configuración para los elementos de bolsa anidada que son específicos para definir un evento repetitivo, como el objeto Fecha y hora para la fecha y hora de inicio inicial y el objeto Duración para definir la frecuencia del evento.

  6. Si ha seleccionado los subtipos Recurrente o Intervalo:
    • Defina los valores de subtipo que solicita la bolsa compuesta en el menú Petición de datos para.
    • Puesto que las reuniones suelen empezar y terminar el mismo día, active Fecha de finalización por defecto a fecha de inicio para el subtipo startDate. Esto establece la fecha final como igual a la fecha inicial cuando el mensaje del usuario no menciona la fecha final (o cuando la fecha final no se extrae en orden).
      Imagen del conmutador Fecha de inicio a fecha de finalización predeterminada.

  7. De manera opcional, agregue una etiqueta de desambiguación si la entrada de usuario puede coincidir con más de un subtipo.

    Consejo:

    También puede configurar las propiedades que no son específicas de DATE_TIME, como relleno de ranuras mejorado, actualización de valores de ranuras con Apache FreeMarker, peticiones de datos personalizadas y mensajes de error.
  8. Puede acceder a la configuración de nivel de subtipo haciendo clic en un subtipo. Use el recorrido para volver a la configuración de nivel de artículo.
    Imagen del recorrido Editar elemento de bolsa.

  9. siguientes pasos:
    • Asocie la entidad de bolsa compuesta a la intención.
    • Declare una variable para la entidad en el flujo de diálogo.
    • En el flujo de diálogo, haga referencia a la entidad de bolsa compuesta con el elemento DATE_TIME mediante el estado Resolver bolsa compuesta.
    • Los valores DATE_TIME se representan como ISO 8601. Para una salida fácil de usar, utilice Apache FreeMarker .xs incorporado. En el siguiente fragmento, el valor del subtipo Time se formatea con .value?time.xs?string['hh:mm a'].
      Your pizza will be delivered at ${pizza.value.deliveryTime.value?time.xs?string['hh:mm a']}.
      
      En lugar de hacer referencia al elemento DATE_TIME como una cadena, puede seguir el enfoque de mejores prácticas para hacer referencia a él en un grupo de recursos, como DeliveryMessage en el siguiente ejemplo.
      ${rb('DeliveryMessage','time',pizza.value.deliveryTime.value?time.xs?string['hh:mm a'])}
      
      Para el mensaje de grupo de recursos DeliveryMessage, el valor se representa mediante el parámetro {time}:
      Your pizza will be delivered at {time}.
      

Tutorial: Extracción de entidades en un entorno real con entidades de bolsa compuesta

Para acceder a una experiencia práctica centrada en la creación de una bolsa compuesta, consulte este tutorial: Activación de extracción de entidades en un entorno real con entidades de bolsa compuesta.