diff --git a/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/Conversation.cs b/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/Conversation.cs index c99a819b1..5613c088f 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/Conversation.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/Conversation.cs @@ -37,6 +37,7 @@ public class DialogElement public string? SecondaryContent { get; set; } public string? RichContent { get; set; } public string? SecondaryRichContent { get; set; } + public string? Payload { get; set; } public DialogElement() { @@ -44,13 +45,14 @@ public DialogElement() } public DialogElement(DialogMetaData meta, string content, string? richContent = null, - string? secondaryContent = null, string? secondaryRichContent = null) + string? secondaryContent = null, string? secondaryRichContent = null, string? payload = null) { MetaData = meta; Content = content; RichContent = richContent; SecondaryContent = secondaryContent; SecondaryRichContent = secondaryRichContent; + Payload = payload; } public override string ToString() diff --git a/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/RoleDialogModel.cs b/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/RoleDialogModel.cs index c3a6403af..e019eae44 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/RoleDialogModel.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/RoleDialogModel.cs @@ -28,6 +28,10 @@ public class RoleDialogModel : ITrackableMessage public string? SecondaryContent { get; set; } + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("payload")] + public string? Payload { get; set; } + /// /// Indicator message used to provide UI feedback for function execution /// diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStorage.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStorage.cs index 4ab447b8b..9bb8f103f 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStorage.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStorage.cs @@ -50,7 +50,13 @@ public void Append(string conversationId, RoleDialogModel dialog) { return; } - dialogElements.Add(new DialogElement(meta, content, dialog.SecondaryContent)); + dialogElements.Add(new DialogElement + { + MetaData = meta, + Content = dialog.Content, + SecondaryContent = dialog.SecondaryContent, + Payload = dialog.Payload + }); } else { @@ -72,7 +78,15 @@ public void Append(string conversationId, RoleDialogModel dialog) var richContent = dialog.RichContent != null ? JsonSerializer.Serialize(dialog.RichContent, _options.JsonSerializerOptions) : null; var secondaryRichContent = dialog.SecondaryRichContent != null ? JsonSerializer.Serialize(dialog.SecondaryRichContent, _options.JsonSerializerOptions) : null; - dialogElements.Add(new DialogElement(meta, content, richContent, dialog.SecondaryContent, secondaryRichContent)); + dialogElements.Add(new DialogElement + { + MetaData = meta, + Content = dialog.Content, + SecondaryContent = dialog.SecondaryContent, + RichContent = richContent, + SecondaryRichContent = secondaryRichContent, + Payload = dialog.Payload + }); } db.AppendConversationDialogs(conversationId, dialogElements); @@ -90,6 +104,7 @@ public List GetDialogs(string conversationId) var meta = dialog.MetaData; var content = dialog.Content; var secondaryContent = dialog.SecondaryContent; + var payload = dialog.Payload; var role = meta.Role; var currentAgentId = meta.AgentId; var messageId = meta.MessageId; @@ -111,6 +126,7 @@ public List GetDialogs(string conversationId) RichContent = richContent, SecondaryContent = secondaryContent, SecondaryRichContent = secondaryRichContent, + Payload = payload }; 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 d9400e478..6708f49a8 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs @@ -529,6 +529,7 @@ private List CollectDialogElements(string dialogDir) var trimmedContent = content.Substring(4); var secondaryContent = rawDialogs[i + 4]; var trimmedSecondaryContent = string.IsNullOrEmpty(secondaryContent) ? null : secondaryContent.Substring(4); + var payload = blocks.Count() > 6 ? blocks[6] : null; var meta = new DialogMetaData { @@ -540,9 +541,17 @@ private List CollectDialogElements(string dialogDir) CreateTime = DateTime.Parse(blocks[0]) }; - var richContent = DecodeRichContent(rawDialogs[i + 1]); - var secondaryRichContent = DecodeRichContent(rawDialogs[i + 3]); - dialogs.Add(new DialogElement(meta, trimmedContent, richContent, trimmedSecondaryContent, secondaryRichContent)); + var richContent = DecodeText(rawDialogs[i + 1]); + var secondaryRichContent = DecodeText(rawDialogs[i + 3]); + dialogs.Add(new DialogElement + { + MetaData = meta, + Content = trimmedContent, + SecondaryContent = trimmedSecondaryContent, + RichContent = richContent, + SecondaryRichContent = secondaryRichContent, + Payload = payload + }); } } return dialogs; @@ -557,9 +566,10 @@ private List ParseDialogElements(List dialogs) { 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 encodedSecondaryRichContent = EncodeRichContent(element.SecondaryRichContent); - var metaStr = $"{createTime}|{meta.Role}|{meta.AgentId}|{meta.MessageId}|{meta.SenderId}|{meta.FunctionName}"; + var encodedRichContent = EncodeText(element.RichContent); + var encodedSecondaryRichContent = EncodeText(element.SecondaryRichContent); + var payload = element.Payload; + var metaStr = $"{createTime}|{meta.Role}|{meta.AgentId}|{meta.MessageId}|{meta.SenderId}|{meta.FunctionName}|{payload}"; dialogTexts.Add(metaStr); dialogTexts.Add(encodedRichContent); @@ -715,20 +725,20 @@ private bool SaveTruncatedBreakpoints(string breakpointDir, List> GetDialogs([FromRoute] string CreatedAt = message.CreatedAt, Text = !string.IsNullOrEmpty(message.SecondaryContent) ? message.SecondaryContent : message.Content, Data = message.Data, - Sender = UserViewModel.FromUser(user) + Sender = UserViewModel.FromUser(user), + Payload = message.Payload }); } else if (message.Role == AgentRole.Assistant) diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs index cf71b8f93..a03f1211d 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs @@ -28,6 +28,10 @@ public class ChatResponseModel : InstructResult [JsonPropertyName("rich_content")] public RichContent? RichContent { get; set; } + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [JsonPropertyName("payload")] + public string? Payload { 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 6ebc16ff4..5c2a1698e 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Models/DialogMongoElement.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Models/DialogMongoElement.cs @@ -9,6 +9,7 @@ public class DialogMongoElement public string? SecondaryContent { get; set; } public string? RichContent { get; set; } public string? SecondaryRichContent { get; set; } + public string? Payload { get; set; } public DialogMongoElement() { @@ -23,7 +24,8 @@ public static DialogMongoElement ToMongoElement(DialogElement dialog) Content = dialog.Content, SecondaryContent = dialog.SecondaryContent, RichContent = dialog.RichContent, - SecondaryRichContent = dialog.SecondaryRichContent + SecondaryRichContent = dialog.SecondaryRichContent, + Payload = dialog.Payload }; } @@ -35,7 +37,8 @@ public static DialogElement ToDomainElement(DialogMongoElement dialog) Content = dialog.Content, SecondaryContent = dialog.SecondaryContent, RichContent = dialog.RichContent, - SecondaryRichContent = dialog.SecondaryRichContent + SecondaryRichContent = dialog.SecondaryRichContent, + Payload = dialog.Payload }; } }