From 970bc4d0280e07993f5641560a16515114f52325 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Thu, 18 Apr 2024 16:34:18 -0500 Subject: [PATCH] add secondary content --- .../Conversations/Models/Conversation.cs | 9 ++++++-- .../Conversations/Models/RoleDialogModel.cs | 5 ++++ .../Services/ConversationStorage.cs | 12 +++++++--- .../FileRepository.Conversation.cs | 23 ++++++++++++++----- .../Controllers/ConversationController.cs | 5 +++- .../Conversations/ChatResponseModel.cs | 7 ++++++ .../Models/DialogMongoElement.cs | 10 ++++++-- 7 files changed, 57 insertions(+), 14 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/Conversation.cs b/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/Conversation.cs index 530f425d..c99a819b 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/Conversation.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/Conversation.cs @@ -34,23 +34,28 @@ public class DialogElement { public DialogMetaData MetaData { get; set; } public string Content { get; set; } + public string? SecondaryContent { get; set; } public string? RichContent { get; set; } + public string? SecondaryRichContent { get; set; } public DialogElement() { } - public DialogElement(DialogMetaData meta, string content, string? richContent = null) + public DialogElement(DialogMetaData meta, string content, string? richContent = null, + string? secondaryContent = null, string? secondaryRichContent = null) { MetaData = meta; Content = content; RichContent = richContent; + SecondaryContent = secondaryContent; + SecondaryRichContent = secondaryRichContent; } public override string ToString() { - return $"{MetaData.Role}: {Content} [{MetaData.CreateTime}]"; + return $"{MetaData.Role}: {Content} [{MetaData?.CreateTime}]"; } } diff --git a/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/RoleDialogModel.cs b/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/RoleDialogModel.cs index dea85881..f6e1ecfe 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/RoleDialogModel.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/RoleDialogModel.cs @@ -26,6 +26,8 @@ public class RoleDialogModel : ITrackableMessage public string Content { get; set; } + public string? SecondaryContent { get; set; } + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string CurrentAgentId { get; set; } @@ -57,6 +59,9 @@ public class RoleDialogModel : ITrackableMessage [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public RichContent? RichContent { get; set; } + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public RichContent? SecondaryRichContent { get; set; } + /// /// Stop conversation completion /// diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStorage.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStorage.cs index ba0d9198..3dcb6ce8 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStorage.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStorage.cs @@ -50,7 +50,7 @@ public class ConversationStorage : IConversationStorage { return; } - dialogElements.Add(new DialogElement(meta, content)); + dialogElements.Add(new DialogElement(meta, content, dialog.SecondaryContent)); } else { @@ -71,7 +71,8 @@ public class ConversationStorage : IConversationStorage } var richContent = dialog.RichContent != null ? JsonSerializer.Serialize(dialog.RichContent, _options.JsonSerializerOptions) : null; - dialogElements.Add(new DialogElement(meta, content, richContent)); + var secondaryRichContent = dialog.RichContent != null ? JsonSerializer.Serialize(dialog.SecondaryRichContent, _options.JsonSerializerOptions) : null; + dialogElements.Add(new DialogElement(meta, content, richContent, dialog.SecondaryContent, secondaryRichContent)); } db.AppendConversationDialogs(conversationId, dialogElements); @@ -88,6 +89,7 @@ public class ConversationStorage : IConversationStorage { var meta = dialog.MetaData; var content = dialog.Content; + var secondaryContent = dialog.SecondaryContent; var role = meta.Role; var currentAgentId = meta.AgentId; var messageId = meta.MessageId; @@ -96,6 +98,8 @@ public class ConversationStorage : IConversationStorage var createdAt = meta.CreateTime; var richContent = !string.IsNullOrEmpty(dialog.RichContent) ? JsonSerializer.Deserialize>(dialog.RichContent, _options.JsonSerializerOptions) : null; + var secondaryRichContent = !string.IsNullOrEmpty(dialog.SecondaryRichContent) ? + JsonSerializer.Deserialize>(dialog.SecondaryRichContent, _options.JsonSerializerOptions) : null; var record = new RoleDialogModel(role, content) { @@ -104,7 +108,9 @@ public class ConversationStorage : IConversationStorage CreatedAt = createdAt, SenderId = senderId, FunctionName = function, - RichContent = richContent + RichContent = richContent, + SecondaryContent = secondaryContent, + SecondaryRichContent = secondaryRichContent, }; results.Add(record); diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs index 70f28bbe..b07ba3ce 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs @@ -506,11 +506,14 @@ namespace BotSharp.Core.Repository var rawDialogs = File.ReadAllLines(dialogDir); if (!rawDialogs.IsNullOrEmpty()) { - for (int i = 0; i < rawDialogs.Count(); i += 2) + for (int i = 0; i < rawDialogs.Count(); i += 5) { var blocks = rawDialogs[i].Split("|"); - var content = rawDialogs[i + 1]; - var trimmed = content.Substring(4); + var content = rawDialogs[i + 2]; + var trimmedContent = content.Substring(4); + var secondaryContent = rawDialogs[i + 4]; + var trimmedSecondaryContent = secondaryContent.Substring(4); + var meta = new DialogMetaData { Role = blocks[1], @@ -521,8 +524,9 @@ namespace BotSharp.Core.Repository CreateTime = DateTime.Parse(blocks[0]) }; - var richContent = blocks.Count() > 6 ? DecodeRichContent(blocks[6]) : null; - dialogs.Add(new DialogElement(meta, trimmed, richContent)); + var richContent = DecodeRichContent(rawDialogs[i + 1]); + var secondaryRichContent = DecodeRichContent(rawDialogs[i + 3]); + dialogs.Add(new DialogElement(meta, trimmedContent, richContent, trimmedSecondaryContent, secondaryRichContent)); } } return dialogs; @@ -538,10 +542,17 @@ namespace BotSharp.Core.Repository var meta = element.MetaData; var createTime = meta.CreateTime.ToString("MM/dd/yyyy hh:mm:ss.ffffff tt", CultureInfo.InvariantCulture); var encodedRichContent = EncodeRichContent(element.RichContent); - var metaStr = $"{createTime}|{meta.Role}|{meta.AgentId}|{meta.MessageId}|{meta.SenderId}|{meta.FunctionName}|{encodedRichContent}"; + var encodedSecondaryRichContent = EncodeRichContent(element.SecondaryRichContent); + var metaStr = $"{createTime}|{meta.Role}|{meta.AgentId}|{meta.MessageId}|{meta.SenderId}|{meta.FunctionName}"; dialogTexts.Add(metaStr); + + dialogTexts.Add(encodedRichContent); var content = $" - {element.Content}"; dialogTexts.Add(content); + + dialogTexts.Add(encodedSecondaryRichContent); + var secondaryContent = $" - {element.SecondaryContent}"; + dialogTexts.Add(secondaryContent); } return dialogTexts; diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs index 8bf3b757..04e61773 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs @@ -84,6 +84,7 @@ public class ConversationController : ControllerBase MessageId = message.MessageId, CreatedAt = message.CreatedAt, Text = message.Content, + SecondaryText = message.SecondaryContent, Data = message.Data, Sender = UserViewModel.FromUser(user) }); @@ -97,6 +98,7 @@ public class ConversationController : ControllerBase MessageId = message.MessageId, CreatedAt = message.CreatedAt, Text = message.Content, + SecondaryText = message.SecondaryContent, Function = message.FunctionName, Data = message.Data, Sender = new UserViewModel @@ -104,7 +106,8 @@ public class ConversationController : ControllerBase FirstName = agent.Name, Role = message.Role, }, - RichContent = message.RichContent + RichContent = message.RichContent, + SecondaryRichContent = message.SecondaryRichContent }); } } diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs index cf71b8f9..86903800 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs @@ -21,6 +21,9 @@ public class ChatResponseModel : InstructResult [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public FunctionCallFromLlm? Instruction { get; set; } + [JsonPropertyName("secondary_text")] + public string? SecondaryText { get; set; } + /// /// Rich message for UI rendering /// @@ -28,6 +31,10 @@ public class ChatResponseModel : InstructResult [JsonPropertyName("rich_content")] public RichContent? RichContent { get; set; } + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("secondary_rich_content")] + public RichContent? SecondaryRichContent { get; set; } + [JsonPropertyName("created_at")] public DateTime CreatedAt { get; set; } = DateTime.UtcNow; } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Models/DialogMongoElement.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Models/DialogMongoElement.cs index a35d3fc1..6ebc16ff 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Models/DialogMongoElement.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Models/DialogMongoElement.cs @@ -6,7 +6,9 @@ public class DialogMongoElement { public DialogMetaDataMongoElement MetaData { get; set; } public string Content { get; set; } + public string? SecondaryContent { get; set; } public string? RichContent { get; set; } + public string? SecondaryRichContent { get; set; } public DialogMongoElement() { @@ -19,7 +21,9 @@ public class DialogMongoElement { MetaData = DialogMetaDataMongoElement.ToMongoElement(dialog.MetaData), Content = dialog.Content, - RichContent = dialog.RichContent + SecondaryContent = dialog.SecondaryContent, + RichContent = dialog.RichContent, + SecondaryRichContent = dialog.SecondaryRichContent }; } @@ -29,7 +33,9 @@ public class DialogMongoElement { MetaData = DialogMetaDataMongoElement.ToDomainElement(dialog.MetaData), Content = dialog.Content, - RichContent = dialog.RichContent + SecondaryContent = dialog.SecondaryContent, + RichContent = dialog.RichContent, + SecondaryRichContent = dialog.SecondaryRichContent }; } }