D Informations de référence sur Apache FreeMarker

Opérations FreeMarker intégrées - Chaînes

Le tableau suivant montre comment utiliser certaines des opérations de chaîne intégrées avec une variable de chaîne appelée tester, dont la valeur est envoyée à "hello world " (avec trois espaces vides de fin).
Note

L'expression suivante permet au robot de générer la valeur tester ou no string found si aucune valeur n'a été définie pour la variable.
${tester.value!'no string found'}
Opération intégrée Utilisation Sortie
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 (les trois espaces de fin sont supprimés)
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

Les expressions contains('world') retournent true ou false. Ces valeurs booléennes sont remplacées par une chaîne à l'aide de la fonction 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'expression rationnelle retourne true ou false) ${tester.value?matches('^([^0-9]*)$')} L'expression rationnelle retourne true ou false selon que la valeur contient un nombre (dans ce cas, la valeur booléenne est retournée comme false). La valeur tester retourne true.
matches (l'expression rationnelle retourne une chaîne) ${tester.value?matches('^([^0-9]*)$')?} Identique à ci-dessus, mais cette fois, true est retournée comme chaîne. La fonction matches('regular expression') retourne true ou false comme types booléens. Pour afficher true ou false dans un composant System.Output, utilisez ?string pour effectuer une conversion en chaîne.

Note : Vous ne pouvez pas utiliser d'expression rationnelle pour retourner un groupe de valeurs; utilisez-les pour retourner une seule valeur correspondante (ou aucune correspondance).

Exemple : Transformation de la casse avec le composant Switch

Imaginez un cas où différents états sont appelés en fonction de l'entrée de l'utilisateur (vin ou bière) stockée dans la variable choice.

La casse de l'entrée utilisateur peut être incohérente, même dans un mot (WiNE). Au lieu d'ajouter toutes les variantes possibles à la définition de composant, utilisez une opération FTL telle que upper_case pour uniformiser la casse :
${choice.value?upper_case}

Exemple : Concaténation d'expressions FTL

Vous pouvez également concaténer les opérations FTL en une seule expression.

Dans l'exemple suivant, les numéros de vol de la compagnie aérienne (représentés par la variable flight.value) de UA1234 et de UA 1234 seraient tous deux transformés en 1234.
${flight.value?trim?lower_case?remove_beginning('ua ')?remove_beginning('ua')}"

Opérations FreeMarker intégrées - Nombres

Le tableau suivant liste les opérations de nombre intégrées et présente leur sortie pour la valeur définie pour les variables negativeValue (-2.5) et positiveValue (0.5175) :
Opération Exemple Sortie
abs ${negativeValue.value?abs} 2,5

L'opérateur transforme la valeur numérique négative en valeur positive.

string (utilisée avec une valeur numérique) ${negativeValue.value?abs?string.percent} 250 %

L'opérateur convertit d'abord la valeur négative en valeur positive. Puis, il la convertit en pourcentage, en la multipliant implicitement par 100.

string (avec la valeur au format décimal et différentes devises)

Conseil : Consultez Charbase pour obtenir d'autres symboles de devise.

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

L'opérateur ajoute un caractère de pourcentage après avoir multiplié la valeur par 100.

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

L'opérateur arrondit au nombre entier le plus proche. Si le nombre se termine par ,5, il est arrondi au nombre entier supérieur.

${positiveValue.value?round} 1

L'opérateur arrondit au nombre entier le plus proche. Si le nombre se termine par ,5, il est arrondi au nombre entier supérieur.

floor ${positiveValue.value?floor} 0

L'opérateur arrondit au nombre entier inférieur.

ceiling ${positiveValue.value?ceiling} 1

L'opérateur arrondit au nombre entier supérieur.

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

L'opérateur convertit la valeur négative en valeur positive, puis l'arrondit à 3. Il retourne c, la troisième lettre de l'alphabet.

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

L'opérateur convertit la valeur négative en valeur positive, puis l'arrondit à 3. Il retourne C, la troisième lettre de l'alphabet.

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

L'opérateur retourne false, car une valeur flottante n'est pas infinie selon l'IEEE 754 (norme sur l'arithmétique à virgule flottante).

Note : La valeur retournée est une valeur booléenne sans ?string.

Opérations FreeMarker intégrées - Tableaux

Les opérations de tableau (ou séquence) permettent à votre robot, entre autres, de déterminer la taille d'un tableau, de trier des tableaux ou de rechercher du contenu dans un tableau.

