feat: 提交
This commit is contained in:
@@ -1,26 +1,19 @@
|
||||
using System.Text;
|
||||
using Azure;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.SemanticKernel.ChatCompletion;
|
||||
using Microsoft.SemanticKernel.Connectors.AzureOpenAI;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Serialization;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Volo.Abp.Application.Services;
|
||||
using Yi.Framework.AiHub.Application.Contracts.Dtos;
|
||||
using Yi.Framework.SemanticKernel;
|
||||
|
||||
namespace Yi.Framework.AiHub.Application.Services;
|
||||
|
||||
public class AiService : ApplicationService
|
||||
{
|
||||
private readonly SemanticKernelClient _skClient;
|
||||
// private readonly SemanticKernelClient _skClient;
|
||||
private IHttpContextAccessor httpContextAccessor;
|
||||
|
||||
public AiService(SemanticKernelClient skClient, IHttpContextAccessor httpContextAccessor)
|
||||
{
|
||||
_skClient = skClient;
|
||||
this.httpContextAccessor = httpContextAccessor;
|
||||
}
|
||||
// public AiService(SemanticKernelClient skClient, IHttpContextAccessor httpContextAccessor)
|
||||
// {
|
||||
// _skClient = skClient;
|
||||
// this.httpContextAccessor = httpContextAccessor;
|
||||
// }
|
||||
|
||||
/// <summary>
|
||||
/// 获取模型列表
|
||||
@@ -62,59 +55,59 @@ public class AiService : ApplicationService
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 发送消息
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <param name="cancelToken"></param>
|
||||
public async Task PostSendAsync(SendMessageInput input,CancellationToken cancelToken)
|
||||
{
|
||||
var httpContext = this.httpContextAccessor.HttpContext;
|
||||
var response = httpContext.Response;
|
||||
// 设置响应头,声明是 SSE 流
|
||||
response.ContentType = "text/event-stream";
|
||||
response.Headers.Append("Cache-Control", "no-cache");
|
||||
response.Headers.Append("Connection", "keep-alive");
|
||||
|
||||
|
||||
var chatCompletionService = this._skClient.Kernel.GetRequiredService<IChatCompletionService>(input.Model);
|
||||
var history = new ChatHistory();
|
||||
var openSettings = new AzureOpenAIPromptExecutionSettings()
|
||||
{
|
||||
MaxTokens = 3000
|
||||
};
|
||||
foreach (var aiChatContextDto in input.Messages)
|
||||
{
|
||||
if (aiChatContextDto.Role == "ai")
|
||||
{
|
||||
history.AddAssistantMessage(aiChatContextDto.Content);
|
||||
}
|
||||
else if (aiChatContextDto.Role == "user")
|
||||
{
|
||||
history.AddUserMessage(aiChatContextDto.Content);
|
||||
}
|
||||
}
|
||||
|
||||
var results = chatCompletionService.GetStreamingChatMessageContentsAsync(
|
||||
chatHistory: history,
|
||||
executionSettings: openSettings,
|
||||
kernel: _skClient.Kernel,
|
||||
cancelToken);
|
||||
|
||||
|
||||
await using var writer = new StreamWriter(response.Body, Encoding.UTF8, leaveOpen: true);
|
||||
await foreach (var result in results)
|
||||
{
|
||||
var modle = GetMessage(input.Model, result.Content);
|
||||
var message = JsonConvert.SerializeObject(modle, new JsonSerializerSettings
|
||||
{
|
||||
ContractResolver = new CamelCasePropertyNamesContractResolver()
|
||||
});
|
||||
|
||||
await writer.WriteLineAsync($"data: {message}\n");
|
||||
await writer.FlushAsync(cancelToken); // 确保立即推送数据
|
||||
}
|
||||
}
|
||||
// /// <summary>
|
||||
// /// 发送消息
|
||||
// /// </summary>
|
||||
// /// <param name="input"></param>
|
||||
// /// <param name="cancelToken"></param>
|
||||
// public async Task PostSendAsync(SendMessageInput input,CancellationToken cancelToken)
|
||||
// {
|
||||
// var httpContext = this.httpContextAccessor.HttpContext;
|
||||
// var response = httpContext.Response;
|
||||
// // 设置响应头,声明是 SSE 流
|
||||
// response.ContentType = "text/event-stream";
|
||||
// response.Headers.Append("Cache-Control", "no-cache");
|
||||
// response.Headers.Append("Connection", "keep-alive");
|
||||
//
|
||||
//
|
||||
// var chatCompletionService = this._skClient.Kernel.GetRequiredService<IChatCompletionService>(input.Model);
|
||||
// var history = new ChatHistory();
|
||||
// var openSettings = new AzureOpenAIPromptExecutionSettings()
|
||||
// {
|
||||
// MaxTokens = 3000
|
||||
// };
|
||||
// foreach (var aiChatContextDto in input.Messages)
|
||||
// {
|
||||
// if (aiChatContextDto.Role == "ai")
|
||||
// {
|
||||
// history.AddAssistantMessage(aiChatContextDto.Content);
|
||||
// }
|
||||
// else if (aiChatContextDto.Role == "user")
|
||||
// {
|
||||
// history.AddUserMessage(aiChatContextDto.Content);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// var results = chatCompletionService.GetStreamingChatMessageContentsAsync(
|
||||
// chatHistory: history,
|
||||
// executionSettings: openSettings,
|
||||
// kernel: _skClient.Kernel,
|
||||
// cancelToken);
|
||||
//
|
||||
//
|
||||
// await using var writer = new StreamWriter(response.Body, Encoding.UTF8, leaveOpen: true);
|
||||
// await foreach (var result in results)
|
||||
// {
|
||||
// var modle = GetMessage(input.Model, result.Content);
|
||||
// var message = JsonConvert.SerializeObject(modle, new JsonSerializerSettings
|
||||
// {
|
||||
// ContractResolver = new CamelCasePropertyNamesContractResolver()
|
||||
// });
|
||||
//
|
||||
// await writer.WriteLineAsync($"data: {message}\n");
|
||||
// await writer.FlushAsync(cancelToken); // 确保立即推送数据
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
private SendMessageOutputDto GetMessage(string modelId, string content)
|
||||
|
||||
Reference in New Issue
Block a user