Compartir a través de


Configurar bots de Azure para ampliar y terminar las conversaciones

Este artículo explica cómo puede programar un bot de Azure para enrutar una conversación a un agente humano en la Plataforma omnicanal para Customer Service. También describe cómo programar el bot para finalizar la conversación.

Importante

  • Los bots pueden recibir conversaciones a agentes solo si se agregan a secuencias de trabajo basadas en inserción.
  • Los agentes de bot no son compatibles con el modo de consulta.

Requisitos previos

  • Debe tener un bot de Azure configurado e integrado con la Plataforma omnicanal para Customer Service. Más información: Integrar un bot de Azure
  • El enrutamiento basado en aptitudes se debe habilitar.

Ampliar una conversación a un agente humano

En Omnicanal para servicio al cliente un bot puede ampliar la conversación actual a un agente humano. El enrutamiento de la conversación depende de la regla de enrutamiento que esté configurada para la secuencia de trabajo.

Cuando la conversación se transfiere del bot a un agente humano, los detalles del cliente y del caso se identifican automáticamente cuando el agente acepta la solicitud de escalamiento. El bot enrutará conversaciones es mediante las variables de contexto de la Plataforma omnicanal para Customer Service que están asociadas a la conversación. El bot puede enviar una lista de variables de contexto y los valores asociados a la Plataforma omnicanal para Customer Service junto con la solicitud de ampliación. El bot también puede establecer elementos de contexto que los modelos de buscador de habilidades pueden usar para identificar nuevas habilidades y agregarlas a la lista de habilidades existentes para la conversación. La Plataforma omnicanal para Customer Service actualizará las variables de contexto a los valores especificados y después volverá a ejecutar el motor de enrutamiento. Esto garantizará que la conversación ampliada se enrutará a la cola adecuada. Para obtener información sobre los elementos de contexto y los nombres de las variables, consulte Vincular el cliente y el caso a las conversaciones cuando el bot escala o finaliza las conversaciones.

Una vez que el agente acepte la solicitud de escalación, la transcripción de la conversación del bot con el cliente visible en el widget de conversación del agente. A continuación, el agente puede continuar la conversación con el cliente.

Nota

El resumen de la conversación no será visible para el cliente.

Finalizar una conversación

Un bot de Azure puede elegir terminar la conversación si determina que se han respondido las consultas del cliente o si el cliente ya no responde. El bot puede enviar una solicitud EndConversation a la Plataforma omnicanal para Customer Service.

Código de ejemplo

Esta sección incluye ejemplos de código que puede usar para configurar un bot de Azure para escalar y finalizar conversaciones.

  1. Implemente una clase de comando para modelar tareas relacionadas con la intensificación y finalización de conversaciones.

El código de ejemplo es el siguiente.

using System.Collections.Generic;
using System.Runtime.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

namespace EchoBot.OmniChannel
{
    /// <summary>
    /// Command types that bot can send to Omnichannel
    /// </summary>
    [JsonConverter(typeof(StringEnumConverter))]
    public enum CommandType
    {
        [EnumMember(Value = "Escalate")]
        Escalate = 0,
        [EnumMember(Value = "EndConversation")]
        EndConversation = 1,
    }
    /// <summary>
    /// Action
    /// </summary>
    [DataContract]
    public class Command
    {
        /// <summary>
        /// Type of action that bot can send to Omnichannel
        /// </summary>
        [DataMember(Name = "type")]
        public CommandType Type { get; set; }

        /// <summary>
        /// Dictionary of Workstream Context variable and value pairs to be sent to Omnichannel for Customer Service
        /// </summary>
        [DataMember(Name = "context")]
        public Dictionary<string, object> Context { get; set; }
    }
}
  1. Implemente una clase de cliente de la Plataforma omnicanal para Customer Service y establezca el contexto del comando.

El código de ejemplo es el siguiente.

using Microsoft.Bot.Schema;
using Newtonsoft.Json;
using System.Collections.Generic;

namespace EchoBot.OmniChannel
{
    /// <summary>
    /// Extension class for middleware implementation management
    /// </summary>
    public static class OmnichannelBotClient
    {
        /// <summary>
        /// Delivery mode of bot's reply activity
        /// </summary>
        private const string DeliveryMode = "deliveryMode";
        /// <summary>
        /// Delivery Mode value bridged
        /// </summary>
        private const string Bridged = "bridged";
        /// <summary>
        /// Custom data tag
        /// </summary>
        private const string Tags = "tags";

        /// <summary>
        /// Adds Omnichannel for Customer Service escalation context to the bot's reply activity.
        /// </summary>
        /// <param name="activity">Bot's reply activity</param>
        /// <param name="contextVars">Omnichannel for Customer Service workstream context variable value pairs</param>
        public static void AddEscalationContext(IActivity activity, Dictionary<string, object> contextVars)
        {
            Command command = new Command
            {
                Type = CommandType.Escalate,
                Context = contextVars
            };

            string serializedString = JsonConvert.SerializeObject(command);
            if (activity.ChannelData != null)
            {
                (activity as IActivity).ChannelData[Tags] = serializedString;
            }
            else
            {
                activity.ChannelData = new Dictionary<string, object>() { { Tags, serializedString } };
            }
        }

