diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index baf1ea4594..9c44a90994 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -996,8 +996,13 @@ ENABLE_RAG_HYBRID_SEARCH_ENRICHED_TEXTS = ( RAG_FULL_CONTEXT = os.getenv('RAG_FULL_CONTEXT', 'False').lower() == 'true' RAG_FILE_MAX_COUNT = int(os.getenv('RAG_FILE_MAX_COUNT')) if os.getenv('RAG_FILE_MAX_COUNT') else None +KNOWLEDGE_MAX_UPLOAD_COUNT = ( + int(os.getenv('KNOWLEDGE_MAX_UPLOAD_COUNT')) if os.getenv('KNOWLEDGE_MAX_UPLOAD_COUNT') else None +) KNOWLEDGE_MAX_FILE_COUNT = int(os.getenv('KNOWLEDGE_MAX_FILE_COUNT')) if os.getenv('KNOWLEDGE_MAX_FILE_COUNT') else None KNOWLEDGE_MAX_FILE_SIZE = int(os.getenv('KNOWLEDGE_MAX_FILE_SIZE')) if os.getenv('KNOWLEDGE_MAX_FILE_SIZE') else None +if KNOWLEDGE_MAX_UPLOAD_COUNT is not None and KNOWLEDGE_MAX_UPLOAD_COUNT <= 0: + raise ValueError('KNOWLEDGE_MAX_UPLOAD_COUNT must be a positive integer or unset') if KNOWLEDGE_MAX_FILE_COUNT is not None and KNOWLEDGE_MAX_FILE_COUNT <= 0: raise ValueError('KNOWLEDGE_MAX_FILE_COUNT must be a positive integer or unset') if KNOWLEDGE_MAX_FILE_SIZE is not None and KNOWLEDGE_MAX_FILE_SIZE <= 0: @@ -3019,6 +3024,7 @@ DEFAULT_CONFIG = { 'rag.enable_hybrid_search_enriched_texts': ENABLE_RAG_HYBRID_SEARCH_ENRICHED_TEXTS, 'rag.full_context': RAG_FULL_CONTEXT, 'rag.file.max_count': RAG_FILE_MAX_COUNT, + 'knowledge.max_upload_count': KNOWLEDGE_MAX_UPLOAD_COUNT, 'knowledge.max_file_count': KNOWLEDGE_MAX_FILE_COUNT, 'knowledge.max_file_size': KNOWLEDGE_MAX_FILE_SIZE, 'rag.file.max_size': RAG_FILE_MAX_SIZE, diff --git a/backend/open_webui/routers/knowledge.py b/backend/open_webui/routers/knowledge.py index 7b6e88feec..08487bea6e 100644 --- a/backend/open_webui/routers/knowledge.py +++ b/backend/open_webui/routers/knowledge.py @@ -1418,7 +1418,7 @@ async def check_knowledge_upload_limits( db=None, ) -> None: if batch: - batch_limit = await Config.get('rag.file.max_count') + batch_limit = await Config.get('knowledge.max_upload_count') if batch_limit is not None and count > int(batch_limit): raise HTTPException(400, f'You can only upload a maximum of {batch_limit} file(s) per batch.') @@ -2156,7 +2156,7 @@ async def add_files_to_knowledge_batch( detail=ERROR_MESSAGES.ACCESS_PROHIBITED, ) - batch_limit = await Config.get('rag.file.max_count') + batch_limit = await Config.get('knowledge.max_upload_count') if batch_limit is not None and len(form_data) > int(batch_limit): raise HTTPException(400, f'You can only upload a maximum of {batch_limit} file(s) per batch.') diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index 69005a3b22..fe1db69ace 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -305,6 +305,7 @@ RETRIEVAL_CONFIG_KEYS = { 'FILE_IMAGE_COMPRESSION_HEIGHT': 'file.image_compression_height', 'FILE_IMAGE_COMPRESSION_WIDTH': 'file.image_compression_width', 'FILE_MAX_COUNT': 'rag.file.max_count', + 'KNOWLEDGE_MAX_UPLOAD_COUNT': 'knowledge.max_upload_count', 'KNOWLEDGE_MAX_FILE_COUNT': 'knowledge.max_file_count', 'KNOWLEDGE_MAX_FILE_SIZE': 'knowledge.max_file_size', 'FILE_MAX_SIZE': 'rag.file.max_size', @@ -686,6 +687,7 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)): # File upload settings 'FILE_MAX_SIZE': config['rag.file.max_size'], 'FILE_MAX_COUNT': config['rag.file.max_count'], + 'KNOWLEDGE_MAX_UPLOAD_COUNT': config['knowledge.max_upload_count'], 'KNOWLEDGE_MAX_FILE_COUNT': config['knowledge.max_file_count'], 'KNOWLEDGE_MAX_FILE_SIZE': config['knowledge.max_file_size'], 'FILE_IMAGE_COMPRESSION_WIDTH': config['file.image_compression_width'], @@ -939,6 +941,7 @@ class ConfigForm(BaseModel): # File upload settings FILE_MAX_SIZE: Union[int, str | None] = None FILE_MAX_COUNT: Union[int, str | None] = None + KNOWLEDGE_MAX_UPLOAD_COUNT: Union[int, str | None] = None KNOWLEDGE_MAX_FILE_COUNT: Union[int, str | None] = None KNOWLEDGE_MAX_FILE_SIZE: Union[int, str | None] = None FILE_IMAGE_COMPRESSION_WIDTH: Union[int, str | None] = None @@ -1007,6 +1010,7 @@ async def update_rag_config(request: Request, form_data: ConfigForm, user=Depend for field in ( 'FILE_MAX_SIZE', 'FILE_MAX_COUNT', + 'KNOWLEDGE_MAX_UPLOAD_COUNT', 'KNOWLEDGE_MAX_FILE_COUNT', 'KNOWLEDGE_MAX_FILE_SIZE', 'FILE_IMAGE_COMPRESSION_WIDTH', @@ -1016,6 +1020,7 @@ async def update_rag_config(request: Request, form_data: ConfigForm, user=Depend updates[RETRIEVAL_CONFIG_KEYS[field]] = None for field, label in ( + ('KNOWLEDGE_MAX_UPLOAD_COUNT', 'Knowledge batch upload limit'), ('KNOWLEDGE_MAX_FILE_COUNT', 'Knowledge file count limit'), ('KNOWLEDGE_MAX_FILE_SIZE', 'Knowledge file size limit'), ): @@ -1145,6 +1150,7 @@ async def update_rag_config(request: Request, form_data: ConfigForm, user=Depend # File upload settings 'FILE_MAX_SIZE': config['rag.file.max_size'], 'FILE_MAX_COUNT': config['rag.file.max_count'], + 'KNOWLEDGE_MAX_UPLOAD_COUNT': config['knowledge.max_upload_count'], 'KNOWLEDGE_MAX_FILE_COUNT': config['knowledge.max_file_count'], 'KNOWLEDGE_MAX_FILE_SIZE': config['knowledge.max_file_size'], 'FILE_IMAGE_COMPRESSION_WIDTH': config['file.image_compression_width'], diff --git a/src/lib/components/admin/Settings/Documents.svelte b/src/lib/components/admin/Settings/Documents.svelte index 9d5678e1a3..3f8405ab4a 100644 --- a/src/lib/components/admin/Settings/Documents.svelte +++ b/src/lib/components/admin/Settings/Documents.svelte @@ -282,6 +282,7 @@ // can distinguish "clear this field" from "don't change this field" FILE_MAX_SIZE: RAGConfig.FILE_MAX_SIZE ?? '', FILE_MAX_COUNT: RAGConfig.FILE_MAX_COUNT ?? '', + KNOWLEDGE_MAX_UPLOAD_COUNT: RAGConfig.KNOWLEDGE_MAX_UPLOAD_COUNT ?? '', KNOWLEDGE_MAX_FILE_COUNT: RAGConfig.KNOWLEDGE_MAX_FILE_COUNT ?? '', KNOWLEDGE_MAX_FILE_SIZE: RAGConfig.KNOWLEDGE_MAX_FILE_SIZE ?? '', FILE_IMAGE_COMPRESSION_WIDTH: RAGConfig.FILE_IMAGE_COMPRESSION_WIDTH ?? '', @@ -1593,6 +1594,21 @@ + + + +
{ if (!knowledge) return false; if (count === 0) return true; - const maxCount = $config?.file?.max_count; - if (maxCount != null && count > maxCount) { - toast.error( - $i18n.t('You can only upload a maximum of {{maxCount}} file(s) per batch.', { maxCount }) - ); - return false; - } try { await validateKnowledgeUpload( localStorage.token, diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index 1147a9d29e..879509c1e3 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -2877,8 +2877,10 @@ "settings.admin.documents.imageCompressionWidth.label": "Image Compression Width", "settings.admin.documents.markdownHeaderTextSplitter.description": "Split documents by markdown headers before character or token splitting.", "settings.admin.documents.markdownHeaderTextSplitter.label": "Markdown Header Text Splitter", - "settings.admin.documents.maxUploadCount.description": "Maximum number of files that can be used at once in chat or uploaded in one knowledge base batch.", + "settings.admin.documents.maxUploadCount.description": "Maximum number of files that can be used at once in chat.", "settings.admin.documents.maxUploadCount.label": "Max Upload Count", + "settings.admin.documents.knowledgeMaxUploadCount.label": "Knowledge Batch Upload Limit", + "settings.admin.documents.knowledgeMaxUploadCount.description": "Maximum files per upload batch. Leave empty for no limit.", "settings.admin.documents.knowledgeMaxSize.label": "Knowledge File Size Limit", "settings.admin.documents.knowledgeMaxSize.description": "Maximum file size in MB per knowledge base. Leave empty for no limit.", "settings.admin.documents.knowledgeMaxCount.label": "Knowledge File Count Limit",