Botframework-solutions: L'activité de mise à jour après la migration vers la 0.8 ne fonctionne pas

Créé le 20 mai 2020  ·  18Commentaires  ·  Source: microsoft/botframework-solutions

Quel projet est concerné ?

Projet d'assistant virtuel et projet de compétences.

C'est dans quelle langue ?

Manuscrit.

Ce qui se produit?

À partir de MS Teams Channel, lorsque vous essayez de mettre à jour une activité à partir d'une compétence, l'assistant virtuel génère une erreur.

Quelles sont les étapes pour reproduire ce problème ?

  1. Migrer le VA et la Skill vers la dernière version 0.8 de Typescript
  2. Dans le VA, nous devons implémenter une nouvelle classe "CustomSkillHandler" qui étend la classe "ChannelServiceHandler" (nous devons l'implémenter car la fonction updateActivity n'est pas implémentée dans le "SkillHandler" fourni)
  3. Dans le "CustomSkillHandler", implémentez le onUpdateActivity :
    protected async onUpdateActivity(claimsIdentity: ClaimsIdentity, conversationId: string, activityId: string, activity: Activity): Promise<ResourceResponse> {
        return await this.updateActivity(claimsIdentity, conversationId, activityId, activity);
    }

et la fonction updateActivity ressemble à ceci :

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. Dans l'index changez la déclaration 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. Testez une activité de mise à jour à partir du canal Teams.

Que vous attendiez-vous à ce qu'il se passe ?

La carte est mise à jour dans Teams

Pouvez-vous partager des journaux, des résultats d'erreur, etc. ?

L'erreur s'affiche lorsque le VA essaie de mettre à jour l'activité à partir de la fonction décrite précédemment 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)

Des captures d'écran ou un contexte supplémentaire ?

Équipes de canal

Bot Services Bug customer-replied-to customer-reported

Commentaire le plus utile

Re-bonjour @Batta32 :) Aussi celui-ci semble résolu ! Je ferai des tests plus approfondis demain, mais je semble être d'accord avec les changements dans la classe Test Skill Handler que vous avez fournis. Merci!

Tous les 18 commentaires

Merci @tommyJimmy87 d' avoir signalé ce problème, nous l'examinons toujours. Dès que nous aurons une mise à jour, nous reviendrons vers vous !

Salut @tommyjimmy87 , j'ai besoin que vous me donniez des étapes de reproduction supplémentaires de ce que vous faites afin de comprendre ce qui ne va pas car nous n'avons pas pu reproduire le problème auquel vous êtes confronté.

  1. Que veux-tu dire par The Card is updated in Teams ?
  2. Utilisez-vous l'assistant virtuel et la compétence dans la version TypeScript ?
  3. Pouvez-vous fournir les étapes de connexion/communication entre l'assistant virtuel et la compétence et comment testez-vous le CustomSkillHandler ?
  4. Utilisez-vous le [email protected] pour générer l'assistant virtuel et la compétence ?

Voici la branche avec nos dernières modifications que nous avons apportées pour reproduire ce problème.

Environnement

Étapes de reproduction

  1. Déployez une VA et une compétence en utilisant le generator-bot-virtualassistant
  2. Connectez le VA & Skill à l'aide de la commande botskills connect
  3. Créer une nouvelle classe CustomSkillHandler s'étendant de ChannelServiceHandler
  4. Ajoutez les méthodes onUpdateActivity et updateActivity sur le CustomSkillHandler
  5. Modifiez le fichier d' index pour recevoir le CustomSkillHandler
  6. Tester la connexion entre l'assistant virtuel et Skill à l'aide du canal Teams

Nous serons attentifs à votre réponse !

Salut @Batta32 , va essayer de répondre à tes questions :

  1. Je veux dire que j'essaie de mettre à jour un adaptive card dans le canal MS Teams et le résultat devrait être que la carte est mise à jour après que j'ai fait une action (la carte est dans la compétence, donc fondamentalement le test est le updateActivity de la compétence au VA).

  2. Oui, VA et Skill sont tous deux en Typescript

  3. Dans la compétence, j'ai un adaptive card , après une action de l'utilisateur, cette carte devrait être mise à jour avec un contenu différent. De la compétence que j'appelle le updateActivity :

dc.context.updateActivity(previouslySentActivity);

previouslySentActivity c'est l'activité que l'on veut mettre à jour, on sauve l'activité dans l'état afin de pouvoir la mettre à jour plus tard. Cette utilisation fonctionnait dans la version précédente, mais le flux d'activité d'envoi et de mise à jour, pour autant que je sache, a changé avec la nouvelle version.

