Botframework-solutions: Update-Aktivität nach der Migration auf 0.8 funktioniert nicht

Erstellt am 20. Mai 2020  ·  18Kommentare  ·  Quelle: microsoft/botframework-solutions

Welches Projekt ist betroffen?

Virtuelles Assistentenprojekt und Skill-Projekt.

In welcher Sprache ist das?

Typoskript.

Was geschieht?

Beim Versuch, eine Aktivität von einem Skill aus zu aktualisieren, gibt der virtuelle Assistent im MS Teams-Kanal einen Fehler aus.

Was sind die Schritte, um dieses Problem zu reproduzieren?

  1. Migrieren Sie die VA und den Skill auf die neueste Version 0.8 von Typescript
  2. In der VA müssen wir eine neue Klasse "CustomSkillHandler" implementieren, die die Klasse "ChannelServiceHandler" erweitert (wir müssen dies implementieren, da die Funktion updateActivity nicht im bereitgestellten "SkillHandler" implementiert ist)
  3. Implementieren Sie im "CustomSkillHandler" die onUpdateActivity :
    protected async onUpdateActivity(claimsIdentity: ClaimsIdentity, conversationId: string, activityId: string, activity: Activity): Promise<ResourceResponse> {
        return await this.updateActivity(claimsIdentity, conversationId, activityId, activity);
    }

und die Funktion updateActivity sieht so aus:

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. Ändern Sie im Index die Deklaration 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. Testen Sie eine Update-Aktivität aus dem Teams-Kanal.

Was haben Sie erwartet?

Die Karte wird in Teams aktualisiert

Können Sie Protokolle, Fehlerausgaben usw. freigeben?

Der Fehler wird angezeigt, wenn die VA versucht, die Aktivität aus der zuvor beschriebenen Funktion onUpdateActivity zu aktualisieren.

(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)

Irgendwelche Screenshots oder zusätzlichen Kontext?

Kanalteams

Bot Services Bug customer-replied-to customer-reported

Hilfreichster Kommentar

Hi nochmal @Batta32 :) Auch dieser sieht aus wie gelöst! Ich werde morgen noch ein paar eingehendere Tests durchführen, aber die Änderungen in der von Ihnen bereitgestellten Test-Skill-Handler-Klasse scheinen in Ordnung zu sein. Vielen Dank!

Alle 18 Kommentare

Danke @tommyJimmy87 für die Meldung dieses Problems, wir überprüfen es noch. Sobald wir ein Update haben, melden wir uns wieder !

Hallo @tommyjimmy87 , ich brauche Sie, um zusätzliche Repro-Schritte zu geben, was Sie tun, um herauszufinden, was falsch ist, da wir das Problem, mit dem Sie konfrontiert sind, nicht reproduzieren

  1. Was meinst du mit The Card is updated in Teams ?
  2. Verwenden Sie den virtuellen Assistenten und die Fähigkeit in der TypeScript-Version?
  3. Können Sie die Verbindungs-/Kommunikationsschritte zwischen dem virtuellen Assistenten und dem Skill bereitstellen und wie testen Sie das CustomSkillHandler ?
  4. Verwenden Sie [email protected] , um den virtuellen Assistenten und den Skill zu generieren?

Hier ist der Zweig mit unseren neuesten Änderungen , die wir vorgenommen haben, um dieses Problem zu reproduzieren.

Umfeld

Repro-Schritte

  1. Stellen Sie eine VA und einen Skill mit dem generator-bot-virtualassistant bereit
  2. Verbinden Sie VA und Skill mit dem Befehl botskills connect
  3. Erstellen Sie eine neue CustomSkillHandler- Klasse, die von ChannelServiceHandler erweitert wird
  4. Fügen Sie die Methoden onUpdateActivity und updateActivity auf dem CustomSkillHandler
  5. Ändern Sie die Indexdatei , um die CustomSkillHandler
  6. Testen Sie die Verbindung zwischen dem virtuellen Assistenten und dem Skill mithilfe des Teams-Kanals

Wir werden auf Ihre Antwort aufmerksam sein!

Hallo @Batta32 , werde versuchen, deine Fragen zu beantworten:

  1. Ich meine, dass ich versuche, ein adaptive card im MS Teams-Kanal zu aktualisieren, und das Ergebnis sollte sein, dass die Karte aktualisiert wird, nachdem ich eine Aktion ausgeführt habe (die Karte befindet sich innerhalb des Skills, also ist der Test im Grunde der updateActivity vom Skill zum VA).

  2. Ja, sowohl VA als auch Skill sind in Typoskript

  3. Im Skill habe ich ein adaptive card , nach einer Aktion des Benutzers soll diese Karte mit anderen Inhalten aktualisiert werden. Von der Fertigkeit nenne ich die updateActivity :

dc.context.updateActivity(previouslySentActivity);

previouslySentActivity Es ist die Aktivität, die wir aktualisieren möchten. Wir speichern die Aktivität im Status, um sie später aktualisieren zu können. Dies funktionierte in der vorherigen Version, aber der Ablauf der Sende- und Aktualisierungsaktivitäten hat sich meines Wissens mit der neuen Version geändert.

