Botframework-solutions: [Typescript] 为 VA/Skill Generator 添加 GA SDK 技能支持

创建于 2019-10-08  ·  64评论  ·  资料来源: microsoft/botframework-solutions

在对 WebSockets 的技能协议更改之后,我们一直在等待新的流扩展库可用于 Typescript,以前仅可用于 C#。 这将在使用 Typescript 时解锁虚拟助手的技能调用场景。

用户的故事

作为......开发人员
我希望……能够将技能连接到虚拟助手的 TypeScript 版本
所以...... C# 和 Typescript 之间存在奇偶校验

验收标准

  • [ ] 更新 VA 和技能生成器以包含新的 GA SDK 技能
  • [ ] 部署打字稿 VA 并添加 C# 技能(例如日历)
  • [ ] 根据需要提供有关现有 VA 解决方案和生成器创建的技能所需更改的文档
P0 Committed In Progress

最有用的评论

@Batta32如果 SkillConversationIdFactory 使用 encodeURI,则该技能将接收该 session.id 并相应地对其做出响应。 我很确定这是必需的。

同样是的,使用 restify 时长对话 id 存在问题。 我们在此示例中提到了如何解决该问题: https :

// 默认情况下,此键有 100 个字符的限制。 在 index.js 中用restify.createServer({ maxParamLength: 1000 });增加。

所有64条评论

嗨,达伦吉,
是否有任何关于要修复的问题的预计到达时间?
谢谢,
库马尔

希望本周的测试工作能够顺利进行。

谢谢@darrenj的更新。

这个问题有没有更新@darrenj

嗨,达伦,

@darrenj能否请您提供有关此工作项目的更新。 我们需要为我们的用例开发这个关键功能。

感谢你的帮助。

谢谢,
库马尔

@darrenj

很抱歉再次打扰您,这有什么更新吗?
我看到该库已经发布了 4.6.0 版本(https://botbuilder.myget.org/feed/botbuilder-v4-js-daily/package/npm/botframework-streaming),这是否与 Botframework 兼容4.5.0 和虚拟助手?

这里有一些事情正在发展,一个是你发现的流媒体扩展的可用性,另一个是新 GA 版本的技能库的打字稿可用性。 我期待下周的 Skills 库的第一个打包版本,届时我们可以开始更新 C# 和 Typescript 模板以测试和提供(简单)迁移步骤。

我们的目标是在 1 月份准备好这项工作,并将更新此问题的进度,包括每日构建可用的时间。

同时,Javascript/Typescript VA Bot 可以调用在 JavaScript/Typescript 中创建的技能,因为由于缺乏流扩展依赖项,它使用 HTTP。 当您希望调用像日历这样的 C# 技能时会出现问题,上述更改将在所有语言中保持一致。

@darrenj是固定的,我可以从 typescript VA 连接 C# Skill 吗? 我对你最后的评论感到困惑。

你好@darrenj

一旦解决了这个问题,是否可以从 VA 上的 TypeScript 版本调用像ToDo这样的 cSharp 技能?

目前,我收到与 C# 技能上使用的 WebSocketTransport 相关的错误。 但我的 VA 是打字稿。

是的,迁移到 GA 版本的 Skills 消除了对 Websockets 的依赖,从而实现了跨平台技能的无缝混合/匹配。 我们拥有 C# 和 JS 的最新版本并致力于初始集成,目标是在接下来的几周内将更改添加到日常构建中,以解除场景阻塞。

@darrenj

我还有另一个用例是 Typescript VA 和 Typescript Skill。

我的问题是 updateActivity 在整个 VA 到技能不可用,我需要为此使用流媒体库(据我所知)。 现在我实际上注意到 WebSocket 依赖项已从最新的技能库 (4.4.9) 中删除。
不明白为什么 :) 要搬到别处吗? 或者?

好的,我有关于 Bot Framework SDK 中技能功能 GA 的最新进展。 这将 Virtual Assistant 孵化的工作转变为正式的 GA 版本。

