修复 过时的AI请求temperature 字段

This commit is contained in:
小肥羊 2026-02-06 17:15:29 +08:00
parent d948f854fb
commit 53951aa870
14 changed files with 129 additions and 23 deletions

View File

@ -101,7 +101,7 @@ namespace Learn.VideoAnalysis
app.UseMiddleware<BasicAuthMiddleware>("Swagger"); app.UseMiddleware<BasicAuthMiddleware>("Swagger");
// Configure the HTTP request pipeline. // Configure the HTTP request pipeline.
//¿ªÆôredis¶ÓÁзþÎñ //¿ªÆôredis¶ÓÁзþÎñ
//_ = app.Services.GetRequiredService<RedisInit>(); _ = app.Services.GetRequiredService<RedisInit>();
app.UseSwagger(); app.UseSwagger();
app.UseSwaggerUI(); app.UseSwaggerUI();
app.UseExceptionHandler("/Error"); app.UseExceptionHandler("/Error");

View File

@ -62,12 +62,6 @@ namespace VideoAnalysisCore.AICore.GPT
public float? max_tokens { get; set; } = 8000; public float? max_tokens { get; set; } = 8000;
public float? max_completion_tokens { get; set; } = 8000; public float? max_completion_tokens { get; set; } = 8000;
/// <summary> /// <summary>
/// 要使用的采样温度,介于 0 和 2 之间。较高的值(如 0.8)将使输出更加随机,而较低的值(如 0.2)将使其更加集中和确定。 我们通常建议更改此项或同时更改两者。top_p
/// <para> 默认为 1</para>
/// <para> <see cref="ChatRequest.top_p"/>联动</para>
/// </summary>
public float? temperature { get; set; } = 0.2f;
/// <summary>
/// 一种替代温度采样的方法,称为原子核采样, 其中模型考虑具有top_p概率的标记的结果 质量。所以 0.1 表示仅包含前 10% 概率质量的代币 被考 /// 一种替代温度采样的方法,称为原子核采样, 其中模型考虑具有top_p概率的标记的结果 质量。所以 0.1 表示仅包含前 10% 概率质量的代币 被考
/// <para>建议与<see cref="ChatRequest.temperature"/>联动</para> /// <para>建议与<see cref="ChatRequest.temperature"/>联动</para>
/// </summary> /// </summary>

View File

@ -58,7 +58,6 @@ namespace VideoAnalysisCore.AICore.GPT.ChatGPT
title = title, title = title,
max_tokens = max_tokens, max_tokens = max_tokens,
stream = true, stream = true,
temperature = 0.2f,
messages = messageArr messages = messageArr
}; };

View File

@ -57,7 +57,6 @@ namespace VideoAnalysisCore.AICore.GPT.ChatGPT
model = model ?? ChatGPTType.Deepseek_Chat, model = model ?? ChatGPTType.Deepseek_Chat,
max_tokens = model == ChatGPTType.Deepseek_Reasoner ? 32000 : max_tokens, max_tokens = model == ChatGPTType.Deepseek_Reasoner ? 32000 : max_tokens,
stream = true, stream = true,
temperature = 0.2f,
messages = messageArr messages = messageArr
}; };
return await base.ChatAsync<T>(chatReq); return await base.ChatAsync<T>(chatReq);

View File

