Configura entità sacchetto composito

Le entità sacchetto composito consentono di scrivere definizioni di flusso di dialogo molto più brevi e compatte perché possono essere risolte utilizzando un solo componente (Entità di risoluzione o Risposta comune).

Si consiglia di utilizzare questo approccio, poiché non sono necessari componenti quali Switch o Imposta variabile per acquisire tutti gli input utente necessari per eseguire alcune transazioni aziendali. Un singolo componente può invece richiedere agli utenti di fornire i valori per ciascun articolo nel sacchetto. I prompt stessi sono specifici della condizione perché si basano sulla configurazione individuale per ogni articolo del sacchetto. Utilizzando l'entità sacchetto composto, un handler di eventi di entità o un Apache FreeMarker e i componenti Risposta comune o Risolvi entità, la competenza può:
  • Acquisisci tutto il testo libero, consenti il caricamento dei file e raccogli la posizione corrente dell'utente con gli elementi STRING, ATTACHMENT e LOCATION.

  • Esegui il comportamento individuale per ogni entità membro nel bag: è possibile aggiungere prompt specifici per valore e messaggi di errore per singole entità all'interno del bag composito (che include entità personalizzate, entità di sistema e gli elementi STRING, ATTACHMENT e LOCATION). È inoltre possibile controllare quali entità devono (o non devono) corrispondere all'input utente. Poiché è possibile creare una sequenza di prompt, la competenza può generare prompt diversi per ogni tentativo utente.

  • Presenta elenchi di selezione a scelta multipla.

  • Convalida le corrispondenze dei valori in base alle regole di convalida.

  • Supporto per il flusso infelice: gli utenti possono correggere le voci precedenti.

  • Esegui transizioni temporanee basate su corrispondenza: il flusso della finestra di dialogo può uscire temporaneamente dal componente quando viene trovata una corrispondenza per un'entità, in modo che un altro stato possa eseguire una funzione di supporto come una chiamata REST. Una volta completata la funzione, il flusso della finestra di dialogo torna al componente in modo che il valore corrispondente possa continuare. Ad esempio:
    • Dopo che un utente ha caricato una ricevuta, è necessario eseguire la scansione della ricevuta stessa in modo da poter estrarre da essa valori quali la data di spesa, l'importo e il tipo di spesa per le altre entità del sacchetto. Ciò consente al componente di riempire il resto dei valori dalla ricevuta, non da alcun input utente.

    • L'abilità genera un messaggio come "Quasi lì, poche altre domande" tra i set di entità corrispondenti nella borsa.

    • L'input utente deve essere convalidato tramite una chiamata REST backend. La convalida potrebbe essere necessaria immediatamente, poiché determina quali articoli del sacchetto devono richiedere ulteriori input da parte dell'utente. In alternativa, la chiamata potrebbe restituire informazioni che devono essere condivise con l'utente, ad esempio un'avvertenza fuori criterio.

  • Disambigua valori: è possibile isolare un valore dall'input utente tramite prompt specifici dell'entità e proprietà del componente. Questi includono il supporto per le correzioni all'input precedente (il flusso "infelice") e per richiedere l'input dell'utente per specifiche proprietà di entità incorporate.

Crea un'entità sacchetto composito

  1. Fare clic su Entità Immagine dell'icona Entità. nella barra di navigazione laterale.

  2. Fare clic su Aggiungi entità.

  3. Scegliere Borsa composta come tipo di entità.

  4. Immettere il nome e la descrizione.
  5. Fare clic su + Gestore eventi se si desidera utilizzare il prompt e la logica del sacchetto composto a livello di programmazione utilizzando gestori eventi entità.
  6. Fare clic su + Elemento set per aprire la finestra di dialogo Aggiungi elemento set. Se si aggiunge un'entità incorporata o un'entità personalizzata esistente, è possibile creare un nome specifico del sacchetto e aggiungere una descrizione del relativo ruolo nel contesto del sacchetto composito.

  7. È possibile riempire il sacchetto con entità personalizzate, entità incorporate e quanto segue:
    • STRING (STRING) - Acquisisce il testo libero dall'utente.

    • LOCATION (UBICAZIONE) - Acquisisce la posizione dell'utente.

    • ATTACHMENT: accetta file, file audio, video o file immagine caricati dall'utente. L'entità sacchetto composito memorizza l'URL in cui è ospitato l'allegato.

    Nota

    Quando si aggiunge l'entità DATE_TIME, viene richiesto di specificare un sottotipo.
    Gli articoli vengono risolti nell'ordine in cui vengono aggiunti. Tuttavia, la sequenza può essere influenzata a seconda di come si configurano i singoli membri del sacchetto composito.
  8. Se si fa clic su Chiudi, si torna alla pagina Entità, ma è possibile aggiungere prima altre funzionalità specifiche del sacchetto all'elemento (o aggiornarlo in seguito facendo clic su Questa è un'immagine dell'icona Modifica. nella pagina Entità).

  9. Passi successivi
    • Aggiungere singoli messaggi di errore, prompt di disambiguazione o prompt condizionale per gli elementi del sacchetto.
      Nota

      Se si aggiunge l'entità a un sacchetto composito, queste verranno sovrascritte.
    • Aggiungere l'entità a un intento. Vedere Aggiungi entità a intenti.

    • Configurare il flusso della finestra di dialogo per utilizzare l'entità sacchetto composito.

