diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ChatController.java b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ChatController.java index 2e431a5..de7f401 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ChatController.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ChatController.java @@ -1,11 +1,14 @@ package com.zsc.edu.dify.modules.dify.controller; -import com.zsc.edu.dify.modules.dify.service.DifyChatService; +import com.zsc.edu.dify.modules.dify.service.DifyServerService; +import io.github.guoshiqiufeng.dify.chat.DifyChat; import io.github.guoshiqiufeng.dify.chat.dto.request.ChatMessageSendRequest; import io.github.guoshiqiufeng.dify.chat.dto.request.MessageConversationsRequest; +import io.github.guoshiqiufeng.dify.chat.dto.request.MessagesRequest; import io.github.guoshiqiufeng.dify.chat.dto.response.ChatMessageSendCompletionResponse; import io.github.guoshiqiufeng.dify.chat.dto.response.MessageConversationsResponse; import io.github.guoshiqiufeng.dify.core.pojo.DifyPageResult; +import io.github.guoshiqiufeng.dify.core.pojo.response.MessagesResponseVO; import jakarta.annotation.Resource; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; @@ -21,7 +24,7 @@ import reactor.core.publisher.Flux; public class V1ChatController { @Resource - private DifyChatService difyChatService; + private DifyChat difyChat; /** * 发送消息(流式) @@ -32,13 +35,52 @@ public class V1ChatController { */ @PostMapping(value = "/completions", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux sendChatMessageStream(@RequestBody ChatMessageSendRequest sendRequest) { - return difyChatService.sendChatMessageStream(sendRequest); + return difyChat.sendChatMessageStream(sendRequest); } - + /** + * 获取会话列表 + * + * @param request 请求参数 + * @return 会话列表 + */ @GetMapping("/conversations") public DifyPageResult conversations(@RequestBody MessageConversationsRequest request) { - return difyChatService.conversations(request); + request.setApiKey("app-mM2UGTE5QVPLCwGvwifnV0g7"); + return difyChat.conversations(request); } + /** + * 停止流式消息 + * + * @param taskId 任务id + * @param userId 用户id + */ + @GetMapping("/stopMessagesStream") + public void stopMessagesStream( String taskId, String userId) { + difyChat.stopMessagesStream("app-mM2UGTE5QVPLCwGvwifnV0g7", taskId, userId); + } + + /** + * 获取消息列表 + * + * @param request 请求参数 + * @return 消息列表 + */ + @GetMapping("/messages") + public DifyPageResult messages(@RequestBody MessagesRequest request) { + request.setApiKey("app-mM2UGTE5QVPLCwGvwifnV0g7"); + return difyChat.messages(request); + } + + /** + * 删除会话 + * + * @param conversationId 会话id + * @param userId 用户id + */ + @DeleteMapping("/messages/suggested") + public void deleteConversation(String conversationId, String userId) { + difyChat.deleteConversation(conversationId, "app-mM2UGTE5QVPLCwGvwifnV0g7", userId); + } } \ No newline at end of file diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1DatasetController.java b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1DatasetController.java new file mode 100644 index 0000000..594cf5e --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1DatasetController.java @@ -0,0 +1,105 @@ +package com.zsc.edu.dify.modules.dify.controller; + +import io.github.guoshiqiufeng.dify.core.pojo.DifyPageResult; +import io.github.guoshiqiufeng.dify.dataset.DifyDataset; +import io.github.guoshiqiufeng.dify.dataset.dto.request.*; +import io.github.guoshiqiufeng.dify.dataset.dto.response.*; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/v1/dataset") +public class V1DatasetController { + @Resource + private DifyDataset difyDataset; + + /** + * 分页查询知识库 + * + * @param request + * @return + */ + @GetMapping("/page") + public DifyPageResult page(@RequestBody DatasetPageRequest request){ + return difyDataset.page(request); + } + + /** + * 通过文件创建文档 + * + * @param request + * @return + */ + @GetMapping("/createDocumentByFile") + public DocumentCreateResponse createDocumentByFile(@RequestBody DocumentCreateByFileRequest request){ + return difyDataset.createDocumentByFile(request); + } + + /** + * 分页查询文档 + * + * @param request + * @return + */ + @GetMapping("/pageDocument") + public DifyPageResult pageDocument(@RequestBody DatasetPageDocumentRequest request){ + return difyDataset.pageDocument(request); + } + + /** + * 获取上传文件信息 + * + * @param datasetId + * @param documentId + * @return + */ + @PostMapping("/uploadFileInfo") + public UploadFileInfoResponse uploadFileInfo(String datasetId, String documentId){ + return difyDataset.uploadFileInfo(datasetId, documentId,"app-mM2UGTE5QVPLCwGvwifnV0g7"); + } + + /** + * 删除文档 + * + * @param datasetId + * @param documentId + * @return + */ + @DeleteMapping("/deleteDocument") + public DocumentDeleteResponse deleteDocument(String datasetId, String documentId){ + return difyDataset.deleteDocument(datasetId, documentId, "app-mM2UGTE5QVPLCwGvwifnV0g7"); + } + + /** + * 创建分段 + * + * @param request + * @return + */ + @PostMapping("/createSegment") + public SegmentResponse createSegment(@RequestBody SegmentCreateRequest request){ + return difyDataset.createSegment(request); + } + + /** + * 创建子分段 + * + * @param request + * @return + */ + @PostMapping("/createSegmentChildChunk") + public SegmentChildChunkCreateResponse createSegmentChildChunk(@RequestBody SegmentChildChunkCreateRequest request){ + return difyDataset.createSegmentChildChunk(request); + } + + /** + * 检索 + * + * @param request + * @return + */ + @GetMapping("/retrieve") + public RetrieveResponse retrieve(@RequestBody RetrieveRequest request){ + return difyDataset.retrieve(request); + } +} diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ServerController.java b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ServerController.java index 340a2e9..a070c5c 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ServerController.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ServerController.java @@ -1,11 +1,13 @@ package com.zsc.edu.dify.modules.dify.controller; +import com.zsc.edu.dify.modules.dify.service.DifyServerService; import io.github.guoshiqiufeng.dify.server.DifyServer; +import io.github.guoshiqiufeng.dify.server.dto.response.ApiKeyResponseVO; import io.github.guoshiqiufeng.dify.server.dto.response.AppsResponseVO; +import io.github.guoshiqiufeng.dify.server.dto.response.DatasetApiKeyResponseVO; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.apache.ibatis.annotations.Param; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -15,6 +17,8 @@ public class V1ServerController { @Resource private DifyServer difyServer; + @Resource + private DifyServerService difyServerService; /** * 获取应用列表 @@ -24,7 +28,54 @@ public class V1ServerController { */ @GetMapping("/apps") public List getApps(String mode, String name) { - return difyServer.apps(mode, name); + return difyServerService.getApps(mode, name); } + /** + * 获取应用详情 + * @param id 应用id + * @return + */ + @GetMapping("/{id}") + public AppsResponseVO getApp(@PathVariable("id") String id) { + return difyServer.app(id); + } + + /** + * 获取应用api-key + * @param id 应用id + * @return + */ + @GetMapping("/api-key/{id}") + public List getAppApiKey(@PathVariable("id") String id) { + return difyServer.getAppApiKey(id); + } + + /** + * 初始化应用api-key + * @param id 应用id + * @return + */ + @PostMapping("/api-key/init/{id}") + public List initAppApiKey(@PathVariable("id") String id) { + return difyServer.initAppApiKey(id); + } + + /** + * 获取知识库api-key + * @return + */ + @GetMapping("/api-key/dataset") + public List getDatasetApiKey() { + return difyServer.getDatasetApiKey(); + } + + /** + * 初始化知识库api-key + * @return + */ + @PostMapping("/api-key/dataset/init") + public List initDatasetApiKey() { + return difyServer.initDatasetApiKey(); + } } diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1WorkflowController.java b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1WorkflowController.java new file mode 100644 index 0000000..9f15e8d --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1WorkflowController.java @@ -0,0 +1,74 @@ +package com.zsc.edu.dify.modules.dify.controller; + +import io.github.guoshiqiufeng.dify.core.pojo.DifyPageResult; +import io.github.guoshiqiufeng.dify.workflow.DifyWorkflow; +import io.github.guoshiqiufeng.dify.workflow.dto.request.WorkflowLogsRequest; +import io.github.guoshiqiufeng.dify.workflow.dto.request.WorkflowRunRequest; +import io.github.guoshiqiufeng.dify.workflow.dto.response.*; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.*; +import reactor.core.publisher.Flux; + +@RestController +@RequestMapping("/v1/work") +public class V1WorkflowController { + + @Resource + private DifyWorkflow difyWorkflow; + + /** + * 运行工作流 + * + * @param request + * @return + */ + @PostMapping("/run") + public WorkflowRunResponse runWorkflow(@RequestBody WorkflowRunRequest request) { + return difyWorkflow.runWorkflow(request); + } + + /** + * 运行工作流(流式) + * + * @param request + * @return + */ + @PostMapping("/run/stream") + public Flux runWorkflowStream(@RequestBody WorkflowRunRequest request) { + return difyWorkflow.runWorkflowStream(request); + } + + /** + * 停止工作流(流式) + * + * @param taskId + * @param userId + * @return + */ + @PatchMapping("/stop") + public WorkflowStopResponse stopWorkflowStream( String taskId, String userId){ + return difyWorkflow.stopWorkflowStream("app-mM2UGTE5QVPLCwGvwifnV0g7", taskId, userId); + } + + /** + * 获取工作流信息 + * + * @param workflowRunId + * @return + */ + @GetMapping("/info") + public WorkflowInfoResponse info(String workflowRunId) { + return difyWorkflow.info(workflowRunId, "app-mM2UGTE5QVPLCwGvwifnV0g7"); + } + + /** + * 获取工作流日志 + * + * @param request + * @return + */ + @GetMapping("/logs") + public DifyPageResult logs(@RequestBody WorkflowLogsRequest request) { + return difyWorkflow.logs(request); + } +} diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/entity/AppsResponse.java b/src/main/java/com/zsc/edu/dify/modules/dify/entity/AppsResponse.java new file mode 100644 index 0000000..980902a --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/modules/dify/entity/AppsResponse.java @@ -0,0 +1,29 @@ +package com.zsc.edu.dify.modules.dify.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.zsc.edu.dify.framework.json.JsonbTypeHandler; +import io.github.guoshiqiufeng.dify.server.dto.response.AppsResponseVO; +import lombok.*; + +import java.util.List; +import java.util.Map; + +/** + * @author zhuang + */ +@Getter +@Setter +@TableName("apps_response") +public class AppsResponse extends AppsResponseVO { + + @TableField(typeHandler = JsonbTypeHandler.class) + private Map modelConfig; + + @TableField(typeHandler = JsonbTypeHandler.class) + private Map workflow; + + @TableField(typeHandler = JsonbTypeHandler.class) + private List tags; + +} diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/mapper/AppsResponseMapper.java b/src/main/java/com/zsc/edu/dify/modules/dify/mapper/AppsResponseMapper.java new file mode 100644 index 0000000..3b9b13a --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/modules/dify/mapper/AppsResponseMapper.java @@ -0,0 +1,11 @@ +package com.zsc.edu.dify.modules.dify.mapper; + +import com.zsc.edu.dify.common.mapstruct.BaseMapper; +import com.zsc.edu.dify.modules.dify.entity.AppsResponse; +import io.github.guoshiqiufeng.dify.server.dto.response.AppsResponseVO; +import org.mapstruct.Mapper; +import org.mapstruct.ReportingPolicy; + +@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface AppsResponseMapper extends BaseMapper { +} diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/repo/AppsResponseRepository.java b/src/main/java/com/zsc/edu/dify/modules/dify/repo/AppsResponseRepository.java new file mode 100644 index 0000000..20c93d2 --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/modules/dify/repo/AppsResponseRepository.java @@ -0,0 +1,7 @@ +package com.zsc.edu.dify.modules.dify.repo; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zsc.edu.dify.modules.dify.entity.AppsResponse; + +public interface AppsResponseRepository extends BaseMapper { +} diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/service/DifyChatService.java b/src/main/java/com/zsc/edu/dify/modules/dify/service/DifyChatService.java deleted file mode 100644 index 2150824..0000000 --- a/src/main/java/com/zsc/edu/dify/modules/dify/service/DifyChatService.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.zsc.edu.dify.modules.dify.service; - -import io.github.guoshiqiufeng.dify.chat.DifyChat; -import io.github.guoshiqiufeng.dify.chat.dto.request.ChatMessageSendRequest; -import io.github.guoshiqiufeng.dify.chat.dto.request.MessageConversationsRequest; -import io.github.guoshiqiufeng.dify.chat.dto.response.ChatMessageSendCompletionResponse; -import io.github.guoshiqiufeng.dify.chat.dto.response.MessageConversationsResponse; -import io.github.guoshiqiufeng.dify.core.pojo.DifyPageResult; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import reactor.core.publisher.Flux; - -/** - * @author yanghq - * @version 1.0 - * @since 2025/3/25 10:48 - */ -@Slf4j -@Service -public class DifyChatService { - - @Resource - private DifyChat difyChat; - - public Flux sendChatMessageStream(ChatMessageSendRequest sendRequest) { - // 可以进行自定义逻辑处理:参数转换、权限校验等 - return difyChat.sendChatMessageStream(sendRequest); - } - - public DifyPageResult conversations(MessageConversationsRequest request) { - return difyChat.conversations(request); - } - -} diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/service/DifyServerService.java b/src/main/java/com/zsc/edu/dify/modules/dify/service/DifyServerService.java new file mode 100644 index 0000000..7e186ec --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/modules/dify/service/DifyServerService.java @@ -0,0 +1,11 @@ +package com.zsc.edu.dify.modules.dify.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.zsc.edu.dify.modules.dify.entity.AppsResponse; +import io.github.guoshiqiufeng.dify.server.dto.response.AppsResponseVO; + +import java.util.List; + +public interface DifyServerService extends IService { + List getApps(String mode, String name); +} diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/service/Impl/DifyServerServiceImpl.java b/src/main/java/com/zsc/edu/dify/modules/dify/service/Impl/DifyServerServiceImpl.java new file mode 100644 index 0000000..44efda6 --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/modules/dify/service/Impl/DifyServerServiceImpl.java @@ -0,0 +1,46 @@ +package com.zsc.edu.dify.modules.dify.service.Impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.zsc.edu.dify.modules.dify.entity.AppsResponse; +import com.zsc.edu.dify.modules.dify.mapper.AppsResponseMapper; +import com.zsc.edu.dify.modules.dify.repo.AppsResponseRepository; +import com.zsc.edu.dify.modules.dify.service.DifyServerService; +import io.github.guoshiqiufeng.dify.server.DifyServer; +import io.github.guoshiqiufeng.dify.server.dto.response.AppsResponseVO; +import jakarta.annotation.Resource; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author zhuang + */ +@AllArgsConstructor +@Service +public class DifyServerServiceImpl extends ServiceImpl implements DifyServerService { + @Resource + private AppsResponseMapper appsResponseMapper; + @Resource + private DifyServer difyServer; + + @Override + public List getApps(String mode, String name) { + return addApps(difyServer.apps(mode, name)); + } + + public List addApps(List appsResponseList) { + for(AppsResponseVO appsResponse : appsResponseList){ + boolean isHave = baseMapper.exists(new QueryWrapper().eq("id", appsResponse.getId())); + if(!isHave){ + baseMapper.insert(appsResponseMapper.toEntity(appsResponse)); + }else{ + baseMapper.updateById(appsResponseMapper.toEntity(appsResponse)); + } + + } + return appsResponseList; + } +}