Merge remote-tracking branch 'origin/abp' into abp

This commit is contained in:
橙子
2025-03-23 17:16:37 +08:00
13 changed files with 91 additions and 77 deletions

View File

@@ -0,0 +1,8 @@
namespace Yi.Framework.Core.Options;
public class SemanticKernelOptions
{
public List<string> ModelIds { get; set; }
public string Endpoint { get; set; }
public string ApiKey { get; set; }
}

View File

@@ -96,6 +96,7 @@ namespace Yi.Framework.Stock.Application.Services
.WhereIF(input.StartTime.HasValue, p => p.RecordTime >= input.StartTime.Value) .WhereIF(input.StartTime.HasValue, p => p.RecordTime >= input.StartTime.Value)
.WhereIF(input.EndTime.HasValue, p => p.RecordTime <= input.EndTime.Value) .WhereIF(input.EndTime.HasValue, p => p.RecordTime <= input.EndTime.Value)
.WhereIF(input.PeriodType.HasValue, p => p.PeriodType == input.PeriodType.Value) .WhereIF(input.PeriodType.HasValue, p => p.PeriodType == input.PeriodType.Value)
.Where(x=>x.RecordTime<=DateTime.Now)
.OrderByIF(!string.IsNullOrEmpty(input.Sorting),input.Sorting) .OrderByIF(!string.IsNullOrEmpty(input.Sorting),input.Sorting)
.OrderByIF(string.IsNullOrEmpty(input.Sorting),p=>p.RecordTime); .OrderByIF(string.IsNullOrEmpty(input.Sorting),p=>p.RecordTime);

View File

@@ -2,7 +2,7 @@ namespace Yi.Framework.Stock.Domain.Managers.SemanticKernel
{ {
public class SemanticKernelOptions public class SemanticKernelOptions
{ {
public string ModelId { get; set; } public List<string> ModelIds { get; set; }
public string Endpoint { get; set; } public string Endpoint { get; set; }
public string ApiKey { get; set; } public string ApiKey { get; set; }
} }

View File

@@ -211,6 +211,7 @@ namespace Yi.Framework.Stock.Domain.Managers
// 获取最新的价格记录 // 获取最新的价格记录
var latestPriceRecord = await _stockPriceRecordRepository._DbQueryable var latestPriceRecord = await _stockPriceRecordRepository._DbQueryable
.Where(p => p.StockId == stockId) .Where(p => p.StockId == stockId)
.Where(x=>x.RecordTime<=DateTime.Now)
.OrderByDescending(p => p.RecordTime) .OrderByDescending(p => p.RecordTime)
.FirstAsync(); .FirstAsync();

View File

@@ -32,9 +32,10 @@ namespace Yi.Framework.Stock.Domain
#pragma warning disable SKEXP0010 #pragma warning disable SKEXP0010
// 从配置中获取值 // 从配置中获取值
var options = semanticKernelSection.Get<SemanticKernelOptions>(); var options = semanticKernelSection.Get<SemanticKernelOptions>();
//股市优先使用第一个ai模型
services.AddKernel() services.AddKernel()
.AddOpenAIChatCompletion( .AddOpenAIChatCompletion(
modelId: options.ModelId, modelId: options.ModelIds.FirstOrDefault(),
endpoint: new Uri(options.Endpoint), endpoint: new Uri(options.Endpoint),
apiKey: options.ApiKey); apiKey: options.ApiKey);
#pragma warning restore SKEXP0010 #pragma warning restore SKEXP0010

View File

@@ -1,6 +1,9 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Net; using System.Net;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
// using OpenAI; // using OpenAI;
// using OpenAI.Managers; // using OpenAI.Managers;
// using OpenAI.ObjectModels; // using OpenAI.ObjectModels;
@@ -14,61 +17,46 @@ namespace Yi.Framework.ChatHub.Domain.Managers
{ {
public class AiManager : ISingletonDependency public class AiManager : ISingletonDependency
{ {
public AiManager(IOptions<AiOptions> options) private readonly Kernel _kernel;
public AiManager(Kernel kernel)
{ {
// this.OpenAIService = new OpenAIService(new OpenAiOptions() _kernel = kernel;
// {
// ApiKey = options.Value.ApiKey,
// BaseDomain = options.Value.BaseDomain
// });
} }
// private OpenAIService OpenAIService { get; }
public async IAsyncEnumerable<string> ChatAsStreamAsync(string model, List<AiChatContextDto> aiChatContextDtos) public async IAsyncEnumerable<string?> ChatAsStreamAsync(string model, List<AiChatContextDto> aiChatContextDtos)
{ {
throw new NotImplementedException("准备sk重构"); if (aiChatContextDtos.Count == 0)
yield break; {
// if (aiChatContextDtos.Count == 0) yield return null;
// { }
// yield return null; var openSettings = new OpenAIPromptExecutionSettings()
// } {
// MaxTokens =1000
// List<ChatMessage> messages = aiChatContextDtos.Select(x => };
// {
// if (x.AnswererType == AnswererTypeEnum.Ai) var chatCompletionService = this._kernel.GetRequiredService<IChatCompletionService>(model);
// {
// return ChatMessage.FromSystem(x.Message); var history =new ChatHistory();
// } foreach (var aiChatContextDto in aiChatContextDtos)
// else {
// { if (aiChatContextDto.AnswererType==AnswererTypeEnum.Ai)
// return ChatMessage.FromUser(x.Message); {
// } history.AddSystemMessage(aiChatContextDto.Message);
// }).ToList(); }
// var completionResult = OpenAIService.ChatCompletion.CreateCompletionAsStream(new ChatCompletionCreateRequest else if(aiChatContextDto.AnswererType==AnswererTypeEnum.User)
// { {
// Messages = messages, history.AddUserMessage(aiChatContextDto.Message);
// Model =model }
// }); }
//
// HttpStatusCode? error = null; var results = chatCompletionService.GetStreamingChatMessageContentsAsync(
// await foreach (var result in completionResult) chatHistory: history,
// { executionSettings: openSettings,
// if (result.Successful) kernel: _kernel);
// { await foreach (var result in results)
// yield return result.Choices.FirstOrDefault()?.Message.Content ?? null; {
// } yield return result.Content;
// else }
// {
// error = result.HttpStatusCode;
// break;
// }
//
// }
// if (error == HttpStatusCode.PaymentRequired)
// {
// yield return "余额不足,请联系站长充值";
//
// }
} }
} }
} }

View File

@@ -8,7 +8,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.AspNetCore.SignalR" Version="$(AbpVersion)" /> <PackageReference Include="Volo.Abp.AspNetCore.SignalR" Version="$(AbpVersion)" />
<PackageReference Include="Microsoft.SemanticKernel" Version="1.40.0" />
<PackageReference Include="Volo.Abp.Ddd.Domain" Version="$(AbpVersion)" /> <PackageReference Include="Volo.Abp.Ddd.Domain" Version="$(AbpVersion)" />
<PackageReference Include="Volo.Abp.Caching" Version="$(AbpVersion)" /> <PackageReference Include="Volo.Abp.Caching" Version="$(AbpVersion)" />
<ProjectReference Include="..\..\..\framework\Yi.Framework.Caching.FreeRedis\Yi.Framework.Caching.FreeRedis.csproj" /> <ProjectReference Include="..\..\..\framework\Yi.Framework.Caching.FreeRedis\Yi.Framework.Caching.FreeRedis.csproj" />

View File

@@ -1,6 +1,10 @@
using Volo.Abp.Domain; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
using Volo.Abp.Domain;
using Yi.Framework.Caching.FreeRedis; using Yi.Framework.Caching.FreeRedis;
using Yi.Framework.ChatHub.Domain.Shared; using Yi.Framework.ChatHub.Domain.Shared;
using Yi.Framework.Core.Options;
namespace Yi.Framework.ChatHub.Domain namespace Yi.Framework.ChatHub.Domain
@@ -13,9 +17,27 @@ namespace Yi.Framework.ChatHub.Domain
)] )]
public class YiFrameworkChatHubDomainModule : AbpModule public class YiFrameworkChatHubDomainModule : AbpModule
{ {
public override async Task OnPostApplicationInitializationAsync(ApplicationInitializationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var configuration = context.Services.GetConfiguration();
var services = context.Services;
// 配置绑定
var semanticKernelSection = configuration.GetSection("SemanticKernel");
services.Configure<SemanticKernelOptions>(configuration.GetSection("SemanticKernel"));
#pragma warning disable SKEXP0010
// 从配置中获取值
var options = semanticKernelSection.Get<SemanticKernelOptions>();
foreach (var optionsModelId in options.ModelIds)
{
services.AddKernel()
.AddOpenAIChatCompletion(
serviceId: optionsModelId,
modelId: optionsModelId,
endpoint: new Uri(options.Endpoint),
apiKey: options.ApiKey);
}
#pragma warning restore SKEXP0010
} }
} }
} }

View File

@@ -103,18 +103,10 @@
//开启定时数据库备份 //开启定时数据库备份
"EnableDataBaseBackup": false "EnableDataBaseBackup": false
}, },
//OpenAi
"AiOptions": {
"ApiKey": "",
"BaseDomain": ""
},
//语义内核 //语义内核
"SemanticKernel": { "SemanticKernel": {
"ModelId": "gpt-4o", "ModelIds": ["gpt-4o"],
"Endpoint": "https://xxx.com/v1", "Endpoint": "https://xxx.com/v1",
"ApiKey": "sk-xxxxxx" "ApiKey": "sk-xxxxxx"
} }

View File

@@ -22,6 +22,7 @@
- 一天24小时下来整体价格变化的趋势应该比较连贯可以部分小时的价格大幅度变化 - 一天24小时下来整体价格变化的趋势应该比较连贯可以部分小时的价格大幅度变化
- 变化幅度可以大一些,为了更吸引用户 - 变化幅度可以大一些,为了更吸引用户
- 可能下跌,可能上涨 - 可能下跌,可能上涨
- 最低价值为1,最高价为100 - 最低价格为5,最高价为100如果小于等于5就固定一直是5如果大于等于100要即时的修正扣减
- 可能出现暴跌或者暴涨一天直接减少或增加百分之50
请确保数据格式正确,以便系统能够自动处理。 请确保数据格式正确,以便系统能够自动处理。

