Merge remote-tracking branch 'origin/ai-hub' into ai-hub

This commit is contained in:
Gsh
2026-01-04 21:29:07 +08:00
4 changed files with 68 additions and 11 deletions

View File

@@ -64,6 +64,13 @@ public class ImageGenerationJob : AsyncBackgroundJob<ImageGenerationJobArgs>, IT
{ {
contents = new[] contents = new[]
{ {
new
{
role = "user", parts = new List<object>
{
new { text = "我只要图片,直接生成图片,不要询问我" }
}
},
new { role = "user", parts } new { role = "user", parts }
} }
}; };

View File

@@ -264,7 +264,7 @@ public class AiImageService : ApplicationService
ErrorInfo = x.ErrorInfo, ErrorInfo = x.ErrorInfo,
UserName = x.UserName, UserName = x.UserName,
UserId = x.UserId, UserId = x.UserId,
IsAnonymous =x.IsAnonymous IsAnonymous = x.IsAnonymous
}) })
.ToPageListAsync(input.SkipCount, input.MaxResultCount, total); .ToPageListAsync(input.SkipCount, input.MaxResultCount, total);
@@ -272,6 +272,17 @@ public class AiImageService : ApplicationService
return new PagedResult<ImageTaskOutput>(total, output); return new PagedResult<ImageTaskOutput>(total, output);
} }
/// <summary>
/// 删除个人图片
/// </summary>
/// <param name="ids"></param>
[HttpDelete("ai-image/my-tasks")]
public async Task DeleteMyTaskAsync([FromBody] List<Guid> ids)
{
var userId = CurrentUser.GetId();
await _imageTaskRepository.DeleteAsync(x => ids.Contains(x.Id) && x.UserId == userId);
}
/// <summary> /// <summary>
/// 分页查询图片广场(已发布的图片) /// 分页查询图片广场(已发布的图片)
/// </summary> /// </summary>
@@ -285,8 +296,9 @@ public class AiImageService : ApplicationService
.Where(x => x.TaskStatus == TaskStatusEnum.Success) .Where(x => x.TaskStatus == TaskStatusEnum.Success)
.WhereIF(input.TaskStatus is not null, x => x.TaskStatus == input.TaskStatus) .WhereIF(input.TaskStatus is not null, x => x.TaskStatus == input.TaskStatus)
.WhereIF(!string.IsNullOrWhiteSpace(input.Prompt), x => x.Prompt.Contains(input.Prompt)) .WhereIF(!string.IsNullOrWhiteSpace(input.Prompt), x => x.Prompt.Contains(input.Prompt))
.WhereIF(!string.IsNullOrWhiteSpace(input.Categories), x => SqlFunc.JsonLike(x.Categories, input.Categories)) .WhereIF(!string.IsNullOrWhiteSpace(input.Categories),
.WhereIF(!string.IsNullOrWhiteSpace(input.UserName),x=>x.UserName.Contains(input.UserName) ) x => SqlFunc.JsonLike(x.Categories, input.Categories))
.WhereIF(!string.IsNullOrWhiteSpace(input.UserName), x => x.UserName.Contains(input.UserName))
.WhereIF(input.StartTime is not null && input.EndTime is not null, .WhereIF(input.StartTime is not null && input.EndTime is not null,
x => x.CreationTime >= input.StartTime && x.CreationTime <= input.EndTime) x => x.CreationTime >= input.StartTime && x.CreationTime <= input.EndTime)
.OrderByDescending(x => x.CreationTime) .OrderByDescending(x => x.CreationTime)
@@ -303,9 +315,9 @@ public class AiImageService : ApplicationService
ErrorInfo = null, ErrorInfo = null,
UserName = x.UserName, UserName = x.UserName,
UserId = x.UserId, UserId = x.UserId,
}) })
.ToPageListAsync(input.SkipCount, input.MaxResultCount, total); ; .ToPageListAsync(input.SkipCount, input.MaxResultCount, total);
;
output.ForEach(x => output.ForEach(x =>
@@ -316,7 +328,7 @@ public class AiImageService : ApplicationService
x.UserId = null; x.UserId = null;
} }
}); });
return new PagedResult<ImageTaskOutput>(total, output); return new PagedResult<ImageTaskOutput>(total, output);
} }
@@ -345,7 +357,7 @@ public class AiImageService : ApplicationService
} }
//设置发布 //设置发布
task.SetPublish(input.IsAnonymous,input.Categories); task.SetPublish(input.IsAnonymous, input.Categories);
await _imageTaskRepository.UpdateAsync(task); await _imageTaskRepository.UpdateAsync(task);
} }