@ -187,7 +187,7 @@ namespace VideoAnalysisCore.AICore.GPT.DeepSeek
$"字幕列表 {rCaptionArr}。" + $"字幕列表 {rCaptionArr}。" +
$"输出格式 json字符串 对象格式{fileNameResFormat}"; $"输出格式 json字符串 对象格式{fileNameResFormat}";
var task = taskInfo.Id.ToString(); var task = taskInfo.Id.ToString();
var fileNameInfoRes = await chatGPTClient.ChatAsync<FileNameInfo> var fileNameInfoRes = await geminiClient.ChatAsync<FileNameInfo>
(task, fileNamePostMessages, "授课章节"); (task, fileNamePostMessages, "授课章节");
taskInfo.Sections = fileNameInfoRes.; taskInfo.Sections = fileNameInfoRes.;
await videoTaskDB.AsUpdateable() await videoTaskDB.AsUpdateable()
@ -309,7 +309,7 @@ namespace VideoAnalysisCore.AICore.GPT.DeepSeek
await Parallel.ForAsync(0, totalCount, await Parallel.ForAsync(0, totalCount,
new ParallelOptions() new ParallelOptions()
#if DEBUG #if DEBUG
{ MaxDegreeOfParallelism = 1 }, { MaxDegreeOfParallelism = 4 },
#else #else
{ MaxDegreeOfParallelism = 9 }, { MaxDegreeOfParallelism = 9 },
#endif #endif
@ -725,6 +725,8 @@ namespace VideoAnalysisCore.AICore.GPT.DeepSeek
throw new Exception("未能找到对应知识点=>" + sections); throw new Exception("未能找到对应知识点=>" + sections);
List<KnowledgeInfo>? knowledgeInfos = new List<KnowledgeInfo>(); List<KnowledgeInfo>? knowledgeInfos = new List<KnowledgeInfo>();
var kInfo = await knowledgeInfoDB.GetByIdAsync(know.Parent_Id); var kInfo = await knowledgeInfoDB.GetByIdAsync(know.Parent_Id);
if (know.Parent_Id == 0)
kInfo = know;
try try
{ {
knowledgeInfos = await knowledgeInfoDB.AsQueryable() knowledgeInfos = await knowledgeInfoDB.AsQueryable()
@ -800,6 +802,10 @@ namespace VideoAnalysisCore.AICore.GPT.DeepSeek
Stage = s.First().Stage, Stage = s.First().Stage,
Theme = s.First().Theme, Theme = s.First().Theme,
VideoTaskId = taskInfo.Id, VideoTaskId = taskInfo.Id,
CourseLevel = taskInfo.CourseLevel,
TextBookVersionId = taskInfo.TextBookVersionId,
GradeSemester= taskInfo.GradeSemester,
GradeId = taskInfo.GradeId,
}).ToList(); }).ToList();
//尝试追加 作业布置分段 //尝试追加 作业布置分段
if (homework != null && (!questionRes.Any(s => s.Stage == StageEnum..ToString()))) if (homework != null && (!questionRes.Any(s => s.Stage == StageEnum..ToString())))
@ -850,6 +856,8 @@ namespace VideoAnalysisCore.AICore.GPT.DeepSeek
if (know is null) if (know is null)
throw new Exception("未能找到对应知识点=>" + sections); throw new Exception("未能找到对应知识点=>" + sections);
var kInfo = await knowledgeInfoDB.GetByIdAsync(know.Parent_Id); var kInfo = await knowledgeInfoDB.GetByIdAsync(know.Parent_Id);
if (know.Parent_Id == 0)
kInfo = know;
var knowledgeInfos = await knowledgeInfoDB.AsQueryable() var knowledgeInfos = await knowledgeInfoDB.AsQueryable()
.ToChildListAsync(s => s.Parent_Id, kInfo.Parent_Id == 0 ? kInfo.Id : kInfo.Parent_Id); .ToChildListAsync(s => s.Parent_Id, kInfo.Parent_Id == 0 ? kInfo.Id : kInfo.Parent_Id);
//开始分析复习课 试题 //开始分析复习课 试题

View File

@ -56,7 +56,6 @@ namespace VideoAnalysisCore.AICore.GPT.ChatGPT
model = model, model = model,
max_tokens = max_tokens, max_tokens = max_tokens,
stream = true, stream = true,
temperature = 0.2f,
messages = messageArr, messages = messageArr,
max_completion_tokens= 12288, max_completion_tokens= 12288,
}; };

View File

