+ {csvTruncated && (
+
+ 文件较大,仅预览前 {MAX_PREVIEW_ROWS} 行数据
+
+ )}
{excelData.map((sheet, index) => (
{sheet.sheetName}
@@ -541,6 +603,7 @@ const DocumentPreview: FC = ({
scroll={{ x: 'max-content' }}
size="small"
bordered
+ virtual
/>
)}
diff --git a/web/src/i18n/en.ts b/web/src/i18n/en.ts
index 6edd4991..45e67f56 100644
--- a/web/src/i18n/en.ts
+++ b/web/src/i18n/en.ts
@@ -460,6 +460,7 @@ export const en = {
nameInvalid: 'Name cannot start or end with a space',
notAllSpaces: 'Cannot be all spaces',
view: 'View',
+ callbackUrlInvalid: 'Please enter a valid URL',
},
model: {
searchPlaceholder: 'search model…',
diff --git a/web/src/i18n/zh.ts b/web/src/i18n/zh.ts
index 1929cd05..0d133ea4 100644
--- a/web/src/i18n/zh.ts
+++ b/web/src/i18n/zh.ts
@@ -1093,6 +1093,7 @@ export const zh = {
nameInvalid: '不能是空格开头或结尾',
notAllSpaces: '不能是纯空格',
view: '查看',
+ callbackUrlInvalid: '请输入有效的 URL',
},
model: {
searchPlaceholder: '搜索模型…',
diff --git a/web/src/views/ApplicationConfig/TestChat/index.tsx b/web/src/views/ApplicationConfig/TestChat/index.tsx
index ad7931e2..c324622d 100644
--- a/web/src/views/ApplicationConfig/TestChat/index.tsx
+++ b/web/src/views/ApplicationConfig/TestChat/index.tsx
@@ -183,7 +183,7 @@ const TestChat: FC
= ({
const handleSend = () => {
if (loading || !application || !message || !message?.trim()) return
- const files = toolbarRef.current?.getFiles() || []
+ const files = (toolbarRef.current?.getFiles() || []).filter(item => !['uploading', 'error'].includes(item.status))
const variables = toolbarRef.current?.getVariables() || []
const { isCanSend, params } = buildVariableParams(variables)
if (!isCanSend) return
@@ -235,7 +235,7 @@ const TestChat: FC = ({
const handleWorkflowSend = () => {
if (loading || !application || !message || !message?.trim()) return
- const files = toolbarRef.current?.getFiles() || []
+ const files = (toolbarRef.current?.getFiles() || []).filter(item => !['uploading', 'error'].includes(item.status))
const variables = toolbarRef.current?.getVariables() || []
const { isCanSend, params } = buildVariableParams(variables)
if (!isCanSend) return
diff --git a/web/src/views/ApplicationConfig/components/Chat.tsx b/web/src/views/ApplicationConfig/components/Chat.tsx
index ee5bc53a..052ad872 100644
--- a/web/src/views/ApplicationConfig/components/Chat.tsx
+++ b/web/src/views/ApplicationConfig/components/Chat.tsx
@@ -191,7 +191,7 @@ const Chat: FC = ({
.then(() => {
const message = msg
if (!message?.trim()) return
- const files = toolbarRef.current?.getFiles() || []
+ const files = (toolbarRef.current?.getFiles() || []).filter(item => !['uploading', 'error'].includes(item.status))
// Validate required variables before sending
let isCanSend = true
const params: Record = {}
@@ -352,7 +352,7 @@ const Chat: FC = ({
.then(() => {
const message = msg
if (!message || message.trim() === '') return
- const files = toolbarRef.current?.getFiles() || []
+ const files = (toolbarRef.current?.getFiles() || []).filter(item => !['uploading', 'error'].includes(item.status))
addUserMessage(message, files)
setMessage(undefined)
toolbarRef.current?.setFiles([])
diff --git a/web/src/views/ApplicationConfig/components/FeaturesConfig/FeaturesConfigModal.tsx b/web/src/views/ApplicationConfig/components/FeaturesConfig/FeaturesConfigModal.tsx
index 5fcb752d..d712720f 100644
--- a/web/src/views/ApplicationConfig/components/FeaturesConfig/FeaturesConfigModal.tsx
+++ b/web/src/views/ApplicationConfig/components/FeaturesConfig/FeaturesConfigModal.tsx
@@ -24,7 +24,7 @@ interface FeaturesConfigModalProps {
refresh: (value: FeaturesConfigForm) => void;
source?: Application['type'];
}
-
+const max_file_count = 1;
/**
* Modal for copying applications
*/
@@ -133,7 +133,7 @@ const FeaturesConfigModal = forwardRef
{t('application.maxCount')}
- {fu.max_file_count} {t('application.unix')}
+ {max_file_count} {t('application.unix')}
diff --git a/web/src/views/ApplicationConfig/components/FeaturesConfig/FileUploadSettingModal.tsx b/web/src/views/ApplicationConfig/components/FeaturesConfig/FileUploadSettingModal.tsx
index 3fb05a0e..f33b313b 100644
--- a/web/src/views/ApplicationConfig/components/FeaturesConfig/FileUploadSettingModal.tsx
+++ b/web/src/views/ApplicationConfig/components/FeaturesConfig/FileUploadSettingModal.tsx
@@ -2,7 +2,7 @@
* @Author: ZhaoYing
* @Date: 2026-03-05
* @Last Modified by: ZhaoYing
- * @Last Modified time: 2026-03-19 15:18:20
+ * @Last Modified time: 2026-03-19 20:19:14
*/
import { forwardRef, useImperativeHandle, useState } from 'react';
import { Form, InputNumber, Flex, Switch, Row, Col, Radio } from 'antd';
@@ -82,28 +82,27 @@ const defaultValues: FileUpload = {
"mp3",
"wav",
"m4a",
- "ogg",
- "flac"
],
document_enabled: false,
document_max_size_mb: 100,
document_allowed_extensions: [
"pdf",
"docx",
+ "doc",
"xlsx",
+ "xls",
"txt",
"csv",
- "json"
+ "json",
+ "md",
],
video_enabled: false,
video_max_size_mb: 100,
video_allowed_extensions: [
"mp4",
"mov",
- "avi",
- "webm"
],
- max_file_count: 5,
+ max_file_count: 1,
allowed_transfer_methods: 'both'
}
@@ -168,8 +167,8 @@ const FileUploadSettingModal = forwardRef
- {t('application.maxCount')}
-
+ {/* {t('application.maxCount')}
*/}
+
diff --git a/web/src/views/Conversation/components/FileUpload.tsx b/web/src/views/Conversation/components/FileUpload.tsx
index 48370fcc..23b62b14 100644
--- a/web/src/views/Conversation/components/FileUpload.tsx
+++ b/web/src/views/Conversation/components/FileUpload.tsx
@@ -2,7 +2,7 @@
* @Author: ZhaoYing
* @Date: 2026-02-06 21:09:42
* @Last Modified by: ZhaoYing
- * @Last Modified time: 2026-03-18 20:32:54
+ * @Last Modified time: 2026-03-19 18:38:41
*/
/**
* File Upload Component
@@ -23,7 +23,7 @@
import { useState, useEffect, forwardRef, useImperativeHandle, useMemo } from 'react';
import { Upload, Progress, App } from 'antd';
import type { UploadProps, UploadFile } from 'antd';
-import type { UploadProps as RcUploadProps } from 'antd/es/upload/interface';
+import type { UploadProps as RcUploadProps, RcFile, UploadFileStatus } from 'antd/es/upload/interface';
import { useTranslation } from 'react-i18next';
import { request } from '@/utils/request'
@@ -221,17 +221,29 @@ const UploadFiles = forwardRef(({
*/
const handleCustomRequest: RcUploadProps['customRequest'] = async (options) => {
const { file, onSuccess, onError } = options;
-
- try {
- const formData = new FormData();
- formData.append('file', file);
-
- const response = await request.uploadFile(action, formData, requestConfig);
-
- onSuccess?.({data: response});
- } catch (error) {
- onError?.(error as Error);
+ if (typeof file === 'string') return;
+ const rcFile = file as RcFile;
+ const formData = new FormData();
+ formData.append('file', rcFile);
+ const fileVo: UploadFile = {
+ uid: rcFile.uid,
+ name: rcFile.name,
+ status: 'uploading' as UploadFileStatus,
+ percent: 0,
+ type: rcFile.type,
+ originFileObj: rcFile,
+ thumbUrl: URL.createObjectURL(rcFile)
}
+ onChange?.(fileVo)
+ request.uploadFile(action, formData, requestConfig)
+ .then(res => {
+ onSuccess?.({ data: res });
+ })
+ .catch((error) => {
+ onError?.(error as Error);
+ fileVo.status = 'error'
+ onChange?.(fileVo)
+ })
};
/**
diff --git a/web/src/views/Conversation/components/UploadFileListModal.tsx b/web/src/views/Conversation/components/UploadFileListModal.tsx
index ce71066d..4d2e83ee 100644
--- a/web/src/views/Conversation/components/UploadFileListModal.tsx
+++ b/web/src/views/Conversation/components/UploadFileListModal.tsx
@@ -2,7 +2,7 @@
* @Author: ZhaoYing
* @Date: 2026-02-06 21:09:47
* @Last Modified by: ZhaoYing
- * @Last Modified time: 2026-03-18 21:10:01
+ * @Last Modified time: 2026-03-19 20:32:32
*/
/**
* Upload File List Modal Component
@@ -19,7 +19,10 @@
* @component
*/
import { forwardRef, useImperativeHandle, useState, useMemo } from 'react';
-import { Form, Input, Select, Button, Flex } from 'antd';
+import { Form, Input, Select,
+ // Button,
+ Flex
+} from 'antd';
import { useTranslation } from 'react-i18next';
import type { UploadFileListModalRef } from '../types'
@@ -105,9 +108,11 @@ const UploadFileListModal = forwardRef
-
- {(fields, { add, remove }) => (
+ {(fields,
+ // { add, remove }
+ ) => (
<>
{/* Render each file entry with type selector and URL input */}
{fields.map(({ key, name, ...restField }) => (
@@ -116,6 +121,9 @@ const UploadFileListModal = forwardRef
*/}