feat: 完成兼容处理

This commit is contained in:
ccnetcore
2025-07-18 20:46:30 +08:00
parent ccba2667bc
commit 651f0157dc
8 changed files with 966 additions and 1095 deletions

View File

@@ -94,7 +94,7 @@ public class AiChatService : ApplicationService
/// <param name="input"></param>
/// <param name="sessionId"></param>
/// <param name="cancellationToken"></param>
public async Task PostSendAsync([FromBody] ThorChatCompletionsRequest input, [FromQuery] Guid sessionId,
public async Task PostSendAsync([FromBody] ThorChatCompletionsRequest input, [FromRoute] Guid sessionId,
CancellationToken cancellationToken)
{
//除了免费模型,其他的模型都要校验

View File

@@ -0,0 +1,8 @@
using Yi.Framework.AiHub.Application.Contracts.Dtos.OpenAi;
namespace Yi.Framework.AiHub.Domain.AiGateWay;
public interface ISpecialCompatible
{
public void Compatible(ThorChatCompletionsRequest request);
}

View File

@@ -0,0 +1,23 @@
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
using Yi.Framework.AiHub.Application.Contracts.Dtos.OpenAi;
namespace Yi.Framework.AiHub.Domain.AiGateWay;
public class SpecialCompatible : ISpecialCompatible,ISingletonDependency
{
private readonly IOptions<SpecialCompatibleOptions> _options;
public SpecialCompatible(IOptions<SpecialCompatibleOptions> options)
{
_options = options;
}
public void Compatible(ThorChatCompletionsRequest request)
{
foreach (var handle in _options.Value.Handles)
{
handle(request);
}
}
}

View File

@@ -0,0 +1,8 @@
using Yi.Framework.AiHub.Application.Contracts.Dtos.OpenAi;
namespace Yi.Framework.AiHub.Domain.AiGateWay;
public class SpecialCompatibleOptions
{
public List<Action<ThorChatCompletionsRequest>> Handles { get; set; } = new();
}

View File

@@ -22,14 +22,17 @@ public class AiGateWayManager : DomainService
private readonly ILogger<AiGateWayManager> _logger;
private readonly AiMessageManager _aiMessageManager;
private readonly UsageStatisticsManager _usageStatisticsManager;
private readonly ISpecialCompatible _specialCompatible;
public AiGateWayManager(ISqlSugarRepository<AiAppAggregateRoot> aiAppRepository, ILogger<AiGateWayManager> logger,
AiMessageManager aiMessageManager, UsageStatisticsManager usageStatisticsManager)
AiMessageManager aiMessageManager, UsageStatisticsManager usageStatisticsManager,
ISpecialCompatible specialCompatible)
{
_aiAppRepository = aiAppRepository;
_logger = logger;
_aiMessageManager = aiMessageManager;
_usageStatisticsManager = usageStatisticsManager;
_specialCompatible = specialCompatible;
}
/// <summary>
@@ -76,16 +79,11 @@ public class AiGateWayManager : DomainService
ThorChatCompletionsRequest request,
[EnumeratorCancellation] CancellationToken cancellationToken)
{
_specialCompatible.Compatible(request);
var modelDescribe = await GetModelAsync(request.Model);
var chatService =
LazyServiceProvider.GetRequiredKeyedService<IChatCompletionService>(modelDescribe.HandlerName);
//todo 处理极少数不同模型参数不一样
if (request.Model == "o1")
{
request.Temperature = null;
}
await foreach (var result in chatService.CompleteChatStreamAsync(modelDescribe, request, cancellationToken))
{
yield return result;
@@ -108,6 +106,7 @@ public class AiGateWayManager : DomainService
Guid? sessionId = null,
CancellationToken cancellationToken = default)
{
_specialCompatible.Compatible(request);
var response = httpContext.Response;
// 设置响应头,声明是 json
response.ContentType = "application/json; charset=UTF-8";

View File

@@ -25,6 +25,18 @@ namespace Yi.Framework.AiHub.Domain
nameof(AzureOpenAiChatCompletionCompletionsService));
services.AddKeyedTransient<IChatCompletionService, AzureDatabricksChatCompletionsService>(
nameof(AzureDatabricksChatCompletionsService));
//ai模型特殊性兼容处理
Configure<SpecialCompatibleOptions>(options =>
{
options.Handles.Add(request =>
{
if (request.Model == "o1")
{
request.Temperature = null;
}
});
});
}
public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context)