新建tik模块
This commit is contained in:
@@ -1,89 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.chat.controller.app;
|
||||
|
||||
import cn.hutool.core.util.ObjUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.ai.chat.vo.app.AppAiChatConversationCreateMyReqVO;
|
||||
import cn.iocoder.yudao.module.ai.chat.vo.app.AppAiChatConversationRespVO;
|
||||
import cn.iocoder.yudao.module.ai.chat.vo.app.AppAiChatConversationUpdateMyReqVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationCreateMyReqVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationUpdateMyReqVO;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO;
|
||||
import cn.iocoder.yudao.module.ai.service.chat.AiChatConversationService;
|
||||
import com.fhs.core.trans.anno.TransMethodResult;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.validation.Valid;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||
|
||||
@Tag(name = "用户 App - AI 聊天对话")
|
||||
@RestController
|
||||
@RequestMapping("/ai/chat/conversation")
|
||||
@Validated
|
||||
public class AppAiChatConversationController {
|
||||
|
||||
@Resource
|
||||
private AiChatConversationService chatConversationService;
|
||||
|
||||
@PostMapping("/create-my")
|
||||
@Operation(summary = "创建【我的】聊天对话")
|
||||
public CommonResult<Long> createChatConversationMy(@RequestBody @Valid AppAiChatConversationCreateMyReqVO createReqVO) {
|
||||
// 将 App VO 转换为 Admin VO
|
||||
AiChatConversationCreateMyReqVO adminReqVO = BeanUtils.toBean(createReqVO, AiChatConversationCreateMyReqVO.class);
|
||||
return success(chatConversationService.createChatConversationMy(adminReqVO, getLoginUserId()));
|
||||
}
|
||||
|
||||
@PutMapping("/update-my")
|
||||
@Operation(summary = "更新【我的】聊天对话")
|
||||
public CommonResult<Boolean> updateChatConversationMy(@RequestBody @Valid AppAiChatConversationUpdateMyReqVO updateReqVO) {
|
||||
// 将 App VO 转换为 Admin VO
|
||||
AiChatConversationUpdateMyReqVO adminReqVO = BeanUtils.toBean(updateReqVO, AiChatConversationUpdateMyReqVO.class);
|
||||
chatConversationService.updateChatConversationMy(adminReqVO, getLoginUserId());
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@GetMapping("/my-list")
|
||||
@Operation(summary = "获得【我的】聊天对话列表")
|
||||
@TransMethodResult
|
||||
public CommonResult<List<AppAiChatConversationRespVO>> getChatConversationMyList() {
|
||||
List<AiChatConversationDO> list = chatConversationService.getChatConversationListByUserId(getLoginUserId());
|
||||
return success(BeanUtils.toBean(list, AppAiChatConversationRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/get-my")
|
||||
@Operation(summary = "获得【我的】聊天对话")
|
||||
@Parameter(name = "id", required = true, description = "对话编号", example = "1024")
|
||||
@TransMethodResult
|
||||
public CommonResult<AppAiChatConversationRespVO> getChatConversationMy(@RequestParam("id") Long id) {
|
||||
AiChatConversationDO conversation = chatConversationService.getChatConversation(id);
|
||||
if (conversation != null && ObjUtil.notEqual(conversation.getUserId(), getLoginUserId())) {
|
||||
conversation = null;
|
||||
}
|
||||
return success(BeanUtils.toBean(conversation, AppAiChatConversationRespVO.class));
|
||||
}
|
||||
|
||||
@DeleteMapping("/delete-my")
|
||||
@Operation(summary = "删除聊天对话")
|
||||
@Parameter(name = "id", required = true, description = "对话编号", example = "1024")
|
||||
public CommonResult<Boolean> deleteChatConversationMy(@RequestParam("id") Long id) {
|
||||
chatConversationService.deleteChatConversationMy(id, getLoginUserId());
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@DeleteMapping("/delete-by-unpinned")
|
||||
@Operation(summary = "删除未置顶的聊天对话")
|
||||
public CommonResult<Boolean> deleteChatConversationMyByUnpinned() {
|
||||
chatConversationService.deleteChatConversationMyByUnpinned(getLoginUserId());
|
||||
return success(true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,194 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.chat.controller.app;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.ObjUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.ai.chat.vo.app.AppAiChatMessageRespVO;
|
||||
import cn.iocoder.yudao.module.ai.chat.vo.app.AppAiChatMessageSendReqVO;
|
||||
import cn.iocoder.yudao.module.ai.chat.vo.app.AppAiChatMessageSendRespVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message.AiChatMessageSendReqVO;
|
||||
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.dal.dataobject.knowledge.AiKnowledgeDocumentDO;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeSegmentDO;
|
||||
import cn.iocoder.yudao.module.ai.service.chat.AiChatConversationService;
|
||||
import cn.iocoder.yudao.module.ai.service.chat.AiChatMessageService;
|
||||
import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeDocumentService;
|
||||
import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeSegmentService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.validation.Valid;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import reactor.core.publisher.Flux;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
|
||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||
|
||||
@Tag(name = "用户 App - 聊天消息")
|
||||
@RestController
|
||||
@RequestMapping("/ai/chat/message")
|
||||
@Validated
|
||||
@Slf4j
|
||||
public class AppAiChatMessageController {
|
||||
|
||||
@Resource
|
||||
private AiChatMessageService chatMessageService;
|
||||
@Resource
|
||||
private AiChatConversationService chatConversationService;
|
||||
@Resource
|
||||
private AiKnowledgeSegmentService knowledgeSegmentService;
|
||||
@Resource
|
||||
private AiKnowledgeDocumentService knowledgeDocumentService;
|
||||
|
||||
@Operation(summary = "发送消息(段式)", description = "一次性返回,响应较慢")
|
||||
@PostMapping("/send")
|
||||
public CommonResult<AppAiChatMessageSendRespVO> sendMessage(@Valid @RequestBody AppAiChatMessageSendReqVO sendReqVO) {
|
||||
// 将 App VO 转换为 Admin VO
|
||||
AiChatMessageSendReqVO adminReqVO = BeanUtils.toBean(sendReqVO, AiChatMessageSendReqVO.class);
|
||||
// 调用 Service,然后转换响应
|
||||
var adminResp = chatMessageService.sendMessage(adminReqVO, getLoginUserId());
|
||||
// 手动转换 segments,因为内部类类型不同
|
||||
AppAiChatMessageSendRespVO appResp = convertSendRespVO(adminResp);
|
||||
return success(appResp);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将 Admin 的 SendRespVO 转换为 App 的 SendRespVO
|
||||
* 主要处理 segments 字段的类型转换
|
||||
*/
|
||||
private AppAiChatMessageSendRespVO convertSendRespVO(cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message.AiChatMessageSendRespVO adminResp) {
|
||||
if (adminResp == null) {
|
||||
return null;
|
||||
}
|
||||
AppAiChatMessageSendRespVO appResp = new AppAiChatMessageSendRespVO();
|
||||
|
||||
// 转换 send
|
||||
if (adminResp.getSend() != null) {
|
||||
AppAiChatMessageSendRespVO.Message appSend = BeanUtils.toBean(adminResp.getSend(), AppAiChatMessageSendRespVO.Message.class);
|
||||
if (adminResp.getSend().getSegments() != null) {
|
||||
appSend.setSegments(convertKnowledgeSegments(adminResp.getSend().getSegments()));
|
||||
}
|
||||
appResp.setSend(appSend);
|
||||
}
|
||||
|
||||
// 转换 receive
|
||||
if (adminResp.getReceive() != null) {
|
||||
AppAiChatMessageSendRespVO.Message appReceive = BeanUtils.toBean(adminResp.getReceive(), AppAiChatMessageSendRespVO.Message.class);
|
||||
if (adminResp.getReceive().getSegments() != null) {
|
||||
appReceive.setSegments(convertKnowledgeSegments(adminResp.getReceive().getSegments()));
|
||||
}
|
||||
appResp.setReceive(appReceive);
|
||||
}
|
||||
|
||||
return appResp;
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换 KnowledgeSegment 列表
|
||||
*/
|
||||
private List<AppAiChatMessageSendRespVO.KnowledgeSegment> convertKnowledgeSegments(
|
||||
List<cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message.AiChatMessageRespVO.KnowledgeSegment> adminSegments) {
|
||||
if (adminSegments == null) {
|
||||
return null;
|
||||
}
|
||||
return convertList(adminSegments, segment -> {
|
||||
if (segment == null) {
|
||||
return null;
|
||||
}
|
||||
return new AppAiChatMessageSendRespVO.KnowledgeSegment()
|
||||
.setId(segment.getId())
|
||||
.setContent(segment.getContent())
|
||||
.setDocumentId(segment.getDocumentId())
|
||||
.setDocumentName(segment.getDocumentName());
|
||||
});
|
||||
}
|
||||
|
||||
@Operation(summary = "发送消息(流式)", description = "流式返回,响应较快")
|
||||
@PostMapping(value = "/send-stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
|
||||
public Flux<CommonResult<AppAiChatMessageSendRespVO>> sendChatMessageStream(@Valid @RequestBody AppAiChatMessageSendReqVO sendReqVO) {
|
||||
// 将 App VO 转换为 Admin VO
|
||||
AiChatMessageSendReqVO adminReqVO = BeanUtils.toBean(sendReqVO, AiChatMessageSendReqVO.class);
|
||||
// 调用 Service,然后转换响应流
|
||||
return chatMessageService.sendChatMessageStream(adminReqVO, getLoginUserId())
|
||||
.map(result -> {
|
||||
if (result.getData() != null) {
|
||||
// 手动转换 segments,因为内部类类型不同
|
||||
AppAiChatMessageSendRespVO appResp = convertSendRespVO(result.getData());
|
||||
return success(appResp);
|
||||
}
|
||||
return success((AppAiChatMessageSendRespVO) null);
|
||||
});
|
||||
}
|
||||
|
||||
@Operation(summary = "获得指定对话的消息列表")
|
||||
@GetMapping("/list-by-conversation-id")
|
||||
@Parameter(name = "conversationId", required = true, description = "对话编号", example = "1024")
|
||||
public CommonResult<List<AppAiChatMessageRespVO>> getChatMessageListByConversationId(
|
||||
@RequestParam("conversationId") Long conversationId) {
|
||||
AiChatConversationDO conversation = chatConversationService.getChatConversation(conversationId);
|
||||
if (conversation == null || ObjUtil.notEqual(conversation.getUserId(), getLoginUserId())) {
|
||||
return success(Collections.emptyList());
|
||||
}
|
||||
// 1. 获取消息列表
|
||||
List<AiChatMessageDO> messageList = chatMessageService.getChatMessageListByConversationId(conversationId);
|
||||
if (CollUtil.isEmpty(messageList)) {
|
||||
return success(Collections.emptyList());
|
||||
}
|
||||
|
||||
// 2. 拼接数据,主要是知识库段落信息
|
||||
Map<Long, AiKnowledgeSegmentDO> segmentMap = knowledgeSegmentService.getKnowledgeSegmentMap(convertListByFlatMap(messageList,
|
||||
message -> CollUtil.isEmpty(message.getSegmentIds()) ? null : message.getSegmentIds().stream()));
|
||||
Map<Long, AiKnowledgeDocumentDO> documentMap = knowledgeDocumentService.getKnowledgeDocumentMap(
|
||||
convertList(segmentMap.values(), AiKnowledgeSegmentDO::getDocumentId));
|
||||
List<AppAiChatMessageRespVO> messageVOList = BeanUtils.toBean(messageList, AppAiChatMessageRespVO.class);
|
||||
for (int i = 0; i < messageList.size(); i++) {
|
||||
AiChatMessageDO message = messageList.get(i);
|
||||
if (CollUtil.isEmpty(message.getSegmentIds())) {
|
||||
continue;
|
||||
}
|
||||
// 设置知识库段落信息
|
||||
messageVOList.get(i).setSegments(convertList(message.getSegmentIds(), segmentId -> {
|
||||
AiKnowledgeSegmentDO segment = segmentMap.get(segmentId);
|
||||
if (segment == null) {
|
||||
return null;
|
||||
}
|
||||
AiKnowledgeDocumentDO document = documentMap.get(segment.getDocumentId());
|
||||
if (document == null) {
|
||||
return null;
|
||||
}
|
||||
return new AppAiChatMessageRespVO.KnowledgeSegment().setId(segment.getId()).setContent(segment.getContent())
|
||||
.setDocumentId(segment.getDocumentId()).setDocumentName(document.getName());
|
||||
}));
|
||||
}
|
||||
return success(messageVOList);
|
||||
}
|
||||
|
||||
@Operation(summary = "删除消息")
|
||||
@DeleteMapping("/delete")
|
||||
@Parameter(name = "id", required = true, description = "消息编号", example = "1024")
|
||||
public CommonResult<Boolean> deleteChatMessage(@RequestParam("id") Long id) {
|
||||
chatMessageService.deleteChatMessage(id, getLoginUserId());
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@Operation(summary = "删除指定对话的消息")
|
||||
@DeleteMapping("/delete-by-conversation-id")
|
||||
@Parameter(name = "conversationId", required = true, description = "对话编号", example = "1024")
|
||||
public CommonResult<Boolean> deleteChatMessageByConversationId(@RequestParam("conversationId") Long conversationId) {
|
||||
chatMessageService.deleteChatMessageByConversationId(conversationId, getLoginUserId());
|
||||
return success(true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.chat.vo.app;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@Schema(description = "用户 App - AI 聊天对话创建【我的】 Request VO")
|
||||
@Data
|
||||
public class AppAiChatConversationCreateMyReqVO {
|
||||
|
||||
@Schema(description = "聊天角色编号", example = "666")
|
||||
private Long roleId;
|
||||
|
||||
@Schema(description = "知识库编号", example = "1204")
|
||||
private Long knowledgeId;
|
||||
|
||||
}
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.chat.vo.app;
|
||||
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
|
||||
import com.fhs.core.trans.anno.Trans;
|
||||
import com.fhs.core.trans.constant.TransType;
|
||||
import com.fhs.core.trans.vo.VO;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Schema(description = "用户 App - AI 聊天对话 Response VO")
|
||||
@Data
|
||||
public class AppAiChatConversationRespVO implements VO {
|
||||
|
||||
@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 = "角色编号", example = "1")
|
||||
@Trans(type = TransType.SIMPLE, target = AiChatRoleDO.class, fields = {"name", "avatar"}, refs = {"roleName", "roleAvatar"})
|
||||
private Long roleId;
|
||||
|
||||
@Schema(description = "模型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
@Trans(type = TransType.SIMPLE, target = AiModelDO.class, fields = "name", ref = "modelName")
|
||||
private Long modelId;
|
||||
|
||||
@Schema(description = "模型标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "ERNIE-Bot-turbo-0922")
|
||||
private String model;
|
||||
|
||||
@Schema(description = "模型名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
|
||||
private String modelName;
|
||||
|
||||
@Schema(description = "角色设定", example = "一个快乐的程序员")
|
||||
private String systemMessage;
|
||||
|
||||
@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;
|
||||
|
||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private LocalDateTime createTime;
|
||||
|
||||
// ========== 关联 role 信息 ==========
|
||||
|
||||
@Schema(description = "角色头像", example = "https://www.iocoder.cn/1.png")
|
||||
private String roleAvatar;
|
||||
|
||||
@Schema(description = "角色名字", example = "小黄")
|
||||
private String roleName;
|
||||
|
||||
}
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.chat.vo.app;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
|
||||
@Schema(description = "用户 App - AI 聊天对话更新【我的】 Request VO")
|
||||
@Data
|
||||
public class AppAiChatConversationUpdateMyReqVO {
|
||||
|
||||
@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 = "1")
|
||||
private Long knowledgeId;
|
||||
|
||||
@Schema(description = "角色设定", example = "一个快乐的程序员")
|
||||
private String systemMessage;
|
||||
|
||||
@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,81 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.chat.vo.app;
|
||||
|
||||
import cn.iocoder.yudao.module.ai.framework.ai.core.webserch.AiWebSearchResponse;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
@Schema(description = "用户 App - AI 聊天消息 Response VO")
|
||||
@Data
|
||||
public class AppAiChatMessageRespVO {
|
||||
|
||||
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "对话编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
|
||||
private Long conversationId;
|
||||
|
||||
@Schema(description = "回复消息编号", example = "1024")
|
||||
private Long replyId;
|
||||
|
||||
@Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "role")
|
||||
private String type; // 参见 MessageType 枚举类
|
||||
|
||||
@Schema(description = "用户编号", example = "4096")
|
||||
private Long userId;
|
||||
|
||||
@Schema(description = "角色编号", example = "888")
|
||||
private Long roleId;
|
||||
|
||||
@Schema(description = "模型标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "gpt-3.5-turbo")
|
||||
private String model;
|
||||
|
||||
@Schema(description = "模型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "123")
|
||||
private Long modelId;
|
||||
|
||||
@Schema(description = "聊天内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,你好啊")
|
||||
private String content;
|
||||
|
||||
@Schema(description = "推理内容", example = "要达到这个目标,你需要...")
|
||||
private String reasoningContent;
|
||||
|
||||
@Schema(description = "是否携带上下文", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
|
||||
private Boolean useContext;
|
||||
|
||||
@Schema(description = "知识库段落编号数组", example = "[1,2,3]")
|
||||
private List<Long> segmentIds;
|
||||
|
||||
@Schema(description = "知识库段落数组")
|
||||
private List<KnowledgeSegment> segments;
|
||||
|
||||
@Schema(description = "联网搜索的网页内容数组")
|
||||
private List<AiWebSearchResponse.WebPage> webSearchPages;
|
||||
|
||||
@Schema(description = "附件 URL 数组", example = "https://www.iocoder.cn/1.png")
|
||||
private List<String> attachmentUrls;
|
||||
|
||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-05-12 12:51")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
@Schema(description = "知识库段落", example = "Java 开发手册")
|
||||
@Data
|
||||
public static class KnowledgeSegment {
|
||||
|
||||
@Schema(description = "段落编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "切片内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "Java 开发手册")
|
||||
private String content;
|
||||
|
||||
@Schema(description = "文档编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790")
|
||||
private Long documentId;
|
||||
|
||||
@Schema(description = "文档名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "产品使用手册")
|
||||
private String documentName;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.chat.vo.app;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Schema(description = "用户 App - AI 聊天消息发送 Request VO")
|
||||
@Data
|
||||
public class AppAiChatMessageSendReqVO {
|
||||
|
||||
@Schema(description = "聊天对话编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||
@NotNull(message = "聊天对话编号不能为空")
|
||||
private Long conversationId;
|
||||
|
||||
@Schema(description = "聊天内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "帮我写个 Java 算法")
|
||||
@NotEmpty(message = "聊天内容不能为空")
|
||||
private String content;
|
||||
|
||||
@Schema(description = "是否携带上下文", example = "true")
|
||||
private Boolean useContext;
|
||||
|
||||
@Schema(description = "是否联网搜索", example = "true")
|
||||
private Boolean useSearch;
|
||||
|
||||
@Schema(description = "附件 URL 数组", example = "https://www.iocoder.cn/1.png")
|
||||
private List<String> attachmentUrls;
|
||||
|
||||
}
|
||||
|
||||
@@ -1,69 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.chat.vo.app;
|
||||
|
||||
import cn.iocoder.yudao.module.ai.framework.ai.core.webserch.AiWebSearchResponse;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
@Schema(description = "用户 App - AI 聊天消息发送 Response VO")
|
||||
@Data
|
||||
public class AppAiChatMessageSendRespVO {
|
||||
|
||||
@Schema(description = "发送消息", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private Message send;
|
||||
|
||||
@Schema(description = "接收消息", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private Message receive;
|
||||
|
||||
@Schema(description = "消息")
|
||||
@Data
|
||||
public static class Message {
|
||||
|
||||
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "role")
|
||||
private String type; // 参见 MessageType 枚举类
|
||||
|
||||
@Schema(description = "聊天内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,你好啊")
|
||||
private String content;
|
||||
|
||||
@Schema(description = "推理内容", example = "要达到这个目标,你需要...")
|
||||
private String reasoningContent;
|
||||
|
||||
@Schema(description = "知识库段落编号数组", example = "[1,2,3]")
|
||||
private List<Long> segmentIds;
|
||||
|
||||
@Schema(description = "知识库段落数组")
|
||||
private List<KnowledgeSegment> segments;
|
||||
|
||||
@Schema(description = "联网搜索的网页内容数组")
|
||||
private List<AiWebSearchResponse.WebPage> webSearchPages;
|
||||
|
||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private LocalDateTime createTime;
|
||||
|
||||
}
|
||||
|
||||
@Schema(description = "知识库段落", example = "Java 开发手册")
|
||||
@Data
|
||||
public static class KnowledgeSegment {
|
||||
|
||||
@Schema(description = "段落编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "切片内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "Java 开发手册")
|
||||
private String content;
|
||||
|
||||
@Schema(description = "文档编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790")
|
||||
private Long documentId;
|
||||
|
||||
@Schema(description = "文档名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "产品使用手册")
|
||||
private String documentName;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
/**
|
||||
* TODO 芋艿:站位,无特殊作用
|
||||
*/
|
||||
package cn.iocoder.yudao.module.ai.controller.app;
|
||||
@@ -1,66 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.dal.dataobject.userprompt;
|
||||
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
|
||||
|
||||
/**
|
||||
* 用户提示词 DO
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
@TableName("ai_user_prompt")
|
||||
@KeySequence("ai_user_prompt_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class UserPromptDO extends TenantBaseDO {
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
@TableId
|
||||
private Long id;
|
||||
/**
|
||||
* 用户编号
|
||||
*/
|
||||
private Long userId;
|
||||
/**
|
||||
* 提示词名称
|
||||
*/
|
||||
private String name;
|
||||
/**
|
||||
* 提示词内容
|
||||
*/
|
||||
private String content;
|
||||
/**
|
||||
* 分类/标签
|
||||
*/
|
||||
private String category;
|
||||
/**
|
||||
* 是否公开(0-私有,1-公开)
|
||||
*/
|
||||
private Boolean isPublic;
|
||||
/**
|
||||
* 排序
|
||||
*/
|
||||
private Integer sort;
|
||||
/**
|
||||
* 使用次数
|
||||
*/
|
||||
private Integer useCount;
|
||||
/**
|
||||
* 状态(0-禁用,1-启用)
|
||||
*/
|
||||
private Integer status;
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
/**
|
||||
* 占位
|
||||
*/
|
||||
package cn.iocoder.yudao.module.ai.framework.security.core;
|
||||
@@ -1,4 +0,0 @@
|
||||
/**
|
||||
* ai 模块的 web 拓展封装
|
||||
*/
|
||||
package cn.iocoder.yudao.module.ai.framework.web;
|
||||
@@ -1,147 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.tikhup.controller;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.module.ai.tikhup.mapper.TikPromptMapper;
|
||||
import cn.iocoder.yudao.module.ai.tikhup.service.TikHupService;
|
||||
import com.alibaba.dashscope.app.Application;
|
||||
import com.alibaba.dashscope.app.ApplicationParam;
|
||||
import com.alibaba.dashscope.app.ApplicationResult;
|
||||
import com.alibaba.dashscope.app.FlowStreamMode;
|
||||
import com.alibaba.dashscope.utils.Constants;
|
||||
import com.alibaba.dashscope.utils.JsonUtils;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import io.reactivex.Flowable;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.scheduler.Schedulers;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Tag(name = "TikHup - TikTok数据管理", description = "TikHup平台TikTok数据获取相关接口")
|
||||
@RestController
|
||||
@RequestMapping("/api/tikHup")
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class TikHupController {
|
||||
|
||||
private final TikHupService tikHupService;
|
||||
|
||||
private final TikPromptMapper tikPromptMapper;
|
||||
|
||||
@GetMapping("/fetch_user_post_videos")
|
||||
@Operation(
|
||||
summary = "获取用户主页作品数据",
|
||||
description = "通过TikHup API获取指定用户的TikTok作品数据,包括视频列表、用户信息等"
|
||||
)
|
||||
public Object fetch_user_post_videos(
|
||||
@RequestParam String type,
|
||||
@RequestParam String sec_user_id,
|
||||
@RequestParam int max_cursor,
|
||||
@RequestParam int count) {
|
||||
return tikHupService.fetch_user_post_videos(type, sec_user_id,max_cursor, count);
|
||||
}
|
||||
|
||||
|
||||
@PostMapping("/postTikHup")
|
||||
@Operation(
|
||||
summary = "获取用户主页作品数据",
|
||||
description = "通过TikHup API获取指定用户的TikTok作品数据,包括视频列表、用户信息等"
|
||||
)
|
||||
public Object postTikHup(@RequestParam String type,@RequestParam String methodType,@RequestParam String urlParams,@RequestParam String paramType) {
|
||||
return tikHupService.postTikHup(type, methodType,urlParams,paramType);
|
||||
}
|
||||
|
||||
|
||||
@PostMapping("/videoToCharacters")
|
||||
@Operation(summary = "音频转文字", description = "音频转文字接口")
|
||||
public Object videoToCharacters(@RequestBody Map<String,Object> fileLinkMap) {
|
||||
String fileLink = (String) fileLinkMap.get("fileLink");
|
||||
return tikHupService.videoToCharacters(fileLink);
|
||||
}
|
||||
|
||||
@PostMapping("/videoToCharacters2")
|
||||
@Operation(summary = "音频转文字", description = "音频转文字接口")
|
||||
public Object videoToCharacters2(@RequestBody Map<String,Object> fileLinkMap) {
|
||||
List<String> fileLinkList = (List<String>) fileLinkMap.get("fileLinkList");
|
||||
return tikHupService.videoToCharacters2(fileLinkList);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@GetMapping("/getPromptTypeList")
|
||||
@Operation(summary = "获取提示词类型列表", description = "获取提示词类型列表")
|
||||
public Object getPromptTypeList(){
|
||||
return CommonResult.success(tikPromptMapper.getTikPromptVOList());
|
||||
}
|
||||
|
||||
|
||||
@PostMapping("/deepseekAnalysis")
|
||||
@Operation(summary = "deepseek文案重写", description = "deepseek文案重写")
|
||||
public Object deepseekAnalysis(@RequestBody Map<String,Object> contentMap){
|
||||
String content = (String) contentMap.get("content");
|
||||
String promptType = (String) contentMap.get("promptType");
|
||||
return tikHupService.deepseekAnalysis(promptType,content);
|
||||
}
|
||||
|
||||
@PostMapping("/callWorkflow")
|
||||
@Operation(summary = "调用阿里工作流", description = "调用阿里工作流 文档地址:https://help.aliyun.com/zh/model-studio/invoke-workflow-application?mode=pure#8f4b4d2ce9fry")
|
||||
public Flux<String> callWorkflow(@RequestBody Map<String,Object> params){
|
||||
Constants.baseHttpApiUrl = "https://dashscope.aliyuncs.com/api/v1";
|
||||
ApplicationParam param = ApplicationParam.builder()
|
||||
// 若没有配置环境变量,可用百炼API Key将下行替换为:.apiKey("sk-xxx")。但不建议在生产环境中直接将API Key硬编码到代码中,以减少API Key泄露风险。
|
||||
.apiKey("sk-10c746f8cb8640738f8d6b71af699003")
|
||||
.appId("bb746b74bfb0439e841cb309dc9f945c")
|
||||
.flowStreamMode(FlowStreamMode.MESSAGE_FORMAT)
|
||||
.bizParams(JsonUtils.parse(JSON.toJSONString(params)))
|
||||
.prompt((String) params.get("audio_prompt"))
|
||||
.hasThoughts(false)
|
||||
.incrementalOutput(true)
|
||||
.build();
|
||||
Application application = new Application();
|
||||
try{
|
||||
//ApplicationResult result = application.call(param);
|
||||
//return CommonResult.success(result.getOutput().getText());
|
||||
Flowable<ApplicationResult> flowableResult = application.streamCall(param);
|
||||
// 关键:RxJava Flowable 转 WebFlux Flux,指定非阻塞线程调度
|
||||
// 4.2 将 RxJava Flowable 转换为 WebFlux Flux(响应式转换,无阻塞)
|
||||
return Flux.from(flowableResult)
|
||||
// 关键:切换到非阻塞线程执行(避免阻塞 WebFlux 事件循环)
|
||||
.subscribeOn(Schedulers.boundedElastic())
|
||||
// 4.3 处理每一条流式数据:提取 thoughts 字段(按你的需求,也可提取 text)
|
||||
.map(applicationResult -> {
|
||||
// 校验结果非 null(阿里 SDK 可能返回空结果)
|
||||
if (applicationResult == null || applicationResult.getOutput() == null) {
|
||||
log.warn("收到空的流式结果");
|
||||
return "空结果";
|
||||
}
|
||||
return applicationResult.getOutput().getWorkflowMessage().getMessage().getContent();
|
||||
})
|
||||
// 【新增】设置超时时间:30分钟内没有数据则超时
|
||||
.timeout(java.time.Duration.ofMinutes(30))
|
||||
// 【新增】超时后返回错误信息
|
||||
.onErrorResume(java.util.concurrent.TimeoutException.class, e -> {
|
||||
log.warn("流式输出超时(30分钟无数据),连接已断开");
|
||||
return Flux.just("[TIMEOUT]流式输出超时,请检查网络或重新请求");
|
||||
})
|
||||
// 【新增】流式输出完成后,发送结束标记
|
||||
.concatWith(Flux.just("[DONE]"))
|
||||
// 4.4 流处理异常捕获(如网络中断、阿里 SDK 内部错误)
|
||||
.onErrorMap(e -> {
|
||||
log.error("流式处理异常", e); // 打印完整异常栈,便于排查
|
||||
return new RuntimeException("流式处理错误:" + e.getMessage());
|
||||
})
|
||||
// 4.5 异常时返回默认提示(前端不会断连,而是接收错误信息)
|
||||
.onErrorReturn("错误:流式处理中断:" + "请重试或联系管理员");
|
||||
}catch (Exception e){
|
||||
// 捕获 SDK 调用时的同步异常(如初始化失败、网络连接超时)
|
||||
log.error("调用阿里 SDK 失败", e);
|
||||
return Flux.just("错误:SDK 调用失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.tikhup.mapper;
|
||||
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import cn.iocoder.yudao.module.ai.tikhup.vo.TikPromptVO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mapper
|
||||
public interface TikPromptMapper extends BaseMapperX<TikPromptVO> {
|
||||
|
||||
default TikPromptVO getTikPromptVO(String promptType) {
|
||||
return selectOne("prompt_type",promptType);
|
||||
}
|
||||
|
||||
default List<TikPromptVO> getTikPromptVOList() {
|
||||
return selectList();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.tikhup.mapper;
|
||||
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import cn.iocoder.yudao.module.ai.tikhup.vo.TikTokenVO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
public interface TikTokenMapper extends BaseMapperX<TikTokenVO> {
|
||||
|
||||
default TikTokenVO getPlatformToken(String platformUrl) {
|
||||
return selectOne("platform_url",platformUrl);
|
||||
}
|
||||
|
||||
default TikTokenVO getInterfaceUrl(String interfaceType) {
|
||||
return selectOne("interface_type",interfaceType);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,178 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.tikhup.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.aliyuncs.CommonRequest;
|
||||
import com.aliyuncs.CommonResponse;
|
||||
import com.aliyuncs.DefaultAcsClient;
|
||||
import com.aliyuncs.IAcsClient;
|
||||
import com.aliyuncs.exceptions.ClientException;
|
||||
import com.aliyuncs.http.MethodType;
|
||||
import com.aliyuncs.profile.DefaultProfile;
|
||||
|
||||
public class TikFileTransCharacters {
|
||||
|
||||
// 地域ID,常量,固定值。
|
||||
public static final String REGIONID = "cn-shanghai";
|
||||
public static final String ENDPOINTNAME = "cn-shanghai";
|
||||
public static final String PRODUCT = "nls-filetrans";
|
||||
public static final String DOMAIN = "filetrans.cn-shanghai.aliyuncs.com";
|
||||
public static final String API_VERSION = "2018-08-17"; // 中国站版本
|
||||
// public static final String API_VERSION = "2019-08-23"; // 国际站版本
|
||||
public static final String POST_REQUEST_ACTION = "SubmitTask";
|
||||
public static final String GET_REQUEST_ACTION = "GetTaskResult";
|
||||
// 请求参数
|
||||
public static final String KEY_APP_KEY = "appkey";
|
||||
public static final String KEY_FILE_LINK = "file_link";
|
||||
public static final String KEY_VERSION = "version";
|
||||
public static final String KEY_ENABLE_WORDS = "enable_words";
|
||||
// 响应参数
|
||||
public static final String KEY_TASK = "Task";
|
||||
public static final String KEY_TASK_ID = "TaskId";
|
||||
public static final String KEY_STATUS_TEXT = "StatusText";
|
||||
public static final String KEY_RESULT = "Result";
|
||||
// 状态值
|
||||
public static final String STATUS_SUCCESS = "SUCCESS";
|
||||
private static final String STATUS_RUNNING = "RUNNING";
|
||||
private static final String STATUS_QUEUEING = "QUEUEING";
|
||||
// 阿里云鉴权client
|
||||
IAcsClient client;
|
||||
public TikFileTransCharacters(String accessKeyId, String accessKeySecret) {
|
||||
// 设置endpoint
|
||||
try {
|
||||
DefaultProfile.addEndpoint(ENDPOINTNAME, REGIONID, PRODUCT, DOMAIN);
|
||||
} catch (ClientException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
// 创建DefaultAcsClient实例并初始化
|
||||
DefaultProfile profile = DefaultProfile.getProfile(REGIONID, accessKeyId, accessKeySecret);
|
||||
this.client = new DefaultAcsClient(profile);
|
||||
}
|
||||
public String submitFileTransRequest(String appKey, String fileLink) {
|
||||
/**
|
||||
* 1. 创建CommonRequest,设置请求参数。
|
||||
*/
|
||||
CommonRequest postRequest = new CommonRequest();
|
||||
// 设置域名
|
||||
postRequest.setDomain(DOMAIN);
|
||||
// 设置API的版本号,格式为YYYY-MM-DD。
|
||||
postRequest.setVersion(API_VERSION);
|
||||
// 设置action
|
||||
postRequest.setAction(POST_REQUEST_ACTION);
|
||||
// 设置产品名称
|
||||
postRequest.setProduct(PRODUCT);
|
||||
/**
|
||||
* 2. 设置录音文件识别请求参数,以JSON字符串的格式设置到请求Body中。
|
||||
*/
|
||||
JSONObject taskObject = new JSONObject();
|
||||
// 设置appkey
|
||||
taskObject.put(KEY_APP_KEY, appKey);
|
||||
// 设置音频文件访问链接
|
||||
taskObject.put(KEY_FILE_LINK, fileLink);
|
||||
// 新接入请使用4.0版本,已接入(默认2.0)如需维持现状,请注释掉该参数设置。
|
||||
taskObject.put(KEY_VERSION, "4.0");
|
||||
// 设置是否输出词信息,默认为false,开启时需要设置version为4.0及以上。
|
||||
taskObject.put(KEY_ENABLE_WORDS, true);
|
||||
String task = taskObject.toJSONString();
|
||||
System.out.println(task);
|
||||
// 设置以上JSON字符串为Body参数。
|
||||
postRequest.putBodyParameter(KEY_TASK, task);
|
||||
// 设置为POST方式的请求。
|
||||
postRequest.setMethod(MethodType.POST);
|
||||
// postRequest.setHttpContentType(FormatType.JSON); //当aliyun-java-sdk-core 版本为4.6.0及以上时,请取消该行注释
|
||||
/**
|
||||
* 3. 提交录音文件识别请求,获取录音文件识别请求任务的ID,以供识别结果查询使用。
|
||||
*/
|
||||
String taskId = null;
|
||||
try {
|
||||
CommonResponse postResponse = client.getCommonResponse(postRequest);
|
||||
System.err.println("提交录音文件识别请求的响应:" + postResponse.getData());
|
||||
if (postResponse.getHttpStatus() == 200) {
|
||||
JSONObject result = JSONObject.parseObject(postResponse.getData());
|
||||
String statusText = result.getString(KEY_STATUS_TEXT);
|
||||
if (STATUS_SUCCESS.equals(statusText)) {
|
||||
taskId = result.getString(KEY_TASK_ID);
|
||||
}
|
||||
}
|
||||
} catch (ClientException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return taskId;
|
||||
}
|
||||
public String getFileTransResult(String taskId) {
|
||||
/**
|
||||
* 1. 创建CommonRequest,设置任务ID。
|
||||
*/
|
||||
CommonRequest getRequest = new CommonRequest();
|
||||
// 设置域名
|
||||
getRequest.setDomain(DOMAIN);
|
||||
// 设置API版本
|
||||
getRequest.setVersion(API_VERSION);
|
||||
// 设置action
|
||||
getRequest.setAction(GET_REQUEST_ACTION);
|
||||
// 设置产品名称
|
||||
getRequest.setProduct(PRODUCT);
|
||||
// 设置任务ID为查询参数
|
||||
getRequest.putQueryParameter(KEY_TASK_ID, taskId);
|
||||
// 设置为GET方式的请求
|
||||
getRequest.setMethod(MethodType.GET);
|
||||
/**
|
||||
* 2. 提交录音文件识别结果查询请求
|
||||
* 以轮询的方式进行识别结果的查询,直到服务端返回的状态描述为“SUCCESS”或错误描述,则结束轮询。
|
||||
*/
|
||||
String result = null;
|
||||
while (true) {
|
||||
try {
|
||||
CommonResponse getResponse = client.getCommonResponse(getRequest);
|
||||
System.err.println("识别查询结果:" + getResponse.getData());
|
||||
if (getResponse.getHttpStatus() != 200) {
|
||||
break;
|
||||
}
|
||||
JSONObject rootObj = JSONObject.parseObject(getResponse.getData());
|
||||
String statusText = rootObj.getString(KEY_STATUS_TEXT);
|
||||
if (STATUS_RUNNING.equals(statusText) || STATUS_QUEUEING.equals(statusText)) {
|
||||
// 继续轮询,注意设置轮询时间间隔。
|
||||
Thread.sleep(10000);
|
||||
}
|
||||
else {
|
||||
// 状态信息为成功,返回识别结果;状态信息为异常,返回空。
|
||||
if (STATUS_SUCCESS.equals(statusText)) {
|
||||
result = rootObj.getString(KEY_RESULT);
|
||||
// 状态信息为成功,但没有识别结果,则可能是由于文件里全是静音、噪音等导致识别为空。
|
||||
if(result == null) {
|
||||
result = "";
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
public static void main(String args[]) throws Exception {
|
||||
final String accessKeyId = System.getenv().get("ALIYUN_AK_ID");
|
||||
final String accessKeySecret = System.getenv().get("ALIYUN_AK_SECRET");
|
||||
final String appKey = System.getenv().get("NLS_APP_KEY");
|
||||
String fileLink = "https://gw.alipayobjects.com/os/bmw-prod/0574ee2e-f494-45a5-820f-63aee583045a.wav";
|
||||
TikFileTransCharacters demo = new TikFileTransCharacters(accessKeyId, accessKeySecret);
|
||||
// 第一步:提交录音文件识别请求,获取任务ID用于后续的识别结果轮询。
|
||||
String taskId = demo.submitFileTransRequest(appKey, fileLink);
|
||||
if (taskId != null) {
|
||||
System.out.println("录音文件识别请求成功,task_id: " + taskId);
|
||||
}
|
||||
else {
|
||||
System.out.println("录音文件识别请求失败!");
|
||||
return;
|
||||
}
|
||||
// 第二步:根据任务ID轮询识别结果。
|
||||
String result = demo.getFileTransResult(taskId);
|
||||
if (result != null) {
|
||||
System.out.println("录音文件识别结果查询成功:" + result);
|
||||
}
|
||||
else {
|
||||
System.out.println("录音文件识别结果查询失败!");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.tikhup.service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface TikHupService {
|
||||
|
||||
/**
|
||||
* 获取用户主页作品数据
|
||||
* @param sec_user_id 类型
|
||||
* @param sec_user_id 用户
|
||||
* @param count 查询总数
|
||||
* @return Response
|
||||
*/
|
||||
Object fetch_user_post_videos(String type,String sec_user_id,int max_cursor, int count);
|
||||
|
||||
|
||||
Object postTikHup(String type,String methodType,String urlParams,String paramType);
|
||||
|
||||
/**
|
||||
* 音频转文字
|
||||
* @param downloadUrl 下载地址
|
||||
* @return 语音文字
|
||||
*/
|
||||
Object videoToCharacters(String downloadUrl);
|
||||
|
||||
/**
|
||||
* 批量音频转文字
|
||||
* @param fileLinkList 音频地址
|
||||
* @return 语音文字
|
||||
*/
|
||||
Object videoToCharacters2(List<String> fileLinkList);
|
||||
|
||||
/**
|
||||
*
|
||||
* @param promptType 提示词类型
|
||||
* @param content 提示词内容
|
||||
* @return deepseek改写后的内容
|
||||
*/
|
||||
Object deepseekAnalysis(String promptType,String content);
|
||||
|
||||
}
|
||||
@@ -1,234 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.tikhup.service;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
||||
import cn.iocoder.yudao.module.ai.tikhup.mapper.TikPromptMapper;
|
||||
import cn.iocoder.yudao.module.ai.tikhup.mapper.TikTokenMapper;
|
||||
import cn.iocoder.yudao.module.ai.tikhup.vo.TikPromptVO;
|
||||
import cn.iocoder.yudao.module.ai.tikhup.vo.TikTokenVO;
|
||||
import com.alibaba.dashscope.audio.asr.transcription.Transcription;
|
||||
import com.alibaba.dashscope.audio.asr.transcription.TranscriptionParam;
|
||||
import com.alibaba.dashscope.audio.asr.transcription.TranscriptionQueryParam;
|
||||
import com.alibaba.dashscope.audio.asr.transcription.TranscriptionResult;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.google.gson.GsonBuilder;
|
||||
import com.mashape.unirest.http.HttpResponse;
|
||||
import com.mashape.unirest.http.Unirest;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class TikHupServiceImpl implements TikHupService {
|
||||
|
||||
private final TikTokenMapper tikTokenMapper;
|
||||
|
||||
private final TikPromptMapper tikPromptMapper;
|
||||
|
||||
@Override
|
||||
public Object fetch_user_post_videos(String type,String sec_user_id, int max_cursor, int count){
|
||||
String url = StringUtils.EMPTY;
|
||||
if("xiaohongshu".equals(type)){
|
||||
url = "https://api.tikhub.io/api/v1/xiaohongshu/app/get_user_info";
|
||||
} else if("tik-web".equals(type)){
|
||||
url = "https://api.tikhub.io/api/v1/douyin/web/fetch_user_post_videos";
|
||||
} else if("tik-app".equals(type)){
|
||||
url = "https://api.tikhub.io/api/v1/douyin/app/v3/fetch_user_post_videos";
|
||||
}
|
||||
TikTokenVO tikTokenVO = tikTokenMapper.getPlatformToken(url);
|
||||
String Authorization = tikTokenVO.getPlatformToken();
|
||||
try{
|
||||
Unirest.setTimeouts(0, 0);
|
||||
HttpResponse<String> response = Unirest.get(url+"?sec_user_id="+sec_user_id+"&max_cursor="+max_cursor+"&count="+count)
|
||||
.header("Authorization", "Bearer "+Authorization)
|
||||
.asString();
|
||||
if(response.getStatus() == 200){
|
||||
Long userId = SecurityFrameworkUtils.getLoginUser().getId();
|
||||
return JSON.parseObject(response.getBody());
|
||||
}
|
||||
}catch (Exception e){
|
||||
log.error("fetch_user_post_videos接口调用异常");
|
||||
}
|
||||
return new HashMap<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object postTikHup(String type, String methodType, String urlParams, String paramType) {
|
||||
// 1. 参数校验
|
||||
if (StringUtils.isBlank(type)) {
|
||||
log.error("postTikHup: type 参数为空");
|
||||
return CommonResult.error(400, "接口类型不能为空");
|
||||
}
|
||||
if (StringUtils.isBlank(methodType)) {
|
||||
log.error("postTikHup: methodType 参数为空");
|
||||
return CommonResult.error(400, "请求方法类型不能为空");
|
||||
}
|
||||
|
||||
// 2. 获取接口配置信息
|
||||
TikTokenVO tikTokenVO = tikTokenMapper.getInterfaceUrl(type);
|
||||
if (tikTokenVO == null) {
|
||||
log.error("postTikHup: 未找到接口类型 {} 的配置信息", type);
|
||||
return CommonResult.error(404, "未找到接口类型 " + type + " 的配置信息");
|
||||
}
|
||||
|
||||
String authorization = tikTokenVO.getPlatformToken();
|
||||
String url = tikTokenVO.getPlatformUrl();
|
||||
|
||||
if (StringUtils.isBlank(authorization)) {
|
||||
log.error("postTikHup: 接口类型 {} 的 token 为空", type);
|
||||
return CommonResult.error(500, "接口配置错误:token 为空");
|
||||
}
|
||||
if (StringUtils.isBlank(url)) {
|
||||
log.error("postTikHup: 接口类型 {} 的 URL 为空", type);
|
||||
return CommonResult.error(500, "接口配置错误:URL 为空");
|
||||
}
|
||||
|
||||
// 3. 统一转换为小写进行比较(兼容大小写)
|
||||
String methodTypeLower = methodType.toLowerCase();
|
||||
String paramTypeLower = paramType != null ? paramType.toLowerCase() : "";
|
||||
|
||||
try {
|
||||
Unirest.setTimeouts(0, 0);
|
||||
HttpResponse<String> response;
|
||||
|
||||
// 4. 根据请求方法和参数类型构建请求
|
||||
if ("post".equals(methodTypeLower) && "json".equals(paramTypeLower)) {
|
||||
// POST + JSON: 将 urlParams 作为 JSON body
|
||||
log.debug("postTikHup: POST JSON 请求, URL: {}, Body: {}", url, urlParams);
|
||||
response = Unirest.post(url)
|
||||
.header("Authorization", "Bearer " + authorization)
|
||||
.header("Content-Type", "application/json")
|
||||
.body(urlParams)
|
||||
.asString();
|
||||
} else if ("post".equals(methodTypeLower)) {
|
||||
// POST + 表单参数: 将 urlParams 作为 URL 查询参数
|
||||
log.debug("postTikHup: POST 表单请求, URL: {}?{}", url, urlParams);
|
||||
response = Unirest.post(url + "?" + urlParams)
|
||||
.header("Authorization", "Bearer " + authorization)
|
||||
.asString();
|
||||
} else {
|
||||
// GET 或其他方法: 将 urlParams 作为 URL 查询参数
|
||||
// 处理 URL 拼接:如果 URL 已包含查询参数,使用 & 连接,否则使用 ? 连接
|
||||
String finalUrl = url;
|
||||
if (urlParams != null && !urlParams.trim().isEmpty()) {
|
||||
if (url.contains("?")) {
|
||||
// URL 已包含查询参数,使用 & 连接
|
||||
finalUrl = url + "&" + urlParams;
|
||||
} else {
|
||||
// URL 不包含查询参数,使用 ? 连接
|
||||
finalUrl = url + "?" + urlParams;
|
||||
}
|
||||
}
|
||||
log.info("postTikHup: GET 请求, 原始URL: {}, 参数: {}, 最终URL: {}", url, urlParams, finalUrl);
|
||||
response = Unirest.get(finalUrl)
|
||||
.header("Authorization", "Bearer " + authorization)
|
||||
.asString();
|
||||
}
|
||||
|
||||
// 5. 检查响应状态码
|
||||
int statusCode = response.getStatus();
|
||||
String responseBody = response.getBody();
|
||||
|
||||
if (statusCode == 200) {
|
||||
if (StringUtils.isNotBlank(responseBody)) {
|
||||
// 尝试解析为 JSON,如果失败则直接返回字符串
|
||||
try {
|
||||
return JSON.parseObject(responseBody);
|
||||
} catch (Exception e) {
|
||||
// 如果不是 JSON,直接返回字符串
|
||||
return responseBody;
|
||||
}
|
||||
} else {
|
||||
log.warn("postTikHup: 接口返回空响应, URL: {}", url);
|
||||
return CommonResult.error(500, "接口返回空响应");
|
||||
}
|
||||
} else {
|
||||
log.error("postTikHup: 接口调用失败, URL: {}, 状态码: {}, 响应: {}", url, statusCode, responseBody);
|
||||
return CommonResult.error(statusCode, "接口调用失败: " + (StringUtils.isNotBlank(responseBody) ? responseBody : "HTTP " + statusCode));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("postTikHup: 接口调用异常, URL: {}, 错误信息: {}", url, e.getMessage(), e);
|
||||
return CommonResult.error(500, "接口调用异常: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private final String appKey = "sldJ4XSpYp3rKALZ ";
|
||||
private final String accessKeyId = "LTAI5tPV9Ag3csf41GZjaLTA";
|
||||
private final String accessKeySecret = "kDqlGeJTKw6tJtFYiaY8vQTFuVIQDs";
|
||||
private final String deepseekApiKey="sk-7f666f993b144d279ae375a015e4de56";
|
||||
|
||||
@Override
|
||||
public Object videoToCharacters(String fileLink){
|
||||
TikFileTransCharacters tikFileTransCharacters = new TikFileTransCharacters(accessKeyId, accessKeySecret);
|
||||
// 第一步:提交录音文件识别请求,获取任务ID用于后续的识别结果轮询。
|
||||
String taskId = tikFileTransCharacters.submitFileTransRequest(appKey, fileLink);
|
||||
if (taskId == null) {
|
||||
return CommonResult.error(500,"录音文件识别请求失败!");
|
||||
}
|
||||
// 第二步:根据任务ID轮询识别结果。
|
||||
String transResult = tikFileTransCharacters.getFileTransResult(taskId);
|
||||
if (transResult == null) {
|
||||
return CommonResult.error(501,"录音文件识别请求失败!");
|
||||
}
|
||||
return CommonResult.success(transResult);
|
||||
}
|
||||
|
||||
private final String apiKey = "sk-10c746f8cb8640738f8d6b71af699003";
|
||||
|
||||
@Override
|
||||
public Object videoToCharacters2(List<String> fileLinkList){
|
||||
// 创建转写请求参数
|
||||
TranscriptionParam param =
|
||||
TranscriptionParam.builder()
|
||||
// 若没有将API Key配置到环境变量中,需将apiKey替换为自己的API Key
|
||||
.apiKey(apiKey)
|
||||
.model("paraformer-v1")
|
||||
// “language_hints”只支持paraformer-v2模型
|
||||
.parameter("language_hints", new String[]{"zh", "en"})
|
||||
.fileUrls(fileLinkList)
|
||||
.build();
|
||||
try {
|
||||
Transcription transcription = new Transcription();
|
||||
// 提交转写请求
|
||||
TranscriptionResult result = transcription.asyncCall(param);
|
||||
log.info("RequestId: {}" ,result.getRequestId());
|
||||
// 阻塞等待任务完成并获取结果
|
||||
result = transcription.wait(
|
||||
TranscriptionQueryParam.FromTranscriptionParam(param, result.getTaskId()));
|
||||
return CommonResult.success(new GsonBuilder().setPrettyPrinting().create().toJson(result.getOutput()));
|
||||
} catch (Exception e) {
|
||||
log.error(e.getMessage());
|
||||
return CommonResult.error(500,"录音文件识别请求失败!");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public Object deepseekAnalysis(String promptType,String content){
|
||||
Unirest.setTimeouts(0, 0);
|
||||
try{
|
||||
TikPromptVO tikPromptVO = tikPromptMapper.getTikPromptVO(promptType);
|
||||
HttpResponse<String> response = Unirest.post("https://api.deepseek.com/chat/completions")
|
||||
.header("Content-Type", "application/json")
|
||||
.header("Accept", "application/json")
|
||||
.header("Authorization", "Bearer " + deepseekApiKey)
|
||||
.body("{\n \"messages\": [\n {\n \"content\": \""+tikPromptVO.getPrompt()+"\n\n\n原文如下:\n"+content+"\",\n \"role\": \"system\"\n },\n {\n \"content\": \"Hi\",\n \"role\": \"user\"\n }\n ],\n \"model\": \"deepseek-chat\",\n \"frequency_penalty\": 0,\n \"max_tokens\": 8000,\n \"presence_penalty\": 0,\n \"response_format\": {\n \"type\": \"text\"\n },\n \"stop\": null,\n \"stream\": false,\n \"stream_options\": null,\n \"temperature\": 1,\n \"top_p\": 1,\n \"tools\": null,\n \"tool_choice\": \"none\",\n \"logprobs\": false,\n \"top_logprobs\": null\n}")
|
||||
.asString();
|
||||
if(response.getStatus() == 200){
|
||||
return response.getBody();
|
||||
}
|
||||
}catch (Exception e){
|
||||
log.error(e.getMessage());
|
||||
return CommonResult.error(500,"文案改写失败!");
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.tikhup.vo;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
|
||||
@TableName("tik_prompt")
|
||||
@Data
|
||||
public class TikPromptVO {
|
||||
|
||||
@TableField(value = "prompt_type")
|
||||
private String promptType;
|
||||
|
||||
@TableField(value = "prompt_name")
|
||||
private String promptName;
|
||||
|
||||
@TableField(value = "prompt")
|
||||
private String prompt;
|
||||
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.tikhup.vo;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
|
||||
@TableName("tik_token")
|
||||
@Data
|
||||
public class TikTokenVO {
|
||||
|
||||
@TableField(value = "platform_url")
|
||||
private String platformUrl;
|
||||
|
||||
@TableField(value = "platform_token")
|
||||
private String platformToken;
|
||||
|
||||
@TableField(value = "interface_type")
|
||||
private String interfaceType;
|
||||
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.userprompt.controller.app;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.userprompt.UserPromptDO;
|
||||
import cn.iocoder.yudao.module.ai.userprompt.service.UserPromptService;
|
||||
import cn.iocoder.yudao.module.ai.userprompt.vo.UserPromptPageReqVO;
|
||||
import cn.iocoder.yudao.module.ai.userprompt.vo.UserPromptRespVO;
|
||||
import cn.iocoder.yudao.module.ai.userprompt.vo.UserPromptSaveReqVO;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.validation.Valid;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||
import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.USER_PROMPT_NOT_EXISTS;
|
||||
|
||||
@Tag(name = "用户 App - 用户提示词")
|
||||
@RestController
|
||||
@RequestMapping("/ai/user-prompt")
|
||||
@Validated
|
||||
public class AppUserPromptController {
|
||||
|
||||
@Resource
|
||||
private UserPromptService userPromptService;
|
||||
|
||||
@PostMapping("/create")
|
||||
@Operation(summary = "创建用户提示词")
|
||||
public CommonResult<Long> createUserPrompt(@RequestBody UserPromptSaveReqVO createReqVO) {
|
||||
// 先设置当前登录用户ID(在验证之前设置,避免 @NotNull 验证失败)
|
||||
Long userId = getLoginUserId();
|
||||
if (userId == null) {
|
||||
return CommonResult.error(401, "用户未登录");
|
||||
}
|
||||
createReqVO.setUserId(userId);
|
||||
|
||||
// 手动验证必要字段
|
||||
if (createReqVO.getName() == null || createReqVO.getName().trim().isEmpty()) {
|
||||
return CommonResult.error(400, "提示词名称不能为空");
|
||||
}
|
||||
if (createReqVO.getContent() == null || createReqVO.getContent().trim().isEmpty()) {
|
||||
return CommonResult.error(400, "提示词内容不能为空");
|
||||
}
|
||||
if (createReqVO.getStatus() == null) {
|
||||
return CommonResult.error(400, "状态不能为空");
|
||||
}
|
||||
|
||||
// 设置默认值(如果前端没有传递)
|
||||
if (createReqVO.getIsPublic() == null) {
|
||||
createReqVO.setIsPublic(false); // 默认私有
|
||||
}
|
||||
if (createReqVO.getSort() == null) {
|
||||
createReqVO.setSort(0); // 默认排序为 0
|
||||
}
|
||||
if (createReqVO.getUseCount() == null) {
|
||||
createReqVO.setUseCount(0); // 默认使用次数为 0
|
||||
}
|
||||
|
||||
return success(userPromptService.createUserPrompt(createReqVO));
|
||||
}
|
||||
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "更新用户提示词")
|
||||
public CommonResult<Boolean> updateUserPrompt(@RequestBody UserPromptSaveReqVO updateReqVO) {
|
||||
// 设置当前登录用户ID,确保只能更新自己的提示词
|
||||
updateReqVO.setUserId(getLoginUserId());
|
||||
// 更新时,如果前端没有传递 sort、useCount、isPublic 等字段,后端会自动从数据库获取
|
||||
// 注意:移除了 @Valid 注解,因为这些字段在更新时可以为空,后端会自动填充
|
||||
userPromptService.updateUserPrompt(updateReqVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除用户提示词")
|
||||
@Parameter(name = "id", description = "编号", required = true)
|
||||
public CommonResult<Boolean> deleteUserPrompt(@RequestParam("id") Long id) {
|
||||
// 验证是否为当前用户的提示词
|
||||
UserPromptDO userPrompt = userPromptService.getUserPrompt(id);
|
||||
if (userPrompt == null || !userPrompt.getUserId().equals(getLoginUserId())) {
|
||||
// 提示词不存在或不属于当前用户,返回错误
|
||||
throw exception(USER_PROMPT_NOT_EXISTS);
|
||||
}
|
||||
userPromptService.deleteUserPrompt(id);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@GetMapping("/get")
|
||||
@Operation(summary = "获得用户提示词")
|
||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||
public CommonResult<UserPromptRespVO> getUserPrompt(@RequestParam("id") Long id) {
|
||||
UserPromptDO userPrompt = userPromptService.getUserPrompt(id);
|
||||
// 验证是否为当前用户的提示词
|
||||
if (userPrompt != null && !userPrompt.getUserId().equals(getLoginUserId())) {
|
||||
userPrompt = null;
|
||||
}
|
||||
return success(BeanUtils.toBean(userPrompt, UserPromptRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/page")
|
||||
@Operation(summary = "获得用户提示词分页")
|
||||
public CommonResult<PageResult<UserPromptRespVO>> getUserPromptPage(@Valid UserPromptPageReqVO pageReqVO) {
|
||||
// 设置当前登录用户ID,只查询当前用户的提示词
|
||||
pageReqVO.setUserId(getLoginUserId());
|
||||
PageResult<UserPromptDO> pageResult = userPromptService.getUserPromptPage(pageReqVO);
|
||||
return success(BeanUtils.toBean(pageResult, UserPromptRespVO.class));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.userprompt.mapper;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.userprompt.UserPromptDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import cn.iocoder.yudao.module.ai.userprompt.vo.*;
|
||||
|
||||
/**
|
||||
* 用户提示词 Mapper
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
@Mapper
|
||||
public interface UserPromptMapper extends BaseMapperX<UserPromptDO> {
|
||||
|
||||
default PageResult<UserPromptDO> selectPage(UserPromptPageReqVO reqVO) {
|
||||
return selectPage(reqVO, new LambdaQueryWrapperX<UserPromptDO>()
|
||||
.eqIfPresent(UserPromptDO::getUserId, reqVO.getUserId())
|
||||
.likeIfPresent(UserPromptDO::getName, reqVO.getName())
|
||||
.eqIfPresent(UserPromptDO::getContent, reqVO.getContent())
|
||||
.eqIfPresent(UserPromptDO::getCategory, reqVO.getCategory())
|
||||
.eqIfPresent(UserPromptDO::getIsPublic, reqVO.getIsPublic())
|
||||
.eqIfPresent(UserPromptDO::getSort, reqVO.getSort())
|
||||
.eqIfPresent(UserPromptDO::getUseCount, reqVO.getUseCount())
|
||||
.eqIfPresent(UserPromptDO::getStatus, reqVO.getStatus())
|
||||
.eqIfPresent(UserPromptDO::getRemark, reqVO.getRemark())
|
||||
.betweenIfPresent(UserPromptDO::getCreateTime, reqVO.getCreateTime())
|
||||
.orderByDesc(UserPromptDO::getId));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.userprompt.service;
|
||||
|
||||
import java.util.*;
|
||||
import jakarta.validation.*;
|
||||
import cn.iocoder.yudao.module.ai.userprompt.vo.*;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.userprompt.UserPromptDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
|
||||
/**
|
||||
* 用户提示词 Service 接口
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
public interface UserPromptService {
|
||||
|
||||
/**
|
||||
* 创建用户提示词
|
||||
*
|
||||
* @param createReqVO 创建信息
|
||||
* @return 编号
|
||||
*/
|
||||
Long createUserPrompt(@Valid UserPromptSaveReqVO createReqVO);
|
||||
|
||||
/**
|
||||
* 更新用户提示词
|
||||
*
|
||||
* @param updateReqVO 更新信息
|
||||
*/
|
||||
void updateUserPrompt(@Valid UserPromptSaveReqVO updateReqVO);
|
||||
|
||||
/**
|
||||
* 删除用户提示词
|
||||
*
|
||||
* @param id 编号
|
||||
*/
|
||||
void deleteUserPrompt(Long id);
|
||||
|
||||
/**
|
||||
* 批量删除用户提示词
|
||||
*
|
||||
* @param ids 编号
|
||||
*/
|
||||
void deleteUserPromptListByIds(List<Long> ids);
|
||||
|
||||
/**
|
||||
* 获得用户提示词
|
||||
*
|
||||
* @param id 编号
|
||||
* @return 用户提示词
|
||||
*/
|
||||
UserPromptDO getUserPrompt(Long id);
|
||||
|
||||
/**
|
||||
* 获得用户提示词分页
|
||||
*
|
||||
* @param pageReqVO 分页查询
|
||||
* @return 用户提示词分页
|
||||
*/
|
||||
PageResult<UserPromptDO> getUserPromptPage(UserPromptPageReqVO pageReqVO);
|
||||
|
||||
}
|
||||
@@ -1,112 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.userprompt.service;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import org.springframework.stereotype.Service;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.*;
|
||||
import cn.iocoder.yudao.module.ai.userprompt.vo.*;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.userprompt.UserPromptDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
|
||||
import cn.iocoder.yudao.module.ai.userprompt.mapper.UserPromptMapper;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
|
||||
import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.*;
|
||||
|
||||
/**
|
||||
* 用户提示词 Service 实现类
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
@Service
|
||||
@Validated
|
||||
public class UserPromptServiceImpl implements UserPromptService {
|
||||
|
||||
@Resource
|
||||
private UserPromptMapper userPromptMapper;
|
||||
|
||||
@Override
|
||||
public Long createUserPrompt(UserPromptSaveReqVO createReqVO) {
|
||||
// 插入
|
||||
UserPromptDO userPrompt = BeanUtils.toBean(createReqVO, UserPromptDO.class);
|
||||
userPromptMapper.insert(userPrompt);
|
||||
|
||||
// 返回
|
||||
return userPrompt.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserPrompt(UserPromptSaveReqVO updateReqVO) {
|
||||
// 1. 手动验证前端表单字段(与前端表单对应)
|
||||
if (updateReqVO.getName() == null || updateReqVO.getName().trim().isEmpty()) {
|
||||
throw new IllegalArgumentException("提示词名称不能为空");
|
||||
}
|
||||
if (updateReqVO.getContent() == null || updateReqVO.getContent().trim().isEmpty()) {
|
||||
throw new IllegalArgumentException("提示词内容不能为空");
|
||||
}
|
||||
if (updateReqVO.getStatus() == null) {
|
||||
throw new IllegalArgumentException("状态不能为空");
|
||||
}
|
||||
|
||||
// 2. 校验存在并获取现有记录
|
||||
UserPromptDO existing = validateUserPromptExists(updateReqVO.getId());
|
||||
|
||||
// 3. 手动设置要更新的字段(只更新前端表单中的字段)
|
||||
UserPromptDO updateObj = new UserPromptDO();
|
||||
updateObj.setId(updateReqVO.getId());
|
||||
updateObj.setName(updateReqVO.getName().trim());
|
||||
updateObj.setContent(updateReqVO.getContent().trim());
|
||||
updateObj.setCategory(updateReqVO.getCategory() != null ? updateReqVO.getCategory().trim() : null);
|
||||
updateObj.setStatus(updateReqVO.getStatus());
|
||||
|
||||
// 4. 自动填充前端表单中没有的字段(从数据库获取)
|
||||
updateObj.setSort(existing.getSort());
|
||||
updateObj.setUseCount(existing.getUseCount());
|
||||
updateObj.setIsPublic(existing.getIsPublic());
|
||||
updateObj.setUserId(existing.getUserId()); // 保持用户ID不变
|
||||
|
||||
// 5. 执行更新
|
||||
userPromptMapper.updateById(updateObj);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteUserPrompt(Long id) {
|
||||
// 校验存在
|
||||
validateUserPromptExists(id);
|
||||
// 删除
|
||||
userPromptMapper.deleteById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteUserPromptListByIds(List<Long> ids) {
|
||||
// 删除
|
||||
userPromptMapper.deleteByIds(ids);
|
||||
}
|
||||
|
||||
|
||||
private UserPromptDO validateUserPromptExists(Long id) {
|
||||
UserPromptDO userPrompt = userPromptMapper.selectById(id);
|
||||
if (userPrompt == null) {
|
||||
throw exception(USER_PROMPT_NOT_EXISTS);
|
||||
}
|
||||
return userPrompt;
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserPromptDO getUserPrompt(Long id) {
|
||||
return userPromptMapper.selectById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<UserPromptDO> getUserPromptPage(UserPromptPageReqVO pageReqVO) {
|
||||
return userPromptMapper.selectPage(pageReqVO);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.userprompt.vo;
|
||||
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||
|
||||
@Schema(description = "管理后台 - 用户提示词分页 Request VO")
|
||||
@Data
|
||||
public class UserPromptPageReqVO extends PageParam {
|
||||
|
||||
@Schema(description = "用户编号", example = "12926")
|
||||
private Long userId;
|
||||
|
||||
@Schema(description = "提示词名称", example = "张三")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "提示词内容")
|
||||
private String content;
|
||||
|
||||
@Schema(description = "分类/标签")
|
||||
private String category;
|
||||
|
||||
@Schema(description = "是否公开(0-私有,1-公开)")
|
||||
private Boolean isPublic;
|
||||
|
||||
@Schema(description = "排序")
|
||||
private Integer sort;
|
||||
|
||||
@Schema(description = "使用次数", example = "22185")
|
||||
private Integer useCount;
|
||||
|
||||
@Schema(description = "状态(0-禁用,1-启用)", example = "1")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "备注", example = "你说的对")
|
||||
private String remark;
|
||||
|
||||
@Schema(description = "创建时间")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime[] createTime;
|
||||
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.userprompt.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import java.time.LocalDateTime;
|
||||
import cn.idev.excel.annotation.*;
|
||||
|
||||
@Schema(description = "管理后台 - 用户提示词 Response VO")
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class UserPromptRespVO {
|
||||
|
||||
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12482")
|
||||
@ExcelProperty("编号")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12926")
|
||||
@ExcelProperty("用户编号")
|
||||
private Long userId;
|
||||
|
||||
@Schema(description = "提示词名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
|
||||
@ExcelProperty("提示词名称")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "提示词内容", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("提示词内容")
|
||||
private String content;
|
||||
|
||||
@Schema(description = "分类/标签")
|
||||
@ExcelProperty("分类/标签")
|
||||
private String category;
|
||||
|
||||
@Schema(description = "是否公开(0-私有,1-公开)", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("是否公开(0-私有,1-公开)")
|
||||
private Boolean isPublic;
|
||||
|
||||
@Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("排序")
|
||||
private Integer sort;
|
||||
|
||||
@Schema(description = "使用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "22185")
|
||||
@ExcelProperty("使用次数")
|
||||
private Integer useCount;
|
||||
|
||||
@Schema(description = "状态(0-禁用,1-启用)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
@ExcelProperty("状态(0-禁用,1-启用)")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "备注", example = "你说的对")
|
||||
@ExcelProperty("备注")
|
||||
private String remark;
|
||||
|
||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("创建时间")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
package cn.iocoder.yudao.module.ai.userprompt.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import jakarta.validation.constraints.*;
|
||||
|
||||
@Schema(description = "管理后台 - 用户提示词新增/修改 Request VO")
|
||||
@Data
|
||||
public class UserPromptSaveReqVO {
|
||||
|
||||
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12482")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12926")
|
||||
@NotNull(message = "用户编号不能为空")
|
||||
private Long userId;
|
||||
|
||||
@Schema(description = "提示词名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
|
||||
@NotEmpty(message = "提示词名称不能为空")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "提示词内容", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotEmpty(message = "提示词内容不能为空")
|
||||
private String content;
|
||||
|
||||
@Schema(description = "分类/标签")
|
||||
private String category;
|
||||
|
||||
@Schema(description = "是否公开(0-私有,1-公开)", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "是否公开(0-私有,1-公开)不能为空")
|
||||
private Boolean isPublic;
|
||||
|
||||
@Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "排序不能为空")
|
||||
private Integer sort;
|
||||
|
||||
@Schema(description = "使用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "22185")
|
||||
@NotNull(message = "使用次数不能为空")
|
||||
private Integer useCount;
|
||||
|
||||
@Schema(description = "状态(0-禁用,1-启用)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
@NotNull(message = "状态(0-禁用,1-启用)不能为空")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "备注", example = "你说的对")
|
||||
private String remark;
|
||||
|
||||
}
|
||||
@@ -1,17 +1,17 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.chat;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.chat;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.ObjUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationCreateMyReqVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationPageReqVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationRespVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationUpdateMyReqVO;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO;
|
||||
import cn.iocoder.yudao.module.ai.service.chat.AiChatConversationService;
|
||||
import cn.iocoder.yudao.module.ai.service.chat.AiChatMessageService;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.chat.vo.conversation.AiChatConversationCreateMyReqVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.chat.vo.conversation.AiChatConversationPageReqVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.chat.vo.conversation.AiChatConversationRespVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.chat.vo.conversation.AiChatConversationUpdateMyReqVO;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.chat.AiChatConversationDO;
|
||||
import cn.iocoder.yudao.module.tik.service.chat.AiChatConversationService;
|
||||
import cn.iocoder.yudao.module.tik.service.chat.AiChatMessageService;
|
||||
import com.fhs.core.trans.anno.TransMethodResult;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.chat;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.chat;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.ObjUtil;
|
||||
@@ -6,20 +6,20 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message.AiChatMessagePageReqVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message.AiChatMessageRespVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message.AiChatMessageSendReqVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message.AiChatMessageSendRespVO;
|
||||
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.dal.dataobject.knowledge.AiKnowledgeDocumentDO;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeSegmentDO;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
|
||||
import cn.iocoder.yudao.module.ai.service.chat.AiChatConversationService;
|
||||
import cn.iocoder.yudao.module.ai.service.chat.AiChatMessageService;
|
||||
import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeDocumentService;
|
||||
import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeSegmentService;
|
||||
import cn.iocoder.yudao.module.ai.service.model.AiChatRoleService;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.chat.vo.message.AiChatMessagePageReqVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.chat.vo.message.AiChatMessageRespVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.chat.vo.message.AiChatMessageSendReqVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.chat.vo.message.AiChatMessageSendRespVO;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.chat.AiChatConversationDO;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.chat.AiChatMessageDO;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.knowledge.AiKnowledgeDocumentDO;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.knowledge.AiKnowledgeSegmentDO;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.model.AiChatRoleDO;
|
||||
import cn.iocoder.yudao.module.tik.service.chat.AiChatConversationService;
|
||||
import cn.iocoder.yudao.module.tik.service.chat.AiChatMessageService;
|
||||
import cn.iocoder.yudao.module.tik.service.knowledge.AiKnowledgeDocumentService;
|
||||
import cn.iocoder.yudao.module.tik.service.knowledge.AiKnowledgeSegmentService;
|
||||
import cn.iocoder.yudao.module.tik.service.model.AiChatRoleService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.chat.vo.conversation;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.chat.vo.conversation;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
@@ -1,7 +1,7 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.chat.vo.conversation;
|
||||
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.model.AiModelDO;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.model.AiChatRoleDO;
|
||||
import com.fhs.core.trans.anno.Trans;
|
||||
import com.fhs.core.trans.constant.TransType;
|
||||
import com.fhs.core.trans.vo.VO;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.chat.vo.conversation;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.chat.vo.message;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
@@ -1,6 +1,6 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.chat.vo.message;
|
||||
|
||||
import cn.iocoder.yudao.module.ai.framework.ai.core.webserch.AiWebSearchResponse;
|
||||
import cn.iocoder.yudao.module.tik.framework.ai.core.webserch.AiWebSearchResponse;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.chat.vo.message;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
@@ -1,6 +1,6 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.chat.vo.message;
|
||||
|
||||
import cn.iocoder.yudao.module.ai.framework.ai.core.webserch.AiWebSearchResponse;
|
||||
import cn.iocoder.yudao.module.tik.framework.ai.core.webserch.AiWebSearchResponse;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.image;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.image;
|
||||
|
||||
import cn.hutool.core.util.ObjUtil;
|
||||
import cn.iocoder.yudao.module.ai.framework.ai.core.model.midjourney.api.MidjourneyApi;
|
||||
import cn.iocoder.yudao.module.tik.framework.ai.core.model.midjourney.api.MidjourneyApi;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.image.vo.*;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyActionReqVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyImagineReqVO;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO;
|
||||
import cn.iocoder.yudao.module.ai.service.image.AiImageService;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.image.vo.*;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.image.vo.midjourney.AiMidjourneyActionReqVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.image.vo.midjourney.AiMidjourneyImagineReqVO;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.image.AiImageDO;
|
||||
import cn.iocoder.yudao.module.tik.service.image.AiImageService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.image.vo;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.image.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.image.vo;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.image.vo;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.image.vo;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.image.vo;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
@@ -1,6 +1,6 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.image.vo;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.image.vo;
|
||||
|
||||
import cn.iocoder.yudao.module.ai.framework.ai.core.model.midjourney.api.MidjourneyApi;
|
||||
import cn.iocoder.yudao.module.tik.framework.ai.core.model.midjourney.api.MidjourneyApi;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.image.vo;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.image.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.image.vo.midjourney;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.image.vo.midjourney;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
@@ -1,14 +1,14 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.knowledge;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.knowledge;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgePageReqVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeRespVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeSaveReqVO;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDO;
|
||||
import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeService;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.knowledge.AiKnowledgePageReqVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.knowledge.AiKnowledgeRespVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.knowledge.AiKnowledgeSaveReqVO;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.knowledge.AiKnowledgeDO;
|
||||
import cn.iocoder.yudao.module.tik.service.knowledge.AiKnowledgeService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@@ -1,12 +1,12 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.knowledge;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.knowledge;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.*;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeDocumentCreateReqVO;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO;
|
||||
import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeDocumentService;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.document.*;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.knowledge.AiKnowledgeDocumentCreateReqVO;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.knowledge.AiKnowledgeDocumentDO;
|
||||
import cn.iocoder.yudao.module.tik.service.knowledge.AiKnowledgeDocumentService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.Resource;
|
||||
@@ -1,17 +1,17 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.knowledge;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.knowledge;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment.*;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeSegmentDO;
|
||||
import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeDocumentService;
|
||||
import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeSegmentService;
|
||||
import cn.iocoder.yudao.module.ai.service.knowledge.bo.AiKnowledgeSegmentSearchReqBO;
|
||||
import cn.iocoder.yudao.module.ai.service.knowledge.bo.AiKnowledgeSegmentSearchRespBO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.segment.*;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.knowledge.AiKnowledgeDocumentDO;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.knowledge.AiKnowledgeSegmentDO;
|
||||
import cn.iocoder.yudao.module.tik.service.knowledge.AiKnowledgeDocumentService;
|
||||
import cn.iocoder.yudao.module.tik.service.knowledge.AiKnowledgeSegmentService;
|
||||
import cn.iocoder.yudao.module.tik.service.knowledge.bo.AiKnowledgeSegmentSearchReqBO;
|
||||
import cn.iocoder.yudao.module.tik.service.knowledge.bo.AiKnowledgeSegmentSearchRespBO;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.Parameters;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.document;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.document;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.document;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.document;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.document;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.knowledge;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.knowledge;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.knowledge;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.knowledge;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.segment;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.segment;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.segment;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.segment;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.segment;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.segment;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.knowledge.vo.segment;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||
@@ -1,13 +1,13 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.mindmap;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.mindmap;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapGenerateReqVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapPageReqVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapRespVO;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.mindmap.AiMindMapDO;
|
||||
import cn.iocoder.yudao.module.ai.service.mindmap.AiMindMapService;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.mindmap.vo.AiMindMapGenerateReqVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.mindmap.vo.AiMindMapPageReqVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.mindmap.vo.AiMindMapRespVO;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.mindmap.AiMindMapDO;
|
||||
import cn.iocoder.yudao.module.tik.service.mindmap.AiMindMapService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.mindmap.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
@@ -1,10 +1,8 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.mindmap.vo;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.mindmap.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
@@ -1,14 +1,14 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.model;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.model;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.model.vo.apikey.AiApiKeyPageReqVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.model.vo.apikey.AiApiKeyRespVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.model.vo.apikey.AiApiKeySaveReqVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiModelRespVO;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiApiKeyDO;
|
||||
import cn.iocoder.yudao.module.ai.service.model.AiApiKeyService;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.model.vo.apikey.AiApiKeyPageReqVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.model.vo.apikey.AiApiKeyRespVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.model.vo.apikey.AiApiKeySaveReqVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.model.vo.model.AiModelRespVO;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.model.AiApiKeyDO;
|
||||
import cn.iocoder.yudao.module.tik.service.model.AiApiKeyService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@@ -1,15 +1,15 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.model;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.model;
|
||||
|
||||
import cn.hutool.core.util.ObjUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRolePageReqVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRoleRespVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRoleSaveMyReqVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRoleSaveReqVO;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
|
||||
import cn.iocoder.yudao.module.ai.service.model.AiChatRoleService;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.model.vo.chatRole.AiChatRolePageReqVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.model.vo.chatRole.AiChatRoleRespVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.model.vo.chatRole.AiChatRoleSaveMyReqVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.model.vo.chatRole.AiChatRoleSaveReqVO;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.model.AiChatRoleDO;
|
||||
import cn.iocoder.yudao.module.tik.service.model.AiChatRoleService;
|
||||
import com.fhs.core.trans.anno.TransMethodResult;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
@@ -1,14 +1,14 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.model;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.model;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiModelPageReqVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiModelRespVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiModelSaveReqVO;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO;
|
||||
import cn.iocoder.yudao.module.ai.service.model.AiModelService;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.model.vo.model.AiModelPageReqVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.model.vo.model.AiModelRespVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.model.vo.model.AiModelSaveReqVO;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.model.AiModelDO;
|
||||
import cn.iocoder.yudao.module.tik.service.model.AiModelService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@@ -1,14 +1,14 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.model;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.model;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.model.vo.tool.AiToolPageReqVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.model.vo.tool.AiToolRespVO;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.model.vo.tool.AiToolSaveReqVO;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiToolDO;
|
||||
import cn.iocoder.yudao.module.ai.service.model.AiToolService;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.model.vo.tool.AiToolPageReqVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.model.vo.tool.AiToolRespVO;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.model.vo.tool.AiToolSaveReqVO;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.model.AiToolDO;
|
||||
import cn.iocoder.yudao.module.tik.service.model.AiToolService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@@ -1,13 +1,8 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.model.vo.apikey;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.model.vo.apikey;
|
||||
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||
|
||||
@Schema(description = "管理后台 - AI API 密钥分页 Request VO")
|
||||
@Data
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.model.vo.apikey;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.model.vo.apikey;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
@@ -1,8 +1,7 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.model.vo.apikey;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.model.vo.apikey;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import jakarta.validation.constraints.*;
|
||||
|
||||
@Schema(description = "管理后台 - AI API 密钥新增/修改 Request VO")
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.model.vo.chatRole;
|
||||
|
||||
import lombok.*;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
@@ -1,6 +1,6 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.model.vo.chatRole;
|
||||
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.model.AiModelDO;
|
||||
import com.fhs.core.trans.anno.Trans;
|
||||
import com.fhs.core.trans.constant.TransType;
|
||||
import com.fhs.core.trans.vo.VO;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.model.vo.chatRole;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.model.vo.chatRole;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.model.vo.model;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.model.vo.model;
|
||||
|
||||
import lombok.*;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.model.vo.model;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.model.vo.model;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
@@ -1,7 +1,7 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.model.vo.model;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.model.vo.model;
|
||||
|
||||
import cn.iocoder.yudao.module.ai.enums.model.AiModelTypeEnum;
|
||||
import cn.iocoder.yudao.module.ai.enums.model.AiPlatformEnum;
|
||||
import cn.iocoder.yudao.module.tik.enums.model.AiModelTypeEnum;
|
||||
import cn.iocoder.yudao.module.tik.enums.model.AiPlatformEnum;
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
@@ -1,12 +1,10 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.model.vo.tool;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.model.vo.tool;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.model.vo.tool;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.model.vo.tool;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.model.vo.tool;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.model.vo.tool;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||
@@ -1,12 +1,12 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.music;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.music;
|
||||
|
||||
import cn.hutool.core.util.ObjUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.music.vo.*;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.music.AiMusicDO;
|
||||
import cn.iocoder.yudao.module.ai.service.music.AiMusicService;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.music.vo.*;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.music.AiMusicDO;
|
||||
import cn.iocoder.yudao.module.tik.service.music.AiMusicService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@@ -1,9 +1,9 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.music.vo;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.music.vo;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||
import cn.iocoder.yudao.module.ai.enums.music.AiMusicGenerateModeEnum;
|
||||
import cn.iocoder.yudao.module.ai.enums.music.AiMusicStatusEnum;
|
||||
import cn.iocoder.yudao.module.tik.enums.music.AiMusicGenerateModeEnum;
|
||||
import cn.iocoder.yudao.module.tik.enums.music.AiMusicStatusEnum;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.music.vo;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.music.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.music.vo;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.music.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.music.vo;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.music.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.music.vo;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.music.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
@@ -1,11 +1,11 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.workflow;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.workflow;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.*;
|
||||
import cn.iocoder.yudao.module.ai.dal.dataobject.workflow.AiWorkflowDO;
|
||||
import cn.iocoder.yudao.module.ai.service.workflow.AiWorkflowService;
|
||||
import cn.iocoder.yudao.module.tik.controller.admin.workflow.vo.*;
|
||||
import cn.iocoder.yudao.module.tik.dal.dataobject.workflow.AiWorkflowDO;
|
||||
import cn.iocoder.yudao.module.tik.service.workflow.AiWorkflowService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.ai.controller.admin.workflow.vo;
|
||||
package cn.iocoder.yudao.module.tik.controller.admin.workflow.vo;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user