Files
Yi.Admin/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/Managers/AiManager.cs

58 lines
1.8 KiB
C#
Raw Normal View History

2025-06-17 23:25:55 +08:00
using Microsoft.SemanticKernel;
2025-03-21 18:24:59 +08:00
using Microsoft.SemanticKernel.ChatCompletion;
2025-06-19 14:17:24 +08:00
using Microsoft.SemanticKernel.Connectors.AzureOpenAI;
2025-03-21 18:24:59 +08:00
using Microsoft.SemanticKernel.Connectors.OpenAI;
2024-07-19 18:17:36 +08:00
using Volo.Abp.DependencyInjection;
2024-07-21 13:37:56 +08:00
using Yi.Framework.ChatHub.Domain.Shared.Dtos;
2025-06-17 23:25:55 +08:00
2024-07-19 18:17:36 +08:00
namespace Yi.Framework.ChatHub.Domain.Managers
{
2024-07-21 13:37:56 +08:00
public class AiManager : ISingletonDependency
2024-07-19 18:17:36 +08:00
{
2025-06-20 18:06:33 +08:00
private readonly Kernel _client;
2025-06-17 23:25:55 +08:00
2025-06-20 18:06:33 +08:00
public AiManager(Kernel client)
2024-07-19 18:17:36 +08:00
{
2025-06-17 23:25:55 +08:00
_client = client;
2024-07-19 18:17:36 +08:00
}
2025-03-21 18:24:59 +08:00
public async IAsyncEnumerable<string?> ChatAsStreamAsync(string model, List<AiChatContextDto> aiChatContextDtos)
2024-07-19 18:17:36 +08:00
{
2025-03-21 18:24:59 +08:00
if (aiChatContextDtos.Count == 0)
{
yield return null;
}
2025-06-17 23:25:55 +08:00
2025-06-19 14:17:24 +08:00
var openSettings = new AzureOpenAIPromptExecutionSettings()
2025-03-21 18:24:59 +08:00
{
2025-06-19 21:24:13 +08:00
MaxTokens = 3000
2025-03-21 18:24:59 +08:00
};
2025-06-20 18:06:33 +08:00
var chatCompletionService = this._client.GetRequiredService<IChatCompletionService>(model);
2025-03-21 18:24:59 +08:00
2025-06-17 23:25:55 +08:00
var history = new ChatHistory();
2025-03-21 18:24:59 +08:00
foreach (var aiChatContextDto in aiChatContextDtos)
{
2025-06-17 23:25:55 +08:00
if (aiChatContextDto.AnswererType == AnswererTypeEnum.Ai)
2025-03-21 18:24:59 +08:00
{
2025-06-17 23:25:55 +08:00
history.AddAssistantMessage(aiChatContextDto.Message);
2025-03-21 18:24:59 +08:00
}
2025-06-17 23:25:55 +08:00
else if (aiChatContextDto.AnswererType == AnswererTypeEnum.User)
2025-03-21 18:24:59 +08:00
{
history.AddUserMessage(aiChatContextDto.Message);
}
}
2025-06-17 23:25:55 +08:00
2025-03-21 18:24:59 +08:00
var results = chatCompletionService.GetStreamingChatMessageContentsAsync(
chatHistory: history,
executionSettings: openSettings,
2025-06-20 18:06:33 +08:00
kernel: _client);
2025-06-17 23:25:55 +08:00
await foreach (var result in results)
{
2025-06-19 19:13:43 +08:00
yield return result?.Content;
2025-04-12 23:18:06 +08:00
}
2024-07-19 18:17:36 +08:00
}
}
2025-06-17 23:25:55 +08:00
}