Integrate a Skill with a Live Agent

Here are the high-level steps for integrating a skill with an existing Oracle B2C Service interface. The next topics describe each step in more detail.

  1. Create an Agent Integration channel: The channel allows the skill to communicate with Oracle B2C Service.

  2. Enable Insights: In the skill's Settings Settings icon page, switch the Enable Insights option to On to enable the framework to pass the conversation history to the live agent.

  3. Configure the Agent-Transfer Dialog Flow: Add the System.AgentInitiation and System.AgentConversation components to the dialog flow.

    • The System.AgentInitiation component initiates the handoff to Oracle B2C Service.
    • The System.AgentConversation handles the interaction between the skill and the agent.

    You can find templates for these components from the Flow Flow icon page by clicking + Add Component, and then clicking Transfer from skill to Human Agent.


    An image of the Agent initiation component in the Add Component dialog.

Create an Agent Integration Channel

You use an Agent Integration channel to configure the connections between skills and the live-agent system.

Before you begin, obtain the credentials of an Oracle B2C Service staff member who's associated with a profile that has the following permissions:

  • Access to the desired Oracle B2C Service interface
  • Account Authentication and Session Authentication for Public SOAP API
  • Account Authentication for Agent Browser User Interface

Contact an Oracle B2C Service administrator if you don't have this information.

You also need to confirm that your Oracle B2C Service Account Manager has enabled the Chat Custom Interface API and the Chat Third-Party Queue Integration API.

  1. Click Icon to open the side menu to open the side menu, select Development, and then select Channels.

  2. Click Agent Integrations, and then click + Add Agent Integration.
  3. Enter a name and an optional description for this channel.

    When you use the System.AgentInitiation and System.AgentConversation components in your dialog flow to enable the transition to, and from, Oracle B2C Service, you must use this name for their agentChannel properties.

  4. Choose Service Cloud from the Integration Type menu.

  5. Enter the user name and password for an Oracle B2C Service staff member who has the necessary profile permissions.

  6. Define the domain name and host name prefix.

    If you have access to Oracle B2C Service, you can derive these values from the URL that you use to launch the Agent Browser User Interface. For example, if the URL is sitename.exampledomain.com, then the host name prefix is sitename and the domain name is exampledomain.com.

    If the channel is connecting to Oracle B2C Service version 19A or later, and you have multiple interfaces, then you must include the interface ID in the host (site) name . For example, for the interface that has an ID of 2, you would use something like sitename-2.exampledomain.com.

  7. (Optional) Increase or decrease Session Expiration (minutes). This value is used to determine when the System.AgentConversation component should trigger the agentLeft and expired actions.

    If the Oracle B2C Service CS_IDLE_TIMEOUT is equal to or more than the Session Expiration value, then expired is triggered when neither the end-user nor the agent sends a message within the session expiration limit. If CS_IDLE_TIMEOUT is less than the Session Expiration value, then Oracle B2C Service terminates the chat and the agentLeft action is triggered instead.

    If your instance is provisioned on the Oracle Cloud Platform (as all version 19.4.1 instances are), then the service uses 15 minutes instead of the Session Expiration setting.

    By default, CS_IDLE_TIMEOUT is 10 minutes. To view or change your Oracle B2C Service instance's settings, open the Oracle B2C Service desktop Service Console, click Navigation, click the first Configuration item in the menu, and click Configuration Settings. Then search the for CS_IDLE_TIMEOUT, which is in the Chat folder.

  8. Click Create.

  9. To enable the skill to interact with the agent framework, enable the channel by switching Interaction Enabled to On.

Enable Conversation History Transfer

You must turn on logging to enable the live-agent transfer framework to pass the conversation history to a live agent. When you enable this option, the agent's chat console displays the customer's conversation that occurred before the handoff to the agent.

  1. In the skill's left navbar, click Settings Settings icon.
  2. In the General tab, set the Enable Insights switch to On.

    If your instance is provisioned on Oracle Cloud Platform (as all version 19.4.1 instances are), then the switch's name is Skill Conversation.

Note

The conversation history is truncated after 4000 characters.

Configure the Agent Transfer Dialog Flow

There are several ways that your dialog flow can direct customers to a live agent. For example:

  • You can provide a specific option for talking with an agent.

  • You can execute a path that gathers necessary customer information before handing someone off to an agent.

  • You can create a handler for unresolved intents that tranfers the customer to an agent.

  • You can create an agent-transfer intent.

