https://a.storyblok.com/f/270183/169979/164b42a3a0/serverless-contact-center.png

Central de atendimento sem servidor com o Azure Functions

Publicado em February 11, 2022

Tempo de leitura: 11 minutos

Eu ficaria surpreso se não houvesse nenhuma empresa por aí — desde a menor startup até a maior megacorporação — que não quisesse oferecer um atendimento ao cliente excelente. Parte desse atendimento poderia consistir em disponibilizar um centro de atendimento dinâmico e acessível, capaz de oferecer opções de autoatendimento ou encaminhar as chamadas diretamente para o agente ou departamento correto. A Voice API da Vonage e seus NCCOs são uma maneira fácil de criar aplicativos de voz de alta qualidade, capazes de controlar o fluxo de chamadas recebidas e realizadas, criar teleconferências, gravar e armazenar chamadas, reproduzir mensagens pré-gravadas e enviar mensagens de conversão de texto em fala em 40 idiomas diferentes.

Hoje em dia, a maioria dos softwares, de uma forma ou de outra, está hospedada total ou parcialmente na nuvem, e não é segredo que, sem uma regulamentação, os custos de hospedagem na nuvem podem aumentar rapidamente com o tempo. Por trabalhar com o Azure há muitos anos, adoro conhecer os diferentes serviços que ele tem a oferecer. Meu favorito há algum tempo é o Azure Functions, a oferta sem servidor da Microsoft. Ele oferece toda a segurança, confiabilidade e escalabilidade que você esperaria de qualquer provedor de nuvem, a um custo bastante razoável. Na verdade, ao usar o plano de consumo, as primeiras 1.000.000 de execuções são gratuitas.

Com essas duas tecnologias à disposição, achei que seria uma boa ideia verificar o que seria necessário para criar um centro de atendimento sem servidor e de baixo custo, que pudesse ser ampliado ou personalizado para atender a diversas necessidades.

Pré-requisitos

O Plano

Para o nosso Centro de Atendimento, precisaremos configurar algumas coisas. Primeiro, uma aplicação e um número da Vonage; o número será vinculado à aplicação, e é a aplicação que fará a chamada para nossa Função do Azure. A função, então, retornará Objetos de Controle de Chamada da Nexmo (NCCO) no formato JSON, e é isso que descreverá o fluxo da chamada recebida.

Ao receber uma ligação para o nosso número, usaremos a tecnologia de conversão de texto em fala para reproduzir uma mensagem e oferecer algumas opções ao chamador. Vou criar apenas um protótipo básico e funcional, mas há tantas ações diferentes que podemos usar com o NCCO que as possibilidades são infinitas!

Recursos do Azure

Antes de configurarmos o aplicativo da Vonage, precisaremos saber o nome do host das nossas funções para que possamos inserir as URLs de resposta e de evento durante a criação. Para obtê-las, precisaremos primeiro criar um aplicativo de funções do Azure; acho que a maneira mais fácil de fazer isso é usando a CLI do Azure, mas também é possível criar um Function App pelo Portal do Azure também funciona muito bem. Acabei de criar um script simples em bash que faz tudo isso de uma vez só; ele poderia ser digitado manualmente ou, de fato, convertido em um script do 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

Depois que seu Function App for criado, precisaremos obter o nome do host. Podemos obter o nome do host com o comando da CLI do Azure abaixo, substituindo “webapp-name” pelo nome da função que acabamos de criar.

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

Anote o nome do servidor para quando criarmos o aplicativo da Vonage.

Aplicativo Vonage

Depois de se cadastrar para obter um Account gratuito da Vonage, você poderá obter sua chave de API e seu segredo de API no Painel de Controle da Vonage para configurar o CLI da Vonage

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

Com o nome de host da sua Azure Function em mãos, agora podemos criar o aplicativo da Vonage. Selecione “sim” quando for solicitado a criar Webhooks e insira-os como fiz abaixo; lembre-se de substituir `contactcentre123.azurewebsites.net` pelo seu próprio nome 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

Agora podemos procurar um número para comprar e vincular ao nosso aplicativo. Vamos procurar um número de celular no país em que você mora. Nossas páginas de ajuda contêm listas de quais produtos são compatíveis em quais países e usamos os códigos ISO 3166-1 alfa-2 para o seu país em nossa pesquisa. Como moro no Reino Unido, uso “GB” ao pesquisar Numbers.

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

