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聊天临时存储