Testar agentes conversacionais utilizando o Direct Line

A Direct Line API atua como uma interface de comunicação para aplicações cliente interagirem com agentes conversacionais criados com o Copilot Studio. A Direct Line API facilita a transmissão de mensagens entre a aplicação cliente e o agente por meio de fluxos WebSocket ou pedidos HTTP. Para testes de desempenho, o Direct Line permite às ferramentas de teste de carga replicar o comportamento real do utilizador, gerar carga e medir os tempos de resposta.

Comunicação com o Direct Line através de WebSockets

Pode implementar agentes conversacionais criados com o Copilot Studio em aplicações Web, seja como iframe incorporados ou ao utilizar uma tela personalizada. Ambas as opções de implementação utilizam comunicação WebSocket com o Direct Line. Se implementar o seu agente conversacional numa aplicação utilizando um destes métodos, o seu script de teste de desempenho deverá utilizar comunicação WebSocket para gerar carga que se assemelhe ao comportamento real dos utilizadores e medir o desempenho com um elevado grau de confiança.

As aplicações cliente que utilizam Direct Line e comunicação WebSocket devem seguir este fluxo:

  1. Para iniciar uma conversação, a aplicação cliente deve primeiro obter um token de conversação. Se o seu agente estiver configurado com um Segredo do Direct Line, obtenha um token chamando o ponto final regional Direct Line. Tokens para agentes que não usam segredos podem ser obtidos a partir do ponto final do token.
  2. A aplicação cliente inicia uma conversação ao utilizar o token e recebe um ID da Conversação e um URL de fluxo WebSocket.
  3. As mensagens do utilizador são enviadas através de um pedido HTTP POST com o ID da Conversação.
  4. As mensagens do agente conversacional são recebidas através do fluxo WebSocket.

Captura de ecrã que mostra o fluxo da comunicação Direct Line utilizando WebSockets.

Comunicar com Direct Line utilizando HTTP GET

Se a sua ferramenta de testes de carga não puder utilizar comunicação WebSocket, ou se a sua aplicação destinada a clientes não utilizar comunicação WebSocket, pode receber atividades ao enviar HTTP GET em alternativa. Conforme mostrado no diagrama seguinte, o fluxo de início da conversação não muda.

Captura de ecrã que mostra o fluxo da comunicação Direct Line utilizando HTTP GET.

Medir tempos de resposta

Para avaliar como a carga afeta a experiência do utilizador, certifique-se de que os seus scripts de teste de desempenho monitorizam e reportam o tempo de resposta para os seguintes passos:

Passo Impacto na experiência de utilizador
Gerar Token O tempo que demora a iniciar uma nova conversação
Iniciar Conversação O tempo que demora a iniciar uma nova conversação
Enviar Atividade O tempo que demora a enviar uma nova mensagem do utilizador (não inclui a resposta do agente)
Receber Atividades/Obter Atividades O tempo que o agente demora a responder

Monitorizar os tempos de resposta para Gerar Token, Iniciar Conversação e Enviar Atividade é simples para as ferramentas de teste de carga, pois estes passos utilizam pedidos HTTP padrão. No entanto, medir o tempo que um agente demora a responder às mensagens do utilizador é mais complexo, devido às seguintes razões:

  • O envio e a receção de atividades pelo Direct Line segue um padrão assíncrono. Quando uma mensagem do utilizador é enviada utilizando um pedido Enviar Atividade, a resposta não é uma mensagem do agente. Em vez disso, limita-se a confirmar que a mensagem do utilizador foi publicada com sucesso.

  • Com base na sua conceção, um agente conversacional pode enviar um número variável de mensagens em resposta a uma mensagem do utilizador. Portanto, na maioria dos casos, deve medir o tempo que um agente demora a responder como o tempo decorrido entre uma mensagem do utilizador e a última mensagem do agente. No exemplo seguinte, uma única mensagem do utilizador aciona três mensagens do agente, com chamadas à API a serem executadas entre as mesmas. Cada mensagem demora cerca de dois segundos a ser entregue; no entanto, na perspetiva do utilizador, o agente demora seis segundos a responder ao pedido do utilizador.

    Captura de ecrã que mostra o tempo de resposta entre mensagens.

Identificar a última resposta do agente

Para medir o tempo que um agente demora a concluir as suas respostas, o seu script de teste de desempenho deve:

  • Identificar a última mensagem do agente que sucede a uma mensagem do utilizador
  • Calcular a diferença de tempo entre as duas