Riempimento slot avanzato

Quando si abilita il riempimento avanzato degli slot attivando Use Enhanced Slot Filling in Settings > Configuration:
  • Verrà aggiornato solo l'elemento attualmente in fase di risoluzione. Quando una corrispondenza si applica a più articoli della borsa, l'articolo della borsa attualmente risolvente ha la precedenza sugli altri articoli. Se si disattiva il riempimento avanzato degli slot, tutti gli elementi vengono aggiornati con lo stesso valore.
  • Se l'articolo risolutore corrente è un articolo della borsa STRING, nessun altro articolo della borsa viene mai aggiornato.
  • Se una corrispondenza entità si applica a più articoli bag (non risolti), viene visualizzata una finestra di dialogo di disambiguazione che consente all'utente di scegliere l'articolo da aggiornare anziché aggiornare tutti gli articoli bag.
  • Lo switch Prompt per disambiguazione dell'entità viene ignorato. Si consiglia di implementare la disambiguazione personalizzata con un gestore di eventi entità.
Nota

L'opzione Usa riempimento slot avanzato è attivata per impostazione predefinita per le competenze create utilizzando la versione 22.08 della piattaforma. È disattivato per gli skill che sono stati aggiornati a questa versione.

Aggiungi prompt

È possibile aggiungere un singolo prompt o creare una sequenza di prompt, ognuno dei quali fornisce informazioni sempre più specifiche per ogni volta che l'utente immette un valore non valido. Per impostazione predefinita, la richiesta è abilitata. Per aggiungere i seguenti prompt:
  1. Se si desidera abilitare la richiesta, lasciare vuoto il campo Richiedi valore (stato predefinito). L'immissione di false nel campo Richiedi valore impedisce la richiesta. Per richiedere un valore condizionale, aggiungere un'espressione FreeMarker booleana che restituisca true (per la richiesta) o false.

    Suggerimento

    Quando si imposta Richiedi valore su false, l'elemento può comunque essere risolto come parte di un altro elemento richiesto quando si abilita Estrazione fuori ordine.
  2. Fare clic su Aggiungi prompt per creare la sequenza di prompt. È possibile riordinarlo mescolando i campi mediante azioni di trascinamento della selezione o rinumerandoli. È possibile randomizzare l'output dei prompt quando si assegnano due o più prompt con lo stesso numero.
    Nota

    È possibile aggiungere prompt per entità incorporate solo quando vengono aggiunti a un sacchetto composto.
    È possibile memorizzare i prompt nei bundle di risorse (ad esempio, ${rb.askCheese}) o scriverli come combinazioni di testo e espressioni FreeMarker.

Aggiornamento dei valori fessurati con le espressioni FreeMarker di Apache

Nel campo Aggiornabile, immettere un'espressione FreeMarker Apache che restituisca true per consentire l'aggiornamento del valore inserito nello slot per un elemento sacchetto composto.

Abilita estrazione fuori ordine

L'estrazione fuori ordine consente lo slotting e l'aggiornamento dei valori per un articolo sacchetto composito in qualsiasi punto della conversazione, indipendentemente dal fatto che il sacchetto composito abbia richiesto o meno il valore all'utente. Utilizzando le regole riportate di seguito, è possibile impostare come, quando o se un valore può essere inserito in uno slot o modificato in qualsiasi punto della conversazione per qualsiasi elemento o sottotipo di elemento (ad esempio, DATE_TIME sottotipi).
  • Always (sempre): l'opzione predefinita. Quando si sceglie questa opzione per un elemento, il relativo valore può essere inserito in uno slot senza alcuna richiesta. Ad esempio, l'entità PizzaSize potrebbe essere risolta quando un cliente immette Voglio una pizza di grandi dimensioni. Questa opzione consente inoltre di modificare il valore dell'elemento in qualsiasi momento, a condizione che l'espressione nella proprietà Aggiornabile non restituisca false. Ad esempio, quando il sacchetto composito richiede l'entità PizzaType, il cliente potrebbe quindi rispondere Veggie, ma renderlo un supporto. Lo skill può aggiornare il valore dell'entità PizzaSize con il supporto senza riavviare la conversazione perché Sempre è abilitato per gli elementi PizzaSize e PizzaType del bag.
    Nota

    Sebbene questa opzione sia il comportamento predefinito, potrebbe non essere sempre appropriata per gli elementi STRING. Se si sceglie questa opzione per un articolo STRING, ad esempio, il primo messaggio utente verrà memorizzato dall'articolo STRING anziché essere abbinato all'entità desiderata (che potrebbe essere designata come primo articolo del carrello da risolvere).
  • Mai: quando si sceglie questa opzione, l'elemento viene inserito nello slot solo dopo che è stato richiesto, anche quando altri messaggi utente contengono valori validi. Scegliere Mai per evitare corrispondenze involontarie.
  • Solo quando si risolve l'espressione dell'intento: limita lo slotting del valore fuori ordine alla prima espressione utente risolta nell'intento associato all'entità sacchetto composito.
