Evénements externes
Vous pouvez définir des types d'événement d'application (en fonction d'événements produits par des applications externes) et permettre aux utilisateurs de vos assistants numériques d'être avertis 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 des 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. Pour en savoir plus sur cette spécification, consultez le site https://cloudevents.io/.
Workflow d'implémentation d'un événement d'application
- Identifiez la source de l'événement.
- Dans Digital Assistant, enregistrez le type d'événement.
- Configurez une brique pour qu'elle utilise les événements de ce type et ajoutez-la à un assistant numérique.
- Créez un canal Events et mettez-le en correspondance avec l'assistant numérique.
- A partir du canal Events créé, obtenez l'URL entrante et la clé secrète, puis rendez-les disponibles pour l'application externe qui génère les événements.
La brique qui utilise l'événement peut faire partie de plusieurs assistants numériques.
Définir un type d'événement
Pour qu'une brique puisse recevoir un événement cloud, un type d'événement doit être défini dans Oracle Digital Assistant. Pour définir un type d'événement :
-
Cliquez sur
pour ouvrir le menu latéral, sélectionnez Développement > Evénements, cliquez sur Nouvel événement et entrez le nom du type d'événement.
Conseil :
Vous devez utiliser une convention de dénomination pour les types d'événement afin de leur donner un contexte pertinent 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. - Sur la page du nouvel événement que vous venez de créer, entrez une description.
- Dans le champ Schéma JSON, saisissez le schéma de l'événement.
Le champ est prérempli 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 par 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, reportez-vous à https://json-schema.org/understanding-json-schema/reference/object.html.
- L'attribut
- Une fois que vous avez terminé de travailler sur le schéma et que vous souhaitez geler son contenu, cliquez sur Marquer comme finalisé.
A ce stade, vous pouvez utiliser ce type d'événement dans une brique.
Si vous décidez ultérieurement de modifier le schéma, vous pouvez en créer une nouvelle version.
Exemple : schéma de type d'événement cloud
{
"$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"
}
}
}
Configuration d'une brique pour la consommation d'un événement
Voici les étapes générales à suivre pour qu'une brique utilise un événement :
- Dans une brique, créez un flux avec le composant Notifier l'utilisateur pour utiliser l'événement. (Ce composant n'est disponible que pour les flux de dialogue développés en mode Visual.)
Lors de l'exécution, lorsque l'événement est généré, il est transmis à la brique. 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 des ID utilisateur de domaine d'identité OCI IAM), assurez-vous que la brique dispose d'une autorisation à l'aide du composant OAuth 2.0 et que vous avez activé la liaison de comptes de canal.
- Dans le flux principal du flux de dialogue, créez une correspondance d'événements d'application entre l'événement et le flux contenant l'état Notification utilisateur de l'événement.
- Ajoutez la brique à un assistant numérique.
Créer une notification utilisateur pour l'événement
Pour que la brique réponde à l'événement, vous ajoutez un flux pour cet événement et utilisez un état Notifier l'utilisateur pour afficher un message lorsque l'événement se produit :
- Dans la brique à utiliser pour l'événement, cliquez sur
, puis sur + Ajouter un flux.
- Saisissez un nom de flux et cliquez sur Créer.
- Cliquez sur le menu
dans le démarrage du flux, puis sur Ajouter un état de début pour ouvrir la boîte de dialogue Ajouter un état.
- Sélectionnez Intégration de service > Notifier l'utilisateur, indiquez le nom de l'état, puis cliquez sur Insérer.
- Dans l'inspecteur de propriétés de l'état Notifier l'utilisateur inséré, sélectionnez l'onglet Composant et remplissez le champ Message de notification avec un message que vous souhaitez que l'utilisateur voie lorsque l'événement se produit.
Dans le message, vous pouvez utiliser des expressions au format suivant pour accéder aux données de l'événement :
${skill.system.event.value.application.data.<propertyName>}
Remarque
Vous pouvez également accéder aux informations de contexte à partir de l'événement à l'aide du type d'expression suivant :
Pour plus d'informations sur les attributs de contexte disponibles, reportez-vous à Attributs de contexte d'événement.${skill.system.event.value.application.context.<attributeName>}
- Vous pouvez éventuellement renseigner la propriété ID utilisateur avec un ID pour un utilisateur spécifique que vous pouvez déterminer dynamiquement à partir du flux (par exemple via un composant personnalisé). Cette propriété est principalement utile si l'ID utilisateur n'est pas envoyé dans la charge utile d'événement et si l'utilisateur est un utilisateur unifié qui a été authentifié via une autorisation à l'aide du composant OAuth 2.0 où la propriété Associer à un utilisateur unifié a été définie sur True. Pour plus d'informations sur les utilisateurs unifiés, reportez-vous à Configuration de l'identité d'un 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. Pour ce faire, procédez comme suit :
- Au début du flux qui gère l'événement, ajoutez un composant personnalisé qui détermine l'ID utilisateur (en fonction de la charge utile de l'événement et/ou d'une logique personnalisée) et affectez cet ID à une variable.
- Après l'état du composant personnalisé, insérez un composant Notifier l'utilisateur et définissez la propriété ID utilisateur de ce composant sur la variable renvoyée par le composant personnalisé.
Créer un gestionnaire pour l'événement externe
Pour qu'une brique reçoive un événement, vous créez un gestionnaire d'événements pour cet événement dans le flux principal. Dans le gestionnaire d'événements, vous mappez l'événement avec le flux contenant l'état Notifier l'utilisateur que vous avez créé pour recevoir l'événement :
- Dans la liste des flux, sélectionnez Flux principal.
- Dans l'onglet Evénements de ce flux, en regard de la section Evénements d'application, cliquez sur
.
- Dans la boîte de dialogue Créer un gestionnaire d'événements d'application, sélectionnez le type d'événement, la version du type d'événement et le flux vers lequel mettre en correspondance l'événement, puis cliquez sur Fermer.
Remarque
Seuls les types d'événement finalisés sont proposés dans le champ Type d'événement non résolu.
Ajout de la brique à un assistant numérique
Pour qu'une brique utilise un événement externe, elle doit faire partie d'un assistant numérique. Pour ajouter une brique configurée pour utiliser un événement à un assistant numérique, procédez comme suit :
- Cliquez sur
pour ouvrir le menu latéral, sélectionnez Développement > Assistants numériques, puis cliquez deux fois sur l'assistant numérique à utiliser.
-
Cliquez sur ajouter une brique.
- Dans la mosaïque de la brique configurée pour consommer l'événement, sélectionnez
.
Si vous ne trouvez pas la brique que vous recherchez, elle peut avoir un mode de langue non compatible avec le mode de langue de votre assistant numérique. Reportez-vous à Conditions d'ajout d'une brique à un assistant numérique.
- Cliquez sur le bouton Terminé pour fermer le catalogue de compétences et afficher la page de la brique dans l'assistant numérique.
-
Faites défiler la page jusqu'à la section Modèle d'interaction et assurez-vous que la valeur Appel correspond au nom que les utilisateurs doivent utiliser pour appeler la brique.
Ce nom doit être conforme aux instructions relatives aux noms d'appel.
-
Indiquez quelques exemples de variation standard de la façon dont un utilisateur appelle la brique.
Ces variations seront utilisées comme options pouvant être sélectionnées dans les états de bienvenue et d'aide par défaut de l'assistant numérique.
Conseil :
Cliquez sur Valider et consultez les messages de validation pour connaître les variations partagées par les briques inscrites dans votre assistant numérique.Création d'un canal pour l'application externe
Vous devez créer un canal d'application pour autoriser l'application externe à envoyer des événements à Digital Assistant. Une fois que vous avez créé le canal, 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 Canaux dans le menu de gauche, puis sélectionnez Evénements.
- Cliquez sur 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 l'URL du service Web vers laquelle vous souhaitez envoyer les messages d'erreur liés au canal via une demande POST.
Si une erreur se produit, par exemple un problème lors du lancement d'une conversation via le canal utilisateur, Digital Assistant envoie un message d'erreur en tant qu'événement cloud 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 Créer.
- Activez l'option Application activée.
- Dans la liste déroulante Acheminer vers, sélectionnez l'assistant numérique contenant la brique qui contient le flux de consommation de l'événement.
- Notez la clé secrète et l'URL entrante.
Ceux-ci seront nécessaires pour 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
.
La charge utile d'événement peut ê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 sur ces formulaires, reportez-vous à 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 pour l'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 charge utile d'événement
Les attributs suivants sont courants que vous pouvez utiliser dans une charge utile d'événement :
specversion
: (requis) numéro de version de la prise en charge des événements de l'assistant numérique. Actuellement, la seule valeur valide est1.0
.type
: (obligatoire) type d'événement que la brique é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 de forme 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 la charge utile d'événement et elle 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 gestionnaire pour l'événement externe.Remarque
Cet attribut fait partie de l'attribut d'extension, ce qui signifie qu'il ne fait pas partie de la spécification CloudEvent.data
: (obligatoire) données métier correspondant au schéma défini pour l'événement.
Attributs de 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 indiquer des valeurs pour ces attributs dans la charge utile de l'événement.
Voici la 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 la charge utile d'événement et elle 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 gestionnaire pour l'événement externe. -
userid
: ID de l'utilisateur cible du message. Il peut prendre l'une des deux formes suivantes :- ID utilisateur OCI IAM. Dans ce cas, vous devez également inclure l'attribut
usertenancy
dans la charge utile. - ID utilisateur fourni par le canal. Dans ce cas, vous devez également inclure l'attribut
channelname
dans la charge utile.Remarque
Pour Twilio, cette valeur correspond au numéro de téléphone portable de l'utilisateur.
- ID utilisateur OCI IAM. Dans ce cas, vous devez également inclure l'attribut
-
usertenancy
: nom de la location OIC IAM du fournisseur d'identités de l'utilisateur. -
channelname
: nom du canal via 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 : charge utile d'é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 : charge utile avec l'ID utilisateur OCI IAM
Si vous devez transmettre l'ID utilisateur OCI IAM de l'utilisateur dans la charge utile, vous devez également indiquer 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 OCI IAM dans sa charge utile, assurez-vous que la brique dispose d'une autorisation à l'aide du composant OAuth 2.0 et que sa propriété Associer à un utilisateur unifié est définie sur Vrai.
Exemple : Charge utile avec ID utilisateur et nom de canal
Pour les assistants numériques exposés via les canaux Twilio et Web, l'application externe peut également notifier les utilisateurs en indiquant le nom du canal et l'ID utilisateur fournis 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 brique
En plus de consommer des événements externes dans une brique, vous pouvez l'utiliser pour publier des événements de type que vous avez inscrits dans Oracle Digital Assistant auprès d'une application externe. Pour ce faire, vous pouvez utiliser le composant Evénement de publication (dans la catégorie Intégration de service). Lorsqu'un événement est généré de cette façon, il est publié vers l'URL que vous avez indiquée dans l'URL d'application sortante que vous avez indiquée dans le canal de l'application externe.