提供了一个示例,展示了一个 Bot 如何调用另一个 Bot(技能)。 关键的变化是我们现在有一个统一的适配器,这意味着不需要使用不同的适配器或流扩展。 C#JS

我们正在更新虚拟助手/技能模板,以提供开箱即用的(小)更改,提供有关更新现有技能所需的几个步骤的文档。 以 1 月底为目标,很快就会在我们的日常构建基础上进行构建。

如果您渴望在此之前取得进展,上述示例应该可以为您提供所需的一切。 一旦准备就绪,我将使用指向每日构建/更改的指针更新此问题。

@darrenj感谢您提供这个很棒的更新。 在我们开始在我们的生产虚拟助手中利用统一适配器之前,我只是想知道

这是否意味着我们可以在 Typescript VA 中使用统一适配器并且仍然可以调用 c# 技能?

期待已久的更新!

我们昨天发布了0.8 版本,其中包括对所有示例技能的更新,以支持新的GA 技能功能,不再进行预览。 Websockets 已被淘汰,转而支持技能之间的 Web 服务通信,技能使用“回调”HTTP 连接异步通信回机器人。

因此,需要对现有的虚拟助手和技能进行一些直接更新。 C# VA 更新记录在此处,C# 技能更新记录在此处

等效的 JS/Typescript 生成器更改正在完成,因为我们的目标是在 2 月 14 日之前发布新的生成器和现有 VA/技能的文档。 作为背景参考,可以在此处找到支持调用技能的高级步骤

一旦这些更改完成,就意味着 JS/typescript VA 可以调用 C# Skills,反之亦然,实际上 Python 也是如此。

@darrenj ,对上面关于打字稿项目的评论有什么想法吗?

如上所述,是的,我们正在完成一些迁移步骤

谢谢你。

@darrenj ,关于JS/TS 生成器更改和文档更新何时发布的任何消息?

