Explorar el Código

【代码评审】AI:调整 conversation 接口

zhijiantianya@gmail.com hace 1 año
padre
commit
2df0babc36
Se han modificado 22 ficheros con 236 adiciones y 266 borrados
  1. 0 72
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatConversationController.java
  2. 64 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatConversationController.java
  3. 0 17
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatConversationControllerV2.java
  4. 17 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationCreateReqVO.java
  5. 39 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationRespVO.java
  6. 33 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationUpdateReqVO.java
  7. 1 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/message/package-info.java
  8. 0 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/package-info.java
  9. 4 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/package-info.java
  10. 0 4
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/package-info.java
  11. 3 3
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatConversationConvert.java
  12. 15 11
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/chat/AiChatConversationDO.java
  13. 7 7
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/chat/AiChatMessageDO.java
  14. 15 9
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiChatModalDO.java
  15. 21 11
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiChatRoleDO.java
  16. 6 8
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatConversationService.java
  17. 6 4
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatConversationServiceImpl.java
  18. 5 5
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatServiceImpl.java
  19. 0 26
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationCreateRoleReq.java
  20. 0 23
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationCreateUserReq.java
  21. 0 20
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationListReq.java
  22. 0 45
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationRes.java

+ 0 - 72
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatConversationController.java

@@ -1,72 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller;
-
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.module.ai.service.AiChatConversationService;
-import cn.iocoder.yudao.module.ai.vo.AiChatConversationCreateRoleReq;
-import cn.iocoder.yudao.module.ai.vo.AiChatConversationCreateUserReq;
-import cn.iocoder.yudao.module.ai.vo.AiChatConversationListReq;
-import cn.iocoder.yudao.module.ai.vo.AiChatConversationRes;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * ia 模块
- *
- * @author fansili
- * @time 2024/4/13 17:44
- * @since 1.0
- */
-@Tag(name = "A2-聊天-对话")
-@RestController
-@RequestMapping("/ai/chat/conversation")
-@Slf4j
-@AllArgsConstructor
-public class AiChatConversationController {
-
-    private final AiChatConversationService chatConversationService;
-
-    @Operation(summary = "创建 - 对话普通对话")
-    @PutMapping("/createConversation")
-    public CommonResult<AiChatConversationRes> createConversation(@RequestBody @Validated AiChatConversationCreateUserReq req) {
-        return CommonResult.success(chatConversationService.createConversation(req));
-    }
-
-    @Operation(summary = "创建 - 对话角色对话")
-    @PutMapping("/createRoleConversation")
-    public CommonResult<AiChatConversationRes> createRoleConversation(@RequestBody @Validated AiChatConversationCreateRoleReq req) {
-        return CommonResult.success(chatConversationService.createRoleConversation(req));
-    }
-
-    @Operation(summary = "获取 - 获取对话")
-    @GetMapping("/{id}")
-    public CommonResult<AiChatConversationRes> getConversation(@PathVariable("id") Long id) {
-        return CommonResult.success(chatConversationService.getConversation(id));
-    }
-
-    @Operation(summary = "获取 - 获取对话list")
-    @GetMapping("/list")
-    public CommonResult<List<AiChatConversationRes>> listConversation(@ModelAttribute @Validated AiChatConversationListReq req) {
-        return CommonResult.success(chatConversationService.listConversation(req));
-    }
-
-    @Operation(summary = "更新 - 更新模型")
-    @PostMapping("/{id}/modal")
-    public CommonResult<Void> updateModal(@PathVariable("id") Long id,
-                                          @RequestParam("modalId") Long modalId) {
-        chatConversationService.updateModal(id, modalId);
-        return CommonResult.success(null);
-    }
-
-    @Operation(summary = "删除")
-    @DeleteMapping("/{id}")
-    public CommonResult<Void> delete(@PathVariable("id") Long id) {
-        chatConversationService.delete(id);
-        return CommonResult.success(null);
-    }
-}

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

