Диалог навыков Microsoft Teams Bot-Framework: endDialog () не работает - PullRequest
0 голосов
/ 19 июня 2020

Я реализую dialogRootBot, который будет вызывать skillDialogBot.

Мой dialogRootBot может вызывать skillDialogBot. Разговор может продолжаться до момента, когда skillDialogBot должен вернуть результаты в dialogRootBot.

SkillDialogBot имеет следующие настройки:

this.addDialog(new TextPrompt(TEXT_PROMPT))
.addDialog(new ConfirmPrompt(CONFIRM_PROMPT))
.addDialog(new WaterfallDialog(WATERFALL_DIALOG, [
    this.processStep.bind(this)
]));

processStep выглядит следующим образом

async processStep(stepContext) {
const details = stepContext.options;
details.result = {
    status: 'success'
};
return await stepContext.endDialog(stepContext.options);

}

Я ожидал, что dialogRootBot получит результат от skillDialogBot после того, как processStep вызвал endDialog, но этого никогда не происходит. Вместо этого пользователь застревает в skillDialogBot до тех пор, пока пользователь вручную не наберет "abort", то есть команду, которую dialogRootBot отслеживает для отмены всех диалогов в своей реализации onContinueDialog ().

Вот как onContinueDialog () выглядит как

async onContinueDialog(innerDc) {
    const activeSkill = await this.activeSkillProperty.get(innerDc.context, () => null);
    const activity = innerDc.context.activity;
    if (activeSkill != null && activity.type === ActivityTypes.Message && activity.text) {
        if (activity.text.toLocaleLowerCase() === 'abort') {
            // Cancel all dialogs when the user says abort.
            // The SkillDialog automatically sends an EndOfConversation message to the skill to let the
            // skill know that it needs to end its current dialogs, too.
            await innerDc.cancelAllDialogs();
            return await innerDc.replaceDialog(this.initialDialogId, { text: 'Request canceled!' });
        }
    }

    return await super.onContinueDialog(innerDc);
}

Я смоделировал это по образцу botbuilder-samples \ samples \ javascript_nodejs \ 81.skills-skilldialog. Если бы я изменил skillDialogBot и заставил его выполнить ConfirmPrompt () перед endDialog () finalStep (), то разговор завершился бы правильно, когда skillDialogBot () отправит результаты диалога в rootDialogBot.

Для ясности, вот как выглядит bookingDialog в примере skills-skilldialog

/**
 * Confirm the information the user has provided.
 */
async confirmStep(stepContext) {
    const bookingDetails = stepContext.options;

    // Capture the results of the previous step.
    bookingDetails.travelDate = stepContext.result;
    const messageText = `Please confirm, I have you traveling to: ${ bookingDetails.destination } from: ${ bookingDetails.origin } on: ${ bookingDetails.travelDate }. Is this correct?`;
    const msg = MessageFactory.text(messageText, messageText, InputHints.ExpectingInput);

    // Offer a YES/NO prompt.
    return await stepContext.prompt(CONFIRM_PROMPT, { prompt: msg });
}

/**
 * Complete the interaction and end the dialog.
 */
async finalStep(stepContext) {
    if (stepContext.result === true) {
        const bookingDetails = stepContext.options;
        return await stepContext.endDialog(bookingDetails);
    }
    return await stepContext.endDialog();
}

Нельзя ли завершить диалог endDialog () без приглашения? Почему мой skillDialogBot не может завершить диалог и передать результаты rootDialogBot?

Спасибо

1 Ответ

0 голосов
/ 23 июня 2020

Для справки, при использовании stepContext.beginDialog () кажется, что мы не можем надежно endDialog (), если в диалог водопада не добавлен шаг приглашения. Если есть вариант использования, когда мы хотим использовать skillDialogBot и вызвать конкретный диалог c в skillDialogBot через stepContext.beginDialog (), а вызываемый диалог выполняет только обработку (например, вызывает REST API) без необходимости запрашивать у пользователей дополнительную информацию, в конце обработки мы можем вместо этого завершить беседу.

Следовательно, предполагая, что finalStep () привязан к диалогу водопада в качестве последнего шага, просто используйте следующий in finalStep ()

return await stepContext.context.sendActivity({
    type: ActivityTypes.EndOfConversation,
    code: EndOfConversationCodes.CompletedSuccessfully,
    value: stepContext.options
});

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

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