Sfoglia il codice sorgente

【代码评审】AI:调整表结构

zhijiantianya@gmail.com 1 anno fa
parent
commit
e9cbee9d7e
33 ha cambiato i file con 467 aggiunte e 254 eliminazioni
  1. 5 10
      yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiOpenAiModelEnum.java
  2. 17 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatConversationControllerV2.java
  3. 1 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/package-info.java
  4. 4 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/package-info.java
  5. 4 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/app/package-info.java
  6. 6 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/package-info.java
  7. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatConversationConvert.java
  8. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatMessageConvert.java
  9. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatModalConvert.java
  10. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatRoleConvert.java
  11. 0 47
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiChatConversationDO.java
  12. 0 62
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiChatMessageDO.java
  13. 0 55
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiChatModalDO.java
  14. 0 56
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiChatRoleDO.java
  15. 86 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/chat/AiChatConversationDO.java
  16. 109 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/chat/AiChatMessageDO.java
  17. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/image/AiImageDO.java
  18. 59 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiApiKeyDO.java
  19. 75 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiChatModalDO.java
  20. 82 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiChatRoleDO.java
  21. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiChatConversationMapper.java
  22. 2 2
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiChatMessageMapper.java
  23. 0 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiChatModalMapper.java
  24. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiChatRoleMapper.java
  25. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiImageMapper.java
  26. 0 2
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatConversationServiceImpl.java
  27. 3 3
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatMessageServiceImpl.java
  28. 0 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatModalServiceImpl.java
  29. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatRoleServiceImpl.java
  30. 3 3
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatServiceImpl.java
  31. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiImageServiceImpl.java
  32. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/midjourneyHandler/YuDaoMidjourneyMessageHandler.java
  33. 0 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatModalListRes.java

+ 5 - 10
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;
 import lombok.Getter;
 
 // TODO done @fansili:1)类注释要加下;2)author 和 time 用 javadoc,@author 和 @since;3)@AllArgsConstructor 使用这个注解,去掉构造方法;4)value 改成 model 字段,然后注释都写下哈;5)message 改成 name,然后注释都写下哈
+// TODO @fan: AiModelEnum 是不是可以缩写成这个哈;所有的模型,都写在这里枚举;
 /**
  * @author: fansili
  * @time: 2024/3/4 12:36
@@ -12,24 +13,18 @@ import lombok.Getter;
 @AllArgsConstructor
 public enum AiOpenAiModelEnum {
 
-    /**
-     * open ai 3.5模型
-     */
+
     OPEN_AI_GPT_3_5("gpt-3.5-turbo", "GPT3.5"),
-    /**
-     * open ai 4.0 收费模型
-     */
     OPEN_AI_GPT_4("gpt-4-turbo", "GPT4")
-
     ;
 
     /**
-     * 模型 - 用于参数传递
+     * 模型标志 - 用于参数传递
      */
-    private String model;
+    private final String model;
     /**
      * 模型名字 - 用于展示
      */
-    private String name;
+    private final String name;
 
 }

+ 17 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatConversationControllerV2.java

@@ -0,0 +1,17 @@
+package cn.iocoder.yudao.module.ai.controller.admin.chat;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Tag(name = "管理后台 - 聊天会话")
+@RestController
+@RequestMapping("/ai/chat/conversation")
+@Slf4j
+public class AiChatConversationControllerV2 {
+
+    public CommonResult<List<>>
+
+}

+ 1 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/package-info.java

@@ -0,0 +1 @@
+package cn.iocoder.yudao.module.ai.controller.admin.chat.vo;

+ 4 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * TODO 芋艿:站位,无特殊作用
+ */
+package cn.iocoder.yudao.module.ai.controller.admin;

+ 4 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/app/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * TODO 芋艿:站位,无特殊作用
+ */
+package cn.iocoder.yudao.module.ai.controller.app;

+ 6 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/package-info.java

@@ -0,0 +1,6 @@
+/**
+ * 提供 RESTful API 给前端:
+ * 1. admin 包:提供给管理后台 yudao-ui-admin 前端项目
+ * 2. app 包:提供给用户 APP yudao-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分
+ */
+package cn.iocoder.yudao.module.ai.controller;

+ 1 - 1
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatConversationConvert.java

@@ -1,6 +1,6 @@
 package cn.iocoder.yudao.module.ai.convert;
 
-import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatConversationDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO;
 import cn.iocoder.yudao.module.ai.vo.AiChatConversationRes;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;

+ 1 - 1
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatMessageConvert.java

@@ -1,6 +1,6 @@
 package cn.iocoder.yudao.module.ai.convert;
 
-import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatMessageDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatMessageDO;
 import cn.iocoder.yudao.module.ai.vo.AiChatMessageListRes;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;

+ 1 - 1
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatModalConvert.java

@@ -1,6 +1,6 @@
 package cn.iocoder.yudao.module.ai.convert;
 
-import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatModalDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModalDO;
 import cn.iocoder.yudao.module.ai.vo.AiChatModalAddReq;
 import cn.iocoder.yudao.module.ai.vo.AiChatModalListRes;
 import cn.iocoder.yudao.module.ai.vo.AiChatModalRes;

+ 1 - 1
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatRoleConvert.java

@@ -1,6 +1,6 @@
 package cn.iocoder.yudao.module.ai.convert;
 
-import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatRoleDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
 import cn.iocoder.yudao.module.ai.vo.AiChatRoleAddReq;
 import cn.iocoder.yudao.module.ai.vo.AiChatRoleRes;
 import cn.iocoder.yudao.module.ai.vo.AiChatRoleUpdateReq;

+ 0 - 47
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiChatConversationDO.java

@@ -1,47 +0,0 @@
-package cn.iocoder.yudao.module.ai.dal.dataobject;
-
-import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
-import com.baomidou.mybatisplus.annotation.TableName;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * chat 交谈
- *
- * @author fansili
- * @time 2024/4/14 17:35
- * @since 1.0
- */
-@Data
-@Accessors(chain = true)
-@TableName("ai_chat_conversation")
-public class AiChatConversationDO extends BaseDO {
-
-    @Schema(description = "id")
-    private Long id;
-
-    @Schema(description = "用户id")
-    private Long userId;
-
-    @Schema(description = "chat角色Id")
-    private Long roleId;
-
-    @Schema(description = "chat角色名称")
-    private String roleName;
-
-    @Schema(description = "模型id")
-    private Long modalId;
-
-    @Schema(description = "使用的模型")
-    private String modal;
-
-    @Schema(description = "标题")
-    private String title;
-
-    @Schema(description = "对话类型(roleChat、userChat)")
-    private String type;
-
-    @Schema(description = "聊天次数(有程序自动生成)")
-    private Integer chatCount;
-}

+ 0 - 62
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiChatMessageDO.java

@@ -1,62 +0,0 @@
-package cn.iocoder.yudao.module.ai.dal.dataobject;
-
-import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * ai 聊天 message
- *
- * @fansili
- * @since v1.0
- */
-@Data
-@Accessors(chain = true)
-@TableName("ai_chat_message")
-public class AiChatMessageDO extends BaseDO {
-
-    /**
-     * 编号,作为每条聊天记录的唯一标识符
-     */
-    private Long id;
-
-    /**
-     * 聊天ID,关联到特定的会话或对话
-     */
-    private Long chatConversationId;
-
-    /**
-     * 角色ID,用于标识发送消息的用户或系统的身份
-     */
-    private Long userId;
-
-    /**
-     * 消息具体内容,存储用户的发言或者系统响应的文字信息
-     */
-    private String message;
-
-    /**
-     * 消息类型,枚举值可能包括'system'(系统消息)、'user'(用户消息)和'assistant'(助手消息)
-     */
-    private String messageType;
-
-    /**
-     * 在生成消息时采用的Top-K采样大小,
-     * 表示模型生成回复时考虑的候选项集合的大小
-     */
-    private Double topK;
-
-    /**
-     * Top-P核采样方法的概率阈值,
-     * 在语言模型生成过程中控制采样的过滤标准
-     */
-    private Double topP;
-
-    /**
-     * 温度参数,用于调整生成回复的随机性和多样性程度,
-     * 较低的温度值会使输出更收敛于高频词汇,较高的则增加多样性
-     */
-    private Double temperature;
-
-}

+ 0 - 55
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiChatModalDO.java

