Criar um Assistente Virtual

Assistente Virtual é um modelo de software livre da Microsoft que permite criar uma solução de conversação robusta, mantendo o controle total da experiência do usuário, da identidade visual organizacional e dos dados necessários. O modelo de núcleo do Assistente Virtual é o bloco de construção básico que reúne as tecnologias da Microsoft necessárias para criar um Assistente Virtual, incluindo o SDK do Bot Framework, Reconhecimento vocal (LUIS), e QnA Maker. Ele também reúne as funcionalidades essenciais, incluindo registro de habilidades, contas vinculadas, intenção conversacional básica para oferecer uma gama de interações e experiências perfeitas aos usuários. Além disso, os recursos de modelo incluem exemplos avançados de habilidades de conversação reutilizáveis. As habilidades individuais são integradas em uma Assistente Virtual para habilitar vários cenários. Usando o SDK do Bot Framework, as habilidades são apresentadas no formulário de código-fonte, permitindo que você personalize e estenda conforme necessário. Para obter mais informações sobre as habilidades do Bot Framework, consulte O que é uma habilidade Bot Framework. Este documento orienta você sobre as Assistente Virtual de implementação para organizações, como criar um Assistente Virtual com foco no Teams, exemplo relacionado, exemplo de código e limitações de Assistente Virtual. A imagem a seguir exibe a visão geral do assistente virtual:

Diagrama que mostra a visão geral do Assistente Virtual.

As atividades de mensagem de texto são roteadas para habilidades associadas pelo núcleo do Assistente Virtual usando um modelo de expedição.

Considerações sobre implementação

A decisão de adicionar um Assistente Virtual inclui muitos determinantes e difere para cada organização. Os fatores de suporte de uma Assistente Virtual para sua organização são os seguintes:

  • Uma equipe central gerencia todas as experiências dos funcionários. Ele tem a capacidade de criar uma experiência Assistente Virtual e gerenciar atualizações para a experiência principal, incluindo a adição de novas habilidades.
  • Existem vários aplicativos entre funções de negócios e o número deve crescer no futuro.
  • Os aplicativos existentes são personalizáveis, pertencentes à organização, e são convertidos em habilidades para um Assistente Virtual.
  • A equipe central de experiências de funcionários é capaz de influenciar personalizações para aplicativos existentes. Ele também fornece as diretrizes necessárias para integrar aplicativos existentes como habilidades Assistente Virtual experiência.

A imagem a seguir exibe as funções de negócios Assistente Virtual:

Diagrama que mostra que a equipe central mantém as assistente e as equipes de funções empresariais contribuem com habilidades.

Criar um grupo voltado para o Teams Assistente Virtual

A Microsoft publicou um modelo da Microsoft para criar assistentes virtuais e habilidades. Com o modelo, você pode criar um Assistente Virtual, alimentado por uma experiência baseada em texto com suporte para cartões avançados limitados com ações. Aprimoramos o modelo para incluir os recursos da plataforma do Microsoft Teams e alimentar ótimas experiências de aplicativo do Teams. Alguns dos recursos incluem suporte para cartões adaptáveis avançados, caixas de diálogo (conhecidos como módulos de tarefa no TeamsJS v1.x), equipes ou chats em grupo e extensões de mensagens. Para obter mais informações sobre como estender o Assistente Virtual para o Microsoft Teams, consulte Tutorial: Estenda Seu Assistente Virtual para o Microsoft Teams. A imagem a seguir exibe o diagrama de alto nível de uma Assistente Virtual solução:

Diagrama que mostra a solução do Assistente Virtual.

Adicione Cartões Adaptáveis ao seu Assistente Virtual

Para expedir solicitações corretamente, Assistente Virtual deve identificar o modelo LUIS correto e a habilidade correspondente associada a ele. No entanto, o mecanismo de expedição não pode ser usado para atividades de ação cartão, pois o modelo LUIS associado a uma habilidade é treinado para cartão textos de ação. Os textos de ação do cartão são palavras-chave fixas predefinida e não comentadas de um usuário.