Dadurch wird der VA-Endpunkt aufgerufen (dies funktioniert), der dann die Aktivität aktualisieren sollte. Der Anruf kommt in CustomSkillHandler in der Methode onUpdateActivity , aber dann erhalte ich den Fehler, wenn die Aktivität an MS Teams gesendet wird.

  1. Nein, leider befindet sich unser Projekt bereits in einem fortgeschrittenen Status und ich musste auf die neue Version migrieren, wobei alle benutzerdefinierten Dinge beibehalten wurden, die wir im Grunde manuell migriert haben. Was nicht toll ist, aber notwendig.

Lassen Sie es mich wissen, wenn Sie mehr Kontext benötigen, vielleicht kann ich dies auch in Ihrem Zweig ausprobieren und prüfen, ob ich den gleichen Fehler habe.

Hallo @Batta32 , ich habe es von dem Zweig aus getestet, den Sie zum Testen verwenden. Ich habe hier einen Fork erstellt: https://github.com/tommyJimmy87/botframework-solutions/tree/feature/southworks/conversationid-issue
Ich habe Ihren Zweig geändert, um den gleichen Fehler zu reproduzieren. Innerhalb von testSkillHandler ich einen try-catch hinzugefügt, um den Fehler zu erhalten:

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

Dies ist der eigentliche Fehler, den ich beim updateActivity Aufruf erhalte:

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

Das gleiche erhalte ich in meinem Projekt.
Dies ist der Test, den ich gemacht habe:

  1. Ich habe einen neuen Dialog innerhalb der Beispiel-Skill testUpdateActivityDialog wo ich im beginDialog ein TestCard mit einem Text sende. Im onContinueDialog schicke ich dieselbe Karte, aber mit einem anderen Text;

  2. Verbinden Sie die VA mit dem Skill.

  3. Rufen Sie die VA mit einer bestimmten Absicht an, die den Skill aufruft und den Testdialog startet und die Karte zeigt;

  4. Rufen Sie die VA mit einer bestimmten Absicht auf, die den Skill und die continueDialog des Testdialogs aufruft;

  5. Der Skill ruft die VA an, um die Karte zu aktualisieren, und dann erhalten Sie den Fehler.

Großartig @tommyJimmy87 ! Wir werden es mit diesen neuen Informationen überprüfen, vielen Dank 😊.

Hallo @tommyJimmy87! Wir haben das Szenario mit Ihren neuesten Änderungen und den genannten Repro-Schritten erfolgreich reproduziert .

Wir werden weiter zu diesem Thema forschen. Sobald wir ein Update haben, melden wir uns wieder .

_Wir haben die Verbindung zwischen den VA- und Skill-Bots getestet und das gleiche Problem festgestellt, wenn der Skill die Aktivitätsinformationen an die VA sendet_
image

Hallo @DiegoCardozo94 ,

Danke für das Update.

Hast du eine Ahnung, wann das veröffentlicht werden könnte?
Glaubst du, dass dies vor dem 17. veröffentlicht werden kann, da wir eine strenge Veröffentlichung von unserer Seite haben, möchten wir nur verstehen, ob der 17. Termin machbar ist oder nicht? :)

Vielen Dank

Hallo @tommyJimmy87 , Entschuldigung für die Verzögerung.

Wir haben es geschafft zu bestätigen , dass dieses Problem in C # geschieht auch so scheint es , nicht nur auf Typoskript zusammenzuhängen.

Wir haben einige viele verwandte Probleme gefunden :

  1. microsoft/botframework-sdk#5919: Es zeigt, dass SkillHandler ein gefälschtes ResourceResponse generiert, wenn es Aktivitäten vom Skill an den Kanal weiterleitet. Das bedeutet, dass Operationen wie update und delete nicht funktionieren .
  2. microsoft/botbuilder-dotnet#3686: es beschreibt, dass die Klasse SkillHandler OnUpdateActivityAsync nicht implementiert.
    Wenn der Skill ohne einen virtuellen Assistenten ausgeführt wird, werden die Karten korrekt aktualisiert, aber wenn er mit einem virtuellen Assistenten verbunden ist, werden die Karten nicht aktualisiert.
    Dieses Problem enthält einen Kommentar, der besagt, dass dieses Problem in der nächsten Version behoben werden sollte. Sie können den Stand der Arbeit in diesem microsoft/botframework-sdk#5788 verfolgen.
  3. officedev/botbuilder-microsoftteams#124: Es beschreibt, dass die Verwendung eines V3-Bots in Teams-Kanälen mit HTTP 400 Bad Request fehlschlägt (ähnlich wie bei diesem Problem).

Zu guter Letzt haben wir die folgenden Szenarien anhand der genannten Schritte validiert:

  • [funktioniert] TypeScript Skill allein
  • [Problem reproduziert] TypeScript Virtual Assistant verbunden mit TypeScript Skill
  • [Problem reproduziert] TypeScript Virtual Assistant verbunden mit C# Skill
  • [Problem reproduziert] C# Virtual Assistant verbunden mit TypeScript Skill
  • [Problem reproduziert] C# Virtual Assistant verbunden mit C# Skill

