using Microsoft.Extensions.Options; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.ChatCompletion; using Microsoft.SemanticKernel.Connectors.OpenAI; using Volo.Abp.DependencyInjection; namespace Yi.Framework.Stock.Domain.Managers; public class SemanticKernelClient:ITransientDependency { private Kernel Kernel { get; } private readonly IKernelBuilder _kernelBuilder; private SemanticKernelOptions Options { get; } public SemanticKernelClient(IOptions semanticKernelOption) { Options = semanticKernelOption.Value; _kernelBuilder = Kernel.CreateBuilder(); RegisterChatCompletion(); Kernel = _kernelBuilder.Build(); RegisterDefautlPlugins(); } /// /// 注册 /// private void RegisterChatCompletion() { _kernelBuilder.AddOpenAIChatCompletion( modelId: Options.ModelId, apiKey: Options.ApiKey, httpClient: new HttpClient() { BaseAddress = new Uri(Options.Endpoint) }); } /// /// 插件注册 /// private void RegisterDefautlPlugins() { //动态导入插件 // this.Kernel.ImportPluginFromPromptDirectory(System.IO.Path.Combine("wwwroot", "plugin","stock"),"stock"); } /// /// 自定义插件 /// /// /// public void RegisterPlugins(string pluginName) { this.Kernel.Plugins.AddFromType(pluginName); } /// /// 执行插件 /// /// /// /// /// public async Task InovkerFunctionAsync(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 }); return result.GetValue(); } /// /// 聊天对话,调用方法 /// /// public async Task> ChatCompletionAsync(string question) { OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(), MaxTokens = Options.MaxTokens }; var chatCompletionService = this.Kernel.GetRequiredService(); var results =await chatCompletionService.GetChatMessageContentsAsync( question, executionSettings: openAIPromptExecutionSettings, kernel: Kernel); return results; } }