Di seguito sono riportati alcuni esempi delle regole di estrazione out-of-order applicate a un articolo sacchetto composito PizzaToppings.
Regola estrazione out of order Uso utente iniziale Valore con slot Note
Sempre Ordina pizza con tonno Tonno Lo slotting dei valori per l'elemento PizzaToppings può essere trovato ogni volta che il messaggio utente contiene il valore corretto ("funghi invece!). Può essere slotting o aggiornato in qualsiasi punto della conversazione senza richiedere.
mai Ordina pizza con tonno Nessuna Il valore dell'articolo PizzaTopping non può essere inserito in uno slot out of order o aggiornato ad hoc. Può essere abbinato solo quando viene richiesto.
Solo quando si risolve l'espressione dell'intento Ordina pizza con tonno Tonno. Tuttavia, se l'utente ha inserito "Ordina pizza grande", il sacchetto composito dovrebbe richiedere il valore PizzaTopping. L'elemento PizzaTopping può essere inserito in uno slot out of order solo quando il primo enunciato utente che si risolve in un intento ha un valore corrispondente. Altrimenti, questo valore deve essere richiesto. Il sacchetto composito non consentirà l'aggiornamento o lo slotting ad hoc di questo articolo.

Abilita estrazione con

Utilizzare l'opzione Estrai con per consentire di risolvere un articolo del sacchetto utilizzando l'input immesso per un secondo articolo del sacchetto. Questa opzione, che consente di gestire i valori correlati, offre una maggiore flessibilità per l'input dell'utente. Gli utenti possono, ad esempio, immettere home anziché un indirizzo completo. Effettuare le operazioni riportate di seguito.
  • Il sacchetto composito ha due entità relative all'indirizzo: NamedAddress, un'entità valore elenco con valori come home e office e DeliveryAddress, un'entità ADDRESS.
  • Il prompt dell'entità DeliveryAddress è Dove si desidera che venga consegnato?
  • L'entità NamedAddress non richiede l'input (false viene immesso nel campo Prompt per valore).
  • L'entità NamedAddress può essere estratta con DeliveryAddress (DeliveryAddress è selezionata dal menu Estrai con).

Quando il sacchetto composto richiede l'entità DeliveryAddress, può risolvere l'entità utilizzando un indirizzo fisico o uno dei valori della lista NamedAddress (home o office).

Aggiungi regole di convalida

Ogni articolo nella borsa può avere le proprie regole di convalida. Per aggiungere una regola di convalida, fare prima clic su +Validation Regola, quindi aggiungere un'espressione FreeMarker e un prompt di testo. L'espressione utilizza il seguente pattern per fare riferimento al valore dell'elemento, dove varName è il nome dell'entità sacchetto composito dichiarata come variabile nella definizione del flusso della finestra di dialogo:
${varName.value.itemName}
Se l'espressione restituisce false, l'input utente non è valido.
L'esempio seguente di un'espressione di convalida si riferisce a un elemento denominato Importo. È un'entità integrata, VALUTA. Per restituire un importo numerico per il confronto, l'espressione aggiunge la proprietà amount dell'entità CURRENCY:
${expense.value.Amount.amount > 4}
Il messaggio di convalida corrispondente può anche riflettere l'input dell'utente tramite un'espressione FreeMarker. Ad esempio, il messaggio seguente utilizza il tipo di valuta estratta dall'input dell'utente come parte del messaggio di convalida:
Amounts below 5 ${expense.value.Amount.currency} cannot be expensed. Enter a higher amount or type 'cancel'.
Per ulteriori informazioni sulle altre proprietà VALUTA e sulle altre proprietà entità incorporate, vedere Entità incorporate e relative proprietà.

Configura un flusso di finestre di dialogo YAML per entità sacchetto composito

Se la tua abilità viene sviluppata in modalità finestra di dialogo YAML, ecco le cose che devi fare per configurare il flusso della finestra di dialogo per le entità sacchetto composito:

  1. Nel nodo context, dichiarare l'entità sacchetto composito come variabile:
    ...
    metadata:
      platformVersion: "1.1"
    main: true
    name: "ExpenseBot"
    context:
      variables:
        expense: "Expense"
        iResult: "nlpresult"
  2. È possibile utilizzare System.ResolveEntities o System.CommonResponse. Entrambi questi componenti consentono di sfruttare l'entità sacchetto composito ed entrambi offrono i propri vantaggi. Il System.ResolveEntities è il più semplice dei due, con un piccolo insieme di proprietà. A differenza del componente System.ResolveEntities, System.CommonResponse offre un maggiore controllo sull'interfaccia utente utilizzata per risolvere le entità nel bag. Ad esempio, è possibile aggiungere una logica condizionale per determinare i prompt e le azioni globali correlate al valore.

    Suggerimento

    Poiché i metadati per il componente System.CommonResponse possono diventare molto complessi quando si utilizzano entità bag composte, si consiglia di utilizzare il componente System.ResolveEntities e i gestori di eventi entità per qualsiasi personalizzazione dell'interfaccia utente.
  3. Fare riferimento alla variabile di contesto dell'entità sacchetto composito nella proprietà variable del componente, quindi definire le altre proprietà in base alle esigenze. System.ResolveEntities e Proprietà componente le descrivono e forniscono ulteriori esempi.

    Di seguito è riportato un esempio del componente System.ResolveEntities.
    createExpense:
        component: "System.ResolveEntities"
        properties:
          variable: "expense"
          useFullEntityMatches: true
          nlpResultVariable: "iResult"
          cancelPolicy: "immediate"
        transitions:
          actions:
            cancel: "cancelExpense"
          return: "done"          

