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 @@
+