botFramework v4如何在LUIS调用后处理对话框响应

时间:2019-02-20 22:11:47

标签: c# botframework luis

我有一个用C#编写的机器人,该机器人正在使用LUIS来确定意图。我有一个方法来调用LUIS服务,然后寻找一个“ Open_Case”意图。该模型定义了一个CaseNumber实体,该实体可以或可以不包括在LUIS服务的响应中。 如果响应中没有案例编号实体,那么我将启动一个对话框,要求用户输入案例编号。 有了案件号后,我想退还一张包含案件信息的卡。

这是我的代码:-

/// <summary>
/// Dispatches the turn to the requested LUIS model.
/// </summary>
private async Task DispatchToLuisModelAsync(ITurnContext context, string appName, DialogContext dc, CancellationToken cancellationToken =
default (CancellationToken)) {
var result = await botServices.LuisServices[appName].RecognizeAsync(context, cancellationToken);
var intent = result.Intents ? .FirstOrDefault();

    string caseNumber = null;

    if (intent ? .Key == "Open_Case") {
    if (!result.Entities.ContainsKey("Case_CaseNumber")) {
    var dialogResult = await dc.BeginDialogAsync(CaseNumberDialogId, null, cancellationToken);
     } else {
      caseNumber = (string)((Newtonsoft.Json.Linq.JValue) result.Entities["Case_CaseNumber"].First).Value;
      var cardAttachment = botServices.CaseInfoServices.LookupCase(caseNumber);
      var reply = context.Activity.CreateReply();
      reply.Attachments = new List < Attachment > () {
       cardAttachment
      };
      await context.SendActivityAsync(reply, cancellationToken);
     }
    }
   }

我正在努力的是代码发送卡响应的位置。 在当前代码中,如果LUIS响应中返回了数字,则我将卡片发送给我,但是如果没有数字,并且启动了对话框,则只能在对话框的最后一步或在对话框中访问该数字。对话结果在根转弯处理程序中。我目前已在对话框的最后一步中复制了答复,但感觉不对且不雅。 我确信必须有一种方法可以从LUIS或对话框中收集号码,然后从一个地方发送响应,而不是重复代码。

任何收到建议的人...

1 个答案:

答案 0 :(得分:0)

我得出的结论是,我需要将显示卡的代码放入bot类的方法中,然后在dialogTurnStatus等于Complete时从代码片段中的else以及转弯处理程序中调用它/ p>