Browse Source

Merge branch 'dev' into fix-db-order

Timothy Jaeryang Baek 1 month ago
parent
commit
7490bc9100
76 changed files with 1745 additions and 266 deletions
  1. 3 3
      .github/pull_request_template.md
  2. 1 1
      Dockerfile
  3. 5 0
      backend/open_webui/config.py
  4. 1 2
      backend/open_webui/env.py
  5. 3 0
      backend/open_webui/functions.py
  6. 2 0
      backend/open_webui/main.py
  7. 1 1
      backend/open_webui/retrieval/loaders/main.py
  8. 19 6
      backend/open_webui/retrieval/utils.py
  9. 13 6
      backend/open_webui/retrieval/vector/dbs/chroma.py
  10. 103 0
      backend/open_webui/routers/chats.py
  11. 8 0
      backend/open_webui/routers/retrieval.py
  12. 45 36
      backend/open_webui/socket/main.py
  13. 69 17
      backend/open_webui/utils/middleware.py
  14. 3 0
      backend/open_webui/utils/tools.py
  15. 3 3
      src/lib/components/AddConnectionModal.svelte
  16. 18 0
      src/lib/components/admin/Settings/Documents.svelte
  17. 2 10
      src/lib/components/chat/Chat.svelte
  18. 2 2
      src/lib/components/chat/Messages/Citations.svelte
  19. 30 24
      src/lib/components/chat/ModelSelector/Selector.svelte
  20. 1 0
      src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte
  21. 13 10
      src/lib/components/layout/Sidebar/RecursiveFolder.svelte
  22. 1 0
      src/lib/i18n/locales/ar-BH/translation.json
  23. 1 0
      src/lib/i18n/locales/bg-BG/translation.json
  24. 1 0
      src/lib/i18n/locales/bn-BD/translation.json
  25. 1 0
      src/lib/i18n/locales/ca-ES/translation.json
  26. 1 0
      src/lib/i18n/locales/ceb-PH/translation.json
  27. 1 0
      src/lib/i18n/locales/cs-CZ/translation.json
  28. 1 0
      src/lib/i18n/locales/da-DK/translation.json
  29. 83 81
      src/lib/i18n/locales/de-DE/translation.json
  30. 1 0
      src/lib/i18n/locales/dg-DG/translation.json
  31. 1 0
      src/lib/i18n/locales/el-GR/translation.json
  32. 2 0
      src/lib/i18n/locales/en-GB/translation.json
  33. 2 0
      src/lib/i18n/locales/en-US/translation.json
  34. 1 0
      src/lib/i18n/locales/es-ES/translation.json
  35. 1 0
      src/lib/i18n/locales/et-EE/translation.json
  36. 1 0
      src/lib/i18n/locales/eu-ES/translation.json
  37. 1 0
      src/lib/i18n/locales/fa-IR/translation.json
  38. 1 0
      src/lib/i18n/locales/fi-FI/translation.json
  39. 1 0
      src/lib/i18n/locales/fr-CA/translation.json
  40. 1 0
      src/lib/i18n/locales/fr-FR/translation.json
  41. 1179 0
      src/lib/i18n/locales/gl-ES/translation.json
  42. 1 0
      src/lib/i18n/locales/he-IL/translation.json
  43. 1 0
      src/lib/i18n/locales/hi-IN/translation.json
  44. 1 0
      src/lib/i18n/locales/hr-HR/translation.json
  45. 1 0
      src/lib/i18n/locales/hu-HU/translation.json
  46. 1 0
      src/lib/i18n/locales/id-ID/translation.json
  47. 1 0
      src/lib/i18n/locales/ie-GA/translation.json
  48. 1 0
      src/lib/i18n/locales/it-IT/translation.json
  49. 1 0
      src/lib/i18n/locales/ja-JP/translation.json
  50. 1 0
      src/lib/i18n/locales/ka-GE/translation.json
  51. 1 0
      src/lib/i18n/locales/ko-KR/translation.json
  52. 1 0
      src/lib/i18n/locales/lt-LT/translation.json
  53. 1 0
      src/lib/i18n/locales/ms-MY/translation.json
  54. 1 0
      src/lib/i18n/locales/nb-NO/translation.json
  55. 1 0
      src/lib/i18n/locales/nl-NL/translation.json
  56. 1 0
      src/lib/i18n/locales/pa-IN/translation.json
  57. 1 0
      src/lib/i18n/locales/pl-PL/translation.json
  58. 1 0
      src/lib/i18n/locales/pt-BR/translation.json
  59. 1 0
      src/lib/i18n/locales/pt-PT/translation.json
  60. 1 0
      src/lib/i18n/locales/ro-RO/translation.json
  61. 1 0
      src/lib/i18n/locales/ru-RU/translation.json
  62. 1 0
      src/lib/i18n/locales/sk-SK/translation.json
  63. 1 0
      src/lib/i18n/locales/sr-RS/translation.json
  64. 1 0
      src/lib/i18n/locales/sv-SE/translation.json
  65. 1 0
      src/lib/i18n/locales/th-TH/translation.json
  66. 1 0
      src/lib/i18n/locales/tk-TW/translation.json
  67. 1 0
      src/lib/i18n/locales/tr-TR/translation.json
  68. 15 14
      src/lib/i18n/locales/uk-UA/translation.json
  69. 1 0
      src/lib/i18n/locales/ur-PK/translation.json
  70. 1 0
      src/lib/i18n/locales/vi-VN/translation.json
  71. 1 0
      src/lib/i18n/locales/zh-CN/translation.json
  72. 45 44
      src/lib/i18n/locales/zh-TW/translation.json
  73. 1 1
      src/lib/stores/index.ts
  74. 2 2
      src/lib/utils/index.ts
  75. 24 2
      src/routes/+layout.svelte
  76. 2 1
      src/routes/auth/+page.svelte

+ 3 - 3
.github/pull_request_template.md