Essa desvantagem é resolvida inserindo informações de habilidade na carga de ação do cartão. Todas as habilidades devem ser inseridas skillId no value campo de ações de cartão. Você deve garantir que cada atividade de ação do cartão transporte as informações de habilidade relevantes e Assistente Virtual pode utilizar essas informações para expedição.

Você deve fornecer skillId no construtor para garantir que as informações de habilidade estejam sempre presentes nas ações do cartão. Um código de exemplo de dados de ação de cartão é mostrado na seção a seguir:

    public class CardActionData
    {
        public CardActionData(string skillId)
        {
            this.SkillId = skillId;
        }

        [JsonProperty("skillId")]
        public string SkillId { get; set; }
    }

    ...
    var button = new CardAction
    {
        Type = ActionTypes.MessageBack,
        Title = "Card action button",
        Text = "card action button text",
        Value = new CardActionData(<SkillId>),
    };

Em seguida, SkillCardActionData no modelo Assistente Virtual é introduzida para extrair skillId da carga de ação do cartão. Um snippet de código a ser extraído skillId de cartão carga de ação é mostrado na seção a seguir:

    // Skill Card action data should contain skillId parameter
    // This class is used to deserialize it and get skillId 
    public class SkillCardActionData
    {
        /// <summary>
        /// Gets the ID of the skil that should handle this card
        /// </summary>
        [JsonProperty("skillId")]
        public string SkillId { get; set; }
    }

A implementação é feita por um método de extensão na classe Atividade. Um snippet de código a ser extraído skillId de cartão dados de ação é mostrado na seção a seguir:

    public static class ActivityExtensions
    {
        // Fetches skillId from CardAction data if present
        public static string GetSkillId(this Activity activity)
        {
            string skillId = string.Empty;

            try
            {
                if (activity.Type.Equals(ActivityTypes.Message) && activity.Value != null)
                {
                    var data = JsonConvert.DeserializeObject<SkillCardActionData>(activity.Value.ToString());
                    skillId = data.SkillId;
                }
                else if (activity.Type.Equals(ActivityTypes.Invoke) && activity.Value != null)
                {
                    var data = JsonConvert.DeserializeObject<SkillCardActionData>(JObject.Parse(activity.Value.ToString()).SelectToken("data").ToString());
                    skillId = data.SkillId;
                }
            }
            catch
            {
                // If not able to retrive skillId, empty skillId should be returned
            }

            return skillId;
        }
    }

Lidar com interrupções

Assistente Virtual pode lidar com interrupções em casos em que um usuário tenta invocar uma habilidade enquanto outra habilidade está ativa no momento. TeamsSkillDialog e TeamsSwitchSkillDialog são introduzidos com base no SkillDialog e SwitchSkillDialog do Bot Framework. Eles permitem que os usuários alternem uma experiência de habilidade de ações de cartão. Para lidar com essa solicitação, o Assistente Virtual solicita ao usuário uma mensagem de confirmação para alternar as habilidades:

Captura de tela do prompt de confirmação ao alternar para uma nova habilidade.

Manipular solicitações de caixa de diálogo

Para adicionar recursos de caixa de diálogo a um Assistente Virtual, dois métodos adicionais são incluídos no manipulador de atividades do Assistente Virtual: OnTeamsTaskModuleFetchAsync e OnTeamsTaskModuleSubmitAsync. Esses métodos escutam atividades relacionadas à caixa de diálogo do Assistente Virtual, identificam a habilidade associada à solicitação e encaminham a solicitação para a habilidade identificada.

O encaminhamento de solicitação é feito por meio do método SkillHttpClient, PostActivityAsync. Ele retorna a resposta como InvokeResponse, que é analisada e convertida em TaskModuleResponse .

    public static TaskModuleResponse GetTaskModuleRespose(this InvokeResponse invokeResponse)
    {
        if (invokeResponse.Body != null)
        {
            return new TaskModuleResponse()
            {
                Task = GetTask(invokeResponse.Body),
            };
        }

        return null;
    }

    private static TaskModuleResponseBase GetTask(object invokeResponseBody)
        {
            JObject resposeBody = (JObject)JToken.FromObject(invokeResponseBody);
            var task = resposeBody.GetValue("task");
            var taskType = task.SelectToken("type").ToString();

            return taskType switch
            {
                "continue" => new TaskModuleContinueResponse()
                {
                    Type = taskType,
                    Value = task.SelectToken("value").ToObject<TaskModuleTaskInfo>(),
                },
                "message" => new TaskModuleMessageResponse()
                {
                    Type = taskType,
                    Value = task.SelectToken("value").ToString(),
                },
                _ => null,
            };
        }

