新建tik模块

This commit is contained in:
wing
2025-11-15 21:09:43 +08:00
parent 7cfd502afb
commit 340f996d75
252 changed files with 1009 additions and 3583 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,4 +0,0 @@
/**
* 占位
*/
package cn.iocoder.yudao.module.ai.framework.security.core;

View File

@@ -1,4 +0,0 @@
/**
* ai 模块的 web 拓展封装
*/
package cn.iocoder.yudao.module.ai.framework.web;

View File

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

View File

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

View File

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

View File

@@ -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("录音文件识别结果查询失败!");
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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.*;

View File

@@ -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")

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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.*;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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