Depurar um bot com middleware de inspeção

APLICA-SE A: SDK v4

Este artigo descreve como depurar um bot usando middleware de inspeção. Esse recurso permite que o Bot Framework Emulator depure o tráfego de entrada e saída do bot e veja o estado atual do bot. Você pode usar uma mensagem de rastreamento para enviar dados para o emulador e, em seguida, inspecionar o estado do seu bot em qualquer turno da conversa.

Usamos um EchoBot construído localmente usando o Bot Framework v4 no guia de 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 IDE ou Depurar com o Bot Framework Emulator, mas para depurar o estado você precisa adicionar middleware de inspeção ao seu bot. Os exemplos do bot de inspeção estão disponíveis para C#, JavaScript, Java e Python.

Nota

Os SDKs JavaScript, C# e Python do Bot Framework continuarão a ser suportados, no entanto, o Java SDK está sendo desativado com suporte final de longo prazo terminando em novembro de 2023.

Os bots existentes construídos com o Java SDK continuarão a funcionar.

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

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

Pré-requisitos

Atualize seu emulador para a versão mais recente

Antes de usar o middleware de inspeção de bot para depurar seu bot, atualize seu emulador para a versão 4.5 ou posterior. Verifique se há atualizações na versão mais recente.

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

Atualize o código do bot

O estado de inspeção e o middleware de inspeção são configurados no arquivo de 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 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++;
}

Teste seu bot localmente

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

  1. Vá para o diretório do bot em um terminal e execute o seguinte comando para executar o bot localmente:

    dotnet run
    
  2. Abra seu emulador. Selecione Abrir Bot. Preencha a URL do Bot com http://localhost:3978/api/messages e os valores MicrosoftAppId e MicrosoftAppPassword. Se você tiver um bot JavaScript, poderá encontrar esses valores no arquivo .env do seu bot. Se você 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 Ligar.

  3. Agora abra outra janela do emulador. Esta segunda janela do emulador funcionará como um depurador. Siga as instruções conforme descrito 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 emulador de depuração. Copie todo o comando com o identificador do emulador de depuração e cole-o na caixa de chat do primeiro emulador.

    Nota

    Um identificador exclusivo é gerado sempre que o emulador é 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 emulador e inspecionar as mensagens no emulador de depuração. Para inspecionar o estado das mensagens, selecione Estado do Bot no Emulador de depuração e desdobre os valores na janela JSON direita. Você verá o estado do seu bot no emulador de depuração:

    estado do bot

Inspecionar o estado de um bot configurado no Azure

Se quiser inspecionar o estado do bot configurado no Azure e conectado a canais (como o Teams), você precisará instalar e executar o ngrok.

Executar ngrok

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

Para executar seu bot localmente:

  1. Vá para a pasta do seu bot em um terminal e defina seu registro npm para usar as compilações mais recentes

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

  3. Abra outro prompt de comando e vá para a pasta de projeto do bot. Execute o seguinte comando:

    ngrok http 3978
    
  4. O ngrok agora está conectado ao seu bot em execução local. Copie o endereço IP público seguro (HTTPS).

    Sucesso ngrok

Atualize seu recurso de bot

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

  1. Vá para seu recurso de bot no Azure. No menu à esquerda, em Configurações, selecione Configuração.

    1. Defina o ponto de extremidade de mensagens para o endereço IP 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 Ativar ponto de extremidade de streaming.

      Definir ponto final

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

      Gorjeta

      Se Aplicar não estiver habilitado, você poderá desmarcar Ativar ponto de extremidade de streaming e selecionar Aplicar, depois marcar Habilitar ponto de extremidade de streaming e selecionar Aplicar novamente. Você precisa certificar-se de que Ativar ponto de extremidade de streaming está marcado e a configuração do ponto de extremidade é salva.

  2. Vá para 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 esquerdo para obter o MicrosoftAppId e o MicrosoftAppPassword para o aplicativo Web associado ao seu bot.

      Obter entradas

    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 emulador, selecione Abrir Bot e insira http://localhost:3978/api/messages o URL do Bot. Preencha a ID do Aplicativo Microsoft e a senha do Aplicativo Microsoft com o mesmo MicrosoftAppId e MicrosoftAppPassword que você adicionou ao arquivo de configuração do nosso bot. Em seguida, selecione Conectar.

  4. Seu bot em execução agora está conectado ao seu recurso de bot no Azure. Para testar seu bot no Azure no Bate-papo da Web, vá para os recursos do bot, selecione Testar no Bate-papo da Web e envie mensagens para seu bot.

Ativar o modo de depuração

  1. No emulador, selecione Depurar e, em seguida, Iniciar Depuração.

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

    1. Para a ID do Aplicativo Microsoft, insira a ID do aplicativo do bot.
    2. Para obter a senha do aplicativo Microsoft, insira o segredo do aplicativo do bot.
    3. Certifique-se de que Abrir no modo de depuração também está marcado.
    4. Selecione Ligar.
  3. Com o modo de depuração ativado, o emulador gera um UUID. Um UUID é um ID exclusivo gerado sempre que você inicia o modo de depuração no seu emulador.

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

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

debug-inspection-middleware

Próximos passos