Événements externes
Vous pouvez définir des types d'événement d'application (en fonction des événements produits par des applications externes) et permettre aux utilisateurs de vos assistants numériques d'être avisés lorsque des événements de ces types sont transmis à l'assistant numérique.
Ces types d'événement doivent respecter la spécification Cloud Events, qui définit les formats communs pour les données d'événement afin de les rendre interopérables entre les services, les plates-formes et les systèmes. Vous pouvez en savoir plus sur cette spécification à l'adresse https://cloudevents.io/.
Flux de travail pour la mise en oeuvre d'un événement d'application
- Identifiez la source de l'événement.
- Dans Digital Assistant, enregistrez le type d'événement.
- Configurez une compétence pour consommer des événements de ce type et ajoutez-la à un assistant numérique.
- Créez un canal d'événements et mappez-le à l'assistant numérique.
- À partir du canal Événements créé, obtenez l'URL entrante et la clé secrète et mettez-les à la disposition de l'application externe qui génère les événements.
La compétence qui consomme l'événement peut faire partie de plusieurs assistants numériques.
Définir un type d'événement
Pour qu'une compétence puisse recevoir un événement en nuage, un type d'événement doit être défini dans Oracle Digital Assistant. Voici la marche à suivre pour définir un type d'événement :
-
Cliquez sur
pour ouvrir le menu latéral, sélectionnez Development > Events (Développement > Événements), cliquez sur New Event (Nouvel événement) et entrez un nom pour le type d'événement.
Conseil :
Vous devez utiliser une convention d'attribution de nom pour les types d'événement afin de leur donner un contexte significatif pour aider les autres développeurs à comprendre ce qu'ils font. Un exemple simple estpizza.order
pour un type d'événement pour les commandes de pizza. - Dans la page du nouvel événement qui vient d'être créé, entrez une description.
- Dans le champ Schéma JSON, entrez le schéma de l'événement.
Le champ est préalimenté avec un exemple de schéma contenant les éléments requis.
- L'attribut
schema
peut avoir l'une des valeurs suivantes :"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#"
- Dans l'objet
properties
, vous définissez les propriétés en tant que paires clé-valeur, où la valeur est un schéma sur lequel la propriété est validée.Par exemple :
"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 } }
Pour plus d'informations sur la définition de ces propriétés, voir https://json-schema.org/understanding-json-schema/reference/object.html.
- L'attribut
- Lorsque vous avez terminé de travailler sur le schéma et que vous voulez geler son contenu, cliquez sur Marquer comme terminé.
À ce stade, vous pouvez utiliser ce type d'événement dans une compétence.
Si vous déterminez ultérieurement que vous devez modifier le schéma, vous pouvez en créer une nouvelle version.
Exemple : Schéma de type d'événement en nuage
{
"$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"
}
}
}
Configurer une compétence pour consommer un événement
Voici les étapes générales que vous devez suivre pour qu'une compétence consomme un événement :
- Dans une compétence, créez un flux avec le composant Notify User (Aviser l'utilisateur) pour consommer l'événement. (Ce composant n'est disponible que pour les flux de dialogue développés en mode visuel.)
Lors de l'exécution, lorsque l'événement est généré, l'événement est transmis à la compétence. Vous pouvez utiliser des expressions pour accéder aux données et au contexte de l'événement.
- Si vous concevez le type d'événement pour cibler des utilisateurs authentifiés spécifiques (avec les ID utilisateur du domaine d'identité IAM OCI), assurez-vous que la compétence dispose d'une autorisation à l'aide du composant OAuth 2.0 et que vous disposez d'une liaison de compte de canal activée.
- Dans le flux principal du flux de dialogue, créez un mappage d'événement d'application entre l'événement et le flux contenant l'état Avis d'utilisateur pour l'événement.
- Ajoutez la compétence à un assistant numérique.
Créer un avis d'utilisateur pour l'événement
Pour que la compétence réponde à l'événement, vous ajoutez un flux pour cet événement et utilisez l'état Aviser l'utilisateur pour afficher un message lorsque l'événement se produit :
- Dans la compétence à utiliser pour l'événement, cliquez sur
, puis sur + Add Flow (Ajouter un flux).
- Entrez un nom de flux et cliquez sur Créer.
- Cliquez sur le menu
dans le démarrage du flux, puis cliquez sur Ajouter un état de début pour ouvrir la boîte de dialogue Ajouter un état.
- Sélectionnez Intégration de services > Aviser l'utilisateur, entrez un nom pour l'état, puis cliquez sur Insérer.
- Dans l'inspecteur de propriétés pour l'état Aviser l'utilisateur inséré, sélectionnez l'onglet Composant et remplissez le champ Message d'avis avec un message à afficher lorsque l'événement se produit.
Dans le message, vous pouvez utiliser des expressions dans le format suivant pour accéder aux données de l'événement :
${skill.system.event.value.application.data.<propertyName>}
Note
Vous pouvez également accéder aux informations de contexte à partir de l'événement à l'aide du type d'expression suivant :
Voir Attributs de contexte d'événement pour plus d'informations sur les attributs de contexte disponibles.${skill.system.event.value.application.context.<attributeName>}
- Facultativement, remplissez la propriété ID utilisateur avec un ID pour un utilisateur spécifique que vous pouvez déterminer dynamiquement à partir du flux (par exemple, au moyen d'un composant personnalisé). Cette propriété est principalement utile si l'ID utilisateur n'est pas envoyé dans les données utiles de l'événement et si l'utilisateur est un utilisateur unifié qui a été authentifié au moyen d'une autorisation à l'aide du composant OAuth 2.0 où la propriété Associer à l'utilisateur unifié a été réglée à Vrai. Pour plus d'informations sur les utilisateurs unifiés, voir Configuration de l'identité d'utilisateur unifié.
Déterminer le destinataire de l'événement à partir du flux
Si l'événement doit être ciblé sur un utilisateur spécifique mais que cet utilisateur n'est pas spécifié dans l'événement lui-même, il peut être possible de déterminer l'utilisateur dans le flux qui gère l'événement. Voici les étapes générales pour que cela fonctionne :
- Au début du flux qui gère l'événement, ajoutez un composant personnalisé qui détermine l'ID utilisateur (en fonction des données utiles de l'événement ou d'une logique personnalisée) et assigne cet ID à une variable.
- Après l'état du composant personnalisé, insérez un composant Aviser l'utilisateur et réglez la propriété ID utilisateur de ce composant à la variable retournée par le composant personnalisé.
Créer un programme de traitement pour l'événement externe
Pour qu'une compétence reçoive un événement, vous créez un programme de traitement d'événements pour cet événement dans le flux principal. Dans le programme de traitement d'événements, vous mappez l'événement au flux contenant l'état Aviser l'utilisateur que vous avez créé pour recevoir l'événement :
- Dans la liste des flux, sélectionnez Flux principal.
- Dans l'onglet Événements de ce flux, à côté de la section Événements d'application, cliquez sur
.
- Dans la boîte de dialogue Créer un programme de traitement d'événements d'application, sélectionnez le type d'événement, la version du type d'événement et le flux auquel vous voulez mapper l'événement, puis cliquez sur Fermer.
Note
Seuls les types d'événement finalisés sont offerts dans le champ Type d'événement non résolu.
Ajouter la compétence à un assistant numérique
Pour qu'une compétence consomme un événement externe, elle doit faire partie d'un assistant numérique. Pour ajouter une compétence configurée pour consommer un événement dans un assistant numérique :
- Cliquez sur
pour ouvrir le menu latéral, sélectionnez Development > Digital Assistants et cliquez deux fois sur l'assistant numérique à utiliser.
-
Cliquez sur Ajouter une compétence.
- Dans la vignette de la compétence configurée pour consommer l'événement, sélectionnez
.
Si vous ne trouvez pas la compétence que vous recherchez, elle peut avoir un mode linguistique qui n'est pas compatible avec celui de votre assistant numérique. Voir Conditions pour ajouter une compétence à un assistant numérique.
- Cliquez sur le bouton Done (Terminé) pour fermer le catalogue et afficher la page de la compétence dans l'assistant numérique.
-
Faites défiler la page vers le bas jusqu'à la section Interaction Model (Modèle d'interaction) et assurez-vous que la valeur Invocation (Appel) est le nom que vous voulez utiliser pour appeler la compétence.
Ce nom doit respecter les directives relatives aux noms d'appel.
-
Entrez quelques exemples d'énoncés pouvant être utilisés pour appeler la compétence.
Ces énoncés seront utilisés comme options sélectionnables dans les états d'accueil et d'aide par défaut de l'assistant numérique.
Conseil :
Cliquez sur Validate (Valider) et consultez les messages de validation pour trouver les énoncés partagés par les compétences enregistrées auprès de votre assistant numérique.Créer un canal pour l'application externe
Vous devez créer un canal d'application pour permettre à l'application externe d'envoyer des événements à Digital Assistant. Une fois le canal créé, Digital Assistant affecte une clé secrète et une URL entrante. Vous devez utiliser ces valeurs dans l'application qui génère l'événement.
- Dans Digital Assistant, cliquez sur Channels (Canaux) dans le menu de gauche, puis sélectionnez Events (Événements).
- Cliquez sur Add Channel (Ajouter un canal).
- Dans le champ Nom du canal, entrez un nom unique pour le canal.
- (Facultatif) Dans le champ URL de l'application sortante, entrez une URL de service Web à laquelle vous voulez envoyer des messages d'erreur liés au canal au moyen d'une demande POST.
Si une erreur se produit, par exemple un problème lors du lancement d'une conversation au moyen du canal d'utilisateur, Digital Assistant envoie un message d'erreur en tant qu'événement en nuage et les données d'événement contiennent les attributs
code
etmessage
qui décrivent l'erreur. Par exemple :{ "code": "InvalidParameter", "message": "The event contains invalid or missing attributes: firstName" }
- Cliquez sur Create (Créer).
- Sélectionnez l'option Application Enabled (Application activée).
- Dans la liste déroulante Route To (Acheminer vers), sélectionnez l'assistant numérique qui contient la compétence qui a le flux de consommation de l'événement.
- Notez la clé secrète et l'URL entrante.
Ceux-ci seront nécessaires par l'application externe qui génère les événements. L'application externe envoie des messages en envoyant une demande POST à l'URL entrante et utilise la clé secrète pour authentifier ses demandes POST.
Générer un événement à partir d'une application externe
- Un en-tête
X-Hub-Signature
contient un hachage SHA-256 du corps de la demande à l'aide de la clé secrète du canal d'application. Par exemple :X-Hub-Signature: sha256=<HMAC SHA-256 signature of body using the secret key for the channel>
- Le type de contenu est
application/cloudevents+json
.
Les données utiles de l'événement peuvent être sous une forme structurée (où tous les attributs font partie du JSON dans le corps HTTP) ou sous une forme binaire (où les attributs de contexte d'événement sont présents dans l'en-tête avec le préfixe ce-
). Pour en savoir plus à propos de ces formulaires, consultez https://github.com/cloudevents/spec/blob/v1.0/http-protocol-binding.md#3-http-message-mapping.
Formulaire structuré pour l'envoi d'événements
L'exemple suivant illustre l'utilisation d'un formulaire structuré pour l'envoi d'événements :
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
}
}'
Formulaire d'envoi d'événements dans 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");
}
Attributs de données utiles d'événement
Voici les attributs communs que vous pouvez utiliser dans les données utiles d'un événement :
specversion
: (Obligatoire) Numéro de version de la prise en charge des événements de Digital Assistant. Actuellement, la seule valeur valide est1.0
.type
: (Obligatoire) Type d'événement que la compétence écoute. Cela doit correspondre au nom du type d'événement que vous avez spécifié dans la tâche Définir un type d'événement.source
: (Obligatoire) Identifie le contexte dans lequel un événement s'est produit. Il peut s'agir d'une chaîne à structure libre.id
: (Obligatoire) ID unique généré pour l'événement par l'application.version
: (Obligatoire) Nom de la version du type d'événement envoyé. Vous devez inclure une valeur pour cet attribut dans les données utiles de l'événement et il doit correspondre à la valeur que vous avez fournie pour la version de type d'événement que vous avez fournie dans la tâche Créer un programme de traitement pour l'événement externe.Note
Cet attribut est l'un des attributs d'extension, ce qui signifie qu'il ne fait pas partie de la spécification CloudEvent.data
: (Obligatoire) Données d'affaires correspondant au schéma défini pour l'événement.
Attributs du contexte d'événement
Pour chaque événement généré, Digital Assistant ajoute des attributs d'extension qui décrivent le contexte dans lequel l'événement est généré. Les outils et les codes d'application peuvent ensuite utiliser ces informations pour identifier des éléments tels que la source des événements générés et leur relation avec d'autres événements. Vous pouvez également spécifier des valeurs pour ces attributs dans les données utiles de l'événement.
Voici une liste des attributs d'extension (tous de type String
) :
-
version
: Nom de la version du type d'événement envoyé. Vous devez inclure une valeur pour cet attribut dans les données utiles de l'événement et il doit correspondre à la valeur que vous avez fournie pour la version de type d'événement que vous avez fournie dans la tâche Créer un programme de traitement pour l'événement externe. -
userid
: ID de l'utilisateur cible du message. Il peut prendre l'une des deux formes suivantes :- Un ID utilisateur IAM pour OCI. Dans ce cas, vous devez également inclure l'attribut
usertenancy
dans les données utiles. - ID utilisateur fourni par le canal. Dans ce cas, vous devez également inclure l'attribut
channelname
dans les données utiles.Note
Pour Twilio, cette valeur correspond au numéro de téléphone cellulaire de l'utilisateur.
- Un ID utilisateur IAM pour OCI. Dans ce cas, vous devez également inclure l'attribut
-
usertenancy
: Nom de la location IAM OIC du fournisseur d'identités de l'utilisateur. -
channelname
: Nom du canal par lequel l'assistant numérique est exposé. -
tenancy
: Nom de la location Oracle Cloud Infrastructure pour l'instance Digital Assistant. (En général, vous n'avez pas besoin d'inclure explicitement cet attribut, car les informations sur la location sont transmises dans les en-têtes de demande.)
Exemple : Données utiles de l'événement
{
"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"
}
}
Exemple : Données utiles avec l'ID utilisateur IAM OCI
Si vous devez transmettre l'ID utilisateur IAM OCI pour l'utilisateur dans les données utiles, vous spécifiez également les attributs userid
et 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 l'événement est conçu pour transmettre l'ID utilisateur IAM OCI dans ses données utiles, assurez-vous que la compétence dispose d'une autorisation à l'aide du composant OAuth 2.0 et que sa propriété Associer à un utilisateur unifié est réglée à Vrai.
Exemple : Données utiles avec ID utilisateur et nom de canal
Pour les assistants numériques exposés au moyen des canaux Twilio et Web, l'application externe peut également aviser les utilisateurs en spécifiant le nom du canal et l'ID utilisateur fourni par le 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
}
}
Publier un événement à partir d'une aptitude
En plus de consommer des événements externes dans une compétence, vous pouvez l'utiliser pour publier des événements de type que vous avez enregistrés dans Oracle Digital Assistant dans une application externe. Vous pouvez le faire avec le composant Publier un événement (dans la catégorie Intégration de service). Lorsqu'un événement est généré de cette façon, il est publié dans l'URL que vous avez spécifiée dans l'URL de l'application sortante que vous avez spécifiée dans le canal de l'application externe.