Depurar um bot com middleware de inspeção

APLICA-SE A: SDK v4

Este artigo descreve como depurar um bot usando o middleware de inspeção. Este recurso permite que o Bot Framework Emulator depure o tráfego dentro e fora do bot, além de examinar o estado atual dele. Você pode usar uma mensagem de rastreamento para enviar dados para o Emulator e, em seguida, inspecionar o estado do bot em qualquer determinada rodada da conversa.

Usamos um EchoBot criado localmente por meio do Bot Framework v4 no início rápido Criar um bot para mostrar como depurar e inspecionar o estado da mensagem do bot. Você também pode Depurar um bot usando o IDE ou Depurar com o Bot Framework Emulator, mas, para depurar o estado, você precisa adicionar o middleware de inspeção ao bot. Os exemplos de bot de inspeção estão disponíveis para C#, JavaScript, Java e Python.

Observação

Os SDKs JavaScript, C# e Python do Bot Framework continuarão a ser compatíveis. No entanto, o SDK Java está sendo desativado, com o suporte final de longo prazo terminando em novembro de 2023. Somente correções críticas de segurança e de bugs serão realizadas neste repositório.

Os bots existentes criados com o SDK para Java continuarão a funcionar.

Para a criação de novos bots, considere usar o Power Virtual Agents e ler sobre como escolher a solução de chatbot correta.

Para obter mais informações, confira O futuro da criação de bots.

Pré-requisitos

Atualizar o Emulator para a última versão

Antes de usar o middleware de inspeção de bot para depurar seu bot, atualize o Emulator para a versão 4.5 ou mais recente. Verifique a última versão para obter atualizações.

Para verificar a versão do seu Emulator, selecione Ajuda e Sobre no menu. Você verá a versão atual do Emulator.

Atualizar o código do bot

O estado de inspeção e o middleware de inspeção são configurados no arquivo Startup.cs e, em seguida, usados pelo adaptador.

Startup.cs

});

services.AddSingleton<ConversationState>();

// Create the Bot Framework Authentication to be used with the Bot Adapter.

AdapterWithInspection.cs

{
    public class AdapterWithInspection : CloudAdapter
    {
        public AdapterWithInspection(BotFrameworkAuthentication auth, IConfiguration configuration, InspectionState inspectionState, UserState userState, ConversationState conversationState, ILogger<IBotFrameworkHttpAdapter> logger)
            : base(auth, logger)
        {
            // Inspection needs credentials because it will be sending the Activities and User and Conversation State to the emulator
            var credentials = new MicrosoftAppCredentials(configuration["MicrosoftAppId"], configuration["MicrosoftAppPassword"]);

            Use(new InspectionMiddleware(inspectionState, userState, conversationState, credentials));

            OnTurnError = async (turnContext, exception) =>
            {
                // Log any leaked exception from the application.
                logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}");

                // Send a message to the user
                await turnContext.SendActivityAsync("The bot encountered an error or bug.");
                await turnContext.SendActivityAsync("To continue to run this bot, please fix the bot source code.");

                // Send a trace activity, which will be displayed in the Bot Framework Emulator
                await turnContext.TraceActivityAsync("OnTurnError Trace", exception.Message, "https://www.botframework.com/schemas/error", "TurnError");
            };
        }

Atualize a classe do bot no arquivo EchoBot.cs.

EchoBot.cs

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
    var conversationStateProp = _conversationState.CreateProperty<CustomState>("customState");
    var convProp = await conversationStateProp.GetAsync(turnContext, () => new CustomState { Value = 0 }, cancellationToken);

    var userStateProp = _userState.CreateProperty<CustomState>("customState");
    var userProp = await userStateProp.GetAsync(turnContext, () => new CustomState { Value = 0 }, cancellationToken);

    await turnContext.SendActivityAsync(MessageFactory.Text($"Echo: {turnContext.Activity.Text} conversation state: {convProp.Value} user state: {userProp.Value}"), cancellationToken);

    convProp.Value++;
    userProp.Value++;
}

Testar o bot localmente

Depois de atualizar o código, você pode executar o bot localmente e testar o recurso de depuração usando dois emuladores: um para enviar e receber mensagens e o outro para inspecionar o estado das mensagens no modo de depuração. Para testar seu bot localmente:

  1. Navegue até o diretório do bot em um terminal e execute o seguinte comando para executar o seu bot localmente:

    dotnet run
    
  2. Abra seu Emulator. Selecione Abrir bot. Preencha a URL do bot com http://localhost:3978/api/messages e os valores de MicrosoftAppId e de MicrosoftAppPassword. Se tiver um bot JavaScript, poderá encontrar esses valores no arquivo .env do seu bot. Se tiver um bot C#, poderá encontrar esses valores no arquivo appsettings.json. Para um bot Java, você pode encontrar esses valores no arquivo application.properties. Selecione Conectar.

  3. Agora, abra outra janela do Emulator. Essa segunda janela do Emulator funcionará como um depurador. Siga as instruções descritas na etapa anterior. Marque Abrir no modo de depuração e selecione Conectar.

  4. Neste ponto, você verá um comando com um identificador exclusivo (/INSPECT attach <identifier>) em seu Emulator de depuração. Copie o comando inteiro com o identificador do Emulator de depuração e cole-o na caixa de chat do primeiro Emulator.

    Observação

    Um identificador exclusivo é gerado toda vez que o Emulator é iniciado no modo de depuração depois que você adiciona o middleware de inspeção no código do bot.

  5. Agora você pode enviar mensagens na caixa de chat do seu primeiro Emulator e inspecionar as mensagens no Emulator de depuração. Para inspecionar o estado das mensagens, selecione Estado do Bot no Emulator de depuração e desdobre os valores na janela à direita JSON. Você verá o estado do bot no Emulator de depuração:

    bot state

