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; /**