@ -139,8 +139,8 @@ namespace VideoAnalysisCore.Common
await scope.ServiceProvider.GetService<DownloadFile>()?.RunTask(task); await scope.ServiceProvider.GetService<DownloadFile>()?.RunTask(task);
}); });
SubscribeList.Add(RedisChannelEnum., FFMPGE.RunAsync); SubscribeList.Add(RedisChannelEnum., FFMPGE.RunAsync);
//SubscribeList.Add(RedisChannelEnum.解析字幕, senseVoice.RunTask); SubscribeList.Add(RedisChannelEnum., senseVoice.RunTask);
SubscribeList.Add(RedisChannelEnum., funASRNano.RunTask); //SubscribeList.Add(RedisChannelEnum.解析字幕, funASRNano.RunTask);
//SubscribeList.Add(RedisChannelEnum.解析说话人,Speaker.Run); //SubscribeList.Add(RedisChannelEnum.解析说话人,Speaker.Run);
SubscribeList.Add(RedisChannelEnum.AI课程类型, async (task) => SubscribeList.Add(RedisChannelEnum.AI课程类型, async (task) =>
{ {
@ -435,13 +435,18 @@ namespace VideoAnalysisCore.Common
// 未能重新分析的中断任务 则单独开一个网页来处理 // 未能重新分析的中断任务 则单独开一个网页来处理
if (oldTaskCount > 0) if (oldTaskCount > 0)
{ {
var oldTaskArr = Redis.LRange(RedisExpandKey.IDTask, 0, oldTaskCount); //获取所有未完成的任务
//不自动清理未完成任务 等待执行完毕/失败后自动清理 var oldTaskArr = Redis.LRange(RedisExpandKey.IDTask, 0, -1);
//Redis.LTrim(RedisExpandKey.IDTask, 1, 0);//删除 redis 列表 Console.WriteLine($"{DateTime.Now:HH:mm:ss}-------------> 发现 {oldTaskArr.Length} 个未完成任务,准备恢复...");
//最多执行5个上次中断/或者未完成的任务
foreach (var oldTask in oldTaskArr.Take(5)) //使用信号量限制并发数(5),防止崩溃
using var semaphore = new System.Threading.SemaphoreSlim(5);
var retryTaskArr = new List<Task>();
foreach (var oldTask in oldTaskArr)
{ {
_ = Task.Run(async () => await semaphore.WaitAsync();
var res = Task.Run(async () =>
{ {
try try
{ {
@ -453,10 +458,21 @@ namespace VideoAnalysisCore.Common
catch (Exception ex) catch (Exception ex)
{ {
await SetTaskErrorMessage(long.Parse(oldTask), ex); await SetTaskErrorMessage(long.Parse(oldTask), ex);
throw; Console.WriteLine($"恢复任务 {oldTask} 失败: {ex.Message}");
}
finally
{
semaphore.Release();
} }
}); });
retryTaskArr.Add(res);
} }
//等待所有 重试任务完成后接收新任务
await Task.WhenAll(retryTaskArr);
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss") + "-------------> 所有未完成任务处理完毕!");
ReceivingTaskAsync();
} }
else else
{ {

View File

@ -141,6 +141,10 @@ namespace VideoAnalysisCore.Controllers.Dto
/// 教育阶段 /// 教育阶段
/// </summary> /// </summary>
public EducationStageEnum StageId { get; set; } public EducationStageEnum StageId { get; set; }
/// <summary>
/// 年级册(上册/下册)
/// </summary>
public GradeSemesterEnum? GradeSemester { get; set; }
} }
/// <summary> /// <summary>
/// 视频处理 请求 /// 视频处理 请求

View File

@ -115,6 +115,10 @@ namespace VideoAnalysisCore.Controllers
CloudSchoolId =s.UserCenterCloudSchoolId, CloudSchoolId =s.UserCenterCloudSchoolId,
Area = s.Area, Area = s.Area,
HostIP = s.HostIP, HostIP = s.HostIP,
StageId = s.StageId,
GradeId = s.GradeId,
GradeSemester = s.GradeSemester,
TextBookVersionId = s.TextBookVersionId,
}; };
nodePackages.Add(np); nodePackages.Add(np);
if (videoIdArr.Contains(s.VideoCode)) continue; if (videoIdArr.Contains(s.VideoCode)) continue;
@ -134,6 +138,10 @@ namespace VideoAnalysisCore.Controllers
PPTVideoUrl = pptUrl, PPTVideoUrl = pptUrl,
VideoType = s.CourseType, VideoType = s.CourseType,
CloudSchoolId = s.UserCenterCloudSchoolId, CloudSchoolId = s.UserCenterCloudSchoolId,
TextBookVersionId = s.TextBookVersionId,
GradeSemester =s .GradeSemester,
CourseLevel =s.CourseLevel,
GradeId = s.GradeId,
}); });
} }
await nodePackageInfoDB.InsertRangeAsync(nodePackages); await nodePackageInfoDB.InsertRangeAsync(nodePackages);

