Azure聊天機器人4-實現luis dialog
阿新 • • 發佈:2018-12-02
在rootDialog訊息轉發到LuisDialog
[Serializable] public class RootDialog : IDialog<object> { public Task StartAsync(IDialogContext context) { context.Wait(MessageReceivedAsync); return Task.CompletedTask; } private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result) { var activity = await result as Activity; await context.Forward(new LanguageParseDialog(), ResumeAftelLuisDialog, activity, CancellationToken.None); } private async Task ResumeAftelLuisDialog(IDialogContext context, IAwaitable<object> result) { context.Wait(MessageReceivedAsync); } }
LuisDialog:
[Serializable] [LuisModel(Constant.LuisModelId, Constant.LuisSubscribeKey, domain: "southeastasia.api.cognitive.microsoft.com")] public class LanguageParseDialog : LuisDialog<object> { public LanguageParseDialog() { } public LanguageParseDialog(ILuisService service) : base(service) { } [LuisIntent("")] [LuisIntent("None")] public async Task None(IDialogContext context, LuisResult result) { var errorResult = "Try something else, please."; await context.PostAsync(errorResult); context.Wait(this.MessageReceived); } [LuisIntent("MovieTickets.book")] public async Task BookMovieTicket(IDialogContext context, LuisResult luisResult) { string response = string.Empty; response = "Do you want to book movie ticket ?"; await context.PostAsync(response); context.Wait(this.MessageReceived); } [LuisIntent("Music.PlayMusic")] public async Task PlayMusic(IDialogContext context, LuisResult luisResult) { string response = string.Empty; response = "Do you want to play music?"; await context.PostAsync(response); context.Wait(this.MessageReceived); } [LuisIntent("Weather.GetForecast")] public async Task Weather(IDialogContext context, LuisResult luisResult) { string response = string.Empty; //TODO link to weather response = "You want to know the weather?"; await context.PostAsync(response); context.Wait(this.MessageReceived); } }
Controller實現:
[BotAuthentication] public class MessagesController : ApiController { /// <summary> /// POST: api/Messages /// Receive a message from a user and reply to it /// </summary> public async Task<HttpResponseMessage> Post([FromBody]Activity activity) { if (activity.GetActivityType() == ActivityTypes.Message) { await Conversation.SendAsync(activity, () => new Dialogs.RootDialog()); } else { HandleSystemMessage(activity); } var response = Request.CreateResponse(HttpStatusCode.OK); return response; } private Activity HandleSystemMessage(Activity message) { string messageType = message.GetActivityType(); if (messageType == ActivityTypes.DeleteUserData) { // Implement user deletion here // If we handle user deletion, return a real message } else if (messageType == ActivityTypes.ConversationUpdate) { // Handle conversation state changes, like members being added and removed // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info // Not available in all channels } else if (messageType == ActivityTypes.ContactRelationUpdate) { // Handle add/remove from contact lists // Activity.From + Activity.Action represent what happened } else if (messageType == ActivityTypes.Typing) { // Handle knowing that the user is typing } else if (messageType == ActivityTypes.Ping) { } return null; } }