frameworks - 在消息控制器外部以编程方式调用 LUIS
问题描述
我正在编写一个使用提示对话框与用户交互的机器人应用程序。这里的想法是,当用户选择某个选项时,应向 LUIS 发送一条消息,该 LUIS 将通过 ML 处理请求。想了两种方法来完成它。1 - 直接调用 LUIS 2 - 模拟用户条目以确保消息将通过消息控制器,最后是将进行 LUIS 调用的根对话框 有意义吗?我已经尝试过这样的事情,但没有奏效。
public virtual async Task ChoiceReceivedAsync_MainMenuOption(IDialogContext context, IAwaitable<MainMenuOption> activity)
{
...
IMessageActivity message = Activity.CreateMessageActivity();
message.Text = "Como e a seguranca da escola?";
message.TextFormat = "plain";
message.Locale = "en-Us";
var luisAttributes = new LuisModelAttribute(BellaMain.GlobalVariable.LuisModelID, BellaMain.GlobalVariable.LuisSubscriptionKey);
var luisService = new LuisService(luisAttributes);
await Conversation.SendAsync(message, () => new Dialogs.RootDialog(luisService));
}
有任何想法吗?
谢谢
解决方案
不建议尝试通过模拟要发送到机器人的新 Activity 来调用 LUIS。相反,您应该通过使用 HttpClient 的简单请求调用 LUIS。
复制粘贴示例:
using System;
using System.Net.Http.Headers;
using System.Text;
using System.Net.Http;
using System.Web;
namespace CSHttpClientSample
{
static class Program
{
static void Main()
{
MakeRequest();
Console.WriteLine("Hit ENTER to exit...");
Console.ReadLine();
}
static async void MakeRequest()
{
var client = new HttpClient();
var queryString = HttpUtility.ParseQueryString(string.Empty);
// Request headers
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{subscription key}");
// Request parameters
queryString["timezoneOffset"] = "{number}";
queryString["verbose"] = "{boolean}";
queryString["spellCheck"] = "{boolean}";
queryString["staging"] = "{boolean}";
queryString["bing-spell-check-subscription-key"] = "{string}";
queryString["log"] = "{boolean}";
var uri = "https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/{appId}?q={q}&" + queryString;
var response = await client.GetAsync(uri);
}
}
}