https://d226lax1qjow5r.cloudfront.net/blog/blogposts/serverless-contact-centre-with-azure-functions/serverless-contact-center.png

Centro de contacto sin servidor con Azure Functions

Publicado el February 11, 2022

Tiempo de lectura: 11 minutos

Me sorprendería que no hubiera ninguna empresa, desde la más pequeña a la mayor megacorporación, que no quisiera ofrecer a sus clientes un servicio de atención al cliente brillante. Parte de ese servicio podría ser ofrecer un centro de contacto dinámico y asequible que pueda proporcionar opciones de autoservicio o dirigir las llamadas al agente o departamento correcto. Voice API de Vonage y sus NCCO son una manera fácil de crear aplicaciones de voz de alta calidad que pueden controlar el flujo de llamadas entrantes y salientes, crear llamadas en conferencia, grabar y almacenar llamadas, reproducir mensajes pregrabados y enviar mensajes de texto a voz en 40 idiomas diferentes.

Hoy en día, la mayoría del software se aloja total o parcialmente en la nube y no es ningún secreto que, sin regulación, los costes de alojamiento en la nube pueden crecer rápidamente con el tiempo. Después de haber trabajado con Azure durante muchos años, me encanta aprender sobre los diferentes servicios que ofrece. Mi favorito desde hace tiempo es Azure Functions, la oferta sin servidor de Microsoft. Ofrecen toda la seguridad, fiabilidad y escalabilidad que cabe esperar de cualquier proveedor en la nube a un coste muy razonable. De hecho, cuando se utiliza el plan Consumo, las primeras 1.000.000 de ejecuciones son gratuitas.

Armado con estas dos tecnologías, pensé que sería una buena idea ver lo que se necesitaría para crear un centro de contacto sin servidor de bajo coste que pudiera ampliarse o personalizarse para adaptarse a muchas necesidades diferentes.

Requisitos previos

Vonage API Account

To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.

This tutorial also uses a virtual phone number. To purchase one, go to Numbers > Buy Numbers and search for one that meets your needs.

El Plan

Para nuestro centro de contacto necesitaremos configurar un par de cosas. En primer lugar, una aplicación y un número de Vonage. El número estará vinculado a la aplicación y será la aplicación la que llame a nuestra función Azure. La función devolverá objetos de control de llamadas Nexmo (NCCO) como JSON y esto es lo que describirá el flujo de la llamada entrante.

Cuando recibamos una llamada a nuestro número, utilizaremos la función de texto a voz para reproducir un mensaje y dar a la persona que llama un par de opciones. Sólo voy a crear un prototipo de funcionamiento básico, pero hay tantos acciones diferentes que podemos utilizar con NCCO, ¡las posibilidades son infinitas!

Recursos Azure

Antes de configurar la aplicación de Vonage, necesitaremos conocer el nombre de host de nuestras funciones para poder introducir las URL de respuesta y evento durante su creación. Para obtener estos primero tendremos que crear una Azure Function App, me parece que la forma más fácil de hacerlo es utilizando el Azure CLIpero crear una Function App a través del Portal de Azure funciona igual de bien. Acabo de crear un simple script bash que hace todo esto para mí de una sola vez, esto podría ser escrito manualmente o de hecho convertido a un script de PowerShell.

#!/bin/bash # You must be logged into your Azure Account az login # Function app and storage account names must be unique. storageName=contactcentrestorage$RANDOM functionAppName=contactcentre$RANDOM region=westeurope # Create a resource group. az group create --name ContactCentreResourceGroup --location $region # Create an Azure storage account in the resource group. az storage account create \ --name $storageName \ --location $region \ --resource-group ContactCentreResourceGroup \ --sku Standard_LRS # Create a serverless function app in the resource group. az functionapp create \ --name $functionAppName \ --storage-account $storageName \ --consumption-plan-location $region \ --resource-group ContactCentreResourceGroup \ --functions-version 4

Una vez que su aplicación de función se ha creado tendremos que recuperar el nombre de host. Podemos recuperar el nombre de host con el siguiente comando Azure CLI, cambiando "webapp-name" por el nombre de la función que acabamos de crear.

az functionapp config hostname list --resource-group ContactCentreResourceGroup --webapp-name contactcentre123 -o tsv --query [].name

