Botframework-solutions: A atividade de atualização após a migração para o 0.8 não está funcionando

Criado em 20 mai. 2020  ·  18Comentários  ·  Fonte: microsoft/botframework-solutions

Qual projeto é afetado?

Projeto de Assistente Virtual e Projeto de Habilidade.

Em que idioma está isso?

Datilografado.

O que acontece?

No MS Teams Channel, ao tentar atualizar uma atividade de uma Habilidade, o Virtual Assistant apresentará um erro.

Quais são as etapas para reproduzir esse problema?

  1. Migre o VA e a habilidade para a última versão 0.8 do Typescript
  2. No VA, temos que implementar uma nova classe "CustomSkillHandler" que estende a classe "ChannelServiceHandler" (precisamos implementar isso porque a função updateActivity não está implementada no "SkillHandler" fornecido)
  3. Dentro do "CustomSkillHandler" implemente o onUpdateActivity :
    protected async onUpdateActivity(claimsIdentity: ClaimsIdentity, conversationId: string, activityId: string, activity: Activity): Promise<ResourceResponse> {
        return await this.updateActivity(claimsIdentity, conversationId, activityId, activity);
    }

e a função updateActivity parece com isto:

private async updateActivity(claimsIdentity: ClaimsIdentity, conversationId: string, replyToActivityId: string, activity: Activity): Promise<ResourceResponse> {

        let skillConversationReference: SkillConversationReference;
        try {
            skillConversationReference = await this.conversationIdFactory.getSkillConversationReference(conversationId);
        } catch (err) {
            // If the factory has overridden getSkillConversationReference, call the deprecated getConversationReference().
            // In this scenario, the oAuthScope paired with the ConversationReference can only be used for talking with
            // an official channel, not another bot.
            if (err.message === 'Not Implemented') {
                const conversationReference = await this.conversationIdFactory.getConversationReference(conversationId);
                skillConversationReference = {
                    conversationReference,
                    oAuthScope: JwtTokenValidation.isGovernment(this.channelService) ?
                        GovernmentConstants.ToChannelFromBotOAuthScope :
                        AuthenticationConstants.ToChannelFromBotOAuthScope
                };
            } else {
                // Re-throw all other errors. 
                throw err;
            }
        }

        if (!skillConversationReference) {
            throw new Error('skillConversationReference not found');
        }
        if (!skillConversationReference.conversationReference) {
            throw new Error('conversationReference not found.');
        }

        const activityConversationReference = TurnContext.getConversationReference(activity);

        const callback = async (context: TurnContext): Promise<void> => {
            const adapter: BotFrameworkAdapter = (context.adapter as BotFrameworkAdapter);
            // Cache the ClaimsIdentity and ConnectorClient on the context so that it's available inside of the bot's logic.
            context.turnState.set(adapter.BotIdentityKey, claimsIdentity);
            context.turnState.set(this.SkillConversationReferenceKey, activityConversationReference);
            activity = TurnContext.applyConversationReference(activity, skillConversationReference.conversationReference) as Activity;
            const client = adapter.createConnectorClient(activity.serviceUrl);
            context.turnState.set(adapter.ConnectorClientKey, client);

            context.activity.id = replyToActivityId;
            await context.updateActivity(context.activity);
            return;
        };
        AppCredentials.trustServiceUrl(skillConversationReference.conversationReference.serviceUrl);

        await (this.adapter as BotFrameworkAdapter).continueConversation(skillConversationReference.conversationReference, skillConversationReference.oAuthScope, callback);
        return { id: uuid() };
    }
  1. No índice, altere a declaração SkillHandler :
// Register the request handler.
const handler: CustomSkillHandler = new CustomSkillHandler(adapter, bot, skillConversationIdFactory, credentialProvider, authenticationConfiguration);
const skillEndpoint = new ChannelServiceRoutes(handler);
skillEndpoint.register(server, '/api/skills');

  1. Teste uma atividade de atualização do canal Teams.

O que você esperava que acontecesse?

