You can use arrays to create mock data for testing, or for defining data structures
that persist beyond user sessions. You can save an array in a custom component, in a flow or
global variable. Here are arrays for
These
arrays are used to illustrate the array operations in the following table and in
This operator sorts the
person
array by the
lastName
property in ascending order. It then prints the value of the corresponding
firstName
property for final entry in the person array:
Jump, Marcelo
Normal, Frank
Power, Geoff
Right, Grant
Note
: Unless you save the sorted array in a variable using
System.SetVariable
, the data remains sorted for a single request only.
${person.value?sort_by('lastName')?reverse[0].firstName}
Grant
—the values are sorted in descending order:
Right,
Grant
Power, Geoff
Normal, Frank
Jump, Marcelo
${colors.value?join(',')}
Returns the
colors
array as a comma-separated string:
yellow, blue, red, black, white, green
seq_contains
${colors.value?seq_contains('red')?string('Yes', 'No')
Returns
Yes
because the array contains red.
Note
:
?seq_contains
returns a boolean value. This value
is then replaced by a string using the
?string('…','…')
expression.
${colors.value?sort?join(',')}
Returns the colors array as a comma-separated string in ascending order:
black, blue, green, red, white, yellow
reverse
${colors.value?sort?reverse?join(',')}
Returns the
colors
array as a comma-separated string in descending order:
yellow, blue, red, black, white, green
You can use array operations to return the results from the intent and entity
processing. For example:
${skill.system.nlpresult.value.entityMatches[‘name of
entity’]}
returns an array of entities found in a user string
that’s passed to the Intent Engine stored in the
nlpresult
variable.
${skill.system.nlpresult.value.intentMatches.summary[n].intent}
returns the name of the intent that has a confidence ranking of
n
, where
0
represents the top-ranked
intent,
1
represents the second ranked intent, etc.
${skill.system.nlpresult.value.intentMatches.summary[n].score}
returns the confidence score for the given intent.
For these two expressions,
n
is the index of the item you want to
look up. For example, the expression to return the top-resolved intent name would
be:
${skill.system.nlpresult.value.intentMatches.summary[0].intent}
For the top intent's score, the expression would
be:
${skill.system.nlpresult.value.intentMatches.summary[0].score}
You can use these expressions for intents that scored above the confidence
threshold, but you can also use them to return intents whose score falls below the
confidence threshold. These expressions are not dependent on the confidence threshold
value that's configured in the Skill's
Settings
page, so you can
use them to return the candidate intents and their scores even when no intent could be
resolved and an
unresolvedIntent
action has been triggered. In this
case, you can, for example, use these expressions to return the top three intents and
their sub-confidence threshold scores.
If you need to refer to the intent that
a user has selected after being asked to disambiguate, you can use
${system.intent.name}
.
(
${skill.system.nlpresult.value.intentMatches.summary[0].intent}
always returns the intent with the top score, which might not be the intent that the
user selects when disambiguating.
Example: Iterating Arrays
Arrays determine the number of entities in the user input.
The following snippet from a Common Response component's Metadata property shows
how to determine the size of the array held in the
person
variable and then
iterate over its elements so that the skill outputs something like:
responseItems:
- type: "text"
text: "${person?index+1}. ${person.firstName} ${person.lastName}"
name: "Sorry"
separateBubbles: true
iteratorVariable: "person"
The output described in this code is not sorted (that is, no
sort_by
operation is used).
Built-In FreeMarker Date Operations
The following expression derives the current date using the FreeMarker special
variable reference,
.now
and the built-in
date
operator.
${.now?date}
The following table lists some of the
built-in date operations
that you can use to define properties and manipulate entity values.
long
and
number_to_date
${(.now?long + 86400000)?number_to_date }
Adds 24 hours to the current date. If the call is made on January 17, 2018, FreeMarker outputs January 18, 2018.
string
(with formatting styles)
${.now?string.full}
Converts the current date to string formatted as Wednesday, January 17, 2018 6:35:12 PM UTC.
${.now?string.long}
Converts date to string with the following formatted output: January 17, 20186:36:47 PM UTC.
${.now?string.short}
Converts date to string with the following formatted output: 1/17/18 6:37 PM
${.now?string.medium}
Converts date to string with the following formatted output: Jan 17, 2018 6:38:35.
${.now?string.iso}
Prints the date in the ISO 8601 standard like 2018-01-17T18:54:01.129Z.
string
(with specified output formats)
${.now?string['dd.MM.yyyy, HH:mm']}
Prints the current date in a custom format, like 17.01.2018, 18:58.
${.now?string['yyyy']}
datetime
(with
string
and formatting style)
${date_variable?datetime?string.short}
Converts the date to a string formatted as 1/17/18 6:37 PM.
The
datetime
operator enables FreeMarker to tell if the variable holds a date that contains both date and time information. Similarly, you can use the
date
or
time
operators to indicate if the date value contains only the date or only the time, but using
datetime?string
avoids errors.
${dateVar.value.date?long?number_to_date?date?string.short}
Converts the date from the entity extraction to a string formatted as 11/17/18.
The date operator tells FreeMarker that the variable only holds a date, not time information. Using this format avoids errors.
${dateVar.value.date?long?number_to_date?string.medium}
Converts the date that’s derived from entity extraction to a string formatted as Jan 17, 2018.
Note
: All other formats like
full
,
short
,
long
and
iso
work the same with dates that are derived from entity extraction.
${dateVar.value.date?long?number_to_date?string['dd.MM.yyyy']}
Prints the date in custom format. For example: 17.01.2018, 18:58.
${dateVar.value.date?long?number_to_date?string['yyyy']}
Prints the date derived from the entity in a custom format.
Example: Extracting Dates from User Input
The following examples are from a skill that manages appointments. When a user asks
it,
Can you arrange a meeting with Mr. Higgs a day later than tomorrow?
, the bot uses a
complex entity,
DATE
, to extract
tomorrow
from the request. It outputs
the requested date using
${(theDate.value.date?long +
86400000)?number_to_date}
to add 24 hours (or 86,400,000 milliseconds) to
"tomorrow".
FreeMarker-Accessible System Variables
Oracle Digital Assistant has a set of system variables through which you can retrieve useful information in your dialog flows through FreeMarker expressions.
In their simplest forms, these expressions take the following form:
${system.variableName}
Some variables can hold objects with nested properties that can be accessed using dot notation after the variable name in the following form.
${system.variableName.propertyName}
In addition, the nested property values can also be objects with nested properties.
Here are the system variables that are available through FreeMarker expressions.
system.authorizedUsers
A list of all of the users that have been authorized for a given group chat.
system.channelType
The type of channel of the current user session. Allowable values:
facebook
,
androidsdk
,
iossdk
,
websdk
,
slack
,
twilio
,
msteams
,
cortana
,
webhook
, and
test
.
If the session is running in the tester, the value corresponds to
the channel type being simulated.
system.entityToResolve
Object representing the current composite bag item to resolve in the Common
Response component when the variable property of the component is
referring to a composite bag entity.The object has the following
properties:
nextRangeStart
- index number of
the entity's allowable value list that will be navigated to when
tapping the
Show More
button.
updatedEntities
- list of
composite bag items that were updated based on the last user
message.
needShowMoreButton
- Boolean
property that can be used in as an
expression
for the
visible
property to conditionally
render the
Show More
button to navigate
to the next set of entity values.
outOfOrderMatches
- list of bag
items that were populated with a value based on the last user
message when the user was prompted for another bag item.
rangeStartVar
- name of the variable that holds
the current range start of the entity values.
validationErrors
- for the current bag item,
list of error messages caused by an invalid value provided in
the last user message.
allMatches
- list of bag items that
got a new or updated values based on the last user message.
resolvingField
- name of current
bag item the user is prompted for.
userInput
- the last user
message.
skippedItems
- list of bag items
where the maximum number of prompts for a value is
exceeded.
disambiguationValues
- list of
allowed entity values that have matches in the last user
message.
enumValues
- list of entity
allowed values for the current bag item.
See
The system.entityToResolve Variable
for examples of how to use
system.entityToResolve
.
system.errorAction
Error message text of an unexpected error thrown during execution of the state.
system.errorState
Name of the state that has thrown an unexpected error during execution.
system.expectedState
When user scrolls up the message history, and taps on an older "out-of-order" button this variable is populated with the name of the state that was expected to be executed, but never got executed because the user decided to tap on this "out-of-order" button. See also
Configure the Dialog Flow for Unexpected Actions
.
system.intent.name
Use to refer to the intent that a user has selected after
being asked to disambiguate.
(
${iResult.value.intentMatches.summary[0].intent}
always returns the intent with the top score, which might not be the
intent that the user selects when disambiguating.)
system.invalidUserInput
Boolean value set to
true
when the user input cannot be matched to the requested variable type.
system.message
Last message received by Oracle Digital Assistant. This variable has the following properties:
channelConversation
- the channel conversation object, which has the following properties:
botId
channelType
- When running in the tester, this will return
test
. If you want to get the name of the channel that is being simulated in the tester, use
system.channelType
instead.
channelName
channelCategory
- Returns the type of channel. For DA as Agent
channels, this returns
botAsAgent
.
groupConversation
- Returns
true
if the conversation is a group chat.
userId
- Returns the user ID. For DA as Agent channels, this will
return the engagement ID.
sessionId
- Returns the session ID. For DA as Agent channels, this
will return the engagement ID.
sessionExpiryDuration
messagePayload
- the actual message sent by the user. The properties you can access depend on the type of message:
Text message: the
text
property returning the actual message entered by the user
Postback message: the properties of the postback object, typically
action
and
variables
when using the Common
Response component. For example, when the user taps a
button that sets the variable
pizzaSize
, this value can be retrieved
using following
expression:
${system.message.messagePayload.variables.pizzaSize}
Location message: the
location
property, which holds a location object with following properties:
title
latitude
longitude
system.selectedCardIndex
This variable holds the index of the selected card when using the facility to optimize card rendering for text-only channels like Twilio. This optimization allows the user to select a card in a two step process: first a list of cards is presented, then the user can enter the number of the cards he wants to select. The corresponding index number of this card is stored in this variable.
The system variables in the above table are the only ones that you can use in
FreeMarker expressions. Other system variables are not public and their use is
subject to change, which means your skills can't rely on them.
For example, the
system.routingFromSkill
,
system.routingToSkill
,
system.routingFromIntent
, and
system.routingToIntent
variables are only available for
specific digital assistant settings. See
System Variables for Digital Assistants
.