feat: Variable Splitting Node and Parameter Extraction Node

v3.2
wangdan-fit2cloud 2025-10-21 19:30:15 +08:00
parent 727c8bfa98
commit 09c5c9c042
47 changed files with 292 additions and 319 deletions

View File

@ -55,7 +55,7 @@ const view_card = computed(() => {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@mixin valueScss() { @mixin valueScss() {
color: rgba(31, 35, 41, 1); color: var(--el-text-color-primary);
font-weight: 500; font-weight: 500;
font-size: 12px; font-size: 12px;
line-height: 22px; line-height: 22px;

View File

@ -24,11 +24,11 @@
@blur="folderForm.name = folderForm.name.trim()" @blur="folderForm.name = folderForm.name.trim()"
/> />
</el-form-item> </el-form-item>
<el-form-item :label="$t('components.folder.description')" prop="desc"> <el-form-item :label="$t('common.desc')" prop="desc">
<el-input <el-input
v-model="folderForm.desc" v-model="folderForm.desc"
type="textarea" type="textarea"
:placeholder="$t('components.folder.descriptionPlaceholder')" :placeholder="$t('common.descPlaceholder')"
maxlength="128" maxlength="128"
show-word-limit show-word-limit
:autosize="{ minRows: 3 }" :autosize="{ minRows: 3 }"

View File

@ -56,7 +56,7 @@ const showBack = computed(() => {
position: absolute; position: absolute;
top: 36px; top: 36px;
right: -12px; right: -12px;
box-shadow: 0px 5px 10px 0px rgba(31, 35, 41, 0.1); box-shadow: 0px 5px 10px 0px var(--app-text-color-light-1);
z-index: 1; z-index: 1;
} }

View File

@ -78,6 +78,8 @@ export default {
selectPlaceholder: 'Please select', selectPlaceholder: 'Please select',
title: 'Title', title: 'Title',
content: 'Content', content: 'Content',
desc: 'Description',
descPlaceholder: 'Please enter description',
rename: 'Rename', rename: 'Rename',
renameSuccess: 'Successful', renameSuccess: 'Successful',
EditAvatarDialog: { EditAvatarDialog: {
@ -114,4 +116,5 @@ export default {
label: 'Prompt', label: 'Prompt',
placeholder: 'Please enter prompt', placeholder: 'Please enter prompt',
}, },
variable: 'Variable',
} }

View File

@ -15,8 +15,6 @@ export default {
addChildFolder: 'Add Child Folder', addChildFolder: 'Add Child Folder',
editFolder: 'Edit Folder', editFolder: 'Edit Folder',
folderNamePlaceholder: 'Please enter a name', folderNamePlaceholder: 'Please enter a name',
description: 'Description',
descriptionPlaceholder: 'Please enter a description',
requiredMessage: 'Please select a folder', requiredMessage: 'Please select a folder',
deleteConfirmMessage: 'Folders with resources will be deleted, please be cautious.', deleteConfirmMessage: 'Folders with resources will be deleted, please be cautious.',
}, },

View File

@ -432,23 +432,21 @@ You are a master of problem optimization, adept at accurately inferring user int
text: 'Used to split variables', text: 'Used to split variables',
result: 'Result', result: 'Result',
splitVariables: 'Split Variables', splitVariables: 'Split Variables',
inputVariables: 'Input Variable',
addVariables: 'Add Variables',
editVariables: 'Edit Variables',
variablePlaceholder: 'Please enter variable',
expression: { expression: {
label: 'Expression', label: 'Expression',
placeholder: 'Please enter expression', placeholder: 'Please enter expression',
}, },
}, },
parameterExtractionNode: { parameterExtractionNode: {
label: '參數提取', label: 'Parameter Extraction',
text: '利用 AI 模型提取結構化參數', text: 'Use AI models to extract structured parameters',
result: '結果',
selectVariables: {
label: '選擇變數',
placeholder: '請選擇變數',
},
extractParameters: { extractParameters: {
label: '提取參數', label: 'Extract Parameters',
desc: '描述', parameterType: 'Parameter Type',
parameterType: '參數類型',
}, },
}, },
}, },

View File

@ -43,7 +43,6 @@ export default {
requiredMessage: 'APP name is required', requiredMessage: 'APP name is required',
}, },
appDescription: { appDescription: {
label: 'Description',
placeholder: placeholder:
'Describe the APP scenario and use, e.g.: XXX assistant answering user questions about XXX product usage', 'Describe the APP scenario and use, e.g.: XXX assistant answering user questions about XXX product usage',
}, },

View File

@ -54,11 +54,9 @@ export default {
requiredMessage: 'Please enter the MCP name', requiredMessage: 'Please enter the MCP name',
}, },
toolDescription: { toolDescription: {
label: 'Description',
placeholder: 'Please enter a description of the tool', placeholder: 'Please enter a description of the tool',
}, },
mcpDescription: { mcpDescription: {
label: 'Description',
placeholder: 'Please enter a description of the MCP', placeholder: 'Please enter a description of the MCP',
}, },
paramName: { paramName: {

View File

@ -82,6 +82,8 @@ export default {
selectPlaceholder: '请选择', selectPlaceholder: '请选择',
title: '标题', title: '标题',
content: '内容', content: '内容',
desc: '描述',
descPlaceholder: '请输入描述',
rename: '重命名', rename: '重命名',
renameSuccess: '重命名成功', renameSuccess: '重命名成功',
EditAvatarDialog: { EditAvatarDialog: {
@ -117,4 +119,5 @@ export default {
label: '提示词', label: '提示词',
placeholder: '请输入提示词', placeholder: '请输入提示词',
}, },
variable: '变量',
} }

View File

@ -15,9 +15,7 @@ export default {
addChildFolder: '添加子文件夹', addChildFolder: '添加子文件夹',
editFolder: '编辑文件夹', editFolder: '编辑文件夹',
folderNamePlaceholder: '请输入名称', folderNamePlaceholder: '请输入名称',
description: '描述',
descriptionPlaceholder: '请输入描述',
requiredMessage: '请选择文件夹', requiredMessage: '请选择文件夹',
deleteConfirmMessage: '文件夹下的资源会被删除,请谨慎操作。' deleteConfirmMessage: '文件夹下的资源会被删除,请谨慎操作。',
}, },
} }

