refine
This commit is contained in:
parent
6fcd8c6077
commit
3e45a6f6dc
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -11,24 +11,24 @@ public class BotSharpStats
|
|||
[JsonPropertyName("data")]
|
||||
public IDictionary<string, object> Data { get; set; } = new Dictionary<string, object>();
|
||||
|
||||
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})";
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<List<BotSharpStats>>(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<List<BotSharpStats>>(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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,5 +5,5 @@ public class GlobalStatisticsDocument : MongoBase
|
|||
public string Category { get; set; }
|
||||
public string Group { get; set; }
|
||||
public IDictionary<string, object> Data { get; set; } = new Dictionary<string, object>();
|
||||
public DateTime RecordDate { get; set; }
|
||||
public DateTime RecordTime { get; set; }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<GlobalStatisticsDocument>.Filter;
|
||||
var filters = new List<FilterDefinition<GlobalStatisticsDocument>>()
|
||||
{
|
||||
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<GlobalStatisticsDocument>.Filter;
|
||||
var filters = new List<FilterDefinition<GlobalStatisticsDocument>>()
|
||||
{
|
||||
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
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue