Mensagens em conversas de bot
Cada mensagem numa conversação é um Activity
objeto do tipo messageType: message
. Quando um utilizador envia uma mensagem, o Microsoft Teams publica a atividade da mensagem no seu bot. O Teams envia um objeto JSON para o ponto final de mensagens do bot e o Teams permite apenas um ponto final para mensagens. Seu bot examina a mensagem para determinar seu tipo e responde adequadamente.
As conversações básicas são processadas através do conector do Bot Framework, uma única API REST. Esta API permite que o bot comunique com o Teams e outros canais. O SDK do Bot Builder fornece as seguintes funcionalidades:
- Acesso fácil ao conector do Bot Framework.
- Funcionalidade para gerir o fluxo e o estado da conversação.
- Formas simples de incorporar serviços cognitivos, como o processamento de linguagem natural (NLP).
O bot recebe mensagens do Teams através da Text
propriedade e envia respostas de mensagens individuais ou múltiplas aos utilizadores.
Para obter mais informações, veja Atribuição de utilizador para mensagens de bot.
A tabela seguinte lista a atividade que o bot pode receber e tomar medidas:
Tipo | Objeto payload | Escopo |
---|---|---|
Receber uma atividade de mensagem | Atividade de mensagens | Todos |
Receber atividade de edição de mensagens | Atividade de edição de mensagens | Todos |
Receber atividade de não eliminação de mensagens | Atividade de anular eliminação de mensagens | Todos |
Receber atividade de mensagem de eliminação recuperável | Atividade de eliminação recuperável de mensagens | Todos |
Receber uma atividade de mensagem
Para receber uma mensagem sms, utilize a Text
propriedade de um Activity
objeto. No manipulador de atividades do bot, alterne o contexto do objeto Activity
para ler uma única solicitação de mensagem.
O código seguinte mostra um exemplo de como receber uma atividade de mensagem:
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
// Sends an activity to the sender of the incoming activity.
await turnContext.SendActivityAsync(MessageFactory.Text($"Echo: {turnContext.Activity.Text}"), cancellationToken);
}
Receber um recibo de leitura
A definição Recibos de leitura no Teams permite que o remetente de uma mensagem de chat seja notificado quando a mensagem foi lida pelo destinatário em conversas um-a-um e em grupo. Depois de o destinatário ler a mensagem, é apresentada a mensagem Vista junto à mensagem. Também tem a opção de configurar o bot para receber eventos de recibos de leitura através da definição Recibos de leitura. O evento de recibo de leitura ajuda-o a melhorar a experiência do utilizador das seguintes formas:
Pode configurar o bot para enviar uma mensagem de seguimento se o utilizador da sua aplicação não tiver lido a mensagem no chat pessoal.
Pode criar um ciclo de comentários com recibos de leitura para otimizar a experiência do bot.
Observação
- Os recibos de leitura são suportados apenas em cenários de chat de utilizador para bot.
- Os recibos de leitura para bots não suportam âmbitos de chat de equipa, canal e grupo.
- Se um administrador de inquilinos ou utilizador desativar a definição Recibos de leitura, o bot não recebe o evento de recibo de leitura.
Para receber eventos de recibos de leitura para o bot, certifique-se do seguinte:
- Adicione a permissão RSC
ChatMessageReadReceipt.Read.Chat
no manifesto da aplicação, da seguinte forma:
"webApplicationInfo": {
"id": "38f0ca43-1c38-4c39-8097e-47f62c686500",
"resource": ""
},
"authorization": {
"permissions": {
"orgwide": [],
"resourceSpecific": [
{
"name": "ChatMessageReadReceipt.Read.Chat",
"type": "Application"
}
]
}
}
Também pode adicionar permissões RSC através de API do Graph. Para obter mais informações, confira consentedPermissionSet
.
Substitua o método
OnTeamsReadReceiptAsync
peloIsMessageRead
processador.O
IsMessageRead
método auxiliar é útil para determinar se a mensagem é lida pelos destinatários. Se forcompareMessageId
menor ou igual aLastReadMessageId
, significa que a mensagem foi lida. Substitua oOnTeamsReadReceiptAsync
método para receber recibos de leitura comIsMessageRead
o método auxiliar:protected override async Task OnTeamsReadReceiptAsync(ReadReceiptInfo readReceiptInfo, ITurnContext<IEventActivity> turnContext, CancellationToken cancellationToken) { var lastReadMessageId = readReceiptInfo.LastReadMessageId; if (IsMessageRead("{id of the message that you care}", LastReadMessageId)) { await turnContext.SendActivityAsync(MessageFactory.Text("User read the bot's message"), cancellationToken); } }
Segue-se um exemplo de pedido de evento de recibos de leitura que um bot recebe:
{ "name": "application/vnd.microsoft.readReceipt", "type": "event", "timestamp": "2023-08-16T17:23:11.1366686Z", "id": "f:b4783e72-9d7b-2ed9-ccef-ab446c873007", "channelId": "msteams", "serviceUrl": "https://smba.trafficmanager.net/amer/", "from": { "id": "29:1-8Iuh70W9pRqV8tQK8o2nVjxz33RRGDKLf4Bh7gKnrzN8s7e4vCyrFwjkPbTCX_Co8c4aXwWvq3RBLr-WkkVMw", "aadObjectId": "5b649834-7412-4cce-9e69-176e95a394f5" }, "conversation": { "conversationType": "personal", "tenantId": "6babcaad-604b-40ac-a9d7-9fd97c0b779f", "id": "a:1xlimp68NSUxEqK0ap2rXuwC9ITauHgV2M4RaDPkeRhV8qMaFn-RyilMZ62YiVdqs8pp43yQaRKvv_U2S2gOS5nM-y_pOxVe4BW1qMGPtqD0Bv3pw-nJXF0zhDlZHMZ1Z" }, "recipient": { "id": "28:9901a8b6-4fef-428b-80b1-ddb59361adeb", "name": "Test Bot" }, "channelData": { "tenant": { "id": "6babcaad-604b-40ac-a9d7-9fd97c0b779f" } }, "value": { "lastReadMessageId": "1692206589131" } }
A definição de administrador de recibos de leitura ou a definição de utilizador está ativada para o inquilino para que o bot receba os eventos de recibo de leitura. O administrador do inquilino ou o utilizador têm de ativar ou desativar a definição de recibo de leitura.
Depois de o bot estar ativado num cenário de chat de bot de um utilizador, o bot recebe prontamente um evento de recibo de leitura quando o utilizador ler a mensagem do bot. Pode controlar a interação do utilizador ao contar o número de eventos e também pode enviar uma mensagem com suporte para o contexto.
Enviar uma mensagem
Para enviar uma mensagem sms, especifique a cadeia que pretende enviar como uma atividade. No processador de atividade do bot, utilize o método do objeto de SendActivityAsync
contexto turn para enviar uma única resposta de mensagem. Utilize o método do SendActivitiesAsync
objeto para enviar várias respostas.
O código seguinte mostra um exemplo de envio de uma mensagem quando um utilizador é adicionado a uma conversação:
protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
// Sends an activity to the sender of the incoming activity.
await turnContext.SendActivityAsync(MessageFactory.Text($"Hello and welcome!"), cancellationToken);
}
Observação
- A divisão de mensagens ocorre quando uma mensagem sms e um anexo são enviados no mesmo payload de atividade. O Teams divide esta atividade em duas atividades separadas, uma com uma mensagem de texto e outra com um anexo. À medida que a atividade é dividida, não recebe o ID da mensagem em resposta, que é utilizado para atualizar ou eliminar a mensagem proativamente. Recomenda-se que envie atividades separadas em vez de depender da divisão de mensagens.
- As mensagens enviadas podem ser localizadas para fornecer personalização. Para obter mais informações, veja Localizar a sua aplicação.
As mensagens enviadas entre utilizadores e bots incluem dados de canal internos na mensagem. Estes dados permitem que o bot comunique corretamente nesse canal. O SDK do Bot Builder permite-lhe modificar a estrutura da mensagem.
Obter atividade de edição de mensagens
Quando edita uma mensagem, o bot recebe uma notificação da atividade editar mensagem.
Para obter uma notificação de atividade de edição de mensagens num bot, pode substituir OnTeamsMessageEditAsync
o processador.
Segue-se um exemplo de uma notificação de atividade de edição de mensagens que utiliza OnTeamsMessageEditAsync
quando uma mensagem enviada é editada:
protected override async Task OnTeamsMessageEditAsync(ITurnContext<IMessageUpdateActivity> turnContext, CancellationToken cancellationToken)
{
var replyActivity = MessageFactory.Text("message is updated");
await turnContext.SendActivityAsync(replyActivity, cancellationToken);
}
Obter atividade de anular eliminação de mensagens
Quando anula a eliminação de uma mensagem, o bot recebe uma notificação da atividade de anular a eliminação da mensagem.
Para obter uma notificação de atividade de anulação de eliminação de mensagens num bot, pode substituir OnTeamsMessageUndeleteAsync
o processador.
Segue-se um exemplo de uma notificação de atividade de não eliminação de mensagens que utiliza OnTeamsMessageUndeleteAsync
quando uma mensagem eliminada é restaurada:
protected override async Task OnTeamsMessageUndeleteAsync(ITurnContext<IMessageUpdateActivity> turnContext, CancellationToken cancellationToken)
{
var replyActivity = MessageFactory.Text("message is undeleted");
await turnContext.SendActivityAsync(replyActivity, cancellationToken);
}
Obter atividade de mensagens de eliminação recuperável
Quando elimina uma mensagem de forma recuperável, o bot recebe uma notificação da atividade da mensagem de eliminação recuperável.
Para obter uma notificação de atividade de mensagem de eliminação recuperável num bot, pode substituir OnTeamsMessageSoftDeleteAsync
o processador.
Segue-se um exemplo de uma notificação de atividade de eliminação recuperável de mensagens que utiliza OnTeamsMessageSoftDeleteAsync
quando uma mensagem é eliminada de forma recuperável:
protected override async Task OnTeamsMessageSoftDeleteAsync(ITurnContext<IMessageDeleteActivity> turnContext, CancellationToken cancellationToken)
{
var replyActivity = MessageFactory.Text("message is soft deleted");
await turnContext.SendActivityAsync(replyActivity, cancellationToken);
}
Enviar ações sugeridas
As ações sugeridas ajudam os utilizadores com ideias sobre o que perguntar a seguir, com base na resposta ou conversação anterior. O bot deve oferecer sugestões específicas de contexto ao utilizador, em vez de sugestões genéricas ou fixas. Pode utilizar o grande modelo de linguagem (LLM) do bot para gerar até três sugestões, juntamente com as respetivas respostas. Em seguida, pode extrair estas sugestões e apresentá-las como opções para o utilizador escolher.
Quando um utilizador seleciona um botão, este permanece visível e acessível nos cartões avançados. No entanto, para as ações sugeridas, os botões são concebidos para desaparecer após a seleção para impedir que o utilizador selecione opções obsoletas que podem já não ser relevantes.
Observação
-
SuggestedActions
só são suportados para bots de chat um-para-um com mensagens baseadas em texto e Cartões Ajustáveis. -
SuggestedActions
não são suportados para bots de chat com anexos para qualquer tipo de conversação. -
imBack
é o único tipo de ação suportado e o Teams apresenta até três ações sugeridas.
Para adicionar ações sugeridas a uma mensagem, especifique uma lista de card objetos de ação que representam os botões a serem apresentados ao utilizador para a sugestedActions
propriedade do objeto de atividade.
Segue-se um exemplo para implementar e experimentar ações sugeridas:
{
"type": "message",
"from": {
"id": "12345678",
"name": "sender's name"
},
"conversation": {
"id": "abcd1234",
"name": "conversation's name"
},
"recipient": {
"id": "1234abcd",
"name": "recipient's name"
},
"text": "What are the tasks for the day.",
"inputHint": "expectingInput",
"suggestedActions": {
"actions": [
{
"type": "imBack",
"title": "Create a new query identifying overdue tasks",
"value": "Create a new query identifying overdue tasks"
},
{
"type": "imBack",
"title": "Create a new work item for this feature",
"value": "Create a new work item for this feature"
}
]
},
"replyToId": "5d5cdc723"
}
O seguinte ilustra um exemplo de ações sugeridas:
Dados do canal do Teams
O channelData
objeto contém informações específicas do Teams e é uma origem definitiva para IDs de equipa e de canal. Opcionalmente, pode colocar em cache e utilizar estes IDs como chaves para o armazenamento local. O TeamsActivityHandler
no SDK obtém informações importantes do channelData
objeto para torná-lo acessível. No entanto, pode sempre aceder aos dados originais a turnContext
partir do objeto.
O channelData
objeto não está incluído em mensagens em conversações pessoais, uma vez que estas ocorrem fora de um canal.
Um objeto típico channelData
numa atividade enviada para o bot contém as seguintes informações:
-
eventType
: Tipo de evento do Teams transmitido apenas em casos de eventos de modificação de canais. -
tenant.id
: Microsoft Entra ID de inquilino transmitido em todos os contextos. -
team
: transmitido apenas em contextos de canal e não em conversas pessoais.-
id
: GUID para o canal. -
name
: nome da equipa transmitido apenas em casos de eventos de mudança de nome da equipa.
-
-
channel
: transmitido apenas em contextos de canal, quando o bot é mencionado ou para eventos em canais em equipas, onde o bot é adicionado.-
id
: GUID para o canal. -
name
: nome do canal transmitido apenas em casos de eventos de modificação do canal.
-
-
channelData.teamsTeamId
: Preterido. Esta propriedade só está incluída para retrocompatibilidade. -
channelData.teamsChannelId
: Preterido. Esta propriedade só está incluída para retrocompatibilidade.
Exemplo de channelData object
O código seguinte mostra um exemplo do objeto channelData (channelCreated event):
"channelData": {
"eventType": "channelCreated",
"tenant": {
"id": "72f988bf-86f1-41af-91ab-2d7cd011db47"
},
"channel": {
"id": "19:693ecdb923ac4458a5c23661b505fc84@thread.skype",
"name": "My New Channel"
},
"team": {
"id": "19:693ecdb923ac4458a5c23661b505fc84@thread.skype"
}
}
Conteúdo da mensagem
As mensagens recebidas ou enviadas para o bot podem incluir diferentes tipos de conteúdo de mensagens.
Formatar | Do usuário para o bot | Do bot para o usuário | Observações |
---|---|---|---|
Rich text | ✔️ | ✔️ | Seu bot pode enviar rich text, imagens e cartões. Os usuários podem enviar rich text e imagens para seu bot. |
Imagens | ✔️ | ✔️ | Máximo de 1024 × 1024 píxeis e 1 MB no formato PNG, JPEG ou GIF. Não suporta o GIF animado. |
Cartões | ❌ | ✔️ | Veja Referência de card do Teams para cartões suportados. |
Emojis | ✔️ | ✔️ | O Teams suporta emojis através de UTF-16, como U+1F600 para sorrisos. |
Mensagens de imagem
Para melhorar a sua mensagem, pode incluir imagens como anexos dessa mensagem. Para obter mais informações sobre anexos, consulte Adicionar anexos multimédia a mensagens.
As imagens podem ter, no máximo, 1024 × 1024 píxeis e 1 MB no formato PNG, JPEG ou GIF. Não há suporte para GIF animado.
Especifique a altura e a largura de cada imagem com XML. Em Markdown, o tamanho da imagem é predefinido para 256×256. Por exemplo:
- Utilize:
<img src="http://aka.ms/Fo983c" alt="Duck on a rock" height="150" width="223"></img>
. - Não utilize:
![Duck on a rock](http://aka.ms/Fo983c)
.
Um bot de conversação pode incluir Cartões Ajustáveis que simplificam os fluxos de trabalho empresariais. Os Cartões Ajustáveis oferecem texto, voz, imagens, botões e campos de entrada personalizáveis avançados.
Cartões Adaptáveis
Os Cartões Ajustáveis podem ser criados num bot e apresentados em várias aplicações, como o Teams, o seu site, etc. Para obter mais informações, Cartões Adaptáveis.
O código seguinte mostra um exemplo de envio de um Cartão Adaptável simples:
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.5",
"body": [
{
"items": [
{
"size": "large",
"text": " Simple Adaptivecard Example with a Textbox",
"type": "TextBlock",
"weight": "bolder",
"wrap": true
},
],
"spacing": "extraLarge",
"type": "Container",
"verticalContentAlignment": "center"
}
]
}
Adicionar notificações à sua mensagem
Existem duas formas de enviar uma notificação a partir da sua aplicação:
- Ao definir a
Notification.Alert
propriedade na mensagem do bot. - Ao enviar uma notificação do feed de atividades com o API do Graph.
Pode adicionar notificações à sua mensagem com a Notification.Alert
propriedade . As notificações alertam os utilizadores para um evento na sua aplicação, como novas tarefas, menções ou comentários. Estes alertas estão relacionados com aquilo em que os utilizadores estão a trabalhar ou o que têm de ver ao inserir um aviso no respetivo feed de atividades. Para que as notificações acionem a partir da mensagem do bot, defina a TeamsChannelData
propriedade objects Notification.Alert
como true. Se uma notificação for levantada, depende das definições individuais do Teams do utilizador e não pode substituir estas definições.
Se quiser gerar uma notificação arbitrária sem enviar uma mensagem ao utilizador, pode utilizar o API do Graph. Para obter mais informações, veja como enviar notificações do feed de atividades com API do Graph juntamente com as melhores práticas.
Observação
O campo Resumo apresenta qualquer texto do utilizador como uma mensagem de notificação no feed.
O código seguinte mostra um exemplo de adição de notificações à sua mensagem:
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
// Returns a simple text message.
var message = MessageFactory.Text("You'll get a notification, if you've turned them on.");
message.TeamsNotifyUser();
// Sends an activity to the sender of the incoming activity.
await turnContext.SendActivityAsync(message);
}
Códigos de estado das APIs de conversação do bot
Certifique-se de que lida com estes erros adequadamente na sua aplicação Teams. A tabela seguinte lista os códigos de erro e as descrições nas quais os erros são gerados:
Código de status | Código de erro e valores de mensagens | Descrição | Pedido de repetição | Ação de programador |
---|---|---|---|---|
400 |
Código: Bad Argument Mensagem: *cenário específico |
Payload de pedido inválido fornecido pelo bot. Veja a mensagem de erro para obter detalhes específicos. | Não | Reavalie o payload do pedido para erros. Verifique a mensagem de erro devolvida para obter detalhes. |
401 |
Código: BotNotRegistered Mensagem: Não foi encontrado nenhum registo para este bot. |
O registo deste bot não foi encontrado. | Não | Verifique o ID e a palavra-passe do bot. Confirme que o ID do bot (Microsoft Entra ID) está registado no Portal do Programador do Teams ou através do registo do canal de bot do Azure no Azure com o canal "Teams" ativado. |
403 |
Código: BotDisabledByAdmin Mensagem: O administrador de inquilinos desativou este bot |
O administrador do inquilino bloqueou as interações entre o utilizador e a aplicação de bot. O administrador de inquilinos tem de permitir a aplicação para o utilizador dentro das políticas de aplicações. Para obter mais informações, veja Políticas de aplicações. | Não | Pare a publicação na conversação até que a interação com o bot seja explicitamente iniciada por um utilizador na conversação que indica que o bot já não está bloqueado. |
403 |
Código: BotNotInConversationRoster Mensagem: O bot não faz parte da lista de conversações. |
O bot não faz parte da conversação. A aplicação tem de ser reinstalada na conversação. | Não | Antes de tentar enviar outro pedido de conversação, aguarde por um installationUpdate evento, que indica que o bot é adicionado novamente. |
403 |
Código: ConversationBlockedByUser Mensagem: O utilizador bloqueou a conversação com o bot. |
O utilizador bloqueou o bot no chat pessoal ou num canal através das definições de moderação. | Não | Elimine a conversação da cache. Pare de tentar publicar em conversações até que a interação com o bot seja explicitamente iniciada por um utilizador na conversação, indicando que o bot já não está bloqueado. |
403 |
Código: ForbiddenOperationException Mensagem: O bot não está instalado no âmbito pessoal do utilizador |
A mensagem proativa é enviada por um bot, que não está instalado num âmbito pessoal. | Não | Antes de tentar enviar outro pedido de conversação, instale a aplicação no âmbito pessoal. |
403 |
Código: InvalidBotApiHost Mensagem: Anfitrião de API de bot inválido. Para inquilinos GCC, chame https://smba.infra.gcc.teams.microsoft.com . |
O bot chamou o ponto final da API pública para uma conversação que pertence a um inquilino GCC. | Não | Atualize o URL do serviço para a conversação e https://smba.infra.gcc.teams.microsoft.com repita o pedido. |
403 |
Código: NotEnoughPermissions Mensagem: *cenário específico |
O bot não tem as permissões necessárias para efetuar a ação pedida. | Não | Determine a ação necessária da mensagem de erro. |
404 |
Código: ActivityNotFoundInConversation Mensagem: Conversação não encontrada. |
Não foi possível localizar o ID da mensagem fornecida na conversação. A mensagem não existe ou é eliminada. | Não | Verifique se o ID da mensagem enviada é um valor esperado. Remova o ID se tiver sido colocado em cache. |
404 |
Código: ConversationNotFound Mensagem: Conversação não encontrada. |
A conversação não foi encontrada porque não existe ou é eliminada. | Não | Verifique se o ID de conversação enviado é um valor esperado. Remova o ID se tiver sido colocado em cache. |
412 |
Código: PreconditionFailed Mensagem: Falha na pré-condição. Tente novamente. |
Uma condição prévia falhou numa das nossas dependências devido a várias operações simultâneas na mesma conversação. | Sim | Repita com um recuo exponencial. |
413 |
Código: MessageSizeTooBig Mensagem: Tamanho da mensagem demasiado grande. |
O tamanho do pedido recebido era demasiado grande. Para obter mais informações, consulte Formatar as mensagens do bot. | Não | Reduza o tamanho do payload. |
429 |
Código: Throttled Mensagem: Demasiados pedidos. Também devolve quando tentar novamente depois. |
Demasiados pedidos enviados pelo bot. Para obter mais informações, veja Limite de taxa. | Sim | Repita a utilização do cabeçalho Retry-After para determinar o tempo de trás. |
500 |
Código: ServiceError Mensagem: *vários |
Erro de servidor interno. | Não | Comunicar o problema na comunidade de programadores. |
502 |
Código: ServiceError Mensagem: *vários |
Problema de dependência do serviço. | Sim | Repita com um recuo exponencial. Se o problema persistir, comunique o problema na comunidade de programadores. |
503 | O serviço não está disponível. | Sim | Repita com um recuo exponencial. Se o problema persistir, comunique o problema na comunidade de programadores. | |
504 | Tempo Limite do Gateway. | Sim | Repita com um recuo exponencial. Se o problema persistir, comunique o problema na comunidade de programadores. |
Documentação de orientação de repetição dos códigos de estado
As orientações gerais de repetição para cada código de status estão listadas na tabela seguinte. O bot tem de evitar repetir status códigos que não estão especificados:
Código de status | Estratégia de repetição |
---|---|
403 | Repita ao chamar a API https://smba.infra.gcc.teams.microsoft.com GCC para InvalidBotApiHost . |
412 | Repita com o recuo exponencial. |
429 | Repita a utilização do cabeçalho Retry-After para determinar o tempo de espera em segundos e entre os pedidos, se disponível. Caso contrário, repita a utilização de um backoff exponencial com o ID do thread, se possível. |
502 | Repita com o recuo exponencial. |
503 | Repita com o recuo exponencial. |
504 | Repita com o recuo exponencial. |
Exemplo de código
Nome do exemplo | Descrição | Node.js | .NETCore | Python | .NET | Manifesto |
---|---|---|---|---|---|---|
Bot de conversas do Teams | Esta aplicação de exemplo mostra como utilizar diferentes eventos de conversação de bot disponíveis no Bot Framework v4. | View | View | Exibir | NA | Exibir |
Localização de aplicações do Teams | Este exemplo mostra a localização da aplicação Teams com o bot e o separador. | View | NA | NA | Exibir | NA |