Node.js 使用NodeJS的带有QnAMaker的自适应卡
我一直在学习NodeJS,并开始使用Bot框架的v4重建我的Bot 我用C#在v3中安装并运行了一个Bot,它成功地使用了一种方法,根据代码找到的分号数量,QnA配对被改编成英雄卡、视频卡或标准回复 我正在努力使用字符串拆分方法在NodeJS中复制此函数,以确定应该使用哪种自适应卡 我已经附上了原始C#代码和我使用NodeJS的部分尝试 CSharpNode.js 使用NodeJS的带有QnAMaker的自适应卡,node.js,botframework,qnamaker,adaptive-cards,Node.js,Botframework,Qnamaker,Adaptive Cards,我一直在学习NodeJS,并开始使用Bot框架的v4重建我的Bot 我用C#在v3中安装并运行了一个Bot,它成功地使用了一种方法,根据代码找到的分号数量,QnA配对被改编成英雄卡、视频卡或标准回复 我正在努力使用字符串拆分方法在NodeJS中复制此函数,以确定应该使用哪种自适应卡 我已经附上了原始C#代码和我使用NodeJS的部分尝试 CSharp protected override async Task RespondFromQnAMakerResultAsync(IDialogConte
protected override async Task RespondFromQnAMakerResultAsync(IDialogContext context, IMessageActivity message, QnAMakerResults result)
{
var answer = result.Answers.First().Answer;
Activity reply = ((Activity)context.Activity).CreateReply();
string[] qnaAnswerData = answer.Split(';');
int dataSize = qnaAnswerData.Length;
//image and video card
if (dataSize > 1 && dataSize <= 6)
{
var attachment = GetSelectedCard(answer);
reply.Attachments.Add(attachment);
await context.PostAsync(reply);
}
else
{
// await context.Forward(new BasicQnAMakerDialog(), AfterAnswerAsync, message, CancellationToken.None);
await context.PostAsync(answer);
}
}
private static Attachment GetSelectedCard(string answer)
{
int len = answer.Split(';').Length;
switch (len)
{
case 4: return GetHeroCard(answer);
case 6: return GetVideoCard(answer);
default: return GetHeroCard(answer);
}
}
private static Attachment GetHeroCard(string answer)
{
string[] qnaAnswerData = answer.Split(';');
string title = qnaAnswerData[0];
string description = qnaAnswerData[1];
string url = qnaAnswerData[2];
string imageURL = qnaAnswerData[3];
HeroCard card = null;
{
card = new HeroCard
{
Title = title,
Subtitle = description,
};
card.Buttons = new List<CardAction>
{
new CardAction(ActionTypes.OpenUrl, "Learn More", value: url)
};
card.Images = new List<CardImage>
{
new CardImage( url = imageURL)
};
}
return card.ToAttachment();
}
private static Attachment GetVideoCard(string answer)
{
string[] qnaAnswerData = answer.Split(';');
string title = qnaAnswerData[0];
string subtitle = qnaAnswerData[1];
string description = qnaAnswerData[2];
string thumbimageurl = qnaAnswerData[3];
string mediaUrl = qnaAnswerData[4];
string url = qnaAnswerData[5];
VideoCard card = new VideoCard
{
Title = title,
Subtitle = subtitle,
Text = description,
};
card.Image = new ThumbnailUrl
{
Url = thumbimageurl
};
card.Media = new List<MediaUrl>
{
new MediaUrl()
{
Url = mediaUrl
}
};
card.Buttons = new List<CardAction>
{
new CardAction()
{
Title = "View Full Screen",
Type = ActionTypes.OpenUrl,
Value = url
}
};
return card.ToAttachment();
}
protectedoverride async Task RespondFromQnAMakerResultAsync(IDialogContext上下文、IMessageActivity消息、QnAMakerResults结果)
{
var answer=result.Answers.First().answer;
活动回复=((活动)context.Activity).CreateReply();
字符串[]qnaAnswerData=answer.Split(“;”);
int dataSize=qnaAnswerData.Length;
//图像和视频卡
如果(数据大小>1和数据大小3){
等待turnContext.sendActivity(qnaResults[0].answer);
等待turnContext.sendActivity({
文字:“视频卡”,
附件:[CardFactory.adaptiveCard(视频卡)]
});
}else如果(qnaCard.toString().split(“;”).length<3){
等待turnContext.sendActivity(qnaResults[0].answer);
等待turnContext.sendActivity({
文字:“英雄卡”,
附件:[CardFactory.adaptiveCard(HeroCard)]
});
返回;
}
}
v4节点SDK中的CardFactory为每种类型的卡(HeroCard、VideoCard、AdaptiveCard等)提供了渲染功能。您应该为您尝试发送的卡类型使用相应的功能。您的代码应该如下所示:
async onTurn(turnContext) {
if (turnContext.activity.type === ActivityTypes.Message) {
for (let i = 0; i < this.qnaServices.length; i++) {
// Perform a call to the QnA Maker service to retrieve matching Question and Answer pairs.
const qnaResults = await this.qnaServices[i].getAnswers(turnContext);
const qnaCard = qnaResults.includes(';');
// If an answer was received from QnA Maker, send the answer back to the user and exit.
if (qnaCard.toString().split(';').length > 3) {
await turnContext.sendActivity(qnaResults[0].answer);
await turnContext.sendActivity({
text: 'Video Card',
attachments: [CardFactory.videoCard(VideoCard)]
});
} else if (qnaCard.toString().split(';').length < 3) {
await turnContext.sendActivity(qnaResults[0].answer);
await turnContext.sendActivity({
text: 'Hero Card',
attachments: [CardFactory.heroCard(HeroCard)]
});
return;
}
}
}
}
async onTurn(turnContext){
if(turnContext.activity.type==ActivityTypes.Message){
for(设i=0;i3){
等待turnContext.sendActivity(qnaResults[0].answer);
等待turnContext.sendActivity({
文字:“视频卡”,
附件:[CardFactory.视频卡(视频卡)]
});
}else如果(qnaCard.toString().split(“;”).length<3){
等待turnContext.sendActivity(qnaResults[0].answer);
等待turnContext.sendActivity({
文字:“英雄卡”,
附件:[CardFactory.heroCard(heroCard)]
});
返回;
}
}
}
}
有关如何在v4 BotFramework节点SDK中发送卡的更多示例,请查看和
希望这有帮助 谢谢你,真的很感激。
async onTurn(turnContext) {
if (turnContext.activity.type === ActivityTypes.Message) {
for (let i = 0; i < this.qnaServices.length; i++) {
// Perform a call to the QnA Maker service to retrieve matching Question and Answer pairs.
const qnaResults = await this.qnaServices[i].getAnswers(turnContext);
const qnaCard = qnaResults.includes(';');
// If an answer was received from QnA Maker, send the answer back to the user and exit.
if (qnaCard.toString().split(';').length > 3) {
await turnContext.sendActivity(qnaResults[0].answer);
await turnContext.sendActivity({
text: 'Video Card',
attachments: [CardFactory.videoCard(VideoCard)]
});
} else if (qnaCard.toString().split(';').length < 3) {
await turnContext.sendActivity(qnaResults[0].answer);
await turnContext.sendActivity({
text: 'Hero Card',
attachments: [CardFactory.heroCard(HeroCard)]
});
return;
}
}
}
}