@@ -1,55 +0,0 @@
-package cn.iocoder.yudao.module.ai.dal.dataobject;
-
-import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * ai 模型
- *
- * @author fansili
- * @time 2024/4/24 19:39
- * @since 1.0
- */
-@Data
-@Accessors(chain = true)
-@TableName("ai_chat_modal")
-public class AiChatModalDO extends BaseDO {
-
-    /**
-     * 编号
-     */
-    private Long id;
-    /**
-     * 名字
-     */
-    private String name;
-    /**
-     * 类型
-     * {@link cn.iocoder.yudao.framework.ai.chatyiyan.YiYanChatModel}
-     * {@link cn.iocoder.yudao.framework.ai.chatxinghuo.XingHuoChatModel}
-     */
-    private String modal;
-    /**
-     * 平台 参考:{@link cn.iocoder.yudao.framework.ai.AiPlatformEnum}
-     */
-    private String platform;
-    /**
-     * 图片地址
-     */
-    private String imageUrl;
-    /**
-     * 禁用 0、正常 1、禁用
-     */
-    private Integer disable;
-    /**
-     * 排序
-     */
-    private Integer sort;
-    /**
-     * modal 配置(json)
-     */
-    private String config;
-
-}

+ 0 - 56
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiChatRoleDO.java

@@ -1,56 +0,0 @@
-package cn.iocoder.yudao.module.ai.dal.dataobject;
-
-import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * ai 聊天角色
- *
- * @fansili
- * @since v1.0
- */
-@Data
-@Accessors(chain = true)
-@TableName("ai_chat_role")
-public class AiChatRoleDO extends BaseDO {
-    /**
-     * 编号,表示聊天角色在数据库中的唯一标识符
-     */
-    @TableId(type = IdType.AUTO)
-    private Long id;
-
-    /**
-     * 用户ID,关联到使用该聊天角色的用户
-     */
-    private Long userId;
-
-    /**
-     * 角色名,角色的显示名称
-     */
-    private String name;
-
-    /**
-     * 角色介绍,详细描述角色的功能或用途
-     */
-    private String introduce;
-
-    /**
-     * 分类,角色所属的类别,如娱乐、创作等
-     */
-    private String classify;
-
-    /**
-     * 是否开启 open、close
-     */
-    private String enable;
-
-    /**
-     * 角色的使用次数统计
-     */
-    private Integer useCount;
-
-}

+ 86 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/chat/AiChatConversationDO.java

@@ -0,0 +1,86 @@
+package cn.iocoder.yudao.module.ai.dal.dataobject.chat;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModalDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
+import cn.iocoder.yudao.module.ai.enums.AiOpenAiModelEnum;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * AI Chat 会话 DO
+ *
+ * 用户每次发起 Chat 聊天时,会创建一个 {@link AiChatConversationDO} 对象,将它的消息关联在一起
+ *
+ * @author fansili
+ * @since 2024/4/14 17:35
+ */
+@TableName("ai_chat_conversation")
+@KeySequence("ai_chat_conversation_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AiChatConversationDO extends BaseDO {
+
+    /**
+     * ID 编号,自增
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 用户编号
+     *
+     * 关联 AdminUserDO 的 userId 字段
+     */
+    private Long userId;
+
+    /**
+     * 标题
+     *
+     * 默认由系统自动生成,可用户手动修改
+     */
+    private String title;
+
+    /**
+     * 角色编号
+     *
+     * 关联 {@link AiChatRoleDO#getId()}
+     */
+    private Long roleId;
+    /**
+     * 模型标志
+     *
+     * 枚举 {@link AiOpenAiModelEnum}
+     */
+    private String model;
+
+    /**
+     * 模型编号
+     *
+     * 关联 {@link AiChatModalDO#getId()} 字段
+     */
+    private Long modelId;
+
+    // ========== 会话配置 ==========
+
+    /**
+     * 温度参数
+     *
+     * 用于调整生成回复的随机性和多样性程度:较低的温度值会使输出更收敛于高频词汇,较高的则增加多样性
+     */
+    private Double temperature;
+    /**
+     * 上下文数量
+     */
+    private Integer contextCount;
+    /**
+     * 单条回复的 Token 数量
+     */
+    private Integer maxTokens;
+
+}

+ 109 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/chat/AiChatMessageDO.java

