diff --git a/src/AntSK.Domain/AntSK.Domain.xml b/src/AntSK.Domain/AntSK.Domain.xml index 362ee1c..97f872c 100644 --- a/src/AntSK.Domain/AntSK.Domain.xml +++ b/src/AntSK.Domain/AntSK.Domain.xml @@ -199,7 +199,7 @@ - + 发送消息 diff --git a/src/AntSK.Domain/Domain/Interface/IChatService.cs b/src/AntSK.Domain/Domain/Interface/IChatService.cs index f7be889..1793a91 100644 --- a/src/AntSK.Domain/Domain/Interface/IChatService.cs +++ b/src/AntSK.Domain/Domain/Interface/IChatService.cs @@ -14,10 +14,10 @@ namespace AntSK.Domain.Domain.Interface { public interface IChatService { - IAsyncEnumerable SendChatByAppAsync(Apps app, string questions, ChatHistory history); + IAsyncEnumerable SendChatByAppAsync(Apps app, ChatHistory history); IAsyncEnumerable SendKmsByAppAsync(Apps app, string questions, ChatHistory history, string filePath, List relevantSources = null); Task SendImgByAppAsync(Apps app, string questions); - Task GetChatHistory(List MessageList); + Task GetChatHistory(List MessageList, ChatHistory history); } } \ No newline at end of file diff --git a/src/AntSK.Domain/Domain/Service/ChatService.cs b/src/AntSK.Domain/Domain/Service/ChatService.cs index 7771eb1..7506c6d 100644 --- a/src/AntSK.Domain/Domain/Service/ChatService.cs +++ b/src/AntSK.Domain/Domain/Service/ChatService.cs @@ -10,6 +10,7 @@ using AntSK.LLM.StableDiffusion; using Markdig; using Microsoft.KernelMemory; using Microsoft.SemanticKernel; +using Microsoft.SemanticKernel.ChatCompletion; using Microsoft.SemanticKernel.Connectors.OpenAI; using System.Diagnostics; using System.Drawing; @@ -35,45 +36,54 @@ namespace AntSK.Domain.Domain.Service /// /// /// - public async IAsyncEnumerable SendChatByAppAsync(Apps app, string questions, ChatHistory history) + public async IAsyncEnumerable SendChatByAppAsync(Apps app, ChatHistory history) { - - if (string.IsNullOrEmpty(app.Prompt) || !app.Prompt.Contains("{{$input}}")) - { - //如果模板为空,给默认提示词 - app.Prompt = app.Prompt.ConvertToString() + "{{$input}}"; - } - KernelArguments args = new KernelArguments(); - if (history.Count > 10) - { - app.Prompt = @"${{ConversationSummaryPlugin.SummarizeConversation $history}}" + app.Prompt; - args = new() { - { "history", string.Join("\n", history.Select(x => x.Role + ": " + x.Content)) }, - { "input", questions } - }; - } - else - { - args = new() - { - { "input", $"{string.Join("\n", history.Select(x => x.Role + ": " + x.Content))}{Environment.NewLine} user:{questions}" } - }; - } - var _kernel = _kernelService.GetKernelByApp(app); + var chat = _kernel.GetRequiredService(); var temperature = app.Temperature / 100;//存的是0~100需要缩小 OpenAIPromptExecutionSettings settings = new() { Temperature = temperature }; + List completionList = new List(); if (!string.IsNullOrEmpty(app.ApiFunctionList) || !string.IsNullOrEmpty(app.NativeFunctionList))//这里还需要加上本地插件的 { _kernelService.ImportFunctionsByApp(app, _kernel); - settings.ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions; + settings.ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions; + while (true) + { + ChatMessageContent result = await chat.GetChatMessageContentAsync(history, settings, _kernel); + if (result.Content is not null) + { + string chunkCompletion = result.Content.ConvertToString(); + completionList.Add(chunkCompletion); + foreach (var content in completionList) + { + yield return content.ConvertToString(); + } + break; + } + + history.Add(result); + + IEnumerable functionCalls = FunctionCallContent.GetFunctionCalls(result); + if (!functionCalls.Any()) + { + break; + } + + foreach (var functionCall in functionCalls) + { + FunctionResultContent resultContent = await functionCall.InvokeAsync(_kernel); + + history.Add(resultContent.ToChatMessage()); + } + } } - var func = _kernel.CreateFunctionFromPrompt(app.Prompt, settings); - var chatResult = _kernel.InvokeStreamingAsync(function: func, - arguments: args); - await foreach (var content in chatResult) + else { - yield return content; + var chatResult = chat.GetStreamingChatMessageContentsAsync(history, settings, _kernel); + await foreach (var content in chatResult) + { + yield return content.ConvertToString(); + } } } @@ -318,9 +328,8 @@ namespace AntSK.Domain.Domain.Service } } - public async Task GetChatHistory(List MessageList) + public async Task GetChatHistory(List MessageList, ChatHistory history) { - ChatHistory history = new ChatHistory(); if (MessageList.Count > 1) { diff --git a/src/AntSK.Domain/Domain/Service/KernelService.cs b/src/AntSK.Domain/Domain/Service/KernelService.cs index 9130293..3b929c4 100644 --- a/src/AntSK.Domain/Domain/Service/KernelService.cs +++ b/src/AntSK.Domain/Domain/Service/KernelService.cs @@ -20,6 +20,8 @@ using System.Reflection; using DocumentFormat.OpenXml.Drawing; using Microsoft.KernelMemory; using OpenCvSharp.ML; +using LLamaSharp.SemanticKernel.ChatCompletion; +using Microsoft.SemanticKernel.ChatCompletion; namespace AntSK.Domain.Domain.Service { @@ -105,11 +107,13 @@ namespace AntSK.Domain.Domain.Service var (weights, parameters) = LLamaConfig.GetLLamaConfig(chatModel.ModelName); var ex = new StatelessExecutor(weights, parameters); builder.Services.AddKeyedSingleton("local-llama", new LLamaSharpTextCompletion(ex)); + builder.Services.AddKeyedSingleton("local-llama-chat", new LLamaSharpChatCompletion(ex)); break; case Model.Enum.AIType.SparkDesk: var options = new SparkDeskOptions { AppId = chatModel.EndPoint, ApiSecret = chatModel.ModelKey, ApiKey = chatModel.ModelName, ModelVersion = Sdcb.SparkDesk.ModelVersion.V3_5 }; builder.Services.AddKeyedSingleton("spark-desk", new SparkDeskTextCompletion(options, chatModel.Id)); + builder.Services.AddKeyedSingleton("spark-desk-chat", new SparkDeskChatCompletion(options, chatModel.Id)); break; case Model.Enum.AIType.DashScope: @@ -118,6 +122,7 @@ namespace AntSK.Domain.Domain.Service case Model.Enum.AIType.Mock: builder.Services.AddKeyedSingleton("mock", new MockTextCompletion()); + builder.Services.AddKeyedSingleton("mock-chat", new MockChatCompletion()); break; case Model.Enum.AIType.LLamaFactory: builder.AddOpenAIChatCompletion( diff --git a/src/AntSK/Pages/AppPage/AddApp.razor b/src/AntSK/Pages/AppPage/AddApp.razor index 1195a8b..5b586c3 100644 --- a/src/AntSK/Pages/AppPage/AddApp.razor +++ b/src/AntSK/Pages/AppPage/AddApp.razor @@ -53,7 +53,7 @@ -