Files
Yi.Admin/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/UsageStatisticsManager.cs

49 lines
1.8 KiB
C#
Raw Normal View History

2025-06-27 22:13:26 +08:00
using Medallion.Threading;
using Volo.Abp.Domain.Services;
using Yi.Framework.AiHub.Domain.Entities;
2025-08-11 15:31:11 +08:00
using Yi.Framework.AiHub.Domain.Shared.Dtos.OpenAi;
2025-06-27 22:13:26 +08:00
using Yi.Framework.SqlSugarCore.Abstractions;
2025-07-17 23:10:26 +08:00
namespace Yi.Framework.AiHub.Domain.Managers;
2025-06-27 22:13:26 +08:00
public class UsageStatisticsManager : DomainService
{
private readonly ISqlSugarRepository<UsageStatisticsAggregateRoot> _repository;
2025-06-27 22:21:44 +08:00
public UsageStatisticsManager(ISqlSugarRepository<UsageStatisticsAggregateRoot> repository)
{
_repository = repository;
}
2025-06-27 22:13:26 +08:00
private IDistributedLockProvider DistributedLock =>
LazyServiceProvider.LazyGetRequiredService<IDistributedLockProvider>();
2025-08-03 21:32:54 +08:00
public async Task SetUsageAsync(Guid? userId, string modelId, ThorUsageResponse? tokenUsage)
2025-06-27 22:13:26 +08:00
{
2025-07-22 10:40:23 +08:00
long inputTokenCount = tokenUsage?.PromptTokens
?? tokenUsage?.InputTokens
2025-07-22 10:40:23 +08:00
?? 0;
long outputTokenCount = tokenUsage?.CompletionTokens
?? tokenUsage?.OutputTokens
2025-07-22 10:40:23 +08:00
?? 0;
2025-08-03 21:32:54 +08:00
await using (await DistributedLock.AcquireLockAsync($"UsageStatistics:{userId?.ToString()}"))
2025-06-27 22:13:26 +08:00
{
var entity = await _repository._DbQueryable.FirstAsync(x => x.UserId == userId && x.ModelId == modelId);
//存在数据,更细
if (entity is not null)
{
entity.AddOnceChat(inputTokenCount, outputTokenCount);
await _repository.UpdateAsync(entity);
}
//不存在插入
else
{
var usage = new UsageStatisticsAggregateRoot(userId, modelId);
usage.AddOnceChat(inputTokenCount, outputTokenCount);
await _repository.InsertAsync(usage);
}
}
}
}