From 4306358876ad998ae73d37a24a7d7bf212ae6d64 Mon Sep 17 00:00:00 2001 From: hchen Date: Thu, 10 Aug 2023 17:17:55 -0500 Subject: [PATCH] Fix FileRepository bug. --- .../ConversationCompletionHookBase.cs | 2 +- .../IConversationCompletionHook.cs | 2 +- .../Services/ConversationService.cs | 20 ++++++++++++----- .../Repository/FileRepository.cs | 8 +++++-- .../Providers/ChatCompletionProvider.cs | 5 ++++- .../ChatbotUiController.cs | 12 ---------- .../Controllers/WebhookController.cs | 22 +++++++++---------- 7 files changed, 37 insertions(+), 34 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Conversations/ConversationCompletionHookBase.cs b/src/Infrastructure/BotSharp.Abstraction/Conversations/ConversationCompletionHookBase.cs index 435fabaf..2995a9db 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Conversations/ConversationCompletionHookBase.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Conversations/ConversationCompletionHookBase.cs @@ -41,7 +41,7 @@ public abstract class ConversationCompletionHookBase : IConversationCompletionHo return this; } - public virtual Task OnStateLoaded(ConversationState state, Action? onAgentSwitched = null) + public virtual Task OnStateLoaded(ConversationState state, Action? onAgentSwitched = null) { return Task.CompletedTask; } diff --git a/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationCompletionHook.cs b/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationCompletionHook.cs index 02b294c9..05642325 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationCompletionHook.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationCompletionHook.cs @@ -17,7 +17,7 @@ public interface IConversationCompletionHook IChatCompletion ChatCompletion { get; } IConversationCompletionHook SetChatCompletion(IChatCompletion chatCompletion); - Task OnStateLoaded(ConversationState state, Action? onAgentSwitched = null); + Task OnStateLoaded(ConversationState state, Action? onAgentSwitched = null); Task BeforeCompletion(); Task OnFunctionExecuting(string name, string args); Task AfterCompletion(RoleDialogModel message); diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs index 6d2ee970..c7269efd 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs @@ -1,3 +1,4 @@ +using BotSharp.Abstraction.Conversations; using BotSharp.Abstraction.Conversations.Models; using BotSharp.Abstraction.Functions; using BotSharp.Abstraction.Knowledges.Models; @@ -118,9 +119,20 @@ public class ConversationService : IConversationService { var agent = await _services.GetRequiredService() .GetAgent(agentId); - + var converation = await GetConversation(conversationId); + // Create conversation if this conversation not exists + if (converation == null) + { + var sess = new Conversation + { + Id = conversationId, + AgentId = agentId + }; + converation = await NewConversation(sess); + } + // load state var stateService = _services.GetRequiredService(); var state = stateService.Load(conversationId); @@ -149,11 +161,7 @@ public class ConversationService : IConversationService .SetDialogs(wholeDialogs) .SetChatCompletion(chatCompletion); - await hook.OnStateLoaded(state, onAgentSwitched: (x, prompt) => - { - agent = x; - wholeDialogs.Add(new RoleDialogModel("user", prompt)); - }); + await hook.OnStateLoaded(state, onAgentSwitched: x => agent = x); await hook.BeforeCompletion(); } diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository.cs index 0dc105c5..3287343c 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository.cs @@ -101,8 +101,12 @@ public class FileRepository : IBotSharpRepository _conversations = new List(); foreach (var d in Directory.GetDirectories(dir)) { - var json = File.ReadAllText(Path.Combine(d, "conversation.json")); - _conversations.Add(JsonSerializer.Deserialize(json, _options)); + var path = Path.Combine(d, "conversation.json"); + if (File.Exists(path)) + { + var json = File.ReadAllText(path); + _conversations.Add(JsonSerializer.Deserialize(json, _options)); + } } return _conversations.AsQueryable(); } diff --git a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/ChatCompletionProvider.cs index e633e7a8..a018cfb5 100644 --- a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/ChatCompletionProvider.cs @@ -130,7 +130,10 @@ public class ChatCompletionProvider : IChatCompletion _logger.LogInformation(message.Content); - await onMessageReceived(new RoleDialogModel(ChatRole.Assistant.ToString(), message.Content)); + if (!string.IsNullOrEmpty(message.Content)) + { + await onMessageReceived(new RoleDialogModel(ChatRole.Assistant.ToString(), message.Content)); + } return true; } diff --git a/src/Plugins/BotSharp.Plugin.ChatbotUI/ChatbotUiController.cs b/src/Plugins/BotSharp.Plugin.ChatbotUI/ChatbotUiController.cs index 8b763392..4b728a3a 100644 --- a/src/Plugins/BotSharp.Plugin.ChatbotUI/ChatbotUiController.cs +++ b/src/Plugins/BotSharp.Plugin.ChatbotUI/ChatbotUiController.cs @@ -66,18 +66,6 @@ public class ChatbotUiController : ControllerBase, IApiAdapter var conversationService = _services.GetRequiredService(); - // Check if this conversation exists - var converation = await conversationService.GetConversation(input.ConversationId); - if(converation == null) - { - var sess = new Conversation - { - Id = input.ConversationId, - AgentId = input.AgentId - }; - converation = await conversationService.NewConversation(sess); - } - var result = await conversationService.SendMessage(input.AgentId, input.ConversationId, conversations, diff --git a/src/Plugins/BotSharp.Plugin.MetaMessenger/Controllers/WebhookController.cs b/src/Plugins/BotSharp.Plugin.MetaMessenger/Controllers/WebhookController.cs index 6c15c19b..47f3c3fc 100644 --- a/src/Plugins/BotSharp.Plugin.MetaMessenger/Controllers/WebhookController.cs +++ b/src/Plugins/BotSharp.Plugin.MetaMessenger/Controllers/WebhookController.cs @@ -67,7 +67,7 @@ public class WebhookController : ControllerBase var conv = _services.GetRequiredService(); string content = ""; - var sessionId = req.Entry[0].Messaging[0].Sender.Id; + var senderId = req.Entry[0].Messaging[0].Sender.Id; var input = req.Entry[0].Messaging[0].Message.Text; var setting = _services.GetRequiredService(); @@ -78,38 +78,38 @@ public class WebhookController : ControllerBase }; // Marking seen - /*await messenger.SendMessage(setting.ApiVersion, setting.PageId, new SendingMessageRequest + await messenger.SendMessage(setting.ApiVersion, setting.PageId, new SendingMessageRequest { AccessToken = setting.PageAccessToken, - Recipient = JsonSerializer.Serialize(new { Id = sessionId }, jsonOpt), + Recipient = JsonSerializer.Serialize(new { Id = senderId }, jsonOpt), SenderAction = SenderActionEnum.MarkSeen - });*/ + }); // Typing on await messenger.SendMessage(setting.ApiVersion, setting.PageId, new SendingMessageRequest { AccessToken = setting.PageAccessToken, - Recipient = JsonSerializer.Serialize(new { Id = sessionId }, jsonOpt), + Recipient = JsonSerializer.Serialize(new { Id = senderId }, jsonOpt), SenderAction = SenderActionEnum.TypingOn }); // Go to LLM - var result = await conv.SendMessage(agentId, sessionId, new RoleDialogModel("user", input), async msg => + var result = await conv.SendMessage(agentId, senderId, new RoleDialogModel("user", input), async msg => { content = msg.Content; }, async fn => { - await messenger.SendMessage(setting.ApiVersion, setting.PageId, new SendingMessageRequest + /*await messenger.SendMessage(setting.ApiVersion, setting.PageId, new SendingMessageRequest { AccessToken = setting.PageAccessToken, Recipient = JsonSerializer.Serialize(new { Id = sessionId }, jsonOpt), Message = JsonSerializer.Serialize(new { Text = "I'm pulling the relevent information, please wait a second ..." }, jsonOpt) - }); + });*/ await messenger.SendMessage(setting.ApiVersion, setting.PageId, new SendingMessageRequest { AccessToken = setting.PageAccessToken, - Recipient = JsonSerializer.Serialize(new { Id = sessionId }, jsonOpt), + Recipient = JsonSerializer.Serialize(new { Id = senderId }, jsonOpt), SenderAction = SenderActionEnum.TypingOn }); }); @@ -118,7 +118,7 @@ public class WebhookController : ControllerBase await messenger.SendMessage(setting.ApiVersion, setting.PageId, new SendingMessageRequest { AccessToken = setting.PageAccessToken, - Recipient = JsonSerializer.Serialize(new { Id = sessionId }, jsonOpt), + Recipient = JsonSerializer.Serialize(new { Id = senderId }, jsonOpt), Message = JsonSerializer.Serialize(new { Text = content }, jsonOpt) }); @@ -126,7 +126,7 @@ public class WebhookController : ControllerBase await messenger.SendMessage(setting.ApiVersion, setting.PageId, new SendingMessageRequest { AccessToken = setting.PageAccessToken, - Recipient = JsonSerializer.Serialize(new { Id = sessionId }, jsonOpt), + Recipient = JsonSerializer.Serialize(new { Id = senderId }, jsonOpt), SenderAction = SenderActionEnum.TypingOff }); }