feat: 新增AI聊天服务,重构任务提示词相关逻辑

1.  新增AI聊天服务接口、实现、控制器及相关DTO、配置类
2.  调整JournalPageTaskTypeEnum枚举值修正
3.  合并任务的基础Prompt和自定义Prompt为单个Prompt字段
4.  精简任务输出DTO冗余属性
This commit is contained in:
glz
2026-06-24 15:06:40 +08:00
parent 28a0c3cfe4
commit bf333cd718
11 changed files with 300 additions and 102 deletions

View File

@ -0,0 +1,23 @@
namespace QYZH.InteractiveMagazine.Models.Dto;
/// <summary>
/// AI聊天输入
/// </summary>
public class AiChatInput
{
/// <summary>
/// 用户需求文本
/// </summary>
public string Message { get; set; } = string.Empty;
}
/// <summary>
/// AI聊天输出
/// </summary>
public class AiChatOutput
{
/// <summary>
/// AI返回的内容Markdown格式提示词
/// </summary>
public string Content { get; set; } = string.Empty;
}

View File

@ -19,11 +19,6 @@ namespace QYZH.InteractiveMagazine.Models.Dto.Journal
/// </summary>
public long JournalPageId { get; set; }
/// <summary>
/// 学科Id
/// </summary>
public long SubjectId { get; set; }
/// <summary>
/// 题号
/// </summary>
@ -36,33 +31,10 @@ namespace QYZH.InteractiveMagazine.Models.Dto.Journal
public string ShowType => Type.GetDescription();
private string _task;
/// <summary>
/// 问题
/// </summary>
public string Task
{
get { return _task.AddDomain(DomainHelper.OssDomain); }
set { _task = value; }
}
/// <summary>
/// 答案列表
/// </summary>
public List<JournalTaskAnswerOutput> Answers { get; set; }
private string _imageUrl;
/// <summary>
/// 图片地址
/// </summary>
public string ImageUrl
{
get { return DomainHelper.OssFullUrl(_imageUrl); }
set { _imageUrl = value; }
}
public List<string> ImageUrls { get; set; }
/// <summary>
/// 积分
/// </summary>
@ -98,55 +70,10 @@ namespace QYZH.InteractiveMagazine.Models.Dto.Journal
/// </summary>
public int AnswerTime { get; set; }
private string _audioUrl;
/// <summary>
/// 音频地址
/// Prompt配置
/// </summary>
public string AudioUrl
{
get { return DomainHelper.OssFullUrl(_audioUrl); }
set { _audioUrl = value; }
}
private string _videoUrl;
/// <summary>
/// 视频地址
/// </summary>
public string VideoUrl
{
get { return DomainHelper.OssFullUrl(_videoUrl); }
set { _videoUrl = value; }
}
private string _pointsUrl;
/// <summary>
/// 点位数据地址
/// </summary>
public string PointsUrl
{
get { return DomainHelper.OssFullUrl(_pointsUrl); }
set { _pointsUrl = value; }
}
/// <summary>
/// 音频开始时间
/// </summary>
public long AudioStartTime { get; set; }
/// <summary>
/// 音频结束时间
/// </summary>
public long AudioEndTime { get; set; }
/// <summary>
/// 知识点
/// </summary>
public string KnowledgePointIds { get; set; }
/// <summary>
/// 年级
/// </summary>
public int Grade { get; set; }
public string Prompt { get; set; }
}
/// <summary>

View File

@ -1,4 +1,4 @@
using QYZH.InteractiveMagazine.Models.Enum;
using QYZH.InteractiveMagazine.Models.Enum;
using QYZH.InteractiveMagazine.Models.Enum;
using System;
using System.Collections.Generic;
@ -67,18 +67,9 @@ namespace QYZH.InteractiveMagazine.Models.Dto.Journal
/// </summary>
public int AnswerTime { get; set; }
/// <summary>
/// Desc:基础Prompt配置ID为空则使用IsDefault=1的模板
/// Default:
/// Nullable:True
/// </summary>
public string BasePrompt { get; set; }
/// <summary>
/// Desc:个性化Prompt追加到基础Prompt后面可为空
/// Default:
/// Nullable:True
/// </summary>
public string CustomPrompt { get; set; }
/// Prompt配置
/// </summary>
public string Prompt { get; set; }
}

View File

@ -122,18 +122,11 @@ namespace QYZH.InteractiveMagazine.Models.Entity
public bool NeedAiProcess { get; set; }
/// <summary>
/// Desc:基础Prompt配置ID为空则使用IsDefault=1的模板
/// Desc:Prompt配置
/// Default:
/// Nullable:True
/// </summary>
public string BasePrompt { get; set; }
/// <summary>
/// Desc:个性化Prompt追加到基础Prompt后面可为空
/// Default:
/// Nullable:True
/// </summary>
public string CustomPrompt { get; set; }
public string Prompt { get; set; }
/// <summary>
/// Desc:作答参考时间

View File

@ -16,5 +16,5 @@ public enum JournalPageTaskTypeEnum
/// 问答题
/// </summary>
[Description("主观题")]
TaskAnswer = 4
TaskAnswer = 0
}

View File

@ -0,0 +1,37 @@
namespace QYZH.InteractiveMagazine.Models.Settings;
/// <summary>
/// AI聊天配置
/// </summary>
public class AiChatSettings
{
/// <summary>
/// API密钥
/// </summary>
public string? ApiKey { get; set; }
/// <summary>
/// API基础地址OpenAI兼容
/// </summary>
public string? BaseUrl { get; set; }
/// <summary>
/// 模型名称
/// </summary>
public string? Model { get; set; }
/// <summary>
/// 请求超时时间(秒)
/// </summary>
public int TimeoutSeconds { get; set; } = 300;
/// <summary>
/// 最大生成Token数
/// </summary>
public int MaxTokens { get; set; } = 2000;
/// <summary>
/// 采样温度0-2值越低输出越确定
/// </summary>
public double Temperature { get; set; } = 0.5;
}