【问题标题】:Prompt not waiting for user input提示不等待用户输入
【发布时间】:2018-09-28 13:09:59
【问题描述】:

我目前正在尝试使用 Microsofts Bot Framework 编写聊天机器人。我想使用选择提示,但它不会等待我/用户选择一个选项。甚至来自here 的示例代码都没有为我工作。请参阅此工作示例:

var restify = require('restify');
var builder = require('botbuilder');
var botbuilder_azure = require("botbuilder-azure");

// Setup Restify Server
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
   console.log('%s listening to %s', server.name, server.url); 

});

// Create chat connector for communicating with the Bot Framework Service
var connector = new builder.ChatConnector({
    appId: process.env.MicrosoftAppId,
    appPassword: process.env.MicrosoftAppPassword,
    openIdMetadata: process.env.BotOpenIdMetadata 
});

// Listen for messages from users 
server.post('/api/messages', connector.listen());

var bot = new builder.UniversalBot(connector);
bot.set('storage', new builder.MemoryBotStorage()); 

var luisAppId = process.env.LuisAppId;
var luisAPIKey = process.env.LuisAPIKey;
var luisAPIHostName = process.env.LuisAPIHostName || 'westus.api.cognitive.microsoft.com';

var LuisModelUrl = 'https://' + luisAPIHostName + '/luis/v2.0/apps/' + `enter code here`luisAppId + '?subscription-key=' + luisAPIKey;

/**
 * RECOGNIZERS
 */

var recognizer = new builder.LuisRecognizer(LuisModelUrl);
bot.recognizer(recognizer);


/**
 * DIALOG SECTION
 */
 var intents = new builder.IntentDialog({ recognizers: [recognizer] });
bot.dialog('/', intents);



   intents.onDefault([
        function(session){
            session.send('I am sorry but I don`t know that.');
        }
    ]);


intents.matches('City' ,[
     function(session, args) {

        session.beginDialog('getLocationDialog');
        session.endDialog();
    } 
]);

 var locationLabels = {
     City1: 'City 1',
     City2: 'City 2',
     City3: 'City 3'
 };

 bot.dialog('getLocationDialog', [
    function (session) {
       builder.Prompts.choice(session, "Choose a city", locationLabels
           , { listStyle: builder.ListStyle.button },{
                maxRetries: 3,
                retryPrompt: 'This is not a valid option. Choose one of the options listed above.' }); 
       },
    function (session, results) {
        console.log(results.response.entity);
        if (results.response){
            var location = locationLabels[results.response.entity];
            session.send('You are interested in %s', location);
            session.endDialog();
        }
        else {
           session.send('Okay.');
           session.endDialog(); 
        }
    }
]);  

带有提示的对话框就是这部分(意图使用LUIS匹配):

intents.matches('City' ,[
     function(session, args) {
   session.beginDialog('getLocationDialog');
   session.endDialog();
   } 
]);

 var locationLabels = {
     City1: 'City 1',
     City2: 'City 2',
     City3: 'City 3'
 };

 bot.dialog('getLocationDialog', [
    function (session) {
       builder.Prompts.choice(session, "Choose a city", locationLabels
           , { listStyle: builder.ListStyle.button },{
                maxRetries: 3,
                retryPrompt: 'This is not a valid option. Choose one of the options listed above.' }); 
       },
    function (session, results) {
        console.log(results.response.entity);
        if (results.response){
            var location = locationLabels[results.response.entity];
            session.send('You are interested in %s', location);
            session.endDialog();
        }
        else {
           session.send('Okay.');
           session.endDialog(); 
        }
    }
]);  

查看此代码的实际操作

机器人不会等我选择一个选项。有人可以告诉问题出在哪里吗?

【问题讨论】:

  • 我建议您不要使用 builder.IntentDialog()。现在接受的过程是使用 .triggerAction() 来匹配一个意图,然后启动相关的对话。

标签: node.js azure botframework prompt chatbot


【解决方案1】:

请尝试下面列出的代码。我做了一些改变,让它对我有用。首先,删除“City”意图匹配中的 session.EndDialog() 调用。该调用导致对话框在原始对话框完成之前重新开始。

其次,您将 locationLabels 变量设置为键/值对。这需要是一个简单的数组。如果您需要使用键/值对,请考虑使用 iChoice。

第三,你的 location 变量只需要赋值 results.response.entity。由于 locationLabels 是一个简单的数组,您不再需要尝试匹配它。

希望这会有所帮助。

史蒂夫。

var intents = new builder.IntentDialog({ recognizers: [recognizer] });
bot.dialog('/', intents);

intents.onDefault([
    function(session){
        session.send('I am sorry but I don`t know that.');
    }
]);

intents.matches('City' ,[
    function(session, args) {
        session.beginDialog('getLocationDialog');
        // session.endDialog();
    } 
]);

var locationLabels = ['City 1', 'City 2', 'City 3'];

bot.dialog('getLocationDialog', [
    function (session) {
        builder.Prompts.choice(session, "Choose a city", locationLabels, { listStyle: builder.ListStyle.button }); 
        },
    function (session, results) {
        console.log(results.response.entity);
        var location = results.response.entity;
        if (results.response){
            session.send('You are interested in %s', location);
            session.endDialog();
        }
        else {
           session.send('Okay.');
           session.endDialog(); 
        }
    }
]);

【讨论】:

  • 你是对的,删除该行以结束对话框就可以了。非常感谢您抽出宝贵时间查看我的代码并提出建议。