diff --git a/deploy/nginx.conf.tmpl b/deploy/nginx.conf.tmpl index faf96520cb56bc62c0fd2137d791aad31af9d005..9e09ca5c4c2709c5b82c806b06bfb145771b9e6e 100644 --- a/deploy/nginx.conf.tmpl +++ b/deploy/nginx.conf.tmpl @@ -97,6 +97,31 @@ http { return 404; } + # 文件上传接口 - 智能超时设置 + location ~ ^/witchaind/api/(kb/import|doc)$ { + proxy_set_header X-Real-IP $remote_addr; + add_header X-Frame-Options DENY; + add_header Cache-Control "no-cache,no-store,must-revalidate"; + proxy_buffering off; + error_page 404 = @not_found; + + # 智能上传超时设置 + # 基于文件大小和网络条件的动态超时 + client_body_timeout 1800s; # 30分钟 - 适应大文件慢网络 + client_header_timeout 60s; # 请求头超时保持较短 + proxy_connect_timeout 60s; # 连接超时保持较短 + proxy_send_timeout 1800s; # 发送超时 - 匹配客户端 + proxy_read_timeout 1800s; # 读取超时 - 匹配客户端 + + # 增加缓冲区大小以处理大文件 + client_body_buffer_size 128k; + proxy_buffer_size 64k; + proxy_buffers 32 64k; + proxy_busy_buffers_size 128k; + + proxy_pass ${DATA_CHAIN_BACEND_URL}/; + } + location /witchaind/api/ { proxy_set_header X-Real-IP $remote_addr; add_header X-Frame-Options DENY; diff --git a/src/api/kbApp.ts b/src/api/kbApp.ts index 2ac26bdea6a0cff1bac842136fa1b0cbfc3c41c2..5b2b834ee31f6cf7814e267ea2b4a0fa1f0b7406 100644 --- a/src/api/kbApp.ts +++ b/src/api/kbApp.ts @@ -1,4 +1,5 @@ import request from '@/utils/request'; +import uploadRequest, { createUploadRequest } from '@/utils/uploadRequest'; import { CreateKbRequest, QueryKbRequest, UpdateKbRequest } from './apiType'; import { ModelForm } from '@/components/UserHeaderBar/modelConfig'; import qs from 'qs'; @@ -92,7 +93,11 @@ class KbAppAPI { /**导入资产库 */ static importKbLibrary(payload: { data: any; params: any }, options: any) { - return request({ + // 获取文件大小用于动态超时计算 + const fileSize = payload.data.kb_packages?.size || 0; + const dynamicUploadRequest = createUploadRequest(fileSize, 1); + + return dynamicUploadRequest({ url: `/kb/import`, method: 'post', data: payload.data, diff --git a/src/api/kfApp.ts b/src/api/kfApp.ts index ed85159d1f48b6e7568dc8de06bdda2586de6bb7..bcedec7b741151ef35715b87ecf09525f1d3bdce 100644 --- a/src/api/kfApp.ts +++ b/src/api/kfApp.ts @@ -1,4 +1,5 @@ import request from '@/utils/request'; +import uploadRequest, { createUploadRequest } from '@/utils/uploadRequest'; import { ChunkRequest, DocListRequest, DocRenameRequest } from './apiType'; class KfAppAPI { @@ -41,7 +42,12 @@ class KfAppAPI { /**导入资产库文档 */ static importKbLibraryFile(payload: { data: any; params: any }, options: any) { - return request({ + // 获取文件大小和数量用于动态超时计算 + const fileSize = payload.data.docs?.size || 0; + const fileCount = Array.isArray(payload.data.docs) ? payload.data.docs.length : 1; + const dynamicUploadRequest = createUploadRequest(fileSize, fileCount); + + return dynamicUploadRequest({ url: `/doc`, method: 'post', params: payload.params, diff --git a/src/components/KnowledgeForm/index.vue b/src/components/KnowledgeForm/index.vue index 202d3450188d38c8436dbab8b394525ba642b04e..f78229d152b2cd12558853e6eb2b083e0ed650c7 100644 --- a/src/components/KnowledgeForm/index.vue +++ b/src/components/KnowledgeForm/index.vue @@ -129,6 +129,28 @@ :max="100" /> (1~100) + + + + + {{ locale === 'zh' ? '(128~2048MB)' : '(128~2048MB)' }} + @@ -448,7 +470,7 @@ onMounted(async () => { const checkSectionCompletion = () => { const sectionFields = { basic: ['kbName'], - parse: ['defaultParseMethod', 'chunkMethod', 'defaultChunkSize', 'uploadCountLimit', 'embeddingModel'], + parse: ['defaultParseMethod', 'chunkMethod', 'defaultChunkSize', 'uploadCountLimit', 'uploadSizeLimit', 'embeddingModel'], retrieval: ['tokenizer'] }; @@ -564,7 +586,13 @@ const rules = reactive>({ trigger: ['blur', 'change'], }, ], - uploadSizeLimit: [{ required: true }], + uploadSizeLimit: [ + { + required: true, + message: t('assetLibrary.message.uploadSizeLimitPlace'), + trigger: ['blur', 'change'], + }, + ], }); const handleCopyTextToclipboard = (text: string) => { @@ -869,7 +897,7 @@ const handleAddDocType = () => { font-size: 12px; color: var(--o-text-color-secondary); min-width: 120px; - max-width: 120px; + max-width: 140px; white-space: nowrap; flex-shrink: 0; line-height: 32px; // 与input高度对齐 diff --git a/src/components/Upload/UploadTimeoutManager.vue b/src/components/Upload/UploadTimeoutManager.vue new file mode 100644 index 0000000000000000000000000000000000000000..c16ad3b5d62a23c3f9ee1b5cee26d0b10b0509b6 --- /dev/null +++ b/src/components/Upload/UploadTimeoutManager.vue @@ -0,0 +1,125 @@ + + + + + diff --git a/src/components/Upload/index.vue b/src/components/Upload/index.vue index cad16a2cf48beca3a5e4bdb8c19401c8db06f079..ac4f6cca85de8ae51be75d9e6607941f0bf12988 100644 --- a/src/components/Upload/index.vue +++ b/src/components/Upload/index.vue @@ -3,6 +3,12 @@ class="upload-to-list" :class="{ 'has-files': hasFiles }">
+ + +