From 688d93e5c1680ef05c350d13f55847dab764e2b0 Mon Sep 17 00:00:00 2001 From: chenchun Date: Tue, 25 Nov 2025 09:54:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E5=80=8D=E7=8E=87?= =?UTF-8?q?=E7=9A=84=E9=85=8D=E7=BD=AE=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/AiModelDescribe.cs | 5 +++++ .../Dtos/Anthropic/AnthropicChatCompletionDto.cs | 4 ++-- .../Dtos/OpenAi/ThorChatCompletionsResponse.cs | 2 +- .../ThorClaude/Chats/AnthropicChatCompletionsService.cs | 8 ++------ .../ThorClaude/Chats/ClaudiaChatCompletionsService.cs | 3 +-- .../Entities/Model/AiModelEntity.cs | 5 +++++ .../Managers/AiGateWayManager.cs | 9 ++++++++- 7 files changed, 24 insertions(+), 12 deletions(-) diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain.Shared/Dtos/AiModelDescribe.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain.Shared/Dtos/AiModelDescribe.cs index 636feb70..1de8547b 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain.Shared/Dtos/AiModelDescribe.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain.Shared/Dtos/AiModelDescribe.cs @@ -56,4 +56,9 @@ public class AiModelDescribe /// 模型额外信息 /// public string? ModelExtraInfo { get; set; } + + /// + /// 模型倍率 + /// + public decimal Multiplier { get; set; } } \ No newline at end of file diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain.Shared/Dtos/Anthropic/AnthropicChatCompletionDto.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain.Shared/Dtos/Anthropic/AnthropicChatCompletionDto.cs index 7f25afc3..78e6dc5e 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain.Shared/Dtos/Anthropic/AnthropicChatCompletionDto.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain.Shared/Dtos/Anthropic/AnthropicChatCompletionDto.cs @@ -34,7 +34,7 @@ public class AnthropicStreamDto }; - public void SupplementalMultiplier(double multiplier) + public void SupplementalMultiplier(decimal multiplier) { if (this.Usage is not null) { @@ -130,7 +130,7 @@ public class AnthropicChatCompletionDto CompletionTokensDetails = null }; - public void SupplementalMultiplier(double multiplier) + public void SupplementalMultiplier(decimal multiplier) { if (this.Usage is not null) { diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain.Shared/Dtos/OpenAi/ThorChatCompletionsResponse.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain.Shared/Dtos/OpenAi/ThorChatCompletionsResponse.cs index a63d663c..f842c610 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain.Shared/Dtos/OpenAi/ThorChatCompletionsResponse.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain.Shared/Dtos/OpenAi/ThorChatCompletionsResponse.cs @@ -61,7 +61,7 @@ public record ThorChatCompletionsResponse [JsonPropertyName("error")] public ThorError? Error { get; set; } - public void SupplementalMultiplier(double multiplier) + public void SupplementalMultiplier(decimal multiplier) { if (this.Usage is not null) { diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/AiGateWay/Impl/ThorClaude/Chats/AnthropicChatCompletionsService.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/AiGateWay/Impl/ThorClaude/Chats/AnthropicChatCompletionsService.cs index f46b2883..b2ac930c 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/AiGateWay/Impl/ThorClaude/Chats/AnthropicChatCompletionsService.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/AiGateWay/Impl/ThorClaude/Chats/AnthropicChatCompletionsService.cs @@ -14,8 +14,6 @@ public class AnthropicChatCompletionsService( ILogger logger) : IAnthropicChatCompletionService { - public const double ClaudeMultiplier = 1.3d; - public async Task ChatCompletionsAsync(AiModelDescribe options, AnthropicInput input, CancellationToken cancellationToken = default) { @@ -86,8 +84,7 @@ public class AnthropicChatCompletionsService( var value = await response.Content.ReadFromJsonAsync(ThorJsonSerializer.DefaultOptions, cancellationToken: cancellationToken); - value.SupplementalMultiplier(AnthropicChatCompletionsService.ClaudeMultiplier); - + return value; } @@ -169,8 +166,7 @@ public class AnthropicChatCompletionsService( var result = JsonSerializer.Deserialize(data, ThorJsonSerializer.DefaultOptions); - - result.SupplementalMultiplier(AnthropicChatCompletionsService.ClaudeMultiplier); + yield return (eventType, result); } } diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/AiGateWay/Impl/ThorClaude/Chats/ClaudiaChatCompletionsService.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/AiGateWay/Impl/ThorClaude/Chats/ClaudiaChatCompletionsService.cs index b9f00f21..a0023b9b 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/AiGateWay/Impl/ThorClaude/Chats/ClaudiaChatCompletionsService.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/AiGateWay/Impl/ThorClaude/Chats/ClaudiaChatCompletionsService.cs @@ -716,7 +716,7 @@ public sealed class ClaudiaChatCompletionsService( output.Usage.PromptTokens = output.Usage.InputTokens; output.Usage.CompletionTokens = output.Usage.OutputTokens; output.Usage.TotalTokens = output.Usage.InputTokens + output.Usage.OutputTokens; - output.SupplementalMultiplier(AnthropicChatCompletionsService.ClaudeMultiplier); + yield return output; } } @@ -873,7 +873,6 @@ public sealed class ClaudiaChatCompletionsService( } thor.Usage.TotalTokens = thor.Usage.InputTokens + thor.Usage.OutputTokens; - thor.SupplementalMultiplier(AnthropicChatCompletionsService.ClaudeMultiplier); return thor; } } \ No newline at end of file diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Entities/Model/AiModelEntity.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Entities/Model/AiModelEntity.cs index 3abd9b70..2a760dbf 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Entities/Model/AiModelEntity.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Entities/Model/AiModelEntity.cs @@ -60,4 +60,9 @@ public class AiModelEntity : Entity, IOrderNum, ISoftDelete /// 模型Api类型,现支持同一个模型id,多种接口格式 /// public ModelApiTypeEnum ModelApiType { get; set; } + + /// + /// 模型倍率 + /// + public decimal Multiplier { get; set; } = 1; } \ No newline at end of file diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/AiGateWayManager.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/AiGateWayManager.cs index 8cb263b2..ffb70822 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/AiGateWayManager.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/AiGateWayManager.cs @@ -77,7 +77,8 @@ public class AiGateWayManager : DomainService ModelName = model.Name, Description = model.Description, AppExtraUrl = app.ExtraUrl, - ModelExtraInfo = model.ExtraInfo + ModelExtraInfo = model.ExtraInfo, + Multiplier = model.Multiplier }) .FirstAsync(); if (aiModelDescribe is null) @@ -106,6 +107,7 @@ public class AiGateWayManager : DomainService await foreach (var result in chatService.CompleteChatStreamAsync(modelDescribe, request, cancellationToken)) { + result.SupplementalMultiplier(modelDescribe.Multiplier); yield return result; } } @@ -134,6 +136,7 @@ public class AiGateWayManager : DomainService var chatService = LazyServiceProvider.GetRequiredKeyedService(modelDescribe.HandlerName); var data = await chatService.CompleteChatAsync(modelDescribe, request, cancellationToken); + data.SupplementalMultiplier(modelDescribe.Multiplier); if (userId is not null) { await _aiMessageManager.CreateUserMessageAsync(userId.Value, sessionId, @@ -506,6 +509,7 @@ public class AiGateWayManager : DomainService await foreach (var result in chatService.StreamChatCompletionsAsync(modelDescribe, request, cancellationToken)) { + result.Item2.SupplementalMultiplier(modelDescribe.Multiplier); yield return result; } } @@ -534,6 +538,9 @@ public class AiGateWayManager : DomainService var chatService = LazyServiceProvider.GetRequiredKeyedService(modelDescribe.HandlerName); var data = await chatService.ChatCompletionsAsync(modelDescribe, request, cancellationToken); + + data.SupplementalMultiplier(modelDescribe.Multiplier); + if (userId is not null) { await _aiMessageManager.CreateUserMessageAsync(userId.Value, sessionId,