Botframework-solutions: 迁移到 0.8 后的更新活动不起作用

创建于 2020-05-20  ·  18评论  ·  资料来源: microsoft/botframework-solutions

什么项目受到影响?

虚拟助理项目和技能项目。

这是什么语言?

打字稿。

会发生什么?

在 MS Teams 频道中,尝试从技能更新活动时,虚拟助手将出错。

重现此问题的步骤是什么?

  1. 将 VA 和 Skill 迁移到最新的 Typescript 0.8 版本
  2. 在 VA 中,我们必须实现一个新的类“CustomSkillHandler”,它扩展了类“ChannelServiceHandler”(我们需要实现这个,因为updateActivity函数没有在提供的“SkillHandler”中实现)
  3. 在“CustomSkillHandler”中实现onUpdateActivity
    protected async onUpdateActivity(claimsIdentity: ClaimsIdentity, conversationId: string, activityId: string, activity: Activity): Promise<ResourceResponse> {
        return await this.updateActivity(claimsIdentity, conversationId, activityId, activity);
    }

updateActivity函数如下所示:

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. 在索引中更改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. 测试来自 Teams 频道的更新活动。

你期待发生什么?

卡片在 Teams 中更新

你能分享任何日志、错误输出等吗?

当 VA 尝试从先前描述的函数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)

任何屏幕截图或其他上下文?

渠道团队

Bot Services Bug customer-replied-to customer-reported

最有用的评论

再次嗨@Batta32 :) 这个看起来也解决了! 明天我会做一些更深入的测试,但似乎可以接受您提供的测试技能处理程序类的更改。 谢谢!

所有18条评论

感谢@tommyJimmy87报告此问题,我们仍在审核中。 一旦有任何更新,我们会尽快回复您😊!

@tommyjimmy87 ,我需要你对你正在做的事情提供额外的重现步骤,以便找出问题所在,因为我们无法重现你所面临的问题。

  1. The Card is updated in Teams是什么意思?
  2. 你在使用 TypeScript 版本的虚拟助手和技能吗?
  3. 您能否提供虚拟助手和技能之间的连接/通信步骤以及您如何测试CustomSkillHandler
  4. 您是否使用[email protected]来生成虚拟助手和技能?

这是我们为重现此问题所做的最新更改的分支。

环境

重现步骤

  1. 使用generator-bot-virtualassistant部署 VA 和技能
  2. 使用botskills connect命令连接 VA & Skill
  3. 创建一个从 ChannelServiceHandler 扩展的新CustomSkillHandler
  4. CustomSkillHandler上添加onUpdateActivityupdateActivity方法
  5. 修改索引文件接收CustomSkillHandler
  6. 使用 Teams 频道测试虚拟助手和技能之间的连接

我们会留意您的回答!

@Batta32 ,将尝试回答您的问题:

  1. 我的意思是我正在尝试在 MS Teams 频道中更新adaptive card ,结果应该是在我做了一些操作后更新了卡片(卡片在技能范围内,所以基本上测试是updateActivity从技能到 VA)。

  2. 是的,VA 和 Skill 都在 Typescript 中

  3. 在技​​能中,我有一个adaptive card ,在用户执行操作后,这张卡片应该更新为不同的内容。 从我称之为updateActivity的技能中:

dc.context.updateActivity(previouslySentActivity);

previouslySentActivity是我们要更新的活动,我们将活动保存在状态中以便以后能够更新它。 这用于在以前的版本中工作,但据我所知,发送和更新活动的流程随着新版本而改变。

这将调用 VA 端点(这是有效的),然后应该更新活动。 电话打进来到CustomSkillHandleronUpdateActivity方法,但后来我得到的错误,当活动被发送到MS队。

  1. 不,不幸的是,我们的项目已经处于高级状态,我需要迁移到新版本以维护我们所做的所有自定义内容,基本上,我们手动迁移。 这不是很好但很有必要。

让我知道您是否需要更多上下文,同时,也许我也可以在您的分支上尝试此操作并检查我是否有相同的错误。

@Batta32 ,我从你用来测试的分支测试了它。 我在这里创建了一个分支: https :
我更改了您的分支以重现相同的错误。 在testSkillHandler我添加了一个 try-catch 来获取错误:

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

这是我从updateActivity调用中得到的实际错误:

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

这与我在我的项目中得到的相同。
这是我做的测试:

  1. 我在示例技能testUpdateActivityDialog中创建了一个新对话框,其中在 beginDialog 中我发送了一个带有文本的TestCard 。 在onContinueDialog我发送了相同的卡片,但文本不同;

  2. 将 VA 连接到技能。

  3. 以某种意图呼叫 VA,这将调用技能并启动测试对话框并显示卡片;

  4. 以某种意图调用 VA,该意图将调用测试对话框的技能和continueDialog

  5. 该技能将调用 VA 以更新卡,然后您会收到错误消息。

伟大的@tommyJimmy87 ! 我们将使用此新信息对其进行审核,非常感谢😊。

嗨@tommyJimmy87! 我们使用您的最新更改和提到的重现步骤成功地重现了该场景。

我们将继续研究这个问题。 一旦有任何更新,我们会尽快回复您😊。

_我们测试了 VA 和 Skill 机器人之间的连接,当技能将活动信息发送到 VA 时检测到相同的问题_
image