Vous pouvez utiliser des tableaux pour créer des données de simulation aux fins de test ou de définition de structures de données conservées au-delà des sessions d'utilisateur. Vous pouvez enregistrer un tableau dans un composant personnalisé, dans un flux ou une variable globale. Voici des tableaux pour les variables person et colors, respectivement.
[
  {
    "firstName" : "Frank",
    "lastName" : "Normal"
  },
  {
    "firstName" : "Grant",
    "lastName" : "Right"
  },
  {
    "firstName" : "Geoff",
    "lastName" : "Power"
  },
  {
    "firstName" : "Marcelo",
    "lastName" : "Jump"
  }
]
[
    "yellow", "blue", "red", "black", "white", "green"
  ]
Ces tableaux sont utilisés pour illustrer les opérations de tableau dans le tableau suivant et dans Exemple : Itération de tableaux.
Opérateur Exemple Sortie
size ${person.value?size?number} 4—Taille (quatre membres) du tableau person
index de tableau ${person.value[1].firstName} Grant—Valeur de la deuxième propriété firstName dans le tableau person.
${person.value[1].firstName !'unknown'} Identique à l'élément précédent mais, dans ce cas, le robot présente une sortie inconnue si la deuxième propriété firstName n'a pas de valeur.
first ${person.value?first.firstName} Frank—Première entrée du tableau des personnes Cette opération n'utilise pas l'index de tableau.
last ${person.value?last.firstName} Marcelo—Valeur lastName finale dans le tableau des personnes.
sort_by ${person.value?sort_by('lastName') [0].firstName} Marcelo
Cet opérateur trie le tableau person dans l'ordre croissant de la propriété lastName. Il affiche ensuite la valeur de la propriété firstName correspondante pour une entrée finale dans le tableau des personnes :
  • Jump, Marcelo

  • Normal, Frank

  • Power, Geoff

  • Right, Grant

Note : À moins que vous n'ayez enregistré le tableau trié dans une variable à l'aide de System.SetVariable, les données ne restent triées que pour une seule demande.

${person.value?sort_by('lastName')?reverse[0].firstName} Grant—Les valeurs sont triées dans l'ordre décroissant :
  • Right, Grant

  • Power, Geoff

  • Normal, Frank

  • Jump, Marcelo

