На самом деле это может быть проблемой, я думаю. Просто удалите делегата и используйте метод BuildForm.

спериментируем с MS Bot Framework и не совсем разобрались, как сделать этот сценарий:

У нас есть диалог LUIS (тип<object>), который работает правильно и обучен правильно. Чтобы использовать пример общего сэндвича, основа того, что ищет цель LUIS, - это пользователь, запрашивающий статус заказа. Если в вопросе был указан номер заказа («Каков статус заказа 1234?»), То диалоговое окно LUIS выполняет поиск и напрямую сообщает о состоянии (которое в настоящее время работает).

Однако, если пользователь просто инициирует намерение, не предоставив номер заказа («Я хотел бы посмотреть статус заказа.»), Я бы хотел запустить другой диалог / форму, чтобы спросить пользователя, будут ли они нравится искать заказ по адресу или номеру заказа, а затем делать соответствующий поиск БД в зависимости от того, как они отвечают.

Я просто не уверен, как настроить форму / диалог (или даже что лучше всего в этом случае), чтобы сделать другой поиск, основанный на том, выбирают ли они поиск адреса или номера.

Вот намерение до сих пор:

private readonly BuildFormDelegate<OrderStatusDialog> OrderStatusDelegate;

[LuisIntent(nameof(LuisIntents.OrderStatus))]
public async Task OrderStatus(IDialogContext context, LuisResult result)
{
    // Order number(s) were provided
    if (result.Entities.Any(Entity => Entity.Type == nameof(LuisEntityTypes.OrderNumber)))
    {
        // Loop in case they asked about multiple orders
        foreach (var entity in result.Entities.Where(Entity => Entity.Type == nameof(LuisEntityTypes.OrderNumber)))
        {
            var orderNum = entity.Entity;

            // Call webservice to check status
            var request = new RestRequest(Properties.Settings.Default.GetOrderByNum, Method.GET);
            request.AddUrlSegment("num", orderNum);
            var response = await RestHelper.SendRestRequestAsync(request);

            var parsedResponse = JObject.Parse(response);

            if ((bool)parsedResponse["errored"])
            {
                await context.PostAsync((string)parsedResponse["errMsg"]);
                continue;
            }

            // Grab status from returned JSON
            var status = parsedResponse["orderStatus"].ToString();

            await context.PostAsync($"The status of order {orderNum} is {status}");
        }

        context.Wait(MessageReceived);
    }
    // Order number was not provided
    else
    {
        var orderStatusForm = new FormDialog<OrderStatusDialog>(new OrderStatusDialog(), OrderStatusDelegate,
            FormOptions.PromptInStart);
        context.Call<OrderStatusDialog>(orderStatusForm, CallBack);
    }
}

private async Task CallBack(IDialogContext context, IAwaitable<object> result)
{
    context.Wait(MessageReceived);
}

И форма:

public enum OrderStatusLookupOptions
{
    Address,
    OrderNumber
}

[Serializable]
public class OrderStatusDialog
{
    public OrderStatusLookupOptions? LookupOption;

    public static IForm<OrderStatusDialog> BuildForm()
    {
        return new FormBuilder<OrderStatusDialog>()
            .Message("In order to look up the status of a order, we will first need either the order number or your delivery address.")
            .Build();
    }
}

Ответы на вопрос(1)

Ваш ответ на вопрос