Eventi esterni
È possibile definire i tipi di evento applicazione (in base agli eventi prodotti da applicazioni esterne) e consentire agli utenti degli assistenti digitali di ricevere una notifica quando gli eventi di tali tipi vengono passati all'assistente digitale.
Questi tipi di evento devono seguire la specifica Cloud Events, che definisce formati comuni per i dati degli eventi per renderli interoperabili tra servizi, piattaforme e sistemi. Per informazioni su tale specifica, visitare il sito Web all'indirizzo https://cloudevents.io/.
Flusso di lavoro per l'implementazione di un evento applicazione
- Identificare l'origine dell'evento.
- In Digital Assistant registrare il tipo di evento.
- Configurare uno skill per utilizzare eventi di quel tipo di evento e aggiungere tale skill a un assistente digitale.
- Creare un canale Eventi e mapparlo all'assistente digitale.
- Dal canale Eventi creato, ottenere l'URL e la chiave segreta in entrata e renderli disponibili per l'applicazione esterna che genera gli eventi.
La competenza che utilizza l'evento può far parte di più assistenti digitali.
Definisci un tipo di evento
Affinché una competenza possa ricevere un evento cloud, è necessario definire un tipo di evento in Oracle Digital Assistant. Per definire un tipo di evento:
-
Fare clic su
per aprire il menu laterale, selezionare Sviluppo > Eventi, fare clic su Nuovo evento e immettere un nome per il tipo di evento.
Suggerimento
È necessario utilizzare una convenzione di denominazione per i tipi di evento per fornire loro un contesto significativo per aiutare gli altri sviluppatori a capire cosa fanno. Un semplice esempio èpizza.order
per un tipo di evento per ordini di pizza. - Nella pagina del nuovo evento appena creato, inserire una descrizione.
- Nel campo JSON Schema immettere lo schema per l'evento.
Il campo viene precompilato con uno schema di esempio che contiene elementi obbligatori.
- L'attributo
schema
può avere uno dei seguenti valori:"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#"
- Nell'oggetto
properties
le proprietà vengono definite come coppie chiave-valore, in cui il valore è uno schema in base al quale la proprietà viene convalidata.Ad esempio:
"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 } }
Per ulteriori informazioni sulla definizione di queste proprietà, vedere https://json-schema.org/understanding-json-schema/reference/object.html.
- L'attributo
- Al termine del lavoro sullo schema e se si desidera congelarne il contenuto, fare clic su Contrassegna come finalizzato.
A questo punto, è possibile utilizzare questo tipo di evento in uno skill.
Se in seguito si determina la necessità di modificare lo schema, è possibile crearne una nuova versione.
Esempio: schema tipo di evento 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"
}
}
}
Configurare una competenza per l'utilizzo di un evento
Di seguito sono riportati i passi generali da seguire per un'abilità che utilizza un evento.
- In uno skill, creare un flusso con il componente Notifica utente per utilizzare l'evento. Questo componente è disponibile solo per i flussi di dialogo sviluppati in modalità Visual.
In fase di runtime, quando l'evento viene generato, l'evento viene passato allo skill. È possibile utilizzare le espressioni per accedere ai dati e al contesto dell'evento.
- Se si sta progettando il tipo di evento per indirizzare utenti autenticati specifici (con gli ID utente del dominio di Identity IAM OCI), assicurarsi che lo skill disponga di un'autorizzazione mediante il componente OAuth 2.0 e di disporre del collegamento di account canale abilitato.
- Nel flusso principale del flusso della finestra di dialogo creare un mapping di eventi applicazione tra l'evento e il flusso che contiene lo stato Notifica utente per l'evento.
- Aggiungere lo skill a un assistente digitale.
Creazione di una notifica utente per l'evento
Per la capacità di rispondere all'evento, aggiungere un flusso per l'evento e utilizzare lo stato Notifica utente per visualizzare un messaggio quando si verifica l'evento:
- Nella competenza che si desidera utilizzare l'evento, fare clic su
, quindi su + Aggiungi flusso.
- Inserire un nome di flusso e fare clic su Crea.
- Fare clic sul menu
nell'avvio del flusso, quindi fare clic su Aggiungi stato di inizio per aprire la finestra di dialogo Aggiungi stato.
- Selezionare Service Integration > Notifica utente, immettere un nome per lo stato e fare clic su Inserisci.
- Nella finestra di ispezione delle proprietà per lo stato Notifica utente inserito, selezionare la scheda Componente e compilare il campo Messaggio di notifica con un messaggio che si desidera venga visualizzato dall'utente quando si verifica l'evento.
Nel messaggio è possibile utilizzare le espressioni nel seguente formato per accedere ai dati dell'evento:
${skill.system.event.value.application.data.<propertyName>}
Nota
È inoltre possibile accedere alle informazioni di contesto dall'evento utilizzando il seguente tipo di espressione:
Per informazioni sugli attributi di contesto disponibili, vedere Attributi di contesto evento.${skill.system.event.value.application.context.<attributeName>}
- Facoltativamente, immettere nella proprietà ID utente un ID per un utente specifico che è possibile determinare in modo dinamico dall'interno del flusso, ad esempio tramite un componente personalizzato. Questa proprietà è utile soprattutto se l'ID utente non viene inviato nel payload dell'evento e l'utente è un utente unificato autenticato tramite un'autorizzazione che utilizza il componente OAuth 2.0 in cui la proprietà Associa a utente unificato è stata impostata su true. Per ulteriori informazioni sugli utenti unificati, vedere Configurazione dell'identità utente unificata.
Determinare il destinatario dell'evento dal flusso
Se l'evento deve essere indirizzato a un utente specifico ma tale utente non è specificato nell'evento stesso, potrebbe essere possibile determinare l'utente nel flusso che gestisce l'evento. Ecco i passaggi generali per farlo funzionare:
- All'inizio del flusso che gestisce l'evento, aggiungere un componente personalizzato che determina l'ID utente (in base al payload dell'evento e/o a una logica personalizzata) e assegna tale ID a una variabile.
- Dopo lo stato del componente personalizzato, inserire un componente Notifica utente e impostare la proprietà ID utente del componente sulla variabile restituita dal componente personalizzato.
Creazione di un handler per l'evento esterno
Affinché una competenza riceva un evento, è necessario creare un gestore di eventi per tale evento nel flusso principale. Nel gestore di eventi è possibile mappare l'evento al flusso contenente lo stato Notifica utente creato per ricevere l'evento:
- Nell'elenco dei flussi selezionare Flusso principale.
- Nella scheda Eventi di tale flusso, accanto alla sezione Eventi applicazione, fare clic su
.
- Nella finestra di dialogo Crea handler eventi applicazione, selezionare il tipo di evento, la versione del tipo di evento e il flusso a cui si desidera mappare l'evento, quindi fare clic su Chiudi.
Nota
Nel campo Tipo di evento non risolto sono disponibili solo i tipi di evento finalizzati.
Aggiungere la competenza a un assistente digitale
Per utilizzare un evento esterno, una competenza deve far parte di un assistente digitale. Per aggiungere uno skill configurato per utilizzare un evento in un assistente digitale, procedere come segue.
- Fare clic su
per aprire il menu laterale, selezionare Sviluppo > Assistenti digitali e fare doppio clic sull'assistente digitale che si desidera utilizzare.
-
Fare clic su Aggiungi skill.
- Nella casella relativa allo skill configurato per l'utilizzo dell'evento, selezionare
.
Se non trovi l'abilità che stai cercando, potrebbe avere una modalità lingua non compatibile con la modalità lingua del tuo assistente digitale. Vedere Condizioni per l'aggiunta di una competenza a un assistente digitale.
- Fare clic sul pulsante Fine per chiudere il catalogo delle competenze e visualizzare la pagina relativa allo skill nell'assistente digitale.
-
Scorrere fino alla sezione Modello di interazione della pagina e assicurarsi che il valore Richiama sia il nome che si desidera venga utilizzato dagli utenti per richiamare lo skill.
Questo nome deve rispettare le seguenti Linee guida per i nomi delle chiamate.
-
Fornire alcune espressioni di esempio tipiche di come un utente invocherebbe lo skill.
Queste espressioni verranno utilizzate come opzioni selezionabili negli stati di benvenuto e di aiuto predefiniti dell'assistente digitale.
Suggerimento
Fare clic su Convalida e rivedere i messaggi di convalida per le espressioni condivise dagli skill registrati nell'assistente digitale.Creare un canale per l'applicazione esterna
È necessario creare un canale applicazione per consentire all'applicazione esterna di inviare eventi a Digital Assistant. Dopo aver creato il canale, Digital Assistant assegna una chiave segreta e un URL in entrata. È necessario utilizzare questi valori nell'applicazione che genera l'evento.
- In Digital Assistant, fare clic sui canali nel menu a sinistra, quindi selezionare Eventi.
- Fare clic su Aggiungi canale.
- Nel campo Nome canale immettere un nome univoco per il canale.
- (Facoltativo) Nel campo URL applicazione in uscita immettere l'URL di un servizio Web al quale si desidera inviare i messaggi di errore relativi al canale tramite una richiesta POST.
Se si verifica un errore, ad esempio un problema durante l'avvio di una conversazione tramite il canale utente, Digital Assistant invia un messaggio di errore come evento cloud e i dati dell'evento contengono attributi
code
emessage
che descrivono l'errore. Ad esempio:{ "code": "InvalidParameter", "message": "The event contains invalid or missing attributes: firstName" }
- Fare clic su Crea.
- Passare a Applicazione abilitata.
- Nell'elenco a discesa Invia a selezionare l'assistente digitale che contiene la competenza con il flusso per l'utilizzo dell'evento.
- Prendere nota della chiave segreta e dell'URL in entrata.
Questi saranno necessari per l'applicazione esterna che genera gli eventi. L'applicazione esterna invia messaggi inviando una richiesta POST all'URL in entrata e utilizza la chiave segreta per autenticare le richieste POST.
Generare un evento da un'applicazione esterna
- Esiste un'intestazione
X-Hub-Signature
contenente un hash SHA-256 del corpo della richiesta che utilizza la chiave segreta del canale dell'applicazione. Ad esempio:X-Hub-Signature: sha256=<HMAC SHA-256 signature of body using the secret key for the channel>
- Il tipo di contenuto è
application/cloudevents+json
.
Il payload degli eventi può essere in un formato strutturato (in cui tutti gli attributi fanno parte della notazione JSON nel corpo HTTP) o in formato binario (in cui gli attributi del contesto degli eventi sono presenti nell'intestazione con il prefisso ce-
). Per ulteriori informazioni su questi moduli, vedere https://github.com/cloudevents/spec/blob/v1.0/http-protocol-binding.md#3-http-message-mapping.
Form strutturato per l'invio di eventi
L'esempio riportato di seguito mostra l'uso di un modulo strutturato per l'invio di eventi.
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
}
}'
Modulo per l'invio di eventi 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");
}
Attributi payload evento
Di seguito sono riportati gli attributi comuni che è possibile utilizzare in un payload evento.
specversion
: (Obbligatorio) Numero di versione del supporto Eventi di Digital Assistant. Attualmente, l'unico valore valido è1.0
.type
: (Obbligatorio) il tipo di evento di ascolto della capacità. Deve corrispondere al nome del tipo di evento specificato nel task Definisci un tipo di evento.source
: (Obbligatorio) identifica il contesto in cui si è verificato un evento. Può essere una stringa in formato libero.id
: (Obbligatorio) ID univoco generato per l'evento dall'applicazione.version
: (Obbligatorio) Il nome della versione del tipo di evento inviato. È necessario includere un valore per questo attributo nel payload evento e deve corrispondere al valore fornito per la versione del tipo di evento fornita nel task Crea un handler per l'evento esterno.Nota
Questo attributo è uno degli attributi di estensione, ovvero non fa parte della specifica CloudEvent.data
: (Obbligatorio) i dati business corrispondenti allo schema definito per l'evento.
Attributi contesto evento
Per ogni evento generato, Digital Assistant aggiunge attributi di estensione che descrivono il contesto in cui viene generato l'evento. Gli strumenti e i codici applicazione possono quindi utilizzare queste informazioni per identificare elementi quali l'origine degli eventi generati e la loro relazione con altri eventi. È inoltre possibile specificare i valori per questi attributi nel payload degli eventi.
Di seguito è riportato un elenco degli attributi di estensione (tutti di tipo String
):
-
version
: il nome della versione del tipo di evento inviato. È necessario includere un valore per questo attributo nel payload evento e deve corrispondere al valore fornito per la versione del tipo di evento fornita nel task Crea un handler per l'evento esterno. -
userid
: l'ID dell'utente a cui viene indirizzato il messaggio. Può assumere una delle due forme seguenti:- Un ID utente IAM OCI. In questo caso, è necessario includere anche l'attributo
usertenancy
nel payload. - ID utente fornito dal canale. In questo caso, è necessario includere anche l'attributo
channelname
nel payload.Nota
Per Twilio, questo valore corrisponde al numero di telefono cellulare dell'utente.
- Un ID utente IAM OCI. In questo caso, è necessario includere anche l'attributo
-
usertenancy
: il nome della tenancy IAM OIC del provider di identità dell'utente. -
channelname
: il nome del canale attraverso il quale viene esposto l'assistente digitale. -
tenancy
: il nome della tenancy Oracle Cloud Infrastructure per l'istanza di Digital Assistant. In genere, non è necessario includere in modo esplicito questo attributo poiché le informazioni sulla tenancy vengono passate nelle intestazioni delle richieste.
Esempio: payload 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"
}
}
Esempio: payload con ID utente IAM OCI
Se è necessario passare l'ID utente IAM OCI per l'utente nel payload, specificare anche gli attributi userid
e 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
}
}
Se l'evento è stato progettato per passare l'ID utente IAM OCI nel relativo payload, assicurarsi che lo skill disponga di un'autorizzazione utilizzando il componente OAuth 2.0 e che la proprietà Associa a utente unificato sia impostata su True.
Esempio: payload con ID utente e nome canale
Per gli assistenti digitali esposti attraverso i canali Twilio e Web, l'applicazione esterna può anche avvisare gli utenti specificando il nome del canale e l'ID utente fornito dal canale.
{
"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
}
}
Pubblica un evento da uno skill
Oltre a utilizzare eventi esterni in una competenza, è possibile utilizzare la competenza per pubblicare eventi di tipo registrato in Oracle Digital Assistant in un'applicazione esterna. A tale scopo, è possibile utilizzare il componente Pubblica evento (nella categoria Integrazione servizi). Quando un evento viene generato in questo modo, viene pubblicato nell'URL specificato nell'URL applicazione in uscita specificato nel canale per l'applicazione esterna.