seq_index_of ${colors.value?seq_index_of('red')} 2—Valeur d'index pour le rouge dans le tableau des couleurs.
seq_last_index_of ${colors.value?seq_last_index_of('red')} 2—Dernière valeur d'index pour le rouge dans le
join ${colors.value?join(',')} Retourne le tableau colors sous la forme d'une chaîne séparée par des virgules : yellow, blue, red, black, white, green
seq_contains ${colors.value?seq_contains('red')?string('Yes', 'No') Retourne Yes car le tableau contient la valeur "red".

Note : ?seq_contains retourne une valeur booléenne. Cette valeur est alors remplacée par une chaîne à l'aide de l'expression ?string('…','…').

sort ${colors.value?sort?join(',')} Retourne le tableau des couleurs sous forme de chaîne séparée par des virgules dans l'ordre croissant : black, blue, green, red, white, yellow
reverse ${colors.value?sort?reverse?join(',')} Retourne le tableau colors sous la forme d'une chaîne séparée par des virgules dans l'ordre décroissant : yellow, blue, red, black, white, green

Renvoi des intentions et des notes

Vous pouvez utiliser des opérations de tableau pour retourner les résultats du traitement des intentions et des entités. Par exemple :
  • ${skill.system.nlpresult.value.entityMatches[‘name of entity’]} retourne un tableau d'entités trouvées dans une chaîne d'utilisateur transmise au moteur d'intention stockée dans la variable nlpresult.

  • ${skill.system.nlpresult.value.intentMatches.summary[n].intent} retourne le nom de l'intention dont le classement de confiance est n, où 0 représente l'intention de premier rang, 1 représente l'intention de deuxième rang, etc.

  • ${skill.system.nlpresult.value.intentMatches.summary[n].score} retourne la note de confiance pour l'intention indiquée.
Pour ces deux expressions, n est l'index de l'élément que vous voulez consulter. Par exemple, l'expression servant à retourner le nom de l'intention la plus résolue serait :
${skill.system.nlpresult.value.intentMatches.summary[0].intent}
Pour la note de l'intention principale, l'expression serait :
${skill.system.nlpresult.value.intentMatches.summary[0].score}

Vous pouvez utiliser ces expressions pour des intentions dont la note est supérieure au seuil de confiance, mais également pour retourner des intentions dont la note est inférieure. Ces expressions ne dépendent pas de la valeur du seuil de confiance configurée dans la page Settings (Settings) de la compétence. Vous pouvez donc l'utiliser pour retourner les intentions candidates et leurs notes même si aucune intention n'a pu être résolue et qu'une action unresolvedIntent a été déclenchée. Dans ce cas, par exemple, vous pouvez utiliser ces expressions pour retourner les trois premières intentions et leurs notes inférieures au seuil de confiance.

Note

Si vous devez faire référence à l'intention qu'un utilisateur a sélectionnée après avoir été invité à désambiguïser, vous pouvez utiliser ${system.intent.name}. (${skill.system.nlpresult.value.intentMatches.summary[0].intent} retourne toujours l'intention avec la note supérieure, ce qui peut ne pas être l'intention sélectionnée par l'utilisateur lors de la désambiguïté.

Exemple : Itération de tableaux

Les tableaux déterminent le nombre d'entités dans l'entrée utilisateur.

L'extrait de code suivant de la propriété Métadonnées d'un composant de réponse commune indique comment déterminer la taille du tableau dans la variable person, puis passer en boucle sur ses éléments afin que la compétence produise une sortie semblable à ce qui suit :


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

La sortie décrite dans ce code n'est pas triée (c'est-à-dire qu'aucune opération sort_by n'est utilisée).

Opérations FreeMarker intégrées - Dates

L'expression suivante calcule la date courante à l'aide de la référence de variable spéciale FreeMarker, .now et l'opérateur date intégré.
${.now?date}
Le tableau suivant liste certaines des opérations de date intégrées que vous pouvez utiliser pour définir des propriétés et traiter des valeurs d'entité.
Opération(s) Exemple Sortie
date ${.now?date} La date courante
time ${.now?time} Heure du jour, comme 5:46:09 PM
datetime ${.now?datetime} Affiche la date et l'heure courantes, comme Jan 17, 2018 5:36:13 PM.
long et number_to_date ${(.now?long + 86400000)?number_to_date } Ajoute 24 heures à la date courante. Si l'appel est effectué le 17 janvier 2018, FreeMarker indique le 18 janvier 2018.
string (avec styles de formatage) ${.now?string.full} Convertit la date courante en chaîne dans le format Wednesday, January 17, 2018 6:35:12 PM UTC.
${.now?string.long} Convertit une date en chaîne avec la sortie formatée suivante : January 17, 20186:36:47 PM UTC.
${.now?string.short} Convertit une date en chaîne avec la sortie formatée suivante : 1/17/18 6:37 PM
${.now?string.medium} Convertit une date en chaîne avec la sortie formatée suivante : Jan 17, 2018 6:38:35.
${.now?string.iso}

Affiche la date au format ISO 8601, par exemple 2018-01-17T18:54:01.129Z.

string (avec les formats de sortie spécifiés) ${.now?string['dd.MM.yyyy, HH:mm']}

Affiche la date courante dans un format personnalisé, par exemple 17.01.2018, 18:58.

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

2018

datetime (avec string et style de formatage) ${date_variable?datetime?string.short} Convertit la date en chaîne formatée : 1/17/18 6:37 PM.

L'opérateur datetime permet à FreeMarker de détecter si la variable contient une date comprenant des informations de date et d'heure. Vous pouvez également utiliser les opérateurs date ou time pour indiquer si la valeur de date contient uniquement la date ou l'heure, mais datetime?string, permet d'éviter les erreurs.

Conversion de la valeur de l'entité en chaîne à l'aide de
  • date

  • long

  • number_to_date

  • styles de formatage

  • formats de date personnalisés

${dateVar.value.date?long?number_to_date?date?string.short} Convertit la date de l'extraction de l'entité en chaîne au format 11/17/18.

L'opérateur de date indique à FreeMarker que la variable contient uniquement une date et non des informations horaires. L'utilisation de ce format permet d'éviter les erreurs.

${dateVar.value.date?long?number_to_date?string.medium} Convertit la date dérivée de l'extraction de l'entité en chaîne formatée : Jan 17, 2018.

Note : Tous les autres formats, tels que full, short, long et iso, fonctionnent de la même façon avec les dates dérivées de l'extraction d'entité.

${dateVar.value.date?long?number_to_date?string['dd.MM.yyyy']} Affiche la date dans un format personnalisé. Par exemple : 17.01.2018, 18:58.
${dateVar.value.date?long?number_to_date?string['yyyy']} Affiche la date calculée à partir de l'entité dans un format personnalisé.

Exemple : Extraction de dates à partir de l'entrée utilisateur

Les exemples suivants proviennent d'une compétence qui gère les rendez-vous. Lorsqu'un utilisateur lui demande, Can you arrange a meeting with Mr. Higgs a day later than tomorrow? (Pouvez-vous arranger une réunion avec M. Higg un jour après demain), le robot utilise une entité complexe, DATE, pour extraire tomorrow (demain) de la demande. Il affiche la date demandée à l'aide de ${(theDate.value.date?long + 86400000)?number_to_date} pour ajouter 24 heures (ou 86 400 000 millisecondes) à "demain".
Texte avec expression Sortie
"Today is: ${.now}"
  • La date d'aujourd'hui est : 18/1/18 8 : 31
"Date found is: ${theDate.value.date}"
  • La date trouvée est : 19 janvier 2018

"A day later is ${(theDate.value.date?long + 86400000)?number_to_date}"
  • Un jour plus tard est le 20 janvier 2018

Exemple : Définition d'une date par défaut (si aucune valeur de date n'est définie)

