Prechádzať zdrojové kódy

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

Lesan 6 mesiacov pred
rodič
commit
bce63cd04f

+ 9 - 0
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<String, Class<?>> metadataFields);
 
+    /**
+     * 获取 Tinyflow 所需 LLm Provider
+     *
+     * @param tinyflow tinyflow
+     * @param modelId AI 模型 ID
+     */
+    void getLLmProvider4Tinyflow(Tinyflow tinyflow, Long modelId);
+
 }

+ 19 - 0
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;
+        }
+    }
+
 }

+ 3 - 22
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;