更新 新版模型
This commit is contained in:
parent
ea949f0825
commit
ed8387dea3
|
|
@ -49,7 +49,7 @@ namespace VideoAnalysisCore.AICore.GPT.ChatGPT
|
|||
Message[] messageArr = [
|
||||
new Message(postMessages,"user"),
|
||||
];
|
||||
model = model ?? ChatGPTType.GPT5_mini;
|
||||
model = model ?? ChatGPTType.GPT54_mini;
|
||||
messageArr = messageArr.Where(s => s != null).ToArray();
|
||||
var chatReq = new ChatRequest
|
||||
{
|
||||
|
|
|
|||
|
|
@ -8,18 +8,23 @@ namespace VideoAnalysisCore.AICore.GPT
|
|||
{
|
||||
public class ChatGPTType
|
||||
{
|
||||
public const string GPT5_mini = "gpt-5-mini";
|
||||
public const string GPT5 = "gpt-5-2025-08-07";
|
||||
//public const string GPT5_mini = "gpt-5-mini";
|
||||
//public const string GPT5 = "gpt-5-2025-08-07";
|
||||
|
||||
public const string GPT54_mini = "gpt-5.4-mini";
|
||||
public const string GPT54 = "gpt-5.4";
|
||||
|
||||
public const string Deepseek_Reasoner = "deepseek-reasoner";
|
||||
public const string Deepseek_Chat = "deepseek-chat";
|
||||
|
||||
public const string Deepseek_v32 = "deepseek-v3.2";
|
||||
public const string Deepseek_v32_thinking = "deepseek-v3.2-thinking";
|
||||
|
||||
//渠道限制没有并发
|
||||
//public const string Gemini_3_Chat_thinking = "gemini-3-pro-preview-thinking";
|
||||
public const string Gemini_3_Chat = "gemini-3-pro-preview";
|
||||
public const string Gemini_3_Chat_flash = "gemini-3-flash-preview";
|
||||
public const string Gemini_3_Chat = "gemini-3.1-pro-preview";
|
||||
//public const string Gemini_3_Chat_flash = "gemini-3-flash-preview";
|
||||
public const string Gemini_31_Chat_flash = "gemini-3.1-flash-preview";
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@ namespace VideoAnalysisCore.AICore.GPT.DeepSeek
|
|||
messages = messageArr
|
||||
};
|
||||
chatReq.modalities = null;
|
||||
chatReq.max_completion_tokens = null;
|
||||
return await ChatAsync<T>(chatReq);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ namespace VideoAnalysisCore.AICore.GPT
|
|||
public class GTP_Analysis_1 : IBaseGPTWorkflow
|
||||
{
|
||||
private readonly GeminiGPTClient geminiClient;
|
||||
private readonly DeepSeekGPTClient deepSeekClient;
|
||||
//private readonly DeepSeekGPTClient deepSeekClient;
|
||||
private readonly BSET_DeepSeekGPTClient bset_deepSeekClient;
|
||||
private readonly BestAIClient chatGPTClient;
|
||||
private readonly Repository<CourseGradingCriteria> criteriaDB;
|
||||
|
|
@ -59,7 +59,7 @@ namespace VideoAnalysisCore.AICore.GPT
|
|||
Repository<KnowledgeInfo> knowledgeInfoDB, Repository<VideoKonwPoint> videoKonwPointDB, SimpLetexClient simpLetexClient,
|
||||
Repository<VideoQuestion> videoQuestionDB, OssClient ossClient, Repository<VideoQuestionKonw> videoQuestionKonwDB, RedisManager redisManager, VideoSliceWorkflowManager workflowManager, BestAIClient chatGPTClient, GeminiGPTClient geminiClient, Repository<VideoTaskStage> videoTaskStageDB, BSET_DeepSeekGPTClient bset_deepSeekClient)
|
||||
{
|
||||
deepSeekClient = moonshotClient;
|
||||
//deepSeekClient = moonshotClient;
|
||||
criteriaDB = criteria;
|
||||
this.videoTaskDB = videoTaskDB;
|
||||
this.knowledgeInfoDB = knowledgeInfoDB;
|
||||
|
|
@ -115,7 +115,7 @@ namespace VideoAnalysisCore.AICore.GPT
|
|||
await _workflowManager.AddTaskLog(taskInfo.Id, "==>2.开始分析视频内容知识点");
|
||||
List<VideoKnowRes> konwRes;
|
||||
var knowOK = false;
|
||||
var chatClentArr = new GPTClient[] { chatGPTClient, geminiClient, deepSeekClient };
|
||||
var chatClentArr = new GPTClient[] { chatGPTClient, geminiClient, bset_deepSeekClient };
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
konwRes = await chatClentArr[i].ChatAsync<List<VideoKnowRes>>(taskInfo.Id.ToString(), knowMessages, "知识点");
|
||||
|
|
@ -307,10 +307,10 @@ namespace VideoAnalysisCore.AICore.GPT
|
|||
[
|
||||
async (m)=>await bset_deepSeekClient
|
||||
.ChatAsync<List<SenseVoiceInput>>(taskInfo.Id.ToString(), m, "优化字幕",ChatGPTType.Deepseek_v32,8_000),
|
||||
async (m)=>await deepSeekClient
|
||||
async (m)=>await bset_deepSeekClient
|
||||
.ChatAsync<List<SenseVoiceInput>>(taskInfo.Id.ToString(), m, "优化字幕",ChatGPTType.Deepseek_Chat,8_000),
|
||||
async (m)=>await chatGPTClient
|
||||
.ChatAsync<List<SenseVoiceInput>>(taskInfo.Id.ToString(), m, "优化字幕",ChatGPTType.GPT5,16_000),
|
||||
.ChatAsync<List<SenseVoiceInput>>(taskInfo.Id.ToString(), m, "优化字幕",ChatGPTType.GPT54_mini,16_000),
|
||||
async (m)=>await geminiClient
|
||||
.ChatAsync<List<SenseVoiceInput>>(taskInfo.Id.ToString(), m, "优化字幕",ChatGPTType.Gemini_3_Chat,16_000), ];
|
||||
await Parallel.ForAsync(0, totalCount,
|
||||
|
|
@ -482,7 +482,7 @@ namespace VideoAnalysisCore.AICore.GPT
|
|||
输出格式(仅 JSON):{resFormat}
|
||||
""";
|
||||
|
||||
var res = await deepSeekClient.ChatAsync<VideoKnowRes>(taskInfo.Id.ToString(), message, "作业布置识别", ChatGPTType.Deepseek_Chat, 8000);
|
||||
var res = await bset_deepSeekClient.ChatAsync<VideoKnowRes>(taskInfo.Id.ToString(), message, "作业布置识别", ChatGPTType.Deepseek_Chat, 8000);
|
||||
if (res is null)
|
||||
return null;
|
||||
if (!string.Equals(res.Stage, "作业布置", StringComparison.OrdinalIgnoreCase))
|
||||
|
|
@ -635,7 +635,7 @@ namespace VideoAnalysisCore.AICore.GPT
|
|||
$"输出内容只返回json格式为({resFormat})" +
|
||||
$"以下是试题内容" +
|
||||
$"`{sRes.Result.res.value}`";
|
||||
var resData = await deepSeekClient.ChatAsync<List<VideoQuestionOSSDto>>(taskInfo.Id.ToString(), postMessages, "提取试题");
|
||||
var resData = await bset_deepSeekClient.ChatAsync<List<VideoQuestionOSSDto>>(taskInfo.Id.ToString(), postMessages, "提取试题");
|
||||
//var resData = await chatClient.ChatAsync<VideoQuestionOSSDto[]>(taskInfo.Id.ToString(), postMessages, "提取试题");
|
||||
if (resData is null || resData.Count() == 0)
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ namespace VideoAnalysisCore.AICore.GPT.Gemini
|
|||
Message[] messageArr = [
|
||||
new Message(postMessages,"user"),
|
||||
];
|
||||
model = model ?? ChatGPTType.Gemini_3_Chat_flash;
|
||||
model = model ?? ChatGPTType.Gemini_31_Chat_flash;
|
||||
messageArr = messageArr.Where(s => s != null).ToArray();
|
||||
var chatReq = new ChatRequest
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
using SqlSugar;
|
||||
using SqlSugar;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using UserCenter.Model.Enum;
|
||||
using VideoAnalysisCore.AICore.GPT.Dto;
|
||||
using VideoAnalysisCore.Model;
|
||||
using VideoAnalysisCore.Model.Dto;
|
||||
using VideoAnalysisCore.Model.Enum;
|
||||
using Yitter.IdGenerator;
|
||||
|
||||
namespace VideoAnalysisCore.Controllers.Dto
|
||||
{
|
||||
|
|
@ -340,4 +342,102 @@ namespace VideoAnalysisCore.Controllers.Dto
|
|||
// TimeBase?.GroupBy(s => s.TimeBaseType??TimeBaseTypeEnum.教师讲授)?
|
||||
// .ToDictionary(s => s.Key, s => new TextValue(s.Sum(x => x.End - x.Start)));
|
||||
}
|
||||
|
||||
public class VideoKonwPointQueryReq
|
||||
{
|
||||
public long? CloudSchoolId { get; set; }
|
||||
public CourselevelTypeEnum? CourseLevel { get; set; }
|
||||
public GradeEnum? GradeId { get; set; }
|
||||
public GradeSemesterEnum? GradeSemester { get; set; }
|
||||
public long? TextBookVersionId { get; set; }
|
||||
public string[]? KnowPointIdArr { get; set; }
|
||||
public string? Theme { get; set; }
|
||||
public string? Content { get; set; }
|
||||
public int PageIndex { get; set; } = 0;
|
||||
public int PageSize { get; set; } = 200;
|
||||
}
|
||||
|
||||
public class VideoTaskInfoRes
|
||||
{
|
||||
/// <summary>
|
||||
/// 视频vid
|
||||
/// </summary>
|
||||
public long VideoTaskId { get; set; }
|
||||
/// <summary>
|
||||
/// 分段
|
||||
/// </summary>
|
||||
public VideoTaskStageRes[] Stages { get; set; }
|
||||
|
||||
}
|
||||
public class VideoTaskStageRes
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// id
|
||||
/// </summary>
|
||||
[SugarColumn(IsPrimaryKey = true)]
|
||||
public long Id { get; set; } = YitIdHelper.NextId();
|
||||
/// <summary>
|
||||
/// 视频任务id
|
||||
/// <see cref="VideoTask.Id"/>
|
||||
/// </summary>
|
||||
public long VideoTaskId { get; set; }
|
||||
/// <summary>
|
||||
/// 自定义Id [任务视频自定义id]
|
||||
/// <see cref="VideoTask.TagId"/>
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 500, IsNullable = true)]
|
||||
public string? TagId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 开始时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public float? StartTime { get; set; }
|
||||
/// <summary>
|
||||
/// 结束时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public float? EndTime { get; set; }
|
||||
/// <summary>
|
||||
/// 持续时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
public float? KeepTime => (EndTime ?? 0) - StartTime ?? 0;
|
||||
/// <summary>
|
||||
/// 主题
|
||||
/// </summary>
|
||||
public string? Theme { get; set; }
|
||||
/// <summary>
|
||||
/// 课程阶段
|
||||
/// </summary>
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
public virtual StageEnum? Stage { get; set; }
|
||||
/// <summary>
|
||||
/// 视频所属云校ID
|
||||
/// <para><see cref="UserCenter.Model.CloudSchool"/> 用户中心的云校id</para>
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public long? CloudSchoolId { get; set; }
|
||||
/// <summary>
|
||||
/// 知识点
|
||||
/// </summary>
|
||||
public string[] KnowPoints { get; set; } = [];
|
||||
}
|
||||
public class VideoTaskStageQueryRes
|
||||
{
|
||||
|
||||
public VideoTaskStageQueryRes()
|
||||
{
|
||||
Data = [];
|
||||
Total = 0;
|
||||
}
|
||||
public VideoTaskStageQueryRes(VideoTaskInfoRes[] data, int total = 0)
|
||||
{
|
||||
Data = data;
|
||||
Total = total;
|
||||
}
|
||||
public int Total { get; set; }
|
||||
public VideoTaskInfoRes[] Data { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,13 +12,12 @@ using System.Text.Json;
|
|||
using Microsoft.AspNetCore.Authorization;
|
||||
using VideoAnalysisCore.Model.Enum;
|
||||
using FFmpeg.NET.Services;
|
||||
using static FFmpeg.NET.MetaData;
|
||||
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||||
using Yitter.IdGenerator;
|
||||
using VideoAnalysisCore.AICore.GPT.Dto;
|
||||
using VideoAnalysisCore.Model;
|
||||
using VideoAnalysisCore.Controllers.Dto;
|
||||
using VideoAnalysisCore.Model.Dto;
|
||||
using SqlSugar;
|
||||
using VideoAnalysisCore.Model.À¶¾¨ÖÇ¿â;
|
||||
|
||||
namespace VideoAnalysisCore.Controllers
|
||||
|
|
@ -285,6 +284,86 @@ namespace VideoAnalysisCore.Controllers
|
|||
return Ok(res);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查询 视频切片
|
||||
/// </summary>
|
||||
/// <param name="req"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost(Name = "QueryVideoStage")]
|
||||
public async Task<IActionResult> QueryVideoStage([FromBody] VideoKonwPointQueryReq req)
|
||||
{
|
||||
if (req is null)
|
||||
return BadRequest("参数不能为空");
|
||||
|
||||
var stageQuery = videoTaskStageDB.AsQueryable();
|
||||
stageQuery = stageQuery.WhereIF(req.CloudSchoolId.HasValue, s => s.CloudSchoolId == req.CloudSchoolId);
|
||||
stageQuery = stageQuery.WhereIF(req.CourseLevel.HasValue, s => s.CourseLevel == req.CourseLevel);
|
||||
stageQuery = stageQuery.WhereIF(req.GradeId.HasValue, s => s.GradeId == req.GradeId);
|
||||
stageQuery = stageQuery.WhereIF(req.GradeSemester.HasValue, s => s.GradeSemester == req.GradeSemester);
|
||||
stageQuery = stageQuery.WhereIF(req.TextBookVersionId.HasValue, s => s.TextBookVersionId == req.TextBookVersionId.Value);
|
||||
stageQuery = stageQuery.WhereIF(!string.IsNullOrWhiteSpace(req.Theme), s => s.Theme.Contains(req.Theme));
|
||||
stageQuery = stageQuery.WhereIF(!string.IsNullOrWhiteSpace(req.Content), s => s.Content.Contains(req.Content));
|
||||
|
||||
var pageIndex = req.PageIndex < 0 ? 0 : req.PageIndex;
|
||||
var pageSize = req.PageSize <= 0 ? 200 : req.PageSize > 500 ? 500 : req.PageSize;
|
||||
|
||||
if (req.KnowPointIdArr is not null && req.KnowPointIdArr.Length > 0)
|
||||
{
|
||||
var knowArr = req.KnowPointIdArr.Where(s => !string.IsNullOrWhiteSpace(s)).Distinct().ToArray();
|
||||
if (knowArr.Length > 0)
|
||||
{
|
||||
stageQuery = stageQuery.Where(s => SqlFunc.Subqueryable<VideoKonwPoint>()
|
||||
.Where(k => k.StageId == s.Id && k.KnowPointId != null && knowArr.Contains(k.KnowPointId))
|
||||
.Any());
|
||||
}
|
||||
}
|
||||
|
||||
RefAsync<int> total = 0;
|
||||
var stagePageArr = await stageQuery.ToPageListAsync(pageIndex + 1, pageSize, total);
|
||||
if (stagePageArr is null || stagePageArr.Count == 0)
|
||||
return Ok(new VideoTaskStageQueryRes());
|
||||
|
||||
var taskIdArr = stagePageArr.Select(s => s.VideoTaskId).ToArray();
|
||||
var kpQuery = videoKonwPointDB.AsQueryable()
|
||||
.Where(s => taskIdArr.Contains(s.VideoTaskId) && s.KnowPointId != null);
|
||||
if (req.KnowPointIdArr is not null && req.KnowPointIdArr.Length > 0)
|
||||
{
|
||||
var knowArr = req.KnowPointIdArr.Where(s => !string.IsNullOrWhiteSpace(s)).Distinct().ToArray();
|
||||
if (knowArr.Length > 0)
|
||||
kpQuery = kpQuery.Where(s => knowArr.Contains(s.KnowPointId));
|
||||
}
|
||||
|
||||
var kpArr = await kpQuery
|
||||
.Select(s => new { s.StageId, s.KnowPoint })
|
||||
.ToArrayAsync();
|
||||
var kpDic = (kpArr ?? [])
|
||||
.GroupBy(s => s.StageId)
|
||||
.ToDictionary(s => s.Key, s => s.Select(x => x.KnowPoint!).Distinct().ToArray());
|
||||
|
||||
var data = stagePageArr.Select(s => new VideoTaskStageRes()
|
||||
{
|
||||
Id = s.Id,
|
||||
VideoTaskId = s.VideoTaskId,
|
||||
TagId = s.TagId,
|
||||
StartTime = s.StartTime,
|
||||
EndTime = s.EndTime,
|
||||
Theme = s.Theme,
|
||||
CloudSchoolId = s.CloudSchoolId,
|
||||
KnowPoints = kpDic.ContainsKey(s.Id) ? kpDic[s.Id] : []
|
||||
}).ToArray();
|
||||
|
||||
return Ok(new VideoTaskStageQueryRes()
|
||||
{
|
||||
Total = total,
|
||||
Data = data.GroupBy(s=>s.VideoTaskId)
|
||||
.Select(s=>new VideoTaskInfoRes()
|
||||
{
|
||||
Stages = s.ToArray(),
|
||||
VideoTaskId =s.Key
|
||||
}).ToArray()
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ namespace VideoAnalysisCore.Model
|
|||
/// </summary>
|
||||
public string? Theme { get; set; }
|
||||
/// <summary>
|
||||
/// 知识点来源 视频秒,来源原因
|
||||
/// 切片内容
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 500, IsNullable = true)]
|
||||
public string Content { get; set; }
|
||||
|
|
|
|||
Loading…
Reference in New Issue