Commit e9cbee9d7ee593ad793b2a77a688616c61c7907b
1 parent
c0470dca
【代码评审】AI:调整表结构
Showing
31 changed files
with
389 additions
and
176 deletions
yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiOpenAiModelEnum.java
| ... | ... | @@ -4,6 +4,7 @@ import lombok.AllArgsConstructor; |
| 4 | 4 | import lombok.Getter; |
| 5 | 5 | |
| 6 | 6 | // TODO done @fansili:1)类注释要加下;2)author 和 time 用 javadoc,@author 和 @since;3)@AllArgsConstructor 使用这个注解,去掉构造方法;4)value 改成 model 字段,然后注释都写下哈;5)message 改成 name,然后注释都写下哈 |
| 7 | +// TODO @fan: AiModelEnum 是不是可以缩写成这个哈;所有的模型,都写在这里枚举; | |
| 7 | 8 | /** |
| 8 | 9 | * @author: fansili |
| 9 | 10 | * @time: 2024/3/4 12:36 |
| ... | ... | @@ -12,24 +13,18 @@ import lombok.Getter; |
| 12 | 13 | @AllArgsConstructor |
| 13 | 14 | public enum AiOpenAiModelEnum { |
| 14 | 15 | |
| 15 | - /** | |
| 16 | - * open ai 3.5模型 | |
| 17 | - */ | |
| 16 | + | |
| 18 | 17 | OPEN_AI_GPT_3_5("gpt-3.5-turbo", "GPT3.5"), |
| 19 | - /** | |
| 20 | - * open ai 4.0 收费模型 | |
| 21 | - */ | |
| 22 | 18 | OPEN_AI_GPT_4("gpt-4-turbo", "GPT4") |
| 23 | - | |
| 24 | 19 | ; |
| 25 | 20 | |
| 26 | 21 | /** |
| 27 | - * 模型 - 用于参数传递 | |
| 22 | + * 模型标志 - 用于参数传递 | |
| 28 | 23 | */ |
| 29 | - private String model; | |
| 24 | + private final String model; | |
| 30 | 25 | /** |
| 31 | 26 | * 模型名字 - 用于展示 |
| 32 | 27 | */ |
| 33 | - private String name; | |
| 28 | + private final String name; | |
| 34 | 29 | |
| 35 | 30 | } | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatConversationControllerV2.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.chat; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 4 | +import io.swagger.v3.oas.annotations.tags.Tag; | |
| 5 | +import lombok.extern.slf4j.Slf4j; | |
| 6 | +import org.springframework.web.bind.annotation.RequestMapping; | |
| 7 | +import org.springframework.web.bind.annotation.RestController; | |
| 8 | + | |
| 9 | +@Tag(name = "管理后台 - 聊天会话") | |
| 10 | +@RestController | |
| 11 | +@RequestMapping("/ai/chat/conversation") | |
| 12 | +@Slf4j | |
| 13 | +public class AiChatConversationControllerV2 { | |
| 14 | + | |
| 15 | + public CommonResult<List<>> | |
| 16 | + | |
| 17 | +} | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/package-info.java
0 → 100644
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/package-info.java
0 → 100644
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/app/package-info.java
0 → 100644
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/package-info.java
0 → 100644
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatConversationConvert.java
| 1 | 1 | package cn.iocoder.yudao.module.ai.convert; |
| 2 | 2 | |
| 3 | -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatConversationDO; | |
| 3 | +import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO; | |
| 4 | 4 | import cn.iocoder.yudao.module.ai.vo.AiChatConversationRes; |
| 5 | 5 | import org.mapstruct.Mapper; |
| 6 | 6 | import org.mapstruct.factory.Mappers; | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatMessageConvert.java
| 1 | 1 | package cn.iocoder.yudao.module.ai.convert; |
| 2 | 2 | |
| 3 | -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatMessageDO; | |
| 3 | +import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatMessageDO; | |
| 4 | 4 | import cn.iocoder.yudao.module.ai.vo.AiChatMessageListRes; |
| 5 | 5 | import org.mapstruct.Mapper; |
| 6 | 6 | import org.mapstruct.factory.Mappers; | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatModalConvert.java
| 1 | 1 | package cn.iocoder.yudao.module.ai.convert; |
| 2 | 2 | |
| 3 | -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatModalDO; | |
| 3 | +import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModalDO; | |
| 4 | 4 | import cn.iocoder.yudao.module.ai.vo.AiChatModalAddReq; |
| 5 | 5 | import cn.iocoder.yudao.module.ai.vo.AiChatModalListRes; |
| 6 | 6 | import cn.iocoder.yudao.module.ai.vo.AiChatModalRes; | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatRoleConvert.java
| 1 | 1 | package cn.iocoder.yudao.module.ai.convert; |
| 2 | 2 | |
| 3 | -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatRoleDO; | |
| 3 | +import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO; | |
| 4 | 4 | import cn.iocoder.yudao.module.ai.vo.AiChatRoleAddReq; |
| 5 | 5 | import cn.iocoder.yudao.module.ai.vo.AiChatRoleRes; |
| 6 | 6 | import cn.iocoder.yudao.module.ai.vo.AiChatRoleUpdateReq; | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiChatConversationDO.java deleted
| 1 | -package cn.iocoder.yudao.module.ai.dal.dataobject; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | |
| 4 | -import com.baomidou.mybatisplus.annotation.TableName; | |
| 5 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 6 | -import lombok.Data; | |
| 7 | -import lombok.experimental.Accessors; | |
| 8 | - | |
| 9 | -/** | |
| 10 | - * chat 交谈 | |
| 11 | - * | |
| 12 | - * @author fansili | |
| 13 | - * @time 2024/4/14 17:35 | |
| 14 | - * @since 1.0 | |
| 15 | - */ | |
| 16 | -@Data | |
| 17 | -@Accessors(chain = true) | |
| 18 | -@TableName("ai_chat_conversation") | |
| 19 | -public class AiChatConversationDO extends BaseDO { | |
| 20 | - | |
| 21 | - @Schema(description = "id") | |
| 22 | - private Long id; | |
| 23 | - | |
| 24 | - @Schema(description = "用户id") | |
| 25 | - private Long userId; | |
| 26 | - | |
| 27 | - @Schema(description = "chat角色Id") | |
| 28 | - private Long roleId; | |
| 29 | - | |
| 30 | - @Schema(description = "chat角色名称") | |
| 31 | - private String roleName; | |
| 32 | - | |
| 33 | - @Schema(description = "模型id") | |
| 34 | - private Long modalId; | |
| 35 | - | |
| 36 | - @Schema(description = "使用的模型") | |
| 37 | - private String modal; | |
| 38 | - | |
| 39 | - @Schema(description = "标题") | |
| 40 | - private String title; | |
| 41 | - | |
| 42 | - @Schema(description = "对话类型(roleChat、userChat)") | |
| 43 | - private String type; | |
| 44 | - | |
| 45 | - @Schema(description = "聊天次数(有程序自动生成)") | |
| 46 | - private Integer chatCount; | |
| 47 | -} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiChatMessageDO.java deleted
| 1 | -package cn.iocoder.yudao.module.ai.dal.dataobject; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | |
| 4 | -import com.baomidou.mybatisplus.annotation.TableName; | |
| 5 | -import lombok.Data; | |
| 6 | -import lombok.experimental.Accessors; | |
| 7 | - | |
| 8 | -/** | |
| 9 | - * ai 聊天 message | |
| 10 | - * | |
| 11 | - * @fansili | |
| 12 | - * @since v1.0 | |
| 13 | - */ | |
| 14 | -@Data | |
| 15 | -@Accessors(chain = true) | |
| 16 | -@TableName("ai_chat_message") | |
| 17 | -public class AiChatMessageDO extends BaseDO { | |
| 18 | - | |
| 19 | - /** | |
| 20 | - * 编号,作为每条聊天记录的唯一标识符 | |
| 21 | - */ | |
| 22 | - private Long id; | |
| 23 | - | |
| 24 | - /** | |
| 25 | - * 聊天ID,关联到特定的会话或对话 | |
| 26 | - */ | |
| 27 | - private Long chatConversationId; | |
| 28 | - | |
| 29 | - /** | |
| 30 | - * 角色ID,用于标识发送消息的用户或系统的身份 | |
| 31 | - */ | |
| 32 | - private Long userId; | |
| 33 | - | |
| 34 | - /** | |
| 35 | - * 消息具体内容,存储用户的发言或者系统响应的文字信息 | |
| 36 | - */ | |
| 37 | - private String message; | |
| 38 | - | |
| 39 | - /** | |
| 40 | - * 消息类型,枚举值可能包括'system'(系统消息)、'user'(用户消息)和'assistant'(助手消息) | |
| 41 | - */ | |
| 42 | - private String messageType; | |
| 43 | - | |
| 44 | - /** | |
| 45 | - * 在生成消息时采用的Top-K采样大小, | |
| 46 | - * 表示模型生成回复时考虑的候选项集合的大小 | |
| 47 | - */ | |
| 48 | - private Double topK; | |
| 49 | - | |
| 50 | - /** | |
| 51 | - * Top-P核采样方法的概率阈值, | |
| 52 | - * 在语言模型生成过程中控制采样的过滤标准 | |
| 53 | - */ | |
| 54 | - private Double topP; | |
| 55 | - | |
| 56 | - /** | |
| 57 | - * 温度参数,用于调整生成回复的随机性和多样性程度, | |
| 58 | - * 较低的温度值会使输出更收敛于高频词汇,较高的则增加多样性 | |
| 59 | - */ | |
| 60 | - private Double temperature; | |
| 61 | - | |
| 62 | -} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/chat/AiChatConversationDO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.dal.dataobject.chat; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | |
| 4 | +import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModalDO; | |
| 5 | +import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO; | |
| 6 | +import cn.iocoder.yudao.module.ai.enums.AiOpenAiModelEnum; | |
| 7 | +import com.baomidou.mybatisplus.annotation.KeySequence; | |
| 8 | +import com.baomidou.mybatisplus.annotation.TableId; | |
| 9 | +import com.baomidou.mybatisplus.annotation.TableName; | |
| 10 | +import lombok.*; | |
| 11 | + | |
| 12 | +/** | |
| 13 | + * AI Chat 会话 DO | |
| 14 | + * | |
| 15 | + * 用户每次发起 Chat 聊天时,会创建一个 {@link AiChatConversationDO} 对象,将它的消息关联在一起 | |
| 16 | + * | |
| 17 | + * @author fansili | |
| 18 | + * @since 2024/4/14 17:35 | |
| 19 | + */ | |
| 20 | +@TableName("ai_chat_conversation") | |
| 21 | +@KeySequence("ai_chat_conversation_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 | |
| 22 | +@Data | |
| 23 | +@EqualsAndHashCode(callSuper = true) | |
| 24 | +@Builder | |
| 25 | +@NoArgsConstructor | |
| 26 | +@AllArgsConstructor | |
| 27 | +public class AiChatConversationDO extends BaseDO { | |
| 28 | + | |
| 29 | + /** | |
| 30 | + * ID 编号,自增 | |
| 31 | + */ | |
| 32 | + @TableId | |
| 33 | + private Long id; | |
| 34 | + | |
| 35 | + /** | |
| 36 | + * 用户编号 | |
| 37 | + * | |
| 38 | + * 关联 AdminUserDO 的 userId 字段 | |
| 39 | + */ | |
| 40 | + private Long userId; | |
| 41 | + | |
| 42 | + /** | |
| 43 | + * 标题 | |
| 44 | + * | |
| 45 | + * 默认由系统自动生成,可用户手动修改 | |
| 46 | + */ | |
| 47 | + private String title; | |
| 48 | + | |
| 49 | + /** | |
| 50 | + * 角色编号 | |
| 51 | + * | |
| 52 | + * 关联 {@link AiChatRoleDO#getId()} | |
| 53 | + */ | |
| 54 | + private Long roleId; | |
| 55 | + /** | |
| 56 | + * 模型标志 | |
| 57 | + * | |
| 58 | + * 枚举 {@link AiOpenAiModelEnum} | |
| 59 | + */ | |
| 60 | + private String model; | |
| 61 | + | |
| 62 | + /** | |
| 63 | + * 模型编号 | |
| 64 | + * | |
| 65 | + * 关联 {@link AiChatModalDO#getId()} 字段 | |
| 66 | + */ | |
| 67 | + private Long modelId; | |
| 68 | + | |
| 69 | + // ========== 会话配置 ========== | |
| 70 | + | |
| 71 | + /** | |
| 72 | + * 温度参数 | |
| 73 | + * | |
| 74 | + * 用于调整生成回复的随机性和多样性程度:较低的温度值会使输出更收敛于高频词汇,较高的则增加多样性 | |
| 75 | + */ | |
| 76 | + private Double temperature; | |
| 77 | + /** | |
| 78 | + * 上下文数量 | |
| 79 | + */ | |
| 80 | + private Integer contextCount; | |
| 81 | + /** | |
| 82 | + * 单条回复的 Token 数量 | |
| 83 | + */ | |
| 84 | + private Integer maxTokens; | |
| 85 | + | |
| 86 | +} | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/chat/AiChatMessageDO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.dal.dataobject.chat; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.ai.chat.messages.MessageType; | |
| 4 | +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | |
| 5 | +import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModalDO; | |
| 6 | +import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO; | |
| 7 | +import cn.iocoder.yudao.module.ai.enums.AiOpenAiModelEnum; | |
| 8 | +import com.baomidou.mybatisplus.annotation.KeySequence; | |
| 9 | +import com.baomidou.mybatisplus.annotation.TableName; | |
| 10 | +import lombok.*; | |
| 11 | + | |
| 12 | +/** | |
| 13 | + * AI Chat 消息 DO | |
| 14 | + * | |
| 15 | + * @since 2024/4/14 17:35 | |
| 16 | + * @since 2024/4/14 17:35 | |
| 17 | + */ | |
| 18 | +@TableName("ai_chat_message") | |
| 19 | +@KeySequence("ai_chat_conversation_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 | |
| 20 | +@Data | |
| 21 | +@EqualsAndHashCode(callSuper = true) | |
| 22 | +@Builder | |
| 23 | +@NoArgsConstructor | |
| 24 | +@AllArgsConstructor | |
| 25 | +public class AiChatMessageDO extends BaseDO { | |
| 26 | + | |
| 27 | + /** | |
| 28 | + * 编号,作为每条聊天记录的唯一标识符 | |
| 29 | + */ | |
| 30 | + private Long id; | |
| 31 | + | |
| 32 | + /** | |
| 33 | + * 会话编号 | |
| 34 | + * | |
| 35 | + * 关联 {@link AiChatConversationDO#getId()} | |
| 36 | + */ | |
| 37 | + private Long conversationId; | |
| 38 | + | |
| 39 | + /** | |
| 40 | + * 消息类型 | |
| 41 | + * | |
| 42 | + * 也等价于 OpenAPI 的 role 字段 | |
| 43 | + * | |
| 44 | + * 枚举 {@link MessageType} | |
| 45 | + */ | |
| 46 | + private String type; | |
| 47 | + /** | |
| 48 | + * 用户编号 | |
| 49 | + * | |
| 50 | + * 仅当 user 发送时非空 | |
| 51 | + * | |
| 52 | + * 关联 AdminUserDO 的 userId 字段 | |
| 53 | + */ | |
| 54 | + private Long userId; | |
| 55 | + /** | |
| 56 | + * 角色编号 | |
| 57 | + * | |
| 58 | + * 仅当 assistant 回复时非空 | |
| 59 | + * | |
| 60 | + * 关联 {@link AiChatRoleDO#getId()} 字段 | |
| 61 | + */ | |
| 62 | + private Long roleId; | |
| 63 | + | |
| 64 | + /** | |
| 65 | + * 模型标志 | |
| 66 | + * | |
| 67 | + * 枚举 {@link AiOpenAiModelEnum} | |
| 68 | + */ | |
| 69 | + private String model; | |
| 70 | + /** | |
| 71 | + * 模型编号 | |
| 72 | + * | |
| 73 | + * 关联 {@link AiChatModalDO#getId()} 字段 | |
| 74 | + */ | |
| 75 | + private Long modelId; | |
| 76 | + | |
| 77 | + /** | |
| 78 | + * 聊天内容 | |
| 79 | + */ | |
| 80 | + private String content; | |
| 81 | + /** | |
| 82 | + * 消耗 Token 数量 | |
| 83 | + */ | |
| 84 | + private Integer usedTokens; | |
| 85 | + | |
| 86 | + // TODO 芋艿:是否作为上下文语料?use_context,待定 | |
| 87 | + | |
| 88 | + // ========== 会话配置 ========== | |
| 89 | + | |
| 90 | + /** | |
| 91 | + * 上下文数量 | |
| 92 | + * | |
| 93 | + * 冗余 {@link AiChatConversationDO#getContextCount()} | |
| 94 | + */ | |
| 95 | + private Integer contextCount; | |
| 96 | + /** | |
| 97 | + * 温度参数 | |
| 98 | + * | |
| 99 | + * 冗余 {@link AiChatConversationDO#getTemperature()} | |
| 100 | + */ | |
| 101 | + private Double temperature; | |
| 102 | + /** | |
| 103 | + * 单条回复的 Token 数量 | |
| 104 | + * | |
| 105 | + * 冗余 {@link AiChatConversationDO#getMaxTokens()} | |
| 106 | + */ | |
| 107 | + private Integer maxTokens; | |
| 108 | + | |
| 109 | +} | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiImageDO.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/image/AiImageDO.java
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiApiKeyDO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.dal.dataobject.model; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.ai.AiPlatformEnum; | |
| 4 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | |
| 5 | +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | |
| 6 | +import com.baomidou.mybatisplus.annotation.KeySequence; | |
| 7 | +import com.baomidou.mybatisplus.annotation.TableId; | |
| 8 | +import com.baomidou.mybatisplus.annotation.TableName; | |
| 9 | +import lombok.*; | |
| 10 | + | |
| 11 | +/** | |
| 12 | + * AI API 秘钥 DO | |
| 13 | + * | |
| 14 | + * @author 芋道源码 | |
| 15 | + */ | |
| 16 | +@TableName("ai_api_key") | |
| 17 | +@KeySequence("ai_chat_conversation_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 | |
| 18 | +@Data | |
| 19 | +@EqualsAndHashCode(callSuper = true) | |
| 20 | +@Builder | |
| 21 | +@NoArgsConstructor | |
| 22 | +@AllArgsConstructor | |
| 23 | +public class AiApiKeyDO extends BaseDO { | |
| 24 | + | |
| 25 | + /** | |
| 26 | + * 编号 | |
| 27 | + */ | |
| 28 | + @TableId | |
| 29 | + private Long id; | |
| 30 | + /** | |
| 31 | + * 名称 | |
| 32 | + */ | |
| 33 | + private String name; | |
| 34 | + /** | |
| 35 | + * 平台 | |
| 36 | + * | |
| 37 | + * 枚举 {@link AiPlatformEnum} | |
| 38 | + */ | |
| 39 | + private String platform; | |
| 40 | + /** | |
| 41 | + * 用途 | |
| 42 | + * | |
| 43 | + * TODO 芋艿:枚举;chat、image | |
| 44 | + */ | |
| 45 | + private Integer type; | |
| 46 | + /** | |
| 47 | + * API 地址 | |
| 48 | + */ | |
| 49 | + private String url; | |
| 50 | + /** | |
| 51 | + * 状态 | |
| 52 | + * | |
| 53 | + * 枚举 {@link CommonStatusEnum} | |
| 54 | + */ | |
| 55 | + private Integer status; | |
| 56 | + | |
| 57 | + // TODO 芋艿:proxyUrl 代理地址 | |
| 58 | + | |
| 59 | +} | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiChatModalDO.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiChatModalDO.java
| 1 | -package cn.iocoder.yudao.module.ai.dal.dataobject; | |
| 1 | +package cn.iocoder.yudao.module.ai.dal.dataobject.model; | |
| 2 | 2 | |
| 3 | +import cn.iocoder.yudao.framework.ai.AiPlatformEnum; | |
| 4 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | |
| 3 | 5 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 6 | +import com.baomidou.mybatisplus.annotation.TableId; | |
| 4 | 7 | import com.baomidou.mybatisplus.annotation.TableName; |
| 5 | 8 | import lombok.Data; |
| 6 | 9 | import lombok.experimental.Accessors; |
| 7 | 10 | |
| 8 | 11 | /** |
| 9 | - * ai 模型 | |
| 12 | + * AI 聊天模型 DO | |
| 10 | 13 | * |
| 11 | 14 | * @author fansili |
| 12 | 15 | * @time 2024/4/24 19:39 |
| ... | ... | @@ -20,36 +23,53 @@ public class AiChatModalDO extends BaseDO { |
| 20 | 23 | /** |
| 21 | 24 | * 编号 |
| 22 | 25 | */ |
| 26 | + @TableId | |
| 23 | 27 | private Long id; |
| 24 | 28 | /** |
| 25 | - * 名字 | |
| 29 | + * API 秘钥编号 | |
| 30 | + * | |
| 31 | + * 关联 {@link AiApiKeyDO#getId()} | |
| 32 | + */ | |
| 33 | + private Long key_id; | |
| 34 | + /** | |
| 35 | + * 模型名称 | |
| 26 | 36 | */ |
| 27 | 37 | private String name; |
| 28 | 38 | /** |
| 29 | - * 类型 | |
| 30 | - * {@link cn.iocoder.yudao.framework.ai.chatyiyan.YiYanChatModel} | |
| 31 | - * {@link cn.iocoder.yudao.framework.ai.chatxinghuo.XingHuoChatModel} | |
| 39 | + * 模型标志 | |
| 32 | 40 | */ |
| 33 | - private String modal; | |
| 41 | + private String model; | |
| 34 | 42 | /** |
| 35 | - * 平台 参考:{@link cn.iocoder.yudao.framework.ai.AiPlatformEnum} | |
| 43 | + * 平台 | |
| 44 | + * | |
| 45 | + * 枚举 {@link AiPlatformEnum} | |
| 36 | 46 | */ |
| 37 | 47 | private String platform; |
| 48 | + | |
| 38 | 49 | /** |
| 39 | - * 图片地址 | |
| 50 | + * 排序值 | |
| 40 | 51 | */ |
| 41 | - private String imageUrl; | |
| 52 | + private Integer sort; | |
| 42 | 53 | /** |
| 43 | - * 禁用 0、正常 1、禁用 | |
| 54 | + * 状态 | |
| 55 | + * | |
| 56 | + * 枚举 {@link CommonStatusEnum} | |
| 44 | 57 | */ |
| 45 | - private Integer disable; | |
| 58 | + private Integer status; | |
| 59 | + | |
| 60 | + // ========== 会话配置 ========== | |
| 61 | + | |
| 46 | 62 | /** |
| 47 | - * 排序 | |
| 63 | + * 温度参数 | |
| 64 | + * | |
| 65 | + * 用于调整生成回复的随机性和多样性程度:较低的温度值会使输出更收敛于高频词汇,较高的则增加多样性 | |
| 48 | 66 | */ |
| 49 | - private Integer sort; | |
| 67 | + private Double temperature; | |
| 50 | 68 | /** |
| 51 | - * modal 配置(json) | |
| 69 | + * 单条回复的 Token 数量 | |
| 52 | 70 | */ |
| 53 | - private String config; | |
| 71 | + private Integer maxTokens; | |
| 72 | + | |
| 73 | + // TODO 芋艿:到底使用 max_context、还是 contextCount,待定!一个是轮次,一个是长度数量;貌似轮次更常用一点; | |
| 54 | 74 | |
| 55 | 75 | } | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiChatRoleDO.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiChatRoleDO.java
| 1 | -package cn.iocoder.yudao.module.ai.dal.dataobject; | |
| 1 | +package cn.iocoder.yudao.module.ai.dal.dataobject.model; | |
| 2 | 2 | |
| 3 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | |
| 3 | 4 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 4 | 5 | import com.baomidou.mybatisplus.annotation.IdType; |
| 5 | 6 | import com.baomidou.mybatisplus.annotation.TableId; |
| ... | ... | @@ -17,40 +18,65 @@ import lombok.experimental.Accessors; |
| 17 | 18 | @Accessors(chain = true) |
| 18 | 19 | @TableName("ai_chat_role") |
| 19 | 20 | public class AiChatRoleDO extends BaseDO { |
| 21 | + | |
| 20 | 22 | /** |
| 21 | - * 编号,表示聊天角色在数据库中的唯一标识符 | |
| 23 | + * 编号 | |
| 22 | 24 | */ |
| 23 | - @TableId(type = IdType.AUTO) | |
| 25 | + @TableId | |
| 24 | 26 | private Long id; |
| 25 | - | |
| 26 | 27 | /** |
| 27 | - * 用户ID,关联到使用该聊天角色的用户 | |
| 28 | + * 角色名称 | |
| 28 | 29 | */ |
| 29 | - private Long userId; | |
| 30 | - | |
| 30 | + private String name; | |
| 31 | 31 | /** |
| 32 | - * 角色名,角色的显示名称 | |
| 32 | + * 角色头像 | |
| 33 | 33 | */ |
| 34 | - private String name; | |
| 34 | + private String avatar; | |
| 35 | + /** | |
| 36 | + * 角色分类 | |
| 37 | + */ | |
| 38 | + private String category; | |
| 39 | + /** | |
| 40 | + * 角色描述 | |
| 41 | + */ | |
| 42 | + private String description; | |
| 43 | + /** | |
| 44 | + * 角色欢迎语 | |
| 45 | + */ | |
| 46 | + private String welcomeMessage; | |
| 35 | 47 | |
| 36 | 48 | /** |
| 37 | - * 角色介绍,详细描述角色的功能或用途 | |
| 49 | + * 用户编号 | |
| 50 | + * | |
| 51 | + * 关联 AdminUserDO 的 userId 字段 | |
| 38 | 52 | */ |
| 39 | - private String introduce; | |
| 53 | + private Long userId; | |
| 40 | 54 | |
| 41 | 55 | /** |
| 42 | - * 分类,角色所属的类别,如娱乐、创作等 | |
| 56 | + * 模型编号 | |
| 57 | + * | |
| 58 | + * 关联 {@link AiChatModalDO#getId()} 字段 | |
| 43 | 59 | */ |
| 44 | - private String classify; | |
| 60 | + private String modelId; | |
| 45 | 61 | |
| 46 | 62 | /** |
| 47 | - * 是否开启 open、close | |
| 63 | + * 是否公开 | |
| 64 | + * | |
| 65 | + * true - 公开;false - 私有 | |
| 48 | 66 | */ |
| 49 | - private String enable; | |
| 67 | + private Boolean publicStatus; | |
| 50 | 68 | |
| 51 | 69 | /** |
| 52 | - * 角色的使用次数统计 | |
| 70 | + * 排序值 | |
| 71 | + */ | |
| 72 | + private Integer sort; | |
| 73 | + /** | |
| 74 | + * 状态 | |
| 75 | + * | |
| 76 | + * 枚举 {@link CommonStatusEnum} | |
| 53 | 77 | */ |
| 54 | - private Integer useCount; | |
| 78 | + private Integer status; | |
| 79 | + | |
| 80 | + // TODO 芋艿:要不要加一个 context,内置的上下文 | |
| 55 | 81 | |
| 56 | 82 | } | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiChatConversationMapper.java
| ... | ... | @@ -5,7 +5,7 @@ import cn.hutool.core.util.StrUtil; |
| 5 | 5 | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| 6 | 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 7 | 7 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 8 | -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatConversationDO; | |
| 8 | +import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO; | |
| 9 | 9 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| 10 | 10 | import org.apache.ibatis.annotations.Mapper; |
| 11 | 11 | import org.apache.ibatis.annotations.Param; | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiChatMessageMapper.java
| ... | ... | @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.ai.mapper; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 4 | 4 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 5 | -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatMessageDO; | |
| 5 | +import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatMessageDO; | |
| 6 | 6 | import org.apache.ibatis.annotations.Mapper; |
| 7 | 7 | import org.springframework.stereotype.Repository; |
| 8 | 8 | |
| ... | ... | @@ -24,7 +24,7 @@ public interface AiChatMessageMapper extends BaseMapperX<AiChatMessageDO> { |
| 24 | 24 | */ |
| 25 | 25 | default int deleteByConversationAndId(Long chatConversationId, Long id) { |
| 26 | 26 | return this.delete(new LambdaQueryWrapperX<AiChatMessageDO>() |
| 27 | - .eq(AiChatMessageDO::getChatConversationId, chatConversationId) | |
| 27 | + .eq(AiChatMessageDO::getConversationId, chatConversationId) | |
| 28 | 28 | .eq(AiChatMessageDO::getId, id) |
| 29 | 29 | ); |
| 30 | 30 | } | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiChatModalMapper.java
| ... | ... | @@ -5,7 +5,6 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| 5 | 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 6 | 6 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 7 | 7 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 8 | -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatModalDO; | |
| 9 | 8 | import org.apache.ibatis.annotations.Mapper; |
| 10 | 9 | import org.springframework.stereotype.Repository; |
| 11 | 10 | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiChatRoleMapper.java
| 1 | 1 | package cn.iocoder.yudao.module.ai.mapper; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 4 | -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatRoleDO; | |
| 4 | +import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO; | |
| 5 | 5 | import org.apache.ibatis.annotations.Mapper; |
| 6 | 6 | import org.springframework.stereotype.Repository; |
| 7 | 7 | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiImageMapper.java
| 1 | 1 | package cn.iocoder.yudao.module.ai.mapper; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 4 | -import cn.iocoder.yudao.module.ai.dal.dataobject.AiImageDO; | |
| 4 | +import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; | |
| 5 | 5 | import org.apache.ibatis.annotations.Mapper; |
| 6 | 6 | import org.springframework.stereotype.Repository; |
| 7 | 7 | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatConversationServiceImpl.java
| ... | ... | @@ -4,8 +4,6 @@ import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; |
| 4 | 4 | import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; |
| 5 | 5 | import cn.iocoder.yudao.module.ai.ErrorCodeConstants; |
| 6 | 6 | import cn.iocoder.yudao.module.ai.convert.AiChatConversationConvert; |
| 7 | -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatConversationDO; | |
| 8 | -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatModalDO; | |
| 9 | 7 | import cn.iocoder.yudao.module.ai.enums.AiChatConversationTypeEnum; |
| 10 | 8 | import cn.iocoder.yudao.module.ai.enums.AiChatModalDisableEnum; |
| 11 | 9 | import cn.iocoder.yudao.module.ai.mapper.AiChatConversationMapper; | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatMessageServiceImpl.java
| ... | ... | @@ -6,8 +6,8 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 6 | 6 | import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; |
| 7 | 7 | import cn.iocoder.yudao.module.ai.ErrorCodeConstants; |
| 8 | 8 | import cn.iocoder.yudao.module.ai.convert.AiChatMessageConvert; |
| 9 | -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatConversationDO; | |
| 10 | -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatMessageDO; | |
| 9 | +import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO; | |
| 10 | +import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatMessageDO; | |
| 11 | 11 | import cn.iocoder.yudao.module.ai.mapper.AiChatConversationMapper; |
| 12 | 12 | import cn.iocoder.yudao.module.ai.mapper.AiChatMessageMapper; |
| 13 | 13 | import cn.iocoder.yudao.module.ai.service.AiChatMessageService; |
| ... | ... | @@ -38,7 +38,7 @@ public class AiChatMessageServiceImpl implements AiChatMessageService { |
| 38 | 38 | public PageResult<AiChatMessageListRes> list(AiChatMessageReq req) { |
| 39 | 39 | // 查询 |
| 40 | 40 | LambdaQueryWrapperX<AiChatMessageDO> queryWrapperX = new LambdaQueryWrapperX<>(); |
| 41 | - queryWrapperX.eq(AiChatMessageDO::getChatConversationId, req.getChatConversationId()); | |
| 41 | + queryWrapperX.eq(AiChatMessageDO::getConversationId, req.getChatConversationId()); | |
| 42 | 42 | // 默认排序 |
| 43 | 43 | queryWrapperX.orderByDesc(AiChatMessageDO::getId); |
| 44 | 44 | PageResult<AiChatMessageDO> pageResult = aiChatMessageMapper.selectPage(req, queryWrapperX); | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatModalServiceImpl.java
| ... | ... | @@ -12,7 +12,6 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; |
| 12 | 12 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 13 | 13 | import cn.iocoder.yudao.module.ai.ErrorCodeConstants; |
| 14 | 14 | import cn.iocoder.yudao.module.ai.convert.AiChatModalConvert; |
| 15 | -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatModalDO; | |
| 16 | 15 | import cn.iocoder.yudao.module.ai.dal.vo.AiChatModalChatConfigVO; |
| 17 | 16 | import cn.iocoder.yudao.module.ai.dal.vo.AiChatModalConfigVO; |
| 18 | 17 | import cn.iocoder.yudao.module.ai.dal.vo.AiChatModalDallConfigVO; | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatRoleServiceImpl.java
| ... | ... | @@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 7 | 7 | import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; |
| 8 | 8 | import cn.iocoder.yudao.module.ai.ErrorCodeConstants; |
| 9 | 9 | import cn.iocoder.yudao.module.ai.convert.AiChatRoleConvert; |
| 10 | -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatRoleDO; | |
| 10 | +import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO; | |
| 11 | 11 | import cn.iocoder.yudao.module.ai.enums.AiChatRoleClassifyEnum; |
| 12 | 12 | import cn.iocoder.yudao.module.ai.enums.AiChatRoleEnableEnum; |
| 13 | 13 | import cn.iocoder.yudao.module.ai.mapper.AiChatRoleMapper; | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatServiceImpl.java
| ... | ... | @@ -10,7 +10,7 @@ import cn.iocoder.yudao.framework.ai.chat.prompt.Prompt; |
| 10 | 10 | import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; |
| 11 | 11 | import cn.iocoder.yudao.module.ai.config.AiChatClientFactory; |
| 12 | 12 | import cn.iocoder.yudao.module.ai.controller.Utf8SseEmitter; |
| 13 | -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatMessageDO; | |
| 13 | +import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatMessageDO; | |
| 14 | 14 | import cn.iocoder.yudao.module.ai.mapper.AiChatConversationMapper; |
| 15 | 15 | import cn.iocoder.yudao.module.ai.mapper.AiChatMessageMapper; |
| 16 | 16 | import cn.iocoder.yudao.module.ai.mapper.AiChatRoleMapper; |
| ... | ... | @@ -89,7 +89,7 @@ public class AiChatServiceImpl implements AiChatService { |
| 89 | 89 | aiChatMessageMapper.insert( |
| 90 | 90 | new AiChatMessageDO() |
| 91 | 91 | .setId(null) |
| 92 | - .setChatConversationId(chatConversationId) | |
| 92 | + .setConversationId(chatConversationId) | |
| 93 | 93 | .setUserId(loginUserId) |
| 94 | 94 | .setMessage(req.getPrompt()) |
| 95 | 95 | .setMessageType(MessageType.USER.getValue()) |
| ... | ... | @@ -107,7 +107,7 @@ public class AiChatServiceImpl implements AiChatService { |
| 107 | 107 | aiChatMessageMapper.insert( |
| 108 | 108 | new AiChatMessageDO() |
| 109 | 109 | .setId(null) |
| 110 | - .setChatConversationId(chatConversationId) | |
| 110 | + .setConversationId(chatConversationId) | |
| 111 | 111 | .setUserId(loginUserId) |
| 112 | 112 | .setMessage(systemPrompts) |
| 113 | 113 | .setMessageType(MessageType.SYSTEM.getValue()) | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiImageServiceImpl.java
| ... | ... | @@ -15,7 +15,7 @@ import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; |
| 15 | 15 | import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; |
| 16 | 16 | import cn.iocoder.yudao.module.ai.ErrorCodeConstants; |
| 17 | 17 | import cn.iocoder.yudao.module.ai.controller.Utf8SseEmitter; |
| 18 | -import cn.iocoder.yudao.module.ai.dal.dataobject.AiImageDO; | |
| 18 | +import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; | |
| 19 | 19 | import cn.iocoder.yudao.module.ai.enums.AiChatDrawingStatusEnum; |
| 20 | 20 | import cn.iocoder.yudao.module.ai.mapper.AiImageMapper; |
| 21 | 21 | import cn.iocoder.yudao.module.ai.service.AiImageService; | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/midjourneyHandler/YuDaoMidjourneyMessageHandler.java
| ... | ... | @@ -5,7 +5,7 @@ import cn.hutool.core.util.StrUtil; |
| 5 | 5 | import cn.iocoder.yudao.framework.ai.midjourney.MidjourneyMessage; |
| 6 | 6 | import cn.iocoder.yudao.framework.ai.midjourney.constants.MidjourneyGennerateStatusEnum; |
| 7 | 7 | import cn.iocoder.yudao.framework.ai.midjourney.webSocket.MidjourneyMessageHandler; |
| 8 | -import cn.iocoder.yudao.module.ai.dal.dataobject.AiImageDO; | |
| 8 | +import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; | |
| 9 | 9 | import cn.iocoder.yudao.module.ai.enums.AiChatDrawingStatusEnum; |
| 10 | 10 | import cn.iocoder.yudao.module.ai.mapper.AiImageMapper; |
| 11 | 11 | import com.alibaba.fastjson2.JSON; | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatModalListRes.java