我的机器人有LUIS对话框,有几个意图。我从MessageController调用LUIS对话框。如果检测到意图,我会启动一个子对话框。子对话框完成后,我调用context.Done("response from user").
之后调用ChlildDialogDone
任务。
在ChildDialogDone
内部任务我想再次调用LUIS对话框来检测用户消息的意图(来自ChildDialogDone
)。现在在ChildDialogDone
里面我有context.Wait(MessageReceived).
当执行这行代码时,没有任何反应,我的机器人正在等待来自用户的下一条消息。
以下是代码:
[Serializable]
public partial class DefiningIntentDialog : LuisDialog<object>
{
[LuisIntent("")]
public async Task NoIntent(IDialogContext context, LuisResult result)
{
var dialog = new GreetingsDialog();
dialog.InitialMessage = result.Query;
context.Call(dialog, GreetingDialogDone);
}
[LuisIntent("Email")]
public virtual async Task ConfirmationEmail(IDialogContext context, LuisResult result)
{
await context.Forward(new EmailDialog, EmailDialogDone, "message", CancellationToken.None);
}
private async Task EmailDialogDone(IDialogContext context, IAwaitable<string> argument)
{
var messageHandled = await argument;
context.Wait(MessageReceived);
}
}
所以在EmailDialogDone中我有一些来自用户的消息,我想再次使用此消息执行DefiningIntent对话框。我该怎么办?
答案 0 :(得分:4)
您可以重复LUIS对话框的MessegaReceived上的逻辑,以实现您想要做的事情。基本上,这段代码应该与你需要的东西非常一致:
var tasks = this.services.Select(s => s.QueryAsync(messageHandled, CancellationToken.None)).ToArray();
var winner = this.BestResultFrom(await Task.WhenAll(tasks));
IntentActivityHandler handler = null;
if (winner == null || !this.handlerByIntent.TryGetValue(winner.BestIntent.Intent, out handler))
{
handler = this.handlerByIntent[string.Empty];
}
if (handler != null)
{
await handler(context, null, winner?.Result);
}
引用具有“this”的内容的代码段是您继承的LUIS Dialog的一部分。
检查this以获取更多详细信息,并确保您使用的是最新版本的BotBuilder SDK(在本文发布时:v3.2.1)
答案 1 :(得分:1)
无需从MessegaReceived复制逻辑。 你可以调用MessegaReceived:
private async Task EmailDialogDone(IDialogContext context, IAwaitable<string> argument)
{
await MessageReceived(context, new AwaitableFromItem<IMessageActivity>((IMessageActivity)context.Activity));
}