From 58fcc92e4d13452ee5adf4ecf0eec32de4ddcaf7 Mon Sep 17 00:00:00 2001 From: ccnetcore Date: Tue, 17 Jun 2025 23:25:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90AzureOpenAI=E6=94=B9?= =?UTF-8?q?=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Yi.Abp.Net8/Yi.Abp.sln | 7 +++ .../SemanticKernelClient.cs | 23 ++++---- .../SemanticKernelOptions.cs | 2 +- .../Yi.Framework.SemanticKernel.csproj | 11 ++++ .../YiFrameworkSemanticKernelModule.cs | 37 +++++++++++++ .../Managers/NewsManager.cs | 1 + .../Managers/StockMarketManager.cs | 1 + .../Yi.Framework.Stock.Domain.csproj | 2 +- .../YiFrameworkStockDomainModule.cs | 30 +++-------- .../Managers/AiManager.cs | 52 +++++++++---------- .../Yi.Framework.ChatHub.Domain.csproj | 2 +- .../YiFrameworkChatHubDomainModule.cs | 28 ++-------- Yi.Bbs.Vue3/src/views/chathub/Index.vue | 18 +++---- 13 files changed, 119 insertions(+), 95 deletions(-) rename Yi.Abp.Net8/{module/ai-stock/Yi.Framework.Stock.Domain/Managers/SemanticKernel => framework/Yi.Framework.SemanticKernel}/SemanticKernelClient.cs (65%) rename Yi.Abp.Net8/{module/ai-stock/Yi.Framework.Stock.Domain/Managers/SemanticKernel => framework/Yi.Framework.SemanticKernel}/SemanticKernelOptions.cs (76%) create mode 100644 Yi.Abp.Net8/framework/Yi.Framework.SemanticKernel/Yi.Framework.SemanticKernel.csproj create mode 100644 Yi.Abp.Net8/framework/Yi.Framework.SemanticKernel/YiFrameworkSemanticKernelModule.cs diff --git a/Yi.Abp.Net8/Yi.Abp.sln b/Yi.Abp.Net8/Yi.Abp.sln index d4e242fa..d61cae0e 100644 --- a/Yi.Abp.Net8/Yi.Abp.sln +++ b/Yi.Abp.Net8/Yi.Abp.sln @@ -186,6 +186,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.Stock.Domain.S EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.Stock.SqlSugarCore", "module\ai-stock\Yi.Framework.Stock.SqlSugarCore\Yi.Framework.Stock.SqlSugarCore.csproj", "{5F49318F-E6C7-4194-BAE0-83D4FB8D1983}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.SemanticKernel", "framework\Yi.Framework.SemanticKernel\Yi.Framework.SemanticKernel.csproj", "{2503116E-4D69-49E3-8ED7-A6CDD0C3B542}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -468,6 +470,10 @@ Global {5F49318F-E6C7-4194-BAE0-83D4FB8D1983}.Debug|Any CPU.Build.0 = Debug|Any CPU {5F49318F-E6C7-4194-BAE0-83D4FB8D1983}.Release|Any CPU.ActiveCfg = Release|Any CPU {5F49318F-E6C7-4194-BAE0-83D4FB8D1983}.Release|Any CPU.Build.0 = Release|Any CPU + {2503116E-4D69-49E3-8ED7-A6CDD0C3B542}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2503116E-4D69-49E3-8ED7-A6CDD0C3B542}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2503116E-4D69-49E3-8ED7-A6CDD0C3B542}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2503116E-4D69-49E3-8ED7-A6CDD0C3B542}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -551,6 +557,7 @@ Global {162821E4-8FE0-4A68-B3C0-49BD6596446F} = {DB46873F-981A-43D8-91B0-D464CCB65943} {10273544-715D-4BB3-893C-6F010D947BDD} = {DB46873F-981A-43D8-91B0-D464CCB65943} {5F49318F-E6C7-4194-BAE0-83D4FB8D1983} = {DB46873F-981A-43D8-91B0-D464CCB65943} + {2503116E-4D69-49E3-8ED7-A6CDD0C3B542} = {77B949E9-530E-45A5-9657-20F7D5C6875C} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {23D6FBC9-C970-4641-BC1E-2AEA59F51C18} diff --git a/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Managers/SemanticKernel/SemanticKernelClient.cs b/Yi.Abp.Net8/framework/Yi.Framework.SemanticKernel/SemanticKernelClient.cs similarity index 65% rename from Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Managers/SemanticKernel/SemanticKernelClient.cs rename to Yi.Abp.Net8/framework/Yi.Framework.SemanticKernel/SemanticKernelClient.cs index 0443b2ef..e5c33b88 100644 --- a/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Managers/SemanticKernel/SemanticKernelClient.cs +++ b/Yi.Abp.Net8/framework/Yi.Framework.SemanticKernel/SemanticKernelClient.cs @@ -3,16 +3,17 @@ using Microsoft.SemanticKernel.ChatCompletion; using Microsoft.SemanticKernel.Connectors.OpenAI; using Volo.Abp.DependencyInjection; -namespace Yi.Framework.Stock.Domain.Managers.SemanticKernel; +namespace Yi.Framework.SemanticKernel; -public class SemanticKernelClient:ITransientDependency +public class SemanticKernelClient : ITransientDependency { - public Kernel Kernel { get;} + public Kernel Kernel { get; } public SemanticKernelClient(Kernel kernel) { this.Kernel = kernel; } + /// /// 执行插件 /// @@ -20,7 +21,7 @@ public class SemanticKernelClient:ITransientDependency /// /// /// - public async Task InovkerFunctionAsync(string input, string pluginName, string functionName) + public async Task InvokerFunctionAsync(string input, string pluginName, string functionName) { KernelFunction jsonFun = this.Kernel.Plugins.GetFunction(pluginName, functionName); var result = await this.Kernel.InvokeAsync(function: jsonFun, new KernelArguments() { ["input"] = input }); @@ -28,25 +29,29 @@ public class SemanticKernelClient:ITransientDependency } /// - /// 聊天对话,调用方法 + /// 聊天完成,FunctionCall /// /// - public async Task> ChatCompletionAsync(string question,params (string,string)[] functions) + public async Task> ChatCompletionAsync(string question, + params (string, string)[] functions) { if (functions is null) { throw new Exception("请选择插件"); } + var openSettings = new OpenAIPromptExecutionSettings() { - FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(functions.Select(x=>this.Kernel.Plugins.GetFunction(x.Item1, x.Item2)).ToList(),true), + FunctionChoiceBehavior = + FunctionChoiceBehavior.Auto( + functions.Select(x => this.Kernel.Plugins.GetFunction(x.Item1, x.Item2)).ToList(), true), // ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions, - MaxTokens =1000 + // MaxTokens =1000 }; var chatCompletionService = this.Kernel.GetRequiredService(); - var results =await chatCompletionService.GetChatMessageContentsAsync( + var results = await chatCompletionService.GetChatMessageContentsAsync( question, executionSettings: openSettings, kernel: Kernel); diff --git a/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Managers/SemanticKernel/SemanticKernelOptions.cs b/Yi.Abp.Net8/framework/Yi.Framework.SemanticKernel/SemanticKernelOptions.cs similarity index 76% rename from Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Managers/SemanticKernel/SemanticKernelOptions.cs rename to Yi.Abp.Net8/framework/Yi.Framework.SemanticKernel/SemanticKernelOptions.cs index afa754d4..68796007 100644 --- a/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Managers/SemanticKernel/SemanticKernelOptions.cs +++ b/Yi.Abp.Net8/framework/Yi.Framework.SemanticKernel/SemanticKernelOptions.cs @@ -1,4 +1,4 @@ -namespace Yi.Framework.Stock.Domain.Managers.SemanticKernel +namespace Yi.Framework.SemanticKernel { public class SemanticKernelOptions { diff --git a/Yi.Abp.Net8/framework/Yi.Framework.SemanticKernel/Yi.Framework.SemanticKernel.csproj b/Yi.Abp.Net8/framework/Yi.Framework.SemanticKernel/Yi.Framework.SemanticKernel.csproj new file mode 100644 index 00000000..20655722 --- /dev/null +++ b/Yi.Abp.Net8/framework/Yi.Framework.SemanticKernel/Yi.Framework.SemanticKernel.csproj @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Yi.Abp.Net8/framework/Yi.Framework.SemanticKernel/YiFrameworkSemanticKernelModule.cs b/Yi.Abp.Net8/framework/Yi.Framework.SemanticKernel/YiFrameworkSemanticKernelModule.cs new file mode 100644 index 00000000..0b9d439a --- /dev/null +++ b/Yi.Abp.Net8/framework/Yi.Framework.SemanticKernel/YiFrameworkSemanticKernelModule.cs @@ -0,0 +1,37 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.SemanticKernel; +using Yi.Framework.Core.Options; + +namespace Yi.Framework.SemanticKernel; + +public class YiFrameworkSemanticKernelModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + var configuration = context.Services.GetConfiguration(); + var services = context.Services; + + // 配置绑定 + var semanticKernelSection = configuration.GetSection("SemanticKernel"); + services.Configure(configuration.GetSection("SemanticKernel")); + // 从配置中获取值 + var options = semanticKernelSection.Get(); + foreach (var optionsModelId in options.ModelIds) + { + services.AddKernel() + .AddAzureOpenAIChatCompletion( + deploymentName: optionsModelId, + endpoint: options.Endpoint, + apiKey: options.ApiKey, + serviceId: optionsModelId, + modelId: optionsModelId); + + // .AddOpenAIChatCompletion( + // serviceId: optionsModelId, + // modelId: optionsModelId, + // endpoint: new Uri(options.Endpoint), + // apiKey: options.ApiKey); + } + } +} \ No newline at end of file diff --git a/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Managers/NewsManager.cs b/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Managers/NewsManager.cs index 7e9ff774..59afe88e 100644 --- a/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Managers/NewsManager.cs +++ b/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Managers/NewsManager.cs @@ -5,6 +5,7 @@ using Yi.Framework.Stock.Domain.Managers.SemanticKernel; using Yi.Framework.Stock.Domain.Managers.SemanticKernel.Plugins; using System.Text; using System.IO; +using Yi.Framework.SemanticKernel; namespace Yi.Framework.Stock.Domain.Managers; diff --git a/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Managers/StockMarketManager.cs b/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Managers/StockMarketManager.cs index 648f232d..897e897e 100644 --- a/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Managers/StockMarketManager.cs +++ b/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Managers/StockMarketManager.cs @@ -13,6 +13,7 @@ using Yi.Framework.Stock.Domain.Managers.SemanticKernel.Plugins; using Microsoft.Extensions.Hosting; using System.Text; using System.IO; +using Yi.Framework.SemanticKernel; namespace Yi.Framework.Stock.Domain.Managers { diff --git a/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Yi.Framework.Stock.Domain.csproj b/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Yi.Framework.Stock.Domain.csproj index 55c6a318..dce7b3ac 100644 --- a/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Yi.Framework.Stock.Domain.csproj +++ b/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Yi.Framework.Stock.Domain.csproj @@ -1,7 +1,6 @@ - @@ -9,6 +8,7 @@ + diff --git a/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/YiFrameworkStockDomainModule.cs b/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/YiFrameworkStockDomainModule.cs index 35820783..7b405b17 100644 --- a/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/YiFrameworkStockDomainModule.cs +++ b/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/YiFrameworkStockDomainModule.cs @@ -1,11 +1,10 @@ -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.SemanticKernel; using Volo.Abp.Caching; using Volo.Abp.Domain; using Yi.Framework.Mapster; +using Yi.Framework.SemanticKernel; using Yi.Framework.Stock.Domain.Managers; -using Yi.Framework.Stock.Domain.Managers.SemanticKernel; using Yi.Framework.Stock.Domain.Managers.SemanticKernel.Plugins; using Yi.Framework.Stock.Domain.Shared; @@ -15,6 +14,7 @@ namespace Yi.Framework.Stock.Domain typeof(YiFrameworkStockDomainSharedModule), typeof(YiFrameworkMapsterModule), typeof(AbpDddDomainModule), + typeof(YiFrameworkSemanticKernelModule), typeof(AbpCachingModule) )] public class YiFrameworkStockDomainModule : AbpModule @@ -23,27 +23,13 @@ namespace Yi.Framework.Stock.Domain { var configuration = context.Services.GetConfiguration(); var services = context.Services; - - // 配置绑定 - var semanticKernelSection = configuration.GetSection("SemanticKernel"); - services.Configure(configuration.GetSection("SemanticKernel")); - - services.AddHttpClient(); -#pragma warning disable SKEXP0010 - // 从配置中获取值 - var options = semanticKernelSection.Get(); - //股市优先使用第一个ai模型 - services.AddKernel() - .AddOpenAIChatCompletion( - modelId: options.ModelIds.FirstOrDefault(), - endpoint: new Uri(options.Endpoint), - apiKey: options.ApiKey); -#pragma warning restore SKEXP0010 - + // 添加插件 - services.AddSingleton(sp => KernelPluginFactory.CreateFromType(serviceProvider: sp)); - services.AddSingleton(sp => KernelPluginFactory.CreateFromType(serviceProvider: sp)); - + services.AddSingleton(sp => + KernelPluginFactory.CreateFromType(serviceProvider: sp)); + services.AddSingleton(sp => + KernelPluginFactory.CreateFromType(serviceProvider: sp)); + // 注册NewsManager services.AddTransient(); } diff --git a/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/Managers/AiManager.cs b/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/Managers/AiManager.cs index 5a73d8ac..90258e51 100644 --- a/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/Managers/AiManager.cs +++ b/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/Managers/AiManager.cs @@ -1,26 +1,19 @@ -using System.Collections.Generic; -using System.Net; -using Microsoft.Extensions.Options; -using Microsoft.SemanticKernel; +using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.ChatCompletion; using Microsoft.SemanticKernel.Connectors.OpenAI; -// using OpenAI; -// using OpenAI.Managers; -// using OpenAI.ObjectModels; -// using OpenAI.ObjectModels.RequestModels; -// using OpenAI.ObjectModels.ResponseModels; using Volo.Abp.DependencyInjection; -using Volo.Abp.Domain.Services; using Yi.Framework.ChatHub.Domain.Shared.Dtos; -using Yi.Framework.ChatHub.Domain.Shared.Options; +using Yi.Framework.SemanticKernel; + namespace Yi.Framework.ChatHub.Domain.Managers { public class AiManager : ISingletonDependency { - private readonly Kernel _kernel; - public AiManager(Kernel kernel) + private readonly SemanticKernelClient _client; + + public AiManager(SemanticKernelClient client) { - _kernel = kernel; + _client = client; } public async IAsyncEnumerable ChatAsStreamAsync(string model, List aiChatContextDtos) @@ -29,38 +22,41 @@ namespace Yi.Framework.ChatHub.Domain.Managers { yield return null; } + var openSettings = new OpenAIPromptExecutionSettings() { - MaxTokens =1000 + //MaxTokens = 1000 }; - var chatCompletionService = this._kernel.GetRequiredService(model); + var chatCompletionService = this._client.Kernel.GetRequiredService(model); - var history =new ChatHistory(); + var history = new ChatHistory(); foreach (var aiChatContextDto in aiChatContextDtos) { - if (aiChatContextDto.AnswererType==AnswererTypeEnum.Ai) + if (aiChatContextDto.AnswererType == AnswererTypeEnum.Ai) { - history.AddSystemMessage(aiChatContextDto.Message); + history.AddAssistantMessage(aiChatContextDto.Message); } - else if(aiChatContextDto.AnswererType==AnswererTypeEnum.User) + else if (aiChatContextDto.AnswererType == AnswererTypeEnum.User) { history.AddUserMessage(aiChatContextDto.Message); } } - + var results = chatCompletionService.GetStreamingChatMessageContentsAsync( chatHistory: history, executionSettings: openSettings, - kernel: _kernel); + kernel: _client.Kernel); + if (results is null) { - yield return null; + yield return null; + } + + await foreach (var result in results) + { + yield return result.Content; } - await foreach (var result in results) - { - yield return result.Content; - } } } -} +} \ No newline at end of file diff --git a/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/Yi.Framework.ChatHub.Domain.csproj b/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/Yi.Framework.ChatHub.Domain.csproj index b158ec5e..05b22837 100644 --- a/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/Yi.Framework.ChatHub.Domain.csproj +++ b/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/Yi.Framework.ChatHub.Domain.csproj @@ -2,13 +2,13 @@ + - diff --git a/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/YiFrameworkChatHubDomainModule.cs b/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/YiFrameworkChatHubDomainModule.cs index 02a4b90e..19d54ed6 100644 --- a/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/YiFrameworkChatHubDomainModule.cs +++ b/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/YiFrameworkChatHubDomainModule.cs @@ -1,43 +1,23 @@ -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.SemanticKernel; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Domain; using Yi.Framework.Caching.FreeRedis; using Yi.Framework.ChatHub.Domain.Shared; -using Yi.Framework.Core.Options; - +using Yi.Framework.SemanticKernel; namespace Yi.Framework.ChatHub.Domain { [DependsOn( typeof(YiFrameworkChatHubDomainSharedModule), typeof(YiFrameworkCachingFreeRedisModule), - + typeof(YiFrameworkSemanticKernelModule), typeof(AbpDddDomainModule) - )] + )] public class YiFrameworkChatHubDomainModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { var configuration = context.Services.GetConfiguration(); var services = context.Services; - - // 配置绑定 - var semanticKernelSection = configuration.GetSection("SemanticKernel"); - services.Configure(configuration.GetSection("SemanticKernel")); -#pragma warning disable SKEXP0010 - // 从配置中获取值 - var options = semanticKernelSection.Get(); - foreach (var optionsModelId in options.ModelIds) - { - services.AddKernel() - .AddOpenAIChatCompletion( - serviceId: optionsModelId, - modelId: optionsModelId, - endpoint: new Uri(options.Endpoint), - apiKey: options.ApiKey); - } -#pragma warning restore SKEXP0010 } } } \ No newline at end of file diff --git a/Yi.Bbs.Vue3/src/views/chathub/Index.vue b/Yi.Bbs.Vue3/src/views/chathub/Index.vue index 2518c295..0cdd211e 100644 --- a/Yi.Bbs.Vue3/src/views/chathub/Index.vue +++ b/Yi.Bbs.Vue3/src/views/chathub/Index.vue @@ -41,16 +41,16 @@ const currentInputValue = ref(""); const inputListDataStore = ref([ {key: "all", name: "官方学习交流群", titleName: "官方学习交流群", logo: "yilogo.png", value: ""}, - {key: "ai@gpt-4o-mini", name: "ChatGpt聊天", titleName: "ChatGpt-全能神!综合能力最强!", logo: "openAi.png", value: ""}, + {key: "ai@o4-mini", name: "ChatGpt聊天", titleName: "ChatGpt-全能神!综合能力最强!", logo: "openAi.png", value: ""}, + // + // {key: "ai@claude-3-7-sonnet", name: "Claude聊天", titleName: "Claude3.7 代码逻辑地表最强!", logo: "claudeAi.png", value: ""}, + // {key: "ai@claude-3.7-sonnet-thinking", name: "Claude思索", titleName: "Claude3.7 思索模式,强中强!", logo: "claudeAi.png", value: ""}, + // + // {key: "ai@grok-3", name: "Grok聊天", titleName: "Grok3 为3.0王的诞生献上礼炮", logo: "grokAi.png", value: ""}, + // + // {key: "ai@Qwen/QwQ-32B-Preview", name: "QWen聊天", titleName: "国产阿里千问通义", logo: "qwenAi.png", value: ""}, - {key: "ai@claude-3-7-sonnet", name: "Claude聊天", titleName: "Claude3.7 代码逻辑地表最强!", logo: "claudeAi.png", value: ""}, - {key: "ai@claude-3.7-sonnet-thinking", name: "Claude思索", titleName: "Claude3.7 思索模式,强中强!", logo: "claudeAi.png", value: ""}, - - {key: "ai@grok-3", name: "Grok聊天", titleName: "Grok3 为3.0王的诞生献上礼炮", logo: "grokAi.png", value: ""}, - - {key: "ai@Qwen/QwQ-32B-Preview", name: "QWen聊天", titleName: "国产阿里千问通义", logo: "qwenAi.png", value: ""}, - - {key: "ai@DeepSeek-V3", name: "DeepSeek聊天", titleName: "满血DeepSeek-聊天模式,开源模型第一", logo: "deepSeekAi.png", value: ""}, + // {key: "ai@DeepSeek-V3", name: "DeepSeek聊天", titleName: "满血DeepSeek-聊天模式,开源模型第一", logo: "deepSeekAi.png", value: ""}, {key: "ai@DeepSeek-R1", name: "DeepSeek思索", titleName: "满血DeepSeek-思索模式", logo: "deepSeekAi.png", value: ""} ]); //AI聊天临时存储