Quando encontrarmos um número de que gostemos, podemos comprá-lo e vinculá-lo à Application da Vonage que criamos anteriormente.

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

Criação do projeto

Certo, vamos começar a programar! Para começar, vamos criar um novo projeto do Azure Functions usando o runtime dotnet.

func init ContactCentre —dotnet --worker-runtime dotnet

Isso criará um projeto de Function App na pasta ContactCentre. Em seguida, precisamos primeiro adicionar uma referência ao pacote NuGet da Vonage e, depois, criaremos três funções, todas com gatilhos HTTP: uma que será o endpoint de resposta, a segunda que será o endpoint de evento e a última que será usada para executar uma ação com base na opção fornecida pelo chamador. Navegue até a pasta do projeto ContactCentre e execute os comandos abaixo.

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"

Função de resposta

Sempre que alguém liga para nossa central de atendimento, a função de atendimento é sempre o primeiro ponto de contato a ser acionado. Retornaremos um objeto NCCO que descreve as primeiras etapas do nosso processo. Criaremos um Ação de Conversação que dá as boas-vindas ao nosso interlocutor e descreve o que ele pode fazer, usando o inglês britânico e o estilo de voz 2 (acho esse o mais agradável), mas há diversos estilos e idiomas para escolher. A próxima ação é a MultiInputAction , que coleta dígitos ou entradas de voz da pessoa para quem você está ligando e encaminha essas entradas para o EventUrl que fornecemos; neste caso, a Função de Menu.

A seguir está o código da função Answer.

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);
    }
}

Função do menu

Especificamos a URL da Função de Menu na propriedade EventUrl do NCCO. A ação de entrada enviará dados relacionados à entrada do usuário como JSON para essa URL por meio de uma solicitação POST — confira a referência do webhook para obter uma descrição completa das propriedades. Para este exercício, estamos interessados apenas nos dígitos que o chamador digitou. A Função de Menu abaixo recupera os dígitos como `selectedOption` e, em seguida, tomamos uma ação com base nisso.

A seguir está o código da função Menu

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 o Function App

Para que tudo funcione, a última coisa que precisamos fazer é enviar nosso código para o Azure. Acho que a maneira mais rápida de fazer isso é usando o comando “Publicar” no Visual Studio. Depois de carregar o projeto no Visual Studio, basta clicar com o botão direito do mouse no nome do projeto e selecionar “Publicar” no menu suspenso. Em seguida, será exibida a tela abaixo. Selecione o destino como Azure.

Publishing to Azure

O aplicativo de função que criamos anteriormente utilizou as configurações padrão, portanto, será um Aplicativo de Função do Azure (Windows).

Choose Function Type

Localize o aplicativo “Funcionalidade do Centro de Atendimento” e selecione “Concluir”.

Select Contact Centre Function App

Agora você já tem um perfil de publicação configurado e poderá enviar o aplicativo para o Azure simplesmente clicando em “Publicar”. Quando isso for concluído com sucesso, a última coisa a fazer é ligar para o número de telefone do seu aplicativo e seguir as instruções!

Agora temos um centro de atendimento?

Embora ainda não seja um centro de atendimento totalmente funcional, já temos a base para isso. Há algumas coisas que me vêm à mente e que poderíamos acrescentar para torná-lo mais funcional.

Quando um usuário pressiona o 1 para obter informações sobre um pedido, poderíamos usar o número de telefone de onde ele está ligando para recuperar os dados mais recentes do pedido e do cliente e solicitar algum tipo de informação para confirmar sua identidade antes de fornecer uma atualização sobre o pedido. Ou, em vez de simplesmente transferir a chamada para um número de telefone comum, poderíamos encaminhá-la para uma linha SIP, um endpoint WebSocket ou uma extensão do Vonage Business Cloud. Confira a Referência NCCO para obter mais informações sobre esses recursos.

Também temos uma função “Pay Action” em pré-visualização para desenvolvedores, que permite ao usuário pagar uma conta pendente ou, talvez, solicitar produtos adicionais diretamente durante a ligação.

Partindo dos conceitos básicos que abordei aqui, fica muito fácil perceber como ter um centro de atendimento totalmente funcional e personalizado, hospedado na nuvem a um preço razoável, está ao alcance de todas as empresas, sejam elas grandes ou pequenas.

Referências

Compartilhar:

https://a.storyblok.com/f/270183/400x339/e206caec3f/matt-hunt.png
Matt HuntEx-funcionário da Vonage