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.
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:
-
Haga clic en
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 espizza.order
para un tipo de evento para pedidos de pizza. - En la página del nuevo evento recién creado, complete una descripción.
- 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.
- El atributo
- 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:
- 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.
- 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.
- 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.
- 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:
- En la aptitud que desee utilizar el evento, haga clic en
y, a continuación, en + Agregar flujo.
- Introduzca un nombre de flujo y haga clic en Crear.
- Haga clic en el menú
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.
- Seleccione Service Integration > Notificar a usuario, rellene un nombre para el estado y haga clic en Insertar.
- 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:
Consulte Atributos de contexto de evento para obtener información sobre los atributos de contexto disponibles.${skill.system.event.value.application.context.<attributeName>}
- 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:
- 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.
- 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:
- En la lista de flujos, seleccione Flujo principal.
- En el separador Eventos de ese flujo, junto a la sección Eventos de aplicación, haga clic en
.
- 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:
- Haga clic en
para abrir el menú lateral, seleccione Development > Digital Assistants y haga doble clic en el asistente digital que desea utilizar.
-
Haga clic en Agregar aptitud.
- En el mosaico de la aptitud configurada para consumir el evento, seleccione
.
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.
- 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.
-
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.
-
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.
- En Digital Assistant, haga clic en Canales en el menú izquierdo y, a continuación, seleccione Eventos.
- Haga clic en Agregar canal.
- En el campo Nombre de canal, introduzca un nombre único para el canal.
- (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
ymessage
que describen el error. Por ejemplo:{ "code": "InvalidParameter", "message": "The event contains invalid or missing attributes: firstName" }
- Haga clic en Crear.
- Active Aplicación activada.
- En la lista desplegable Enviar a, seleccione el asistente digital que contiene la aptitud que tiene el flujo para consumir el evento.
- 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
- 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 es1.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.
- ID de usuario de OCI IAM. En este caso, también debe incluir el atributo
-
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
}
}
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.