        /// <summary>
        /// Adds Omnichannel end conversation context to the bot's reply activity.
        /// </summary>
        /// <param name="activity">Bot's reply activity</param>
        public static void AddEndConversationContext(IActivity activity)
        {
            Command command = new Command
            {
                Type = CommandType.EndConversation,
                Context = new Dictionary<string, object>()
            };

            string serializedString = JsonConvert.SerializeObject(command);
            if (activity.ChannelData != null)
            {
                (activity as IActivity).ChannelData[Tags] = serializedString;
            }
            else
            {
                activity.ChannelData = new Dictionary<string, object>() { { Tags, serializedString } };
            }
        }

        /// <summary>
        /// Sets delivery mode for bot as bridged so that Customer can see bot messages
        /// </summary>
        /// <param name="activity">Bot's reply activity</param>
        public static void BridgeBotMessage(IActivity activity)
        {
            if (activity.ChannelData != null)
            {
                (activity as IActivity).ChannelData[DeliveryMode] = Bridged;
            }
            else
            {
                activity.ChannelData = new Dictionary<string, object>() { { DeliveryMode, Bridged } };
            }
        }
    }
}

  1. En la clase ActivityHandler del bot, llame al método del cliente correspondiente.

    Cambiar los criterios de los comandos Escalate y EndConversation basados en sus requisitos.

    Agregue la declaración de código OmnichannelBotClient.BridgeBotMessage(turnContext.Activity); en el código del bot para enviar mensajes a la Plataforma omnicanal para Customer Service. Este método tiene que llamarse para cada mensaje de la actividad que se envía al cliente.

El código de ejemplo es el siguiente.

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using EchoBot.OmniChannel;
using Microsoft.Bot.Schema;

namespace Microsoft.Bot.Builder.EchoBot
{
    public class EchoBot : ActivityHandler
    {
        /// <summary>
        /// This method is called when the bot receives a message.
        /// </summary>
        /// <param name="turnContext">Turn Context object</param>
        /// <param name="cancellationToken">CancellationToken</param>
        /// <returns></returns>
        protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            if (turnContext.Activity.Type == ActivityTypes.Message)
            {
                // Replace with your own message
                IActivity replyActivity = MessageFactory.Text($"Echo: {turnContext.Activity.Text}");

                // Replace with your own condition for bot escalation
                if (turnContext.Activity.Text.Equals("escalate", StringComparison.InvariantCultureIgnoreCase))
                {
                    Dictionary<string, object> contextVars = new Dictionary<string, object>() { { "Bo-tHandoffTopic", "CreditCard" } };
                    OmnichannelBotClient.AddEscalationContext(replyActivity, contextVars);
                }
                // Replace with your own condition for bot end conversation
                else if (turnContext.Activity.Text.Equals("endconversation", StringComparison.InvariantCultureIgnoreCase))
                {
                    OmnichannelBotClient.AddEndConversationContext(replyActivity);
                }
                // Call method BridgeBotMessage for every response that needs to be delivered to the customer.
                else
                {
                    OmnichannelBotClient.BridgeBotMessage(replyActivity);
                }

                await turnContext.SendActivityAsync(replyActivity, cancellationToken);
            }
        }

        /// <summary>
        /// This method is called when there is a participant added to the chat.
        /// </summary>
        /// <param name="membersAdded">Member being added to the chat</param>
        /// <param name="turnContext">TurnContext</param>
        /// <param name="cancellationToken">CancellationToken</param>
        /// <returns></returns>
        protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurn-Context<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
        {
            foreach (var member in membersAdded)
            {
                if (member.Id != turnContext.Activity.Recipient.Id)
                {
                    //Set the bridge mode for every message that needs to be delivered to customer
                    OmnichannelBotClient.BridgeBotMessage(turnContext.Activity); 
                    await turnContext.SendActivityAsync(MessageFactory.Text($"Welcome to Echo Bot."), cancellationToken);
                }
            }
        }
    }
}

El diccionario contextVars contiene todos los pares de valores de nombres de variables de contexto de Omnicanal para servicio al cliente que desee actualizar como parte de la solicitud de ampliación. Aquí BotHandoffTopic es el nombre de variable de contexto y CreditCard es el valor de variable de contexto. Si hay una cola de agente con la regla BotHandoffTopic es igual a CreditCard, este chat ampliado se enrutará a esa cola.

El nombre de la variable de contexto es del tipo Cadena. El valor de la variable de contexto debe ser de tipo Entero o Cadena y debe pasarse como Diccionario <string, object> durante la escalada. El código de ejemplo es el siguiente.

Dictionary<string, Object> keyValues = new Dictionary<string, object>() {
{ "BotHandoffTopic", "CreditCard" },
{ "IDNumber", 101}
}

El bot también puede enviar un resumen de ampliación que será visible solo para el agente cuando acepte la solicitud de chat ampliado. Para enviar el resumen, establezca el texto de la actividad correctamente en el mensaje de la actividad de ampliación.

Consulte también

Integrar un bot de Azure
Agregar variables de contexto
Azure Bot Service
Conectar un bot a canales
Traer su propio canal de mensajería personalizado: Direct Line Bot
Prácticas recomendadas para la configuración de bots de Azure y Copilot Studio