refine message file loading

This commit is contained in:
Jicheng Lu 2024-07-08 17:37:22 -05:00
parent 9fa062106a
commit 8a6a52ce58
6 changed files with 66 additions and 18 deletions

View file

@ -6,6 +6,7 @@ public interface IBotSharpFileService
Task<IEnumerable<MessageFileModel>> GetChatImages(string conversationId, string source, IEnumerable<string> fileTypes, List<RoleDialogModel> conversations, int? offset = null);
IEnumerable<MessageFileModel> GetMessageFiles(string conversationId, IEnumerable<string> messageIds, string source, bool imageOnly = false);
string GetMessageFile(string conversationId, string messageId, string source, string index, string fileName);
IEnumerable<MessageFileModel> GetMessagesWithFile(string conversationId, IEnumerable<string> messageIds);
bool SaveMessageFiles(string conversationId, string messageId, string source, List<BotSharpFile> files);
string GetUserAvatar();

View file

@ -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<MessageFileModel>();
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<MessageFileModel> GetMessagesWithFile(string conversationId, IEnumerable<string> messageIds)
{
var foundMsgs = new List<MessageFileModel>();
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<BotSharpFile> files)
{
if (files.IsNullOrEmpty()) return false;

View file

@ -31,7 +31,7 @@ public class AgentController : ControllerBase
var agents = await GetAgents(new AgentFilter
{
AgentIds = new List<string> { 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<PagedItems<AgentViewModel>> GetAgents([FromQuery] AgentFilter filter)
public async Task<PagedItems<AgentViewModel>> GetAgents([FromQuery] AgentFilter filter, [FromQuery] bool useHook = false)
{
var agentSetting = _services.GetRequiredService<AgentSettings>();
var pagedAgents = await _agentService.GetAgents(filter);
// prerender agent
var items = new List<Agent>();
foreach (var agent in pagedAgents.Items)
var agents = new List<AgentViewModel>();
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<AgentViewModel>

View file

@ -80,6 +80,10 @@ public class ConversationController : ControllerBase
var userService = _services.GetRequiredService<IUserService>();
var agentService = _services.GetRequiredService<IAgentService>();
var fileService = _services.GetRequiredService<IBotSharpFileService>();
var messageIds = history.Select(x => x.MessageId).Distinct().ToList();
var fileMessages = fileService.GetMessagesWithFile(conversationId, messageIds);
var dialogs = new List<ChatResponseModel>();
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;
}

View file

@ -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;
}

View file

@ -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
};
}
}