Eventos externos

Puede definir tipos de eventos de aplicación (basados en eventos producidos por aplicaciones externas) y permitir que los usuarios de los asistentes digitales reciban notificaciones cuando los eventos de esos tipos se transfieran al asistente digital.

Estos tipos de eventos deben seguir la especificación Cloud Events, que define formatos comunes para los datos de eventos para que sean interoperables entre servicios, plataformas y sistemas. Puede leer acerca de esa especificación en https://cloudevents.io/.

Flujo de trabajo para implantar un evento de aplicación

  • Identifique el origen del evento.
  • En Digital Assistant, registre el tipo de evento.
  • Configure una aptitud para consumir eventos de ese tipo de evento y agregue esa aptitud a un asistente digital.
  • Cree un canal de eventos y asígnelo al asistente digital.
  • Desde el canal de eventos creado, obtenga la URL de entrada y la clave secreta y póngalos a disposición de la aplicación externa que genera los eventos.
Nota

La aptitud que consume el evento puede formar parte de varios asistentes digitales.

Definir un tipo de evento

Para que una aptitud pueda recibir un evento en la nube, se debe definir un tipo de evento en Oracle Digital Assistant. Para definir un tipo de evento:

  1. Haga clic en icono para abrir el menú lateral para abrir el menú lateral, seleccione Desarrollo > Eventos, haga clic en Nuevo evento e introduzca un nombre para el tipo de evento.

    Consejo:

    Debe utilizar una convención de nomenclatura para los tipos de eventos para proporcionarles un contexto significativo que ayude a otros desarrolladores a comprender lo que hacen. Un ejemplo sencillo es pizza.order para un tipo de evento para pedidos de pizza.
  2. En la página del nuevo evento recién creado, complete una descripción.
  3. En el campo Esquema JSON, introduzca el esquema para el evento.

    El campo se rellena previamente con un esquema de ejemplo que contiene los elementos necesarios.

    • El atributo schema puede tener uno de los siguientes valores:
      • "http://json-schema.org/draft-04/schema#"
      • "http://json-schema.org/draft-06/schema#"
      • "http://json-schema.org/draft-07/schema#"
      • "http://json-schema.org/draft/2019-09/schema#"
    • En el objeto properties, se definen las propiedades como pares clave-valor, donde el valor es un esquema con el que se valida la propiedad.

      Por ejemplo:

      "properties": {
          "firstName": {
            "type": "string",
            "description": "The person's first name."
          },
          "lastName": {
            "type": "string",
            "description": "The person's last name."
          },
          "age": {
            "description": "Age in years which must be equal to or greater than zero.",
            "type": "integer",
            "minimum": 0
          }
        }

      Consulte https://json-schema.org/understanding-json-schema/reference/object.html para obtener más información sobre la definición de estas propiedades.

  4. Cuando haya terminado de trabajar en el esquema y desee congelar su contenido, haga clic en Marcar como finalizado.

    En este punto, puede utilizar este tipo de evento en una aptitud.

    Si posteriormente determina que necesita cambiar el esquema, puede crear una nueva versión del mismo.

Ejemplo: esquema de tipo de evento en la nube

{
   "$schema":"http://json-schema.org/draft-07/schema#",
   "description":"Pizza Order Schema",
   "title":"Pizza Order Schema",
   "type":"object",
   "properties":{
      "size":{
         "description":"The pizza size",
         "type":"string"
      },
      "orderid":{
         "description":"The pizza orderid",
         "type":"string"
      },
      "type":{
         "description":"The pizza type",
         "type":"string"
      },
      "topping":{
         "description":"The pizza topping",
         "type":"string"
      }
   }
}

Configuración de una aptitud para consumir un evento