@DiegoCardozo94

感谢您的更新。

你知道什么时候可以发布吗?
您认为这可以在 17 号之前发布吗,因为我们这边有严格的发布,我们只想了解 17 号日期是否可行? :)

谢谢

@tommyJimmy87 ,抱歉耽搁了。

我们设法验证这个问题也发生在 C# 中,因此它似乎不仅仅与 TypeScript 相关。

我们发现了一些相关的问题

  1. microsoft/botframework-sdk#5919:详细说明SkillHandler ResourceResponse在将活动从技能转发到频道时会生成假的updatedelete将不起作用
  2. microsoft/botbuilder-dotnet#3686:详细说明SkillHandler类没有实现OnUpdateActivityAsync
    如果技能在没有虚拟助手的情况下运行,卡片会正确更新,但当连接到虚拟助手运行时,卡片不会更新。
    这个问题有一个评论说这个问题应该在下一个版本中修复。 您可以在此 microsoft/botframework-sdk#5788 中跟踪工作状态。
  3. officedev/botbuilder-microsoftteams#124:它详细说明了在 Teams Channels 中使用 V3 bot 失败并出现 HTTP 400 错误请求(类似于此问题)。

最后但同样重要的是,我们使用上述步骤验证了以下场景:

  • [作品] 独自打字稿技巧
  • [问题转载] TypeScript 虚拟助手连接 TypeScript 技能
  • [问题转载] TypeScript 虚拟助手连接 C# 技巧
  • 【问题转载】C#虚拟助手连接TypeScript技巧
  • [问题转载] C#虚拟助手连接C#技巧

@darrenj ,我们也使用 C# 机器人复制了这个问题。

我们的测试环境

  • 用我们的修改分支
  • C# 虚拟助手示例
  • C#技能示例

我们的重现步骤

  1. 部署两个示例
  2. 使用 Ngrok 设置虚拟助手
  3. 将虚拟助手与 Microsoft Teams 连接
  4. 将技能与虚拟助手连接起来
  5. 运行两个示例
  6. 在 Microsoft Teams 中,向虚拟助手发送问候并完成 OnboardingDialog
  7. 发送运行示例对话框,虚拟助手将响应带有文本发送活动的卡片
  8. 向虚拟助手发送另一条消息,它会在尝试更新活动时抛出异常

_虚拟助手在尝试更新活动时会抛出异常_
image

_TypeScript Skill 在 Microsoft Teams Channel 成功运行,更新之前发送的卡片_
image

嗨, https://github.com/microsoft/botframework-sdk/issues/5919已经解决了所有 3 种支持的语言,您可以尝试该解决方案是否有助于使用明天开始的每日构建之一。

@Batta32 ,这是您必须先更新的内容,对吗? 这不是我可以尝试的吗?

嗨@tommyJimmy87! 是的,我们将验证@gabog提到的 TypeScript 和 C# 内容。

我们将更新此分支,添加最新更新,并合并包含 microsoft/botbuilder-js#2489 和 microsoft/botbuilder-dotnet#4264 的 SDK 的botbuilder-v4-js-daily每日构建。

一旦有任何更新,我们会尽快回复您😊。

@tommyJimmy87 ,我们成功确认testSkillHandler中应用microsoft/botbuilder-js#2489 的更改已解决此问题,并且活动已使用Microsoft Teams 频道正确更新。

检查此提交以确定您应该在testSkillHandler应用的更改,特别是在processActivity方法中。

@darrenj & @gabog - 我们也使用C#机器人成功验证了 microsoft/botbuilder-dotnet#4264 的更改。

我们的测试环境:

  • 用我们的修改分支
  • TypeScript 虚拟助手示例
  • 打字稿技能示例

复现步骤:

  1. 部署两个示例
  2. 使用 Ngrok 设置虚拟助手
  3. 将虚拟助手与 Microsoft Teams 连接
  4. 将技能与虚拟助手连接起来
  5. 运行两个示例
  6. 在 Microsoft Teams 中,向虚拟助手发送问候并完成 OnboardingDialog
  7. 发送运行示例对话框,虚拟助手将响应带有文本发送活动的卡片
  8. 向虚拟助手发送另一条消息,它将使用文本更新活动更新卡片

更多详情

_对 testSkillHandler 的 processActivity 方法所做的更改_
image

_TypeScript 虚拟助手在 Microsoft Teams 频道成功运行,更新之前发送的卡片_
image

我们会留意您的回答!

@Batta32 ,感谢您的更新,我们会尽快尝试。 我这边只有一个问题:是否有任何库版本发生了变化,或者只是您在上面发布的提交? 谢谢

@tommyJimmy87 - 只是我们上面发布的提交

再次嗨@Batta32 :) 这个看起来也解决了! 明天我会做一些更深入的测试,但似乎可以接受您提供的测试技能处理程序类的更改。 谢谢!

谢谢@tommyJimmy87! 一旦您确认这一点,我们就可以关闭此问题😊。

嗨@Batta32! 我们很乐意关闭这个问题:)

感谢@tommyJimmy87确认这一点!

@darrenj - 我们可以关闭此问题,因为它已由 SDK 团队解决!

此页面是否有帮助?
0 / 5 - 0 等级