From bd3a9a5ce82ee0934915ca3a103033541412c791 Mon Sep 17 00:00:00 2001 From: chenchun Date: Tue, 23 Dec 2025 17:29:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ChatManager: - 引入 System.Text.Json,用于将 agent thread 序列化与反序列化(示例:thread.Serialize(...) -> JsonSerializer.Deserialize -> agent.DeserializeThread)。 - 增加示例:创建 OpenAIClient、初始化 agent、运行流式响应并处理更新。 - 小幅格式和空行调整。 - AiChatService: - 为 Agent 发送接口 PostAgentSendAsync 增加注释与路由标记 HttpPost("ai-chat/agent/send")。 注意:提交中出现了硬编码的 API Key,请尽快改为从配置或机密管理中读取以防泄露。 --- .../Services/Chat/AiChatService.cs | 3 +++ .../Managers/ChatManager.cs | 22 +++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Chat/AiChatService.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Chat/AiChatService.cs index 2024a568..e6695aad 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Chat/AiChatService.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Chat/AiChatService.cs @@ -148,6 +148,9 @@ public class AiChatService : ApplicationService // 使用 ChatManager } + /// + /// Agent 发送消息 + /// [HttpPost("ai-chat/agent/send")] public async Task PostAgentSendAsync() { diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/ChatManager.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/ChatManager.cs index ad89ec26..bb70d84d 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/ChatManager.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/ChatManager.cs @@ -1,5 +1,6 @@ using System.ClientModel; using System.Reflection; +using System.Text.Json; using Dm.util; using Microsoft.Agents.AI; using Microsoft.Extensions.AI; @@ -15,6 +16,7 @@ public class ChatManager : DomainService { private readonly AiGateWayManager _aiGateWayManager; private readonly ILoggerFactory _loggerFactory; + public ChatManager(AiGateWayManager aiGateWayManager, ILoggerFactory loggerFactory) { _aiGateWayManager = aiGateWayManager; @@ -26,15 +28,16 @@ public class ChatManager : DomainService //token可以用户传进来 // HttpClient.DefaultProxy = new WebProxy("127.0.0.1:8888"); var modelId = "gpt-5.2-chat"; - var client = new OpenAIClient(new ApiKeyCredential("xxx"), new OpenAIClientOptions - { - Endpoint = new Uri("https://yxai.chat/v1"), - }); + var client = new OpenAIClient(new ApiKeyCredential("xxx"), + new OpenAIClientOptions + { + Endpoint = new Uri("https://yxai.chat/v1"), + }); var agent = client.GetChatClient(modelId) .AsIChatClient() // Converts a native OpenAI SDK ChatClient into a Microsoft.Extensions.AI.IChatClient - .CreateAIAgent("你是一个专业的网页ai助手") ; + .CreateAIAgent("你是一个专业的网页ai助手"); + - var thread = agent.GetNewThread(); var tools = GetTools(); @@ -43,7 +46,7 @@ public class ChatManager : DomainService Tools = tools.Select(x => (AITool)x).ToList(), ToolMode = ChatToolMode.Auto }; - + await foreach (var update in agent.RunStreamingAsync("联网搜索一下,奥德赛第一中学学生会会长是谁", thread, new ChatClientAgentRunOptions(chatOptions))) { @@ -71,6 +74,11 @@ public class ChatManager : DomainService } } } + + + string serializedJson = thread.Serialize(JsonSerializerOptions.Web).GetRawText(); + JsonElement reloaded = JsonSerializer.Deserialize(serializedJson, JsonSerializerOptions.Web); + var newThread = agent.DeserializeThread(reloaded, JsonSerializerOptions.Web); }