@@ -0,0 +1,109 @@
+package cn.iocoder.yudao.module.ai.dal.dataobject.chat;
+
+import cn.iocoder.yudao.framework.ai.chat.messages.MessageType;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModalDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
+import cn.iocoder.yudao.module.ai.enums.AiOpenAiModelEnum;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * AI Chat 消息 DO
+ *
+ * @since 2024/4/14 17:35
+ * @since 2024/4/14 17:35
+ */
+@TableName("ai_chat_message")
+@KeySequence("ai_chat_conversation_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AiChatMessageDO extends BaseDO {
+
+    /**
+     * 编号,作为每条聊天记录的唯一标识符
+     */
+    private Long id;
+
+    /**
+     * 会话编号
+     *
+     * 关联 {@link AiChatConversationDO#getId()}
+     */
+    private Long conversationId;
+
+    /**
+     * 消息类型
+     *
+     * 也等价于 OpenAPI 的 role 字段
+     *
+     * 枚举 {@link MessageType}
+     */
+    private String type;
+    /**
+     * 用户编号
+     *
+     * 仅当 user 发送时非空
+     *
+     * 关联 AdminUserDO 的 userId 字段
+     */
+    private Long userId;
+    /**
+     * 角色编号
+     *
+     * 仅当 assistant 回复时非空
+     *
+     * 关联 {@link AiChatRoleDO#getId()} 字段
+     */
+    private Long roleId;
+
+    /**
+     * 模型标志
+     *
+     * 枚举 {@link AiOpenAiModelEnum}
+     */
+    private String model;
+    /**
+     * 模型编号
+     *
+     * 关联 {@link AiChatModalDO#getId()} 字段
+     */
+    private Long modelId;
+
+    /**
+     * 聊天内容
+     */
+    private String content;
+    /**
+     * 消耗 Token 数量
+     */
+    private Integer usedTokens;
+
+    // TODO 芋艿:是否作为上下文语料?use_context,待定
+
+    // ========== 会话配置 ==========
+
+    /**
+     * 上下文数量
+     *
+     * 冗余 {@link AiChatConversationDO#getContextCount()}
+     */
+    private Integer contextCount;
+    /**
+     * 温度参数
+     *
+     * 冗余 {@link AiChatConversationDO#getTemperature()}
+     */
+    private Double temperature;
+    /**
+     * 单条回复的 Token 数量
+     *
+     * 冗余 {@link AiChatConversationDO#getMaxTokens()}
+     */
+    private Integer maxTokens;
+
+}

+ 1 - 1
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiImageDO.java → yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/image/AiImageDO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.ai.dal.dataobject;
+package cn.iocoder.yudao.module.ai.dal.dataobject.image;
 
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
 import com.baomidou.mybatisplus.annotation.IdType;

+ 59 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiApiKeyDO.java

@@ -0,0 +1,59 @@
+package cn.iocoder.yudao.module.ai.dal.dataobject.model;
+
+import cn.iocoder.yudao.framework.ai.AiPlatformEnum;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * AI API 秘钥 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("ai_api_key")
+@KeySequence("ai_chat_conversation_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AiApiKeyDO extends BaseDO {
+
+    /**
+     * 编号
+     */
+    @TableId
+    private Long id;
+    /**
+     * 名称
+     */
+    private String name;
+    /**
+     * 平台
+     *
+     * 枚举 {@link AiPlatformEnum}
+     */
+    private String platform;
+    /**
+     * 用途
+     *
+     * TODO 芋艿:枚举;chat、image
+     */
+    private Integer type;
+    /**
+     * API 地址
+     */
+    private String url;
+    /**
+     * 状态
+     *
+     * 枚举 {@link CommonStatusEnum}
+     */
+    private Integer status;
+
+    // TODO 芋艿:proxyUrl 代理地址
+
+}

+ 75 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiChatModalDO.java

@@ -0,0 +1,75 @@
+package cn.iocoder.yudao.module.ai.dal.dataobject.model;
+
+import cn.iocoder.yudao.framework.ai.AiPlatformEnum;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * AI 聊天模型 DO
+ *
+ * @author fansili
+ * @time 2024/4/24 19:39
+ * @since 1.0
+ */
+@Data
+@Accessors(chain = true)
+@TableName("ai_chat_modal")
+public class AiChatModalDO extends BaseDO {
+
+    /**
+     * 编号
+     */
+    @TableId
+    private Long id;
+    /**
+     * API 秘钥编号
+     *
+     * 关联 {@link AiApiKeyDO#getId()}
+     */
+    private Long key_id;
+    /**
+     * 模型名称
+     */
+    private String name;
+    /**
+     * 模型标志
+     */
+    private String model;
+    /**
+     * 平台
+     *
+     * 枚举 {@link AiPlatformEnum}
+     */
+    private String platform;
+
+    /**
+     * 排序值
+     */
+    private Integer sort;
+    /**
+     * 状态
+     *
+     * 枚举 {@link CommonStatusEnum}
+     */
+    private Integer status;
+
+    // ========== 会话配置 ==========
+
+    /**
+     * 温度参数
+     *
+     * 用于调整生成回复的随机性和多样性程度:较低的温度值会使输出更收敛于高频词汇,较高的则增加多样性
+     */
+    private Double temperature;
+    /**
+     * 单条回复的 Token 数量
+     */
+    private Integer maxTokens;
+
+    // TODO 芋艿:到底使用 max_context、还是 contextCount,待定!一个是轮次,一个是长度数量;貌似轮次更常用一点;
+
+}