O cartão é atualizado nas equipes

Você pode compartilhar algum registro, saída de erro, etc.?

O erro é mostrado quando o VA tenta atualizar a atividade da função descrita anteriormente onUpdateActivity .

(node:13410) UnhandledPromiseRejectionWarning: Error: Failed to decrypt conversation id
    at new RestError (/Users/xxxx/Desktop/repository/xxx/virtual-assistant/node_modules/botframework-connector/node_modules/@azure/ms-rest-js/dist/msRest.node.js:1397:28)
    at /Users/xxxx/Desktop/repository/xxx/virtual-assistant/node_modules/botframework-connector/node_modules/@azure/ms-rest-js/dist/msRest.node.js:1849:37
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:13410) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 10)

Alguma captura de tela ou contexto adicional?

Equipes de canal

Bot Services Bug customer-replied-to customer-reported

Comentários muito úteis

Oi de novo @ Batta32 :) Este também parece resolvido! Farei alguns testes mais profundos amanhã, mas parece que as mudanças na classe Test Skill Handler que você forneceu parecem estar bem. Obrigado!

Todos 18 comentários

Obrigado @ tommyJimmy87 por relatar esse problema, ainda estamos analisando. Assim que tivermos alguma atualização, entraremos em contato com você 😊!

Olá @ tommyjimmy87 , preciso que você forneça etapas adicionais de reprodução do que está fazendo para descobrir o que está errado, pois não foi possível reproduzir o problema que você está enfrentando.

  1. O que você quer dizer com The Card is updated in Teams ?
  2. Você está usando o Virtual Assistant e Skill na versão TypeScript?
  3. Você pode fornecer as etapas de conexão / comunicação entre o Virtual Assistant & Skill e como você está testando o CustomSkillHandler ?
  4. Você está usando o [email protected] para gerar o assistente virtual e a habilidade?

Aqui está o branch com nossas últimas alterações que fizemos para reproduzir este problema.

Ambiente

Etapas Repro

  1. Implante um VA e habilidade usando generator-bot-virtualassistant
  2. Conecte o VA e a habilidade usando o comando botskills connect
  3. Crie uma nova classe CustomSkillHandler estendendo de ChannelServiceHandler
  4. Adicione os métodos onUpdateActivity e updateActivity no CustomSkillHandler
  5. Modifique o arquivo de índice para receber CustomSkillHandler
  6. Teste a conexão entre o Assistente Virtual e a habilidade usando o canal Teams

Estaremos atentos à sua resposta!

Olá @ Batta32 , tentarei responder às suas perguntas:

  1. Quero dizer que estou tentando atualizar um adaptive card no canal MS Teams e o resultado deve ser que o cartão é atualizado depois que eu fiz alguma ação (o cartão está dentro da habilidade, então basicamente o teste é updateActivity da habilidade para o VA).

  2. Sim, VA e Skill estão em texto datilografado

  3. Na habilidade eu tenho um adaptive card , após uma ação do usuário este cartão deve ser atualizado com um conteúdo diferente. Pela habilidade eu chamo de updateActivity :

dc.context.updateActivity(previouslySentActivity);

previouslySentActivity é a atividade que queremos atualizar, salvamos a atividade no estado para poder atualizá-la mais tarde. Isso costumava funcionar na versão anterior, mas o fluxo de envio e atualização de atividade, pelo que eu entendi, mudou com a nova versão.

Isso chamará o ponto de extremidade VA (está funcionando), que deve atualizar a atividade. A chamada entra em CustomSkillHandler no método onUpdateActivity , mas recebo o erro quando a atividade é enviada para equipes do MS.

  1. Não, infelizmente nosso projeto já está em um estágio avançado e eu precisava migrar para a nova versão mantendo todo o material customizado que fizemos, basicamente, migramos manualmente. O que não é ótimo, mas necessário.

Deixe-me saber se você precisa de mais contexto, entretanto, talvez eu possa tentar fazer isso também no seu branch e verificar se eu tenho o mesmo erro.

