Task 1: Build a DA-as-Agent Digital Assistant
Build the skills that you need for the DA-as-agent digital assistant, optionally publish them, and then add them to the digital assistant that will act as a digital-assistant agent. Typically, you'll need just one skill, but you can have more.
You can build your digital assistant from scratch, or you can clone the CX Service template as described in the Oracle Digital Assistant CXS Overview Power Point slides.
When you build your digital assistant, consider these scenarios:
-
The customer isn't sure what they can do with an automated assistant: Create a help skill or add a help state to an existing skill. Then, do one of the following:
-
Single-Skill Digital Assistant: In the skill, go to Settings > Digital Assistant and set Help State to the name of the skill's help state. Note that the automated agent conversation sample sets this to welcome.
-
Multiple-Skill Digital Assistant: In the digital assistant, go to Settings > Configurations and set these conversation parameters to point to the appropriate state in the help skill.
-
Digital Assistant Custom Help Skill
-
Digital Assistant Custom Help State
-
-
-
The customer wants something that a digital assistant isn't set up to handle: Do one of the following:
-
Single-Skill Digital Assistant: In the skill's
System.Intent
state, add anunresolvedIntent
action that handles requests that are out of scope for the skill.Also add an intent and action that transfers to a
System.AgentTransfer
state. If you are using a clone of an automated agent conversation skill, then the dialog flow does this already. -
Multiple-Skill Digital Assistant: In the digital assistant, go to Settings > Configurations and set these conversation parameters to point to the state that starts the dialog flow for handling out-of-scope requests.
-
Digital Assistant Custom UnresolvedIntent Skill
-
Digital Assistant Custom UnresolvedIntent State
-
-
Build the Skill
To build a DA-as-Agent skill can clone the DA-as-Agent Template or one from scratch, as described here. Then you'll configure the skill, add intents and entities as required, and make any necessary changes to the dialog flow. Last, you'll train and, optionally, publish the skill.
Create and Configure the Skill
Here are the steps for creating a skill for use in a DA-as-Agent digital assistant.
Add Intents and Entities
Add the necessary intents and entities for your skill.
Tip:
If you would like your digital-assistant agent to be able to handle "small talk", then pull the Digital Assistant Template from the skill store, and take a look at its skill named Common Skill Template. It has intents and a dialog flow that handles questions like "Are you a bot?", "Can I ask you out?", "Do you know the time?", "Are you into football?", and "Do you tell jokes".If your DA-as-agent skill is a basic question-and-answer skill, then you can use
answer intents to handle the questions and answers. For Oracle B2C
Service, you also can use System.KnowledgeSearch
components to address
questions and answers. For knowledge search examples, see Use the System.KnowledgeSearch Component. Note that you must create a knowledge search integration to use this component.
After you create your intents click Train. You can't test or publish a skill if it hasn't been trained.
To test your intents, click Test Utterances, and then enter test utterances in the Quick Test section to verify that the model is resolving to the desired intents. You should enter utterances from the intents as well as utterances that are not in any intents. The dialog shows the confidence level for each matched intent. If the resolution isn't what you intended, consider adding the utterance to the desired intent or revising the intent that was incorrectly matched. You also can click Go to Test Cases to create or import batch tests. To learn more see Intent Training and Testing.
Access Contact and Chat Launch Page Information
When users are signed into the service or have provided their first name,
last name, and email address on the chat launch page, then the
profile.firstName
, profile.lastName
, and
profile.email
variables will contain the user information. For Oracle B2C
Service, the profile.locale
variable is set to the interface language code.
For Oracle Fusion
Service the locale is based on language that the user selected on the chat launch site, or, if none
was selected, the browser's locale.
In addition, the profile.contactInfo
variable contains some chat-request info, such as the customer's question (subject) and the product ID and category ID, if applicable. Also, if the chat launch page contains any custom fields, then the values that the customer enters into those fields are passed to the digital assistant in the profile.contactInfo.customFields
array. To learn about customizing the fields that are on the Oracle B2C
Service chat launch page, see Overview of Chat on the Customer Portal in Using Oracle B2C
Service.
The profile.contactInfo
variable is available only for instances of Oracle Digital Assistant that were provisioned on Oracle Cloud Infrastructure (sometimes referred to as the Generation 2 cloud infrastructure).
Here's the structure of the profile.contactInfo
for Oracle B2C
Service:
{
"question": <string>,
"productId": <number>,
"orgId": <number>,
"categoryId": <number>,
"browser": <string>,
"ipAddress": <string>,
"userAgent": <string>,
"sessionId": <string>,
"operatingSystem": <string>,
"customFields": [
{
"name": <string-name-of-custom-field>,
"id": <ID-of-custom-field>,
"value": <field-value>
},
...
]
}
Here's some example data:
{
"question":"Do you deliver",
"productId":7,
"customFields":[
{
"name":"ODA Text",
"id":44,
"value":"N/A"
},
{
"name":"ODA YN",
"id":45,
"value":"1"
},
{
"name":"ODA Nbr",
"id":46,
"value":"1"
},
{
"name":"ODA Date",
"id":47,
"value":"2020,2,17"
},
{
"name":"ODA Menu",
"id":48,
"value":"12"
},
{
"name":"ODA DateTime",
"id":49,
"value":"2004,11,18,17,18"
}
],
"browser":"FireFox 68.0",
"ipAddress":"123.45.67.89",
"userAgent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0",
"sessionId":"HI6unnBo",
"operatingSystem":"Windows 10",
"orgId":-1,
"categoryId":-1
}
Here's an example of extracting and displaying contact info:
context:
variables:
contactInfo: "map"
...
setContactInfo:
component: "System.SetVariable"
properties:
variable: "contactInfo"
value: "${profile.contactInfo.value}"
transitions:
next: "echoQuestion"
echoQuestion:
component: "System.Output"
properties:
text: "Your question was: ${contactInfo.value.question}"
keepTurn: true
transitions:
next: "showText"
showText:
component: "System.Output"
properties:
text: "You entered: <#list contactInfo.value.customFields as p><#if p.name=='VIP Status'>${p.value}</#if></#list>"
keepTurn: true
transitions:
return: done
Here's the structure of the profile.contactInfo
for Oracle Fusion
Service:
{
"question": <string>,
"productId": <number>,
"orgId": <number>,
"categoryId": <number>,
"browser": <string>,
"ipAddress": <string>,
"userAgent": <string>,
"sessionId": <string>,
"operatingSystem": <string>,
"customFields": [
{
"name": "<custom-field-name>",
"type": "<data-type>",
"value": "<field-value>",
"menuItemLabel": "<label-string>"
},
...
]
}
Enable Transfer to a Human Agent
If you want the skill to transfer the chat session to a human agent, such as when the user wants something that the skill isn't built to handle, add a state that uses the System.AgentTransfer
component. Then add some dialog flow to transition to that state as necessary.
Here's an example of a dialog flow that transfers to an agent when the customer asks to speak to an agent. Note that this example just illustrates how to use the System.AgentTransfer
component. If you'd like to get the wait time before attempting the transfer, see Get Agent Availability and Wait Time. If you would like the skill to track how many times an agent was needed and why, see Creating Dimensions that Track Skill Usage.
metadata:
platformVersion: "1.1"
main: true
name: "AutomatedAgentConversation"
context:
variables:
iResult: "nlpresult"
someVariable: "string"
states:
#
# Note that even though Answer intents don't have actions, you must have a System.Intent state even if
# you have no other types of intents. Answer intents output the answer and restart the conversation.
#
intent:
component: "System.Intent"
properties:
variable: "iResult"
transitions:
actions:
...
system.Unsatisfactory Response: "transferToAgent"
system.Request Agent: "transferToAgent"
...
#
# This state tries to transfer the user to another agent when the user explicitly requests for it.
#
transferToAgent:
component: "System.AgentTransfer"
properties:
maxWaitSeconds: "300"
waitingMessage: "I'm transferring you to a human agent. Hold tight."
rejectedMessage: "I wasn't able to transfer you to a human agent. Please try again later."
errorMessage: "We're unable to transfer you to a human agent because there was a system error."
transitions:
actions:
accepted: "reset"
rejected: "handleRejected"
error: "offerMoreHelp"
next: "reset"
#
# This state is called when an agent transfer is rejected.
# It lets the customer know they can ask for something else.
#
handleRejected:
component: "System.Output"
properties:
text: "Meanwhile, let me know if there's anything else I can help you with."
transitions:
return: "handleRejected"
#
# This state is called when an agent transfer encounters a system error.
# It lets the customer know they can ask for something else.
#
offerMoreHelp:
component: "System.Output"
properties:
text: >
You can ask me another question if there's something
else that I can help you with.
transitions:
return: "offerMoreHelp"
#
# This state ends the conversation with a return transition for insights purposes,
# after the user has been transferred to another agent.
#
reset:
component: "System.SetVariable"
properties:
variable: "someVariable"
value: "x"
transitions:
return: "reset"
Note:
Be careful to not transition to the agent transfer state when there is a developer-introduced bug or an issue with theSystem.AgentTransfer
component. Otherwise the flow might end up in an endless loop. For example, don't have the DefaultTransition
error
transition go to the System.AgentTransfer
state.
See System.AgentTransfer for details about the properties and actions.
Pass Information to the Service
When you transfer a conversation from a digital assistant to a live agent, you'll most likely want to pass some information to the service, such as values for an escalation rule. You use the customProperties
object to pass this information.
Here's the structure for Oracle B2C Service:
customProperties:
- name:
value:
type:
The type
property is required for custom fields, otherwise, it's optional.
For Oracle B2C
Service, the name
can be FIRST_NAME
, LAST_NAME
,
EMAIL
, QUESTION
, PRODUCT_ID
,
CATEGORY_ID
, CONTACT_ID
, INCIDENT_ID
, and
any custom field of type Incident that has Chat Display enabled in the
Visibility settings.
For custom fields, use the field's column name (lower case) preceded by c$
. The type can be BOOLEAN
, DATE
, DATETIME
, INTEGER
, LONG
, STRING
, and DECIMAL
. The default is STRING
. For DATE
and DATETIME
, use the format yyyy-MM-dd'T'HH:mm:ssXXX
. For BOOLEAN
, use 1 for true, and 0 for false.
Here's the structure for Oracle Fusion Service:
customProperties:
- name:
value:
For Oracle Fusion
Service, the name
can be FIRST_NAME
, LAST_NAME
,
EMAIL
, QUESTION
, PRODUCT_ID
,
CATEGORY_ID
, CONTACT_ID
, INCIDENT_ID
, and
any field from an Oracle
Fusion Cloud Applications (Fusion) object. Note that when you add a custom field to a Oracle Fusion
Service object using Application Composer, the _c
suffix is added to the name
automatically.
Here's an example customProperties
setting for Oracle Fusion
Service:
doTransfer:
component: "System.AgentTransfer"
properties:
maxWaitSeconds: "300"
allowTransferIf: "agentSessionsAreAvailable"
# Example of passing a custom property to Oracle Fusion
Service
customProperties:
# This is a checkbox custom field in the Universal Work Object.
# Checkboxes take the value of Y (selected) or N (unselected).
- name: "TriagedByODA_c"
value: "Y"
acceptedMessage: "The conversation has been transferred to a live agent."
waitingMessage: "I'm transferring you to a human. Hold tight"
rejectedMessage: "Looks like no one is available. Please try later"
errorMessage: "We're unable to transfer you to a live agent because there was a system error."
transitions:
actions:
accepted: "reset"
rejected: "handleRejected"
error: "offerMoreHelp"
next: "reset"
Tip:
For Oracle Fusion Service, the rules evaluation stops at the first rule where all conditions are met. When you configure your rules, ensure that the transferred conversation isn't routed back to the digital assistant agent. In thedoTransfer
example, the custom property
TriagedByODA_c
is set to Y
, and the rules can use this
custom property to ensure that when it is set to Y
, the conversation isn't
routed to the digital assistant agent. (For Oracle B2C
Service, the Transition State and stop configuration determines the
routing.)
To learn about Oracle B2C Service custom fields, see Overview of Custom Fields in Using Oracle B2C Service. For information about Oracle Fusion Service custom property fields, see "Fields" in Configuring Applications Using Application Composer.
Configure When to Attempt Agent Transfer
The System.AgentTransfer
component has two properties that let you configure when to attempt transferring to an agent – maxEngagementsInQueue
and allowTransferIf
.
The maxEngagementsInQueue
property lets you set the maximum number allowed for engagements waiting in the destination queue. When the chat request is sent, the service responds with the current number of engagements waiting in the queue. If this value exceeds maxEngagementsInQueue
, then the rejected
action occurs. If you don't include this property, then there's no engagement limit.
You use the allowTransferIf
property to specify when to transfer based on available agents. The options are:
agentsAreRequestingNewEngagements
: (default) For Oracle B2C Service agents who must pull chats (request new engagements), this is the most restrictive set of conditions, and the user doesn't have to wait too long before they speak to an agent. The skill attempts to transfer the conversation only if there are agents who have requested new engagements. In all other cases, this option has the same behavior asagentSessionsAreAvailable
.agentSessionsAreAvailable
: The skill attempts to transfer the conversation if any of the available agents have not reached the maximum number of chats that they are allowed to have at one time. The user may have to wait if the agents are involved in long-running conversations or are doing some post-chat follow-up.agentsAreAvailable
: The skill attempts to transfer the conversation if there are any agents online regardless of whether they have reached their maximum number of chats or are requesting new engagements. With this option, the users may have long waits.
If the specified conditions aren't met, then the rejected
action occurs.
Get Agent Availability and Wait Time
If all available agents are busy when a user wants to speak to an agent, then it's possible that the user might have a long wait. Rather than simply transferring the conversation and leaving the user stuck for an unknown amount of time, you can use the System.AgentTransferCondition
component to find out the estimated wait time, display that time, and give the user the opportunity to cancel their request for transfer.
You use the component's properties to specify the transfer conditions and the name of the context map variable to put the status information in. The component returns an action that indicates whether the conditions were met. See System.AgentTransferCondition for details about the status information and the actions.
Here's an example of a dialog flow that invokes the component, displays the wait time, and gives the user the opportunity to cancel their transfer request.
The askIfWillWait
state uses a resource bundle entry to form the wait time message so that the message makes sense whether the time is more or less than a minute and whether a number is 0, one or more.
There are some experts online. But it might take {minutes, plural,
=-1 {}
=0 {}
=1 {1 minute and }
other {# minutes and }
}{seconds, plural,
=-1 {a while}
=0 {{minutes, plural,
=0 {a very short wait time}
other {0 seconds}
}}
=1 {1 second}
other {# seconds}
} for one to join. Are you willing to wait?
Note that this example uses System.SetCustomMetrics to track if agents were available, and, if so, how many users chose to wait and how many canceled the transfer request.
############################
# Agent Transfer
############################
# See if there are any agents available
evaluateAgentTransferCondition:
component: "System.AgentTransferCondition"
properties:
maxWaitSeconds: 300
maxEngagementsInQueue: 20
allowTransferIf: "agentsAreAvailable"
agentStatusVariable: "agentStatus"
transitions:
actions:
conditionsMet: "askIfWillWait"
conditionsNotMet: "setInsightsCustomMetricsConditionsNotMet"
error: "handleTransferError"
next: "done"
# Measure when agents aren't available
setInsightsCustomMetricsConditionsNotMet:
component: "System.SetCustomMetrics"
properties:
dimensions:
- name: "Agent Transfer Choice"
value: "No agents available for new chats"
transitions:
next: "handleRejected"
askIfWillWait:
component: "System.CommonResponse"
properties:
processUserMessage: true
metadata:
responseItems:
- type: "text"
text: "${rb('promptTextForTransferDecision','minutes,seconds',agentStatus.value.expectedWaitMinutes,agentStatus.value.expectedWaitSeconds)}"
separateBubbles: true
actions:
- label: "Yes, I'll wait"
type: "postback"
keyword: "yes"
payload:
action: "yes"
name: "Yes"
- label: "No, nevermind"
keyword: "no"
type: "postback"
payload:
action: "no"
name: "No"
transitions:
actions:
yes: "setInsightsCustomMetricsAgentTransferInitiated"
no: "setInsightsCustomMetricsAgentTransferCancelled"
textReceived: "intent"
next: "handleCancelled"
# Measure when user chooses to wait for transfer
setInsightsCustomMetricsAgentTransferInitiated:
component: "System.SetCustomMetrics"
properties:
dimensions:
- name: "Agent Transfer Choice"
value: "User chose to wait"
transitions:
next: "transferToAgent"
# Measure when user chooses to not wait for transfer
setInsightsCustomMetricsAgentTransferCancelled:
component: "System.SetCustomMetrics"
properties:
dimensions:
- name: "Agent Transfer Choice"
value: "User didn't want to wait"
transitions:
next: "handleCancelled"
# Perform the actual transfer
#
# The maxWaitSeconds, maxEngagementsInQueue, allowTransferIf,
# and customProperties, if any, should match those used for
# System.AgentTransferCondition
transferToAgent:
component: "System.AgentTransfer"
properties:
maxWaitSeconds: 300
maxEngagementsInQueue: 20
allowTransferIf: "agentsAreAvailable"
transitions:
actions:
accepted: "done"
rejected: "handleRejected"
error: "handleTransferError"
next: "handleTransferError"
############################
# All done
############################
done:
component: "System.Output"
properties:
text: "Let me know if you need help on anything else."
transitions:
return: "done"
handleRejected:
component: "System.CommonResponse"
properties:
keepTurn: true
metadata:
responseItems:
- type: "text"
text: >
Unfortunately, none of my colleagues are currently available to assist with this.
Still, we’d love to see this through for you.
Please feel free to reach us through email@example.com.
transitions:
next: "done"
handleCancelled:
component: "System.CommonResponse"
properties:
keepTurn: true
metadata:
responseItems:
- type: "text"
text: "OK. Maybe some other time. Please feel free to reach us through email@example.com."
transitions:
next: "done"
handleTransferError:
component: "System.CommonResponse"
properties:
keepTurn: true
metadata:
responseItems:
- type: "text"
text: "Unfortunately, we can't transfer you at this time. Please try again later."
transitions:
next: "done"
############################
# Global error handler
############################
globalErrorHandler:
component: "System.Output"
properties:
text: "Sorry, we were unable to do the action that you requested."
transitions:
next: "done"
Create an Incident Report
You can create an incident report (or service request) for Oracle B2C Service or Oracle Fusion Service from any skill.
To create an incident report from your skill:
-
Go to Settings > Additional Services > Customer Service Integration and create an integration with the needed service.
You only need to do this once per instance.
-
Add the incident creation component to your flow. For the Visual Flow Designer, see Incident Creation. For YAML, see System.IncidentCreation.
If you have created a Oracle Fusion Service integration and have selected Allow only signed-in users to create service request as the authentication type, you also need to do the following:
- Set the Incident Creation component's Requires
Authentication setting to
True
. - Add an OAuth Account Link component to the dialog flow to handle user authentication. For the Visual Flow Designer, see OAuth Account Link. For YAML, see System.OAuthAccountLink.
- Set the Incident Creation component's Requires
Authentication setting to
Tip:
After creating and configuring the Incident Creation component, click Validate in the page's banner to validate the skill. Among other things, this validation will ensure that you have entered a service name in the Incident Creation component that matches the name you have given to the customer service integration that you created.How the UI Components Display in the Service Chat
The default chat that's accessed through the service's customer portal is limited to text and images. For example, instead of cards and buttons, it just displays text, and the user has to type the choice or button label instead of just clicking on it.
To display more than just text for the UI components that are in the dialog flow, you can use one of the following options:
- Web Chat for Service (WCFS). This feature enables you to customize the chat widget by using features present in the SDK for Oracle Web user channels. To configure WCFS, see the Web Chat for Service (WCFS) section of Administering Oracle Engagement Engine.
- Oracle Inlay Toolkit Inlays. To learn about Inlays, see the Oracle Inlay Toolkit documentation.
If your chat client is the default chat that's accessed through the service's
customer portal, then ensure that you set the Enable Auto Numbering on Postback
Actions to true
on the Settings >
Configuration page for the digital assistant so that the user can respond to the
UI component by typing in a number instead of the exact text. If you don't set it to
true
, then use keywords for response items to minimize what the user has to
enter. In this example, autonumbering is set to true
whenever the client is
Twilio or Oracle B2C
Service chat.
${(system.channelType=='twilio'||system.channelType=='osvc' )?then('true','false')}
Tip:
When you use the digital assistant preview or the skill preview, if you set the channel to Twilio SMS, it will render the conversation similar to the default chat.Here's a comparison of how the UI components are displayed for the different clients.
Component/Property | Web Chat for Service | Inlay | Default Chat |
---|---|---|---|
HTML tags | Supported | Supported | Supported |
Postback actions | Supported | Displayed as clickable buttons. The share action is
ignored.
|
Displayed as non-clickable text. The location ,
call and share actions are ignored.
|
System.CommonResponse |
Supported | Supported, except that users can't upload attachments. | Supported, but the items and action labels always display vertically.
Choices and buttons are displayed as non-clickable text.
For a response
item of type |
System.List |
Supported | Supported. | Supported, but the options display as non-clickable text and the
footerText value doesn't display.
|
This table illustrates how different component configurations display in the default chat and Inlays.
Example Component Configuration | Inlay | Default Chat |
---|---|---|
|
Description of the illustration rich-text-list-inlay.png |
Description of the illustration rich-text-list-default.png |
|
Description of the illustration rich-text-card-inlay.png |
Description of the illustration rich-text-card-default.png |
|
Description of the illustration rich-text-actions-inlay.png |
Description of the illustration rich-text-actions-default.png Note that you can wrap the payload URLs in HTML tags. For example |
Configure the DA-as-Agent Digital Assistant
If you aren't using the CX Service template, follow these steps to create a digital assistant that acts as an automated Oracle B2C Service or Oracle Fusion Service agent:
-
Click to open the side menu, and then click Development > Digital Assistants.
-
Click New Digital Assistant.
-
Complete the dialog and click Create.
-
When the digital assistant opens, it displays the Skills page.
-
Click + Add Skill, select the skill that you built for this digital assistant, and then click Close.
-
Click Settings , and then click General.
-
Switch Enable Insights to On.
-
Set the digital assistant's Training Model to Trainer Tm.
-
(Optional) Make these changes to your digital assistant in the Settings > Configurations tab.
-
Flow Information in Selection:
${system.routingToIntent}
-
Nothing to Exit Prompt:
Goodbye. Let me know if there's anything else I can help you with.
-
-
(Optional) If the digital assistant has more than one skill, then you can customize the digital-assistant behavior when user utterances match the digital assistant's
help
andunresolvedIntent
intents. Go to the Configuration tab on the Settings page, and then specify the custom skill and state to navigate to for help or unresolvedIntent (or both). See Specify States for a Digital Assistant's System Intents. - Click Train to train the digital assistant.
-
(Optional) To test the digital assistant, click Preview .
Note that when the dialog flow transitions to a state that transfers from a skill to an agent, Preview stops responding. Click Reset when that happens.
After you put your digital assistant into production, you'll want to periodically run Retrainer reports to see if you need to improve intent resolution for any intents. See Apply the Retrainer.