我有一个用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或对话框中收集数字,然后从单个地方发送响应而不是复制代码。
任何建议都感激不尽......
我得出的结论是,我需要将显示卡的代码放入bot类的方法中,然后在dialogTurnStatus等于Complete时从代码片段中的else和转向处理程序中调用它。