Uma abordagem semelhante é seguida para cartão respostas de expedição e caixa de diálogo de ações. Os dados de ação de busca e envio da caixa de diálogo são atualizados para incluir skillId. O método GetSkillId Activity Extension extrai skillId da carga, que fornece detalhes sobre a habilidade que precisa ser invocada.

O trecho de código para métodos OnTeamsTaskModuleFetchAsync e OnTeamsTaskModuleSubmitAsync são fornecidos na seção a seguir:

    // Invoked when a "task/fetch" event is received to invoke dialog.
    protected override async Task<TaskModuleResponse> OnTeamsTaskModuleFetchAsync(ITurnContext<IInvokeActivity> turnContext, TaskModuleRequest taskModuleRequest, CancellationToken cancellationToken)
    {
        try
        {
            string skillId = (turnContext.Activity as Activity).GetSkillId();
            var skill = _skillsConfig.Skills.Where(s => s.Value.AppId == skillId).First().Value;

            // Forward request to correct skill
            var invokeResponse = await _skillHttpClient.PostActivityAsync(this._appId, skill, _skillsConfig.SkillHostEndpoint, turnContext.Activity as Activity, cancellationToken);

            return invokeResponse.GetTaskModuleResponse();
        }
        catch (Exception exception)
        {
            await turnContext.SendActivityAsync(_templateEngine.GenerateActivityForLocale("ErrorMessage"));
            _telemetryClient.TrackException(exception);

            return null;
        }
    }

    // Invoked when a 'task/submit' invoke activity is received for dialog submit actions.
    protected override async Task<TaskModuleResponse> OnTeamsTaskModuleSubmitAsync(ITurnContext<IInvokeActivity> turnContext, TaskModuleRequest taskModuleRequest, CancellationToken cancellationToken)
    {
        try
        {
            string skillId = (turnContext.Activity as Activity).GetSkillId();
            var skill = _skillsConfig.Skills.Where(s => s.Value.AppId == skillId).First().Value;

            // Forward request to correct skill
            var invokeResponse = await _skillHttpClient.PostActivityAsync(this._appId, skill, _skillsConfig.SkillHostEndpoint, turnContext.Activity as Activity, cancellationToken).ConfigureAwait(false);

            return invokeResponse.GetTaskModuleRespose();
        }
        catch (Exception exception)
        {
            await turnContext.SendActivityAsync(_templateEngine.GenerateActivityForLocale("ErrorMessage"));
            _telemetryClient.TrackException(exception);

            return null;
        }
    }

Além disso, você deve incluir todos os domínios de habilidade na validDomains seção no arquivo de manifesto do aplicativo do Assistente Virtual para que as caixas de diálogo invocadas por meio de uma renderização de habilidades sejam corretamente.

Manipular escopos de aplicativo colaborativos

Os aplicativos do Teams podem existir em vários escopos, incluindo chat 1:1, chat em grupo e canais. O modelo do núcleo do Assistente Virtual foi projetado para chats individuais. Como parte da experiência de integração, Assistente Virtual solicita aos usuários o nome e mantém o estado do usuário. Como a experiência de integração não é adequada para escopos de chat em grupo ou canal, ela foi removida.

As habilidades devem lidar com atividades em vários escopos, como chat 1:1, chat em grupo e conversa de canal. Se algum desses escopos não tiver suporte, as habilidades devem responder com uma mensagem apropriada.