Estos son los pasos generales que debe seguir para que una aptitud consuma un evento:

  1. En una aptitud, cree un flujo con el componente Notificar a usuario para consumir el evento. (Este componente solo está disponible para flujos de diálogo desarrollados en modo visual).

    En tiempo de ejecución, cuando se genera el evento, este se transfiere a la aptitud. Puede utilizar expresiones para acceder a los datos y al contexto del evento.

  2. Si está diseñando el tipo de evento para que se dirija a usuarios autenticados específicos (con ID de usuario del dominio de identidad de OCI IAM), asegúrese de que la aptitud tiene un componente Autorizar mediante OAuth 2.0 y de que tiene enlace de cuentas de canal activado.
  3. En el flujo principal del flujo de diálogo, cree una asignación de evento de aplicación entre el evento y el flujo que contiene el estado de notificación de usuario para el evento.
  4. Agregue la aptitud a un asistente digital.

Creación de una Notificación de Usuario para el Evento

Para que la aptitud responda al evento, agregue un flujo para ese evento y utilice un estado Notificar a usuario para mostrar un mensaje cuando se produzca el evento:

  1. En la aptitud que desee utilizar el evento, haga clic en Icono Flujos y, a continuación, en + Agregar flujo.
  2. Introduzca un nombre de flujo y haga clic en Crear.
  3. Haga clic en el menú Icono del menú Agregar estado. en el inicio del flujo y, a continuación, haga clic en Agregar estado de inicio para abrir el cuadro de diálogo Agregar estado.
    La opción Add Start State (Agregar estado de inicio).

  4. Seleccione Service Integration > Notificar a usuario, rellene un nombre para el estado y haga clic en Insertar.
  5. En el inspector de propiedades para el estado Notificar a usuario insertado, seleccione el separador Componente y rellene el campo Mensaje de notificación con un mensaje que desea que el usuario vea cuando se produzca el evento.

    En el mensaje, puede utilizar expresiones con el siguiente formato para acceder a los datos del evento:

    ${skill.system.event.value.application.data.<propertyName>}
    Nota

    También puede acceder a la información de contexto desde el evento mediante el siguiente tipo de expresión:
    ${skill.system.event.value.application.context.<attributeName>}
    Consulte Atributos de contexto de evento para obtener información sobre los atributos de contexto disponibles.
  6. De manera opcional, rellene la propiedad ID de usuario con un ID para un usuario específico que pueda determinar de forma dinámica desde el flujo (por ejemplo, a través de un componente personalizado). Esta propiedad es principalmente útil si el ID de usuario no se envía en la carga útil del evento y el usuario es un usuario unificado que se ha autenticado mediante una autorización mediante el componente OAuth 2.0, donde la propiedad Associate With Unified User se ha definido en true. Consulte Configuración de identidad de usuario unificada para obtener más información sobre los usuarios unificados.

Determinación del receptor del evento a partir del flujo

Si el evento debe estar dirigido a un usuario específico pero ese usuario no está especificado en el evento en sí, puede ser posible determinar el usuario en el flujo que maneja el evento. Estos son los pasos generales para que esto funcione:

  1. Al principio del flujo que gestiona el evento, agregue un componente personalizado que determine el ID de usuario (según la carga útil del evento y/o alguna lógica personalizada) y asigne ese ID a una variable.
  2. Después del estado del componente personalizado, inserte un componente Notificar a usuario y defina la propiedad ID de usuario de ese componente en la variable devuelta por el componente personalizado.

Crear un manejador para el evento externo

Para que una aptitud reciba un evento, cree un manejador de eventos para ese evento en el flujo principal. En el gestor de eventos, asigne el evento al flujo que contiene el estado Notificar a usuario que ha creado para recibir el evento:

  1. En la lista de flujos, seleccione Flujo principal.
  2. En el separador Eventos de ese flujo, junto a la sección Eventos de aplicación, haga clic en Icono Agregar Evento de Aplicación.
  3. En el cuadro de diálogo Crear manejador de eventos de aplicación, seleccione el tipo de evento, la versión del tipo de evento y el flujo al que desea asignar el evento y, a continuación, haga clic en Cerrar.
    Nota

    Solo se ofrecen tipos de eventos finalizados en el campo Tipo de evento no resuelto.

Agregar la aptitud a un asistente digital

