From bce63cd04f985b7b3bfb350f2d8b1002ac8e22c5 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Tue, 29 Apr 2025 13:59:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84AI=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E6=B5=81=E8=BF=90=E8=A1=8C=E6=B5=8B=E8=AF=95(=E9=80=9A?= =?UTF-8?q?=E4=B9=89=E5=8D=83=E9=97=AE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/service/model/AiModelService.java | 9 +++++++ .../ai/service/model/AiModelServiceImpl.java | 19 ++++++++++++++ .../workflow/AiWorkflowServiceImpl.java | 25 +++---------------- 3 files changed, 31 insertions(+), 22 deletions(-) diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiModelService.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiModelService.java index 127f72cc46..c0802b0fc3 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiModelService.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiModelService.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiModelPageReqVO; import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiModelSaveReqVO; import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO; +import dev.tinyflow.core.Tinyflow; import jakarta.validation.Valid; import org.springframework.ai.chat.model.ChatModel; import org.springframework.ai.image.ImageModel; @@ -131,4 +132,12 @@ public interface AiModelService { */ VectorStore getOrCreateVectorStore(Long id, Map> metadataFields); + /** + * 获取 Tinyflow 所需 LLm Provider + * + * @param tinyflow tinyflow + * @param modelId AI 模型 ID + */ + void getLLmProvider4Tinyflow(Tinyflow tinyflow, Long modelId); + } diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiModelServiceImpl.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiModelServiceImpl.java index b0e9e97172..a3f764c2eb 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiModelServiceImpl.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiModelServiceImpl.java @@ -12,6 +12,9 @@ import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiModelSaveReq import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiApiKeyDO; import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO; import cn.iocoder.yudao.module.ai.dal.mysql.model.AiChatMapper; +import com.agentsflex.llm.qwen.QwenLlm; +import com.agentsflex.llm.qwen.QwenLlmConfig; +import dev.tinyflow.core.Tinyflow; import jakarta.annotation.Resource; import org.springframework.ai.chat.model.ChatModel; import org.springframework.ai.embedding.EmbeddingModel; @@ -168,4 +171,20 @@ public class AiModelServiceImpl implements AiModelService { // return modelFactory.getOrCreateVectorStore(MilvusVectorStore.class, embeddingModel, metadataFields); } + @Override + public void getLLmProvider4Tinyflow(Tinyflow tinyflow, Long modelId) { + AiModelDO model = validateModel(modelId); + AiApiKeyDO apiKey = apiKeyService.validateApiKey(model.getKeyId()); + AiPlatformEnum platform = AiPlatformEnum.validatePlatform(apiKey.getPlatform()); + switch (platform) { + // TODO @lesan 考虑到未来不需要使用agents-flex 现在仅测试通义千问 + case TONG_YI: + QwenLlmConfig qwenLlmConfig = new QwenLlmConfig(); + qwenLlmConfig.setApiKey(apiKey.getApiKey()); + qwenLlmConfig.setModel(model.getModel()); + tinyflow.setLlmProvider(id -> new QwenLlm(qwenLlmConfig)); + break; + } + } + } \ No newline at end of file diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/workflow/AiWorkflowServiceImpl.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/workflow/AiWorkflowServiceImpl.java index 70d28496c8..a7a477b655 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/workflow/AiWorkflowServiceImpl.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/workflow/AiWorkflowServiceImpl.java @@ -7,10 +7,9 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.AiWorkflowPageReqVO; import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.AiWorkflowSaveReqVO; import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.AiWorkflowTestReqVO; -import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiApiKeyDO; import cn.iocoder.yudao.module.ai.dal.dataobject.workflow.AiWorkflowDO; import cn.iocoder.yudao.module.ai.dal.mysql.workflow.AiWorkflowMapper; -import cn.iocoder.yudao.module.ai.service.model.AiApiKeyService; +import cn.iocoder.yudao.module.ai.service.model.AiModelService; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import dev.tinyflow.core.Tinyflow; @@ -37,7 +36,7 @@ public class AiWorkflowServiceImpl implements AiWorkflowService { private AiWorkflowMapper workflowMapper; @Resource - private AiApiKeyService apiKeyService; + private AiModelService apiModelService; @Override public Long createWorkflow(AiWorkflowSaveReqVO createReqVO) { @@ -118,25 +117,7 @@ public class AiWorkflowServiceImpl implements AiWorkflowService { switch (node.getString("type")) { case "llmNode": JSONObject data = node.getJSONObject("data"); - AiApiKeyDO apiKey = apiKeyService.getApiKey(data.getLong("llmId")); - switch (apiKey.getPlatform()) { - // TODO @lesan 需要讨论一下这里怎么弄 - // TODO @lesan llmId 对应 model 的编号如何?这样的话,就是 apiModelService 提供一个获取 LLM 的方法。然后,创建的方法,也在 AiModelFactory 提供。可以先接个 deepseek 先。deepseek yyds! - case "OpenAI": - break; - case "Ollama": - break; - case "YiYan": - break; - case "XingHuo": - break; - case "TongYi": - break; - case "DeepSeek": - break; - case "ZhiPu": - break; - } + apiModelService.getLLmProvider4Tinyflow(tinyflow, data.getLong("llmId")); break; case "internalNode": break;