Anota el nombre de host para cuando creemos la aplicación de Vonage.

Aplicación de Vonage

Una vez que te hayas registrado para obtener una Account gratuita de Vonage, podrás recuperar tu API Key y API Secret desde el Panel de Vonage para configurar la CLI de Vonage

vonage config:set -h --apiKey= --apiSecret=

Con tu nombre de host de Azure Function a mano, ahora podemos crear la aplicación de Vonage. Selecciona yes cuando se te pida crear Webhooks e introdúcelo como he hecho yo a continuación, recuerda sustituir `contactcentre123.azurewebsites.net` por tu propio nombre de host.

vonage apps:create ✔ Application Name … contact centre ✔ Select App Capabilities › Voice ✔ Create voice webhooks? … yes ✔ Answer Webhook - URL … https://contactcentre123.azurewebsites.net/api/answer ✔ Answer Webhook - Method › POST ✔ Event Webhook - URL ... https://contactcentre123.azurewebsites.net/api/event ✔ Event Webhook - Method » POST

Ahora podemos buscar un número para comprarlo y vincularlo a nuestra aplicación. Buscaremos un número de móvil en el país en el que residas. Nuestras páginas de ayuda tienen listas de qué productos son compatibles en qué países y utilizamos los códigos códigos ISO 3166-1 alfa-2 para nuestro país en nuestra búsqueda. Yo vivo en el Reino Unido, así que utilizo "GB" para buscar números.

vonage numbers:search GB --features=VOICE --type=mobile-lvn Country Number Type Cost Features ─────── ──────────── ────────── ──── ───────── GB 447418368151 mobile-lvn 1.25 VOICE,SMS GB 447418368155 mobile-lvn 1.25 VOICE,SMS GB 447418368156 mobile-lvn 1.25 VOICE,SMS GB 447418368157 mobile-lvn 1.25 VOICE,SMS GB 447418368158 mobile-lvn 1.25 VOICE,SMS

Cuando encontremos un número que nos guste, podemos comprarlo y vincularlo a la aplicación de Vonage que creamos anteriormente.

vonage numbers:buy 447418368151 GB
vonage apps:link 3ff94f7c-fb86-4afd-b338-fe39707b5ef5 --number=447418367999

Creación del proyecto

Bien, ¡vamos a codificar! Para empezar vamos a crear un nuevo proyecto Azure Functions utilizando el tiempo de ejecución dotnet.

func init ContactCentre —dotnet --worker-runtime dotnet

Esto creará un proyecto Function App en la carpeta ContactCentre. A continuación, debemos agregar una referencia al paquete Nuget de Vonage y luego crear tres funciones que tengan disparadores HTTP; una que sea el punto final de respuesta, la segunda que sea el punto final de evento y la última que se utilizará para realizar una acción según la opción que proporcione la persona que llama. Cambie a la carpeta del proyecto ContactCentre y ejecute los siguientes comandos.

dotnet add package vonage func new --name Answer --template "HTTP trigger" --authlevel "anonymous" func new --name Event --template "HTTP trigger" --authlevel "anonymous" func new --name Menu --template "HTTP trigger" --authlevel "anonymous"

Respuesta Función

Cuando alguien llama a nuestro centro de contacto, la función de respuesta es siempre el primer punto final al que se accede. Devolveremos un objeto NCCO que describe los primeros pasos de nuestro proceso. Crearemos una Acción Hablar que dé la bienvenida a la persona que llama y describa lo que puede hacer utilizando el inglés del Reino Unido y el estilo de voz 2 (para mí es el más agradable), pero hay muchos estilos e idiomas diferentes. estilos e idiomas para elegir. La siguiente acción es la MultiInputAction que recoge los dígitos o la voz de la persona que llama y los pasa al EventUrl que le proporcionemos, en este caso, la función Menú.

A continuación se muestra el código de la función de respuesta.

using Vonage.Voice.Nccos;


public static class Answer
{
    [FunctionName("Answer")]
    public static IActionResult Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req, ILogger log)
    {
        log.LogInformation("Phone call answered");

        var ncco = new Ncco(new NccoAction[] {
            new TalkAction
            {
                Text = "Welcome to the Contact Centre. Press 1 for order information. Press 2 to speak to an operator.",
                Language = "en-GB",
                Style = 2
            },
            new MultiInputAction
            {
                Dtmf = new DtmfSettings{MaxDigits = 1},
                EventUrl = new []{ "https://contactcentre123.azurewebsites.net/api/menu" }
            }
        });

        return new OkObjectResult(ncco);
    }
}

