beginDialogAction不重新提示

时间:2018-07-31 08:30:39

标签: node.js dialog botframework prompt chatbot

我目前正在将Microsoft Bot Framework与node.js结合使用,以编写一个通过API遍历决策树的漫游器。我想允许用户在对话框中的任何时候取消树,这样他就不必遍历整个树(可能很大)退出。因为如果会话关闭,我需要向API发送消息,所以我使用reflog而不是Dialog.beginDialogAction()来启动“取消”对话框,以便提示用户进行确认以及关闭会话。

现在我已经准备好了,取消树就可以了,但是如果用户选择对确认提示说“否”,并且机器人实际上应该再次提示最后一个问题,则有时会使用“否”以自动回答上一个问题(或引发错误)。仅当问题的valueType为“字符串”并且显示Dialog.cancelAction()对话框时,才会出现Prompts.choicePrompts.number的预期行为。

我已经搜索了所有可以找到的文档,但是没有有关不支持DialogAction或类似内容的某些提示的信息。我仅使用Prompts.timesession.beginDialogsession.endDialogsession.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.beginDialogsession.endDialogsession.endConversation。我所做的唯一更改是删除了私人信息并将消息翻译成英语。

builder.Prompts

1 个答案:

答案 0 :(得分:0)

这可能是嵌套字符串“提示”对话框的问题。目前,我只找到一些解决方法来快速解决此问题。

  1. 最快:扩大提示对话框的退出范围,如果Bot获得无效输入,将提示您该问题。

    builder.Prompts.choice(session, args[1].text, args[1].answerValues, {
          listStyle: builder.ListStyle.button,
          maxRetries: 2
        });
    
  2. 如我所见,您将把treeNote传递到选择对话框,因此您可以尝试使用replaceDialog()而不是beginDialog()来清除嵌套的对话框堆栈。在您的cancel对话框中,也将endDialog()替换为replaceDialog()