@darrenj ,您能否让我们知道从 VA (C#) 到打字稿技能工作的交流是否在您上面提到的新框架 (SDK) 中完成。 你说过它会在 2 月 14 日之前完成。
感谢你的帮助

@darrenj这张票有什么更新吗?

@darrenj今天我尝试迁移或修复以从 VA/RootBot (Typescript) 调用 C# 技能。 我找到了没有打字稿 rootbot/VA 示例的实现技能消费者的指南。 是否有计划支持基于打字稿的迁移指南? 请让我知道 ETA 或任何其他可以帮助实现相同目标的指南。

我们有一组正在进行的拉取请求,用于使新的打字稿 VA/技能能够使用新的 GA 技能的更改。 一旦我们将它们合并并且每日构建可用,我将更新票证。

同时,这里有一份关于迁移现有 VA 的步骤的草稿文件,欢迎反馈。

https://github.com/microsoft/botframework-solutions/pull/3123

@darrenj ,感谢您的更新,我目前唯一的问题是关于“botbuilder-solutions”。 我们必须使用本地版本吗? 来自哪里? 我在这里找到了这个看起来像未来版本的分支(https://github.com/microsoft/botframework-solutions/tree/feature/southworks/0.7/parity-botbuilder-solutions/sdk/typescript/libraries/botbuilder-solutions) , 那正确吗?

提前致谢。

@Batta32您能否快速确认人们可以使用哪个代码分支来测试指令(在新库发布之前)

@tommyJimmy87 - 您可以查看 PR #3122,其中包含 TypeScript 中 GA Skills SDK BotBuilder-Solutions 的所有必要更改。
分支: feature/southworks/ga-skills-sdk/botbuilder-solutions

要在本地使用库,请按照以下步骤操作(使用提到的分支):

  1. 在 Visual Studio Code 中打开库
  2. 执行npm install以安装依赖项
  3. 执行npm run build以编译解决方案
  4. 执行npm pack创建库 .tgz 文件
  5. 在 Visual Studio Code 中打开虚拟助手的package.json文件
  6. 更新指向创建的 tgz 路径的 botbuilder-solutions 引用
  7. 执行npm install以安装将安装本地包的依赖项

我们目前正在验证这些更改,请随时在该 PR 中提供任何反馈,我们将尽快对其进行审核。

此问题已过时,因为它已打开 30 天而没有任何活动。 删除陈旧的标签或评论,否则这将在 5 天内关闭

@darrenj - 您能否让我们知道下面提到的更改是否可以用于从 VA(C#) 到 Skill 节点 js 的连接。

https://microsoft.github.io/botframework-solutions/overview/whats-new/0.8-beta/migrate-existing-va-to-0.8/

是的 - 文档在 PR 中,团队正在我们讲话中结束这项工作! (@Batta32)。 您可以在此处查看正在进行的工作: https :

连同对 SDK 的相关更改: https :

正如我们所承诺的,感谢您在我们对 SDK 进行一系列更改时的耐心等待。

  • 将现有打字稿 VA 更新为 GA BF 技能的步骤在这里
  • 将现有打字稿技能更新为 GA BF 技能的步骤在这里

此外, VA 生成器

然后,当我们处理当前等待 Azure 更改窗口的 1.0 版本时,这将发布到 npm。 我们希望到月底。

以上任何问题/问题请提出一个新问题,我们随时为您提供帮助。

@Batta32对于迁移,我们可以开始使用 botbuilder-solutions 4.5.0-preview 吗? 我想是迁移的新版本吧?

@Batta32新的 SDK 什么时候发布使用? 我正在构建一个具有 13 项技能的 VA,其中一项要求是使用 TypeScript 构建。 我目前正在使用 Next 分支中的 SDK 来启动项目。

@tommyJimmy87 & @tomSauret847 ,在它们发布之前,您可以使用

要集成botbuilder-solutions每日构建,您有两个不同的选项,我们推荐第一个选项,因为它是最简单的一个(考虑删除机器人的package-locknode_modules ) :

  • 选项 1:添加指向注册表https://botbuilder.myget.org/F/aitemplates/npm.npmrc文件,并更新package.json以将botbuilder-solutions版本指向4.5.0-preview223
  • 选项 2:下载botbuilder-solutions的 tgz,直接在 package.json 中使用绝对路径引用它
npm pack [email protected] --registry https://botbuilder.myget.org/F/aitemplates/npm

如果你想使用generator-botbuilder-assistant ,你应该卸载它,如果你已经有一个,然后安装 MyGet 之一:

npm uninstall -g generator-botbuilder-assistant
npm install -g [email protected] --registry https://botbuilder.myget.org/F/aitemplates/npm

@Batta32我们需要在哪里报告我们在预览版本中发现的问题? 我已经使用预览生成器生成了一个新的 VA,并使用了预览 SDK 并收到一个错误,指出在尝试运行 VA 而不进行任何自定义时正在添加一个无效的对话框。
错误:DialogSet.add():添加的对话框无效。

@darrenj - 报告每日构建问题的最佳方法是什么?

@tomSauret847 - 同时,您可以在此线程中与您的环境和重现步骤分享您的问题😊!

环境在windows 10电脑本地运行
步骤:运行预览生成器以构建空白 VA
更新appsettings.json 和cognitivemodels.json
添加指向https://botbuilder.myget.org/F/aitemplates/npm 的.npmrc 文件
删除 node_modules 和 package-lock.json
运行 npm install [email protected]
运行 npm install 安装所有其他包
运行 NPM 构建
运行 npm 运行开始
然后我收到以下错误
C:UsersuserDesktopBlankVAtestassistantnode_modulesapplicationinsightsoutAutoCollectionExceptions.js:34
抛出 THIS_IS_APPLICATION_INSIGHTS_RETHROWING_YOUR_EXCEPTION; // 错误源自您应用程序的其他地方
^

错误:DialogSet.add():添加的对话框无效。
在 DialogSet.add (C:UsersuserDesktopBlankVAtestassistantnode_modulesbotbuilder-dialogslibdialogSet.js:87:19)
在 MainDialog.addDialog (C:UsersuserDesktopBlankVAtestassistantnode_modulesbotbuilder-dialogslibcomponentDialog.js:148:22)
在新的 MainDialog (C:UsersuserDesktopBlankVAtestassistantlibdialogsmainDialog.js:34:14)
在对象。(C:UsersuserDesktopBlankVAtestassistantlibindex.js:159:24)
在 Module._compile (internal/modules/cjs/loader.js:778:30)
在 Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
在 Module.load (internal/modules/cjs/loader.js:653:32)
在 tryModuleLoad (internal/modules/cjs/loader.js:593:12)
在 Function.Module._load (internal/modules/cjs/loader.js:585:3)
在 Function.Module.runMain (internal/modules/cjs/loader.js:831:12)

谢谢! 我们按照您的步骤重现了该问题,但是当安装botbuilder-solutions时,安装依赖项的顺序存在错误,导致冲突。

image

尝试按照以下步骤操作:(删除node_modulespackage-lock

  1. package.json中的4.5.0-preview223版本更新package.json botbuilder-solutions

image

  1. 安装所有执行npm install的依赖
  2. 构建执行npm run build的解决方案
  3. 启动虚拟助手执行npm run start

image

@tomSauret847如果您发现任何其他问题,请告诉我。 我们正在完成最终验证,并将在完成后将新构建推送到 npm。

@darrenj ,我在尝试使用新模板管理器解析 lg 文件时遇到错误,基本上发生的情况是我从 MS Teams 接收语言环境 en-US 但我只设置了 en-us(小写)和不会被认可。 也许在此处添加小写字母if (this.templateEnginesPerLocale.has(locale))可以解决问题(LocaleTemplateEngineManager.ts line 61)。 为了暂时避免这个问题,我不得不在我的 index.ts 中添加它:

const supportedLocales: string[] = ['en-us', 'en-US','de-de'];

supportedLocales.forEach((locale: string) => {
    const localeTemplateFiles: string[] = [];
    templateFiles.forEach(template => {
        // LG template for en-us does not include locale in file extension.
        if (locale === 'en-us' || locale === 'en-US') {
            localeTemplateFiles.push(path.join(__dirname, 'responses', `${ template }.lg`));
        }
        else {
            localeTemplateFiles.push(path.join(__dirname, 'responses', `${ template }.${ locale }.lg`));
        }
    });

    localizedTemplates.set(locale, localeTemplateFiles);
});

这很有效,但我不知道是否可以以更好的方式完成。

谢谢。 @Batta32 - 您能检查一下在使用MultiLanguageLG提供的 SDK 的解决方案库中是否对 LocaleTemplateEngine 进行了更改吗? 我希望这能优雅地处理混合大小写,但一些测试会很好地验证。

@lzc850612我们能否使用 csharp GA RC 运行快速验证,以在混合大小写区域设置进入 Activity 的 Bot 时仔细检查它是否按预期工作?

当然@darrenj ,我们将检查该更改!

@darrenj感谢您更新进度! 我有与 tommyJimmy 指出的相同的语言环境问题,但通过在 localeTemplateManager 中添加 locale.toLowerCase 解决了它。 我目前正在将自定义技能附加到 VA,但仍然收到我试图追踪的错误。 该技能正在向 VA 返回 501 错误,但它正在处理 defaultActitivityHandler.ts 中的 onMessage 函数中的消息,只是没有将活动传递到主对话框以供技能处理。 我通过更新 appSettings.json 文件添加了该技能,并且该技能正在接收活动。

@ Batta32我想检查前进的路径是否仍然包含 localTemplateEngineManager。 我注意到它在预览版本中丢失了,只有 responseManager 存在。 继续前进,我们将需要使用响应管理器还是要重新添加区域设置模板?

@Batta32我能够追踪我在与 VA 的技能交流时收到的错误。 在 dialogEx 模块中有一个发送跟踪,它将跟踪发送回技能启动的 VA。 调用此 sendActivity 时会引发以下错误:
错误:/api/messages/v3/conversations/5659a380-841b-11ea-bed3-831b5a6aa1eb%7Clivechat-dlpskill-emulator-skillconvo/activities/5b61c920-841b-11ea-b148-8581
当会话 ID 附加到 SkillConversationIdFactory 中时,该技能无法回发到新的会话 ID。

更新:
我在导致此问题的 SkillHostEndpoint 中有一个拼写错误。 一旦我更正了我现在可以附加技能并让它们与 VA 交互。

@Batta32 @darrenj我在尝试使用 VA聊天时遇到意外行为:基本上每次用户向 Bot 提问时,introstep 都会重新提示初始消息,这在聊天的情况下不如 UX . 这是预期的还是我遗漏了什么?

Screen Shot 2020-04-23 at 11 25 46

(请稍等消息是自定义消息不要担心
)

@Batta32我能够追踪我在与 VA 的技能交流时收到的错误。 在 dialogEx 模块中有一个发送跟踪,它将跟踪发送回技能启动的 VA。 调用此 sendActivity 时会引发以下错误:
错误:/api/messages/v3/conversations/5659a380-841b-11ea-bed3-831b5a6aa1eb%7Clivechat-dlpskill-emulator-skillconvo/activities/5b61c920-841b-11ea-b148-8581
当会话 ID 附加到 SkillConversationIdFactory 中时,该技能无法回发到新的会话 ID。

更新:
我在导致此问题的 SkillHostEndpoint 中有一个拼写错误。 一旦我更正了我现在可以附加技能并让它们与 VA 交互。

@tomSauret847你的问题是什么? 因为我有同样的错误,不明白这是什么。 在我的虚拟助手中,我有这个:
"skillHostEndpoint": "https://1c34e472.ngrok.io/api/skills"
哪个是 VA 的端点。

Error: /api/skills/v3/conversations/a%3A1QIRXOg6VwVn2aGC-eTj9sj3YYd6YUVrRKf8J7wLrjH1fPYcpn2dYpMyQpr_aHLHSp9Z2SHVzu8lKbdj_ArEh06kvjyF48IG1tgE1ctKTWdIASDloNgy51_eBFoGzwwIN-waSearchSkill-msteams-skillconvo/activities/1588679971133 does not exist at new RestError (/Users/em.tomaselli/Desktop/repository/BMW/wa-search-skill/node_modules/@azure/ms-rest-js/dist/msRest.node.js:1397:28) at /Users/em.tomaselli/Desktop/repository/BMW/wa-search-skill/node_modules/@azure/ms-rest-js/dist/msRest.node.js:1849:37 at process._tickCallback (internal/process/next_tick.js:68:7)

@Batta32我能够将我的 VA 和 1 项技能部署到 Azure。 当我使用网络聊天时,一切都按预期进行。 当我尝试使用团队频道时,我收到以下错误。 这似乎与团队频道隔离,因为网络聊天路由正确。
错误:在“https://{app name}.azurewebsites.net/api/skill/messages”调用技能 ID:“dlpskill”时出错(状态为 500)。
错误:/ API / / V3 /会话/一个技巧:1lFWWXG9CVtdrkA76VLFeS9CbYWzsHVr9mQ4S7BqDpL4K5WNIc0ND6mqaaj_QsSqH-qUU-Gb2vLX3HQ4CpG3ZDPCbR0XKLtJGOqW0kwKUbe2HKv5C9fs1sjLSO4EvoE5h-dlpskill-msteams-skillconvo /活动/ 1588712064379不存在
在技​​能对话。(D:homesitewwwrootnode_modulesbotbuilder-dialogslibskillDialog.js:164:23)
在 Generator.next ()
已完成 (D:homesitewwwrootnode_modulesbotbuilder-dialogslibskillDialog.js:11:58)
在 process._tickCallback (internal/process/next_tick.js:68:7)

@tommyJimmy87我没有使用 ngrok 从 VA 与本地技能进行通信,因此我能够使用localhost:3979/api/skills作为 SkillHostEndpoint 并且能够达到技能。 由于您也在使用 Teams 频道,我会说这是 Teams 频道的问题。 您可以尝试使用网络聊天获得技能,看看是否可以与 VA 的 azure 技能交流。

@Batta32 ,我同意@tomSauret847 的观点,即团队频道很可能存在某种问题。

经过一些调试后,我可能会尝试解释我发现的内容:

1)在ChannelServiceHandler所有的方法都没有实现,这意味着当/api/skills被调用时,每次都会返回一个错误代码;

即文件:ChannelServiceHandler.ts(botbuilder),行:219

    protected async onGetActivityMembers(claimsIdentity: ClaimsIdentity, conversationId: string, activityId: string): Promise<ChannelAccount[]> {
        throw new StatusCodeError(StatusCodes.NOT_IMPLEMENTED, `ChannelServiceHandler.onGetActivityMembers(): ${StatusCodes.NOT_IMPLEMENTED}: ${STATUS_CODES[StatusCodes.NOT_IMPLEMENTED]}`);
    }

2) /api/skills/v3/conversations/a%3A1QIRXOg6VwVn2aGC-eTj9sj3YYd6YUVrRKf8J7wLrjH1fPYcpn2dYpMyQpr_aHLHSp9Z2SHVzu8lKbdj_ArEh06kvjyF48IG1tgE1ctKTWdIASDloNgy51_eBFoGzwwIN-waSearchSkill-msteams-skillconvo/activities/1588761991793在这种情况下,在解析会话 ID 时会出现一些问题,错误结果总是资源不存在,但是如果您尝试使用更简单的字符串调用相同的 URL 更改会话 ID它将起作用(但结果仍然是由于前一点而未实现该方法)。

@tommyJimmy87@tomSauret847 - 很抱歉延迟。 我们将使用 GA Skills SDK 更改审查 Teams Channel 的场景,稍后我们将回到此主题😊。

@tommyJimmy87 - 我们使用 Microsoft Teams Channel成功重现了该问题。 我们将在解决问题后立即返回此线程。

谢谢!

@tommyJimmy87 , @tomSauret847 ,我们成功找到了问题的原因

问题在于,当活动从技能发送回虚拟助手时,_':'_ 字符被替换为 _'%3A'_,从而导致两个机器人之间的 _conversationId_ 不匹配。
显然,这种行为是在axios依赖项中执行的,替换了前面提到的字符。

最后但并非最不重要的一点是,microsoft/botbuilder-js#2182 中存在一个问题,它替换了 botbuilder 中的 axios,并且它被标记为已为 _R10_

我们将更新解释问题的已知问题文档

最后,一旦我们为你们提供新的更新,我们将回到这个线程😊

_conversationIds 不匹配_
image

_axios 依赖项将“:”替换为“%3A”_
image

@Batta32您认为会很快修复还是需要一些时间?

@tommyJimmy87@tomSauret847 - 我们注意到问题出在ms-rest-js而不是axios

问题是技能和虚拟助手之间的conversationId不匹配。 提出此问题是因为来自 Teams 的 _conversationId_ 的 _':'_ 字符被替换为 _'%3A'_,而后者应该被替换回_':'_。 最后一次转换不像_axios_那样在

抱歉弄错了😊。

_encodeURIComponent 不会将“%3A”替换回“:”_
image

_axios 和 ms-rest-js 编码的区别_
image

@Batta32 ms-rest-js 版本 < 2.0 的默认代理是 axios https://github.com/Azure/ms-rest-js/blob/1.x/lib/axiosHttpClient.ts

我认为解决此问题的一种方法是在 SkillConversationIdFactory 实现中使用 encodeURI。 这样,底层代理不会改变工厂中存储的对话.id。

谢谢@EricDahlvang ,我们将审查在SkillConversationIdFactory中使用encodeURI的替代方法!

@EricDahlvang - 在SkillConversationIdFactory添加encodeURI并不能解决问题,因为在将活动发送回虚拟助手之前,技能已经对conversationId进行了编码。

我们意识到该问题可能与从 Microsoft Teams 收到的对话 ID 的长度有关。 我们注意到使用原始的conversationId没有命中 VA 的端点,但是,从conversationId修剪一些字符是正确命中的。

最后但并非最不重要的是,这个问题在 C# 中不存在。

_端点未命中原始conversationId_
image

_端点被修剪后的对话 ID 命中_
image

_这个问题在C#中不存在_
image

@Batta32如果 SkillConversationIdFactory 使用 encodeURI,则该技能将接收该 session.id 并相应地对其做出响应。 我很确定这是必需的。

同样是的,使用 restify 时长对话 id 存在问题。 我们在此示例中提到了如何解决该问题: https :

// 默认情况下,此键有 100 个字符的限制。 在 index.js 中用restify.createServer({ maxParamLength: 1000 });增加。

@EricDahlvang感谢您提供此信息。 我为我的 VA 和技能添加了更新。 我现在可以让 VA 与 Teams 频道中的技能无误地进行交流。

感谢@EricDahlvang提供的信息! 我们创建了 PR #3359,改进了maxParamLength并更新了@types/restify@^8.4.2

谢谢@tommyJimmy87@tomSauret847 ,一旦这些更改合并,您就可以测试它😊。

image

@Batta32很抱歉再次打扰您,首先,我应用了更改,现在可以正常工作了。 现在我在通过 VA 更新技能活动时遇到问题,在 SkillHandler 中没有实现,您能提供一个吗? 谢谢

@tommyJimmy87 ,我们注意到C#JS中的SkillHandler不包含您提到的onUpdateActivity() ,同时您可以添加自己的处理程序,从SkillHandlerChannelServiceHandler扩展

@darrenj -你可以确认没有onUpdateActivity()的方法SkillHandler是正确的还是有实现它什么计划吗?

@Batta32我实际上试过这个,实现看起来像这样:

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

        /**
         * Callback passed to the BotFrameworkAdapter.createConversation() call.
         * This function does the following:
         *  - Caches the ClaimsIdentity on the TurnContext.turnState
         *  - Applies the correct ConversationReference to the Activity for sending to the user-router conversation.
         *  - For EndOfConversation Activities received from the Skill, removes the ConversationReference from the
         *    ConversationIdFactory
         */
        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;
        };

        // Add the channel service URL to the trusted services list so we can send messages back.
        // the service URL for skills is trusted because it is applied based on the original request
        // received by the root bot.
        AppCredentials.trustServiceUrl(skillConversationReference.conversationReference.serviceUrl);

        await (this.adapter as BotFrameworkAdapter).continueConversation(skillConversationReference.conversationReference, skillConversationReference.oAuthScope, callback);
        return { id: uuid() };
    }

它基本上是processActivity函数的副本,该函数已经在SkillHandler但最后调用了context.updateActivity(context.activity)

说我收到此错误:

(node:68325) UnhandledPromiseRejectionWarning: Error: Failed to decrypt conversation id 

可能是我遗漏了一些东西,或者我做错了。

@tommyJimmy87 - 我们将尝试重现您的场景,稍后我们会回复您😊。

@Batta32我在虚拟助手的“帮助卡”上注意到它没有显示主动技能的帮助卡。 当您在技能对话框中点击“帮助”中断时,它仍然显示 VA 的帮助卡而不是技能。 我已更新到最新版本,其中包括使用活动技能设置 activeSkillProperty 状态。 有关如何解决此问题的任何想法? 注销活动对话的状态仍然注册为我在 VA 中的对话,而不是活动技能。

@tommyJimmy87@tomSauret847 ,感谢您报告这些问题。

由于[email protected][email protected][email protected]中发布并合并到分支master ,您可以在存储库中创建问题以便更好地解释问题,我们会跟进他们😊。

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