Inspecionar o estado de um bot configurado no Azure

Se desejar inspecionar o estado do bot configurado no Azure e conectado aos canais (como o Teams), precisará instalar e executar o ngrok.

Executar o ngrok

Neste ponto, você atualizou o Emulator para a última versão e adicionou o middleware de inspeção no código do bot. A próxima etapa é executar o ngrok e configurar seu bot localmente. Antes de executar o ngrok, você precisa executar o bot localmente.

Para executar seu bot localmente:

  1. Navegue até a pasta do bot em um terminal e defina o registro do npm para usar os builds mais recentes

  2. Execute o bot localmente. Você verá o bot expor um número da porta como 3978.

  3. Abra outro prompt de comando e navegue até a pasta do projeto do seu bot. Execute o comando a seguir:

    ngrok http 3978
    
  4. O ngrok agora está conectado ao bot executado localmente. Copie o endereço IP público seguro (HTTPS).

    ngrok success

Atualize o recurso de seu bot

Agora que o bot local está conectado ao ngrok, você pode configurar o recurso de seu bot no Azure para usar a URL do ngrok.

  1. Acesse o recurso do seu bot no portal do Azure. No menu à esquerda, em Configurações selecione Configuração.

    1. Defina o ponto de extremidade Messaging como o endereço IP do ngrok que você copiou. Se necessário, adicione /api/messages após o endereço IP. Por exemplo, https://e58549b6.ngrok.io/api/messages.

    2. Selecione Habilitar ponto de extremidade de streaming.

      Set endpoint

    3. Selecione Aplicar para salvar as alterações.

      Dica

      Se a opção Aplicar não estiver habilitada, você poderá desmarcar Habilitar ponto de extremidade de streaming e selecionar Aplicar, depois marcar Habilitar ponto de extremidade de streaming e selecionar Aplicar novamente. Você precisa verificar se Habilitar Ponto de Extremidade de Streaming está marcado e a configuração do ponto de extremidade foi salva.

  2. Vá até o grupo de recursos do seu bot.

    1. Selecione Implantação e, em seguida, selecione o recurso de bot que foi implantado anteriormente com êxito. Selecione Modelo no menu à esquerda para obter o MicrosoftAppId e o MicrosoftAppPassword para o aplicativo Web associado ao bot.

      Get inputs

    2. Atualize o arquivo de configuração do bot (appsettings.json para C# ou .env para JavaScript) com o MicrosoftAppId e o MicrosoftAppPassword.

  3. Inicie o Emulator, selecione Abrir Bot e insira http://localhost:3978/api/messages na URL do Bot. Preencha a ID do Aplicativo da Microsoft e a senha do Aplicativo da Microsoft com o mesmo MicrosoftAppId e MicrosoftAppPassword que você adicionou ao arquivo de configuração do nosso bot. Depois, selecione Conectar.

  4. O bot em execução agora está conectado ao recurso de bot no Azure. Para testar seu bot no Azure usando o Webchat, acesse os recursos do bot, selecione Testar no Web Chat e envie mensagens para o bot.

Habilitar o modo de depuração

  1. Em seu Emulator, selecione Depurar e Iniciar Depuração.

  2. Insira o endereço IP do ngrok (não se esqueça de adicionar /api/messages) na URL do Bot (por exemplo, https://e58549b6.ngrok.io/api/messages.

    1. Em ID do ID do aplicativo da Microsoft, insira a ID do aplicativo do bot.
    2. Em senha do Aplicativo da Microsoft, insira o segredo do aplicativo do bot.
    3. Verifique se a opção Abrir no modo de depuração também está marcada.
    4. Selecione Conectar.
  3. Com o modo de depuração habilitado, o Emulator gera um UUID. Um UUID é uma ID exclusiva gerada toda vez que você inicia o modo de depuração no Emulator.

  4. Copie e cole o UUID na caixa de chat Testar no Webchat do canal. Você verá na mensagem "Anexado à sessão, que todo o tráfego está sendo replicado para inspeção" na caixa de chat.

Você pode iniciar a depuração do bot enviando mensagens na caixa de chat do canal configurado. Seu Emulator local atualizará automaticamente as mensagens com todos os detalhes para depuração. Para inspecionar o estado de mensagens do bot, selecione Estado do Bot e desdobre os valores na janela JSON à direita.

debug-inspection-middleware

Próximas etapas