Externe Ereignisse
Sie können Anwendungsereignistypen definieren (basierend auf Ereignissen, die von externen Anwendungen erzeugt werden) und Benutzern Ihrer digitalen Assistenten ermöglichen, benachrichtigt zu werden, wenn Ereignisse dieser Typen an den digitalen Assistenten übergeben werden.
Diese Ereignistypen müssen der Spezifikation für Cloud-Ereignisse entsprechen, die gemeinsame Formate für Ereignisdaten definiert, damit sie über Services, Plattformen und Systeme hinweg interoperabel sind. Sie können diese Spezifikation unter https://cloudevents.io/ lesen.
Workflow zum Implementieren eines Anwendungsereignisses
- Geben Sie die Quelle des Ereignisses an.
- Registrieren Sie im digitalen Assistenten den Ereignistyp.
- Konfigurieren Sie einen Skill, um Ereignisse dieses Ereignistyps zu konsumieren und diesen Skill einem digitalen Assistenten hinzuzufügen.
- Erstellen Sie einen Ereigniskanal, und ordnen Sie ihn dem digitalen Assistenten zu.
- Rufen Sie im erstellten Ereigniskanal die eingehende URL und den Secret Key ab, und stellen Sie sie der externen App zur Verfügung, die die Ereignisse generiert.
Der Skill, der das Ereignis konsumiert, kann Teil mehrerer digitaler Assistenten sein.
Ereignistyp definieren
Damit ein Skill ein Cloud-Ereignis empfangen kann, muss ein Ereignistyp in Oracle Digital Assistant definiert werden. So definieren Sie einen Ereignistyp:
-
Klicken Sie auf
, um das Seitenmenü zu öffnen, und wählen Sie Entwicklung > Ereignisse aus. Klicken Sie auf Neues Ereignis, und geben Sie einen Namen für den Ereignistyp ein.
Tipp:
Sie sollten eine Benennungskonvention für die Ereignistypen verwenden, um ihnen aussagekräftigen Kontext zu geben, damit andere Entwickler verstehen, was sie tun. Ein einfaches Beispiel istpizza.order
für einen Ereignistyp für Pizza-Bestellungen. - Geben Sie auf der Seite für das gerade erstellte neue Ereignis eine Beschreibung ein.
- Geben Sie im Feld JSON-Schema das Schema für das Ereignis ein.
Das Feld wird vorab mit einem Beispielschema gefüllt, das erforderliche Elemente enthält.
- Das Attribut
schema
kann einen der folgenden Werte haben:"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#"
- Im Objekt
properties
definieren Sie Eigenschaften als Schlüssel/Wert-Paare, wobei der Wert ein Schema ist, mit dem die Eigenschaft validiert wird.Beispiel:
"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 } }
Weitere Informationen zum Definieren dieser Eigenschaften finden Sie unter https://json-schema.org/understanding-json-schema/reference/object.html.
- Das Attribut
- Wenn Sie die Bearbeitung des Schemas abgeschlossen haben und dessen Inhalt einfrieren möchten, klicken Sie auf Als abgeschlossen markieren.
An dieser Stelle können Sie diesen Ereignistyp in einem Skill verwenden.
Wenn Sie später feststellen, dass Sie das Schema ändern müssen, können Sie eine neue Version davon erstellen.
Beispiel: Cloud-Ereignistypschema
{
"$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"
}
}
}
Skill zum Konsumieren eines Ereignisses konfigurieren
Im Folgenden werden die allgemeinen Schritte aufgeführt, die Sie ausführen müssen, damit ein Skill ein Ereignis konsumieren kann:
- Erstellen Sie in einem Skill einen Ablauf mit der Komponente Benutzer benachrichtigen, um das Ereignis zu konsumieren. (Diese Komponente ist nur für Dialogabläufe verfügbar, die im visuellen Modus entwickelt wurden.)
Wenn das Ereignis zur Laufzeit generiert wird, wird es an den Skill übergeben. Sie können Ausdrücke verwenden, um auf die Daten und den Kontext des Ereignisses zuzugreifen.
- Wenn Sie den Ereignistyp für bestimmte authentifizierte Benutzer (mit OCI-IAM-Identitätsdomainbenutzer-IDs) entwerfen, stellen Sie sicher, dass der Skill über eine Autorisierung mit der Komponente OAuth 2.0 verfügt und Kanalaccountverknüpfung aktiviert ist.
- Erstellen Sie im Hauptfluss des Dialogablaufs eine Anwendungsereigniszuordnung zwischen dem Ereignis und dem Ablauf, der den Benutzerbenachrichtigungsstatus für das Ereignis enthält.
- Fügen Sie den Skill einem digitalen Assistenten hinzu.
Benutzerbenachrichtigung für das Ereignis erstellen
Damit der Skill auf das Ereignis reagiert, fügen Sie einen Ablauf für dieses Ereignis hinzu, und verwenden Sie den Status "Benutzer benachrichtigen", um eine Meldung anzuzeigen, wenn das Ereignis eintritt:
- Klicken Sie im Skill, den Sie das Ereignis verwenden möchten, auf
und dann auf + Ablauf hinzufügen.
- Geben Sie einen Ablaufnamen ein, und klicken Sie auf Erstellen.
- Klicken Sie im Ablaufstart auf das Menü
und dann auf Startstatus hinzufügen, um das Dialogfeld "Status hinzufügen" zu öffnen.
- Wählen Sie Serviceintegration > Benutzer benachrichtigen aus, geben Sie einen Namen für den Status ein, und klicken Sie auf Einfügen.
- Wählen Sie im Eigenschaftsinspektor für den eingefügten Status Benutzer benachrichtigen die Registerkarte Komponente aus, und geben Sie im Feld Benachrichtigungsmeldung eine Meldung ein, die dem Benutzer angezeigt werden soll, wenn das Ereignis eintritt.
In der Nachricht können Sie Ausdrücke im folgenden Format verwenden, um auf Daten aus dem Ereignis zuzugreifen:
${skill.system.event.value.application.data.<propertyName>}
Hinweis
Mit dem folgenden Ausdruckstyp können Sie auch auf Kontextinformationen aus dem Ereignis zugreifen:
Informationen zu den verfügbaren Kontextattributen finden Sie unter Ereigniskontextattribute.${skill.system.event.value.application.context.<attributeName>}
- Geben Sie optional eine ID für einen bestimmten Benutzer in die Eigenschaft Benutzer-ID ein, die Sie dynamisch innerhalb des Ablaufs bestimmen können (z.B. über eine benutzerdefinierte Komponente). Diese Eigenschaft ist vor allem dann nützlich, wenn die Benutzer-ID nicht in der Ereignis-Payload gesendet wird, und der Benutzer ein einheitlicher Benutzer ist, der über eine Autorisierung mit der Komponente OAuth 2.0 authentifiziert wurde, bei der die Eigenschaft Mit einheitlichem Benutzer verknüpfen auf "true" gesetzt wurde. Weitere Informationen zu einheitlichen Benutzern finden Sie unter Einheitliche Benutzeridentität konfigurieren.
Ereignisempfänger aus dem Ablauf bestimmen
Wenn das Ereignis auf einen bestimmten Benutzer ausgerichtet werden muss, dieser Benutzer jedoch nicht im Ereignis selbst angegeben ist, kann der Benutzer im Ablauf bestimmt werden, der das Ereignis verarbeitet. Allgemeine Schritte:
- Fügen Sie zu Beginn des Ablaufs, der das Ereignis verarbeitet, eine benutzerdefinierte Komponente hinzu, die die Benutzer-ID bestimmt (basierend auf der Ereignis-Payload und/oder einer benutzerdefinierten Logik) und diese ID einer Variablen zuweist.
- Fügen Sie nach dem Status für die benutzerdefinierte Komponente eine Komponente "Benutzer benachrichtigen" ein, und legen Sie die Eigenschaft Benutzer-ID dieser Komponente auf die Variable fest, die von der benutzerdefinierten Komponente zurückgegeben wird.
Handler für das externe Ereignis erstellen
Damit ein Skill ein Ereignis empfängt, erstellen Sie einen Ereignis-Handler für dieses Ereignis im Hauptablauf. Im Event Handler ordnen Sie das Ereignis dem Ablauf zu, der den Status "Benutzer benachrichtigen" enthält, den Sie für den Empfang des Ereignisses erstellt haben:
- Wählen Sie in der Liste der Abläufe die Option Hauptablauf aus.
- Klicken Sie auf der Registerkarte Ereignisse dieses Ablaufs neben dem Abschnitt Anwendungsereignisse auf
.
- Wählen Sie im Dialogfeld Anwendungsereignis-Handler erstellen den Ereignistyp, die Version des Ereignistyps und den Ablauf aus, dem Sie das Ereignis zuordnen möchten, und klicken Sie auf Schließen.
Hinweis
Im Feld Nicht aufgelöster Ereignistyp werden nur Abgeschlossener Ereignistyp angeboten.
Skill zu einem digitalen Assistenten hinzufügen
Damit ein Skill ein externes Ereignis konsumieren kann, muss er Teil eines digitalen Assistenten sein. So fügen Sie einen Skill hinzu, der für die Nutzung eines Ereignisses zu einem digitalen Assistenten konfiguriert ist:
- Klicken Sie auf
, um das Seitenmenü zu öffnen, wählen Sie Entwicklung > Digitale Assistenten aus, und doppelklicken Sie auf den gewünschten digitalen Assistenten.
-
Klicken Sie auf Skill hinzufügen.
- Wählen Sie in der Kachel für den Skill, der zum Konsumieren des Ereignisses konfiguriert ist, die Option
aus.
Wenn Sie den gesuchten Skill nicht finden, ist möglicherweise ein Sprachmodus vorhanden, der nicht mit dem Sprachmodus Ihres digitalen Assistenten kompatibel ist. Siehe Bedingungen zum Hinzufügen eines Skills zu einem digitalen Assistenten.
- Klicken Sie auf die Schaltfläche Fertig, um den Skillkatalog zu schließen und die Seite für den Skill im digitalen Assistenten anzuzeigen.
-
Scrollen Sie nach unten zum Abschnitt "Interaktionsmodell" auf der Seite, und vergewissern Sie sich, dass der Wert Aufruf dem Namen entspricht, mit dem Benutzer den Skill aufrufen sollen.
Dieser Name muss den folgenden Richtlinien für Aufrufnamen entsprechen.
-
Geben Sie einige Beispiele für typische Äußerungen an, mit denen ein Benutzer den Skill aufrufen kann.
Diese Äußerungen werden als auswählbare Optionen in den standardmäßigen Willkommens- und Hilfestatus des digitalen Assistenten verwendet.
Tipp:
Klicken Sie auf Validieren, und prüfen Sie die Validierungsmeldungen auf Äußerungen, die von den für Ihren digitalen Assistenten registrierten Skills gemeinsam verwendet werden.Kanal für die externe App erstellen
Sie müssen einen Anwendungskanal erstellen, damit die externe App Ereignisse an Digital Assistant senden kann. Nach dem Erstellen des Kanals weist Digital Assistant einen Secret Key und eine eingehende URL zu. Sie müssen diese Werte in der App verwenden, die das Ereignis generiert.
- Klicken Sie in Digital Assistant im linken Menü auf Kanäle, und wählen Sie Ereignisse aus.
- Klicken Sie auf Kanal hinzufügen.
- Geben Sie im Feld Vertriebskanalname einen eindeutigen Namen für den Kanal ein.
- (Optional) Geben Sie im Feld URL der ausgehenden Anwendung eine Webservice-URL ein, an die kanalspezifische Fehlermeldungen über eine POST-Anforderung gesendet werden sollen.
Wenn ein Fehler auftritt, z.B. ein Problem beim Initiieren einer Unterhaltung über den Benutzerkanal, sendet Digital Assistant eine Fehlermeldung als Cloud-Ereignis, und die Ereignisdaten enthalten die Attribute
code
undmessage
, die den Fehler beschreiben. Beispiel:{ "code": "InvalidParameter", "message": "The event contains invalid or missing attributes: firstName" }
- Klicken Sie auf Erstellen.
- Aktivieren Sie das Steuerelement Anwendung aktiviert.
- Wählen Sie in der Dropdown-Liste Weiterleiten an den digitalen Assistenten aus, der den Skill mit dem Ablauf zum Konsumieren des Ereignisses enthält.
- Notieren Sie den Secret Key und die eingehende URL.
Diese werden von der externen App benötigt, die die Ereignisse generiert. Die externe App sendet Nachrichten, indem sie POST-Anforderungen an die eingehende URL sendet und mit dem Secret Key ihre POST-Anforderungen authentifiziert.
Ereignis aus einer externen App generieren
- Es gibt einen
X-Hub-Signature
-Header, der einen SHA-256-Hash des Anforderungstextes enthält, der den Secret Key des Anwendungskanals verwendet. Beispiel:X-Hub-Signature: sha256=<HMAC SHA-256 signature of body using the secret key for the channel>
- Der Inhaltstyp lautet
application/cloudevents+json
.
Die Ereignis-Payload kann entweder in strukturierter Form (wobei alle Attribute Teil der JSON im HTTP-Body sind) oder in binärer Form (wobei Ereigniskontextattribute im Header mit dem Präfix ce-
vorhanden sind) vorliegen. Weitere Informationen zu diesen Formularen finden Sie unter https://github.com/cloudevents/spec/blob/v1.0/http-protocol-binding.md#3-http-message-mapping.
Strukturiertes Formular zum Senden von Ereignissen
Das folgende Beispiel zeigt die Verwendung einer strukturierten Form zum Senden von Ereignissen:
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
}
}'
Formular zum Senden von Ereignissen in 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");
}
Ereignis-Payload-Attribute
Im Folgenden werden allgemeine Attribute aufgeführt, die Sie in einer Ereignis-Payload verwenden können:
specversion
: (Erforderlich) Versionsnummer der Unterstützung für Ereignisse des digitalen Assistenten. Derzeit ist der einzige gültige Wert1.0
.type
: (Erforderlich) Der Ereignistyp, auf den der Skill horcht. Dies muss dem Namen des Ereignistyps entsprechen, den Sie in der Aufgabe Ereignistyp definieren angegeben haben.source
: (Erforderlich) Gibt den Kontext an, in dem ein Ereignis aufgetreten ist. Dabei kann es sich um eine Zeichenfolge in beliebigem Format handeln.id
: (Erforderlich) Die eindeutige ID, die von der Anwendung für das Ereignis generiert wird.version
: (Erforderlich) Der Name der Version des Typs des gesendeten Ereignisses. Sie müssen einen Wert für dieses Attribut in die Ereignis-Payload aufnehmen. Er muss mit dem Wert übereinstimmen, den Sie für die Ereignistypversion angegeben haben, die Sie in der Aufgabe Handler für das externe Ereignis erstellen angegeben haben.Hinweis
Dieses Attribut ist eines der Erweiterungsattribute, d.h. es ist nicht Teil der CloudEvent-Spezifikation.data
: (Erforderlich) Die Geschäftsdaten, die mit dem für das Ereignis definierten Schema übereinstimmen.
Ereigniskontextattribute
Für jedes generierte Ereignis fügt Digital Assistant Erweiterungsattribute hinzu, die den Kontext beschreiben, in dem das Ereignis generiert wird. Tools und Anwendungscodes können diese Informationen dann verwenden, um Dinge wie die Quelle der generierten Ereignisse und ihre Beziehung zu anderen Ereignissen zu identifizieren. Sie können auch Werte für diese Attribute in der Ereignis-Payload angeben.
Im Folgenden finden Sie eine Liste der Erweiterungsattribute (die alle den Typ String
aufweisen):
-
version
: Der Name der Version des Typs des gesendeten Ereignisses. Sie müssen einen Wert für dieses Attribut in die Ereignis-Payload aufnehmen. Er muss mit dem Wert übereinstimmen, den Sie für die Ereignistypversion angegeben haben, die Sie in der Aufgabe Handler für das externe Ereignis erstellen angegeben haben. -
userid
: Die ID des Benutzers, auf den die Nachricht ausgerichtet wird. Es kann eine der folgenden beiden Formen annehmen:- Eine OCI-IAM-Benutzer-ID. In diesem Fall müssen Sie auch das Attribut
usertenancy
in die Payload aufnehmen. - Eine vom Kanal angegebene Benutzer-ID. In diesem Fall müssen Sie auch das Attribut
channelname
in die Payload aufnehmen.Hinweis
Bei Twilio entspricht dieser Wert der Mobiltelefonnummer des Benutzers.
- Eine OCI-IAM-Benutzer-ID. In diesem Fall müssen Sie auch das Attribut
-
usertenancy
: Der Name des OIC-IAM-Mandanten des Identitätsproviders des Benutzers. -
channelname
: Der Name des Kanals, über den der digitale Assistent angezeigt wird. -
tenancy
: Der Name des Oracle Cloud Infrastructure-Mandanten für die Digital Assistant-Instanz. (In der Regel müssen Sie dieses Attribut nicht explizit einschließen, da Informationen zum Mandanten in den Anforderungsheadern übergeben werden.)
Beispiel: Ereignis-Payload
{
"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"
}
}
Beispiel: Payload mit OCI IAM-Benutzer-ID
Wenn Sie die OCI-IAM-Benutzer-ID für den Benutzer in der Payload übergeben müssen, geben Sie auch die Attribute userid
und usertenancy
an:
{
"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
}
}
Wenn das Ereignis so ausgelegt ist, dass die OCI IAM-Benutzer-ID in der Payload übergeben wird, stellen Sie sicher, dass der Skill mit der Komponente OAuth 2.0 autorisiert ist und dass die Eigenschaft Mit Unified User verknüpfen auf Wahr gesetzt ist.
Beispiel: Payload mit Benutzer-ID und Kanalname
Bei digitalen Assistenten, die über die Twilio- und Webkanäle bereitgestellt werden, kann die externe App Benutzer auch benachrichtigen, indem der Kanalname und die Benutzer-ID angegeben werden, die vom Kanal bereitgestellt werden.
{
"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
}
}
Ereignis aus einem Skill veröffentlichen
Neben dem Konsumieren externer Ereignisse in einem Skill können Sie mit dem Skill Ereignisse von Typen, die Sie in Oracle Digital Assistant registriert haben, in einer externen Anwendung veröffentlichen. Dazu können Sie die Komponente Ereignis veröffentlichen (in der Kategorie "Serviceintegration") verwenden. Wenn ein Ereignis auf diese Weise generiert wird, wird es in der URL veröffentlicht, die Sie in der URL der ausgehenden Anwendung angegeben haben, die Sie im Kanal für die externe App angegeben haben.