From 8a6a52ce58b8707dbd6ed96b0a150c107f9b8b2d Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Mon, 8 Jul 2024 17:37:22 -0500 Subject: [PATCH] refine message file loading --- .../Files/IBotSharpFileService.cs | 1 + .../BotSharpFileService.Conversation.cs | 30 +++++++++++++++-- .../Controllers/AgentController.cs | 33 ++++++++++++------- .../Controllers/ConversationController.cs | 11 +++++-- .../Conversations/ChatResponseModel.cs | 3 ++ .../ViewModels/Files/MessageFileViewModel.cs | 6 +++- 6 files changed, 66 insertions(+), 18 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Files/IBotSharpFileService.cs b/src/Infrastructure/BotSharp.Abstraction/Files/IBotSharpFileService.cs index baaeff2e..4a137070 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Files/IBotSharpFileService.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Files/IBotSharpFileService.cs @@ -6,6 +6,7 @@ public interface IBotSharpFileService Task> GetChatImages(string conversationId, string source, IEnumerable fileTypes, List conversations, int? offset = null); IEnumerable GetMessageFiles(string conversationId, IEnumerable messageIds, string source, bool imageOnly = false); string GetMessageFile(string conversationId, string messageId, string source, string index, string fileName); + IEnumerable GetMessagesWithFile(string conversationId, IEnumerable messageIds); bool SaveMessageFiles(string conversationId, string messageId, string source, List files); string GetUserAvatar(); diff --git a/src/Infrastructure/BotSharp.Core/Files/Services/BotSharpFileService.Conversation.cs b/src/Infrastructure/BotSharp.Core/Files/Services/BotSharpFileService.Conversation.cs index a3908b2b..d8a2d7c6 100644 --- a/src/Infrastructure/BotSharp.Core/Files/Services/BotSharpFileService.Conversation.cs +++ b/src/Infrastructure/BotSharp.Core/Files/Services/BotSharpFileService.Conversation.cs @@ -1,3 +1,4 @@ +using AspectInjector.Broker; using BotSharp.Abstraction.Files.Converters; using Microsoft.EntityFrameworkCore; using System.IO; @@ -126,7 +127,7 @@ public partial class BotSharpFileService string source, bool imageOnly = false) { var files = new List(); - if (messageIds.IsNullOrEmpty()) return files; + if (string.IsNullOrWhiteSpace(conversationId) || messageIds.IsNullOrEmpty()) return files; foreach (var messageId in messageIds) { @@ -159,7 +160,8 @@ public partial class BotSharpFileService FileStorageUrl = file, FileName = fileName, FileType = fileType, - ContentType = contentType + ContentType = contentType, + FileSource = source }; files.Add(model); } @@ -181,6 +183,30 @@ public partial class BotSharpFileService return found; } + public IEnumerable GetMessagesWithFile(string conversationId, IEnumerable messageIds) + { + var foundMsgs = new List(); + if (string.IsNullOrWhiteSpace(conversationId) || messageIds.IsNullOrEmpty()) return foundMsgs; + + foreach (var messageId in messageIds) + { + var prefix = Path.Combine(_baseDir, CONVERSATION_FOLDER, conversationId, FILE_FOLDER, messageId); + var userDir = Path.Combine(prefix, FileSourceType.User); + if (ExistDirectory(userDir)) + { + foundMsgs.Add(new MessageFileModel { MessageId = messageId, FileSource = FileSourceType.User }); + } + + var botDir = Path.Combine(prefix, FileSourceType.Bot); + if (ExistDirectory(botDir)) + { + foundMsgs.Add(new MessageFileModel { MessageId = messageId, FileSource = FileSourceType.Bot }); + } + } + + return foundMsgs; + } + public bool SaveMessageFiles(string conversationId, string messageId, string source, List files) { if (files.IsNullOrEmpty()) return false; diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/AgentController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/AgentController.cs index cac85ac5..f2bbc2eb 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/AgentController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/AgentController.cs @@ -31,7 +31,7 @@ public class AgentController : ControllerBase var agents = await GetAgents(new AgentFilter { AgentIds = new List { id } - }); + }, useHook: true); var targetAgent = agents.Items.FirstOrDefault(); if (targetAgent == null) return null; @@ -63,26 +63,35 @@ public class AgentController : ControllerBase targetAgent.Editable = editable; return targetAgent; } - + [HttpGet("/agents")] - public async Task> GetAgents([FromQuery] AgentFilter filter) + public async Task> GetAgents([FromQuery] AgentFilter filter, [FromQuery] bool useHook = false) { var agentSetting = _services.GetRequiredService(); var pagedAgents = await _agentService.GetAgents(filter); - // prerender agent var items = new List(); - foreach (var agent in pagedAgents.Items) + var agents = new List(); + if (useHook) { - var renderedAgent = await _agentService.LoadAgent(agent.Id); - items.Add(renderedAgent); - } + // prerender agent + foreach (var agent in pagedAgents.Items) + { + var renderedAgent = await _agentService.LoadAgent(agent.Id); + items.Add(renderedAgent); + } - // Set IsHost - var agents = items.Select(x => AgentViewModel.FromAgent(x)).ToList(); - foreach(var agent in agents) + // Set IsHost + agents = items.Select(x => AgentViewModel.FromAgent(x)).ToList(); + foreach (var agent in agents) + { + agent.IsHost = agentSetting.HostAgentId == agent.Id; + } + } + else { - agent.IsHost = agentSetting.HostAgentId == agent.Id; + items = pagedAgents.Items.ToList(); + agents = items.Select(x => AgentViewModel.FromAgent(x)).ToList(); } return new PagedItems diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs index b3e29e31..c4850b1f 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs @@ -80,6 +80,10 @@ public class ConversationController : ControllerBase var userService = _services.GetRequiredService(); var agentService = _services.GetRequiredService(); + var fileService = _services.GetRequiredService(); + + var messageIds = history.Select(x => x.MessageId).Distinct().ToList(); + var fileMessages = fileService.GetMessagesWithFile(conversationId, messageIds); var dialogs = new List(); foreach (var message in history) @@ -96,7 +100,8 @@ public class ConversationController : ControllerBase Text = !string.IsNullOrEmpty(message.SecondaryContent) ? message.SecondaryContent : message.Content, Data = message.Data, Sender = UserViewModel.FromUser(user), - Payload = message.Payload + Payload = message.Payload, + HasMessageFiles = fileMessages.Any(x => x.MessageId.IsEqualTo(message.MessageId) && x.FileSource == FileSourceType.User) }); } else if (message.Role == AgentRole.Assistant) @@ -115,11 +120,11 @@ public class ConversationController : ControllerBase FirstName = agent?.Name ?? "Unkown", Role = message.Role, }, - RichContent = message.SecondaryRichContent ?? message.RichContent + RichContent = message.SecondaryRichContent ?? message.RichContent, + HasMessageFiles = fileMessages.Any(x => x.MessageId.IsEqualTo(message.MessageId) && x.FileSource == FileSourceType.Bot) }); } } - return dialogs; } diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs index a03f1211..d2d7041f 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs @@ -32,6 +32,9 @@ public class ChatResponseModel : InstructResult [JsonPropertyName("payload")] public string? Payload { get; set; } + [JsonPropertyName("has_message_files")] + public bool HasMessageFiles { get; set; } + [JsonPropertyName("created_at")] public DateTime CreatedAt { get; set; } = DateTime.UtcNow; } diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Files/MessageFileViewModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Files/MessageFileViewModel.cs index a9eb33bd..131a9baf 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Files/MessageFileViewModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Files/MessageFileViewModel.cs @@ -16,6 +16,9 @@ public class MessageFileViewModel [JsonPropertyName("content_type")] public string ContentType { get; set; } + [JsonPropertyName("file_source")] + public string FileSource { get; set; } + public MessageFileViewModel() { @@ -28,7 +31,8 @@ public class MessageFileViewModel FileUrl = model.FileUrl, FileName = model.FileName, FileType = model.FileType, - ContentType = model.ContentType + ContentType = model.ContentType, + FileSource = model.FileSource }; } }