- OnlineSearch 增加 daysAgo 非法值保护,避免无效时间范围 - 修复 UsageStatistics 中 Prompt/Completion Token 为 0 时的统计异常 - 引入独立 UnitOfWork,解决流式处理下的并发与事务问题 - 确保用量统计、系统消息与尊享包扣减的原子性 - 补充前端 Element Plus 组件类型声明 - 统一并优化部分代码格式,不影响业务逻辑
51 lines
1.9 KiB
C#
51 lines
1.9 KiB
C#
using Medallion.Threading;
|
|
using Volo.Abp.Domain.Services;
|
|
using Yi.Framework.AiHub.Domain.Entities;
|
|
using Yi.Framework.AiHub.Domain.Shared.Dtos.OpenAi;
|
|
using Yi.Framework.SqlSugarCore.Abstractions;
|
|
|
|
namespace Yi.Framework.AiHub.Domain.Managers;
|
|
|
|
public class UsageStatisticsManager : DomainService
|
|
{
|
|
private readonly ISqlSugarRepository<UsageStatisticsAggregateRoot> _repository;
|
|
|
|
public UsageStatisticsManager(ISqlSugarRepository<UsageStatisticsAggregateRoot> repository)
|
|
{
|
|
_repository = repository;
|
|
}
|
|
|
|
private IDistributedLockProvider DistributedLock =>
|
|
LazyServiceProvider.LazyGetRequiredService<IDistributedLockProvider>();
|
|
|
|
public async Task SetUsageAsync(Guid? userId, string modelId, ThorUsageResponse? tokenUsage, Guid? tokenId = null)
|
|
{
|
|
var actualTokenId = tokenId ?? Guid.Empty;
|
|
|
|
long inputTokenCount = tokenUsage?.PromptTokens > 0
|
|
? tokenUsage.PromptTokens.Value
|
|
: tokenUsage?.InputTokens ?? 0;
|
|
|
|
long outputTokenCount = tokenUsage?.CompletionTokens > 0
|
|
? tokenUsage.CompletionTokens.Value
|
|
: tokenUsage?.OutputTokens ?? 0;
|
|
|
|
await using (await DistributedLock.AcquireLockAsync($"UsageStatistics:{userId?.ToString()}:{actualTokenId}:{modelId}"))
|
|
{
|
|
var entity = await _repository._DbQueryable.FirstAsync(x => x.UserId == userId && x.ModelId == modelId && x.TokenId == actualTokenId);
|
|
//存在数据,更新
|
|
if (entity is not null)
|
|
{
|
|
entity.AddOnceChat(inputTokenCount, outputTokenCount);
|
|
await _repository.UpdateAsync(entity);
|
|
}
|
|
//不存在插入
|
|
else
|
|
{
|
|
var usage = new UsageStatisticsAggregateRoot(userId, modelId, actualTokenId);
|
|
usage.AddOnceChat(inputTokenCount, outputTokenCount);
|
|
await _repository.InsertAsync(usage);
|
|
}
|
|
}
|
|
}
|
|
} |