Introdução

Melhorias no suporte a cartões e carrosséis no canais que possuem suporte nativo (Skype, Facebook);

Configuração automática para o Skype;

Simplificado o endereçamento de usuários e grupos;

Adição de tipos de diálogo no Bot Builder SDK;

Adição de Intents do LUIS (Cognitive Services) nos tipos de diálogo do SDK;

Suporte a chamadas do Skype foram adicionadas ao SDK;

Melhorias no emulador do Bot Framework;

Suporte as recentes adições de botões no Slack;

Suporte a diversas novidades do Bot no facebook.

Recentemente, a Microsoft lançou uma solução para simplificar a vida dos desenvolvedores ao criarem aplicações que simulem interações humanas, através da troca de mensagens. Essas aplicações são chamadas simplesmente de bots e a solução lançada para desenvolvê-las foi denominada de Bot Framework.Com a grande repercussão do anúncio, a versão 1.0 foi evoluindo, sendo atualizada até ao release 1.2.5 no dia 29/06/2016.Em 08/07/2016 o Framework teve atualizações e melhorias significativas e foi denominado de Versão 3.0 (atualmente encontra-se na versão 3.2) e no texto a seguir será denominada como v3. Nas seções baixo, você verá quais são as melhorias e como você pode migrar seu projeto da versão v1 para a v3.Um resumo das alterações foi publicado no blog, sendo elas:

A publicação na íntegra está disponível em: https://blog.botframework.com/2016/07/07/July-Update

Componentes

As partes que compõem o Bot Framework eram divididos em: Bot Connector (Responsável por registrar seu bot no site dev.botframework.com), Bot Builder SDKs (Conjunto de bibliotecas para o desenvolvimento) e o Bot Directory (Diretório centralizador dos bots criados, até então, na v1 estava em desenvolvimento).

A nova reestruturação da v3 não teve mudanças consideráveis, porém foi melhor dividida. Seus componentes são: Bot Builder, Developer Portal e Bot Directory. Na imagem abaixo é possível ver a divisão:





SDKs Unificados

Na versão anterior era necessário ter um template do Bot Framework instalado ou ter duas referências importadas, o Microsoft.Bot.Builder e o Microsoft.Bot.Connector. Na v3 eles foram unificados no Microsoft.Bot.Builder e podem ser instalados diretamente pelo gerenciador de pacotes do NuGet ou pelo NPM. Segue abaixo o exemplo:



NuGet: Install-Package Microsoft.Bot.Builder

NPM: npm install --save botbuilder



É importante citar que o SDK é open source e está disponível no GitHub da Microsoft, em: https://github.com/Microsoft/BotBuilder

Nomenclatura da Autenticação

Todo o bot criado deve possui um par de propriedades no arquivo Web.Config, responsáveis pela autenticação do mesmo com o portal do Bot Framework. A alteração dessa vez foi apenas no nome dessas propriedades, que deverão ser atualizadas, veja como era e como ficou:



Versão v1:

AppID

AppSecret

Versão v3:

MicrosoftAppID

MicrosoftAppPassword

Substituição da classe "Message"

A classe Message era usada na versão anterior como a base da conversação do bot (Recebendo ou respondendo utilizando um objeto desta classe). Na versão atual essa funcionalidade foi incorporada, ampliada e a classe agora chama-se Activity.



Abaixo você vê a diferença da estrutura JSON que representa a troca de mensagens na conversação:





Versão v1:



{ "type": "Message", "id": "13614ac9a46045dab28f002cc2f88e8e", "conversationId": "8a684db8", "created": "2016-08-26T02:10:18.6668939Z", "language": "pt-BR", "text": "Hello World!", "attachments": [], "from": { "name": "User1", "channelId": "emulator", "address": "User1", "id": "2c1c7fa3", "isBot": false }, "to": { "name": "ChatBot", "channelId": "emulator", "address": "ChatBot", "id": "ChatBot", "isBot": true }, "participants": [ { "name": "User1", "channelId": "emulator", "address": "User1", "id": "2c1c7fa3", "isBot": false }, { "name": "ChatBot", "channelId": "emulator", "address": "ChatBot", "id": "ChatBot", "isBot": true } ], "totalParticipants": 2, "mentions": [], "channelMessageId": "adf8b85533374d29b966b9717ca6186d", "channelConversationId": "Conv1", "hashtags": [] }





Versão v3:



{ "type": "message", "id": "c848cad62c5f437e89fe8c52a994856f", "timestamp": "2016-08-26T02:25:46.5903679Z", "serviceUrl": "http://localhost:9000/", "channelId": "emulator", "from": { "id": "2c1c7fa3", "name": "User1" }, "conversation": { "isGroup": false, "id": "8a684db8", "name": "Conv1" }, "recipient": { "id": "56800324", "name": "Bot1" }, "text": "Hello World!", "attachments": [], "entities": [] }

Endereçamento

A classepossui váriosque identificam seu comportamento. Destaque para o "typing", um recurso novo onde é possível definir que o bot está digitando uma mensagem, tornando assim a experiência muito mais humana. Na tabela abaixo estão listados os ActivityTypes

Houveram mudanças na nomenclatura de algumas classes e algumas propriedades foram incorporadas a classes, de forma a atenderem melhor as necessidades (é o caso do ChannelConversationID que passou a fazer parte da classe ConversationAccount) representado pelo objeto Conversation na classe Activity. Abaixo você visualiza a tabela de algumas alterações:









Envio de Respostas

Houve uma mudança considerável na forma como podem ser feitas as respostas das mensagens (Agora chamadas de Activities).

Agora é possível enviar mensagens em qualquer parte do código, ao contrário da versão v1 onde era necessário realizar o envio da mensagem no método Post (método chamado quando uma mensagem era recebida).

Na versão v3, duas informações essenciais são recebidas pelo Bot para que o mesmo saiba o canal pelo qual a mensagem chegou e a URL do endpoint para qual a resposta deve ser enviada. Essas propriedades são denominadas de ChannelId e ServiceUrl respectivamente.



O início de uma resposta se dá pela criação de um objeto ConnectorClient, sendo instanciado passando como parâmetro a ServiceURL da mensagem recebida, como o demonstrado no código abaixo:

var connector = new ConnectorClient(mensagemRecebida.ServiceUrl);

Responder uma mensagem recebida (Activity)

var connector = new ConnectorClient(mensagemRecebida.ServiceUrl);

var resposta = mensagemRecebida.CreateReply( "Alô Mundo!" , "pt" ); await connector.Conversations.ReplyToActivityAsync(resposta);

Enviar mensagem para a conversa

var connector = new ConnectorClient(mensagemRecebida.ServiceUrl);

IMessageActivity novaMensagem = Activity.CreateMessageActivity(); novaMensagem.Type = ActivityTypes.Message; novaMensagem.From = botAccount; novaMensagem.Conversation = conversation; novaMensagem.Recipient = userAccount; novaMensagem.Text = "Alô Mundo!" ;

await connector.Conversations.SendToConversation((Activity)novaMensagem);

Enviar múltiplas respostas

var connector = new ConnectorClient(incomingMessage.ServiceUrl); connector.Conversations.ReplyToActivity(mensagemRecebida.CreateReply( "Mensagem 1." , "pt" )); connector.Conversations.ReplyToActivity(mensagemRecebida.CreateReply( "Mensagem 2." , "pt" ));

Criação de conversas

A partir desse objeto é possível enviar mensagens de várias formas, sendo algumas delas:

Foram criados mecanismos para que seja possível iniciar uma conversa direta com algum usuário ou até mesmo em grupo. Aqui também utilizamos o ConnectorClient que deve ser instanciado com o ServiceURL que tenha sido salvo anteriormente. A conversação pode se dar de duas formas: direta ou em grupo.

Conversa direta

Aqui utiliza-se o método CreateDirectConversation() para estabelecer a conversa entre o bot e o usuário. Segue abaixo um exemplo de sua utilização:

var contaUsuario = new ChannelAccount(name: "Andre" , id: "@ALS54789" ); var connector = new ConnectorClient(mensagemRecebida.ServiceUrl); var conversationId = await connector.Conversations.CreateDirectConversationAsync(contaBot, contaUsuario);

IMessageActivity mensagem = Activity.CreateMessageActivity(); mensagem.From = botAccount; mensagem.Recipient = contaUsuario;

