Configurer les bots Azure pour qu’ils réaffectent les conversations et y mettent fin
Cet article explique comment vous pouvez programmer un bot Azure afin d’acheminer une conversation à destination d’un agent humain dans Omnicanal pour Customer Service. Elle décrit également comment programmer le bot pour mettre fin à la conversation.
Important
- Les bots ne peuvent recevoir de conversations que s’ils sont ajoutés aux flux de travail de type transmission (Push).
- Les agents de bot ne sont pas pris en charge en mode consultation.
Conditions préalables
- Vous devez avoir un bot Azure configuré et intégré à Omnicanal pour Customer Service. Pour plus d’informations : Intégrer un bot Azure
- L’acheminement basé sur les compétences doit être activé.
Réaffecter une conversation à un agent humain
Dans Omnicanal pour Customer Service, un bot peut réaffecter une conversation actuelle à un agent humain. L’acheminement des conversations dépend de la règle d’acheminement configurée pour le flux de travail.
Lorsque la conversation est transférée du bot à un agent humain, les détails du client et de l’incident sont identifié automatiquement lorsque l’agent accepte la demande de réaffectation. Le bot achemine les conversations à l’aide des variables de contexte d’Omnicanal pour Customer Service qui sont associées à la conversation. Le bot peut envoyer une liste des variables de contexte et des valeurs associées à Omnicanal pour Customer Service, en même temps que la requête d’escalade. Le bot peut également définir des éléments de contexte qui peuvent être utilisés par les modèles de recherche de compétences pour identifier de nouvelles compétences et les ajouter à la liste de compétences existante pour la conversation. Omnicanal pour Customer Service mettra ensuite à jour les variables de contexte aux valeurs indiquées, puis réexécutera le moteur d’acheminement. Cela garantit que la conversation réaffectée est acheminée vers la file d’attente appropriée. Pour plus d’informations sur les éléments de contexte et les noms des variables, voir Lier le client et l’incident à une conversation lorsque le bot réaffecte une conversation ou y met fin.
Une fois que l’agent a accepté la demande d’escalade, la transcription de la conversation du bot avec le client sera visible sur le widget de conversation de l’agent. L’agent peut alors poursuivre la conversation avec le client.
Note
Le résumé de la conversation ne sera pas visible pour le client.
Mettre fin à une conversation
Le bot Azure peut choisir de mettre fin à la conversation s’il estime avoir répondu aux questions du client ou si le client ne répond plus. Le bot peut effectuer envoyer une requête EndConversation
à Omnicanal pour Customer Service.
Exemple de code
Cette section comprend des exemples de code que vous pouvez utiliser pour configurer un bot Azure pour qu’il réaffecte les conversations et y mette fin.
- Implémentez une classe de commande pour modéliser les tâches liées à l’escalade et à la fin des conversations.
L’exemple de code est le suivant.
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; }
}
}
- Mettez en place une classe de client Omnicanal pour Customer Service pour définir le contexte de la commande.
L’exemple de code est le suivant.
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 } };
}
}
}
}
Appelez la méthode client appropriée dans la classe Bot ActivityHandler.
Modifiez les critères des commandes
Escalate
etEndConversation
en fonction de vos besoins.Ajoutez l’instruction de code
OmnichannelBotClient.BridgeBotMessage(turnContext.Activity);
dans votre code de bot pour envoyer les messages à Omnicanal pour Customer Service. Cette méthode doit être appelée pour chaque message d’activité envoyé au client.
L’exemple de code est le suivant.
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);
}
}
}
}
}
Le dictionnaire contextVars
contient toutes les paires de nom-valeur de variables de contexte d’Omnicanal pour Customer Service que vous voulez mettre à jour dans le cadre de la requête d’escalade. Ici, BotHandoffTopic
est la variable de contexte et CreditCard est la valeur de la variable de contexte. S’il existe une file d’attente pour l’agent avec la règle BotHandoffTopic égale à CreditCar, cette conversation réaffectée sera acheminée vers cette file d’attente.
Le nom de la variable de contexte est du type Chaîne. La valeur de la variable de contexte doit être de type Entier ou Chaîne et doit être passée en tant que Dictionary <string, object>lors de l’escalade. L’exemple de code est le suivant.
Dictionary<string, Object> keyValues = new Dictionary<string, object>() {
{ "BotHandoffTopic", "CreditCard" },
{ "IDNumber", 101}
}
Le bot peut également envoyer un résumé d’escalade qui sera visible exclusivement à l’agent dès que la demande de réaffectation de la conversation aura été acceptée. Pour envoyer le résumé, définissez le texte d’activité de manière adéquate dans le message d’activité d’escalade.
Voir aussi
Intégrer un bot Azure
Ajouter des variables de contexte
Azure Bot Service
Connecter un bot aux canaux
Apporter votre propre canal de messagerie personnalisé : bot Direct Line
Meilleures pratiques pour la configuration des bots Azure et Copilot Studio