@darrenj , wir haben dieses Problem auch mit C# repliziert .

Unsere Testumgebung:

  • Verzweigen Sie mit unseren Modifikationen
  • Beispiel für einen virtuellen C#-Assistenten
  • C#-Skill-Beispiel

Unsere Repro-Schritte :

  1. Stellen Sie beide Beispiele bereit
  2. Richten Sie den virtuellen Assistenten mit Ngrok . ein
  3. Verbinden Sie den virtuellen Assistenten mit Microsoft Teams
  4. Verbinde den Skill mit dem virtuellen Assistenten
  5. Führen Sie beide Proben aus
  6. Senden Sie in Microsoft Teams Hallo an den virtuellen Assistenten und schließen Sie den OnboardingDialog ab
  7. Im Dialogfeld Laufprobe senden antwortet der virtuelle Assistent mit einer Karte mit dem Text Aktivität senden
  8. Senden Sie eine weitere Nachricht an den virtuellen Assistenten, es wird eine Ausnahme ausgelöst, wenn versucht wird, die Aktivität zu aktualisieren

_Der virtuelle Assistent löst eine Ausnahme aus, wenn er versucht, eine Aktivität zu aktualisieren_
image

_TypeScript Skill wird erfolgreich im Microsoft Teams Channel ausgeführt und aktualisiert die zuvor gesendete Karte_
image

Hallo, https://github.com/microsoft/botframework-sdk/issues/5919 wurde in allen 3 unterstützten Sprachen behandelt. Sie können versuchen, ob diese Lösung mit einem der täglichen Builds ab morgen hilft.

Hallo @Batta32 , hier ist etwas, das Sie zuerst aktualisieren müssen, oder? Es ist nicht etwas, was ich schon versuchen kann?

Hallo @tommyJimmy87! Ja, werden wir die Validierung was @gabog erwähnt für Typoskript und C #.

Wir werden diesen Branch aktualisieren, indem wir die letzten Updates hinzufügen und den täglichen Build botbuilder-v4-js-daily des SDKs integrieren, der microsoft/botbuilder-js#2489 und microsoft/botbuilder-dotnet#4264 enthält.

Sobald wir ein Update haben, melden wir uns wieder .

Hallo @tommyJimmy87 , wir haben erfolgreich bestätigt, dass das Anwenden der Änderungen von microsoft/botbuilder-js#2489 in testSkillHandler dieses Problem gelöst und die Aktivität korrekt über den Microsoft Teams-Kanal aktualisiert wird.

Überprüfen Sie diesen Commit , um die Änderungen zu identifizieren, die Sie in Ihrer testSkillHandler anwenden sollten, insbesondere in der Methode processActivity .

@darrenj & @gabog - wir haben die Änderungen von microsoft/botbuilder-dotnet#4264 auch mit C# -Bots erfolgreich validiert.

Unsere Testumgebung:

  • Verzweigen Sie mit unseren Modifikationen
  • Beispiel für einen virtuellen TypeScript-Assistenten
  • TypeScript-Skill-Beispiel

Repro-Schritte:

  1. Stellen Sie beide Beispiele bereit
  2. Richten Sie den virtuellen Assistenten mit Ngrok . ein
  3. Verbinden Sie den virtuellen Assistenten mit Microsoft Teams
  4. Verbinde den Skill mit dem virtuellen Assistenten
  5. Führen Sie beide Proben aus
  6. Senden Sie in Microsoft Teams Hallo an den virtuellen Assistenten und schließen Sie den OnboardingDialog ab
  7. Im Dialogfeld Laufprobe senden antwortet der virtuelle Assistent mit einer Karte mit dem Text Aktivität senden
  8. Senden Sie eine weitere Nachricht an den virtuellen Assistenten, er aktualisiert die Karte mit dem Text Aktivität aktualisieren

Mehr Details

_Änderungen an der processActivity-Methode von testSkillHandler_
image

_TypeScript Virtual Assistant wird erfolgreich im Microsoft Teams-Kanal ausgeführt und aktualisiert die zuvor gesendete Karte_
image

Wir werden auf Ihre Antwort aufmerksam sein!

Hallo @Batta32 , danke für das Update, wir werden das so

@tommyJimmy87 - Nur das Commit, das wir oben gepostet haben!

Hi nochmal @Batta32 :) Auch dieser sieht aus wie gelöst! Ich werde morgen noch ein paar eingehendere Tests durchführen, aber die Änderungen in der von Ihnen bereitgestellten Test-Skill-Handler-Klasse scheinen in Ordnung zu sein. Vielen Dank!

Danke @tommyJimmy87! Sobald Sie dies bestätigen können, können wir dieses Thema schließen 😊.

Hallo @Batta32! Wir können dieses Thema gerne schließen :)

Danke @tommyJimmy87 für die Bestätigung!

@darrenj - wir können dieses Problem schließen, da es vom SDK-Team gelöst wurde!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen