using Volo.Abp.Domain.Services; using Yi.Framework.SqlSugarCore.Abstractions; using Yi.Framework.Stock.Domain.Entities; using Yi.Framework.Stock.Domain.Managers.SemanticKernel; using Yi.Framework.Stock.Domain.Managers.SemanticKernel.Plugins; using System.Text; namespace Yi.Framework.Stock.Domain.Managers; public class NewsManager:DomainService { private SemanticKernelClient _skClient; private ISqlSugarRepository _newsRepository; public NewsManager(SemanticKernelClient skClient,ISqlSugarRepository newsRepository) { _skClient = skClient; _newsRepository = newsRepository; } /// /// 获取最近的新闻 /// /// 获取数量 /// 最近的新闻列表 public async Task> GetRecentNewsAsync(int count = 10) { return await _newsRepository._DbQueryable .OrderByDescending(n => n.CreationTime) .Take(count) .Select(n => new StockNewsAggregateRoot { Title = n.Title, Summary = n.Summary, Source = n.Source, CreationTime = n.CreationTime }) .ToListAsync(); } /// /// 生成一个新闻 /// /// public async Task GenerateNewsAsync() { // 获取最近10条新闻 var recentNews = await GetRecentNewsAsync(10); // 构建新闻背景上下文 var newsContext = new StringBuilder(); if (recentNews.Any()) { newsContext.AppendLine("以下是最近的新闻简介:"); foreach (var news in recentNews) { newsContext.AppendLine($"- {news.CreationTime:yyyy-MM-dd} 来源:{news.Source}"); newsContext.AppendLine($" 标题:{news.Title}"); newsContext.AppendLine($" 简介:{news.Summary}"); newsContext.AppendLine(); } } else { newsContext.AppendLine("目前没有最近的新闻记录。"); } var question = $$""" 基于以下最近的新闻背景,生成一条新的股市相关新闻。 {{newsContext}} 请生成一条有关联性的新闻,包含以下要素: 1. 新闻标题:吸引人且与股市、金融或经济相关 2. 新闻内容:详细且符合逻辑的报道,篇幅适中 3. 新闻简介:简明扼要的总结 4. 新闻来源:提供一个可信的媒体或机构名称 注意: - 新闻内容应当与前面的新闻有一定关联性 - 内容应当暗示可能对股市产生某种影响(积极或消极) - 行业焦点可以包括娱乐、科技、能源、金融等多个领域 - 只需生成一次即可 """; await _skClient.ChatCompletionAsync(question, ("NewsPlugins","save_news")); } public async Task SaveNewsAsync(NewsModel news) { var newsEntity = new StockNewsAggregateRoot( title: news.Title, content: news.Content, source: news.Source ) { Summary = news.Summary, CreationTime = DateTime.Now, IsDeleted = false, OrderNum = 0 }; await _newsRepository.InsertAsync(newsEntity); } }