diff --git a/ui/src/components/ai-chat/component/answer-content/index.vue b/ui/src/components/ai-chat/component/answer-content/index.vue index 00fcfacf85a..0836c79934e 100644 --- a/ui/src/components/ai-chat/component/answer-content/index.vue +++ b/ui/src/components/ai-chat/component/answer-content/index.vue @@ -1,5 +1,6 @@ <template> <div class="item-content mb-16 lighter"> + <template v-for="(answer_text, index) in answer_text_list" :key="index"> <div class="avatar mr-8" v-if="application.show_avatar"> <img v-if="application.avatar" :src="application.avatar" height="28px" width="28px" /> diff --git a/ui/src/components/ai-chat/component/chat-input-operate/TouchChat.vue b/ui/src/components/ai-chat/component/chat-input-operate/TouchChat.vue index d2cc7eee16e..b2941d77e35 100644 --- a/ui/src/components/ai-chat/component/chat-input-operate/TouchChat.vue +++ b/ui/src/components/ai-chat/component/chat-input-operate/TouchChat.vue @@ -8,6 +8,7 @@ @touchstart="onTouchStart" @touchmove="onTouchMove" @touchend="onTouchEnd" + :disabled="props.disabled" > 按住说话 </el-button> @@ -47,6 +48,10 @@ const props = defineProps({ start: { type: Boolean, default: false + }, + disabled: { + type: Boolean, + default: false } }) const emit = defineEmits(['TouchStart', 'TouchEnd']) @@ -57,11 +62,19 @@ const dialogVisible = ref(false) const message = ref('按住说话') watch( - () => props.time, - (val) => { - if (val && val === 60) { + () => [props.time, props.start], + ([time, start]) => { + if (start) { + isTouching.value = true + dialogVisible.value = true + message.value = '松开发送,上滑取消' + if (time === 60) { + dialogVisible.value = false + emit('TouchEnd', isTouching.value) + isTouching.value = false + } + } else { dialogVisible.value = false - emit('TouchEnd', isTouching.value) isTouching.value = false } } diff --git a/ui/src/components/ai-chat/component/chat-input-operate/index.vue b/ui/src/components/ai-chat/component/chat-input-operate/index.vue index 71ae6905e74..b4a15a9dcd0 100644 --- a/ui/src/components/ai-chat/component/chat-input-operate/index.vue +++ b/ui/src/components/ai-chat/component/chat-input-operate/index.vue @@ -120,6 +120,7 @@ @TouchEnd="TouchEnd" :time="recorderTime" :start="!mediaRecorderStatus" + :disabled="loading" /> <el-input v-else @@ -149,7 +150,12 @@ </el-button> </span> <span class="flex align-center" v-else> - <el-button text @click="startRecording" v-if="mediaRecorderStatus"> + <el-button + :disabled="loading" + text + @click="startRecording" + v-if="mediaRecorderStatus" + > <el-icon> <Microphone /> </el-icon> @@ -166,7 +172,7 @@ </span> </template> - <template v-if="!startRecorderTime && !recorderLoading"> + <template v-if="(!startRecorderTime && !recorderLoading) || mode === 'mobile'"> <span v-if="props.applicationDetails.file_upload_enable" class="flex align-center ml-4"> <el-upload action="#" @@ -515,7 +521,12 @@ const stopRecording = () => { // 上传录音文件 const uploadRecording = async (audioBlob: Blob) => { try { + // 非自动发送切换输入框 + if (!props.applicationDetails.stt_autosend) { + isMicrophone.value = false + } recorderLoading.value = true + const formData = new FormData() formData.append('file', audioBlob, 'recording.mp3') applicationApi diff --git a/ui/src/components/dynamics-form/items/label/TooltipLabel.vue b/ui/src/components/dynamics-form/items/label/TooltipLabel.vue index 2ca9911f4f5..035b6bd6f3a 100644 --- a/ui/src/components/dynamics-form/items/label/TooltipLabel.vue +++ b/ui/src/components/dynamics-form/items/label/TooltipLabel.vue @@ -17,26 +17,4 @@ defineProps<{ tooltip: string }>() </script> -<style lang="scss" scoped> -.aiMode-param-dialog { - padding: 8px 8px 24px 8px; - - .el-dialog__header { - padding: 16px 16px 0 16px; - } - - .el-dialog__body { - padding: 16px !important; - } - - .dialog-max-height { - height: 550px; - } - - .custom-slider { - .el-input-number.is-without-controls .el-input__wrapper { - padding: 0 !important; - } - } -} -</style> +<style lang="scss" scoped></style> diff --git a/ui/src/locales/lang/zh-CN/views/dataset.ts b/ui/src/locales/lang/zh-CN/views/dataset.ts index e68b55fbe77..d9f9271bae5 100644 --- a/ui/src/locales/lang/zh-CN/views/dataset.ts +++ b/ui/src/locales/lang/zh-CN/views/dataset.ts @@ -34,7 +34,7 @@ export default { datasetName: { label: '知识库名称', placeholder: '请输入知识库名称', - requiredMessage: '请输入应用名称' + requiredMessage: '请输入知识库名称' }, datasetDescription: { label: '知识库描述', diff --git a/ui/src/locales/lang/zh-Hant/views/dataset.ts b/ui/src/locales/lang/zh-Hant/views/dataset.ts index e6e63eb7903..39a5ad7b075 100644 --- a/ui/src/locales/lang/zh-Hant/views/dataset.ts +++ b/ui/src/locales/lang/zh-Hant/views/dataset.ts @@ -33,7 +33,7 @@ export default { datasetName: { label: '知識庫名稱', placeholder: '請輸入知識庫名稱', - requiredMessage: '請輸入應用名稱' + requiredMessage: '請輸入知識庫名稱' }, datasetDescription: { label: '知識庫描述', diff --git a/ui/src/styles/app.scss b/ui/src/styles/app.scss index 0f077b84eab..8646670b07a 100644 --- a/ui/src/styles/app.scss +++ b/ui/src/styles/app.scss @@ -772,3 +772,22 @@ h5 { background: #d6e2ff; line-height: 25px; } + +// 参数设置dialog +.param-dialog { + padding: 8px 8px 24px 8px; + .el-dialog__header { + padding: 16px 16px 0 16px; + } + .el-dialog__body { + padding: 0 !important; + } + .dialog-max-height { + height: 550px; + } + .custom-slider { + .el-input-number.is-without-controls .el-input__wrapper { + padding: 0 !important; + } + } +} diff --git a/ui/src/views/application/component/AIModeParamSettingDialog.vue b/ui/src/views/application/component/AIModeParamSettingDialog.vue index a42399209c7..d561dcfead3 100644 --- a/ui/src/views/application/component/AIModeParamSettingDialog.vue +++ b/ui/src/views/application/component/AIModeParamSettingDialog.vue @@ -2,7 +2,7 @@ <el-dialog align-center :title="$t('common.paramSetting')" - class="aiMode-param-dialog" + class="param-dialog" v-model="dialogVisible" style="width: 550px" append-to-body @@ -89,26 +89,4 @@ const submit = async () => { defineExpose({ open, reset_default }) </script> -<style lang="scss" scoped> -.aiMode-param-dialog { - padding: 8px 8px 24px 8px; - - .el-dialog__header { - padding: 16px 16px 0 16px; - } - - .el-dialog__body { - padding: 16px !important; - } - - .dialog-max-height { - height: 550px; - } - - .custom-slider { - .el-input-number.is-without-controls .el-input__wrapper { - padding: 0 !important; - } - } -} -</style> +<style lang="scss" scoped></style> diff --git a/ui/src/views/application/component/AddDatasetDialog.vue b/ui/src/views/application/component/AddDatasetDialog.vue index 71cd9ff9ab8..10536c16f72 100644 --- a/ui/src/views/application/component/AddDatasetDialog.vue +++ b/ui/src/views/application/component/AddDatasetDialog.vue @@ -144,7 +144,7 @@ const refresh = () => { defineExpose({ open }) </script> -<style lang="scss" scoped> +<style lang="scss"> .addDataset-dialog { padding: 0; .el-dialog__header { diff --git a/ui/src/views/application/component/McpServersDialog.vue b/ui/src/views/application/component/McpServersDialog.vue index bdd6008e85d..c082a328c05 100644 --- a/ui/src/views/application/component/McpServersDialog.vue +++ b/ui/src/views/application/component/McpServersDialog.vue @@ -9,13 +9,21 @@ :close-on-click-modal="false" :close-on-press-escape="false" > - <el-form label-position="top" ref="paramFormRef" :model="form" - require-asterisk-position="right"> + <el-form + label-position="top" + ref="paramFormRef" + :model="form" + require-asterisk-position="right" + > <el-form-item label="MCP" prop="mcp_enable"> <el-switch v-model="form.mcp_enable" /> </el-form-item> - <el-form-item v-if="form.mcp_enable" label="MCP Server Config" prop="mcp_servers" - :rules="[{ required: true, message: $t('common.required') }]"> + <el-form-item + v-if="form.mcp_enable" + label="MCP Server Config" + prop="mcp_servers" + :rules="[{ required: true, message: $t('common.required') }]" + > <el-input v-model="form.mcp_servers" :rows="6" @@ -49,7 +57,6 @@ const mcpServerJson = `{ } }` - const form = ref<any>({ mcp_servers: '', mcp_enable: false @@ -82,26 +89,4 @@ const submit = () => { defineExpose({ open }) </script> -<style lang="scss" scoped> -.param-dialog { - padding: 8px 8px 24px 8px; - - .el-dialog__header { - padding: 16px 16px 0 16px; - } - - .el-dialog__body { - padding: 0 !important; - } - - .dialog-max-height { - height: 560px; - } - - .custom-slider { - .el-input-number.is-without-controls .el-input__wrapper { - padding: 0 !important; - } - } -} -</style> +<style lang="scss" scoped></style> diff --git a/ui/src/views/application/component/ParamSettingDialog.vue b/ui/src/views/application/component/ParamSettingDialog.vue index ca4d2213449..678e4db8a59 100644 --- a/ui/src/views/application/component/ParamSettingDialog.vue +++ b/ui/src/views/application/component/ParamSettingDialog.vue @@ -326,22 +326,6 @@ function changeHandle(val: string) { defineExpose({ open }) </script> -<style lang="scss" scoped> -.param-dialog { - padding: 8px 8px 24px 8px; - .el-dialog__header { - padding: 16px 16px 0 16px; - } - .el-dialog__body { - padding: 0 !important; - } - .dialog-max-height { - height: 560px; - } - .custom-slider { - .el-input-number.is-without-controls .el-input__wrapper { - padding: 0 !important; - } - } -} +<style lang="scss"> + </style> diff --git a/ui/src/views/application/component/ReasoningParamSettingDialog.vue b/ui/src/views/application/component/ReasoningParamSettingDialog.vue index 3d318cf267c..2ebc87b62de 100644 --- a/ui/src/views/application/component/ReasoningParamSettingDialog.vue +++ b/ui/src/views/application/component/ReasoningParamSettingDialog.vue @@ -84,26 +84,4 @@ const submit = () => { defineExpose({ open }) </script> -<style lang="scss" scoped> -.param-dialog { - padding: 8px 8px 24px 8px; - - .el-dialog__header { - padding: 16px 16px 0 16px; - } - - .el-dialog__body { - padding: 0 !important; - } - - .dialog-max-height { - height: 560px; - } - - .custom-slider { - .el-input-number.is-without-controls .el-input__wrapper { - padding: 0 !important; - } - } -} -</style> +<style lang="scss" scoped></style> diff --git a/ui/src/views/application/component/TTSModeParamSettingDialog.vue b/ui/src/views/application/component/TTSModeParamSettingDialog.vue index 7534345adae..dfd6d28871c 100644 --- a/ui/src/views/application/component/TTSModeParamSettingDialog.vue +++ b/ui/src/views/application/component/TTSModeParamSettingDialog.vue @@ -2,9 +2,9 @@ <el-dialog align-center :title="$t('common.paramSetting')" - class="aiMode-param-dialog" v-model="dialogVisible" style="width: 550px" + class="param-dialog" append-to-body :close-on-click-modal="false" :close-on-press-escape="false" @@ -25,7 +25,6 @@ <el-button @click="testPlay" :loading="playLoading"> <AppIcon iconName="app-video-play" class="mr-4"></AppIcon> {{ $t('views.application.applicationForm.form.voicePlay.listeningTest') }} - </el-button> </span> <span class="dialog-footer p-16"> @@ -77,15 +76,17 @@ const open = (model_id: string, application_id?: string, model_setting_data?: an api.then((ok) => { model_form_field.value = ok.data const resp = ok.data - .map((item: any) => ({ [item.field]: item.show_default_value !== false ? item.default_value : undefined })) + .map((item: any) => ({ + [item.field]: item.show_default_value !== false ? item.default_value : undefined + })) .reduce((x, y) => ({ ...x, ...y }), {}) // 删除不存在的字段 if (model_setting_data) { - Object.keys(model_setting_data).forEach(key => { + Object.keys(model_setting_data).forEach((key) => { if (!(key in resp)) { - delete model_setting_data[key]; + delete model_setting_data[key] } - }); + }) } model_setting_data = { ...resp, ...model_setting_data } // 渲染动态表单 @@ -99,7 +100,9 @@ const reset_default = (model_id: string, application_id?: string) => { api.then((ok) => { model_form_field.value = ok.data const model_setting_data = ok.data - .map((item) => ({ [item.field]: item.show_default_value !== false ? item.default_value : undefined })) + .map((item) => ({ + [item.field]: item.show_default_value !== false ? item.default_value : undefined + })) .reduce((x, y) => ({ ...x, ...y }), {}) emit('refresh', model_setting_data) @@ -149,26 +152,4 @@ const testPlay = () => { defineExpose({ open, reset_default }) </script> -<style lang="scss" scoped> -.aiMode-param-dialog { - padding: 8px 8px 24px 8px; - - .el-dialog__header { - padding: 16px 16px 0 16px; - } - - .el-dialog__body { - padding: 16px !important; - } - - .dialog-max-height { - height: 550px; - } - - .custom-slider { - .el-input-number.is-without-controls .el-input__wrapper { - padding: 0 !important; - } - } -} -</style> +<style lang="scss" scoped></style> diff --git a/ui/src/views/function-lib/component/AddInternalFunctionDialog.vue b/ui/src/views/function-lib/component/AddInternalFunctionDialog.vue index 4e4ab0e31ce..42c9b0eb5dd 100644 --- a/ui/src/views/function-lib/component/AddInternalFunctionDialog.vue +++ b/ui/src/views/function-lib/component/AddInternalFunctionDialog.vue @@ -16,7 +16,7 @@ require-asterisk-position="right" > <el-form-item prop="name"> - <el-input v-model="form.name"></el-input> + <el-input v-model="form.name" maxlength="64" show-word-limit></el-input> </el-form-item> </el-form> <template #footer> diff --git a/ui/src/workflow/nodes/reranker-node/ParamSettingDialog.vue b/ui/src/workflow/nodes/reranker-node/ParamSettingDialog.vue index 8756fe9c3a7..42cc546f661 100644 --- a/ui/src/workflow/nodes/reranker-node/ParamSettingDialog.vue +++ b/ui/src/workflow/nodes/reranker-node/ParamSettingDialog.vue @@ -43,9 +43,7 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item - :label="$t('views.application.applicationForm.dialog.topReferences')" - > + <el-form-item :label="$t('views.application.applicationForm.dialog.topReferences')"> <el-input-number v-model="form.top_n" :min="1" @@ -125,22 +123,4 @@ const submit = () => { defineExpose({ open }) </script> -<style lang="scss" scoped> -.param-dialog { - padding: 8px 8px 24px 8px; - .el-dialog__header { - padding: 16px 16px 0 16px; - } - .el-dialog__body { - padding: 0 !important; - } - .dialog-max-height { - height: 550px; - } - .custom-slider { - .el-input-number.is-without-controls .el-input__wrapper { - padding: 0 !important; - } - } -} -</style> +<style lang="scss"></style>