diff --git a/src/views/settings/creation/index.vue b/src/views/settings/creation/index.vue index d6d1b0e..2192800 100644 --- a/src/views/settings/creation/index.vue +++ b/src/views/settings/creation/index.vue @@ -1133,6 +1133,19 @@ const availableParentParams = computed(() => { // 如果是判断节点,跳过不添加其字段 if (isJudge) return; + const modelOutputFields = Array.isArray(parentProps.modelOutputFields) ? parentProps.modelOutputFields : []; + if (modelOutputFields.length > 0) { + modelOutputFields.forEach((field: any) => { + const fieldName = String(field || '').trim(); + if (!fieldName) return; + params.push({ + label: `${parentNodeName}.${fieldName}`, + value: `\${${parentId}.${fieldName}}`, + }); + }); + return; + } + // 只添加可引用字段(HTTP节点仅允许结果返回结构;其他节点维持原逻辑) if (parentProps.formConfig && Array.isArray(parentProps.formConfig)) { if (nodeCode === 'http') { @@ -1193,6 +1206,7 @@ const workflowDsl = computed(() => ({ y: n.y || 0, }, inputSource: n.properties?.inputSource || null, + modelOutputFields: Array.isArray(n.properties?.modelOutputFields) ? n.properties.modelOutputFields : null, formConfig: (() => { const cfg = n.properties?.formConfig; if (!Array.isArray(cfg)) return null; @@ -1651,7 +1665,7 @@ const useWorkflow = async (workflow: WorkflowItem) => { // 初始化其他配置字段(从 config 中读取) if (node.config) { Object.keys(node.config).forEach((key) => { - if (!['nodeCode', 'width', 'height', 'x', 'y', 'formConfig', 'inputSource', 'fieldMetadata', 'selectedModel'].includes(key)) { + if (!['nodeCode', 'width', 'height', 'x', 'y', 'formConfig', 'inputSource', 'fieldMetadata', 'selectedModel', 'modelOutputFields'].includes(key)) { const fieldKey = `${node.id}_${key}`; creationFormValues[fieldKey] = node.config[key]; } @@ -2227,7 +2241,7 @@ const handleTreeNodeClick = async (data: TreeNode) => { // 初始化其他配置字段(从 config 中读取) if (node.config) { Object.keys(node.config).forEach((key) => { - if (!['nodeCode', 'width', 'height', 'x', 'y', 'formConfig', 'inputSource', 'fieldMetadata', 'selectedModel'].includes(key)) { + if (!['nodeCode', 'width', 'height', 'x', 'y', 'formConfig', 'inputSource', 'fieldMetadata', 'selectedModel', 'modelOutputFields'].includes(key)) { const fieldKey = `${node.id}_${key}`; creationFormValues[fieldKey] = node.config[key]; } @@ -2311,7 +2325,7 @@ const handleTreeNodeClick = async (data: TreeNode) => { // 初始化其他配置字段(从 config 中读取) if (node.config) { Object.keys(node.config).forEach((key) => { - if (!['nodeCode', 'width', 'height', 'x', 'y', 'formConfig', 'inputSource', 'fieldMetadata', 'selectedModel'].includes(key)) { + if (!['nodeCode', 'width', 'height', 'x', 'y', 'formConfig', 'inputSource', 'fieldMetadata', 'selectedModel', 'modelOutputFields'].includes(key)) { const fieldKey = `${node.id}_${key}`; creationFormValues[fieldKey] = node.config[key]; } @@ -3378,6 +3392,7 @@ const applySelected = () => { 'nodeCode', 'fieldMetadata', 'modelConfig', + 'modelOutputFields', 'inputSource', 'formConfig', 'skillName', @@ -3399,6 +3414,11 @@ const applySelected = () => { // 获取模型的 responseBody(必须来自 responseBody) const responseBody = selectedModelData.value?.responseBody || {}; + const responseMapping = selectedModelData.value?.responseMapping; + const modelOutputFields = + responseMapping && typeof responseMapping === 'object' && !Array.isArray(responseMapping) + ? Object.keys(responseMapping).filter((key) => String(key || '').trim() !== '') + : []; // 保存到 modelConfig,包含 modelResponse p.modelConfig = { @@ -3408,12 +3428,19 @@ const applySelected = () => { modelResponse: responseBody, // 将 modelResponse 放在 modelConfig 内部 }; + if (modelOutputFields.length > 0) { + p.modelOutputFields = modelOutputFields; + } else { + delete p.modelOutputFields; + } + // 保存模型选择状态 p.selectedModel = selectedModel.value; p.modelData = selectedModelData.value; } else { // 如果没有选择模型,删除 modelConfig 和模型状态 delete p.modelConfig; + delete p.modelOutputFields; delete p.selectedModel; delete p.modelData; }