Si le message de l'utilisateur n'inclut aucune information de date, votre compétence peut inviter les utilisateurs à entrer une date ou en fournir une par défaut. Pour indiquer la date courante, vous pouvez utiliser l'expression suivante :

${.now?datetime?string.long}

Variables de système accessibles par FreeMarker

Oracle Digital Assistant dispose d'un ensemble de variables de système, par lequel vous pouvez extraire des informations utiles dans vos flux de dialogue au moyen d'expressions FreeMarker.

Dans leurs formes les plus simples, ces expressions se présentent comme suit :

${system.variableName}

Certaines variables peuvent contenir des objets dont les propriétés imbriquées sont accessibles au moyen de la notation avec point après le nom de variable comme suit.

${system.variableName.propertyName}

De plus, les valeurs de propriété imbriquée peuvent aussi être des objets à propriétés imbriquées.

Voici les variables de système disponibles au moyen des expressions FreeMarker.

Variable Description
system.actualState Nom de l'état que l'utilisateur a atteint en touchant un bouton dans un message ancien. Si les données utiles de republication contiennent une propriété system.state, le moteur de dialogue passe à cet état et règle cette variable au nom de celui-ci. Voir aussi Configurer le flux de dialogue pour des actions inattendues.
system.authorizedUsers Liste de tous les utilisateurs autorisés pour un clavardage en groupe donné.
system.channelType Type de canal de la session utilisateur courante. Valeurs admissibles : facebook, androidsdk, iossdk, websdk, slack, twilio, msteams, cortana, webhook et test .

Si la session est en cours d'exécution dans le testeur, la valeur correspond au type de canal simulé.

system.entityToResolve Objet représentant l'élément d'entité composite courant à résoudre dans le composant de réponse commune lorsque la propriété de variable du composant référence un objet entity.The d'entité composite a les propriétés suivantes :
  • nextRangeStart - Numéro d'index de la liste de valeurs autorisées de l'entité qui sera consultée lors de la sélection du bouton Show More (Afficher plus).
  • updatedEntities - Liste des éléments de l'entité composite qui ont été mis à jour en fonction du dernier message de l'utilisateur.
  • needShowMoreButton - Propriété booléenne pouvant être utilisée comme expression pour la propriété visible afin de rendre de manière conditionnelle le bouton Show More pour naviguer jusqu'au jeu de valeurs d'entité suivant.
  • outOfOrderMatches - Liste des éléments de l'entité composite qui ont été alimentés avec une valeur basée sur le dernier message de l'utilisateur à l'invite d'un autre élément de l'entité composite.
  • rangeStartVar - Nom de la variable qui contient le début de l'intervalle courant des valeurs d'entité.
  • validationErrors - Pour l'élément de l'entité composite courante, liste des messages d'erreur causés par une valeur non valide fournie dans le dernier message de l'utilisateur.
  • allMatches - Liste des éléments de l'entité composite qui reçoivent des valeurs nouvelles ou mises à jour en fonction du dernier message de l'utilisateur.
  • resolvingField - Nom de l'élément de l'entité composite courante que l'utilisateur est invité à fournir.
  • userInput - Dernier message de l'utilisateur.
  • skippedItems - Liste des éléments de l'entité composite où le nombre maximum d'invites à entrer une valeur est dépassé.
  • disambiguationValues - Liste des valeurs d'entité autorisées qui ont une correspondance dans le dernier message de l'utilisateur.
  • enumValues - Liste des valeurs d'entité autorisées pour l'élément de l'entité composite courante.

