我目前正在将Microsoft Bot Framework与node.js结合使用,以编写一个通过API遍历决策树的漫游器。我想允许用户在对话框中的任何时候取消树,这样他就不必遍历整个树(可能很大)退出。因为如果会话关闭,我需要向API发送消息,所以我使用reflog
而不是Dialog.beginDialogAction()
来启动“取消”对话框,以便提示用户进行确认以及关闭会话。
现在我已经准备好了,取消树就可以了,但是如果用户选择对确认提示说“否”,并且机器人实际上应该再次提示最后一个问题,则有时会使用“否”以自动回答上一个问题(或引发错误)。仅当问题的valueType为“字符串”并且显示Dialog.cancelAction()
对话框时,才会出现Prompts.choice
和Prompts.number
的预期行为。
我已经搜索了所有可以找到的文档,但是没有有关不支持DialogAction或类似内容的某些提示的信息。我仅使用Prompts.time
,session.beginDialog
,session.endDialog
和session.endConversation
来控制对话框堆栈。
代码如下:
builder.Prompts
但是,机器人没有重新提示,而是跳至“选择”对话框中的//This dialog gets the next question node of the tree passed in args[1].
bot.dialog('select', [
function(session, args, next) {
//Depending on the value type of the question, different prompts are used.
switch (args[1].valueType) {
case "string":
builder.Prompts.choice(session, args[1].text, args[1].answerValues, {
listStyle: builder.ListStyle.button,
maxRetries: 0
});
break;
case "number":
builder.Prompts.number(session, args[1].text, {
integerOnly: true,
maxValue: 100,
minValue: 0
})
break;
case "datetime":
builder.Prompts.time(session, message + "\nPlease enter a date in the format 'yyyy-mm-dd'.");
break;
}
},
function(session, results) {
//Use the answer to proceed the tree.
//...
//With the new question node start over.
session.beginDialog('select', [sessionId, questionNode]);
}
]).beginDialogAction('cancelSelect', 'cancel', {
matches: /^stop$/i
});
//This dialog is used for cancelling.
bot.dialog('cancel', [
function(session, next) {
builder.Prompts.confirm(session, 'Do you really want to quit?');
},
function(session, results) {
if (results.response) {
finishSession();
session.endConversation('Session was closed.')
} else {
//Here the bot should stop this cancel-Dialog and reprompt the previous question
session.endDialog();
}
}
])
,在该对话框中,它试图解析答案“否”,显然失败了。
这是我的app.js的完整副本。您将无法在不模拟我们产品的esc-API的情况下运行它,但它表明我仅使用function (session, results)
,session.beginDialog
,session.endDialog
和session.endConversation
。我所做的唯一更改是删除了私人信息并将消息翻译成英语。
builder.Prompts
答案 0 :(得分:0)
这可能是嵌套字符串“提示”对话框的问题。目前,我只找到一些解决方法来快速解决此问题。
最快:扩大提示对话框的退出范围,如果Bot获得无效输入,将提示您该问题。
builder.Prompts.choice(session, args[1].text, args[1].answerValues, {
listStyle: builder.ListStyle.button,
maxRetries: 2
});
如我所见,您将把treeNote
传递到选择对话框,因此您可以尝试使用replaceDialog()
而不是beginDialog()
来清除嵌套的对话框堆栈。在您的cancel
对话框中,也将endDialog()
替换为replaceDialog()