add secondary content

This commit is contained in:
Jicheng Lu 2024-04-18 16:34:18 -05:00
parent 59958bcf8b
commit 970bc4d028
7 changed files with 57 additions and 14 deletions

View file

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

View file

@ -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<IRichMessage>? RichContent { get; set; }
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public RichContent<IRichMessage>? SecondaryRichContent { get; set; }
/// <summary>
/// Stop conversation completion
/// </summary>

View file

@ -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<RichContent<IRichMessage>>(dialog.RichContent, _options.JsonSerializerOptions) : null;
var secondaryRichContent = !string.IsNullOrEmpty(dialog.SecondaryRichContent) ?
JsonSerializer.Deserialize<RichContent<IRichMessage>>(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);

View file

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

View file

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

View file

@ -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; }
/// <summary>
/// Rich message for UI rendering
/// </summary>
@ -28,6 +31,10 @@ public class ChatResponseModel : InstructResult
[JsonPropertyName("rich_content")]
public RichContent<IRichMessage>? RichContent { get; set; }
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
[JsonPropertyName("secondary_rich_content")]
public RichContent<IRichMessage>? SecondaryRichContent { get; set; }
[JsonPropertyName("created_at")]
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
}

View file

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