View File

@@ -1,6 +1,4 @@
基于以下最近的新闻背景,预测趋势生成一条其他新闻 生成一条有趣并通俗易懂的新闻
{{newsContext}}
包含以下要素: 包含以下要素:
1. 新闻标题:吸引人且简短,涉及不同行业 1. 新闻标题:吸引人且简短,涉及不同行业
@@ -14,6 +12,5 @@
- 内容应当暗示可能对不同行业公司产生某种影响(积极或消极),不能太过于明显 - 内容应当暗示可能对不同行业公司产生某种影响(积极或消极),不能太过于明显
- 行业焦点可以包括娱乐、科技、金融、医疗、食品等多个领域 - 行业焦点可以包括娱乐、科技、金融、医疗、食品等多个领域
- 新闻有很小的概率造假,如果是造假的,新闻来源就得来自小的工作室 - 新闻有很小的概率造假,如果是造假的,新闻来源就得来自小的工作室
- 不要一直重复着一个公司、一个行业的新闻 - 不要一直重复着一个公司、一个行业、一个事件的新闻
- 可以加一些很离谱的元素增加新闻的趣味性
- 只需生成一次即可 - 只需生成一次即可

View File

@@ -35,7 +35,8 @@ export function getStockPriceRecords(stockId, startTime, endTime, periodType = '
StockId: stockId, StockId: stockId,
StartTime: startTime, StartTime: startTime,
EndTime: endTime, EndTime: endTime,
PeriodType: periodType PeriodType: periodType,
MaxResultCount : 100
} }
}); });
} }

View File

@@ -44,12 +44,14 @@ const inputListDataStore = ref([
{key: "ai@gpt-4o-mini", name: "ChatGpt聊天", titleName: "ChatGpt-全能神!综合能力最强!", logo: "openAi.png", value: ""}, {key: "ai@gpt-4o-mini", name: "ChatGpt聊天", titleName: "ChatGpt-全能神!综合能力最强!", logo: "openAi.png", value: ""},
{key: "ai@claude-3-7-sonnet-20250219", name: "Claude聊天", titleName: "Claude3.7 代码逻辑地表最强!", logo: "claudeAi.png", value: ""}, {key: "ai@claude-3-7-sonnet-20250219", name: "Claude聊天", titleName: "Claude3.7 代码逻辑地表最强!", logo: "claudeAi.png", value: ""},
{key: "ai@claude-3-7-sonnet-20250219-thinking", name: "Claude思索", titleName: "Claude3.7 思索模式,强中强!", logo: "claudeAi.png", value: ""},
{key: "ai@grok-2-latest", name: "Grok聊天", titleName: "Grok2 即将为3.0王的诞生献上礼炮", logo: "grokAi.png", value: ""}, {key: "ai@grok-2-latest", name: "Grok聊天", titleName: "Grok2 即将为3.0王的诞生献上礼炮", logo: "grokAi.png", value: ""},
{key: "ai@Qwen/QVQ-72B-Preview", name: "QWen聊天", titleName: "国产阿里千问通义72B", logo: "qwenAi.png", value: ""}, {key: "ai@Qwen/QVQ-72B-Preview", name: "QWen聊天", titleName: "国产阿里千问通义72B", logo: "qwenAi.png", value: ""},
{key: "ai@deepseek-chat", name: "DeepSeek聊天", titleName: "满血DeepSeek-聊天模式,开源模型第一", logo: "deepSeekAi.png", value: ""}, {key: "ai@DeepSeek-V3", name: "DeepSeek聊天", titleName: "满血DeepSeek-聊天模式,开源模型第一", logo: "deepSeekAi.png", value: ""},
{key: "ai@deepseek-ai/deepseek-r1", name: "DeepSeek思索", titleName: "满血DeepSeek-思索模式", logo: "deepSeekAi.png", value: ""} {key: "ai@deepseek-r1-250120", name: "DeepSeek思索", titleName: "满血DeepSeek-思索模式", logo: "deepSeekAi.png", value: ""}
]); ]);
//AI聊天临时存储 //AI聊天临时存储
const sendAiChatContext = ref([]); const sendAiChatContext = ref([]);
@@ -440,7 +442,7 @@ const clickCopyEvent = async function (event) {
<template> <template>
<div style="position: absolute; top: 0;left: 0;" v-show="isShowTipNumber>0"> <div style="position: absolute; top: 0;left: 0;" v-show="isShowTipNumber>0">
<p>当前版本2.2.0</p> <p>当前版本2.3.0</p>
<p>tip:官方学习交流群每次发送消息消耗 1 钱钱</p> <p>tip:官方学习交流群每次发送消息消耗 1 钱钱</p>
<p>tip:点击聊天窗口右上角X可退出</p> <p>tip:点击聊天窗口右上角X可退出</p>
<p>tip:多人同时在聊天室时左侧可显示其他成员</p> <p>tip:多人同时在聊天室时左侧可显示其他成员</p>