.NET Core

Chatbot com .NET Core e Bot Builder SDK 4.0

Após um tempo sem postar, decidi postar o primeiro de uma série de posts sobre chatbots. Hoje começaremos desenvolvendo o nosso primeiro chatbot com .NET Core e Bot Builder SDK 4.0

Mas antes…

Em razão do meu post sobre NLog + Enterprise Application Log, fui convidado pelo meu amigo Rafael Cruz para participar de um hangout sobre o assunto no canal Coders in Rio.

Desenvolvendo sua stack com NLog RabbitMQ e ELK
Desenvolvendo sua stack com NLog RabbitMQ e ELK

Então, no dia 31/07, às 21:00h, teremos um bate papo, ao vivo, sobre logs, utilizando a stack ELK. Quem já tiver dúvidas ou sugestões, é só comentar aqui no post.

Link do evento:

Link do canal Coders in Rio:

https://www.youtube.com/c/CanalCodersInRio

 

O que é um chatbot ?

Chatbot é uma nova forma da sua aplicação interagir com o seu usuário. No lugar de instalar um app de delivery no meu celular, eu interajo com um bot em um instant messaging para fazer meu pedido. Telegram, por exemplo. Com isso, é possível que, em um serviço de SAC, funções como segunda via de boleto e localização de produto com a transportadora sejam resolvidas com o uso de chatbot, enquanto que os assuntos mais delicados ou complexos sejam redirecionados para um profissional de SAC. Isso é possível através do chatbot.

 

BotFramework e .NET Core Bot Builder SDK

Visando facilitar o desenvolvimento em múltiplos canais (Telegram, Slack, Facebook Messenger e outros), a Microsoft criou o BotFramework. Um serviço que consiste, basicamente, no BotConnector, para conectar a inúmeras plataformas de mensagens e o BotBuilder, um SDK para o desenvolvimento dos chatbots. Isso permite desenvolver um chatbot e distribuir em várias plataformas de mensagens com o mínimo de esforço.

Show me the code !!!

O projeto completo já se encontra no github.

Ao mesmo tempo, vamos ver o passo a passo do nosso projeto aqui. Não se esqueça de verificar antes se possui os requisitos instalados na sua máquina:

 

IMPORTANTE: Lembrando que o Bot Builder SDK 4.0 ainda se encontra em versão preview. Sendo assim, não utilize-o em aplicações que você planeja publicar em produção. Para isso, utilize a versão 3.0. Entretanto, ele não possui suporte ao .NET Core.

Começaremos com a criação de uma interação na qual o usuário escreve no chat e o bot pergunta o nome. Obtido o nome, o bot envia uma mensagem de boas vindas.

Para iniciar, crio um projeto BotFramework.

Criação do projeto chat bot

 

Este projeto terá a seguinte estrutura :

Estrutura do projeto chat bot

 

Por minha preferência, eu renomeio os arquivos EchoBot.cs para BotSimples.cs e EchoState.cs para BotSimplesState.cs. Em seguida, verifico o arquivo Startup.

services.AddBot<BotSimples>(options =>
{
        options.CredentialProvider = new ConfigurationCredentialProvider(Configuration);

        // The CatchExceptionMiddleware provides a top-level exception handler for your bot. 
        // Any exceptions thrown by other Middleware, or by your OnTurn method, will be 
        // caught here. To facillitate debugging, the exception is sent out, via Trace, 
        // to the emulator. Trace activities are NOT displayed to users, so in addition
        // an "Ooops" message is sent. 
        options.Middleware.Add(new CatchExceptionMiddleware<Exception>(async (context, exception) =>
        {
             await context.TraceActivity("BotSimples Exception", exception);
             await context.SendActivity("Desculpe, parece que algo deu errado.");
         }));

         // The Memory Storage used here is for local bot debugging only. When the bot
         // is restarted, anything stored in memory will be gone. 
         IStorage dataStore = new MemoryStorage();
                
         options.Middleware.Add(new ConversationState<BotSimplesState>(dataStore));
});

Em ConfigureServices, faço a configuração do bot. Fiquem tranquilos, pois tudo será explicado no momento certo, conforme evoluirmos entre os próximos posts e vídeos.

No trecho abaixo, configuro o middleware CatchExceptonMiddleware. Assim, consigo manipular exceções que são geradas por outros middleware ou no método OnTurn.

options.Middleware.Add(new CatchExceptionMiddleware<Exception>(async (context, exception) =>
{
     await context.TraceActivity("BotSimples Exception", exception);
     await context.SendActivity("Desculpe, parece que algo deu errado.");
}));

Conforme dito acima, mais detalhes sobre middlewares e configurações de estados serão falados, futuramente, na nossa série sobre o botbuilder v4.

Agora, vamos para a classe do bot. Na classe BotSimples, vemos que ela implementa a interface IBot, que possui o método OnTurn. Esse método é chamado sempre que o usuário interage com o bot.

Finalizando o comportamento

No nosso exemplo, estamos tratando apenas as atividade de mensagem.

if (context.Activity.Type == ActivityTypes.Message)

Antes de iniciar a interação, obtenho o estado atual da mensagem, para saber se já perguntei para o usuário qual é o seu nome.

BotSimplesState state = context.GetConversationState<BotSimplesState>();

Verifico, portanto, se já perguntei o nome para o usuário. caso não, crio um TextPrompt e solicito o nome do usuário e assim que obtenho o nome, dou as boas vindas.

TextPrompt promptNome = new TextPrompt();

if (!state.PergunteiNome)
{
      state.PergunteiNome = true;
      await promptNome.Prompt(context, "Qual o seu nome ?");
}
else
{
      TextResult nome = await promptNome.Recognize(context);

      if (!nome.Succeeded())
      {
          await promptNome.Prompt(context, "Desculpe, pode repetir ?");
      }
      else
      {
          state.PergunteiNome = false;
          await context.SendActivity($"Oi {nome.Value}, seja bem vindo ao nosso chat de teste.");
      }
}

Hora de rodar !!!

Agora vamos testar a nossa aplicação. Para isso, vamos utilizar o emulador do Bot Framework.

Para abrir o projeto, vamos na opção File > Open Bot e selecionar o arquivo .bot em nosso projeto. E, com isso, teremos a nossa janela de chat para testarmos a interação com o chatbot.

Projeto sendo executado no emulador do Bot Framework

Concluímos essa pequena introdução sobre o BotFramework e o BotBuilder 4.0, lembrando que a versão 4 se encontra em preview e que é recomendado não utilizar essa versão em produção.

Como sempre espero suas dúvidas e sugestões, lembrando que o projeto completo vocês encontram no meu github. Aguardem os novos posts que iremos aprofundar, cada vez mais, nessa tecnologia.