As seguintes funções de processamento foram adicionadas ao núcleo do Assistente Virtual:

  • Assistente Virtual pode ser invocado sem qualquer mensagem de texto de um chat em grupo ou canal.
  • Os erros são limpos antes de enviar a mensagem para o módulo de expedição. Por exemplo, remova o necessário @mention do bot.
    if (innerDc.Context.Activity.Conversation?.IsGroup == true)
    {
        // Remove bot atmentions for teams/groupchat scope
        innerDc.Context.Activity.RemoveRecipientMention();

        // If bot is invoked without any text, reply with FirstPromptMessage
        if (string.IsNullOrWhiteSpace(innerDc.Context.Activity.Text))
        {
            await innerDc.Context.SendActivityAsync(_templateEngine.GenerateActivityForLocale("FirstPromptMessage"));
            return EndOfTurn;
        }
    }

Manipular extensões de mensagem

Os comandos para uma extensão de mensagem são declarados no arquivo de manifesto do aplicativo. A interface do usuário da extensão de mensagem é ativada por esses comandos. Para que Assistente Virtual um comando de extensão de mensagem como uma habilidade anexada, Assistente Virtual manifesto de uma Assistente Virtual deve conter esses comandos. Você deve adicionar os comandos do manifesto de uma habilidade individual ao Assistente Virtual manifesto do usuário. A ID do comando fornece informações sobre uma habilidade associada acrescentando a ID do aplicativo da habilidade por meio de um separador :.

O trecho do arquivo de manifesto de uma habilidade é mostrado na seção a seguir:

 "composeExtensions": [
    {
        "botId": "<Skil_App_Id>",
        "commands": [
            {
                "id": "searchQuery",
                "context": [ "compose", "commandBox" ],
                "description": "Test command to run query",
                 ....}
         ]
     }
 ]
                 

O trecho de código do arquivo de manifesto correspondente do Assistente Virtual é mostrado na seção a seguir:

 "composeExtensions": [
    {
        "botId": "<VA_App_Id>",
        "commands": [
            {
                "id": "searchQuery:<skill_id>",
                "context": [ "compose", "commandBox" ],
                "description": "Test command to run query",
                 ....}
         ]
     }
 ]
 