View File

@@ -1,4 +1,6 @@
namespace Yi.Framework.AiHub.Domain.Shared.Dtos; using Yi.Framework.AiHub.Domain.Shared.Enums;
namespace Yi.Framework.AiHub.Domain.Shared.Dtos;
public class AiModelDescribe public class AiModelDescribe
{ {
@@ -66,4 +68,9 @@ public class AiModelDescribe
/// 是否为尊享模型 /// 是否为尊享模型
/// </summary> /// </summary>
public bool IsPremium { get; set; } public bool IsPremium { get; set; }
/// <summary>
/// 模型类型(聊天/图片等)
/// </summary>
public ModelTypeEnum ModelType { get; set; }
} }

View File

@@ -86,7 +86,8 @@ public class AiGateWayManager : DomainService
AppExtraUrl = app.ExtraUrl, AppExtraUrl = app.ExtraUrl,
ModelExtraInfo = model.ExtraInfo, ModelExtraInfo = model.ExtraInfo,
Multiplier = model.Multiplier, Multiplier = model.Multiplier,
IsPremium = model.IsPremium IsPremium = model.IsPremium,
ModelType = model.ModelType
}) })
.FirstAsync(); .FirstAsync();
if (aiModelDescribe is null) if (aiModelDescribe is null)
@@ -871,7 +872,20 @@ public class AiGateWayManager : DomainService
var data = await chatService.GenerateContentAsync(modelDescribe, request, cancellationToken); var data = await chatService.GenerateContentAsync(modelDescribe, request, cancellationToken);
var tokenUsage = GeminiGenerateContentAcquirer.GetUsage(data); var tokenUsage = GeminiGenerateContentAcquirer.GetUsage(data);
tokenUsage.SetSupplementalMultiplier(modelDescribe.Multiplier); //如果是图片模型,单独扣费
if (modelDescribe.ModelType == ModelTypeEnum.Image)
{
tokenUsage = new ThorUsageResponse
{
InputTokens = (int)modelDescribe.Multiplier,
OutputTokens = (int)modelDescribe.Multiplier,
TotalTokens = (int)modelDescribe.Multiplier
};
}
else
{
tokenUsage.SetSupplementalMultiplier(modelDescribe.Multiplier);
}
if (userId is not null) if (userId is not null)
{ {
@@ -944,7 +958,20 @@ public class AiGateWayManager : DomainService
if (responseResult!.Value.GetPath("candidates", 0, "finishReason").GetString() == "STOP") if (responseResult!.Value.GetPath("candidates", 0, "finishReason").GetString() == "STOP")
{ {
tokenUsage = GeminiGenerateContentAcquirer.GetUsage(responseResult!.Value); tokenUsage = GeminiGenerateContentAcquirer.GetUsage(responseResult!.Value);
tokenUsage.SetSupplementalMultiplier(modelDescribe.Multiplier); //如果是图片模型,单独扣费
if (modelDescribe.ModelType == ModelTypeEnum.Image)
{
tokenUsage = new ThorUsageResponse
{
InputTokens = (int)modelDescribe.Multiplier,
OutputTokens = (int)modelDescribe.Multiplier,
TotalTokens = (int)modelDescribe.Multiplier
};
}
else
{
tokenUsage.SetSupplementalMultiplier(modelDescribe.Multiplier);
}
} }
await response.WriteAsync($"data: {JsonSerializer.Serialize(responseResult)}\n\n", Encoding.UTF8, await response.WriteAsync($"data: {JsonSerializer.Serialize(responseResult)}\n\n", Encoding.UTF8,
@@ -1019,6 +1046,10 @@ public class AiGateWayManager : DomainService
//解析json获取base64字符串 //解析json获取base64字符串
var imagePrefixBase64 = GeminiGenerateContentAcquirer.GetImagePrefixBase64(data); var imagePrefixBase64 = GeminiGenerateContentAcquirer.GetImagePrefixBase64(data);
if (string.IsNullOrWhiteSpace(imagePrefixBase64))
{
throw new UserFriendlyException("大模型没有返回图片,请调整提示词或稍后再试");
}
//远程调用上传接口将base64转换为URL //远程调用上传接口将base64转换为URL
var httpClient = LazyServiceProvider.LazyGetRequiredService<IHttpClientFactory>().CreateClient(); var httpClient = LazyServiceProvider.LazyGetRequiredService<IHttpClientFactory>().CreateClient();