+ 82 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiChatRoleDO.java

@@ -0,0 +1,82 @@
+package cn.iocoder.yudao.module.ai.dal.dataobject.model;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * ai 聊天角色
+ *
+ * @fansili
+ * @since v1.0
+ */
+@Data
+@Accessors(chain = true)
+@TableName("ai_chat_role")
+public class AiChatRoleDO extends BaseDO {
+
+    /**
+     * 编号
+     */
+    @TableId
+    private Long id;
+    /**
+     * 角色名称
+     */
+    private String name;
+    /**
+     * 角色头像
+     */
+    private String avatar;
+    /**
+     * 角色分类
+     */
+    private String category;
+    /**
+     * 角色描述
+     */
+    private String description;
+    /**
+     * 角色欢迎语
+     */
+    private String welcomeMessage;
+
+    /**
+     * 用户编号
+     *
+     * 关联 AdminUserDO 的 userId 字段
+     */
+    private Long userId;
+
+    /**
+     * 模型编号
+     *
+     * 关联 {@link AiChatModalDO#getId()} 字段
+     */
+    private String modelId;
+
+    /**
+     * 是否公开
+     *
+     * true - 公开;false - 私有
+     */
+    private Boolean publicStatus;
+
+    /**
+     * 排序值
+     */
+    private Integer sort;
+    /**
+     * 状态
+     *
+     * 枚举 {@link CommonStatusEnum}
+     */
+    private Integer status;
+
+    // TODO 芋艿:要不要加一个 context,内置的上下文
+
+}

+ 1 - 1
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;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
-import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatConversationDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;

+ 2 - 2
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;
 
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
-import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatMessageDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatMessageDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.springframework.stereotype.Repository;
 
