Commit bce63cd04f985b7b3bfb350f2d8b1002ac8e22c5

Authored by Lesan
1 parent 911f5f8b

feat: 完善AI工作流运行测试(通义千问)

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; @@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiModelPageReqVO; 6 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiModelPageReqVO;
7 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiModelSaveReqVO; 7 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiModelSaveReqVO;
8 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO; 8 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO;
  9 +import dev.tinyflow.core.Tinyflow;
9 import jakarta.validation.Valid; 10 import jakarta.validation.Valid;
10 import org.springframework.ai.chat.model.ChatModel; 11 import org.springframework.ai.chat.model.ChatModel;
11 import org.springframework.ai.image.ImageModel; 12 import org.springframework.ai.image.ImageModel;
@@ -131,4 +132,12 @@ public interface AiModelService { @@ -131,4 +132,12 @@ public interface AiModelService {
131 */ 132 */
132 VectorStore getOrCreateVectorStore(Long id, Map<String, Class<?>> metadataFields); 133 VectorStore getOrCreateVectorStore(Long id, Map<String, Class<?>> metadataFields);
133 134
  135 + /**
  136 + * 获取 Tinyflow 所需 LLm Provider
  137 + *
  138 + * @param tinyflow tinyflow
  139 + * @param modelId AI 模型 ID
  140 + */
  141 + void getLLmProvider4Tinyflow(Tinyflow tinyflow, Long modelId);
  142 +
134 } 143 }
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 @@ -12,6 +12,9 @@ import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiModelSaveReq
12 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiApiKeyDO; 12 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiApiKeyDO;
13 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO; 13 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO;
14 import cn.iocoder.yudao.module.ai.dal.mysql.model.AiChatMapper; 14 import cn.iocoder.yudao.module.ai.dal.mysql.model.AiChatMapper;
  15 +import com.agentsflex.llm.qwen.QwenLlm;
  16 +import com.agentsflex.llm.qwen.QwenLlmConfig;
  17 +import dev.tinyflow.core.Tinyflow;
15 import jakarta.annotation.Resource; 18 import jakarta.annotation.Resource;
16 import org.springframework.ai.chat.model.ChatModel; 19 import org.springframework.ai.chat.model.ChatModel;
17 import org.springframework.ai.embedding.EmbeddingModel; 20 import org.springframework.ai.embedding.EmbeddingModel;
@@ -168,4 +171,20 @@ public class AiModelServiceImpl implements AiModelService { @@ -168,4 +171,20 @@ public class AiModelServiceImpl implements AiModelService {
168 // return modelFactory.getOrCreateVectorStore(MilvusVectorStore.class, embeddingModel, metadataFields); 171 // return modelFactory.getOrCreateVectorStore(MilvusVectorStore.class, embeddingModel, metadataFields);
169 } 172 }
170 173
  174 + @Override
  175 + public void getLLmProvider4Tinyflow(Tinyflow tinyflow, Long modelId) {
  176 + AiModelDO model = validateModel(modelId);
  177 + AiApiKeyDO apiKey = apiKeyService.validateApiKey(model.getKeyId());
  178 + AiPlatformEnum platform = AiPlatformEnum.validatePlatform(apiKey.getPlatform());
  179 + switch (platform) {
  180 + // TODO @lesan 考虑到未来不需要使用agents-flex 现在仅测试通义千问
  181 + case TONG_YI:
  182 + QwenLlmConfig qwenLlmConfig = new QwenLlmConfig();
  183 + qwenLlmConfig.setApiKey(apiKey.getApiKey());
  184 + qwenLlmConfig.setModel(model.getModel());
  185 + tinyflow.setLlmProvider(id -> new QwenLlm(qwenLlmConfig));
  186 + break;
  187 + }
  188 + }
  189 +
171 } 190 }
172 \ No newline at end of file 191 \ No newline at end of file
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; @@ -7,10 +7,9 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
7 import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.AiWorkflowPageReqVO; 7 import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.AiWorkflowPageReqVO;
8 import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.AiWorkflowSaveReqVO; 8 import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.AiWorkflowSaveReqVO;
9 import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.AiWorkflowTestReqVO; 9 import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.AiWorkflowTestReqVO;
10 -import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiApiKeyDO;  
11 import cn.iocoder.yudao.module.ai.dal.dataobject.workflow.AiWorkflowDO; 10 import cn.iocoder.yudao.module.ai.dal.dataobject.workflow.AiWorkflowDO;
12 import cn.iocoder.yudao.module.ai.dal.mysql.workflow.AiWorkflowMapper; 11 import cn.iocoder.yudao.module.ai.dal.mysql.workflow.AiWorkflowMapper;
13 -import cn.iocoder.yudao.module.ai.service.model.AiApiKeyService; 12 +import cn.iocoder.yudao.module.ai.service.model.AiModelService;
14 import com.alibaba.fastjson.JSONArray; 13 import com.alibaba.fastjson.JSONArray;
15 import com.alibaba.fastjson.JSONObject; 14 import com.alibaba.fastjson.JSONObject;
16 import dev.tinyflow.core.Tinyflow; 15 import dev.tinyflow.core.Tinyflow;
@@ -37,7 +36,7 @@ public class AiWorkflowServiceImpl implements AiWorkflowService { @@ -37,7 +36,7 @@ public class AiWorkflowServiceImpl implements AiWorkflowService {
37 private AiWorkflowMapper workflowMapper; 36 private AiWorkflowMapper workflowMapper;
38 37
39 @Resource 38 @Resource
40 - private AiApiKeyService apiKeyService; 39 + private AiModelService apiModelService;
41 40
42 @Override 41 @Override
43 public Long createWorkflow(AiWorkflowSaveReqVO createReqVO) { 42 public Long createWorkflow(AiWorkflowSaveReqVO createReqVO) {
@@ -118,25 +117,7 @@ public class AiWorkflowServiceImpl implements AiWorkflowService { @@ -118,25 +117,7 @@ public class AiWorkflowServiceImpl implements AiWorkflowService {
118 switch (node.getString("type")) { 117 switch (node.getString("type")) {
119 case "llmNode": 118 case "llmNode":
120 JSONObject data = node.getJSONObject("data"); 119 JSONObject data = node.getJSONObject("data");
121 - AiApiKeyDO apiKey = apiKeyService.getApiKey(data.getLong("llmId"));  
122 - switch (apiKey.getPlatform()) {  
123 - // TODO @lesan 需要讨论一下这里怎么弄  
124 - // TODO @lesan llmId 对应 model 的编号如何?这样的话,就是 apiModelService 提供一个获取 LLM 的方法。然后,创建的方法,也在 AiModelFactory 提供。可以先接个 deepseek 先。deepseek yyds!  
125 - case "OpenAI":  
126 - break;  
127 - case "Ollama":  
128 - break;  
129 - case "YiYan":  
130 - break;  
131 - case "XingHuo":  
132 - break;  
133 - case "TongYi":  
134 - break;  
135 - case "DeepSeek":  
136 - break;  
137 - case "ZhiPu":  
138 - break;  
139 - } 120 + apiModelService.getLLmProvider4Tinyflow(tinyflow, data.getLong("llmId"));
140 break; 121 break;
141 case "internalNode": 122 case "internalNode":
142 break; 123 break;