@@ -9,9 +9,9 @@
 - [ ] **Changelog:** Ensure a changelog entry following the format of [Keep a Changelog](https://keepachangelog.com/) is added at the bottom of the PR description.
 - [ ] **Documentation:** Have you updated relevant documentation [Open WebUI Docs](https://github.com/open-webui/docs), or other documentation sources?
 - [ ] **Dependencies:** Are there any new dependencies? Have you updated the dependency versions in the documentation?
-- [ ] **Testing:** Have you written and run sufficient tests for validating the changes?
+- [ ] **Testing:** Have you written and run sufficient tests to validate the changes?
 - [ ] **Code review:** Have you performed a self-review of your code, addressing any coding standard issues and ensuring adherence to the project's coding standards?
-- [ ] **Prefix:** To cleary categorize this pull request, prefix the pull request title, using one of the following:
+- [ ] **Prefix:** To clearly categorize this pull request, prefix the pull request title using one of the following:
   - **BREAKING CHANGE**: Significant changes that may affect compatibility
   - **build**: Changes that affect the build system or external dependencies
   - **ci**: Changes to our continuous integration processes or workflows
@@ -22,7 +22,7 @@
   - **i18n**: Internationalization or localization changes
   - **perf**: Performance improvement
   - **refactor**: Code restructuring for better maintainability, readability, or scalability
-  - **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc.)
+  - **style**: Changes that do not affect the meaning of the code (white space, formatting, missing semi-colons, etc.)
   - **test**: Adding missing tests or correcting existing tests
   - **WIP**: Work in progress, a temporary label for incomplete or ongoing work
 

+ 1 - 1
Dockerfile

@@ -132,7 +132,7 @@ RUN if [ "$USE_OLLAMA" = "true" ]; then \
 # install python dependencies
 COPY --chown=$UID:$GID ./backend/requirements.txt ./requirements.txt
 
-RUN pip3 install uv && \
+RUN pip3 install --no-cache-dir uv && \
     if [ "$USE_CUDA" = "true" ]; then \
     # If you use CUDA the whisper and embedding model will be downloaded on first use
     pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/$USE_CUDA_DOCKER_VER --no-cache-dir && \

+ 5 - 0
backend/open_webui/config.py

@@ -1685,6 +1685,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",

+ 1 - 2
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:

+ 3 - 0
backend/open_webui/functions.py

@@ -223,6 +223,9 @@ async def generate_function_chat_completion(
     extra_params = {
         "__event_emitter__": __event_emitter__,
         "__event_call__": __event_call__,
+        "__chat_id__": metadata.get("chat_id", None),
+        "__session_id__": metadata.get("session_id", None),
+        "__message_id__": metadata.get("message_id", None),
         "__task__": __task__,
         "__task_body__": __task_body__,
         "__files__": files,

+ 2 - 0
backend/open_webui/main.py

@@ -191,6 +191,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,
@@ -552,6 +553,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

+ 1 - 1
backend/open_webui/retrieval/loaders/main.py

@@ -105,7 +105,7 @@ class TikaLoader:
 
         if r.ok:
             raw_metadata = r.json()
-            text = raw_metadata.get("X-TIKA:content", "<No text content found>")
+            text = raw_metadata.get("X-TIKA:content", "<No text content found>").strip()
 
             if "Content-Type" in raw_metadata:
                 headers["Content-Type"] = raw_metadata["Content-Type"]

+ 19 - 6
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,
         )
@@ -138,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(
@@ -264,6 +275,7 @@ def query_collection_with_hybrid_search(
     embedding_function,
     k: int,
     reranking_function,
+    k_reranker: int,
     r: float,
 ) -> dict:
     results = []
@@ -277,6 +289,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)
@@ -290,10 +303,8 @@ def query_collection_with_hybrid_search(
         raise Exception(
             "Hybrid search failed for all collections. Using Non hybrid search as fallback."
         )
-
     return merge_and_sort_query_results(results, k=k)
 
-
 def get_embedding_function(
     embedding_engine,
     embedding_model,
@@ -337,6 +348,7 @@ def get_sources_from_files(
     embedding_function,
     k,
     reranking_function,
+    k_reranker,
     r,
     hybrid_search,
     full_context=False,
@@ -453,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:

+ 13 - 6
backend/open_webui/retrieval/vector/dbs/chroma.py

@@ -172,12 +172,19 @@ 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.

+ 103 - 0
backend/open_webui/routers/chats.py

@@ -2,6 +2,8 @@ import json
 import logging
 from typing import Optional
 
+
+from open_webui.socket.main import get_event_emitter
 from open_webui.models.chats import (
     ChatForm,
     ChatImportForm,
@@ -372,6 +374,107 @@ async def update_chat_by_id(
         )
 
 
+############################
+# UpdateChatMessageById
+############################
+class MessageForm(BaseModel):
+    content: str
+
+
+@router.post("/{id}/messages/{message_id}", response_model=Optional[ChatResponse])
+async def update_chat_message_by_id(
+    id: str, message_id: str, form_data: MessageForm, user=Depends(get_verified_user)
+):
+    chat = Chats.get_chat_by_id(id)
+
+    if not chat:
+        raise HTTPException(
+            status_code=status.HTTP_401_UNAUTHORIZED,
+            detail=ERROR_MESSAGES.ACCESS_PROHIBITED,
+        )
+
+    if chat.user_id != user.id and user.role != "admin":
+        raise HTTPException(
+            status_code=status.HTTP_401_UNAUTHORIZED,
+            detail=ERROR_MESSAGES.ACCESS_PROHIBITED,
+        )
+
+    chat = Chats.upsert_message_to_chat_by_id_and_message_id(
+        id,
+        message_id,
+        {
+            "content": form_data.content,
+        },
+    )
+
+    event_emitter = get_event_emitter(
+        {
+            "user_id": user.id,
+            "chat_id": id,
+            "message_id": message_id,
+        },
+        False,
+    )
+
+    if event_emitter:
+        await event_emitter(
+            {
+                "type": "chat:message",
+                "data": {
+                    "chat_id": id,
+                    "message_id": message_id,
+                    "content": form_data.content,
+                },
+            }
+        )
+
+    return ChatResponse(**chat.model_dump())
+
+
+############################
+# SendChatMessageEventById
+############################
+class EventForm(BaseModel):
+    type: str
+    data: dict
+
+
+@router.post("/{id}/messages/{message_id}/event", response_model=Optional[bool])
+async def send_chat_message_event_by_id(
+    id: str, message_id: str, form_data: EventForm, user=Depends(get_verified_user)
+):
+    chat = Chats.get_chat_by_id(id)
+
+    if not chat:
+        raise HTTPException(
+            status_code=status.HTTP_401_UNAUTHORIZED,
+            detail=ERROR_MESSAGES.ACCESS_PROHIBITED,
+        )
+
+    if chat.user_id != user.id and user.role != "admin":
+        raise HTTPException(
+            status_code=status.HTTP_401_UNAUTHORIZED,
+            detail=ERROR_MESSAGES.ACCESS_PROHIBITED,
+        )
+
+    event_emitter = get_event_emitter(
+        {
+            "user_id": user.id,
+            "chat_id": id,
+            "message_id": message_id,
+        }
+    )
+
+    try:
+        if event_emitter:
+            await event_emitter(form_data.model_dump())
+        else:
+            return False
+        return True
+    except:
+        return False
+
+
 ############################
 # DeleteChatById
 ############################

+ 8 - 0
backend/open_webui/routers/retrieval.py

@@ -719,6 +719,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,
     }
@@ -726,6 +727,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
@@ -737,6 +739,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 = (
@@ -747,6 +750,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,
     }
@@ -1495,6 +1499,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
 
@@ -1515,6 +1520,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
@@ -1543,6 +1549,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
 
@@ -1563,6 +1570,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

+ 45 - 36
backend/open_webui/socket/main.py

@@ -269,11 +269,19 @@ async def disconnect(sid):
         # print(f"Unknown session ID {sid} disconnected")
 
 
-def get_event_emitter(request_info):
+def get_event_emitter(request_info, update_db=True):
     async def __event_emitter__(event_data):
         user_id = request_info["user_id"]
+
         session_ids = list(
-            set(USER_POOL.get(user_id, []) + [request_info["session_id"]])
+            set(
+                USER_POOL.get(user_id, [])
+                + (
+                    [request_info.get("session_id")]
+                    if request_info.get("session_id")
+                    else []
+                )
+            )
         )
 
         for session_id in session_ids:
@@ -287,40 +295,41 @@ def get_event_emitter(request_info):
                 to=session_id,
             )
 
-        if "type" in event_data and event_data["type"] == "status":
-            Chats.add_message_status_to_chat_by_id_and_message_id(
-                request_info["chat_id"],
-                request_info["message_id"],
-                event_data.get("data", {}),
-            )
-
-        if "type" in event_data and event_data["type"] == "message":
-            message = Chats.get_message_by_id_and_message_id(
-                request_info["chat_id"],
-                request_info["message_id"],
-            )
-
-            content = message.get("content", "")
-            content += event_data.get("data", {}).get("content", "")
-
-            Chats.upsert_message_to_chat_by_id_and_message_id(
-                request_info["chat_id"],
-                request_info["message_id"],
-                {
-                    "content": content,
-                },
-            )
-
-        if "type" in event_data and event_data["type"] == "replace":
-            content = event_data.get("data", {}).get("content", "")
-
-            Chats.upsert_message_to_chat_by_id_and_message_id(
-                request_info["chat_id"],
-                request_info["message_id"],
-                {
-                    "content": content,
-                },
-            )
+        if update_db:
+            if "type" in event_data and event_data["type"] == "status":
+                Chats.add_message_status_to_chat_by_id_and_message_id(
+                    request_info["chat_id"],
+                    request_info["message_id"],
+                    event_data.get("data", {}),
+                )
+
+            if "type" in event_data and event_data["type"] == "message":
+                message = Chats.get_message_by_id_and_message_id(
+                    request_info["chat_id"],
+                    request_info["message_id"],
+                )
+
+                content = message.get("content", "")
+                content += event_data.get("data", {}).get("content", "")
+
+                Chats.upsert_message_to_chat_by_id_and_message_id(
+                    request_info["chat_id"],
+                    request_info["message_id"],
+                    {
+                        "content": content,
+                    },
+                )
+
+            if "type" in event_data and event_data["type"] == "replace":
+                content = event_data.get("data", {}).get("content", "")
+
+                Chats.upsert_message_to_chat_by_id_and_message_id(
+                    request_info["chat_id"],
+                    request_info["message_id"],
+                    {
+                        "content": content,
+                    },
+                )
 
     return __event_emitter__
 

+ 69 - 17
backend/open_webui/utils/middleware.py

@@ -100,7 +100,7 @@ log.setLevel(SRC_LOG_LEVELS["MAIN"])
 
 
 async def chat_completion_tools_handler(
-    request: Request, body: dict, user: UserModel, models, tools
+    request: Request, body: dict, extra_params: dict, user: UserModel, models, tools
 ) -> tuple[dict, dict]:
     async def get_content_from_response(response) -> Optional[str]:
         content = None
@@ -135,6 +135,9 @@ async def chat_completion_tools_handler(
             "metadata": {"task": str(TASKS.FUNCTION_CALLING)},
         }
 
+    event_caller = extra_params["__event_call__"]
+    metadata = extra_params["__metadata__"]
+
     task_model_id = get_task_model_id(
         body["model"],
         request.app.state.config.TASK_MODEL,
@@ -189,17 +192,33 @@ async def chat_completion_tools_handler(
                 tool_function_params = tool_call.get("parameters", {})
 
                 try:
-                    spec = tools[tool_function_name].get("spec", {})
+                    tool = tools[tool_function_name]
+
+                    spec = tool.get("spec", {})
                     allowed_params = (
                         spec.get("parameters", {}).get("properties", {}).keys()
                     )
-                    tool_function = tools[tool_function_name]["callable"]
+                    tool_function = tool["callable"]
                     tool_function_params = {
                         k: v
                         for k, v in tool_function_params.items()
                         if k in allowed_params
                     }
-                    tool_output = await tool_function(**tool_function_params)
+
+                    if tool.get("direct", False):
+                        tool_output = await tool_function(**tool_function_params)
+                    else:
+                        tool_output = await event_caller(
+                            {
+                                "type": "execute:tool",
+                                "data": {
+                                    "id": str(uuid4()),
+                                    "tool": tool,
+                                    "params": tool_function_params,
+                                    "session_id": metadata.get("session_id", None),
+                                },
+                            }
+                        )
 
                 except Exception as e:
                     tool_output = str(e)
@@ -565,6 +584,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,
@@ -764,12 +784,18 @@ async def process_chat_payload(request, form_data, user, metadata, model):
     }
     form_data["metadata"] = metadata
 
+    # Server side tools
     tool_ids = metadata.get("tool_ids", None)
+    # Client side tools
+    tool_specs = form_data.get("tool_specs", None)
+
     log.debug(f"{tool_ids=}")
+    log.debug(f"{tool_specs=}")
+
+    tools_dict = {}
 
     if tool_ids:
-        # If tool_ids field is present, then get the tools
-        tools = get_tools(
+        tools_dict = get_tools(
             request,
             tool_ids,
             user,
@@ -780,20 +806,30 @@ async def process_chat_payload(request, form_data, user, metadata, model):
                 "__files__": metadata.get("files", []),
             },
         )
-        log.info(f"{tools=}")
+        log.info(f"{tools_dict=}")
+
+    if tool_specs:
+        for tool in tool_specs:
+            callable = tool.pop("callable", None)
+            tools_dict[tool["name"]] = {
+                "direct": True,
+                "callable": callable,
+                "spec": tool,
+            }
 
+    if tools_dict:
         if metadata.get("function_calling") == "native":
             # If the function calling is native, then call the tools function calling handler
-            metadata["tools"] = tools
+            metadata["tools"] = tools_dict
             form_data["tools"] = [
                 {"type": "function", "function": tool.get("spec", {})}
-                for tool in tools.values()
+                for tool in tools_dict.values()
             ]
         else:
             # If the function calling is not native, then call the tools function calling handler
             try:
                 form_data, flags = await chat_completion_tools_handler(
-                    request, form_data, user, models, tools
+                    request, form_data, extra_params, user, models, tools_dict
                 )
                 sources.extend(flags.get("sources", []))
 
@@ -812,7 +848,7 @@ async def process_chat_payload(request, form_data, user, metadata, model):
         for source_idx, source in enumerate(sources):
             if "document" in source:
                 for doc_idx, doc_context in enumerate(source["document"]):
-                    context_string += f"<source><source_id>{source_idx}</source_id><source_context>{doc_context}</source_context></source>\n"
+                    context_string += f"<source><source_id>{source_idx + 1}</source_id><source_context>{doc_context}</source_context></source>\n"
 
         context_string = context_string.strip()
         prompt = get_last_user_message(form_data["messages"])
@@ -1079,8 +1115,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.
@@ -1560,7 +1594,9 @@ 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
@@ -1774,9 +1810,25 @@ async def process_chat_response(
                                     for k, v in tool_function_params.items()
                                     if k in allowed_params
                                 }
-                                tool_result = await tool_function(
-                                    **tool_function_params
-                                )
+
+                                if tool.get("direct", False):
+                                    tool_result = await tool_function(
+                                        **tool_function_params
+                                    )
+                                else:
+                                    tool_result = await event_caller(
+                                        {
+                                            "type": "execute:tool",
+                                            "data": {
+                                                "id": str(uuid4()),
+                                                "tool": tool,
+                                                "params": tool_function_params,
+                                                "session_id": metadata.get(
+                                                    "session_id", None
+                                                ),
+                                            },
+                                        }
+                                    )
                             except Exception as e:
                                 tool_result = str(e)
 

+ 3 - 0
backend/open_webui/utils/tools.py

@@ -1,6 +1,9 @@
 import inspect
 import logging
 import re
+import inspect
+import uuid
+
 from typing import Any, Awaitable, Callable, get_type_hints
 from functools import update_wrapper, partial
 

+ 3 - 3
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}
 									/>
 								</div>
 							</div>

+ 18 - 0
src/lib/components/admin/Settings/Documents.svelte

@@ -76,6 +76,7 @@
 		template: '',
 		r: 0.0,
 		k: 4,
+		k_reranker: 4,
 		hybrid: false
 	};
 
@@ -765,6 +766,23 @@
 						</div>
 					</div>
 
+					{#if querySettings.hybrid === true}
+						<div class="mb-2.5 flex w-full justify-between">
+							<div class="self-center text-xs font-medium">{$i18n.t('Top K Reranker')}</div>
+							<div class="flex items-center relative">
+								<input
+									class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
+									type="number"
+									placeholder={$i18n.t('Enter Top K Reranker')}
+									bind:value={querySettings.k_reranker}
+									autocomplete="off"
+									min="0"
+								/>
+							</div>
+						</div>
+					{/if}
+
+
 					{#if querySettings.hybrid === true}
 						<div class="  mb-2.5 flex flex-col w-full justify-between">
 							<div class=" flex w-full justify-between">

+ 2 - 10
src/lib/components/chat/Chat.svelte

@@ -293,18 +293,10 @@
 				} else if (type === 'chat:tags') {
 					chat = await getChatById(localStorage.token, $chatId);
 					allTags.set(await getAllTags(localStorage.token));
-				} else if (type === 'message') {
+				} else if (type === 'chat:message:delta' || type === 'message') {
 					message.content += data.content;
-				} else if (type === 'replace') {
+				} else if (type === 'chat:message' || type === 'replace') {
 					message.content = data.content;
-				} else if (type === 'action') {
-					if (data.action === 'continue') {
-						const continueButton = document.getElementById('continue-response-button');
-
-						if (continueButton) {
-							continueButton.click();
-						}
-					}
 				} else if (type === 'confirmation') {
 					eventCallback = cb;
 

+ 2 - 2
src/lib/components/chat/Messages/Citations.svelte

@@ -102,7 +102,7 @@
 			<div class="flex text-xs font-medium flex-wrap">
 				{#each citations as citation, idx}
 					<button
-						id={`source-${id}-${idx}`}
+						id={`source-${id}-${idx + 1}`}
 						class="no-toggle outline-hidden flex dark:text-gray-300 p-1 bg-white dark:bg-gray-900 rounded-xl max-w-96"
 						on:click={() => {
 							showCitationModal = true;
@@ -181,7 +181,7 @@
 					<div class="flex text-xs font-medium flex-wrap">
 						{#each citations as citation, idx}
 							<button
-								id={`source-${id}-${idx}`}
+								id={`source-${id}-${idx + 1}`}
 								class="no-toggle outline-hidden flex dark:text-gray-300 p-1 bg-gray-50 hover:bg-gray-100 dark:bg-gray-900 dark:hover:bg-gray-850 transition rounded-xl max-w-96"
 								on:click={() => {
 									showCitationModal = true;

+ 30 - 24
src/lib/components/chat/ModelSelector/Selector.svelte

@@ -476,7 +476,7 @@
 						<div class="flex flex-col">
 							{#if $mobile && (item?.model?.tags ?? []).length > 0}
 								<div class="flex gap-0.5 self-start h-full mb-1.5 -translate-x-1">
-									{#each item.model?.tags as tag}
+									{#each item.model?.tags.sort((a, b) => a.name.localeCompare(b.name)) as tag}
 										<div
 											class=" text-xs font-bold px-1 rounded-sm uppercase line-clamp-1 bg-gray-500/20 text-gray-700 dark:text-gray-200"
 										>
@@ -498,31 +498,37 @@
 													alt="Model"
 													class="rounded-full size-5 flex items-center mr-2"
 												/>
-												{item.label}
+
+												<div class="flex items-center line-clamp-1">
+													<div class="line-clamp-1">
+														{item.label}
+													</div>
+
+													{#if item.model.owned_by === 'ollama' && (item.model.ollama?.details?.parameter_size ?? '') !== ''}
+														<div class="flex ml-1 items-center translate-y-[0.5px]">
+															<Tooltip
+																content={`${
+																	item.model.ollama?.details?.quantization_level
+																		? item.model.ollama?.details?.quantization_level + ' '
+																		: ''
+																}${
+																	item.model.ollama?.size
+																		? `(${(item.model.ollama?.size / 1024 ** 3).toFixed(1)}GB)`
+																		: ''
+																}`}
+																className="self-end"
+															>
+																<span
+																	class=" text-xs font-medium text-gray-600 dark:text-gray-400 line-clamp-1"
+																	>{item.model.ollama?.details?.parameter_size ?? ''}</span
+																>
+															</Tooltip>
+														</div>
+													{/if}
+												</div>
 											</Tooltip>
 										</div>
 									</div>
-									{#if item.model.owned_by === 'ollama' && (item.model.ollama?.details?.parameter_size ?? '') !== ''}
-										<div class="flex ml-1 items-center translate-y-[0.5px]">
-											<Tooltip
-												content={`${
-													item.model.ollama?.details?.quantization_level
-														? item.model.ollama?.details?.quantization_level + ' '
-														: ''
-												}${
-													item.model.ollama?.size
-														? `(${(item.model.ollama?.size / 1024 ** 3).toFixed(1)}GB)`
-														: ''
-												}`}
-												className="self-end"
-											>
-												<span
-													class=" text-xs font-medium text-gray-600 dark:text-gray-400 line-clamp-1"
-													>{item.model.ollama?.details?.parameter_size ?? ''}</span
-												>
-											</Tooltip>
-										</div>
-									{/if}
 								</div>
 
 								<!-- {JSON.stringify(item.info)} -->
@@ -600,7 +606,7 @@
 									<div
 										class="flex gap-0.5 self-center items-center h-full translate-y-[0.5px] overflow-x-auto scrollbar-none"
 									>
-										{#each item.model?.tags as tag}
+										{#each item.model?.tags.sort((a, b) => a.name.localeCompare(b.name)) as tag}
 											<Tooltip content={tag.name} className="flex-shrink-0">
 												<div
 													class=" text-xs font-bold px-1 rounded-sm uppercase bg-gray-500/20 text-gray-700 dark:text-gray-200"

+ 1 - 0
src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte

@@ -961,6 +961,7 @@
 			<div class="flex w-full justify-between">
 				<div class=" self-center text-xs font-medium">
 					{$i18n.t('Context Length')}
+					{$i18n.t('(Ollama)')}
 				</div>
 
 				<button

+ 13 - 10
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 @@
 				>
 					<FolderMenu
 						on:rename={() => {
-							editHandler();
+							// Requires a timeout to prevent the click event from closing the dropdown
+							setTimeout(() => {
+								editHandler();
+							}, 200);
 						}}
 						on:delete={() => {
 							showDeleteConfirm = true;

+ 1 - 0
src/lib/i18n/locales/ar-BH/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "( `sh webui.sh --api`مثال)",
 	"(latest)": "(الأخير)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ نماذج }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/bg-BG/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(напр. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(напр. `sh webui.sh --api`)",
 	"(latest)": "(последна)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "{{COUNT}} Отговори",

+ 1 - 0
src/lib/i18n/locales/bn-BD/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(যেমন `sh webui.sh --api`)",
 	"(latest)": "(সর্বশেষ)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ মডেল}}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/ca-ES/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(p. ex. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(p. ex. `sh webui.sh --api`)",
 	"(latest)": "(últim)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "{{COUNT}} línies ocultes",
 	"{{COUNT}} Replies": "{{COUNT}} respostes",

+ 1 - 0
src/lib/i18n/locales/ceb-PH/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(pananglitan `sh webui.sh --api`)",
 	"(latest)": "",
+	"(Ollama)": "",
 	"{{ models }}": "",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/cs-CZ/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(např. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(např. `sh webui.sh --api`)",
 	"(latest)": "Nejnovější",
+	"(Ollama)": "",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/da-DK/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(f.eks. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(f.eks. `sh webui.sh --api`)",
 	"(latest)": "(seneste)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ modeller }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 83 - 81
src/lib/i18n/locales/de-DE/translation.json

@@ -4,14 +4,15 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(z. B. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(z. B. `sh webui.sh --api`)",
 	"(latest)": "(neueste)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ Modelle }}",
-	"{{COUNT}} hidden lines": "",
+	"{{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",
@@ -47,29 +48,29 @@
 	"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",
-	"All": "",
+	"All": "Alle",
 	"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",
 	"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",
@@ -87,17 +88,17 @@
 	"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",
-	"Ask": "",
+	"Ask": "Fragen",
 	"Ask a question": "Stellen Sie eine Frage",
 	"Assistant": "Assistent",
 	"Attach file from knowledge": "Datei aus Wissensspeicher anhängen",
@@ -152,14 +153,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 Bubble UI": "Chat Bubble UI",
+	"Chat Background Image": "Hintergrundbild des Chat-Fensters",
+	"Chat Bubble UI": "Sprechblasen-Layout",
 	"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...",
@@ -169,7 +170,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 +192,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 +253,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",
@@ -276,15 +277,15 @@
 	"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",
-	"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 +296,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 +305,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 +327,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.",
@@ -338,7 +339,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",
@@ -365,8 +366,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 +401,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 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",
 	"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,9 +434,10 @@
 	"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 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",
@@ -461,16 +463,16 @@
 	"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",
-	"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",
@@ -478,7 +480,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 +519,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",
@@ -554,7 +556,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 +581,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",
@@ -596,7 +598,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 ...",
@@ -675,7 +677,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",
@@ -687,7 +689,7 @@
 	"Model {{modelId}} not found": "Modell {{modelId}} nicht gefunden",
 	"Model {{modelName}} is not vision capable": "Das Modell {{modelName}} ist nicht für die Bildverarbeitung geeignet",
 	"Model {{name}} is now {{status}}": "Modell {{name}} ist jetzt {{status}}",
-	"Model accepts image inputs": "Modell akzeptiert Bileingaben",
+	"Model accepts image inputs": "Modell akzeptiert Bildeingaben",
 	"Model created successfully!": "Modell erfolgreich erstellt!",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Modell-Dateisystempfad erkannt. Modellkurzname ist für das Update erforderlich, Fortsetzung nicht möglich.",
 	"Model Filtering": "Modellfilterung",
@@ -708,7 +710,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",
@@ -815,7 +817,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 +827,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",
@@ -865,7 +867,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 +881,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 +957,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 +979,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 +1003,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 +1017,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.": "",
-	"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 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 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 +1041,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 +1054,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.",
@@ -1080,7 +1082,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",
@@ -1089,8 +1091,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",
@@ -1102,7 +1104,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 +1133,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",
@@ -1179,8 +1181,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.",

+ 1 - 0
src/lib/i18n/locales/dg-DG/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(such e.g. `sh webui.sh --api`)",
 	"(latest)": "(much latest)",
+	"(Ollama)": "",
 	"{{ models }}": "",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/el-GR/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(π.χ. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(π.χ. `sh webui.sh --api`)",
 	"(latest)": "(τελευταίο)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 2 - 0
src/lib/i18n/locales/en-GB/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "",
 	"(latest)": "",
+	"(Ollama)": "",
 	"{{ models }}": "",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",
@@ -436,6 +437,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": "",

+ 2 - 0
src/lib/i18n/locales/en-US/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "",
 	"(latest)": "",
+	"(Ollama)": "",
 	"{{ models }}": "",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",
@@ -436,6 +437,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": "",

+ 1 - 0
src/lib/i18n/locales/es-ES/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(p.ej. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(p.ej. `sh webui.sh --api`)",
 	"(latest)": "(latest)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "{{COUNT}} líneas ocultas",
 	"{{COUNT}} Replies": "{{COUNT}} Respuestas",

+ 1 - 0
src/lib/i18n/locales/et-EE/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(nt `sh webui.sh --api --api-auth kasutajanimi_parool`)",
 	"(e.g. `sh webui.sh --api`)": "(nt `sh webui.sh --api`)",
 	"(latest)": "(uusim)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ mudelid }}",
 	"{{COUNT}} hidden lines": "{{COUNT}} peidetud rida",
 	"{{COUNT}} Replies": "{{COUNT}} vastust",

+ 1 - 0
src/lib/i18n/locales/eu-ES/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(adib. `sh webui.sh --api --api-auth erabiltzaile_pasahitza`)",
 	"(e.g. `sh webui.sh --api`)": "(adib. `sh webui.sh --api`)",
 	"(latest)": "(azkena)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/fa-IR/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(e.g. `sh webui.sh --api`)",
 	"(latest)": "(آخرین)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/fi-FI/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(esim. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(esim. `sh webui.sh --api`)",
 	"(latest)": "(uusin)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ mallit }}",
 	"{{COUNT}} hidden lines": "{{COUNT}} piilotettua riviä",
 	"{{COUNT}} Replies": "{{COUNT}} vastausta",

+ 1 - 0
src/lib/i18n/locales/fr-CA/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(par ex. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(par exemple `sh webui.sh --api`)",
 	"(latest)": "(dernier)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ modèles }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/fr-FR/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(par ex. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(par exemple `sh webui.sh --api`)",
 	"(latest)": "(dernière version)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "{{COUNT}} réponses",

+ 1179 - 0
src/lib/i18n/locales/gl-ES/translation.json

@@ -0,0 +1,1179 @@
+{
+	"-1 for no limit, or a positive integer for a specific limit": "-1 para ilimitado, ou un número enteiro positivo para un límite específico.",
+	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' o '-1' para evitar expiración.",
+	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(p.ej. `sh webui.sh --api --api-auth username_password`)",
+	"(e.g. `sh webui.sh --api`)": "(p.ej. `sh webui.sh --api`)",
+	"(latest)": "(O mais recente)",
+	"{{ models }}": "{{ models }}",
+	"{{COUNT}} hidden lines": "",
+	"{{COUNT}} Replies": "{{COUNT}} Respostas",
+	"{{user}}'s Chats": "Chats do {{user}}",
+	"{{webUIName}} Backend Required": "{{webUIName}} Servidor Requerido",
+	"*Prompt node ID(s) are required for image generation": "Os ID do nodo son requeridos para a xeneración de imáxes",
+	"A new version (v{{LATEST_VERSION}}) is now available.": "Unha nova versión (v{{LATEST_VERSION}}) está disponible.",
+	"A task model is used when performing tasks such as generating titles for chats and web search queries": "o modelo de tarefas utilizase realizando tarefas como a xeneración de títulos para chats e consultas da búsqueda web",
+	"a user": "un usuario",
+	"About": "Sobre nos",
+	"Accept autocomplete generation / Jump to prompt variable": "",
+	"Access": "Acceso",
+	"Access Control": "Control de Acceso",
+	"Accessible to all users": "Accesible para todos os usuarios",
+	"Account": "Conta",
+	"Account Activation Pending": "Activación da conta pendente",
+	"Accurate information": "Información precisa",
+	"Actions": "Accións",
+	"Activate": "",
+	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Active este comando escribindo \"/{{COMMAND}}\" no chat",
+	"Active Users": "Usuarios activos",
+	"Add": "Agregar",
+	"Add a model ID": "Agregado ID do modelo",
+	"Add a short description about what this model does": "Agregue unha breve descripción sobre o que fai este modelo",
+	"Add a tag": "Agregar unha etiqueta",
+	"Add Arena Model": "Agregar un modelo a aArena",
+	"Add Connection": "Agregar Conexión",
+	"Add Content": "Agregar contido",
+	"Add content here": "Agrege contido aquí",
+	"Add custom prompt": "Agregar un prompt personalizado",
+	"Add Files": "Agregar Arquivos",
+	"Add Group": "Agregar Grupo",
+	"Add Memory": "Agregar Memoria",
+	"Add Model": "Agregar Modelo",
+	"Add Reaction": "Agregar Reacción",
+	"Add Tag": "Agregar etiqueta",
+	"Add Tags": "agregar etiquetas",
+	"Add text content": "Añade contido de texto",
+	"Add User": "Agregar Usuario",
+	"Add User Group": "Agregar usuario al grupo",
+	"Adjusting these settings will apply changes universally to all users.": "Axustar estas opcions aplicará os cambios universalmente a todos os usuarios.",
+	"admin": "admin",
+	"Admin": "Admin",
+	"Admin Panel": "Panel de Administración",
+	"Admin Settings": "Configuración de Administrador",
+	"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Os administradores teñen acceso a todas as ferramentas en todo momento; os usuarios necesitan ferramentas asignadas por modelo no espacio de trabajo.",
+	"Advanced Parameters": "Parámetros Avanzados",
+	"Advanced Params": "Parámetros avanzados",
+	"All": "",
+	"All Documents": "Todos os Documentos",
+	"All models deleted successfully": "Todos os modelos han sido borrados",
+	"Allow Chat Controls": "Permitir Control dos Chats",
+	"Allow Chat Delete": "Permitir Borrar Chat",
+	"Allow Chat Deletion": "Permitir Borrar Chats",
+	"Allow Chat Edit": "Pemritir Editar Chat",
+	"Allow File Upload": "Permitir asubida de Arquivos",
+	"Allow non-local voices": "Permitir voces non locales",
+	"Allow Temporary Chat": "Permitir Chat Temporal",
+	"Allow User Location": "Permitir Ubicación do Usuario",
+	"Allow Voice Interruption in Call": "Permitir interrupción de voz en chamada",
+	"Allowed Endpoints": "Puntos finais permitidos",
+	"Already have an account?": "¿Xa tes unha conta?",
+	"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": "Sempre",
+	"Amazing": "Sorprendente",
+	"an assistant": "un asistente",
+	"Analyzed": "Analizado",
+	"Analyzing...": "Analizando..",
+	"and": "e",
+	"and {{COUNT}} more": "e {{COUNT}} mais",
+	"and create a new shared link.": "e xerar un novo enlace compartido.",
+	"API Base URL": "Dirección URL da API",
+	"API Key": "Chave da API ",
+	"API Key created.": "Chave da API creada.",
+	"API Key Endpoint Restrictions": "Restriccions de Endpoint de Chave de API",
+	"API keys": "Chaves da API",
+	"Application DN": "Aplicacion DN",
+	"Application DN Password": " Contrasinal  da Aplicacion DN",
+	"applies to all users with the \"user\" role": "aplicacar a todos os usuarios co rol \"user\" ",
+	"April": "Abril",
+	"Archive": "Arquivar",
+	"Archive All Chats": "Arquivar todos os chats",
+	"Archived Chats": "Chats arquivados",
+	"archived-chat-export": "Exportación de chats arquivados",
+	"Are you sure you want to clear all memories? This action cannot be undone.": "",
+	"Are you sure you want to delete this channel?": "¿Seguro que queres eliminar este canal?",
+	"Are you sure you want to delete this message?": "¿Seguro que queres eliminar este mensaxe? ",
+	"Are you sure you want to unarchive all archived chats?": "¿Estás seguro de que quieres desArquivar todos os chats arquivados?",
+	"Are you sure?": "¿Está seguro?",
+	"Arena Models": "Area de Modelos",
+	"Artifacts": "Artefactos",
+	"Ask": "",
+	"Ask a question": "Fai unha pregunta",
+	"Assistant": "Asistente",
+	"Attach file from knowledge": "",
+	"Attention to detail": "Detalle preciso",
+	"Attribute for Mail": "Atributo para correo",
+	"Attribute for Username": "Atributo para o nome do usuario",
+	"Audio": "Audio",
+	"August": "Agosto",
+	"Authenticate": "Autenticar",
+	"Authentication": "",
+	"Auto-Copy Response to Clipboard": "Copiar a resposta automáticamente o portapapeis",
+	"Auto-playback response": "Respuesta de reproducción automática",
+	"Autocomplete Generation": "xeneración de autocompletado",
+	"Autocomplete Generation Input Max Length": "Longitud máxima de entrada da xeneración de autocompletado",
+	"Automatic1111": "AUTOMATIC1111",
+	"AUTOMATIC1111 Api Auth String": "API de autenticación para a instancia de AUTOMATIC1111",
+	"AUTOMATIC1111 Base URL": "Dirección URL de AUTOMATIC1111",
+	"AUTOMATIC1111 Base URL is required.": "A dirección URL de AUTOMATIC1111 e requerida.",
+	"Available list": "Lista dispoñible",
+	"available!": "¡dispoñible!",
+	"Awful": "Horrible",
+	"Azure AI Speech": "Voz de Azure AI",
+	"Azure Region": "Rexión de Azure",
+	"Back": "Volver",
+	"Bad Response": "Resposta incorrecta",
+	"Banners": "Mensaxes emerxentes",
+	"Base Model (From)": "Modelo base (desde)",
+	"Batch Size (num_batch)": "Tamaño do proceso na cola (num_batch)",
+	"before": "antes",
+	"Being lazy": "Ser pregizeiro",
+	"Beta": "Beta",
+	"Bing Search V7 Endpoint": "Punto final da busqueda de Bing versión V7",
+	"Bing Search V7 Subscription Key": "Chave de suscripción da busqueda de Bing versión V7",
+	"Bocha Search API Key": "",
+	"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "",
+	"Brave Search API Key": "Chave de API da busqueda Brave",
+	"By {{name}}": "Por {{name}}",
+	"Bypass Embedding and Retrieval": "",
+	"Bypass SSL verification for Websites": "Desactivar a verificación SSL para sitios web",
+	"Calendar": "",
+	"Call": "Chamada",
+	"Call feature is not supported when using Web STT engine": "A funcionalidade da chamada non pode usarse xunto co motor da STT Web",
+	"Camera": "Cámara",
+	"Cancel": "Cancelar",
+	"Capabilities": "Capacidades",
+	"Capture": "Captura",
+	"Certificate Path": "Ruta para os Certificados",
+	"Change Password": "Cambiar o contrasinal ",
+	"Channel Name": "Nome do Canal",
+	"Channels": "Canal",
+	"Character": "Caracter",
+	"Character limit for autocomplete generation input": "Limite de caracteres para a entrada de xeneración do autocompletado",
+	"Chart new frontiers": "Dibuxar novas fronteiras",
+	"Chat": "Chat",
+	"Chat Background Image": "Imaxe de fondo do Chat",
+	"Chat Bubble UI": "Burbuxa do chat UI",
+	"Chat Controls": "Controis do chat",
+	"Chat direction": "Dirección do Chat",
+	"Chat Overview": "Vista xeral do chat",
+	"Chat Permissions": "Permisos do Chat",
+	"Chat Tags Auto-Generation": "Auto-xeneración das Etiquetas para o Chat",
+	"Chats": "Chats",
+	"Check Again": "Verifica de novo",
+	"Check for updates": "Verificar actualizacions",
+	"Checking for updates...": "Verificando actualizacions...",
+	"Choose a model before saving...": "Escolle un modelo antes de gardar os cambios...",
+	"Chunk Overlap": "Superposición de fragmentos",
+	"Chunk Size": "Tamaño de fragmentos",
+	"Ciphers": "Cifrado",
+	"Citation": "Cita",
+	"Clear memory": "Liberar memoria",
+	"Clear Memory": "Limpar memoria",
+	"click here": "Pica aquí",
+	"Click here for filter guides.": "Pica aquí para guías de filtros",
+	"Click here for help.": "Pica aquí para obter axuda.",
+	"Click here to": "Pica aquí para",
+	"Click here to download user import template file.": "Pica aquí para descargar o arquivo de plantilla de importación de usuario.",
+	"Click here to learn more about faster-whisper and see the available models.": "Clic aquí para aprender mais sobre faster-whisper y ver os modelos disponibles.",
+	"Click here to see available models.": "",
+	"Click here to select": "Pica aquí para seleccionar",
+	"Click here to select a csv file.": "Pica aquí para seleccionar un arquivo csv.",
+	"Click here to select a py file.": "Pica aquí para seleccionar un arquivo py.",
+	"Click here to upload a workflow.json file.": "Pica aquí para subir un arquivo workflow.json.",
+	"click here.": "Pica aquí.",
+	"Click on the user role button to change a user's role.": "Pica no botón de roles do usuario para cambiar su rol.",
+	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Permisos de escritura do portapapeles denegados. Por favor, comprueba as configuracions de tu navegador para otorgar o acceso necesario.",
+	"Clone": "Clonar",
+	"Clone Chat": "Clonar chat",
+	"Clone of {{TITLE}}": "Clon de {{TITLE}}",
+	"Close": "Pechar",
+	"Code execution": "Execución de código",
+	"Code Execution": "Execución de código",
+	"Code Execution Engine": "Motor de execución de código",
+	"Code Execution Timeout": "Tempo de espera esgotado para a execución de código",
+	"Code formatted successfully": "Formateouse correctamente o código.",
+	"Code Interpreter": "Interprete de Código",
+	"Code Interpreter Engine": "Motor interprete de código",
+	"Code Interpreter Prompt Template": "Exemplos de Prompt para o Interprete de Código",
+	"Collapse": "Esconder",
+	"Collection": "Colección",
+	"Color": "Cor",
+	"ComfyUI": "ComfyUI",
+	"ComfyUI API Key": "Chave da API de ComfyUI",
+	"ComfyUI Base URL": "ComfyUI Base URL",
+	"ComfyUI Base URL is required.": "ComfyUI Base URL e requerido.",
+	"ComfyUI Workflow": "Fluxo de traballo de ComfyUI",
+	"ComfyUI Workflow Nodes": "Nodos para ComfyUI Workflow",
+	"Command": "Comando",
+	"Completions": "Respostas autoxeradas",
+	"Concurrent Requests": "Solicitudes simultáneas",
+	"Configure": "Configurar",
+	"Confirm": "Confirmar",
+	"Confirm Password": "Confirmar  Contrasinal ",
+	"Confirm your action": "Confirma a tua acción",
+	"Confirm your new password": "Confirmar o teu novo contrasinal ",
+	"Connect to your own OpenAI compatible API endpoints.": "Conecta os teus propios Api compatibles con OpenAI.",
+	"Connections": "Conexions",
+	"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "Define o esforzo do modelo de razonamento, so aplicable a modelos de razonamento de provedores específicos que soportan o esforzo de razonamento.",
+	"Contact Admin for WebUI Access": "Contacta o administrador para obter acceso o WebUI",
+	"Content": "Contido",
+	"Content Extraction Engine": "Motor extractor de contido",
+	"Context Length": "Lonxitude do contexto",
+	"Continue Response": "Continuar Respuesta",
+	"Continue with {{provider}}": "Continuar co {{provider}}",
+	"Continue with Email": "Continuar co email",
+	"Continue with LDAP": "Continuar co LDAP",
+	"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.": "Controlar como o texto do mensaxe se divide para as solicitudes de TTS. 'Puntuation' divide en oracions, 'paragraphs' divide en párrafos e 'none' manten o mensaxe como unha sola cadea.",
+	"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.": "Controla a repetición de secuencias de tokens no texto xerado. Un valor máis alto (por exemplo, 1,5) penalizará as repeticións con máis forza, mentres que un valor máis baixo (por exemplo, 1,1) será mais tolerante. Cando é 1, está desactivado.",
+	"Controls": "Controles",
+	"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "Controla o equilibrio entre a coherencia e a diversidade da saída. Un valor máis baixo dará como resultado un texto máis centrado e coherente.",
+	"Copied": "Copiado",
+	"Copied shared chat URL to clipboard!": "¡URL de chat compartido copiado o portapapeis!",
+	"Copied to clipboard": "Copiado o portapapeis",
+	"Copy": "Copiar",
+	"Copy last code block": "Copia o último bloque de código",
+	"Copy last response": "Copia a última respuesta",
+	"Copy Link": "Copiar enlace",
+	"Copy to clipboard": "Copiado o portapapeis",
+	"Copying to clipboard was successful!": "!A copia o portapapeis realizouse correctamente!",
+	"CORS must be properly configured by the provider to allow requests from Open WebUI.": "O CORS debe estar debidamente configurado polo provedor para permitir solicitudes desde Open WebUI.",
+	"Create": "Xerar",
+	"Create a knowledge base": "Xerar base de conocemento",
+	"Create a model": "Xerar un modelo",
+	"Create Account": "Xerar unha conta",
+	"Create Admin Account": "Xerar conta administrativa",
+	"Create Channel": "Xerar Canal",
+	"Create Group": "Xerar grupo",
+	"Create Knowledge": "Xerar Conocemento",
+	"Create new key": "Xerar unha nova chave",
+	"Create new secret key": "Xerar unha nova chave secreta",
+	"Created at": "Creado en",
+	"Created At": "Creado en",
+	"Created by": "Creado por",
+	"CSV Import": "Importa un CSV",
+	"Ctrl+Enter to Send": "",
+	"Current Model": "Modelo Actual",
+	"Current Password": "contrasinal  Actual",
+	"Custom": "Personalizado",
+	"Danger Zone": "",
+	"Dark": "Oscuro",
+	"Database": "Base de datos",
+	"December": "Decembro",
+	"Default": "Por defecto",
+	"Default (Open AI)": "Predeterminado (Open AI)",
+	"Default (SentenceTransformers)": "Predeterminado (SentenceTransformers)",
+	"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.": "O modo predeterminado funciona con unha gama mais ampla de modelos chamando as ferramentas unha vez antes da execución. o modo nativo aproveita as capacidades integradas de chamada de ferramentas do modelo, pero requiere que o modelo soporte esta función de manera inherente.",
+	"Default Model": "Modelo predeterminado",
+	"Default model updated": "O modelo por defecto foi actualizado",
+	"Default Models": "Modelos predeterminados",
+	"Default permissions": "Permisos predeterminados",
+	"Default permissions updated successfully": "Permisos predeterminados actualizados correctamente",
+	"Default Prompt Suggestions": "Sugerencias de mensaxes por defecto",
+	"Default to 389 or 636 if TLS is enabled": "Predeterminado a 389 o 636 si TLS está habilitado",
+	"Default to ALL": "Predeterminado a TODOS",
+	"Default User Role": "Rol por defecto para os usuarios",
+	"Delete": "Borrar",
+	"Delete a model": "Borra un modelo",
+	"Delete All Chats": "Eliminar todos os chats",
+	"Delete All Models": "Eliminar todos os modelos",
+	"Delete chat": "Borrar chat",
+	"Delete Chat": "Borrar Chat",
+	"Delete chat?": "Borrar o chat?",
+	"Delete folder?": "¿Eliminar carpeta?",
+	"Delete function?": "Borrar afunción?",
+	"Delete Message": "Eliminar mensaxe",
+	"Delete message?": "",
+	"Delete prompt?": "Borrar o prompt?",
+	"delete this link": "Borrar este enlace",
+	"Delete tool?": "Borrar a ferramenta",
+	"Delete User": "Borrar Usuario",
+	"Deleted {{deleteModelTag}}": "Se borró {{deleteModelTag}}",
+	"Deleted {{name}}": "Eliminado {{nombre}}",
+	"Deleted User": "Usuario eliminado",
+	"Describe your knowledge base and objectives": "Describe a tua base de coñecementos e obxetivos",
+	"Description": "Descripción",
+	"Didn't fully follow instructions": "Non sigueu as instruccions",
+	"Direct Connections": "Conexións directas",
+	"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Conexións directas permiten aos usuarios conectar cos seus propios puntos finais de API compatibles con OpenAI.",
+	"Direct Connections settings updated": "Configuración de Conexións directas actualizada",
+	"Disabled": "Desactivado",
+	"Discover a function": "Descubre unha función",
+	"Discover a model": "Descubrir un modelo",
+	"Discover a prompt": "Descubre un Prompt",
+	"Discover a tool": "Descubre unha ferramenta",
+	"Discover how to use Open WebUI and seek support from the community.": "Descubra como usar Open WebUI e busque apoio na comunidade.",
+	"Discover wonders": "Descubre maravillas",
+	"Discover, download, and explore custom functions": "Descubre, descarga y explora funcións personalizadas",
+	"Discover, download, and explore custom prompts": "Descubre, descarga, y explora Prompts personalizados",
+	"Discover, download, and explore custom tools": "Descubre, descarga y explora ferramentas personalizadas",
+	"Discover, download, and explore model presets": "Descubre, descarga y explora ajustes preestablecidos de modelos",
+	"Dismissible": "Desestimable",
+	"Display": "Mostrar",
+	"Display Emoji in Call": "Muestra Emoji en chamada",
+	"Display the username instead of You in the Chat": "Mostrar o nombre de usuario en lugar de Vostede no chat",
+	"Displays citations in the response": "Muestra citas en arespuesta",
+	"Dive into knowledge": "Sumérgete no coñecemento",
+	"Do not install functions from sources you do not fully trust.": "Non instale funcións desde fontes nas que no confíe totalmente.",
+	"Do not install tools from sources you do not fully trust.": "Non instale ferramentas desde fontes nas que no confíe totalmente.",
+	"Document": "Documento",
+	"Document Intelligence": "Inteligencia documental",
+	"Document Intelligence endpoint and key required.": "Endpoint e chave de Intelixencia de Documentos requeridos.",
+	"Documentation": "Documentación",
+	"Documents": "Documentos",
+	"does not make any external connections, and your data stays securely on your locally hosted server.": "non realiza ninguna conexión externa y sus datos permanecen seguros en su servidor alojado localmente.",
+	"Domain Filter List": "",
+	"Don't have an account?": "¿Non tes unha conta?",
+	"don't install random functions from sources you don't trust.": "Non instale funcións aleatorias desde fontes nas que non confíe.",
+	"don't install random tools from sources you don't trust.": "Non instale ferramentas aleatorias desde fontes nas que non confíe.",
+	"Don't like the style": "Non che gusta o estilo?",
+	"Done": "Feito",
+	"Download": "Descargar",
+	"Download as SVG": "",
+	"Download canceled": "Descarga cancelada",
+	"Download Database": "Descarga a Base de Datos",
+	"Drag and drop a file to upload or select a file to view": "Arrastra y suelta un Arquivo para subirlo o selecciona un Arquivo para verlo",
+	"Draw": "Dibujar",
+	"Drop any files here to add to the conversation": "Suelta cualquier Arquivo aquí para agregarlo a a conversación",
+	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "p.ej. '30s','10m'. Unidades válidas detempo son 's', 'm', 'h'.",
+	"e.g. 60": "e.g. 60",
+	"e.g. A filter to remove profanity from text": "p.ej. Un filtro para eliminar a profanidade do texto",
+	"e.g. My Filter": "p.ej. O meu Filtro",
+	"e.g. My Tools": "p.ej. As miñas ferramentas",
+	"e.g. my_filter": "p.ej. meu_filtro",
+	"e.g. my_tools": "p.ej. miñas_ferramentas",
+	"e.g. Tools for performing various operations": "p.ej. ferramentas para realizar diversas operacions",
+	"Edit": "Editar",
+	"Edit Arena Model": "Editar modelo de Arena",
+	"Edit Channel": "Editar Canal",
+	"Edit Connection": "Editar Conexión",
+	"Edit Default Permissions": "Editar permisos predeterminados",
+	"Edit Memory": "Editar Memoria",
+	"Edit User": "Editar Usuario",
+	"Edit User Group": "Editar grupo de usuarios",
+	"ElevenLabs": "ElevenLabs",
+	"Email": "Email",
+	"Embark on adventures": "Emprende aventuras",
+	"Embedding": "",
+	"Embedding Batch Size": "Tamaño de Embedding",
+	"Embedding Model": "Modelo de Embedding",
+	"Embedding Model Engine": "Motor de Modelo de Embedding",
+	"Embedding model set to \"{{embedding_model}}\"": "Modelo de Embedding configurado a \"{{embedding_model}}\"",
+	"Enable API Key": "Habilitar chave de API",
+	"Enable autocomplete generation for chat messages": "Habilitar xeneración de autocompletado para mensaxes de chat",
+	"Enable Code Execution": "Habilitar a execución de código",
+	"Enable Code Interpreter": "Habilitar o interprete de código",
+	"Enable Community Sharing": "Habilitar o uso compartido da comunidad",
+	"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.": "Habilitar o bloqueo de memoria (mlock) para evitar que os datos do modelo se intercambien da RAM. Esta opción bloquea o conxunto de páxinas de traballo do modelo na RAM, asegurando que non se intercambiarán ao disco. Isto pode axudar a manter o rendemento evitando fallos de páxina e garantindo un acceso rápido aos datos.",
+	"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.": "Habilitar o mapeo de memoria (mmap) para cargar os datos do modelo. Esta opción permite ao sistema usar o almacenamento en disco como unha extensión da RAM tratando os arquivos de disco como se estivesen na RAM. Isto pode mellorar o rendemento do modelo permitindo un acceso máis rápido aos datos. Sen embargo, pode non funcionar correctamente con todos os sistemas e pode consumir unha cantidade significativa de espazo en disco.",
+	"Enable Message Rating": "Habilitar a calificación de os mensaxes",
+	"Enable Mirostat sampling for controlling perplexity.": "Habilitar o muestreo de Mirostat para controlar Perplexity.",
+	"Enable New Sign Ups": "Habilitar novos Registros",
+	"Enabled": "Activado",
+	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "asegurese de o teu arquivo CSV inclúe 4 columnas nesta orde: Nome, Email, Contrasinal, Rol.",
+	"Enter {{role}} message here": "Ingrese o mensaxe {{role}} aquí",
+	"Enter a detail about yourself for your LLMs to recall": "Ingrese un detalle sobre vostede para que as suas LLMs recorden",
+	"Enter api auth string (e.g. username:password)": "Ingrese a cadena de autorización de api (p.ej., nombre:contrasinal )",
+	"Enter Application DN": "Ingrese a DN da aplicación",
+	"Enter Application DN Password": "Ingrese a contrasinal  da DN da aplicación",
+	"Enter Bing Search V7 Endpoint": "Ingrese o punto final de Bing Search V7",
+	"Enter Bing Search V7 Subscription Key": "Ingrese a chave de suscripción de Bing Search V7",
+	"Enter Bocha Search API Key": "Ingresa a chave de API da busqueda de Bocha",
+	"Enter Brave Search API Key": "Ingresa a chave de API de busqueda de Brave",
+	"Enter certificate path": "Ingrese a ruta do certificado",
+	"Enter CFG Scale (e.g. 7.0)": "Ingresa a escala de CFG (p.ej., 7.0)",
+	"Enter Chunk Overlap": "Ingresar superposición de fragmentos",
+	"Enter Chunk Size": "Ingrese o tamaño do fragmento",
+	"Enter comma-seperated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "",
+	"Enter description": "Ingrese a descripción",
+	"Enter Document Intelligence Endpoint": "Ingrese o punto final de Intelixencia de Documentos",
+	"Enter Document Intelligence Key": "Ingrese a chave de Intelixencia de Documentos",
+	"Enter domains separated by commas (e.g., example.com,site.org)": "Ingrese dominios separados por comas (p.ej., example.com,site.org)",
+	"Enter Exa API Key": "Ingrese a chave API de Exa",
+	"Enter Github Raw URL": "Ingresa a URL sin procesar de Github",
+	"Enter Google PSE API Key": "Ingrese a chave API de Google PSE",
+	"Enter Google PSE Engine Id": "Introduzca o ID do motor PSE de Google",
+	"Enter Image Size (e.g. 512x512)": "Ingrese o tamaño da imaxen (p.ej. 512x512)",
+	"Enter Jina API Key": "Ingrese a chave API de Jina",
+	"Enter Jupyter Password": "Ingrese o contrasinal de Jupyter",
+	"Enter Jupyter Token": "Ingrese o token de Jupyter",
+	"Enter Jupyter URL": "Ingrese a URL de Jupyter",
+	"Enter Kagi Search API Key": "Ingrese a chave API de Kagi Search",
+	"Enter Key Behavior": "Ingrese o comportamento da chave",
+	"Enter language codes": "Ingrese códigos de idioma",
+	"Enter Model ID": "Ingresa o ID do modelo",
+	"Enter model tag (e.g. {{modelTag}})": "Ingrese a etiqueta do modelo (p.ej. {{modelTag}})",
+	"Enter Mojeek Search API Key": "Ingrese a chave API de Mojeek Search",
+	"Enter Number of Steps (e.g. 50)": "Ingrese o número de pasos (p.ej., 50)",
+	"Enter Perplexity API Key": "Ingrese a chave API de Perplexity",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "Ingrese a URL do proxy (p.ej. https://user:password@host:port)",
+	"Enter reasoning effort": "Ingrese o esfuerzo de razonamiento",
+	"Enter Sampler (e.g. Euler a)": "Ingrese o sampler (p.ej., Euler a)",
+	"Enter Scheduler (e.g. Karras)": "Ingrese o planificador (p.ej., Karras)",
+	"Enter Score": "Ingrese a puntuación",
+	"Enter SearchApi API Key": "Ingrese a chave API de SearchApi",
+	"Enter SearchApi Engine": "Ingrese o motor de SearchApi",
+	"Enter Searxng Query URL": "Introduzca a URL de consulta de Searxng",
+	"Enter Seed": "Ingrese a semilla",
+	"Enter SerpApi API Key": "Ingrese a chave API de SerpApi",
+	"Enter SerpApi Engine": "Ingrese o motor de SerpApi",
+	"Enter Serper API Key": "Ingrese a chave API de Serper",
+	"Enter Serply API Key": "Ingrese a chave API de Serply",
+	"Enter Serpstack API Key": "Ingrese a chave API de Serpstack",
+	"Enter server host": "Ingrese o host do servidor",
+	"Enter server label": "Ingrese a etiqueta do servidor",
+	"Enter server port": "Ingrese o puerto do servidor",
+	"Enter stop sequence": "Ingrese a secuencia de parada",
+	"Enter system prompt": "Ingrese o prompt do sistema",
+	"Enter Tavily API Key": "Ingrese a chave API de Tavily",
+	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Ingrese a URL pública da sua WebUI. Esta URL utilizaráse para generar enlaces en as notificacions.",
+	"Enter Tika Server URL": "Ingrese a URL do servidor Tika",
+	"Enter timeout in seconds": "Ingrese o tempo de espera en segundos",
+	"Enter to Send": "Ingrese para enviar",
+	"Enter Top K": "Ingrese o Top K",
+	"Enter URL (e.g. http://127.0.0.1:7860/)": "Ingrese a URL (p.ej., http://127.0.0.1:7860/)",
+	"Enter URL (e.g. http://localhost:11434)": "Ingrese a URL (p.ej., http://localhost:11434)",
+	"Enter your current password": "Ingrese o seu contrasinal  actual",
+	"Enter Your Email": "Ingrese o seu correo electrónico",
+	"Enter Your Full Name": "Ingrese o seu nome completo",
+	"Enter your message": "Ingrese o seu mensaxe",
+	"Enter your new password": "Ingrese o seu novo contrasinal ",
+	"Enter Your Password": "Ingrese o seu contrasinal ",
+	"Enter Your Role": "Ingrese o seu rol",
+	"Enter Your Username": "Ingrese o seu nome de usuario",
+	"Enter your webhook URL": "Ingrese a sua URL de webhook",
+	"Error": "Error",
+	"ERROR": "ERROR",
+	"Error accessing Google Drive: {{error}}": "Error o acceder a Google Drive: {{error}}",
+	"Error uploading file: {{error}}": "Error o subir o Arquivo: {{error}}",
+	"Evaluations": "Evaluacions",
+	"Exa API Key": "chave API de Exa",
+	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Exemplo: (&(objectClass=inetOrgPerson)(uid=%s))",
+	"Example: ALL": "Exemplo: TODOS",
+	"Example: mail": "Exemplo: correo",
+	"Example: ou=users,dc=foo,dc=example": "Exemplo: ou=usuarios,dc=foo,dc=Exemplo",
+	"Example: sAMAccountName or uid or userPrincipalName": "Exemplo: sAMAccountName o uid o userPrincipalName",
+	"Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "",
+	"Exclude": "Excluir",
+	"Execute code for analysis": "Ejecutar código para análisis",
+	"Expand": "expandir",
+	"Experimental": "Experimental",
+	"Explain": "Explicar",
+	"Explain this section to me in more detail": "Explica esta sección para mais detalle",
+	"Explore the cosmos": "Explora o cosmos",
+	"Export": "Exportar",
+	"Export All Archived Chats": "Exportar todos os chats Arquivados",
+	"Export All Chats (All Users)": "Exportar todos os chats (Todos os usuarios)",
+	"Export chat (.json)": "Exportar chat (.json)",
+	"Export Chats": "Exportar Chats",
+	"Export Config to JSON File": "Exportar configuración a Arquivo JSON",
+	"Export Functions": "Exportar Funcions",
+	"Export Models": "Exportar Modelos",
+	"Export Presets": "Exportar ajustes preestablecidos",
+	"Export Prompts": "Exportar Prompts",
+	"Export to CSV": "Exportar a CSV",
+	"Export Tools": "Exportar ferramentas",
+	"External Models": "Modelos Externos",
+	"Failed to add file.": "Non pudo agregarse o Arquivo.",
+	"Failed to create API Key.": "Non pudo xerarse a chave API.",
+	"Failed to fetch models": "Non puderon obterse os modelos",
+	"Failed to read clipboard contents": "Non pudo Lerse o contido do portapapeles",
+	"Failed to save models configuration": "Non pudogardarse a configuración de os modelos",
+	"Failed to update settings": "Falla al actualizar os ajustes",
+	"Failed to upload file.": "Falla al subir o Arquivo.",
+	"Features": "Características",
+	"Features Permissions": "Permisos de características",
+	"February": "Febreiro",
+	"Feedback History": "Historial de retroalimentación",
+	"Feedbacks": "Retroalimentacions",
+	"Feel free to add specific details": "Libre de agregar detalles específicos",
+	"File": "Arquivo",
+	"File added successfully.": "Arquivo agregado correctamente.",
+	"File content updated successfully.": "Contido do Arquivo actualizado correctamente.",
+	"File Mode": "Modo de Arquivo",
+	"File not found.": "Arquivo non encontrado.",
+	"File removed successfully.": "Arquivo eliminado correctamente.",
+	"File size should not exceed {{maxSize}} MB.": "Tamaño do Arquivo non debe exceder {{maxSize}} MB.",
+	"File uploaded successfully": "Arquivo subido correctamente",
+	"Files": "Arquivos",
+	"Filter is now globally disabled": "O filtro ahora está desactivado globalmente",
+	"Filter is now globally enabled": "O filtro ahora está habilitado globalmente",
+	"Filters": "Filtros",
+	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Destectouse suplantación de pegadas: Non puderon usarse as iniciais como avatar. Por defecto utilizase a imaxen de perfil predeterminada.",
+	"Fluidly stream large external response chunks": "Transmita con fluidez grandes fragmentos de resposta externa",
+	"Focus chat input": "Enfoca a entrada do chat",
+	"Folder deleted successfully": "Carpeta eliminada correctamente",
+	"Folder name cannot be empty": "O nome da carpeta non pode estar vacío",
+	"Folder name cannot be empty.": "O nome da carpeta non pode estar vacío",
+	"Folder name updated successfully": "Nombre da carpeta actualizado correctamente",
+	"Followed instructions perfectly": "Segiu as instruccions perfectamente",
+	"Forge new paths": "Forxa novos caminos",
+	"Form": "De",
+	"Format your variables using brackets like this:": "Formatea tus variables usando corchetes así:",
+	"Frequency Penalty": "Penalización de frecuencia",
+	"Full Context Mode": "",
+	"Function": "Función",
+	"Function Calling": "chamada de función",
+	"Function created successfully": "Función creada exitosamente",
+	"Function deleted successfully": "Función borrada exitosamente",
+	"Function Description": "Descripción da función",
+	"Function ID": "ID da función",
+	"Function is now globally disabled": "a función ahora está desactivada globalmente",
+	"Function is now globally enabled": "Afunción está habilitada globalmente",
+	"Function Name": "Nombre da función",
+	"Function updated successfully": "Función actualizada exitosamente",
+	"Functions": "Funcions",
+	"Functions allow arbitrary code execution": "Funcions habilitan aexecución de código arbitrario",
+	"Functions allow arbitrary code execution.": "Funcions habilitan aexecución de código arbitrario.",
+	"Functions imported successfully": "Funcions importadas exitosamente",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
+	"General": "General",
+	"Generate an image": "Generar unha imaxen",
+	"Generate Image": "Generar imaxen",
+	"Generate prompt pair": "",
+	"Generating search query": "xeneración de consultas de búsqueda",
+	"Get started": "Empezar",
+	"Get started with {{WEBUI_NAME}}": "Empezar con {{WEBUI_NAME}}",
+	"Global": "Global",
+	"Good Response": "Buena Respuesta",
+	"Google Drive": "Google Drive",
+	"Google PSE API Key": "chave API de Google PSE",
+	"Google PSE Engine Id": "ID do motor PSE de Google",
+	"Group created successfully": "Grupo creado correctamente",
+	"Group deleted successfully": "Grupo eliminado correctamente",
+	"Group Description": "Descripción do grupo",
+	"Group Name": "Nome do grupo",
+	"Group updated successfully": "Grupo actualizado correctamente",
+	"Groups": "Grupos",
+	"Haptic Feedback": "Retroalimentación háptica",
+	"has no conversations.": "Non ten conversacions.",
+	"Hello, {{name}}": "Hola, {{name}}",
+	"Help": "axuda",
+	"Help us create the best community leaderboard by sharing your feedback history!": "¡Axudanos a xerar o mejor tablero de líderes da comunidad compartindo o teu historial de retroalimentación!",
+	"Hex Color": "Cor Hex",
+	"Hex Color - Leave empty for default color": "Cor Hex - deixa vacío para o color predeterminado",
+	"Hide": "Esconder",
+	"Home": "",
+	"Host": "Host",
+	"How can I help you today?": "¿Cómo podo axudarche hoxe?",
+	"How would you rate this response?": "¿Cómo calificarías esta resposta?",
+	"Hybrid Search": "Búsqueda Híbrida",
+	"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.": "Asegurou que leu e entendo as implicacions da miña acción. Estou consciente dos riscos asociados con a execución de código arbitrario e verificou a confianza da fonte.",
+	"ID": "ID",
+	"Ignite curiosity": "Encender a curiosidad",
+	"Image": "imaxen",
+	"Image Compression": "Compresión de imaxen",
+	"Image Generation": "xeneración de imaxes",
+	"Image Generation (Experimental)": "xeneración de imaxes (experimental)",
+	"Image Generation Engine": "Motor de xeneración de imaxes",
+	"Image Max Compression Size": "Tamaño máximo de compresión de imaxen",
+	"Image Prompt Generation": "xeneración de prompt de imaxen",
+	"Image Prompt Generation Prompt": "Prompt de xeneración de prompt de imaxen",
+	"Image Settings": "Ajustes da Imaxe",
+	"Images": "imaxes",
+	"Import Chats": "Importar chats",
+	"Import Config from JSON File": "Importar configuración desde Arquivo JSON",
+	"Import Functions": "Importar Funcions",
+	"Import Models": "Importar modelos",
+	"Import Presets": "Importar ajustes preestablecidos",
+	"Import Prompts": "Importar Prompts",
+	"Import Tools": "Importar ferramentas",
+	"Include": "Incluir",
+	"Include `--api-auth` flag when running stable-diffusion-webui": "Incluir o indicador `--api-auth` al ejecutar stable-diffusion-webui",
+	"Include `--api` flag when running stable-diffusion-webui": "Incluir o indicador `--api` al ejecutar stable-diffusion-webui",
+	"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": "Información",
+	"Input commands": "Ingresar comandos",
+	"Install from Github URL": "Instalar desde a URL de Github",
+	"Instant Auto-Send After Voice Transcription": "Auto-Enviar despois da Transcripción de Voz",
+	"Integration": "Integración",
+	"Interface": "Interfaz",
+	"Invalid file format.": "Formato de Arquivo inválido.",
+	"Invalid Tag": "Etiqueta Inválida",
+	"is typing...": "está escribindo...",
+	"January": "Xaneiro",
+	"Jina API Key": "chave API de Jina",
+	"join our Discord for help.": "Únase o noso Discord para obter axuda.",
+	"JSON": "JSON",
+	"JSON Preview": "Vista previa de JSON",
+	"July": "Xullo",
+	"June": "Xuño",
+	"Jupyter Auth": "autenticación Jupyter",
+	"Jupyter URL": "url Jupyter",
+	"JWT Expiration": "Expiración do JWT",
+	"JWT Token": "Token JWT",
+	"Kagi Search API Key": "chave API de Kagi Search",
+	"Keep Alive": "manter Vivo",
+	"Key": "Chave",
+	"Keyboard shortcuts": "Atallos de teclado",
+	"Knowledge": "coñecemento",
+	"Knowledge Access": "Acceso al coñecemento",
+	"Knowledge created successfully.": "coñecemento creado exitosamente.",
+	"Knowledge deleted successfully.": "coñecemento eliminado exitosamente.",
+	"Knowledge reset successfully.": "coñecemento restablecido exitosamente.",
+	"Knowledge updated successfully": "coñecemento actualizado exitosamente.",
+	"Kokoro.js (Browser)": "Kokoro .js (Navegador)",
+	"Kokoro.js Dtype": "Kokoro .js Dtype",
+	"Label": "Etiqueta",
+	"Landing Page Mode": "Modo de Página de Inicio",
+	"Language": "Lenguaje",
+	"Last Active": "Última Actividad",
+	"Last Modified": "Modificado por última vez",
+	"Last reply": "Última respuesta",
+	"LDAP": "LDAP",
+	"LDAP server updated": "Servidor LDAP actualizado",
+	"Leaderboard": "Tablero de líderes",
+	"Leave empty for unlimited": "Deje vacío para ilimitado",
+	"Leave empty to include all models from \"{{URL}}/api/tags\" endpoint": "Deixa vacío para incluir todos os modelos desde o endpoint \"{{URL}}/api/tags\"",
+	"Leave empty to include all models from \"{{URL}}/models\" endpoint": "Deixa vacío para incluir todos os modelos desde o endpoint \"{{URL}}/models\"",
+	"Leave empty to include all models or select specific models": "Deixa vacío para incluir todos os modelos o seleccione modelos específicos",
+	"Leave empty to use the default prompt, or enter a custom prompt": "Deixa vacío para usar o prompt predeterminado, o ingrese un prompt personalizado",
+	"Leave model field empty to use the default model.": "Deixa o campo do modelo vacío para usar o modelo predeterminado.",
+	"License": "Licencia",
+	"Light": "Claro",
+	"Listening...": "Escoitando...",
+	"Llama.cpp": "Llama.cpp",
+	"LLMs can make mistakes. Verify important information.": "Os LLM poden cometer erros. Verifica a información importante.",
+	"Loader": "Cargador",
+	"Loading Kokoro.js...": "Cargando Kokoro.js...",
+	"Local": "Local",
+	"Local Models": "Modelos locais",
+	"Location access not allowed": "",
+	"Logit Bias": "Logit Bias",
+	"Lost": "Perdido",
+	"LTR": "LTR",
+	"Made by Open WebUI Community": "Feito por a comunidad de OpenWebUI",
+	"Make sure to enclose them with": "Asegúrese de adxuntarlos con",
+	"Make sure to export a workflow.json file as API format from ComfyUI.": "Asegúrese de exportar un Arquivo workflow.json en formato API desde ComfyUI.",
+	"Manage": "Xestionar",
+	"Manage Direct Connections": "Xestionar Conexións Directas",
+	"Manage Models": "Xestionar modelos",
+	"Manage Ollama": "Xestionar Ollama",
+	"Manage Ollama API Connections": "Xestionar conexiones API de Ollama",
+	"Manage OpenAI API Connections": "Xestionar conexiones API de OpenAI",
+	"Manage Pipelines": "Administrar Pipelines",
+	"March": "Marzo",
+	"Max Tokens (num_predict)": "Máximo de fichas (num_predict)",
+	"Max Upload Count": "Cantidad máxima de cargas",
+	"Max Upload Size": "Tamaño máximo de Cargas",
+	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Podense descargar un máximo de 3 modelos simultáneamente. Por favor, intenteo de novo mais tarde.",
+	"May": "Mayo",
+	"Memories accessible by LLMs will be shown here.": "As memorias accesibles por os LLMs mostraránse aquí.",
+	"Memory": "Memoria",
+	"Memory added successfully": "Memoria añadida correctamente",
+	"Memory cleared successfully": "Memoria liberada correctamente",
+	"Memory deleted successfully": "Memoria borrada correctamente",
+	"Memory updated successfully": "Memoria actualizada correctamente",
+	"Merge Responses": "Fusionar Respuestas",
+	"Message rating should be enabled to use this feature": "a calificación de mensaxes debe estar habilitada para usar esta función",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Os mensaxes que envíe despois de xerar su enlace no compartiránse. os usuarios co enlace podrán ver o chat compartido.",
+	"Min P": "Min P",
+	"Minimum Score": "Puntuación mínima",
+	"Mirostat": "Mirostat",
+	"Mirostat Eta": "Mirostat Eta",
+	"Mirostat Tau": "Mirostat Tau",
+	"Model": "Modelo",
+	"Model '{{modelName}}' has been successfully downloaded.": "0 modelo '{{modelName}}' se ha descargado correctamente.",
+	"Model '{{modelTag}}' is already in queue for downloading.": "0 modelo '{{modelTag}}' ya está en cola para descargar.",
+	"Model {{modelId}} not found": "0 modelo {{modelId}} no fue encontrado",
+	"Model {{modelName}} is not vision capable": "O  modelo {{modelName}} no es capaz de ver",
+	"Model {{name}} is now {{status}}": "O  modelo {{name}} ahora es {{status}}",
+	"Model accepts image inputs": "O modelo acepta entradas de imaxenes",
+	"Model created successfully!": "Modelo creado correctamente!",
+	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Destectouse a ruta do sistema de ficheiros do modelo. É necesario o nome curto do modelo para a actualización, non se pode continuar.",
+	"Model Filtering": "Filtrado de modelos",
+	"Model ID": "ID do modelo",
+	"Model IDs": "IDs de modelos",
+	"Model Name": "Nombre do modelo",
+	"Model not selected": "Modelo no seleccionado",
+	"Model Params": "Parámetros do modelo",
+	"Model Permissions": "Permisos do modelo",
+	"Model updated successfully": "Modelo actualizado correctamente",
+	"Modelfile Content": "Contenido do Modelfile",
+	"Models": "Modelos",
+	"Models Access": "Acceso a modelos",
+	"Models configuration saved successfully": "Configuración de modelos guardada correctamente",
+	"Mojeek Search API Key": "chave API de Mojeek Search",
+	"more": "mais",
+	"More": "mais",
+	"Name": "Nombre",
+	"Name your knowledge base": "Nombra a tua base de coñecementos",
+	"Native": "Nativo",
+	"New Chat": "Novo Chat",
+	"New Folder": "Nova carpeta",
+	"New Password": "Novo contrasinal ",
+	"new-channel": "novo-canal",
+	"No content found": "No se encontró contido",
+	"No content to speak": "Non ten contido para falar",
+	"No distance available": "Non ten distancia disponible",
+	"No feedbacks found": "No se encontraron retroalimentacions",
+	"No file selected": "Ningún arquivo fué seleccionado",
+	"No files found.": "No se encontraron arquivos.",
+	"No groups with access, add a group to grant access": "Non ten grupos con acceso, agrega un grupo para otorgar acceso",
+	"No HTML, CSS, or JavaScript content found.": "No se encontró contido HTML, CSS, o JavaScript.",
+	"No inference engine with management support found": "No se encontró un motor de inferencia con soporte de gestión",
+	"No knowledge found": "No se encontrou ningún coñecemento",
+	"No memories to clear": "Non hay memorias que limpar",
+	"No model IDs": "Non ten IDs de modelos",
+	"No models found": "No se encontraron modelos",
+	"No models selected": "No se seleccionaron modelos",
+	"No results found": "No se han encontrado resultados",
+	"No search query generated": "No se ha generado ninguna consulta de búsqueda",
+	"No source available": "Non ten fuente disponible",
+	"No users were found.": "No se encontraron usuarios.",
+	"No valves to update": "Non ten válvulas para actualizar",
+	"None": "Ninguno",
+	"Not factually correct": "No es correcto en todos os aspectos",
+	"Not helpful": "No útil",
+	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Se estableces unha puntuación mínima, a búsqueda sólo devolverá documentos con unha puntuación mayor o igual a a puntuación mínima.",
+	"Notes": "Notas",
+	"Notification Sound": "Sonido de notificación",
+	"Notification Webhook": "Webhook de notificación",
+	"Notifications": "Notificacions",
+	"November": "Noviembre",
+	"num_gpu (Ollama)": "num_gpu (Ollama)",
+	"num_thread (Ollama)": "num_thread (Ollama)",
+	"OAuth ID": "OAuth ID",
+	"October": "Octubre",
+	"Off": "Desactivado",
+	"Okay, Let's Go!": "Bien, ¡Vamos!",
+	"OLED Dark": "OLED oscuro",
+	"Ollama": "Ollama",
+	"Ollama API": "Ollama API",
+	"Ollama API settings updated": "Configuración de Ollama API actualizada",
+	"Ollama Version": "Versión de Ollama",
+	"On": "Activado",
+	"OneDrive": "OneDrive",
+	"Only alphanumeric characters and hyphens are allowed": "Sólo se permiten caracteres alfanuméricos y guiones",
+	"Only alphanumeric characters and hyphens are allowed in the command string.": "Sólo se permiten caracteres alfanuméricos y guiones en a cadena de comando.",
+	"Only collections can be edited, create a new knowledge base to edit/add documents.": "Solo se pueden editar as coleccions, xerar unha nova base de coñecementos para editar / añadir documentos",
+	"Only select users and groups with permission can access": "Solo os usuarios y grupos con permiso pueden acceder",
+	"Oops! Looks like the URL is invalid. Please double-check and try again.": "¡Ups! Parece que a URL no es válida. Vuelva a verificar e inténtelo novamente.",
+	"Oops! There are files still uploading. Please wait for the upload to complete.": "¡Ups! Todavía hay arquivos subiendo. Por favor, espere a que a subida se complete.",
+	"Oops! There was an error in the previous response.": "¡Ups! Hubo un error en a resposta anterior.",
+	"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "¡Ups! Estás utilizando un método no compatible (solo frontend). Por favor ejecute a WebUI desde o backend.",
+	"Open file": "Abrir arquivo",
+	"Open in full screen": "Abrir en pantalla completa",
+	"Open new chat": "Abrir novo chat",
+	"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 embeddings de locutores CMU Arctic.",
+	"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Aversión de Open WebUI (v{{OPEN_WEBUI_VERSION}}) es inferior a aversión requerida (v{{REQUIRED_VERSION}})",
+	"OpenAI": "OpenAI",
+	"OpenAI API": "OpenAI API",
+	"OpenAI API Config": "Configuración de OpenAI API",
+	"OpenAI API Key is required.": "Achave da API de OpenAI es requerida.",
+	"OpenAI API settings updated": "Configuración de OpenAI API actualizada",
+	"OpenAI URL/Key required.": "URL/chave de OpenAI es requerida.",
+	"or": "ou",
+	"Organize your users": "Organiza os teus usuarios",
+	"Other": "Outro",
+	"OUTPUT": "SAIDA",
+	"Output format": "Formato de saida",
+	"Overview": "Vista xeral",
+	"page": "Páxina",
+	"Password": "Contrasinal ",
+	"Paste Large Text as File": "Pegar texto grande como arquivo",
+	"PDF document (.pdf)": "Documento PDF (.pdf)",
+	"PDF Extract Images (OCR)": "Extraer imaxes de PDF (OCR)",
+	"pending": "pendente",
+	"Permission denied when accessing media devices": "Permiso denegado al acceder a os dispositivos",
+	"Permission denied when accessing microphone": "Permiso denegado al acceder a a micrófono",
+	"Permission denied when accessing microphone: {{error}}": "Permiso denegado al acceder al micrófono: {{error}}",
+	"Permissions": "Permisos",
+	"Perplexity API Key": "",
+	"Personalization": "Personalización",
+	"Pin": "Fijar",
+	"Pinned": "Fijado",
+	"Pioneer insights": "Descubrir novas perspectivas",
+	"Pipeline deleted successfully": "Pipeline borrada exitosamente",
+	"Pipeline downloaded successfully": "Pipeline descargada exitosamente",
+	"Pipelines": "Pipelines",
+	"Pipelines Not Detected": "Pipeline No Detectada",
+	"Pipelines Valves": "Tuberías Válvulas",
+	"Plain text (.txt)": "Texto plano (.txt)",
+	"Playground": "Patio de juegos",
+	"Please carefully review the following warnings:": "Por favor revise con cuidado os siguientes avisos:",
+	"Please do not close the settings page while loading the model.": "",
+	"Please enter a prompt": "Por favor ingrese un prompt",
+	"Please fill in all fields.": "Por favor llene todos os campos.",
+	"Please select a model first.": "Por favor seleccione un modelo primeiro.",
+	"Please select a model.": "Por favor seleccione un modelo.",
+	"Please select a reason": "Por favor seleccione unha razón",
+	"Port": "Puerto",
+	"Positive attitude": "Actitud positiva",
+	"Prefix ID": "ID de prefijo",
+	"Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "O ID de prefixo se utiliza para evitar conflictos con outras conexiones añadiendo un prefijo a os IDs de os modelos - deje vacío para deshabilitar",
+	"Presence Penalty": "Penalización de presencia",
+	"Previous 30 days": "Últimos 30 días",
+	"Previous 7 days": "Últimos 7 días",
+	"Profile Image": "imaxen de perfil",
+	"Prompt": "Prompt",
+	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (por Exemplo, cuéntame unha cosa divertida sobre o Imperio Romano)",
+	"Prompt Content": "Contenido do Prompt",
+	"Prompt created successfully": "Prompt creado exitosamente",
+	"Prompt suggestions": "Sugerencias de Prompts",
+	"Prompt updated successfully": "Prompt actualizado exitosamente",
+	"Prompts": "Prompts",
+	"Prompts Access": "Acceso a Prompts",
+	"Pull \"{{searchValue}}\" from Ollama.com": "Extraer \"{{searchValue}}\" de Ollama.com",
+	"Pull a model from Ollama.com": "Obter un modelo de Ollama.com",
+	"Query Generation Prompt": "Prompt de xeneración de consulta",
+	"RAG Template": "Plantilla de RAG",
+	"Rating": "Calificación",
+	"Re-rank models by topic similarity": "Re-clasificar modelos por similitud de tema",
+	"Read": "Ler",
+	"Read Aloud": "Ler en voz alta",
+	"Reasoning Effort": "Esfuerzo de razonamiento",
+	"Record voice": "Grabar voz",
+	"Redirecting you to Open WebUI Community": "Redireccionándote a a comunidad 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.": "",
+	"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Referirse a vostede mismo como \"Usuario\" (por Exemplo, \"O usuario está aprendiendo Español\")",
+	"References from": "Referencias de",
+	"Refused when it shouldn't have": "Rechazado cuando no debería",
+	"Regenerate": "Regenerar",
+	"Release Notes": "Notas da versión",
+	"Relevance": "Relevancia",
+	"Remove": "Eliminar",
+	"Remove Model": "Eliminar modelo",
+	"Rename": "Renombrar",
+	"Reorder Models": "Reordenar modelos",
+	"Repeat Last N": "Repetir as últimas N",
+	"Repeat Penalty (Ollama)": "",
+	"Reply in Thread": "Responder no hilo",
+	"Request Mode": "Modo de petición",
+	"Reranking Model": "Modelo de reranking",
+	"Reranking model disabled": "Modelo de reranking deshabilitado",
+	"Reranking model set to \"{{reranking_model}}\"": "Modelo de reranking establecido en \"{{reranking_model}}\"",
+	"Reset": "Reiniciar",
+	"Reset All Models": "Reiniciar todos os modelos",
+	"Reset Upload Directory": "Reiniciar Directorio de carga",
+	"Reset Vector Storage/Knowledge": "Reiniciar almacenamiento de vectores/coñecemento",
+	"Reset view": "Reiniciar vista",
+	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "As notificacions de resposta non poden activarse debido a que os permisos do sitio web han sido denegados. Por favor, visite as configuracions da sua navegador para otorgar o acceso necesario.",
+	"Response splitting": "División de respostas",
+	"Result": "Resultado",
+	"Retrieval": "recuperación",
+	"Retrieval Query Generation": "xeneración de consulta de recuperación",
+	"Rich Text Input for Chat": "Entrada de texto enriquecido para chat",
+	"RK": "RK",
+	"Role": "Rol",
+	"Rosé Pine": "Rosé Pine",
+	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "RTL",
+	"Run": "Executar",
+	"Running": "Executando",
+	"Save": "Gardar",
+	"Save & Create": "Gardar y xerar",
+	"Save & Update": "Gardar y Actualizar",
+	"Save As Copy": "Gardar como copia",
+	"Save Tag": "Gardar etiqueta",
+	"Saved": "Gardado",
+	"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": "Xa non se admite gardar registros de chat directamente no almacenamiento da sua navegador. Tómese un momento para descargar y eliminar sus registros de chat haciendo clic no botón a continuación. No te preocupes, puedes volver a importar fácilmente tus registros de chat al backend a través de",
+	"Scroll to bottom when switching between branches": "Moverse a parte inferior cuando se cambia entre ramas",
+	"Search": "Buscar",
+	"Search a model": "Buscar un modelo",
+	"Search Base": "Base de búsqueda",
+	"Search Chats": "Chats de búsqueda",
+	"Search Collection": "Buscar Colección",
+	"Search Filters": "Filtros de búsqueda",
+	"search for tags": "buscar etiquetas",
+	"Search Functions": "Buscar Funcions",
+	"Search Knowledge": "Buscar coñecemento",
+	"Search Models": "Buscar Modelos",
+	"Search options": "Opcions de búsqueda",
+	"Search Prompts": "Buscar Prompts",
+	"Search Result Count": "Recuento de resultados de búsqueda",
+	"Search the internet": "Buscar en internet",
+	"Search Tools": "Búsqueda de ferramentas",
+	"SearchApi API Key": "chave API de SearchApi",
+	"SearchApi Engine": "Motor de SearchApi",
+	"Searched {{count}} sites": "Buscadas {{count}} sitios",
+	"Searching \"{{searchQuery}}\"": "Buscando \"{{searchQuery}}\"",
+	"Searching Knowledge for \"{{searchQuery}}\"": "Buscando coñecemento para \"{{searchQuery}}\"",
+	"Searxng Query URL": "Searxng URL de consulta",
+	"See readme.md for instructions": "Vea o readme.md para instruccions",
+	"See what's new": "Ver as novedades",
+	"Seed": "Semilla",
+	"Select a base model": "Seleccionar un modelo base",
+	"Select a engine": "Busca un motor",
+	"Select a function": "Busca unha función",
+	"Select a group": "Seleccionar un grupo",
+	"Select a model": "Selecciona un modelo",
+	"Select a pipeline": "Selección de unha Pipeline",
+	"Select a pipeline url": "Selección de unha dirección URL de Pipeline",
+	"Select a tool": "Busca unha ferramenta",
+	"Select an auth method": "",
+	"Select an Ollama instance": "Seleccionar unha instancia de Ollama",
+	"Select Engine": "Selecciona Motor",
+	"Select Knowledge": "Selecciona coñecemento",
+	"Select only one model to call": "Selecciona sólo un modelo para llamar",
+	"Selected model(s) do not support image inputs": "Os modelos seleccionados no admiten entradas de imaxen",
+	"Semantic distance to query": "Distancia semántica a a consulta",
+	"Send": "Enviar",
+	"Send a Message": "Enviar un mensaxe",
+	"Send message": "Enviar mensaxe",
+	"Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "Envia `stream_options: { include_usage: true }` en a solicitud.\nLos proveedores admitidos devolverán información de uso do token en a resposta cuando se establezca.",
+	"September": "Septiembre",
+	"SerpApi API Key": "",
+	"SerpApi Engine": "",
+	"Serper API Key": "chave API de Serper",
+	"Serply API Key": "chave API de Serply",
+	"Serpstack API Key": "chave API de Serpstack",
+	"Server connection verified": "Conexión do servidor verificada",
+	"Set as default": "Establecer por defecto",
+	"Set CFG Scale": "Establecer la escala CFG",
+	"Set Default Model": "Establecer modelo predeterminado",
+	"Set embedding model": "Establecer modelo de embedding",
+	"Set embedding model (e.g. {{model}})": "Establecer modelo de embedding (ej. {{model}})",
+	"Set Image Size": "Establecer tamaño de imaxen",
+	"Set reranking model (e.g. {{model}})": "Establecer modelo de reranking (ej. {{model}})",
+	"Set Sampler": "Establecer Sampler",
+	"Set Scheduler": "Establecer Programador",
+	"Set Steps": "Establecer Pasos",
+	"Set Task Model": "Establecer modelo de tarefa",
+	"Set the number of layers, which will be off-loaded to GPU. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "Establece o número de capas que se descargarán na  GPU. Aumentar este valor puede mejorar significativamente o rendimiento de os modelos optimizados para la aceleración de GPU, pero también puede consumir mais energía y recursos de GPU.",
+	"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.": "Establece o número de hilos de trabajo utilizados para o cálculo. Esta opción controla cuántos hilos se utilizan para procesar as solicitudes entrantes simultáneamente. Aumentar este valor puede mejorar o rendimiento bajo cargas de trabajo de alta concurrencia, pero también puede consumir mais recursos de CPU.",
+	"Set Voice": "Establecer la voz",
+	"Set whisper model": "Establecer modelo de whisper",
+	"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.": "Establece un sesgo plano contra os tokens que han aparecido al menos una vez. Un valor más alto (por Exemplo, 1.5) penalizará más fuertemente las repeticiones, mientras que un valor más bajo (por Exemplo, 0.9) será más indulgente. En 0, está deshabilitado.",
+	"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.": "Establece un sesgo de escala contra os tokens para penalizar las repeticiones, basado en cuántas veces han aparecido. Un valor más alto (por Exemplo, 1.5) penalizará más fuertemente las repeticiones, mientras que un valor más bajo (por Exemplo, 0.9) será más indulgente. En 0, está deshabilitado.",
+	"Sets a scaling factor to penalize the model from repeating the same token. A higher value (e.g., 2.0) will penalize repetitions more strongly, while a lower value (e.g., 1.0) will be more lenient.": "Establece un factor de escala para penalizar al modelo por repetir el mismo token. Un valor más alto (por Exemplo, 2.0) penalizará más fuertemente las repeticiones, mientras que un valor más bajo (por Exemplo, 1.0) será más indulgente.",
+	"Sets how far back for the model to look back to prevent repetition.": "Establece canto tempo debe retroceder o modelo para evitar a repetición.",
+	"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.": "Establece a semente de número aleatorio a usar para xeneración. Establecer esto a un número específico hará que el modelo genere el mismo texto para el mismo prompt.",
+	"Sets the size of the context window used to generate the next token.": "Establece o tamaño da ventana de contexto utilizada para xenerar o seguinte 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.": "Establece as secuencias de parada a usar. Cuando se encuentre este patrón, o LLM dejará de generar texto y devolverá. Se pueden establecer varios patrones de parada especificando múltiples parámetros de parada separados en un arquivo de modelo.",
+	"Settings": "Configuración",
+	"Settings saved successfully!": "¡Configuración gardada con éxito!",
+	"Share": "Compartir",
+	"Share Chat": "Compartir Chat",
+	"Share to Open WebUI Community": "Compartir coa comunidads OpenWebUI",
+	"Show": "Mostrar",
+	"Show \"What's New\" modal on login": "Mostrar modal \"Qué hay de novo\" al iniciar sesión",
+	"Show Admin Details in Account Pending Overlay": "Mostrar detalles de administración na  capa de espera da conta",
+	"Show shortcuts": "Mostrar atallos",
+	"Show your support!": "¡Motra o teu apoio!",
+	"Showcased creativity": "Creatividade mostrada",
+	"Sign in": "Iniciar sesión",
+	"Sign in to {{WEBUI_NAME}}": "Iniciar sesión en {{WEBUI_NAME}}",
+	"Sign in to {{WEBUI_NAME}} with LDAP": "Iniciar sesión en {{WEBUI_NAME}} con LDAP",
+	"Sign Out": "Pechar sesión",
+	"Sign up": "Xerar unha conta",
+	"Sign up to {{WEBUI_NAME}}": "Xerar unha conta en {{WEBUI_NAME}}",
+	"Signing in to {{WEBUI_NAME}}": "Iniciando sesión en {{WEBUI_NAME}}",
+	"sk-1234": "sk-1234",
+	"Source": "Fonte",
+	"Speech Playback Speed": "Velocidad de reproducción de voz",
+	"Speech recognition error: {{error}}": "Error de recoñecemento de voz: {{error}}",
+	"Speech-to-Text Engine": "Motor de voz a texto",
+	"Stop": "Detener",
+	"Stop Sequence": "Detener secuencia",
+	"Stream Chat Response": "Transmitir resposta de chat",
+	"STT Model": "Modelo STT",
+	"STT Settings": "Configuracions de STT",
+	"Subtitle (e.g. about the Roman Empire)": "Subtítulo (por Exemplo, sobre o Imperio Romano)",
+	"Success": "Éxito",
+	"Successfully updated.": "Actualizado exitosamente.",
+	"Suggested": "Sugerido",
+	"Support": "Soporte",
+	"Support this plugin:": "Brinda soporte a este plugin:",
+	"Sync directory": "Sincroniza directorio",
+	"System": "Sistema",
+	"System Instructions": "Instruccions do sistema",
+	"System Prompt": "Prompt do sistema",
+	"Tags Generation": "xeneración de etiquetas",
+	"Tags Generation Prompt": "Prompt de xeneración de etiquetas",
+	"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.": "",
+	"Talk to model": "Falar co modelo",
+	"Tap to interrupt": "Toca para interrumpir",
+	"Tasks": "Tareas",
+	"Tavily API Key": "chave API de Tavily",
+	"Tell us more:": "Dinos mais:",
+	"Temperature": "Temperatura",
+	"Template": "Plantilla",
+	"Temporary Chat": "Chat temporal",
+	"Text Splitter": "Divisor de texto",
+	"Text-to-Speech Engine": "Motor de texto a voz",
+	"Tfs Z": "Tfs Z",
+	"Thanks for your feedback!": "¡Gracias pola tua retroalimentación!",
+	"The Application Account DN you bind with for search": "A conta de aplicación DN que vincula para a búsqueda",
+	"The base to search for users": "A base para buscar usuarios",
+	"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "O tamaño do lote determina canto texto se procesa xunto de unha vez. Un tamaño de lote maior pode aumentar o rendimiento y a velocidade do modelo, pero también requiere mais memoria.",
+	"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Os desarrolladores de este plugin son apasionados voluntarios da comunidade. Se encontras este plugin útil, por favor considere contribuir a seu desarrollo.",
+	"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "O tableiro de líderes de evaluación basase no sistema de clasificación Elo e actualizase entempo real.",
+	"The LDAP attribute that maps to the mail that users use to sign in.": "O atributo LDAP que se asigna al correo que os usuarios utilizan para iniciar sesión.",
+	"The LDAP attribute that maps to the username that users use to sign in.": "O atributo LDAP que se asigna al nombre de usuario que os usuarios utilizan para iniciar sesión.",
+	"The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "O tablero de líderes está actualmente en beta y podemos axustar os cálculos de clasificación a medida que refinamos o algoritmo.",
+	"The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "O tamaño máximo do arquivo en MB. Si o tamaño do arquivo supera este límite, o arquivo no se subirá.",
+	"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.": "O número máximo de arquivos que se pueden utilizar a la vez en chat. Si este límite es superado, os arquivos no se subirán.",
+	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "La puntuación debe ser un valor entre 0.0 (0%) y 1.0 (100%).",
+	"The temperature of the model. Increasing the temperature will make the model answer more creatively.": "",
+	"Theme": "Tema",
+	"Thinking...": "Pensando...",
+	"This action cannot be undone. Do you wish to continue?": "Esta acción no se puede deshacer. ¿Desea continuar?",
+	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Esto garantiza que sus valiosas conversacions se guarden de forma segura en su base de datos no backend. ¡Gracias!",
+	"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Esta es unha característica experimental que puede no funcionar como se esperaba y está sujeto a cambios en cualquier momento.",
+	"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.": "",
+	"This option will delete all existing files in the collection and replace them with newly uploaded files.": "Esta opción eliminará todos os arquivos existentes na  colección y os reemplazará con novos arquivos subidos.",
+	"This response was generated by \"{{model}}\"": "Esta resposta fue generada por \"{{model}}\"",
+	"This will delete": "Esto eliminará",
+	"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "Esto eliminará <strong>{{NAME}}</strong> y <strong>todo su contido</strong>.",
+	"This will delete all models including custom models": "Esto eliminará todos os modelos, incluidos os modelos personalizados",
+	"This will delete all models including custom models and cannot be undone.": "Esto eliminará todos os modelos, incluidos os modelos personalizados y no se puede deshacer.",
+	"This will reset the knowledge base and sync all files. Do you wish to continue?": "Esto reseteará la base de coñecementos y sincronizará todos os arquivos. ¿Desea continuar?",
+	"Thorough explanation": "Explicación exhaustiva",
+	"Thought for {{DURATION}}": "Pensamiento para {{DURATION}}",
+	"Thought for {{DURATION}} seconds": "",
+	"Tika": "Tika",
+	"Tika Server URL required.": "URL do servidor de Tika",
+	"Tiktoken": "Tiktoken",
+	"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Consello: Actualice múltiples variables consecutivamente presionando la tecla tab na  entrada do chat despois de cada reemplazo.",
+	"Title": "Título",
+	"Title (e.g. Tell me a fun fact)": "Título (por Exemplo, cóntame unha curiosidad)",
+	"Title Auto-Generation": "xeneración automática de títulos",
+	"Title cannot be an empty string.": "O título non pode ser unha cadena vacía.",
+	"Title Generation": "Xeneración de titulos",
+	"Title Generation Prompt": "Prompt de xeneración de título",
+	"TLS": "TLS",
+	"To access the available model names for downloading,": "Para acceder os nomes de modelos dispoñibles para descargar,",
+	"To access the GGUF models available for downloading,": "Para acceder os modelos GGUF dispoñibles para descargar,",
+	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Para acceder al interfaz de usuario web, por favor contacte al administrador. os administradores pueden administrar os estados de os usuarios desde o panel de administración.",
+	"To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Para adjuntar la base de coñecementos aquí, agreguelas al área de trabajo \"coñecemento\" primeiro.",
+	"To learn more about available endpoints, visit our documentation.": "Para obter mais información sobre os endpoints disponibles, visite nuestra documentación.",
+	"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.": "Para protexer a sua privacidade, solo compartense as calificacions, IDs dos modelos, etiquetas e metadatos da sua retroalimentación; os seus rexistros de chat permanecen privados e non se incluen.",
+	"To select actions here, add them to the \"Functions\" workspace first.": "Para seleccionar accions aquí, agreguelas al área de trabajo \"Funcions\" primeiro.",
+	"To select filters here, add them to the \"Functions\" workspace first.": "Para seleccionar filtros aquí, agreguelos al área de trabajo \"Funcions\" primeiro.",
+	"To select toolkits here, add them to the \"Tools\" workspace first.": "Para seleccionar ferramentas aquí, agreguelas al área de trabajo \"Ferramentas\" primeiro.",
+	"Toast notifications for new updates": "Notificacions emergentes para novas actualizacions",
+	"Today": "Hoxe",
+	"Toggle settings": "Alternar configuración",
+	"Toggle sidebar": "Alternar barra lateral",
+	"Token": "Token",
+	"Tokens To Keep On Context Refresh (num_keep)": "Tokens a manter no contexto de actualización (num_keep)",
+	"Too verbose": "Demasiado detalliado",
+	"Tool created successfully": "ferramenta creada con éxito",
+	"Tool deleted successfully": "ferramenta eliminada con éxito",
+	"Tool Description": "Descripción da ferramenta",
+	"Tool ID": "ID da ferramenta",
+	"Tool imported successfully": "ferramenta importada con éxito",
+	"Tool Name": "Nome da ferramenta",
+	"Tool updated successfully": "ferramenta actualizada con éxito",
+	"Tools": "Ferramentas",
+	"Tools Access": "Acceso a ferramentas",
+	"Tools are a function calling system with arbitrary code execution": "As ferramentas son un sistema de chamada de funcións con código arbitrario",
+	"Tools Function Calling Prompt": "Prompt de chamada de funcións de ferramentas",
+	"Tools have a function calling system that allows arbitrary code execution": "As ferramentas tienen un sistema de chamadas de funcións que permite la execución de código arbitrario",
+	"Tools have a function calling system that allows arbitrary code execution.": "As ferramentas tienen un sistema de chamada de funcións que permite la execución de código arbitrario.",
+	"Top K": "Top K",
+	"Top P": "Top P",
+	"Transformers": "Transformadores",
+	"Trouble accessing Ollama?": "¿Problemas para acceder a Ollama?",
+	"Trust Proxy Environment": "Confiar nos entornos de proxy",
+	"TTS Model": "Modelo TTS",
+	"TTS Settings": "Configuración de TTS",
+	"TTS Voice": "Voz do TTS",
+	"Type": "Tipo",
+	"Type Hugging Face Resolve (Download) URL": "Escriba la URL (Descarga) de Hugging Face Resolve",
+	"Uh-oh! There was an issue with the response.": "¡Ups! Hubo un problema con la respuesta.",
+	"UI": "UI",
+	"Unarchive All": "Desarquivar todo",
+	"Unarchive All Archived Chats": "Desarquivar todos os chats arquivados",
+	"Unarchive Chat": "Desarquivar chat",
+	"Unlock mysteries": "Desbloquear misterios",
+	"Unpin": "Desanclar",
+	"Unravel secrets": "Desentrañar secretos",
+	"Untagged": "Sin etiquetar",
+	"Update": "Actualizar",
+	"Update and Copy Link": "Actualizar y copiar enlace",
+	"Update for the latest features and improvements.": "Actualize para as últimas características e mejoras.",
+	"Update password": "Actualizar contrasinal ",
+	"Updated": "Actualizado",
+	"Updated at": "Actualizado en",
+	"Updated At": "Actualizado en",
+	"Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "",
+	"Upload": "Subir",
+	"Upload a GGUF model": "Subir un modelo GGUF",
+	"Upload directory": "Directorio de carga",
+	"Upload files": "Subir arquivos",
+	"Upload Files": "Subir arquivos",
+	"Upload Pipeline": "Subir Pipeline",
+	"Upload Progress": "Progreso de carga",
+	"URL": "URL",
+	"URL Mode": "Modo de URL",
+	"Use '#' in the prompt input to load and include your knowledge.": "Utilice '#' no prompt para cargar y incluir su coñecemento.",
+	"Use Gravatar": "Usar Gravatar",
+	"Use groups to group your users and assign permissions.": "Use grupos para agrupar a sus usuarios y asignar permisos.",
+	"Use Initials": "Usar Iniciales",
+	"use_mlock (Ollama)": "use_mlock (Ollama)",
+	"use_mmap (Ollama)": "use_mmap (Ollama)",
+	"user": "usuario",
+	"User": "Usuario",
+	"User location successfully retrieved.": "Localización do usuario recuperada con éxito.",
+	"Username": "Nombre de usuario",
+	"Users": "Usuarios",
+	"Using the default arena model with all models. Click the plus button to add custom models.": "Usando o modelo de arena predeterminado con todos os modelos. Haga clic no botón mais para agregar modelos personalizados.",
+	"Utilize": "Utilizar",
+	"Valid time units:": "Unidades válidas de tempo:",
+	"Valves": "Valves",
+	"Valves updated": "Valves actualizados",
+	"Valves updated successfully": "Valves actualizados con éxito",
+	"variable": "variable",
+	"variable to have them replaced with clipboard content.": "variable para reemplazarlos co contido do portapapeles.",
+	"Version": "Versión",
+	"Version {{selectedVersion}} of {{totalVersions}}": "Versión {{selectedVersion}} de {{totalVersions}}",
+	"View Replies": "Ver respuestas",
+	"Visibility": "Visibilidad",
+	"Voice": "Voz",
+	"Voice Input": "Entrada de voz",
+	"Warning": "Advertencia",
+	"Warning:": "Advertencia:",
+	"Warning: Enabling this will allow users to upload arbitrary code on the server.": "Advertencia: Habilitar esto permitirá a os usuarios subir código arbitrario no servidor.",
+	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Advertencia: Si actualiza o cambia su modelo de inserción, necesitará volver a importar todos os documentos.",
+	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Aviso: A execución de Jupyter permite a execución de código arbitrario, o que supón riscos de seguridade graves - procede con extrema precaución.",
+	"Web": "Web",
+	"Web API": "API Web",
+	"Web Search": "Búsqueda na  Web",
+	"Web Search Engine": "Motor de búsqueda web",
+	"Web Search in Chat": "Búsqueda web en chat",
+	"Web Search Query Generation": "xeneración de consultas de búsqueda web",
+	"Webhook URL": "Webhook URL",
+	"WebUI Settings": "Configuración do WebUI",
+	"WebUI URL": "URL do WebUI",
+	"WebUI will make requests to \"{{url}}/api/chat\"": "WebUI hará solicitudes a \"{{url}}/api/chat\"",
+	"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 lograr?",
+	"What are you working on?": "¿En qué estás trabajando?",
+	"What’s New in": "Novedades en",
+	"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.": "Cando está habilitado, o modelo responderá a cada mensaxe de chat en tempo real, generando unha resposta tan pronto como o usuario envíe un mensaxe. Este modo es útil para aplicacions de chat en vivo, pero puede afectar o rendimiento en hardware mais lento.",
+	"wherever you are": "Donde queira que estés",
+	"Whisper (Local)": "Xextor de voz (Local)",
+	"Why?": "¿Por qué?",
+	"Widescreen Mode": "Modo de pantalla ancha",
+	"Won": "Ganado",
+	"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 xunto con top-k. Un valor máis alto (por exemplo, 0,95) dará lugar a un texto máis diverso, mentres que un valor máis baixo (por exemplo, 0,5) xerará un texto máis centrado e conservador.",
+	"Workspace": "Espacio de traballo",
+	"Workspace Permissions": "Permisos do espacio de traballo",
+	"Write": "Escribir",
+	"Write a prompt suggestion (e.g. Who are you?)": "Escribe unha sugerencia para un prompt (por Exemplo, ¿quen eres?)",
+	"Write a summary in 50 words that summarizes [topic or keyword].": "Escribe un resumen en 50 palabras que resuma [tema ou palabra principal].",
+	"Write something...": "Escribe algo...",
+	"Write your model template content here": "Escribe o contido da tua plantilla de modelo aquí",
+	"Yesterday": "Onte",
+	"You": "Vostede",
+	"You are currently using a trial license. Please contact support to upgrade your license.": "Estás utilizando actualmente unha licenza de proba. Por favor, contacta co soporte para actualizar a túa licenza.",
+	"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Solo puede chatear con un máximo de {{maxCount}} arquivo(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.": "Puede personalizar as suas interaccions con LLMs añadiendo memorias a través do botón 'Xestionar' debajo, haciendo que sean mais útiles y personalizados para vostede.",
+	"You cannot upload an empty file.": "Non pode subir un arquivo vacío.",
+	"You do not have permission to access this feature.": "Non ten permiso para acceder a esta función.",
+	"You do not have permission to upload files": "Non ten permiso para subir arquivos",
+	"You do not have permission to upload files.": "Non ten permiso para subir arquivos.",
+	"You have no archived conversations.": "Non ten conversacions arquivadas.",
+	"You have shared this chat": "Vostede ha compartido esta conversación",
+	"You're a helpful assistant.": "Vostede es un asistente útil.",
+	"You're now logged in.": "Vostede ahora está conectado.",
+	"Your account status is currently pending activation.": "O estado da sua conta actualmente encontrase pendente 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.": "A sua contribución completa irá directamente o desarrollador do plugin; Open WebUI non toma ningun porcentaxe. Sin embargo, a plataforma de financiación elegida podría ter as suas propias tarifas.",
+	"Youtube": "Youtube",
+	"Youtube Language": "",
+	"Youtube Proxy URL": ""
+}

+ 1 - 0
src/lib/i18n/locales/he-IL/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(למשל `sh webui.sh --api`)",
 	"(latest)": "(האחרון)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ דגמים }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/hi-IN/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(e.g. `sh webui.sh --api`)",
 	"(latest)": "(latest)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ मॉडल }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/hr-HR/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(npr. `sh webui.sh --api`)",
 	"(latest)": "(najnovije)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ modeli }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/hu-HU/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(pl. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(pl. `sh webui.sh --api`)",
 	"(latest)": "(legújabb)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ modellek }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/id-ID/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(contoh: `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(contoh: `sh webui.sh --api`)",
 	"(latest)": "(terbaru)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/ie-GA/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(m.sh. `sh webui.sh --api --api-auth username_password `)",
 	"(e.g. `sh webui.sh --api`)": "(m.sh. `sh webui.sh --api`)",
 	"(latest)": "(is déanaí)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "{{COUNT}} Freagra",

+ 1 - 0
src/lib/i18n/locales/it-IT/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(p.e. `sh webui.sh --api`)",
 	"(latest)": "(ultima)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ modelli }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/ja-JP/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(例: `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(例: `sh webui.sh --api`)",
 	"(latest)": "(最新)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ モデル }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/ka-GE/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(მაგ: `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(მაგ: `sh webui.sh --api`)",
 	"(latest)": "(უახლესი)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ მოდელები }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "{{COUNT}} პასუხი",

+ 1 - 0
src/lib/i18n/locales/ko-KR/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(예: `sh webui.sh --api --api-auth 사용자이름_비밀번호`)",
 	"(e.g. `sh webui.sh --api`)": "(예: `sh webui.sh --api`)",
 	"(latest)": "(최근)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/lt-LT/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(pvz. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(pvz. `sh webui.sh --api`)",
 	"(latest)": "(naujausias)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/ms-MY/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(contoh `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(contoh `sh webui.sh --api`)",
 	"(latest)": "(terkini)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/nb-NO/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(f.eks. `sh webui.sh --api --api-auth brukernavn_passord`)",
 	"(e.g. `sh webui.sh --api`)": "(f.eks. `sh webui.sh --api`)",
 	"(latest)": "(siste)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ modeller }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "{{COUNT}} svar",

+ 1 - 0
src/lib/i18n/locales/nl-NL/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(bv. `sh webui.sh --api --api-auth gebruikersnaam_wachtwoord`)",
 	"(e.g. `sh webui.sh --api`)": "(bv. `sh webui.sh --api`)",
 	"(latest)": "(nieuwste)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ modellen }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/pa-IN/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(ਉਦਾਹਰਣ ਦੇ ਤੌਰ ਤੇ `sh webui.sh --api`)",
 	"(latest)": "(ਤਾਜ਼ਾ)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ ਮਾਡਲ }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/pl-PL/translation.json

@@ -4,6 +4,7 @@
 	"(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`)",
 	"(latest)": "(najnowszy)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ modele }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "{{COUNT}} odpowiedzi",

+ 1 - 0
src/lib/i18n/locales/pt-BR/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(por exemplo, `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(por exemplo, `sh webui.sh --api`)",
 	"(latest)": "(último)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/pt-PT/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(por exemplo, `sh webui.sh --api`)",
 	"(latest)": "(mais recente)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ modelos }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/ro-RO/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(de ex. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(de ex. `sh webui.sh --api`)",
 	"(latest)": "(ultimul)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ modele }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/ru-RU/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(например, `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(например, `sh webui.sh --api`)",
 	"(latest)": "(последняя)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ модели }}",
 	"{{COUNT}} hidden lines": "{{COUNT}} скрытых строк",
 	"{{COUNT}} Replies": "{{COUNT}} Ответов",

+ 1 - 0
src/lib/i18n/locales/sk-SK/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(napr. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(napr. `sh webui.sh --api`)",
 	"(latest)": "Najnovšie",
+	"(Ollama)": "",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/sr-RS/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(нпр. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(нпр. `sh webui.sh --api`)",
 	"(latest)": "(најновије)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ модели }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "{{COUNT}} одговора",

+ 1 - 0
src/lib/i18n/locales/sv-SE/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(t.ex. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(t.ex. `sh webui.sh --api`)",
 	"(latest)": "(senaste)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ modeller }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "{{COUNT}} Svar",

+ 1 - 0
src/lib/i18n/locales/th-TH/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(เช่น `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(เช่น `sh webui.sh --api`)",
 	"(latest)": "(ล่าสุด)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/tk-TW/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "",
 	"(latest)": "",
+	"(Ollama)": "",
 	"{{ models }}": "",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/tr-TR/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(örn. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(örn. `sh webui.sh --api`)",
 	"(latest)": "(en son)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "{{COUNT}} Yanıt",

+ 15 - 14
src/lib/i18n/locales/uk-UA/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(напр. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(напр. `sh webui.sh --api`)",
 	"(latest)": "(остання)",
+	"(Ollama)": "(Ollama)",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "{{COUNT}} прихованих рядків",
 	"{{COUNT}} Replies": "{{COUNT}} Відповіді",
@@ -68,8 +69,8 @@
 	"Already have an 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.": "Альтернатива top_p, що спрямована на забезпечення балансу між якістю та різноманітністю. Параметр p представляє мінімальну ймовірність для врахування токена відносно ймовірності найбільш ймовірного токена. Наприклад, при p=0.05 і ймовірності найбільш ймовірного токена 0.9, логіти зі значенням менше 0.045 відфільтровуються.",
 	"Always": "Завжди",
-	"Always Collapse Code Blocks": "",
-	"Always Expand Details": "",
+	"Always Collapse Code Blocks": "Завжди згортати блоки коду",
+	"Always Expand Details": "Завжди розгортати деталі",
 	"Amazing": "Чудово",
 	"an assistant": "асистента",
 	"Analyzed": "Проаналізовано",
@@ -272,7 +273,7 @@
 	"Default Prompt Suggestions": "Пропозиції промтів замовчуванням",
 	"Default to 389 or 636 if TLS is enabled": "За замовчуванням використовується 389 або 636, якщо TLS увімкнено.",
 	"Default to ALL": "За замовчуванням — УСІ.",
-	"Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "",
+	"Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "За замовчуванням використовувати сегментований пошук для зосередженого та релевантного вилучення контенту, це рекомендується у більшості випадків.",
 	"Default User Role": "Роль користувача за замовчуванням",
 	"Delete": "Видалити",
 	"Delete a model": "Видалити модель",
@@ -295,7 +296,7 @@
 	"Describe your knowledge base and objectives": "Опишіть вашу базу знань та цілі",
 	"Description": "Опис",
 	"Didn't fully follow instructions": "Не повністю дотримувалися інструкцій",
-	"Direct": "",
+	"Direct": "Прямий",
 	"Direct Connections": "Прямі з'єднання",
 	"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Прямі з'єднання дозволяють користувачам підключатися до своїх власних API-кінцевих точок, сумісних з OpenAI.",
 	"Direct Connections settings updated": "Налаштування прямих з'єднань оновлено",
@@ -318,8 +319,8 @@
 	"Dive into knowledge": "Зануртесь у знання",
 	"Do not install functions from sources you do not fully trust.": "Не встановлюйте функції з джерел, яким ви не повністю довіряєте.",
 	"Do not install tools from sources you do not fully trust.": "Не встановлюйте інструменти з джерел, яким ви не повністю довіряєте.",
-	"Docling": "",
-	"Docling Server URL required.": "",
+	"Docling": "Docling",
+	"Docling Server URL required.": "Потрібна URL-адреса сервера Docling.",
 	"Document": "Документ",
 	"Document Intelligence": "Інтелект документа",
 	"Document Intelligence endpoint and key required.": "Потрібні кінцева точка та ключ для Інтелекту документа.",
@@ -390,7 +391,7 @@
 	"Enter Chunk Size": "Введіть розмір фрагменту",
 	"Enter comma-seperated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "Введіть пари \"токен:значення_зміщення\", розділені комами (напр.: 5432:100, 413:-100)",
 	"Enter description": "Введіть опис",
-	"Enter Docling Server URL": "",
+	"Enter Docling Server URL": "Введіть URL-адресу сервера Docling",
 	"Enter Document Intelligence Endpoint": "Введіть кінцеву точку Інтелекту документа",
 	"Enter Document Intelligence Key": "Введіть ключ Інтелекту документа",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "Введіть домени, розділені комами (наприклад, example.com, site.org)",
@@ -478,7 +479,7 @@
 	"Export Prompts": "Експорт промтів",
 	"Export to CSV": "Експорт в CSV",
 	"Export Tools": "Експорт інструментів",
-	"External": "",
+	"External": "Зовнішній",
 	"External Models": "Зовнішні моделі",
 	"Failed to add file.": "Не вдалося додати файл.",
 	"Failed to create API Key.": "Не вдалося створити API ключ.",
@@ -591,7 +592,7 @@
 	"Include `--api` flag when running stable-diffusion-webui": "Включіть прапор `--api` при запуску stable-diffusion-webui",
 	"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": "Інфо",
-	"Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "",
+	"Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Вставте весь вміст як контекст для всебічної обробки, це рекомендується для складних запитів.",
 	"Input commands": "Команди вводу",
 	"Install from Github URL": "Встановіть з URL-адреси Github",
 	"Instant Auto-Send After Voice Transcription": "Миттєва автоматична відправка після транскрипції голосу",
@@ -815,7 +816,7 @@
 	"Presence Penalty": "Штраф за присутність",
 	"Previous 30 days": "Попередні 30 днів",
 	"Previous 7 days": "Попередні 7 днів",
-	"Private": "",
+	"Private": "Приватний",
 	"Profile Image": "Зображення профілю",
 	"Prompt": "Підказка",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Підказка (напр., розкажіть мені цікавий факт про Римську імперію)",
@@ -825,7 +826,7 @@
 	"Prompt updated successfully": "Підказку успішно оновлено",
 	"Prompts": "Промти",
 	"Prompts Access": "Доступ до підказок",
-	"Public": "",
+	"Public": "Публічний",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Завантажити \"{{searchValue}}\" з Ollama.com",
 	"Pull a model from Ollama.com": "Завантажити модель з Ollama.com",
 	"Query Generation Prompt": "Підказка для генерації запиту",
@@ -990,7 +991,7 @@
 	"System": "Система",
 	"System Instructions": "Системні інструкції",
 	"System Prompt": "Системний промт",
-	"Tags": "",
+	"Tags": "Теги",
 	"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.": "Вибірка без хвоста використовується для зменшення впливу менш ймовірних токенів на результат. Вищий показник (напр., 2.0) зменшить вплив сильніше, тоді як значення 1.0 вимикає цю опцію.",
@@ -1021,7 +1022,7 @@
 	"Theme": "Тема",
 	"Thinking...": "Думаю...",
 	"This action cannot be undone. Do you wish to continue?": "Цю дію не можна скасувати. Ви бажаєте продовжити?",
-	"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.": "Цей канал був створений {{createdAt}}. Це самий початок каналу {{channelName}}.",
 	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Це забезпечує збереження ваших цінних розмов у безпечному бекенд-сховищі. Дякуємо!",
 	"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Це експериментальна функція, вона може працювати не так, як очікувалося, і може бути змінена в будь-який час.",
 	"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.": "Ця опція контролює, скільки токенів зберігається при оновленні контексту. Наприклад, якщо встановити значення 2, останні 2 токени контексту розмови будуть збережені. Збереження контексту допомагає підтримувати послідовність розмови, але може зменшити здатність реагувати на нові теми.",
@@ -1131,7 +1132,7 @@
 	"Valves updated successfully": "Клапани успішно оновлено",
 	"variable": "змінна",
 	"variable to have them replaced with clipboard content.": "змінна, щоб замінити їх вмістом буфера обміну.",
-	"Verify Connection": "",
+	"Verify Connection": "Перевірити з'єднання",
 	"Version": "Версія",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Версія {{selectedVersion}} з {{totalVersions}}",
 	"View Replies": "Переглянути відповіді",

+ 1 - 0
src/lib/i18n/locales/ur-PK/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(مثال کے طور پر: `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(مثال کے طور پر: `sh webui.sh --api`)",
 	"(latest)": "(تازہ ترین)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ ماڈلز }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/vi-VN/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(vd: `sh webui.sh --api`)",
 	"(latest)": "(mới nhất)",
+	"(Ollama)": "",
 	"{{ models }}": "{{ mô hình }}",
 	"{{COUNT}} hidden lines": "",
 	"{{COUNT}} Replies": "",

+ 1 - 0
src/lib/i18n/locales/zh-CN/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(例如 `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(例如 `sh webui.sh --api`)",
 	"(latest)": "(最新版)",
+	"(Ollama)": "(Ollama)",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "{{COUNT}} 行被隐藏",
 	"{{COUNT}} Replies": "{{COUNT}} 回复",

+ 45 - 44
src/lib/i18n/locales/zh-TW/translation.json

@@ -4,6 +4,7 @@
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(例如 `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(例如 `sh webui.sh --api`)",
 	"(latest)": "(最新版)",
+	"(Ollama)": "(Ollama)",
 	"{{ models }}": "{{ models }}",
 	"{{COUNT}} hidden lines": "已隱藏 {{COUNT}} 行",
 	"{{COUNT}} Replies": "{{COUNT}} 回覆",
@@ -66,7 +67,7 @@
 	"Allow Voice Interruption in Call": "允許在通話中打斷語音",
 	"Allowed Endpoints": "允許的端點",
 	"Already have an 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.": "top_p 的替代方案,旨在確保品質與多樣性之間的平衡。參數 p 代表一個 token 被考慮的最低機率,相對於最有可能 token 的機率。例如,當 p=0.05 且最有可能 token 的機率為 0.9 時,機率小於 0.045 的 logits 將被過濾掉。",
+	"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.": "top_p 的替代方案,用於確保品質與多樣性之間的平衡。參數 p 代表一個 token 被考慮的最低機率,相對於最有可能 token 的機率。例如,當 p=0.05 且最有可能 token 的機率為 0.9 時,機率小於 0.045 的 logits 將被過濾掉。",
 	"Always": "總是",
 	"Always Collapse Code Blocks": "總是摺疊程式碼區塊",
 	"Always Expand Details": "總是展開詳細資訊",
@@ -132,7 +133,7 @@
 	"Bing Search V7 Endpoint": "Bing 搜尋 V7 端點",
 	"Bing Search V7 Subscription Key": "Bing 搜尋 V7 訂閱金鑰",
 	"Bocha Search API Key": "Bocha 搜尋 API 金鑰",
-	"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "針對受限的回應,增強或懲罰特定 tokens。偏置值將限制在 -100 到 100 (含)。 (預設: none)",
+	"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "針對受限的回應,增強或懲罰特定 tokens。偏置值將限制在 -100 到 100 (含)。 (預設none)",
 	"Brave Search API Key": "Brave 搜尋 API 金鑰",
 	"By {{name}}": "由 {{name}} 製作",
 	"Bypass Embedding and Retrieval": "繞過嵌入與檢索",
@@ -171,11 +172,11 @@
 	"Clear memory": "清除記憶",
 	"Clear Memory": "清除記憶",
 	"click here": "點選這裡",
-	"Click here for filter guides.": "點選這裡查看篩選器指南。",
+	"Click here for filter guides.": "點選這裡檢視篩選器指南。",
 	"Click here for help.": "點選這裡取得協助。",
 	"Click here to": "點選這裡",
 	"Click here to download user import template file.": "點選這裡下載使用者匯入範本檔案。",
-	"Click here to learn more about faster-whisper and see the available models.": "點選這裡了解更多關於 faster-whisper 的資訊並查看可用的模型。",
+	"Click here to learn more about faster-whisper and see the available models.": "點選這裡了解更多關於 faster-whisper 的資訊並檢視可用的模型。",
 	"Click here to see available models.": "點選這裡以檢視可用的模型",
 	"Click here to select": "點選這裡選擇",
 	"Click here to select a csv file.": "點選這裡選擇 CSV 檔案。",
@@ -193,9 +194,9 @@
 	"Code Execution Engine": "程式碼執行引擎",
 	"Code Execution Timeout": "程式執行超時",
 	"Code formatted successfully": "程式碼格式化成功",
-	"Code Interpreter": "程式碼解釋器",
-	"Code Interpreter Engine": "程式碼解釋器引擎",
-	"Code Interpreter Prompt Template": "程式碼解釋器提示詞模板",
+	"Code Interpreter": "程式碼直譯器",
+	"Code Interpreter Engine": "程式碼直譯器引擎",
+	"Code Interpreter Prompt Template": "程式碼直譯器提示詞範本",
 	"Collapse": "摺疊",
 	"Collection": "收藏",
 	"Color": "顏色",
@@ -225,9 +226,9 @@
 	"Continue with Email": "使用 Email 繼續",
 	"Continue with LDAP": "使用 LDAP 繼續",
 	"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.": "控制文字轉語音(TTS)請求中如何分割訊息文字。「標點符號」分割為句子,「段落」分割為段落,「無」則保持訊息為單一字串。",
-	"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.": "控制生成文中 token 序列的重複程度。較高的值(例如 1.5)會更強烈地懲罰重複,而較低的值(例如 1.1)會更寬容。設為 1 時,此功能將停用。",
+	"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.": "控制生成文中 token 序列的重複程度。較高的值(例如 1.5)會更強烈地懲罰重複,而較低的值(例如 1.1)會更寬容。設為 1 時,此功能將停用。",
 	"Controls": "控制項",
-	"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "控制輸出結果的連貫性與多樣性之間的平衡。數值越低會產生更集中且連貫的文。",
+	"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "控制輸出結果的連貫性與多樣性之間的平衡。數值越低會產生更集中且連貫的文。",
 	"Copied": "已複製",
 	"Copied shared chat URL to clipboard!": "已複製共用對話 URL 到剪貼簿!",
 	"Copied to clipboard": "已複製到剪貼簿",
@@ -252,7 +253,7 @@
 	"Created At": "建立於",
 	"Created by": "建立者",
 	"CSV Import": "CSV 匯入",
-	"Ctrl+Enter to Send": "使用 Ctrl+Enter 送",
+	"Ctrl+Enter to Send": "使用 Ctrl+Enter 送",
 	"Current Model": "目前模型",
 	"Current Password": "目前密碼",
 	"Custom": "自訂",
@@ -270,7 +271,7 @@
 	"Default permissions": "預設權限",
 	"Default permissions updated successfully": "預設權限更新成功",
 	"Default Prompt Suggestions": "預設提示詞建議",
-	"Default to 389 or 636 if TLS is enabled": "如果用了 TLS 則預設為 389 或 636",
+	"Default to 389 or 636 if TLS is enabled": "如果用了 TLS 則預設為 389 或 636",
 	"Default to ALL": "預設到所有",
 	"Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "預設使用分段檢索以提取聚焦且相關的內容,建議用於大多數情況。",
 	"Default User Role": "預設使用者角色",
@@ -366,12 +367,12 @@
 	"Enable API Key": "啟用 API 金鑰",
 	"Enable autocomplete generation for chat messages": "啟用聊天訊息的自動完成生成",
 	"Enable Code Execution": "啟用程式碼執行",
-	"Enable Code Interpreter": "啟用程式碼解釋器",
+	"Enable Code Interpreter": "啟用程式碼直譯器",
 	"Enable Community Sharing": "啟用社群分享",
 	"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.": "啟用記憶體鎖定(mlock)以防止模型資料被換出 RAM。此選項會將模型的工作頁面集鎖定在 RAM 中,確保它們不會被換出到磁碟。這可以透過避免頁面錯誤和確保快速資料存取來維持效能。",
-	"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.": "啟用記憶體映射(mmap)以載入模型資料。此選項允許系統使用磁碟儲存作為 RAM 的延伸,透過將磁碟檔案視為在 RAM 中來處理。這可以透過允許更快的資料存取來改善模型效能。然而,它可能無法在所有系統上正常運作,並且可能會消耗大量磁碟空間。",
+	"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.": "啟用記憶體配置圖(mmap)以載入模型資料。此選項允許系統使用磁碟儲存作為 RAM 的延伸,透過將磁碟檔案視為在 RAM 中來處理。這可以透過允許更快的資料存取來改善模型效能。然而,它可能無法在所有系統上正常運作,並且可能會消耗大量磁碟空間。",
 	"Enable Message Rating": "啟用訊息評分",
-	"Enable Mirostat sampling for controlling perplexity.": "啟用 Mirostat 樣以控制 perplexity。",
+	"Enable Mirostat sampling for controlling perplexity.": "啟用 Mirostat 樣以控制 perplexity。",
 	"Enable New Sign Ups": "允許新使用者註冊",
 	"Enabled": "已啟用",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "請確認您的 CSV 檔案包含以下 4 個欄位,並按照此順序排列:姓名、電子郵件、密碼、角色。",
@@ -434,11 +435,11 @@
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "請輸入您 WebUI 的公開 URL。此 URL 將用於在通知中產生連結。",
 	"Enter Tika Server URL": "輸入 Tika 伺服器 URL",
 	"Enter timeout in seconds": "請以秒為單位輸入超時時間",
-	"Enter to Send": "使用 Enter 送",
+	"Enter to Send": "使用 Enter 送",
 	"Enter Top K": "輸入 Top K 值",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "輸入 URL(例如:http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "輸入 URL(例如:http://localhost:11434)",
-	"Enter your current password": "輸入您的前密碼",
+	"Enter your current password": "輸入您的前密碼",
 	"Enter Your Email": "輸入您的電子郵件",
 	"Enter Your Full Name": "輸入您的全名",
 	"Enter your message": "輸入您的訊息",
@@ -482,7 +483,7 @@
 	"External Models": "外部模型",
 	"Failed to add file.": "新增檔案失敗。",
 	"Failed to create API Key.": "建立 API 金鑰失敗。",
-	"Failed to fetch models": "取模型失敗",
+	"Failed to fetch models": "取模型失敗",
 	"Failed to read clipboard contents": "讀取剪貼簿內容失敗",
 	"Failed to save models configuration": "儲存模型設定失敗",
 	"Failed to update settings": "更新設定失敗",
@@ -589,13 +590,13 @@
 	"Include": "包含",
 	"Include `--api-auth` flag when running stable-diffusion-webui": "執行 stable-diffusion-webui 時包含 `--api-auth` 參數",
 	"Include `--api` flag when running stable-diffusion-webui": "執行 stable-diffusion-webui 時包含 `--api` 參數",
-	"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.": "影響算法對生成文本回饋的反應速度。較低的學習率會導致調整速度較慢,而較高的學習率會使算法反應更靈敏。",
+	"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": "資訊",
 	"Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "將完整內容注入為上下文以進行全面處理,建議用於複雜查詢。",
 	"Input commands": "輸入命令",
 	"Install from Github URL": "從 GitHub URL 安裝",
 	"Instant Auto-Send After Voice Transcription": "語音轉錄後立即自動傳送",
-	"Integration": "集成",
+	"Integration": "整合",
 	"Interface": "介面",
 	"Invalid file format.": "無效檔案格式。",
 	"Invalid Tag": "無效標籤",
@@ -701,7 +702,7 @@
 	"Modelfile Content": "模型檔案內容",
 	"Models": "模型",
 	"Models Access": "模型存取",
-	"Models configuration saved successfully": "模型設定存成功",
+	"Models configuration saved successfully": "模型設定存成功",
 	"Mojeek Search API Key": "Mojeek 搜尋 API 金鑰",
 	"more": "更多",
 	"More": "更多",
@@ -764,7 +765,7 @@
 	"Open file": "開啟檔案",
 	"Open in full screen": "全螢幕開啟",
 	"Open new chat": "開啟新的對話",
-	"Open WebUI uses faster-whisper internally.": "Open WebUI 使用部 faster-whisper。",
+	"Open WebUI uses faster-whisper internally.": "Open WebUI 使用部 faster-whisper。",
 	"Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Open WebUI 使用 SpeechT5 和 CMU Arctic 說話者嵌入。",
 	"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open WebUI 版本 (v{{OPEN_WEBUI_VERSION}}) 低於所需版本 (v{{REQUIRED_VERSION}})",
 	"OpenAI": "OpenAI",
@@ -772,7 +773,7 @@
 	"OpenAI API Config": "OpenAI API 設定",
 	"OpenAI API Key is required.": "需要 OpenAI API 金鑰。",
 	"OpenAI API settings updated": "OpenAI API 設定已更新",
-	"OpenAI URL/Key required.": "需要 OpenAI URL或金鑰。",
+	"OpenAI URL/Key required.": "需要 OpenAI URL 或金鑰。",
 	"or": "或",
 	"Organize your users": "組織您的使用者",
 	"Other": "其他",
@@ -805,13 +806,13 @@
 	"Please do not close the settings page while loading the model.": "載入模型時,請勿關閉設定頁面。",
 	"Please enter a prompt": "請輸入提示詞",
 	"Please fill in all fields.": "請填寫所有欄位。",
-	"Please select a model first.": "請先選擇型。",
+	"Please select a model first.": "請先選擇型。",
 	"Please select a model.": "請選擇一個模型。",
 	"Please select a reason": "請選擇原因",
 	"Port": "連接埠",
 	"Positive attitude": "積極的態度",
-	"Prefix ID": "前 ID",
-	"Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "前綴 ID 用於透過為模型 ID 新增前綴以避免與其他連線衝突 - 留空以停用",
+	"Prefix ID": "前 ID",
+	"Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "前置 ID 用於透過為模型 ID 新增字首以避免與其他連線衝突 - 留空以停用",
 	"Presence Penalty": "在場懲罰",
 	"Previous 30 days": "過去 30 天",
 	"Previous 7 days": "過去 7 天",
@@ -859,13 +860,13 @@
 	"Reset All Models": "重設所有模型",
 	"Reset Upload Directory": "重設上傳目錄",
 	"Reset Vector Storage/Knowledge": "重設向量儲存或知識",
-	"Reset view": "重設視",
+	"Reset view": "重設視",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "無法啟用回應通知,因為網站權限已遭拒。請前往瀏覽器設定以授予必要存取權限。",
 	"Response splitting": "回應分割",
 	"Result": "結果",
 	"Retrieval": "檢索",
 	"Retrieval Query Generation": "檢索查詢生成",
-	"Rich Text Input for Chat": "使用富文輸入對話",
+	"Rich Text Input for Chat": "使用富文輸入對話",
 	"RK": "RK",
 	"Role": "角色",
 	"Rosé Pine": "玫瑰松",
@@ -914,7 +915,7 @@
 	"Select a pipeline url": "選擇管線 URL",
 	"Select a tool": "選擇工具",
 	"Select an auth method": "選擇驗證方式",
-	"Select an Ollama instance": "選擇一個 Ollama 實例",
+	"Select an Ollama instance": "選擇一個 Ollama 執行個體",
 	"Select Engine": "選擇引擎",
 	"Select Knowledge": "選擇知識庫",
 	"Select only one model to call": "僅選擇一個模型來呼叫",
@@ -949,8 +950,8 @@
 	"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.": "對至少出現過一次的 token 設定統一的偏差值。較高的值(例如 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.": "根據 token 出現的次數,設定一個縮放偏差值來懲罰重複。較高的值(例如 1.5)會更強烈地懲罰重複,而較低的值(例如 0.9)會更寬容。設為 0 時,此功能將停用。",
 	"Sets how far back for the model to look back to prevent repetition.": "設定模型回溯多遠以防止重複。",
-	"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.": "設定用於生成下一個 token 的上下文窗大小。",
+	"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.": "設定用於生成下一個 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.": "設定要使用的停止序列。當遇到此模式時,大型語言模型將停止生成文字並返回。可以在模型檔案中指定多個單獨的停止參數來設定多個停止模式。",
 	"Settings": "設定",
 	"Settings saved successfully!": "設定已成功儲存!",
@@ -977,7 +978,7 @@
 	"Speech-to-Text Engine": "語音轉文字 (STT) 引擎",
 	"Stop": "停止",
 	"Stop Sequence": "停止序列",
-	"Stream Chat Response": "流式對話回應",
+	"Stream Chat Response": "流式對話回應",
 	"STT Model": "語音轉文字 (STT) 模型",
 	"STT Settings": "語音轉文字 (STT) 設定",
 	"Subtitle (e.g. about the Roman Empire)": "副標題(例如:關於羅馬帝國)",
@@ -993,7 +994,7 @@
 	"Tags": "標籤",
 	"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.": "尾部自由樣用於減少輸出結果中較低機率 token 的影響。較高的值(例如 2.0)會減少更多影響,而值為 1.0 時會停用此設定。",
+	"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.": "尾部自由樣用於減少輸出結果中較低機率 token 的影響。較高的值(例如 2.0)會減少更多影響,而值為 1.0 時會停用此設定。",
 	"Talk to model": "與模型對話",
 	"Tap to interrupt": "點選以中斷",
 	"Tasks": "任務",
@@ -1008,11 +1009,11 @@
 	"Thanks for your feedback!": "感謝您的回饋!",
 	"The Application Account DN you bind with for search": "您綁定用於搜尋的應用程式帳號 DN",
 	"The base to search for users": "搜尋使用者的基礎",
-	"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "批次大小決定一次處理多少文請求。較高的批次大小可以提高模型的效能和速度,但也需要更多記憶體。",
+	"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "批次大小決定一次處理多少文請求。較高的批次大小可以提高模型的效能和速度,但也需要更多記憶體。",
 	"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "這個外掛背後的開發者是來自社群的熱情志願者。如果您覺得這個外掛很有幫助,請考慮為其開發做出貢獻。",
 	"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "評估排行榜基於 Elo 評分系統,並即時更新。",
-	"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 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.": "排行榜目前處於測試階段,我們可能會在改進演算法時調整評分計算方式。",
 	"The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "檔案大小上限(MB)。如果檔案大小超過此限制,檔案將不會被上傳。",
 	"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.": "對話中一次可使用的最大檔案數量。如果檔案數量超過此限制,檔案將不會被上傳。",
@@ -1021,10 +1022,10 @@
 	"Theme": "主題",
 	"Thinking...": "正在思考...",
 	"This action cannot be undone. Do you wish to continue?": "此操作無法復原。您確定要繼續進行嗎?",
-	"This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "此頻道建於 {{createdAt}}。這是 {{channelName}} 頻道的起點。",
+	"This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "此頻道建於 {{createdAt}}。這是 {{channelName}} 頻道的起點。",
 	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "這確保您寶貴的對話會安全地儲存到您的後端資料庫。謝謝!",
 	"This is an experimental feature, it may not function as expected and is subject to change at any time.": "這是一個實驗性功能,它可能無法如預期運作,並且可能會隨時變更。",
-	"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.": "此選項控制在刷新上下文時保留多少 token。例如,如果設定為 2,則會保留對話上下文的最後 2 個 token。保留上下文有助於保持對話的連貫性,但也可能降低對新主題的回應能力。",
+	"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.": "此選項控制在重新整理上下文時保留多少 token。例如,如果設定為 2,則會保留對話上下文的最後 2 個 token。保留上下文有助於保持對話的連貫性,但也可能降低對新主題的回應能力。",
 	"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.": "此選項設定模型在其回應中可以生成的最大 token 數量。增加此限制允許模型提供更長的答案,但也可能增加生成無用或不相關內容的可能性。",
 	"This option will delete all existing files in the collection and replace them with newly uploaded files.": "此選項將刪除集合中的所有現有檔案,並用新上傳的檔案取代它們。",
 	"This response was generated by \"{{model}}\"": "此回應由「{{model}}」生成",
@@ -1152,10 +1153,10 @@
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "WebUI 設定",
 	"WebUI URL": "WebUI URL",
-	"WebUI will make requests to \"{{url}}/api/chat\"": "WebUI 將向 \"{{url}}/api/chat\" 送請求",
-	"WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI 將向 \"{{url}}/chat/completions\" 送請求",
-	"What are you trying to achieve?": "您正在試圖完成什?",
-	"What are you working on?": "您現在的工作是什?",
+	"WebUI will make requests to \"{{url}}/api/chat\"": "WebUI 將向 \"{{url}}/api/chat\" 送請求",
+	"WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI 將向 \"{{url}}/chat/completions\" 送請求",
+	"What are you trying to achieve?": "您正在試圖完成什?",
+	"What are you working on?": "您現在的工作是什?",
 	"What’s New in": "新功能",
 	"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": "無論您在何處",
@@ -1163,14 +1164,14 @@
 	"Why?": "為什麼?",
 	"Widescreen Mode": "寬螢幕模式",
 	"Won": "獲勝",
-	"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.": "與 top-k 一起使用。較高的值(例如 0.95)將產生更多樣化的文本,而較低的值(例如 0.5)將生成更集中和保守的文本。",
+	"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.": "與 top-k 一起使用。較高的值(例如 0.95)將產生更多樣化的文字,而較低的值(例如 0.5)將生成更集中和保守的文字。",
 	"Workspace": "工作區",
 	"Workspace Permissions": "工作區權限",
 	"Write": "寫入",
 	"Write a prompt suggestion (e.g. Who are you?)": "撰寫提示詞建議(例如:你是誰?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "用 50 字寫一篇總結 [主題或關鍵字] 的摘要。",
-	"Write something...": "寫一些什...",
-	"Write your model template content here": "在此撰寫您的模型範本容",
+	"Write something...": "寫一些什...",
+	"Write your model template content here": "在此撰寫您的模型範本容",
 	"Yesterday": "昨天",
 	"You": "您",
 	"You are currently using a trial license. Please contact support to upgrade your license.": "您目前使用的是試用授權。請聯絡支援以升級您的授權。",

+ 1 - 1
src/lib/stores/index.ts

@@ -47,7 +47,7 @@ export const chatId = writable('');
 export const chatTitle = writable('');
 
 export const channels = writable([]);
-export const chats = writable([]);
+export const chats = writable(null);
 export const pinnedChats = writable([]);
 export const tags = writable([]);
 

+ 2 - 2
src/lib/utils/index.ts

@@ -63,8 +63,8 @@ export const replaceTokens = (content, sourceIds, char, user) => {
 
 		if (Array.isArray(sourceIds)) {
 			sourceIds.forEach((sourceId, idx) => {
-				const regex = new RegExp(`\\[${idx}\\]`, 'g');
-				segment = segment.replace(regex, `<source_id data="${idx}" title="${sourceId}" />`);
+				const regex = new RegExp(`\\[${idx + 1}\\]`, 'g');
+				segment = segment.replace(regex, `<source_id data="${idx + 1}" title="${sourceId}" />`);
 			});
 		}
 

+ 24 - 2
src/routes/+layout.svelte

@@ -203,6 +203,22 @@
 		};
 	};
 
+	const executeTool = async (data, cb) => {
+		console.log(data);
+		// TODO: MCP (SSE) support
+		// TODO: API Server support
+
+		if (cb) {
+			cb(
+				JSON.parse(
+					JSON.stringify({
+						result: null
+					})
+				)
+			);
+		}
+	};
+
 	const chatEventHandler = async (event, cb) => {
 		const chat = $page.url.pathname.includes(`/c/${event.chat_id}`);
 
@@ -256,6 +272,9 @@
 			if (type === 'execute:python') {
 				console.log('execute:python', data);
 				executePythonAsWorker(data.id, data.code, cb);
+			} else if (type === 'execute:tool') {
+				console.log('execute:tool', data);
+				executeTool(data, cb);
 			} else if (type === 'request:chat:completion') {
 				console.log(data, $socket.id);
 				const { session_id, channel, form_data, model } = data;
@@ -496,6 +515,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 +534,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}`);
 					}
 				}
 			}

+ 2 - 1
src/routes/auth/+page.svelte

@@ -140,7 +140,8 @@
 
 	onMount(async () => {
 		if ($user !== undefined) {
-			await goto('/');
+			const redirectPath = querystringValue('redirect') || '/';
+			goto(redirectPath);
 		}
 		await checkOauthCallback();