|
@@ -3,8 +3,11 @@ package com.fs.company.service.workflow.impl;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
|
|
+import com.fs.company.domain.AdminAiModel;
|
|
|
import com.fs.company.domain.LobsterWorkflowNodeType;
|
|
import com.fs.company.domain.LobsterWorkflowNodeType;
|
|
|
-import com.fs.company.service.llm.MultiModelRouter;
|
|
|
|
|
|
|
+import com.fs.company.service.ai.AiSceneDispatcher;
|
|
|
|
|
+import com.fs.company.service.ai.AdminAiSceneService;
|
|
|
|
|
+import com.fs.company.service.ai.MultiModelPipelineEngine;
|
|
|
import com.fs.company.service.workflow.LobsterNodeTypeService;
|
|
import com.fs.company.service.workflow.LobsterNodeTypeService;
|
|
|
import com.fs.company.service.workflow.LobsterModelConfigService;
|
|
import com.fs.company.service.workflow.LobsterModelConfigService;
|
|
|
import com.fs.company.service.workflow.MultiModelWorkflowGenerator;
|
|
import com.fs.company.service.workflow.MultiModelWorkflowGenerator;
|
|
@@ -25,8 +28,17 @@ public class MultiModelWorkflowGeneratorImpl implements MultiModelWorkflowGenera
|
|
|
|
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(MultiModelWorkflowGeneratorImpl.class);
|
|
private static final Logger logger = LoggerFactory.getLogger(MultiModelWorkflowGeneratorImpl.class);
|
|
|
|
|
|
|
|
|
|
+ /** 工作流生成场景编码 */
|
|
|
|
|
+ private static final String SCENE_WORKFLOW_GENERATION = "workflow_generation";
|
|
|
|
|
+
|
|
|
@Autowired
|
|
@Autowired
|
|
|
- private MultiModelRouter multiModelRouter;
|
|
|
|
|
|
|
+ private AiSceneDispatcher sceneDispatcher;
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired(required = false)
|
|
|
|
|
+ private MultiModelPipelineEngine pipelineEngine;
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired(required = false)
|
|
|
|
|
+ private AdminAiSceneService sceneService;
|
|
|
|
|
|
|
|
@Autowired(required = false)
|
|
@Autowired(required = false)
|
|
|
private LobsterNodeTypeService nodeTypeService;
|
|
private LobsterNodeTypeService nodeTypeService;
|
|
@@ -43,24 +55,6 @@ public class MultiModelWorkflowGeneratorImpl implements MultiModelWorkflowGenera
|
|
|
@Value("${ai.multi-model.default:doubao-lite}")
|
|
@Value("${ai.multi-model.default:doubao-lite}")
|
|
|
private String defaultModel;
|
|
private String defaultModel;
|
|
|
|
|
|
|
|
- /** 模型解析:DB配置 > yml配置 > 硬编码降级 */
|
|
|
|
|
- private ModelConfig resolveModelConfig(Long companyId, ModelConfig inputConfig) {
|
|
|
|
|
- if (companyId != null && modelConfigService != null) {
|
|
|
|
|
- try {
|
|
|
|
|
- ModelConfig dbConfig = modelConfigService.getWorkflowGeneratorConfig(companyId);
|
|
|
|
|
- if (dbConfig != null && dbConfig.getModelA() != null && !dbConfig.getModelA().isEmpty()) {
|
|
|
|
|
- return dbConfig;
|
|
|
|
|
- }
|
|
|
|
|
- } catch (Exception e) {
|
|
|
|
|
- logger.debug("[MultiModelWorkflow] DB模型配置查询失败: {}", e.getMessage());
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- if (inputConfig != null && inputConfig.getModelA() != null && !inputConfig.getModelA().isEmpty()) {
|
|
|
|
|
- return inputConfig;
|
|
|
|
|
- }
|
|
|
|
|
- return new ModelConfig(defaultModel, defaultModel, defaultModel);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
/* ============ 行业场景规则 ============ */
|
|
/* ============ 行业场景规则 ============ */
|
|
|
private static final Map<String, String> INDUSTRY_RULES = new LinkedHashMap<>();
|
|
private static final Map<String, String> INDUSTRY_RULES = new LinkedHashMap<>();
|
|
|
static {
|
|
static {
|
|
@@ -101,39 +95,80 @@ public class MultiModelWorkflowGeneratorImpl implements MultiModelWorkflowGenera
|
|
|
|
|
|
|
|
public GenerationResult generateWorkflowWithResult(Long companyId, String requirement, String industryType, ModelConfig modelConfig) {
|
|
public GenerationResult generateWorkflowWithResult(Long companyId, String requirement, String industryType, ModelConfig modelConfig) {
|
|
|
try {
|
|
try {
|
|
|
- logger.info("[MultiModelWorkflow] Starting multi-model workflow generation...");
|
|
|
|
|
|
|
+ logger.info("[MultiModelWorkflow] Starting multi-model workflow generation via pipeline engine...");
|
|
|
|
|
|
|
|
- ModelConfig resolved = resolveModelConfig(companyId, modelConfig);
|
|
|
|
|
String dynamicNodeTypes = buildDynamicNodeTypeList();
|
|
String dynamicNodeTypes = buildDynamicNodeTypeList();
|
|
|
String industryRule = getIndustryRule(companyId, industryType);
|
|
String industryRule = getIndustryRule(companyId, industryType);
|
|
|
|
|
|
|
|
- String modelAOutput = generateInitialDraft(resolved.getModelA(), requirement, industryType, dynamicNodeTypes, industryRule);
|
|
|
|
|
|
|
+ // 从场景中获取排序后的模型列表
|
|
|
|
|
+ List<AdminAiModel> models = (sceneService != null)
|
|
|
|
|
+ ? sceneService.getEnabledModels(SCENE_WORKFLOW_GENERATION)
|
|
|
|
|
+ : Collections.emptyList();
|
|
|
|
|
+
|
|
|
|
|
+ // 构建3个阶段的提示词
|
|
|
|
|
+ List<String> prompts = new ArrayList<>();
|
|
|
|
|
+ prompts.add(buildGeneratePrompt(requirement, industryType, dynamicNodeTypes, industryRule));
|
|
|
|
|
+ prompts.add(buildImprovePrompt(requirement, dynamicNodeTypes, "【占位-将替换为模型A输出】"));
|
|
|
|
|
+ prompts.add(buildValidatePrompt(dynamicNodeTypes, "【占位-将替换为模型B输出】"));
|
|
|
|
|
+
|
|
|
|
|
+ List<String> systemPrompts = Arrays.asList(
|
|
|
|
|
+ "workflow_generator", "workflow_improver", "workflow_validator");
|
|
|
|
|
+
|
|
|
|
|
+ String fallback = buildDefaultWorkflow(requirement, industryType);
|
|
|
|
|
+
|
|
|
|
|
+ // 如果有pipeline引擎且模型≥1,使用流水线引擎
|
|
|
|
|
+ if (pipelineEngine != null && models.size() >= 3) {
|
|
|
|
|
+ // 为阶段1和2构建正确的prompt(需要阶段0的输出,这里先用初始prompt)
|
|
|
|
|
+ // 流水线引擎会自动将当前输出作为后续阶段的上下文
|
|
|
|
|
+ MultiModelPipelineEngine.SequentialPipelineResult pipeResult =
|
|
|
|
|
+ pipelineEngine.executeSequential(models, prompts, systemPrompts, fallback);
|
|
|
|
|
+
|
|
|
|
|
+ if (!pipeResult.isSuccess() || pipeResult.getFinalOutput() == null) {
|
|
|
|
|
+ return GenerationResult.success(fallback, null, null, null, "70", "流水线执行失败,使用默认模板");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ String modelAOutput = repairJson(pipeResult.getStages().size() > 0 ?
|
|
|
|
|
+ pipeResult.getStages().get(0).getOutput() : "");
|
|
|
|
|
+ String modelBOutput = repairJson(pipeResult.getStages().size() > 1 ?
|
|
|
|
|
+ pipeResult.getStages().get(1).getOutput() : modelAOutput);
|
|
|
|
|
+ String finalWorkflow = pipeResult.getFinalOutput();
|
|
|
|
|
+ finalWorkflow = repairJson(finalWorkflow);
|
|
|
|
|
+
|
|
|
|
|
+ autoGeneratePrompts(companyId, industryType, finalWorkflow, requirement);
|
|
|
|
|
+ return GenerationResult.success(finalWorkflow, modelAOutput, modelBOutput,
|
|
|
|
|
+ "Pipeline executed", "85", "流水线模式完成");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // ── 降级:单模型场景或旧模式 ──
|
|
|
|
|
+ // 使用场景分发器执行三阶段
|
|
|
|
|
+ String modelAOutput = sceneDispatcher.dispatch(
|
|
|
|
|
+ buildGeneratePrompt(requirement, industryType, dynamicNodeTypes, industryRule),
|
|
|
|
|
+ SCENE_WORKFLOW_GENERATION, "workflow_generator");
|
|
|
if (modelAOutput == null || modelAOutput.isEmpty()) {
|
|
if (modelAOutput == null || modelAOutput.isEmpty()) {
|
|
|
logger.warn("[MultiModelWorkflow] Model A failed, using default workflow");
|
|
logger.warn("[MultiModelWorkflow] Model A failed, using default workflow");
|
|
|
- return GenerationResult.success(buildDefaultWorkflow(requirement, industryType),
|
|
|
|
|
- null, null, null, "70", "模型A生成失败,使用默认模板");
|
|
|
|
|
|
|
+ return GenerationResult.success(fallback, null, null, null, "70", "模型A生成失败");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
modelAOutput = repairJson(modelAOutput);
|
|
modelAOutput = repairJson(modelAOutput);
|
|
|
- logger.info("[MultiModelWorkflow] Phase 1 completed (after JSON repair)");
|
|
|
|
|
|
|
+ logger.info("[MultiModelWorkflow] Phase 1 completed");
|
|
|
|
|
|
|
|
- String modelBOutput = improveWorkflow(resolved.getModelB(), modelAOutput, requirement, dynamicNodeTypes);
|
|
|
|
|
|
|
+ String modelBOutput = sceneDispatcher.dispatch(
|
|
|
|
|
+ buildImprovePrompt(requirement, dynamicNodeTypes, modelAOutput),
|
|
|
|
|
+ SCENE_WORKFLOW_GENERATION, "workflow_improver");
|
|
|
if (modelBOutput == null || modelBOutput.isEmpty()) {
|
|
if (modelBOutput == null || modelBOutput.isEmpty()) {
|
|
|
modelBOutput = modelAOutput;
|
|
modelBOutput = modelAOutput;
|
|
|
logger.warn("[MultiModelWorkflow] Model B failed, using Model A output");
|
|
logger.warn("[MultiModelWorkflow] Model B failed, using Model A output");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
modelBOutput = repairJson(modelBOutput);
|
|
modelBOutput = repairJson(modelBOutput);
|
|
|
- logger.info("[MultiModelWorkflow] Phase 2 completed (after JSON repair)");
|
|
|
|
|
-
|
|
|
|
|
- ValidationResult validation = validateWorkflow(resolved.getModelC(), modelBOutput, dynamicNodeTypes);
|
|
|
|
|
- logger.info("[MultiModelWorkflow] Phase 3 completed, score: {}", validation.score);
|
|
|
|
|
|
|
+ String validateResp = sceneDispatcher.dispatch(
|
|
|
|
|
+ buildValidatePrompt(dynamicNodeTypes, modelBOutput),
|
|
|
|
|
+ SCENE_WORKFLOW_GENERATION, "workflow_validator");
|
|
|
|
|
|
|
|
- String finalWorkflow = validation.passed ? modelBOutput : buildDefaultWorkflow(requirement, industryType);
|
|
|
|
|
|
|
+ ValidationResult validation = parseValidation(validateResp);
|
|
|
|
|
+ String finalWorkflow = validation.passed ? modelBOutput : fallback;
|
|
|
|
|
|
|
|
- /* 自动生成租户+行业专属Prompt */
|
|
|
|
|
autoGeneratePrompts(companyId, industryType, finalWorkflow, requirement);
|
|
autoGeneratePrompts(companyId, industryType, finalWorkflow, requirement);
|
|
|
-
|
|
|
|
|
return GenerationResult.success(finalWorkflow, modelAOutput, modelBOutput,
|
|
return GenerationResult.success(finalWorkflow, modelAOutput, modelBOutput,
|
|
|
validation.details, validation.score, JSON.toJSONString(validation.suggestions));
|
|
validation.details, validation.score, JSON.toJSONString(validation.suggestions));
|
|
|
|
|
|
|
@@ -145,8 +180,6 @@ public class MultiModelWorkflowGeneratorImpl implements MultiModelWorkflowGenera
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* AI迭代优化:基于已有工作流进行增量修改
|
|
* AI迭代优化:基于已有工作流进行增量修改
|
|
|
- * @param existingWorkflowJson 已有工作流JSON
|
|
|
|
|
- * @param modifyInstruction 修改指令(如"增加一个关怀节点""删除AI识别节点""调整话术")
|
|
|
|
|
*/
|
|
*/
|
|
|
@Override
|
|
@Override
|
|
|
public GenerationResult iterateOptimize(Long companyId, String existingWorkflowJson,
|
|
public GenerationResult iterateOptimize(Long companyId, String existingWorkflowJson,
|
|
@@ -161,13 +194,16 @@ public class MultiModelWorkflowGeneratorImpl implements MultiModelWorkflowGenera
|
|
|
"可用的节点类型:\n" + dynamicNodeTypes + "\n\n" +
|
|
"可用的节点类型:\n" + dynamicNodeTypes + "\n\n" +
|
|
|
"要求: 1.只修改指令要求的部分 2.保持其他节点不变 3.确保节点编码一致性 4.输出纯JSON";
|
|
"要求: 1.只修改指令要求的部分 2.保持其他节点不变 3.确保节点编码一致性 4.输出纯JSON";
|
|
|
|
|
|
|
|
- String improved = multiModelRouter.generateResponse(prompt, modelConfig.getModelA(), "workflow_optimizer");
|
|
|
|
|
|
|
+ String improved = sceneDispatcher.dispatch(prompt, SCENE_WORKFLOW_GENERATION, "workflow_optimizer");
|
|
|
if (improved == null || improved.isEmpty()) {
|
|
if (improved == null || improved.isEmpty()) {
|
|
|
return GenerationResult.fail("AI迭代优化未产生结果");
|
|
return GenerationResult.fail("AI迭代优化未产生结果");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
improved = repairJson(improved);
|
|
improved = repairJson(improved);
|
|
|
- validateWorkflow(modelConfig.getModelC(), improved, dynamicNodeTypes);
|
|
|
|
|
|
|
+ String validateResp = sceneDispatcher.dispatch(
|
|
|
|
|
+ buildValidatePrompt(dynamicNodeTypes, improved),
|
|
|
|
|
+ SCENE_WORKFLOW_GENERATION, "workflow_validator");
|
|
|
|
|
+ ValidationResult vr = parseValidation(validateResp);
|
|
|
|
|
|
|
|
return GenerationResult.success(improved, existingWorkflowJson, improved,
|
|
return GenerationResult.success(improved, existingWorkflowJson, improved,
|
|
|
"迭代优化完成", "85", "根据指令优化: " + modifyInstruction);
|
|
"迭代优化完成", "85", "根据指令优化: " + modifyInstruction);
|
|
@@ -296,74 +332,55 @@ public class MultiModelWorkflowGeneratorImpl implements MultiModelWorkflowGenera
|
|
|
return "{\"templateName\":\"修复的工作流\",\"nodes\":[{\"nodeCode\":\"START\",\"nodeName\":\"开始\",\"nodeType\":1,\"sortNo\":1,\"nextNodeCode\":\"END\"},{\"nodeCode\":\"END\",\"nodeName\":\"结束\",\"nodeType\":99,\"sortNo\":2}]}";
|
|
return "{\"templateName\":\"修复的工作流\",\"nodes\":[{\"nodeCode\":\"START\",\"nodeName\":\"开始\",\"nodeType\":1,\"sortNo\":1,\"nextNodeCode\":\"END\"},{\"nodeCode\":\"END\",\"nodeName\":\"结束\",\"nodeType\":99,\"sortNo\":2}]}";
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /* ============ 核心生成方法 ============ */
|
|
|
|
|
- private String generateInitialDraft(String modelName, String requirement, String industryType,
|
|
|
|
|
- String dynamicNodeTypes, String industryRule) {
|
|
|
|
|
- try {
|
|
|
|
|
- String prompt = "你是CRM系统专家级工作流设计师。根据需求描述和行业规则,生成完整的工作流模板。\n\n" +
|
|
|
|
|
- "【需求描述】\n" + (requirement != null ? requirement : "通用客户跟进流程") + "\n\n" +
|
|
|
|
|
- "【行业规则 - 必须遵守】\n" + industryRule + "\n\n" +
|
|
|
|
|
- "【可用节点类型 - 必须使用这些数字】\n" + dynamicNodeTypes + "\n\n" +
|
|
|
|
|
- "【输出格式 - 纯JSON】\n" +
|
|
|
|
|
- "{\"templateName\":\"工作流名称\",\"industryType\":\"行业代码\",\"description\":\"描述\",\n" +
|
|
|
|
|
- " \"variables\":[{\"name\":\"变量名\",\"label\":\"标签\",\"type\":\"string|number|list\"}],\n" +
|
|
|
|
|
- " \"nodes\":[\n" +
|
|
|
|
|
- " {\"nodeCode\":\"唯一编码\",\"nodeName\":\"节点名称\",\"nodeType\":数字,\n" +
|
|
|
|
|
- " \"sortNo\":序号,\"nextNodeCode\":\"下一节点编码\",\n" +
|
|
|
|
|
- " \"messageTemplate\":\"话术模板(支持${变量})\",\"conditionExpr\":\"条件或空\",\n" +
|
|
|
|
|
- " \"nodeConfig\":\"节点配置JSON\",\"maxRounds\":0}\n" +
|
|
|
|
|
- " ],\n" +
|
|
|
|
|
- " \"edges\":[{\"sourceNodeCode\":\"源\",\"targetNodeCode\":\"目标\",\"edgeLabel\":\"标签\"}]\n" +
|
|
|
|
|
- "}\n\n" +
|
|
|
|
|
- "要求: 1.最少3个节点 2.nodeCode唯一 3.最后一个节点nextNodeCode为空 4.输出纯JSON无其他文字";
|
|
|
|
|
-
|
|
|
|
|
- return multiModelRouter.generateResponse(prompt, modelName, "workflow_generator");
|
|
|
|
|
-
|
|
|
|
|
- } catch (Exception e) {
|
|
|
|
|
- logger.warn("[MultiModelWorkflow] Model A generation failed: {}", e.getMessage());
|
|
|
|
|
- return null;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ /* ============ 提示词构建方法(纯字符串构建,不调用模型) ============ */
|
|
|
|
|
+
|
|
|
|
|
+ private String buildGeneratePrompt(String requirement, String industryType,
|
|
|
|
|
+ String dynamicNodeTypes, String industryRule) {
|
|
|
|
|
+ return "你是CRM系统专家级工作流设计师。根据需求描述和行业规则,生成完整的工作流模板。\n\n" +
|
|
|
|
|
+ "【需求描述】\n" + (requirement != null ? requirement : "通用客户跟进流程") + "\n\n" +
|
|
|
|
|
+ "【行业规则 - 必须遵守】\n" + industryRule + "\n\n" +
|
|
|
|
|
+ "【可用节点类型 - 必须使用这些数字】\n" + dynamicNodeTypes + "\n\n" +
|
|
|
|
|
+ "【输出格式 - 纯JSON】\n" +
|
|
|
|
|
+ "{\"templateName\":\"工作流名称\",\"industryType\":\"行业代码\",\"description\":\"描述\",\n" +
|
|
|
|
|
+ " \"variables\":[{\"name\":\"变量名\",\"label\":\"标签\",\"type\":\"string|number|list\"}],\n" +
|
|
|
|
|
+ " \"nodes\":[\n" +
|
|
|
|
|
+ " {\"nodeCode\":\"唯一编码\",\"nodeName\":\"节点名称\",\"nodeType\":数字,\n" +
|
|
|
|
|
+ " \"sortNo\":序号,\"nextNodeCode\":\"下一节点编码\",\n" +
|
|
|
|
|
+ " \"messageTemplate\":\"话术模板(支持${变量})\",\"conditionExpr\":\"条件或空\",\n" +
|
|
|
|
|
+ " \"nodeConfig\":\"节点配置JSON\",\"maxRounds\":0}\n" +
|
|
|
|
|
+ " ],\n" +
|
|
|
|
|
+ " \"edges\":[{\"sourceNodeCode\":\"源\",\"targetNodeCode\":\"目标\",\"edgeLabel\":\"标签\"}]\n" +
|
|
|
|
|
+ "}\n\n" +
|
|
|
|
|
+ "要求: 1.最少3个节点 2.nodeCode唯一 3.最后一个节点nextNodeCode为空 4.输出纯JSON无其他文字";
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private String improveWorkflow(String modelName, String draftJson, String requirement, String dynamicNodeTypes) {
|
|
|
|
|
- try {
|
|
|
|
|
- String prompt = "你是工作流优化专家。审查并完善这个工作流草稿,检查:\n" +
|
|
|
|
|
- "1. 节点连接是否合理 2. 话术模板是否完整 3. 条件表达式是否正确 4. 变量是否定义\n\n" +
|
|
|
|
|
- "原始需求: " + (requirement != null ? requirement : "") + "\n\n" +
|
|
|
|
|
- "可用节点类型: " + dynamicNodeTypes + "\n\n" +
|
|
|
|
|
- "工作流草稿:\n" + draftJson + "\n\n" +
|
|
|
|
|
- "输出纯JSON(只输出改进后的工作流,无其他文字):";
|
|
|
|
|
-
|
|
|
|
|
- return multiModelRouter.generateResponse(prompt, modelName, "workflow_improver");
|
|
|
|
|
|
|
+ private String buildImprovePrompt(String requirement, String dynamicNodeTypes, String draftJson) {
|
|
|
|
|
+ return "你是工作流优化专家。审查并完善这个工作流草稿,检查:\n" +
|
|
|
|
|
+ "1. 节点连接是否合理 2. 话术模板是否完整 3. 条件表达式是否正确 4. 变量是否定义\n\n" +
|
|
|
|
|
+ "原始需求: " + (requirement != null ? requirement : "") + "\n\n" +
|
|
|
|
|
+ "可用节点类型: " + dynamicNodeTypes + "\n\n" +
|
|
|
|
|
+ "工作流草稿:\n" + draftJson + "\n\n" +
|
|
|
|
|
+ "输出纯JSON(只输出改进后的工作流,无其他文字):";
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- } catch (Exception e) {
|
|
|
|
|
- logger.warn("[MultiModelWorkflow] Model B improvement failed: {}", e.getMessage());
|
|
|
|
|
- return null;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ private String buildValidatePrompt(String dynamicNodeTypes, String workflowJson) {
|
|
|
|
|
+ return "你是工作流QA专家。验证以下工作流JSON:\n\n" +
|
|
|
|
|
+ "期望节点类型: " + dynamicNodeTypes + "\n\n" +
|
|
|
|
|
+ "工作流:\n" + workflowJson + "\n\n" +
|
|
|
|
|
+ "检查: 1.节点类型是否在可用范围内 2.nodeCode是否唯一 3.节点是否连通 4.START/END是否存在\n" +
|
|
|
|
|
+ "输出JSON: {\"passed\":true/false,\"score\":\"0-100\",\"suggestions\":[\"建议1\"],\"details\":\"详情\"}";
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private ValidationResult validateWorkflow(String modelName, String workflowJson, String dynamicNodeTypes) {
|
|
|
|
|
|
|
+ private ValidationResult parseValidation(String response) {
|
|
|
try {
|
|
try {
|
|
|
- String prompt = "你是工作流QA专家。验证以下工作流JSON:\n\n" +
|
|
|
|
|
- "期望节点类型: " + dynamicNodeTypes + "\n\n" +
|
|
|
|
|
- "工作流:\n" + workflowJson + "\n\n" +
|
|
|
|
|
- "检查: 1.节点类型是否在可用范围内 2.nodeCode是否唯一 3.节点是否连通 4.START/END是否存在\n" +
|
|
|
|
|
- "输出JSON: {\"passed\":true/false,\"score\":\"0-100\",\"suggestions\":[\"建议1\"],\"details\":\"详情\"}";
|
|
|
|
|
-
|
|
|
|
|
- String response = multiModelRouter.generateResponse(prompt, modelName, "workflow_validator");
|
|
|
|
|
- try {
|
|
|
|
|
- JSONObject json = JSON.parseObject(repairJson(response));
|
|
|
|
|
- return new ValidationResult(json.getBooleanValue("passed"), json.getString("score"),
|
|
|
|
|
- json.getString("details"),
|
|
|
|
|
- json.getJSONArray("suggestions") != null ?
|
|
|
|
|
- json.getJSONArray("suggestions").toJavaList(String.class) : new ArrayList<>());
|
|
|
|
|
- } catch (Exception e) {
|
|
|
|
|
- return new ValidationResult(true, "85", "Validation completed",
|
|
|
|
|
- Arrays.asList("No specific suggestions"));
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ JSONObject json = JSON.parseObject(repairJson(response));
|
|
|
|
|
+ return new ValidationResult(json.getBooleanValue("passed"), json.getString("score"),
|
|
|
|
|
+ json.getString("details"),
|
|
|
|
|
+ json.getJSONArray("suggestions") != null ?
|
|
|
|
|
+ json.getJSONArray("suggestions").toJavaList(String.class) : new ArrayList<>());
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
- logger.warn("[MultiModelWorkflow] Model C validation failed: {}", e.getMessage());
|
|
|
|
|
- return new ValidationResult(true, "75", "Validation skipped", Arrays.asList("Validation error"));
|
|
|
|
|
|
|
+ return new ValidationResult(true, "85", "Validation completed",
|
|
|
|
|
+ Arrays.asList("No specific suggestions"));
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|