Para que una aptitud consuma un evento externo, debe formar parte de un asistente digital. Para agregar una aptitud configurada para consumir un evento a un asistente digital:

  1. Haga clic en icono para abrir el menú lateral para abrir el menú lateral, seleccione Development > Digital Assistants y haga doble clic en el asistente digital que desea utilizar.
  2. Haga clic en Agregar aptitud.

  3. En el mosaico de la aptitud configurada para consumir el evento, seleccione casilla de control para agregar aptitud .

    Si no encuentra la aptitud que está buscando, puede tener un modo de idioma que no sea compatible con el modo de idioma del asistente digital. Consulte Condiciones para agregar una aptitud a un asistente digital.

  4. Haga clic en el botón Listo para cerrar el catálogo de aptitudes y mostrar la página de la aptitud en el asistente digital.
  5. Desplácese hacia abajo, hasta la sección Modelo de interacción de la página, y asegúrese de que el valor de Llamada se corresponda con el nombre que quiera que utilicen los usuarios para llamar a la aptitud.

    Este nombre debe cumplir estas Directrices sobre el nombre de llamada.

  6. Ofrezca algunas expresiones de ejemplo que un usuario utilizaría habitualmente para llamar a una aptitud.

    Estas expresiones se utilizarán como opciones seleccionables en los estados de ayuda y bienvenida por defecto del asistente digital.

Consejo:

Haga clic en Validar y revise los mensajes de validación para ver las expresiones que comparten las aptitudes registradas en el asistente digital.

Creación de un canal para la aplicación externa

Debe crear un canal de aplicación que permita a la aplicación externa enviar eventos a Digital Assistant. Después de crear el canal, Digital Assistant asigna una clave secreta y una URL de entrada. Debe utilizar estos valores en la aplicación que genera el evento.

  1. En Digital Assistant, haga clic en Canales en el menú izquierdo y, a continuación, seleccione Eventos.
  2. Haga clic en Agregar canal.
  3. En el campo Nombre de canal, introduzca un nombre único para el canal.
  4. (Opcional) En el campo URL de aplicación saliente, introduzca una URL de servicio web a la que desee que se envíen mensajes de error relacionados con el canal a través de una solicitud POST.

    Si se produce un error, como un problema al iniciar una conversación a través del canal de usuario, Digital Assistant envía un mensaje de error como un evento de Cloud y los datos del evento contienen los atributos code y message que describen el error. Por ejemplo:

    {
      "code": "InvalidParameter",
      "message": "The event contains invalid or missing attributes: firstName"
    }
  5. Haga clic en Crear.
  6. Active Aplicación activada.
  7. En la lista desplegable Enviar a, seleccione el asistente digital que contiene la aptitud que tiene el flujo para consumir el evento.
  8. Tome nota de la clave secreta y del URL de entrada.

    Estos serán necesarios por la aplicación externa que genera los eventos. La aplicación externa envía mensajes enviando la solicitud POST a la URL de entrada y utiliza la clave secreta para autenticar sus solicitudes POST.

Generar un evento desde una aplicación externa

Para enviar eventos a un asistente digital desde una aplicación externa, la aplicación debe crear una solicitud POST a la URL de entrada para el canal de eventos donde:
  • Hay una cabecera X-Hub-Signature que contiene un hash SHA-256 del cuerpo de la solicitud mediante la clave secreta del canal de aplicación. Por ejemplo:
    X-Hub-Signature: sha256=<HMAC SHA-256 signature of body using the secret key for the channel>
  • El tipo de contenido es application/cloudevents+json.

La carga útil de evento puede estar en un formato estructurado (donde todos los atributos forman parte del JSON en el cuerpo HTTP) o en formato binario (donde los atributos de contexto de evento están presentes en la cabecera con el prefijo ce-). Para obtener más información sobre estos formularios, consulte https://github.com/cloudevents/spec/blob/v1.0/http-protocol-binding.md#3-http-message-mapping.

Formulario estructurado para enviar eventos

En el siguiente ejemplo se muestra el uso de un formulario estructurado para enviar eventos:

curl --location --request POST 'https://<server>/events/v2/listeners/appevent/channels/<id>' \
--header 'Content-Type: application/cloudevents+json' \
--header 'X-Hub-Signature: sha256=<SHA256 encoded request body using the channel's secret key>' \
--data-raw \

'{
    "specversion": "1.0",           //Version # of Digital Assistant's Events support
    "type": "<event_name>",         //The event type that the skill is listening for
    "source": "< event source>",    //URI-reference - identifies the context in which an event happened
    "id": "<event id>",             //Unique id for the event
    "version":"<event version>",    //An extension attribute(not part of CloudEvent spec) for the version # of the event type
    "data": {                       //The business data that matches with the schema defined for the event  
           
          }
}'

Formulario para enviar eventos en Node.js

async pushEvent(eventName, eventVersion, userId, channelName, eventData){
  try {

    // Build event data
    const event = {
      specversion: "1.0",           //Version # of Digital Assistant's Events support
      type: eventName, // Name of Event you created in ODA
	  source: "< event source>",    //URI-reference - identifies the context in which an event happened
      id: "<event id>",             //Unique id for the event
      time: "2022-09-07T21:19:24Z", // Any Date value will do now
      channelname: <channelName>,   // Can be set to System_Global_Test if you want to test in tester
      version: <eventVersion>, // version of the event that you defined in Digital Assistant
      userid: <userId>,
      datacontenttype: "application/json",
      data: <eventData> // JSON object represting your payload which should confirm to the event's JSON schema
    };

    // Build Required headers
    const headers = {
      "X-Hub-Signature" : this._buildSignatureHeader(event, <EVENTS_CHANNEL_SECRET_KEY> , "utf8"),
      "Content-Type" : "application/cloudevents+json"
    };

    // POST to EVENT_LISTENER_CHANNEL_URL
    ....
    
  } catch (error) {
    logger.error(error.message);
    const errorMessage = `Error pushing event [ ${eventData} ] to Digital Assistant`;
    logger.debug(errorMessage);

    throw new Error(error.message);	
  }
}



_buildSignatureHeader(body, secret, encoding) {
  const buf = Buffer.from(JSON.stringify(body), "utf8");
  return "sha256=" + this._buildSignature(buf, secret, encoding);
}

_buildSignature(buf, secret, encoding) {
  const hmac = crypto.createHmac("sha256", Buffer.from(secret || "", encoding || "utf8"));
  if (buf) {
    hmac.update(buf);
  }
  return hmac.digest("hex");
}

Atributos de carga útil de evento

Los siguientes son atributos comunes que puede utilizar en una carga útil de evento:

  • specversion: (necesario) número de versión del soporte de eventos de Digital Assistant. Actualmente, el único valor válido es 1.0.
  • type: (necesario) tipo de evento que recibe la aptitud. Esto debe corresponder con el nombre del tipo de evento especificado en la tarea Definir un tipo de evento.
  • source: (necesario) identifica el contexto en el que se ha producido un evento. Puede ser una cadena de formato libre.
  • id: (necesario) identificador único que genera la aplicación para el evento.
  • version: (necesario) nombre de la versión del tipo de evento que se está enviando. Debe incluir un valor para este atributo en la carga útil del evento y debe coincidir con el valor proporcionado para la versión de tipo de evento que ha proporcionado en la tarea Crear un manejador para el evento externo.
    Nota

    Este atributo es uno de los atributos de extensión, lo que significa que no forma parte de la especificación CloudEvent.
  • data: (necesario) datos de negocio que coinciden con el esquema definido para el evento.

Atributos de Contexto de Evento

Para cada evento generado, Digital Assistant agrega atributos de extensión que describen el contexto en el que se genera el evento. Las herramientas y los códigos de aplicación pueden utilizar esta información para identificar cosas como el origen de los eventos generados y su relación con otros eventos. También puede especificar valores para estos atributos en la carga útil del evento.

