From 41a4cf7106639b46b68a3ef4117129e14b54c633 Mon Sep 17 00:00:00 2001 From: Marko Henning Date: Thu, 6 Mar 2025 10:47:57 +0100 Subject: [PATCH 01/45] Added new k_reranker parameter --- backend/open_webui/config.py | 5 +++++ backend/open_webui/main.py | 2 ++ backend/open_webui/retrieval/utils.py | 7 ++++++- backend/open_webui/routers/retrieval.py | 8 ++++++++ backend/open_webui/utils/middleware.py | 1 + .../components/admin/Settings/Documents.svelte | 18 ++++++++++++++++++ 6 files changed, 40 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 1e265f2ce..c832b88a2 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -1646,6 +1646,11 @@ BYPASS_EMBEDDING_AND_RETRIEVAL = PersistentConfig( RAG_TOP_K = PersistentConfig( "RAG_TOP_K", "rag.top_k", int(os.environ.get("RAG_TOP_K", "3")) ) +RAG_TOP_K_RERANKER = PersistentConfig( + "RAG_TOP_K_RERANKER", + "rag.top_k_reranker", + int(os.environ.get("RAG_TOP_K_RERANKER", "3")) +) RAG_RELEVANCE_THRESHOLD = PersistentConfig( "RAG_RELEVANCE_THRESHOLD", "rag.relevance_threshold", diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 416460837..3c83aba11 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -189,6 +189,7 @@ from open_webui.config import ( DOCUMENT_INTELLIGENCE_ENDPOINT, DOCUMENT_INTELLIGENCE_KEY, RAG_TOP_K, + RAG_TOP_K_RERANKER, RAG_TEXT_SPLITTER, TIKTOKEN_ENCODING_NAME, PDF_EXTRACT_IMAGES, @@ -535,6 +536,7 @@ app.state.FUNCTIONS = {} app.state.config.TOP_K = RAG_TOP_K +app.state.config.TOP_K_RERANKER = RAG_TOP_K_RERANKER app.state.config.RELEVANCE_THRESHOLD = RAG_RELEVANCE_THRESHOLD app.state.config.FILE_MAX_SIZE = RAG_FILE_MAX_SIZE app.state.config.FILE_MAX_COUNT = RAG_FILE_MAX_COUNT diff --git a/backend/open_webui/retrieval/utils.py b/backend/open_webui/retrieval/utils.py index 029a33a56..965b49b88 100644 --- a/backend/open_webui/retrieval/utils.py +++ b/backend/open_webui/retrieval/utils.py @@ -106,6 +106,7 @@ def query_doc_with_hybrid_search( embedding_function, k: int, reranking_function, + k_reranker: int, r: float, ) -> dict: try: @@ -128,7 +129,7 @@ def query_doc_with_hybrid_search( ) compressor = RerankCompressor( embedding_function=embedding_function, - top_n=k, + top_n=k_reranker, reranking_function=reranking_function, r_score=r, ) @@ -267,6 +268,7 @@ def query_collection_with_hybrid_search( embedding_function, k: int, reranking_function, + k_reranker: int, r: float, ) -> dict: results = [] @@ -280,6 +282,7 @@ def query_collection_with_hybrid_search( embedding_function=embedding_function, k=k, reranking_function=reranking_function, + k_reranker=k_reranker, r=r, ) results.append(result) @@ -345,6 +348,7 @@ def get_sources_from_files( embedding_function, k, reranking_function, + k_reranker, r, hybrid_search, full_context=False, @@ -461,6 +465,7 @@ def get_sources_from_files( embedding_function=embedding_function, k=k, reranking_function=reranking_function, + k_reranker=k_reranker, r=r, ) except Exception as e: diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index ac38c236e..9ab28fd39 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -713,6 +713,7 @@ async def get_query_settings(request: Request, user=Depends(get_admin_user)): "status": True, "template": request.app.state.config.RAG_TEMPLATE, "k": request.app.state.config.TOP_K, + "k_reranker": request.app.state.config.TOP_K_RERANKER, "r": request.app.state.config.RELEVANCE_THRESHOLD, "hybrid": request.app.state.config.ENABLE_RAG_HYBRID_SEARCH, } @@ -720,6 +721,7 @@ async def get_query_settings(request: Request, user=Depends(get_admin_user)): class QuerySettingsForm(BaseModel): k: Optional[int] = None + k_reranker: Optional[int] = None r: Optional[float] = None template: Optional[str] = None hybrid: Optional[bool] = None @@ -731,6 +733,7 @@ async def update_query_settings( ): request.app.state.config.RAG_TEMPLATE = form_data.template request.app.state.config.TOP_K = form_data.k if form_data.k else 4 + request.app.state.config.TOP_K_RERANKER = form_data.k_reranker or 4 request.app.state.config.RELEVANCE_THRESHOLD = form_data.r if form_data.r else 0.0 request.app.state.config.ENABLE_RAG_HYBRID_SEARCH = ( @@ -741,6 +744,7 @@ async def update_query_settings( "status": True, "template": request.app.state.config.RAG_TEMPLATE, "k": request.app.state.config.TOP_K, + "k_reranker": request.app.state.config.TOP_K_RERANKER, "r": request.app.state.config.RELEVANCE_THRESHOLD, "hybrid": request.app.state.config.ENABLE_RAG_HYBRID_SEARCH, } @@ -1488,6 +1492,7 @@ class QueryDocForm(BaseModel): collection_name: str query: str k: Optional[int] = None + k_reranker: Optional[int] = None r: Optional[float] = None hybrid: Optional[bool] = None @@ -1508,6 +1513,7 @@ def query_doc_handler( ), k=form_data.k if form_data.k else request.app.state.config.TOP_K, reranking_function=request.app.state.rf, + k_reranker=form_data.k_reranker or request.app.state.config.TOP_K_RERANKER, r=( form_data.r if form_data.r @@ -1536,6 +1542,7 @@ class QueryCollectionsForm(BaseModel): collection_names: list[str] query: str k: Optional[int] = None + k_reranker: Optional[int] = None r: Optional[float] = None hybrid: Optional[bool] = None @@ -1556,6 +1563,7 @@ def query_collection_handler( ), k=form_data.k if form_data.k else request.app.state.config.TOP_K, reranking_function=request.app.state.rf, + k_reranker=form_data.k_reranker or request.app.state.config.TOP_K_RERANKER, r=( form_data.r if form_data.r diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 289d887df..0ec034b8f 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -567,6 +567,7 @@ async def chat_completion_files_handler( ), k=request.app.state.config.TOP_K, reranking_function=request.app.state.rf, + k_reranker=request.app.state.config.TOP_K_RERANKER, r=request.app.state.config.RELEVANCE_THRESHOLD, hybrid_search=request.app.state.config.ENABLE_RAG_HYBRID_SEARCH, full_context=request.app.state.config.RAG_FULL_CONTEXT, diff --git a/src/lib/components/admin/Settings/Documents.svelte b/src/lib/components/admin/Settings/Documents.svelte index 0d911af89..1835f330a 100644 --- a/src/lib/components/admin/Settings/Documents.svelte +++ b/src/lib/components/admin/Settings/Documents.svelte @@ -74,6 +74,7 @@ template: '', r: 0.0, k: 4, + k_reranker: 4, hybrid: false }; @@ -738,6 +739,23 @@ + {#if querySettings.hybrid === true} +
+
{$i18n.t('Top K Reranker')}
+
+ +
+
+ {/if} + + {#if querySettings.hybrid === true}
From 8b5b3f165adc22050d2f8c86cd6f172f0c7eda06 Mon Sep 17 00:00:00 2001 From: Marko Henning Date: Mon, 10 Mar 2025 12:35:44 +0100 Subject: [PATCH 02/45] Add translation (partially) --- src/lib/i18n/locales/de-DE/translation.json | 1 + src/lib/i18n/locales/en-GB/translation.json | 1 + src/lib/i18n/locales/en-US/translation.json | 1 + 3 files changed, 3 insertions(+) diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index 7e721e838..15abaa70b 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -429,6 +429,7 @@ "Enter timeout in seconds": "", "Enter to Send": "", "Enter Top K": "Geben Sie Top K ein", + "Enter Top K Reranker": "Geben Sie Top K für Reranker ein", "Enter URL (e.g. http://127.0.0.1:7860/)": "Geben Sie die URL ein (z. B. http://127.0.0.1:7860/)", "Enter URL (e.g. http://localhost:11434)": "Geben Sie die URL ein (z. B. http://localhost:11434)", "Enter your current password": "Geben Sie Ihr aktuelles Passwort ein", diff --git a/src/lib/i18n/locales/en-GB/translation.json b/src/lib/i18n/locales/en-GB/translation.json index e1f06f335..dc00a5836 100644 --- a/src/lib/i18n/locales/en-GB/translation.json +++ b/src/lib/i18n/locales/en-GB/translation.json @@ -429,6 +429,7 @@ "Enter timeout in seconds": "", "Enter to Send": "", "Enter Top K": "", + "Enter Top K Reranker": "", "Enter URL (e.g. http://127.0.0.1:7860/)": "", "Enter URL (e.g. http://localhost:11434)": "", "Enter your current password": "", diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index e1f06f335..dc00a5836 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -429,6 +429,7 @@ "Enter timeout in seconds": "", "Enter to Send": "", "Enter Top K": "", + "Enter Top K Reranker": "", "Enter URL (e.g. http://127.0.0.1:7860/)": "", "Enter URL (e.g. http://localhost:11434)": "", "Enter your current password": "", From c877b59cbcf6e6c141be2241201b7726e5f78af9 Mon Sep 17 00:00:00 2001 From: Marko Henning Date: Tue, 18 Mar 2025 11:31:17 +0100 Subject: [PATCH 03/45] Address edge case with k < k_reranker, sort results for cutting off --- backend/open_webui/retrieval/utils.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/retrieval/utils.py b/backend/open_webui/retrieval/utils.py index 965b49b88..df53da78d 100644 --- a/backend/open_webui/retrieval/utils.py +++ b/backend/open_webui/retrieval/utils.py @@ -139,10 +139,20 @@ def query_doc_with_hybrid_search( ) result = compression_retriever.invoke(query) + + distances = [d.metadata.get("score") for d in result] + documents = [d.page_content for d in result] + metadatas = [d.metadata for d in result] + + # retrieve only min(k, k_reranker) items, sort and cut by distance if k < k_reranker + if k < k_reranker: + sorted_items = sorted(zip(distances, metadatas, documents), key=lambda x: x[0], reverse=True) + sorted_items = sorted_items[:k] + distances, documents, metadatas = map(list, zip(*sorted_items)) result = { - "distances": [[d.metadata.get("score") for d in result]], - "documents": [[d.page_content for d in result]], - "metadatas": [[d.metadata for d in result]], + "distances": [distances], + "documents": [documents] + "metadatas": [metadatas], } log.info( From f13948d805c973194955bb043ffbd306472edc63 Mon Sep 17 00:00:00 2001 From: Marko Henning Date: Tue, 18 Mar 2025 12:14:59 +0100 Subject: [PATCH 04/45] Fixed typo --- backend/open_webui/retrieval/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/retrieval/utils.py b/backend/open_webui/retrieval/utils.py index df53da78d..106c9da06 100644 --- a/backend/open_webui/retrieval/utils.py +++ b/backend/open_webui/retrieval/utils.py @@ -151,7 +151,7 @@ def query_doc_with_hybrid_search( distances, documents, metadatas = map(list, zip(*sorted_items)) result = { "distances": [distances], - "documents": [documents] + "documents": [documents], "metadatas": [metadatas], } From ba676b7ed6a4ce141474d7c31797ea2fd8aa513a Mon Sep 17 00:00:00 2001 From: Marko Henning Date: Tue, 18 Mar 2025 16:25:24 +0100 Subject: [PATCH 05/45] Use k_reranker also for result merge, and add special sorting use case for ChromaDB --- backend/open_webui/retrieval/utils.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/retrieval/utils.py b/backend/open_webui/retrieval/utils.py index 106c9da06..9b8d58352 100644 --- a/backend/open_webui/retrieval/utils.py +++ b/backend/open_webui/retrieval/utils.py @@ -146,7 +146,10 @@ def query_doc_with_hybrid_search( # retrieve only min(k, k_reranker) items, sort and cut by distance if k < k_reranker if k < k_reranker: - sorted_items = sorted(zip(distances, metadatas, documents), key=lambda x: x[0], reverse=True) + if VECTOR_DB == "chroma": + sorted_items = sorted(zip(distances, metadatas, documents), key=lambda x: x[0], reverse=False) + else: + sorted_items = sorted(zip(distances, metadatas, documents), key=lambda x: x[0], reverse=True) sorted_items = sorted_items[:k] distances, documents, metadatas = map(list, zip(*sorted_items)) result = { @@ -310,9 +313,9 @@ def query_collection_with_hybrid_search( if VECTOR_DB == "chroma": # Chroma uses unconventional cosine similarity, so we don't need to reverse the results # https://docs.trychroma.com/docs/collections/configure#configuring-chroma-collections - return merge_and_sort_query_results(results, k=k, reverse=False) + return merge_and_sort_query_results(results, k=k_reranker, reverse=False) else: - return merge_and_sort_query_results(results, k=k, reverse=True) + return merge_and_sort_query_results(results, k=k_reranker, reverse=True) def get_embedding_function( From 5ab789e83e124af5383a06a80dd3e55cef713f2b Mon Sep 17 00:00:00 2001 From: Marko Henning Date: Tue, 18 Mar 2025 16:44:58 +0100 Subject: [PATCH 06/45] Add documentation on chroma special case --- backend/open_webui/retrieval/utils.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/open_webui/retrieval/utils.py b/backend/open_webui/retrieval/utils.py index 9b8d58352..1afb333b1 100644 --- a/backend/open_webui/retrieval/utils.py +++ b/backend/open_webui/retrieval/utils.py @@ -147,6 +147,8 @@ def query_doc_with_hybrid_search( # retrieve only min(k, k_reranker) items, sort and cut by distance if k < k_reranker if k < k_reranker: if VECTOR_DB == "chroma": + # Chroma uses unconventional cosine similarity, so we don't need to reverse the results + # https://docs.trychroma.com/docs/collections/configure#configuring-chroma-collections sorted_items = sorted(zip(distances, metadatas, documents), key=lambda x: x[0], reverse=False) else: sorted_items = sorted(zip(distances, metadatas, documents), key=lambda x: x[0], reverse=True) From 5f48af5b9114d480d7c9bea71c298f1fde001563 Mon Sep 17 00:00:00 2001 From: Marko Henning Date: Wed, 19 Mar 2025 17:04:45 +0100 Subject: [PATCH 07/45] Revert the ordering change with chromadb, not necessary with reranker results --- backend/open_webui/retrieval/utils.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/backend/open_webui/retrieval/utils.py b/backend/open_webui/retrieval/utils.py index 1afb333b1..d50d4d44c 100644 --- a/backend/open_webui/retrieval/utils.py +++ b/backend/open_webui/retrieval/utils.py @@ -146,12 +146,7 @@ def query_doc_with_hybrid_search( # retrieve only min(k, k_reranker) items, sort and cut by distance if k < k_reranker if k < k_reranker: - if VECTOR_DB == "chroma": - # Chroma uses unconventional cosine similarity, so we don't need to reverse the results - # https://docs.trychroma.com/docs/collections/configure#configuring-chroma-collections - sorted_items = sorted(zip(distances, metadatas, documents), key=lambda x: x[0], reverse=False) - else: - sorted_items = sorted(zip(distances, metadatas, documents), key=lambda x: x[0], reverse=True) + sorted_items = sorted(zip(distances, metadatas, documents), key=lambda x: x[0], reverse=True) sorted_items = sorted_items[:k] distances, documents, metadatas = map(list, zip(*sorted_items)) result = { From c4c6e02b4c2b9819b33dc85af1bdeae6ecd80078 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B4mulo=20Mendes=20Figueiredo?= Date: Thu, 20 Mar 2025 16:05:26 -0300 Subject: [PATCH 08/45] fix: redirection for users already logged in --- src/routes/auth/+page.svelte | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/routes/auth/+page.svelte b/src/routes/auth/+page.svelte index 0accf85cc..be8989002 100644 --- a/src/routes/auth/+page.svelte +++ b/src/routes/auth/+page.svelte @@ -140,7 +140,8 @@ onMount(async () => { if ($user !== undefined) { - await goto('/'); + const redirectPath = querystringValue('redirect') || '/'; + goto(redirectPath); } await checkOauthCallback(); From 22f6e0f2f4cd922af1a24626e03e9b5b76d89002 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 21 Mar 2025 08:08:15 -0700 Subject: [PATCH 09/45] refac --- .../layout/Sidebar/RecursiveFolder.svelte | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/lib/components/layout/Sidebar/RecursiveFolder.svelte b/src/lib/components/layout/Sidebar/RecursiveFolder.svelte index 0940475d9..a7eb920d7 100644 --- a/src/lib/components/layout/Sidebar/RecursiveFolder.svelte +++ b/src/lib/components/layout/Sidebar/RecursiveFolder.svelte @@ -304,18 +304,15 @@ console.log('Edit'); await tick(); name = folders[folderId].name; - edit = true; + edit = true; await tick(); - // focus on the input and select all text - setTimeout(() => { - const input = document.getElementById(`folder-${folderId}-input`); - if (input) { - input.focus(); - input.select(); - } - }, 100); + const input = document.getElementById(`folder-${folderId}-input`); + + if (input) { + input.focus(); + } }; const exportHandler = async () => { @@ -404,6 +401,9 @@ id="folder-{folderId}-input" type="text" bind:value={name} + on:focus={(e) => { + e.target.select(); + }} on:blur={() => { nameUpdateHandler(); edit = false; @@ -437,7 +437,10 @@ > { - editHandler(); + // Requires a timeout to prevent the click event from closing the dropdown + setTimeout(() => { + editHandler(); + }, 200); }} on:delete={() => { showDeleteConfirm = true; From 966940cb00702678047fb7fff6f2a404be2c7270 Mon Sep 17 00:00:00 2001 From: Yuta Hayashibe Date: Sat, 22 Mar 2025 14:59:17 +0900 Subject: [PATCH 10/45] feat: Added `redirect` parameter to /auth --- src/routes/+layout.svelte | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index aef9719f1..b1567fd9e 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -496,6 +496,9 @@ if ($config) { await setupSocket($config.features?.enable_websocket ?? true); + const currentUrl = `${window.location.pathname}${window.location.search}`; + const encodedUrl = encodeURIComponent(currentUrl); + if (localStorage.token) { // Get Session User Info const sessionUser = await getSessionUser(localStorage.token).catch((error) => { @@ -512,13 +515,13 @@ } else { // Redirect Invalid Session User to /auth Page localStorage.removeItem('token'); - await goto('/auth'); + await goto(`/auth?redirect=${encodedUrl}`); } } else { // Don't redirect if we're already on the auth page // Needed because we pass in tokens from OAuth logins via URL fragments if ($page.url.pathname !== '/auth') { - await goto('/auth'); + await goto(`/auth?redirect=${encodedUrl}`); } } } From bdd236fa3aa1efc038d2992a5a0f9a05e9a156ea Mon Sep 17 00:00:00 2001 From: Jonathan Flower Date: Sat, 22 Mar 2025 09:59:06 -0400 Subject: [PATCH 11/45] improved error handling for deleting collections that do not exist in chromadb --- .../open_webui/retrieval/vector/dbs/chroma.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/backend/open_webui/retrieval/vector/dbs/chroma.py b/backend/open_webui/retrieval/vector/dbs/chroma.py index 006ee2076..f15702cf1 100755 --- a/backend/open_webui/retrieval/vector/dbs/chroma.py +++ b/backend/open_webui/retrieval/vector/dbs/chroma.py @@ -166,12 +166,17 @@ class ChromaClient: filter: Optional[dict] = None, ): # Delete the items from the collection based on the ids. - collection = self.client.get_collection(name=collection_name) - if collection: - if ids: - collection.delete(ids=ids) - elif filter: - collection.delete(where=filter) + try: + collection = self.client.get_collection(name=collection_name) + if collection: + if ids: + collection.delete(ids=ids) + elif filter: + collection.delete(where=filter) + except Exception as e: + # If collection doesn't exist, that's fine - nothing to delete + log.debug(f"Attempted to delete from non-existent collection {collection_name}. Ignoring.") + pass def reset(self): # Resets the database. This will delete all collections and item entries. From 75b18f92b90108bf94a0e25490f927a7e54a8eca Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 22 Mar 2025 14:01:07 -0700 Subject: [PATCH 12/45] refac --- src/lib/components/AddConnectionModal.svelte | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/components/AddConnectionModal.svelte b/src/lib/components/AddConnectionModal.svelte index 7a82f340c..52fd51999 100644 --- a/src/lib/components/AddConnectionModal.svelte +++ b/src/lib/components/AddConnectionModal.svelte @@ -79,9 +79,9 @@ const submitHandler = async () => { loading = true; - if (!ollama && (!url || !key)) { + if (!ollama && !url) { loading = false; - toast.error('URL and Key are required'); + toast.error('URL is required'); return; } @@ -223,7 +223,7 @@ className="w-full text-sm bg-transparent placeholder:text-gray-300 dark:placeholder:text-gray-700 outline-hidden" bind:value={key} placeholder={$i18n.t('API Key')} - required={!ollama} + required={false} />
From d144592660608d1320d07ea949ad98b27564f4b5 Mon Sep 17 00:00:00 2001 From: Yuta Hayashibe Date: Sat, 22 Mar 2025 16:21:05 +0900 Subject: [PATCH 13/45] chore: Remove `ENABLE_AUDIT_LOGS` and set the `AUDIT_LOG_LEVEL` NONE --- backend/open_webui/env.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/open_webui/env.py b/backend/open_webui/env.py index 27cc3a9a4..2a327aa5d 100644 --- a/backend/open_webui/env.py +++ b/backend/open_webui/env.py @@ -414,13 +414,12 @@ if OFFLINE_MODE: #################################### # AUDIT LOGGING #################################### -ENABLE_AUDIT_LOGS = os.getenv("ENABLE_AUDIT_LOGS", "false").lower() == "true" # Where to store log file AUDIT_LOGS_FILE_PATH = f"{DATA_DIR}/audit.log" # Maximum size of a file before rotating into a new log file AUDIT_LOG_FILE_ROTATION_SIZE = os.getenv("AUDIT_LOG_FILE_ROTATION_SIZE", "10MB") # METADATA | REQUEST | REQUEST_RESPONSE -AUDIT_LOG_LEVEL = os.getenv("AUDIT_LOG_LEVEL", "REQUEST_RESPONSE").upper() +AUDIT_LOG_LEVEL = os.getenv("AUDIT_LOG_LEVEL", "NONE").upper() try: MAX_BODY_LOG_SIZE = int(os.environ.get("MAX_BODY_LOG_SIZE") or 2048) except ValueError: From efd86e2cb4f2cb63f28fd67a0e4d2e945d5797a7 Mon Sep 17 00:00:00 2001 From: binxn <78713335+binxn@users.noreply.github.com> Date: Sun, 23 Mar 2025 17:14:20 +0100 Subject: [PATCH 14/45] Updated middleware.py to add OpenRouter compatibility --- backend/open_webui/utils/middleware.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index ccb459865..dc0a7638f 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -1560,7 +1560,7 @@ async def process_chat_response( value = delta.get("content") - reasoning_content = delta.get("reasoning_content") + reasoning_content = delta.get("reasoning_content") or delta.get("reasoning") if reasoning_content: if ( not content_blocks From e4078a6aee34eaba5214030a11e6f929a72e1e5f Mon Sep 17 00:00:00 2001 From: MaxJa4 <74194322+MaxJa4@users.noreply.github.com> Date: Sun, 23 Mar 2025 17:12:14 +0100 Subject: [PATCH 15/45] Add new translations --- src/lib/i18n/locales/de-DE/translation.json | 66 ++++++++++----------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index 221d8a201..5b30e6547 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -5,7 +5,7 @@ "(e.g. `sh webui.sh --api`)": "(z. B. `sh webui.sh --api`)", "(latest)": "(neueste)", "{{ models }}": "{{ Modelle }}", - "{{COUNT}} hidden lines": "", + "{{COUNT}} hidden lines": "{{COUNT}} versteckte Zeilen", "{{COUNT}} Replies": "{{COUNT}} Antworten", "{{user}}'s Chats": "{{user}}s Unterhaltungen", "{{webUIName}} Backend Required": "{{webUIName}}-Backend erforderlich", @@ -52,7 +52,7 @@ "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Administratoren haben jederzeit Zugriff auf alle Werkzeuge. Benutzer können im Arbeitsbereich zugewiesen.", "Advanced Parameters": "Erweiterte Parameter", "Advanced Params": "Erweiterte Parameter", - "All": "", + "All": "Alle", "All Documents": "Alle Dokumente", "All models deleted successfully": "Alle Modelle erfolgreich gelöscht", "Allow Chat Controls": "Chat-Steuerung erlauben", @@ -68,8 +68,8 @@ "Already have an account?": "Haben Sie bereits einen Account?", "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.": "", "Always": "Immer", - "Always Collapse Code Blocks": "", - "Always Expand Details": "", + "Always Collapse Code Blocks": "Code-Blöcke immer zuklappen", + "Always Expand Details": "Details immer aufklappen", "Amazing": "Fantastisch", "an assistant": "ein Assistent", "Analyzed": "Analysiert", @@ -97,7 +97,7 @@ "Are you sure?": "Sind Sie sicher?", "Arena Models": "Arena-Modelle", "Artifacts": "Artefakte", - "Ask": "", + "Ask": "Fragen", "Ask a question": "Stellen Sie eine Frage", "Assistant": "Assistent", "Attach file from knowledge": "Datei aus Wissensspeicher anhängen", @@ -169,7 +169,7 @@ "Ciphers": "Verschlüsselungen", "Citation": "Zitate", "Clear memory": "Alle Erinnerungen entfernen", - "Clear Memory": "", + "Clear Memory": "Alle Erinnerungen entfernen", "click here": "hier klicken", "Click here for filter guides.": "Klicken Sie hier für Filteranleitungen.", "Click here for help.": "Klicken Sie hier für Hilfe.", @@ -191,12 +191,12 @@ "Code execution": "Codeausführung", "Code Execution": "Codeausführung", "Code Execution Engine": "", - "Code Execution Timeout": "", + "Code Execution Timeout": "Timeout für Codeausführung", "Code formatted successfully": "Code erfolgreich formatiert", "Code Interpreter": "Code-Interpreter", "Code Interpreter Engine": "", "Code Interpreter Prompt Template": "", - "Collapse": "", + "Collapse": "Zuklappen", "Collection": "Kollektion", "Color": "Farbe", "ComfyUI": "ComfyUI", @@ -252,7 +252,7 @@ "Created At": "Erstellt am", "Created by": "Erstellt von", "CSV Import": "CSV-Import", - "Ctrl+Enter to Send": "", + "Ctrl+Enter to Send": "Strg+Enter zum Senden", "Current Model": "Aktuelles Modell", "Current Password": "Aktuelles Passwort", "Custom": "Benutzerdefiniert", @@ -284,7 +284,7 @@ "Delete folder?": "Ordner löschen?", "Delete function?": "Funktion löschen?", "Delete Message": "Nachricht löschen", - "Delete message?": "", + "Delete message?": "Nachricht löschen?", "Delete prompt?": "Prompt löschen?", "delete this link": "diesen Link löschen", "Delete tool?": "Werkzeug löschen?", @@ -295,7 +295,7 @@ "Describe your knowledge base and objectives": "Beschreibe deinen Wissensspeicher und deine Ziele", "Description": "Beschreibung", "Didn't fully follow instructions": "Nicht genau den Answeisungen gefolgt", - "Direct": "", + "Direct": "Direkt", "Direct Connections": "Direktverbindungen", "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Direktverbindungen ermöglichen es Benutzern, sich mit ihren eigenen OpenAI-kompatiblen API-Endpunkten zu verbinden.", "Direct Connections settings updated": "Direktverbindungs-Einstellungen aktualisiert", @@ -304,7 +304,7 @@ "Discover a model": "Entdecken Sie weitere Modelle", "Discover a prompt": "Entdecken Sie weitere Prompts", "Discover a tool": "Entdecken Sie weitere Werkzeuge", - "Discover how to use Open WebUI and seek support from the community.": "", + "Discover how to use Open WebUI and seek support from the community.": "Entdecke, wie Sie Open WebUI nutzen und erhalten Sie Unterstützung von der Community.", "Discover wonders": "Entdecken Sie Wunder", "Discover, download, and explore custom functions": "Entdecken und beziehen Sie benutzerdefinierte Funktionen", "Discover, download, and explore custom prompts": "Entdecken und beziehen Sie benutzerdefinierte Prompts", @@ -326,7 +326,7 @@ "Documentation": "Dokumentation", "Documents": "Dokumente", "does not make any external connections, and your data stays securely on your locally hosted server.": "stellt keine externen Verbindungen her, und Ihre Daten bleiben sicher auf Ihrem lokal gehosteten Server.", - "Domain Filter List": "", + "Domain Filter List": "Domain Filter-Liste", "Don't have an account?": "Haben Sie noch kein Benutzerkonto?", "don't install random functions from sources you don't trust.": "installieren Sie keine Funktionen aus Quellen, denen Sie nicht vertrauen.", "don't install random tools from sources you don't trust.": "installieren Sie keine Werkzeuge aus Quellen, denen Sie nicht vertrauen.", @@ -365,8 +365,8 @@ "Embedding model set to \"{{embedding_model}}\"": "Embedding-Modell auf \"{{embedding_model}}\" gesetzt", "Enable API Key": "API-Schlüssel aktivieren", "Enable autocomplete generation for chat messages": "Automatische Vervollständigung für Chat-Nachrichten aktivieren", - "Enable Code Execution": "", - "Enable Code Interpreter": "", + "Enable Code Execution": "Codeausführung aktivieren", + "Enable Code Interpreter": "Code-Interpreter aktivieren", "Enable Community Sharing": "Community-Freigabe aktivieren", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Aktiviere Memory Locking (mlock), um zu verhindern, dass Modelldaten aus dem RAM ausgelagert werden. Diese Option sperrt die Arbeitsseiten des Modells im RAM, um sicherzustellen, dass sie nicht auf die Festplatte ausgelagert werden. Dies kann die Leistung verbessern, indem Page Faults vermieden und ein schneller Datenzugriff sichergestellt werden.", "Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "Aktiviere Memory Mapping (mmap), um Modelldaten zu laden. Diese Option ermöglicht es dem System, den Festplattenspeicher als Erweiterung des RAM zu verwenden, indem Festplattendateien so behandelt werden, als ob sie im RAM wären. Dies kann die Modellleistung verbessern, indem ein schnellerer Datenzugriff ermöglicht wird. Es kann jedoch nicht auf allen Systemen korrekt funktionieren und einen erheblichen Teil des Festplattenspeichers beanspruchen.", @@ -400,17 +400,17 @@ "Enter Google PSE Engine Id": "Geben Sie die Google PSE-Engine-ID ein", "Enter Image Size (e.g. 512x512)": "Geben Sie die Bildgröße ein (z. B. 512x512)", "Enter Jina API Key": "Geben Sie den Jina-API-Schlüssel ein", - "Enter Jupyter Password": "", - "Enter Jupyter Token": "", - "Enter Jupyter URL": "", "Enter Kagi Search API Key": "Geben sie den Kagi Search API-Schlüssel ein", - "Enter Key Behavior": "", + "Enter Jupyter Password": "Geben Sie das Jupyter-Passwort ein", + "Enter Jupyter Token": "Geben Sie den Jupyter-Token ein", + "Enter Jupyter URL": "Geben Sie die Jupyter-URL ein", + "Enter Key Behavior": "Verhalten von 'Enter'", "Enter language codes": "Geben Sie die Sprachcodes ein", "Enter Model ID": "Geben Sie die Modell-ID ein", "Enter model tag (e.g. {{modelTag}})": "Geben Sie den Model-Tag ein", "Enter Mojeek Search API Key": "Geben Sie den Mojeek Search API-Schlüssel ein", "Enter Number of Steps (e.g. 50)": "Geben Sie die Anzahl an Schritten ein (z. B. 50)", - "Enter Perplexity API Key": "", + "Enter Perplexity API Key": "Geben Sie den Perplexity API-Key ein", "Enter proxy URL (e.g. https://user:password@host:port)": "Geben sie die Proxy-URL ein (z. B. https://user:password@host:port)", "Enter reasoning effort": "Geben Sie den Schlussfolgerungsaufwand ein", "Enter Sampler (e.g. Euler a)": "Geben Sie den Sampler ein (z. B. Euler a)", @@ -433,8 +433,8 @@ "Enter Tavily API Key": "Geben Sie den Tavily-API-Schlüssel ein", "Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Geben sie die öffentliche URL Ihrer WebUI ein. Diese URL wird verwendet, um Links in den Benachrichtigungen zu generieren.", "Enter Tika Server URL": "Geben Sie die Tika-Server-URL ein", - "Enter timeout in seconds": "", - "Enter to Send": "", + "Enter timeout in seconds": "Geben Sie den Timeout in Sekunden ein", + "Enter to Send": "'Enter' zum Senden", "Enter Top K": "Geben Sie Top K ein", "Enter URL (e.g. http://127.0.0.1:7860/)": "Geben Sie die URL ein (z. B. http://127.0.0.1:7860/)", "Enter URL (e.g. http://localhost:11434)": "Geben Sie die URL ein (z. B. http://localhost:11434)", @@ -461,10 +461,10 @@ "Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "", "Exclude": "Ausschließen", "Execute code for analysis": "Code für Analyse ausführen", - "Expand": "", + "Expand": "Aufklappen", "Experimental": "Experimentell", - "Explain": "", - "Explain this section to me in more detail": "", + "Explain": "Erklären", + "Explain this section to me in more detail": "Erkläre mir diesen Abschnitt im Detail", "Explore the cosmos": "Erforschen Sie das Universum", "Export": "Exportieren", "Export All Archived Chats": "Alle archivierten Unterhaltungen exportieren", @@ -478,7 +478,7 @@ "Export Prompts": "Prompts exportieren", "Export to CSV": "Als CSV exportieren", "Export Tools": "Werkzeuge exportieren", - "External": "", + "External": "Extern", "External Models": "Externe Modelle", "Failed to add file.": "Fehler beim Hinzufügen der Datei.", "Failed to create API Key.": "Fehler beim Erstellen des API-Schlüssels.", @@ -517,7 +517,7 @@ "Form": "Formular", "Format your variables using brackets like this:": "Formatieren Sie Ihre Variablen mit Klammern, wie hier:", "Frequency Penalty": "Frequenzstrafe", - "Full Context Mode": "", + "Full Context Mode": "Voll-Kontext Modus", "Function": "Funktion", "Function Calling": "Funktionsaufruf", "Function created successfully": "Funktion erfolgreich erstellt", @@ -815,7 +815,7 @@ "Presence Penalty": "", "Previous 30 days": "Vorherige 30 Tage", "Previous 7 days": "Vorherige 7 Tage", - "Private": "", + "Private": "Privat", "Profile Image": "Profilbild", "Prompt": "Prompt", "Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (z. B. \"Erzähle mir eine interessante Tatsache über das Römische Reich\")", @@ -825,7 +825,7 @@ "Prompt updated successfully": "Prompt erfolgreich aktualisiert", "Prompts": "Prompts", "Prompts Access": "Prompt-Zugriff", - "Public": "", + "Public": "Öffentlich", "Pull \"{{searchValue}}\" from Ollama.com": "\"{{searchValue}}\" von Ollama.com beziehen", "Pull a model from Ollama.com": "Modell von Ollama.com beziehen", "Query Generation Prompt": "Abfragegenerierungsprompt", @@ -1021,7 +1021,7 @@ "Theme": "Design", "Thinking...": "Denke nach...", "This action cannot be undone. Do you wish to continue?": "Diese Aktion kann nicht rückgängig gemacht werden. Möchten Sie fortfahren?", - "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "", + "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Dieser Kanal wurde am {{createdAt}} erstellt. Dies ist der Beginn des {{channelName}} Kanals.", "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dies stellt sicher, dass Ihre wertvollen Unterhaltungen sicher in Ihrer Backend-Datenbank gespeichert werden. Vielen Dank!", "This is an experimental feature, it may not function as expected and is subject to change at any time.": "Dies ist eine experimentelle Funktion, sie funktioniert möglicherweise nicht wie erwartet und kann jederzeit geändert werden.", "This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "", @@ -1080,7 +1080,7 @@ "Top P": "Top P", "Transformers": "Transformers", "Trouble accessing Ollama?": "Probleme beim Zugriff auf Ollama?", - "Trust Proxy Environment": "", + "Trust Proxy Environment": "Proxy-Umgebung vertrauen", "TTS Model": "TTS-Modell", "TTS Settings": "TTS-Einstellungen", "TTS Voice": "TTS-Stimme", @@ -1102,7 +1102,7 @@ "Updated": "Aktualisiert", "Updated at": "Aktualisiert am", "Updated At": "Aktualisiert am", - "Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "", + "Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "Upgrade auf einen lizenzierten Plan für erweiterte Funktionen wie individuelles Design, Branding und dedizierten Support.", "Upload": "Hochladen", "Upload a GGUF model": "GGUF-Model hochladen", "Upload directory": "Upload-Verzeichnis", @@ -1131,7 +1131,7 @@ "Valves updated successfully": "Valves erfolgreich aktualisiert", "variable": "Variable", "variable to have them replaced with clipboard content.": "Variable, um den Inhalt der Zwischenablage beim Nutzen des Prompts zu ersetzen.", - "Verify Connection": "", + "Verify Connection": "Verbindung verifizieren", "Version": "Version", "Version {{selectedVersion}} of {{totalVersions}}": "Version {{selectedVersion}} von {{totalVersions}}", "View Replies": "Antworten anzeigen", From 73715538ed8e2e6188e2e0edf4213f93044499ad Mon Sep 17 00:00:00 2001 From: MaxJa4 <74194322+MaxJa4@users.noreply.github.com> Date: Sun, 23 Mar 2025 17:12:37 +0100 Subject: [PATCH 16/45] Fix spelling error --- src/lib/i18n/locales/de-DE/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index 5b30e6547..a8d00019d 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -400,10 +400,10 @@ "Enter Google PSE Engine Id": "Geben Sie die Google PSE-Engine-ID ein", "Enter Image Size (e.g. 512x512)": "Geben Sie die Bildgröße ein (z. B. 512x512)", "Enter Jina API Key": "Geben Sie den Jina-API-Schlüssel ein", - "Enter Kagi Search API Key": "Geben sie den Kagi Search API-Schlüssel ein", "Enter Jupyter Password": "Geben Sie das Jupyter-Passwort ein", "Enter Jupyter Token": "Geben Sie den Jupyter-Token ein", "Enter Jupyter URL": "Geben Sie die Jupyter-URL ein", + "Enter Kagi Search API Key": "Geben Sie den Kagi Search API-Schlüssel ein", "Enter Key Behavior": "Verhalten von 'Enter'", "Enter language codes": "Geben Sie die Sprachcodes ein", "Enter Model ID": "Geben Sie die Modell-ID ein", From 137f16a1604b23937efa23cba51cf519ba97061f Mon Sep 17 00:00:00 2001 From: MaxJa4 <74194322+MaxJa4@users.noreply.github.com> Date: Sun, 23 Mar 2025 17:34:43 +0100 Subject: [PATCH 17/45] Rename chats --- src/lib/i18n/locales/de-DE/translation.json | 84 ++++++++++----------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index a8d00019d..a59180231 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -7,11 +7,11 @@ "{{ models }}": "{{ Modelle }}", "{{COUNT}} hidden lines": "{{COUNT}} versteckte Zeilen", "{{COUNT}} Replies": "{{COUNT}} Antworten", - "{{user}}'s Chats": "{{user}}s Unterhaltungen", + "{{user}}'s Chats": "{{user}}s Chats", "{{webUIName}} Backend Required": "{{webUIName}}-Backend erforderlich", "*Prompt node ID(s) are required for image generation": "*Prompt-Node-ID(s) sind für die Bildgenerierung erforderlich", "A new version (v{{LATEST_VERSION}}) is now available.": "Eine neue Version (v{{LATEST_VERSION}}) ist jetzt verfügbar.", - "A task model is used when performing tasks such as generating titles for chats and web search queries": "Aufgabenmodelle können Unterhaltungstitel oder Websuchanfragen generieren.", + "A task model is used when performing tasks such as generating titles for chats and web search queries": "Aufgabenmodelle können Chat-Titel oder Websuchanfragen generieren.", "a user": "ein Benutzer", "About": "Über", "Accept autocomplete generation / Jump to prompt variable": "Automatische Vervollständigung akzeptieren / Zur Prompt-Variable springen", @@ -56,12 +56,12 @@ "All Documents": "Alle Dokumente", "All models deleted successfully": "Alle Modelle erfolgreich gelöscht", "Allow Chat Controls": "Chat-Steuerung erlauben", - "Allow Chat Delete": "Löschen von Unterhaltungen erlauben", - "Allow Chat Deletion": "Löschen von Unterhaltungen erlauben", - "Allow Chat Edit": "Bearbeiten von Unterhaltungen erlauben", + "Allow Chat Delete": "Löschen von Chats erlauben", + "Allow Chat Deletion": "Löschen von Chats erlauben", + "Allow Chat Edit": "Bearbeiten von Chats erlauben", "Allow File Upload": "Hochladen von Dateien erlauben", "Allow non-local voices": "Nicht-lokale Stimmen erlauben", - "Allow Temporary Chat": "Temporäre Unterhaltungen erlauben", + "Allow Temporary Chat": "Temporäre Chats erlauben", "Allow User Location": "Standort freigeben", "Allow Voice Interruption in Call": "Unterbrechung durch Stimme im Anruf zulassen", "Allowed Endpoints": "Erlaubte Endpunkte", @@ -87,13 +87,13 @@ "applies to all users with the \"user\" role": "gilt für alle Benutzer mit der Rolle \"Benutzer\"", "April": "April", "Archive": "Archivieren", - "Archive All Chats": "Alle Unterhaltungen archivieren", - "Archived Chats": "Archivierte Unterhaltungen", + "Archive All Chats": "Alle Chats archivieren", + "Archived Chats": "Archivierte Chats", "archived-chat-export": "archivierter-chat-export", "Are you sure you want to clear all memories? This action cannot be undone.": "Sind Sie sicher, dass Sie alle Erinnerungen löschen möchten? Diese Handlung kann nicht rückgängig gemacht werden.", "Are you sure you want to delete this channel?": "Sind Sie sicher, dass Sie diesen Kanal löschen möchten?", "Are you sure you want to delete this message?": "Sind Sie sicher, dass Sie diese Nachricht löschen möchten?", - "Are you sure you want to unarchive all archived chats?": "Sind Sie sicher, dass Sie alle archivierten Unterhaltungen wiederherstellen möchten?", + "Are you sure you want to unarchive all archived chats?": "Sind Sie sicher, dass Sie alle archivierten Chats wiederherstellen möchten?", "Are you sure?": "Sind Sie sicher?", "Arena Models": "Arena-Modelle", "Artifacts": "Artefakte", @@ -152,14 +152,14 @@ "Character limit for autocomplete generation input": "Zeichenlimit für die Eingabe der automatischen Vervollständigung", "Chart new frontiers": "Neue Wege beschreiten", "Chat": "Gespräch", - "Chat Background Image": "Hintergrundbild des Unterhaltungsfensters", + "Chat Background Image": "Hintergrundbild des Chat-Fensters", "Chat Bubble UI": "Chat Bubble UI", "Chat Controls": "Chat-Steuerung", "Chat direction": "Textrichtung", - "Chat Overview": "Unterhaltungsübersicht", - "Chat Permissions": "Unterhaltungsberechtigungen", - "Chat Tags Auto-Generation": "Automatische Generierung von Unterhaltungstags", - "Chats": "Unterhaltungen", + "Chat Overview": "Chat-Übersicht", + "Chat Permissions": "Chat-Berechtigungen", + "Chat Tags Auto-Generation": "Automatische Generierung von Chat-Tags", + "Chats": "Chats", "Check Again": "Erneut überprüfen", "Check for updates": "Nach Updates suchen", "Checking for updates...": "Sucht nach Updates...", @@ -276,11 +276,11 @@ "Default User Role": "Standardbenutzerrolle", "Delete": "Löschen", "Delete a model": "Ein Modell löschen", - "Delete All Chats": "Alle Unterhaltungen löschen", + "Delete All Chats": "Alle Chats löschen", "Delete All Models": "Alle Modelle löschen", - "Delete chat": "Unterhaltung löschen", - "Delete Chat": "Unterhaltung löschen", - "Delete chat?": "Unterhaltung löschen?", + "Delete chat": "Chat löschen", + "Delete Chat": "Chat löschen", + "Delete chat?": "Chat löschen?", "Delete folder?": "Ordner löschen?", "Delete function?": "Funktion löschen?", "Delete Message": "Nachricht löschen", @@ -338,7 +338,7 @@ "Download Database": "Datenbank exportieren", "Drag and drop a file to upload or select a file to view": "Ziehen Sie eine Datei zum Hochladen oder wählen Sie eine Datei zum Anzeigen aus", "Draw": "Zeichnen", - "Drop any files here to add to the conversation": "Ziehen Sie beliebige Dateien hierher, um sie der Unterhaltung hinzuzufügen", + "Drop any files here to add to the conversation": "Ziehen Sie beliebige Dateien hierher, um sie dem Chat hinzuzufügen", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "z. B. '30s','10m'. Gültige Zeiteinheiten sind 's', 'm', 'h'.", "e.g. 60": "z. B. 60", "e.g. A filter to remove profanity from text": "z. B. Ein Filter, um Schimpfwörter aus Text zu entfernen", @@ -467,10 +467,10 @@ "Explain this section to me in more detail": "Erkläre mir diesen Abschnitt im Detail", "Explore the cosmos": "Erforschen Sie das Universum", "Export": "Exportieren", - "Export All Archived Chats": "Alle archivierten Unterhaltungen exportieren", - "Export All Chats (All Users)": "Alle Unterhaltungen exportieren (alle Benutzer)", - "Export chat (.json)": "Unterhaltung exportieren (.json)", - "Export Chats": "Unterhaltungen exportieren", + "Export All Archived Chats": "Alle archivierten Chats exportieren", + "Export All Chats (All Users)": "Alle Chats exportieren (alle Benutzer)", + "Export chat (.json)": "Chat exportieren (.json)", + "Export Chats": "Chats exportieren", "Export Config to JSON File": "Exportiere Konfiguration als JSON-Datei", "Export Functions": "Funktionen exportieren", "Export Models": "Modelle exportieren", @@ -554,7 +554,7 @@ "Group updated successfully": "Gruppe erfolgreich aktualisiert", "Groups": "Gruppen", "Haptic Feedback": "Haptisches Feedback", - "has no conversations.": "hat keine Unterhaltungen.", + "has no conversations.": "hat keine Chats.", "Hello, {{name}}": "Hallo, {{name}}", "Help": "Hilfe", "Help us create the best community leaderboard by sharing your feedback history!": "Helfen Sie uns, die beste Community-Bestenliste zu erstellen, indem Sie Ihren Feedback-Verlauf teilen!", @@ -579,7 +579,7 @@ "Image Prompt Generation Prompt": "Prompt für die Bild-Prompt-Generierung", "Image Settings": "Bildeinstellungen", "Images": "Bilder", - "Import Chats": "Unterhaltungen importieren", + "Import Chats": "Chats importieren", "Import Config from JSON File": "Konfiguration aus JSON-Datei importieren", "Import Functions": "Funktionen importieren", "Import Models": "Modelle importieren", @@ -675,7 +675,7 @@ "Memory updated successfully": "Erinnerung erfolgreich aktualisiert", "Merge Responses": "Antworten zusammenführen", "Message rating should be enabled to use this feature": "Antwortbewertung muss aktiviert sein, um diese Funktion zu verwenden", - "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Nachrichten, die Sie nach der Erstellung Ihres Links senden, werden nicht geteilt. Nutzer mit der URL können die freigegebene Unterhaltung einsehen.", + "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Nachrichten, die Sie nach der Erstellung Ihres Links senden, werden nicht geteilt. Nutzer mit der URL können den freigegebenen Chat einsehen.", "Min P": "Min P", "Minimum Score": "Mindestpunktzahl", "Mirostat": "Mirostat", @@ -708,7 +708,7 @@ "Name": "Name", "Name your knowledge base": "Benennen Sie Ihren Wissensspeicher", "Native": "Nativ", - "New Chat": "Neue Unterhaltung", + "New Chat": "Neuer Chat", "New Folder": "Neuer Ordner", "New Password": "Neues Passwort", "new-channel": "neuer-kanal", @@ -865,7 +865,7 @@ "Result": "Ergebnis", "Retrieval": "", "Retrieval Query Generation": "Abfragegenerierung", - "Rich Text Input for Chat": "Rich-Text-Eingabe für Unterhaltungen", + "Rich Text Input for Chat": "Rich-Text-Eingabe für Chats", "RK": "RK", "Role": "Rolle", "Rosé Pine": "Rosé Pine", @@ -879,12 +879,12 @@ "Save As Copy": "Als Kopie speichern", "Save Tag": "Tag speichern", "Saved": "Gespeichert", - "Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Das direkte Speichern von Unterhaltungen im Browser-Speicher wird nicht mehr unterstützt. Bitte nehmen Sie einen Moment Zeit, um Ihre Unterhaltungen zu exportieren und zu löschen, indem Sie auf die Schaltfläche unten klicken. Keine Sorge, Sie können Ihre Unterhaltungen problemlos über das Backend wieder importieren.", + "Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Das direkte Speichern von Chats im Browser-Speicher wird nicht mehr unterstützt. Bitte nehmen Sie einen Moment Zeit, um Ihre Chats zu exportieren und zu löschen, indem Sie auf die Schaltfläche unten klicken. Keine Sorge, Sie können Ihre Chats problemlos über das Backend wieder importieren.", "Scroll to bottom when switching between branches": "Beim Wechsel zwischen Branches nach unten scrollen", "Search": "Suchen", "Search a model": "Modell suchen", "Search Base": "Suchbasis", - "Search Chats": "Unterhaltungen durchsuchen...", + "Search Chats": "Chats durchsuchen...", "Search Collection": "Sammlung durchsuchen", "Search Filters": "Suchfilter", "search for tags": "nach Tags suchen", @@ -955,7 +955,7 @@ "Settings": "Einstellungen", "Settings saved successfully!": "Einstellungen erfolgreich gespeichert!", "Share": "Teilen", - "Share Chat": "Unterhaltung teilen", + "Share Chat": "Chat teilen", "Share to Open WebUI Community": "Mit OpenWebUI Community teilen", "Show": "Anzeigen", "Show \"What's New\" modal on login": "\"Was gibt's Neues\"-Modal beim Anmelden anzeigen", @@ -977,7 +977,7 @@ "Speech-to-Text Engine": "Sprache-zu-Text-Engine", "Stop": "Stop", "Stop Sequence": "Stop-Sequenz", - "Stream Chat Response": "Unterhaltungsantwort streamen", + "Stream Chat Response": "Chat-Antwort streamen", "STT Model": "STT-Modell", "STT Settings": "STT-Einstellungen", "Subtitle (e.g. about the Roman Empire)": "Untertitel (z. B. über das Römische Reich)", @@ -1001,7 +1001,7 @@ "Tell us more:": "Erzähl uns mehr", "Temperature": "Temperatur", "Template": "Vorlage", - "Temporary Chat": "Temporäre Unterhaltung", + "Temporary Chat": "Temporärer Chat", "Text Splitter": "Text-Splitter", "Text-to-Speech Engine": "Text-zu-Sprache-Engine", "Tfs Z": "Tfs Z", @@ -1015,14 +1015,14 @@ "The LDAP attribute that maps to the username that users use to sign in.": "Das LDAP-Attribut, das dem Benutzernamen zugeordnet ist, den Benutzer zum Anmelden verwenden.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Die Bestenliste befindet sich derzeit in der Beta-Phase, und es ist möglich, dass wir die Bewertungsberechnungen anpassen, während wir den Algorithmus verfeinern.", "The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "Die maximale Dateigröße in MB. Wenn die Dateigröße dieses Limit überschreitet, wird die Datei nicht hochgeladen.", - "The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "Die maximale Anzahl von Dateien, die gleichzeitig in der Unterhaltung verwendet werden können. Wenn die Anzahl der Dateien dieses Limit überschreitet, werden die Dateien nicht hochgeladen.", + "The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "Die maximale Anzahl von Dateien, die gleichzeitig im Chat verwendet werden können. Wenn die Anzahl der Dateien dieses Limit überschreitet, werden die Dateien nicht hochgeladen.", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "Die Punktzahl sollte ein Wert zwischen 0,0 (0 %) und 1,0 (100 %) sein.", "The temperature of the model. Increasing the temperature will make the model answer more creatively.": "", "Theme": "Design", "Thinking...": "Denke nach...", "This action cannot be undone. Do you wish to continue?": "Diese Aktion kann nicht rückgängig gemacht werden. Möchten Sie fortfahren?", "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Dieser Kanal wurde am {{createdAt}} erstellt. Dies ist der Beginn des {{channelName}} Kanals.", - "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dies stellt sicher, dass Ihre wertvollen Unterhaltungen sicher in Ihrer Backend-Datenbank gespeichert werden. Vielen Dank!", + "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dies stellt sicher, dass Ihre wertvollen Chats sicher in Ihrer Backend-Datenbank gespeichert werden. Vielen Dank!", "This is an experimental feature, it may not function as expected and is subject to change at any time.": "Dies ist eine experimentelle Funktion, sie funktioniert möglicherweise nicht wie erwartet und kann jederzeit geändert werden.", "This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "", "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", @@ -1039,10 +1039,10 @@ "Tika": "Tika", "Tika Server URL required.": "Tika-Server-URL erforderlich.", "Tiktoken": "Tiktoken", - "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Tipp: Aktualisieren Sie mehrere Variablenfelder nacheinander, indem Sie nach jedem Ersetzen die Tabulatortaste im Eingabefeld der Unterhaltung drücken.", + "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Tipp: Aktualisieren Sie mehrere Variablenfelder nacheinander, indem Sie nach jedem Ersetzen die Tabulatortaste im Eingabefeld des Chats drücken.", "Title": "Titel", "Title (e.g. Tell me a fun fact)": "Titel (z. B. Erzähl mir einen lustigen Fakt)", - "Title Auto-Generation": "Unterhaltungstitel automatisch generieren", + "Title Auto-Generation": "Chat-Titel automatisch generieren", "Title cannot be an empty string.": "Titel darf nicht leer sein.", "Title Generation": "Titelgenerierung", "Title Generation Prompt": "Prompt für Titelgenerierung", @@ -1052,7 +1052,7 @@ "To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Um auf das WebUI zugreifen zu können, wenden Sie sich bitte an einen Administrator. Administratoren können den Benutzerstatus über das Admin-Panel verwalten.", "To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Um Wissensdatenbanken hier anzuhängen, fügen Sie sie zunächst dem Arbeitsbereich \"Wissen\" hinzu.", "To learn more about available endpoints, visit our documentation.": "Um mehr über verfügbare Endpunkte zu erfahren, besuchen Sie unsere Dokumentation.", - "To protect your privacy, only ratings, model IDs, tags, and metadata are shared from your feedback—your chat logs remain private and are not included.": "Um Ihre Privatsphäre zu schützen, werden nur Bewertungen, Modell-IDs, Tags und Metadaten aus Ihrem Feedback geteilt – Ihre Unterhaltungen bleiben privat und werden nicht einbezogen.", + "To protect your privacy, only ratings, model IDs, tags, and metadata are shared from your feedback—your chat logs remain private and are not included.": "Um Ihre Privatsphäre zu schützen, werden nur Bewertungen, Modell-IDs, Tags und Metadaten aus Ihrem Feedback geteilt – Ihre Chats bleiben privat und werden nicht einbezogen.", "To select actions here, add them to the \"Functions\" workspace first.": "Um Aktionen auszuwählen, fügen Sie diese zunächst dem Arbeitsbereich „Funktionen“ hinzu.", "To select filters here, add them to the \"Functions\" workspace first.": "Um Filter auszuwählen, fügen Sie diese zunächst dem Arbeitsbereich „Funktionen“ hinzu.", "To select toolkits here, add them to the \"Tools\" workspace first.": "Um Toolkits auszuwählen, fügen Sie sie zunächst dem Arbeitsbereich „Werkzeuge“ hinzu.", @@ -1089,8 +1089,8 @@ "Uh-oh! There was an issue with the response.": "Oh nein! Es gab ein Problem mit der Antwort.", "UI": "Oberfläche", "Unarchive All": "Alle wiederherstellen", - "Unarchive All Archived Chats": "Alle archivierten Unterhaltungen wiederherstellen", - "Unarchive Chat": "Unterhaltung wiederherstellen", + "Unarchive All Archived Chats": "Alle archivierten Chats wiederherstellen", + "Unarchive Chat": "Chat wiederherstellen", "Unlock mysteries": "Geheimnisse entsperren", "Unpin": "Lösen", "Unravel secrets": "Geheimnisse lüften", @@ -1179,8 +1179,8 @@ "You cannot upload an empty file.": "Sie können keine leere Datei hochladen.", "You do not have permission to upload files": "Sie haben keine Berechtigung, Dateien hochzuladen", "You do not have permission to upload files.": "Sie haben keine Berechtigung zum Hochladen von Dateien.", - "You have no archived conversations.": "Du hast keine archivierten Unterhaltungen.", - "You have shared this chat": "Sie haben diese Unterhaltung geteilt", + "You have no archived conversations.": "Du hast keine archivierten Chats.", + "You have shared this chat": "Sie haben diesen Chat geteilt", "You're a helpful assistant.": "Du bist ein hilfreicher Assistent.", "You're now logged in.": "Sie sind jetzt eingeloggt.", "Your account status is currently pending activation.": "Ihr Kontostatus ist derzeit ausstehend und wartet auf Aktivierung.", From f2866ed85840a3703efded5eb2494c1785affa0f Mon Sep 17 00:00:00 2001 From: MaxJa4 <74194322+MaxJa4@users.noreply.github.com> Date: Sun, 23 Mar 2025 17:11:37 +0100 Subject: [PATCH 18/45] Adjust naming --- src/lib/i18n/locales/de-DE/translation.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index a59180231..ee0417d8c 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -47,8 +47,8 @@ "Adjusting these settings will apply changes universally to all users.": "Das Anpassen dieser Einstellungen wird Änderungen universell auf alle Benutzer anwenden.", "admin": "Administrator", "Admin": "Administrator", - "Admin Panel": "Administrationsbereich", - "Admin Settings": "Administrationsbereich", + "Admin Panel": "Administration", + "Admin Settings": "Administration", "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Administratoren haben jederzeit Zugriff auf alle Werkzeuge. Benutzer können im Arbeitsbereich zugewiesen.", "Advanced Parameters": "Erweiterte Parameter", "Advanced Params": "Erweiterte Parameter", @@ -153,7 +153,7 @@ "Chart new frontiers": "Neue Wege beschreiten", "Chat": "Gespräch", "Chat Background Image": "Hintergrundbild des Chat-Fensters", - "Chat Bubble UI": "Chat Bubble UI", + "Chat Bubble UI": "Sprechblasen-Layout", "Chat Controls": "Chat-Steuerung", "Chat direction": "Textrichtung", "Chat Overview": "Chat-Übersicht", @@ -596,7 +596,7 @@ "Install from Github URL": "Installiere von der Github-URL", "Instant Auto-Send After Voice Transcription": "Spracherkennung direkt absenden", "Integration": "", - "Interface": "Benutzeroberfläche", + "Interface": "Oberfläche", "Invalid file format.": "Ungültiges Dateiformat.", "Invalid Tag": "Ungültiger Tag", "is typing...": "schreibt ...", From c714bd87390d12812ef1fea3d387bbfb70cda57d Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 23 Mar 2025 11:45:55 -0700 Subject: [PATCH 19/45] refac --- backend/open_webui/utils/middleware.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index ccb459865..d97baf92e 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -1079,8 +1079,6 @@ async def process_chat_response( for filter_id in get_sorted_filter_ids(model) ] - print(f"{filter_functions=}") - # Streaming response if event_emitter and event_caller: task_id = str(uuid4()) # Create a unique task ID. From e5b7188379553b52436776af8ed85fa7b77fcc2f Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 23 Mar 2025 11:50:40 -0700 Subject: [PATCH 20/45] refac: ollama only param --- src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte b/src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte index 59d230d1b..67b1f4dc1 100644 --- a/src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte +++ b/src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte @@ -961,6 +961,7 @@
{$i18n.t('Context Length')} + {$i18n.t('(Ollama)')}