Botframework: Никаких перерывов в работе с другими диалоговыми окнами намерений, пока не будет выполнено текущее диалоговое окно намерений.

Я намерен A и B использовать LUIS.ai. В намерении А я использую builder.Prompts.text, чтобы задать пару вопросов пользователям. Однако иногда в зависимости от ответа он переключался на намерение B. Я предполагаю, что это совпадает с моим намерением B, хотя я думаю, что этого не должно быть. Есть ли способ предотвратить это? Если я прохожу через диалоги намерения А, я не хочу, чтобы меня отвлекали другие намерения, пока я не закончу. Вот пример моего кода.

bot.dialog('A', [
    function (session, args, next) {
        ...
    }, 
    function (session, args, next) {
        ...
    },
    function (session, args) {
        ...
    }
]).triggerAction({
    matches: 'A'
});


bot.dialog('B', [
    function (session, args, next) {
        ...
    }, 
    function (session, args, next) {
        ...
    },
    function (session, args) {
        ...
    }
]).triggerAction({
    matches: 'B'
});

person user3128376    schedule 11.04.2017    source источник


Ответы (2)


Вот что делают с тобой triggerActions. Они могут быть очень удобны, чтобы держать ваши диалоги открытыми (http://www.pveller.com/smarter-conversations-part-2-open-dialogs), но в вашем случае они мешают.

Вы можете сохранить свои диалоги невосприимчивыми к глобальной системе маршрутизации, если разместите их под IntentDialog. Если все, что вы делаете, это A и B, то это будет беспрерывный эквивалент вашего кода:

const intents = new builder.IntentDialog({
    recognizers: [
        new builder.LuisRecognizer(process.env.LUIS_ENDPOINT)
    ]
});

intents.matches('A', 'A');
intents.matches('B', 'B');

bot.dialog('/', intents);
bot.dialog('A', []);
bot.dialog('B', []);
person Pavel Veller    schedule 11.04.2017
comment
Причина, по которой я переключился на triggerAction с IntentDialog, заключается в том, чтобы использовать cancelAction, чтобы иметь возможность отменять диалоги, когда пользователь вводит команду cancel / stop. Есть ли способ сделать это, если я помещаю свои намерения под IntentDialog? - person user3128376; 11.04.2017
comment
Конечно, можете, с Intent.Dialog cancelAction. Но в коде Павла здесь он передает dialogId для своего второго параметра в intents.matches. Этот dialogId относится к тем же диалоговым окнам, которые у вас изначально были без triggerAction. Таким образом, пока IntentDialog обрабатывает намерения, он перенаправляет обратно к тому, что вы использовали до сих пор (UniversalBot.dialog), позволяя вам продолжать использовать cancelAction. - person Steven G.; 11.04.2017
comment
Не уверен, что я использую его неправильно, но когда я использую intent.matches('A', [...]).cancelAction(...); в любое время, когда оно соответствует моему ключевому слову cancel, оно переходит к cancelAction намерению A вместо намерения, в котором я участвую (т. Е. Намерения B). Как бы сделать его не глобальным? У меня в основном есть то, что есть у Павла, но я просто хочу добавить к нему cancelAction и сделать его не глобальным. Спасибо - person user3128376; 12.04.2017
comment
cancelAction должен присоединяться к внутреннему диалогу. Вы прикрепили его к внешнему IntentDialog, связанному с /. Вам нужно что-то вроде intent.matches('A', 'A'), а затем bot.dialog('A', [ ]).cancelAction(). Это добавит действие отмены к диалоговому окну A, а не к /. Имеет смысл? - person Pavel Veller; 13.04.2017

Все, что вам нужно сделать, это:

var recognizer = new builder.LuisRecognizer(url) 
    .onEnabled(function (context, callback) {
        // LUIS is only ON when there are no tasks pending(e.g. Prompt text) 
        var enabled = context.dialogStack().length === 0; 
        callback(null, enabled); 
    });
person Rajesh Gupta    schedule 18.05.2018