2016-10-17 2 views
0

Я пытаюсь создать бота, который имеет набор известных «команд», которые, если они точно совпадают, запустит конкретное диалоговое окно. Если команда не распознана, она передает ее LUIS для обработки естественного языка.Необязательно вызывать LUIS из бота NodeJS, созданного с помощью Botframework

Я пробовал этот подход, который, казалось, работал частично, но при запуске подсказок не удалось активировать второй шаг водопада.

import builder = require('botbuilder'); 
let restify = require('restify'); 

let luisUrl = "MY_LUIS_URL_HERE"; 

let server = restify.createServer(); 
var connector = new builder.ChatConnector({ 
    appId: process.env.MICROSOFT_APP_ID, 
    appPassword: process.env.MICROSOFT_APP_PASSWORD 
}); 
let bot = new builder.UniversalBot(connector); 
server.post('/api/messages', connector.listen()); 
let recognizer = new builder.LuisRecognizer(luisUrl); 
let intentsDialog = new builder.IntentDialog({ recognizers: [recognizer] }); 


let mainLoopDlg = [ 
    (session, results) => { 
     let input = session.message.text.trim(); 
     if (input === "#mycmd") { 
      // Is a command 
      session.beginDialog('/mycmd'); 
     } else { 
      // Else assume is a natural language utterance 
      // Have tried all of the following 
      // Need a way to open a dialog and forward on the original message ... 
      intentsDialog.replyReceived(session); 
      //session.beginDialog('/intents'); 
      //session.beginDialog('/intents', { message: session.message }); 
      //session.beginDialog('/intents', session.dialogData.args); 
     } 
    } 
]; 

let commandDlg = [ 
    (session, results) => { 
     session.send("Command launched ..."); 
    } 
]; 

let intentDlg = [ 
    (session) => { 
     builder.Prompts.confirm(session, "hi"); 
    }, 
    (session, result) => { 
     // THIS IS NEVER REACHED ... 
     session.send("Hi" + result.response); 
    } 
]; 

bot.dialog('/', mainLoopDlg); 
bot.dialog('/mycmd', commandDlg); 
bot.dialog('/intents', intentDialog); 
intentsDialog.matches('Greeting', intentDlg); 

// Grab some secret data from the deploy environment 
server.listen(process.env.port || process.env.PORT || 3978,() => { 
    console.log("%s listening to %s", server.name, server.url); 
}); 

ответ

0

Хорошо, кажется, мне нужно использовать session.replaceDialog('/intents'); вместо intentsDialog.replyReceived(session);

Это, кажется, решить непосредственную проблему, является ли водонепроницаемым я не уверен. This issue on the BotFramework Github (который я поднял) делает что-то похожее для V1.0 фреймворка, и кажется, что, возможно, должно быть какое-то государственное управление, чтобы держать вещи под контролем. Пока что исправление, похоже, работает.