From 3e45a6f6dcbfbba3fe05ce393c429969d40f8c47 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Fri, 24 Jan 2025 13:42:17 -0600 Subject: [PATCH] refine --- .../Repositories/IBotSharpRepository.cs | 2 +- .../Statistics/Models/BotSharpStats.cs | 12 ++--- .../Conversations/Services/TokenStatistics.cs | 2 +- .../FileRepository/FileRepository.Stats.cs | 12 ++--- .../Services/BotSharpStatService.cs | 49 +++++++++++++------ .../Hooks/GlobalStatsConversationHook.cs | 2 +- .../Collections/GlobalStatisticsDocument.cs | 2 +- .../Repository/MongoRepository.Stats.cs | 19 +++---- 8 files changed, 59 insertions(+), 41 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs index 9f818789..5a513902 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs @@ -120,7 +120,7 @@ public interface IBotSharpRepository : IHaveServiceProvider #endregion #region Statistics - BotSharpStats? GetGlobalStats(string category, string group, DateTime recordDate) => throw new NotImplementedException(); + BotSharpStats? GetGlobalStats(string category, string group, DateTime recordTime) => throw new NotImplementedException(); bool SaveGlobalStats(BotSharpStats body) => throw new NotImplementedException(); #endregion diff --git a/src/Infrastructure/BotSharp.Abstraction/Statistics/Models/BotSharpStats.cs b/src/Infrastructure/BotSharp.Abstraction/Statistics/Models/BotSharpStats.cs index fdbba50d..36165def 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Statistics/Models/BotSharpStats.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Statistics/Models/BotSharpStats.cs @@ -11,24 +11,24 @@ public class BotSharpStats [JsonPropertyName("data")] public IDictionary Data { get; set; } = new Dictionary(); - private DateTime innerRecordDate; + private DateTime innerRecordTime; - [JsonPropertyName("record_date")] - public DateTime RecordDate + [JsonPropertyName("record_time")] + public DateTime RecordTime { get { - return innerRecordDate; + return innerRecordTime; } set { var date = new DateTime(value.Year, value.Month, value.Day, value.Hour, 0, 0); - innerRecordDate = date; + innerRecordTime = DateTime.SpecifyKind(date, DateTimeKind.Utc); } } public override string ToString() { - return $"{Category}-{Group}: {Data?.Count ?? 0} ({RecordDate})"; + return $"{Category}-{Group}: {Data?.Count ?? 0} ({RecordTime})"; } } \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/TokenStatistics.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/TokenStatistics.cs index 59c95259..9b9c12f0 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/TokenStatistics.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/TokenStatistics.cs @@ -71,7 +71,7 @@ public class TokenStatistics : ITokenStatistics { "prompt_cost_total", deltaPromptCost }, { "completion_cost_total", deltaCompletionCost } }, - RecordDate = DateTime.UtcNow + RecordTime = DateTime.UtcNow }; globalStats.UpdateLlmCost(body); } diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Stats.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Stats.cs index 602c1fc4..f4d3f40a 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Stats.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Stats.cs @@ -4,10 +4,10 @@ namespace BotSharp.Core.Repository; public partial class FileRepository { - public BotSharpStats? GetGlobalStats(string category, string group, DateTime recordDate) + public BotSharpStats? GetGlobalStats(string category, string group, DateTime recordTime) { var baseDir = Path.Combine(_dbSettings.FileRepository, STATS_FOLDER); - var dir = Path.Combine(baseDir, category, recordDate.Year.ToString(), recordDate.Month.ToString("D2")); + var dir = Path.Combine(baseDir, category, recordTime.Year.ToString(), recordTime.Month.ToString("D2")); if (!Directory.Exists(dir)) return null; var file = Directory.GetFiles(dir).FirstOrDefault(x => Path.GetFileName(x) == STATS_FILE); @@ -17,14 +17,14 @@ public partial class FileRepository var list = JsonSerializer.Deserialize>(text, _options); var found = list?.FirstOrDefault(x => x.Category.IsEqualTo(category) && x.Group.IsEqualTo(group) - && x.RecordDate == recordDate); + && x.RecordTime == recordTime); return found; } public bool SaveGlobalStats(BotSharpStats body) { var baseDir = Path.Combine(_dbSettings.FileRepository, STATS_FOLDER); - var dir = Path.Combine(baseDir, body.Category, body.RecordDate.Year.ToString(), body.RecordDate.Month.ToString("D2")); + var dir = Path.Combine(baseDir, body.Category, body.RecordTime.Year.ToString(), body.RecordTime.Month.ToString("D2")); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); @@ -42,14 +42,14 @@ public partial class FileRepository var list = JsonSerializer.Deserialize>(text, _options); var found = list?.FirstOrDefault(x => x.Category.IsEqualTo(body.Category) && x.Group.IsEqualTo(body.Group) - && x.RecordDate == body.RecordDate); + && x.RecordTime == body.RecordTime); if (found != null) { found.Category = body.Category; found.Group = body.Group; found.Data = body.Data; - found.RecordDate = body.RecordDate; + found.RecordTime = body.RecordTime; } else if (list != null) { diff --git a/src/Infrastructure/BotSharp.Core/Statistics/Services/BotSharpStatService.cs b/src/Infrastructure/BotSharp.Core/Statistics/Services/BotSharpStatService.cs index 3fcc8215..d39b94bb 100644 --- a/src/Infrastructure/BotSharp.Core/Statistics/Services/BotSharpStatService.cs +++ b/src/Infrastructure/BotSharp.Core/Statistics/Services/BotSharpStatService.cs @@ -34,7 +34,7 @@ public class BotSharpStatService : IBotSharpStatService var res = locker.Lock(GLOBAL_LLM_COST, () => { - var body = db.GetGlobalStats(stats.Category, stats.Group, stats.RecordDate); + var body = db.GetGlobalStats(stats.Category, stats.Group, stats.RecordTime); if (body == null) { db.SaveGlobalStats(stats); @@ -43,20 +43,29 @@ public class BotSharpStatService : IBotSharpStatService foreach (var item in stats.Data) { - var value = item.Value; - if (body.Data.TryGetValue(item.Key, out var curValue) && curValue != null) + var curValue = item.Value; + if (body.Data.TryGetValue(item.Key, out var preValue)) { - var str = curValue.ToString(); - if (long.TryParse(str, out var count)) + var preValStr = preValue?.ToString(); + var curValStr = curValue?.ToString(); + try { - value = long.Parse(value?.ToString() ?? "0") + count; + if (int.TryParse(preValStr, out var count)) + { + curValue = int.Parse(curValStr ?? "0") + count; + } + else if (double.TryParse(preValStr, out var num)) + { + curValue = double.Parse(curValStr ?? "0") + num; + } } - else if (decimal.TryParse(str, out var num)) + catch { - value = decimal.Parse(value?.ToString() ?? "0") + num; + continue; } } - body.Data[item.Key] = value; + + body.Data[item.Key] = curValue; } db.SaveGlobalStats(body); @@ -81,7 +90,7 @@ public class BotSharpStatService : IBotSharpStatService var res = locker.Lock(GLOBAL_AGENT_CALL, () => { - var body = db.GetGlobalStats(stats.Category, stats.Group, stats.RecordDate); + var body = db.GetGlobalStats(stats.Category, stats.Group, stats.RecordTime); if (body == null) { db.SaveGlobalStats(stats); @@ -90,16 +99,24 @@ public class BotSharpStatService : IBotSharpStatService foreach (var item in stats.Data) { - var value = item.Value; - if (body.Data.TryGetValue(item.Key, out var curValue) && curValue != null) + var curValue = item.Value; + if (body.Data.TryGetValue(item.Key, out var preValue)) { - var str = curValue.ToString(); - if (long.TryParse(str, out var count)) + var preValStr = preValue?.ToString(); + var curValStr = curValue?.ToString(); + try { - value = long.Parse(value?.ToString() ?? "0") + count; + if (int.TryParse(preValStr, out var count)) + { + curValue = int.Parse(curValStr ?? "0") + count; + } + } + catch + { + continue; } } - body.Data[item.Key] = value; + body.Data[item.Key] = curValue; } db.SaveGlobalStats(body); diff --git a/src/Infrastructure/BotSharp.Logger/Hooks/GlobalStatsConversationHook.cs b/src/Infrastructure/BotSharp.Logger/Hooks/GlobalStatsConversationHook.cs index 1b7c5c94..79ba4115 100644 --- a/src/Infrastructure/BotSharp.Logger/Hooks/GlobalStatsConversationHook.cs +++ b/src/Infrastructure/BotSharp.Logger/Hooks/GlobalStatsConversationHook.cs @@ -38,7 +38,7 @@ public class GlobalStatsConversationHook : ConversationHookBase { "agent_id", message.CurrentAgentId }, { "agent_call_count", 1 } }, - RecordDate = DateTime.UtcNow + RecordTime = DateTime.UtcNow }; globalStats.UpdateAgentCall(body); } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/GlobalStatisticsDocument.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/GlobalStatisticsDocument.cs index 67270daa..e90bf4f5 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/GlobalStatisticsDocument.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/GlobalStatisticsDocument.cs @@ -5,5 +5,5 @@ public class GlobalStatisticsDocument : MongoBase public string Category { get; set; } public string Group { get; set; } public IDictionary Data { get; set; } = new Dictionary(); - public DateTime RecordDate { get; set; } + public DateTime RecordTime { get; set; } } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Stats.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Stats.cs index d71e493d..44e667ca 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Stats.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Stats.cs @@ -4,16 +4,16 @@ namespace BotSharp.Plugin.MongoStorage.Repository; public partial class MongoRepository { - public BotSharpStats? GetGlobalStats(string category, string group, DateTime recordDate) + public BotSharpStats? GetGlobalStats(string category, string group, DateTime recordTime) { - var date = BuildRecordDate(recordDate); + var time = BuildRecordTime(recordTime); var builder = Builders.Filter; var filters = new List>() { builder.Eq(x => x.Category, category), builder.Eq(x => x.Group, group), - builder.Eq(x => x.RecordDate, date) + builder.Eq(x => x.RecordTime, time) }; var filterDef = builder.And(filters); @@ -25,19 +25,19 @@ public partial class MongoRepository Category = found.Category, Group = found.Group, Data = found.Data, - RecordDate = found.RecordDate, + RecordTime = found.RecordTime }; } public bool SaveGlobalStats(BotSharpStats body) { - var date = BuildRecordDate(body.RecordDate); + var time = BuildRecordTime(body.RecordTime); var builder = Builders.Filter; var filters = new List>() { builder.Eq(x => x.Category, body.Category), builder.Eq(x => x.Group, body.Group), - builder.Eq(x => x.RecordDate, date) + builder.Eq(x => x.RecordTime, time) }; var filterDef = builder.And(filters); @@ -46,16 +46,17 @@ public partial class MongoRepository .Set(x => x.Category, body.Category) .Set(x => x.Group, body.Group) .Set(x => x.Data, body.Data) - .Set(x => x.RecordDate, date); + .Set(x => x.RecordTime, time); _dc.GlobalStatistics.UpdateOne(filterDef, updateDef, _options); return true; } #region Private methods - private DateTime BuildRecordDate(DateTime date) + private DateTime BuildRecordTime(DateTime date) { - return new DateTime(date.Year, date.Month, date.Day, date.Hour, 0, 0); + var recordDate = new DateTime(date.Year, date.Month, date.Day, date.Hour, 0, 0); + return DateTime.SpecifyKind(recordDate, DateTimeKind.Utc); } #endregion }