Depois que os comandos forem invocados por um usuário, o Assistente Virtual poderá identificar uma habilidade associada analisando a ID de comando, atualizar a atividade removendo o sufixo :<skill_id> extra da ID de comando e encaminhá-la para a habilidade correspondente. O código de uma habilidade não precisa lidar com o sufixo extra. Portanto, conflitos entre IDs de comando entre habilidades são evitados. Com essa abordagem, todos os comandos de pesquisa e ação de uma habilidade em todos os contextos, como compose, commandBox e message são alimentados por um Assistente Virtual.

    const string MessagingExtensionCommandIdSeparator = ":";

    // Invoked when a 'composeExtension/submitAction' invoke activity is received for a messaging extension action command
    protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionSubmitActionAsync(ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
    {
        return await ForwardMessagingExtensionActionCommandActivityToSkill(turnContext, action, cancellationToken);
    }

    // Forwards invoke activity to right skill for messaging extension action commands.
    private async Task<MessagingExtensionActionResponse> ForwardMessagingExtensionActionCommandActivityToSkill(ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
    {
        var skillId = ExtractSkillIdFromMessagingExtensionActionCommand(turnContext, action);
        var skill = _skillsConfig.Skills.Where(s => s.Value.AppId == skillId).First().Value;
        var invokeResponse = await _skillHttpClient.PostActivityAsync(this._appId, skill, _skillsConfig.SkillHostEndpoint, turnContext.Activity as Activity, cancellationToken).ConfigureAwait(false);

        return invokeResponse.GetMessagingExtensionActionResponse();
    }

    // Extracts skill Id from messaging extension command and updates activity value
    private string ExtractSkillIdFromMessagingExtensionActionCommand(ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action)
    {
        var commandArray = action.CommandId.Split(MessagingExtensionCommandIdSeparator);
        var skillId = commandArray.Last();

        // Update activity value by removing skill id before forwarding to the skill.
        var activityValue = JsonConvert.DeserializeObject<MessagingExtensionAction>(turnContext.Activity.Value.ToString());
        activityValue.CommandId = string.Join(MessagingExtensionCommandIdSeparator, commandArray, 0 commandArray.Length - 1);
        turnContext.Activity.Value = activityValue;

        return skillId;
    }

Algumas atividades de extensão de mensagem não incluem a ID de comando. Por exemplo, composeExtensions/selectItem contém apenas o valor da ação de toque de invocação. Para identificar a habilidade associada, skillId é anexado a cada item cartão ao formar uma resposta para OnTeamsMessagingExtensionQueryAsync. Isso é semelhante à abordagem para adicionar cartões adaptáveis ao assistente virtual.

    // Invoked when a 'composeExtension/selectItem' invoke activity is received for compose extension query command.
    protected override async Task<MessagingExtensionResponse> OnTeamsMessagingExtensionSelectItemAsync(ITurnContext<IInvokeActivity> turnContext, JObject query, CancellationToken cancellationToken)
    {
        var data = JsonConvert.DeserializeObject<SkillCardActionData>(query.ToString());
        var skill = _skillsConfig.Skills.Where(s => s.Value.AppId == data.SkillId).First().Value;
        var invokeResponse = await _skillHttpClient.PostActivityAsync(this._appId, skill, _skillsConfig.SkillHostEndpoint, turnContext.Activity as Activity, cancellationToken).ConfigureAwait(false);

        return invokeResponse.GetMessagingExtensionResponse();
    }

Exemplo

O exemplo a seguir mostra como converter o modelo de aplicativo Book-a-room em uma habilidade de Assistente Virtual: o Book-a-room é um Teams que permite que os usuários encontrem e reservem rapidamente uma sala de reunião por 30, 60 ou 90 minutos a partir do momento atual. O tempo padrão é de 30 minutos. O bot agendar uma sala tem escopos para conversas pessoais ou 1:1. A imagem a seguir exibe um Assistente Virtual com uma habilidade agendar uma sala:

A captura de tela mostra um Assistente Virtual com um livro de uma habilidade de sala.

A seguir estão as alterações delta introduzidas para convertê-la em uma habilidade, que é anexada a um Assistente Virtual. Diretrizes semelhantes são seguidas para converter qualquer bot v4 existente em uma habilidade.

Manifesto de habilidade

Um manifesto de habilidade é um arquivo JSON que expõe o ponto de extremidade de mensagens, a ID, o nome e outros metadados relevantes de uma habilidade. Esse manifesto é diferente do manifesto usado para carregamento de aplicativo personalizado no Teams. Um Assistente Virtual requer um caminho para esse arquivo como uma entrada para anexar uma habilidade. Adicionamos o manifesto a seguir à pasta wwwroot do bot.

botskills connect --remoteManifest "<url to skill's manifest>" ..
{
  "$schema": "https://schemas.botframework.com/schemas/skills/skill-manifest-2.1.preview-0.json",
  "$id": "microsoft_teams_apps_bookaroom",
  "name": "microsoft-teams-apps-bookaroom",
  "description": "microsoft-teams-apps-bookaroom description",
  "publisherName": "Your Company",
  "version": "1.1",
  "iconUrl": "<icon url>",
  "copyright": "Copyright (c) Microsoft Corporation. All rights reserved.",
  "license": "",
  "privacyUrl": "<privacy url>",
  "endpoints": [
    {
      "name": "production",
      "protocol": "BotFrameworkV3",
      "description": "Production endpoint for the skill",
      "endpointUrl": "<endpoint url>",
      "msAppId": "skill app id"
    }
  ],
  "dispatchModels": {
    "languages": {
      "en-us": [
        {
          "id": "microsoft-teams-apps-bookaroom-en",
          "name": "microsoft-teams-apps-bookaroom LU (English)",
          "contentType": "application/lu",
          "url": "file://book-a-meeting.lu",
          "description": "English language model for the skill"
        }
      ]
    }
  },
  "activities": {
    "message": {
      "type": "message",
      "description": "Receives the users utterance and attempts to resolve it using the skill's LU models"
    }
  }
}

Integração do LUIS

Assistente Virtual modelo de expedição da Assistente Virtual é criado com base nos modelos LUIS das habilidades anexadas. O modelo de expedição identifica a intenção de cada atividade de texto e descobre a habilidade associada a ela.

Assistente Virtual requer o modelo LUIS da habilidade no formato .lu como uma entrada ao anexar uma habilidade. LUIS json é convertido em .lu formato usando a ferramenta botframework-cli.

botskills connect --remoteManifest "<url to skill's manifest>" --luisFolder "<path to the folder containing your Skill's .lu files>" --languages "en-us" --cs
npm i -g @microsoft/botframework-cli
bf luis:convert --in <pathToLUIS.json> --out <pathToLuFile>

O bot agendar uma sala tem dois comandos principais para os usuários:

  • Book room
  • Manage Favorites

Criamos um modelo LUIS compreendendo esses dois comandos. Os segredos correspondentes devem ser preenchidos em cognitivemodels.json. O arquivo JSON do LUIS correspondente é encontrado aqui. O arquivo .lu correspondente é mostrado na seção a seguir:

> ! Automatically generated by [LUDown CLI](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown), Tue Mar 31 2020 17:30:32 GMT+0530 (India Standard Time)

> ! Source LUIS JSON file: book-a-meeting.json

> ! Source QnA TSV file: Not Specified

> ! Source QnA Alterations file: Not Specified


> # Intent definitions

## BOOK ROOM
- book a room
- book room
- please book a room
- reserve a room
- i want to book a room
- i want to book a room please
- get me a room please
- get me a room


## MANAGE FAVORITES
- manage favorites
- manage favorite
- please manage my favorite rooms
- manage my favorite rooms please
- manage my favorite rooms
- i want to manage my favorite rooms

## None


> # Entity definitions


> # PREBUILT Entity definitions


> # Phrase list definitions


> # List entities

> # RegEx entities

Com essa abordagem, qualquer comando emitido por um usuário para Assistente Virtual relacionado a book room ou manage favorites são identificados como um comando associado ao bot Book-a-room e são encaminhados para essa habilidade. Por outro lado, Book-a-room room o bot precisa usar o modelo LUIS para entender esses comandos se eles não forem tipado completos. Por exemplo: I want to manage my favorite rooms.

Suporte a vários idiomas

Por exemplo, um modelo LUIS com apenas cultura em inglês é criado. Você pode criar modelos LUIS correspondentes a outros idiomas e adicionar entrada a cognitivemodels.json.

{
  "defaultLocale": "en-us",
  "languageModels": {
    "en-us": {
      "luisAppId": "",
      "luisApiKey": "",
      "luisApiHost": ""
    },
    "<your_language_culture>": {
      "luisAppId": "",
      "luisApiKey": "",
      "luisApiHost": ""
    }
  }
}

Em paralelo, adicione o arquivo .lu no caminho luisFolder. A estrutura de pastas deve ser a seguinte:

| - luisFolder

        | - en-us

                | - book-a-meeting.lu

        | - your_language_culture

                | - book-a-meeting.lu

Para modificar languages o parâmetro, atualize o comando de habilidades do bot da seguinte maneira:

botskills connect --remoteManifest "<url to skill's manifest>" --luisFolder "<path to luisFolder>" --languages "en-us, your_language_culture" --cs

Assistente Virtual usa SetLocaleMiddleware para identificar a localidade atual e invocar o modelo de expedição correspondente. A atividade da estrutura do bot tem o campo local, que é usado por esse middleware. Você também pode usar o mesmo para sua habilidade. O bot book-a-room não usa esse middleware e, em vez disso, obtém a localidade da entidade clientInfo da atividade do Bot framework.

Validação de declaração

Adicionamos declaraçõesValidator para restringir os chamadores à habilidade. Para permitir que um Assistente Virtual chame essa habilidade, preencha a matriz AllowedCallers de appsettings com a ID do aplicativo Assistente Virtual específica.

"AllowedCallers": [ "<caller_VA1_appId>", "<caller_VA2_appId>" ],

A matriz de chamadores permitidos pode restringir quais consumidores de habilidades podem acessar a habilidade. Adicione uma única entrada * a essa matriz para aceitar chamadas de qualquer consumidor de habilidades.

"AllowedCallers": [ "*" ],

Para obter mais informações sobre como adicionar validação de declarações a uma habilidade, consulte adicionar validação de declarações à habilidade.

Limitação da atualização do cartão

A atualização da atividade, como cartão atualização ainda não tem suporte por meio do Assistente Virtual (problema do github). Portanto, substituímos todas as chamadas UpdateActivityAsync de atualização cartão por postar novas chamadas SendActivityAsynccartão .

Ações de cartão e fluxos de diálogo

Para encaminhar cartão ação ou atividades de diálogo para uma habilidade associada, a habilidade deve ser inserida skillId nela. Book-a-roombot cartão ação, busca de diálogo e envio de cargas de ação são modificados para conter skillId como um parâmetro.

Para obter mais informações, consulte Adicionar cartões adaptáveis ao assistente virtual.

Manipular atividades do chat em grupo ou do escopo do canal

Book-a-room bot foi projetado para chats privados, como apenas escopo pessoal ou 1:1. Como personalizamos o Assistente Virtual para dar suporte aos escopos de canal e chat em grupo, o Assistente Virtual deve ser invocado dos escopos do canal e, portanto, o bot Book-a-room deve obter atividades para o mesmo escopo. PortantoBook-a-roombot é personalizado para lidar com essas atividades. Você pode encontrar a verificação nos métodos OnMessageActivityAsync do manipulador de atividade do bot Book-a-room.

    protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
    {
        // Check if activities are from groupchat/ teams scope. This might happen when the bot is consumed by Virtual Assistant.
        if (turnContext.Activity.Conversation.IsGroup == true)
        {
            await ShowNotSupportedInGroupChatCardAsync(turnContext).ConfigureAwait(false);
        }
        else
        {
            ...
        }
    }

Você também pode usar as habilidades existentes do repositório Bot Framework Solutions ou criar uma nova habilidade completamente do zero. Para criar uma nova habilidade, consulte tutoriais para criar uma nova habilidade. Para documentação de arquitetura de assistente virtual e de habilidades, consulte Assistente Virtual e arquitetura de habilidades.

Limitações de Assistente Virtual

  • EndOfConversation: Uma habilidade deve enviar uma atividade endOfConversation quando terminar uma conversa. Com base na atividade, um Assistente Virtual termina o contexto com essa habilidade específica e volta Assistente Virtual contexto raiz do usuário. Para o bot Book-a-room, não há um estado claro em que a conversa seja encerrada. Portanto, não enviamos endOfConversation do Book-a-room bot e quando o usuário deseja voltar ao contexto raiz, ele pode fazer isso por start over comando.
  • Atualização de cartão: ainda não há suporte para atualização de cartão por meio do Assistente Virtual.
  • Extensões de mensagem:
    • Atualmente, um Assistente Virtual pode dar suporte a no máximo 10 comandos para extensões de mensagem.
    • A configuração de extensões de mensagem não tem escopo para comandos individuais, mas para toda a extensão em si. Isso limita a configuração de cada habilidade individual por meio Assistente Virtual.
    • As IDs de comando de extensões de mensagem têm um comprimento máximo de 64 caracteres e 37 caracteres são usados para inserir informações de habilidade. Assim, as restrições atualizadas para a ID de comando são limitadas a 27 caracteres.

Você também pode usar as habilidades existentes do repositório Bot Framework Solutions ou criar uma nova habilidade completamente do zero. Tutoriais para o posterior podem ser encontrados aqui. Consulte a documentação para Assistente Virtual e arquitetura de habilidades.

Exemplo de código

Nome de exemplo Descrição .NET
Modelo do Visual Studio atualizado Modelo personalizado para dar suporte a recursos de equipes. View
Código de habilidade do bot agendar uma sala Permite que você encontre e reserve rapidamente uma sala de reunião em qualquer lugar. Exibir

Confira também