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.
Os bots existentes criados com o SDK para Java continuarão a funcionar.
Para a criação de novos bots, considere usar o Microsoft Copilot Studio e leia sobre como escolher a solução de copiloto certa.
Para obter mais informações, confira O futuro da criação de bots.
Pré-requisitos
- Conhecimento de bots Middleware e do Estado de gerenciamento
- Conhecimento de como depurar um bot com SDK primeiro e testar e depurar com o Emulator
- Instalar Bot Framework Emulator
- Um Túnel de Desenvolvimento de instalação (se você quiser depurar um bot configurado no Azure para usar outros canais)
- Uma cópia da amostra do bot de inspeção em C#, Java ou Python
Atualizar o Emulator para a última versão
Antes de usar o middleware de inspeção de bot para depurar seu bot, atualize seu emulador para a versão 4.15 ou posterior. 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:
Navegue até o diretório do bot em um terminal e execute o seguinte comando para executar o seu bot localmente:
dotnet run
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.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.
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.
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:
Inspecionar o estado de um bot configurado no Azure
Se você quiser inspecionar o estado do bot configurado no Azure e conectado a canais (como o Teams), precisará instalar e executar os Túneis de Desenvolvimento.
Executar devtunnel
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 devtunnel e configurar seu bot local. Antes de executar o devtunnel, você precisa executar seu bot localmente.
Para executar seu bot localmente:
Navegue até a pasta do bot em um terminal e defina o registro do npm para usar os builds mais recentes
Execute o bot localmente. Você verá o bot expor um número da porta como
3978
.Abra outro prompt de comando e navegue até a pasta do projeto do seu bot. Execute o comando a seguir:
devtunnel host -a -p 3978
O devtunnel agora está conectado ao bot em execução localmente. Copie a URL pública segura (HTTPS).
Atualize o recurso de seu bot
Agora que o bot local está conectado ao devtunnel, você pode configurar o recurso de bot no Azure para usar a URL do devtunnel.
Acesse o recurso do seu bot no portal do Azure. No menu à esquerda, em Configurações selecione Configuração.
Defina o endpoint de mensagens como o endereço de URL do devtunnel que você copiou. Se necessário, adicione /api/messages após o endereço IP. Por exemplo,
https://0qg12llz-3978.usw2.devtunnels.ms/api/messages
.Selecione Habilitar ponto de extremidade de streaming.
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.
Vá até o grupo de recursos do seu bot.
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.
Atualize o arquivo de configuração do bot (appsettings.json para C# ou .env para JavaScript) com o MicrosoftAppId e o MicrosoftAppPassword.
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.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
Em seu Emulator, selecione Depurar e Iniciar Depuração.
Insira a URL do devtunnel (não se esqueça de adicionar /api/messages) para a URL do Bot (por exemplo,
https://4jj51x75-51865.usw2.devtunnels.ms/api/messages
).- Em ID do ID do aplicativo da Microsoft, insira a ID do aplicativo do bot.
- Em senha do Aplicativo da Microsoft, insira o segredo do aplicativo do bot.
- Verifique se a opção Abrir no modo de depuração também está marcada.
- Selecione Conectar.
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.
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.
Próximas etapas
- Saiba como Depurar seu bot usando arquivos de transcrição.
- Saiba como Depurar uma habilidade ou um consumidor de habilidades.