Cela appellera le point de terminaison VA (cela fonctionne) qui devrait alors mettre à jour l'activité. L'appel arrive dans le CustomSkillHandler dans la méthode onUpdateActivity mais j'obtiens ensuite l'erreur lorsque l'activité est envoyée à MS Teams.

  1. Non, malheureusement, notre projet est déjà dans un état avancé et j'avais besoin de migrer vers la nouvelle version en conservant tous les trucs personnalisés que nous avons fait, en gros, nous avons migré manuellement. Ce qui n'est pas génial mais nécessaire.

Faites-moi savoir si vous avez besoin de plus de contexte, en attendant, je peux peut-être l'essayer également sur votre branche et vérifier si j'ai la même erreur.

Salut @Batta32 , je l'ai testé à partir de la branche que vous utilisez pour tester. J'ai créé un fork ici : https://github.com/tommyJimmy87/botframework-solutions/tree/feature/southworks/conversationid-issue
J'ai modifié votre branche pour reproduire la même erreur. Dans le testSkillHandler j'ai ajouté un try-catch pour obtenir l'erreur :

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

C'est l'erreur réelle que je reçois de l'appel updateActivity :

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

Ce qui est le même que j'obtiens dans mon projet.
Voici le test que j'ai fait :

  1. J'ai créé un nouveau dialogue à l'intérieur de l'exemple de compétence testUpdateActivityDialog où dans le beginDialog j'envoie un TestCard avec un texte. Dans le onContinueDialog j'envoie la même carte mais avec un texte différent ;

  2. Connectez le VA à la compétence.

  3. Appelez le VA avec une intention qui appellera la compétence et démarrera la boîte de dialogue de test et affichera la carte ;

  4. Appelez le VA avec une intention qui appellera la compétence et le continueDialog de la boîte de dialogue de test ;

  5. La compétence appellera le VA afin de mettre à jour la carte, puis vous obtiendrez l'erreur.

Super @tommyJimmy87 ! Nous allons le revoir avec ces nouvelles informations, merci beaucoup .

Salut @tommyJimmy87 ! Nous avons réussi à reproduire le scénario en utilisant vos dernières modifications et les étapes de reproduction mentionnées.

Nous poursuivrons nos recherches sur ce problème. Dès que nous aurons une mise à jour, nous reviendrons vers vous .

_Nous avons testé la connexion entre les bots VA & Skill en détectant le même problème lorsque les compétences envoient les informations d'activité au VA_
image

Salut @DiegoCardozo94 ,

Merci pour la mise à jour.

Avez-vous une idée de quand cela pourrait sortir?
Pensez-vous que cela puisse sortir avant le 17, puisque nous avons une sortie strictement de notre côté nous aimerions juste comprendre si la date du 17 est faisable ou pas ? :)

Merci

Salut @tommyJimmy87 , désolé pour le retard.

Nous avons réussi à valider que ce problème se produit également en C#, il ne semble donc pas être lié uniquement à TypeScript.

Nous avons trouvé de nombreux problèmes connexes :

  1. microsoft/botframework-sdk#5919 : il précise que le SkillHandler génère un faux ResourceResponse lorsqu'il transmet les activités de la compétence au canal. Cela signifie que les opérations comme update et delete ne fonctionneront pas .
  2. microsoft/botbuilder-dotnet#3686 : il détaille que la classe SkillHandler n'implémente pas OnUpdateActivityAsync .
    Si la compétence est exécutée sans assistant virtuel, les cartes sont correctement mises à jour, mais lorsqu'elles sont exécutées avec un assistant virtuel, les cartes ne sont pas mises à jour.
    Ce problème a un commentaire disant que ce problème devrait être corrigé sur la prochaine version . Vous pouvez suivre l'état des travaux dans ce microsoft/botframework-sdk#5788.
  3. officedev/botbuilder-microsoftteams#124 : il détaille qu'en utilisant un bot V3 dans Teams Channels, il échoue avec HTTP 400 Bad Request (similaire à ce problème).

Enfin et surtout, nous avons validé les scénarios suivants en utilisant les étapes mentionnées :

  • [fonctionne] Compétence TypeScript seule
  • [problème reproduit] TypeScript Virtual Assistant connecté TypeScript Skill
  • [problème reproduit] Compétence C# connectée à l'assistant virtuel TypeScript
  • [problème reproduit] Compétence TypeScript connectée à l'assistant virtuel C#
  • [problème reproduit] Compétence C# connectée à l'assistant virtuel C#

@darrenj , nous avons également répliqué ce problème en utilisant des robots C#.

