+
-
-
+
+
-
+
@@ -149,7 +174,7 @@ onMounted(() => {
-
+
diff --git a/ui/src/components/mk-dynamics-form/constructor/items/SliderConstructor.vue b/ui/src/components/mk-dynamics-form/constructor/items/SliderConstructor.vue
index e76d6703097..8e34c222c01 100644
--- a/ui/src/components/mk-dynamics-form/constructor/items/SliderConstructor.vue
+++ b/ui/src/components/mk-dynamics-form/constructor/items/SliderConstructor.vue
@@ -77,33 +77,27 @@ onBeforeMount(() => {
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
+
+ 取值范围
+
+
+
+
+ -
+
+
-
+
+
+
+
+
{
prop="default_value"
:rules="formValue.required ? [{ required: true, message: '为必填属性' }] : []"
>
- {
-
-
-
-
-
- -
-
-
-
-
-
+ 文本长度
+
+
+
+
+ -
+
+
+
+
{
-
-
-
-
-
- -
-
-
-
-
-
+ 文本长度
+
+
+
+
+ -
+
+
+
+
-import type { DynamicFormValue } from '../../type'
import { computed } from 'vue'
-import { groupBy, flatMap } from 'lodash'
-import { relatedObject } from '@/utils/common'
+import { cloneDeep } from 'lodash'
+import { MODEL_STATUS } from '@/api/enums'
+import type { Dict, ModelConfig, ModelItem } from '@/api/types'
import type { FormField } from '../../type'
import { providerList } from './provider-data'
+import ModelSelect from '@/components/business/model-select/index.vue'
-defineOptions({ name: 'DynamicFormModel' })
+defineOptions({ name: 'DynamicFormModel', inheritAttrs: false })
-const props = withDefaults(defineProps<{ modelValue?: { model_id: string; model_params_setting: Record } | null; formField: FormField }>(), {
- modelValue: null,
-})
-
-const emit = defineEmits(['update:modelValue', 'change'])
-
-const modelValueProxy = computed({
- get: () => props.modelValue,
- set: (value) => {
- emit('update:modelValue', value)
- emit('change', props.formField)
- },
-})
-
-const groupedOptions = computed(() => {
- const list = (props.formField.attrs?.provider_list as DynamicFormValue[]) || []
- return groupBy(list, 'provider')
-})
+interface ConfiguredModelOption {
+ model_id: string
+ model_name: string
+ provider: string
+ model_params_setting?: Dict
+ status?: ModelItem['status']
+ source?: ModelItem['source']
+}
-const getModelProvider = computed(() => {
- return (id: string) => {
- const item = flatMap(groupedOptions.value)?.find((item: DynamicFormValue) => item.model_id === id)
- return (item as DynamicFormValue)?.provider || ''
- }
+const props = withDefaults(defineProps<{ modelValue?: ModelConfig | null; formField: FormField }>(), {
+ modelValue: null,
})
-const handleModelChange = (selectedId: string) => {
- const list = (props.formField.attrs?.provider_list as DynamicFormValue[]) || []
- const selectedItem = list.find((p) => p.model_id === selectedId)
- modelValueProxy.value = { model_id: selectedId, model_params_setting: selectedItem?.model_params_setting || {} }
+const emit = defineEmits<{
+ 'update:modelValue': [value: ModelConfig]
+ change: [field: FormField]
+}>()
+
+// 将动态表单保存的模型快照转换为 ModelSelect 的扁平选项。
+const configuredModels = computed(() => props.formField.attrs?.provider_list ?? [])
+const modelOptions = computed(() =>
+ configuredModels.value.map((model) => ({
+ id: model.model_id,
+ name: model.model_name,
+ model_name: model.model_name,
+ model_type: props.formField.model_type ?? '',
+ provider: model.provider,
+ status: model.status ?? MODEL_STATUS.SUCCESS,
+ source: model.source,
+ })),
+)
+
+function handleModelChange(modelId: string) {
+ const selectedModel = configuredModels.value.find((model) => model.model_id === modelId)
+ emit('update:modelValue', {
+ model_id: modelId,
+ model_params_setting: cloneDeep(selectedModel?.model_params_setting ?? {}),
+ })
+ emit('change', props.formField)
}
-
-
-
-
-
-
- {{ item.model_name }}
-
-
-
-
-
-
-
- {{ label }}
-
-
-
-
-
+
+
-
diff --git a/ui/src/components/mk-dynamics-form/items/radio/RadioCard.vue b/ui/src/components/mk-dynamics-form/items/radio/RadioCard.vue
index 3953cefd606..c91899c6583 100644
--- a/ui/src/components/mk-dynamics-form/items/radio/RadioCard.vue
+++ b/ui/src/components/mk-dynamics-form/items/radio/RadioCard.vue
@@ -54,7 +54,7 @@ const options = computed(() => {
diff --git a/ui/src/components/mk-dynamics-form/items/slider/Slider.vue b/ui/src/components/mk-dynamics-form/items/slider/Slider.vue
index 1733b8596eb..8d72d311c1e 100644
--- a/ui/src/components/mk-dynamics-form/items/slider/Slider.vue
+++ b/ui/src/components/mk-dynamics-form/items/slider/Slider.vue
@@ -3,5 +3,5 @@ defineOptions({ name: 'DynamicFormSlider' })
-
+
diff --git a/ui/src/styles/element-plus.scss b/ui/src/styles/element-plus.scss
index 6d27771fccf..e1a0886d4fd 100644
--- a/ui/src/styles/element-plus.scss
+++ b/ui/src/styles/element-plus.scss
@@ -792,6 +792,22 @@
}
}
+/* slider */
+.el-slider {
+ --el-slider-button-wrapper-size: 16px;
+ --el-slider-button-size: 16px;
+ --el-slider-button-wrapper-offset: -9px;
+ --el-slider-runway-bg-color: rgb(var(--mk-N900-rgb) / 16%);
+ --el-slider-height: 4px;
+ &__button {
+ border: solid 1px var(--mk-N400);
+ box-shadow: var(--el-box-shadow-lighter);
+ &:hover {
+ border: 2px solid var(--el-color-primary);
+ }
+ }
+}
+
/* steps */
.el-steps {
align-items: center;
diff --git a/ui/src/workflow-canvas/nodes/base-node/component/FileUploadSettingDialog.vue b/ui/src/workflow-canvas/nodes/base-node/component/FileUploadSettingDialog.vue
index 6985d259c97..9231147d38d 100644
--- a/ui/src/workflow-canvas/nodes/base-node/component/FileUploadSettingDialog.vue
+++ b/ui/src/workflow-canvas/nodes/base-node/component/FileUploadSettingDialog.vue
@@ -74,11 +74,11 @@ defineExpose({ open })
-
+
-
+
diff --git a/ui/src/workflow-canvas/nodes/search-knowledge-node/component/search-setting/SearchSettingDialog.vue b/ui/src/workflow-canvas/nodes/search-knowledge-node/component/search-setting/SearchSettingDialog.vue
index bfdd635c4a1..c25acfae2be 100644
--- a/ui/src/workflow-canvas/nodes/search-knowledge-node/component/search-setting/SearchSettingDialog.vue
+++ b/ui/src/workflow-canvas/nodes/search-knowledge-node/component/search-setting/SearchSettingDialog.vue
@@ -94,7 +94,7 @@ defineExpose({ open })
-
+