refine message file loading
This commit is contained in:
parent
9fa062106a
commit
8a6a52ce58
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue