From c3254275da080c86ea633d638dcaa4ccf94db410 Mon Sep 17 00:00:00 2001 From: LuanY77 <2307984361@qq.com> Date: Thu, 31 Jul 2025 16:33:42 +0800 Subject: [PATCH] =?UTF-8?q?Feat:=20=E8=8A=82=E7=82=B9=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractAIInvocationHandler.java | 31 ++++++++++++++++++- .../invocation/ChatAIInvocationHandler.java | 8 ++++- .../ClassifyAIInvocationHandler.java | 21 ++++++++++++- .../RetrievalAIInvocationHandler.java | 2 +- 4 files changed, 58 insertions(+), 4 deletions(-) diff --git a/liteflow-ai/liteflow-ai-core/src/main/java/com/yomahub/liteflow/ai/proxy/invocation/AbstractAIInvocationHandler.java b/liteflow-ai/liteflow-ai-core/src/main/java/com/yomahub/liteflow/ai/proxy/invocation/AbstractAIInvocationHandler.java index 50d8d16a9..1550f604c 100644 --- a/liteflow-ai/liteflow-ai-core/src/main/java/com/yomahub/liteflow/ai/proxy/invocation/AbstractAIInvocationHandler.java +++ b/liteflow-ai/liteflow-ai-core/src/main/java/com/yomahub/liteflow/ai/proxy/invocation/AbstractAIInvocationHandler.java @@ -1,9 +1,12 @@ package com.yomahub.liteflow.ai.proxy.invocation; import com.yomahub.liteflow.ai.context.ChatContext; +import com.yomahub.liteflow.ai.domain.ModelConfig; +import com.yomahub.liteflow.ai.exception.LiteFlowAIException; import com.yomahub.liteflow.ai.parse.AnnotationParser; -import com.yomahub.liteflow.ai.parse.ProcessorContext; +import com.yomahub.liteflow.ai.parse.context.ProcessorContext; import com.yomahub.liteflow.ai.proxy.wrap.AIProxyWrapBean; +import com.yomahub.liteflow.ai.util.SetUtil; import com.yomahub.liteflow.core.NodeComponent; import com.yomahub.liteflow.log.LFLog; import com.yomahub.liteflow.log.LFLoggerManager; @@ -52,6 +55,9 @@ public abstract class AbstractAIInvocationHandler> // 注解解析前置处理 AnnotationParser.postProcessBeforeTrigger(wrapBean.getAnnotation(), processorContext); + // 校验参数是否符合节点要求 + checkValidation(processorContext); + // 执行实际的AI处理逻辑 Object result = doExecuteAIProcess(processorContext, args); @@ -65,6 +71,29 @@ public abstract class AbstractAIInvocationHandler> } } + /** + * 校验参数是否符合节点要求 + * + * @param processorContext 处理器上下文 + */ + protected void checkValidation(ProcessorContext processorContext) { + // 校验Prompt + if (SetUtil.isNotPresent(wrapBean.getUserPrompt()) && SetUtil.isNotPresent(wrapBean.getSystemPrompt())) { + throw new LiteFlowAIException("User prompt and system prompt cannot both be empty"); + } + // 校验必需参数 + ModelConfig modelConfig = wrapBean.getConfig(); + if (SetUtil.isNotPresent(modelConfig.getProvider())) { + throw new LiteFlowAIException("Provider cannot be empty for AI node: " + wrapBean.getNodeId()); + } + if (SetUtil.isNotPresent(modelConfig.getBaseUrl())) { + throw new LiteFlowAIException("Base URL cannot be empty for AI node: " + wrapBean.getNodeId()); + } + if (SetUtil.isNotPresent(modelConfig.getModel())) { + throw new LiteFlowAIException("Model cannot be empty for AI node: " + wrapBean.getNodeId()); + } + } + /** * 执行具体的AI处理逻辑 * diff --git a/liteflow-ai/liteflow-ai-core/src/main/java/com/yomahub/liteflow/ai/proxy/invocation/ChatAIInvocationHandler.java b/liteflow-ai/liteflow-ai-core/src/main/java/com/yomahub/liteflow/ai/proxy/invocation/ChatAIInvocationHandler.java index 5f49cfe1d..3092523ec 100644 --- a/liteflow-ai/liteflow-ai-core/src/main/java/com/yomahub/liteflow/ai/proxy/invocation/ChatAIInvocationHandler.java +++ b/liteflow-ai/liteflow-ai-core/src/main/java/com/yomahub/liteflow/ai/proxy/invocation/ChatAIInvocationHandler.java @@ -3,7 +3,7 @@ package com.yomahub.liteflow.ai.proxy.invocation; import com.yomahub.liteflow.ai.context.ChatContext; import com.yomahub.liteflow.ai.exception.LiteFlowAIException; import com.yomahub.liteflow.ai.model.ModelFactory; -import com.yomahub.liteflow.ai.parse.ProcessorContext; +import com.yomahub.liteflow.ai.parse.context.ProcessorContext; import com.yomahub.liteflow.ai.proxy.invocation.service.AiServiceFactory; import com.yomahub.liteflow.ai.proxy.wrap.ChatProxyWrapBean; import com.yomahub.liteflow.core.NodeComponent; @@ -27,6 +27,12 @@ public class ChatAIInvocationHandler extends AbstractAIInvocationHandler processorContext) { + // 调用父类的校验方法 + super.checkValidation(processorContext); + } + @Override protected Object doExecuteAIProcess(ProcessorContext processorContext, Object[] args) { NodeComponent nodeComponent = processorContext.getNodeComponent(); diff --git a/liteflow-ai/liteflow-ai-core/src/main/java/com/yomahub/liteflow/ai/proxy/invocation/ClassifyAIInvocationHandler.java b/liteflow-ai/liteflow-ai-core/src/main/java/com/yomahub/liteflow/ai/proxy/invocation/ClassifyAIInvocationHandler.java index f71d516ea..04174a8c6 100644 --- a/liteflow-ai/liteflow-ai-core/src/main/java/com/yomahub/liteflow/ai/proxy/invocation/ClassifyAIInvocationHandler.java +++ b/liteflow-ai/liteflow-ai-core/src/main/java/com/yomahub/liteflow/ai/proxy/invocation/ClassifyAIInvocationHandler.java @@ -1,8 +1,10 @@ package com.yomahub.liteflow.ai.proxy.invocation; +import com.yomahub.liteflow.ai.exception.LiteFlowAIException; import com.yomahub.liteflow.ai.model.ModelFactory; -import com.yomahub.liteflow.ai.parse.ProcessorContext; +import com.yomahub.liteflow.ai.parse.context.ProcessorContext; import com.yomahub.liteflow.ai.proxy.wrap.ClassifyProxyWrapBean; +import com.yomahub.liteflow.ai.util.SetUtil; import dev.langchain4j.model.chat.ChatModel; /** @@ -18,6 +20,23 @@ public class ClassifyAIInvocationHandler extends AbstractAIInvocationHandler processorContext) { + // 调用父类的校验方法 + super.checkValidation(processorContext); + // 校验分类类别 + if (SetUtil.isNotPresent(wrapBean.getCategories())) { + throw new LiteFlowAIException("Categories cannot be empty for classification"); + } + // 校验多标签分类 + if (!wrapBean.isMultiLabel() && wrapBean.getCategories().size() > 1) { + throw new LiteFlowAIException("Multi-label classification is not allowed when multiLabel is false"); + } + if (wrapBean.isMultiLabel() && wrapBean.getCategories().size() < 2) { + throw new LiteFlowAIException("At least two categories are required for multi-label classification"); + } + } + @Override protected Object doExecuteAIProcess(ProcessorContext processorContext, Object[] args) { diff --git a/liteflow-ai/liteflow-ai-core/src/main/java/com/yomahub/liteflow/ai/proxy/invocation/RetrievalAIInvocationHandler.java b/liteflow-ai/liteflow-ai-core/src/main/java/com/yomahub/liteflow/ai/proxy/invocation/RetrievalAIInvocationHandler.java index 25ec1014c..19fdb7283 100644 --- a/liteflow-ai/liteflow-ai-core/src/main/java/com/yomahub/liteflow/ai/proxy/invocation/RetrievalAIInvocationHandler.java +++ b/liteflow-ai/liteflow-ai-core/src/main/java/com/yomahub/liteflow/ai/proxy/invocation/RetrievalAIInvocationHandler.java @@ -1,6 +1,6 @@ package com.yomahub.liteflow.ai.proxy.invocation; -import com.yomahub.liteflow.ai.parse.ProcessorContext; +import com.yomahub.liteflow.ai.parse.context.ProcessorContext; import com.yomahub.liteflow.ai.proxy.wrap.RetrievalProxyWrapBean; /**