【发布时间】:2021-09-12 22:57:48
【问题描述】:
我想开发一个 Microsoft Teams Bot,当用户输入关键字(例如“pto”)时,它会显示一个自适应卡片表单,用户可以在该表单中填充信息,然后将这些信息发送到 Web 服务进行处理。
是否可以根据用户输入文本命令显示自适应卡片?
【问题讨论】:
标签: botframework microsoft-teams
我想开发一个 Microsoft Teams Bot,当用户输入关键字(例如“pto”)时,它会显示一个自适应卡片表单,用户可以在该表单中填充信息,然后将这些信息发送到 Web 服务进行处理。
是否可以根据用户输入文本命令显示自适应卡片?
【问题讨论】:
标签: botframework microsoft-teams
是的,绝对有可能。 “命令”实际上只是一条常规消息,它是您解释/响应消息的方式。您可以通过查看内容自己检测这些消息,也可以使用对话式 AI 引擎,如 LUIS.ai(Azure 的一部分),它可以更轻松地配置为检查变体(例如“pto”、“PTO”、 “POT”、“[whatever 'pto'代表']”等。在这种情况下,LUIS 基本上是构建大量“if”语句来查找匹配项,并返回一个“intent”(例如“User is请求任何“PTO”的意思”)。因为它使用人工智能来生成和维护这个“if”列表,所以像 LUIS 这样的语言对话引擎在机器人中被广泛使用,但它们不是-必需的-。这就是为什么你在大多数情况下看到它们的原因虽然是样本。
关于发送自适应卡片,这在 Teams 机器人中也是相当标准的东西,可以发送它们以响应用户的消息,就像你在这里尝试一样,以及调用它们的其他方式。
实际上,我在今年早些时候的一次会议上一个接一个地讨论了这两个主题 - 在这里观看视频:https://www.youtube.com/watch?v=mM7-fYdcJhw&t=1398s(前面的部分实际上可能也很有趣)。
【讨论】:
Bot Framework 无法原生处理卡片提示,所以我想出的最佳解决方案是
input.match(/{.+/g))所以在代码中它最终是这样的:
await step.context.sendActivity(CardHelper.datePicker());
return await step.prompt(DATE_PROMPT, `*waiting for selection...*`);
使用验证器确保您收到这样的对象:
async validateDateCard(prompt) {
prompt.activeDialog = await this.userDialogStateAccessor;
prompt.context = await prompt.context;
const input = prompt.recognized.value;
if (input.match(/{.+/g)) {
return true;
} else {
await prompt.context.sendActivity(`Please use the calendar widget above to enter the date.`);
return false;
}
}
在我的例子中,我的小部件只有一个日期字段,但无论您有多少字段,它的工作原理都是一样的。它们都将在提交的对象中。如果您尝试手动输入内容,系统会再次提示您使用该小部件。一般来说,我发现按顺序提示纯文本值而不是使用卡片可以正常工作,而且对用户来说不太麻烦。但是,如果您有大量输入或需要像上面的日期小部件这样的专门控件,有时卡片是唯一的方法。
【讨论】: