我的机器人有 LUIS 对话框,有几个意图。我从 MessageController 调用 LUIS 对话框。如果检测到意图,我将启动一个子对话框。当子对话框完成后,我调用context.Done("response from user").
在那之后ChlildDialogDone
任务被调用。
Inside ChildDialogDone
任务 我想再次调用 LUIS 对话框来检测用户消息的意图(这涉及到ChildDialogDone
)。现在里面ChildDialogDone
I have 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 对话框。我该怎么做?
您可以重复 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 对话框的一部分。
- services 是基于 LuisModel 属性实例化的 LuisServices 的集合。
- IntentActivityHandler 是 LuisIntent 修饰方法使用方法签名“实现”的处理程序。
- handlerbyIntent 是一个字典,键是对话框的意图名称,处理程序是需要为该意图调用的方法。
Check this https://github.com/Microsoft/BotBuilder/blob/master/CSharp/Library/Dialogs/LuisDialog.cs了解更多详细信息并确保您使用的是最新版本的 BotBuilder SDK(在本文发布时:v3.2.1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)