@@ -0,0 +1,64 @@
+package cn.iocoder.yudao.module.ai.controller.admin.chat;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationCreateReqVO;
+import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationRespVO;
+import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationUpdateReqVO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 聊天会话")
+@RestController
+@RequestMapping("/ai/chat/conversation")
+@Slf4j
+public class AiChatConversationController {
+
+    // TODO @fan:实现一下
+    @PostMapping("/create")
+    @Operation(summary = "创建聊天会话")
+    @PreAuthorize("@ss.hasPermission('ai:chat-conversation:create')")
+    public CommonResult<Long> createConversation(@RequestBody @Valid AiChatConversationCreateReqVO createReqVO) {
+        return success(1L);
+    }
+
+    // TODO @fan:实现一下
+    @PutMapping("/update")
+    @Operation(summary = "更新聊天会话")
+    @PreAuthorize("@ss.hasPermission('ai:chat-conversation:create')")
+    public CommonResult<Boolean> updateConversation(@RequestBody @Valid AiChatConversationUpdateReqVO updateReqVO) {
+        return success(true);
+    }
+
+    // TODO @fan:实现一下
+    @GetMapping("/list")
+    @Operation(summary = "获得聊天会话列表")
+    public CommonResult<List<AiChatConversationRespVO>> getConversationList() {
+        return success(null);
+    }
+
+    // TODO @fan:实现一下
+    @GetMapping("/get")
+    @Operation(summary = "获得聊天会话")
+    @Parameter(name = "id", required = true, description = "会话编号", example = "1024")
+    public CommonResult<AiChatConversationRespVO> getConversation(@RequestParam("id") Long id) {
+        return success(null);
+    }
+
+    // TODO @fan:实现一下
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除聊天会话")
+    @Parameter(name = "id", required = true, description = "会话编号", example = "1024")
+    public CommonResult<Boolean> deleteConversation(@RequestParam("id") Long id) {
+        return success(null);
+    }
+
+}

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

@@ -1,17 +0,0 @@
-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<>>
-
-}

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

@@ -0,0 +1,17 @@
+package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+@Schema(description = "管理后台 - AI 聊天会话创建 Request VO")
+@Data
+public class AiChatConversationCreateReqVO {
+
+    @Schema(description = "角色编号", example = "666")
+    private Long roleId;
+
+}

+ 39 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationRespVO.java

