【发布时间】:2017-04-11 21:04:35
【问题描述】:
我正在使用 Microsoft 的 Bot Builder 和 LUIS,但对于非常基本的东西我遇到了一些困难。
我有响应 LUIS 意图的简单方法,其中一个我想调用 FormDialog(因此基于我拥有的一个非常简单的模型),仅此而已。当意图被识别时,我正确输入了正确的方法,并且我还看到我的模型的 BuildForm 方法被调用,但是机器人没有通过字段向用户询问值。
这是我的intent方法的代码(代码做的不多,还没有真正的目的):
[LuisIntent("SendMessage")]
public async Task SendMessage(IDialogContext context, LuisResult result)
{
// Check if the user has already configured its message box
bool isBoxConfigured = false;
context.UserData.TryGetValue<bool>(Constants.UserData.IsBoxConfigured, out isBoxConfigured);
if (!isBoxConfigured)
{
// Configure box
context.Call(new FormDialog<MessageBox>(new MessageBox(), this._configureMessageBox, FormOptions.PromptInStart), async (c, r) =>
{
await c.PostAsync("Message Box configurée !");
});
}
else
{
// Send message
await context.PostAsync("Votre Message Box est déjà configurée. Le message a été envoyé !");
}
context.Wait(MessageReceived);
}
这是我的 LUIS 对话框类的构造函数和 _configureMessageBox 属性:
public readonly BuildFormDelegate<MessageBox> _configureMessageBox;
public LUISDialog(BuildFormDelegate<MessageBox> configureMessageBox)
{
_configureMessageBox = configureMessageBox;
}
这是我的模型(表格):
[Serializable]
public class MessageBox
{
[Describe("numéro d'identification")]
[Prompt("Quel est le {&} de votre Message Box ?")]
public int Id { get; set; }
[Describe("surnom")]
[Prompt("Quel {&} voulez-vous lui donner ?")]
public string BoxName { get; set; }
public static IForm<MessageBox> BuildForm()
{
return new FormBuilder<MessageBox>()
.Message("Mmmh... Je ne connais pas votre Message Box. J'ai besoin de quelques informations.")
.Build();
}
}
当我向机器人发送消息“envoie un message”时,它会识别 SendMessage 意图,但会立即回复“消息框配置!”,这应该在 之后发送用户浏览表单。
有人知道我应该怎么做吗?
谢谢:)
【问题讨论】:
-
请出示您的表单,context.Wait(MessageReceived) 应该在表单的 else 和“ResumeAfter”方法中。
-
我在原始帖子中添加了表单代码。正如你所说,我还移动了
context.Wait(...)调用,现在我得到了表单的开头(消息+第一个字段提示),但立即出现错误:Exception: anonymous method closures that capture the environment are not serializable, consider removing environment capture or using a reflection serialization surrogate: BotTest.Dialogs.LUISDialog+<>c__DisplayClass4_0 -
对,那是因为 async (c, r) =>。将其移至方法并让我知道。一旦你确认我可以制定一个答案。
-
完美!现在可以用了,谢谢!但似乎在整个对话框类中经常需要回调。好像不太实用。这是一个好习惯吗?
-
我刚刚添加了正式答案。请投票并标记为已回答。您可以使用匿名方法,但您需要确保它们是可序列化的,否则它将因错误而失败。详情请参阅我的回答。
标签: botframework azure-language-understanding