In this example, the GetAgent intent is trained to understand distress calls like help me please!

intent:
    component: "System.Intent"
    properties:
      variable: "iResult"
    transitions:
      actions:
        OrderPizza: "resolvesize"
        CancelPizza: "cancelorder"
        GetAgent: "agentInitiation"
        unresolvedIntent: "agentInitiation"

Here are the basic steps for configuring the dialog flow:

  1. Initiate the live-agent transfer.

    1. Add a state for the System.AgentInitiation component.

    2. Set the state's agentChannel property to the name of the Agent Integration channel that you configured for the live-agent system.

    After the Agent Integration channel establishes a connection and Oracle B2C Service sends the chat request to its queue (that is, after it creates a help ticket), the System.AgentInitiation component allows the transition to the next state, which is typically defined for the System.AgentConversation component (agentConversation in the following example).
    
      agentInitiation:
        component: "System.AgentInitiation"
        properties:
          agentChannel: "ServiceCloudIntegration"
          nlpResultVariable: "iResult"
          waitingMessage: "Waiting for an agent..."
          rejectedMessage: "Agents are not available right now."
          resumedMessage: "We're connecting you to an agent..."
          errorMessage: "Oops! We're having system issues. We're sorry, but we can't connect you with an agent right now."
        transitions:
          actions:
            accepted: "agentConversation"
            rejected: "tryAgain"
            error: "tryAgain"
      tryAgain:
        component: "System.Output"
        properties:
          text: "Please try again later."
        transitions:
          return: "tryAgain"

    Tip:

    Customers may repeatedly request a live chat even though their requests have already been queued in the agent's chat console. Add a resumedMessage property to the System.AgentInitiation state to prevent such customers from receiving a misleading Resuming chat with agent message.
  2. Add and configure the System.AgentConversation component. While the dialog engine is in the state defined for this component, the skill passes messages back and forth between the customer and the agent. The skill listens for exit keywords in the customer input, like bye. When the skill detects one of these keywords, the System.AgentConversation component ends the live-chat session and triggers its next transition.

    Here's an example:

      agentConversation:
        component: "System.AgentConversation"
        properties:
          agentChannel: "ServiceCloudIntegration"
          nlpResultVariable: "iResult"
          errorMessage: "Oops, we lost connection with the agent. If you need further help, please call customer support."
          exitKeywords: "bye, exit, take care, goodbye, quit"
          expiryMessage: "Your chat with the agent timed out."
          conclusionMessage: "Your chat with the agent has ended."
          waitMessage: "You are number ${system.message.messagePayload.position} in the queue. Your waiting time is ${(system.message.messagePayload.waitTime>60)?then('${(system.message.messagePayload.waitTime/60)?int} mins','${system.message.messagePayload.waitTime} seconds')}."
        transitions:
          next: "endPrompt"
          actions:
            agentLeft: "endPrompt"
            expired: "endPrompt"
            error: "endPrompt"
      endPrompt:
        component: "System.Output"
        properties:
          text: "Returning you to your bot."
        transitions:
          return: "endPrompt"
    Note

    The errorMessage property and the error action only work with instances of Oracle Digital Assistant that were provisioned on Oracle Cloud Infrastructure (sometimes referred to as the Generation 2 cloud infrastructure).

Enable Agents to Specify the Transition Action

If you want to enable the agent to specify which state to transition to after the live-chat session ends, use the agentActions property in the System.AgentInitiation component to list the supported actions that the agent can send, and then use the System.AgentConversation component to map the actions to states.

When the agent accepts the chat request, the chat console displays the supported actions, each of which is preceded by a slash (these are referred to as slash actions).

Agent console displaying list of supported actions.

If the agent sends any of the slash actions, the action is sent to the live-agent transfer framework, and the skill terminates the live chat. If the System.AgentConversation has a transition for that action, the flow transitions to the named state. Note that the conclusionMessage isn't output if the agent sends a slash action.