@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+@Schema(description = "管理后台 - AI 聊天会话 Response VO")
+@Data
+public class AiChatConversationRespVO {
+
+    @Schema(description = "会话编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    private Long id;
+
+    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
+    private Long userId;
+
+    @Schema(description = "会话标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是一个标题")
+    private String title;
+
+    @Schema(description = "是否置顶", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
+    private Boolean pinned;
+
+    @Schema(description = "模型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Long modelId;
+
+    @Schema(description = "模型标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "ERNIE-Bot-turbo-0922")
+    private String model;
+
+    @Schema(description = "温度参数", requiredMode = Schema.RequiredMode.REQUIRED, example = "0.8")
+    private Double temperature;
+
+    @Schema(description = "单条回复的最大 Token 数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096")
+    private Integer maxTokens;
+
+    @Schema(description = "上下文的最大 Message 数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
+    private Integer maxContexts;
+
+}

+ 33 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationUpdateReqVO.java

@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Schema(description = "管理后台 - AI 聊天会话更新 Request VO")
+@Data
+public class AiChatConversationUpdateReqVO {
+
+    @Schema(description = "会话编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    @NotNull(message = "会话编号不能为空")
+    private Long id;
+
+    @Schema(description = "会话标题", example = "我是一个标题")
+    private String title;
+
+    @Schema(description = "是否置顶", example = "true")
+    private Boolean pinned;
+
+    @Schema(description = "模型编号", example = "1")
+    private Long modelId;
+
+    @Schema(description = "温度参数", example = "0.8")
+    private Double temperature;
+
+    @Schema(description = "单条回复的最大 Token 数量", example = "4096")
+    private Integer maxTokens;
+
+    @Schema(description = "上下文的最大 Message 数量", example = "10")
+    private Integer maxContexts;
+
+}

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

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

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

@@ -1 +0,0 @@
-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/image/package-info.java

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

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

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

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

@@ -1,7 +1,7 @@
 package cn.iocoder.yudao.module.ai.convert;
 
 import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO;
-import cn.iocoder.yudao.module.ai.vo.AiChatConversationRes;
+import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationRespVO;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;
 
@@ -25,7 +25,7 @@ public interface AiChatConversationConvert {
      * @param top100Conversation
      * @return
      */
-    List<AiChatConversationRes> covnertChatConversationResList(List<AiChatConversationDO> top100Conversation);
+    List<AiChatConversationRespVO> covnertChatConversationResList(List<AiChatConversationDO> top100Conversation);
 
     /**
      * 转换 - 单个 ChatConversationRes
@@ -33,5 +33,5 @@ public interface AiChatConversationConvert {
      * @param aiChatConversationDO
      * @return
      */
-    AiChatConversationRes covnertChatConversationRes(AiChatConversationDO aiChatConversationDO);
+    AiChatConversationRespVO covnertChatConversationRes(AiChatConversationDO aiChatConversationDO);
 }

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

@@ -40,11 +40,15 @@ public class AiChatConversationDO extends BaseDO {
     private Long userId;
 
     /**
-     * 标题
+     * 会话标题
      *
      * 默认由系统自动生成,可用户手动修改
      */
     private String title;
+    /**
+     * 是否置顶
+     */
+    private Boolean pinned;
 
     /**
      * 角色编号
@@ -52,12 +56,6 @@ public class AiChatConversationDO extends BaseDO {
      * 关联 {@link AiChatRoleDO#getId()}
      */
     private Long roleId;
-    /**
-     * 模型标志
-     *
-     * 枚举 {@link AiOpenAiModelEnum}
-     */
-    private String model;
 
     /**
      * 模型编号
@@ -65,6 +63,12 @@ public class AiChatConversationDO extends BaseDO {
      * 关联 {@link AiChatModalDO#getId()} 字段
      */
     private Long modelId;
+    /**
+     * 模型标志
+     *
+     * 枚举 {@link AiOpenAiModelEnum}
+     */
+    private String model;
 
     // ========== 会话配置 ==========
 
@@ -75,12 +79,12 @@ public class AiChatConversationDO extends BaseDO {
      */
     private Double temperature;
     /**
-     * 上下文数量
+     * 单条回复的最大 Token 数量
      */
-    private Integer contextCount;
+    private Integer maxTokens;
     /**
-     * 单条回复的 Token 数量
+     * 上下文的最大 Message 数量
      */
-    private Integer maxTokens;
+    private Integer maxContexts;
 
 }

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

@@ -87,12 +87,6 @@ public class AiChatMessageDO extends BaseDO {
 
     // ========== 会话配置 ==========
 
-    /**
-     * 上下文数量
-     *
-     * 冗余 {@link AiChatConversationDO#getContextCount()}
-     */
-    private Integer contextCount;
     /**
      * 温度参数
      *
@@ -100,10 +94,16 @@ public class AiChatMessageDO extends BaseDO {
      */
     private Double temperature;
     /**
-     * 单条回复的 Token 数量
+     * 单条回复的最大 Token 数量
      *
      * 冗余 {@link AiChatConversationDO#getMaxTokens()}
      */
     private Integer maxTokens;
+    /**
+     * 上下文的最大 Message 数量
+     *
+     * 冗余 {@link AiChatConversationDO#getMaxContexts()}
+     */
+    private Integer maxContexts;
 
 }

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

@@ -3,21 +3,25 @@ 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.Data;
+import lombok.*;
 import lombok.experimental.Accessors;
 
 /**
  * AI 聊天模型 DO
  *
  * @author fansili
- * @time 2024/4/24 19:39
- * @since 1.0
+ * @since 2024/4/24 19:39
  */
+@TableName("ai_chat_model")
+@KeySequence("ai_chat_model_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
 @Data
-@Accessors(chain = true)
-@TableName("ai_chat_modal")
+@EqualsAndHashCode(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class AiChatModalDO extends BaseDO {
 
     /**
@@ -30,7 +34,7 @@ public class AiChatModalDO extends BaseDO {
      *
      * 关联 {@link AiApiKeyDO#getId()}
      */
-    private Long key_id;
+    private Long keyId;
     /**
      * 模型名称
      */
@@ -66,10 +70,12 @@ public class AiChatModalDO extends BaseDO {
      */
     private Double temperature;
     /**
-     * 单条回复的 Token 数量
+     * 单条回复的最大 Token 数量
      */
     private Integer maxTokens;
-
-    // TODO 芋艿:到底使用 max_context、还是 contextCount,待定!一个是轮次,一个是长度数量;貌似轮次更常用一点;
+    /**
+     * 上下文的最大 Message 数量
+     */
+    private Integer maxContexts;
 
 }

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

@@ -1,22 +1,30 @@
 package cn.iocoder.yudao.module.ai.dal.dataobject.model;
 
+import cn.iocoder.yudao.framework.ai.chat.messages.MessageType;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
 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 com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
+import lombok.*;
 import lombok.experimental.Accessors;
 
+import java.io.Serializable;
+import java.util.List;
+
 /**
- * ai 聊天角色
+ * AI 聊天角色 DO
  *
- * @fansili
- * @since v1.0
+ * @author fansili
+ * @since 2024/4/24 19:39
  */
+@TableName(value = "ai_chat_role", autoResultMap = true)
+@KeySequence("ai_chat_role_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
 @Data
-@Accessors(chain = true)
-@TableName("ai_chat_role")
+@EqualsAndHashCode(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class AiChatRoleDO extends BaseDO {
 
     /**
@@ -44,6 +52,10 @@ public class AiChatRoleDO extends BaseDO {
      * 角色欢迎语
      */
     private String welcomeMessage;
+    /**
+     * 角色设定(消息)
+     */
+    private String systemMessage;
 
     /**
      * 用户编号
@@ -77,6 +89,4 @@ public class AiChatRoleDO extends BaseDO {
      */
     private Integer status;
 
-    // TODO 芋艿:要不要加一个 context,内置的上下文
-
 }

+ 6 - 8
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatConversationService.java

@@ -1,9 +1,7 @@
 package cn.iocoder.yudao.module.ai.service;
 
-import cn.iocoder.yudao.module.ai.vo.AiChatConversationCreateRoleReq;
-import cn.iocoder.yudao.module.ai.vo.AiChatConversationCreateUserReq;
-import cn.iocoder.yudao.module.ai.vo.AiChatConversationListReq;
-import cn.iocoder.yudao.module.ai.vo.AiChatConversationRes;
+import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationCreateReqVO;
+import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationRespVO;
 
 import java.util.List;
 
@@ -21,7 +19,7 @@ public interface AiChatConversationService {
      * @param req
      * @return
      */
-    AiChatConversationRes createConversation(AiChatConversationCreateUserReq req);
+    AiChatConversationRespVO createConversation(AiChatConversationCreateUserReq req);
 
     /**
      * 对话 - 创建role对话
@@ -29,7 +27,7 @@ public interface AiChatConversationService {
      * @param req
      * @return
      */
-    AiChatConversationRes createRoleConversation(AiChatConversationCreateRoleReq req);
+    AiChatConversationRespVO createRoleConversation(AiChatConversationCreateReqVO req);
 
 
     /**
@@ -38,7 +36,7 @@ public interface AiChatConversationService {
      * @param id
      * @return
      */
-    AiChatConversationRes getConversation(Long id);
+    AiChatConversationRespVO getConversation(Long id);
 
     /**
      * 获取 - 对话列表
@@ -46,7 +44,7 @@ public interface AiChatConversationService {
      * @param req
      * @return
      */
-    List<AiChatConversationRes> listConversation(AiChatConversationListReq req);
+    List<AiChatConversationRespVO> listConversation(AiChatConversationListReq req);
 
     /**
      * 更新 - 更新模型

+ 6 - 4
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatConversationServiceImpl.java

@@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.ai.service.impl;
 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.admin.chat.vo.conversation.AiChatConversationCreateReqVO;
+import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationRespVO;
 import cn.iocoder.yudao.module.ai.convert.AiChatConversationConvert;
 import cn.iocoder.yudao.module.ai.enums.AiChatConversationTypeEnum;
 import cn.iocoder.yudao.module.ai.enums.AiChatModalDisableEnum;
@@ -38,7 +40,7 @@ public class AiChatConversationServiceImpl implements AiChatConversationService
     private final AiChatRoleService aiChatRoleService;
 
     @Override
-    public AiChatConversationRes createConversation(AiChatConversationCreateUserReq req) {
+    public AiChatConversationRespVO createConversation(AiChatConversationCreateUserReq req) {
         // 获取用户id
         Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
         // 查询最新的对话
@@ -58,7 +60,7 @@ public class AiChatConversationServiceImpl implements AiChatConversationService
     }
 
     @Override
-    public AiChatConversationRes createRoleConversation(AiChatConversationCreateRoleReq req) {
+    public AiChatConversationRespVO createRoleConversation(AiChatConversationCreateReqVO req) {
         // 获取用户id
         Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
         // 查询最新的对话
@@ -101,7 +103,7 @@ public class AiChatConversationServiceImpl implements AiChatConversationService
     }
 
     @Override
-    public AiChatConversationRes getConversation(Long id) {
+    public AiChatConversationRespVO getConversation(Long id) {
         AiChatConversationDO aiChatConversationDO = validateExists(id);
         return AiChatConversationConvert.INSTANCE.covnertChatConversationRes(aiChatConversationDO);
     }
@@ -115,7 +117,7 @@ public class AiChatConversationServiceImpl implements AiChatConversationService
     }
 
     @Override
-    public List<AiChatConversationRes> listConversation(AiChatConversationListReq req) {
+    public List<AiChatConversationRespVO> listConversation(AiChatConversationListReq req) {
         // 获取用户id
         Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
         // 查询前100对话

+ 5 - 5
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatServiceImpl.java

@@ -16,7 +16,7 @@ import cn.iocoder.yudao.module.ai.mapper.AiChatMessageMapper;
 import cn.iocoder.yudao.module.ai.mapper.AiChatRoleMapper;
 import cn.iocoder.yudao.module.ai.service.AiChatConversationService;
 import cn.iocoder.yudao.module.ai.service.AiChatService;
-import cn.iocoder.yudao.module.ai.vo.AiChatConversationRes;
+import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationRespVO;
 import cn.iocoder.yudao.module.ai.vo.AiChatReq;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -58,7 +58,7 @@ public class AiChatServiceImpl implements AiChatService {
         // 获取 client 类型
         AiPlatformEnum platformEnum = AiPlatformEnum.valueOfPlatform(req.getModal());
         // 获取对话信息
-        AiChatConversationRes conversationRes = chatConversationService.getConversation(req.getConversationId());
+        AiChatConversationRespVO conversationRes = chatConversationService.getConversation(req.getConversationId());
         // 保存 chat message
         saveChatMessage(req, conversationRes, loginUserId);
         String content = null;
@@ -83,7 +83,7 @@ public class AiChatServiceImpl implements AiChatService {
         return content;
     }
 
-    private void saveChatMessage(AiChatReq req, AiChatConversationRes conversationRes, Long loginUserId) {
+    private void saveChatMessage(AiChatReq req, AiChatConversationRespVO conversationRes, Long loginUserId) {
         Long chatConversationId = conversationRes.getId();
         // 增加 chat message 记录
         aiChatMessageMapper.insert(
@@ -101,7 +101,7 @@ public class AiChatServiceImpl implements AiChatService {
         aiChatConversationMapper.updateIncrChatCount(req.getConversationId());
     }
 
-    public void saveSystemChatMessage(AiChatReq req, AiChatConversationRes conversationRes, Long loginUserId, String systemPrompts) {
+    public void saveSystemChatMessage(AiChatReq req, AiChatConversationRespVO conversationRes, Long loginUserId, String systemPrompts) {
         Long chatConversationId = conversationRes.getId();
         // 增加 chat message 记录
         aiChatMessageMapper.insert(
@@ -133,7 +133,7 @@ public class AiChatServiceImpl implements AiChatService {
         // 获取 client 类型
         AiPlatformEnum platformEnum = AiPlatformEnum.valueOfPlatform(req.getModal());
         // 获取对话信息
-        AiChatConversationRes conversationRes = chatConversationService.getConversation(req.getConversationId());
+        AiChatConversationRespVO conversationRes = chatConversationService.getConversation(req.getConversationId());
         // 创建 chat 需要的 Prompt
         Prompt prompt = new Prompt(req.getPrompt());
         req.setTopK(req.getTopK());

+ 0 - 26
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationCreateRoleReq.java

@@ -1,26 +0,0 @@
-package cn.iocoder.yudao.module.ai.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * 聊天对话
- *
- * @author fansili
- * @time 2024/4/18 16:24
- * @since 1.0
- */
-@Data
-@Accessors(chain = true)
-public class AiChatConversationCreateRoleReq {
-
-    @Schema(description = "chat角色Id")
-    @NotNull(message = "聊天角色id不能为空!")
-    private Long roleId;
-
-    @Schema(description = "标题(有程序自动生成)")
-    @NotNull(message = "标题不能为空!")
-    private String title;
-}

+ 0 - 23
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationCreateUserReq.java

@@ -1,23 +0,0 @@
-package cn.iocoder.yudao.module.ai.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * 聊天对话
- *
- * @author fansili
- * @time 2024/4/18 16:24
- * @since 1.0
- */
-@Data
-@Accessors(chain = true)
-public class AiChatConversationCreateUserReq {
-
-    @Schema(description = "对话标题")
-    @NotNull(message = "标题不能为空!")
-    private String title;
-
-}

+ 0 - 20
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationListReq.java

@@ -1,20 +0,0 @@
-package cn.iocoder.yudao.module.ai.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * 聊天对话 list req
- *
- * @author fansili
- * @time 2024/4/18 16:24
- * @since 1.0
- */
-@Data
-@Accessors(chain = true)
-public class AiChatConversationListReq {
-
-    @Schema(description = "查询根据title")
-    private String search;
-}

+ 0 - 45
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationRes.java

@@ -1,45 +0,0 @@
-package cn.iocoder.yudao.module.ai.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * 聊天对话 res
- *
- * @author fansili
- * @time 2024/4/18 16:24
- * @since 1.0
- */
-@Data
-@Accessors(chain = true)
-public class AiChatConversationRes {
-
-    @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;
-
-}