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

问题描述 投票:0回答:1

我有一个用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或对话框中收集数字,然后从单个地方发送响应而不是复制代码。

任何建议都感激不尽......

c# botframework luis
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.