Olá @ Batta32 , testei no branch que você está usando para testar. Criei um fork aqui: https://github.com/tommyJimmy87/botframework-solutions/tree/feature/southworks/conversationid-issue
Mudei seu branch para reproduzir o mesmo erro. Dentro de testSkillHandler , adicionei um try-catch para obter o erro:

            try{
                await context.updateActivity(activity);
            }catch(e){
                console.log(e);
            }

Este é o erro real que estou recebendo da chamada updateActivity :

{ body: '{"error":{"code":"ServiceError","message":"Unknown"}}',
     headers: HttpHeaders { _headersMap: [Object] },
     status: 400 },
  body: { error: { code: 'ServiceError', message: 'Unknown' } } }

Que é o mesmo que recebo no meu projeto.
Este é o teste que fiz:

  1. Eu criei um novo diálogo dentro da habilidade de amostra testUpdateActivityDialog onde no beginDialog eu envio um TestCard com um texto. No onContinueDialog envio o mesmo cartão mas com um texto diferente;

  2. Conecte o VA à habilidade.

  3. Ligue para o VA com alguma intenção que irá chamar a Habilidade e iniciar o Diálogo de Teste e mostrar o cartão;

  4. Chame o VA com alguma intenção que chamará a Habilidade e o continueDialog do Diálogo de Teste;

  5. A habilidade irá chamar o VA para atualizar o cartão e então você obterá o erro.

Ótimo @ tommyJimmy87 ! Vamos revê-lo com essas novas informações, muito obrigado 😊.

Olá @ tommyJimmy87! Reproduzimos com sucesso o cenário usando suas alterações mais recentes e as etapas de reprodução mencionadas.

Continuaremos pesquisando sobre este assunto. Assim que tivermos alguma atualização, entraremos em contato com você 😊.

_Testamos a conexão entre os bots VA e Skill detectando o mesmo problema quando as habilidades enviam as informações de atividade para o VA_
image

Olá @ DiegoCardozo94 ,

Obrigado pela atualização.

Você tem alguma ideia de quando isso será lançado?
Você acha que isso pode ser lançado antes do dia 17, já que temos uma liberação estrita de nossa parte, gostaríamos apenas de saber se a data 17 é viável ou não? :)

Obrigado

Olá @ tommyJimmy87 , desculpe pela demora.

Conseguimos validar que esse problema também ocorre em C #, portanto, parece não estar relacionado apenas ao TypeScript.

Encontramos muitos problemas relacionados :

  1. microsoft / botframework-sdk # 5919: detalha que o SkillHandler gera um falso ResourceResponse quando encaminha atividades da habilidade para o canal. Isso significa que operações como update e delete não funcionarão .
  2. microsoft / botbuilder-dotnet # 3686: detalha que a classe SkillHandler não implementa OnUpdateActivityAsync .
    Se a habilidade for executada sem um Assistente Virtual, as cartas são atualizadas corretamente, mas quando executadas conectadas a um Assistente Virtual, as cartas não são atualizadas.
    Este problema tem um comentário dizendo que ele deve ser corrigido na próxima versão . Você pode acompanhar o estado do trabalho neste microsoft / botframework-sdk # 5788.
  3. officedev / botbuilder-microsoftteams # 124: detalha que usando um bot V3 nos canais do Teams ele falha com HTTP 400 Bad Request (semelhante a este problema).

Por último, mas não menos importante, validamos os seguintes cenários usando as etapas mencionadas:

  • [funciona] TypeScript Skill alone
  • [edição reproduzida] TypeScript Virtual Assistant conectado TypeScript Skill
  • [problema reproduzido] TypeScript Virtual Assistant conectado C # Skill
  • [problema reproduzido] C # Virtual Assistant conectado ao TypeScript Skill
  • [problema reproduzido] C # Virtual Assistant conectado C # Skill

@darrenj , replicamos esse problema usando bots C # também.

Nosso ambiente de teste:

  • Ramifique com nossas modificações
  • Amostra de assistente virtual C #
  • Amostra de habilidade C #

