Я реализовал нечто подобное через старую версию Core-Bot, но он проверяет прерывание в моем намерении, а не как отдельный диалог.Это также node.js, но приведенный здесь пример, так как я думаю, что он может помочь вам найти рабочее решение для вашего варианта использования.
После того, как я вернусь, я вызываю функцию для запуска соответствующего диалога.или действие.Но перед ними я проверяю прерывание:
async dispatchToTopIntentAsync(context, intent, recognizerResult) {
const dc = await this.dialogs.createContext(context);
const userDialog = await this.userDialogStateAccessor.get(context, {});
if (context.activity.type === ActivityTypes.Message) {
let dialogResult;
const interrupted = await this.isTurnInterrupted(dc, recognizerResult);
if (interrupted) {
if (dc.activeDialog !== undefined) {
// issue a re-prompt on the active dialog
dialogResult = await dc.repromptDialog();
} // Else: We dont have an active dialog so nothing to continue here.
} else {
// No interruption. Continue any active dialogs.
dialogResult = await dc.continueDialog();
}
И функцию прерывания:
async isTurnInterrupted(dc, luisResults) {
const topIntent = LuisRecognizer.topIntent(luisResults);
const topIntentScore = luisResults.intents[topIntent].score;
// see if there are any conversation interrupts we need to handle
if (topIntent === CANCEL_INTENT & topIntentScore > 0.6) {
if (dc.activeDialog) {
// cancel all active dialog (clean the stack)
await dc.cancelAllDialogs();
await dc.context.sendActivity('Ok. I\'ve cancelled our last activity.');
} else {
await dc.context.sendActivity('I don\'t have anything to cancel. If you\'re not trying to cancel something, please ask your question again.');
}
return true; // this is an interruption
}
if (topIntent === HELP_INTENT & topIntentScore > 0.5) {
await dc.context.sendActivity('Let me try to provide some help.');
await dc.context.sendActivity('Right now I am trained to help you with order status and tracking. If you are stuck in a conversation, type "Cancel" to start over.');
return true; // this is an interruption
}
if (topIntent === EXPEDITE_INTENT & topIntentScore > 0.5) {
await dc.beginDialog(INTERRUPT_DIALOG, topIntent);
return false; // pushing new dialog so not an interruption
}
if (topIntent === ESCALATE_INTENT & topIntentScore > 0.5) {
await dc.beginDialog(INTERRUPT_DIALOG, topIntent);
return false; // pushing new dialog so not an interruption
}
return false; // this is not an interruption
}
Обратите внимание, что в первых двух прерываниях я отправляю сообщение напрямую и впоследние два я начинаю новый диалог.Я возвращаю false
в этих случаях, потому что я не хочу перекомпоновывать диалог, который я помещаю в стек.
В этом случае я нажимаю, но вы также можете заменить текущий активныйили отмените все диалоги и запустите новый.