Chat console showing that the agent has sent /Order and the chat has terminated.
  1. Add an agentActions property to the System.AgentInitiation component, and list the supported actions.

    You can define the agentActions list elements in several ways:

    • As a list of maps, where each map must contain an action property, a label property, and optionally, a description property. For example:
            - action: "action1"
              label: "label1"
              description: "description1"
            - action: "action2" 
              label: "label2"
              description: "description2"
    • As a JSON array, where each object in the array must contain an action property, a label property, and optionally, a description property. For example:
            [
            {action: "action1",
            label: "label1",
            description: "description1"},
            {action: "action2",
            label: "label2",
            description: "description2"}      
            ]
    • As a comma-delimited string of action values. The label and description are the same as the action value. For example:
      "action1, action2"
  2. (Optional) Add the agentActionsMessage property to specify a message for the live chat console to display before it lists the supported actions. For example:
      agentInitiation:
        component: "System.AgentInitiation"
        properties:
          agentChannel: "ServiceCloudIntegration"
          nlpResultVariable: "iResult"
          waitingMessage: "Let me connect you with someone who can further assist you."
          rejectedMessage: "Sorry, but no one's available now."
          resumedMessage: "Please wait, someone will be with you shortly."
          errorMessage: "Oops! We're having system issues. We're sorry, but we can't connect you with an agent right now."
          agentActionsMessage: "\nYou can terminate when done or send one of these actions.\n"
          agentActions: [{
            action: "Order",
            label: "Order",
            description: "Initiate dialog in the bot to order a pizza."},
            {action: "Cancel",
            label: "Cancel",
            description: "Initiate dialog in the bot to cancel an order."}]     
        transitions:
          actions:
            accepted: "agentConversation"
            rejected: "initiationRejected"
            error: "tryAgain"
      initiationRejected:
        component: "System.Output"
        properties:
          text: "Perhaps it's outside their working hours or it's a holiday."
        transitions:
          return: "initiationRejected"
      tryAgain:
        component: "System.Output"
        properties:
          text: "Please try again later."
        transitions:
          return: "tryAgain"
    If you don't set this property, then the default message is Here are the available actions that you can send to transfer the conversation back to the bot. Prepend the action with a forward slash (for example, /actionName).
  3. Add a next transition for when the user terminates the conversation by using an exit keyword, and then add these transition actions:
    • An action for each supported action that's listed in the agentActions property in the System.AgentConversation component.
    • An agentLeft action for when the agent terminates the live chat without using a slash action or the session times out. See System.AgentConversation Transitions.
    • An expired action for when a session expires. See System.AgentConversation Transitions.
    • An error action for when the channel connection fails. See System.AgentConversation Transitions. This action only works with instances of Oracle Digital Assistant that were provisioned on Oracle Cloud Infrastructure (sometimes referred to as the Generation 2 cloud infrastructure).
      agentConversation:
        component: "System.AgentConversation"
        properties:
          agentChannel: "ServiceCloudIntegration"
          nlpResultVariable: "iResult"
          exitKeywords: "bye, exit, take care, goodbye, quit"
          expiryMessage: "Your chat with the agent timed out."
          conclusionMessage: "Your chat with the agent has ended."
          waitMessage: "You are number ${system.message.messagePayload.position} in the queue. Your waiting time is ${(system.message.messagePayload.waitTime>60)?then('${(system.message.messagePayload.waitTime/60)?int} mins','${system.message.messagePayload.waitTime} seconds')}."
        transitions:
          next: "endPrompt"
          actions:
            agentLeft: "endPrompt"
            expired: "endPrompt"
            error: "handleConversationError"
            Order: "resolvesize"
            Cancel: "cancelorder"
      endPrompt:
        component: "System.Output"
        properties:
          text: "Returning you to your bot."
        transitions:
          return: "endPrompt"
    Note

    The error action only works with instances of Oracle Digital Assistant that were provisioned on Oracle Cloud Infrastructure (sometimes referred to as the Generation 2 cloud infrastructure).

Override Queue Position and Wait Time Message

By default, when a chat request is submitted, the service returns a message about the queue position and wait time, which the skill outputs. For example, the message might be:

You are in position {0} in our queue. Expected wait time is {1} minute(s) {2} second(s)
You can use the System.AgentConversation component's waitMessage property to define your own custom message. As illustrated by the following snippet, you can create a message that returns the queue and wait time status using the system.message.messagePayload.position and system.messagePayload.waitTime properties, respectively:
"You are at number ${system.message.messagePayload.position} in the queue. Your wait time is ${system.message.messagePayload.waitTime}."
You can tailor the message content by combining these properties with built-in Apache FreeMarker operations, such as the then operation in the following snippet. Here, it allows the skill to output content that's specific to either minutes or seconds. For wait times of 60 seconds or longer (waitTime>60), the skill outputs You are at number 9 in the queue. Your wait time is 1 mins. Otherwise, it outputs You are at number 9 in the queue. Your wait time is 55 seconds.
    waitMessage: "You are at number ${system.message.messagePayload.position} in the queue. Your wait time is ${(system.message.messagePayload.waitTime>60)?then('${(system.message.messagePayload.waitTime/60)?int} mins','${system.message.messagePayload.waitTime} seconds')}"

Handle Agent Initiation Rejection and System Errors

Your dialog flow needs to handle errors that might occur during agent initiation. When the System.AgentInitiation component tries to initiate a connection with the live-agent system, it might return an error or rejected action. Also, it might invoke a system error if there is a developer-caused issue.

  • rejected action: This action is triggered when Oracle B2C Service rejects the connection request. Some of the reasons for rejecting a connection request are:

    • No agents are available (requires allowTransferIf and queueId properties)
    • It's outside of the configured operating hours
    • It's a holiday
    • There's a problem with the chat server

    Note that if you don't set allowTransferIf and queueId, the rejected action will not occur when no agents are available, instead, the transfer will remain in a wait condition.

    When Oracle B2C Service rejects a connection request, the skill displays a rejected message, which is Agent rejected by default. Then it transitions to the state that's mapped to the rejected action. You can use the rejectedMessage property in the System.AgentInitiation component to provide a custom message.

    Tip:

    If you have admin access to the Oracle B2C Service desktop Service Console, you can view the operating hours and holidays. From the navigation pane, click Configuration, click Site Configuration, double-click Interfaces, and then click Chat Hours.
  • error action: This action is triggered when there's a problem establishing a connection with Oracle B2C Service. For example, the password in the Agent Integration channel is no longer valid, or there's a problem with the Oracle B2C Service server.

    When this type of error occurs, the skill displays the following message by default, and then transitions to the state that's mapped to the error action.

    Error transferring to agent, the reason is: <reason>, Please contact
    your system administrator to resolve this error.

    You can use the errorMessage property in the System.AgentInitiation component to override the default message.

  • System errors: When the agent integration channel doesn't exist or is disabled, the skill invokes a system error. By default, the skill displays the message "Oops I'm encountering a spot of trouble. Please try again later..." Unfortunately, until a developer fixes the problem, it won't help the bot user to try again. Therefore, you might want your dialog flow to better handle these errors by adding an error transition, which goes to a state that outputs a more helpful customer-facing message. (This is different from the error action). Alternatively, you can modify the default message by going to Settings > Configuration and editing Unexpected Error Prompt. However, this change affects the skill globally.

    Note that when you validate a dialog flow, the validator will let you know if the agent integration channel is missing or disabled, so remember to do that before you test your skill or release it to the public.

    Here are some ways to diagnose a system error:

    • Click Validate in the skill to validate the dialog flow.

    • Run the skill in the Preview. When the error occurs, the error state and message (reason) are displayed in the Conversation tab.

    • In the state to which the error transition routes the flow, output a string that includes the Freemarker template ${system.errorAction}, which prints the error message (reason).

Here's an example of handling system errors and the error and rejected actions.

  agentInitiation:
    component: "System.AgentInitiation"
    properties:
      agentChannel: "B2CServiceIntegration"
      nlpResultVariable: "iResult"
      waitingMessage: "Let me connect you with someone who can further assist you."
      resumedMessage: "Someone will be with you shortly."
      errorMessage: "Oops! We're having system issues and we can't connect you with an agent right now."
      rejectedMessage: "Unfortunately, no one's available right now."     
    transitions:
      actions:
        accepted: "agentConversation"
        rejected: "initiationRejected"
        error: "tryAgain"
      error: "agentInitiationSystemError"
  initiationRejected:
    component: "System.Output"
    properties:
      text: "Perhaps it's outside their working hours or it's a holiday."
    transitions:
      return: "initiationRejected"
  tryAgain:
    component: "System.Output"
    properties:
      text: "Please try again later."
    transitions:
      return: "tryAgain"
  agentInitiationSystemError:
    component: "System.Output"
    properties:
      text: "I seem to be having a connection problem. Can you please email email@example.com to let them know?"
    transitions:
      return: "done"