Nossas etapas de reprodução :

  1. Implante os dois exemplos
  2. Configure o Assistente Virtual com Ngrok
  3. Conecte o Assistente Virtual com o Microsoft Teams
  4. Conecte a habilidade com o assistente virtual
  5. Execute ambas as amostras
  6. No Microsoft Teams, envie um alô para o Virtual Assistant e preencha o OnboardingDialog
  7. Caixa de diálogo Enviar amostra de execução, o Assistente Virtual responderá com um cartão com o texto Enviar Atividade
  8. Envie outra mensagem para o Assistente Virtual, ele lançará uma exceção ao tentar atualizar a atividade

_O Assistente Virtual lançará uma exceção ao tentar atualizar uma atividade_
image

_TypeScript Skill executado com sucesso no Microsoft Teams Channel, atualizando o cartão que foi enviado anteriormente_
image

Olá, https://github.com/microsoft/botframework-sdk/issues/5919 tem nee endereçado em todos os 3 idiomas suportados, você pode tentar se essa solução ajudar usando uma das compilações diárias a partir de amanhã.

Olá @ Batta32 , aqui está algo que você precisa atualizar primeiro, certo? Não é algo que eu já possa experimentar?

Olá @ tommyJimmy87! Sim, estaremos validando o que @gabog mencionou para TypeScript e C #.

Estaremos atualizando este branch adicionando as últimas atualizações e incorporando a compilação diária botbuilder-v4-js-daily do SDK que contém o microsoft / botbuilder-js # 2489 e microsoft / botbuilder-dotnet # 4264.

Assim que tivermos alguma atualização, entraremos em contato com você 😊.

Olá @ tommyJimmy87 , confirmamos com sucesso que ao aplicar as alterações de microsoft / botbuilder-js # 2489 no testSkillHandler esse problema foi resolvido e a atividade foi atualizada corretamente usando o canal Microsoft Teams.

Verifique este commit para identificar as mudanças que você deve aplicar em seu testSkillHandler , especificamente no método processActivity .

@darrenj & @gabog - validamos com sucesso as mudanças de microsoft / botbuilder-dotnet # 4264 usando bots C # também.

Nosso ambiente de teste:

  • Ramifique com nossas modificações
  • Amostra do Assistente Virtual TypeScript
  • Amostra de habilidade do TypeScript

Etapas Repro:

  1. Implante os dois exemplos
  2. Configure o Assistente Virtual com Ngrok
  3. Conecte o Assistente Virtual com o Microsoft Teams
  4. Conecte a habilidade com o assistente virtual
  5. Execute ambas as amostras
  6. No Microsoft Teams, envie um alô para o Virtual Assistant e preencha o OnboardingDialog
  7. Caixa de diálogo Enviar amostra de execução, o Assistente Virtual responderá com um cartão com o texto Enviar Atividade
  8. Envie outra mensagem para o Assistente Virtual, ele atualizará o cartão com o texto Atualizar Atividade

Mais detalhes

_Alterações feitas no método processActivity de testSkillHandler_
image

_TypeScript Virtual Assistant sendo executado com sucesso no Microsoft Teams Channel, atualizando o cartão que foi enviado anteriormente_
image

Estaremos atentos à sua resposta!

Olá @ Batta32 , obrigado pela atualização, vamos tentar isso o mais

@ tommyJimmy87 - Apenas o commit que postamos acima!

Oi de novo @ Batta32 :) Este também parece resolvido! Farei alguns testes mais profundos amanhã, mas parece que as mudanças na classe Test Skill Handler que você forneceu parecem estar bem. Obrigado!

Obrigado @ tommyJimmy87! Assim que você confirmar isso, podemos encerrar este problema 😊.

Olá @ Batta32! Podemos encerrar este problema com prazer :)

Obrigado @ tommyJimmy87 por confirmar isso!

@darrenj - podemos encerrar esse problema, pois foi resolvido pela equipe do SDK!

Esta página foi útil?
0 / 5 - 0 avaliações