Menú Función

Especificamos la URL de la función de menú en la propiedad EventUrl de NCCOs. La acción de entrada enviará por POST los datos relacionados con la entrada de la persona que llama como JSON a esta URL - echa un vistazo a la referencia webhook para una descripción completa de las propiedades. Para este ejercicio, sólo estamos interesados en los dígitos que la persona que llama ha pulsado. La función de menú a continuación recupera los dígitos como `selectedOption` y luego tomamos una acción basada en eso.

A continuación se muestra el código de la función de menú

using Vonage.Voice.Nccos;
using Vonage.Voice.Nccos.Endpoints;


public static class Menu
{
    [FunctionName("Menu")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("Menu event triggered");

        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(requestBody);

        var ncco = new Ncco();

        var selectedOption = data.dtmf.digits;
        switch (selectedOption.ToString())
        {
            case "1":
                // LOOK UP CUSTOMER SPECIFIC DATA
                ncco.Actions.Add(
                    new TalkAction
                    {
                        Text = "Your order is on it's way.",
                        Language = "en-GB",
                        Style = 2
                    });
                break;
            case "2":
                // CONNECT TO TELEPHONE AGENT
                ncco.Actions.Add(
                    new TalkAction
                    {
                        Text = "Please wait while we connect you to the next available operator.",
                        Language = "en-GB",
                        Style = 2
                    });

                ncco.Actions.Add(
                    new ConnectAction
                    {
                        Endpoint = new Endpoint[]
                        {
                            new PhoneEndpoint
                            {
                                Number = "44123456789"
                            }
                        }
                    });
                break;
        }

        return new OkObjectResult(ncco);
    }
}

Publicar la aplicación funcional

Para que todo funcione, lo último que tenemos que hacer es poner nuestro código en Azure. Creo que la forma más rápida de hacerlo es utilizando el comando Publicar en Visual Studio. Después de haber cargado el proyecto en Visual Studio todo lo que tenemos que hacer es hacer clic derecho sobre el nombre del proyecto y seleccione "Publicar" en el menú desplegable. Aparecerá la siguiente pantalla. Seleccione el destino como Azure.

Publishing to Azure

La aplicación de función que hemos creado anteriormente utiliza los valores predeterminados para que sea una Azure Function App (Windows).

Choose Function Type

Localice la aplicación Contact Centre Function y seleccione finalizar.

Select Contact Centre Function App

Ahora tendrás un perfil de publicación configurado y podrás subir la aplicación a Azure simplemente haciendo clic en publicar. Una vez hecho esto, lo último que tienes que hacer es llamar al número de teléfono de tu aplicación y seguir las instrucciones.

¿Ahora tenemos un Centro de Contacto?

Aunque todavía no es un centro de contacto totalmente funcional, ahora tenemos la base para uno. Se nos ocurren algunas cosas que podríamos añadir para hacerlo más funcional.

Cuando una persona que llama pulsa 1 para obtener información sobre un pedido, podríamos usar el número de teléfono desde el que llaman para recuperar su último pedido y la información del cliente y solicitar algún tipo de dato para confirmar su identidad antes de ofrecerles una actualización del pedido. O, en lugar de simplemente conectar la llamada a un número de teléfono normal, podríamos pasarla a una línea SIP, un punto final WebSocket o una extensión de Vonage Business Cloud. Echa un vistazo a la Referencia NCCO para obtener más información al respecto.

También disponemos de una Acción de pago que permite a la persona que llama pagar una factura pendiente o pedir productos adicionales durante la llamada.

Partiendo de los conceptos básicos que he tratado aquí, es muy fácil ver cómo tener un centro de contacto totalmente funcional y personalizado alojado a un precio razonable en la nube está al alcance de cualquier empresa, grande o pequeña.

Referencias

Compartir:

https://a.storyblok.com/f/270183/400x339/e206caec3f/matt-hunt.png
Matt HuntAntiguo miembro del equipo de Vonage