La variabile system.entityToResolve

La variabile system.entityToResolve fornisce informazioni sullo stato corrente del processo di risoluzione delle entità eseguito dai componenti Risolvi entità e Risposta comune. In genere si fa riferimento alle proprietà di questo valore di variabile nei metadati del componente Risposta comune quando si desidera personalizzare i messaggi. È possibile utilizzarlo per definire la logica per il messaggio di errore di un'entità o per varie proprietà appartenenti ai componenti Risolvi entità e Risposta comune. Aggiungere le seguenti proprietà per restituire il valore dell'entità corrente:
  • userInput
  • prompt
  • promptCount
  • updatedEntities
  • outOfOrderMatches
  • disambiguationValues
  • enumValues
  • needShowMoreButton
  • rangeStartVar
  • nextRangeStart
È inoltre possibile fare riferimento alle proprietà nelle espressioni FreeMarker utilizzate per le proprietà degli elementi bag, ad esempio prompt, errorMessage e le regole di convalida.
Di seguito è riportato un esempio di utilizzo di questa variabile per restituire l'input utente corrente nel messaggio di errore di un'entità.
Sorry,'${system.entityToResolve.value.userInput!'this'}' is not a valid pizza size.
Di seguito è riportato un esempio di utilizzo di varie definizioni system.entityToResolve. Tra questi c'è un messaggio definito per la proprietà text, che conferma un aggiornamento fatto a un valore di entità precedentemente impostato utilizzando una direttiva FreeMarker list Apache e la proprietà updatedEntities.
    metadata:
      responseItems:        
      - type: "text" 
        text: "<#list system.entityToResolve.value.updatedEntities>I have updated <#items as ent>${ent.description}<#sep> and </#items>. </#list><#list system.entityToResolve.value.outOfOrderMatches>I got <#items as ent>${ent.description}<#sep> and </#items>. </#list>"
      - type: "text" 
        text: "${system.entityToResolve.value.prompt}"
        actions:
        - label: "${enumValue}"
          type: "postback"
          iteratorVariable: "system.entityToResolve.value.enumValues"
Per le azioni globali, questa variabile controlla l'azione globale Mostra più con le proprietà needShowMoreButton, rangeStartVar e nextRangeStart:
        globalActions: 
        - label: "Show More"
          type: "postback" 
          visible:
            expression: "${system.entityToResolve.value.needShowMoreButton}"
          payload:
            action: "system.showMore"
            variables: 
              ${system.entityToResolve.value.rangeStartVar}: ${system.entityToResolve.value.nextRangeStart} 
        - label: "Cancel"
          type: "postback" 
          visible:
            onInvalidUserInput: true
          payload:
            action: "cancel"
L'etichetta Mostra più deve includere un valore system.showMore (action: "system.showMore"). Altrimenti, non funzionerà.

entityToResolve Espressioni

Espressione descrizione;
${system.entityToResolve.value.resolvingField} Restituisce il nome dell'articolo del sacchetto.
${system.entityToResolve.value.allMatches[0].entityName} Restituisce il nome dell'entità a cui fa riferimento l'articolo del sacchetto. L'array allMatches contiene tutte le entità i cui valori potrebbero essere potenzialmente aggiornati dal messaggio dell'utente.
${<variable>1.value[system.entityToResolve.value.resolvingField]} Restituisce il valore dell'elemento bag immesso o selezionato dagli utenti.
${system.entityToResolve.value.userInput} Restituisce il testo immesso dall'utente. È possibile utilizzare questa espressione per registrare l'input utente o visualizzarlo nella chat, ad esempio quando un utente immette un valore non valido.
${system.entityToResolve.value.outOfOrderMatches[n].entityName} Restituisce il nome o i nomi delle entità estratte fuori ordine. Insieme ai valori richiesti dalle entità di risoluzione o dai componenti di risposta comune, gli utenti possono fornire valori aggiuntivi che attivano l'estrazione dei valori fuori ordine e gli aggiornamenti ad altre entità nel sacchetto composito.
${system.entityToResolve.value.outOfOrderMatches[n].name} Restituisce il nome dell'articolo sacchetto composito.
${system.entityToResolve.value.outOfOrderMatches? has_content?then(…,…)} Restituisce il valore di un'entità con corrispondenza fuori ordine. Poiché è probabile che non sia stata trovata alcuna corrispondenza per entità fuori ordine, questa espressione utilizza l'operatore has_content.