View File

@ -28,9 +28,6 @@ export default {
placeholder: '请输入关键字搜索', placeholder: '请输入关键字搜索',
}, },
paramForm: { paramForm: {
variable: {
label: '变量',
},
field: { field: {
label: '参数', label: '参数',
placeholder: '请输入参数', placeholder: '请输入参数',

View File

@ -50,7 +50,6 @@ export default {
beautify: '一键美化', beautify: '一键美化',
}, },
variable: { variable: {
label: '变量',
global: '全局变量', global: '全局变量',
chat: '会话变量', chat: '会话变量',
Referencing: '引用变量', Referencing: '引用变量',
@ -443,25 +442,22 @@ export default {
variableSplittingNode: { variableSplittingNode: {
label: '变量拆分', label: '变量拆分',
text: '用于拆分变量', text: '用于拆分变量',
result: '结果',
splitVariables: '拆分变量', splitVariables: '拆分变量',
inputVariables: '输入变量',
addVariables: '添加变量',
editVariables: '编辑变量',
variablePlaceholder: '请输入变量',
expression: { expression: {
label: '表达式', label: '表达式',
placeholder: '请输入表达式', placeholder: '请输入表达式',
}, },
}, },
parameterExtractionNode: { parameterExtractionNode: {
label: '參數提取', label: '参数提取',
text: '利用 AI 模型提取結構化參數', text: '利用 AI 模型提取结构化参数',
result: '結果',
selectVariables: {
label: '選擇變量',
placeholder: '請選擇變量',
},
extractParameters: { extractParameters: {
label: '提取參數', label: '提取参数',
desc: '描述', parameterType: '参数类型',
parameterType: '參數類型',
}, },
}, },
}, },

View File

@ -42,7 +42,6 @@ export default {
requiredMessage: '请输入应用名称', requiredMessage: '请输入应用名称',
}, },
appDescription: { appDescription: {
label: '描述',
placeholder: '描述该应用的应用场景及用途XXX 小助手回答用户提出的 XXX 产品使用问题', placeholder: '描述该应用的应用场景及用途XXX 小助手回答用户提出的 XXX 产品使用问题',
}, },
appType: { appType: {

View File

@ -48,11 +48,9 @@ export default {
requiredMessage: '请输入MCP名称', requiredMessage: '请输入MCP名称',
}, },
toolDescription: { toolDescription: {
label: '描述',
placeholder: '请输入工具的描述', placeholder: '请输入工具的描述',
}, },
mcpDescription: { mcpDescription: {
label: '描述',
placeholder: '请输入MCP的描述', placeholder: '请输入MCP的描述',
}, },
paramName: { paramName: {

View File

@ -78,6 +78,8 @@ export default {
selectPlaceholder: '請選擇', selectPlaceholder: '請選擇',
title: '標題', title: '標題',
content: '内容', content: '内容',
desc: '描述',
descPlaceholder: '請輸入描述',
rename: '重命名', rename: '重命名',
renameSuccess: '重命名成功', renameSuccess: '重命名成功',
EditAvatarDialog: { EditAvatarDialog: {
@ -113,4 +115,5 @@ export default {
label: '提示詞', label: '提示詞',
placeholder: '請輸入提示詞', placeholder: '請輸入提示詞',
}, },
variable: '變量',
} }

View File

@ -15,8 +15,6 @@ export default {
addChildFolder: '添加子文件夾', addChildFolder: '添加子文件夾',
editFolder: '編輯文件夾', editFolder: '編輯文件夾',
folderNamePlaceholder: '請輸入名稱', folderNamePlaceholder: '請輸入名稱',
description: '描述',
descriptionPlaceholder: '請輸入描述',
requiredMessage: '請選擇文件夾', requiredMessage: '請選擇文件夾',
deleteConfirmMessage: '文件夹下的資源會被刪除,請謹慎操作。', deleteConfirmMessage: '文件夹下的資源會被刪除,請謹慎操作。',
}, },

View File

@ -418,6 +418,10 @@ export default {
text: '用於拆分變量', text: '用於拆分變量',
result: '結果', result: '結果',
splitVariables: '拆分變量', splitVariables: '拆分變量',
inputVariables: '輸入變量',
addVariables: '添加變量',
editVariables: '編輯變量',
variablePlaceholder: '請輸入變量',
expression: { expression: {
label: '表達式', label: '表達式',
placeholder: '請輸入表達式', placeholder: '請輸入表達式',
@ -425,16 +429,10 @@ export default {
}, },
parameterExtractionNode: { parameterExtractionNode: {
label: '參數提取', label: '參數提取',
text: ' ', text: '利用 AI 模型提取結構化參數',
result: '結果',
selectVariables: {
label: ' ',
placeholder: '請選擇要提取的參數',
},
extractParameters: { extractParameters: {
label: '提取參數', label: '提取參數',
desc: '從文本中提取參數', parameterType: '參數類型',
parameterType: 'Parameter Type',
}, },
}, },
}, },

View File

@ -39,7 +39,6 @@ export default {
requiredMessage: '請輸入應用名稱', requiredMessage: '請輸入應用名稱',
}, },
appDescription: { appDescription: {
label: '描述',
placeholder: '描述該應用的應用場景及用途XXX 小助手回答用戶提出的 XXX 產品使用問題', placeholder: '描述該應用的應用場景及用途XXX 小助手回答用戶提出的 XXX 產品使用問題',
}, },
appType: { appType: {

View File

@ -51,11 +51,9 @@ export default {
requiredMessage: '請輸入MCP名稱', requiredMessage: '請輸入MCP名稱',
}, },
toolDescription: { toolDescription: {
label: '描述',
placeholder: '請輸入工具的描述', placeholder: '請輸入工具的描述',
}, },
mcpDescription: { mcpDescription: {
label: '描述',
placeholder: '請輸入MCP的描述', placeholder: '請輸入MCP的描述',
}, },
paramName: { paramName: {

View File

@ -4,6 +4,7 @@
--el-text-color-primary: #1f2329; --el-text-color-primary: #1f2329;
--el-border-radius-base: 6px; --el-border-radius-base: 6px;
--el-menu-item-height: 45px; --el-menu-item-height: 45px;
--el-border-color: rgba(31, 35, 41, 0.15);
} }
.el-avatar { .el-avatar {
@ -183,6 +184,7 @@
.el-table { .el-table {
--el-table-header-bg-color: var(--app-layout-bg-color); --el-table-header-bg-color: var(--app-layout-bg-color);
--el-table-text-color: var(--app-text-color); --el-table-text-color: var(--app-text-color);
--el-table-border-color: #DEE0E3;
font-weight: 400; font-weight: 400;
thead { thead {
color: var(--app-text-color-secondary); color: var(--app-text-color-secondary);

View File

@ -706,7 +706,7 @@ defineExpose({ open })
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center; background-position: center;
background-size: auto 100%; background-size: auto 100%;
box-shadow: 0px 4px 8px 0px rgba(31, 35, 41, 0.1); box-shadow: 0px 4px 8px 0px var(--app-text-color-light-1);
overflow: hidden; overflow: hidden;
width: 330px; width: 330px;
height: 520px; height: 520px;

View File

@ -673,7 +673,7 @@ onBeforeUnmount(() => {
border-radius: 8px; border-radius: 8px;
border: 1px solid #ffffff; border: 1px solid #ffffff;
background: var(--dialog-bg-gradient-color); background: var(--dialog-bg-gradient-color);
box-shadow: 0px 4px 8px 0px rgba(31, 35, 41, 0.1); box-shadow: 0px 4px 8px 0px var(--app-text-color-light-1);
position: fixed; position: fixed;
bottom: 16px; bottom: 16px;
right: 16px; right: 16px;

View File

@ -61,7 +61,7 @@
@blur="applicationForm.name = applicationForm.name?.trim()" @blur="applicationForm.name = applicationForm.name?.trim()"
/> />
</el-form-item> </el-form-item>
<el-form-item :label="$t('views.application.form.appDescription.label')"> <el-form-item :label="$t('common.desc')">
<el-input <el-input
v-model="applicationForm.desc" v-model="applicationForm.desc"
type="textarea" type="textarea"

View File

@ -23,7 +23,7 @@
show-word-limit show-word-limit
/> />
</el-form-item> </el-form-item>
<el-form-item :label="$t('views.application.form.appDescription.label')"> <el-form-item :label="$t('common.desc')">
<el-input <el-input
v-model="applicationForm.desc" v-model="applicationForm.desc"
type="textarea" type="textarea"

View File

@ -28,7 +28,7 @@
@blur="applicationForm.name = applicationForm.name?.trim()" @blur="applicationForm.name = applicationForm.name?.trim()"
/> />
</el-form-item> </el-form-item>
<el-form-item :label="$t('views.application.form.appDescription.label')"> <el-form-item :label="$t('common.desc')">
<el-input <el-input
v-model="applicationForm.desc" v-model="applicationForm.desc"
type="textarea" type="textarea"

View File

@ -50,11 +50,7 @@
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
<div <div v-show="!isPcCollapse" class="left-height" v-if="showHistory">
v-show="!isPcCollapse"
class="left-height"
v-if="showHistory"
>
<el-scrollbar> <el-scrollbar>
<div class="p-16 pt-0"> <div class="p-16 pt-0">
<common-list <common-list
@ -111,11 +107,7 @@
<template #title>{{ $t('chat.createChat') }}</template> <template #title>{{ $t('chat.createChat') }}</template>
</el-menu-item> </el-menu-item>
<el-sub-menu <el-sub-menu v-show="isPcCollapse" index="2" v-if="showHistory">
v-show="isPcCollapse"
index="2"
v-if="showHistory"
>
<template #title> <template #title>
<AppIcon iconName="app-history-outlined" /> <AppIcon iconName="app-history-outlined" />
</template> </template>
@ -285,7 +277,7 @@ function refreshFieldTitle(chatId: string, abstract: string) {
padding-left: 8px; padding-left: 8px;
padding-right: 8px; padding-right: 8px;
&:hover { &:hover {
background-color: rgba(31, 35, 41, 0.1); background-color: var(--app-text-color-light-1);
} }
&.is-active { &.is-active {
background-color: #ffffff; background-color: #ffffff;

View File

@ -152,7 +152,6 @@ const logout = () => {
params: { accessToken: chatUser.accessToken }, params: { accessToken: chatUser.accessToken },
query: route.query, query: route.query,
}) })
}) })
} }
</script> </script>
@ -168,7 +167,7 @@ const logout = () => {
position: absolute; position: absolute;
top: 20px; top: 20px;
right: -13px; right: -13px;
box-shadow: 0px 5px 10px 0px rgba(31, 35, 41, 0.1); box-shadow: 0px 5px 10px 0px var(--app-text-color-light-1);
z-index: 1; z-index: 1;
width: 24px; width: 24px;
height: 24px; height: 24px;

View File

@ -542,7 +542,7 @@ function closeExecutionDetail() {
position: absolute; position: absolute;
top: 20px; top: 20px;
right: -13px; right: -13px;
box-shadow: 0px 5px 10px 0px rgba(31, 35, 41, 0.1); box-shadow: 0px 5px 10px 0px var(--app-text-color-light-1);
z-index: 1; z-index: 1;
width: 24px; width: 24px;
height: 24px; height: 24px;

View File

@ -97,7 +97,7 @@ defineExpose({ open })
} }
.active-breadcrumb { .active-breadcrumb {
font-size: 16px; font-size: 16px;
color: rgba(31, 35, 41, 1); color: var(--el-text-color-primary);
font-weight: 500; font-weight: 500;
line-height: 24px; line-height: 24px;
} }

View File

@ -139,9 +139,7 @@
:description="$t('views.model.tip.emptyMessage1')" :description="$t('views.model.tip.emptyMessage1')"
/> />
<el-empty <el-empty
v-else-if=" v-else-if="base_form_data.model_type === 'RERANKER'"
base_form_data.model_type === 'RERANKER'
"
:description="$t('views.model.tip.emptyMessage2')" :description="$t('views.model.tip.emptyMessage2')"
/> />
<div class="flex-between mb-8" v-else> <div class="flex-between mb-8" v-else>
@ -149,7 +147,11 @@
<el-button <el-button
type="text" type="text"
@click.stop="openAddDrawer()" @click.stop="openAddDrawer()"
:disabled="!['TTS', 'LLM', 'IMAGE', 'TTI', 'TTV', 'ITV','STT', 'EMBEDDING'].includes(base_form_data.model_type)" :disabled="
!['TTS', 'LLM', 'IMAGE', 'TTI', 'TTV', 'ITV', 'STT', 'EMBEDDING'].includes(
base_form_data.model_type,
)
"
> >
<AppIcon iconName="app-add-outlined" class="mr-4" /> {{ $t('common.add') }} <AppIcon iconName="app-add-outlined" class="mr-4" /> {{ $t('common.add') }}
</el-button> </el-button>
@ -464,7 +466,7 @@ defineExpose({ open, close })
.active-breadcrumb { .active-breadcrumb {
font-size: 16px; font-size: 16px;
color: rgba(31, 35, 41, 1); color: var(--el-text-color-primary);
font-weight: 500; font-weight: 500;
line-height: 24px; line-height: 24px;
} }

View File

@ -289,7 +289,7 @@ defineExpose({ open, close })
.active-breadcrumb { .active-breadcrumb {
font-size: 16px; font-size: 16px;
color: rgba(31, 35, 41, 1); color: var(--el-text-color-primary);
font-weight: 500; font-weight: 500;
line-height: 24px; line-height: 24px;
} }

View File

@ -33,11 +33,7 @@
v-if="permissionPrecise.doc_edit(id)" v-if="permissionPrecise.doc_edit(id)"
> >
<el-button text @click.stop="editParagraph(data)"> <el-button text @click.stop="editParagraph(data)">
<AppIcon <AppIcon iconName="app-edit" :size="16" class="color-secondary"></AppIcon>
iconName="app-edit"
:size="16"
class="color-secondary"
></AppIcon>
</el-button> </el-button>
</el-tooltip> </el-tooltip>
</span> </span>
@ -324,7 +320,7 @@ watch(dialogVisible, (val: boolean) => {
position: relative; position: relative;
overflow: inherit; overflow: inherit;
&:hover { &:hover {
background: rgba(31, 35, 41, 0.1); background: var(--app-text-color-light-1);
border: 1px solid #dee0e3; border: 1px solid #dee0e3;
} }
&.disabled { &.disabled {

View File

@ -63,7 +63,7 @@
</div> </div>
</el-form-item> </el-form-item>
<el-form-item :label="$t('views.tool.form.mcpDescription.label')"> <el-form-item :label="$t('common.desc')">
<el-input <el-input
v-model="form.desc" v-model="form.desc"
type="textarea" type="textarea"
@ -78,7 +78,7 @@
{{ $t('views.tool.form.mcp.title') }} {{ $t('views.tool.form.mcp.title') }}
</h4> </h4>
<el-form-item :label="$t('views.tool.form.mcpDescription.label')" prop="code"> <el-form-item prop="code">
<template #label> <template #label>
{{ $t('views.tool.form.mcp.label') }} {{ $t('views.tool.form.mcp.label') }}
<span class="color-danger">*</span> <span class="color-danger">*</span>
@ -98,7 +98,9 @@
<template #footer> <template #footer>
<div> <div>
<el-button :loading="loading" @click="testConnection">{{ $t('views.system.test') }}</el-button> <el-button :loading="loading" @click="testConnection">{{
$t('views.system.test')
}}</el-button>
<el-button :loading="loading" @click="visible = false">{{ $t('common.cancel') }}</el-button> <el-button :loading="loading" @click="visible = false">{{ $t('common.cancel') }}</el-button>
<el-button <el-button
type="primary" type="primary"

View File

@ -60,7 +60,7 @@
</div> </div>
</el-form-item> </el-form-item>
<el-form-item :label="$t('views.tool.form.toolDescription.label')"> <el-form-item :label="$t('common.desc')">
<el-input <el-input
v-model="form.desc" v-model="form.desc"
type="textarea" type="textarea"

View File

@ -52,7 +52,7 @@ defineExpose({ open })
position: absolute; position: absolute;
top: 12px; top: 12px;
right: 12px; right: 12px;
box-shadow: 0px 4px 8px 0px rgba(31, 35, 41, 0.1); box-shadow: 0px 4px 8px 0px var(--app-text-color-light-1);
z-index: 2; z-index: 2;
} }
.config-textarea { .config-textarea {

View File

@ -166,15 +166,15 @@ export const questionNode = {
} }
export const variableSplittingNode = { export const variableSplittingNode = {
type: WorkflowType.VariableSplittingNode, type: WorkflowType.VariableSplittingNode,
text: t('views.applicationWorkflow.nodes.variableSplittingNode.text', '变量拆分'), text: t('views.applicationWorkflow.nodes.variableSplittingNode.text'),
label: t('views.applicationWorkflow.nodes.variableSplittingNode.label', '变量拆分'), label: t('views.applicationWorkflow.nodes.variableSplittingNode.label'),
height: 345, height: 345,
properties: { properties: {
stepName: t('views.applicationWorkflow.nodes.variableSplittingNode.label', '变量拆分'), stepName: t('views.applicationWorkflow.nodes.variableSplittingNode.label'),
config: { config: {
fields: [ fields: [
{ {
label: t('views.applicationWorkflow.nodes.variableSplittingNode.result', '结果'), label: t('common.result'),
value: 'result', value: 'result',
}, },
], ],
@ -184,15 +184,16 @@ export const variableSplittingNode = {
export const parameterExtractionNode = { export const parameterExtractionNode = {
type: WorkflowType.ParameterExtractionNode, type: WorkflowType.ParameterExtractionNode,
text: t('views.applicationWorkflow.nodes.parameterExtractionNode.text', '变量拆分'), text: t('views.applicationWorkflow.nodes.parameterExtractionNode.text'),
label: t('views.applicationWorkflow.nodes.parameterExtractionNode.label', '变量拆分'), label: t('views.applicationWorkflow.nodes.parameterExtractionNode.label'),
height: 345, height: 345,
properties: { properties: {
stepName: t('views.applicationWorkflow.nodes.parameterExtractionNode.label', '变量拆分'), width: 430,
stepName: t('views.applicationWorkflow.nodes.parameterExtractionNode.label'),
config: { config: {
fields: [ fields: [
{ {
label: t('views.applicationWorkflow.nodes.parameterExtractionNode.result', '结果'), label: t('common.result'),
value: 'result', value: 'result',
}, },
], ],
@ -633,11 +634,16 @@ export const menuNodes = [
}, },
{ {
label: t('views.applicationWorkflow.nodes.classify.businessLogic'), label: t('views.applicationWorkflow.nodes.classify.businessLogic'),
list: [conditionNode, formNode, variableAssignNode, replyNode, loopNode], list: [conditionNode, formNode, replyNode, loopNode],
}, },
{ {
label: t('views.applicationWorkflow.nodes.classify.dataProcessing', '数据处理'), label: t('views.applicationWorkflow.nodes.classify.dataProcessing'),
list: [variableSplittingNode, parameterExtractionNode, variableAggregationNode], list: [
variableAssignNode,
variableAggregationNode,
variableSplittingNode,
parameterExtractionNode,
],
}, },
{ {
label: t('views.applicationWorkflow.nodes.classify.other'), label: t('views.applicationWorkflow.nodes.classify.other'),

View File

@ -1,5 +1,5 @@
<template> <template>
<el-avatar shape="square" style="background: #7F3BF5"> <el-avatar shape="square" class="avatar-blue">
<img src="@/assets/workflow/icon_aggregation.svg" style="width: 100%" alt="" /> <img src="@/assets/workflow/icon_aggregation.svg" style="width: 100%" alt="" />
</el-avatar> </el-avatar>
</template> </template>

View File

@ -1,6 +1,6 @@
<template> <template>
<el-avatar shape="square" class="avatar-blue"> <el-avatar shape="square" class="avatar-blue">
<img src="@/assets/workflow/icon_variable_splitting.svg" style="width: 65%" alt="" /> <img src="@/assets/workflow/icon_variable_splitting.svg" style="width: 100%" alt="" />
</el-avatar> </el-avatar>
</template> </template>
<script setup lang="ts"></script> <script setup lang="ts"></script>

View File

@ -44,12 +44,12 @@
/> />
</el-form-item> </el-form-item>
<el-form-item <el-form-item
:label="$t('views.application.form.appDescription.label')" :label="$t('common.desc')"
prop="desc" prop="desc"
:rules="{ :rules="{
required: form.is_required, required: form.is_required,
message: message:
$t('common.inputPlaceholder') + $t('views.application.form.appDescription.label'), $t('common.inputPlaceholder') + $t('common.desc'),
trigger: 'blur', trigger: 'blur',
}" }"
> >

View File

@ -20,7 +20,7 @@
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="desc" :label="$t('views.application.form.appDescription.label')"> <el-table-column prop="desc" :label="$t('common.desc')">
<template #default="{ row }"> <template #default="{ row }">
<span class="ellipsis-1" :title="row.desc"> <span class="ellipsis-1" :title="row.desc">
{{ row.desc }} {{ row.desc }}

View File

@ -69,27 +69,13 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item <el-form-item :label="$t('common.desc')" prop="desc">
:label="
$t(
'views.applicationWorkflow.nodes.parameterExtractionNode.extractParameters.desc',
'描述',
)
"
prop="desc"
>
<el-input <el-input
v-model="form.desc" v-model="form.desc"
style="width: 100%" style="width: 100%"
:rows="2" :rows="2"
type="textarea" type="textarea"
:placeholder=" :placeholder="$t('common.descPlaceholder')"
$t('common.inputPlaceholder') +
$t(
'views.applicationWorkflow.nodes.parameterExtractionNode.extractParameters.desc',
'描述',
)
"
/> />
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -97,7 +83,7 @@
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click.prevent="close"> {{ $t('common.cancel') }} </el-button> <el-button @click.prevent="close"> {{ $t('common.cancel') }} </el-button>
<el-button type="primary" @click="submit(fieldFormRef)" :loading="loading"> <el-button type="primary" @click="submit(fieldFormRef)" :loading="loading">
{{ isEdit ? $t('common.save') : $t('common.add') }} {{ $t('common.save') }}
</el-button> </el-button>
</span> </span>
</template> </template>

View File

@ -1,34 +1,23 @@
<template> <template>
<div class="flex-between mb-16"> <div class="flex-between w-full">
<h5 class="break-all ellipsis lighter" style="max-width: 80%"> <h5 class="break-all lighter">
{{ {{ $t('views.applicationWorkflow.nodes.parameterExtractionNode.extractParameters.label') }}
$t( <span class="color-danger">*</span>
'views.applicationWorkflow.nodes.parameterExtractionNode.extractParameters.label',
'提取参数',
)
}}
</h5> </h5>
<div> <span class="ml-4" style="margin-top: -4px">
<span class="ml-4">
<el-button link type="primary" @click="openAddDialog()"> <el-button link type="primary" @click="openAddDialog()">
<AppIcon iconName="app-add-outlined" class="mr-4"></AppIcon> <AppIcon iconName="app-add-outlined" class="mr-4"></AppIcon>
{{ $t('common.add') }}
</el-button> </el-button>
</span> </span>
</div> </div>
</div>
<el-table <el-table
v-if="props.nodeModel.properties.node_data.variable_list?.length > 0" v-if="props.nodeModel.properties.node_data.variable_list?.length > 0"
:data="props.nodeModel.properties.node_data.variable_list" :data="props.nodeModel.properties.node_data.variable_list"
class="mb-16"
ref="tableRef" ref="tableRef"
row-key="field" row-key="field"
class="border-l border-r"
> >
<el-table-column <el-table-column prop="field" :label="$t('dynamicsForm.paramForm.field.label')" width="90">
prop="field"
:label="$t('dynamicsForm.paramForm.field.label', '变量')"
width="95"
>
<template #default="{ row }"> <template #default="{ row }">
<span :title="row.field" class="ellipsis-1">{{ row.field }}</span> <span :title="row.field" class="ellipsis-1">{{ row.field }}</span>
</template> </template>
@ -52,14 +41,10 @@
" "
> >
<template #default="{ row }"> <template #default="{ row }">
<span> <el-tag type="info" class="info-tag"> {{ row.parameter_type }}</el-tag>
<span :title="row.parameter_type" class="ellipsis-1">
{{ row.parameter_type }}
</span></span
>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('common.operation')" align="left" width="90"> <el-table-column :label="$t('common.operation')" align="left" width="80">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<span class="mr-4"> <span class="mr-4">
<el-tooltip effect="dark" :content="$t('common.modify')" placement="top"> <el-tooltip effect="dark" :content="$t('common.modify')" placement="top">
@ -103,7 +88,7 @@ function deleteField(index: any) {
inputFieldList.value.splice(index, 1) inputFieldList.value.splice(index, 1)
const fields = [ const fields = [
{ {
label: t('views.applicationWorkflow.nodes.variableSplittingNode.result', '结果'), label: t('common.result'),
value: 'result', value: 'result',
}, },
...inputFieldList.value.map((item) => ({ label: item.label, value: item.field })), ...inputFieldList.value.map((item) => ({ label: item.label, value: item.field })),
@ -126,7 +111,7 @@ function refreshFieldList(data: any, index: any) {
ParametersFieldDialogRef.value.close() ParametersFieldDialogRef.value.close()
const fields = [ const fields = [
{ {
label: t('views.applicationWorkflow.nodes.variableSplittingNode.result', '结果'), label: t('common.result'),
value: 'result', value: 'result',
}, },
...inputFieldList.value.map((item) => ({ label: item.label, value: item.field })), ...inputFieldList.value.map((item) => ({ label: item.label, value: item.field })),
@ -141,7 +126,7 @@ onMounted(() => {
set(props.nodeModel.properties.node_data, 'variable_list', inputFieldList) set(props.nodeModel.properties.node_data, 'variable_list', inputFieldList)
const fields = [ const fields = [
{ {
label: t('views.applicationWorkflow.nodes.variableSplittingNode.result', '结果'), label: t('common.result'),
value: 'result', value: 'result',
}, },
...inputFieldList.value.map((item) => ({ label: item.label, value: item.field })), ...inputFieldList.value.map((item) => ({ label: item.label, value: item.field })),

View File

@ -1,5 +1,7 @@
<template> <template>
<NodeContainer :nodeModel="nodeModel"> <NodeContainer :nodeModel="nodeModel">
<h5 class="title-decoration-1 mb-8">{{ $t('views.applicationWorkflow.nodeSetting') }}</h5>
<el-card shadow="never" class="card-never" style="--el-card-padding: 12px">
<el-form <el-form
@submit.prevent @submit.prevent
:model="form_data" :model="form_data"
@ -23,7 +25,7 @@
<div> <div>
<span <span
>{{ $t('views.application.form.aiModel.label') >{{ $t('views.application.form.aiModel.label')
}}<span class="color-danger">*</span></span }}<span class="color-danger ml-4">*</span></span
> >
</div> </div>
@ -51,22 +53,17 @@
></ModelSelect> ></ModelSelect>
</el-form-item> </el-form-item>
<el-form-item <el-form-item
:label=" prop="input_variable"
$t( :rules="{
'views.applicationWorkflow.nodes.parameterExtractionNode.selectVariables.label', message: $t('views.applicationWorkflow.variable.placeholder'),
'选择变量', trigger: 'blur',
) required: true,
" }"
> >
<template #label> <template #label>
<div class="flex-between"> <div class="flex-between">
<div> <div>
{{ {{ $t('views.applicationWorkflow.nodes.variableSplittingNode.inputVariables') }}
$t(
'views.applicationWorkflow.nodes.parameterExtractionNode.selectVariables.label',
'选择变量',
)
}}
<span class="color-danger">*</span> <span class="color-danger">*</span>
</div> </div>
</div> </div>
@ -75,19 +72,25 @@
ref="nodeCascaderRef" ref="nodeCascaderRef"
:nodeModel="nodeModel" :nodeModel="nodeModel"
class="w-full" class="w-full"
:placeholder=" :placeholder="$t('views.applicationWorkflow.variable.placeholder')"
$t(
'views.applicationWorkflow.nodes.parameterExtractionNode.selectVariables.placeholder',
)
"
v-model="form_data.input_variable" v-model="form_data.input_variable"
/> />
</el-form-item> </el-form-item>
<el-form-item
prop="variable_list"
:rules="{
message: $t('views.applicationWorkflow.nodes.parameterExtractionNode.extractParameters.label'),
trigger: 'blur',
required: true,
}"
>
<ParametersFieldTable <ParametersFieldTable
ref="ParametersFieldTableRef" ref="ParametersFieldTableRef"
:node-model="nodeModel" :node-model="nodeModel"
></ParametersFieldTable> ></ParametersFieldTable>
</el-form-item>
</el-form> </el-form>
</el-card>
<AIModeParamSettingDialog ref="AIModeParamSettingDialogRef" @refresh="refreshParam" /> <AIModeParamSettingDialog ref="AIModeParamSettingDialogRef" @refresh="refreshParam" />
</NodeContainer> </NodeContainer>
</template> </template>
@ -95,7 +98,6 @@
import { computed, onMounted, ref, inject } from 'vue' import { computed, onMounted, ref, inject } from 'vue'
import NodeContainer from '@/workflow/common/NodeContainer.vue' import NodeContainer from '@/workflow/common/NodeContainer.vue'
import NodeCascader from '@/workflow/common/NodeCascader.vue' import NodeCascader from '@/workflow/common/NodeCascader.vue'
import VariableFieldTable from '@/workflow/nodes/variable-splitting/component/VariableFieldTable.vue'
import AIModeParamSettingDialog from '@/views/application/component/AIModeParamSettingDialog.vue' import AIModeParamSettingDialog from '@/views/application/component/AIModeParamSettingDialog.vue'
import ParametersFieldTable from '@/workflow/nodes/parameter-extraction-node/component/ParametersFieldTable.vue' import ParametersFieldTable from '@/workflow/nodes/parameter-extraction-node/component/ParametersFieldTable.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'

View File

@ -11,11 +11,11 @@
> >
<template v-for="(item, index) in form_data.variable_list" :key="item.id"> <template v-for="(item, index) in form_data.variable_list" :key="item.id">
<el-card shadow="never" class="card-never mb-8" style="--el-card-padding: 12px"> <el-card shadow="never" class="card-never mb-8" style="--el-card-padding: 12px">
<el-form-item :label="$t('views.applicationWorkflow.variable.label')"> <el-form-item >
<template #label> <template #label>
<div class="flex-between"> <div class="flex-between">
<div> <div>
{{ $t('views.applicationWorkflow.variable.label') }} {{ $t('common.variable') }}
<span class="color-danger">*</span> <span class="color-danger">*</span>
</div> </div>
<el-button <el-button

View File

@ -1,6 +1,10 @@
<template> <template>
<el-dialog <el-dialog
:title="isEdit ? $t('common.param.editParam') : $t('common.param.addParam')" :title="
isEdit
? $t('views.applicationWorkflow.nodes.variableSplittingNode.editVariables')
: $t('views.applicationWorkflow.nodes.variableSplittingNode.addVariables')
"
v-model="dialogVisible" v-model="dialogVisible"
:close-on-click-modal="false" :close-on-click-modal="false"
:close-on-press-escape="false" :close-on-press-escape="false"
@ -16,7 +20,7 @@
require-asterisk-position="right" require-asterisk-position="right"
> >
<el-form-item <el-form-item
:label="$t('dynamicsForm.paramForm.field.label')" :label="$t('common.variable')"
:required="true" :required="true"
prop="field" prop="field"
:rules="rules.field" :rules="rules.field"
@ -24,7 +28,9 @@
<el-input <el-input
v-model="form.field" v-model="form.field"
:maxlength="64" :maxlength="64"
:placeholder="$t('dynamicsForm.paramForm.field.placeholder')" :placeholder="
$t('views.applicationWorkflow.nodes.variableSplittingNode.variablePlaceholder')
"
show-word-limit show-word-limit
/> />
</el-form-item> </el-form-item>
@ -42,9 +48,7 @@
/> />
</el-form-item> </el-form-item>
<el-form-item <el-form-item
:label=" :label="$t('views.applicationWorkflow.nodes.variableSplittingNode.expression.label')"
$t('views.applicationWorkflow.nodes.variableSplittingNode.expression.label', '表达式')
"
:required="true" :required="true"
prop="label" prop="label"
:rules="rules.label" :rules="rules.label"
@ -54,10 +58,7 @@
:maxlength="64" :maxlength="64"
show-word-limit show-word-limit
:placeholder=" :placeholder="
$t( $t('views.applicationWorkflow.nodes.variableSplittingNode.expression.placeholder')
'views.applicationWorkflow.nodes.variableSplittingNode.expression.placeholder',
'请输入表达式',
)
" "
/> />
</el-form-item> </el-form-item>
@ -66,7 +67,7 @@
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click.prevent="close"> {{ $t('common.cancel') }} </el-button> <el-button @click.prevent="close"> {{ $t('common.cancel') }} </el-button>
<el-button type="primary" @click="submit(fieldFormRef)" :loading="loading"> <el-button type="primary" @click="submit(fieldFormRef)" :loading="loading">
{{ isEdit ? $t('common.save') : $t('common.add') }} {{ $t('common.save') }}
</el-button> </el-button>
</span> </span>
</template> </template>

View File

@ -1,27 +1,25 @@
<template> <template>
<div class="flex-between mb-16"> <div class="flex-between w-full">
<h5 class="break-all ellipsis lighter" style="max-width: 80%"> <h5 class="break-all lighter">
{{ $t('views.applicationWorkflow.nodes.variableSplittingNode.splitVariables', '拆分变量') }} {{ $t('views.applicationWorkflow.nodes.variableSplittingNode.splitVariables') }}
<span class="color-danger">*</span>
</h5> </h5>
<div> <span class="ml-4" style="margin-top: -4px">
<span class="ml-4">
<el-button link type="primary" @click="openAddDialog()"> <el-button link type="primary" @click="openAddDialog()">
<AppIcon iconName="app-add-outlined" class="mr-4"></AppIcon> <AppIcon iconName="app-add-outlined"></AppIcon>
{{ $t('common.add') }}
</el-button> </el-button>
</span> </span>
</div> </div>
</div>
<el-table <el-table
v-if="props.nodeModel.properties.node_data.variable_list?.length > 0" v-if="props.nodeModel.properties.node_data.variable_list?.length > 0"
:data="props.nodeModel.properties.node_data.variable_list" :data="props.nodeModel.properties.node_data.variable_list"
class="mb-16"
ref="tableRef" ref="tableRef"
row-key="field" row-key="field"
class="border-l border-r"
> >
<el-table-column <el-table-column
prop="field" prop="field"
:label="$t('dynamicsForm.paramForm.variable.label', '变量')" :label="$t('common.variable')"
width="95" width="95"
> >
<template #default="{ row }"> <template #default="{ row }">
@ -31,11 +29,9 @@
<el-table-column prop="label" :label="$t('dynamicsForm.paramForm.name.label')"> <el-table-column prop="label" :label="$t('dynamicsForm.paramForm.name.label')">
<template #default="{ row }"> <template #default="{ row }">
<span>
<span :title="row.label" class="ellipsis-1"> <span :title="row.label" class="ellipsis-1">
{{ row.label }} {{ row.label }}
</span></span </span>
>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('common.operation')" align="left" width="90"> <el-table-column :label="$t('common.operation')" align="left" width="90">
@ -82,7 +78,7 @@ function deleteField(index: any) {
inputFieldList.value.splice(index, 1) inputFieldList.value.splice(index, 1)
const fields = [ const fields = [
{ {
label: t('views.applicationWorkflow.nodes.variableSplittingNode.result', '结果'), label: t('common.result'),
value: 'result', value: 'result',
}, },
...inputFieldList.value.map((item) => ({ label: item.label, value: item.field })), ...inputFieldList.value.map((item) => ({ label: item.label, value: item.field })),
@ -105,7 +101,7 @@ function refreshFieldList(data: any, index: any) {
VariableFieldDialogRef.value.close() VariableFieldDialogRef.value.close()
const fields = [ const fields = [
{ {
label: t('views.applicationWorkflow.nodes.variableSplittingNode.result', '结果'), label: t('common.result'),
value: 'result', value: 'result',
}, },
...inputFieldList.value.map((item) => ({ label: item.label, value: item.field })), ...inputFieldList.value.map((item) => ({ label: item.label, value: item.field })),
@ -120,7 +116,7 @@ onMounted(() => {
set(props.nodeModel.properties.node_data, 'variable_list', inputFieldList) set(props.nodeModel.properties.node_data, 'variable_list', inputFieldList)
const fields = [ const fields = [
{ {
label: t('views.applicationWorkflow.nodes.variableSplittingNode.result', '结果'), label: t('common.result'),
value: 'result', value: 'result',
}, },
...inputFieldList.value.map((item) => ({ label: item.label, value: item.field })), ...inputFieldList.value.map((item) => ({ label: item.label, value: item.field })),

View File

@ -1,5 +1,7 @@
<template> <template>
<NodeContainer :nodeModel="nodeModel"> <NodeContainer :nodeModel="nodeModel">
<h5 class="title-decoration-1 mb-8">{{ $t('views.applicationWorkflow.nodeSetting') }}</h5>
<el-card shadow="never" class="card-never" style="--el-card-padding: 12px">
<el-form <el-form
@submit.prevent @submit.prevent
:model="form_data" :model="form_data"
@ -10,12 +12,17 @@
hide-required-asterisk hide-required-asterisk
> >
<el-form-item <el-form-item
:label="$t('views.applicationWorkflow.nodes.variableSplittingNode.label', '输入变量')" prop="input_variable"
:rules="{
message: $t('views.applicationWorkflow.variable.placeholder'),
trigger: 'blur',
required: true,
}"
> >
<template #label> <template #label>
<div class="flex-between"> <div class="flex-between">
<div> <div>
{{ $t('views.applicationWorkflow.nodes.variableSplittingNode.label', '输入变量') }} {{ $t('views.applicationWorkflow.nodes.variableSplittingNode.inputVariables') }}
<span class="color-danger">*</span> <span class="color-danger">*</span>
</div> </div>
</div> </div>
@ -28,8 +35,22 @@
v-model="form_data.input_variable" v-model="form_data.input_variable"
/> />
</el-form-item> </el-form-item>
<VariableFieldTable ref="VariableFieldTableRef" :node-model="nodeModel"></VariableFieldTable>
<el-form-item
prop="variable_list"
:rules="{
message: $t('views.applicationWorkflow.variable.placeholder'),
trigger: 'blur',
required: true,
}"
>
<VariableFieldTable
ref="VariableFieldTableRef"
:node-model="nodeModel"
></VariableFieldTable>
</el-form-item>
</el-form> </el-form>
</el-card>
</NodeContainer> </NodeContainer>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">