using System.ComponentModel; using System.Text.Json; using System.Text.Json.Serialization; using Microsoft.Extensions.Logging; using Volo.Abp.DependencyInjection; using Yi.Framework.AiHub.Domain.Shared.Attributes; namespace Yi.Framework.AiHub.Domain.Mcp; [YiAgentTool] public class YxaiKnowledgeTool : ISingletonDependency { private readonly IHttpClientFactory _httpClientFactory; private readonly ILogger _logger; private const string DirectoryUrl = "https://ccnetcore.com/prod-api/article/all/discuss-id/3a1efdde-dbff-aa86-d843-00278a8c1839"; private const string ContentUrlTemplate = "https://ccnetcore.com/prod-api/article/{0}"; public YxaiKnowledgeTool( IHttpClientFactory httpClientFactory, ILogger logger) { _httpClientFactory = httpClientFactory; _logger = logger; } [YiAgentTool("意心Ai平台知识库"), DisplayName("YxaiKnowledge"), Description("获取意心AI相关内容的知识库目录及内容列表")] public async Task> YxaiKnowledge() { try { var client = _httpClientFactory.CreateClient(); // 1. 先获取目录列表 var directoryResponse = await client.GetAsync(DirectoryUrl); if (!directoryResponse.IsSuccessStatusCode) { _logger.LogError("意心知识库目录接口调用失败: {StatusCode}", directoryResponse.StatusCode); return new List(); } var directoryJson = await directoryResponse.Content.ReadAsStringAsync(); var directories = JsonSerializer.Deserialize(directoryJson, YxaiKnowledgeJsonContext.Default.ListYxaiKnowledgeDirectoryItem); if (directories == null || directories.Count == 0) { return new List(); } // 2. 循环调用内容接口获取每个目录的内容 var result = new List(); foreach (var directory in directories) { try { var contentUrl = string.Format(ContentUrlTemplate, directory.Id); var contentResponse = await client.GetAsync(contentUrl); if (contentResponse.IsSuccessStatusCode) { var contentJson = await contentResponse.Content.ReadAsStringAsync(); var contentResult = JsonSerializer.Deserialize(contentJson, YxaiKnowledgeJsonContext.Default.YxaiKnowledgeContentResponse); result.Add(new YxaiKnowledgeItem { Name = directory.Name, Content = contentResult?.Content ?? "" }); } else { _logger.LogWarning("获取知识库内容失败: {StatusCode}, DirectoryId: {DirectoryId}", contentResponse.StatusCode, directory.Id); result.Add(new YxaiKnowledgeItem { Name = directory.Name, Content = $"获取内容失败: {contentResponse.StatusCode}" }); } } catch (Exception ex) { _logger.LogError(ex, "获取知识库内容发生异常, DirectoryId: {DirectoryId}", directory.Id); result.Add(new YxaiKnowledgeItem { Name = directory.Name, Content = "获取内容发生异常" }); } } return result; } catch (Exception ex) { _logger.LogError(ex, "获取意心知识库发生异常"); return new List(); } } } #region DTO public class YxaiKnowledgeDirectoryItem { [JsonPropertyName("id")] public string Id { get; set; } = ""; [JsonPropertyName("name")] public string Name { get; set; } = ""; } public class YxaiKnowledgeContentResponse { [JsonPropertyName("content")] public string? Content { get; set; } } /// /// 合并后的知识库项,包含目录和内容 /// public class YxaiKnowledgeItem { /// /// 目录名称 /// public string Name { get; set; } = ""; /// /// 知识库内容 /// public string Content { get; set; } = ""; } #endregion #region JSON 序列化上下文 [JsonSerializable(typeof(List))] [JsonSerializable(typeof(YxaiKnowledgeContentResponse))] internal partial class YxaiKnowledgeJsonContext : JsonSerializerContext { } #endregion