Handler eventi entità

È possibile eseguire la convalida, la richiesta e la disambiguazione per gli elementi entità sacchetto composito a livello di programmazione utilizzando i gestori eventi entità. Un handler di eventi entità (EEH) è un'implementazione JavaScript (o TypeScript) creata per un'entità bag composta e distribuita come custom code service.
Nota

È possibile gestire il servizio distribuito per EEH dalla pagina Componenti Immagine dell'icona Componenti nella barra di navigazione a sinistra..
È possibile controllare il comportamento di risoluzione sia per i singoli articoli sacchetto che per l'entità stessa definendo le funzioni del gestore di eventi fornite dal bots-node-sdk. Ad esempio, lo snippet riportato di seguito illustra la definizione di un evento validate in una voce sacchetto denominata ExpenseDate che impedisce agli utenti di immettere una data futura durante l'archiviazione di una nota spese.
ExpenseDate: {

        validate: async (event, context) => {
          if (new Date(event.newValue.date) > new Date()) {
            context.addValidationError("ExpenseDate",context.translate('ExpenseDate.text'));
            return false;
          }          
        }
La documentazione Writing Entity Event Handler di bots-node-sdk descrive la struttura complessiva del codice del gestore eventi, gli eventi a livello di elemento e entità e i metodi EntityResolutionContext come addValidationError e translate nello snippet sopra riportato.

Poiché i gestori di eventi entità sono scritti in JavaScript, è possibile utilizzare una logica avanzata che non è facile da ottenere o addirittura fattibile con le espressioni FreeMarker che è possibile utilizzare per definire la convalida, gli errori e i prompt nella pagina Modifica elemento bag e nel flusso della finestra di dialogo. Sono anche più facili da eseguire il debug. Detto questo, non è necessario scegliere gestori di eventi entità su espressioni FreeMarker. È possibile combinare i due. Ad esempio, è possibile utilizzare le espressioni FreeMarker per semplici convalide e prompt e riservare un EEH per funzioni più complesse come la chiamata di un'API REST quando tutti gli elementi del bag sono stati risolti.

Crea gestori eventi entità con editor di codice gestore eventi

È possibile creare EEH utilizzando l'editor Codice gestore eventi a cui si accede dalla pagina delle proprietà del sacchetto composito o con l'IDE desiderato. Mentre l'editor Event Handler Code presenta alcuni vantaggi rispetto a uno strumento di terze parti, potresti voler alternare un IDE di terze parti a seconda delle dimensioni dell'attività e delle librerie di cui hai bisogno. Per valutare i pro e i contro, vedere Quale IDE dovrei usare?

Per accedere all'editor Codice handler eventi, effettuare le operazioni riportate di seguito.
  1. Fare clic su + Handler eventi.
  2. Completare la finestra di dialogo Crea handler di eventi aggiungendo un nome di servizio e un nome di handler.

Dopo aver creato l'handler, è possibile aprire l'editor facendo clic su Questa è un'immagine dell'icona Modifica..

L'editor è popolato con il codice iniziale. Il relativo oggetto handlers contiene gli oggetti entity, items e custom. All'interno di questi oggetti, si definiscono gli eventi a livello di evento, attivati per l'intero sacchetto composito, gli eventi a livello di articolo, che controllano la risoluzione dei singoli articoli del sacchetto e gli eventi personalizzati attivati su azioni di postback. Per impostazione predefinita, per l'oggetto handler è stato definito un oggetto entity. Gli oggetti items e custom vengono popolati quando si aggiunge un modello a livello di elemento o personalizzato.
Segue la descrizione di eeh-default-template.png
Descrizione dell'immagine eeh-default-template.png

Gli eventi stessi sono funzioni JavaScript asincrone che prendono due argomenti:
  • event: oggetto JSON delle proprietà specifiche dell'evento.
  • context: riferimento alla classe EntityResolutionContext, i cui metodi (ad esempio addValidationError nello snippet seguente) forniscono la logica del gestore di eventi.
items: {
  Amount: { 
    validate: async (event, context) => {
      let amount = event.newValue.amount;
      if (amount < 5) {
        context.addValidationError("Amount",`Amounts below 5 ${event.newValue.currency} cannot be expensed. Enter a higher amount or type 'cancel'.`);
      }
    }
  }
Per accedere ai modelli, fare clic su + Aggiungi evento.
Note

Refer to the bots-node-sdk’s Writing Entity Event Handlers documentation for further information on the EEH starter code, item- and entity-level events, EntityResolutionContext, and code samples.
Aggiungi eventi
Se si fa clic su + Aggiungi evento è possibile aggiungere i modelli per eventi, elementi ed eventi personalizzati.

Ad esempio, l'aggiunta di un modello di evento validate inserisce nell'editor il codice seguente:
validate: async (event, context) => {
        
      },
È quindi possibile aggiornare questo modello con il proprio codice:
validate: async (event, context) => {
     if (event.newValue.value === 'PEPPERONI')
       context.addValdiationError('Type', "Sorry, no pepperoni pizzas today!");     
      },
Se si fa clic su Convalida, il codice viene controllato per individuare eventuali problemi relativi alla fase di progettazione. È pertanto consigliabile fare clic regolarmente su questa opzione. Impossibile aggiungere altri eventi se il codice non è valido. Non è possibile salvare il codice non valido. Poiché salvare il codice significa anche distribuirlo, non è nemmeno possibile distribuire il codice non valido.

Quando il codice è valido, fare clic su Salva per distribuirlo automaticamente e inserirlo in un file TGZ. È possibile monitorare lo stato della distribuzione e scaricare il file TGZ per riutilizzarlo in altre competenze dalla pagina Componenti.

Suggerimento

Per verificare la presenza di errori di runtime, attivare Abilita log dei componenti, quindi rivedere i log, a cui è possibile accedere facendo clic su Diagnostica > Visualizza log, per trovare informazioni sui parametri che hanno richiamato gli eventi.
Nella pagina del sacchetto composito, lo stato Pronto Immagine dell'icona dello stato Pronto. e l'icona Modifica Icona Modifica per la revisione del codice diventano disponibili dopo la distribuzione del servizio.

Aggiungi gestori eventi a livello di entità
Per gli eventi a livello di entità, è possibile aggiornare i modelli per gli eventi a livello di entità validate, publishMessage, maxPromptsReached, resolved, attachmentReceived e locationReceived.

Evento descrizione;
validate Handler per le convalide a livello di entità chiamato quando il valore di almeno uno degli elementi del bag è stato modificato.
publishMessage Handler di fallback generico che viene chiamato ogni volta che un oggetto bag manca di un messaggio di prompt o di una gestione di disambiguazione.
maxPromptsReached Handler di fallback generico quando non è stato specificato l'handler specifico dell'elemento per il raggiungimento del numero massimo di prompt.
resolved Questa funzione viene chiamata quando l'entità sacchetto composito è stata risolta. In genere si aggiunge un evento resolved per chiamare un'interfaccia API backend che completa una transazione correlata ai valori raccolti dall'entità sacchetto composto. Se la chiamata API restituisce errori perché alcuni valori raccolti dal sacchetto composito non sono validi, è possibile cancellare questi valori.
attachmentReceived Questo handler viene chiamato quando l'utente invia un allegato.
locationReceived Questo handler viene chiamato quando l'utente invia una posizione.
Per impostazione predefinita, il modello viene popolato con un evento a livello di entità, publishMessage. Tramite le funzioni updatedItemMessage e outOfOrderItemsMessage (definite anche nel modello predefinito), questo evento consente di generare messaggi che confermano l'aggiornamento di un valore di elemento del sacchetto precedentemente risolto o che ha accettato input validi per un elemento del sacchetto diverso da quello richiesto dall'entità (input fuori ordine).

Questo evento è facoltativo. È possibile eliminarlo, lasciarlo così com'è o aggiungervi funzionalità. Ad esempio, è possibile aggiungere un pulsante Annulla quando i tentativi di un utente di immettere un valore valido hanno superato il numero massimo di prompt.
publishMessage: async (event, context) => {
        updatedItemsMessage(context);
        outOfOrderItemsMessage(context);
        //Add Cancel button for invalid values entered by users
        let message = context.getCandidateMessageList()[0];
      }
…
message.addGlobalAction(context.getMessageFactory().createPostbackAction('Cancel', {action:'cancel'}));
        context.addMessage(message);      }
}
Aggiungi handler a livello di articolo
Per gli elementi sacchetto elencati nella finestra di dialogo, è possibile aggiungere modelli per gli eventi a livello di elemento: shouldPrompt, validate, publishPromptMessage, publishDisambiguateMessage e MaxPromptsReached .

