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

This commit is contained in:
zhijiantianya@gmail.com 2024-05-06 21:47:29 +08:00
parent e9cbee9d7e
commit 2df0babc36
22 changed files with 237 additions and 267 deletions

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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<>>
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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; private Double temperature;
/** /**
* 单条回复的 Token 数量 * 单条回复的最大 Token 数量
* *
* 冗余 {@link AiChatConversationDO#getMaxTokens()} * 冗余 {@link AiChatConversationDO#getMaxTokens()}
*/ */
private Integer maxTokens; private Integer maxTokens;
/**
* 上下文的最大 Message 数量
*
* 冗余 {@link AiChatConversationDO#getMaxContexts()}
*/
private Integer maxContexts;
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}