D Riferimento Apache FreeMarker

Operazioni FreeMarker stringa built-in

La tabella seguente mostra come utilizzare alcune delle operazioni stringa incorporate utilizzando una variabile stringa denominata tester, il cui valore viene inviato a "hello world " (con tre spazi vuoti finali).
Nota

L'espressione seguente consente al bot di eseguire l'output del valore tester oppure, no string found se non è stato impostato alcun valore per la variabile.
${tester.value!'no string found'}
Operazione integrata Utilizzo Output
capitalize ${tester.value?capitalize} Hello World
last_index_of ${tester.value?last_index_of('orld')} 7
left_pad ${tester.value?left_pad(3,'_')} ___hello world
length ${tester.value?length} 14
lower_case ${tester.value?lower_case} hello world
upper_case ${tester.value?upper_case} HELLO WORLD
replace ${tester.value?replace('world', 'friends')} hello friends
remove_beginning ${tester.value?remove_beginning('hello')} world
trim ${tester.value?trim} hello world (i tre spazi finali vengono rimossi)
ensure_starts_with ${tester.value?ensure_starts_with('brave new ')} brave new hello world
ensure_ends_with ${tester.value?ensure_ends_with(' my friend')}$ hello world my friend
contains ${tester.value?contains('world')?string ('You said world', 'You did not say world')} You said world

Le espressioni contains('world') restituiscono true o false. Questi valori booleani vengono sostituiti con una stringa mediante la funzione string ('string1','string2').