Evento descrizione;
shouldPrompt Richiede un articolo in base ai valori degli altri articoli nel sacchetto. Questo handler ha la precedenza sulla richiesta configurata tramite il campo Richiedi valore.
validate Questo handler viene chiamato solo quando è stato impostato un valore per un elemento bag. Se la validità del valore dipende da altri articoli sacchetto, è necessario implementare l'evento validate a livello di entità.
publishPromptMessage Utilizzare questa funzione per sostituire o estendere il messaggio generato dai componenti Risposta comune e Risolvi entità per richiedere l'elemento.
publishDisambiguateMessage Utilizzare questa funzione per sostituire o estendere il messaggio del prompt di disambiguazione generato dai componenti Entità risposta comune e Risolvi.
maxPromptsReached Questa funzione viene chiamata quando viene raggiunto il numero massimo di prompt per questo elemento, specificato dal numero massimo di tentativi di input utente nella schermata dell'elemento del sacchetto composito.

L'aggiunta di un evento a livello di elemento genera l'oggetto items.
Descrizione di eeh-items-block.png
Descrizione della figura eeh-items-block.png

Aggiungi eventi personalizzati
È possibile creare eventi personalizzati richiamati da azioni di postback (pulsanti o elementi di elenco) utilizzando il modello di evento personalizzato.

