Водопад диалоговое окно предлагает не работает в рамках бота - PullRequest
0 голосов
/ 25 мая 2019

Я все еще пытаюсь понять концепцию bot Framework v4 и диалогов.Я пытаюсь создать простой бот, который интегрируется с QnAMaker и LUIS.Обе интеграции работают по отдельности, но я не могу интегрировать их оба.Я впервые использую ASP.NET Core.Так что моя проблема может быть с этим тоже.

Итак, я создал бота на основе этого образца .

У меня есть базовое диалоговое окно, которое наследует класс Dialog.Базовый класс предоставляет абстрактную функцию, которую наследует дочерний класс диалога.Дочерний класс называется 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 Ответ

0 голосов
/ 28 мая 2019

Для жизни я не могу заставить Waterfall Dialogs работать с этим образцом в качестве основы (без переписывания целиком). Я рекомендую основывать свой бот на комбинации 11.qnamaker и 13.core-bot (которая использует LUIS и является хорошим примером для ComponentDialog s). Я делаю эту рекомендацию по двум причинам:

  1. Образец, который вы указали, является «экспериментальным», что означает, что он не только не готов к производству, но и может никогда не быть.
  2. Образец, который вы связали, использует дизайн State Machine, который не используется и не использовался никакими другими образцами ботов, поэтому будет очень трудно получить хорошую поддержку.

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

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