mensagem.Conversation = new ConversationAccount(id: conversationId.Id); mensagem.Text = "Olá" ; mensagem.Locale = "pt-BR" ;

await connector.Conversations.SendToConversation((Activity)mensagem);

Conversa em grupo

Aqui utiliza-se o método CreateConversation() para estabelecer a conversa em grupo. Segue abaixo um exemplo de sua utilização:

var connector = new ConnectorClient(mensagemRecebida.ServiceUrl);

List<ChannelAccount> participantes = new List<ChannelAccount>();

participantes.Add( new ChannelAccount( "andre@rssoft.com.br" , "Andre Secco" )); participantes.Add( new ChannelAccount( "joao@microsoft.com" , "Joao" ));



ConversationParameters cp = new ConversationParameters(message.Recipient, participantes, "Conversa em grupo" ); var conversationId = connector.Conversations.CreateConversationAsync(cp);

IMessageActivity menssagem = Activity.CreateMessageActivity(); menssagem.From = contaBot;

menssagem.Recipient = new ChannelAccount( "paulo@microsoft.com" , "Paulo" )); menssagem.Conversation = conversationId; menssagem.ChannelId = "email" ; menssagem.Text = "Olá Grupo!" ; menssagem.Locale = "pt-BR" ;

await connector.Conversations.SendToConversation((Activity)menssagem);

Armazenamento de dados (Bot State)

Migração para a versão v3

1. Criar um App ID e uma senha

Uma das atualizações que auxiliaram a organização do código foi a separação entre parte de mensageria e o armazenamento de dados/estado do bot. Na v1 você buscava e armazenava esses dados no mesmo objeto da mensagem, o que causava uma certa confusão. Na v3 isso foi desacoplado, sendo possível escolher pela utilização ou não.Toda a atividade (Activity) que é criada possui informações sobre o usuário (From) e a conversa em questão (Conversation). A partir da união dessas duas é possível rastrear e armazenar os dados de estado do bot para aquele usuário naquela conversa, através da criação de um objetoAlguns dos métodos disponíveis para a manipulação de estado estão ilustrados na imagem abaixo:É altamente recomendável que tenha uma cópia do seu código para prosseguir.A migração é feita em 3 passos:

A versão v3 exige que um novo ID e senha sejam criados pelo Developer Portal, portanto siga os passos:



a) Acesse as configurações do seu bot em http://dev.botframework.com

b) Clique no link Edit e siga para a seção "Configuration"

c) Marque o radion button Version 3.0 e em seguida clique no botão "Create Microsoft App ID and password"

d) Você será redirecionado a uma nova tela que automaticamente conterá um "ID do aplicativo" que você deve guardar. Clique no botão "Gerar senha"

e) Copie e guarde a senha gerada

f) Clique em "Concluir e voltar à estrutura do Bot"

2. Alterações no código

O campo "" será preenchido automaticamente, porém o campo "" não, pois ainda devemos atualizar nosso código para prosseguir.

Neste passo você terá que fazer uma série de modificações/melhorias, as quais foram explicadas acima. NÃO esqueça de atualizar o seu arquivo Web.config com as chaves "MicrosoftAppID" e "MicrosoftAppPassword" que foram geradas no portal. Após isso, será necessário publicar novamente seu projeto para atualizar sua API (endpoint), ou caso queira mantê-lo, publique a nova versão em um novo endereço.

3. Atualizar o registro no Developer Portal

Volte ao Developer portal e insira o endereço da sua API no campo "Messaging endpoint", mantendo a opção "Version 3.0" marcada. Clique em "Save changes". Pronto!

Conclusão

Analisando todas essas mudanças da versão 1.0 para 3.0 fica muito claro que o Bot Framework melhorou muito e está crescendo rápido graças aos feedbacks e contribuições dos desenvolvedores. A maioria das alterações citadas preocupam-se com escalabilidade e diversas boas práticas de desenvolvimento. Agora é migrar e continuar contribuindo para que a plataforma cresça e fique mais forte!

Referências

Documentação da Versão 1.0

http://docs-v1.botframework.com



Documentação da Versão 3.0

https://docs.botframework.com