Водопад диалоговое окно предлагает не работает в рамках бота
Я все еще пытаюсь понять концепции бота framework v4 и диалогов. Я пытаюсь создать простой бот, который интегрируется с QnAMaker и LUIS. Обе интеграции работают по отдельности, но я не могу интегрировать их оба. Я впервые использую ASP.NET Core. Так что моя проблема может быть с этим тоже.
Итак, я создал бота на основе этого образца.
У меня есть базовый диалог, который наследует класс диалога. Базовый класс предоставляет абстрактную функцию, которую наследует дочерний класс диалога. Дочерний класс называется RootDialog.
FunctionDialogBase:
public FunctionDialogBase(string dialogId, IConfiguration configuration, ILogger logger) : base(dialogId)
{
Configuration = configuration;
Logger = logger;
}
public override async Task<DialogTurnResult> BeginDialogAsync(DialogContext dialogContext, object options = null, CancellationToken cancellationToken = default(CancellationToken))
{
return await RunStateMachineAsync(dialogContext, cancellationToken).ConfigureAwait(false);
}
public override async Task<DialogTurnResult> ContinueDialogAsync(DialogContext dialogContext, CancellationToken cancellationToken = default(CancellationToken))
{
return await RunStateMachineAsync(dialogContext, cancellationToken).ConfigureAwait(false);
}
//abstract method
protected abstract Task<(object newState, IEnumerable<Activity> output, object result)> ProcessAsync(object oldState,
Activity activity,
DialogContext dialogContext,
SPEntityDetails spEntityDetails,
CancellationToken cancellationToken);
private async Task<DialogTurnResult> RunStateMachineAsync(DialogContext dialogContext, CancellationToken cancellationToken)
{
var (newState, output, result) = await ProcessAsync(oldState, dialogContext.Context.Activity, dialogContext, spEntityDetails, cancellationToken).ConfigureAwait(false);
//do some more logic here
}
}
RootDialog вызывает другой диалог с именем CreateSiteDialog из его реализации абстрактного метода, например:
RootDialog:
protected override async Task<(object newState, IEnumerable<Activity> output, object result)> ProcessAsync(
object oldState,
Activity activity,
DialogContext dialogContext,
SPEntityDetails spEntityDetails,
CancellationToken cancellationToken)
{
dialogContext.Dialogs.Add(new CreateSiteDialog());
await dialogContext.BeginDialogAsync(nameof(CreateSiteDialog),spEntityDetails, cancellationToken);
return (null, new Activity[] { activity.CreateReply("Site created successfully.") }, null);
}
И, наконец, CreateSiteDialog, в котором есть проблема. Этот диалог следует модели водопада и должен теоретически переходить от одного шага водопада к следующему до конца. Это не происходит Когда я использую подсказку на первом шаге, она запускается и выходит из диалогового окна водопада. Следующий шаг водопада никогда не выполняется.
CreateSiteDialog:
public class CreateSiteDialog : CancelAndHelpDialog
{
public CreateSiteDialog() : base(nameof(CreateSiteDialog))
{
AddDialog(new TextPrompt(nameof(TextPrompt)));
AddDialog(new ConfirmPrompt(nameof(ConfirmPrompt)));
AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[]
{
ConfirmStepAsync,
FinalStepAsync
}));
// The initial child Dialog to run.
InitialDialogId = nameof(WaterfallDialog);
}
private async Task<DialogTurnResult> ConfirmStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
var spEntityDetails = (SPEntityDetails)stepContext.Options;
var msg = @"Creating site: http://yoursiteurl/" + spEntityDetails.SiteName + ". Confirm Yes/No.";
return await stepContext.PromptAsync(nameof(ConfirmPrompt), new PromptOptions { Prompt = MessageFactory.Text(msg) }, cancellationToken);
}
private async Task<DialogTurnResult> FinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
//handle propmt result from user action
}
}
Там также нет ошибки. Итак, я предполагаю, что я делаю что-то не так в использовании диалогов. Пожалуйста. Любая помощь будет оценена.
Я использую Visual Studio 2017, Bot Framework Emulator, Bot Framework V4 с проектом Core Bot.
1 ответ
Насколько я понимаю, я не могу заставить Waterfall Dialogs работать с этим образцом в качестве основы (без переписывания целиком). Я рекомендую основывать свой бот на комбинации 11.qnamaker и 13.core-bot (которая использует LUIS и является хорошим примером для ComponentDialog
с). Я делаю эту рекомендацию по двум причинам:
- Образец, на который вы ссылаетесь, является "экспериментальным", то есть он не только не готов к производству, но и может никогда не быть готовым.
- Образец, на который вы ссылаетесь, использует дизайн State Machine, который не используется и не использовался никакими другими образцами ботов, поэтому будет очень трудно получить хорошую поддержку.
Для того, чтобы QnAMaker и LUIS работали вместе, процесс действительно будет основан на вашем сценарии использования. Я не могу сказать из вашего включенного кода, что вы собираетесь. Таким образом, этот ответ в основном для того, чтобы заставить диалоги водопада работать.