@@ -24,7 +24,7 @@ public interface AiChatMessageMapper extends BaseMapperX<AiChatMessageDO> {
      */
     default int deleteByConversationAndId(Long chatConversationId, Long id) {
         return this.delete(new LambdaQueryWrapperX<AiChatMessageDO>()
-                .eq(AiChatMessageDO::getChatConversationId, chatConversationId)
+                .eq(AiChatMessageDO::getConversationId, chatConversationId)
                 .eq(AiChatMessageDO::getId, id)
         );
     }

+ 0 - 1
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;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
-import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatModalDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.springframework.stereotype.Repository;
 

+ 1 - 1
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiChatRoleMapper.java

@@ -1,7 +1,7 @@
 package cn.iocoder.yudao.module.ai.mapper;
 
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
-import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatRoleDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.springframework.stereotype.Repository;
 

+ 1 - 1
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiImageMapper.java

@@ -1,7 +1,7 @@
 package cn.iocoder.yudao.module.ai.mapper;
 
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
-import cn.iocoder.yudao.module.ai.dal.dataobject.AiImageDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.springframework.stereotype.Repository;
 

+ 0 - 2
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;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.ai.ErrorCodeConstants;
 import cn.iocoder.yudao.module.ai.convert.AiChatConversationConvert;
-import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatConversationDO;
-import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatModalDO;
 import cn.iocoder.yudao.module.ai.enums.AiChatConversationTypeEnum;
 import cn.iocoder.yudao.module.ai.enums.AiChatModalDisableEnum;
 import cn.iocoder.yudao.module.ai.mapper.AiChatConversationMapper;

+ 3 - 3
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;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.ai.ErrorCodeConstants;
 import cn.iocoder.yudao.module.ai.convert.AiChatMessageConvert;
-import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatConversationDO;
-import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatMessageDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatMessageDO;
 import cn.iocoder.yudao.module.ai.mapper.AiChatConversationMapper;
 import cn.iocoder.yudao.module.ai.mapper.AiChatMessageMapper;
 import cn.iocoder.yudao.module.ai.service.AiChatMessageService;
@@ -38,7 +38,7 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
     public PageResult<AiChatMessageListRes> list(AiChatMessageReq req) {
         // 查询
         LambdaQueryWrapperX<AiChatMessageDO> queryWrapperX = new LambdaQueryWrapperX<>();
-        queryWrapperX.eq(AiChatMessageDO::getChatConversationId, req.getChatConversationId());
+        queryWrapperX.eq(AiChatMessageDO::getConversationId, req.getChatConversationId());
         // 默认排序
         queryWrapperX.orderByDesc(AiChatMessageDO::getId);
         PageResult<AiChatMessageDO> pageResult = aiChatMessageMapper.selectPage(req, queryWrapperX);

+ 0 - 1
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;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.module.ai.ErrorCodeConstants;
 import cn.iocoder.yudao.module.ai.convert.AiChatModalConvert;
-import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatModalDO;
 import cn.iocoder.yudao.module.ai.dal.vo.AiChatModalChatConfigVO;
 import cn.iocoder.yudao.module.ai.dal.vo.AiChatModalConfigVO;
 import cn.iocoder.yudao.module.ai.dal.vo.AiChatModalDallConfigVO;

+ 1 - 1
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;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.ai.ErrorCodeConstants;
 import cn.iocoder.yudao.module.ai.convert.AiChatRoleConvert;
-import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatRoleDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
 import cn.iocoder.yudao.module.ai.enums.AiChatRoleClassifyEnum;
 import cn.iocoder.yudao.module.ai.enums.AiChatRoleEnableEnum;
 import cn.iocoder.yudao.module.ai.mapper.AiChatRoleMapper;

+ 3 - 3
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;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.ai.config.AiChatClientFactory;
 import cn.iocoder.yudao.module.ai.controller.Utf8SseEmitter;
-import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatMessageDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatMessageDO;
 import cn.iocoder.yudao.module.ai.mapper.AiChatConversationMapper;
 import cn.iocoder.yudao.module.ai.mapper.AiChatMessageMapper;
 import cn.iocoder.yudao.module.ai.mapper.AiChatRoleMapper;
@@ -89,7 +89,7 @@ public class AiChatServiceImpl implements AiChatService {
         aiChatMessageMapper.insert(
                 new AiChatMessageDO()
                         .setId(null)
-                        .setChatConversationId(chatConversationId)
+                        .setConversationId(chatConversationId)
                         .setUserId(loginUserId)
                         .setMessage(req.getPrompt())
                         .setMessageType(MessageType.USER.getValue())
@@ -107,7 +107,7 @@ public class AiChatServiceImpl implements AiChatService {
         aiChatMessageMapper.insert(
                 new AiChatMessageDO()
                         .setId(null)
-                        .setChatConversationId(chatConversationId)
+                        .setConversationId(chatConversationId)
                         .setUserId(loginUserId)
                         .setMessage(systemPrompts)
                         .setMessageType(MessageType.SYSTEM.getValue())

+ 1 - 1
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;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.ai.ErrorCodeConstants;
 import cn.iocoder.yudao.module.ai.controller.Utf8SseEmitter;
-import cn.iocoder.yudao.module.ai.dal.dataobject.AiImageDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO;
 import cn.iocoder.yudao.module.ai.enums.AiChatDrawingStatusEnum;
 import cn.iocoder.yudao.module.ai.mapper.AiImageMapper;
 import cn.iocoder.yudao.module.ai.service.AiImageService;

+ 1 - 1
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;
 import cn.iocoder.yudao.framework.ai.midjourney.MidjourneyMessage;
 import cn.iocoder.yudao.framework.ai.midjourney.constants.MidjourneyGennerateStatusEnum;
 import cn.iocoder.yudao.framework.ai.midjourney.webSocket.MidjourneyMessageHandler;
-import cn.iocoder.yudao.module.ai.dal.dataobject.AiImageDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO;
 import cn.iocoder.yudao.module.ai.enums.AiChatDrawingStatusEnum;
 import cn.iocoder.yudao.module.ai.mapper.AiImageMapper;
 import com.alibaba.fastjson2.JSON;

+ 0 - 1
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatModalListRes.java

@@ -1,6 +1,5 @@
 package cn.iocoder.yudao.module.ai.vo;
 
-import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatModalDO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.experimental.Accessors;