就我而言,我使用的是 Bot Composer 而不是 PVA。我希望语法是相似的,并且这将适用于具有自定义创建技能的 PVA。
我一直在寻求做类似的事情,并且能够使用以下语法获得可行的解决方案。
在我的示例中,我有一个包含 2 个步骤的瀑布对话框。第一步显示带有几个选项的提示。最后一步检索选定的值并结束对话和对话。在我的情况下,我希望将所选值作为技能的输出返回,以便我可以将其保存到作曲家中的一个变量中,并在稍后的对话中使用它。
我的对话代码是:
public class ActiveFuelCardDialog : ComponentDialog
{
public ActiveFuelCardDialog() : base(nameof(ActiveFuelCardDialog))
{
InitializeWaterfallDialog();
}
public WaterfallStepContext StepContext { get; private set; }
private void InitializeWaterfallDialog()
{
var waterFallSteps = new WaterfallStep[]
{
CardSelectionStepAsync,
FinalStepAsync
};
AddDialog(new WaterfallDialog($"{nameof(ActiveFuelCardDialog)}.mainFlow", waterFallSteps));
AddDialog(new ChoicePrompt($"{nameof(ActiveFuelCardDialog)}.cardSelection"));
InitialDialogId = $"{nameof(ActiveFuelCardDialog)}.mainFlow";
}
private async Task<DialogTurnResult> CardSelectionStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
StepContext = stepContext;
//then return back a list of 2 cards
//in the format: CardType
List<ActiveFuelCardsOutput> activeFuelCardsOutputs = new List<ActiveFuelCardsOutput>();
activeFuelCardsOutputs.Add(new ActiveFuelCardsOutput()
{
CardNo = "1234567890123456",
CardType = "WM",
ExpiryDate = DateTime.Now.AddMonths(8)
});
activeFuelCardsOutputs.Add(new ActiveFuelCardsOutput()
{
CardNo = "2345678901234657",
CardType = "WM",
ExpiryDate = DateTime.Now.AddMonths(6)
});
activeFuelCardsOutputs.Add(new ActiveFuelCardsOutput()
{
CardNo = "3456789012345678",
CardType = "WM",
ExpiryDate = DateTime.Now.AddMonths(12)
});
return await stepContext.PromptAsync($"{nameof(ActiveFuelCardDialog)}.cardSelection",
new PromptOptions
{
Prompt = MessageFactory.Text("Please select a card"),
Choices = ChoiceFactory.ToChoices(activeFuelCardsOutputs.Select(x => x.CardNo).ToArray())
}, cancellationToken);
}
private async Task<DialogTurnResult> FinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
StepContext = stepContext;
string selectedCard = ((FoundChoice)stepContext.Result).Value;
//https://techcommunity.microsoft.com/t5/teams-developer/skill-dialog-enddialog-does-not-work/m-p/1476612
await stepContext.Context.SendActivityAsync(new Activity()
{
Type = ActivityTypes.EndOfConversation,
Code = EndOfConversationCodes.CompletedSuccessfully,
Value = selectedCard
});
return await stepContext.EndDialogAsync();
}
}
导致此功能为我工作的部分是在 FinalStepAsync 方法中
await stepContext.Context.SendActivityAsync(new Activity()
{
Type = ActivityTypes.EndOfConversation,
Code = EndOfConversationCodes.CompletedSuccessfully,
Value = selectedCard
});
return await stepContext.EndDialogAsync();
这似乎结束了对话并返回值。
然后我可以通过将技能的“属性”设置为某个变量(例如 dialog.selectedCard)在 Bot Composer 中使用它。然后使用“${dialog.selectedCard}”之类的后期值。
这篇文章将我引向了这个答案。
Helpful Post
Showing Conversation calling skill & using value