L'aggiunta di un modello personalizzato aggiunge un oggetto custom con il codice evento di base. Per esempi sull'implementazione di un evento personalizzato, fare riferimento alla documentazione Writing Entity Event Handler del sito bots-node-sdk.
someCustomEvent: async (event, context) => {
  
}

Sostituire o rimuovere un handler di eventi entità

Se è necessario sostituire o rimuovere un EEH:
  1. Selezionare una riga vuota dal menu Gestore eventi per riattivare il pulsante + Gestore eventi.

  2. Aprire la pagina Componenti Immagine dell'icona Componenti nella barra di navigazione a sinistra.. Disattivare Servizio abilitato o eliminare il servizio.
    Nota

    Non è possibile eliminare o disabilitare un servizio se l'EEH è ancora associato all'entità sacchetto composto.
  3. Se necessario, aggiungere un nuovo EEH al sacchetto composito oppure, se non si sta optando per un nuovo EEH, è possibile aggiungere la logica di risoluzione con espressioni FreeMarker.

Suggerimento

L'eliminazione dell'entità sacchetto composto comporta anche l'eliminazione del servizio distribuito per EEH.

Quale IDE dovrei usare?

È possibile creare un EEH utilizzando l'IDE desiderato e quindi distribuire il codice utilizzando un file TGZ inserito manualmente nel package con bots-node-sdk pack oppure utilizzare l'editor Codice gestore eventi fornito. Quando si utilizza il nostro editor, non è necessario impostare l'ambiente di sviluppo o il package e distribuire il codice. Il codice viene distribuito automaticamente dopo il salvataggio. Puoi anche rivedere il codice direttamente senza doverlo ridistribuire, cosa che non puoi fare quando crei un package e distribuisci un handler creato con il tuo IDE. Impossibile aggiungere altri package NPM utilizzando l'editor di codice dell'handler di eventi. Avrai bisogno di un altro IDE. Ad esempio, se si desidera utilizzare Moment.js per utilizzare le date, è necessario scaricare l'area TGZ, aggiungere la libreria utilizzando l'ambiente IDE desiderato, quindi riconfezionare e distribuire l'area TGZ. Successivamente, è possibile continuare a utilizzare l'editor Codice gestore eventi.

Suggerimento

L'editor Codice gestore eventi potrebbe essere un'opzione migliore per le piccole modifiche. Se è necessario apportare modifiche più grandi o aggiungere pacchetti NPM aggiuntivi, è possibile scaricare il file TGZ dalla pagina Componenti, decomprimerlo e quindi utilizzare l'editor preferito per modificare il codice prima di riconfezionarlo e distribuirlo.

Semplifica i flussi di dialogo con i gestori di eventi entità

I gestori di eventi entità possono semplificare la definizione del flusso della finestra di dialogo perché vengono utilizzati con le best practice di abbreviazione della finestra di dialogo che sono entità bag composte. Quando si tratta di servizi backend, la definizione del flusso di finestre di dialogo diventa meno complessa perché non è necessario scrivere uno stato separato per il componente personalizzato che li chiama.