View File

@ -266,7 +266,7 @@ namespace VideoAnalysisCore.Controllers
TagId = req.TagId, TagId = req.TagId,
PPTVideoCode = req.PPTVideoCode, PPTVideoCode = req.PPTVideoCode,
PPTVideoUrl = req.PPTVideoUrl, PPTVideoUrl = req.PPTVideoUrl,
VideoType = req.VideoType VideoType = req.VideoType,
}; };
//入库 //入库
await baseService.InsertAsync(task); await baseService.InsertAsync(task);

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VideoAnalysisCore.Model.Enum
{
/// <summary>
/// 年级层次
/// </summary>
public enum GradeSemesterEnum
{
= 1,
= 2
}
}

View File

@ -83,6 +83,25 @@ namespace VideoAnalysisCore.Model
/// </summary> /// </summary>
public string Area { get; set; } public string Area { get; set; }
/// <summary> /// <summary>
/// 年级
/// </summary>
[SugarColumn(IsNullable = true)]
public GradeEnum? GradeId { get; set; }
/// <summary>
/// 教育阶段
/// </summary>
[SugarColumn(IsNullable = true)]
public EducationStageEnum StageId { get; set; }
/// <summary>
/// 年级册(上册/下册)
/// </summary>
[SugarColumn(IsNullable = true)]
public GradeSemesterEnum? GradeSemester { get; set; }
/// <summary>
/// 学科网的教材版本Id
/// </summary>
public long TextBookVersionId { get; set; }
/// <summary>
/// 请求区域 /// 请求区域
/// <para>回调添加到Headers</para> /// <para>回调添加到Headers</para>
/// </summary> /// </summary>

View File

@ -145,5 +145,26 @@ namespace VideoAnalysisCore.Model
[SugarColumn(IsNullable = true)] [SugarColumn(IsNullable = true)]
public long? CloudSchoolId { get; set; } public long? CloudSchoolId { get; set; }
/// <summary>
/// 教材层次
/// </summary>
[SugarColumn(IsNullable = true)]
public CourselevelTypeEnum? CourseLevel { get; set; }
/// <summary>
/// 年级
/// </summary>
[SugarColumn(IsNullable = true)]
public GradeEnum? GradeId { get; set; }
/// <summary>
/// 年级册(上册/下册)
/// </summary>
[SugarColumn(IsNullable = true)]
public GradeSemesterEnum? GradeSemester { get; set; }
/// <summary>
/// 学科网的教材版本Id
/// </summary>
public long TextBookVersionId { get; set; }
} }
} }

View File

@ -57,6 +57,7 @@ namespace VideoAnalysisCore.Model
/// <summary> /// <summary>
/// 知识点来源 视频秒,来源原因 /// 知识点来源 视频秒,来源原因
/// </summary> /// </summary>
[SugarColumn(Length = 500, IsNullable = true)]
public string Content { get; set; } public string Content { get; set; }
/// <summary> /// <summary>
/// 课程阶段 /// 课程阶段
@ -75,5 +76,26 @@ namespace VideoAnalysisCore.Model
/// </summary> /// </summary>
[SugarColumn(IsNullable = true)] [SugarColumn(IsNullable = true)]
public virtual string? TextbookSource { get; set; } public virtual string? TextbookSource { get; set; }
/// <summary>
/// 教材层次
/// </summary>
[SugarColumn(IsNullable = true)]
public CourselevelTypeEnum? CourseLevel { get; set; }
/// <summary>
/// 年级
/// </summary>
[SugarColumn(IsNullable = true)]
public GradeEnum? GradeId { get; set; }
/// <summary>
/// 年级册(上册/下册)
/// </summary>
[SugarColumn(IsNullable = true)]
public GradeSemesterEnum? GradeSemester { get; set; }
/// <summary>
/// 学科网的教材版本Id
/// </summary>
public long TextBookVersionId { get; set; }
} }
} }