O protocolo subjacente utilizado pelo Copilot Studio não considera o conceito de "última resposta", uma vez que tanto agentes como utilizadores podem enviar mensagens em qualquer momento. Assim, o seu script de teste de desempenho deve pressupor que, se o agente não enviar uma mensagem dentro de um determinado intervalo de tempo, não serão enviadas mais mensagens até que a próxima mensagem do utilizador seja enviada. A implementação desta lógica varia dependendo de como o seu script comunica com o Direct Line.

Utilizar WebSockets

Ao comunicar com o Direct Line através de WebSockets, assuma que o agente não envia mais mensagens quando já não é possível ler mais frames do WebSocket. Isto pode ser indicado por um tempo limite ao tentar ler o frame seguinte, embora o comportamento exato dependa da sua implementação. Para uma implementação de referência que utilize WebSockets, considere utilizar HTTP GET.

Utilizar HTTP GET

Os scripts de teste de desempenho que utilizam HTTP GET em vez de WebSockets devem consultar o ponto final Atividades para obter o conjunto completo de mensagens do utilizador e do agente. Ao fazer uma consulta, certifique-se de que fornece tempo suficiente para o agente responder. Por exemplo, se o seu agente precisar de chamar uma API de back-end para responder a uma consulta do utilizador, e a API demorar até cinco segundos a responder, o seu script não deve consultar o ponto final Atividades até terem decorrido cinco segundos.

O seguinte payload simplificado representa a resposta que recebe do ponto final Atividades:

[
  {
    "type": "message",
    "id": "98SryQaHr2rGthOGpChPK2-us|0000012",
    "timestamp": "2025-01-07T09:12:22.0329242Z",
    "from": {
      "id": "a688eb7d-092a-42a8-8ef5-73123b9c2aaa",
      "name": ""
    },
    "conversation": {
      "id": "98SryQaHr2rGthOGpChPK2-us"
    },
    "text": "I also want to set up a new account",
  },
  {
    "type": "message",
    "id": "98SryQaHr2rGthOGpChPK2-us|0000017",
    "timestamp": "2025-01-07T09:12:24.5478686Z",
    "from": {
      "id": "4b56bfa5-5574-5bb3-7aa3-99b8798b9d90",
      "name": "Load Testing",
      "role": "bot"
    },
    "conversation": {
      "id": "98SryQaHr2rGthOGpChPK2-us"
    },
    "text": "Sure, please bear with me as I set up your new account",
    "replyToId": "98SryQaHr2rGthOGpChPK2-us|0000012",
  },
  {
    "type": "message",
    "id": "98SryQaHr2rGthOGpChPK2-us|0000018",
    "timestamp": "2025-01-07T09:12:33.1960413Z",
    "from": {
      "id": "4b56bfa5-5574-5bb3-7aa3-99b8798b9d90",
      "name": "Load Testing",
      "role": "bot"
    },
    "conversation": {
      "id": "98SryQaHr2rGthOGpChPK2-us"
    },
    "text": "Almost done! Thank you for your patience",
    "replyToId": "98SryQaHr2rGthOGpChPK2-us|0000012",
  },
  {
    "type": "message",
    "id": "98SryQaHr2rGthOGpChPK2-us|0000019",
    "timestamp": "2025-01-07T09:12:41.9166159Z",
    "from": {
      "id": "4b56bfa5-5574-5bb3-7aa3-99b8798b9d90",
      "name": "Load Testing",
      "role": "bot"
    },
    "conversation": {
      "id": "98SryQaHr2rGthOGpChPK2-us"
    },
    "text": "All done! Your new account is now active.",
    "inputHint": "acceptingInput",
    "replyToId": "98SryQaHr2rGthOGpChPK2-us|0000012"
  }
]

Ao analisar o payload e calcular os tempos de resposta, considere as seguintes orientações:

  • As mensagens do agente têm a propriedade role: bot, enquanto as mensagens do utilizador não têm a propriedade role.
  • As mensagens do agente enviadas em resposta às mensagens do utilizador têm a propriedade replyToId, cujo valor corresponde à propriedade id da mensagem do utilizador.
  • Pode calcular os tempos de resposta do agente como a diferença de tempo entre a mensagem do utilizador e a última mensagem do agente que responde à mensagem do utilizador.