ends_with ${tester.value?ends_with('world')?string ('Ends with world', 'Doesn't end with world')} Ends with world
starts_with ${tester.value?starts_with('world')?string ('Starts with world', 'Doesn't start with world')} Doesn't start with world
matches (l'espressione regolare restituisce true o false) ${tester.value?matches('^([^0-9]*)$')} L'espressione regolare restituisce true o false a seconda che il valore contenga un numero (nel qual caso il valore booleano viene restituito come false). Il valore tester restituisce true.
matches (l'espressione regolare restituisce una stringa) ${tester.value?matches('^([^0-9]*)$')?} Come sopra, ma questa volta, true viene restituito come una stringa. La funzione matches('regular expression') restituisce true o false come tipi booleani. Per stampare true o false in un componente System.Output, utilizzare ?string per eseguire una conversione to-string.

Nota: non è possibile utilizzare l'espressione regolare per restituire un gruppo di valori; utilizzarli per restituire un singolo valore corrispondente (o nessuna corrispondenza).

Esempio: trasformazione del caso con il componente Switch

Immaginate un caso in cui diversi stati vengono chiamati a seconda dell'input dell'utente (vino o birra), che viene memorizzato nella variabile choice.

L'involucro dell'input utente può essere incoerente, anche all'interno di una parola (WiNE). Invece di aggiungere tutte le possibili variazioni alla definizione del componente, utilizzare un'operazione FTL come upper_case per rendere uniforme l'involucro:
${choice.value?upper_case}

Esempio: concatenazione delle espressioni FTL

È inoltre possibile concatenare le operazioni FTL in una singola espressione.

Nell'esempio seguente, i numeri di volo delle compagnie aeree (rappresentati dalla variabile flight.value) di UA1234 e UA 1234 verranno entrambi trasformati in 1234.
${flight.value?trim?lower_case?remove_beginning('ua ')?remove_beginning('ua')}"

Operazioni numero FreeMarker integrate

Nella tabella riportata di seguito vengono elencate le operazioni dei numeri built-in e viene illustrato come vengono restituiti i valori impostati per le variabili negativeValue (-2.5) e positiveValue (0.5175):
Operazione Esempio Output
abs ${negativeValue.value?abs} 2,5

L'operatore trasforma il valore numerico negativo in un valore positivo.

string (utilizzato con un valore numerico) ${negativeValue.value?abs?string.percent} 250%

L'operatore prima modifica il valore negativo in positivo. Quindi lo converte in percentuale, moltiplicando implicitamente il valore per 100.

string (con il valore del formato decimale e varie valute)

Suggerimento: per gli altri simboli di valuta, vedere Charbase.

${positiveValue.value?string['###.##']} 0,51
${positiveValue.value?string['###.##%']} 51%

L'operatore aggiunge un carattere percentuale dopo aver moltiplicato il valore per 100.

${positiveValue.value?string['##.###\u00A4']} 0,51 $
${positiveValue.value?string['##.###\u20AC']} 0,51 €
${positiveValue.value?string['##.###\u00A3']} 0,51 £
round ${negativeValue.value?round} -2

L'operatore viene arrotondato al numero intero più vicino. Se il numero termina con .5, viene arrotondato verso l'alto.

${positiveValue.value?round} 1

L'operatore viene arrotondato al numero intero più vicino. Se il numero termina con .5, viene arrotondato verso l'alto.

floor ${positiveValue.value?floor} 0

L'operatore viene arrotondato verso il basso.

ceiling ${positiveValue.value?ceiling} 1

L'operatore viene arrotondato verso l'alto.

lower_abc ${negativeValue.value?abs?round?lower_abc} c

L'operatore trasforma il valore negativo in positivo, quindi lo arrotonda a 3. Restituisce c, la terza lettera dell'alfabeto.

upper_abc ${negativeValue.value?abs?round?upper_abc} c

L'operatore trasforma il valore negativo in positivo, quindi lo arrotonda a 3. Restituisce C, la terza lettera dell'alfabeto.

is_infinite ${positiveValue.value?is_infinite?string} false

L'operatore restituisce false, poiché un valore a virgola mobile non è infinito in base a IEEE 754 (standard per l'aritmetica a virgola mobile).

Nota: il valore restituito sarebbe un valore booleano senza ?string.

Operazioni di array FreeMarker integrate

Le operazioni di array (o sequenza) consentono al bot di determinare, tra le altre cose, le dimensioni di un array, ordinare gli array o trovare il contenuto all'interno di un array.

È possibile utilizzare gli array per creare dati mock per i test o per definire strutture di dati persistenti oltre le sessioni utente. È possibile salvare un array in un componente personalizzato, in un flusso o in una variabile globale. Di seguito sono riportati gli array per le variabili person e colors, rispettivamente.
[
  {
    "firstName" : "Frank",
    "lastName" : "Normal"
  },
  {
    "firstName" : "Grant",
    "lastName" : "Right"
  },
  {
    "firstName" : "Geoff",
    "lastName" : "Power"
  },
  {
    "firstName" : "Marcelo",
    "lastName" : "Jump"
  }
]
[
    "yellow", "blue", "red", "black", "white", "green"
  ]
Questi array vengono utilizzati per illustrare le operazioni degli array nella tabella riportata di seguito e nell'Esempio: iterazione degli array.
Operatore Esempio Output
size ${person.value?size?number} 4: la dimensione (quattro membri) dell'array person
indice di array ${person.value[1].firstName} Grant: è il valore della seconda proprietà firstName nell'array person.
${person.value[1].firstName !'unknown'} Come sopra, ma in questo caso, il bot restituisce un output sconosciuto se la seconda proprietà firstName non contiene alcun valore.
first ${person.value?first.firstName} Frank: la prima voce dell'array di persone. Questa operazione non utilizza l'indice array.
last ${person.value?last.firstName} Marcelo: il valore lastName finale nell'array persona.
sort_by ${person.value?sort_by('lastName') [0].firstName} Marcelo
Questo operatore ordina l'array person in base alla proprietà lastName in ordine crescente. Viene quindi stampato il valore della proprietà firstName corrispondente per l'immissione finale nell'array persona:
  • Salta, Marcelo

  • Normale, Frank

  • Potenza, Geoff

  • Destra, Concedi

Nota: a meno che non si salvi l'array ordinato in una variabile utilizzando System.SetVariable, i dati rimangono ordinati solo per una singola richiesta.

${person.value?sort_by('lastName')?reverse[0].firstName} Grant: i valori vengono ordinati in modo decrescente:
  • A destra, concedi

  • Potenza, Geoff

  • Normale, Frank

  • Salta, Marcelo

seq_index_of ${colors.value?seq_index_of('red')} 2: il valore dell'indice per il rosso nell'array di colori.
seq_last_index_of ${colors.value?seq_last_index_of('red')} 2: l'ultimo valore di indice per il rosso nel
join ${colors.value?join(',')} Restituisce l'array colors come stringa separata da virgole: yellow, blue, red, black, white, green
seq_contains ${colors.value?seq_contains('red')?string('Yes', 'No') Restituisce Yes perché l'array contiene il colore rosso.

Nota: ?seq_contains restituisce un valore booleano. Questo valore viene quindi sostituito da una stringa che utilizza l'espressione ?string('…','…').

sort ${colors.value?sort?join(',')} Restituisce l'array di colori come stringa separata da virgole in ordine crescente: black, blue, green, red, white, yellow
reverse ${colors.value?sort?reverse?join(',')} Restituisce l'array colors come stringa separata da virgole in ordine decrescente: yellow, blue, red, black, white, green

Restituzione di intenti e punteggi

È possibile utilizzare le operazioni di array per restituire i risultati dell'elaborazione dell'intento e dell'entità. Ad esempio:
  • ${skill.system.nlpresult.value.entityMatches[‘name of entity’]} restituisce un array di entità trovato in una stringa utente passata al motore degli intenti memorizzato nella variabile nlpresult.

  • ${skill.system.nlpresult.value.intentMatches.summary[n].intent} restituisce il nome dell'intento con classificazione di attendibilità n, dove 0 rappresenta l'intento di primo livello, 1 rappresenta l'intento di secondo livello e così via.

  • ${skill.system.nlpresult.value.intentMatches.summary[n].score} restituisce il punteggio di affidabilità per l'intento specificato.
Per queste due espressioni, n è l'indice dell'elemento che si desidera cercare. Ad esempio, l'espressione che restituisce il nome dell'intento risolto più in alto sarà:
${skill.system.nlpresult.value.intentMatches.summary[0].intent}
Per il punteggio dell'intento principale, l'espressione sarà:
${skill.system.nlpresult.value.intentMatches.summary[0].score}

È possibile utilizzare queste espressioni per intenti con punteggio superiore alla soglia di affidabilità, ma è anche possibile utilizzarle per restituire intenti il cui punteggio è inferiore alla soglia di affidabilità. Queste espressioni non dipendono dal valore della soglia di affidabilità configurato nella pagina Impostazioni dello skill, pertanto è possibile utilizzarle per restituire gli intenti del candidato e i relativi punteggi anche quando non è stato possibile risolvere alcun intento e è stata attivata un'azione unresolvedIntent. In questo caso, ad esempio, è possibile utilizzare queste espressioni per restituire i primi tre intenti e i relativi punteggi di soglia di sicurezza secondaria.

Nota

Se è necessario fare riferimento all'intento selezionato da un utente dopo la richiesta di disambiguazione, è possibile utilizzare ${system.intent.name}. (${skill.system.nlpresult.value.intentMatches.summary[0].intent} restituisce sempre l'intento con il punteggio più alto, che potrebbe non essere l'intento selezionato dall'utente durante la disambiguazione.

Esempio: iterazione degli array

Gli array determinano il numero di entità nell'input utente.

Il seguente snippet della proprietà Metadati di un componente Risposta comune mostra come determinare la dimensione dell'array contenuto nella variabile person e quindi iterare i relativi elementi in modo che la competenza restituisca qualcosa di simile:


responseItems:
- type: "text"
  text: "${person?index+1}. ${person.firstName} ${person.lastName}"
  name: "Sorry"
  separateBubbles: true
  iteratorVariable: "person"
Nota

L'output descritto in questo codice non è ordinato, ovvero non viene utilizzata alcuna operazione sort_by.

Operazioni data FreeMarker integrate

La seguente espressione deriva la data corrente utilizzando il riferimento variabile speciale FreeMarker, .now e l'operatore date incorporato.
${.now?date}
Nella tabella seguente sono elencate alcune delle operazioni data incorporate che è possibile utilizzare per definire le proprietà e manipolare i valori delle entità.
Operazione/i Esempio Output
date ${.now?date} La data corrente
time ${.now?time} L'ora del giorno, come 5:46:09 PM
datetime ${.now?datetime} Stampa la data e l'ora correnti, ad esempio 17 gen 2018 5:36:13 PM.
long e number_to_date ${(.now?long + 86400000)?number_to_date } Aggiunge 24 ore alla data corrente. Se la chiamata viene effettuata il 17 gennaio 2018, FreeMarker esce il 18 gennaio 2018.
string (con stili di formattazione) ${.now?string.full} Converte la data corrente in stringa formattata come mercoledì 17 gennaio 2018 6:35:12 UTC.
${.now?string.long} Converte la data in stringa con il seguente output formattato: 17 gennaio 20186:36:47 UTC PM.
${.now?string.short} Converte la data in stringa con il seguente output formattato: 1/17/18 6:37 PM
${.now?string.medium} Converte la data in stringa con il seguente output formattato: 17 gen 2018 6:38:35.
${.now?string.iso}

Stampa la data nello standard ISO 8601, ad esempio 2018-01-17T18:54:01.129Z.

string (con formati di output specificati) ${.now?string['dd.MM.yyyy, HH:mm']}

Stampa la data corrente in un formato personalizzato, ad esempio 17.01.2018, 18:58.

${.now?string['yyyy']}

2.018

datetime (con string e stile di formattazione) ${date_variable?datetime?string.short} Converte la data in una stringa formattata come 1/17/18 6:37 PM.

L'operatore datetime consente a FreeMarker di determinare se la variabile contiene una data che contiene informazioni sia sulla data che sull'ora. Analogamente, è possibile utilizzare gli operatori date o time per indicare se il valore della data contiene solo la data o solo l'ora, ma l'utilizzo di datetime?string evita errori.

Conversione del valore dell'entità in una stringa mediante
  • date

  • long

  • number_to_date

  • stili di formattazione

  • formati data personalizzati

${dateVar.value.date?long?number_to_date?date?string.short} Converte la data dall'estrazione dell'entità in una stringa formattata come 11/17/18.

L'operatore di data indica a FreeMarker che la variabile contiene solo informazioni sulla data e non sull'ora. L'uso di questo formato evita errori.

${dateVar.value.date?long?number_to_date?string.medium} Converte la data derivata dall'estrazione dell'entità in una stringa formattata come 17 gennaio 2018.

Nota: tutti gli altri formati, ad esempio full, short, long e iso, funzionano allo stesso modo con le date derivate dall'estrazione delle entità.

${dateVar.value.date?long?number_to_date?string['dd.MM.yyyy']} Stampa la data in formato personalizzato. ad esempio: 17.01.2018, 18:58.
${dateVar.value.date?long?number_to_date?string['yyyy']} Stampa la data derivata dall'entità in un formato personalizzato.

Esempio: estrazione di date dall'input utente

Gli esempi riportati di seguito provengono da uno skill che gestisce gli appuntamenti. Quando un utente lo chiede, È possibile organizzare una riunione con Mr. Higgs un giorno dopo domani?, il bot utilizza un'entità complessa, DATE, per estrarre domani dalla richiesta. Viene restituita la data richiesta utilizzando ${(theDate.value.date?long + 86400000)?number_to_date} per aggiungere 24 ore (o 86.400.000 millisecondi) a "domani".
Testo con espressione Output
"Today is: ${.now}"
  • Oggi è: 1/18/18 8:31 AM
"Date found is: ${theDate.value.date}"
  • Data trovata: Jan 19, 2018

"A day later is ${(theDate.value.date?long + 86400000)?number_to_date}"
  • Un giorno dopo è il 20 gennaio 2018

Esempio: impostazione di una data predefinita (quando non viene impostato alcun valore data)

Se il messaggio utente non include informazioni sulla data, lo skill può richiedere agli utenti la data o fornire una data predefinita. Per specificare la data corrente, è possibile utilizzare l'espressione seguente:

${.now?datetime?string.long}

FreeMarker: variabili di sistema accessibili

Oracle Digital Assistant dispone di un set di variabili di sistema attraverso il quale è possibile recuperare informazioni utili nei flussi di dialogo mediante le espressioni FreeMarker.

Nelle loro forme più semplici, queste espressioni assumono la seguente forma:

${system.variableName}

Alcune variabili possono contenere oggetti con proprietà nidificate a cui è possibile accedere utilizzando la notazione a punti dopo il nome della variabile nel seguente modulo.

${system.variableName.propertyName}

Inoltre, i valori delle proprietà nidificate possono essere anche oggetti con proprietà nidificate.

Di seguito sono riportate le variabili di sistema disponibili mediante le espressioni FreeMarker.

Variabile descrizione;
system.actualState Nome dello stato a cui l'utente ha navigato toccando un vecchio pulsante "fuori ordine". Se il payload di postback contiene una proprietà system.state, il motore della finestra di dialogo passerà a questo stato e imposterà questa variabile sul nome dello stato. Vedere anche Configurazione del flusso di finestre di dialogo per le azioni impreviste.
system.authorizedUsers Elenco di tutti gli utenti autorizzati per una determinata chat di gruppo.
system.channelType Tipo di canale della sessione utente corrente. Valori consentiti: facebook, androidsdk, iossdk, websdk, slack, twilio, msteams, cortana, webhook e test.

Se la sessione è in esecuzione nel tester, il valore corrisponde al tipo di canale simulato.

system.entityToResolve L'oggetto che rappresenta l'elemento sacchetto composito corrente da risolvere nel componente Risposta comune quando la proprietà variabile del componente si riferisce a un oggetto sacchetto composito entity.The ha le seguenti proprietà:
  • nextRangeStart: numero di indice dell'elenco di valori consentiti dell'entità a cui verrà eseguito lo spostamento quando si tocca il pulsante Mostra altro.
  • updatedEntities: elenco di articoli bag composti aggiornati in base all'ultimo messaggio utente.
  • needShowMoreButton: proprietà booleana che può essere utilizzata come expression per la proprietà visible per il rendering condizionale del pulsante Mostra altro per passare al set successivo di valori entità.
  • outOfOrderMatches: elenco di articoli bag popolati con un valore basato sull'ultimo messaggio utente quando all'utente è stato richiesto di immettere un altro articolo bag.
  • rangeStartVar: nome della variabile che contiene l'inizio dell'intervallo corrente dei valori entità.
  • validationErrors: per l'elemento bag corrente, elenco dei messaggi di errore causati da un valore non valido fornito nell'ultimo messaggio utente.
  • allMatches: elenco di articoli borsa che hanno ottenuto valori nuovi o aggiornati in base all'ultimo messaggio dell'utente.
  • resolvingField: nome dell'elemento bag corrente richiesto dall'utente.
  • userInput: l'ultimo messaggio utente.
  • skippedItems: elenco di elementi del sacchetto in cui viene superato il numero massimo di prompt per un valore.
  • disambiguationValues: lista di valori di entità consentiti con corrispondenze nell'ultimo messaggio utente.
  • enumValues: elenco di valori consentiti per l'entità corrente.

Per esempi su come utilizzare system.entityToResolve, vedere Variabile system.entityToResolve.

system.errorAction Testo del messaggio di errore di un errore imprevisto restituito durante l'esecuzione dello stato.
system.errorState Nome dello stato che ha restituito un errore imprevisto durante l'esecuzione.
system.expectedState Quando l'utente scorre la cronologia dei messaggi e tocca un vecchio pulsante "fuori ordine", questa variabile viene popolata con il nome dello stato che si prevedeva di eseguire, ma non è mai stata eseguita perché l'utente ha deciso di toccare questo pulsante "fuori ordine". Vedere anche Configurazione del flusso di finestre di dialogo per le azioni impreviste.
system.intent.name Utilizzare per fare riferimento all'intento selezionato da un utente dopo che è stato chiesto di disambiguare. (
${iResult.value.intentMatches.summary[0].intent}
restituisce sempre l'intento con il punteggio più alto, che potrebbe non essere l'intento selezionato dall'utente durante la disambiguazione).
system.invalidUserInput Valore booleano impostato su true quando l'input utente non può essere corrispondente al tipo di variabile richiesto.
system.message Ultimo messaggio ricevuto da Oracle Digital Assistant. Questa variabile dispone delle proprietà riportate di seguito.
  • channelConversation: l'oggetto conversazione canale con le seguenti proprietà:
    • botId
    • channelType: quando viene eseguito nel tester, viene restituito test. Se si desidera ottenere il nome del canale che viene simulato nel tester, utilizzare system.channelType.
    • channelName
    • channelCategory: restituisce il tipo di canale. Per DA come canali agente, restituisce botAsAgent.
    • groupConversation: restituisce true se la conversazione è una chat di gruppo.
    • userId: restituisce l'ID utente. Per DA come canali agente, verrà restituito l'ID coinvolgimento.
    • sessionId: restituisce l'ID sessione. Per DA come canali agente, verrà restituito l'ID coinvolgimento.
    • sessionExpiryDuration
  • messagePayload: il messaggio effettivo inviato dall'utente. Le proprietà a cui è possibile accedere dipendono dal tipo di messaggio:
    • Messaggio di testo: la proprietà text che restituisce il messaggio effettivo immesso dall'utente
    • Messaggio postback: le proprietà dell'oggetto postback, in genere action e variables quando si utilizza il componente Risposta comune. Ad esempio, quando l'utente tocca un pulsante che imposta la variabile pizzaSize, questo valore può essere recuperato utilizzando la seguente espressione:${system.message.messagePayload.variables.pizzaSize}
    • Messaggio di posizione: la proprietà location, che contiene un oggetto di posizione con le seguenti proprietà:
      • title
      • url
      • latitude
      • longitude
  • stateCount: il numero di stati eseguiti per elaborare l'ultimo messaggio utente.
  • platformVersion: la versione corrente della piattaforma runtime.
system.requestedState Se un utente immette una conversazione in uno stato che richiede l'autorizzazione e non si trova nella lista di utenti memorizzati in system.authorizedUsers, il modulo di gestione della finestra di dialogo memorizza lo stato che intende eseguire in questa variabile.
system.selectedCardIndex Questa variabile contiene l'indice della scheda selezionata quando si utilizza la funzione per ottimizzare il rendering delle schede per canali di solo testo come Twilio. Questa ottimizzazione consente all'utente di selezionare una carta in un processo in due fasi: prima viene presentato un elenco di carte, quindi l'utente può inserire il numero delle carte che desidera selezionare. Il numero di indice corrispondente di questa scheda viene memorizzato in questa variabile.
Nota

Le variabili di sistema nella tabella precedente sono le uniche che è possibile utilizzare nelle espressioni FreeMarker. Altre variabili di sistema non sono pubbliche e il loro utilizzo è soggetto a modifiche, il che significa che le tue abilità non possono fare affidamento su di esse.

Ad esempio, le variabili system.routingFromSkill, system.routingToSkill, system.routingFromIntent e system.routingToIntent sono disponibili solo per impostazioni specifiche dell'assistente digitale. Vedere Variabili di sistema per assistenti digitali.