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 5444ee05..bc470ac5 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 @@ -1,17 +1,23 @@ using System.Collections.Concurrent; +using System.Reflection; using System.Text; +using System.Text.Encodings.Web; +using Dm.util; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using ModelContextProtocol; +using ModelContextProtocol.Server; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using OpenAI.Chat; using Volo.Abp.Application.Services; using Volo.Abp.Users; using Yi.Framework.AiHub.Application.Contracts.Dtos; +using Yi.Framework.AiHub.Domain; using Yi.Framework.AiHub.Domain.Entities; using Yi.Framework.AiHub.Domain.Entities.Model; using Yi.Framework.AiHub.Domain.Extensions; @@ -175,4 +181,26 @@ public class AiChatService : ApplicationService await _aiGateWayManager.CompleteChatStreamForStatisticsAsync(_httpContextAccessor.HttpContext, input, CurrentUser.Id, null, null, cancellationToken); } + + [HttpPost("ai-chat/tool")] + public string GetTool() + { + var toolClasses = typeof(YiFrameworkAiHubDomainModule).Assembly.GetTypes() + .Where(x => x.GetCustomAttribute() is not null) + .ToList(); + + List mcpTools = new List(); + foreach (var toolClass in toolClasses) + { + var instance = LazyServiceProvider.GetRequiredService(toolClass); + var toolMethods = toolClass.GetMethods() + .Where(y => y.GetCustomAttribute() is not null).ToList(); + foreach (var toolMethod in toolMethods) + { + mcpTools.add(McpServerTool.Create(toolMethod, instance)); + } + } + var json = System.Text.Json.JsonSerializer.Serialize(mcpTools.Select(x=>x.ProtocolTool).ToList(),McpJsonUtilities.DefaultOptions); + return json; + } } \ No newline at end of file diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/YiFrameworkAiHubApplicationModule.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/YiFrameworkAiHubApplicationModule.cs index 7e71df01..fc85a26b 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/YiFrameworkAiHubApplicationModule.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/YiFrameworkAiHubApplicationModule.cs @@ -1,3 +1,7 @@ +using System.ComponentModel; +using System.Text.Json; +using ModelContextProtocol; +using ModelContextProtocol.Server; using Yi.Framework.AiHub.Application.Contracts; using Yi.Framework.AiHub.Domain; using Yi.Framework.Ddd.Application; diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Mcp/DeepThinkTool.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Mcp/DeepThinkTool.cs new file mode 100644 index 00000000..dd51d44e --- /dev/null +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Mcp/DeepThinkTool.cs @@ -0,0 +1,15 @@ +using System.ComponentModel; +using ModelContextProtocol.Server; +using Volo.Abp.DependencyInjection; + +namespace Yi.Framework.AiHub.Domain.Mcp; + +[McpServerToolType] +public class DeepThinkTool:ISingletonDependency +{ + [McpServerTool, Description("进行深度思考")] + public void DeepThink() + { + + } +} \ No newline at end of file diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Mcp/OnlineSearchTool.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Mcp/OnlineSearchTool.cs new file mode 100644 index 00000000..0d32645c --- /dev/null +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Mcp/OnlineSearchTool.cs @@ -0,0 +1,15 @@ +using System.ComponentModel; +using ModelContextProtocol.Server; +using Volo.Abp.DependencyInjection; + +namespace Yi.Framework.AiHub.Domain.Mcp; + +[McpServerToolType] +public class OnlineSearchTool:ISingletonDependency +{ + [McpServerTool, Description("进行在线搜索")] + public void OnlineSearch() + { + + } +} \ No newline at end of file diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Yi.Framework.AiHub.Domain.csproj b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Yi.Framework.AiHub.Domain.csproj index cd3d77ac..1359ca3a 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Yi.Framework.AiHub.Domain.csproj +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Yi.Framework.AiHub.Domain.csproj @@ -3,6 +3,7 @@ +