A continuación, se muestra una lista de los atributos de extensión (todos del tipo String):

  • version: nombre de la versión del tipo de evento que se está enviando. Debe incluir un valor para este atributo en la carga útil del evento y debe coincidir con el valor proporcionado para la versión de tipo de evento que ha proporcionado en la tarea Crear un manejador para el evento externo.
  • userid: ID del usuario al que se dirige el mensaje. Puede tomar una de las dos formas siguientes:
    • ID de usuario de OCI IAM. En este caso, también debe incluir el atributo usertenancy en la carga útil.
    • ID de usuario proporcionado por el canal. En este caso, también debe incluir el atributo channelname en la carga útil.
      Nota

      Para Twilio, este valor sería el número de teléfono móvil del usuario.
  • usertenancy: nombre del arrendamiento de IAM de OIC del proveedor de identidad del usuario.
  • channelname: nombre del canal a través del cual se muestra el asistente digital.
  • tenancy: nombre del arrendamiento de Oracle Cloud Infrastructure para la instancia de Digital Assistant. (Por lo general, no es necesario incluir explícitamente este atributo, ya que la información sobre el arrendamiento se transfiere en las cabeceras de solicitud).

Ejemplo: carga útil de evento

{
    "specversion": "1.0",
    "type": "com.pizzastore.pizza.ordercreated",
    "source": "pizzastore/orders",
    "id": "12345678-90ab-cdef-1234-567890abcdef",
    "time": "2022-08-10T12:31:00Z",
    "contenttype": "application/json",
    "tenancy": "mydigitalassistantinstance",
    "version": "1.0",
    "data": {"size": "Large",
            "type": "Veg"
          }
}

Ejemplo: carga útil con ID de usuario de OCI IAM

Si necesita transferir el ID de usuario de OCI IAM para el usuario en la carga útil, también debe especificar los atributos userid y usertenancy:

{
    "specversion": "1.0",           //Version # of Digital Assistant's Events support
    "type": "<event_name>",         //The event type that the skill is listening for
    "source": "< event source>",    //URI-reference - identifies the context in which an event happened
    "id": "<event id>",             //Unique id for the event
    "version":"<event version>",    //An extension attribute(not part of CloudEvent spec) for the version # of the event type
    "userid":"<IAM user id>",      //An extension attribute(not part of CloudEvent spec) for the user ID  
    "usertenancy":<IAM tenancy>",  //Extension attribute, IAM
    "data": {                       //The business data that matches with the schema defined for the event  
           
          }
}
Nota

Si el evento está diseñado para transferir el ID de usuario de OCI IAM en su carga útil, asegúrese de que la aptitud tenga una autorización mediante el componente OAuth 2.0 y de que la propiedad Asociar a usuario unificado esté definida en Verdadero.

Ejemplo: carga útil con ID de usuario y nombre de canal

Para los asistentes digitales expuestos a través de los canales de Twilio y Web, la aplicación externa también puede notificar a los usuarios especificando el nombre del canal y el ID de usuario que proporciona el canal.

{
    "specversion": "1.0",            //Version # of Digital Assistant's Events support
    "type": "<name_of_event_type>",  //The event type that the skill is listening for
    "source": "< event source>",     //URI-reference - identifies the context in which an event happened
    "id": "<event id>",              //Unique id for the event
    "version":"<event version>",     //An extension attribute(not part of CloudEvent spec) for the version # of the event type
    "userid":"<channel user id>",    //An extension attribute(not part of CloudEvent spec) for the user ID
    "channelname":"<channel name>",  //Name of the channel through which the digital assistant is exposed
    "data": {                        //The business data that matches with the schema defined for the event  
           
          }
}

Publicación de un evento desde una aptitud

Además de consumir eventos externos en una aptitud, puede utilizar la aptitud para publicar eventos de los tipos que ha registrado en Oracle Digital Assistant en una aplicación externa. Puede hacerlo con el componente Publicar evento (en la categoría Integración de servicio). Cuando se genera un evento de esta forma, se publica en la URL que ha especificado en la URL de aplicación saliente que ha especificado en el canal para la aplicación externa.