Voir Variable system.entityToResolve pour obtenir des exemples de l'utilisation de system.entityToResolve.

system.errorAction Texte de message d'une erreur inattendue générée lors de l'exécution de l'état.
system.errorState Nom de l'état qui a généré une erreur inattendue lors de l'exécution.
system.expectedState Lorsque l'utilisateur fait défiler vers le haut l'historique des messages et touche un bouton dans un ancien message, cette variable est alimentée par le nom de l'état qui devait être exécuté, mais ne l'a jamais été car l'utilisateur a décidé de toucher ce bouton. Voir aussi Configurer le flux de dialogue pour des actions inattendues.
system.intent.name Utilisez cette option pour faire référence à l'intention qu'un utilisateur a sélectionnée après avoir été invité à désambiguïser. (
${iResult.value.intentMatches.summary[0].intent}
renvoie toujours l'intention avec la note supérieure, qui n'est peut-être pas l'intention sélectionnée par l'utilisateur lors de la désambiguïté.)
system.invalidUserInput Valeur booléenne réglée à true lorsque l'entrée utilisateur ne peut pas être mise en correspondance avec le type de variable demandé.
system.message Dernier message reçu par Oracle Digital Assistant. Cette variable contient les propriétés suivantes :
  • channelConversation - Objet de conversation du canal, qui contient les propriétés suivantes :
    • botId
    • channelType - Lors de l'exécution dans le testeur, test est retourné. Pour obtenir le nom du canal faisant l'objet d'une simulation dans le testeur, utilisez plutôt system.channelType.
    • channelName
    • channelCategory - Retourne le type de canal. Pour les canaux Assistant numérique utilisé comme agent, botAsAgent est retourné.
    • groupConversation - Renvoie true si la conversation est un clavardage en groupe.
    • userId : Retourne l'ID utilisateur. Pour les canaux Assistant numérique utilisé comme agent, l'ID engagement sera retourné.
    • sessionId - Retourne l'ID session. Pour les canaux Assistant numérique utilisé comme agent, l'ID engagement sera retourné.
    • sessionExpiryDuration
  • messagePayload - Message réel envoyé par l'utilisateur. Les propriétés auxquelles vous avez accès dépendent du type de message :
    • Message texte : La propriété text retourne le message réel entré par l'utilisateur
    • Message de republication : Propriétés de l'objet de republication, généralement action et variables lors de l'utilisation du composant Réponse commune. Par exemple, lorsque l'utilisateur touche un bouton qui définit la variable pizzaSize, cette valeur peut être extraite à l'aide de l'expression suivante :${system.message.messagePayload.variables.pizzaSize}
    • Message d'emplacement : La propriété location, qui contient un objet d'emplacement aux propriétés suivantes :
      • title
      • url
      • latitude
      • longitude
  • stateCount - Nombre d'états exécutés pour traiter le dernier message utilisateur.
  • platformVersion - Version de la plate-forme d'exécution courante.
system.requestedState Si un utilisateur entre dans une conversation à un état requérant une autorisation alors qu'il ne figure pas dans la liste des utilisateurs stockés dans system.authorizedUsers, le moteur de dialogue stocke l'état qu'il avait l'intention d'exécuter dans cette variable.
system.selectedCardIndex Cette variable contient l'index de la carte sélectionnée lors de l'utilisation de l'option d'optimisation du rendu de carte pour les canaux textuels tels que Twilio. Cette optimisation permet à l'utilisateur de sélectionner une carte en deux étapes : une liste de cartes est présentée, puis l'utilisateur peut entrer le nombre de cartes qu'il veut sélectionner. Le numéro d'index correspondant de cette carte est stocké dans cette variable.
Note

Les variables de système du tableau ci-dessus sont les seules que vous pouvez utiliser dans les expressions FreeMarker. D'autres variables système ne sont pas publiques et leur utilisation est sujette à changement, ce qui signifie que vos compétences ne peuvent pas compter sur elles.

Par exemple, les variables system.routingFromSkill, system.routingToSkill, system.routingFromIntent et system.routingToIntent ne sont disponibles que pour des paramètres d'assistant numérique spécifiques. Voir Variables de système pour assistants numériques.