From b464b48f53e6eda17813d684909254819ac599e3 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:32:27 +0100 Subject: [PATCH 001/311] Merge pull request #20581 from Classic298/fix/db-pool-memory-update fix(db): release connection before embedding in memory /{memory_id}/update --- backend/open_webui/routers/memories.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/routers/memories.py b/backend/open_webui/routers/memories.py index e0ba36c76f..b05e0c7a7c 100644 --- a/backend/open_webui/routers/memories.py +++ b/backend/open_webui/routers/memories.py @@ -252,8 +252,11 @@ async def update_memory_by_id( request: Request, form_data: MemoryUpdateModel, user=Depends(get_verified_user), - db: Session = Depends(get_session), ): + # NOTE: We intentionally do NOT use Depends(get_session) here. + # Database operations (update_memory_by_id_and_user_id) manage their own + # short-lived sessions. This prevents holding a connection during + # EMBEDDING_FUNCTION() which makes external API calls (1-5+ seconds). if not request.app.state.config.ENABLE_MEMORIES: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, @@ -269,7 +272,7 @@ async def update_memory_by_id( ) memory = Memories.update_memory_by_id_and_user_id( - memory_id, user.id, form_data.content, db=db + memory_id, user.id, form_data.content ) if memory is None: raise HTTPException(status_code=404, detail="Memory not found") From 3fc866117da65c4a3e05e1a2add40b193933fd97 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:32:40 +0100 Subject: [PATCH 002/311] fix(db): CRITICAL - prevent pool exhaustion in memory /reset (#20580) Remove Depends(get_session) from POST /reset to prevent catastrophic connection pool exhaustion. This endpoint was holding a SINGLE database connection while executing N PARALLEL embedding API calls via asyncio.gather(). For a user with 100 memories, this meant one connection blocked for potentially MINUTES (100 calls * 1-5 seconds each, even in parallel due to rate limits). A single user triggering /reset could completely starve the connection pool, causing QueuePool timeout errors across the entire application. The Memories.get_memories_by_user_id() function now manages its own short-lived session, releasing the connection immediately before the massive parallel embedding operation begins. --- backend/open_webui/routers/memories.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/routers/memories.py b/backend/open_webui/routers/memories.py index b05e0c7a7c..3738d1681e 100644 --- a/backend/open_webui/routers/memories.py +++ b/backend/open_webui/routers/memories.py @@ -157,8 +157,15 @@ async def query_memory( async def reset_memory_from_vector_db( request: Request, user=Depends(get_verified_user), - db: Session = Depends(get_session), ): + """Reset user's memory vector embeddings. + + CRITICAL: We intentionally do NOT use Depends(get_session) here. + This endpoint generates embeddings for ALL user memories in parallel using + asyncio.gather(). A user with 100 memories would trigger 100 embedding API + calls simultaneously. With a session held, this could block a connection + for MINUTES, completely exhausting the connection pool. + """ if not request.app.state.config.ENABLE_MEMORIES: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, @@ -175,7 +182,7 @@ async def reset_memory_from_vector_db( VECTOR_DB_CLIENT.delete_collection(f"user-memory-{user.id}") - memories = Memories.get_memories_by_user_id(user.id, db=db) + memories = Memories.get_memories_by_user_id(user.id) # Generate vectors in parallel vectors = await asyncio.gather( From 182d5e8591560dcc5a58f49068f91ad46c605952 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:32:56 +0100 Subject: [PATCH 003/311] fix(db): release connection before embedding in process_files_batch (#20576) Remove Depends(get_session) from POST /process/files/batch endpoint to prevent database connections from being held during batch embedding API calls (5-60+ seconds for large batches). The save_docs_to_vector_db() function makes external embedding API calls. Post-embedding file updates (Files.update_file_by_id) manage their own short-lived sessions internally, releasing connections promptly. --- backend/open_webui/routers/retrieval.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index db3f80f149..763a9aacc3 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -2626,10 +2626,14 @@ async def process_files_batch( request: Request, form_data: BatchProcessFilesForm, user=Depends(get_verified_user), - db: Session = Depends(get_session), ) -> BatchProcessFilesResponse: """ Process a batch of files and save them to the vector database. + + NOTE: We intentionally do NOT use Depends(get_session) here. + The save_docs_to_vector_db() call makes external embedding API calls which + can take 5-60+ seconds for batch operations. Database operations after + embedding (Files.update_file_by_id) manage their own short-lived sessions. """ collection_name = form_data.collection_name @@ -2690,7 +2694,7 @@ async def process_files_batch( # Update all files with collection name for file_update, file_result in zip(file_updates, file_results): Files.update_file_by_id( - id=file_result.file_id, form_data=file_update, db=db + id=file_result.file_id, form_data=file_update ) file_result.status = "completed" From 826e9ab317d5376c6eeb93870481dad3bf99ae96 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:33:04 +0100 Subject: [PATCH 004/311] fix(db): release connection before embeddings in knowledge /metadata/reindex (#20577) Remove Depends(get_session) from POST /metadata/reindex endpoint to prevent database connections from being held during N embedding API calls. This endpoint is CRITICAL as it loops through ALL knowledge bases and calls embed_knowledge_base_metadata() for each one. With the original code, a single connection would be held for the entire duration (potentially minutes for large deployments), completely exhausting the pool. The Knowledges.get_knowledge_bases() function manages its own short-lived session, releasing the connection before the embedding loop begins. --- backend/open_webui/routers/knowledge.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/routers/knowledge.py b/backend/open_webui/routers/knowledge.py index 9fc30424ca..c38c5e0bdf 100644 --- a/backend/open_webui/routers/knowledge.py +++ b/backend/open_webui/routers/knowledge.py @@ -345,10 +345,15 @@ async def reindex_knowledge_files( async def reindex_knowledge_base_metadata_embeddings( request: Request, user=Depends(get_admin_user), - db: Session = Depends(get_session), ): - """Batch embed all existing knowledge bases. Admin only.""" - knowledge_bases = Knowledges.get_knowledge_bases(db=db) + """Batch embed all existing knowledge bases. Admin only. + + NOTE: We intentionally do NOT use Depends(get_session) here. + This endpoint loops through ALL knowledge bases and calls embed_knowledge_base_metadata() + for each one, making N external embedding API calls. Holding a session during + this entire operation would exhaust the connection pool. + """ + knowledge_bases = Knowledges.get_knowledge_bases() log.info(f"Reindexing embeddings for {len(knowledge_bases)} knowledge bases") success_count = 0 From 242625782f03a2ee9c529b4df69a9d55481e6854 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:33:17 +0100 Subject: [PATCH 005/311] fix(db): release connection before embedding in memory /add (#20578) Remove Depends(get_session) from POST /add endpoint to prevent database connections from being held during embedding API calls (1-5+ seconds). The Memories.insert_new_memory() function manages its own short-lived session internally, releasing the connection before the slow EMBEDDING_FUNCTION() call begins. --- backend/open_webui/routers/memories.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/routers/memories.py b/backend/open_webui/routers/memories.py index 3738d1681e..96b4716987 100644 --- a/backend/open_webui/routers/memories.py +++ b/backend/open_webui/routers/memories.py @@ -69,8 +69,11 @@ async def add_memory( request: Request, form_data: AddMemoryForm, user=Depends(get_verified_user), - db: Session = Depends(get_session), ): + # NOTE: We intentionally do NOT use Depends(get_session) here. + # Database operations (insert_new_memory) manage their own short-lived sessions. + # This prevents holding a connection during EMBEDDING_FUNCTION() + # which makes external embedding API calls (1-5+ seconds). if not request.app.state.config.ENABLE_MEMORIES: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, @@ -85,7 +88,7 @@ async def add_memory( detail=ERROR_MESSAGES.ACCESS_PROHIBITED, ) - memory = Memories.insert_new_memory(user.id, form_data.content, db=db) + memory = Memories.insert_new_memory(user.id, form_data.content) vector = await request.app.state.EMBEDDING_FUNCTION(memory.content, user=user) From d0c2bfdbff2b12e8190379cef8f442b1cf210470 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:34:11 +0100 Subject: [PATCH 006/311] fix(db): release connection before LLM call in OpenAI /chat/completions (#20572) Remove Depends(get_session) from the /chat/completions endpoint to prevent database connections from being held during the entire duration of LLM calls (30-60+ seconds for streaming responses). Previously, the database session was acquired at request start and held until the streaming response completed. Under concurrent load, this exhausted the connection pool, causing QueuePool timeout errors for other database operations. The fix allows Models.get_model_by_id() and has_access() to manage their own short-lived sessions internally, releasing the connection immediately after the quick authorization checks complete - before the slow external LLM API call begins. --- backend/open_webui/routers/openai.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/routers/openai.py b/backend/open_webui/routers/openai.py index ec4ce2f4a8..44575e57f2 100644 --- a/backend/open_webui/routers/openai.py +++ b/backend/open_webui/routers/openai.py @@ -801,8 +801,11 @@ async def generate_chat_completion( user=Depends(get_verified_user), bypass_filter: Optional[bool] = False, bypass_system_prompt: bool = False, - db: Session = Depends(get_session), ): + # NOTE: We intentionally do NOT use Depends(get_session) here. + # Database operations (get_model_by_id, has_access) manage their own short-lived sessions. + # This prevents holding a connection during the entire LLM call (30-60+ seconds), + # which would exhaust the connection pool under concurrent load. if BYPASS_MODEL_ACCESS_CONTROL: bypass_filter = True @@ -812,7 +815,7 @@ async def generate_chat_completion( metadata = payload.pop("metadata", None) model_id = form_data.get("model") - model_info = Models.get_model_by_id(model_id, db=db) + model_info = Models.get_model_by_id(model_id) # Check model info and override the payload if model_info: @@ -842,7 +845,6 @@ async def generate_chat_completion( user.id, type="read", access_control=model_info.access_control, - db=db, ) ): raise HTTPException( From 0b5aa6dd60c5502ad98a0bea903142763a1e3f91 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:34:23 +0100 Subject: [PATCH 007/311] fix(db): release connection before LLM call in Ollama /api/chat (#20571) Remove Depends(get_session) from the /api/chat endpoint to prevent database connections from being held during the entire duration of LLM calls (30-60+ seconds for streaming responses). Previously, the database session was acquired at request start and held until the streaming response completed. Under concurrent load, this exhausted the connection pool, causing QueuePool timeout errors for other database operations. The fix allows Models.get_model_by_id() and has_access() to manage their own short-lived sessions internally, releasing the connection immediately after the quick authorization checks complete - before the slow external LLM API call begins. --- backend/open_webui/routers/ollama.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/routers/ollama.py b/backend/open_webui/routers/ollama.py index 0af35de38f..b269aa329a 100644 --- a/backend/open_webui/routers/ollama.py +++ b/backend/open_webui/routers/ollama.py @@ -1257,8 +1257,11 @@ async def generate_chat_completion( user=Depends(get_verified_user), bypass_filter: Optional[bool] = False, bypass_system_prompt: bool = False, - db: Session = Depends(get_session), ): + # NOTE: We intentionally do NOT use Depends(get_session) here. + # Database operations (get_model_by_id, has_access) manage their own short-lived sessions. + # This prevents holding a connection during the entire LLM call (30-60+ seconds), + # which would exhaust the connection pool under concurrent load. if BYPASS_MODEL_ACCESS_CONTROL: bypass_filter = True @@ -1279,7 +1282,7 @@ async def generate_chat_completion( del payload["metadata"] model_id = payload["model"] - model_info = Models.get_model_by_id(model_id, db=db) + model_info = Models.get_model_by_id(model_id) if model_info: if model_info.base_model_id: @@ -1307,7 +1310,6 @@ async def generate_chat_completion( user.id, type="read", access_control=model_info.access_control, - db=db, ) ): raise HTTPException( From 2faab409d346a7abf88c9085b44e6bc73f2a14a0 Mon Sep 17 00:00:00 2001 From: TOM <46499476+BLACKTHOMAS@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:35:01 +0100 Subject: [PATCH 008/311] i18n(pl-PL): Add missing keys and update existing translations (#20562) * Added lacking translations to Polish locale and improved some existing ones for better clarity. * fix: add missing newline at EOF --------- Co-authored-by: Tim Baek Co-authored-by: joaoback <156559121+joaoback@users.noreply.github.com> --- src/lib/i18n/locales/pl-PL/translation.json | 372 ++++++++++---------- 1 file changed, 186 insertions(+), 186 deletions(-) diff --git a/src/lib/i18n/locales/pl-PL/translation.json b/src/lib/i18n/locales/pl-PL/translation.json index 3b7dd22217..34ff2618a7 100644 --- a/src/lib/i18n/locales/pl-PL/translation.json +++ b/src/lib/i18n/locales/pl-PL/translation.json @@ -1,5 +1,5 @@ { - "-1 for no limit, or a positive integer for a specific limit": "-1 oznacza brak limitu lub dodatnia liczba całkowita dla konkretnego limitu", + "-1 for no limit, or a positive integer for a specific limit": "-1 oznacza brak limitu, liczba dodatnia oznacza konkretny limit", "'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' lub '-1' dla braku wygaśnięcia.", "(e.g. `sh webui.sh --api --api-auth username_password`)": "(np. `sh webui.sh --api --api-auth username_password`)", "(e.g. `sh webui.sh --api`)": "(np. `sh webui.sh --api`)", @@ -23,7 +23,7 @@ "{{NAMES}} reacted with {{REACTION}}": "{{NAMES}} zareagował(a) {{REACTION}}", "{{user}}'s Chats": "Czaty użytkownika {{user}}", "{{webUIName}} Backend Required": "Wymagany backend {{webUIName}}", - "*Prompt node ID(s) are required for image generation": "*Wymagane są identyfikatory węzłów Prompt do generowania obrazów", + "*Prompt node ID(s) are required for image generation": "*Do generowania obrazów wymagane jest ID węzła promptu", "1 Source": "1 źródło", "A collaboration channel where people join as members": "Kanał współpracy, do którego użytkownicy dołączają jako członkowie", "A discussion channel where access is controlled by groups and permissions": "Kanał dyskusyjny, do którego dostęp jest kontrolowany przez grupy i uprawnienia", @@ -47,7 +47,7 @@ "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Aktywuj tę komendę, wpisując \"/{{COMMAND}}\" w polu czatu.", "Active": "Aktywny", "Active Users": "Aktywni użytkownicy", - "Activity": "", + "Activity": "Aktywność", "Add": "Dodaj", "Add a model ID": "Dodaj identyfikator modelu", "Add a short description about what this model does": "Dodaj krótki opis działania tego modelu", @@ -55,14 +55,14 @@ "Add Arena Model": "Dodaj model Arena", "Add Connection": "Dodaj połączenie", "Add Content": "Dodaj treść", - "Add content here": "Dodaj treść tutaj", + "Add content here": "Dodaj tutaj treść", "Add Custom Parameter": "Dodaj parametr niestandardowy", "Add Custom Prompt": "Dodaj niestandardowy prompt", "Add Details": "Dodaj szczegóły", "Add Files": "Dodaj pliki", "Add Member": "Dodaj członka", "Add Members": "Dodaj członków", - "Add Memory": "Dodaj pamięć", + "Add Memory": "Dodaj wpis do pamięci", "Add Model": "Dodaj model", "Add Reaction": "Dodaj reakcję", "Add Tag": "Dodaj tag", @@ -70,7 +70,7 @@ "Add text content": "Dodaj zawartość tekstową", "Add User": "Dodaj użytkownika", "Add User Group": "Dodaj grupę użytkowników", - "Add webpage": "Dodaj stronę www", + "Add webpage": "Dodaj stronę WWW", "Additional Config": "Dodatkowa konfiguracja", "Additional configuration options for marker. This should be a JSON string with key-value pairs. For example, '{\"key\": \"value\"}'. Supported keys include: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level": "Dodatkowe opcje konfiguracji dla markera. Powinien to być ciąg JSON z parami klucz-wartość, np. '{\"key\": \"value\"}'. Obsługiwane klucze: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level.", "Additional Parameters": "Dodatkowe parametry", @@ -78,20 +78,20 @@ "Adjusting these settings will apply changes universally to all users.": "Zmiana tych ustawień wpłynie na wszystkich użytkowników.", "admin": "administrator", "Admin": "Administrator", - "Admin Contact Email": "", + "Admin Contact Email": "Adres e-mail administratora", "Admin Panel": "Panel administracyjny", "Admin Settings": "Ustawienia administratora", "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Administratorzy mają zawsze dostęp do wszystkich narzędzi; użytkownicy muszą mieć przypisane narzędzia do modelu w obszarze roboczym.", "Advanced Parameters": "Zaawansowane parametry", "Advanced parameters for MinerU parsing (enable_ocr, enable_formula, enable_table, language, model_version, page_ranges)": "Zaawansowane parametry parsowania MinerU (enable_ocr, enable_formula, enable_table, language, model_version, page_ranges).", "Advanced Params": "Zaawansowane parametry", - "After updating or changing the embedding model, you must reindex the knowledge base for the changes to take effect. You can do this using the \"Reindex\" button below.": "Po aktualizacji lub zmianie modelu embeddingów musisz przeindeksować Bazę wiedzy. Użyj przycisku \"Reindeksuj\" poniżej.", + "After updating or changing the embedding model, you must reindex the knowledge base for the changes to take effect. You can do this using the \"Reindex\" button below.": "Po aktualizacji lub zmianie modelu embeddingów musisz przeindeksować bazę wiedzy. Użyj przycisku \"Reindeksuj\" poniżej.", "AI": "AI", "All": "Wszystkie", - "All chats have been unarchived.": "Wszystkie czaty zostały odarchiwizowane.", + "All chats have been unarchived.": "Wszystkie czaty zostały przywrócone.", "All models deleted successfully": "Wszystkie modele zostały pomyślnie usunięte.", - "Allow Call": "Zezwól na wywoływanie", - "Allow Chat Controls": "Zezwól na kontrolę czatu", + "Allow Call": "Zezwól na rozmowy głosowe", + "Allow Chat Controls": "Zezwól na ustawienia czatu", "Allow Chat Delete": "Zezwól na usuwanie czatu", "Allow Chat Deletion": "Zezwól na usuwanie czatu", "Allow Chat Edit": "Zezwól na edycję czatu", @@ -99,7 +99,7 @@ "Allow Chat Params": "Zezwól na parametry czatu", "Allow Chat Share": "Zezwól na udostępnianie czatu", "Allow Chat System Prompt": "Zezwól na prompt systemowy czatu", - "Allow Chat Valves": "Zezwól na Valves w czacie", + "Allow Chat Valves": "Zezwól na valves w czacie", "Allow Continue Response": "Zezwól na kontynuację odpowiedzi", "Allow Delete Messages": "Zezwól na usuwanie wiadomości", "Allow File Upload": "Zezwól na przesyłanie plików", @@ -107,15 +107,15 @@ "Allow non-local voices": "Zezwól na głosy nielokalne", "Allow Rate Response": "Zezwól na ocenianie odpowiedzi", "Allow Regenerate Response": "Zezwól na regenerację odpowiedzi", - "Allow Speech to Text": "Zezwól na Speech-to-Text", + "Allow Speech to Text": "Zezwól na zamianę mowy na tekst (STT)", "Allow Temporary Chat": "Zezwól na czat tymczasowy", - "Allow Text to Speech": "Zezwól na Text-to-Speech", + "Allow Text to Speech": "Zezwól na syntezę mowy (TTS)", "Allow User Location": "Zezwól na lokalizację użytkownika", - "Allow Voice Interruption in Call": "Zezwól na przerywanie w trakcie wywoływania", + "Allow Voice Interruption in Call": "Zezwól na przerywanie w trakcie rozmowy", "Allowed Endpoints": "Dozwolone punkty końcowe", "Allowed File Extensions": "Dozwolone rozszerzenia plików", "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "Dozwolone rozszerzenia plików. Oddziel przecinkami. Pozostaw puste dla wszystkich typów.", - "Already have an account?": "Masz już konto?", + "Already have an account?": "Posiadasz już konto?", "Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "Alternatywa dla top_p, zapewniająca balans między jakością a różnorodnością. Parametr p to minimalne prawdopodobieństwo tokena względem najbardziej prawdopodobnego tokena. Np. przy p=0.05 i max prawdopodobieństwie 0.9, wartości poniżej 0.045 są odrzucane.", "Always": "Zawsze", "Always Collapse Code Blocks": "Zawsze zwijaj bloki kodu", @@ -131,7 +131,7 @@ "and {{COUNT}} more": "i {{COUNT}} więcej", "and create a new shared link.": "i utwórz nowy link udostępniania.", "Android": "Android", - "Anyone": "", + "Anyone": "Każdy", "API Base URL": "Bazowy adres URL API", "API Base URL for Datalab Marker service. Defaults to: https://www.datalab.to/api/v1/marker": "Bazowy adres URL API dla usługi Datalab Marker. Domyślnie: https://www.datalab.to/api/v1/marker", "API Key": "Klucz API", @@ -151,11 +151,11 @@ "Archive All Chats": "Zarchiwizuj wszystkie czaty", "Archived Chats": "Zarchiwizowane czaty", "archived-chat-export": "eksport-zarchiwizowanych-czatow", - "Are you sure you want to clear all memories? This action cannot be undone.": "Czy na pewno chcesz wyczyścić wszystkie wspomnienia? Tej operacji nie można cofnąć.", + "Are you sure you want to clear all memories? This action cannot be undone.": "Czy na pewno chcesz wyczyścić całą pamięć? Tej operacji nie można cofnąć.", "Are you sure you want to delete \"{{NAME}}\"?": "Czy na pewno chcesz usunąć \"{{NAME}}\"?", "Are you sure you want to delete this channel?": "Czy na pewno chcesz usunąć ten kanał?", "Are you sure you want to delete this message?": "Czy na pewno chcesz usunąć tę wiadomość?", - "Are you sure you want to unarchive all archived chats?": "Czy na pewno chcesz odarchiwizować wszystkie czaty?", + "Are you sure you want to unarchive all archived chats?": "Czy na pewno chcesz przywrócić wszystkie czaty?", "Are you sure?": "Czy na pewno?", "Arena Models": "Modele Arena", "Artifacts": "Artefakty", @@ -164,8 +164,8 @@ "Ask a question": "Zadaj pytanie", "Assistant": "Asystent", "Async Embedding Processing": "Asynchroniczne przetwarzanie embeddingów", - "Attach File From Knowledge": "Dołącz plik z Bazy wiedzy", - "Attach Knowledge": "Dołącz Bazę wiedzy", + "Attach File From Knowledge": "Dołącz plik z bazy wiedzy", + "Attach Knowledge": "Dołącz bazę wiedzy", "Attach Notes": "Dołącz notatki", "Attach Webpage": "Dołącz stronę www", "Attention to detail": "Dbałość o szczegóły", @@ -177,7 +177,7 @@ "Authenticate": "Uwierzytelnij", "Authentication": "Uwierzytelnianie", "Auto": "Auto", - "Auto (Random)": "", + "Auto (Random)": "Auto (Losowo)", "Auto-Copy Response to Clipboard": "Automatycznie kopiuj odpowiedź do schowka", "Auto-playback response": "Automatyczne odtwarzanie odpowiedzi", "Autocomplete Generation": "Generowanie autouzupełniania", @@ -186,7 +186,7 @@ "AUTOMATIC1111 Api Auth String": "Ciąg autoryzacji API AUTOMATIC1111", "AUTOMATIC1111 Base URL": "Bazowy adres URL AUTOMATIC1111", "AUTOMATIC1111 Base URL is required.": "Bazowy adres URL AUTOMATIC1111 jest wymagany.", - "Automatically inject system tools in native function calling mode (e.g., timestamps, memory, chat history, notes, etc.)": "", + "Automatically inject system tools in native function calling mode (e.g., timestamps, memory, chat history, notes, etc.)": "Automatycznie wstrzykuj narzędzia systemowe w trybie natywnego wywoływania funkcji (np. znaczniki czasu, pamięć, historia, notatki).", "Available list": "Dostępna lista", "Available Tools": "Dostępne narzędzia", "available users": "dostępni użytkownicy", @@ -203,9 +203,9 @@ "Base Model List Cache speeds up access by fetching base models only at startup or on settings save—faster, but may not show recent base model changes.": "Cache listy modeli bazowych przyspiesza dostęp, pobierając je tylko przy starcie lub zapisie ustawień – szybciej, ale może nie pokazać ostatnich zmian w modelach.", "Bearer": "Bearer", "before": "przed", - "Being lazy": "Bezczynny", + "Being lazy": "Zbyt ogólnikowy", "Beta": "Beta", - "Bing": "", + "Bing": "Bing", "Bing Search V7 Endpoint": "Punkt końcowy Bing Search V7", "Bing Search V7 Subscription Key": "Klucz subskrypcji Bing Search V7", "Bio": "Bio", @@ -214,21 +214,21 @@ "Bocha Search API Key": "Klucz API Bocha Search", "Bold": "Pogrubienie", "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Wzmacnianie lub karanie tokenów. Wartości bias (obciążenia) są ograniczone do zakresu -100 do 100. (Domyślnie: brak)", - "Brave": "", + "Brave": "Brave", "Brave Search API Key": "Klucz API Brave Search", - "Builtin Tools": "", + "Builtin Tools": "Wbudowane narzędzia", "Bullet List": "Lista punktowana", "Button ID": "ID Przycisku", "Button Label": "Etykieta przycisku", "Button Prompt": "Prompt przycisku", - "by {{name}}": "", + "by {{name}}": "przez {{name}}", "By {{name}}": "Przez {{name}}", "Bypass Embedding and Retrieval": "Pomiń Embedding i Retrieval", "Bypass Web Loader": "Pomiń Web Loader", "Cache Base Model List": "Cachuj listę modeli bazowych", "Calendar": "Kalendarz", - "Call": "Wywołanie", - "Call feature is not supported when using Web STT engine": "Funkcja wywołania nie jest obsługiwana przy użyciu silnika Web STT", + "Call": "Rozmowa", + "Call feature is not supported when using Web STT engine": "Funkcja rozmowy nie jest obsługiwana przy użyciu przeglądarkowego silnika STT", "Camera": "Kamera", "Cancel": "Anuluj", "Cannot create an empty note.": "Nie można utworzyć pustej notatki.", @@ -249,8 +249,8 @@ "Character limit for autocomplete generation input": "Limit znaków dla wejścia autouzupełniania", "Chart new frontiers": "Poznawaj nowe możliwości", "Chat": "Czat", - "Chat Background Image": "Obraz tła czatu", - "Chat Bubble UI": "UI dymków czatu", + "Chat Background Image": "Tło czatu", + "Chat Bubble UI": "Wygląd dymków czatu", "Chat Controls": "Ustawienia czatu", "Chat Conversation": "Rozmowa", "Chat direction": "Kierunek czatu", @@ -264,10 +264,10 @@ "Check for updates": "Sprawdź dostępność aktualizacji", "Checking for updates...": "Sprawdzanie aktualizacji...", "Choose a model before saving...": "Wybierz model przed zapisaniem...", - "Chunk Min Size Target": "", + "Chunk Min Size Target": "Docelowy min. rozmiar chunka", "Chunk Overlap": "Chunk Overlap", "Chunk Size": "Chunk Size", - "Chunks smaller than this threshold will be merged with neighboring chunks when possible. Set to 0 to disable merging.": "", + "Chunks smaller than this threshold will be merged with neighboring chunks when possible. Set to 0 to disable merging.": "Fragmenty mniejsze niż ten próg będą łączone z sąsiednimi. Ustaw 0, aby wyłączyć łączenie.", "Ciphers": "Szyfry", "Citation": "Cytat", "Citations": "Cytaty", @@ -303,7 +303,7 @@ "Code Block": "Blok kodu", "Code Editor": "Edytor kodu", "Code execution": "Wykonywanie kodu", - "Code Execution": "", + "Code Execution": "Wykonywanie kodu", "Code Execution Engine": "Silnik wykonywania kodu", "Code Execution Timeout": "Limit czasu wykonywania kodu", "Code formatted successfully": "Sformatowano kod pomyślnie", @@ -346,7 +346,7 @@ "Contact Admin for WebUI Access": "Skontaktuj się z administratorem, aby uzyskać dostęp.", "Content": "Treść", "Content Extraction Engine": "Silnik ekstrakcji treści", - "Content lengths (character counts only)": "", + "Content lengths (character counts only)": "Długość treści (liczba znaków)", "Continue Response": "Kontynuuj odpowiedź", "Continue with {{provider}}": "Kontynuuj przez {{provider}}", "Continue with Email": "Kontynuuj przez Email", @@ -367,7 +367,7 @@ "Copy link": "Kopiuj link", "Copy Link": "Kopiuj link", "Copy to clipboard": "Kopiuj do schowka", - "Copy URL": "", + "Copy URL": "Kopiuj URL", "Copying to clipboard was successful!": "Pomyślnie skopiowano do schowka!", "CORS must be properly configured by the provider to allow requests from Open WebUI.": "Dostawca musi poprawnie skonfigurować CORS, aby zezwolić na żądania z Open WebUI.", "Create": "Utwórz", @@ -391,7 +391,7 @@ "Created At": "Data utworzenia", "Created by": "Utworzone przez", "Created by you": "Utworzone przez Ciebie", - "Created on {{date}}": "", + "Created on {{date}}": "Utworzono {{date}}", "CSV Import": "Import CSV", "Ctrl+Enter to Send": "Ctrl+Enter aby wysłać", "Current Model": "Obecny model", @@ -406,7 +406,7 @@ "Database": "Baza danych", "Datalab Marker API": "API Datalab Marker", "DD/MM/YYYY": "DD/MM/YYYY", - "DDGS Backend": "", + "DDGS Backend": "DDGS Backend", "December": "Grudzień", "Decrease UI Scale": "Zmniejsz skalę UI", "Deepgram": "Deepgram", @@ -447,13 +447,13 @@ "delete this link": "usuń ten link", "Delete tool?": "Usunąć narzędzie?", "Delete User": "Usuń użytkownika", - "Deleted": "", + "Deleted": "Usunięto", "Deleted {{deleteModelTag}}": "Usunięto {{deleteModelTag}}", "Deleted {{name}}": "Usunięto {{name}}", "Deleted User": "Usunięty użytkownik", "Deployment names are required for Azure OpenAI": "Nazwy wdrożeń są wymagane dla Azure OpenAI", "Desc": "Opis", - "Describe your knowledge base and objectives": "Opisz bazę wiedzy i cele", + "Describe your knowledge base and objectives": "Opisz bazę wiedzy i jej cele", "Description": "Opis", "Detect Artifacts Automatically": "Wykrywaj artefakty automatycznie", "Dictate": "Dyktuj", @@ -466,7 +466,7 @@ "Directory selection was cancelled": "Anulowano wybór katalogu", "Disable Code Interpreter": "Wyłącz interpreter kodu", "Disable Image Extraction": "Wyłącz ekstrakcję obrazów", - "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Wyłącz wyciąganie obrazów z PDF. Jeśli używasz LLM, obrazy będą automatycznie opisywane. Domyślnie Fałsz.", + "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Wyłącz wyciąganie obrazów z PDF. Jeśli używasz LLM, obrazy będą automatycznie opisywane. Domyślnie Wyłączone.", "Disabled": "Wyłączone", "Discover a function": "Odkryj funkcję", "Discover a model": "Odkryj model", @@ -489,7 +489,7 @@ "Dive into knowledge": "Zanurz się w wiedzy", "Do not install functions from sources you do not fully trust.": "Nie instaluj funkcji z niezaufanych źródeł.", "Do not install tools from sources you do not fully trust.": "Nie instaluj narzędzi z niezaufanych źródeł.", - "Do you want to sync your usage stats with Open WebUI Community?": "", + "Do you want to sync your usage stats with Open WebUI Community?": "Czy chcesz zsynchronizować statystyki użycia ze społecznością Open WebUI?", "Docling": "Docling", "Docling Parameters": "Parametry Docling", "Docling Server URL required.": "Wymagany URL serwera Docling.", @@ -498,7 +498,7 @@ "Document Intelligence endpoint required.": "Wymagany endpoint Document Intelligence.", "Document Intelligence Model": "Model Document Intelligence", "Documentation": "Dokumentacja", - "Documents": "", + "Documents": "Dokumenty", "does not make any external connections, and your data stays securely on your locally hosted server.": "nie nawiązuje połączeń zewnętrznych, a Twoje dane zostają lokalnie.", "Domain Filter List": "Lista filtrowania domen", "don't fetch random pipelines from sources you don't trust.": "nie pobieraj pipeline'ów z niezaufanych źródeł.", @@ -509,20 +509,20 @@ "Done": "Gotowe", "Download": "Pobierz", "Download & Delete": "Pobierz i usuń", - "Download as JSON": "", + "Download as JSON": "Pobierz jako JSON", "Download as SVG": "Pobierz jako SVG", "Download canceled": "Pobieranie anulowane", "Download Database": "Pobierz bazę danych", - "Downloading stats...": "", - "Draw": "Rysuj", + "Downloading stats...": "Pobieranie statystyk...", + "Draw": "Remis", "Drop any files here to upload": "Upuść pliki tutaj, aby przesłać", - "DuckDuckGo": "", + "DuckDuckGo": "DuckDuckGo", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "np. '30s','10m'. Jednostki: 's' (sek), 'm' (min), 'h' (godz).", "e.g. \"json\" or a JSON schema": "np. \"json\" lub schemat JSON", "e.g. 60": "np. 60", "e.g. A filter to remove profanity from text": "np. Filtr usuwający wulgaryzmy", "e.g. about the Roman Empire": "np. o Imperium Rzymskim", - "e.g. alloy, echo, shimmer": "", + "e.g. alloy, echo, shimmer": "np. stal, echo, poświata", "e.g. en": "np. pl", "e.g. My Filter": "np. Mój Filtr", "e.g. My Tools": "np. Moje Narzędzia", @@ -551,7 +551,7 @@ "edited": "edytowano", "Edited": "Edytowano", "Editing": "Edytowanie", - "Eject": "Wysuń (Odładuj)", + "Eject": "Odładuj", "ElevenLabs": "ElevenLabs", "Email": "Email", "Embark on adventures": "Wyrusz na przygodę", @@ -579,11 +579,11 @@ "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Upewnij się, że plik CSV ma 4 kolumny: Nazwa, Email, Hasło, Rola.", "Enter {{role}} message here": "Wpisz wiadomość roli {{role}} tutaj", "Enter a detail about yourself for your LLMs to recall": "Wpisz szczegóły o sobie, aby LLM je zapamiętał", - "Enter a title for the pending user info overlay. Leave empty for default.": "Wpisz tytuł ekranu oczekującego użytkownika. Zostaw puste dla domyślnego.", + "Enter a title for the pending user info overlay. Leave empty for default.": "Wpisz tytuł nakładki informacyjnej dla użytkownika oczekującego na aktywację. Zostaw puste dla domyślnego.", "Enter a watermark for the response. Leave empty for none.": "Wpisz znak wodny odpowiedzi. Zostaw puste dla braku.", - "Enter additional headers in JSON format": "Wprowadź dodatkowe nagłówki (JSON)", + "Enter additional headers in JSON format": "Wprowadź dodatkowe nagłówki w formacie JSON", "Enter additional headers in JSON format (e.g. {\"X-Custom-Header\": \"value\"}": "Wprowadź nagłówki w JSON (np. {\"X-Custom-Header\": \"value\"})", - "Enter additional parameters in JSON format": "Wprowadź dodatkowe parametry (JSON)", + "Enter additional parameters in JSON format": "Wprowadź dodatkowe parametry w formacie JSON", "Enter api auth string (e.g. username:password)": "Wprowadź ciąg auth API (np. user:pass)", "Enter Application DN": "Wprowadź DN aplikacji", "Enter Application DN Password": "Wprowadź hasło DN aplikacji", @@ -592,31 +592,31 @@ "Enter Bocha Search API Key": "Wprowadź klucz API Bocha Search", "Enter Brave Search API Key": "Wprowadź klucz API Brave Search", "Enter certificate path": "Wprowadź ścieżkę certyfikatu", - "Enter Chunk Min Size Target": "", + "Enter Chunk Min Size Target": "Docelowy min. rozmiar chunka", "Enter Chunk Overlap": "Wprowadź Chunk Overlap", "Enter Chunk Size": "Wprowadź Chunk Size", "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "Wprowadź pary \"token:bias\" po przecinku (np. 5432:100, 413:-100)", - "Enter content for the pending user info overlay. Leave empty for default.": "Wprowadź treść ekranu oczekiwania. Zostaw puste dla domyślnej.", + "Enter content for the pending user info overlay. Leave empty for default.": "Wpisz treść nakładki informacyjnej. Zostaw puste dla domyślnej.", "Enter coordinates (e.g. 51.505, -0.09)": "Wprowadź współrzędne (np. 51.505, -0.09)", "Enter Datalab Marker API Base URL": "Wprowadź Base URL Datalab Marker API", "Enter Datalab Marker API Key": "Wprowadź klucz API Datalab Marker", "Enter description": "Wprowadź opis", "Enter Docling API Key": "Wprowadź klucz API Docling", "Enter Docling Server URL": "Wprowadź URL serwera Docling", - "Enter Document Intelligence Endpoint": "Wprowadź endpoint Document Intelligence", + "Enter Document Intelligence Endpoint": "Wprowadź punkt końcowy Document Intelligence", "Enter Document Intelligence Key": "Wprowadź klucz Document Intelligence", "Enter Document Intelligence Model": "Wprowadź model Document Intelligence", - "Enter domains separated by commas (e.g., example.com,site.org,!excludedsite.com)": "Wprowadź domeny po przecinku (np. example.com,!exclude.com)", + "Enter domains separated by commas (e.g., example.com,site.org,!excludedsite.com)": "Wprowadź domeny oddzielone przecinkami (np. example.com,!exclude.com)", "Enter Exa API Key": "Wprowadź klucz API Exa", - "Enter External Document Loader API Key": "Wprowadź klucz API External Document Loader", - "Enter External Document Loader URL": "Wprowadź URL External Document Loader", - "Enter External Web Loader API Key": "Wprowadź klucz API External Web Loader", - "Enter External Web Loader URL": "Wprowadź URL External Web Loader", - "Enter External Web Search API Key": "Wprowadź klucz API External Web Search", - "Enter External Web Search URL": "Wprowadź URL External Web Search", - "Enter Firecrawl API Base URL": "Wprowadź Base URL Firecrawl API", + "Enter External Document Loader API Key": "Wprowadź klucz API zewnętrznego silnika ładowania dokumentów", + "Enter External Document Loader URL": "Wprowadź URL zewnętrznego silnika ładowania dokumentów", + "Enter External Web Loader API Key": "Wprowadź klucz API zewnętrznego silnika ładowania stron", + "Enter External Web Loader URL": "Wprowadź URL zewnętrznego silnika ładowania stron", + "Enter External Web Search API Key": "Wprowadź klucz API zewnętrznego wyszukiwania WWW", + "Enter External Web Search URL": "Wprowadź URL zewnętrznego wyszukiwania WWW", + "Enter Firecrawl API Base URL": "Wprowadź bazowy adres URL API Firecrawl", "Enter Firecrawl API Key": "Wprowadź klucz API Firecrawl", - "Enter Firecrawl Timeout": "", + "Enter Firecrawl Timeout": "Wprowadź limit czasu Firecrawl", "Enter folder name": "Wprowadź nazwę folderu", "Enter function name filter list (e.g. func1, !func2)": "Wprowadź listę filtrów funkcji (np. func1, !func2)", "Enter Github Raw URL": "Wprowadź Github Raw URL", @@ -625,7 +625,7 @@ "Enter hex color (e.g. #FF0000)": "Wprowadź kolor hex (np. #FF0000)", "Enter ID": "Wprowadź ID", "Enter Image Size (e.g. 512x512)": "Wprowadź rozmiar obrazu (np. 512x512)", - "Enter Jina API Base URL": "", + "Enter Jina API Base URL": "Wprowadź Jina API Base URL", "Enter Jina API Key": "Wprowadź klucz API Jina", "Enter JSON config (e.g., {\"disable_links\": true})": "Wprowadź konfigurację JSON (np. {\"disable_links\": true})", "Enter Jupyter Password": "Wprowadź hasło Jupyter", @@ -634,7 +634,7 @@ "Enter Kagi Search API Key": "Wprowadź klucz API Kagi Search", "Enter Key Behavior": "Zachowanie klawisza Enter", "Enter language codes": "Wprowadź kody języków", - "Enter MinerU API Key": "", + "Enter MinerU API Key": "Wprowadź klucz MinerU API", "Enter Mistral API Base URL": "Wprowadź Base URL Mistral API", "Enter Mistral API Key": "Wprowadź klucz API Mistral", "Enter Model ID": "Wprowadź ID modelu", @@ -746,7 +746,7 @@ "External Web Loader URL": "URL External Web Loader", "External Web Search API Key": "Klucz API External Web Search", "External Web Search URL": "URL External Web Search", - "Fade Effect for Streaming Text": "Efekt zanikania dla strumieniowanego tekstu", + "Fade Effect for Streaming Text": "Efekt zanikania generowanego tekstu", "Failed to add file.": "Nie udało się dodać pliku.", "Failed to add members": "Nie udało się dodać członków", "Failed to clear status": "Nie udało się wyczyścić statusu", @@ -760,7 +760,7 @@ "Failed to generate title": "Nie udało się wygenerować tytułu", "Failed to import models": "Nie udało się zaimportować modeli", "Failed to load chat preview": "Nie udało się załadować podglądu czatu", - "Failed to load Excel/CSV file. Please try downloading it instead.": "", + "Failed to load Excel/CSV file. Please try downloading it instead.": "Nie udało się załadować pliku Excel/CSV. Spróbuj go pobrać.", "Failed to load file content.": "Nie udało się załadować zawartości pliku.", "Failed to move chat": "Nie udało się przenieść czatu", "Failed to process URL: {{url}}": "Nie udało się przetworzyć URL: {{url}}", @@ -777,7 +777,7 @@ "Features": "Funkcje", "Features Permissions": "Uprawnienia funkcji", "February": "Luty", - "Feedback": "", + "Feedback": "Opinia", "Feedback deleted successfully": "Opinia usunięta pomyślnie", "Feedback Details": "Szczegóły opinii", "Feedback History": "Historia opinii", @@ -786,7 +786,7 @@ "File": "Plik", "File added successfully.": "Plik dodany pomyślnie.", "File content updated successfully.": "Treść pliku zaktualizowana pomyślnie.", - "File Context": "", + "File Context": "Kontekst pliku", "File Mode": "Tryb pliku", "File not found.": "Plik nie znaleziony.", "File removed successfully.": "Plik usunięty pomyślnie.", @@ -802,22 +802,22 @@ "Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Wykryto spoofing (Fingerprint): Nie można użyć inicjałów jako awatara. Używam domyślnego obrazka.", "Firecrawl API Base URL": "Base URL Firecrawl API", "Firecrawl API Key": "Klucz API Firecrawl", - "Firecrawl Timeout (s)": "", - "Floating Quick Actions": "Pływające szybkie akcje", + "Firecrawl Timeout (s)": "Timeout Firecrawl (s)", + "Floating Quick Actions": "Podręczne szybkie akcje", "Focus Chat Input": "Skupienie na polu czatu", "Folder": "Folder", "Folder Background Image": "Tło folderu", "Folder deleted successfully": "Folder usunięty pomyślnie", - "Folder Max File Count": "", + "Folder Max File Count": "Maks. liczba plików w folderze", "Folder Name": "Nazwa folderu", "Folder name cannot be empty.": "Nazwa folderu nie może być pusta.", "Folder name updated successfully": "Nazwa folderu zaktualizowana pomyślnie", "Folder updated successfully": "Folder zaktualizowany pomyślnie", "Folders": "Foldery", - "Follow up": "Kontynuacja", - "Follow Up Generation": "Generowanie pytań kontynuacyjnych", - "Follow Up Generation Prompt": "Prompt generowania kontynuacji", - "Follow-Up Auto-Generation": "Automatyczne generowanie kontynuacji", + "Follow up": "Pytania nawiązujące", + "Follow Up Generation": "Generowanie pytań nawiązujących", + "Follow Up Generation Prompt": "Prompt generowania pytań nawiązujących", + "Follow-Up Auto-Generation": "Automatyczne generowanie pytań nawiązujących", "Followed instructions perfectly": "Instrukcje wykonane idealnie", "Force OCR": "Wymuś OCR", "Force OCR on all pages of the PDF. This can lead to worse results if you have good text in your PDFs. Defaults to False.": "Wymuś OCR na wszystkich stronach PDF. Może pogorszyć wyniki, jeśli PDF ma już dobry tekst. Domyślnie Fałsz.", @@ -863,13 +863,13 @@ "Get started with {{WEBUI_NAME}}": "Rozpocznij z {{WEBUI_NAME}}", "Global": "Globalne", "Good Response": "Dobra odpowiedź", - "Google": "", + "Google": "Google", "Google Drive": "Google Drive", "Google PSE API Key": "Klucz API Google PSE", "Google PSE Engine Id": "ID silnika Google PSE", "Gravatar": "Gravatar", "Grid": "Siatka", - "Grokipedia": "", + "Grokipedia": "Grokipedia", "Group": "Grupa", "Group Channel": "Kanał grupowy", "Group created successfully": "Grupa utworzona pomyślnie", @@ -906,8 +906,8 @@ "I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Potwierdzam, że rozumiem konsekwencje. Jestem świadomy ryzyka wykonywania dowolnego kodu i zweryfikowałem zaufanie do źródła.", "ID": "ID", "ID cannot contain \":\" or \"|\" characters": "ID nie może zawierać \":\" ani \"|\"", - "iframe Sandbox Allow Forms": "iframe Sandbox Allow Forms", - "iframe Sandbox Allow Same Origin": "iframe Sandbox Allow Same Origin", + "iframe Sandbox Allow Forms": "Zezwól na formularze w iframe", + "iframe Sandbox Allow Same Origin": "Zezwól na 'Same Origin' w iframe", "Ignite curiosity": "Rozpal ciekawość", "Image": "Obraz", "Image Compression": "Kompresja obrazu", @@ -923,7 +923,7 @@ "Image Prompt Generation": "Generowanie promptu dla obrazu", "Image Prompt Generation Prompt": "Prompt generujący prompt dla obrazu", "Image Size": "Rozmiar obrazu", - "Images": "", + "Images": "Obrazy", "Import": "Importuj", "Import Chats": "Importuj czaty", "Import Config from JSON File": "Importuj konfigurację z JSON", @@ -942,21 +942,21 @@ "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "Wpływa na szybkość reakcji algorytmu na feedback. Niższy 'learning rate' to wolniejsze zmiany, wyższy to szybsza reakcja.", "Info": "Info", "Initials": "Inicjały", - "Inject file content into conversation context": "", - "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Wstrzyknij całą treść jako kontekst (zalecane dla złożonych zapytań).", + "Inject file content into conversation context": "Dołącz treść pliku do kontekstu rozmowy", + "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Dołącz całą treść jako kontekst (zalecane dla złożonych zapytań).", "Input": "Wejście", "Input Key (e.g. text, unet_name, steps)": "Klucz wejściowy (np. text, unet_name, steps)", "Input Variables": "Zmienne wejściowe", "Insert": "Wstaw", "Insert Follow-Up Prompt to Input": "Wstaw prompt kontynuacji do wejścia", - "Insert Prompt as Rich Text": "Wstaw prompt jako Rich Text", + "Insert Prompt as Rich Text": "Wstaw prompt jako sformatowany tekst", "Insert Suggestion Prompt to Input": "Wstaw sugerowany prompt do wejścia", "Install from Github URL": "Zainstaluj z URL Githuba", - "Instant Auto-Send After Voice Transcription": "Natychmiastowe wysyłanie po transkrypcji głosu", + "Instant Auto-Send After Voice Transcription": "Wyślij natychmiast po transkrypcji głosu", "Integration": "Integracja", "Integrations": "Integracje", "Interface": "Interfejs", - "Interface Settings Access": "", + "Interface Settings Access": "Dostęp do ustawień interfejsu", "Invalid file content": "Nieprawidłowa zawartość pliku", "Invalid file format.": "Nieprawidłowy format pliku.", "Invalid JSON file": "Nieprawidłowy plik JSON", @@ -970,7 +970,7 @@ "is typing...": "pisze...", "Italic": "Kursywa", "January": "Styczeń", - "Jina API Base URL": "", + "Jina API Base URL": "Jina API Base URL", "Jina API Key": "Klucz API Jina", "join our Discord for help.": "dołącz do Discorda po pomoc.", "JSON": "JSON", @@ -980,7 +980,7 @@ "June": "Czerwiec", "Jupyter Auth": "Autoryzacja Jupyter", "Jupyter URL": "URL Jupyter", - "JWT Expiration": "Wygaśnięcie JWT", + "JWT Expiration": "Wygasanie tokena JWT", "JWT Token": "Token JWT", "Kagi Search API Key": "Klucz API Kagi Search", "Keep Follow-Up Prompts in Chat": "Zachowaj prompty kontynuacji w czacie", @@ -994,17 +994,17 @@ "Knowledge Base": "Baza wiedzy", "Knowledge created successfully.": "Wiedza utworzona pomyślnie.", "Knowledge deleted successfully.": "Wiedza usunięta pomyślnie.", - "Knowledge Description": "Opis Wiedzy", - "Knowledge exported successfully": "", - "Knowledge Name": "Nazwa Wiedzy", - "Knowledge Public Sharing": "Publiczne udostępnianie Wiedzy", + "Knowledge Description": "Opis wiedzy", + "Knowledge exported successfully": "Wiedza wyeksportowana pomyślnie", + "Knowledge Name": "Nazwa wiedzy", + "Knowledge Public Sharing": "Publiczne udostępnianie wiedzy", "Knowledge reset successfully.": "Wiedza zresetowana pomyślnie.", - "Knowledge Sharing": "Udostępnianie Wiedzy", + "Knowledge Sharing": "Udostępnianie wiedzy", "Knowledge updated successfully": "Wiedza zaktualizowana pomyślnie", "Kokoro.js (Browser)": "Kokoro.js (Przeglądarka)", "Kokoro.js Dtype": "Typ danych Kokoro.js", "Label": "Etykieta", - "Landing Page Mode": "Tryb Landing Page", + "Landing Page Mode": "Tryb strony startowej", "Language": "Język", "Language Locales": "Lokalizacje językowe", "Last Active": "Ostatnio aktywny", @@ -1022,7 +1022,7 @@ "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "Zostaw puste, aby dołączyć wszystkie modele z \"{{url}}/api/tags\"", "Leave empty to include all models from \"{{url}}/models\" endpoint": "Zostaw puste, aby dołączyć wszystkie modele z \"{{url}}/models\"", "Leave empty to include all models or select specific models": "Zostaw puste, aby uwzględnić wszystkie, lub wybierz konkretne", - "Leave empty to use first admin user": "", + "Leave empty to use first admin user": "Pozostaw puste, aby użyć konta pierwszego administratora", "Leave empty to use the default model (voxtral-mini-latest).": "Zostaw puste, aby użyć domyślnego modelu (voxtral-mini-latest).", "Leave empty to use the default prompt, or enter a custom prompt": "Zostaw puste dla domyślnego, lub wpisz własny", "Leave model field empty to use the default model.": "Zostaw puste, aby użyć modelu domyślnego.", @@ -1062,13 +1062,13 @@ "Manage your account information.": "Zarządzaj informacjami o koncie.", "March": "Marzec", "Markdown": "Markdown", - "Markdown Header Text Splitter": "", + "Markdown Header Text Splitter": "Markdown Header Text Splitter", "Max Speakers": "Maks. mówców", "Max Upload Count": "Maks. liczba plików", "Max Upload Size": "Maks. rozmiar pliku", - "Maximum number of files allowed per folder.": "", - "Maximum number of files per folder is {{max}}.": "", - "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksymalnie 3 modele mogą być pobierane jednocześnie. Spróbuj później.", + "Maximum number of files allowed per folder.": "Maksymalna liczba plików dozwolona w jednym folderze.", + "Maximum number of files per folder is {{max}}.": "Maksymalna liczba plików w folderze wynosi {{max}}.", + "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksymalnie 3 modele mogą być pobierane jednocześnie. Spróbuj ponownie później.", "May": "Maj", "MBR": "MBR", "MCP": "MCP", @@ -1077,17 +1077,17 @@ "Member removed successfully": "Członek usunięty pomyślnie", "Members": "Członkowie", "Members added successfully": "Członkowie dodani pomyślnie", - "Memories": "", - "Memories accessible by LLMs will be shown here.": "Wspomnienia dostępne dla LLM pojawią się tutaj.", + "Memories": "Pamięć", + "Memories accessible by LLMs will be shown here.": "Informacje z pamięci dostępne dla LLM pojawią się tutaj.", "Memory": "Pamięć", - "Memory added successfully": "Wspomnienie dodane pomyślnie", + "Memory added successfully": "Wpis pamięci dodany pomyślnie", "Memory cleared successfully": "Pamięć wyczyszczona pomyślnie", - "Memory deleted successfully": "Wspomnienie usunięte pomyślnie", - "Memory updated successfully": "Wspomnienie zaktualizowane pomyślnie", + "Memory deleted successfully": "Wpis pamięci usunięty pomyślnie", + "Memory updated successfully": "Wpis pamięci zaktualizowany pomyślnie", "Merge Responses": "Połącz odpowiedzi", "Merged Response": "Połączona odpowiedź", "Message": "Wiadomość", - "Message counts and response timestamps": "", + "Message counts and response timestamps": "Liczba wiadomości i znaczniki czasu odpowiedzi", "Message rating should be enabled to use this feature": "Ocenianie wiadomości musi być włączone, aby użyć tej funkcji", "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Wiadomości wysłane po utworzeniu linku nie będą udostępniane. Użytkownicy z linkiem zobaczą udostępniony czat.", "Microsoft OneDrive": "Microsoft OneDrive", @@ -1120,11 +1120,11 @@ "Model Name": "Nazwa modelu", "Model name already exists, please choose a different one": "Nazwa modelu już istnieje, wybierz inną", "Model Name is required.": "Nazwa modelu jest wymagana.", - "Model names and usage frequency": "", + "Model names and usage frequency": "Nazwy modeli i częstotliwość użycia", "Model not selected": "Nie wybrano modelu", "Model Params": "Parametry modelu", "Model Permissions": "Uprawnienia modelu", - "Model responses or outputs": "", + "Model responses or outputs": "Odpowiedzi lub wyniki modelu", "Model unloaded successfully": "Model odładowany pomyślnie", "Model updated successfully": "Model zaktualizowany pomyślnie", "Model(s) do not support file upload": "Model(e) nie obsługują przesyłania plików", @@ -1135,7 +1135,7 @@ "Models imported successfully": "Modele zaimportowane pomyślnie", "Models Public Sharing": "Publiczne udostępnianie modeli", "Models Sharing": "Udostępnianie modeli", - "Mojeek": "", + "Mojeek": "Mojeek", "Mojeek Search API Key": "Klucz API Mojeek Search", "More": "Więcej", "More Concise": "Bardziej zwięzły", @@ -1157,10 +1157,10 @@ "New Prompt": "Nowy prompt", "New Temporary Chat": "Nowy czat tymczasowy", "New Tool": "Nowe narzędzie", - "New Webhook": "", + "New Webhook": "Nowy webhook", "new-channel": "nowy-kanal", "Next message": "Następna wiadomość", - "No activity data": "", + "No activity data": "Brak danych aktywności", "No authentication": "Brak autoryzacji", "No chats found": "Nie znaleziono czatów", "No chats found for this user.": "Nie znaleziono czatów dla tego użytkownika.", @@ -1169,9 +1169,9 @@ "No content found": "Nie znaleziono treści", "No content to speak": "Brak treści do wymówienia", "No conversation to save": "Brak rozmowy do zapisania", - "No distance available": "Brak dostępnego dystansu", - "No expiration can pose security risks.": "Brak wygaśnięcia może stanowić ryzyko bezpieczeństwa.", - "No feedback found": "", + "No distance available": "Brak wyniku dopasowania", + "No expiration can pose security risks.": "Brak wygasania może stanowić ryzyko bezpieczeństwa.", + "No feedback found": "Nie znaleziono informacji zwrotnej", "No file selected": "Nie wybrano pliku", "No files in this knowledge base.": "Brak plików w tej bazie wiedzy.", "No functions found": "Nie znaleziono funkcji", @@ -1180,13 +1180,13 @@ "No inference engine with management support found": "Nie znaleziono silnika wnioskowania ze wsparciem zarządzania", "No knowledge bases found.": "Nie znaleziono baz wiedzy.", "No knowledge found": "Nie znaleziono wiedzy", - "No memories to clear": "Brak wspomnień do wyczyszczenia", + "No memories to clear": "Brak danych w pamięci do wyczyszczenia", "No model IDs": "Brak ID modeli", "No models found": "Nie znaleziono modeli", "No models selected": "Nie wybrano modeli", "No Notes": "Brak notatek", "No notes found": "Nie znaleziono notatek", - "No one": "", + "No one": "Nikt", "No pinned messages": "Brak przypiętych wiadomości", "No prompts found": "Nie znaleziono promptów", "No results": "Brak wyników", @@ -1197,10 +1197,10 @@ "No suggestion prompts": "Brak sugerowanych promptów", "No tools found": "Nie znaleziono narzędzi", "No users were found.": "Nie znaleziono użytkowników.", - "No valves": "Brak Valves", - "No valves to update": "Brak zaworów do aktualizacji", - "No webhooks yet": "", - "Node Ids": "ID Węzłów", + "No valves": "Brak valves", + "No valves to update": "Brak valves do aktualizacji", + "No webhooks yet": "Brak webhooków", + "Node Ids": "ID węzłów", "None": "Brak", "Not factually correct": "Merytorycznie niepoprawne", "Not helpful": "Niepomocne", @@ -1211,8 +1211,8 @@ "Notes": "Notatki", "Notes Public Sharing": "Publiczne udostępnianie notatek", "Notes Sharing": "Udostępnianie notatek", - "Notification Sound": "Dźwięk powiadomienia", - "Notification Webhook": "Webhook powiadomień", + "Notification Sound": "Dźwięk powiadomień", + "Notification Webhook": "Powiadomienia webhook", "Notifications": "Powiadomienia", "November": "Listopad", "OAuth": "OAuth", @@ -1239,7 +1239,7 @@ "Only invited users can access": "Tylko zaproszeni użytkownic mają dostęp", "Only markdown files are allowed": "Tylko pliki markdown są dozwolone", "Only select users and groups with permission can access": "Tylko wybrani użytkownicy z uprawnieniami mają dostęp", - "Only sync new/updated chats": "", + "Only sync new/updated chats": "Synchronizuj tylko nowe/zaktualizowane czaty", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Ups! URL wygląda na nieprawidłowy. Sprawdź i spróbuj ponownie.", "Oops! There are files still uploading. Please wait for the upload to complete.": "Ups! Pliki wciąż się przesyłają. Poczekaj na zakończenie.", "Oops! There was an error in the previous response.": "Ups! Wystąpił błąd w poprzedniej odpowiedzi.", @@ -1256,7 +1256,7 @@ "Open WebUI can use tools provided by any OpenAPI server.": "Open WebUI może używać narzędzi z dowolnego serwera OpenAPI.", "Open WebUI uses faster-whisper internally.": "Open WebUI używa wewnętrznie faster-whisper.", "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Open WebUI używa SpeechT5 i embeddingów CMU Arctic.", - "Open WebUI version": "", + "Open WebUI version": "Wersja Open WebUI", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Wersja Open WebUI (v{{OPEN_WEBUI_VERSION}}) jest niższa niż wymagana (v{{REQUIRED_VERSION}})", "OpenAI": "OpenAI", "OpenAI API": "API OpenAI", @@ -1281,8 +1281,8 @@ "page": "strona", "Paginate": "Stronicowanie", "Parameters": "Parametry", - "Parent message not found": "", - "Participate in community leaderboards and evaluations! Syncing aggregated usage stats helps drive research and improvements to Open WebUI. Your privacy is paramount: no message content is ever shared.": "", + "Parent message not found": "Nie znaleziono wiadomości nadrzędnej", + "Participate in community leaderboards and evaluations! Syncing aggregated usage stats helps drive research and improvements to Open WebUI. Your privacy is paramount: no message content is ever shared.": "Weź udział w rankingach społeczności! Synchronizacja zagregowanych statystyk pomaga w rozwoju Open WebUI. Twoja prywatność jest najważniejsza: treść wiadomości nigdy nie jest udostępniana.", "Password": "Hasło", "Passwords do not match.": "Hasła nie pasują do siebie.", "Paste Large Text as File": "Wklej duży tekst jako plik", @@ -1290,8 +1290,8 @@ "PDF Extract Images (OCR)": "Wyodrębnij obrazy z PDF (OCR)", "pending": "oczekuje", "Pending": "Oczekujące", - "Pending User Overlay Content": "Treść ekranu oczekującego użytkownika", - "Pending User Overlay Title": "Tytuł ekranu oczekującego użytkownika", + "Pending User Overlay Content": "Treść nakładki dla oczekującego użytkownika", + "Pending User Overlay Title": "Tytuł nakładki dla oczekującego użytkownika", "Permission denied when accessing media devices": "Odmowa dostępu do urządzeń multimedialnych", "Permission denied when accessing microphone": "Odmowa dostępu do mikrofonu", "Permission denied when accessing microphone: {{error}}": "Odmowa dostępu do mikrofonu: {{error}}", @@ -1304,11 +1304,11 @@ "Pin": "Przypnij", "Pinned": "Przypięte", "Pinned Messages": "Przypięte wiadomości", - "Pioneer insights": "Odkrywaj nowe wglądy", + "Pioneer insights": "Przełomowe wnioski", "Pipe": "Pipe", "Pipeline deleted successfully": "Pipeline usunięty pomyślnie", "Pipeline downloaded successfully": "Pipeline pobrany pomyślnie", - "Pipelines": "", + "Pipelines": "Pipelines", "Pipelines are a plugin system with arbitrary code execution —": "Pipelines to system wtyczek z wykonywaniem dowolnego kodu —", "Pipelines Not Detected": "Nie wykryto Pipeline'ów", "Pipelines Valves": "Pipelines Valves", @@ -1367,7 +1367,7 @@ "Quick Actions": "Szybkie akcje", "RAG Template": "Szablon RAG", "Rating": "Ocena", - "Re-rank models by topic similarity": "Re-rank models by topic similarity", + "Re-rank models by topic similarity": "Rerankowanie modeli wg podobieństwa tematycznego", "Read": "Czytaj", "Read Aloud": "Czytaj na głos", "Read more →": "Czytaj więcej →", @@ -1479,7 +1479,7 @@ "Searched {{count}} sites": "Przeszukano {{count}} stron", "Searching": "Wyszukiwanie", "Searching \"{{searchQuery}}\"": "Szukanie \"{{searchQuery}}\"", - "Searching Knowledge for \"{{searchQuery}}\"": "Przeszukiwanie Wiedzy dla \"{{searchQuery}}\"", + "Searching Knowledge for \"{{searchQuery}}\"": "Przeszukiwanie wiedzy dla \"{{searchQuery}}\"", "Searching the web": "Przeszukiwanie sieci...", "Searxng Query URL": "URL zapytania Searxng", "Searxng search language (all, en, es, de, fr, etc.)": "Język wyszukiwania Searxng (all, en, pl, de...)", @@ -1547,7 +1547,7 @@ "Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Ustawia sekwencje stop. Gdy wystąpią, LLM przerywa generowanie.", "Setting": "Ustawienie", "Settings": "Ustawienia", - "Settings Permissions": "", + "Settings Permissions": "Uprawnienia ustawień", "Settings saved successfully!": "Ustawienia zapisane pomyślnie!", "Share": "Udostępnij", "Share Chat": "Udostępnij czat", @@ -1589,9 +1589,9 @@ "Source": "Źródło", "Speech Playback Speed": "Prędkość odtwarzania mowy", "Speech recognition error: {{error}}": "Błąd rozpoznawania mowy: {{error}}", - "Speech-to-Text": "Speech-to-Text", - "Speech-to-Text Engine": "Silnik Speech-to-Text", - "Split documents by markdown headers before applying character/token splitting.": "", + "Speech-to-Text": "Silnik zamiany mowy na tekst (STT)", + "Speech-to-Text Engine": "Silnik zamiany mowy na tekst (STT)", + "Split documents by markdown headers before applying character/token splitting.": "Podziel dokumenty według nagłówków markdown przed podziałem na znaki/tokeny.", "Start a new conversation": "Rozpocznij nową rozmowę", "Start of the channel": "Początek kanału", "Start Tag": "Tag startowy", @@ -1602,7 +1602,7 @@ "STDOUT/STDERR": "STDOUT/STDERR", "Steps": "Kroki (Steps)", "Stop": "Przerwij", - "Stop Download": "", + "Stop Download": "Zatrzymaj pobieranie", "Stop Generating": "Przerwij generowanie", "Stop Sequence": "Sekwencja stop", "Stream Chat Response": "Strumieniuj odpowiedź czatu", @@ -1623,14 +1623,14 @@ "Support": "Wsparcie", "Support this plugin:": "Wesprzyj ten plugin:", "Supported MIME Types": "Obsługiwane typy MIME", - "Sync": "", - "Sync Complete!": "", + "Sync": "Synchronizuj", + "Sync Complete!": "Synchronizacja zakończona!", "Sync directory": "Katalog synchronizacji", - "Sync Failed": "", - "Sync Usage Stats": "", - "Syncing stats...": "", - "Syncing...": "", - "Syncs only chats with updates after your last sync timestamp. Disable to re-sync all chats.": "", + "Sync Failed": "Synchronizacja nieudana", + "Sync Usage Stats": "Synchronizuj statystyki użycia", + "Syncing stats...": "Synchronizowanie statystyk...", + "Syncing...": "Synchronizowanie...", + "Syncs only chats with updates after your last sync timestamp. Disable to re-sync all chats.": "Synchronizuje tylko czaty zaktualizowane po ostatniej synchronizacji. Wyłącz, aby zsynchronizować wszystkie.", "System": "System", "System Instructions": "Instrukcje systemowe", "System Prompt": "Prompt systemowy", @@ -1647,12 +1647,12 @@ "Tavily API Key": "Klucz API Tavily", "Tavily Extract Depth": "Tavily Extract Depth", "Tell us more:": "Powiedz nam więcej:", - "Temperature": "Temperature", + "Temperature": "Temperatura", "Temporary Chat": "Czat tymczasowy", "Temporary Chat by Default": "Domyślnie czat tymczasowy", "Text Splitter": "Text Splitter", - "Text-to-Speech": "Text-to-Speech", - "Text-to-Speech Engine": "Silnik Text-to-Speech", + "Text-to-Speech": "Silnik syntezy mowy (TTS)", + "Text-to-Speech Engine": "Silnik syntezy mowy (TTS)", "Thanks for your feedback!": "Dzięki za opinię!", "The Application Account DN you bind with for search": "DN konta aplikacji do wyszukiwania", "The base to search for users": "Baza wyszukiwania użytkowników", @@ -1675,7 +1675,7 @@ "The Weight of BM25 Hybrid Search. 0 more semantic, 1 more lexical. Default 0.5": "Waga BM25 w wyszukiwaniu hybrydowym. 0 = semantyczne, 1 = leksykalne. Domyślnie 0.5", "The width in pixels to compress images to. Leave empty for no compression.": "Szerokość (px) do kompresji obrazów. Zostaw puste dla braku kompresji.", "Theme": "Motyw", - "There was an error syncing your stats. Please try again.": "", + "There was an error syncing your stats. Please try again.": "Wystąpił błąd podczas synchronizacji statystyk. Spróbuj ponownie.", "Thinking...": "Myślę...", "This action cannot be undone. Do you wish to continue?": "Tej akcji nie można cofnąć. Kontynuować?", "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Ten kanał utworzono {{createdAt}}. To początek kanału {{channelName}}.", @@ -1714,7 +1714,7 @@ "To access the available model names for downloading,": "Aby zobaczyć nazwy modeli do pobrania,", "To access the GGUF models available for downloading,": "Aby zobaczyć modele GGUF do pobrania,", "To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Aby uzyskać dostęp, skontaktuj się z administratorem.", - "To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Aby dołączyć Bazę wiedzy, dodaj ją najpierw w obszarze \"Knowledge\".", + "To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Aby dołączyć Bazę wiedzy, dodaj ją najpierw w obszarze \"Wiedza\".", "To learn more about available endpoints, visit our documentation.": "Odwiedź dokumentację, aby poznać dostępne endpointy.", "To learn more about powerful prompt variables, click here": "Kliknij tutaj, aby poznać zmienne promptów", "To select toolkits here, add them to the \"Tools\" workspace first.": "Aby wybrać narzędzia, dodaj je najpierw w obszarze \"Narzędzia\".", @@ -1754,12 +1754,12 @@ "Type": "Typ", "Type here...": "Pisz tutaj...", "Type Hugging Face Resolve (Download) URL": "Wpisz URL Hugging Face Resolve (Pobieranie)", - "Uh-oh! There was an issue with the response.": "Ojej! Wystąpił problem z odpowiedzią.", - "UI": "Interfejs (UI)", - "UI Scale": "Skala UI", - "Unarchive All": "Odarchiwizuj wszystko", - "Unarchive All Archived Chats": "Odarchiwizuj wszystkie czaty", - "Unarchive Chat": "Odarchiwizuj czat", + "Uh-oh! There was an issue with the response.": "O nie! Wystąpił problem z odpowiedzią.", + "UI": "Interfejs", + "UI Scale": "Skala interfejsu", + "Unarchive All": "Przywróć wszystko", + "Unarchive All Archived Chats": "Przywróć wszystkie czaty", + "Unarchive Chat": "Przywróć czat", "Underline": "Podkreślenie", "Unknown": "Nieznany", "Unknown User": "Nieznany użytkownik", @@ -1789,7 +1789,7 @@ "Upload Pipeline": "Prześlij Pipeline", "Upload Progress": "Postęp przesyłania", "Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Postęp: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)", - "Uploaded files or images": "", + "Uploaded files or images": "Przesłane pliki lub obrazy", "Uploading file...": "Przesyłanie pliku...", "URL": "URL", "URL is required": "URL jest wymagany", @@ -1807,8 +1807,8 @@ "User Groups": "Grupy użytkowników", "User location successfully retrieved.": "Lokalizacja użytkownika pobrana pomyślnie.", "User menu": "Menu użytkownika", - "User ratings (thumbs up/down)": "", - "User Status": "", + "User ratings (thumbs up/down)": "Oceny użytkowników (kciuki w górę/dół)", + "User Status": "Status użytkownika", "User Webhooks": "Webhooki użytkownika", "Username": "Nazwa użytkownika", "users": "użytkownicy", @@ -1817,9 +1817,9 @@ "Uses OAuth 2.1 Dynamic Client Registration": "Używa OAuth 2.1 Dynamic Client Registration", "Using Entire Document": "Używanie całego dokumentu", "Using Focused Retrieval": "Używanie Focused Retrieval", - "Using the default arena model with all models. Click the plus button to add custom models.": "Używanie domyślnego modelu arena. Kliknij plus aby dodać własne.", + "Using the default arena model with all models. Click the plus button to add custom models.": "Używanie domyślnego modelu arena. Kliknij przycisk plus aby dodać własny model.", "Valid time units:": "Poprawne jednostki czasu:", - "Validate certificate": "Waliduj certyfikat", + "Validate certificate": "Potwierdź certyfikat", "Valves": "Valves", "Valves updated": "Valves zaktualizowane", "Valves updated successfully": "Valves zaktualizowane pomyślnie", @@ -1838,20 +1838,20 @@ "Voice mode": "Tryb głosowy", "Voice Mode Custom Prompt": "Własny prompt trybu głosowego", "Voice Mode Prompt": "Prompt trybu głosowego", - "Warning": "Ostrzeżenie", - "Warning:": "Ostrzeżenie:", - "Warning: Enabling this will allow users to upload arbitrary code on the server.": "Ostrzeżenie: Włączenie tego pozwoli na przesyłanie dowolnego kodu na serwer.", - "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Ostrzeżenie: Jupyter umożliwia wykonanie dowolnego kodu (ryzyko bezpieczeństwa).", + "Warning": "Uwaga", + "Warning:": "Uwaga:", + "Warning: Enabling this will allow users to upload arbitrary code on the server.": "Uwaga: Włączenie tego pozwoli użytkownikom na przesyłanie dowolnego kodu na serwer.", + "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Uwaga: Jupyter umożliwia wykonanie dowolnego kodu (ryzyko bezpieczeństwa) – zachowaj szczególną ostrożność.", "Web": "Web", "Web API": "Web API", - "Web Loader Engine": "Silnik Web Loader", - "Web Search": "Wyszukiwanie w sieci", - "Web Search Engine": "Silnik wyszukiwania", + "Web Loader Engine": "Silnik ładowania stron", + "Web Search": "Wyszukiwanie WWW", + "Web Search Engine": "Wyszukiwarka", "Web Search in Chat": "Wyszukiwanie w czacie", "Web Search Query Generation": "Generowanie zapytań wyszukiwania", - "Webhook Name": "", + "Webhook Name": "Nazwa webhooka", "Webhook URL": "URL Webhooka", - "Webhooks": "", + "Webhooks": "Webhooki", "Webpage URLs": "Adresy URL stron", "WebUI Settings": "Ustawienia WebUI", "WebUI URL": "URL WebUI", @@ -1860,21 +1860,21 @@ "WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI będzie wysyłać żądania do \"{{url}}/chat/completions\"", "What are you trying to achieve?": "Co chcesz osiągnąć?", "What are you working on?": "Nad czym pracujesz?", - "What is NOT shared:": "", - "What is shared:": "", + "What is NOT shared:": "Co NIE jest udostępniane:", + "What is shared:": "Co jest udostępniane:", "What's New in": "Co nowego w", "What's on your mind?": "O czym myślisz?", - "When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "Gdy włączone, model odpowiada w czasie rzeczywistym.", + "When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "Gdy włączone, model odpowiada w czasie rzeczywistym. Tryb przydatny w czacie na żywo, ale może obciążać słabszy sprzęt.", "wherever you are": "gdziekolwiek jesteś", - "Whether to paginate the output. Each page will be separated by a horizontal rule and page number. Defaults to False.": "Czy stronicować wyjście. Domyślnie Fałsz.", + "Whether to paginate the output. Each page will be separated by a horizontal rule and page number. Defaults to False.": "Określa, czy wyniki mają być stronicowane. Strony są oddzielone linią i numerem. Domyślnie wyłączone.", "Whisper (Local)": "Whisper (Lokalny)", - "Who can share to this group": "", + "Who can share to this group": "Kto może udostępniać w tej grupie", "Why?": "Dlaczego?", "Widescreen Mode": "Tryb szerokoekranowy", "Width": "Szerokość", - "Wikipedia": "", + "Wikipedia": "Wikipedia", "Won": "Wygrano", - "Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "Działa razem z top-k. Wyższa wartość = większa różnorodność.", + "Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "Działa razem z top-k. Wyższa wartość (np. 0.95) = większa różnorodność, niższa = tekst bardziej spójny i zachowawczy.", "Workspace": "Obszar roboczy", "Workspace Permissions": "Uprawnienia obszaru roboczego", "Write": "Pisz", @@ -1884,18 +1884,18 @@ "Yacy Instance URL": "URL instancji Yacy", "Yacy Password": "Hasło Yacy", "Yacy Username": "Nazwa użytkownika Yacy", - "Yahoo": "", - "Yandex": "", + "Yahoo": "Yahoo", + "Yandex": "Yandex", "Yesterday": "Wczoraj", "Yesterday at {{LOCALIZED_TIME}}": "Wczoraj o {{LOCALIZED_TIME}}", "You": "Ty", "You are currently using a trial license. Please contact support to upgrade your license.": "Używasz licencji próbnej. Skontaktuj się ze wsparciem.", "You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Możesz rozmawiać z maksymalnie {{maxCount}} plikami naraz.", - "You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Możesz personalizować interakcje dodając wspomnienia przyciskiem 'Zarządzaj'.", + "You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Możesz personalizować interakcje, dodając informacje do pamięci za pomocą przycisku 'Zarządzaj', dzięki czemu odpowiedzi będą lepiej dopasowane do Ciebie.", "You cannot upload an empty file.": "Nie możesz przesłać pustego pliku.", - "You do not have permission to edit this model": "", - "You do not have permission to edit this prompt.": "", - "You do not have permission to save this prompt.": "", + "You do not have permission to edit this model": "Nie masz uprawnień do edycji tego modelu", + "You do not have permission to edit this prompt.": "Nie masz uprawnień do edycji tego promptu.", + "You do not have permission to save this prompt.": "Nie masz uprawnień do zapisania tego promptu.", "You do not have permission to send messages in this channel.": "Nie masz uprawnień do wysyłania wiadomości w tym kanale.", "You do not have permission to send messages in this thread.": "Nie masz uprawnień do wysyłania wiadomości w tym wątku.", "You do not have permission to upload files to this knowledge base.": "Nie masz uprawnień do przesyłania plików do tej bazy wiedzy.", @@ -1906,9 +1906,9 @@ "You're now logged in.": "Zalogowano pomyślnie.", "Your Account": "Twoje konto", "Your account status is currently pending activation.": "Twoje konto oczekuje na aktywację.", - "Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "Cała wpłata trafia do twórcy pluginu; Open WebUI nie pobiera prowizji.", - "Your message text or inputs": "", - "Your usage stats have been successfully synced.": "", + "Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "Cała wpłata trafia do twórcy pluginu; Open WebUI nie pobiera prowizji. Wybrana platforma płatnicza może jednak naliczać własne opłaty.", + "Your message text or inputs": "Treść wiadomości lub dane wejściowe", + "Your usage stats have been successfully synced.": "Twoje statystyki użycia zostały pomyślnie zsynchronizowane.", "YouTube": "YouTube", "Youtube Language": "Język YouTube", "Youtube Proxy URL": "URL Proxy YouTube" From 84263fc6a6435226e6a2ac29b421b41fad632067 Mon Sep 17 00:00:00 2001 From: Aleix Dorca Date: Sun, 11 Jan 2026 20:35:11 +0100 Subject: [PATCH 009/311] i18n: Updated the Catalan translation file (#20566) * Update translation.json * Update catalan translation.json --- src/lib/i18n/locales/ca-ES/translation.json | 230 ++++++++++---------- 1 file changed, 115 insertions(+), 115 deletions(-) diff --git a/src/lib/i18n/locales/ca-ES/translation.json b/src/lib/i18n/locales/ca-ES/translation.json index a48916e5a3..d76e107e79 100644 --- a/src/lib/i18n/locales/ca-ES/translation.json +++ b/src/lib/i18n/locales/ca-ES/translation.json @@ -12,10 +12,10 @@ "{{COUNT}} Available Tools": "{{COUNT}} eines disponibles", "{{COUNT}} characters": "{{COUNT}} caràcters", "{{COUNT}} extracted lines": "{{COUNT}} línies extretes", - "{{COUNT}} files": "", + "{{COUNT}} files": "{{COUNT}} arxius", "{{COUNT}} hidden lines": "{{COUNT}} línies ocultes", "{{COUNT}} Replies": "{{COUNT}} respostes", - "{{COUNT}} Rows": "", + "{{COUNT}} Rows": "{{COUNT}} files", "{{COUNT}} Sources": "{{COUNT}} fonts", "{{COUNT}} words": "{{COUNT}} paraules", "{{LOCALIZED_DATE}} at {{LOCALIZED_TIME}}": "{{LOCALIZED_DATE}} a les {{LOCALIZED_TIME}}", @@ -47,7 +47,7 @@ "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Activa aquest comanda escrivint \"{{COMMAND}}\" en el xat", "Active": "Actiu", "Active Users": "Usuaris actius", - "Activity": "", + "Activity": "Activitat", "Add": "Afegir", "Add a model ID": "Afegir un ID de model", "Add a short description about what this model does": "Afegeix una breu descripció sobre què fa aquest model", @@ -70,7 +70,7 @@ "Add text content": "Afegir contingut de text", "Add User": "Afegir un usuari", "Add User Group": "Afegir grup d'usuaris", - "Add webpage": "", + "Add webpage": "Afegir pàgina web", "Additional Config": "Configuració addicional", "Additional configuration options for marker. This should be a JSON string with key-value pairs. For example, '{\"key\": \"value\"}'. Supported keys include: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level": "Opcions de configuració addicionals per al marcador. Hauria de ser una cadena JSON amb parelles clau-valor. Per exemple, '{\"key\": \"value\"}'. Les claus compatibles inclouen: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level", "Additional Parameters": "Paràmetres addicionals", @@ -78,7 +78,7 @@ "Adjusting these settings will apply changes universally to all users.": "Si ajustes aquesta preferència, els canvis s'aplicaran de manera universal a tots els usuaris.", "admin": "administrador", "Admin": "Administrador", - "Admin Contact Email": "", + "Admin Contact Email": "Afegir correu electrònic de contacte", "Admin Panel": "Panell d'administració", "Admin Settings": "Preferències d'administració", "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Els administradors tenen accés a totes les eines en tot moment; els usuaris necessiten eines assignades per model a l'espai de treball.", @@ -131,7 +131,7 @@ "and {{COUNT}} more": "i {{COUNT}} més", "and create a new shared link.": "i crear un nou enllaç compartit.", "Android": "Android", - "Anyone": "", + "Anyone": "Algú", "API Base URL": "URL Base de l'API", "API Base URL for Datalab Marker service. Defaults to: https://www.datalab.to/api/v1/marker": "URL base de l'API per al servei de marcadors de Datalab. Per defecte: https://www.datalab.to/api/v1/marker", "API Key": "clau API", @@ -140,7 +140,7 @@ "API keys": "Claus de l'API", "API Keys": "Claus de l'API", "API Mode": "Mode API", - "API Timeout": "", + "API Timeout": "Temps d'espera de l'API", "API Version": "Versió de l'API", "API Version is required": "Versió API requerida", "Application DN": "DN d'aplicació", @@ -159,7 +159,7 @@ "Are you sure?": "Estàs segur?", "Arena Models": "Models de l'Arena", "Artifacts": "Artefactes", - "Asc": "", + "Asc": "Ascendent", "Ask": "Preguntar", "Ask a question": "Fer una pregunta", "Assistant": "Assistent", @@ -177,7 +177,7 @@ "Authenticate": "Autenticar", "Authentication": "Autenticació", "Auto": "Automàtic", - "Auto (Random)": "", + "Auto (Random)": "Automàtic (aleatori)", "Auto-Copy Response to Clipboard": "Copiar la resposta automàticament al porta-retalls", "Auto-playback response": "Reproduir la resposta automàticament", "Autocomplete Generation": "Generació automàtica", @@ -186,7 +186,7 @@ "AUTOMATIC1111 Api Auth String": "Cadena d'autenticació de l'API d'AUTOMATIC1111", "AUTOMATIC1111 Base URL": "URL Base d'AUTOMATIC1111", "AUTOMATIC1111 Base URL is required.": "Es requereix la URL Base d'AUTOMATIC1111.", - "Automatically inject system tools in native function calling mode (e.g., timestamps, memory, chat history, notes, etc.)": "", + "Automatically inject system tools in native function calling mode (e.g., timestamps, memory, chat history, notes, etc.)": "Injecta automàticament les eines del sistema en el mode de crida de funcions natives (per exemple, marques de temps, memòria, historial de xat, notes, etc.)", "Available list": "Llista de disponibles", "Available Tools": "Eines disponibles", "available users": "usuaris disponibles", @@ -205,7 +205,7 @@ "before": "abans", "Being lazy": "Essent mandrós", "Beta": "Beta", - "Bing": "", + "Bing": "Bing", "Bing Search V7 Endpoint": "Punt de connexió a Bing Search V7", "Bing Search V7 Subscription Key": "Clau de subscripció a Bing Search V7", "Bio": "Bio", @@ -214,14 +214,14 @@ "Bocha Search API Key": "Clau API de Bocha Search", "Bold": "Negreta", "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Potenciar o penalitzar tokens específics per a respostes limitades. Els valors de biaix es fixaran entre -100 i 100 (inclosos). (Per defecte: cap)", - "Brave": "", + "Brave": "Brave", "Brave Search API Key": "Clau API de Brave Search", - "Builtin Tools": "", + "Builtin Tools": "Eines integrades", "Bullet List": "Llista indexada", "Button ID": "ID del botó", "Button Label": "Etiqueta del botó", "Button Prompt": "Indicació del botó", - "by {{name}}": "", + "by {{name}}": "per {{name}}", "By {{name}}": "Per {{name}}", "Bypass Embedding and Retrieval": "Desactivar l'Embedding i el Retrieval", "Bypass Web Loader": "Ometre el càrregador web", @@ -231,7 +231,7 @@ "Call feature is not supported when using Web STT engine": "La funció de trucada no s'admet quan s'utilitza el motor Web STT", "Camera": "Càmera", "Cancel": "Cancel·lar", - "Cannot create an empty note.": "", + "Cannot create an empty note.": "No es pot crear una nota buida.", "Capabilities": "Capacitats", "Capture": "Captura", "Capture Audio": "Capturar àudio", @@ -241,7 +241,7 @@ "Channel deleted successfully": "Canal suprimit correctament", "Channel Name": "Nom del canal", "Channel name cannot be empty.": "El nom del canal no pot estar buit.", - "Channel name must be less than 128 characters": "", + "Channel name must be less than 128 characters": "El nom del canal ha de tenir menys de 128 caràcters", "Channel Type": "Tipus de canal", "Channel updated successfully": "Canal actualitzat correctament", "Channels": "Canals", @@ -264,10 +264,10 @@ "Check for updates": "Comprovar si hi ha actualitzacions", "Checking for updates...": "Comprovant actualitzacions...", "Choose a model before saving...": "Triar un model abans de desar...", - "Chunk Min Size Target": "", + "Chunk Min Size Target": "Objectiu de mida mínima del fragment", "Chunk Overlap": "Solapament de blocs", "Chunk Size": "Mida del bloc", - "Chunks smaller than this threshold will be merged with neighboring chunks when possible. Set to 0 to disable merging.": "", + "Chunks smaller than this threshold will be merged with neighboring chunks when possible. Set to 0 to disable merging.": "Els fragments més petits que aquest llindar es fusionaran amb els fragments veïns sempre que sigui possible. Establiu-ho a 0 per desactivar la fusió.", "Ciphers": "Xifradors", "Citation": "Cita", "Citations": "Cites", @@ -303,7 +303,7 @@ "Code Block": "Bloc de codi", "Code Editor": "Editor de codi", "Code execution": "Execució de codi", - "Code Execution": "", + "Code Execution": "Execució de codi", "Code Execution Engine": "Motor d'execució de codi", "Code Execution Timeout": "Temps màxim d'execució de codi", "Code formatted successfully": "Codi formatat correctament", @@ -313,7 +313,7 @@ "Collaboration channel where people join as members": "Canal de col·laboració on la gent s'uneix com a membres", "Collapse": "Col·lapsar", "Collection": "Col·lecció", - "Collections": "", + "Collections": "Col·lecccions", "Color": "Color", "ComfyUI": "ComfyUI", "ComfyUI API Key": "Configurar la clau API de ComfyUI", @@ -346,7 +346,7 @@ "Contact Admin for WebUI Access": "Posa't en contacte amb l'administrador per accedir a WebUI", "Content": "Contingut", "Content Extraction Engine": "Motor d'extracció de contingut", - "Content lengths (character counts only)": "", + "Content lengths (character counts only)": "Mida del contingut (només els caràcters)", "Continue Response": "Continuar la resposta", "Continue with {{provider}}": "Continuar amb {{provider}}", "Continue with Email": "Continuar amb el correu", @@ -367,7 +367,7 @@ "Copy link": "Copiar l'enllaç", "Copy Link": "Copiar l'enllaç", "Copy to clipboard": "Copiar al porta-retalls", - "Copy URL": "", + "Copy URL": "Copiar la URL", "Copying to clipboard was successful!": "La còpia al porta-retalls s'ha realitzat correctament", "CORS must be properly configured by the provider to allow requests from Open WebUI.": "CORS ha de ser configurat correctament pel proveïdor per permetre les sol·licituds d'Open WebUI", "Create": "Crear", @@ -384,14 +384,14 @@ "Create Model": "Crear model", "Create new key": "Crear una nova clau", "Create new secret key": "Crear una nova clau secreta", - "Create note": "", + "Create note": "Crear una nota", "Create Note": "Crea nota", "Create your first note by clicking on the plus button below.": "Crea la teva primera nota prement sobre el botó 'més' inferior", "Created at": "Creat el", "Created At": "Creat el", "Created by": "Creat per", "Created by you": "Creat per tu", - "Created on {{date}}": "", + "Created on {{date}}": "Creat el {{date}}", "CSV Import": "Importar CSV", "Ctrl+Enter to Send": "Ctrl+Enter per enviar", "Current Model": "Model actual", @@ -406,7 +406,7 @@ "Database": "Base de dades", "Datalab Marker API": "API de Datalab Marker", "DD/MM/YYYY": "DD/MM/YYYY", - "DDGS Backend": "", + "DDGS Backend": "Backend DDGS", "December": "Desembre", "Decrease UI Scale": "Disminuir la mida de la interfície gràfica", "Deepgram": "Deepgram", @@ -447,12 +447,12 @@ "delete this link": "Eliminar aquest enllaç", "Delete tool?": "Eliminar eina?", "Delete User": "Eliminar usuari", - "Deleted": "", + "Deleted": "Eliminat", "Deleted {{deleteModelTag}}": "S'ha eliminat {{deleteModelTag}}", "Deleted {{name}}": "S'ha eliminat {{name}}", "Deleted User": "Usuari eliminat", "Deployment names are required for Azure OpenAI": "Els noms de desplegament són requerits per Azure OpenAI", - "Desc": "", + "Desc": "Descendent", "Describe your knowledge base and objectives": "Descriu la teva base de coneixement i objectius", "Description": "Descripció", "Detect Artifacts Automatically": "Detectar automàticament els artefactes", @@ -489,7 +489,7 @@ "Dive into knowledge": "Aprofundir en el coneixement", "Do not install functions from sources you do not fully trust.": "No instal·lis funcions de fonts en què no confiïs plenament.", "Do not install tools from sources you do not fully trust.": "No instal·lis eines de fonts en què no confiïs plenament.", - "Do you want to sync your usage stats with Open WebUI Community?": "", + "Do you want to sync your usage stats with Open WebUI Community?": "Vols sincronitzar les estadístiques d'ús amb la Open WebUI Community?", "Docling": "Docling", "Docling Parameters": "Paràmetres de Docling", "Docling Server URL required.": "La URL del servidor Docling és necessària", @@ -498,7 +498,7 @@ "Document Intelligence endpoint required.": "Es necessita un punt de connexió de Document Intelligence", "Document Intelligence Model": "Model de Document Intelligence", "Documentation": "Documentació", - "Documents": "", + "Documents": "Documents", "does not make any external connections, and your data stays securely on your locally hosted server.": "no realitza connexions externes, i les teves dades romanen segures al teu servidor allotjat localment.", "Domain Filter List": "Llista de filtre de dominis", "don't fetch random pipelines from sources you don't trust.": "No obtinguis pipelines aleatòries de fonts no fiables.", @@ -509,20 +509,20 @@ "Done": "Fet", "Download": "Descarregar", "Download & Delete": "Descarregar i suprimir", - "Download as JSON": "", + "Download as JSON": "Descarregar com a JSON", "Download as SVG": "Descarrega com a SVG", "Download canceled": "Descàrrega cancel·lada", "Download Database": "Descarregar la base de dades", - "Downloading stats...": "", + "Downloading stats...": "Descarregant estadístiques...", "Draw": "Dibuixar", "Drop any files here to upload": "Arrossega aquí qualsevol fitxer per pujar-lo", - "DuckDuckGo": "", + "DuckDuckGo": "DuckDuckGo", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "p. ex. '30s','10m'. Les unitats de temps vàlides són 's', 'm', 'h'.", "e.g. \"json\" or a JSON schema": "p. ex. \"json\" o un esquema JSON", "e.g. 60": "p. ex. 60", "e.g. A filter to remove profanity from text": "p. ex. Un filtre per eliminar paraules malsonants del text", "e.g. about the Roman Empire": "p. ex. sobre l'imperi Romà", - "e.g. alloy, echo, shimmer": "", + "e.g. alloy, echo, shimmer": "p. ex. aliatge, eco, brillantor", "e.g. en": "p. ex. en", "e.g. My Filter": "p. ex. El meu filtre", "e.g. My Tools": "p. ex. Les meves eines", @@ -592,7 +592,7 @@ "Enter Bocha Search API Key": "Introdueix la clau API de Bocha Search", "Enter Brave Search API Key": "Introdueix la clau API de Brave Search", "Enter certificate path": "Introdueix el camí del certificat", - "Enter Chunk Min Size Target": "", + "Enter Chunk Min Size Target": "Introdueix la mida mínima del bloc objectiu", "Enter Chunk Overlap": "Introdueix la mida de solapament de blocs", "Enter Chunk Size": "Introdueix la mida del bloc", "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "Introdueix parelles de \"token:valor de biaix\" separats per comes (exemple: 5432:100, 413:-100)", @@ -616,7 +616,7 @@ "Enter External Web Search URL": "Introdueix la URL d'External Web Search", "Enter Firecrawl API Base URL": "Introdueix la URL base de Firecrawl API", "Enter Firecrawl API Key": "Introdueix la clau API de Firecrawl", - "Enter Firecrawl Timeout": "", + "Enter Firecrawl Timeout": "Introdueix el temps d'espera per a Firecrawl", "Enter folder name": "Introdueix el nom de la carpeta", "Enter function name filter list (e.g. func1, !func2)": "Introdueix la llista de filtres de noms de funció (per exemple, func1, !func2)", "Enter Github Raw URL": "Introdueix la URL en brut de Github", @@ -625,7 +625,7 @@ "Enter hex color (e.g. #FF0000)": "Introdueix el codi hexadecimal del color (p. ex. #FF0000)", "Enter ID": "Introdueix l'ID", "Enter Image Size (e.g. 512x512)": "Introdueix la mida de la imatge (p. ex. 512x512)", - "Enter Jina API Base URL": "", + "Enter Jina API Base URL": "Introdueix la URL base de Jina", "Enter Jina API Key": "Introdueix la clau API de Jina", "Enter JSON config (e.g., {\"disable_links\": true})": "Introdueix la configuració JSON (per exemple, {\"disable_links\": true})", "Enter Jupyter Password": "Introdueix la contrasenya de Jupyter", @@ -634,7 +634,7 @@ "Enter Kagi Search API Key": "Introdueix la clau API de Kagi Search", "Enter Key Behavior": "Introdueix el comportament de clau", "Enter language codes": "Introdueix els codis de llenguatge", - "Enter MinerU API Key": "", + "Enter MinerU API Key": "Introdueix la clau API de MinerU", "Enter Mistral API Base URL": "Entra la URL Base de l'API de Mistral", "Enter Mistral API Key": "Entra la clau API de Mistral", "Enter Model ID": "Introdueix l'identificador del model", @@ -646,7 +646,7 @@ "Enter Ollama Cloud API Key": "Introdueix la clau API de Ollama Cloud", "Enter Perplexity API Key": "Introdueix la clau API de Perplexity", "Enter Perplexity Search API URL": "Introduïu l'URL de l'API de cerca de Perplexity", - "Enter Playwright Timeout": "Introdueix el timeout de Playwright", + "Enter Playwright Timeout": "Introdueix el temps d'espera de Playwright", "Enter Playwright WebSocket URL": "Introdueix la URL de Playwright WebSocket", "Enter proxy URL (e.g. https://user:password@host:port)": "Entra la URL (p. ex. https://user:password@host:port)", "Enter reasoning effort": "Introdueix l'esforç de raonament", @@ -654,7 +654,7 @@ "Enter SearchApi API Key": "Introdueix la clau API SearchApi", "Enter SearchApi Engine": "Introdueix el motor SearchApi", "Enter Searxng Query URL": "Introdueix la URL de consulta de Searxng", - "Enter Searxng search language": "", + "Enter Searxng search language": "Entra la llengua de cerca de Searxng", "Enter Seed": "Introdueix la llavor", "Enter SerpApi API Key": "Introdueix la clau API SerpApi", "Enter SerpApi Engine": "Introdueix el motor API SerpApi", @@ -675,7 +675,7 @@ "Enter the URL of the function to import": "Introdueix la URL de la funció a importar", "Enter the URL to import": "Introdueix la URL a importar", "Enter Tika Server URL": "Introdueix la URL del servidor Tika", - "Enter timeout in seconds": "Entra el temps màxim en segons", + "Enter timeout in seconds": "Entra el temps d'espera en segons", "Enter to Send": "Enter per enviar", "Enter Top K": "Introdueix Top K", "Enter Top K Reranker": "Introdueix el Top K Reranker", @@ -760,10 +760,10 @@ "Failed to generate title": "No s'ha pogut generar el títol", "Failed to import models": "No s'han pogut importar el models", "Failed to load chat preview": "No s'ha pogut carregar la previsualització del xat", - "Failed to load Excel/CSV file. Please try downloading it instead.": "", + "Failed to load Excel/CSV file. Please try downloading it instead.": "No s'ha pogut carregar el fitxer Excel/CSV. Si us plau, prova de descarregar-lo.", "Failed to load file content.": "No s'ha pogut carregar el contingut del fitxer", "Failed to move chat": "No s'ha pogut moure el xat", - "Failed to process URL: {{url}}": "", + "Failed to process URL: {{url}}": "No s'ha pogut processar la URL: {{url}}", "Failed to read clipboard contents": "No s'ha pogut llegir el contingut del porta-retalls", "Failed to remove member": "No s'ha pogut eliminar el membre", "Failed to render diagram": "No s'ha pogut renderitzar el diagrama", @@ -777,7 +777,7 @@ "Features": "Característiques", "Features Permissions": "Permisos de les característiques", "February": "Febrer", - "Feedback": "", + "Feedback": "Retorn", "Feedback deleted successfully": "Retorn eliminat correctament", "Feedback Details": "Detalls del retorn", "Feedback History": "Històric de comentaris", @@ -786,7 +786,7 @@ "File": "Arxiu", "File added successfully.": "L'arxiu s'ha afegit correctament.", "File content updated successfully.": "El contingut de l'arxiu s'ha actualitzat correctament.", - "File Context": "", + "File Context": "Contingut de l'arxiu", "File Mode": "Mode d'arxiu", "File not found.": "No s'ha trobat l'arxiu.", "File removed successfully.": "Arxiu eliminat correctament.", @@ -802,13 +802,13 @@ "Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "S'ha detectat la suplantació d'identitat de l'empremta digital: no es poden utilitzar les inicials com a avatar. S'estableix la imatge de perfil predeterminada.", "Firecrawl API Base URL": "URL de l'API de base de Firecrawl", "Firecrawl API Key": "Clau API de Firecrawl", - "Firecrawl Timeout (s)": "", + "Firecrawl Timeout (s)": "Temps d'espera de Firecrawl (s)", "Floating Quick Actions": "Accions ràpides flotants", "Focus Chat Input": "Posa el focus en l'entrada del xat", "Folder": "Carpeta", "Folder Background Image": "Imatge del fons de la carpeta", "Folder deleted successfully": "Carpeta eliminada correctament", - "Folder Max File Count": "", + "Folder Max File Count": "Nombre màxim d'arxius per carpeta", "Folder Name": "Nom de la carpeta", "Folder name cannot be empty.": "El nom de la carpeta no pot ser buit.", "Folder name updated successfully": "Nom de la carpeta actualitzat correctament", @@ -863,13 +863,13 @@ "Get started with {{WEBUI_NAME}}": "Comença amb {{WEBUI_NAME}}", "Global": "Global", "Good Response": "Bona resposta", - "Google": "", + "Google": "Google", "Google Drive": "Google Drive", "Google PSE API Key": "Clau API PSE de Google", "Google PSE Engine Id": "Identificador del motor PSE de Google", "Gravatar": "Gravatar", - "Grid": "", - "Grokipedia": "", + "Grid": "Graella", + "Grokipedia": "Grokipedia", "Group": "Grup", "Group Channel": "Canal de grup", "Group created successfully": "El grup s'ha creat correctament", @@ -923,7 +923,7 @@ "Image Prompt Generation": "Generació d'indicacions d'imatge", "Image Prompt Generation Prompt": "Indicació per a la generació d'indicacions d'imatge", "Image Size": "Mida de la imatge", - "Images": "", + "Images": "Imatges", "Import": "Importar", "Import Chats": "Importar xats", "Import Config from JSON File": "Importar la configuració des d'un arxiu JSON", @@ -942,7 +942,7 @@ "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "Influeix amb la rapidesa amb què l'algoritme respon als comentaris del text generat. Una taxa d'aprenentatge més baixa donarà lloc a ajustos més lents, mentre que una taxa d'aprenentatge més alta farà que l'algorisme sigui més sensible.", "Info": "Informació", "Initials": "Inicials", - "Inject file content into conversation context": "", + "Inject file content into conversation context": "Injecta el contingut del fitxer en el context de la conversa", "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Injectar tot el contingut com a context per a un processament complet, això es recomana per a consultes complexes.", "Input": "Entrada", "Input Key (e.g. text, unet_name, steps)": "Entra la clau (p. ex. text, unet_name, steps)", @@ -956,7 +956,7 @@ "Integration": "Integració", "Integrations": "Integracions", "Interface": "Interfície", - "Interface Settings Access": "", + "Interface Settings Access": "Accés a la configuració de la interfície", "Invalid file content": "Continguts del fitxer no vàlids", "Invalid file format.": "Format d'arxiu no vàlid.", "Invalid JSON file": "Arxiu JSON no vàlid", @@ -970,7 +970,7 @@ "is typing...": "està escrivint...", "Italic": "Cursiva", "January": "Gener", - "Jina API Base URL": "", + "Jina API Base URL": "URL Base de l'API Jina", "Jina API Key": "Clau API de Jina", "join our Discord for help.": "uneix-te al nostre Discord per obtenir ajuda.", "JSON": "JSON", @@ -995,7 +995,7 @@ "Knowledge created successfully.": "Coneixement creat correctament.", "Knowledge deleted successfully.": "Coneixement eliminat correctament.", "Knowledge Description": "Descripció del coneixement", - "Knowledge exported successfully": "", + "Knowledge exported successfully": "El coneixement s'ha exportat correctament", "Knowledge Name": "Nom del coneixement", "Knowledge Public Sharing": "Compartir públicament el Coneixement", "Knowledge reset successfully.": "Coneixement restablert correctament.", @@ -1022,7 +1022,7 @@ "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "Deixar-ho buit per incloure tots els models del punt de connexió \"{{url}}/api/tags\"", "Leave empty to include all models from \"{{url}}/models\" endpoint": "Deixar-ho buit per incloure tots els models del punt de connexió \"{{url}}/models\"", "Leave empty to include all models or select specific models": "Deixa-ho en blanc per incloure tots els models o selecciona models específics", - "Leave empty to use first admin user": "", + "Leave empty to use first admin user": "Deixa-ho buit per utilitzar el primer usuari administrador", "Leave empty to use the default model (voxtral-mini-latest).": "Deixau-ho en blanc per utilitzar el model per defecte (voxtral-mini-latest).", "Leave empty to use the default prompt, or enter a custom prompt": "Deixa-ho en blanc per utilitzar la indicació predeterminada o introdueix una indicació personalitzada", "Leave model field empty to use the default model.": "Deixa el camp de model buit per utilitzar el model per defecte.", @@ -1031,8 +1031,8 @@ "License": "Llicència", "Lift List": "Aixecar la llista", "Light": "Clar", - "Limit concurrent search queries. 0 = unlimited (default). Set to 1 for sequential execution (recommended for APIs with strict rate limits like Brave free tier).": "", - "List": "", + "Limit concurrent search queries. 0 = unlimited (default). Set to 1 for sequential execution (recommended for APIs with strict rate limits like Brave free tier).": "Limita les consultes de cerca simultànies. 0 = il·limitada (per defecte). Estableix-ho a 1 per a l'execució seqüencial (recomanat per a API amb límits de velocitat estrictes com el nivell gratuït de Brave).", + "List": "Llista", "Listening...": "Escoltant...", "Llama.cpp": "Llama.cpp", "LLMs can make mistakes. Verify important information.": "Els models de llenguatge poden cometre errors. Verifica la informació important.", @@ -1062,12 +1062,12 @@ "Manage your account information.": "Gestionar la informació del teu compte.", "March": "Març", "Markdown": "Markdown", - "Markdown Header Text Splitter": "", + "Markdown Header Text Splitter": "Divisor de text de capçalera de Markdown", "Max Speakers": "Nombre màxim d'altaveus", "Max Upload Count": "Nombre màxim de càrregues", "Max Upload Size": "Mida màxima de càrrega", - "Maximum number of files allowed per folder.": "", - "Maximum number of files per folder is {{max}}.": "", + "Maximum number of files allowed per folder.": "Nombre màxim de fitxers permès per carpeta.", + "Maximum number of files per folder is {{max}}.": "El nombre màxim de fitxers per carpeta és {{max}}.", "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Es poden descarregar un màxim de 3 models simultàniament. Si us plau, prova-ho més tard.", "May": "Maig", "MBR": "MBR", @@ -1077,7 +1077,7 @@ "Member removed successfully": "El membre s'ha eliminat satisfactòriament", "Members": "Membres", "Members added successfully": "Els membres s'han afegit satisfactòriament", - "Memories": "", + "Memories": "Memòries", "Memories accessible by LLMs will be shown here.": "Les memòries accessibles pels models de llenguatge es mostraran aquí.", "Memory": "Memòria", "Memory added successfully": "Memòria afegida correctament", @@ -1087,7 +1087,7 @@ "Merge Responses": "Fusionar les respostes", "Merged Response": "Resposta combinada", "Message": "Missatge", - "Message counts and response timestamps": "", + "Message counts and response timestamps": "Recompte de missatges i marques de temps de resposta", "Message rating should be enabled to use this feature": "La classificació dels missatges s'hauria d'activar per utilitzar aquesta funció", "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Els missatges enviats després de crear el teu enllaç no es compartiran. Els usuaris amb la URL podran veure el xat compartit.", "Microsoft OneDrive": "Microsoft OneDrive", @@ -1120,11 +1120,11 @@ "Model Name": "Nom del model", "Model name already exists, please choose a different one": "Aquest nom de model ja existeix, si us plau, tria'n un altre", "Model Name is required.": "El nom del model és necessari", - "Model names and usage frequency": "", + "Model names and usage frequency": "Noms de models i freqüència d'ús", "Model not selected": "Model no seleccionat", "Model Params": "Paràmetres del model", "Model Permissions": "Permisos dels models", - "Model responses or outputs": "", + "Model responses or outputs": "Respostes o resultats del model", "Model unloaded successfully": "El model s'ha descarregat correctament", "Model updated successfully": "Model actualitzat correctament", "Model(s) do not support file upload": "El model no permet la pujada d'arxius", @@ -1135,7 +1135,7 @@ "Models imported successfully": "Els models s'han importat correctament", "Models Public Sharing": "Compartició pública de models", "Models Sharing": "Compartir els models", - "Mojeek": "", + "Mojeek": "Mojeek", "Mojeek Search API Key": "Clau API de Mojeek Search", "More": "Més", "More Concise": "Més precís", @@ -1145,22 +1145,22 @@ "Name and ID are required, please fill them out": "El nom i l'ID són necessaris, emplena'ls, si us plau", "Name your knowledge base": "Anomena la teva base de coneixement", "Native": "Natiu", - "New": "", + "New": "Nou", "New Button": "Botó nou", "New Chat": "Nou xat", "New Folder": "Nova carpeta", "New Function": "Nova funció", "New Knowledge": "Nou coneixement", "New Model": "Nou model", - "New Note": "", + "New Note": "Nova nota", "New Password": "Nova contrasenya", "New Prompt": "Nova indicació", "New Temporary Chat": "Nou xat temporal", "New Tool": "Nova eina", - "New Webhook": "", + "New Webhook": "Nou webhook", "new-channel": "nou-canal", "Next message": "Missatge següent", - "No activity data": "", + "No activity data": "No hi ha dades d'activitat", "No authentication": "Sense autenticació", "No chats found": "No s'han trobat xats", "No chats found for this user.": "No s'han trobat xats per a aquest usuari.", @@ -1171,14 +1171,14 @@ "No conversation to save": "No hi ha cap conversa a desar", "No distance available": "No hi ha distància disponible", "No expiration can pose security risks.": "No posar expiració pot suposar problemes de seguretat.", - "No feedback found": "", + "No feedback found": "No s'ha trobat cap retorn", "No file selected": "No s'ha escollit cap fitxer", - "No files in this knowledge base.": "", + "No files in this knowledge base.": "No hi ha arxius a la base de coneixement.", "No functions found": "No s'han trobat funcions", "No groups with access, add a group to grant access": "No hi ha cap grup amb accés, afegeix un grup per concedir accés", "No HTML, CSS, or JavaScript content found.": "No s'ha trobat contingut HTML, CSS o JavaScript.", "No inference engine with management support found": "No s'ha trobat un motor d'inferència amb suport de gestió", - "No knowledge bases found.": "", + "No knowledge bases found.": "No s'han trobat bases de coneixement.", "No knowledge found": "No s'ha trobat Coneixement", "No memories to clear": "No hi ha memòries per netejar", "No model IDs": "No hi ha IDs de model", @@ -1186,7 +1186,7 @@ "No models selected": "No s'ha seleccionat cap model", "No Notes": "No hi ha notes", "No notes found": "No s'han trobat notes", - "No one": "", + "No one": "Ningú", "No pinned messages": "No hi ha missatges fixats", "No prompts found": "No s'han trobat indicacions", "No results": "No s'han trobat resultats", @@ -1199,7 +1199,7 @@ "No users were found.": "No s'han trobat usuaris", "No valves": "No hi ha valves", "No valves to update": "No hi ha cap Valve per actualitzar", - "No webhooks yet": "", + "No webhooks yet": "No hi ha webhooks encara", "Node Ids": "Id de nodes", "None": "Cap", "Not factually correct": "No és clarament correcte", @@ -1239,7 +1239,7 @@ "Only invited users can access": "Només hi poden accedir els usuaris convidats", "Only markdown files are allowed": "Només es permeten arxius markdown", "Only select users and groups with permission can access": "Només hi poden accedir usuaris i grups seleccionats amb permís", - "Only sync new/updated chats": "", + "Only sync new/updated chats": "Sincronitza només els xats nous/actualitzats", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Ui! Sembla que la URL no és vàlida. Si us plau, revisa-la i torna-ho a provar.", "Oops! There are files still uploading. Please wait for the upload to complete.": "Ui! Encara hi ha fitxers pujant-se. Si us plau, espera que finalitzi la càrrega.", "Oops! There was an error in the previous response.": "Ui! Hi ha hagut un error a la resposta anterior.", @@ -1256,7 +1256,7 @@ "Open WebUI can use tools provided by any OpenAPI server.": "Open WebUI pot utilitzar eines de servidors OpenAPI.", "Open WebUI uses faster-whisper internally.": "Open WebUI utilitza faster-whisper internament.", "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Open WebUI utilitza incrustacions de SpeechT5 i CMU Arctic.", - "Open WebUI version": "", + "Open WebUI version": "Versió d'Open WebUI", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "La versió d'Open WebUI (v{{OPEN_WEBUI_VERSION}}) és inferior a la versió requerida (v{{REQUIRED_VERSION}})", "OpenAI": "OpenAI", "OpenAI API": "API d'OpenAI", @@ -1281,8 +1281,8 @@ "page": "pàgina", "Paginate": "Paginar", "Parameters": "Paràmetres", - "Parent message not found": "", - "Participate in community leaderboards and evaluations! Syncing aggregated usage stats helps drive research and improvements to Open WebUI. Your privacy is paramount: no message content is ever shared.": "", + "Parent message not found": "No s'ha trobat el missatge pare", + "Participate in community leaderboards and evaluations! Syncing aggregated usage stats helps drive research and improvements to Open WebUI. Your privacy is paramount: no message content is ever shared.": "Participa en les taules de classificació i les avaluacions de la comunitat! La sincronització de les estadístiques d'ús agregades ajuda a impulsar la recerca i les millores a Open WebUI. La teva privadesa és primordial: no es comparteix mai cap contingut de missatge.", "Password": "Contrasenya", "Passwords do not match.": "Les contrasenyes no coincideixen", "Paste Large Text as File": "Enganxa un text llarg com a fitxer", @@ -1308,7 +1308,7 @@ "Pipe": "Canonada", "Pipeline deleted successfully": "Pipeline eliminada correctament", "Pipeline downloaded successfully": "Pipeline descarregada correctament", - "Pipelines": "", + "Pipelines": "Pipelines", "Pipelines are a plugin system with arbitrary code execution —": "Pipelines és un sistema de connectors amb execució arbitrària de codi —", "Pipelines Not Detected": "No s'ha detectat Pipelines", "Pipelines Valves": "Vàlvules de les Pipelines", @@ -1371,8 +1371,8 @@ "Read": "Llegit", "Read Aloud": "Llegir en veu alta", "Read more →": "Llegeix més →", - "Read Only": "", - "Read-Only Access": "", + "Read Only": "Només lectura", + "Read-Only Access": "Accés de només lectura", "Reason": "Raó", "Reasoning Effort": "Esforç de raonament", "Reasoning Tags": "Etiqueta de raonament", @@ -1481,7 +1481,7 @@ "Searching Knowledge for \"{{searchQuery}}\"": "Cercant \"{{searchQuery}}\" al coneixement", "Searching the web": "Cercant la web...", "Searxng Query URL": "URL de consulta de Searxng", - "Searxng search language (all, en, es, de, fr, etc.)": "", + "Searxng search language (all, en, es, de, fr, etc.)": "Idioma de cerca de cerca (all, en, es, de, fr, etc.)", "See readme.md for instructions": "Consulta l'arxiu readme.md per obtenir instruccions", "See what's new": "Veure què hi ha de nou", "Seed": "Llavor", @@ -1546,7 +1546,7 @@ "Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Establir les seqüències d'aturada a utilitzar. Quan es trobi aquest patró, el LLM deixarà de generar text. Es poden establir diversos patrons de parada especificant diversos paràmetres de parada separats en un fitxer model.", "Setting": "Preferència", "Settings": "Preferències", - "Settings Permissions": "", + "Settings Permissions": "Preferències de permisos", "Settings saved successfully!": "Les preferències s'han desat correctament", "Share": "Compartir", "Share Chat": "Compartir el xat", @@ -1557,7 +1557,7 @@ "Show": "Mostrar", "Show \"What's New\" modal on login": "Veure 'Què hi ha de nou' a l'entrada", "Show Admin Details in Account Pending Overlay": "Mostrar els detalls de l'administrador a la superposició del compte pendent", - "Show Files": "", + "Show Files": "Mostra els arxius", "Show Formatting Toolbar": "Mostrar la barra de format", "Show image preview": "Mostrar la previsualització de la imatge", "Show Model": "Mostrar el model", @@ -1582,7 +1582,7 @@ "Sonar Pro": "Sonar Pro", "Sonar Reasoning": "Sonar Reasoning", "Sonar Reasoning Pro": "Sonar Reasoning Pro", - "Sort": "", + "Sort": "Ordenar", "Sougou Search API sID": "sID de l'API de Sougou Search", "Sougou Search API SK": "SK de l'API de Sougou Search", "Source": "Font", @@ -1590,7 +1590,7 @@ "Speech recognition error: {{error}}": "Error de reconeixement de veu: {{error}}", "Speech-to-Text": "Àudio-a-Text", "Speech-to-Text Engine": "Motor de veu a text", - "Split documents by markdown headers before applying character/token splitting.": "", + "Split documents by markdown headers before applying character/token splitting.": "Divideix els documents per capçaleres de markdown abans d'aplicar la divisió de caràcters/tokens.", "Start a new conversation": "Iniciar una nova conversa", "Start of the channel": "Inici del canal", "Start Tag": "Etiqueta d'inici", @@ -1601,7 +1601,7 @@ "STDOUT/STDERR": "STDOUT/STDERR", "Steps": "Passos", "Stop": "Atura", - "Stop Download": "", + "Stop Download": "Aturar la descàrrega", "Stop Generating": "Aturar la generació", "Stop Sequence": "Atura la seqüència", "Stream Chat Response": "Fer streaming de la resposta del xat", @@ -1622,14 +1622,14 @@ "Support": "Dona suport", "Support this plugin:": "Dona suport a aquest complement:", "Supported MIME Types": "Tipus MIME admesos", - "Sync": "", - "Sync Complete!": "", + "Sync": "Sincronitzar", + "Sync Complete!": "Sincronia completada", "Sync directory": "Sincronitzar directori", - "Sync Failed": "", - "Sync Usage Stats": "", - "Syncing stats...": "", - "Syncing...": "", - "Syncs only chats with updates after your last sync timestamp. Disable to re-sync all chats.": "", + "Sync Failed": "La sincronia ha fallat", + "Sync Usage Stats": "Mostra la estadístiques d'ús", + "Syncing stats...": "Sincronitzant les estadístiques...", + "Syncing...": "Sincronitzant", + "Syncs only chats with updates after your last sync timestamp. Disable to re-sync all chats.": "Sincronitza només els xats amb actualitzacions posteriors a la data i hora de l'última sincronització. Desactiva-ho per tornar a sincronitzar tots els xats.", "System": "Sistema", "System Instructions": "Instruccions de sistema", "System Prompt": "Indicació del Sistema", @@ -1674,7 +1674,7 @@ "The Weight of BM25 Hybrid Search. 0 more semantic, 1 more lexical. Default 0.5": "El pes de la cerca híbrida BM25. 0 més semàntic, 1 més lèxic. Per defecte 0,5", "The width in pixels to compress images to. Leave empty for no compression.": "L'amplada en píxels per comprimir imatges. Deixar-ho buit per a cap compressió.", "Theme": "Tema", - "There was an error syncing your stats. Please try again.": "", + "There was an error syncing your stats. Please try again.": "S'ha produït un error en sincronitzar les estadístiques. Torna-ho a provar.", "Thinking...": "Pensant...", "This action cannot be undone. Do you wish to continue?": "Aquesta acció no es pot desfer. Vols continuar?", "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Aquest canal es va crear el dia {{createdAt}}. Aquest és el començament del canal {{channelName}}.", @@ -1703,7 +1703,7 @@ "Tika": "Tika", "Tika Server URL required.": "La URL del servidor Tika és obligatòria.", "Tiktoken": "Tiktoken", - "Timeout": "", + "Timeout": "Temps d'espera", "Title": "Títol", "Title Auto-Generation": "Generació automàtica de títol", "Title cannot be an empty string.": "El títol no pot ser una cadena buida.", @@ -1739,7 +1739,7 @@ "Tools have a function calling system that allows arbitrary code execution.": "Les eines disposen d'un sistema de crida a funcions que permet execució de codi arbitrari.", "Tools Public Sharing": "Compartició pública d'eines", "Tools Sharing": "Compartir les eines", - "Top": "", + "Top": "A dalt", "Top K": "Top K", "Top K Reranker": "Top K Reranker", "Transformers": "Transformadors", @@ -1788,7 +1788,7 @@ "Upload Pipeline": "Pujar una Pipeline", "Upload Progress": "Progrés de càrrega", "Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Progrés de la pujada: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)", - "Uploaded files or images": "", + "Uploaded files or images": "Arxius o imatges pujats", "Uploading file...": "Pujant l'arxiu...", "URL": "URL", "URL is required": "La URL és necessaria", @@ -1806,8 +1806,8 @@ "User Groups": "Grups d'usuari", "User location successfully retrieved.": "Ubicació de l'usuari obtinguda correctament", "User menu": "Menú d'usuari", - "User ratings (thumbs up/down)": "", - "User Status": "", + "User ratings (thumbs up/down)": "Valoracions dels usuaris (polze amunt/avall)", + "User Status": "Estats d'usuari", "User Webhooks": "Webhooks d'usuari", "Username": "Nom d'usuari", "users": "usuaris", @@ -1848,10 +1848,10 @@ "Web Search Engine": "Motor de cerca de la web", "Web Search in Chat": "Cerca a internet al xat", "Web Search Query Generation": "Generació de consultes per a la cerca de la web", - "Webhook Name": "", + "Webhook Name": "Nom del webhook", "Webhook URL": "URL del webhook", - "Webhooks": "", - "Webpage URLs": "", + "Webhooks": "Webhooks", + "Webpage URLs": "URLs de la pàgina", "WebUI Settings": "Preferències de WebUI", "WebUI URL": "URL de WebUI", "WebUI will make requests to \"{{url}}\"": "WebUI farà peticions a \"{{url}}\"", @@ -1859,19 +1859,19 @@ "WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI farà peticions a \"{{url}}/chat/completions\"", "What are you trying to achieve?": "Què intentes aconseguir?", "What are you working on?": "En què estàs treballant?", - "What is NOT shared:": "", - "What is shared:": "", + "What is NOT shared:": "Què no es comparteix", + "What is shared:": "Què es comparteix", "What's New in": "Què hi ha de nou a", "What's on your mind?": "Què tens en ment?", "When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "Quan està activat, el model respondrà a cada missatge de xat en temps real, generant una resposta tan bon punt l'usuari envia un missatge. Aquest mode és útil per a aplicacions de xat en directe, però pot afectar el rendiment en maquinari més lent.", "wherever you are": "allà on estiguis", "Whether to paginate the output. Each page will be separated by a horizontal rule and page number. Defaults to False.": "Si es pagina la sortida. Cada pàgina estarà separada per una regla horitzontal i un número de pàgina. Per defecte és Fals.", "Whisper (Local)": "Whisper (local)", - "Who can share to this group": "", + "Who can share to this group": "Qui pot compartir amb aquest grup", "Why?": "Per què?", "Widescreen Mode": "Mode de pantalla ampla", "Width": "amplada", - "Wikipedia": "", + "Wikipedia": "Wikipedia", "Won": "Ha guanyat", "Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "Funciona juntament amb top-k. Un valor més alt (p. ex., 0,95) donarà lloc a un text més divers, mentre que un valor més baix (p. ex., 0,5) generarà un text més concentrat i conservador.", "Workspace": "Espai de treball", @@ -1883,8 +1883,8 @@ "Yacy Instance URL": "URL de la instància de Yacy", "Yacy Password": "Contrasenya de Yacy", "Yacy Username": "Nom d'usuari de Yacy", - "Yahoo": "", - "Yandex": "", + "Yahoo": "Yahoo", + "Yandex": "Yandex", "Yesterday": "Ahir", "Yesterday at {{LOCALIZED_TIME}}": "Ahir a les {{LOCALIZED_TIME}}", "You": "Tu", @@ -1892,12 +1892,12 @@ "You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Només pots xatejar amb un màxim de {{maxCount}} fitxers alhora.", "You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Pots personalitzar les teves interaccions amb els models de llenguatge afegint memòries mitjançant el botó 'Gestiona' que hi ha a continuació, fent-les més útils i adaptades a tu.", "You cannot upload an empty file.": "No es pot pujar un arxiu buit.", - "You do not have permission to edit this model": "", - "You do not have permission to edit this prompt.": "", - "You do not have permission to save this prompt.": "", + "You do not have permission to edit this model": "No tens permís per editar aquest model", + "You do not have permission to edit this prompt.": "No tens permís per editar aquesta indicació", + "You do not have permission to save this prompt.": "No tens permís per desar aquesta indicació", "You do not have permission to send messages in this channel.": "No tens permís per enviar missatges en aquest canal.", "You do not have permission to send messages in this thread.": "No tens permís per enviar missatges en aquest fil.", - "You do not have permission to upload files to this knowledge base.": "", + "You do not have permission to upload files to this knowledge base.": "No tens permís per carregar fitxers a aquesta base de coneixements.", "You do not have permission to upload files.": "No tens permisos per pujar arxius.", "You have no archived conversations.": "No tens converses arxivades.", "You have shared this chat": "Has compartit aquest xat", @@ -1906,8 +1906,8 @@ "Your Account": "El teu compte", "Your account status is currently pending activation.": "El compte està actualment pendent d'activació", "Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "Tota la teva contribució anirà directament al desenvolupador del complement; Open WebUI no se'n queda cap percentatge. Tanmateix, la plataforma de finançament escollida pot tenir les seves pròpies comissions.", - "Your message text or inputs": "", - "Your usage stats have been successfully synced.": "", + "Your message text or inputs": "El text o les entrades del teu missatge", + "Your usage stats have been successfully synced.": "Les teves estadístiques d'ús s'han sincronitzat correctament.", "YouTube": "Youtube", "Youtube Language": "Idioma de YouTube", "Youtube Proxy URL": "URL de Proxy de Youtube" From 24044b42ea97f8fd855472b2c0abc497a813843b Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:35:38 +0100 Subject: [PATCH 010/311] fix(db): release connection before LLM call in Ollama /v1/chat/completions (#20569) Remove Depends(get_session) from the /v1/chat/completions endpoint to prevent database connections from being held during the entire duration of LLM calls. Previously, the database session was acquired at request start and held until the streaming response completed. Under concurrent load, this exhausted the connection pool, causing QueuePool timeout errors. The fix allows Models.get_model_by_id() and has_access() to manage their own short-lived sessions internally, releasing the connection immediately after authorization checks complete. --- backend/open_webui/routers/ollama.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/routers/ollama.py b/backend/open_webui/routers/ollama.py index b269aa329a..9cfff0c9de 100644 --- a/backend/open_webui/routers/ollama.py +++ b/backend/open_webui/routers/ollama.py @@ -1464,8 +1464,11 @@ async def generate_openai_chat_completion( form_data: dict, url_idx: Optional[int] = None, user=Depends(get_verified_user), - db: Session = Depends(get_session), ): + # NOTE: We intentionally do NOT use Depends(get_session) here. + # Database operations (get_model_by_id, has_access) manage their own short-lived sessions. + # This prevents holding a connection during the entire LLM call (30-60+ seconds), + # which would exhaust the connection pool under concurrent load. metadata = form_data.pop("metadata", None) try: @@ -1485,7 +1488,7 @@ async def generate_openai_chat_completion( if ":" not in model_id: model_id = f"{model_id}:latest" - model_info = Models.get_model_by_id(model_id, db=db) + model_info = Models.get_model_by_id(model_id) if model_info: if model_info.base_model_id: payload["model"] = model_info.base_model_id @@ -1506,7 +1509,6 @@ async def generate_openai_chat_completion( user.id, type="read", access_control=model_info.access_control, - db=db, ) ): raise HTTPException( From 9e596f861651766a1b7d043bb4a989d0dba61bc5 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:35:46 +0100 Subject: [PATCH 011/311] fix(db): release connection before LLM call in Ollama /v1/completions (#20570) Remove Depends(get_session) from the /v1/completions endpoint to prevent database connections from being held during the entire duration of LLM calls. Previously, the database session was acquired at request start and held until the response completed. Under concurrent load, this exhausted the connection pool, causing QueuePool timeout errors. The fix allows Models.get_model_by_id() and has_access() to manage their own short-lived sessions internally, releasing the connection immediately after authorization checks complete. --- backend/open_webui/routers/ollama.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/routers/ollama.py b/backend/open_webui/routers/ollama.py index 9cfff0c9de..cfbdbcac08 100644 --- a/backend/open_webui/routers/ollama.py +++ b/backend/open_webui/routers/ollama.py @@ -1381,8 +1381,11 @@ async def generate_openai_completion( form_data: dict, url_idx: Optional[int] = None, user=Depends(get_verified_user), - db: Session = Depends(get_session), ): + # NOTE: We intentionally do NOT use Depends(get_session) here. + # Database operations (get_model_by_id, has_access) manage their own short-lived sessions. + # This prevents holding a connection during the entire LLM call (30-60+ seconds), + # which would exhaust the connection pool under concurrent load. metadata = form_data.pop("metadata", None) try: @@ -1402,7 +1405,7 @@ async def generate_openai_completion( if ":" not in model_id: model_id = f"{model_id}:latest" - model_info = Models.get_model_by_id(model_id, db=db) + model_info = Models.get_model_by_id(model_id) if model_info: if model_info.base_model_id: payload["model"] = model_info.base_model_id @@ -1419,7 +1422,6 @@ async def generate_openai_completion( user.id, type="read", access_control=model_info.access_control, - db=db, ) ): raise HTTPException( From 1cb751d18463cb41dec3769f43b8819c135b07d9 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:36:36 +0100 Subject: [PATCH 012/311] fix(db): release connection before embedding in knowledge /{id}/update (#20574) Remove Depends(get_session) from POST /{id}/update endpoint to prevent database connections from being held during embedding API calls (1-5+ seconds). All database operations (get_knowledge_by_id, has_access, has_permission, update_knowledge_by_id, get_file_metadatas_by_id) manage their own short-lived sessions internally, releasing connections before and after the slow embed_knowledge_base_metadata() call. --- backend/open_webui/routers/knowledge.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/backend/open_webui/routers/knowledge.py b/backend/open_webui/routers/knowledge.py index c38c5e0bdf..65836a8d16 100644 --- a/backend/open_webui/routers/knowledge.py +++ b/backend/open_webui/routers/knowledge.py @@ -419,9 +419,12 @@ async def update_knowledge_by_id( id: str, form_data: KnowledgeForm, user=Depends(get_verified_user), - db: Session = Depends(get_session), ): - knowledge = Knowledges.get_knowledge_by_id(id=id, db=db) + # NOTE: We intentionally do NOT use Depends(get_session) here. + # Database operations manage their own short-lived sessions internally. + # This prevents holding a connection during embed_knowledge_base_metadata() + # which makes external embedding API calls (1-5+ seconds). + knowledge = Knowledges.get_knowledge_by_id(id=id) if not knowledge: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, @@ -430,7 +433,7 @@ async def update_knowledge_by_id( # Is the user the original creator, in a group with write access, or an admin if ( knowledge.user_id != user.id - and not has_access(user.id, "write", knowledge.access_control, db=db) + and not has_access(user.id, "write", knowledge.access_control) and user.role != "admin" ): raise HTTPException( @@ -446,12 +449,11 @@ async def update_knowledge_by_id( user.id, "sharing.public_knowledge", request.app.state.config.USER_PERMISSIONS, - db=db, ) ): form_data.access_control = {} - knowledge = Knowledges.update_knowledge_by_id(id=id, form_data=form_data, db=db) + knowledge = Knowledges.update_knowledge_by_id(id=id, form_data=form_data) if knowledge: # Re-embed knowledge base for semantic search await embed_knowledge_base_metadata( @@ -462,7 +464,7 @@ async def update_knowledge_by_id( ) return KnowledgeFilesResponse( **knowledge.model_dump(), - files=Knowledges.get_file_metadatas_by_id(knowledge.id, db=db), + files=Knowledges.get_file_metadatas_by_id(knowledge.id), ) else: raise HTTPException( From 33e8a098809860c9f663d7729155686b1788ddaf Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:37:05 +0100 Subject: [PATCH 013/311] fix(db): release connection before embedding in knowledge /create (#20575) Remove Depends(get_session) from POST /create endpoint to prevent database connections from being held during embedding API calls (1-5+ seconds). The has_permission() and Knowledges.insert_new_knowledge() functions manage their own short-lived sessions internally, releasing connections before the slow embed_knowledge_base_metadata() call begins. --- backend/open_webui/routers/knowledge.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/backend/open_webui/routers/knowledge.py b/backend/open_webui/routers/knowledge.py index 65836a8d16..96136d6898 100644 --- a/backend/open_webui/routers/knowledge.py +++ b/backend/open_webui/routers/knowledge.py @@ -227,10 +227,13 @@ async def create_new_knowledge( request: Request, form_data: KnowledgeForm, user=Depends(get_verified_user), - db: Session = Depends(get_session), ): + # NOTE: We intentionally do NOT use Depends(get_session) here. + # Database operations (has_permission, insert_new_knowledge) manage their own sessions. + # This prevents holding a connection during embed_knowledge_base_metadata() + # which makes external embedding API calls (1-5+ seconds). if user.role != "admin" and not has_permission( - user.id, "workspace.knowledge", request.app.state.config.USER_PERMISSIONS, db=db + user.id, "workspace.knowledge", request.app.state.config.USER_PERMISSIONS ): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, @@ -245,12 +248,11 @@ async def create_new_knowledge( user.id, "sharing.public_knowledge", request.app.state.config.USER_PERMISSIONS, - db=db, ) ): form_data.access_control = {} - knowledge = Knowledges.insert_new_knowledge(user.id, form_data, db=db) + knowledge = Knowledges.insert_new_knowledge(user.id, form_data) if knowledge: # Embed knowledge base for semantic search From 1dc353433a9f9a0ce945f1cc0e4db708da6f208e Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:37:47 +0100 Subject: [PATCH 014/311] fix(db): release connection before embedding in memory /query (#20579) Remove Depends(get_session) from POST /query endpoint to prevent database connections from being held during embedding API calls (1-5+ seconds). The Memories.get_memories_by_user_id() function manages its own short-lived session internally, releasing the connection before the slow EMBEDDING_FUNCTION() call begins. --- backend/open_webui/routers/memories.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/routers/memories.py b/backend/open_webui/routers/memories.py index 96b4716987..e8546b9efd 100644 --- a/backend/open_webui/routers/memories.py +++ b/backend/open_webui/routers/memories.py @@ -122,8 +122,11 @@ async def query_memory( request: Request, form_data: QueryMemoryForm, user=Depends(get_verified_user), - db: Session = Depends(get_session), ): + # NOTE: We intentionally do NOT use Depends(get_session) here. + # Database operations (get_memories_by_user_id) manage their own short-lived sessions. + # This prevents holding a connection during EMBEDDING_FUNCTION() + # which makes external embedding API calls (1-5+ seconds). if not request.app.state.config.ENABLE_MEMORIES: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, @@ -138,7 +141,7 @@ async def query_memory( detail=ERROR_MESSAGES.ACCESS_PROHIBITED, ) - memories = Memories.get_memories_by_user_id(user.id, db=db) + memories = Memories.get_memories_by_user_id(user.id) if not memories: raise HTTPException(status_code=404, detail="No memories found for user") From 0fb4cceec1a3d3525f284ebf92fc157e26874dcf Mon Sep 17 00:00:00 2001 From: _00_ <131402327+rgaricano@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:39:52 +0100 Subject: [PATCH 015/311] UPD: i18n: Spanish es-ES Translation v0.7.0 (#20564) ### UPD: i18n: Spanish es-ES Translation v0.7.0 - Added new strings --- src/lib/i18n/locales/es-ES/translation.json | 174 ++++++++++---------- 1 file changed, 87 insertions(+), 87 deletions(-) diff --git a/src/lib/i18n/locales/es-ES/translation.json b/src/lib/i18n/locales/es-ES/translation.json index afa86a5680..6715d681e9 100644 --- a/src/lib/i18n/locales/es-ES/translation.json +++ b/src/lib/i18n/locales/es-ES/translation.json @@ -47,7 +47,7 @@ "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Activar este comando escribiendo \"/{{COMMAND}}\" en el chat", "Active": "Activo", "Active Users": "Usuarios activos", - "Activity": "", + "Activity": "Actividad", "Add": "Añadir", "Add a model ID": "Añadir un ID de modelo", "Add a short description about what this model does": "Añadir una breve descripción sobre lo que hace este modelo", @@ -78,7 +78,7 @@ "Adjusting these settings will apply changes universally to all users.": "El ajuste de estas opciones se aplicará globalmente a todos los usuarios.", "admin": "admin", "Admin": "Admin", - "Admin Contact Email": "", + "Admin Contact Email": "Email de Contacto del Admin", "Admin Panel": "Administración", "Admin Settings": "Ajustes de Admin", "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Los administradores tienen acceso a todas las herramientas en todo momento; los usuarios necesitan que los modelos tengan asignadas las herramientas en el area de trabajo.", @@ -131,7 +131,7 @@ "and {{COUNT}} more": "y {{COUNT}} más", "and create a new shared link.": "y crear un nuevo enlace compartido.", "Android": "Android", - "Anyone": "", + "Anyone": "Cualquiera", "API Base URL": "URL Base API", "API Base URL for Datalab Marker service. Defaults to: https://www.datalab.to/api/v1/marker": "URL Base API para Datalab Marker service. La Predeterminada es: https://www.datalab.to/api/v1/marker", "API Key": "Clave API ", @@ -177,7 +177,7 @@ "Authenticate": "Autentificar", "Authentication": "Autenticación", "Auto": "Auto", - "Auto (Random)": "", + "Auto (Random)": "Auto (Aleatorio)", "Auto-Copy Response to Clipboard": "AutoCopiado de respuesta al Portapapeles", "Auto-playback response": "Reproducir Respuesta automáticamente", "Autocomplete Generation": "Generación de Autocompletado", @@ -186,7 +186,7 @@ "AUTOMATIC1111 Api Auth String": "Auth API para AUTOMATIC1111", "AUTOMATIC1111 Base URL": "URL Base de AUTOMATIC1111", "AUTOMATIC1111 Base URL is required.": "la URL Base de AUTOMATIC1111 es necesaria.", - "Automatically inject system tools in native function calling mode (e.g., timestamps, memory, chat history, notes, etc.)": "", + "Automatically inject system tools in native function calling mode (e.g., timestamps, memory, chat history, notes, etc.)": "Inyectar automáticamente herramientas del sistema en el modo de llamada de función nativa (ej.: marcas de tiempo, memoria, historial de chat, notas, etc.)", "Available list": "Lista disponible", "Available Tools": "Herramientas Disponibles", "available users": "usuarios disponibles", @@ -205,7 +205,7 @@ "before": "antes", "Being lazy": "Ser perezoso", "Beta": "Beta", - "Bing": "", + "Bing": "Bing", "Bing Search V7 Endpoint": "Endpoint de Bing Search V7", "Bing Search V7 Subscription Key": "Clave de Suscripción de Bing Search V7", "Bio": "Bio", @@ -214,14 +214,14 @@ "Bocha Search API Key": "Clave API de Bocha Search", "Bold": "Negrita", "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Impulsando o penalizando tokens específicos para respuestas restringidas. Los valores de sesgo se limitarán entre -100 y 100 (inclusive). (Por defecto: ninguno)", - "Brave": "", + "Brave": "Brave", "Brave Search API Key": "Clave API de Brave Search", - "Builtin Tools": "", + "Builtin Tools": "Herramientas Integradas", "Bullet List": "Lista de Viñetas", "Button ID": "ID del Botón", "Button Label": "Etiqueta del Botón", "Button Prompt": "Indicador del Botón", - "by {{name}}": "", + "by {{name}}": "por {{name}}", "By {{name}}": "Por {{name}}", "Bypass Embedding and Retrieval": "Desactivar Incrustración y Recuperación", "Bypass Web Loader": "Desactivar Cargar de Web", @@ -264,10 +264,10 @@ "Check for updates": "Buscar actualizaciones", "Checking for updates...": "Buscando actualizaciones...", "Choose a model before saving...": "Escoge un modelo antes de guardar...", - "Chunk Min Size Target": "", + "Chunk Min Size Target": "Tamaño Mínimo del Fragmento", "Chunk Overlap": "Superposición de Fragmentos", "Chunk Size": "Tamaño de los Fragmentos", - "Chunks smaller than this threshold will be merged with neighboring chunks when possible. Set to 0 to disable merging.": "", + "Chunks smaller than this threshold will be merged with neighboring chunks when possible. Set to 0 to disable merging.": "Los fragmentos menores a este umbral se fusionarán con los fragmentos vecinos cuando sea posible. Establézcalo en 0 para deshabilitar la fusión.", "Ciphers": "Cifrado", "Citation": "Cita", "Citations": "Citas", @@ -302,8 +302,8 @@ "CMU ARCTIC speaker embedding name": "Nombre de incrustación CMU ARCTIC del interlocutor", "Code Block": "Bloque de Código", "Code Editor": "Editor de Código", - "Code execution": "Ejecución de Código", - "Code Execution": "", + "Code execution": "Ejecución de código", + "Code Execution": "Ejecución de Código", "Code Execution Engine": "Motor de Ejecución de Código", "Code Execution Timeout": "Tiempo límite de espera para Ejecución de Código", "Code formatted successfully": "El codigo se ha formateado correctamente.", @@ -346,7 +346,7 @@ "Contact Admin for WebUI Access": "Contacta con Admin para obtener acceso a WebUI", "Content": "Contenido", "Content Extraction Engine": "Motor para la Extracción de Contenido", - "Content lengths (character counts only)": "", + "Content lengths (character counts only)": "Longitud del contenido (solo recuento de caracteres)", "Continue Response": "Continuar Respuesta", "Continue with {{provider}}": "Continuar con {{provider}}", "Continue with Email": "Continuar con Email", @@ -367,7 +367,7 @@ "Copy link": "Copiar Enlace", "Copy Link": "Copiar enlace", "Copy to clipboard": "Copia a portapapeles", - "Copy URL": "", + "Copy URL": "Copiar URL", "Copying to clipboard was successful!": "¡La copia al portapapeles se ha realizado correctamente!", "CORS must be properly configured by the provider to allow requests from Open WebUI.": "El protocolo CORS debe estar configurado correctamente por el proveedor para permitir solicitudes desde Open WebUI.", "Create": "Crear", @@ -391,7 +391,7 @@ "Created At": "Creado En", "Created by": "Creado por", "Created by you": "Creado por tí", - "Created on {{date}}": "", + "Created on {{date}}": "Creado el {{date}}", "CSV Import": "Importar CSV", "Ctrl+Enter to Send": "'Ctrl+Enter' para Enviar", "Current Model": "Modelo Actual", @@ -406,7 +406,7 @@ "Database": "Base de datos", "Datalab Marker API": "API de Datalab Marker", "DD/MM/YYYY": "DD/MM/YYYY", - "DDGS Backend": "", + "DDGS Backend": "DDGS Backend", "December": "Diciembre", "Decrease UI Scale": "Reducir la Escala de la IU", "Deepgram": "Deepgram", @@ -447,7 +447,7 @@ "delete this link": "Borrar este enlace", "Delete tool?": "¿Borrar la herramienta?", "Delete User": "Borrar Usuario", - "Deleted": "", + "Deleted": "Borrado", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} Borrado", "Deleted {{name}}": "{{nombre}} Borrado", "Deleted User": "Usuario Borrado", @@ -489,7 +489,7 @@ "Dive into knowledge": "Sumérgete en el conocimiento", "Do not install functions from sources you do not fully trust.": "¡No instalar funciones de fuentes en las que que no se confíe totalmente!", "Do not install tools from sources you do not fully trust.": "¡No instalar herramientas de fuentes en las que no se confíe totalmente!", - "Do you want to sync your usage stats with Open WebUI Community?": "", + "Do you want to sync your usage stats with Open WebUI Community?": "¿Quieres sincronizar tus estadísticas de uso con Open WebUI Community?", "Docling": "Docling", "Docling Parameters": "Parámetros de Docling", "Docling Server URL required.": "Docling URL del servidor necesaria.", @@ -498,7 +498,7 @@ "Document Intelligence endpoint required.": "Endpoint Azure Doc Intelligence requerido", "Document Intelligence Model": "Modelo para Doc Intelligence", "Documentation": "Documentación", - "Documents": "", + "Documents": "Documentos", "does not make any external connections, and your data stays securely on your locally hosted server.": "no se realiza ninguna conexión externa y tus datos permanecen seguros alojados localmente en tu servidor.", "Domain Filter List": "Lista de Filtrado de Dominio", "don't fetch random pipelines from sources you don't trust.": "No obtengas pipelines aleatorias de fuentes no confiables.", @@ -509,20 +509,20 @@ "Done": "Hecho", "Download": "Descargar", "Download & Delete": "Descargar y eliminar", - "Download as JSON": "", + "Download as JSON": "Descargar como JSON", "Download as SVG": "Descargar como SVG", "Download canceled": "Descarga cancelada", "Download Database": "Descargar Base de Datos", - "Downloading stats...": "", + "Downloading stats...": "Descargando estadísticas...", "Draw": "Dibujar", "Drop any files here to upload": "Arrastra aquí los archivos a subir.", - "DuckDuckGo": "", + "DuckDuckGo": "DuckDuckGo", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "p.ej. '30s','10m'. Unidades de tiempo válidas son 's', 'm', 'h'.", "e.g. \"json\" or a JSON schema": "p.ej. \"json\" o un esquema JSON", "e.g. 60": "p.ej. 60", "e.g. A filter to remove profanity from text": "p.ej. Un filtro para eliminar malas palabras del texto", "e.g. about the Roman Empire": "p.ej. sobre el imperio romano", - "e.g. alloy, echo, shimmer": "", + "e.g. alloy, echo, shimmer": "p.ej. aleación, eco, brillo", "e.g. en": "p.ej. es", "e.g. My Filter": "p.ej. Mi Filtro", "e.g. My Tools": "p.ej. Mis Herramientas", @@ -592,7 +592,7 @@ "Enter Bocha Search API Key": "Ingresar la Clave API de Bocha Search", "Enter Brave Search API Key": "Ingresar la Clave API de Brave Search", "Enter certificate path": "Ingresar la ruta del certificado", - "Enter Chunk Min Size Target": "", + "Enter Chunk Min Size Target": "Introduce el Tamaño Mínimo de Fragmento", "Enter Chunk Overlap": "Ingresar Superposición de los Fragmentos", "Enter Chunk Size": "Ingresar el Tamaño del Fragmento", "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "Ingresar pares \"token:valor_sesgo\" separados por comas (ejemplo: 5432:100, 413:-100)", @@ -616,7 +616,7 @@ "Enter External Web Search URL": "Ingresar URL del Buscador Web Externo", "Enter Firecrawl API Base URL": "Ingresar URL Base del API de Firecrawl", "Enter Firecrawl API Key": "Ingresar Clave del API de Firecrawl", - "Enter Firecrawl Timeout": "", + "Enter Firecrawl Timeout": "Ingresar Timeout para Firecrawl", "Enter folder name": "Ingresar nombre de la carpeta", "Enter function name filter list (e.g. func1, !func2)": "Ingresar lista para el filtro de nombres de función (p.ej.: func1, !func2)", "Enter Github Raw URL": "Ingresar URL Github en Bruto(raw)", @@ -625,7 +625,7 @@ "Enter hex color (e.g. #FF0000)": "Ingresa color hex (ej. #FF0000)", "Enter ID": "Ingresar ID", "Enter Image Size (e.g. 512x512)": "Ingresar Tamaño de Imagen (p.ej. 512x512)", - "Enter Jina API Base URL": "", + "Enter Jina API Base URL": "Ingresar URL Base de la API de Jina", "Enter Jina API Key": "Ingresar Clave API de Jina", "Enter JSON config (e.g., {\"disable_links\": true})": "Ingresar config JSON (ej., {\"disable_links\": true})", "Enter Jupyter Password": "Ingresar Contraseña de Jupyter", @@ -634,7 +634,7 @@ "Enter Kagi Search API Key": "Ingresar Clave API de Kagi Search", "Enter Key Behavior": "Comportamiento de la Tecla de Envío", "Enter language codes": "Ingresar Códigos de Idioma", - "Enter MinerU API Key": "", + "Enter MinerU API Key": "Ingresar Clave API de MinerU", "Enter Mistral API Base URL": "Ingresar la URL Base de la API de Mistral", "Enter Mistral API Key": "Ingresar Clave API de Mistral", "Enter Model ID": "Ingresar ID del Modelo", @@ -760,7 +760,7 @@ "Failed to generate title": "Fallo al generar el título", "Failed to import models": "Fallo al importar modelos", "Failed to load chat preview": "Fallo al cargar la previsualización del chat", - "Failed to load Excel/CSV file. Please try downloading it instead.": "", + "Failed to load Excel/CSV file. Please try downloading it instead.": "Fallo al cargar el archivo Excel/CSV. Por favor, en su lugar intente descargarlo.", "Failed to load file content.": "Fallo al cargar el contenido del archivo", "Failed to move chat": "Fallo al mover el chat", "Failed to process URL: {{url}}": "Fallo al procesar la URL", @@ -777,7 +777,7 @@ "Features": "Características", "Features Permissions": "Permisos de las Características", "February": "Febrero", - "Feedback": "", + "Feedback": "Opinión", "Feedback deleted successfully": "Opinión eliminada correctamente", "Feedback Details": "Detalle de la Opinión", "Feedback History": "Historia de la Opiniones", @@ -786,7 +786,7 @@ "File": "Archivo", "File added successfully.": "Archivo añadido correctamente.", "File content updated successfully.": "Contenido del archivo actualizado correctamente.", - "File Context": "", + "File Context": "Contexto del Archivo", "File Mode": "Modo de Archivo", "File not found.": "Archivo no encontrado.", "File removed successfully.": "Archivo eliminado correctamente.", @@ -802,13 +802,13 @@ "Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Se detectó suplantación de huellas: No se pueden usar las iniciales como avatar. Se establece la imagen de perfil predeterminada.", "Firecrawl API Base URL": "URL Base de API de Firecrawl", "Firecrawl API Key": "Clave de API de Firecrawl", - "Firecrawl Timeout (s)": "", + "Firecrawl Timeout (s)": "Timeout (s) para Firecrawl", "Floating Quick Actions": "Acciones Rápidas Flotantes", "Focus Chat Input": "Enfocar a la Entrada del Chat", "Folder": "Carpeta", "Folder Background Image": "Imagen de Fondo de la Carpeta", "Folder deleted successfully": "Carpeta eliminada correctamente", - "Folder Max File Count": "", + "Folder Max File Count": "Máximo Número de Ficheros en Carpeta", "Folder Name": "Nombre de la Carpeta", "Folder name cannot be empty.": "El nombre de la carpeta no puede estar vacío", "Folder name updated successfully": "Nombre de la carpeta actualizado correctamente", @@ -863,13 +863,13 @@ "Get started with {{WEBUI_NAME}}": "Empezar con {{WEBUI_NAME}}", "Global": "Global", "Good Response": "Buena Respuesta", - "Google": "", + "Google": "Google", "Google Drive": "Google Drive", "Google PSE API Key": "Clave API de Google PSE", "Google PSE Engine Id": "ID del Motor PSE de Google", "Gravatar": "Gravatar", "Grid": "Cuadrícula", - "Grokipedia": "", + "Grokipedia": "Grokipedia", "Group": "Grupo", "Group Channel": "Canal de Grupo", "Group created successfully": "Grupo creado correctamente", @@ -923,7 +923,7 @@ "Image Prompt Generation": "Indicador para Generación de Imagen", "Image Prompt Generation Prompt": "Indicador para la Generación del Indicador de Imagen", "Image Size": "Tamaño de la Imagen", - "Images": "", + "Images": "Imágenes", "Import": "Importar", "Import Chats": "Importar Chats", "Import Config from JSON File": "Importar Config desde Archivo JSON", @@ -942,7 +942,7 @@ "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "Influye en la rápidez de respuesta a la realimentación desde el texto generado. Una tasa de aprendizaje más baja resulta en un ajustado más lento, mientras que una tasa de aprendizaje más alta hará que el algoritmo sea más reactivo.", "Info": "Información", "Initials": "Iniciales", - "Inject file content into conversation context": "", + "Inject file content into conversation context": "Inyectar el contenido del archivo en el contexto de la conversación", "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Inyecta el contenido completo como contexto para un procesado comprensivo, recomendado para consultas complejas.", "Input": "Entrada", "Input Key (e.g. text, unet_name, steps)": "Ingresa Clave (ej. text, unet_name. steps)", @@ -956,7 +956,7 @@ "Integration": "Integración", "Integrations": "Integraciones", "Interface": "Interfaz", - "Interface Settings Access": "", + "Interface Settings Access": "Configuración de Acceso al Interfaz", "Invalid file content": "Contenido de archivo inválido", "Invalid file format.": "Formato de archivo inválido.", "Invalid JSON file": "Archivo JSON inválido", @@ -970,7 +970,7 @@ "is typing...": "está escribiendo...", "Italic": "Cursiva", "January": "Enero", - "Jina API Base URL": "", + "Jina API Base URL": "URL Base de la API de Jina", "Jina API Key": "Clave API de Jina", "join our Discord for help.": "unete a nuestro Discord para ayuda.", "JSON": "JSON", @@ -995,7 +995,7 @@ "Knowledge created successfully.": "Conocimiento creado correctamente.", "Knowledge deleted successfully.": "Conocimiento eliminado correctamente.", "Knowledge Description": "Descripción del Conocimiento", - "Knowledge exported successfully": "", + "Knowledge exported successfully": "Conocimiento exportado correctamente", "Knowledge Name": "Nombre del Conocimiento", "Knowledge Public Sharing": "Compartir Conocimiento Públicamente", "Knowledge reset successfully.": "Conocimiento restablecido correctamente.", @@ -1022,7 +1022,7 @@ "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "Dejar vacío para incluir todos los modelos desde el endpoint \"{{url}}/api/tags\"", "Leave empty to include all models from \"{{url}}/models\" endpoint": "Dejar vacío para incluir todos los modelos desde el endpoint \"{{url}}/models\"", "Leave empty to include all models or select specific models": "Dejar vacío para incluir todos los modelos o Seleccionar modelos específicos", - "Leave empty to use first admin user": "", + "Leave empty to use first admin user": "Dejar vacío para utilizar el primer usuario administrador", "Leave empty to use the default model (voxtral-mini-latest).": "Dejar vacío para usar el modo predeterminado (voxtral-mini-latest).", "Leave empty to use the default prompt, or enter a custom prompt": "Dejar vacío para usar el indicador predeterminado, o Ingresar un indicador personalizado", "Leave model field empty to use the default model.": "Dejar vacío el campo modelo para usar el modelo predeterminado.", @@ -1062,12 +1062,12 @@ "Manage your account information.": "Gestionar la información de tu cuenta", "March": "Marzo", "Markdown": "Markdown", - "Markdown Header Text Splitter": "", + "Markdown Header Text Splitter": "Divisor de Texto Encabezado de Markdown", "Max Speakers": "Max Interlocutores", "Max Upload Count": "Número Max de Subidas", "Max Upload Size": "Tamaño Max de Subidas", - "Maximum number of files allowed per folder.": "", - "Maximum number of files per folder is {{max}}.": "", + "Maximum number of files allowed per folder.": "Número máximo de archivos permitidos por carpeta", + "Maximum number of files per folder is {{max}}.": "El número máximo de archivos permitidos por carpeta es {{max}}.", "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Se puede descargar un máximo de 3 modelos simultáneamente. Por favor, reinténtelo más tarde.", "May": "Mayo", "MBR": "MBR", @@ -1077,7 +1077,7 @@ "Member removed successfully": "Miembro removido correctamente", "Members": "Miembros", "Members added successfully": "Miembros añadidos correctamente", - "Memories": "", + "Memories": "Memorias", "Memories accessible by LLMs will be shown here.": "Las memorias accesibles por los LLMs se mostrarán aquí.", "Memory": "Memoria", "Memory added successfully": "Memoria añadida correctamente", @@ -1087,7 +1087,7 @@ "Merge Responses": "Fusionar Respuestas", "Merged Response": "Respuesta combinada", "Message": "Mensaje", - "Message counts and response timestamps": "", + "Message counts and response timestamps": "Recuento de mensajes y marcas de tiempo de la respuesta", "Message rating should be enabled to use this feature": "Para usar esta función debe estar habilitada la calificación de mensajes", "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Los mensajes que envíe después de la creación del enlace no se compartirán. Los usuarios con la URL del enlace podrán ver el chat compartido.", "Microsoft OneDrive": "Microsoft OneDrive", @@ -1120,11 +1120,11 @@ "Model Name": "Nombre Modelo", "Model name already exists, please choose a different one": "Ese nombre de modelo ya existe, por favor elige otro diferente", "Model Name is required.": "El Nombre de Modelo es requerido", - "Model names and usage frequency": "", + "Model names and usage frequency": "Nombres de modelos y frecuencia de uso", "Model not selected": "Modelo no seleccionado", "Model Params": "Paráms Modelo", "Model Permissions": "Permisos Modelo", - "Model responses or outputs": "", + "Model responses or outputs": "Respuestas del modelo o salidas", "Model unloaded successfully": "Modelo descargado correctamente", "Model updated successfully": "Modelo actualizado correctamente", "Model(s) do not support file upload": "Modelo/s no soportan subida de archivos", @@ -1135,7 +1135,7 @@ "Models imported successfully": "Modelos importados correctamente", "Models Public Sharing": "Compartir Modelos Públicamente", "Models Sharing": "Compartir Modelos", - "Mojeek": "", + "Mojeek": "Mojeek", "Mojeek Search API Key": "Clave API de Mojeek Search", "More": "Más", "More Concise": "Más Conciso", @@ -1157,10 +1157,10 @@ "New Prompt": "Nuevo Indicador", "New Temporary Chat": "Nuevo Chat Temporal", "New Tool": "Nueva Herramienta", - "New Webhook": "", + "New Webhook": "Nuevo Webhook", "new-channel": "nuevo-canal", "Next message": "Siguiente mensaje", - "No activity data": "", + "No activity data": "Sin datos de actividad", "No authentication": "Sin Autentificación", "No chats found": "No se encontró ningún chat", "No chats found for this user.": "No se encontró ningún chat de este usuario", @@ -1171,7 +1171,7 @@ "No conversation to save": "No hay conversación para guardar", "No distance available": "No hay distancia disponible", "No expiration can pose security risks.": "No expiración puede poner la seguridad en riesgo.", - "No feedback found": "", + "No feedback found": "No se encontró ninguna opinión", "No file selected": "No se seleccionó archivo", "No files in this knowledge base.": "Ningún archivo en esta base de conocimiento.", "No functions found": "No se encontraron funciones", @@ -1186,7 +1186,7 @@ "No models selected": "No se seleccionaron modelos", "No Notes": "Sin Notas", "No notes found": "No se encontraron notas", - "No one": "", + "No one": "Ni uno", "No pinned messages": "No hay mensajes fijados", "No prompts found": "No se encontraron indicadores", "No results": "No se encontraron resultados", @@ -1199,7 +1199,7 @@ "No users were found.": "No se encontraron usuarios.", "No valves": "No hay válvulas", "No valves to update": "No hay válvulas para actualizar", - "No webhooks yet": "", + "No webhooks yet": "Todavía no hay webhooks", "Node Ids": "IDs de Nodo", "None": "Ninguno", "Not factually correct": "No es correcto en todos los aspectos", @@ -1239,7 +1239,7 @@ "Only invited users can access": "Solo pueden acceder usuarios invitados", "Only markdown files are allowed": "Solo están permitidos archivos markdown", "Only select users and groups with permission can access": "Solo pueden acceder los usuarios y grupos con permiso", - "Only sync new/updated chats": "", + "Only sync new/updated chats": "Sincronizar solo chats nuevos o actualizados", "Oops! Looks like the URL is invalid. Please double-check and try again.": "¡vaya! Parece que la URL es inválida. Por favor, revisala y reintenta de nuevo.", "Oops! There are files still uploading. Please wait for the upload to complete.": "¡vaya! Todavía hay archivos subiendose. Por favor, espera a que se complete la subida.", "Oops! There was an error in the previous response.": "¡vaya! Hubo un error en la respuesta previa.", @@ -1256,7 +1256,7 @@ "Open WebUI can use tools provided by any OpenAPI server.": "Open-WebUI puede usar herramientas proporcionadas por cualquier servidor OpenAPI", "Open WebUI uses faster-whisper internally.": "Open-WebUI usa faster-whisper internamente.", "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Open-WebUI usa SpeechT5 y la incrustración de locutores de CMU Arctic.", - "Open WebUI version": "", + "Open WebUI version": "versión de Open-WebUI", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "La versión de Open-WebUI (v{{OPEN_WEBUI_VERSION}}) es inferior a la versión (v{{REQUIRED_VERSION}}) requerida", "OpenAI": "OpenAI", "OpenAI API": "API OpenAI", @@ -1281,8 +1281,8 @@ "page": "página", "Paginate": "Paginar", "Parameters": "Parámetros", - "Parent message not found": "", - "Participate in community leaderboards and evaluations! Syncing aggregated usage stats helps drive research and improvements to Open WebUI. Your privacy is paramount: no message content is ever shared.": "", + "Parent message not found": "Mensaje padre no encontrado", + "Participate in community leaderboards and evaluations! Syncing aggregated usage stats helps drive research and improvements to Open WebUI. Your privacy is paramount: no message content is ever shared.": "¡Participa en las clasificaciones y evaluaciones de la comunidad! La sincronización agregada de estadísticas de uso ayuda a impulsar la investigación y las mejoras de Open-WebUI. Tu privacidad es primordial: nunca se comparte el contenido de los mensajes.", "Password": "Contraseña", "Passwords do not match.": "Las contraseñas no coinciden", "Paste Large Text as File": "Pegar el Texto Largo como Archivo", @@ -1308,8 +1308,8 @@ "Pipe": "Tubo", "Pipeline deleted successfully": "Tubería borrada correctamente", "Pipeline downloaded successfully": "Tubería descargada correctamente", - "Pipelines": "", - "Pipelines are a plugin system with arbitrary code execution —": "Pipelines es un sistema de complementos con ejecución arbitraria de código —", + "Pipelines": "Tuberías", + "Pipelines are a plugin system with arbitrary code execution —": "Tuberías (Pipelines) es un sistema de complementos con ejecución arbitraria de código —", "Pipelines Not Detected": "Servicio de Tuberías (Pipelines) No Detectado", "Pipelines Valves": "Válvulas de Tuberías", "Plain text (.md)": "Texto plano (.md)", @@ -1546,7 +1546,7 @@ "Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Establece las secuencias de parada a usar. Cuando se encuentre este patrón, el LLM dejará de generar texto y retornará. Se pueden establecer varios patrones de parada especificando separadamente múltiples parámetros de parada en un archivo de modelo.", "Setting": "Ajuste", "Settings": "Ajustes", - "Settings Permissions": "", + "Settings Permissions": "Ajustes de Permisos", "Settings saved successfully!": "¡Ajustes guardados correctamente!", "Share": "Compartir", "Share Chat": "Compartir Chat", @@ -1590,7 +1590,7 @@ "Speech recognition error: {{error}}": "Error en reconocimiento de voz: {{error}}", "Speech-to-Text": "Voz a Texto", "Speech-to-Text Engine": "Motor Voz a Texto(STT)", - "Split documents by markdown headers before applying character/token splitting.": "", + "Split documents by markdown headers before applying character/token splitting.": "Dividir los documentos por encabezados markdown antes de aplicar la división de caracteres/tokens.", "Start a new conversation": "Comenzar una conversación nueva", "Start of the channel": "Inicio del canal", "Start Tag": "Etiqueta de Inicio", @@ -1601,7 +1601,7 @@ "STDOUT/STDERR": "STDOUT/STDERR", "Steps": "Pasos", "Stop": "Detener", - "Stop Download": "", + "Stop Download": "Detener la Descarga", "Stop Generating": "Parar la Generación", "Stop Sequence": "Secuencia de Parada", "Stream Chat Response": "Transmisión Directa de la Respuesta del Chat", @@ -1622,14 +1622,14 @@ "Support": "Soportar", "Support this plugin:": "Apoya este plugin:", "Supported MIME Types": "Tipos MIME Soportados", - "Sync": "", - "Sync Complete!": "", + "Sync": "Sincronizar", + "Sync Complete!": "Sincronización Completa", "Sync directory": "Sincroniza Directorio", - "Sync Failed": "", - "Sync Usage Stats": "", - "Syncing stats...": "", - "Syncing...": "", - "Syncs only chats with updates after your last sync timestamp. Disable to re-sync all chats.": "", + "Sync Failed": "Fallo al Sincronizar", + "Sync Usage Stats": "Sincronizar Estadísticas de Uso", + "Syncing stats...": "Sincronizando estadísticas...", + "Syncing...": "Sincronizando...", + "Syncs only chats with updates after your last sync timestamp. Disable to re-sync all chats.": "Sincroniza solo los chats con actualizaciones posteriores a la última sincronización. Desactiva esta opción para volver a sincronizar todos los chats.", "System": "Sistema", "System Instructions": "Instrucciones del sistema", "System Prompt": "Indicador del sistema", @@ -1674,7 +1674,7 @@ "The Weight of BM25 Hybrid Search. 0 more semantic, 1 more lexical. Default 0.5": "La Ponderación de BM25 en la Búsqueda Híbrida. 0 más semántica, 1 más léxica. Por defecto, 0.5", "The width in pixels to compress images to. Leave empty for no compression.": "El ancho en pixeles al comprimir imágenes. Dejar vacío para no compresión", "Theme": "Tema", - "There was an error syncing your stats. Please try again.": "", + "There was an error syncing your stats. Please try again.": "Se produjo un error al sincronizar tus estadísticas. Por favor, inténtalo de nuevo.", "Thinking...": "Pensando...", "This action cannot be undone. Do you wish to continue?": "Esta acción no se puede deshacer. ¿Desea continuar?", "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Este canal fue creado el {{createdAt}}. Este es el comienzo del canal {{channelName}}.", @@ -1788,7 +1788,7 @@ "Upload Pipeline": "Subir Tubería", "Upload Progress": "Progreso de la Subida", "Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Progreso de la Subida: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)", - "Uploaded files or images": "", + "Uploaded files or images": "Archivos o imágenes cargados", "Uploading file...": "Subiendo archivo...", "URL": "URL", "URL is required": "La URL es requerida", @@ -1806,8 +1806,8 @@ "User Groups": "Grupos de Usuarios", "User location successfully retrieved.": "Ubicación de usuario obtenida correctamente.", "User menu": "Menu de Usuario", - "User ratings (thumbs up/down)": "", - "User Status": "", + "User ratings (thumbs up/down)": "Calificaciones de los usuarios (pulgares arriba/abajo)", + "User Status": "Estado del Usuario", "User Webhooks": "Usuario Webhooks", "Username": "Nombre de Usuario", "users": "usuarios", @@ -1848,9 +1848,9 @@ "Web Search Engine": "Motor Búsqueda Web", "Web Search in Chat": "Búsqueda Web en Chat", "Web Search Query Generation": "Generación de Consulta Búsqueda Web", - "Webhook Name": "", + "Webhook Name": "Nombre del Webhook", "Webhook URL": "URL EnganchesWeb(Webhook)", - "Webhooks": "", + "Webhooks": "Webhooks", "Webpage URLs": "URLS de PáginasWeb", "WebUI Settings": "WebUI Ajustes", "WebUI URL": "WebUI URL", @@ -1859,19 +1859,19 @@ "WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI hará solicitudes a \"{{url}}/chat/completions\"", "What are you trying to achieve?": "¿Qué estás tratando de conseguir?", "What are you working on?": "¿En qué estás trabajando?", - "What is NOT shared:": "", - "What is shared:": "", + "What is NOT shared:": "Que NO es compartido:", + "What is shared:": "Que es compartido:", "What's New in": "Que hay de Nuevo en", "What's on your mind?": "¿En que estás pensando?", "When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "Cuando está habilitado, el modelo responderá a cada mensaje de chat en tiempo real, generando una respuesta tan pronto como se envíe un mensaje. Este modo es útil para aplicaciones de chat en vivo, pero puede afectar al rendimiento en equipos más lentos.", "wherever you are": "dondequiera que estés", "Whether to paginate the output. Each page will be separated by a horizontal rule and page number. Defaults to False.": "Al paginar la salida. Cada página será separada por una línea horizontal y número de página. Por defecto: Falso", "Whisper (Local)": "Whisper (Local)", - "Who can share to this group": "", + "Who can share to this group": "Quién puede compartir en este grupo", "Why?": "¿Por qué?", "Widescreen Mode": "Modo Pantalla Ancha", "Width": "Ancho", - "Wikipedia": "", + "Wikipedia": "Wikipedia", "Won": "Ganó", "Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "Trabaja conjuntamente con top-k. Un valor más alto (p.ej. 0.95) dará lugar a un texto más diverso, mientras que un valor más bajo (p.ej. 0.5) generará un texto más centrado y conservador.", "Workspace": "Espacio de Trabajo", @@ -1883,8 +1883,8 @@ "Yacy Instance URL": "URL de la instancia Yacy", "Yacy Password": "Contraseña de Yacy", "Yacy Username": "Usuario de Yacy", - "Yahoo": "", - "Yandex": "", + "Yahoo": "Yahoo", + "Yandex": "Yandex", "Yesterday": "Ayer", "Yesterday at {{LOCALIZED_TIME}}": "Ayer a las {{LOCALIZED_TIME}}", "You": "Tu", @@ -1892,9 +1892,9 @@ "You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Solo puedes chatear con un máximo de {{maxCount}} archivo(s) a la vez.", "You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Puedes personalizar tus interacciones con los LLMs añadiendo memorias a través del botón 'Gestionar' debajo, haciendo que te sean más útiles y personalizados.", "You cannot upload an empty file.": "No puedes subir un archivo vacío.", - "You do not have permission to edit this model": "", - "You do not have permission to edit this prompt.": "", - "You do not have permission to save this prompt.": "", + "You do not have permission to edit this model": "No tienes permiso para editar este modelo", + "You do not have permission to edit this prompt.": "No tienes permiso para editar este indicador", + "You do not have permission to save this prompt.": "No tienes permiso para guardar este indicador", "You do not have permission to send messages in this channel.": "No tienes permiso para enviar mensajes en este canal", "You do not have permission to send messages in this thread.": "No tienes permiso para enviar mensajes en este hilo", "You do not have permission to upload files to this knowledge base.": "No tienes permiso para subir archivos a esta base de conocimiento.", @@ -1906,8 +1906,8 @@ "Your Account": "Tu Cuenta", "Your account status is currently pending activation.": "Tu cuenta está pendiente de activación.", "Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "Tu entera contribución irá directamente al desarrollador del complemento; Open-WebUI no recibe ningún porcentaje. Sin embargo, la plataforma de financiación elegida podría tener sus propias tarifas.", - "Your message text or inputs": "", - "Your usage stats have been successfully synced.": "", + "Your message text or inputs": "Tu mensaje de texto o entrada", + "Your usage stats have been successfully synced.": "Tu estadistica de uso ha sido sincronizada", "YouTube": "Youtube", "Youtube Language": "Youtube Idioma", "Youtube Proxy URL": "Youtube URL Proxy" From af584b46f4c09f8d41b26d2cca959eb1825d50d1 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 11 Jan 2026 21:18:41 +0100 Subject: [PATCH 016/311] feat: code-interpreter native (#20592) * code-interpreter native * Update tools.py * Update builtin.py * Update builtin.py * Update tools.py * Update builtin.py * Update builtin.py * Update builtin.py * Update builtin.py * Update builtin.py * Update builtin.py * Update builtin.py * Update builtin.py * Update builtin.py * Update builtin.py --- backend/open_webui/tools/builtin.py | 160 ++++++++++++++++++++++++++++ backend/open_webui/utils/tools.py | 11 ++ 2 files changed, 171 insertions(+) diff --git a/backend/open_webui/tools/builtin.py b/backend/open_webui/tools/builtin.py index eb3b7cfc9f..d26e032727 100644 --- a/backend/open_webui/tools/builtin.py +++ b/backend/open_webui/tools/builtin.py @@ -341,6 +341,166 @@ async def edit_image( return json.dumps({"error": str(e)}) +# ============================================================================= +# CODE INTERPRETER TOOLS +# ============================================================================= + + +async def execute_code( + code: str, + __request__: Request = None, + __user__: dict = None, + __event_emitter__: callable = None, + __event_call__: callable = None, + __chat_id__: str = None, + __message_id__: str = None, + __metadata__: dict = None, +) -> str: + """ + Execute Python code in a sandboxed environment and return the output. + Use this to perform calculations, data analysis, generate visualizations, + or run any Python code that would help answer the user's question. + + :param code: The Python code to execute + :return: JSON with stdout, stderr, and result from execution + """ + from uuid import uuid4 + + if __request__ is None: + return json.dumps({"error": "Request context not available"}) + + try: + # Import blocked modules from config (same as middleware) + from open_webui.config import CODE_INTERPRETER_BLOCKED_MODULES + + # Add import blocking code if there are blocked modules + if CODE_INTERPRETER_BLOCKED_MODULES: + import textwrap + blocking_code = textwrap.dedent( + f""" + import builtins + + BLOCKED_MODULES = {CODE_INTERPRETER_BLOCKED_MODULES} + + _real_import = builtins.__import__ + def restricted_import(name, globals=None, locals=None, fromlist=(), level=0): + if name.split('.')[0] in BLOCKED_MODULES: + importer_name = globals.get('__name__') if globals else None + if importer_name == '__main__': + raise ImportError( + f"Direct import of module {{name}} is restricted." + ) + return _real_import(name, globals, locals, fromlist, level) + + builtins.__import__ = restricted_import + """ + ) + code = blocking_code + "\n" + code + + engine = getattr(__request__.app.state.config, "CODE_INTERPRETER_ENGINE", "pyodide") + if engine == "pyodide": + # Execute via frontend pyodide using bidirectional event call + if __event_call__ is None: + return json.dumps({"error": "Event call not available. WebSocket connection required for pyodide execution."}) + + output = await __event_call__( + { + "type": "execute:python", + "data": { + "id": str(uuid4()), + "code": code, + "session_id": __metadata__.get("session_id") if __metadata__ else None, + }, + } + ) + + # Parse the output - pyodide returns dict with stdout, stderr, result + if isinstance(output, dict): + stdout = output.get("stdout", "") + stderr = output.get("stderr", "") + result = output.get("result", "") + else: + stdout = "" + stderr = "" + result = str(output) if output else "" + + elif engine == "jupyter": + from open_webui.utils.code_interpreter import execute_code_jupyter + + output = await execute_code_jupyter( + __request__.app.state.config.CODE_INTERPRETER_JUPYTER_URL, + code, + ( + __request__.app.state.config.CODE_INTERPRETER_JUPYTER_AUTH_TOKEN + if __request__.app.state.config.CODE_INTERPRETER_JUPYTER_AUTH == "token" + else None + ), + ( + __request__.app.state.config.CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD + if __request__.app.state.config.CODE_INTERPRETER_JUPYTER_AUTH == "password" + else None + ), + __request__.app.state.config.CODE_INTERPRETER_JUPYTER_TIMEOUT, + ) + + stdout = output.get("stdout", "") + stderr = output.get("stderr", "") + result = output.get("result", "") + + else: + return json.dumps({"error": f"Unknown code interpreter engine: {engine}"}) + + # Handle image outputs (base64 encoded) - replace with uploaded URLs + # Get actual user object for image upload (upload_image requires user.id attribute) + if __user__ and __user__.get("id"): + from open_webui.models.users import Users + from open_webui.utils.files import get_image_url_from_base64 + + user = Users.get_user_by_id(__user__["id"]) + + # Extract and upload images from stdout + if stdout and isinstance(stdout, str): + stdout_lines = stdout.split("\n") + for idx, line in enumerate(stdout_lines): + if "data:image/png;base64" in line: + image_url = get_image_url_from_base64( + __request__, + line, + __metadata__ or {}, + user, + ) + if image_url: + stdout_lines[idx] = f"![Output Image]({image_url})" + stdout = "\n".join(stdout_lines) + + # Extract and upload images from result + if result and isinstance(result, str): + result_lines = result.split("\n") + for idx, line in enumerate(result_lines): + if "data:image/png;base64" in line: + image_url = get_image_url_from_base64( + __request__, + line, + __metadata__ or {}, + user, + ) + if image_url: + result_lines[idx] = f"![Output Image]({image_url})" + result = "\n".join(result_lines) + + response = { + "status": "success", + "stdout": stdout, + "stderr": stderr, + "result": result, + } + + return json.dumps(response, ensure_ascii=False) + except Exception as e: + log.exception(f"execute_code error: {e}") + return json.dumps({"error": str(e)}) + + # ============================================================================= # MEMORY TOOLS # ============================================================================= diff --git a/backend/open_webui/utils/tools.py b/backend/open_webui/utils/tools.py index 6cb6c4b856..77f985ebbc 100644 --- a/backend/open_webui/utils/tools.py +++ b/backend/open_webui/utils/tools.py @@ -51,6 +51,7 @@ fetch_url, generate_image, edit_image, + execute_code, search_memories, add_memory, replace_memory_content, @@ -449,6 +450,14 @@ def get_model_capability(name: str, default: bool = True) -> bool: ) and get_model_capability("image_generation"): builtin_functions.append(edit_image) + # Add code interpreter tool if enabled globally AND model has code_interpreter capability + # Supports both pyodide (via frontend event call) and jupyter engines + if ( + getattr(request.app.state.config, "ENABLE_CODE_INTERPRETER", True) + and get_model_capability("code_interpreter") + ): + builtin_functions.append(execute_code) + # Notes tools - search, view, create, and update user's notes (if notes enabled globally) if getattr(request.app.state.config, "ENABLE_NOTES", False): builtin_functions.extend( @@ -473,6 +482,8 @@ def get_model_capability(name: str, default: bool = True) -> bool: "__request__": request, "__user__": extra_params.get("__user__", {}), "__event_emitter__": extra_params.get("__event_emitter__"), + "__event_call__": extra_params.get("__event_call__"), + "__metadata__": extra_params.get("__metadata__"), "__chat_id__": extra_params.get("__chat_id__"), "__message_id__": extra_params.get("__message_id__"), "__model_knowledge__": model_knowledge, From 84d76cccde5717f379255b1d1272f3e2f0427758 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 11 Jan 2026 21:41:28 +0100 Subject: [PATCH 017/311] Update translation.json (#20593) --- src/lib/i18n/locales/de-DE/translation.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index 34d668b5ca..b1ca731f7e 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -47,7 +47,7 @@ "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Aktivieren Sie diesen Befehl, indem Sie \"/{{COMMAND}}\" in die Chat-Eingabe tippen.", "Active": "Aktiv", "Active Users": "Aktive Benutzer", - "Activity": "", + "Activity": "Aktivität", "Add": "Hinzufügen", "Add a model ID": "Modell-ID hinzufügen", "Add a short description about what this model does": "Fügen Sie eine kurze Beschreibung der Funktion dieses Modells hinzu", @@ -303,7 +303,7 @@ "Code Block": "Code-Block", "Code Editor": "Code-Editor", "Code execution": "Codeausführung", - "Code Execution": "", + "Code Execution": "Codeausführung", "Code Execution Engine": "Engine zur Codeausführung", "Code Execution Timeout": "Zeitlimit für Codeausführung", "Code formatted successfully": "Code erfolgreich formatiert", @@ -498,7 +498,7 @@ "Document Intelligence endpoint required.": "Dokumentenintelligenz-Endpunkt erforderlich.", "Document Intelligence Model": "Dokumentenintelligenz-Modell", "Documentation": "Dokumentation", - "Documents": "", + "Documents": "Dokumente", "does not make any external connections, and your data stays securely on your locally hosted server.": "stellt keine externen Verbindungen her; Ihre Daten bleiben sicher auf Ihrem lokalen Server.", "Domain Filter List": "Domain-Filterliste", "don't fetch random pipelines from sources you don't trust.": "Laden Sie keine Pipelines aus Quellen, denen Sie nicht vertrauen.", @@ -522,7 +522,7 @@ "e.g. 60": "z. B. 60", "e.g. A filter to remove profanity from text": "z. B. Ein Filter zum Entfernen von Schimpfwörtern", "e.g. about the Roman Empire": "z. B. über das Römische Reich", - "e.g. alloy, echo, shimmer": "", + "e.g. alloy, echo, shimmer": "z. B. alloy, echo, shimmer", "e.g. en": "z. B. de", "e.g. My Filter": "z. B. Mein Filter", "e.g. My Tools": "z. B. Meine Werkzeuge", @@ -786,7 +786,7 @@ "File": "Datei", "File added successfully.": "Datei erfolgreich hinzugefügt.", "File content updated successfully.": "Dateiinhalt erfolgreich aktualisiert.", - "File Context": "", + "File Context": "Datei-Kontext", "File Mode": "Datei-Modus", "File not found.": "Datei nicht gefunden.", "File removed successfully.": "Datei erfolgreich entfernt.", @@ -923,7 +923,7 @@ "Image Prompt Generation": "Bild-Prompt-Generierung", "Image Prompt Generation Prompt": "Prompt für Bild-Prompt-Generierung", "Image Size": "Bildgröße", - "Images": "", + "Images": "Bilder", "Import": "Importieren", "Import Chats": "Chats importieren", "Import Config from JSON File": "Konfiguration aus JSON importieren", @@ -942,7 +942,7 @@ "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "Beeinflusst, wie schnell der Algorithmus auf Feedback aus dem generierten Text reagiert. Eine niedrigere Lernrate führt zu langsameren Anpassungen, während eine höhere Lernrate den Algorithmus reaktionsschneller macht.", "Info": "Info", "Initials": "Initialen", - "Inject file content into conversation context": "", + "Inject file content into conversation context": "Injiziere den Datei-Kontext in den Konversations-Kontext", "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Gesamten Inhalt als Kontext für umfassende Verarbeitung einfügen; dies wird für komplexe Abfragen empfohlen.", "Input": "Eingabe", "Input Key (e.g. text, unet_name, steps)": "Eingabeschlüssel (z. B. text, unet_name, steps)", @@ -1160,7 +1160,7 @@ "New Webhook": "Neuer Webhook", "new-channel": "neuer-kanal", "Next message": "Nächste Nachricht", - "No activity data": "", + "No activity data": "Keine Aktivitätsdaten", "No authentication": "Keine Authentifizierung", "No chats found": "Keine Chats gefunden", "No chats found for this user.": "Keine Chats für diesen Benutzer gefunden.", @@ -1308,7 +1308,7 @@ "Pipe": "Pipe", "Pipeline deleted successfully": "Pipeline erfolgreich gelöscht", "Pipeline downloaded successfully": "Pipeline erfolgreich heruntergeladen", - "Pipelines": "", + "Pipelines": "Pipelines", "Pipelines are a plugin system with arbitrary code execution —": "Pipelines sind ein Plugin-System mit beliebiger Codeausführung —", "Pipelines Not Detected": "Keine Pipelines erkannt", "Pipelines Valves": "Pipeline-Valves", From 01d5f42755187ddb0b6508c4dfa768d441d31170 Mon Sep 17 00:00:00 2001 From: joaoback <156559121+joaoback@users.noreply.github.com> Date: Mon, 12 Jan 2026 07:04:09 -0300 Subject: [PATCH 018/311] Update translation.json (pt-BR) (#20599) translation of the new items recently added --- src/lib/i18n/locales/pt-BR/translation.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index b6d2966bbc..f35e12323d 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -303,7 +303,7 @@ "Code Block": "Bloco de código", "Code Editor": "Editor de código", "Code execution": "Execução de código", - "Code Execution": "", + "Code Execution": "Execução de Código", "Code Execution Engine": "Mecanismo de execução de código", "Code Execution Timeout": "Tempo limite de execução do código", "Code formatted successfully": "Código formatado com sucesso", @@ -498,7 +498,7 @@ "Document Intelligence endpoint required.": "É necessário o endpoint do Document Intelligence.", "Document Intelligence Model": "Modelo de Inteligência de Documentos", "Documentation": "Documentação", - "Documents": "", + "Documents": "Documentos", "does not make any external connections, and your data stays securely on your locally hosted server.": "não faz nenhuma conexão externa, e seus dados permanecem seguros no seu servidor local.", "Domain Filter List": "Lista de filtros de domínio", "don't fetch random pipelines from sources you don't trust.": "Não busque pipelines aleatórios de fontes não confiáveis.", @@ -923,7 +923,7 @@ "Image Prompt Generation": "Geração de prompt de imagem", "Image Prompt Generation Prompt": "Prompt de geração de prompt de imagem", "Image Size": "Tamanho da imagem", - "Images": "", + "Images": "Imagens", "Import": "Importar", "Import Chats": "Importar Chats", "Import Config from JSON File": "Importar Configurações de JSON", @@ -1308,7 +1308,7 @@ "Pipe": "", "Pipeline deleted successfully": "Pipeline excluído com sucesso", "Pipeline downloaded successfully": "Pipeline baixado com sucesso", - "Pipelines": "", + "Pipelines": "Pipelines", "Pipelines are a plugin system with arbitrary code execution —": "Pipelines é um sistema de plugins com execução arbitrária de código —", "Pipelines Not Detected": "Pipelines Não Detectados", "Pipelines Valves": "Configurações de Pipelines", From 9617df04ae15cdb3c19b6926dea539198f76450e Mon Sep 17 00:00:00 2001 From: Shirasawa <764798966@qq.com> Date: Tue, 13 Jan 2026 00:34:13 +0800 Subject: [PATCH 019/311] I18n: improve Chinese translation (#20613) * i18n: improve zh-CN translation * i18n: improve zh-TW translation --- src/lib/i18n/locales/zh-CN/translation.json | 38 ++++++++++----------- src/lib/i18n/locales/zh-TW/translation.json | 36 +++++++++---------- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index f185bc8b12..dacae40c77 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -47,7 +47,7 @@ "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "在对话框中输入 \"/{{COMMAND}}\" 激活此命令", "Active": "在线", "Active Users": "当前在线用户", - "Activity": "", + "Activity": "活动", "Add": "添加", "Add a model ID": "添加模型 ID", "Add a short description about what this model does": "添加有关该模型能力的简短描述", @@ -221,7 +221,7 @@ "Button ID": "按钮 ID", "Button Label": "按钮文本", "Button Prompt": "点击按钮后执行的提示词", - "by {{name}}": "", + "by {{name}}": "由 {{name}} 提供", "By {{name}}": "由 {{name}} 提供", "Bypass Embedding and Retrieval": "绕过嵌入和检索", "Bypass Web Loader": "绕过网页加载器", @@ -303,7 +303,7 @@ "Code Block": "代码块", "Code Editor": "代码编辑器", "Code execution": "代码执行", - "Code Execution": "", + "Code Execution": "代码执行", "Code Execution Engine": "代码执行引擎", "Code Execution Timeout": "代码执行超时", "Code formatted successfully": "代码格式化成功", @@ -367,7 +367,7 @@ "Copy link": "复制链接", "Copy Link": "复制链接", "Copy to clipboard": "复制到剪贴板", - "Copy URL": "", + "Copy URL": "复制 URL", "Copying to clipboard was successful!": "成功复制到剪贴板!", "CORS must be properly configured by the provider to allow requests from Open WebUI.": "为允许 Open WebUI 发出的请求,提供商必须正确配置 CORS", "Create": "创建", @@ -391,7 +391,7 @@ "Created At": "创建于", "Created by": "作者", "Created by you": "由您创建", - "Created on {{date}}": "", + "Created on {{date}}": "创建于 {{date}}", "CSV Import": "通过 CSV 文件导入", "Ctrl+Enter to Send": "Ctrl+Enter 发送", "Current Model": "当前模型", @@ -447,7 +447,7 @@ "delete this link": "此处删除这个链接", "Delete tool?": "要删除此工具吗?", "Delete User": "删除用户", - "Deleted": "", + "Deleted": "删除成功", "Deleted {{deleteModelTag}}": "已删除 {{deleteModelTag}}", "Deleted {{name}}": "已删除 {{name}}", "Deleted User": "已删除用户", @@ -498,7 +498,7 @@ "Document Intelligence endpoint required.": "Document Intelligence 接口地址是必填项。", "Document Intelligence Model": "Document Intelligence 模型", "Documentation": "帮助文档", - "Documents": "", + "Documents": "文档", "does not make any external connections, and your data stays securely on your locally hosted server.": "不会与外部建立任何连接,您的数据会安全地存储在本地托管的服务器上。", "Domain Filter List": "域名过滤列表", "don't fetch random pipelines from sources you don't trust.": "请勿从未经验证或不可信的来源获取 Pipelines。", @@ -522,7 +522,7 @@ "e.g. 60": "例如:60", "e.g. A filter to remove profanity from text": "例如:一个用于剔除文本中不当内容的过滤器", "e.g. about the Roman Empire": "例如:关于罗马帝国的趣闻", - "e.g. alloy, echo, shimmer": "", + "e.g. alloy, echo, shimmer": "例如:alloy, echo, shimmer", "e.g. en": "例如:en", "e.g. My Filter": "例如:我的过滤器", "e.g. My Tools": "例如:我的工具", @@ -786,7 +786,7 @@ "File": "文件", "File added successfully.": "文件成功添加", "File content updated successfully.": "文件内容成功更新", - "File Context": "", + "File Context": "文件上下文", "File Mode": "文件模式", "File not found.": "文件未找到。", "File removed successfully.": "文件成功删除", @@ -923,7 +923,7 @@ "Image Prompt Generation": "图像提示词生成", "Image Prompt Generation Prompt": "用于生成图像提示词的提示词", "Image Size": "图片尺寸", - "Images": "", + "Images": "图片", "Import": "导入", "Import Chats": "导入对话记录", "Import Config from JSON File": "从 JSON 文件中导入配置信息", @@ -942,7 +942,7 @@ "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "影响算法对生成文本反馈的响应速度。较低的学习率会导致调整过程较慢,而较高的学习率将使算法反应更灵敏。", "Info": "信息", "Initials": "姓名缩写", - "Inject file content into conversation context": "", + "Inject file content into conversation context": "将文件内容注入为对话上下文", "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "注入整个内容作为上下文进行综合处理,适用于复杂查询", "Input": "输入", "Input Key (e.g. text, unet_name, steps)": "输入键名(例如:text, unet_name, steps)", @@ -1156,11 +1156,11 @@ "New Password": "新密码", "New Prompt": "创建提示词", "New Temporary Chat": "创建临时对话", - "New Tool": "新工具", - "New Webhook": "", + "New Tool": "新建工具", + "New Webhook": "新建 Webhook", "new-channel": "新频道", "Next message": "下一条消息", - "No activity data": "", + "No activity data": "没有活动数据", "No authentication": "无身份验证", "No chats found": "未找到对话记录", "No chats found for this user.": "未找到此用户的对话记录", @@ -1199,7 +1199,7 @@ "No users were found.": "未找到用户", "No valves": "没有配置项", "No valves to update": "没有需要更新的配置项", - "No webhooks yet": "", + "No webhooks yet": "没有 Webhook", "Node Ids": "节点 ID", "None": "无", "Not factually correct": "与事实不符", @@ -1308,7 +1308,7 @@ "Pipe": "Pipe", "Pipeline deleted successfully": "Pipeline 删除成功", "Pipeline downloaded successfully": "Pipeline 下载成功", - "Pipelines": "", + "Pipelines": "Pipelines", "Pipelines are a plugin system with arbitrary code execution —": "Pipelines 是具有任意代码执行风险的插件系统 —", "Pipelines Not Detected": "未检测到 Pipeline", "Pipelines Valves": "Pipeline 配置项", @@ -1805,7 +1805,7 @@ "User location successfully retrieved.": "成功检索到用户位置", "User menu": "用户菜单", "User ratings (thumbs up/down)": "用户评分(赞/踩)", - "User Status": "", + "User Status": "用户状态", "User Webhooks": "用户 Webhook", "Username": "用户名", "users": "用户", @@ -1846,9 +1846,9 @@ "Web Search Engine": "联网搜索引擎", "Web Search in Chat": "在对话时进行联网搜索", "Web Search Query Generation": "联网搜索关键词生成", - "Webhook Name": "", + "Webhook Name": "Webhook 名称", "Webhook URL": "Webhook URL", - "Webhooks": "", + "Webhooks": "Webhook", "Webpage URLs": "网页链接", "WebUI Settings": "WebUI 设置", "WebUI URL": "WebUI URL", diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index 41ce6f5813..eea7b2162b 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -47,7 +47,7 @@ "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "在對話輸入框中輸入 \"/{{COMMAND}}\" 來啟用此命令。", "Active": "線上", "Active Users": "活躍使用者", - "Activity": "", + "Activity": "活動", "Add": "新增", "Add a model ID": "新增模型 ID", "Add a short description about what this model does": "新增這個模型的簡短描述", @@ -221,7 +221,7 @@ "Button ID": "按鈕 ID", "Button Label": "按鈕文字", "Button Prompt": "點擊按鈕後執行的提示詞", - "by {{name}}": "", + "by {{name}}": "由 {{name}} 提供", "By {{name}}": "由 {{name}} 製作", "Bypass Embedding and Retrieval": "繞過嵌入與檢索", "Bypass Web Loader": "繞過網頁載入器", @@ -303,7 +303,7 @@ "Code Block": "程式碼區塊", "Code Editor": "程式碼編輯器", "Code execution": "程式碼執行", - "Code Execution": "", + "Code Execution": "程式碼執行", "Code Execution Engine": "程式碼執行引擎", "Code Execution Timeout": "程式執行超時", "Code formatted successfully": "成功格式化程式碼", @@ -367,7 +367,7 @@ "Copy link": "複製連結", "Copy Link": "複製連結", "Copy to clipboard": "複製到剪貼簿", - "Copy URL": "", + "Copy URL": "複製 URL", "Copying to clipboard was successful!": "成功複製到剪貼簿!", "CORS must be properly configured by the provider to allow requests from Open WebUI.": "CORS 必須由供應商正確設定,以允許來自 Open WebUI 的請求。", "Create": "建立", @@ -391,7 +391,7 @@ "Created At": "建立於", "Created by": "建立者", "Created by you": "由您建立", - "Created on {{date}}": "", + "Created on {{date}}": "建立於 {{date}}", "CSV Import": "CSV 匯入", "Ctrl+Enter to Send": "使用 Ctrl+Enter 傳送", "Current Model": "目前模型", @@ -447,7 +447,7 @@ "delete this link": "刪除此連結", "Delete tool?": "刪除工具?", "Delete User": "刪除使用者", - "Deleted": "", + "Deleted": "刪除成功", "Deleted {{deleteModelTag}}": "已刪除 {{deleteModelTag}}", "Deleted {{name}}": "已刪除 {{name}}", "Deleted User": "刪除使用者?", @@ -498,7 +498,7 @@ "Document Intelligence endpoint required.": "需要提供 Document Intelligence 端點。", "Document Intelligence Model": "Document Intelligence 模型", "Documentation": "說明檔案", - "Documents": "", + "Documents": "文件", "does not make any external connections, and your data stays securely on your locally hosted server.": "不會建立任何外部連線,而且您的資料會安全地儲存在您本機伺服器上。", "Domain Filter List": "網域篩選列表", "don't fetch random pipelines from sources you don't trust.": "請勿從您無法信任的來源擷取任意管線。", @@ -522,7 +522,7 @@ "e.g. 60": "例如:60", "e.g. A filter to remove profanity from text": "例如:用來移除不雅詞彙的過濾器", "e.g. about the Roman Empire": "例如:關於羅馬帝國的事蹟", - "e.g. alloy, echo, shimmer": "", + "e.g. alloy, echo, shimmer": "例如:alloy, echo, shimmer", "e.g. en": "例如:en", "e.g. My Filter": "例如:我的篩選器", "e.g. My Tools": "例如:我的工具", @@ -786,7 +786,7 @@ "File": "檔案", "File added successfully.": "成功新增檔案。", "File content updated successfully.": "成功更新檔案內容。", - "File Context": "", + "File Context": "檔案上下文", "File Mode": "檔案模式", "File not found.": "未找到檔案。", "File removed successfully.": "成功移除檔案。", @@ -923,7 +923,7 @@ "Image Prompt Generation": "圖片提示詞生成", "Image Prompt Generation Prompt": "生成圖片提示詞的提示詞", "Image Size": "圖片尺寸", - "Images": "", + "Images": "圖片", "Import": "匯入", "Import Chats": "匯入對話紀錄", "Import Config from JSON File": "從 JSON 檔案匯入設定", @@ -942,7 +942,7 @@ "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "影響演算法對生成文字回饋的反應速度。較低的學習率會導致調整速度較慢,而較高的學習率會使演算法反應更靈敏。", "Info": "資訊", "Initials": "姓名縮寫", - "Inject file content into conversation context": "", + "Inject file content into conversation context": "將文件內容注入為對話上下文", "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "將完整內容注入為上下文以進行全面處理,建議用於複雜查詢。", "Input": "輸入", "Input Key (e.g. text, unet_name, steps)": "輸入鍵名(例如:text, unet_name, steps)", @@ -1157,10 +1157,10 @@ "New Prompt": "新增提示詞", "New Temporary Chat": "新增臨時對話", "New Tool": "新增工具", - "New Webhook": "", + "New Webhook": "新增 Webhook", "new-channel": "新頻道", "Next message": "下一條訊息", - "No activity data": "", + "No activity data": "沒有活動數據", "No authentication": "無身份驗證", "No chats found": "未找到對話記錄", "No chats found for this user.": "未找到此使用者的對話記錄。", @@ -1199,7 +1199,7 @@ "No users were found.": "未找到任何使用者", "No valves": "沒有設定項目", "No valves to update": "設定項目可更新", - "No webhooks yet": "", + "No webhooks yet": "尚無 Webhook", "Node Ids": "節點 ID", "None": "無", "Not factually correct": "與事實不符", @@ -1308,7 +1308,7 @@ "Pipe": "Pipe", "Pipeline deleted successfully": "成功刪除管線", "Pipeline downloaded successfully": "成功下載管線", - "Pipelines": "", + "Pipelines": "管線", "Pipelines are a plugin system with arbitrary code execution —": "管線是具任意程式碼執行風險的外掛系統 —", "Pipelines Not Detected": "未偵測到管線", "Pipelines Valves": "管線設定項目", @@ -1805,7 +1805,7 @@ "User location successfully retrieved.": "成功取得使用者位置。", "User menu": "使用者選單", "User ratings (thumbs up/down)": "使用者評分(讚/踩)", - "User Status": "", + "User Status": "使用者狀態", "User Webhooks": "使用者 Webhooks", "Username": "使用者名稱", "users": "使用者", @@ -1846,9 +1846,9 @@ "Web Search Engine": "網頁搜尋引擎", "Web Search in Chat": "在對話中進行網頁搜尋", "Web Search Query Generation": "網頁搜尋查詢生成", - "Webhook Name": "", + "Webhook Name": "Webhook 名稱", "Webhook URL": "Webhook URL", - "Webhooks": "", + "Webhooks": "Webhook", "Webpage URLs": "網頁連結", "WebUI Settings": "WebUI 設定", "WebUI URL": "WebUI URL", From 6f80cb6b65f9774d29b4613895bff5eecf61397b Mon Sep 17 00:00:00 2001 From: Toru Suzuki <35589743+zolgear@users.noreply.github.com> Date: Tue, 13 Jan 2026 01:34:32 +0900 Subject: [PATCH 020/311] i18n: Update Japanese translation (#20605) Co-authored-by: Tim Baek Co-authored-by: joaoback <156559121+joaoback@users.noreply.github.com> --- src/lib/i18n/locales/ja-JP/translation.json | 50 ++++++++++----------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/lib/i18n/locales/ja-JP/translation.json b/src/lib/i18n/locales/ja-JP/translation.json index 11ea56f1b1..641c92f282 100644 --- a/src/lib/i18n/locales/ja-JP/translation.json +++ b/src/lib/i18n/locales/ja-JP/translation.json @@ -165,9 +165,9 @@ "Assistant": "アシスタント", "Async Embedding Processing": "", "Attach File From Knowledge": "", - "Attach Knowledge": "", - "Attach Notes": "", - "Attach Webpage": "", + "Attach Knowledge": "ナレッジを追加", + "Attach Notes": "ノートを追加", + "Attach Webpage": "ウェブページを追加", "Attention to detail": "細部への注意", "Attribute for Mail": "メールの属性", "Attribute for Username": "ユーザー名の属性", @@ -373,7 +373,7 @@ "Create": "作成", "Create a knowledge base": "ナレッジベースを作成する", "Create a model": "モデルを作成する", - "Create a new note": "", + "Create a new note": "新しいノートを作成する", "Create Account": "アカウントを作成", "Create Admin Account": "管理者アカウントを作成", "Create Channel": "チャンネルを作成", @@ -390,7 +390,7 @@ "Created at": "作成日時", "Created At": "作成日時", "Created by": "作成者", - "Created by you": "", + "Created by you": "自分が作成", "Created on {{date}}": "", "CSV Import": "CSVインポート", "Ctrl+Enter to Send": "Ctrl+Enterで送信", @@ -805,15 +805,15 @@ "Firecrawl Timeout (s)": "", "Floating Quick Actions": "フローティング クイックアクション", "Focus Chat Input": "", - "Folder": "", - "Folder Background Image": "", + "Folder": "フォルダー", + "Folder Background Image": "フォルダーの背景画像", "Folder deleted successfully": "フォルダー削除が成功しました。", "Folder Max File Count": "", "Folder Name": "フォルダ名", "Folder name cannot be empty.": "フォルダー名を入力してください。", "Folder name updated successfully": "フォルダー名の変更に成功しました。", "Folder updated successfully": "フォルダの更新に成功しました。", - "Folders": "", + "Folders": "フォルダー", "Follow up": "関連質問", "Follow Up Generation": "関連質問の生成", "Follow Up Generation Prompt": "関連質問の生成プロンプト", @@ -868,7 +868,7 @@ "Google PSE API Key": "Google PSE APIキー", "Google PSE Engine Id": "Google PSE エンジン ID", "Gravatar": "", - "Grid": "", + "Grid": "グリッド", "Grokipedia": "", "Group": "グループ", "Group Channel": "", @@ -1032,7 +1032,7 @@ "Lift List": "リストを字下げ", "Light": "ライト", "Limit concurrent search queries. 0 = unlimited (default). Set to 1 for sequential execution (recommended for APIs with strict rate limits like Brave free tier).": "", - "List": "", + "List": "リスト", "Listening...": "聞いています...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLM は間違いを犯す可能性があります。重要な情報を検証してください。", @@ -1150,11 +1150,11 @@ "New Chat": "新しいチャット", "New Folder": "新しいフォルダ", "New Function": "新しいFunction", - "New Knowledge": "", - "New Model": "", - "New Note": "", + "New Knowledge": "新しいナレッジベース", + "New Model": "新しいモデル", + "New Note": "新しいノート", "New Password": "新しいパスワード", - "New Prompt": "", + "New Prompt": "新しいプロンプト", "New Temporary Chat": "", "New Tool": "新しいツール", "New Webhook": "", @@ -1174,18 +1174,18 @@ "No feedback found": "", "No file selected": "ファイルが選択されていません", "No files in this knowledge base.": "", - "No functions found": "", + "No functions found": "functionsが見つかりません", "No groups with access, add a group to grant access": "アクセス権限があるグループがありません。グループを追加してアクセス権限を付与してください。", "No HTML, CSS, or JavaScript content found.": "HTML、CSS、またはJavaScriptの内容が見つかりません。", "No inference engine with management support found": "管理サポートのある推論エンジンが見つかりません。", - "No knowledge bases found.": "", + "No knowledge bases found.": "ナレッジベースが見つかりません", "No knowledge found": "ナレッジベースが見つかりません", "No memories to clear": "クリアするメモリがありません", "No model IDs": "モデルIDがありません", "No models found": "モデルが見つかりません", "No models selected": "モデルが選択されていません", "No Notes": "ノートがありません", - "No notes found": "", + "No notes found": "ノートが見つかりません", "No one": "", "No pinned messages": "", "No prompts found": "", @@ -1371,7 +1371,7 @@ "Read": "読み込む", "Read Aloud": "読み上げ", "Read more →": "", - "Read Only": "", + "Read Only": "読み取り専用", "Read-Only Access": "", "Reason": "理由", "Reasoning Effort": "推理の努力", @@ -1535,7 +1535,7 @@ "Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "計算に使用するワーカースレッドの数を設定します。このオプションは、同時に処理可能なリクエスト数(スレッド数)を制御します。値を増やすことで、高い同時実行負荷下でのパフォーマンスが向上する可能性がありますが、その分CPUリソースの消費も増加します。", "Set Voice": "音声を設定", "Set whisper model": "whisperモデルを設定", - "Set your status": "", + "Set your status": "ステータスを設定", "Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "一度でも出現したトークンに対して一定のペナルティを設定します。値が高い(例:1.5)ほど繰り返しを強く抑制し、低い値(例:0.9)では寛容になります。0の場合は無効です。", "Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "出現回数に応じてトークンにスケーリングされたペナルティを設定します。値が高い(例:1.5)ほど繰り返しを強く抑制し、低い値(例:0.9)では寛容になります。0の場合は無効です。", "Sets how far back for the model to look back to prevent repetition.": "モデルが繰り返しを防止するために遡る履歴の長さを設定します。", @@ -1550,7 +1550,7 @@ "Share Chat": "チャットを共有", "Share to Open WebUI Community": "OpenWebUI コミュニティに共有", "Share your background and interests": "あなたの背景情報と興味を教えてください", - "Shared with you": "", + "Shared with you": "自分に共有", "Sharing Permissions": "共有に関する権限", "Show": "表示", "Show \"What's New\" modal on login": "ログイン時に更新内容モーダルを表示", @@ -1589,10 +1589,10 @@ "Speech-to-Text": "音声テキスト変換", "Speech-to-Text Engine": "音声テキスト変換エンジン", "Split documents by markdown headers before applying character/token splitting.": "", - "Start a new conversation": "", + "Start a new conversation": "新しい会話を開始", "Start of the channel": "チャンネルの開始", "Start Tag": "", - "Status": "", + "Status": "ステータス", "Status cleared successfully": "", "Status updated successfully": "", "Status Updates": "", @@ -1743,7 +1743,7 @@ "Transformers": "", "Trouble accessing Ollama?": "Ollama へのアクセスに問題がありますか?", "Trust Proxy Environment": "プロキシ環境を信頼する", - "Try adjusting your search or filter to find what you are looking for.": "", + "Try adjusting your search or filter to find what you are looking for.": "検索条件やフィルターを調整して、もう一度お試しください。", "Try Again": "再試行", "TTS Model": "TTSモデル", "TTS Settings": "TTS 設定", @@ -1849,7 +1849,7 @@ "Webhook Name": "", "Webhook URL": "Webhook URL", "Webhooks": "", - "Webpage URLs": "", + "Webpage URLs": "ウェブページのURL", "WebUI Settings": "WebUI 設定", "WebUI URL": "", "WebUI will make requests to \"{{url}}\"": "WebUIは\"{{url}}\"にリクエストを行います", @@ -1860,7 +1860,7 @@ "What is NOT shared:": "", "What is shared:": "", "What's New in": "新機能", - "What's on your mind?": "", + "What's on your mind?": "今の状況を入力してください", "When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "有効にすると、ユーザのメッセージ送信と同時にリアルタイムで応答を生成します。ライブチャット用途に適しますが、性能の低い環境では動作が重くなる可能性があります。", "wherever you are": "どこにいても", "Whether to paginate the output. Each page will be separated by a horizontal rule and page number. Defaults to False.": "出力をページ分けするかどうか。各ページは水平線とページ番号で分割されます。デフォルトでは無効", From 7da37b4f66b9b2e821796b06b75e03cb0237e0a9 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 12 Jan 2026 21:41:23 +0400 Subject: [PATCH 021/311] refac --- backend/open_webui/routers/channels.py | 8 ++------ backend/open_webui/routers/models.py | 6 ++---- backend/open_webui/routers/users.py | 6 ++---- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/backend/open_webui/routers/channels.py b/backend/open_webui/routers/channels.py index 4e697142bf..7f4b347bef 100644 --- a/backend/open_webui/routers/channels.py +++ b/backend/open_webui/routers/channels.py @@ -1874,13 +1874,9 @@ async def delete_message_by_id( @router.get("/webhooks/{webhook_id}/profile/image") -async def get_webhook_profile_image( - webhook_id: str, - user=Depends(get_verified_user), - db: Session = Depends(get_session), -): +def get_webhook_profile_image(webhook_id: str, user=Depends(get_verified_user)): """Get webhook profile image by webhook ID.""" - webhook = Channels.get_webhook_by_id(webhook_id, db=db) + webhook = Channels.get_webhook_by_id(webhook_id) if not webhook: # Return default favicon if webhook not found return FileResponse(f"{STATIC_DIR}/favicon.png") diff --git a/backend/open_webui/routers/models.py b/backend/open_webui/routers/models.py index a1f642bbce..85f0fb4f64 100644 --- a/backend/open_webui/routers/models.py +++ b/backend/open_webui/routers/models.py @@ -343,10 +343,8 @@ async def get_model_by_id( @router.get("/model/profile/image") -def get_model_profile_image( - id: str, user=Depends(get_verified_user), db: Session = Depends(get_session) -): - model = Models.get_model_by_id(id, db=db) +def get_model_profile_image(id: str, user=Depends(get_verified_user)): + model = Models.get_model_by_id(id) if model: etag = f'"{model.updated_at}"' if model.updated_at else None diff --git a/backend/open_webui/routers/users.py b/backend/open_webui/routers/users.py index 8eb4b5d199..20b69bcdf7 100644 --- a/backend/open_webui/routers/users.py +++ b/backend/open_webui/routers/users.py @@ -498,10 +498,8 @@ async def get_user_oauth_sessions_by_id( @router.get("/{user_id}/profile/image") -async def get_user_profile_image_by_id( - user_id: str, user=Depends(get_verified_user), db: Session = Depends(get_session) -): - user = Users.get_user_by_id(user_id, db=db) +def get_user_profile_image_by_id(user_id: str, user=Depends(get_verified_user)): + user = Users.get_user_by_id(user_id) if user: if user.profile_image_url: # check if it's url or base64 From 5a075a2c836e46b83f8710285f09aff1f6125072 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 12 Jan 2026 21:53:41 +0400 Subject: [PATCH 022/311] fix: members only groups --- backend/open_webui/models/groups.py | 14 +++++++------- .../workspace/common/AccessControl.svelte | 5 ++++- .../workspace/common/MemberSelector.svelte | 6 +++++- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/backend/open_webui/models/groups.py b/backend/open_webui/models/groups.py index ae557f4daf..f1ece68aaf 100644 --- a/backend/open_webui/models/groups.py +++ b/backend/open_webui/models/groups.py @@ -165,15 +165,15 @@ def get_groups(self, filter, db: Optional[Session] = None) -> list[GroupResponse share_value = filter["share"] member_id = filter.get("member_id") json_share = Group.data["config"]["share"] - json_share_bool = json_share.as_boolean() - json_share_str = json_share.as_string() + json_share_lower = func.lower(json_share.as_string()) if share_value: - # Groups open to anyone: data is null, share is null, or share is true + # Groups open to anyone: data is null, config.share is null, or share is true + # Use case-insensitive string comparison to handle variations like "True", "TRUE" anyone_can_share = or_( Group.data.is_(None), - json_share_bool.is_(None), - json_share_bool == True, + json_share_lower.is_(None), + json_share_lower == "true", ) if member_id: @@ -184,7 +184,7 @@ def get_groups(self, filter, db: Optional[Session] = None) -> list[GroupResponse .subquery() ) members_only_and_is_member = and_( - json_share_str == "members", + json_share_lower == "members", Group.id.in_(member_groups_subq), ) query = query.filter( @@ -194,7 +194,7 @@ def get_groups(self, filter, db: Optional[Session] = None) -> list[GroupResponse query = query.filter(anyone_can_share) else: query = query.filter( - and_(Group.data.isnot(None), json_share_bool == False) + and_(Group.data.isnot(None), json_share_lower == "false") ) else: diff --git a/src/lib/components/workspace/common/AccessControl.svelte b/src/lib/components/workspace/common/AccessControl.svelte index 4355a6587f..1bf4bbc1f8 100644 --- a/src/lib/components/workspace/common/AccessControl.svelte +++ b/src/lib/components/workspace/common/AccessControl.svelte @@ -42,7 +42,10 @@ }; onMount(async () => { - groups = await getGroups(localStorage.token, true); + groups = await getGroups(localStorage.token, true).catch((error) => { + console.error(error); + return []; + }); if (accessControl === null) { initPublicAccess(); diff --git a/src/lib/components/workspace/common/MemberSelector.svelte b/src/lib/components/workspace/common/MemberSelector.svelte index 6627ae4459..a9bbb7149f 100644 --- a/src/lib/components/workspace/common/MemberSelector.svelte +++ b/src/lib/components/workspace/common/MemberSelector.svelte @@ -65,7 +65,11 @@ } onMount(async () => { - groups = await getGroups(localStorage.token, true); + groups = await getGroups(localStorage.token, true).catch((error) => { + console.error(error); + return []; + }); + if (userIds.length > 0) { userIds.forEach(async (id) => { const res = await getUserById(localStorage.token, id).catch((error) => { From de0cbb9073298f579e0d4b9e5340b266f474acec Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 12 Jan 2026 21:56:02 +0400 Subject: [PATCH 023/311] refac --- backend/open_webui/models/groups.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/models/groups.py b/backend/open_webui/models/groups.py index f1ece68aaf..31b34c45c8 100644 --- a/backend/open_webui/models/groups.py +++ b/backend/open_webui/models/groups.py @@ -165,14 +165,15 @@ def get_groups(self, filter, db: Optional[Session] = None) -> list[GroupResponse share_value = filter["share"] member_id = filter.get("member_id") json_share = Group.data["config"]["share"] - json_share_lower = func.lower(json_share.as_string()) + json_share_str = json_share.as_string() + json_share_lower = func.lower(json_share_str) if share_value: # Groups open to anyone: data is null, config.share is null, or share is true # Use case-insensitive string comparison to handle variations like "True", "TRUE" anyone_can_share = or_( Group.data.is_(None), - json_share_lower.is_(None), + json_share_str.is_(None), json_share_lower == "true", ) From 1555252c4a60cbf0be96d4725ea25b42e101cdf9 Mon Sep 17 00:00:00 2001 From: G30 <50341825+silentoplayz@users.noreply.github.com> Date: Thu, 15 Jan 2026 01:43:25 -0500 Subject: [PATCH 024/311] fix: handle undefined model in createMessagePair function (#20663) - Add a null check when looking up model to prevent JavaScript error when trying to add a message pair in a chat with an invalid/corrupt model ID. --- src/lib/components/chat/Chat.svelte | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index ff41dfe472..d7341257f2 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -1282,6 +1282,11 @@ const modelId = selectedModels[0]; const model = $models.filter((m) => m.id === modelId).at(0); + if (!model) { + toast.error($i18n.t('Model not found')); + return; + } + const messages = createMessagesList(history, history.currentId); const parentMessage = messages.length !== 0 ? messages.at(-1) : null; From e26f6acc3b67831dd3d80d4eae59b96adca858b4 Mon Sep 17 00:00:00 2001 From: Kailey Wong <61530252+kaileywong@users.noreply.github.com> Date: Wed, 14 Jan 2026 22:44:35 -0800 Subject: [PATCH 025/311] fix: use proper X-Api-Key header format when docling api key provided (#20652) --- backend/open_webui/retrieval/loaders/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/retrieval/loaders/main.py b/backend/open_webui/retrieval/loaders/main.py index 2b83e44283..bf7c7286b5 100644 --- a/backend/open_webui/retrieval/loaders/main.py +++ b/backend/open_webui/retrieval/loaders/main.py @@ -143,7 +143,7 @@ def load(self) -> list[Document]: with open(self.file_path, "rb") as f: headers = {} if self.api_key: - headers["X-Api-Key"] = f"Bearer {self.api_key}" + headers["X-Api-Key"] = f"{self.api_key}" r = requests.post( f"{self.url}/v1/convert/file", From 1d343aeae41dff8f4ebd1e08720db80780f62159 Mon Sep 17 00:00:00 2001 From: EntropyYue <164553692+EntropyYue@users.noreply.github.com> Date: Thu, 15 Jan 2026 14:46:00 +0800 Subject: [PATCH 026/311] enh: Make builtin search web tools asynchronous (#20630) Co-authored-by: Tim Baek Co-authored-by: joaoback <156559121+joaoback@users.noreply.github.com> --- backend/open_webui/tools/builtin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/tools/builtin.py b/backend/open_webui/tools/builtin.py index d26e032727..144d18d284 100644 --- a/backend/open_webui/tools/builtin.py +++ b/backend/open_webui/tools/builtin.py @@ -166,7 +166,7 @@ async def search_web( engine = __request__.app.state.config.WEB_SEARCH_ENGINE user = UserModel(**__user__) if __user__ else None - results = _search_web(__request__, engine, query, user) + results = await asyncio.to_thread(_search_web, __request__, engine, query, user) # Limit results results = results[:count] if results else [] From 1c1f72f05c526dbf7be2740f0e16c79289589f3e Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Thu, 15 Jan 2026 21:15:02 +0100 Subject: [PATCH 027/311] Update builtin.py (#20705) --- backend/open_webui/tools/builtin.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/backend/open_webui/tools/builtin.py b/backend/open_webui/tools/builtin.py index 144d18d284..fcd1d4d233 100644 --- a/backend/open_webui/tools/builtin.py +++ b/backend/open_webui/tools/builtin.py @@ -1599,6 +1599,25 @@ async def query_knowledge_files( if not __user__: return json.dumps({"error": "User context not available"}) + # Coerce parameters from LLM tool calls (may come as strings) + if isinstance(count, str): + try: + count = int(count) + except ValueError: + count = 5 # Default fallback + + # Handle knowledge_ids being string "None", "null", or empty + if isinstance(knowledge_ids, str): + if knowledge_ids.lower() in ("none", "null", ""): + knowledge_ids = None + else: + # Try to parse as JSON array if it looks like one + try: + knowledge_ids = json.loads(knowledge_ids) + except json.JSONDecodeError: + # Treat as single ID + knowledge_ids = [knowledge_ids] + try: from open_webui.models.knowledge import Knowledges from open_webui.models.files import Files From 711a2cd7385ea755b789083dfbecdf7916cf740d Mon Sep 17 00:00:00 2001 From: Kylapaallikko Date: Sat, 17 Jan 2026 19:37:14 +0200 Subject: [PATCH 028/311] Update translation.json (#20741) Added missing translations and minor changes to wording of the translations. --- src/lib/i18n/locales/fi-FI/translation.json | 208 ++++++++++---------- 1 file changed, 104 insertions(+), 104 deletions(-) diff --git a/src/lib/i18n/locales/fi-FI/translation.json b/src/lib/i18n/locales/fi-FI/translation.json index 2e092f59a3..ff34a7b91d 100644 --- a/src/lib/i18n/locales/fi-FI/translation.json +++ b/src/lib/i18n/locales/fi-FI/translation.json @@ -12,10 +12,10 @@ "{{COUNT}} Available Tools": "{{COUNT}} työkalua saatavilla", "{{COUNT}} characters": "{{COUNT}} kirjainta", "{{COUNT}} extracted lines": "{{COUNT}} poimittua riviä", - "{{COUNT}} files": "", + "{{COUNT}} files": "{{COUNT}} tiedostoa", "{{COUNT}} hidden lines": "{{COUNT}} piilotettua riviä", "{{COUNT}} Replies": "{{COUNT}} vastausta", - "{{COUNT}} Rows": "", + "{{COUNT}} Rows": "{{COUNT}} riviä", "{{COUNT}} Sources": "{{COUNT}} lähdettä", "{{COUNT}} words": "{{COUNT}} sanaa", "{{LOCALIZED_DATE}} at {{LOCALIZED_TIME}}": "{{LOCALIZED_DATE}} {{LOCALIZED_TIME}}", @@ -47,7 +47,7 @@ "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Aktivoi tämä komento kirjoittamalla \"/{{COMMAND}}\" chat-syötteeseen.", "Active": "Aktiivinen", "Active Users": "Aktiiviset käyttäjät", - "Activity": "", + "Activity": "Toiminta", "Add": "Lisää", "Add a model ID": "Lisää mallitunnus", "Add a short description about what this model does": "Lisää lyhyt kuvaus siitä, mitä tämä malli tekee", @@ -70,15 +70,15 @@ "Add text content": "Lisää tekstisisältöä", "Add User": "Lisää käyttäjä", "Add User Group": "Lisää käyttäjäryhmä", - "Add webpage": "", + "Add webpage": "Lisää verkkosivu", "Additional Config": "Lisäasetukset", "Additional configuration options for marker. This should be a JSON string with key-value pairs. For example, '{\"key\": \"value\"}'. Supported keys include: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level": "", "Additional Parameters": "Lisäparametrit", "Adds filenames, titles, sections, and snippets into the BM25 text to improve lexical recall.": "", - "Adjusting these settings will apply changes universally to all users.": "Näiden asetusten säätäminen vaikuttaa kaikkiin käyttäjiin.", + "Adjusting these settings will apply changes universally to all users.": "Näiden asetusten muokkaaminen vaikuttaa kaikkiin käyttäjiin.", "admin": "hallinta", "Admin": "Ylläpito", - "Admin Contact Email": "", + "Admin Contact Email": "Ylläpidon sähköposti", "Admin Panel": "Ylläpitopaneeli", "Admin Settings": "Ylläpitoasetukset", "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Ylläpitäjillä on pääsy kaikkiin työkaluihin koko ajan; käyttäjät tarvitsevat työkaluja mallille määritettynä työtilassa.", @@ -131,7 +131,7 @@ "and {{COUNT}} more": "ja {{COUNT}} muuta", "and create a new shared link.": "ja luo uusi jaettu linkki.", "Android": "Android", - "Anyone": "", + "Anyone": "Kukatahansa", "API Base URL": "API:n verkko-osoite", "API Base URL for Datalab Marker service. Defaults to: https://www.datalab.to/api/v1/marker": "API verkko-osoite Datalabb Marker palveluun. Oletuksena: https://www.datalab.to/api/v1/marker", "API Key": "API-avain", @@ -140,7 +140,7 @@ "API keys": "API-avaimet", "API Keys": "API-avaimet", "API Mode": "API-moodi", - "API Timeout": "", + "API Timeout": "API aikakatkaisu", "API Version": "API-versio", "API Version is required": "API-versio vaaditaan", "Application DN": "Sovelluksen DN", @@ -159,7 +159,7 @@ "Are you sure?": "Oletko varma?", "Arena Models": "Arena-mallit", "Artifacts": "Artefaktit", - "Asc": "", + "Asc": "Nouseva", "Ask": "Kysy", "Ask a question": "Kysy kysymys", "Assistant": "Avustaja", @@ -177,7 +177,7 @@ "Authenticate": "Todentaa", "Authentication": "Todennus", "Auto": "Automaattinen", - "Auto (Random)": "", + "Auto (Random)": "Automaattinen (satunnainen)", "Auto-Copy Response to Clipboard": "Kopioi vastaus automaattisesti leikepöydälle", "Auto-playback response": "Toista vastaus automaattisesti", "Autocomplete Generation": "Automaattisen täydennyksen luonti", @@ -216,12 +216,12 @@ "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Tiettyjen tokeneiden tehostaminen tai rankaiseminen rajoitetuista vastauksista. Poikkeaman arvot rajoitetaan välille -100 ja 100 (mukaan lukien). (Oletus: ei mitään)", "Brave": "", "Brave Search API Key": "Brave Search API -avain", - "Builtin Tools": "", + "Builtin Tools": "Sisäänrakennetut työkalut", "Bullet List": "Luettelo", "Button ID": "Painikkeen ID", "Button Label": "Painikkeen nimi", "Button Prompt": "Painikkeen kehoite", - "by {{name}}": "", + "by {{name}}": "tekijä {{name}}", "By {{name}}": "Tekijä {{name}}", "Bypass Embedding and Retrieval": "Ohita upotus ja haku", "Bypass Web Loader": "Ohita verkkolataaja", @@ -231,8 +231,8 @@ "Call feature is not supported when using Web STT engine": "Puhelutoimintoa ei tueta käytettäessä web-puheentunnistusmoottoria", "Camera": "Kamera", "Cancel": "Peruuta", - "Cannot create an empty note.": "", - "Capabilities": "Ominaisuuksia", + "Cannot create an empty note.": "Tyhjää muistiinpanoa ei voi luoda.", + "Capabilities": "Ominaisuudet", "Capture": "Näyttökuva", "Capture Audio": "Kaappaa ääntä", "Certificate Path": "Varmennepolku", @@ -241,7 +241,7 @@ "Channel deleted successfully": "Kanavan poisto onnistui", "Channel Name": "Kanavan nimi", "Channel name cannot be empty.": "Kanavan nimi ei voi olla tyhjä", - "Channel name must be less than 128 characters": "", + "Channel name must be less than 128 characters": "Kanavan nimi oltava alle 128 merkkiä pitkä", "Channel Type": "Kanavatyyppi", "Channel updated successfully": "Kanavan päivitys onnistui", "Channels": "Kanavat", @@ -264,10 +264,10 @@ "Check for updates": "Tarkista päivitykset", "Checking for updates...": "Tarkistetaan päivityksiä...", "Choose a model before saving...": "Valitse malli ennen tallentamista...", - "Chunk Min Size Target": "", + "Chunk Min Size Target": "Osien vähimmäiskoko", "Chunk Overlap": "Päällekkäisten osien määrä", "Chunk Size": "Osien koko", - "Chunks smaller than this threshold will be merged with neighboring chunks when possible. Set to 0 to disable merging.": "", + "Chunks smaller than this threshold will be merged with neighboring chunks when possible. Set to 0 to disable merging.": "Kynnysarvoa pienemmät osat yhdistetään viereisiin osiin mahdollisuuksien mukaan. Aseta arvoksi 0 poistaaksesi yhdistämisen käytöstä.", "Ciphers": "Salausalgoritmi", "Citation": "Lähdeviite", "Citations": "Lähdeviitteet", @@ -303,7 +303,7 @@ "Code Block": "Koodilohko", "Code Editor": "Koodieditori", "Code execution": "Koodin suoritus", - "Code Execution": "", + "Code Execution": "Koodin suoritus", "Code Execution Engine": "Koodin suoritusmoottori", "Code Execution Timeout": "Koodin suorittamisen aikakatkaisu", "Code formatted successfully": "Koodin muotoilu onnistui", @@ -313,7 +313,7 @@ "Collaboration channel where people join as members": "Yhteistyökanava, johon ihmiset liittyvät jäseninä", "Collapse": "Pienennä", "Collection": "Kokoelma", - "Collections": "", + "Collections": "Kokoelmat", "Color": "Väri", "ComfyUI": "ComfyUI", "ComfyUI API Key": "ComfyUI API -avain", @@ -346,12 +346,12 @@ "Contact Admin for WebUI Access": "Ota yhteyttä ylläpitäjään WebUI-käyttöä varten", "Content": "Sisältö", "Content Extraction Engine": "Sisällönpoimintamoottori", - "Content lengths (character counts only)": "", + "Content lengths (character counts only)": "Sisällön pituus (vain merkkimäärä)", "Continue Response": "Jatka vastausta", "Continue with {{provider}}": "Jatka palvelulla {{provider}}", "Continue with Email": "Jatka sähköpostilla", "Continue with LDAP": "Jatka LDAP:illa", - "Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "Säädä, miten viestin teksti jaetaan puhesynteesipyyntöjä varten. 'Välimerkit' jakaa lauseisiin, 'kappaleet' jakaa kappaleisiin ja 'ei mitään' pitää viestin yhtenä merkkijonona.", + "Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "Muokkaa, miten viestin teksti jaetaan puhesynteesipyyntöjä varten. 'Välimerkit' jakaa lauseisiin, 'kappaleet' jakaa kappaleisiin ja 'ei mitään' pitää viestin yhtenä merkkijonona.", "Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "", "Controls": "Ohjaimet", "Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "Kontrolloi yhtenäisyyden ja monimuotoisuuden tasapainoa tuloksessa. Pienempi arvo tuottaa kohdennetumman ja johdonmukaisemman tekstin.", @@ -367,7 +367,7 @@ "Copy link": "Kopioi linkki", "Copy Link": "Kopioi linkki", "Copy to clipboard": "Kopioi leikepöydälle", - "Copy URL": "", + "Copy URL": "Kopioi linkki", "Copying to clipboard was successful!": "Kopioiminen leikepöydälle onnistui!", "CORS must be properly configured by the provider to allow requests from Open WebUI.": "CORS täytyy olla konfiguroitu palveluntarjoajan toimesta pyyntöjen hyväksymiseksi Open WebUI:sta.", "Create": "Luo", @@ -384,14 +384,14 @@ "Create Model": "Luo malli", "Create new key": "Luo uusi avain", "Create new secret key": "Luo uusi salainen avain", - "Create note": "", + "Create note": "Luo muistiinpano", "Create Note": "Luo muistiinpano", "Create your first note by clicking on the plus button below.": "Luo ensimmäinen muistiinpanosi painamalla alla olevaa plus painiketta.", "Created at": "Luotu", "Created At": "Luotu", "Created by": "Luonut", "Created by you": "Sinun luomasi", - "Created on {{date}}": "", + "Created on {{date}}": "Luotu {{date}}", "CSV Import": "CSV-tuonti", "Ctrl+Enter to Send": "Ctrl+Enter lähettääksesi", "Current Model": "Nykyinen malli", @@ -417,7 +417,7 @@ "Default description enabled": "Oletuskuvaus käytössä", "Default Features": "Oletus ominaisuudet", "Default Filters": "Oletus suodattimet", - "Default Group": "Oletus ryhmä", + "Default Group": "Oletusryhmä", "Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model's built-in tool-calling capabilities, but requires the model to inherently support this feature.": "Oletustila toimii laajemman mallivalikoiman kanssa kutsumalla työkaluja kerran ennen suorittamista. Natiivitila hyödyntää mallin sisäänrakennettuja työkalujen kutsumisominaisuuksia, mutta edellyttää, että malli tukee tätä ominaisuutta.", "Default Model": "Oletusmalli", "Default model updated": "Oletusmalli päivitetty", @@ -447,12 +447,12 @@ "delete this link": "poista tämä linkki", "Delete tool?": "Haluatko varmasti poistaa tämän työkalun?", "Delete User": "Poista käyttäjä", - "Deleted": "", + "Deleted": "Poistettu", "Deleted {{deleteModelTag}}": "Poistettu {{deleteModelTag}}", "Deleted {{name}}": "Poistettu {{nimi}}", "Deleted User": "Käyttäjä poistettu", "Deployment names are required for Azure OpenAI": "Azure OpenAI:lle vaaditaan käyttöönottojen nimet", - "Desc": "", + "Desc": "Laskeva", "Describe your knowledge base and objectives": "Kuvaa tietokantasi ja tavoitteesi", "Description": "Kuvaus", "Detect Artifacts Automatically": "Tunnista artefaktit automaattisesti", @@ -489,7 +489,7 @@ "Dive into knowledge": "Uppoudu tietoon", "Do not install functions from sources you do not fully trust.": "Älä asenna toimintoja lähteistä, joihin et luota täysin.", "Do not install tools from sources you do not fully trust.": "Älä asenna työkaluja lähteistä, joihin et luota täysin.", - "Do you want to sync your usage stats with Open WebUI Community?": "", + "Do you want to sync your usage stats with Open WebUI Community?": "Haluatko jakaa käyttötilastosi Open WebUI yhteisön kanssa?", "Docling": "Docling", "Docling Parameters": "Docling parametrit", "Docling Server URL required.": "Docling palvelimen verkko-osoite vaaditaan.", @@ -498,7 +498,7 @@ "Document Intelligence endpoint required.": "Document Intelligence pääte vaaditaan", "Document Intelligence Model": "Document Intelligence malli", "Documentation": "Dokumentaatio", - "Documents": "", + "Documents": "Dokumentit", "does not make any external connections, and your data stays securely on your locally hosted server.": "ei tee ulkoisia yhteyksiä, ja tietosi pysyvät turvallisesti paikallisesti isännöidyllä palvelimellasi.", "Domain Filter List": "Verkko-osoitteiden suodatuslista", "don't fetch random pipelines from sources you don't trust.": "Älä hae satunnaisia pipelineja epäluotettavista lähteistä.", @@ -509,11 +509,11 @@ "Done": "Valmis", "Download": "Lataa", "Download & Delete": "Lataa ja poista", - "Download as JSON": "", + "Download as JSON": "Lataa JSON:na", "Download as SVG": "Lataa SVG:nä", "Download canceled": "Lataus peruutettu", "Download Database": "Lataa tietokanta", - "Downloading stats...": "", + "Downloading stats...": "Ladataa tilastoja...", "Draw": "Piirros", "Drop any files here to upload": "Pudota tähän ladattavat tiedostot", "DuckDuckGo": "", @@ -522,7 +522,7 @@ "e.g. 60": "esim. 60", "e.g. A filter to remove profanity from text": "esim. suodatin, joka poistaa kirosanoja tekstistä", "e.g. about the Roman Empire": "esim. Rooman valtakunta", - "e.g. alloy, echo, shimmer": "", + "e.g. alloy, echo, shimmer": "esim. alloy, echo, shimmer", "e.g. en": "esim. en", "e.g. My Filter": "esim. Oma suodatin", "e.g. My Tools": "esim. Omat työkalut", @@ -575,7 +575,7 @@ "Endpoint URL": "Päätepiste verkko-osoite", "Enforce Temporary Chat": "Pakota väliaikaiset keskustelut", "Enhance": "Paranna", - "Enrich Hybrid Search Text": "", + "Enrich Hybrid Search Text": "Rikasta hybridihakutekstiä", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Varmista, että CSV-tiedostossasi on 4 saraketta tässä järjestyksessä: Nimi, Sähköposti, Salasana, Rooli.", "Enter {{role}} message here": "Kirjoita {{role}}-viesti tähän", "Enter a detail about yourself for your LLMs to recall": "Kirjoita yksityiskohta itsestäsi, jonka LLM-ohjelmat voivat muistaa", @@ -592,7 +592,7 @@ "Enter Bocha Search API Key": "Kirjoita Bocha Search API -avain", "Enter Brave Search API Key": "Kirjoita Brave Search API -avain", "Enter certificate path": "Kirjoita varmennepolku", - "Enter Chunk Min Size Target": "", + "Enter Chunk Min Size Target": "Kirjoita osien vähimmäiskoko", "Enter Chunk Overlap": "Syötä osien päällekkäisyys", "Enter Chunk Size": "Syötä osien koko", "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "Syötä pilkulla erottaen \"token:bias_value\" parit (esim. 5432:100, 413:-100)", @@ -616,7 +616,7 @@ "Enter External Web Search URL": "Kirjoita ulkoisen Web Search verkko-osoite", "Enter Firecrawl API Base URL": "Kirjoita Firecrawl API -verkko-osoite", "Enter Firecrawl API Key": "Kirjoita Firecrawl API-avain", - "Enter Firecrawl Timeout": "", + "Enter Firecrawl Timeout": "Kirjoita Firecrawl aikakatkaisu", "Enter folder name": "Kirjoita kansion nimi", "Enter function name filter list (e.g. func1, !func2)": "Kirjoita funktion nimen suodatinluettelo (esim. func1, !func2)", "Enter Github Raw URL": "Kirjoita Github Raw -verkko-osoite", @@ -625,7 +625,7 @@ "Enter hex color (e.g. #FF0000)": "Kirjota hex väri (esim. #FF0000)", "Enter ID": "Kirjoita ID", "Enter Image Size (e.g. 512x512)": "Kirjoita kuvan koko (esim. 512x512)", - "Enter Jina API Base URL": "", + "Enter Jina API Base URL": "Kirjoita Jina API verkko-osoite", "Enter Jina API Key": "Kirjoita Jina API -avain", "Enter JSON config (e.g., {\"disable_links\": true})": "Kirjoita JSON asetus (esim. {\"disable_links\": true})", "Enter Jupyter Password": "Kirjoita Jupyter salasana", @@ -634,7 +634,7 @@ "Enter Kagi Search API Key": "Kirjoita Kagi Search API -avain", "Enter Key Behavior": "Enter näppäimen käyttäytyminen", "Enter language codes": "Kirjoita kielikoodit", - "Enter MinerU API Key": "", + "Enter MinerU API Key": "Kirjoita MinerU API-avain", "Enter Mistral API Base URL": "Kirjoita Mistral API verkko-osoite", "Enter Mistral API Key": "Kirjoita Mistral API-avain", "Enter Model ID": "Kirjoita mallitunnus", @@ -654,7 +654,7 @@ "Enter SearchApi API Key": "Kirjoita SearchApi API -avain", "Enter SearchApi Engine": "Kirjoita SearchApi-moottori", "Enter Searxng Query URL": "Kirjoita Searxng-kyselyn verkko-osoite", - "Enter Searxng search language": "", + "Enter Searxng search language": "Kirjoita Searxng hakukieli", "Enter Seed": "Kirjoita siemenluku", "Enter SerpApi API Key": "Kirjoita SerpApi API -avain", "Enter SerpApi Engine": "Valitse SerpApi Moottori", @@ -760,10 +760,10 @@ "Failed to generate title": "Otsikon luonti epäonnistui", "Failed to import models": "Mallien tuonti epäonnistui", "Failed to load chat preview": "Keskustelun esikatselun lataaminen epäonnistui", - "Failed to load Excel/CSV file. Please try downloading it instead.": "", + "Failed to load Excel/CSV file. Please try downloading it instead.": "Excel/CSV tiedoston lataaminen epäonnistui. Yritä ladata se sen sijaan.", "Failed to load file content.": "Tiedoston sisällön lataaminen epäonnistui.", "Failed to move chat": "Keskustelun siirto epäonnistui", - "Failed to process URL: {{url}}": "", + "Failed to process URL: {{url}}": "Verkko-osoitteen käsittely epäonnistui: {{url}}", "Failed to read clipboard contents": "Leikepöydän sisällön lukeminen epäonnistui", "Failed to remove member": "Jäsenen poistaminen epäonnistui", "Failed to render diagram": "Diagrammin renderöinti epäonnistui", @@ -777,7 +777,7 @@ "Features": "Ominaisuudet", "Features Permissions": "Ominaisuuksien käyttöoikeudet", "February": "helmikuu", - "Feedback": "", + "Feedback": "Palaute", "Feedback deleted successfully": "Palaute poistettu onnistuneesti", "Feedback Details": "Palautteen tiedot", "Feedback History": "Palautehistoria", @@ -786,7 +786,7 @@ "File": "Tiedosto", "File added successfully.": "Tiedosto lisätty onnistuneesti.", "File content updated successfully.": "Tiedoston sisältö päivitetty onnistuneesti.", - "File Context": "", + "File Context": "Tiedoston konteksti", "File Mode": "Tiedostotila", "File not found.": "Tiedostoa ei löytynyt.", "File removed successfully.": "Tiedosto poistettu onnistuneesti.", @@ -802,13 +802,13 @@ "Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Sormenjäljen väärentäminen havaittu: Alkukirjaimia ei voi käyttää avatarina. Käytetään oletusprofiilikuvaa.", "Firecrawl API Base URL": "Firecrawl API -verkko-osoite", "Firecrawl API Key": "Firecrawl API-avain", - "Firecrawl Timeout (s)": "", + "Firecrawl Timeout (s)": "Firecrawl aikakatkaisu (t)", "Floating Quick Actions": "Kelluvat pikakomennot", "Focus Chat Input": "Kohdista keskustelu tekstikenttään", "Folder": "Kansio", "Folder Background Image": "Kansion taustakuva", "Folder deleted successfully": "Kansio poistettu onnistuneesti", - "Folder Max File Count": "", + "Folder Max File Count": "Kansion tiedostojen enimmäismäärä", "Folder Name": "Kansion nimi", "Folder name cannot be empty.": "Kansion nimi ei voi olla tyhjä.", "Folder name updated successfully": "Kansion nimi päivitetty onnistuneesti", @@ -868,7 +868,7 @@ "Google PSE API Key": "Google PSE API -avain", "Google PSE Engine Id": "Google PSE -moottorin tunnus", "Gravatar": "Gravatar", - "Grid": "", + "Grid": "Ruudukko", "Grokipedia": "", "Group": "Ryhmä", "Group Channel": "Ryhmäkanava", @@ -923,7 +923,7 @@ "Image Prompt Generation": "Kuvan kehote generointi", "Image Prompt Generation Prompt": "Kuvan generoinnin kehote", "Image Size": "Kuvan koko", - "Images": "", + "Images": "Kuvat", "Import": "Tuo", "Import Chats": "Tuo keskustelut", "Import Config from JSON File": "Tuo asetukset JSON-tiedostosta", @@ -942,7 +942,7 @@ "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "Kuinka nopeasti algoritmi mukautuu generoidun tekstin palautteeseen. Alempi oppimisnopeus hidastaa mukautumista, kun taas nopeampi oppimisnopeus tekee algoritmistä reagoivamman.", "Info": "Tiedot", "Initials": "Nimikirjaimet", - "Inject file content into conversation context": "", + "Inject file content into conversation context": "Upota tiedostosisältö keskustelun kontekstiin", "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Upota koko sisältö kontekstiin kattavaa käsittelyä varten. Tätä suositellaan monimutkaisille kyselyille.", "Input": "Tekstikenttä", "Input Key (e.g. text, unet_name, steps)": "Syötteen arvo (esim. text, unet_namme, steps)", @@ -956,7 +956,7 @@ "Integration": "Integrointi", "Integrations": "Integraatiot", "Interface": "Käyttöliittymä", - "Interface Settings Access": "", + "Interface Settings Access": "Käyttöliittymän asetusten käyttöoikeus", "Invalid file content": "Virheellinen tiedostosisältö", "Invalid file format.": "Virheellinen tiedostomuoto.", "Invalid JSON file": "Virheellinen JSON tiedosto", @@ -970,7 +970,7 @@ "is typing...": "Kirjoittaa...", "Italic": "Kursiivi", "January": "tammikuu", - "Jina API Base URL": "", + "Jina API Base URL": "Jina API verkko-osoite", "Jina API Key": "Jina API -avain", "join our Discord for help.": "liity Discordiimme saadaksesi apua.", "JSON": "JSON", @@ -995,7 +995,7 @@ "Knowledge created successfully.": "Tietokanta luotu onnistuneesti.", "Knowledge deleted successfully.": "Tietokanta poistettu onnistuneesti.", "Knowledge Description": "Tietokannan kuvaus", - "Knowledge exported successfully": "", + "Knowledge exported successfully": "Tietokanta viety onnistuneesti", "Knowledge Name": "Tietokannan nimi", "Knowledge Public Sharing": "Tietokannan julkinen jakaminen", "Knowledge reset successfully.": "Tietokanta nollattu onnistuneesti.", @@ -1022,7 +1022,7 @@ "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "Jätä tyhjäksi sisällyttääksesi \"{{url}}/api/tags\" päätepisteen mallit", "Leave empty to include all models from \"{{url}}/models\" endpoint": "Jätä tyhjäksi sisällyttääksesi \"{{url}}/models\" päätepisteen mallit", "Leave empty to include all models or select specific models": "Jätä tyhjäksi, jos haluat sisällyttää kaikki mallit tai valitse tietyt mallit", - "Leave empty to use first admin user": "", + "Leave empty to use first admin user": "Jätä tyhjäksi käyttääksesi ensimmäistä ylläpitäjää", "Leave empty to use the default model (voxtral-mini-latest).": "Jätä tyhjäks käyttääksesi oletusmallia (voxtral-mini-latest)", "Leave empty to use the default prompt, or enter a custom prompt": "Jätä tyhjäksi käyttääksesi oletuskehotetta tai kirjoita mukautettu kehote", "Leave model field empty to use the default model.": "Jätä malli kenttä tyhjäksi käyttääksesi oletus mallia.", @@ -1031,8 +1031,8 @@ "License": "Lisenssi", "Lift List": "Nostolista", "Light": "Vaalea", - "Limit concurrent search queries. 0 = unlimited (default). Set to 1 for sequential execution (recommended for APIs with strict rate limits like Brave free tier).": "", - "List": "", + "Limit concurrent search queries. 0 = unlimited (default). Set to 1 for sequential execution (recommended for APIs with strict rate limits like Brave free tier).": "Rajoita samanaikaisia hakukyselyitä. 0 = rajoittamaton (oletus). Aseta arvoon 1 peräkkäistä suoritusta varten (suositellaan API-rajapinnoille, joilla on tiukat nopeusrajoitukset, kuten Brave-ilmaistaso).", + "List": "Lista", "Listening...": "Kuuntelee...", "Llama.cpp": "Llama.cpp", "LLMs can make mistakes. Verify important information.": "Kielimallit voivat tehdä virheitä. Tarkista tärkeät tiedot.", @@ -1062,12 +1062,12 @@ "Manage your account information.": "Hallitse tilitietojasi", "March": "maaliskuu", "Markdown": "Markdown", - "Markdown Header Text Splitter": "", + "Markdown Header Text Splitter": "Markdown-otsikkotekstin jakaja", "Max Speakers": "Puhujien enimmäismäärä", "Max Upload Count": "Latausten enimmäismäärä", "Max Upload Size": "Latausten enimmäiskoko", - "Maximum number of files allowed per folder.": "", - "Maximum number of files per folder is {{max}}.": "", + "Maximum number of files allowed per folder.": "Kansiota kohden sallittujen tiedostojen enimmäismäärä.", + "Maximum number of files per folder is {{max}}.": "Tiedostojen enimmäismäärä kansiossa on {{max}}.", "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Enintään 3 mallia voidaan ladata samanaikaisesti. Yritä myöhemmin uudelleen.", "May": "toukokuu", "MBR": "MBR", @@ -1077,7 +1077,7 @@ "Member removed successfully": "Jäsen poistettu onnistuneesti", "Members": "Jäsenet", "Members added successfully": "Jäsen lisätty onnistuneesti", - "Memories": "", + "Memories": "Muistot", "Memories accessible by LLMs will be shown here.": "Muistitiedostot, joita LLM-ohjelmat käyttävät, näkyvät tässä.", "Memory": "Muisti", "Memory added successfully": "Muisti lisätty onnistuneesti", @@ -1087,7 +1087,7 @@ "Merge Responses": "Yhdistä vastaukset", "Merged Response": "Yhdistetty vastaus", "Message": "Viesti", - "Message counts and response timestamps": "", + "Message counts and response timestamps": "Viestien määrä ja vastausten aikaleimat", "Message rating should be enabled to use this feature": "Tämän toiminnon käyttämiseksi viestiarviointi on otettava käyttöön", "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Linkin luomisen jälkeen lähettämäsi viestit eivät ole jaettuja. Käyttäjät, joilla on verkko-osoite, voivat tarkastella jaettua keskustelua.", "Microsoft OneDrive": "", @@ -1120,11 +1120,11 @@ "Model Name": "Mallin nimi", "Model name already exists, please choose a different one": "Mallin nimi on jo olemassa, valitse toinen nimi.", "Model Name is required.": "Mallin nimi on pakollinen", - "Model names and usage frequency": "", + "Model names and usage frequency": "Mallien nimet ja käyttötiheys", "Model not selected": "Mallia ei ole valittu", "Model Params": "Mallin parametrit", "Model Permissions": "Mallin käyttöoikeudet", - "Model responses or outputs": "", + "Model responses or outputs": "Mallin vastaukset tai tuotokset", "Model unloaded successfully": "Malli purettu onnistuneesti", "Model updated successfully": "Malli päivitetty onnistuneesti", "Model(s) do not support file upload": "Malli(t) ei tue tiedostojen lataamista", @@ -1145,22 +1145,22 @@ "Name and ID are required, please fill them out": "Nimi ja ID vaaditaan, täytä puuttuvat kentät", "Name your knowledge base": "Anna tietokannalle nimi", "Native": "Natiivi", - "New": "", + "New": "Uusi", "New Button": "Uusi painike", "New Chat": "Uusi keskustelu", "New Folder": "Uusi kansio", "New Function": "Uusi toiminto", "New Knowledge": "Uutta tietoa", "New Model": "Uusi malli", - "New Note": "", + "New Note": "Uusi muistiinpano", "New Password": "Uusi salasana", "New Prompt": "Uusi kehoite", "New Temporary Chat": "Uusi väliaikainen keskustelu", "New Tool": "Uusi työkalu", - "New Webhook": "", + "New Webhook": "Uusi Webhook", "new-channel": "uusi-kanava", "Next message": "Seuraava viesti", - "No activity data": "", + "No activity data": "Ei aktiivisuustietoja", "No authentication": "Ei todennusta", "No chats found": "Keskuteluja ei löytynyt", "No chats found for this user.": "Käyttäjän keskusteluja ei löytynyt.", @@ -1171,14 +1171,14 @@ "No conversation to save": "Ei tallennettavaa keskustelua", "No distance available": "Etäisyyttä ei saatavilla", "No expiration can pose security risks.": "Vanhenemisen laittamatta jättäminen voi altistaa tietoturvariskeille.", - "No feedback found": "", + "No feedback found": "Ei palautetta", "No file selected": "Tiedostoa ei ole valittu", - "No files in this knowledge base.": "", + "No files in this knowledge base.": "Tässä tietokannassa ei ole tiedostoja.", "No functions found": "Funktioita ei löytynyt", "No groups with access, add a group to grant access": "Ei ryhmiä, joilla on pääsy, lisää ryhmä antaaksesi pääsyn", "No HTML, CSS, or JavaScript content found.": "HTML-, CSS- tai JavaScript-sisältöä ei löytynyt.", "No inference engine with management support found": "", - "No knowledge bases found.": "", + "No knowledge bases found.": "Tietokantoja ei löytynyt.", "No knowledge found": "Tietoa ei löytynyt", "No memories to clear": "Ei muistia tyhjennettäväksi", "No model IDs": "Ei mallitunnuksia", @@ -1186,7 +1186,7 @@ "No models selected": "Malleja ei ole valittu", "No Notes": "Ei muistiinpanoja", "No notes found": "Muistiinpanoja ei löytynyt", - "No one": "", + "No one": "Kukaan", "No pinned messages": "Ei kiinnitettyjä viestejä", "No prompts found": "Kehoitteita ei löytynyt", "No results": "Ei tuloksia", @@ -1199,7 +1199,7 @@ "No users were found.": "Käyttäjiä ei löytynyt.", "No valves": "Ei venttiileitä", "No valves to update": "Ei venttiileitä päivitettäväksi", - "No webhooks yet": "", + "No webhooks yet": "Ei vielä webhookeja", "Node Ids": "Node id:t", "None": "Ei mikään", "Not factually correct": "Ei faktuaalisesti oikein", @@ -1239,7 +1239,7 @@ "Only invited users can access": "Vain kutsutut jäsenet voivat päästä", "Only markdown files are allowed": "Vain markdown tiedostot ovat sallittuja", "Only select users and groups with permission can access": "Vain valitut käyttäjät ja ryhmät, joilla on käyttöoikeus, pääsevät käyttämään", - "Only sync new/updated chats": "", + "Only sync new/updated chats": "Synkronoi vain uudet/päivitetyt keskustelut", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Hups! Näyttää siltä, että verkko-osoite on virheellinen. Tarkista se ja yritä uudelleen.", "Oops! There are files still uploading. Please wait for the upload to complete.": "Hups! Tiedostoja on vielä ladattavana. Odota, että lataus on valmis.", "Oops! There was an error in the previous response.": "Hups! Edellisessä vastauksessa oli virhe.", @@ -1256,7 +1256,7 @@ "Open WebUI can use tools provided by any OpenAPI server.": "Open WebUI voi käyttää minkä tahansa OpenAPI-palvelimen tarjoamia työkaluja.", "Open WebUI uses faster-whisper internally.": "Open WebUI käyttää faster-whisperia sisäisesti.", "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Open WebUI käyttää SpeechT5:tä ja CMU Arctic -kaiuttimen upotuksia.", - "Open WebUI version": "", + "Open WebUI version": "Open WebUI versio", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open WebUI -versio (v{{OPEN_WEBUI_VERSION}}) on alempi kuin vaadittu versio (v{{REQUIRED_VERSION}})", "OpenAI": "OpenAI", "OpenAI API": "OpenAI API", @@ -1281,8 +1281,8 @@ "page": "sivu", "Paginate": "Sivutus", "Parameters": "Parametrit", - "Parent message not found": "", - "Participate in community leaderboards and evaluations! Syncing aggregated usage stats helps drive research and improvements to Open WebUI. Your privacy is paramount: no message content is ever shared.": "", + "Parent message not found": "Ylätason viestiä ei löytynyt", + "Participate in community leaderboards and evaluations! Syncing aggregated usage stats helps drive research and improvements to Open WebUI. Your privacy is paramount: no message content is ever shared.": "Osallistu yhteisön tulostaulukoihin ja arviointeihin! Koottujen käyttötilastojen synkronointi auttaa edistämään Open WebUI:n tutkimuksia ja parannuksia. Tietosuojasi on ensiarvoisen tärkeää: viestien sisältöä ei koskaan jaeta.", "Password": "Salasana", "Passwords do not match.": "Salasanat eivät täsmää", "Paste Large Text as File": "Liitä suuri teksti tiedostona", @@ -1308,7 +1308,7 @@ "Pipe": "Putki", "Pipeline deleted successfully": "Putki poistettu onnistuneesti", "Pipeline downloaded successfully": "Putki ladattu onnistuneesti", - "Pipelines": "", + "Pipelines": "Putkistot", "Pipelines are a plugin system with arbitrary code execution —": "Pipelines on liitännäisjärjestelmä, jossa voidaan suorittaa mielivaltaista koodia —", "Pipelines Not Detected": "Putkistoja ei havaittu", "Pipelines Valves": "Putkistojen venttiilit", @@ -1371,8 +1371,8 @@ "Read": "Lue", "Read Aloud": "Lue ääneen", "Read more →": "Lue lisää →", - "Read Only": "", - "Read-Only Access": "", + "Read Only": "Vain luku", + "Read-Only Access": "Vain lukuoikeus", "Reason": "Päättely", "Reasoning Effort": "Päättelyn määrä", "Reasoning Tags": "Päättely tagit", @@ -1545,7 +1545,7 @@ "Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Määrittää käytettävät lopetussekvenssit. Kun tämä kuvio havaitaan, LLM lopettaa tekstin tuottamisen ja palauttaa. Useita lopetuskuvioita voidaan asettaa määrittämällä useita erillisiä lopetusparametreja mallitiedostoon.", "Setting": "Asetus", "Settings": "Asetukset", - "Settings Permissions": "", + "Settings Permissions": "Asetuksien käyttöoikeudet", "Settings saved successfully!": "Asetukset tallennettu onnistuneesti!", "Share": "Jaa", "Share Chat": "Jaa keskustelu", @@ -1556,7 +1556,7 @@ "Show": "Näytä", "Show \"What's New\" modal on login": "Näytä \"Mitä uutta\" -modaali kirjautumisen yhteydessä", "Show Admin Details in Account Pending Overlay": "Näytä ylläpitäjän tiedot odottavan tilin päällä", - "Show Files": "", + "Show Files": "Näytä tiedostot", "Show Formatting Toolbar": "Näytä muotoilupalkki", "Show image preview": "Näytä kuvan esikatselu", "Show Model": "Näytä malli", @@ -1581,7 +1581,7 @@ "Sonar Pro": "Sonar Pro", "Sonar Reasoning": "Sonar Reasoning", "Sonar Reasoning Pro": "Sonar Reasoning Pro", - "Sort": "", + "Sort": "Järjestele", "Sougou Search API sID": "Sougou Search API sID", "Sougou Search API SK": "Sougou Search API SK", "Source": "Lähde", @@ -1600,7 +1600,7 @@ "STDOUT/STDERR": "STDOUT/STDERR", "Steps": "Askeleet", "Stop": "Pysäytä", - "Stop Download": "", + "Stop Download": "Lopeta lataus", "Stop Generating": "Lopeta generointi", "Stop Sequence": "Lopetussekvenssi", "Stream Chat Response": "Streamaa keskusteluvastaus", @@ -1621,14 +1621,14 @@ "Support": "Tuki", "Support this plugin:": "Tue tätä lisäosaa:", "Supported MIME Types": "Tuetut MIME-tyypit", - "Sync": "", - "Sync Complete!": "", + "Sync": "Synkronoi", + "Sync Complete!": "Synkronointi valmis!", "Sync directory": "Synkronoitu hakemisto", - "Sync Failed": "", - "Sync Usage Stats": "", - "Syncing stats...": "", - "Syncing...": "", - "Syncs only chats with updates after your last sync timestamp. Disable to re-sync all chats.": "", + "Sync Failed": "Synkronointi epäonnistui", + "Sync Usage Stats": "Synkronoinnin käyttötilastot", + "Syncing stats...": "Synkronoidaan tilastoja...", + "Syncing...": "Synkronoidaan...", + "Syncs only chats with updates after your last sync timestamp. Disable to re-sync all chats.": "Synkronoi vain keskustelut, joihin on tehty päivityksiä viimeisen synkronoinnin aikaleiman jälkeen. Poista käytöstä synkronoidaksesi kaikki keskustelut uudelleen.", "System": "Järjestelmä", "System Instructions": "Järjestelmäohjeet", "System Prompt": "Järjestelmäkehote", @@ -1673,7 +1673,7 @@ "The Weight of BM25 Hybrid Search. 0 more semantic, 1 more lexical. Default 0.5": "", "The width in pixels to compress images to. Leave empty for no compression.": "Leveys pikseleinä, johon kuvat pakataan. Jätä tyhjäksi, jos et halua pakkausta.", "Theme": "Teema", - "There was an error syncing your stats. Please try again.": "", + "There was an error syncing your stats. Please try again.": "Tilastojen synkronoinnissa tapahtui virhe. Yritä uudelleen.", "Thinking...": "Ajattelee...", "This action cannot be undone. Do you wish to continue?": "Tätä toimintoa ei voi peruuttaa. Haluatko jatkaa?", "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Tämä kanava on luotiin {{createdAt}}. Tämä on {{channelName}} kanavan alku.", @@ -1702,7 +1702,7 @@ "Tika": "Tika", "Tika Server URL required.": "Tika palvelimen verkko-osoite vaaditaan.", "Tiktoken": "Tiktoken", - "Timeout": "", + "Timeout": "Aikakatkaisu", "Title": "Otsikko", "Title Auto-Generation": "Otsikon automaattinen luonti", "Title cannot be an empty string.": "Otsikko ei voi olla tyhjä merkkijono.", @@ -1787,7 +1787,7 @@ "Upload Pipeline": "Lataa putki", "Upload Progress": "Latauksen edistyminen", "Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Latauksen edistyminen: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)", - "Uploaded files or images": "", + "Uploaded files or images": "Ladatut tiedostot tai kuvat", "Uploading file...": "Ladataan tiedostoa...", "URL": "URL", "URL is required": "URL vaaditaan", @@ -1805,8 +1805,8 @@ "User Groups": "Käyttäjäryhmät", "User location successfully retrieved.": "Käyttäjän sijainti haettu onnistuneesti.", "User menu": "Käyttäjävalikko", - "User ratings (thumbs up/down)": "", - "User Status": "", + "User ratings (thumbs up/down)": "Käyttäjien arviot (peukku ylös/alas)", + "User Status": "Käyttäjän tila", "User Webhooks": "Käyttäjän Webhook:it", "Username": "Käyttäjätunnus", "users": "käyttäjät", @@ -1847,10 +1847,10 @@ "Web Search Engine": "Hakukoneet", "Web Search in Chat": "Verkkohaku keskustelussa", "Web Search Query Generation": "Verkkohakukyselyn luonti", - "Webhook Name": "", + "Webhook Name": "Webhook nimi", "Webhook URL": "Webhook verkko-osoite", - "Webhooks": "", - "Webpage URLs": "", + "Webhooks": "Webhookit", + "Webpage URLs": "Verkkosivujen verkko-osoitteet", "WebUI Settings": "WebUI-asetukset", "WebUI URL": "WebUI-osoite", "WebUI will make requests to \"{{url}}\"": "WebUI lähettää pyyntöjä osoitteeseen \"{{url}}\"", @@ -1858,15 +1858,15 @@ "WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI lähettää pyyntöjä osoitteeseen \"{{url}}/chat/completions\"", "What are you trying to achieve?": "Mitä yrität saavuttaa?", "What are you working on?": "Mitä olet työskentelemässä?", - "What is NOT shared:": "", - "What is shared:": "", + "What is NOT shared:": "Mitä EI jaeta:", + "What is shared:": "Mitä jaetaan:", "What's New in": "Mitä uutta", "What's on your mind?": "Mitä ajattelet?", "When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "Kun käytössä, malli vastaa jokaiseen chatviestiin reaaliajassa, tuottaen vastauksen heti kun käyttäjä lähettää viestin. Tämä tila on hyödyllinen reaaliaikaisissa chat-sovelluksissa, mutta voi vaikuttaa suorituskykyyn hitaammilla laitteistoilla.", "wherever you are": "missä tahansa oletkin", "Whether to paginate the output. Each page will be separated by a horizontal rule and page number. Defaults to False.": "Sivutetaanko tuloste. Jokainen sivu erotetaan toisistaan vaakasuoralla viivalla ja sivunumerolla. Oletusarvo ei käytössä.", "Whisper (Local)": "Whisper (paikallinen)", - "Who can share to this group": "", + "Who can share to this group": "Ketkä voivat jakaa tähän ryhmään", "Why?": "Miksi?", "Widescreen Mode": "Laajakuvatila", "Width": "Leveys", @@ -1891,12 +1891,12 @@ "You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Voit keskustella enintään {{maxCount}} tiedoston kanssa kerralla.", "You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Voit personoida vuorovaikutustasi LLM-ohjelmien kanssa lisäämällä muistoja 'Hallitse'-painikkeen kautta, jolloin ne ovat hyödyllisempiä ja räätälöityjä sinua varten.", "You cannot upload an empty file.": "Et voi ladata tyhjää tiedostoa.", - "You do not have permission to edit this model": "", - "You do not have permission to edit this prompt.": "", - "You do not have permission to save this prompt.": "", + "You do not have permission to edit this model": "Sinulla ei ole oikeuksia muokata tätä mallinetta", + "You do not have permission to edit this prompt.": "Sinulla ei ole oikeuksia muokata tätä kehotetta.", + "You do not have permission to save this prompt.": "Sinulla ei ole oikeuksia tallentaa tätä kehotetta.", "You do not have permission to send messages in this channel.": "Sinulla ei ole oikeuksia lähettää viestejä tähän kanavaan.", "You do not have permission to send messages in this thread.": "Sinulla ei ole oikeuksia lähettää viestejä tähän ketjuun.", - "You do not have permission to upload files to this knowledge base.": "", + "You do not have permission to upload files to this knowledge base.": "Sinulla ei ole oikeuksia ladata tiedostoja tähän tietokantaan.", "You do not have permission to upload files.": "Sinulla ei ole lupaa ladata tiedostoja.", "You have no archived conversations.": "Sinulla ei ole arkistoituja keskusteluja.", "You have shared this chat": "Olet jakanut tämän keskustelun", @@ -1905,8 +1905,8 @@ "Your Account": "Tilisi", "Your account status is currently pending activation.": "Tilisi tila on tällä hetkellä odottaa aktivointia.", "Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "Koko panoksesi menee suoraan lisäosan kehittäjälle; Open WebUI ei pidätä prosenttiosuutta. Valittu rahoitusalusta voi kuitenkin periä omia maksujaan.", - "Your message text or inputs": "", - "Your usage stats have been successfully synced.": "", + "Your message text or inputs": "Viestisi teksti tai syöteet", + "Your usage stats have been successfully synced.": "Käyttötilastosi on synkronoitu onnistuneesti.", "YouTube": "YouTube", "Youtube Language": "Youtube kieli", "Youtube Proxy URL": "Youtube-välityspalvelimen verkko-osoite" From 26e95f2a927f90793a99ad2371271beb364d019d Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sat, 17 Jan 2026 18:39:24 +0100 Subject: [PATCH 029/311] fix-csv-export (#20688) --- .../chat/Messages/Markdown/MarkdownTokens.svelte | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte b/src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte index bf8ad99931..d22cd2e7dc 100644 --- a/src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte +++ b/src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte @@ -53,16 +53,16 @@ const exportTableToCSVHandler = (token, tokenIdx = 0) => { console.log('Exporting table to CSV'); - // Extract header row text and escape for CSV. - const header = token.header.map((headerCell) => `"${headerCell.text.replace(/"/g, '""')}"`); + // Extract header row text, decode HTML entities, and escape for CSV. + const header = token.header.map((headerCell) => `"${decode(headerCell.text).replace(/"/g, '""')}"`); // Create an array for rows that will hold the mapped cell text. const rows = token.rows.map((row) => row.map((cell) => { // Map tokens into a single text const cellContent = cell.tokens.map((token) => token.text).join(''); - // Escape double quotes and wrap the content in double quotes - return `"${cellContent.replace(/"/g, '""')}"`; + // Decode HTML entities and escape double quotes, wrap in double quotes + return `"${decode(cellContent).replace(/"/g, '""')}"`; }) ); From 409f565f09bd554dd211f63c75aba3f2044e714d Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 17 Jan 2026 21:41:48 +0400 Subject: [PATCH 030/311] refac --- backend/open_webui/routers/files.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index e3dd63525a..130d0486bb 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -332,6 +332,8 @@ def upload_file_handler( detail=ERROR_MESSAGES.DEFAULT("Error uploading file"), ) + except HTTPException as e: + raise e except Exception as e: log.exception(e) raise HTTPException( From 716f2986b9da787103668af1c96a9a9303424a6a Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sat, 17 Jan 2026 18:44:32 +0100 Subject: [PATCH 031/311] dep bump (#20735) --- backend/requirements-min.txt | 6 +++--- backend/requirements.txt | 24 ++++++++++++------------ pyproject.toml | 24 ++++++++++++------------ 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/backend/requirements-min.txt b/backend/requirements-min.txt index 115d1bc92f..412dae1f3f 100644 --- a/backend/requirements-min.txt +++ b/backend/requirements-min.txt @@ -25,8 +25,8 @@ httpx[socks,http2,zstd,cli,brotli]==0.28.1 starsessions[redis]==2.2.1 sqlalchemy==2.0.45 -alembic==1.17.2 -peewee==3.18.3 +alembic==1.18.1 +peewee==3.19.0 peewee-migrate==1.14.3 pycrdt==0.12.44 @@ -41,7 +41,7 @@ asgiref==3.11.0 mcp==1.25.0 openai -langchain==1.2.0 +langchain==1.2.4 langchain-community==0.4.1 langchain-classic==1.0.1 langchain-text-splitters==1.1.0 diff --git a/backend/requirements.txt b/backend/requirements.txt index 51f0a8a1ae..7fa7d9ee14 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -23,8 +23,8 @@ starsessions[redis]==2.2.1 python-mimeparse==2.0.0 sqlalchemy==2.0.45 -alembic==1.17.2 -peewee==3.18.3 +alembic==1.18.1 +peewee==3.19.0 peewee-migrate==1.14.3 pycrdt==0.12.44 @@ -42,19 +42,19 @@ mcp==1.25.0 openai anthropic -google-genai==1.56.0 +google-genai==1.59.0 -langchain==1.2.0 +langchain==1.2.4 langchain-community==0.4.1 langchain-classic==1.0.1 langchain-text-splitters==1.1.0 fake-useragent==2.2.0 -chromadb==1.4.0 +chromadb==1.4.1 weaviate-client==4.19.2 opensearch-py==3.1.0 -transformers==4.57.3 +transformers==4.57.6 sentence-transformers==5.2.0 accelerate pyarrow==20.0.0 # fix: pin pyarrow version to 20 for rpi compatibility #15897 @@ -62,12 +62,12 @@ einops==0.8.1 ftfy==6.3.1 chardet==5.2.0 -pypdf==6.5.0 +pypdf==6.6.0 fpdf2==2.8.5 pymdown-extensions==10.20 docx2txt==0.9 python-pptx==1.0.2 -unstructured==0.18.24 +unstructured==0.18.27 msoffcrypto-tool==5.4.2 nltk==3.9.2 Markdown==3.10 @@ -98,7 +98,7 @@ ddgs==9.10.0 azure-ai-documentintelligence==1.0.2 azure-identity==1.25.1 -azure-storage-blob==12.27.1 +azure-storage-blob==12.28.0 azure-search-documents==11.6.0 ## Google Drive @@ -107,7 +107,7 @@ google-auth-httplib2 google-auth-oauthlib googleapis-common-protos==1.72.0 -google-cloud-storage==3.7.0 +google-cloud-storage==3.8.0 ## Databases pymongo @@ -115,7 +115,7 @@ psycopg2-binary==2.9.11 pgvector==0.4.2 PyMySQL==1.1.2 -boto3==1.42.21 +boto3==1.42.29 pymilvus==2.6.6 qdrant-client==1.16.2 @@ -138,7 +138,7 @@ pytest-docker~=3.2.5 ldap3==2.9.1 ## Firecrawl -firecrawl-py==4.12.0 +firecrawl-py==4.13.0 ## Trace opentelemetry-api==1.39.1 diff --git a/pyproject.toml b/pyproject.toml index 893e1d018a..b7df0dd78e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,8 +31,8 @@ dependencies = [ "python-mimeparse==2.0.0", "sqlalchemy==2.0.45", - "alembic==1.17.2", - "peewee==3.18.3", + "alembic==1.18.1", + "peewee==3.19.0", "peewee-migrate==1.14.3", "pycrdt==0.12.44", @@ -49,20 +49,20 @@ dependencies = [ "openai", "anthropic", - "google-genai==1.56.0", + "google-genai==1.59.0", - "langchain==1.2.0", + "langchain==1.2.4", "langchain-community==0.4.1", "langchain-classic==1.0.1", "langchain-text-splitters==1.1.0", "fake-useragent==2.2.0", - "chromadb==1.4.0", + "chromadb==1.4.1", "opensearch-py==3.1.0", "PyMySQL==1.1.2", - "boto3==1.42.21", + "boto3==1.42.29", - "transformers==4.57.3", + "transformers==4.57.6", "sentence-transformers==5.2.0", "accelerate", "pyarrow==20.0.0", # fix: pin pyarrow version to 20 for rpi compatibility #15897 @@ -70,12 +70,12 @@ dependencies = [ "ftfy==6.3.1", "chardet==5.2.0", - "pypdf==6.5.0", + "pypdf==6.6.0", "fpdf2==2.8.5", "pymdown-extensions==10.20", "docx2txt==0.9", "python-pptx==1.0.2", - "unstructured==0.18.24", + "unstructured==0.18.27", "msoffcrypto-tool==5.4.2", "nltk==3.9.2", "Markdown==3.10", @@ -110,10 +110,10 @@ dependencies = [ "google-auth-oauthlib", "googleapis-common-protos==1.72.0", - "google-cloud-storage==3.7.0", + "google-cloud-storage==3.8.0", "azure-identity==1.25.1", - "azure-storage-blob==12.27.1", + "azure-storage-blob==12.28.0", "ldap3==2.9.1", ] @@ -156,7 +156,7 @@ all = [ "oracledb==3.4.1", "colbert-ai==0.2.22", - "firecrawl-py==4.12.0", + "firecrawl-py==4.13.0", "azure-search-documents==11.6.0", ] From 9d642f63542cccae6fd7a4c888344dd2773f2f2f Mon Sep 17 00:00:00 2001 From: rohithshenoy <249723738+rohithshenoy@users.noreply.github.com> Date: Sat, 17 Jan 2026 23:18:52 +0530 Subject: [PATCH 032/311] Added support for connecting to self hosted weaviate deployments using connect_to_custom replacing connect_to_local, which is better suited for cases where HTTP and GRPC are hosted on different ingresses. (#20620) Co-authored-by: Tim Baek Co-authored-by: joaoback <156559121+joaoback@users.noreply.github.com> Co-authored-by: rohithshenoyg@gmail.com --- backend/open_webui/config.py | 4 ++++ .../open_webui/retrieval/vector/dbs/weaviate.py | 14 +++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index dab5b6cfe8..ed7df33ed2 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -2246,9 +2246,13 @@ class BannerModel(BaseModel): QDRANT_COLLECTION_PREFIX = os.environ.get("QDRANT_COLLECTION_PREFIX", "open-webui") WEAVIATE_HTTP_HOST = os.environ.get("WEAVIATE_HTTP_HOST", "") +WEAVIATE_GRPC_HOST = os.environ.get("WEAVIATE_GRPC_HOST", "") WEAVIATE_HTTP_PORT = int(os.environ.get("WEAVIATE_HTTP_PORT", "8080")) WEAVIATE_GRPC_PORT = int(os.environ.get("WEAVIATE_GRPC_PORT", "50051")) WEAVIATE_API_KEY = os.environ.get("WEAVIATE_API_KEY") +WEAVIATE_HTTP_SECURE = os.environ.get("WEAVIATE_HTTP_SECURE", "false").lower() == "true" +WEAVIATE_GRPC_SECURE = os.environ.get("WEAVIATE_GRPC_SECURE", "false").lower() == "true" +WEAVIATE_SKIP_INIT_CHECKS = os.environ.get("WEAVIATE_SKIP_INIT_CHECKS", "false").lower() == "true" # OpenSearch OPENSEARCH_URI = os.environ.get("OPENSEARCH_URI", "https://localhost:9200") diff --git a/backend/open_webui/retrieval/vector/dbs/weaviate.py b/backend/open_webui/retrieval/vector/dbs/weaviate.py index d204e8293a..dcc648c788 100644 --- a/backend/open_webui/retrieval/vector/dbs/weaviate.py +++ b/backend/open_webui/retrieval/vector/dbs/weaviate.py @@ -12,9 +12,13 @@ from open_webui.retrieval.vector.utils import process_metadata from open_webui.config import ( WEAVIATE_HTTP_HOST, + WEAVIATE_GRPC_HOST, WEAVIATE_HTTP_PORT, WEAVIATE_GRPC_PORT, WEAVIATE_API_KEY, + WEAVIATE_HTTP_SECURE, + WEAVIATE_GRPC_SECURE, + WEAVIATE_SKIP_INIT_CHECKS, ) @@ -52,9 +56,13 @@ def __init__(self): try: # Build connection parameters connection_params = { - "host": WEAVIATE_HTTP_HOST, - "port": WEAVIATE_HTTP_PORT, + "http_host": WEAVIATE_HTTP_HOST, + "http_port": WEAVIATE_HTTP_PORT, + "http_secure": WEAVIATE_HTTP_SECURE, + "grpc_host": WEAVIATE_GRPC_HOST, "grpc_port": WEAVIATE_GRPC_PORT, + "grpc_secure": WEAVIATE_GRPC_SECURE, + "skip_init_checks": WEAVIATE_SKIP_INIT_CHECKS, } # Only add auth_credentials if WEAVIATE_API_KEY exists and is not empty @@ -63,7 +71,7 @@ def __init__(self): weaviate.classes.init.Auth.api_key(WEAVIATE_API_KEY) ) - self.client = weaviate.connect_to_local(**connection_params) + self.client = weaviate.connect_to_custom(**connection_params) self.client.connect() except Exception as e: raise ConnectionError(f"Failed to connect to Weaviate: {e}") from e From 5cfb7a08cbde5d39aaf4097b849a80da87c30d66 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 17 Jan 2026 21:52:12 +0400 Subject: [PATCH 033/311] refac --- backend/open_webui/env.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/env.py b/backend/open_webui/env.py index ff48a3abfe..aeba69b480 100644 --- a/backend/open_webui/env.py +++ b/backend/open_webui/env.py @@ -673,7 +673,11 @@ def parse_section(section): os.environ.get("WEBSOCKET_SERVER_LOGGING", "False").lower() == "true" ) WEBSOCKET_SERVER_ENGINEIO_LOGGING = ( - os.environ.get("WEBSOCKET_SERVER_LOGGING", "False").lower() == "true" + os.environ.get( + "WEBSOCKET_SERVER_ENGINEIO_LOGGING", + os.environ.get("WEBSOCKET_SERVER_LOGGING", "False"), + ).lower() + == "true" ) WEBSOCKET_SERVER_PING_TIMEOUT = os.environ.get("WEBSOCKET_SERVER_PING_TIMEOUT", "20") try: From e9926694c30cdccafe8a3e3c0cb49050af210651 Mon Sep 17 00:00:00 2001 From: G30 <50341825+silentoplayz@users.noreply.github.com> Date: Mon, 19 Jan 2026 04:42:33 -0500 Subject: [PATCH 034/311] fix: add username search support to workspace and admin pages (#20780) This fix restores and extends the username/email search functionality across workspace pages that was originally added in PR #14002. The issue was that: 1. The backend search functions for Models and Knowledge only searched `User.name` and `User.email`, but not `User.username` 2. The Functions admin page lacked user search entirely Changes made: Added User.username to backend search conditions for Models and Knowledge pages Added complete user search (name, email, username) to the Functions admin page client-side filter --- backend/open_webui/models/knowledge.py | 3 +++ backend/open_webui/models/models.py | 3 +++ src/lib/components/admin/Functions.svelte | 5 ++++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/models/knowledge.py b/backend/open_webui/models/knowledge.py index 7f99f828c7..8612842015 100644 --- a/backend/open_webui/models/knowledge.py +++ b/backend/open_webui/models/knowledge.py @@ -229,6 +229,9 @@ def search_knowledge_bases( or_( Knowledge.name.ilike(f"%{query_key}%"), Knowledge.description.ilike(f"%{query_key}%"), + User.name.ilike(f"%{query_key}%"), + User.email.ilike(f"%{query_key}%"), + User.username.ilike(f"%{query_key}%"), ) ) diff --git a/backend/open_webui/models/models.py b/backend/open_webui/models/models.py index 5457413f0d..42ae2e8ddc 100755 --- a/backend/open_webui/models/models.py +++ b/backend/open_webui/models/models.py @@ -294,6 +294,9 @@ def search_models( or_( Model.name.ilike(f"%{query_key}%"), Model.base_model_id.ilike(f"%{query_key}%"), + User.name.ilike(f"%{query_key}%"), + User.email.ilike(f"%{query_key}%"), + User.username.ilike(f"%{query_key}%"), ) ) diff --git a/src/lib/components/admin/Functions.svelte b/src/lib/components/admin/Functions.svelte index 67a1fbbdfd..06de4576b2 100644 --- a/src/lib/components/admin/Functions.svelte +++ b/src/lib/components/admin/Functions.svelte @@ -86,7 +86,10 @@ (selectedType !== '' ? f.type === selectedType : true) && (query === '' || f.name.toLowerCase().includes(query.toLowerCase()) || - f.id.toLowerCase().includes(query.toLowerCase())) && + f.id.toLowerCase().includes(query.toLowerCase()) || + (f.user?.name || '').toLowerCase().includes(query.toLowerCase()) || + (f.user?.email || '').toLowerCase().includes(query.toLowerCase()) || + (f.user?.username || '').toLowerCase().includes(query.toLowerCase())) && (viewOption === '' || (viewOption === 'created' && f.user_id === $user?.id) || (viewOption === 'shared' && f.user_id !== $user?.id)) From 7a42efec53e50e102680d8b77d6c23c141182370 Mon Sep 17 00:00:00 2001 From: Toru Suzuki <35589743+zolgear@users.noreply.github.com> Date: Mon, 19 Jan 2026 18:42:58 +0900 Subject: [PATCH 035/311] `i18n: Update translation.json (ja-JP)` (#20772) * i18n: Update Japanese translation * i18n: Update Japanese translation --------- Co-authored-by: Tim Baek Co-authored-by: joaoback <156559121+joaoback@users.noreply.github.com> --- src/lib/i18n/locales/ja-JP/translation.json | 168 ++++++++++---------- 1 file changed, 84 insertions(+), 84 deletions(-) diff --git a/src/lib/i18n/locales/ja-JP/translation.json b/src/lib/i18n/locales/ja-JP/translation.json index 641c92f282..76f5d9e934 100644 --- a/src/lib/i18n/locales/ja-JP/translation.json +++ b/src/lib/i18n/locales/ja-JP/translation.json @@ -16,9 +16,9 @@ "{{COUNT}} hidden lines": "{{COUNT}} 行が非表示", "{{COUNT}} Replies": "{{COUNT}} 件の返信", "{{COUNT}} Rows": "", - "{{COUNT}} Sources": "", + "{{COUNT}} Sources": "{{COUNT}} 件のソース", "{{COUNT}} words": "{{COUNT}} 語", - "{{LOCALIZED_DATE}} at {{LOCALIZED_TIME}}": "", + "{{LOCALIZED_DATE}} at {{LOCALIZED_TIME}}": "{{LOCALIZED_DATE}} {{LOCALIZED_TIME}}", "{{model}} download has been canceled": "{{model}} のダウンロードがキャンセルされました", "{{NAMES}} reacted with {{REACTION}}": "", "{{user}}'s Chats": "{{user}} のチャット", @@ -32,7 +32,7 @@ "A task model is used when performing tasks such as generating titles for chats and web search queries": "タスクモデルは、チャットやウェブ検索クエリのタイトルの生成などのタスクを実行するときに使用されます", "a user": "ユーザー", "About": "概要", - "Accept Autocomplete Generation\nJump to Prompt Variable": "", + "Accept Autocomplete Generation\nJump to Prompt Variable": "オートコンプリートの提案を受け入れる\nプロンプト変数へ移動", "Access": "アクセス", "Access Control": "アクセス制御", "Accessible to all users": "すべてのユーザーにアクセス可能", @@ -57,7 +57,7 @@ "Add Content": "コンテンツを追加", "Add content here": "ここへコンテンツを追加", "Add Custom Parameter": "カスタムパラメータを追加", - "Add Custom Prompt": "", + "Add Custom Prompt": "カスタムプロンプトを追加", "Add Details": "より詳しく", "Add Files": "ファイルを追加", "Add Member": "", @@ -78,7 +78,7 @@ "Adjusting these settings will apply changes universally to all users.": "これらの設定を変更すると、すべてのユーザーに変更が適用されます。", "admin": "管理者", "Admin": "管理者", - "Admin Contact Email": "", + "Admin Contact Email": "管理者の連絡先メールアドレス", "Admin Panel": "管理者パネル", "Admin Settings": "管理者設定", "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "管理者は全てのツールにアクセスできます。ユーザーからはワークスペースのモデルごとに割り当てられたツールのみ使用可能です。", @@ -100,13 +100,13 @@ "Allow Chat Share": "チャットの共有を許可", "Allow Chat System Prompt": "チャットシステムプロンプトを許可", "Allow Chat Valves": "チャットバルブを許可", - "Allow Continue Response": "", - "Allow Delete Messages": "", + "Allow Continue Response": "続きの応答を許可", + "Allow Delete Messages": "メッセージの削除を許可", "Allow File Upload": "ファイルのアップロードを許可", "Allow Multiple Models in Chat": "チャットで複数のモデルを許可", "Allow non-local voices": "ローカル以外のボイスを許可", - "Allow Rate Response": "", - "Allow Regenerate Response": "", + "Allow Rate Response": "応答の評価を許可", + "Allow Regenerate Response": "再生成を許可", "Allow Speech to Text": "音声をテキストに変換を許可", "Allow Temporary Chat": "一時的なチャットを許可", "Allow Text to Speech": "テキストを音声に変換を許可", @@ -131,7 +131,7 @@ "and {{COUNT}} more": "および{{COUNT}}件", "and create a new shared link.": "そして、新しい共有リンクを作成します。", "Android": "", - "Anyone": "", + "Anyone": "全員", "API Base URL": "API ベース URL", "API Base URL for Datalab Marker service. Defaults to: https://www.datalab.to/api/v1/marker": "Datalab MarkerサービスのAPIベースURL。デフォルトは https://www.datalab.to/api/v1/marker です", "API Key": "API キー", @@ -164,7 +164,7 @@ "Ask a question": "質問する", "Assistant": "アシスタント", "Async Embedding Processing": "", - "Attach File From Knowledge": "", + "Attach File From Knowledge": "ナレッジからファイルを添付", "Attach Knowledge": "ナレッジを追加", "Attach Notes": "ノートを追加", "Attach Webpage": "ウェブページを追加", @@ -186,7 +186,7 @@ "AUTOMATIC1111 Api Auth String": "AUTOMATIC1111のAuthを入力", "AUTOMATIC1111 Base URL": "AUTOMATIC1111 ベース URL", "AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 ベース URL が必要です。", - "Automatically inject system tools in native function calling mode (e.g., timestamps, memory, chat history, notes, etc.)": "", + "Automatically inject system tools in native function calling mode (e.g., timestamps, memory, chat history, notes, etc.)": "ネイティブの関数呼び出しモードにおいて、システムツール(例: タイムスタンプ、メモリー、チャット履歴、ノートなど)を自動的に注入します", "Available list": "利用可能リスト", "Available Tools": "利用可能ツール", "available users": "利用可能なユーザー", @@ -216,7 +216,7 @@ "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "特定のトークンの強調またはペナルティを適用します。バイアス値は-100から100(包括的)にクランプされます。(デフォルト:なし)", "Brave": "", "Brave Search API Key": "Brave Search APIキー", - "Builtin Tools": "", + "Builtin Tools": "組み込みツール", "Bullet List": "箇条書きリスト", "Button ID": "ボタンID", "Button Label": "ボタンラベル", @@ -273,7 +273,7 @@ "Citations": "引用", "Clear memory": "メモリをクリア", "Clear Memory": "メモリをクリア", - "Clear status": "", + "Clear status": "ステータスをクリア", "click here": "ここをクリック", "Click here for filter guides.": "フィルターガイドはこちらをクリックしてください。", "Click here for help.": "ヘルプについてはここをクリックしてください。", @@ -295,7 +295,7 @@ "Close Banner": "バナーを閉じる", "Close Configure Connection Modal": "接続設定モーダルを閉じる", "Close modal": "モーダルを閉じる", - "Close Modal": "", + "Close Modal": "モーダルを閉じる", "Close settings modal": "設定モーダルを閉じる", "Close Sidebar": "サイドバーを閉じる", "cloud": "", @@ -362,8 +362,8 @@ "Copied to clipboard": "クリップボードにコピーしました。", "Copy": "コピー", "Copy Formatted Text": "フォーマットされたテキストをコピー", - "Copy Last Code Block": "", - "Copy Last Response": "", + "Copy Last Code Block": "直前のコードブロックをコピー", + "Copy Last Response": "直前の応答をコピー", "Copy link": "リンクをコピー", "Copy Link": "リンクをコピー", "Copy to clipboard": "クリップボードにコピー", @@ -384,7 +384,7 @@ "Create Model": "", "Create new key": "新しいキーを作成", "Create new secret key": "新しいシークレットキーを作成", - "Create note": "", + "Create note": "ノートを作成", "Create Note": "ノートを作成", "Create your first note by clicking on the plus button below.": "プラスボタンをクリックして最初のノートを作成します。", "Created at": "作成日時", @@ -415,9 +415,9 @@ "Default (SentenceTransformers)": "デフォルト (SentenceTransformers)", "Default action buttons will be used.": "デフォルトのアクションボタンが使用されます", "Default description enabled": "デフォルト説明が有効です", - "Default Features": "", + "Default Features": "デフォルト機能", "Default Filters": "", - "Default Group": "", + "Default Group": "デフォルトグループ", "Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model's built-in tool-calling capabilities, but requires the model to inherently support this feature.": "デフォルトモードは、実行前にツールを一度呼び出すことで、より広範なモデルで動作します。ネイティブモードは、モデルの組み込みのツール呼び出し機能を活用しますが、モデルがこの機能をサポートしている必要があります。", "Default Model": "デフォルトモデル", "Default model updated": "デフォルトモデルが更新されました", @@ -480,12 +480,12 @@ "Discover, download, and explore model presets": "モデルプリセットを探してダウンロードする", "Discussion channel where access is based on groups and permissions": "", "Display": "表示", - "Display chat title in tab": "", + "Display chat title in tab": "チャットのタイトルをタブに表示", "Display Emoji in Call": "コールで絵文字を表示", "Display Multi-model Responses in Tabs": "複数モデルの応答をタブで表示する", "Display the username instead of You in the Chat": "チャットで「あなた」の代わりにユーザー名を表示", "Displays citations in the response": "応答に引用を表示", - "Displays status updates (e.g., web search progress) in the response": "", + "Displays status updates (e.g., web search progress) in the response": "レスポンスにステータスの更新(例: ウェブ検索の進行状況)を表示します", "Dive into knowledge": "知識に飛び込む", "Do not install functions from sources you do not fully trust.": "信頼できないソースからFunctionをインストールしないでください。", "Do not install tools from sources you do not fully trust.": "信頼できないソースからツールをインストールしないでください。", @@ -521,16 +521,16 @@ "e.g. \"json\" or a JSON schema": "例: \"json\" または JSON スキーマ", "e.g. 60": "", "e.g. A filter to remove profanity from text": "例: テキストから不適切な表現を削除するフィルター", - "e.g. about the Roman Empire": "", - "e.g. alloy, echo, shimmer": "", - "e.g. en": "", + "e.g. about the Roman Empire": "例: ローマ帝国について", + "e.g. alloy, echo, shimmer": "例: alloy, echo, shimmer", + "e.g. en": "例: ja", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", "e.g. my_tools": "", "e.g. pdf, docx, txt": "", - "e.g. Tell me a fun fact": "", - "e.g. Tell me a fun fact about the Roman Empire": "", + "e.g. Tell me a fun fact": "例: 面白い豆知識を教えて", + "e.g. Tell me a fun fact about the Roman Empire": "例: ローマ帝国についての面白い豆知識を教えて", "e.g. Tools for performing various operations": "e.g. 様々な操作を実行するためのツール", "e.g., 3, 4, 5 (leave blank for default)": "e.g. 3, 4, 5 (空白でデフォルト)", "e.g., audio/wav,audio/mpeg,video/* (leave blank for defaults)": "e.g., audio/wav,audio/mpeg,video/* (空白でデフォルト)", @@ -543,7 +543,7 @@ "Edit Default Permissions": "デフォルトの許可を編集", "Edit Folder": "フォルダを編集", "Edit Image": "", - "Edit Last Message": "", + "Edit Last Message": "直前のメッセージを編集", "Edit Memory": "メモリを編集", "Edit User": "ユーザーを編集", "Edit User Group": "ユーザーグループを編集", @@ -559,7 +559,7 @@ "Embedding Batch Size": "埋め込みモデルバッチサイズ", "Embedding Model": "埋め込みモデル", "Embedding Model Engine": "埋め込みモデルエンジン", - "Enable API Keys": "", + "Enable API Keys": "API キーを有効にする", "Enable autocomplete generation for chat messages": "チャットメッセージの自動補完を有効にする", "Enable Code Execution": "コードの実行を有効にする", "Enable Code Interpreter": "コードインタプリタを有効にする", @@ -786,7 +786,7 @@ "File": "ファイル", "File added successfully.": "ファイル追加が成功しました。", "File content updated successfully.": "ファイルコンテンツ追加が成功しました。", - "File Context": "", + "File Context": "ファイルコンテキスト", "File Mode": "ファイルモード", "File not found.": "ファイルが見つかりません。", "File removed successfully.": "ファイル削除が成功しました。", @@ -804,11 +804,11 @@ "Firecrawl API Key": "Firecrawl APIキー", "Firecrawl Timeout (s)": "", "Floating Quick Actions": "フローティング クイックアクション", - "Focus Chat Input": "", + "Focus Chat Input": "チャット入力欄にフォーカス", "Folder": "フォルダー", "Folder Background Image": "フォルダーの背景画像", "Folder deleted successfully": "フォルダー削除が成功しました。", - "Folder Max File Count": "", + "Folder Max File Count": "フォルダー内の最大ファイル数", "Folder Name": "フォルダ名", "Folder name cannot be empty.": "フォルダー名を入力してください。", "Folder name updated successfully": "フォルダー名の変更に成功しました。", @@ -854,7 +854,7 @@ "General": "一般", "Generate": "生成", "Generate an image": "画像を生成", - "Generate Message Pair": "", + "Generate Message Pair": "メッセージペアを生成", "Generated Image": "", "Generating search query": "検索クエリの生成", "Generating...": "生成中...", @@ -942,7 +942,7 @@ "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "生成されたテキストからのフィードバックに対するアルゴリズムの応答速度を影響します。低い学習率はより遅い調整をもたらし、高い学習率はアルゴリズムをより反応的にします。", "Info": "情報", "Initials": "イニシャル", - "Inject file content into conversation context": "", + "Inject file content into conversation context": "ファイル内容を会話のコンテキストに挿入する", "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "全文を取り込むことで全体を処理します。複雑な問い合わせの場合に推奨されます。", "Input": "入力", "Input Key (e.g. text, unet_name, steps)": "入力キー", @@ -954,9 +954,9 @@ "Install from Github URL": "Github URLからインストール", "Instant Auto-Send After Voice Transcription": "音声文字変換後に自動送信", "Integration": "連携", - "Integrations": "", + "Integrations": "連携", "Interface": "インターフェース", - "Interface Settings Access": "", + "Interface Settings Access": "インターフェース設定へのアクセス", "Invalid file content": "無効なファイル内容", "Invalid file format.": "無効なファイル形式", "Invalid JSON file": "無効なJSONファイル", @@ -988,7 +988,7 @@ "Key": "キー", "Key is required": "キーは必須です", "Keyboard shortcuts": "キーボードショートカット", - "Keyboard Shortcuts": "", + "Keyboard Shortcuts": "キーボードショートカット", "Knowledge": "ナレッジベース", "Knowledge Access": "ナレッジアクセス", "Knowledge Base": "ナレッジベース", @@ -999,7 +999,7 @@ "Knowledge Name": "ナレッジベースの名前", "Knowledge Public Sharing": "ナレッジベースの公開共有", "Knowledge reset successfully.": "ナレッジベースのリセットに成功しました", - "Knowledge Sharing": "", + "Knowledge Sharing": "ナレッジベースの共有", "Knowledge updated successfully": "ナレッジベースのアップデートに成功しました", "Kokoro.js (Browser)": "Kokoro.js (ブラウザ)", "Kokoro.js Dtype": "Kokoro.js Dtype", @@ -1022,7 +1022,7 @@ "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "空欄にすると \"{{url}}/api/tags\" エンドポイントからすべてのモデルを読み込みます", "Leave empty to include all models from \"{{url}}/models\" endpoint": "空欄にすると \"{{url}}/models\" エンドポイントからすべてのモデルを読み込みます", "Leave empty to include all models or select specific models": "モデルを選択。空欄にするとすべてのモデルを読み込みます", - "Leave empty to use first admin user": "", + "Leave empty to use first admin user": "空欄で最初の管理者ユーザー", "Leave empty to use the default model (voxtral-mini-latest).": "", "Leave empty to use the default prompt, or enter a custom prompt": "カスタムプロンプトを入力。空欄ならデフォルトプロンプト", "Leave model field empty to use the default model.": "モデル欄を空欄にしてデフォルトモデルを使用", @@ -1066,8 +1066,8 @@ "Max Speakers": "最大話者数", "Max Upload Count": "最大アップロード数", "Max Upload Size": "最大アップロードサイズ", - "Maximum number of files allowed per folder.": "", - "Maximum number of files per folder is {{max}}.": "", + "Maximum number of files allowed per folder.": "1 つのフォルダーに保存できるファイルの最大数を指定します。", + "Maximum number of files per folder is {{max}}.": "フォルダー内のファイル数は最大 {{max}} 件までです。", "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "同時にダウンロードできるモデルは最大 3 つです。後でもう一度お試しください。", "May": "5月", "MBR": "", @@ -1075,9 +1075,9 @@ "MCP support is experimental and its specification changes often, which can lead to incompatibilities. OpenAPI specification support is directly maintained by the Open WebUI team, making it the more reliable option for compatibility.": "", "Medium": "中", "Member removed successfully": "", - "Members": "", + "Members": "メンバー", "Members added successfully": "", - "Memories": "", + "Memories": "メモリー", "Memories accessible by LLMs will be shown here.": "LLM がアクセスできるメモリはここに表示されます。", "Memory": "メモリ", "Memory added successfully": "メモリに追加されました。", @@ -1086,7 +1086,7 @@ "Memory updated successfully": "メモリアップデート成功", "Merge Responses": "応答を統合", "Merged Response": "統合された応答", - "Message": "", + "Message": "メッセージ", "Message counts and response timestamps": "", "Message rating should be enabled to use this feature": "この機能を使用するには、メッセージ評価を有効にする必要があります。", "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "リンクを作成した後で送信したメッセージは共有されません。URL を持つユーザーは共有チャットを閲覧できます。", @@ -1134,7 +1134,7 @@ "Models configuration saved successfully": "モデル設定が正常に保存されました", "Models imported successfully": "", "Models Public Sharing": "モデルの公開共有", - "Models Sharing": "", + "Models Sharing": "モデルの共有", "Mojeek": "", "Mojeek Search API Key": "Mojeek Search APIキー", "More": "もっと見る", @@ -1155,7 +1155,7 @@ "New Note": "新しいノート", "New Password": "新しいパスワード", "New Prompt": "新しいプロンプト", - "New Temporary Chat": "", + "New Temporary Chat": "新しい一時的なチャット", "New Tool": "新しいツール", "New Webhook": "", "new-channel": "新しいチャンネル", @@ -1186,16 +1186,16 @@ "No models selected": "モデルが選択されていません", "No Notes": "ノートがありません", "No notes found": "ノートが見つかりません", - "No one": "", + "No one": "誰もいない", "No pinned messages": "", - "No prompts found": "", + "No prompts found": "プロンプトが見つかりません", "No results": "結果が見つかりません", "No results found": "結果が見つかりません", "No search query generated": "検索クエリは生成されません", "No source available": "使用可能なソースがありません", - "No sources found": "", + "No sources found": "ソースが見つかりません", "No suggestion prompts": "提案プロンプトはありません", - "No tools found": "", + "No tools found": "ツールが見つかりません", "No users were found.": "ユーザーが見つかりません。", "No valves": "バルブがありません", "No valves to update": "更新するバルブがありません", @@ -1209,8 +1209,8 @@ "Note deleted successfully": "ノートが正常に削除されました", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "注意:最小スコアを設定した場合、検索は最小スコア以上のスコアを持つドキュメントのみを返します。", "Notes": "ノート", - "Notes Public Sharing": "", - "Notes Sharing": "", + "Notes Public Sharing": "ノートの公開共有", + "Notes Sharing": "ノートの共有", "Notification Sound": "通知音", "Notification Webhook": "通知Webhook", "Notifications": "デスクトップ通知", @@ -1229,12 +1229,12 @@ "Ollama Version": "Ollama バージョン", "On": "オン", "OneDrive": "", - "Only active when \"Paste Large Text as File\" setting is toggled on.": "", - "Only active when the chat input is in focus and an LLM is generating a response.": "", - "Only active when the chat input is in focus.": "", + "Only active when \"Paste Large Text as File\" setting is toggled on.": "\"大きなテキストをファイルとして貼り付ける\"がオンの場合にのみ有効です。", + "Only active when the chat input is in focus and an LLM is generating a response.": "チャット入力欄にフォーカスがあり、LLMが応答を生成しているときのみ有効です。", + "Only active when the chat input is in focus.": "チャット入力欄にフォーカスがあるときのみ有効です。", "Only alphanumeric characters and hyphens are allowed": "英数字とハイフンのみが使用できます", "Only alphanumeric characters and hyphens are allowed in the command string.": "コマンド文字列には英数字とハイフンのみが使用できます。", - "Only can be triggered when the chat input is in focus.": "", + "Only can be triggered when the chat input is in focus.": "チャット入力欄にフォーカスがあるときのみ使用できます。", "Only collections can be edited, create a new knowledge base to edit/add documents.": "コレクションのみ編集できます。新しいナレッジベースを作成してドキュメントを編集/追加してください。", "Only invited users can access": "", "Only markdown files are allowed": "マークダウンファイルのみが許可されています", @@ -1250,7 +1250,7 @@ "Open modal to configure connection": "接続設定のモーダルを開く", "Open Modal To Manage Floating Quick Actions": "フローティング クイックアクションを管理するモーダルを開く", "Open Modal To Manage Image Compression": "", - "Open Settings": "", + "Open Settings": "設定を開く", "Open Sidebar": "サイドバーを開く", "Open User Profile Menu": "ユーザープロフィールメニューを開く", "Open WebUI can use tools provided by any OpenAPI server.": "OpenWebUI は任意のOpenAPI サーバーが提供するツールを使用できます。", @@ -1340,7 +1340,7 @@ "Prefer not to say": "回答しない", "Prefix ID": "Prefix ID", "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "Prefix ID はモデル ID に接頭辞を追加することで、他の接続との競合を避けるために使用されます - 空の場合は無効にします", - "Prevent File Creation": "", + "Prevent File Creation": "ファイル作成を防止", "Preview": "プレビュー", "Previous 30 days": "過去30日間", "Previous 7 days": "過去7日間", @@ -1356,14 +1356,14 @@ "Prompts": "プロンプト", "Prompts Access": "プロンプトアクセス", "Prompts Public Sharing": "プロンプトの公開共有", - "Prompts Sharing": "", + "Prompts Sharing": "プロンプトの共有", "Provider Type": "", "Public": "公開", "Pull \"{{searchValue}}\" from Ollama.com": "Ollama.com から \"{{searchValue}}\" をプル", "Pull a model from Ollama.com": "Ollama.com からモデルをプル", "Pull Model": "", "Query Generation Prompt": "クエリ生成プロンプト", - "Querying": "", + "Querying": "照会中", "Quick Actions": "クイックアクション", "RAG Template": "RAG テンプレート", "Rating": "評価", @@ -1381,11 +1381,11 @@ "Redirecting you to Open WebUI Community": "OpenWebUI コミュニティにリダイレクトしています", "Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "無意味な生成の確率を減少させます。高い値(例:100)はより多様な回答を提供し、低い値(例:10)ではより保守的になります。", "Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "あなたのことは「User」としてください(例:「User はスペイン語を学んでいます」)", - "Reference Chats": "", + "Reference Chats": "チャットを参照", "Refused when it shouldn't have": "拒否すべきでないのに拒否した", "Regenerate": "再生成", "Regenerate Menu": "再生成メニュー", - "Regenerate Response": "", + "Regenerate Response": "回答を再生成", "Register Again": "", "Register Client": "", "Registered": "", @@ -1428,9 +1428,9 @@ "RESULT": "結果", "Retrieval": "検索", "Retrieval Query Generation": "検索クエリ生成", - "Retrieved {{count}} sources": "", + "Retrieved {{count}} sources": "{{count}} 件のソースを取得", "Retrieved {{count}} sources_other": "", - "Retrieved 1 source": "", + "Retrieved 1 source": "1 件のソースを取得", "Rich Text Input for Chat": "チャットのリッチテキスト入力", "Role": "ロール", "Rosé Pine": "Rosé Pine", @@ -1474,7 +1474,7 @@ "SearchApi API Key": "SearchApiのAPIKey", "SearchApi Engine": "SearchApiエンジン", "Searched {{count}} sites": "{{count}} サイトを検索しました", - "Searching": "", + "Searching": "検索中", "Searching \"{{searchQuery}}\"": "「{{searchQuery}}」を検索中...", "Searching Knowledge for \"{{searchQuery}}\"": "「{{searchQuery}}」のナレッジを検索中...", "Searching the web": "ウェブを検索中...", @@ -1542,9 +1542,9 @@ "Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "生成に用いる乱数シードを設定します。特定の数値を設定すると、同じプロンプトで同じテキストが生成されます。", "Sets the size of the context window used to generate the next token.": "次のトークンを生成する際に使用するコンテキストウィンドウのサイズを設定します。", "Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "停止シーケンスを設定します。このパターンに達するとLLMはテキスト生成を停止し、結果を返します。複数の停止パターンは、モデルファイル内で複数のstopパラメータを指定することで設定可能です。", - "Setting": "", + "Setting": "設定", "Settings": "設定", - "Settings Permissions": "", + "Settings Permissions": "設定に関する権限", "Settings saved successfully!": "設定が正常に保存されました!", "Share": "共有", "Share Chat": "チャットを共有", @@ -1559,7 +1559,7 @@ "Show Formatting Toolbar": "フォーマットツールバーを表示", "Show image preview": "画像のプレビューを表示", "Show Model": "モデルを表示", - "Show Shortcuts": "", + "Show Shortcuts": "ショートカットを表示", "Show your support!": "サポートを表示", "Showcased creativity": "創造性を披露", "Sign in": "サインイン", @@ -1593,14 +1593,14 @@ "Start of the channel": "チャンネルの開始", "Start Tag": "", "Status": "ステータス", - "Status cleared successfully": "", - "Status updated successfully": "", - "Status Updates": "", + "Status cleared successfully": "正常にステータスをクリアしました", + "Status updated successfully": "正常にステータスを更新しました", + "Status Updates": "ステータス更新", "STDOUT/STDERR": "STDOUT/STDERR", "Steps": "", "Stop": "停止", "Stop Download": "", - "Stop Generating": "", + "Stop Generating": "生成を停止", "Stop Sequence": "ストップシーケンス", "Stream Chat Response": "チャットレスポンスのストリーム", "Stream Delta Chunk Size": "ストリームの差分チャンクサイズ", @@ -1611,7 +1611,7 @@ "STT Model": "STTモデル", "STT Settings": "STT設定", "Stylized PDF Export": "スタイル付きPDFエクスポート", - "Subtitle": "", + "Subtitle": "サブタイトル", "Success": "成功", "Successfully imported {{userCount}} users.": "{{userCount}} 人のユーザが正常にインポートされました。", "Successfully updated.": "正常に更新されました。", @@ -1636,7 +1636,7 @@ "Tags Generation": "タグ生成", "Tags Generation Prompt": "タグ生成プロンプト", "Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "Tail Free Samplingは、出力中の確率の低いトークンの影響を抑えるための手法です。値が高い(例:2.0)ほど影響を減らし、1.0の場合は無効となります。", - "Talk to Model": "", + "Talk to Model": "モデルに話しかける", "Tap to interrupt": "タップして中断", "Task List": "タスクリスト", "Task Model": "タスクモデル", @@ -1658,7 +1658,7 @@ "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "評価リーダーボードはElo評価システムに基づいており、実時間で更新されています。", "The format to return a response in. Format can be json or a JSON schema.": "レスポンスのフォーマット。jsonか、JSONスキーマを指定できます。", "The height in pixels to compress images to. Leave empty for no compression.": "画像の圧縮後のピクセル単位での高さ。空欄で圧縮を無効化します", - "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "入力音声の言語を指定します。ISO-639-1形式(例:en)で指定すると精度や処理速度が向上します。空欄にすると自動言語検出が行われます。", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "入力音声の言語を指定します。ISO-639-1形式(例: ja)で指定すると精度や処理速度が向上します。空欄にすると自動言語検出が行われます。", "The LDAP attribute that maps to the mail that users use to sign in.": "ユーザーがサインインに使用するメールのLDAP属性。", "The LDAP attribute that maps to the username that users use to sign in.": "ユーザーがサインインに使用するユーザー名のLDAP属性。", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "リーダーボードは現在ベータ版であり、アルゴリズムを改善する際に評価計算を調整する場合があります。", @@ -1717,8 +1717,8 @@ "To select toolkits here, add them to the \"Tools\" workspace first.": "ここでツールキットを選択するには、まず \"Tools\" ワークスペースに追加してください。", "Toast notifications for new updates": "新しい更新のトースト通知", "Today": "今日", - "Today at {{LOCALIZED_TIME}}": "", - "Toggle Sidebar": "", + "Today at {{LOCALIZED_TIME}}": "今日 {{LOCALIZED_TIME}}", + "Toggle Sidebar": "サイドバーを切り替える", "Toggle whether current connection is active.": "この接続の有効性を切り替える", "Token": "トークン", "Too verbose": "冗長すぎる", @@ -1736,7 +1736,7 @@ "Tools Function Calling Prompt": "ツール関数呼び出しプロンプト", "Tools have a function calling system that allows arbitrary code execution.": "ツールは任意のコード実行を可能にする関数呼び出しシステムを持っています。", "Tools Public Sharing": "ツールの公開共有", - "Tools Sharing": "", + "Tools Sharing": "ツールの共有", "Top": "", "Top K": "トップ K", "Top K Reranker": "トップ K リランカー", @@ -1749,11 +1749,11 @@ "TTS Settings": "TTS 設定", "TTS Voice": "TTSボイス", "Type": "種類", - "Type here...": "", + "Type here...": "ここに入力してください...", "Type Hugging Face Resolve (Download) URL": "Hugging Face Resolve (ダウンロード) URL を入力してください", "Uh-oh! There was an issue with the response.": "レスポンスに問題がありました。", "UI": "", - "UI Scale": "", + "UI Scale": "UIの拡大率", "Unarchive All": "すべてアーカイブ解除", "Unarchive All Archived Chats": "すべてのアーカイブされたチャットをアーカイブ解除", "Unarchive Chat": "チャットをアーカイブ解除", @@ -1771,7 +1771,7 @@ "Update and Copy Link": "リンクの更新とコピー", "Update for the latest features and improvements.": "最新の機能と改善点を更新します。", "Update password": "パスワードを更新", - "Update your status": "", + "Update your status": "ステータスを変更", "Updated": "更新されました", "Updated at": "更新日時", "Updated At": "更新日時", @@ -1805,7 +1805,7 @@ "User location successfully retrieved.": "ユーザーの位置情報が正常に取得されました。", "User menu": "ユーザーメニュー", "User ratings (thumbs up/down)": "", - "User Status": "", + "User Status": "ユーザーステータス", "User Webhooks": "ユーザWebhook", "Username": "ユーザー名", "users": "", @@ -1865,7 +1865,7 @@ "wherever you are": "どこにいても", "Whether to paginate the output. Each page will be separated by a horizontal rule and page number. Defaults to False.": "出力をページ分けするかどうか。各ページは水平線とページ番号で分割されます。デフォルトでは無効", "Whisper (Local)": "Whisper (ローカル)", - "Who can share to this group": "", + "Who can share to this group": "このグループを共有できるユーザー", "Why?": "どうしてですか?", "Widescreen Mode": "ワイドスクリーンモード", "Width": "幅", @@ -1884,7 +1884,7 @@ "Yahoo": "", "Yandex": "", "Yesterday": "昨日", - "Yesterday at {{LOCALIZED_TIME}}": "", + "Yesterday at {{LOCALIZED_TIME}}": "昨日 {{LOCALIZED_TIME}}", "You": "あなた", "You are currently using a trial license. Please contact support to upgrade your license.": "現在、試用ライセンスを使用しています。サポートにお問い合わせください。", "You can only chat with a maximum of {{maxCount}} file(s) at a time.": "同時にチャットに使用できるファイルは最大{{maxCount}}個までです。", From be75bc506adb048ef11b1612c0e3662511c920d0 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 19 Jan 2026 13:49:12 +0400 Subject: [PATCH 036/311] refac --- src/lib/components/admin/Users/UserList.svelte | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lib/components/admin/Users/UserList.svelte b/src/lib/components/admin/Users/UserList.svelte index 97b647ba56..93490be59e 100644 --- a/src/lib/components/admin/Users/UserList.svelte +++ b/src/lib/components/admin/Users/UserList.svelte @@ -97,6 +97,10 @@ } }; + $: if (query) { + page = 1; + } + $: if (query !== null && page !== null && orderBy !== null && direction !== null) { getUserList(); } From 98cb2d3411d3a6f14f479c5013f17fb7a2c4dec3 Mon Sep 17 00:00:00 2001 From: G30 <50341825+silentoplayz@users.noreply.github.com> Date: Mon, 19 Jan 2026 04:58:48 -0500 Subject: [PATCH 037/311] feat: Add MATLAB syntax highlighting support for code blocks (#20773) * feat: Add MATLAB syntax highlighting support for code blocks Add MATLAB syntax highlighting support by fixing issues in both CodeEditor (editable) and CodeBlock (read-only) components. Changes: - CodeEditor.svelte: Added 'matlab' alias to CodeMirror's Octave language (MATLAB-compatible syntax) - CodeBlock.svelte: Fixed highlight.js usage to use highlight() directly when language is recognized, falling back to highlightAuto() only for unknown languages * revert: not needed --- src/lib/components/common/CodeEditor.svelte | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/lib/components/common/CodeEditor.svelte b/src/lib/components/common/CodeEditor.svelte index 50c2a7cd18..ef8ed503d5 100644 --- a/src/lib/components/common/CodeEditor.svelte +++ b/src/lib/components/common/CodeEditor.svelte @@ -104,6 +104,12 @@ }) ); + // Add 'matlab' alias to Octave language (MATLAB-compatible syntax) + const octaveLang = languages.find((l) => l.name === 'Octave'); + if (octaveLang && !octaveLang.alias.includes('matlab')) { + octaveLang.alias.push('matlab'); + } + const getLang = async () => { const language = languages.find((l) => l.alias.includes(lang)); return await language?.load(); From 6ae3ddd66bbb260b8f65cc6ab5adc4dfab9fe18a Mon Sep 17 00:00:00 2001 From: G30 <50341825+silentoplayz@users.noreply.github.com> Date: Mon, 19 Jan 2026 04:59:44 -0500 Subject: [PATCH 038/311] fix: truncate long model names and IDs in UI (#20696) - Added line-clamp-1 truncation and tooltips to long model names and IDs in the Evaluations and Models admin sections to prevent visual overflow. Model names now display truncated with full name and ID available on hover. --- src/lib/components/admin/Evaluations/Feedbacks.svelte | 10 ++++++---- .../components/admin/Evaluations/Leaderboard.svelte | 4 +++- .../admin/Evaluations/LeaderboardModal.svelte | 9 ++++++--- .../components/admin/Settings/Models/ModelList.svelte | 2 +- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/lib/components/admin/Evaluations/Feedbacks.svelte b/src/lib/components/admin/Evaluations/Feedbacks.svelte index 0ec5678f0e..ccf1735431 100644 --- a/src/lib/components/admin/Evaluations/Feedbacks.svelte +++ b/src/lib/components/admin/Evaluations/Feedbacks.svelte @@ -302,9 +302,11 @@
{#if feedback.data?.sibling_model_ids} -
+ +
{feedback.data?.model_id}
+
@@ -320,11 +322,11 @@
{:else} -
+ +
{feedback.data?.model_id}
+
{/if}
diff --git a/src/lib/components/admin/Evaluations/Leaderboard.svelte b/src/lib/components/admin/Evaluations/Leaderboard.svelte index e16e62c98c..0dd501a153 100644 --- a/src/lib/components/admin/Evaluations/Leaderboard.svelte +++ b/src/lib/components/admin/Evaluations/Leaderboard.svelte @@ -182,7 +182,9 @@ alt={model.name} class="size-5 rounded-full object-cover" /> - {model.name} + + {model.name} +
diff --git a/src/lib/components/admin/Evaluations/LeaderboardModal.svelte b/src/lib/components/admin/Evaluations/LeaderboardModal.svelte index fc3ec6eb10..6730e739d7 100644 --- a/src/lib/components/admin/Evaluations/LeaderboardModal.svelte +++ b/src/lib/components/admin/Evaluations/LeaderboardModal.svelte @@ -4,6 +4,7 @@ import { getModelHistory } from '$lib/apis/evaluations'; import ModelActivityChart from './ModelActivityChart.svelte'; import XMark from '$lib/components/icons/XMark.svelte'; + import Tooltip from '$lib/components/common/Tooltip.svelte'; export let show = false; export let model = null; @@ -60,9 +61,11 @@ {#if model}
-
- {model.name} -
+ +
+ {model.name} +
+
diff --git a/src/lib/components/admin/Settings/Models/ModelList.svelte b/src/lib/components/admin/Settings/Models/ModelList.svelte index cc86e52e5f..d501a485d4 100644 --- a/src/lib/components/admin/Settings/Models/ModelList.svelte +++ b/src/lib/components/admin/Settings/Models/ModelList.svelte @@ -50,7 +50,7 @@
-
+
{#if $models.find((model) => model.id === modelId)} {$models.find((model) => model.id === modelId).name} {:else} From 38bf0b6eec16879bd962c89edcd142c93758ee3b Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Mon, 19 Jan 2026 11:00:48 +0100 Subject: [PATCH 039/311] feat: Add new ENV VAR for custom error message on error on signup / password change due to password not meeting requirements (#20650) * add env var for custom auth pw message * Update auth.py * Update auth.py --- backend/open_webui/env.py | 2 ++ backend/open_webui/routers/auths.py | 4 ++++ backend/open_webui/utils/auth.py | 3 ++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/env.py b/backend/open_webui/env.py index aeba69b480..0bbe1b89c4 100644 --- a/backend/open_webui/env.py +++ b/backend/open_webui/env.py @@ -455,6 +455,8 @@ def parse_section(section): r"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\w\s]).{8,}$" ) +PASSWORD_VALIDATION_HINT = os.environ.get("PASSWORD_VALIDATION_HINT", "") + BYPASS_MODEL_ACCESS_CONTROL = ( os.environ.get("BYPASS_MODEL_ACCESS_CONTROL", "False").lower() == "true" diff --git a/backend/open_webui/routers/auths.py b/backend/open_webui/routers/auths.py index 30d4ebe4cc..b1e5bdc8ab 100644 --- a/backend/open_webui/routers/auths.py +++ b/backend/open_webui/routers/auths.py @@ -813,6 +813,8 @@ async def signup( } else: raise HTTPException(500, detail=ERROR_MESSAGES.CREATE_USER_ERROR) + except HTTPException: + raise except Exception as err: log.error(f"Signup error: {str(err)}") raise HTTPException(500, detail="An internal error occurred during signup.") @@ -954,6 +956,8 @@ async def add_user( } else: raise HTTPException(500, detail=ERROR_MESSAGES.CREATE_USER_ERROR) + except HTTPException: + raise except Exception as err: log.error(f"Add user error: {str(err)}") raise HTTPException( diff --git a/backend/open_webui/utils/auth.py b/backend/open_webui/utils/auth.py index c1f6910ddb..ef09a6004d 100644 --- a/backend/open_webui/utils/auth.py +++ b/backend/open_webui/utils/auth.py @@ -33,6 +33,7 @@ ENABLE_PASSWORD_VALIDATION, OFFLINE_MODE, LICENSE_BLOB, + PASSWORD_VALIDATION_HINT, PASSWORD_VALIDATION_REGEX_PATTERN, REDIS_KEY_PREFIX, pk, @@ -173,7 +174,7 @@ def validate_password(password: str) -> bool: if ENABLE_PASSWORD_VALIDATION: if not PASSWORD_VALIDATION_REGEX_PATTERN.match(password): - raise Exception(ERROR_MESSAGES.INVALID_PASSWORD()) + raise Exception(ERROR_MESSAGES.INVALID_PASSWORD(PASSWORD_VALIDATION_HINT)) return True From 85e92fe3b062ae669985c09495f6ff1baf8176ab Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 20 Jan 2026 16:41:46 +0400 Subject: [PATCH 040/311] refac --- src/routes/(app)/workspace/tools/edit/+page.svelte | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/routes/(app)/workspace/tools/edit/+page.svelte b/src/routes/(app)/workspace/tools/edit/+page.svelte index 8714a58c70..036c210d73 100644 --- a/src/routes/(app)/workspace/tools/edit/+page.svelte +++ b/src/routes/(app)/workspace/tools/edit/+page.svelte @@ -62,6 +62,12 @@ return null; }); + if (tool && !tool.write_access) { + toast.error($i18n.t('You do not have permission to edit this tool')); + goto('/workspace/tools'); + return; + } + console.log(tool); } }); From 91faa9fd5a1cfc5d3ab531d2d91d28db52bcc702 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 20 Jan 2026 16:42:20 +0400 Subject: [PATCH 041/311] refac --- src/routes/(app)/workspace/tools/edit/+page.svelte | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/routes/(app)/workspace/tools/edit/+page.svelte b/src/routes/(app)/workspace/tools/edit/+page.svelte index 036c210d73..3584ece2d5 100644 --- a/src/routes/(app)/workspace/tools/edit/+page.svelte +++ b/src/routes/(app)/workspace/tools/edit/+page.svelte @@ -56,19 +56,22 @@ const id = $page.url.searchParams.get('id'); if (id) { - tool = await getToolById(localStorage.token, id).catch((error) => { + const res = await getToolById(localStorage.token, id).catch((error) => { toast.error(`${error}`); goto('/workspace/tools'); return null; }); - if (tool && !tool.write_access) { + if (res && !res.write_access) { toast.error($i18n.t('You do not have permission to edit this tool')); goto('/workspace/tools'); return; } - console.log(tool); + if (res) { + tool = res; + console.log(tool); + } } }); From 4615e8f92bb96471a99e84c117f372d2c083df71 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 20 Jan 2026 22:28:10 +0400 Subject: [PATCH 042/311] refac --- backend/open_webui/routers/chats.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/backend/open_webui/routers/chats.py b/backend/open_webui/routers/chats.py index 9a43234aa6..885360aadd 100644 --- a/backend/open_webui/routers/chats.py +++ b/backend/open_webui/routers/chats.py @@ -357,9 +357,7 @@ def get_message_content_length(message): return None -def calculate_chat_stats( - user_id, skip=0, limit=10, filter=None, db: Optional[Session] = None -): +def calculate_chat_stats(user_id, skip=0, limit=10, filter=None): if filter is None: filter = {} @@ -368,7 +366,6 @@ def calculate_chat_stats( skip=skip, limit=limit, filter=filter, - db=db, ) chat_stats_export_list = [] @@ -424,7 +421,6 @@ async def export_chat_stats( page: Optional[int] = 1, stream: bool = False, user=Depends(get_verified_user), - db: Session = Depends(get_session), ): # Check if the user has permission to share/export chats if (user.role != "admin") and ( @@ -455,7 +451,7 @@ async def export_chat_stats( skip = (page - 1) * limit chat_stats_export_list, total = await asyncio.to_thread( - calculate_chat_stats, user.id, skip, limit, filter, db=db + calculate_chat_stats, user.id, skip, limit, filter ) return ChatStatsExportList( From ecbdef732bc71a07c21bbb679edb420f26eac181 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 21 Jan 2026 23:51:36 +0400 Subject: [PATCH 043/311] enh: PDF_LOADER_MODE --- backend/open_webui/config.py | 6 +++++ backend/open_webui/main.py | 2 ++ backend/open_webui/retrieval/loaders/main.py | 4 +++- backend/open_webui/routers/retrieval.py | 8 +++++++ .../admin/Settings/Documents.svelte | 24 +++++++++++++++++++ 5 files changed, 43 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index ed7df33ed2..c062977652 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -2809,6 +2809,12 @@ class BannerModel(BaseModel): os.environ.get("PDF_EXTRACT_IMAGES", "False").lower() == "true", ) +PDF_LOADER_MODE = PersistentConfig( + "PDF_LOADER_MODE", + "rag.pdf_loader_mode", + os.environ.get("PDF_LOADER_MODE", "page"), +) + RAG_EMBEDDING_MODEL = PersistentConfig( "RAG_EMBEDDING_MODEL", "rag.embedding_model", diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 82a87e3fd9..9d1d85060f 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -288,6 +288,7 @@ ENABLE_MARKDOWN_HEADER_TEXT_SPLITTER, TIKTOKEN_ENCODING_NAME, PDF_EXTRACT_IMAGES, + PDF_LOADER_MODE, YOUTUBE_LOADER_LANGUAGE, YOUTUBE_LOADER_PROXY_URL, # Retrieval (Web Search) @@ -944,6 +945,7 @@ async def lifespan(app: FastAPI): app.state.config.RAG_OLLAMA_API_KEY = RAG_OLLAMA_API_KEY app.state.config.PDF_EXTRACT_IMAGES = PDF_EXTRACT_IMAGES +app.state.config.PDF_LOADER_MODE = PDF_LOADER_MODE app.state.config.YOUTUBE_LOADER_LANGUAGE = YOUTUBE_LOADER_LANGUAGE app.state.config.YOUTUBE_LOADER_PROXY_URL = YOUTUBE_LOADER_PROXY_URL diff --git a/backend/open_webui/retrieval/loaders/main.py b/backend/open_webui/retrieval/loaders/main.py index bf7c7286b5..83adb8823f 100644 --- a/backend/open_webui/retrieval/loaders/main.py +++ b/backend/open_webui/retrieval/loaders/main.py @@ -361,7 +361,9 @@ def _get_loader(self, filename: str, file_content_type: str, file_path: str): else: if file_ext == "pdf": loader = PyPDFLoader( - file_path, extract_images=self.kwargs.get("PDF_EXTRACT_IMAGES") + file_path, + extract_images=self.kwargs.get("PDF_EXTRACT_IMAGES"), + mode=self.kwargs.get("PDF_LOADER_MODE", "page"), ) elif file_ext == "csv": loader = CSVLoader(file_path, autodetect_encoding=True) diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index 763a9aacc3..318e7bf8ce 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -468,6 +468,7 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)): # Content extraction settings "CONTENT_EXTRACTION_ENGINE": request.app.state.config.CONTENT_EXTRACTION_ENGINE, "PDF_EXTRACT_IMAGES": request.app.state.config.PDF_EXTRACT_IMAGES, + "PDF_LOADER_MODE": request.app.state.config.PDF_LOADER_MODE, "DATALAB_MARKER_API_KEY": request.app.state.config.DATALAB_MARKER_API_KEY, "DATALAB_MARKER_API_BASE_URL": request.app.state.config.DATALAB_MARKER_API_BASE_URL, "DATALAB_MARKER_ADDITIONAL_CONFIG": request.app.state.config.DATALAB_MARKER_ADDITIONAL_CONFIG, @@ -659,6 +660,7 @@ class ConfigForm(BaseModel): # Content extraction settings CONTENT_EXTRACTION_ENGINE: Optional[str] = None PDF_EXTRACT_IMAGES: Optional[bool] = None + PDF_LOADER_MODE: Optional[str] = None DATALAB_MARKER_API_KEY: Optional[str] = None DATALAB_MARKER_API_BASE_URL: Optional[str] = None @@ -786,6 +788,11 @@ async def update_rag_config( if form_data.PDF_EXTRACT_IMAGES is not None else request.app.state.config.PDF_EXTRACT_IMAGES ) + request.app.state.config.PDF_LOADER_MODE = ( + form_data.PDF_LOADER_MODE + if form_data.PDF_LOADER_MODE is not None + else request.app.state.config.PDF_LOADER_MODE + ) request.app.state.config.DATALAB_MARKER_API_KEY = ( form_data.DATALAB_MARKER_API_KEY if form_data.DATALAB_MARKER_API_KEY is not None @@ -1180,6 +1187,7 @@ async def update_rag_config( # Content extraction settings "CONTENT_EXTRACTION_ENGINE": request.app.state.config.CONTENT_EXTRACTION_ENGINE, "PDF_EXTRACT_IMAGES": request.app.state.config.PDF_EXTRACT_IMAGES, + "PDF_LOADER_MODE": request.app.state.config.PDF_LOADER_MODE, "DATALAB_MARKER_API_KEY": request.app.state.config.DATALAB_MARKER_API_KEY, "DATALAB_MARKER_API_BASE_URL": request.app.state.config.DATALAB_MARKER_API_BASE_URL, "DATALAB_MARKER_ADDITIONAL_CONFIG": request.app.state.config.DATALAB_MARKER_ADDITIONAL_CONFIG, diff --git a/src/lib/components/admin/Settings/Documents.svelte b/src/lib/components/admin/Settings/Documents.svelte index 732d824692..3f4434084b 100644 --- a/src/lib/components/admin/Settings/Documents.svelte +++ b/src/lib/components/admin/Settings/Documents.svelte @@ -362,6 +362,30 @@
+ +
+
+
+ + {$i18n.t('PDF Loader Mode')} + +
+
+ +
+
+
{:else if RAGConfig.CONTENT_EXTRACTION_ENGINE === 'datalab_marker'}
Date: Thu, 22 Jan 2026 03:09:04 +0400 Subject: [PATCH 044/311] refac --- backend/open_webui/models/knowledge.py | 29 ++++++++++---------------- 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/backend/open_webui/models/knowledge.py b/backend/open_webui/models/knowledge.py index 8612842015..81aa4099d9 100644 --- a/backend/open_webui/models/knowledge.py +++ b/backend/open_webui/models/knowledge.py @@ -243,7 +243,7 @@ def search_knowledge_bases( query = has_permission(db, Knowledge, query, filter) - query = query.order_by(Knowledge.updated_at.desc()) + query = query.order_by(Knowledge.updated_at.desc(), Knowledge.id.asc()) total = query.count() if skip: @@ -303,7 +303,7 @@ def search_knowledge_files( query = query.filter(File.filename.ilike(f"%{q}%")) # Order by file changes - query = query.order_by(File.updated_at.desc()) + query = query.order_by(File.updated_at.desc(), File.id.asc()) # Count before pagination total = query.count() @@ -430,6 +430,9 @@ def search_files_by_id( .filter(KnowledgeFile.knowledge_id == knowledge_id) ) + # Default sort: updated_at descending + primary_sort = File.updated_at.desc() + if filter: query_key = filter.get("query") if query_key: @@ -443,27 +446,17 @@ def search_files_by_id( order_by = filter.get("order_by") direction = filter.get("direction") + is_asc = direction == "asc" if order_by == "name": - if direction == "asc": - query = query.order_by(File.filename.asc()) - else: - query = query.order_by(File.filename.desc()) + primary_sort = File.filename.asc() if is_asc else File.filename.desc() elif order_by == "created_at": - if direction == "asc": - query = query.order_by(File.created_at.asc()) - else: - query = query.order_by(File.created_at.desc()) + primary_sort = File.created_at.asc() if is_asc else File.created_at.desc() elif order_by == "updated_at": - if direction == "asc": - query = query.order_by(File.updated_at.asc()) - else: - query = query.order_by(File.updated_at.desc()) - else: - query = query.order_by(File.updated_at.desc()) + primary_sort = File.updated_at.asc() if is_asc else File.updated_at.desc() - else: - query = query.order_by(File.updated_at.desc()) + # Apply sort with secondary key for deterministic pagination + query = query.order_by(primary_sort, File.id.asc()) # Count BEFORE pagination total = query.count() From 8eebc2aea63b7045e61c9689a65a2dfa9c797bcb Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 22 Jan 2026 03:11:33 +0400 Subject: [PATCH 045/311] fix: mcp get_discovery_urls --- backend/open_webui/routers/configs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/routers/configs.py b/backend/open_webui/routers/configs.py index 152e2c3edc..4dee4488cf 100644 --- a/backend/open_webui/routers/configs.py +++ b/backend/open_webui/routers/configs.py @@ -224,7 +224,7 @@ async def verify_tool_servers_config( try: if form_data.type == "mcp": if form_data.auth_type == "oauth_2.1": - discovery_urls = get_discovery_urls(form_data.url) + discovery_urls = await get_discovery_urls(form_data.url) for discovery_url in discovery_urls: log.debug( f"Trying to fetch OAuth 2.1 discovery document from {discovery_url}" From 8c70453b2e3a6958437d951751e84acbbaafd9aa Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 22 Jan 2026 03:18:38 +0400 Subject: [PATCH 046/311] enh: password valve type --- src/lib/components/common/Valves.svelte | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/lib/components/common/Valves.svelte b/src/lib/components/common/Valves.svelte index de1487c64f..cad66c5b7f 100644 --- a/src/lib/components/common/Valves.svelte +++ b/src/lib/components/common/Valves.svelte @@ -4,6 +4,7 @@ const i18n = getContext('i18n'); import Switch from './Switch.svelte'; + import SensitiveInput from './SensitiveInput.svelte'; import MapSelector from './Valves/MapSelector.svelte'; export let valvesSpec = null; @@ -103,7 +104,19 @@ }} /> {:else if valvesSpec.properties[property]?.input ?? null} - {#if valvesSpec.properties[property]?.input?.type === 'color'} + {#if valvesSpec.properties[property]?.input?.type === 'password'} +
+ { + dispatch('change'); + }} + /> +
+ {:else if valvesSpec.properties[property]?.input?.type === 'color'}
Date: Thu, 22 Jan 2026 03:20:59 +0400 Subject: [PATCH 047/311] refac/fix: default oauth2.1 mcp tool --- src/lib/components/workspace/Models/ToolsSelector.svelte | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/lib/components/workspace/Models/ToolsSelector.svelte b/src/lib/components/workspace/Models/ToolsSelector.svelte index bbc484f907..d002ac6296 100644 --- a/src/lib/components/workspace/Models/ToolsSelector.svelte +++ b/src/lib/components/workspace/Models/ToolsSelector.svelte @@ -12,7 +12,13 @@ const i18n = getContext('i18n'); onMount(() => { - _tools = tools.reduce((acc, tool) => { + // Filter out OAuth2.1 MCP tools - these cannot be set as model defaults + // because OAuth authentication is per-user and would fail for users + // who haven't completed the OAuth flow. + // The `authenticated` field only exists on OAuth2.1 MCP tools. + const availableTools = tools.filter((tool) => tool.authenticated === undefined); + + _tools = availableTools.reduce((acc, tool) => { acc[tool.id] = { ...tool, selected: selectedToolIds.includes(tool.id) From 4d9a7cc6c0adea54b58046c576250a0c3ae7b512 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 22 Jan 2026 03:25:23 +0400 Subject: [PATCH 048/311] refac: fr-FR priority --- src/lib/i18n/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/i18n/index.ts b/src/lib/i18n/index.ts index e5c2d183b2..d7361a5e79 100644 --- a/src/lib/i18n/index.ts +++ b/src/lib/i18n/index.ts @@ -58,6 +58,7 @@ export const initI18n = (defaultLocale?: string | undefined) => { lookupLocalStorage: 'locale' }, fallbackLng: { + fr: ['fr-FR'], default: fallbackDefaultLocale }, ns: 'translation', From 00b3583dc2fe77f7f2223ea2fa2fe4302d4cfdcd Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Thu, 22 Jan 2026 00:36:08 +0100 Subject: [PATCH 049/311] fix: fix reindex not working due to unnecessary dupe check (#20857) * Update retrieval.py * Update knowledge.py * Update retrieval.py * Update knowledge.py --- backend/open_webui/routers/retrieval.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index 318e7bf8ce..5a3a346ab7 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -1425,8 +1425,16 @@ def _get_docs_info(docs: list[Document]) -> str: if result is not None and result.ids and len(result.ids) > 0: existing_doc_ids = result.ids[0] if existing_doc_ids: - log.info(f"Document with hash {metadata['hash']} already exists") - raise ValueError(ERROR_MESSAGES.DUPLICATE_CONTENT) + # Check if the existing document belongs to the same file + # If same file_id, this is a re-add/reindex - allow it + # If different file_id, this is a duplicate - block it + existing_file_id = None + if result.metadatas and result.metadatas[0]: + existing_file_id = result.metadatas[0][0].get("file_id") + + if existing_file_id != metadata.get("file_id"): + log.info(f"Document with hash {metadata['hash']} already exists") + raise ValueError(ERROR_MESSAGES.DUPLICATE_CONTENT) if split: if request.app.state.config.ENABLE_MARKDOWN_HEADER_TEXT_SPLITTER: From 474427c67e953bb9f7d122757a756a639214e0b2 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 22 Jan 2026 03:55:07 +0400 Subject: [PATCH 050/311] enh: dynamic select options valve --- backend/open_webui/routers/functions.py | 11 +- backend/open_webui/routers/tools.py | 11 +- backend/open_webui/utils/plugin.py | 138 ++++++++++++++++++++++++ src/lib/components/common/Valves.svelte | 21 ++++ 4 files changed, 177 insertions(+), 4 deletions(-) diff --git a/backend/open_webui/routers/functions.py b/backend/open_webui/routers/functions.py index ad47318911..a31b958e21 100644 --- a/backend/open_webui/routers/functions.py +++ b/backend/open_webui/routers/functions.py @@ -19,6 +19,7 @@ load_function_module_by_id, replace_imports, get_function_module_from_cache, + resolve_valves_schema_options, ) from open_webui.config import CACHE_DIR from open_webui.constants import ERROR_MESSAGES @@ -446,7 +447,10 @@ async def get_function_valves_spec_by_id( if hasattr(function_module, "Valves"): Valves = function_module.Valves - return Valves.schema() + schema = Valves.schema() + # Resolve dynamic options for select dropdowns + schema = resolve_valves_schema_options(Valves, schema, user) + return schema return None else: raise HTTPException( @@ -546,7 +550,10 @@ async def get_function_user_valves_spec_by_id( if hasattr(function_module, "UserValves"): UserValves = function_module.UserValves - return UserValves.schema() + schema = UserValves.schema() + # Resolve dynamic options for select dropdowns + schema = resolve_valves_schema_options(UserValves, schema, user) + return schema return None else: raise HTTPException( diff --git a/backend/open_webui/routers/tools.py b/backend/open_webui/routers/tools.py index 03018d24a1..7f9b23c7ce 100644 --- a/backend/open_webui/routers/tools.py +++ b/backend/open_webui/routers/tools.py @@ -25,6 +25,7 @@ load_tool_module_by_id, replace_imports, get_tool_module_from_cache, + resolve_valves_schema_options, ) from open_webui.utils.tools import get_tool_specs from open_webui.utils.auth import get_admin_user, get_verified_user @@ -553,7 +554,10 @@ async def get_tools_valves_spec_by_id( if hasattr(tools_module, "Valves"): Valves = tools_module.Valves - return Valves.schema() + schema = Valves.schema() + # Resolve dynamic options for select dropdowns + schema = resolve_valves_schema_options(Valves, schema, user) + return schema return None else: raise HTTPException( @@ -662,7 +666,10 @@ async def get_tools_user_valves_spec_by_id( if hasattr(tools_module, "UserValves"): UserValves = tools_module.UserValves - return UserValves.schema() + schema = UserValves.schema() + # Resolve dynamic options for select dropdowns + schema = resolve_valves_schema_options(UserValves, schema, user) + return schema return None else: raise HTTPException( diff --git a/backend/open_webui/utils/plugin.py b/backend/open_webui/utils/plugin.py index 965b0a688f..79a1c0f0dc 100644 --- a/backend/open_webui/utils/plugin.py +++ b/backend/open_webui/utils/plugin.py @@ -6,6 +6,7 @@ import types import tempfile import logging +from typing import Any from open_webui.env import PIP_OPTIONS, PIP_PACKAGE_INDEX_OPTIONS, OFFLINE_MODE from open_webui.models.functions import Functions @@ -14,6 +15,143 @@ log = logging.getLogger(__name__) +def resolve_valves_schema_options( + valves_class: type, schema: dict, user: Any = None +) -> dict: + """ + Resolve dynamic options in a Valves schema. + + For properties with `input.options`, this function handles two cases: + - List: Used directly as dropdown options + - String: Treated as method name, called to get options dynamically + + Usage in Valves: + class UserValves(BaseModel): + # Static options + priority: str = Field( + default="medium", + json_schema_extra={ + "input": { + "type": "select", + "options": ["low", "medium", "high"] + } + } + ) + + # Dynamic options (method name) + model: str = Field( + default="", + json_schema_extra={ + "input": { + "type": "select", + "options": "get_model_options" + } + } + ) + + @classmethod + def get_model_options(cls, __user__=None) -> list[dict]: + return [{"value": "gpt-4", "label": "GPT-4"}] + + Args: + valves_class: The Valves or UserValves Pydantic model class + schema: The JSON schema dict from valves_class.schema() + user: Optional user object passed to methods that accept __user__ + + Returns: + Modified schema dict with resolved options + """ + if not schema or "properties" not in schema: + return schema + + # Make a copy to avoid mutating the original + schema = dict(schema) + schema["properties"] = dict(schema.get("properties", {})) + + for prop_name, prop_schema in list(schema["properties"].items()): + # Get the original field info from the Pydantic model + if not hasattr(valves_class, "model_fields"): + continue + + field_info = valves_class.model_fields.get(prop_name) + if not field_info: + continue + + # Check json_schema_extra for options + json_schema_extra = field_info.json_schema_extra + if not json_schema_extra or not isinstance(json_schema_extra, dict): + continue + + input_config = json_schema_extra.get("input") + if not input_config or not isinstance(input_config, dict): + continue + + options = input_config.get("options") + if options is None: + continue + + resolved_options = None + + # Case 1: options is already a list - use directly + if isinstance(options, list): + resolved_options = options + + # Case 2: options is a string - treat as method name + elif isinstance(options, str) and options: + method = getattr(valves_class, options, None) + if method is None or not callable(method): + log.warning( + f"options '{options}' not found or not callable on {valves_class.__name__}" + ) + continue + + try: + import inspect + + sig = inspect.signature(method) + params = sig.parameters + + # Prepare kwargs based on what the method accepts + kwargs = {} + if "__user__" in params and user is not None: + kwargs["__user__"] = ( + user.model_dump() if hasattr(user, "model_dump") else user + ) + if "user" in params and user is not None: + kwargs["user"] = ( + user.model_dump() if hasattr(user, "model_dump") else user + ) + + resolved_options = method(**kwargs) if kwargs else method() + + # Validate return type + if not isinstance(resolved_options, list): + log.warning( + f"Method '{options}' did not return a list for {prop_name}" + ) + continue + + except Exception as e: + log.warning(f"Failed to resolve options for {prop_name}: {e}") + continue + else: + # Invalid options type - skip + continue + + # Update the schema with resolved options + schema["properties"][prop_name] = dict(prop_schema) + if "input" not in schema["properties"][prop_name]: + schema["properties"][prop_name]["input"] = {"type": "select"} + else: + schema["properties"][prop_name]["input"] = dict( + schema["properties"][prop_name].get("input", {}) + ) + schema["properties"][prop_name]["input"]["options"] = resolved_options + + return schema + + + def extract_frontmatter(content): """ Extract frontmatter as a dictionary from the provided content string. diff --git a/src/lib/components/common/Valves.svelte b/src/lib/components/common/Valves.svelte index cad66c5b7f..4557ab490c 100644 --- a/src/lib/components/common/Valves.svelte +++ b/src/lib/components/common/Valves.svelte @@ -116,6 +116,27 @@ }} />
+ {:else if valvesSpec.properties[property]?.input?.type === 'select' && valvesSpec.properties[property]?.input?.options} + {:else if valvesSpec.properties[property]?.input?.type === 'color'}
From 5d48e48e15b003874cc821d896998a01e87580a0 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 22 Jan 2026 03:59:00 +0400 Subject: [PATCH 051/311] fix: ENABLE_PERSISTENT_CONFIG redis issue --- backend/open_webui/config.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index c062977652..e84f1fa519 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -257,7 +257,7 @@ def __setattr__(self, key, value): self._state[key].value = value self._state[key].save() - if self._redis: + if self._redis and ENABLE_PERSISTENT_CONFIG: redis_key = f"{self._redis_key_prefix}:config:{key}" self._redis.set(redis_key, json.dumps(self._state[key].value)) @@ -265,8 +265,8 @@ def __getattr__(self, key): if key not in self._state: raise AttributeError(f"Config key '{key}' not found") - # If Redis is available, check for an updated value - if self._redis: + # If Redis is available and persistent config is enabled, check for an updated value + if self._redis and ENABLE_PERSISTENT_CONFIG: redis_key = f"{self._redis_key_prefix}:config:{key}" redis_value = self._redis.get(redis_key) From a3600e8b219fc4c019b95258d16bd3e2827490c6 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 22 Jan 2026 04:12:57 +0400 Subject: [PATCH 052/311] refac --- .../chat/MessageInput/InputMenu.svelte | 54 +++++++++---------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/src/lib/components/chat/MessageInput/InputMenu.svelte b/src/lib/components/chat/MessageInput/InputMenu.svelte index 83d6abc5a5..6e2d7724b2 100644 --- a/src/lib/components/chat/MessageInput/InputMenu.svelte +++ b/src/lib/components/chat/MessageInput/InputMenu.svelte @@ -4,7 +4,7 @@ import { fly } from 'svelte/transition'; import { flyAndScale } from '$lib/utils/transitions'; - import { config, user, tools as _tools, mobile, knowledge, chats } from '$lib/stores'; + import { config, user, tools as _tools, mobile, knowledge } from '$lib/stores'; import { getKnowledgeBases } from '$lib/apis/knowledge'; import { createPicker } from '$lib/utils/google-drive-picker'; @@ -269,37 +269,35 @@ - {#if ($chats ?? []).length > 0} - + - - {/if} +
+ + {#if fileUploadEnabled} {#if $config?.features?.enable_google_drive_integration} From 886c12c5664bc2dd73313330f61c2257169da6d1 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 22 Jan 2026 14:54:00 +0400 Subject: [PATCH 053/311] refac --- backend/open_webui/utils/payload.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/utils/payload.py b/backend/open_webui/utils/payload.py index 458687b371..5094c910ca 100644 --- a/backend/open_webui/utils/payload.py +++ b/backend/open_webui/utils/payload.py @@ -287,7 +287,11 @@ def convert_payload_openai_to_ollama(openai_payload: dict) -> dict: Returns: dict: A modified payload compatible with the Ollama API. """ - openai_payload = copy.deepcopy(openai_payload) + # Shallow copy metadata separately (may contain non-picklable objects) + metadata = openai_payload.get("metadata") + openai_payload = copy.deepcopy({k: v for k, v in openai_payload.items() if k != "metadata"}) + if metadata is not None: + openai_payload["metadata"] = dict(metadata) ollama_payload = {} # Mapping basic model and message details From 1a4bdd2b30017d901b9cac1e2e10684ec1edd062 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 22 Jan 2026 14:59:15 +0400 Subject: [PATCH 054/311] refac --- backend/open_webui/tools/builtin.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/backend/open_webui/tools/builtin.py b/backend/open_webui/tools/builtin.py index fcd1d4d233..874a073af8 100644 --- a/backend/open_webui/tools/builtin.py +++ b/backend/open_webui/tools/builtin.py @@ -892,6 +892,7 @@ async def search_chats( end_timestamp: Optional[int] = None, __request__: Request = None, __user__: dict = None, + __chat_id__: str = None, ) -> str: """ Search the user's previous chat conversations by title and message content. @@ -921,6 +922,10 @@ async def search_chats( results = [] for chat in chats: + # Skip the current chat to avoid showing it in search results + if __chat_id__ and chat.id == __chat_id__: + continue + # Apply date filters (updated_at is in seconds) if start_timestamp and chat.updated_at < start_timestamp: continue From 68b2872ed645cffb641fa5a21a784d6e9ea0d72b Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 22 Jan 2026 15:03:31 +0400 Subject: [PATCH 055/311] fix/refac: file batch process issue --- backend/open_webui/routers/retrieval.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index 5a3a346ab7..ce9153c8df 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -2721,7 +2721,7 @@ async def process_files_batch( for file_result in file_results: file_result.status = "failed" file_errors.append( - BatchProcessFilesResult(file_id=file_result.file_id, error=str(e)) + BatchProcessFilesResult(file_id=file_result.file_id, status="failed", error=str(e)) ) return BatchProcessFilesResponse(results=file_results, errors=file_errors) From 14f6747dfc66fb7e942b930650286012121e5262 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 22 Jan 2026 15:07:14 +0400 Subject: [PATCH 056/311] refac --- backend/open_webui/utils/middleware.py | 8 ++------ backend/open_webui/utils/tools.py | 4 +--- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index fe2d7e5dc1..48ebddb7ef 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -1808,9 +1808,7 @@ async def tool_function(**kwargs): # Inject builtin tools for native function calling based on enabled features and model capability # Check if builtin_tools capability is enabled for this model (defaults to True if not specified) builtin_tools_enabled = ( - model.get("info", {}) - .get("meta", {}) - .get("capabilities", {}) + (model.get("info", {}).get("meta", {}).get("capabilities") or {}) .get("builtin_tools", True) ) if ( @@ -1856,9 +1854,7 @@ async def tool_function(**kwargs): # Check if file context extraction is enabled for this model (default True) file_context_enabled = ( - model.get("info", {}) - .get("meta", {}) - .get("capabilities", {}) + (model.get("info", {}).get("meta", {}).get("capabilities") or {}) .get("file_context", True) ) diff --git a/backend/open_webui/utils/tools.py b/backend/open_webui/utils/tools.py index 77f985ebbc..7984878344 100644 --- a/backend/open_webui/utils/tools.py +++ b/backend/open_webui/utils/tools.py @@ -398,9 +398,7 @@ def get_builtin_tools( # Helper to get model capabilities (defaults to True if not specified) def get_model_capability(name: str, default: bool = True) -> bool: return ( - model.get("info", {}) - .get("meta", {}) - .get("capabilities", {}) + (model.get("info", {}).get("meta", {}).get("capabilities") or {}) .get(name, default) ) From 9e5d6069fef751b4a5bdb38583cab7da00aaba11 Mon Sep 17 00:00:00 2001 From: G30 <50341825+silentoplayz@users.noreply.github.com> Date: Thu, 22 Jan 2026 07:07:07 -0500 Subject: [PATCH 057/311] feat: Sort Tools and Functions dropdowns alphabetically (#20871) Alphabetically sort Tools and Functions selection dropdowns in Chat Controls sidebar for easier navigation and better user experience. --- src/lib/components/chat/Controls/Valves.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/components/chat/Controls/Valves.svelte b/src/lib/components/chat/Controls/Valves.svelte index 83fda5ff19..a63b0d3b81 100644 --- a/src/lib/components/chat/Controls/Valves.svelte +++ b/src/lib/components/chat/Controls/Valves.svelte @@ -172,7 +172,7 @@ >{$i18n.t('Select a tool')} - {#each $tools.filter((tool) => !tool?.id?.startsWith('server:')) as tool, toolIdx} + {#each $tools.filter((tool) => !tool?.id?.startsWith('server:')).sort((a, b) => (a.name ?? '').localeCompare(b.name ?? '')) as tool, toolIdx} {/each} {:else if tab === 'functions'} @@ -180,7 +180,7 @@ >{$i18n.t('Select a function')} - {#each $functions as func, funcIdx} + {#each $functions.sort((a, b) => (a.name ?? '').localeCompare(b.name ?? '')) as func, funcIdx} {/each} {/if} From 907dba4517903e5646e40223a0edca26a7107bc8 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 22 Jan 2026 18:27:42 +0400 Subject: [PATCH 058/311] feat: easter eggs flag --- backend/open_webui/env.py | 2 ++ backend/open_webui/main.py | 2 ++ src/lib/components/chat/Settings/General.svelte | 6 +++--- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/env.py b/backend/open_webui/env.py index 0bbe1b89c4..aa296da5b8 100644 --- a/backend/open_webui/env.py +++ b/backend/open_webui/env.py @@ -199,6 +199,8 @@ def parse_section(section): os.environ.get("ENABLE_STAR_SESSIONS_MIDDLEWARE", "False").lower() == "true" ) +ENABLE_EASTER_EGGS = os.environ.get("ENABLE_EASTER_EGGS", "True").lower() == "true" + #################################### # WEBUI_BUILD_HASH #################################### diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 9d1d85060f..398a666d63 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -491,6 +491,7 @@ WEBUI_ADMIN_EMAIL, WEBUI_ADMIN_PASSWORD, WEBUI_ADMIN_NAME, + ENABLE_EASTER_EGGS, ) @@ -1932,6 +1933,7 @@ async def get_app_config(request: Request): "enable_websocket": ENABLE_WEBSOCKET_SUPPORT, "enable_version_update_check": ENABLE_VERSION_UPDATE_CHECK, "enable_public_active_users_count": ENABLE_PUBLIC_ACTIVE_USERS_COUNT, + "enable_easter_eggs": ENABLE_EASTER_EGGS, **( { "enable_direct_connections": app.state.config.ENABLE_DIRECT_CONNECTIONS, diff --git a/src/lib/components/chat/Settings/General.svelte b/src/lib/components/chat/Settings/General.svelte index bb8a63eedc..e65683bde6 100644 --- a/src/lib/components/chat/Settings/General.svelte +++ b/src/lib/components/chat/Settings/General.svelte @@ -210,9 +210,9 @@ - - + {#if $config?.features?.enable_easter_eggs} + + {/if}
From c7f996d593e4bb48103b91316204fe7e50e25b35 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 22 Jan 2026 18:30:16 +0400 Subject: [PATCH 059/311] refac: AIOHTTP_CLIENT_SESSION_TOOL_SERVER_SSL for mcp connections --- backend/open_webui/utils/mcp/client.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/utils/mcp/client.py b/backend/open_webui/utils/mcp/client.py index 6edfca4f6c..33803648be 100644 --- a/backend/open_webui/utils/mcp/client.py +++ b/backend/open_webui/utils/mcp/client.py @@ -8,6 +8,15 @@ from mcp.client.auth import OAuthClientProvider, TokenStorage from mcp.client.streamable_http import streamablehttp_client from mcp.shared.auth import OAuthClientInformationFull, OAuthClientMetadata, OAuthToken +import httpx +from mcp.shared._httpx_utils import create_mcp_http_client +from open_webui.env import AIOHTTP_CLIENT_SESSION_TOOL_SERVER_SSL + + +def create_insecure_httpx_client(headers=None, timeout=None, auth=None): + client = create_mcp_http_client(headers=headers, timeout=timeout, auth=auth) + client.verify = False + return client class MCPClient: @@ -18,7 +27,14 @@ def __init__(self): async def connect(self, url: str, headers: Optional[dict] = None): async with AsyncExitStack() as exit_stack: try: - self._streams_context = streamablehttp_client(url, headers=headers) + if AIOHTTP_CLIENT_SESSION_TOOL_SERVER_SSL: + self._streams_context = streamablehttp_client(url, headers=headers) + else: + self._streams_context = streamablehttp_client( + url, + headers=headers, + httpx_client_factory=create_insecure_httpx_client, + ) transport = await exit_stack.enter_async_context(self._streams_context) read_stream, write_stream, _ = transport From 0df561c33c105640e7f3f3d7e98033a7b1ebd657 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 22 Jan 2026 18:40:54 +0400 Subject: [PATCH 060/311] refac --- src/lib/components/chat/Settings/General.svelte | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lib/components/chat/Settings/General.svelte b/src/lib/components/chat/Settings/General.svelte index e65683bde6..db232a5df4 100644 --- a/src/lib/components/chat/Settings/General.svelte +++ b/src/lib/components/chat/Settings/General.svelte @@ -112,6 +112,10 @@ languages = await getLanguages(); + if (!$config?.features?.enable_easter_eggs) { + languages = languages.filter((l) => l.code !== 'dg-DG'); + } + notificationEnabled = $settings.notificationEnabled ?? false; system = $settings.system ?? ''; From 9af40624c5f0f8f7f640a11356e167543b07b2bb Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 22 Jan 2026 18:58:00 +0400 Subject: [PATCH 061/311] refac --- backend/open_webui/routers/retrieval.py | 80 +++++++++++++++---------- 1 file changed, 47 insertions(+), 33 deletions(-) diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index ce9153c8df..a37fc50b05 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -39,7 +39,7 @@ from open_webui.models.files import FileModel, FileUpdateForm, Files from open_webui.models.knowledge import Knowledges from open_webui.storage.provider import Storage -from open_webui.internal.db import get_session +from open_webui.internal.db import get_session, get_db from sqlalchemy.orm import Session @@ -1431,7 +1431,7 @@ def _get_docs_info(docs: list[Document]) -> str: existing_file_id = None if result.metadatas and result.metadatas[0]: existing_file_id = result.metadatas[0][0].get("file_id") - + if existing_file_id != metadata.get("file_id"): log.info(f"Document with hash {metadata['hash']} already exists") raise ValueError(ERROR_MESSAGES.DUPLICATE_CONTENT) @@ -1602,6 +1602,9 @@ def process_file( ): """ Process a file and save its content to the vector database. + Process a file and save its content to the vector database. + Note: granular session management is used to prevent connection pool exhaustion. + The session is committed before external API calls, and updates use a fresh session. """ if user.role == "admin": file = Files.get_file_by_id(form_data.file_id, db=db) @@ -1763,6 +1766,13 @@ def process_file( } else: try: + # Release the database connection relative to the 'file' object + # to prevent holding the connection during the slow embedding step. + db.expunge(file) + db.commit() + + # External embedding API takes time (5-60s+). + # No DB connection is held here. result = save_docs_to_vector_db( request, docs=docs, @@ -1778,27 +1788,29 @@ def process_file( log.info(f"added {len(docs)} items to collection {collection_name}") if result: - Files.update_file_metadata_by_id( - file.id, - { + # Fresh session for the final update. + with get_db() as session: + Files.update_file_metadata_by_id( + file.id, + { + "collection_name": collection_name, + }, + db=session, + ) + + Files.update_file_data_by_id( + file.id, + {"status": "completed"}, + db=session, + ) + Files.update_file_hash_by_id(file.id, hash, db=session) + + return { + "status": True, "collection_name": collection_name, - }, - db=db, - ) - - Files.update_file_data_by_id( - file.id, - {"status": "completed"}, - db=db, - ) - Files.update_file_hash_by_id(file.id, hash, db=db) - - return { - "status": True, - "collection_name": collection_name, - "filename": file.filename, - "content": text_content, - } + "filename": file.filename, + "content": text_content, + } else: raise Exception("Error saving document to vector database") except Exception as e: @@ -1806,13 +1818,15 @@ def process_file( except Exception as e: log.exception(e) - Files.update_file_data_by_id( - file.id, - {"status": "failed"}, - db=db, - ) - # Clear the hash so the file can be re-uploaded after fixing the issue - Files.update_file_hash_by_id(file.id, None, db=db) + # Fresh session for error status update. + with get_db() as session: + Files.update_file_data_by_id( + file.id, + {"status": "failed"}, + db=session, + ) + # Clear the hash so the file can be re-uploaded after fixing the issue + Files.update_file_hash_by_id(file.id, None, db=session) if "No pandoc was found" in str(e): raise HTTPException( @@ -2709,9 +2723,7 @@ async def process_files_batch( # Update all files with collection name for file_update, file_result in zip(file_updates, file_results): - Files.update_file_by_id( - id=file_result.file_id, form_data=file_update - ) + Files.update_file_by_id(id=file_result.file_id, form_data=file_update) file_result.status = "completed" except Exception as e: @@ -2721,7 +2733,9 @@ async def process_files_batch( for file_result in file_results: file_result.status = "failed" file_errors.append( - BatchProcessFilesResult(file_id=file_result.file_id, status="failed", error=str(e)) + BatchProcessFilesResult( + file_id=file_result.file_id, status="failed", error=str(e) + ) ) return BatchProcessFilesResponse(results=file_results, errors=file_errors) From 5a0488bb183c2e5337762053b0b6d4567497e4ed Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Thu, 22 Jan 2026 17:30:07 +0100 Subject: [PATCH 062/311] init (#20881) --- backend/open_webui/utils/task.py | 4 ++++ src/lib/components/channel/MessageInput.svelte | 8 ++++++++ src/lib/components/chat/MessageInput.svelte | 8 ++++++++ src/lib/utils/index.ts | 17 +++++++++-------- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/backend/open_webui/utils/task.py b/backend/open_webui/utils/task.py index ecedd595a7..4acb2c3718 100644 --- a/backend/open_webui/utils/task.py +++ b/backend/open_webui/utils/task.py @@ -69,6 +69,7 @@ def prompt_template(template: str, user: Optional[Any] = None) -> str: USER_VARIABLES = { "name": str(user.get("name")), + "email": str(user.get("email")), "location": str(user_info.get("location")), "bio": str(user.get("bio")), "gender": str(user.get("gender")), @@ -92,6 +93,9 @@ def prompt_template(template: str, user: Optional[Any] = None) -> str: template = template.replace("{{CURRENT_WEEKDAY}}", formatted_weekday) template = template.replace("{{USER_NAME}}", USER_VARIABLES.get("name", "Unknown")) + template = template.replace( + "{{USER_EMAIL}}", USER_VARIABLES.get("email", "Unknown") + ) template = template.replace("{{USER_BIO}}", USER_VARIABLES.get("bio", "Unknown")) template = template.replace( "{{USER_GENDER}}", USER_VARIABLES.get("gender", "Unknown") diff --git a/src/lib/components/channel/MessageInput.svelte b/src/lib/components/channel/MessageInput.svelte index bff703c51f..2b6c2b96ff 100644 --- a/src/lib/components/channel/MessageInput.svelte +++ b/src/lib/components/channel/MessageInput.svelte @@ -147,6 +147,14 @@ text = text.replaceAll('{{USER_NAME}}', name); } + if (text.includes('{{USER_EMAIL}}')) { + const email = sessionUser?.email || ''; + + if (email) { + text = text.replaceAll('{{USER_EMAIL}}', email); + } + } + if (text.includes('{{USER_BIO}}')) { const bio = sessionUser?.bio || ''; diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index d02bda4fa9..103da88f9a 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -221,6 +221,14 @@ text = text.replaceAll('{{USER_NAME}}', name); } + if (text.includes('{{USER_EMAIL}}')) { + const email = sessionUser?.email || ''; + + if (email) { + text = text.replaceAll('{{USER_EMAIL}}', email); + } + } + if (text.includes('{{USER_BIO}}')) { const bio = sessionUser?.bio || ''; diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 265c47cec2..2ea221ab82 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -357,9 +357,9 @@ export const generateInitialsImage = (name) => { const initials = sanitizedName.length > 0 ? sanitizedName[0] + - (sanitizedName.split(' ').length > 1 - ? sanitizedName[sanitizedName.lastIndexOf(' ') + 1] - : '') + (sanitizedName.split(' ').length > 1 + ? sanitizedName[sanitizedName.lastIndexOf(' ') + 1] + : '') : ''; ctx.fillText(initials.toUpperCase(), canvas.width / 2, canvas.height / 2); @@ -515,10 +515,10 @@ export const compareVersion = (latest, current) => { return current === '0.0.0' ? false : current.localeCompare(latest, undefined, { - numeric: true, - sensitivity: 'case', - caseFirst: 'upper' - }) < 0; + numeric: true, + sensitivity: 'case', + caseFirst: 'upper' + }) < 0; }; export const extractCurlyBraceWords = (text) => { @@ -973,9 +973,10 @@ export const blobToFile = (blob, fileName) => { return file; }; -export const getPromptVariables = (user_name, user_location) => { +export const getPromptVariables = (user_name, user_location, user_email = '') => { return { '{{USER_NAME}}': user_name, + '{{USER_EMAIL}}': user_email || 'Unknown', '{{USER_LOCATION}}': user_location || 'Unknown', '{{CURRENT_DATETIME}}': getCurrentDateTime(), '{{CURRENT_DATE}}': getFormattedDate(), From 4c6f100b5fe2145a3d676b70b5f7c0e7f07cee20 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 Jan 2026 00:56:50 +0400 Subject: [PATCH 063/311] refac --- src/lib/utils/index.ts | 52 +++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 2ea221ab82..96f290a2b7 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -32,6 +32,18 @@ function escapeRegExp(string: string): string { return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } +// Replace tokens outside code blocks only +export const replaceOutsideCode = (content: string, replacer: (str: string) => string) => { + return content + .split(/(```[\s\S]*?```|`[\s\S]*?`)/) + .map((segment) => { + return segment.startsWith('```') || segment.startsWith('`') + ? segment + : replacer(segment); + }) + .join(''); +}; + export const replaceTokens = (content, char, user) => { const tokens = [ { regex: /{{char}}/gi, replacement: char }, @@ -47,20 +59,8 @@ export const replaceTokens = (content, char, user) => { } ]; - // Replace tokens outside code blocks only - const processOutsideCodeBlocks = (text, replacementFn) => { - return text - .split(/(```[\s\S]*?```|`[\s\S]*?`)/) - .map((segment) => { - return segment.startsWith('```') || segment.startsWith('`') - ? segment - : replacementFn(segment); - }) - .join(''); - }; - // Apply replacements - content = processOutsideCodeBlocks(content, (segment) => { + content = replaceOutsideCode(content, (segment) => { tokens.forEach(({ regex, replacement }) => { if (replacement !== undefined && replacement !== null) { segment = segment.replace(regex, replacement); @@ -841,19 +841,21 @@ export const cleanText = (content: string) => { }; export const removeDetails = (content, types) => { - for (const type of types) { - content = content.replace( - new RegExp(`]*>.*?<\\/details>`, 'gis'), - '' - ); - } - - return content; + return replaceOutsideCode(content, (segment) => { + for (const type of types) { + segment = segment.replace( + new RegExp(`]*>.*?<\\/details>`, 'gis'), + '' + ); + } + return segment; + }); }; export const removeAllDetails = (content) => { - content = content.replace(/]*>.*?<\/details>/gis, ''); - return content; + return replaceOutsideCode(content, (segment) => { + return segment.replace(/]*>.*?<\/details>/gis, ''); + }); }; export const processDetails = (content) => { @@ -1655,6 +1657,10 @@ export const getCodeBlockContents = (content: string): object => { } }); } else { + // Remove details tags from the content to check if there are any code blocks + // hidden in the details tags (e.g. reasoning, etc.) + content = removeAllDetails(content); + const inlineHtml = content.match(/[\s\S]*?<\/html>/gi); const inlineCss = content.match(/