I gestori di eventi semplificano la definizione del flusso della finestra di dialogo in un altro modo: consentono di modificare i messaggi generati dal componente Risolvi entità. Ad esempio, è possibile creare una giostra di messaggi carta senza utilizzare la struttura complessa della proprietà metadata del componente Risposta comune. È invece possibile aggiungere la giostra tramite un codice semplice, il che significa che è anche possibile aggiungere risposte alle carte al componente Risolvi entità. Ad esempio, questo codice consente al componente Risolvi entità di generare una giostra a scorrimento orizzontale di schede per il tipo di pizza, con ciascuna carta con un pulsante Annulla:
Type: {

        publishPromptMessage: async (event, context) => {
          let candidateMessage = context.getCandidateMessageList()[0];
          const mf = context.getMessageFactory();
          const message = mf.createCardMessage()
            .setLayout(horizontal)
            .setCards(context.getEnumValues().map(p => {
                      mf.createCard(p.value)
                        .setDescription(pizzaInfo[p.value].description)
                        .setImageUrl(pizzaInfo[p.value].image)
                        .addAction(mf.createPostbackAction('Order',{variables: {pizza: p.value}}));
                      })
            .setGlobalActions(candidateMessage.getGlobalActions());
          context.addMessage(message);
        }

Esercitazioni del gestore di eventi entità

Seguire questa esercitazione per acquisire familiarità con i gestori di eventi entità creando uno utilizzando l'editor. Quindi, eseguire il check-out di questa esercitazione avanzata per creare un handler di eventi entità con un IDE esterno e bots-node-sdk.

Disambigua gli articoli e i sottotipi di borsa nidificati

Il sacchetto composito richiederà sempre i valori per l'ordine dell'articolo che è dettato dalla struttura gerarchica di un articolo del sacchetto nidificato. Non verranno visualizzati valori di slot ciechi per più articoli. Cerca invece di far corrispondere il valore nel messaggio utente solo all'elemento attualmente richiesto. Se l'input utente non corrisponde all'elemento corrente o può corrispondere a più elementi, come potrebbe accadere per startTime e endTime per un sottotipo INTERVAL, presenta agli utenti il valore definito per la proprietà Etichetta per chiarire l'input richiesto.

Suggerimento

Come per tutte le stringhe, si consiglia di definire il valore Etichetta come bundle di risorse.

Aggiungere l'entità DATE_TIME a un sacchetto composito

Per consentire la gestione di scenari complessi che richiedono più prompt utente, ad esempio la pianificazione di una riunione o l'impostazione di un evento ricorrente, è necessario creare un elemento bag composto DATE_TIME, quindi configurare gli attributi dei sottotipi Intervallo, Ricorrente, Data e ora e i rispettivi elementi bag nidificati.
Nota

Sebbene sia possibile utilizzare la data, l'ora e la durata come entità autonome, è consigliabile utilizzarle all'interno di entità sacchetto composto.
  1. Prima di creare un articolo bag DATE_TIME, configurare le regole di risoluzione delle ambiguità di data e ora appropriate per il caso d'uso. Ad esempio, se si sta creando uno skill per le note spese, selezionare Passato. Se lo skill è uno scheduler riunioni, selezionare Futuro.
  2. Nell'entità sacchetto composto fare clic su Aggiungi articolo.
  3. Selezionare Entità nel menu Tipo.
  4. Selezionare DATE_TIME dal menu Nome entità.
  5. Scegliere un sottotipo DATE_TIME dal menu Sottotipo.

    Le opzioni di configurazione nella pagina Aggiungi elemento del sacchetto cambiano a seconda del sottotipo selezionato. Ad esempio, se si seleziona il sottotipo Ricorrente, è possibile accedere alle opzioni di configurazione per gli elementi del sacchetto nidificato specifici per l'impostazione di un evento ripetuto, ad esempio l'oggetto Data e ora per la data e l'ora di inizio iniziali e l'oggetto Durata per l'impostazione della frequenza dell'evento.

  6. Se sono stati selezionati i sottotipi Ricorrente o Intervallo:
    • Impostare i valori del sottotipo richiesti dal sacchetto composito dal menu Richiedi.
    • Poiché in genere le riunioni iniziano e terminano lo stesso giorno, attivare Data di fine predefinita fino alla data di inizio per il sottotipo startDate. In questo modo la data di fine viene impostata come la data di inizio quando il messaggio utente non menziona la data di fine (o quando la data di fine non viene estratta fuori ordine).
      Immagine della data di inizio predefinita per l'attivazione/disattivazione della data di fine.

  7. Se si desidera, aggiungere un'etichetta di disambiguazione se l'input utente può corrispondere a più sottotipi.

    Suggerimento

    È inoltre possibile configurare le proprietà non specifiche di DATE_TIME, ad esempio riempimento avanzato degli slot, aggiornamento dei valori di slotting con Apache FreeMarker, prompt personalizzati e messaggi di errore.
  8. È possibile accedere alla configurazione a livello di sottotipo facendo clic su un sottotipo. Utilizzare l'attraversamento per tornare alla configurazione a livello di articolo.
    Questa è un'immagine del percorso Modifica elemento borsa.

  9. Passi successivi
    • Associare l'entità sacchetto composito all'intento.
    • Dichiarare una variabile per l'entità nel flusso della finestra di dialogo.
    • Nel flusso della finestra di dialogo, fare riferimento all'entità sacchetto composito con l'elemento DATE_TIME utilizzando lo stato Risolvi sacchetto composito.
    • I valori DATE_TIME sono rappresentati come ISO 8601. Per un output intuitivo, utilizzare Apache FreeMarker .xs integrato. Nello snippet seguente, il valore del sottotipo Ora viene formattato utilizzando .value?time.xs?string['hh:mm a'].
      Your pizza will be delivered at ${pizza.value.deliveryTime.value?time.xs?string['hh:mm a']}.
      
      Anziché fare riferimento all'elemento DATE_TIME come stringa, è possibile seguire l'approccio basato sulle migliori prassi per fare riferimento a tale elemento in un bundle di risorse, ad esempio DeliveryMessage nell'esempio riportato di seguito.
      ${rb('DeliveryMessage','time',pizza.value.deliveryTime.value?time.xs?string['hh:mm a'])}
      
      Per il messaggio del bundle di risorse DeliveryMessage, il valore viene visualizzato tramite il parametro {time}:
      Your pizza will be delivered at {time}.
      

Esercitazione: Estrazione di entità nel mondo reale con entità di borse composte

È possibile dare un'occhiata pratica alla creazione di un sacchetto composito attraverso questa esercitazione: Abilita estrazione di entità Real-World con entità sacchetto composito.