Notre environnement de test :

  • Branche avec nos modifications
  • Exemple d'assistant virtuel C#
  • Exemple de compétence C#

Nos étapes de repro :

  1. Déployer les deux exemples
  2. Configurer l'assistant virtuel avec Ngrok
  3. Connecter l'assistant virtuel avec Microsoft Teams
  4. Connectez la compétence avec l'assistant virtuel
  5. Exécuter les deux échantillons
  6. Dans Microsoft Teams, envoyez bonjour à l'assistant virtuel et complétez le OnboardingDialog
  7. Boîte de dialogue Envoyer un échantillon d'exécution, l'assistant virtuel répondra avec une carte avec le texte Envoyer l'activité
  8. Envoyez un autre message à l'assistant virtuel, il lancera une exception en essayant de mettre à jour l'activité

_L'assistant virtuel lancera une exception lors de la tentative de mise à jour d'une activité_
image

_TypeScript Skill s'exécutant avec succès dans Microsoft Teams Channel, mettant à jour la carte qui a été précédemment envoyée_
image

Salut, https://github.com/microsoft/botframework-sdk/issues/5919 a besoin d'être adressé sur les 3 langues prises en charge, vous pouvez essayer si cette solution aide à utiliser l'une des versions quotidiennes à partir de demain.

Salut @Batta32 , voici quelque chose que vous devez d'abord mettre à jour, n'est-ce pas ? Ce n'est pas quelque chose que je peux déjà essayer ?

Salut @tommyJimmy87 ! Oui, nous validerons ce que mentionné pour TypeScript et C#.

Nous mettrons à jour cette branche en ajoutant les dernières mises à jour et en incorporant la version quotidienne botbuilder-v4-js-daily du SDK qui contient les fichiers microsoft/botbuilder-js#2489 et microsoft/botbuilder-dotnet#4264 .

Dès que nous aurons une mise à jour, nous reviendrons vers vous .

Salut @tommyJimmy87 , nous avons confirmé avec succès que l'application des modifications de microsoft/botbuilder-js#2489 dans le testSkillHandler ce problème est résolu et que l'activité est correctement mise à jour à l'aide du canal Microsoft Teams.

Vérifiez ce commit afin d'identifier les changements que vous devez appliquer dans votre testSkillHandler , en particulier dans la méthode processActivity .

@darrenj & @gabog - nous avons également validé avec succès les modifications de microsoft/botbuilder-dotnet#4264 à l'aide de bots C# .

Notre environnement de test :

  • Branche avec nos modifications
  • Exemple d'assistant virtuel TypeScript
  • Exemple de compétence TypeScript

Étapes de reproduction :

  1. Déployer les deux exemples
  2. Configurer l'assistant virtuel avec Ngrok
  3. Connecter l'assistant virtuel avec Microsoft Teams
  4. Connectez la compétence avec l'assistant virtuel
  5. Exécuter les deux échantillons
  6. Dans Microsoft Teams, envoyez bonjour à l'assistant virtuel et complétez le OnboardingDialog
  7. Boîte de dialogue Envoyer un échantillon d'exécution, l'assistant virtuel répondra avec une carte avec le texte Envoyer l'activité
  8. Envoyez un autre message à l'assistant virtuel, il mettra à jour la carte avec le texte Mettre à jour l'activité

Plus de détails

_Modifications apportées à la méthode processActivity de testSkillHandler_
image

_TypeScript Virtual Assistant s'exécutant avec succès dans Microsoft Teams Channel, mettant à jour la carte qui a été précédemment envoyée_
image

Nous serons attentifs à votre réponse !

Salut @Batta32 , merci pour la mise à jour, nous allons essayer cela dès que possible. Juste une question de mon côté : une version de la bibliothèque a-t-elle été modifiée ou s'agit-il simplement du commit que vous avez publié ci-dessus ? Merci

@tommyJimmy87 - Juste le commit que nous avons posté ci-dessus !

Re-bonjour @Batta32 :) Aussi celui-ci semble résolu ! Je ferai des tests plus approfondis demain, mais je semble être d'accord avec les changements dans la classe Test Skill Handler que vous avez fournis. Merci!

Merci @tommyJimmy87 ! Dès que vous pourrez le confirmer, nous pourrons clore ce problème 😊.

Salut @Batta32 ! Nous pouvons volontiers clore ce problème :)

Merci @tommyJimmy87 pour l'avoir confirmé !

@darrenj - nous pouvons clore ce problème car il a été résolu par l'équipe du SDK !

Cette page vous a été utile?
0 / 5 - 0 notes