Как лучше всего модульные диалоги с Microsoft Bot Framework (v3)? - PullRequest
0 голосов
/ 27 октября 2019

Мне только что дали проект, в котором мне нужно изучить и разобраться с Microsoft Bot Framework версии 3.2 (это старый проект, который я изменяю).

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

Насколько я понимаю, когда вы создаете своего бота, как этот

// CODE SAMPLE 1
const bot = new builder.UniversalBot(connector, [
    function (session) {
        session.send("Welcome to the dinner reservation.");
        session.beginDialog('askForDateTime');
    },
   /*
   functions omitted for brevity 
   */
]).set('storage', inMemoryStorage); // Register in-memory storage 

, при создании бота должен быть задан массив функций, составляющих ваш "диалог по умолчанию", то естьВы не можете добавить диалоговое окно по умолчанию на более позднем этапе или изменить его. Это правильно?

Тогда, позже, если вы захотите модульную структуру диалогового окна, вы можете получить что-то вроде этого (ссылаясь на код выше)

// CODE SAMPLE 2 (in same file as code above)
bot.dialog('askForDateTime', [
    function (session) {
        builder.Prompts.time(session, "Please provide a reservation date and time (e.g.: June 6th at 5pm)");
    },
    function (session, results) {
        session.endDialogWithResult(results);
    }
]);

Итак, это bot.dialog регистрация этого диалога с ботом для последующего использования? То есть есть какой-то поиск во время выполнения - во время разговора - на основе этой строки, которая связывает session.beginDialog('askForDateTime'); в первом примере кода с функциями, зарегистрированными с bot.dialog('askForDateTime') во втором примере кода?

Когда я посмотрел ссылку на SDK, я увидел, что beginDialog принимает IAddress

function beginDialog(address: IAddress, dialogId: string, dialogArgs?: any, done?: (err: Error) => void)

, где написано

Информация о маршрутизации адреса длямероприятие. Адреса являются двунаправленными, то есть могут использоваться как для входящих, так и для исходящих событий. Они также специфичны для коннекторов, что означает, что коннекторы могут свободно добавлять свои собственные поля к адресу.

Так что эта «регистрация» через строку в основном представляет собой систему регистрации событий, вроде addEventListenerно в этом случае это не регистрация действия как такового, а диалог?

Два последних вопроса:

Можно ли позвонить session.beginDialog из bot.dialog? То есть есть вложенное дерево диалогов? На самом деле, единственный пример - вложение из диалогового окна по умолчанию, но я не знал, можно ли углубиться в него.

Наконец, как можно модульно оформить ваши диалоги в отдельные модули узлов, то есть переместитьваши поддиалоги в отдельные файлы? Я думал о чем-то вроде этого:

// askForDateTime.js
module.exports = bot => 
     bot.dialog('askForDateTime', [
        function (session) {
            builder.Prompts.time(session, "Please provide a reservation date and time (e.g.: June 6th at 5pm)");
        },
        function (session, results) {
            session.endDialogWithResult(results);
        }
    ]);

, но не вижу, как использовать его в моем основном приложении

// app.js
 const askDateTimeDialog = require('./askForDateTime')(bot) // how to use this?  I need to pass in a bot that's not yet created.  Do I even need to import it?

 const bot = new builder.UniversalBot(connector, [
        function (session) {
            session.send("Welcome to the dinner reservation.");
            session.beginDialog('askForDateTime'); // <--- how to beginDialog with imported dialog?  Or is the 'registration' behind the scenes sufficient since I'm just using the same string?
        },
       /*
       functions omitted for brevity 
       */
    ]).set('storage', inMemoryStorage); // Register in-memory storage 

Спасибо за любую помощь! Я понимаю, что, возможно, с версией 4 все проще, но мне нужно использовать более раннюю версию.

1 Ответ

1 голос
/ 29 октября 2019

Прежде всего, имейте в виду, что Botbuilder V3 находится на закате с поддержкой, заканчивающейся в конце 2019. Вы можете прочитать больше об этой теме здесь и варианты перехода с v3 на v4 здесь .

Что касается диалогов по умолчанию, другой метод состоит в том, чтобы только передать соединитель в адаптер, а затем запустить диалоговое окно при появлении conversationUpdate. Есть некоторые проблемы, которые могут всплыть при использовании conversationUpdate, поэтому я бы посмотрел этот пост в блоге, прежде чем продолжить.

var bot = new builder.UniversalBot(connector)

bot.on('conversationUpdate', function (message) {
    if (message.membersAdded) {
        message.membersAdded.forEach(function (identity) {
            if (identity.id === message.address.bot.id) {
                bot.beginDialog(message.address, '/main');
            }
        });
    }
});


// ----greetings.js -----
bot.dialog('/main', [
    function (session, args, next) {
        session.send("Glad you could join.");
        session.beginDialog('/nextDialog');
    }
]);

Что касается beginDialog() регистрация / адресация, естьпредварительная регистрация не происходит. Когда вызывается диалог, он по сути вызывается, как и любая другая функция. Этот адрес, более или менее, используется для управления состоянием диалога (т. Е. Когда бот находится в диалоге) - независимо от того, добавляется ли диалог в стек, используется ли он или выгружается из стека.

Что касается вызова одного диалога внутри другого, да, это выполнимо, как вы можете видеть в этом примере:

lib.dialog('/', [

    [...other functions...]

    function (session, args) {
        session.dialogData.recipientPhoneNumber = args.response;
        session.beginDialog('validators:notes', {
            prompt: session.gettext('ask_note'),
            retryPrompt: session.gettext('invalid_note')
        });
    },

    [...other functions...]

]);

Наконец, что касается модульности, да, это также выполнимо. Посмотрите на любой из этих двух образцов. core-MultiDialogs является менее сложным, но demo-ContosoFlowers также является хорошим примером для справки.

Надежда на помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...