Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions ui/src/components/COMPONENT_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,10 @@ Escape 关闭;这些默认行为可以通过同名 Props 覆盖。Element Plus
调用 `resetData()`,确保所有关闭路径都在关闭动画结束后完成清理。`resetData()` 应统一重置表单、
提交状态、临时选项和表单校验,不把清理逻辑散落在 `open()`、取消按钮或提交成功回调中。

只有登录表单支持回车提交。其他业务表单使用 `@submit.prevent` 阻止默认提交,不绑定提交函数,
也不通过 Enter 键触发保存或添加;提交操作由按钮点击触发。组件的 `emit('submit', data)` 是向
父组件传递数据的自定义事件,不代表支持回车提交。

### MkComplexSearch

用于在多个字段之间切换搜索条件。`fields` 中的基础字段使用 `@/api/types` 中的
Expand Down
4 changes: 4 additions & 0 deletions ui/src/styles/element-plus.scss
Original file line number Diff line number Diff line change
Expand Up @@ -983,6 +983,10 @@
padding: calc(var(--spacing) * 2) calc(var(--spacing) * 3);
}
}
// 需要仅增加table最外层border的样式
&.border {
border-right: 1px solid var(--el-table-border-color);
}

[class*='el-table__row--level'] .el-table__expand-icon {
align-items: center;
Expand Down
17 changes: 16 additions & 1 deletion ui/src/workflow-canvas/WORKFLOW_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ Vue Teleport 节点继承页面上下文;画布核心不负责模型参数接
智能体页面将详情加载或保存成功返回的配置通过 `defaultModelSettings` Props 传给画布。
`WorkflowNodeModel.getDefaultModelConfig(type)` 通过画布的配置读取函数获取对应模型,不使用
默认配置的 `provide/inject`,也不写入节点持久化数据。AI 对话、意图识别、问题优化、语音、
图片和视频相关节点在默认来源下读取保存后的对应模型 ID 和参数,使用禁用且隐藏参数按钮的
图片、视频及参数提取相关节点在默认来源下读取保存后的对应模型 ID 和参数,使用禁用且隐藏参数按钮的
`ModelSelect` 展示;自定义来源继续编辑节点自身配置,引用来源使用 `NodeCascader`。默认配置
只用于解析当前使用的模型,不覆盖节点保存的自定义配置;各节点在本地维护模型设置,并按当前
来源检查实际模型或引用变量。
Expand All @@ -113,6 +113,21 @@ Vue Teleport 节点继承页面上下文;画布核心不负责模型参数接
中间 computed。独立弹窗、资源选择等具有完整交互边界的能力放在节点目录的 `component/` 下;
节点入口负责统一写回节点属性和执行节点级校验。

变量拆分节点的 `VariableFieldTable` 通过 `v-model` 接收 `VariableField[]`,只负责列表增删改、
重名检查和编辑弹窗,不接收节点模型或读写 `node_data`。节点入口在列表写回时同步输出字段并
清理下游失效引用;字段类型由该组件目录的 `types.ts` 统一定义。
`VariableFieldDialog` 与 `GroupFieldDialog` 使用 `submit(data, index?)` 提交,表格通过重名检查并
写回列表后调用 `close()`;关闭动画结束时通过 `closed` 重置表单,添加与编辑共用同一提交流程。

参数提取节点的默认模型读取 `LLM` 配置,新节点默认选择“默认模型”,旧节点缺少来源字段时
保留“自定义”语义。默认模型仅用于展示与校验,不覆盖节点保存的自定义模型和参数。

参数提取节点遵循相同边界:`component/parameters-field` 内的 `ParametersFieldTable` 通过
`v-model` 编辑 `ParameterField[]`,弹窗只通过 `submit(data, index?)` 提交,节点入口同步输出
字段和下游引用。模型引用与输入变量的有效性校验接入节点表单规则,调用 `NodeCascader.validate()`
保留失效引用检查;节点级 `validate()` 统一调用表单校验。所有非登录表单仅使用 `@submit.prevent`,
保存或添加由按钮触发。

AI 对话节点的提示词、历史记录、视觉理解和输出思考表单直接在节点入口维护,统一使用全局
`MdEditorMagnify` 和节点表单样式;AI 提示词生成与思考过程配置仍使用独立弹窗。
问题优化、图片理解和视频理解节点的系统提示词与用户提示词,以及图片、文生视频和图生视频
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
<script setup lang="ts">
import { ref, useTemplateRef } from 'vue'
import { cloneDeep } from 'lodash'
import type { FormInstance, FormRules } from 'element-plus'
import type { ParameterField } from './types'

defineOptions({ name: 'ParameterExtractionFieldDialog' })

const emit = defineEmits<{ submit: [data: ParameterField, index?: number] }>()

const parameterTypeOptions = ['string', 'number', 'object', 'boolean', 'array'].map((type) => ({ value: type, label: type }))
const formRef = useTemplateRef<FormInstance>('formRef')
const editing = ref(false)
const currentIndex = ref<number | undefined>(undefined)
const formData = ref<ParameterField>({ field: '', label: '', parameter_type: '', desc: '' })

const rules: FormRules<ParameterField> = {
field: [
{ required: true, message: '请输入参数', trigger: 'blur' },
{ pattern: /^[a-zA-Z0-9_]+$/, message: '参数可由字母、数字、下划线组成', trigger: 'blur' },
],
label: [{ required: true, message: '请输入显示名称', trigger: 'blur' }],
parameter_type: [{ required: true, message: '请选择参数类型', trigger: 'change' }],
}

const visible = ref(false)

function open(data?: ParameterField, index?: number) {
resetData()
if (data) {
formData.value = cloneDeep(data)
editing.value = true
currentIndex.value = index
}
visible.value = true
}

function handleSubmit() {
formRef.value
?.validate()
.then(() => {
emit('submit', cloneDeep(formData.value), currentIndex.value)
})
.catch(() => {})
}

function close() {
visible.value = false
}

function resetData() {
editing.value = false
currentIndex.value = undefined
formData.value = { field: '', label: '', parameter_type: '', desc: '' }
formRef.value?.clearValidate()
}

defineExpose({ close, open })
</script>

<template>
<MkDialog v-model="visible" :title="editing ? '编辑参数' : '添加参数'" @closed="resetData" align-center>
<el-form ref="formRef" label-position="top" require-asterisk-position="right" :rules="rules" :model="formData" @submit.prevent>
<el-form-item label="参数" prop="field">
<el-input v-model="formData.field" :maxlength="64" placeholder="请输入参数" show-word-limit />
</el-form-item>
<el-form-item label="显示名称" prop="label">
<el-input v-model="formData.label" :maxlength="64" placeholder="请输入显示名称" show-word-limit />
</el-form-item>
<el-form-item label="参数类型" prop="parameter_type">
<el-select v-model="formData.parameter_type" placeholder="请选择参数类型" class="w-full">
<el-option v-for="item in parameterTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="描述" prop="desc">
<el-input v-model="formData.desc" type="textarea" :rows="3" placeholder="请输入描述" />
</el-form-item>
</el-form>
<template #footer>
<el-button plain @click="visible = false">取消</el-button>
<el-button type="primary" @click="handleSubmit">{{ editing ? '保存' : '添加' }}</el-button>
</template>
</MkDialog>
</template>
Loading
Loading