Răsfoiți Sursa

Merge pull request #10330 from open-webui/dev

0.5.15
Timothy Jaeryang Baek 2 luni în urmă
părinte
comite
9fdf2cd16c
96 a modificat fișierele cu 3683 adăugiri și 2141 ștergeri
  1. 19 0
      CHANGELOG.md
  2. 64 0
      backend/open_webui/config.py
  3. 21 1
      backend/open_webui/main.py
  4. 114 39
      backend/open_webui/retrieval/utils.py
  5. 370 29
      backend/open_webui/retrieval/web/utils.py
  6. 13 3
      backend/open_webui/routers/audio.py
  7. 2 1
      backend/open_webui/routers/auths.py
  8. 12 0
      backend/open_webui/routers/configs.py
  9. 16 9
      backend/open_webui/routers/files.py
  10. 64 0
      backend/open_webui/routers/images.py
  11. 15 2
      backend/open_webui/routers/ollama.py
  12. 9 0
      backend/open_webui/routers/retrieval.py
  13. 1 0
      backend/open_webui/routers/utils.py
  14. 76 0
      backend/open_webui/storage/provider.py
  15. 150 0
      backend/open_webui/test/apps/webui/storage/test_provider.py
  16. 75 61
      backend/open_webui/utils/middleware.py
  17. 47 7
      backend/open_webui/utils/oauth.py
  18. 77 49
      backend/open_webui/utils/payload.py
  19. 31 50
      backend/open_webui/utils/response.py
  20. 10 3
      backend/requirements.txt
  21. 11 0
      backend/start.sh
  22. 11 0
      backend/start_windows.bat
  23. 10 0
      docker-compose.playwright.yaml
  24. 12 2
      package-lock.json
  25. 2 1
      package.json
  26. 9 2
      pyproject.toml
  27. 9 0
      run-compose.sh
  28. 32 0
      scripts/prepare-pyodide.js
  29. 1 1
      src/app.css
  30. 107 67
      src/lib/components/admin/Settings/CodeExecution.svelte
  31. 18 1
      src/lib/components/admin/Settings/Documents.svelte
  32. 22 0
      src/lib/components/admin/Settings/Images.svelte
  33. 1 1
      src/lib/components/admin/Settings/Interface.svelte
  34. 2 1
      src/lib/components/admin/Users/UserList.svelte
  35. 1 1
      src/lib/components/chat/MessageInput.svelte
  36. 3 2
      src/lib/components/chat/Messages/Citations.svelte
  37. 109 12
      src/lib/components/chat/Messages/CodeBlock.svelte
  38. 5 0
      src/lib/components/chat/Messages/ContentRenderer.svelte
  39. 1 1
      src/lib/components/chat/Messages/Markdown/MarkdownInlineTokens.svelte
  40. 9 4
      src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte
  41. 14 11
      src/lib/components/chat/Messages/Markdown/Source.svelte
  42. 5 5
      src/lib/components/chat/Messages/ResponseMessage.svelte
  43. 25 6
      src/lib/components/common/FileItemModal.svelte
  44. 1 2
      src/lib/components/common/Modal.svelte
  45. 6 0
      src/lib/i18n/locales/ar-BH/translation.json
  46. 795 789
      src/lib/i18n/locales/bg-BG/translation.json
  47. 6 0
      src/lib/i18n/locales/bn-BD/translation.json
  48. 6 0
      src/lib/i18n/locales/ca-ES/translation.json
  49. 6 0
      src/lib/i18n/locales/ceb-PH/translation.json
  50. 6 0
      src/lib/i18n/locales/cs-CZ/translation.json
  51. 6 0
      src/lib/i18n/locales/da-DK/translation.json
  52. 6 0
      src/lib/i18n/locales/de-DE/translation.json
  53. 6 0
      src/lib/i18n/locales/dg-DG/translation.json
  54. 6 0
      src/lib/i18n/locales/el-GR/translation.json
  55. 6 0
      src/lib/i18n/locales/en-GB/translation.json
  56. 6 0
      src/lib/i18n/locales/en-US/translation.json
  57. 6 0
      src/lib/i18n/locales/es-ES/translation.json
  58. 6 0
      src/lib/i18n/locales/eu-ES/translation.json
  59. 6 0
      src/lib/i18n/locales/fa-IR/translation.json
  60. 6 0
      src/lib/i18n/locales/fi-FI/translation.json
  61. 6 0
      src/lib/i18n/locales/fr-CA/translation.json
  62. 6 0
      src/lib/i18n/locales/fr-FR/translation.json
  63. 6 0
      src/lib/i18n/locales/he-IL/translation.json
  64. 6 0
      src/lib/i18n/locales/hi-IN/translation.json
  65. 6 0
      src/lib/i18n/locales/hr-HR/translation.json
  66. 6 0
      src/lib/i18n/locales/hu-HU/translation.json
  67. 6 0
      src/lib/i18n/locales/id-ID/translation.json
  68. 6 0
      src/lib/i18n/locales/ie-GA/translation.json
  69. 6 0
      src/lib/i18n/locales/it-IT/translation.json
  70. 6 0
      src/lib/i18n/locales/ja-JP/translation.json
  71. 6 0
      src/lib/i18n/locales/ka-GE/translation.json
  72. 6 0
      src/lib/i18n/locales/ko-KR/translation.json
  73. 6 0
      src/lib/i18n/locales/lt-LT/translation.json
  74. 6 0
      src/lib/i18n/locales/ms-MY/translation.json
  75. 6 0
      src/lib/i18n/locales/nb-NO/translation.json
  76. 6 0
      src/lib/i18n/locales/nl-NL/translation.json
  77. 6 0
      src/lib/i18n/locales/pa-IN/translation.json
  78. 933 927
      src/lib/i18n/locales/pl-PL/translation.json
  79. 6 0
      src/lib/i18n/locales/pt-BR/translation.json
  80. 6 0
      src/lib/i18n/locales/pt-PT/translation.json
  81. 6 0
      src/lib/i18n/locales/ro-RO/translation.json
  82. 6 0
      src/lib/i18n/locales/ru-RU/translation.json
  83. 6 0
      src/lib/i18n/locales/sk-SK/translation.json
  84. 6 0
      src/lib/i18n/locales/sr-RS/translation.json
  85. 6 0
      src/lib/i18n/locales/sv-SE/translation.json
  86. 6 0
      src/lib/i18n/locales/th-TH/translation.json
  87. 6 0
      src/lib/i18n/locales/tk-TW/translation.json
  88. 6 0
      src/lib/i18n/locales/tr-TR/translation.json
  89. 6 0
      src/lib/i18n/locales/uk-UA/translation.json
  90. 6 0
      src/lib/i18n/locales/ur-PK/translation.json
  91. 6 0
      src/lib/i18n/locales/vi-VN/translation.json
  92. 36 30
      src/lib/i18n/locales/zh-CN/translation.json
  93. 26 20
      src/lib/i18n/locales/zh-TW/translation.json
  94. 6 0
      src/lib/utils/marked/katex-extension.ts
  95. 9 1
      src/routes/auth/+page.svelte
  96. 2 0
      src/tailwind.css

+ 19 - 0
CHANGELOG.md

@@ -5,6 +5,25 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
+## [0.5.15] - 2025-02-20
+
+### Added
+
+- **📄 Full Context Mode for Local Document Search (RAG)**: Toggle full context mode from Admin Settings > Documents to inject entire document content into context, improving accuracy for models with large context windows—ideal for deep context understanding.
+- **🌍 Smarter Web Search with Agentic Workflows**: Web searches now intelligently gather and refine multiple relevant terms, similar to RAG handling, delivering significantly better search results for more accurate information retrieval.
+- **🔎 Experimental Playwright Support for Web Loader**: Web content retrieval is taken to the next level with Playwright-powered scraping for enhanced accuracy in extracted web data.
+- **☁️ Experimental Azure Storage Provider**: Early-stage support for Azure Storage allows more cloud storage flexibility directly within Open WebUI.
+- **📊 Improved Jupyter Code Execution with Plots**: Interactive coding now properly displays inline plots, making data visualization more seamless inside chat interactions.
+- **⏳ Adjustable Execution Timeout for Jupyter Interpreter**: Customize execution timeout (default: 60s) for Jupyter-based code execution, allowing longer or more constrained execution based on your needs.
+- **▶️ "Running..." Indicator for Jupyter Code Execution**: A visual indicator now appears while code execution is in progress, providing real-time status updates on ongoing computations.
+- **⚙️ General Backend & Frontend Stability Enhancements**: Extensive refactoring improves reliability, performance, and overall user experience for a more seamless Open WebUI.
+- **🌍 Translation Updates**: Various international translation refinements ensure better localization and a more natural user interface experience.
+
+### Fixed
+
+- **📱 Mobile Hover Issue Resolved**: Users can now edit responses smoothly on mobile without interference, fixing a longstanding hover issue.
+- **🔄 Temporary Chat Message Duplication Fixed**: Eliminated buggy behavior where messages were being unnecessarily repeated in temporary chat mode, ensuring a smooth and consistent conversation flow.
+
 ## [0.5.14] - 2025-02-17
 
 ### Fixed

+ 64 - 0
backend/open_webui/config.py

@@ -684,6 +684,10 @@ GOOGLE_APPLICATION_CREDENTIALS_JSON = os.environ.get(
     "GOOGLE_APPLICATION_CREDENTIALS_JSON", None
 )
 
+AZURE_STORAGE_ENDPOINT = os.environ.get("AZURE_STORAGE_ENDPOINT", None)
+AZURE_STORAGE_CONTAINER_NAME = os.environ.get("AZURE_STORAGE_CONTAINER_NAME", None)
+AZURE_STORAGE_KEY = os.environ.get("AZURE_STORAGE_KEY", None)
+
 ####################################
 # File Upload DIR
 ####################################
@@ -783,6 +787,9 @@ ENABLE_OPENAI_API = PersistentConfig(
 OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY", "")
 OPENAI_API_BASE_URL = os.environ.get("OPENAI_API_BASE_URL", "")
 
+GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY", "")
+GEMINI_API_BASE_URL = os.environ.get("GEMINI_API_BASE_URL", "")
+
 
 if OPENAI_API_BASE_URL == "":
     OPENAI_API_BASE_URL = "https://api.openai.com/v1"
@@ -1395,6 +1402,11 @@ CODE_EXECUTION_JUPYTER_AUTH_PASSWORD = PersistentConfig(
     os.environ.get("CODE_EXECUTION_JUPYTER_AUTH_PASSWORD", ""),
 )
 
+CODE_EXECUTION_JUPYTER_TIMEOUT = PersistentConfig(
+    "CODE_EXECUTION_JUPYTER_TIMEOUT",
+    "code_execution.jupyter.timeout",
+    int(os.environ.get("CODE_EXECUTION_JUPYTER_TIMEOUT", "60")),
+)
 
 ENABLE_CODE_INTERPRETER = PersistentConfig(
     "ENABLE_CODE_INTERPRETER",
@@ -1450,6 +1462,17 @@ CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD = PersistentConfig(
     ),
 )
 
+CODE_INTERPRETER_JUPYTER_TIMEOUT = PersistentConfig(
+    "CODE_INTERPRETER_JUPYTER_TIMEOUT",
+    "code_interpreter.jupyter.timeout",
+    int(
+        os.environ.get(
+            "CODE_INTERPRETER_JUPYTER_TIMEOUT",
+            os.environ.get("CODE_EXECUTION_JUPYTER_TIMEOUT", "60"),
+        )
+    ),
+)
+
 
 DEFAULT_CODE_INTERPRETER_PROMPT = """
 #### Tools Available
@@ -1571,6 +1594,12 @@ ENABLE_RAG_HYBRID_SEARCH = PersistentConfig(
     os.environ.get("ENABLE_RAG_HYBRID_SEARCH", "").lower() == "true",
 )
 
+RAG_FULL_CONTEXT = PersistentConfig(
+    "RAG_FULL_CONTEXT",
+    "rag.full_context",
+    os.getenv("RAG_FULL_CONTEXT", "False").lower() == "true",
+)
+
 RAG_FILE_MAX_COUNT = PersistentConfig(
     "RAG_FILE_MAX_COUNT",
     "rag.file.max_count",
@@ -1919,12 +1948,36 @@ RAG_WEB_SEARCH_CONCURRENT_REQUESTS = PersistentConfig(
     int(os.getenv("RAG_WEB_SEARCH_CONCURRENT_REQUESTS", "10")),
 )
 
+RAG_WEB_LOADER_ENGINE = PersistentConfig(
+    "RAG_WEB_LOADER_ENGINE",
+    "rag.web.loader.engine",
+    os.environ.get("RAG_WEB_LOADER_ENGINE", "safe_web"),
+)
+
 RAG_WEB_SEARCH_TRUST_ENV = PersistentConfig(
     "RAG_WEB_SEARCH_TRUST_ENV",
     "rag.web.search.trust_env",
     os.getenv("RAG_WEB_SEARCH_TRUST_ENV", False),
 )
 
+PLAYWRIGHT_WS_URI = PersistentConfig(
+    "PLAYWRIGHT_WS_URI",
+    "rag.web.loader.engine.playwright.ws.uri",
+    os.environ.get("PLAYWRIGHT_WS_URI", None),
+)
+
+FIRECRAWL_API_KEY = PersistentConfig(
+    "FIRECRAWL_API_KEY",
+    "firecrawl.api_key",
+    os.environ.get("FIRECRAWL_API_KEY", ""),
+)
+
+FIRECRAWL_API_BASE_URL = PersistentConfig(
+    "FIRECRAWL_API_BASE_URL",
+    "firecrawl.api_url",
+    os.environ.get("FIRECRAWL_API_BASE_URL", "https://api.firecrawl.dev"),
+)
+
 ####################################
 # Images
 ####################################
@@ -2135,6 +2188,17 @@ IMAGES_OPENAI_API_KEY = PersistentConfig(
     os.getenv("IMAGES_OPENAI_API_KEY", OPENAI_API_KEY),
 )
 
+IMAGES_GEMINI_API_BASE_URL = PersistentConfig(
+    "IMAGES_GEMINI_API_BASE_URL",
+    "image_generation.gemini.api_base_url",
+    os.getenv("IMAGES_GEMINI_API_BASE_URL", GEMINI_API_BASE_URL),
+)
+IMAGES_GEMINI_API_KEY = PersistentConfig(
+    "IMAGES_GEMINI_API_KEY",
+    "image_generation.gemini.api_key",
+    os.getenv("IMAGES_GEMINI_API_KEY", GEMINI_API_KEY),
+)
+
 IMAGE_SIZE = PersistentConfig(
     "IMAGE_SIZE", "image_generation.size", os.getenv("IMAGE_SIZE", "512x512")
 )

+ 21 - 1
backend/open_webui/main.py

@@ -106,6 +106,7 @@ from open_webui.config import (
     CODE_EXECUTION_JUPYTER_AUTH,
     CODE_EXECUTION_JUPYTER_AUTH_TOKEN,
     CODE_EXECUTION_JUPYTER_AUTH_PASSWORD,
+    CODE_EXECUTION_JUPYTER_TIMEOUT,
     ENABLE_CODE_INTERPRETER,
     CODE_INTERPRETER_ENGINE,
     CODE_INTERPRETER_PROMPT_TEMPLATE,
@@ -113,6 +114,7 @@ from open_webui.config import (
     CODE_INTERPRETER_JUPYTER_AUTH,
     CODE_INTERPRETER_JUPYTER_AUTH_TOKEN,
     CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD,
+    CODE_INTERPRETER_JUPYTER_TIMEOUT,
     # Image
     AUTOMATIC1111_API_AUTH,
     AUTOMATIC1111_BASE_URL,
@@ -131,6 +133,8 @@ from open_webui.config import (
     IMAGE_STEPS,
     IMAGES_OPENAI_API_BASE_URL,
     IMAGES_OPENAI_API_KEY,
+    IMAGES_GEMINI_API_BASE_URL,
+    IMAGES_GEMINI_API_KEY,
     # Audio
     AUDIO_STT_ENGINE,
     AUDIO_STT_MODEL,
@@ -145,6 +149,10 @@ from open_webui.config import (
     AUDIO_TTS_VOICE,
     AUDIO_TTS_AZURE_SPEECH_REGION,
     AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT,
+    PLAYWRIGHT_WS_URI,
+    FIRECRAWL_API_BASE_URL,
+    FIRECRAWL_API_KEY,
+    RAG_WEB_LOADER_ENGINE,
     WHISPER_MODEL,
     DEEPGRAM_API_KEY,
     WHISPER_MODEL_AUTO_UPDATE,
@@ -152,6 +160,7 @@ from open_webui.config import (
     # Retrieval
     RAG_TEMPLATE,
     DEFAULT_RAG_TEMPLATE,
+    RAG_FULL_CONTEXT,
     RAG_EMBEDDING_MODEL,
     RAG_EMBEDDING_MODEL_AUTO_UPDATE,
     RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE,
@@ -515,6 +524,8 @@ 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
 
+
+app.state.config.RAG_FULL_CONTEXT = RAG_FULL_CONTEXT
 app.state.config.ENABLE_RAG_HYBRID_SEARCH = ENABLE_RAG_HYBRID_SEARCH
 app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION = (
     ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION
@@ -576,7 +587,11 @@ app.state.config.EXA_API_KEY = EXA_API_KEY
 
 app.state.config.RAG_WEB_SEARCH_RESULT_COUNT = RAG_WEB_SEARCH_RESULT_COUNT
 app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS = RAG_WEB_SEARCH_CONCURRENT_REQUESTS
+app.state.config.RAG_WEB_LOADER_ENGINE = RAG_WEB_LOADER_ENGINE
 app.state.config.RAG_WEB_SEARCH_TRUST_ENV = RAG_WEB_SEARCH_TRUST_ENV
+app.state.config.PLAYWRIGHT_WS_URI = PLAYWRIGHT_WS_URI
+app.state.config.FIRECRAWL_API_BASE_URL = FIRECRAWL_API_BASE_URL
+app.state.config.FIRECRAWL_API_KEY = FIRECRAWL_API_KEY
 
 app.state.EMBEDDING_FUNCTION = None
 app.state.ef = None
@@ -631,6 +646,7 @@ app.state.config.CODE_EXECUTION_JUPYTER_AUTH_TOKEN = CODE_EXECUTION_JUPYTER_AUTH
 app.state.config.CODE_EXECUTION_JUPYTER_AUTH_PASSWORD = (
     CODE_EXECUTION_JUPYTER_AUTH_PASSWORD
 )
+app.state.config.CODE_EXECUTION_JUPYTER_TIMEOUT = CODE_EXECUTION_JUPYTER_TIMEOUT
 
 app.state.config.ENABLE_CODE_INTERPRETER = ENABLE_CODE_INTERPRETER
 app.state.config.CODE_INTERPRETER_ENGINE = CODE_INTERPRETER_ENGINE
@@ -644,6 +660,7 @@ app.state.config.CODE_INTERPRETER_JUPYTER_AUTH_TOKEN = (
 app.state.config.CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD = (
     CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD
 )
+app.state.config.CODE_INTERPRETER_JUPYTER_TIMEOUT = CODE_INTERPRETER_JUPYTER_TIMEOUT
 
 ########################################
 #
@@ -658,6 +675,9 @@ app.state.config.ENABLE_IMAGE_PROMPT_GENERATION = ENABLE_IMAGE_PROMPT_GENERATION
 app.state.config.IMAGES_OPENAI_API_BASE_URL = IMAGES_OPENAI_API_BASE_URL
 app.state.config.IMAGES_OPENAI_API_KEY = IMAGES_OPENAI_API_KEY
 
+app.state.config.IMAGES_GEMINI_API_BASE_URL = IMAGES_GEMINI_API_BASE_URL
+app.state.config.IMAGES_GEMINI_API_KEY = IMAGES_GEMINI_API_KEY
+
 app.state.config.IMAGE_GENERATION_MODEL = IMAGE_GENERATION_MODEL
 
 app.state.config.AUTOMATIC1111_BASE_URL = AUTOMATIC1111_BASE_URL
@@ -967,7 +987,7 @@ async def chat_completion(
             "files": form_data.get("files", None),
             "features": form_data.get("features", None),
             "variables": form_data.get("variables", None),
-            "model": model_info,
+            "model": model_info.model_dump() if model_info else model,
             "direct": model_item.get("direct", False),
             **(
                 {"function_calling": "native"}

+ 114 - 39
backend/open_webui/retrieval/utils.py

@@ -84,6 +84,19 @@ def query_doc(
         raise e
 
 
+def get_doc(collection_name: str, user: UserModel = None):
+    try:
+        result = VECTOR_DB_CLIENT.get(collection_name=collection_name)
+
+        if result:
+            log.info(f"query_doc:result {result.ids} {result.metadatas}")
+
+        return result
+    except Exception as e:
+        print(e)
+        raise e
+
+
 def query_doc_with_hybrid_search(
     collection_name: str,
     query: str,
@@ -137,6 +150,27 @@ def query_doc_with_hybrid_search(
         raise e
 
 
+def merge_get_results(get_results: list[dict]) -> dict:
+    # Initialize lists to store combined data
+    combined_documents = []
+    combined_metadatas = []
+    combined_ids = []
+
+    for data in get_results:
+        combined_documents.extend(data["documents"][0])
+        combined_metadatas.extend(data["metadatas"][0])
+        combined_ids.extend(data["ids"][0])
+
+    # Create the output dictionary
+    result = {
+        "documents": [combined_documents],
+        "metadatas": [combined_metadatas],
+        "ids": [combined_ids],
+    }
+
+    return result
+
+
 def merge_and_sort_query_results(
     query_results: list[dict], k: int, reverse: bool = False
 ) -> list[dict]:
@@ -144,31 +178,45 @@ def merge_and_sort_query_results(
     combined_distances = []
     combined_documents = []
     combined_metadatas = []
+    combined_ids = []
 
     for data in query_results:
         combined_distances.extend(data["distances"][0])
         combined_documents.extend(data["documents"][0])
         combined_metadatas.extend(data["metadatas"][0])
+        # DISTINCT(chunk_id,file_id) - in case if id (chunk_ids) become ordinals
+        combined_ids.extend(
+            [
+                f"{id}-{meta['file_id']}"
+                for id, meta in zip(data["ids"][0], data["metadatas"][0])
+            ]
+        )
 
-    # Create a list of tuples (distance, document, metadata)
-    combined = list(zip(combined_distances, combined_documents, combined_metadatas))
+    # Create a list of tuples (distance, document, metadata, ids)
+    combined = list(
+        zip(combined_distances, combined_documents, combined_metadatas, combined_ids)
+    )
 
     # Sort the list based on distances
     combined.sort(key=lambda x: x[0], reverse=reverse)
 
-    # We don't have anything :-(
-    if not combined:
-        sorted_distances = []
-        sorted_documents = []
-        sorted_metadatas = []
-    else:
+    sorted_distances = []
+    sorted_documents = []
+    sorted_metadatas = []
+    # Otherwise we don't have anything :-(
+    if combined:
         # Unzip the sorted list
-        sorted_distances, sorted_documents, sorted_metadatas = zip(*combined)
-
+        all_distances, all_documents, all_metadatas, all_ids = zip(*combined)
+        seen_ids = set()
         # Slicing the lists to include only k elements
-        sorted_distances = list(sorted_distances)[:k]
-        sorted_documents = list(sorted_documents)[:k]
-        sorted_metadatas = list(sorted_metadatas)[:k]
+        for index, id in enumerate(all_ids):
+            if id not in seen_ids:
+                sorted_distances.append(all_distances[index])
+                sorted_documents.append(all_documents[index])
+                sorted_metadatas.append(all_metadatas[index])
+                seen_ids.add(id)
+                if len(sorted_distances) >= k:
+                    break
 
     # Create the output dictionary
     result = {
@@ -180,6 +228,23 @@ def merge_and_sort_query_results(
     return result
 
 
+def get_all_items_from_collections(collection_names: list[str]) -> dict:
+    results = []
+
+    for collection_name in collection_names:
+        if collection_name:
+            try:
+                result = get_doc(collection_name=collection_name)
+                if result is not None:
+                    results.append(result.model_dump())
+            except Exception as e:
+                log.exception(f"Error when querying the collection: {e}")
+        else:
+            pass
+
+    return merge_get_results(results)
+
+
 def query_collection(
     collection_names: list[str],
     queries: list[str],
@@ -297,8 +362,11 @@ def get_sources_from_files(
     reranking_function,
     r,
     hybrid_search,
+    full_context=False,
 ):
-    log.debug(f"files: {files} {queries} {embedding_function} {reranking_function}")
+    log.debug(
+        f"files: {files} {queries} {embedding_function} {reranking_function} {full_context}"
+    )
 
     extracted_collections = []
     relevant_contexts = []
@@ -336,36 +404,43 @@ def get_sources_from_files(
                 log.debug(f"skipping {file} as it has already been extracted")
                 continue
 
-            try:
-                context = None
-                if file.get("type") == "text":
-                    context = file["content"]
-                else:
-                    if hybrid_search:
-                        try:
-                            context = query_collection_with_hybrid_search(
+            if full_context:
+                try:
+                    context = get_all_items_from_collections(collection_names)
+                except Exception as e:
+                    log.exception(e)
+
+            else:
+                try:
+                    context = None
+                    if file.get("type") == "text":
+                        context = file["content"]
+                    else:
+                        if hybrid_search:
+                            try:
+                                context = query_collection_with_hybrid_search(
+                                    collection_names=collection_names,
+                                    queries=queries,
+                                    embedding_function=embedding_function,
+                                    k=k,
+                                    reranking_function=reranking_function,
+                                    r=r,
+                                )
+                            except Exception as e:
+                                log.debug(
+                                    "Error when using hybrid search, using"
+                                    " non hybrid search as fallback."
+                                )
+
+                        if (not hybrid_search) or (context is None):
+                            context = query_collection(
                                 collection_names=collection_names,
                                 queries=queries,
                                 embedding_function=embedding_function,
                                 k=k,
-                                reranking_function=reranking_function,
-                                r=r,
-                            )
-                        except Exception as e:
-                            log.debug(
-                                "Error when using hybrid search, using"
-                                " non hybrid search as fallback."
                             )
-
-                    if (not hybrid_search) or (context is None):
-                        context = query_collection(
-                            collection_names=collection_names,
-                            queries=queries,
-                            embedding_function=embedding_function,
-                            k=k,
-                        )
-            except Exception as e:
-                log.exception(e)
+                except Exception as e:
+                    log.exception(e)
 
             extracted_collections.extend(collection_names)
 

+ 370 - 29
backend/open_webui/retrieval/web/utils.py

@@ -1,23 +1,39 @@
-import socket
-import aiohttp
 import asyncio
+import logging
+import socket
+import ssl
 import urllib.parse
-import validators
-from typing import Any, AsyncIterator, Dict, Iterator, List, Sequence, Union
-
-
-from langchain_community.document_loaders import (
-    WebBaseLoader,
+import urllib.request
+from collections import defaultdict
+from datetime import datetime, time, timedelta
+from typing import (
+    Any,
+    AsyncIterator,
+    Dict,
+    Iterator,
+    List,
+    Optional,
+    Sequence,
+    Union,
+    Literal,
 )
+import aiohttp
+import certifi
+import validators
+from langchain_community.document_loaders import PlaywrightURLLoader, WebBaseLoader
+from langchain_community.document_loaders.firecrawl import FireCrawlLoader
+from langchain_community.document_loaders.base import BaseLoader
 from langchain_core.documents import Document
-
-
 from open_webui.constants import ERROR_MESSAGES
-from open_webui.config import ENABLE_RAG_LOCAL_WEB_FETCH
+from open_webui.config import (
+    ENABLE_RAG_LOCAL_WEB_FETCH,
+    PLAYWRIGHT_WS_URI,
+    RAG_WEB_LOADER_ENGINE,
+    FIRECRAWL_API_BASE_URL,
+    FIRECRAWL_API_KEY,
+)
 from open_webui.env import SRC_LOG_LEVELS
 
-import logging
-
 log = logging.getLogger(__name__)
 log.setLevel(SRC_LOG_LEVELS["RAG"])
 
@@ -68,6 +84,314 @@ def resolve_hostname(hostname):
     return ipv4_addresses, ipv6_addresses
 
 
+def extract_metadata(soup, url):
+    metadata = {"source": url}
+    if title := soup.find("title"):
+        metadata["title"] = title.get_text()
+    if description := soup.find("meta", attrs={"name": "description"}):
+        metadata["description"] = description.get("content", "No description found.")
+    if html := soup.find("html"):
+        metadata["language"] = html.get("lang", "No language found.")
+    return metadata
+
+
+def verify_ssl_cert(url: str) -> bool:
+    """Verify SSL certificate for the given URL."""
+    if not url.startswith("https://"):
+        return True
+
+    try:
+        hostname = url.split("://")[-1].split("/")[0]
+        context = ssl.create_default_context(cafile=certifi.where())
+        with context.wrap_socket(ssl.socket(), server_hostname=hostname) as s:
+            s.connect((hostname, 443))
+        return True
+    except ssl.SSLError:
+        return False
+    except Exception as e:
+        log.warning(f"SSL verification failed for {url}: {str(e)}")
+        return False
+
+
+class SafeFireCrawlLoader(BaseLoader):
+    def __init__(
+        self,
+        web_paths,
+        verify_ssl: bool = True,
+        trust_env: bool = False,
+        requests_per_second: Optional[float] = None,
+        continue_on_failure: bool = True,
+        api_key: Optional[str] = None,
+        api_url: Optional[str] = None,
+        mode: Literal["crawl", "scrape", "map"] = "crawl",
+        proxy: Optional[Dict[str, str]] = None,
+        params: Optional[Dict] = None,
+    ):
+        """Concurrent document loader for FireCrawl operations.
+
+        Executes multiple FireCrawlLoader instances concurrently using thread pooling
+        to improve bulk processing efficiency.
+        Args:
+            web_paths: List of URLs/paths to process.
+            verify_ssl: If True, verify SSL certificates.
+            trust_env: If True, use proxy settings from environment variables.
+            requests_per_second: Number of requests per second to limit to.
+            continue_on_failure (bool): If True, continue loading other URLs on failure.
+            api_key: API key for FireCrawl service. Defaults to None
+                (uses FIRE_CRAWL_API_KEY environment variable if not provided).
+            api_url: Base URL for FireCrawl API. Defaults to official API endpoint.
+            mode: Operation mode selection:
+                - 'crawl': Website crawling mode (default)
+                - 'scrape': Direct page scraping
+                - 'map': Site map generation
+            proxy: Proxy override settings for the FireCrawl API.
+            params: The parameters to pass to the Firecrawl API.
+                Examples include crawlerOptions.
+                For more details, visit: https://github.com/mendableai/firecrawl-py
+        """
+        proxy_server = proxy.get("server") if proxy else None
+        if trust_env and not proxy_server:
+            env_proxies = urllib.request.getproxies()
+            env_proxy_server = env_proxies.get("https") or env_proxies.get("http")
+            if env_proxy_server:
+                if proxy:
+                    proxy["server"] = env_proxy_server
+                else:
+                    proxy = {"server": env_proxy_server}
+        self.web_paths = web_paths
+        self.verify_ssl = verify_ssl
+        self.requests_per_second = requests_per_second
+        self.last_request_time = None
+        self.trust_env = trust_env
+        self.continue_on_failure = continue_on_failure
+        self.api_key = api_key
+        self.api_url = api_url
+        self.mode = mode
+        self.params = params
+
+    def lazy_load(self) -> Iterator[Document]:
+        """Load documents concurrently using FireCrawl."""
+        for url in self.web_paths:
+            try:
+                self._safe_process_url_sync(url)
+                loader = FireCrawlLoader(
+                    url=url,
+                    api_key=self.api_key,
+                    api_url=self.api_url,
+                    mode=self.mode,
+                    params=self.params,
+                )
+                yield from loader.lazy_load()
+            except Exception as e:
+                if self.continue_on_failure:
+                    log.exception(e, "Error loading %s", url)
+                    continue
+                raise e
+
+    async def alazy_load(self):
+        """Async version of lazy_load."""
+        for url in self.web_paths:
+            try:
+                await self._safe_process_url(url)
+                loader = FireCrawlLoader(
+                    url=url,
+                    api_key=self.api_key,
+                    api_url=self.api_url,
+                    mode=self.mode,
+                    params=self.params,
+                )
+                async for document in loader.alazy_load():
+                    yield document
+            except Exception as e:
+                if self.continue_on_failure:
+                    log.exception(e, "Error loading %s", url)
+                    continue
+                raise e
+
+    def _verify_ssl_cert(self, url: str) -> bool:
+        return verify_ssl_cert(url)
+
+    async def _wait_for_rate_limit(self):
+        """Wait to respect the rate limit if specified."""
+        if self.requests_per_second and self.last_request_time:
+            min_interval = timedelta(seconds=1.0 / self.requests_per_second)
+            time_since_last = datetime.now() - self.last_request_time
+            if time_since_last < min_interval:
+                await asyncio.sleep((min_interval - time_since_last).total_seconds())
+        self.last_request_time = datetime.now()
+
+    def _sync_wait_for_rate_limit(self):
+        """Synchronous version of rate limit wait."""
+        if self.requests_per_second and self.last_request_time:
+            min_interval = timedelta(seconds=1.0 / self.requests_per_second)
+            time_since_last = datetime.now() - self.last_request_time
+            if time_since_last < min_interval:
+                time.sleep((min_interval - time_since_last).total_seconds())
+        self.last_request_time = datetime.now()
+
+    async def _safe_process_url(self, url: str) -> bool:
+        """Perform safety checks before processing a URL."""
+        if self.verify_ssl and not self._verify_ssl_cert(url):
+            raise ValueError(f"SSL certificate verification failed for {url}")
+        await self._wait_for_rate_limit()
+        return True
+
+    def _safe_process_url_sync(self, url: str) -> bool:
+        """Synchronous version of safety checks."""
+        if self.verify_ssl and not self._verify_ssl_cert(url):
+            raise ValueError(f"SSL certificate verification failed for {url}")
+        self._sync_wait_for_rate_limit()
+        return True
+
+
+class SafePlaywrightURLLoader(PlaywrightURLLoader):
+    """Load HTML pages safely with Playwright, supporting SSL verification, rate limiting, and remote browser connection.
+
+    Attributes:
+        web_paths (List[str]): List of URLs to load.
+        verify_ssl (bool): If True, verify SSL certificates.
+        trust_env (bool): If True, use proxy settings from environment variables.
+        requests_per_second (Optional[float]): Number of requests per second to limit to.
+        continue_on_failure (bool): If True, continue loading other URLs on failure.
+        headless (bool): If True, the browser will run in headless mode.
+        proxy (dict): Proxy override settings for the Playwright session.
+        playwright_ws_url (Optional[str]): WebSocket endpoint URI for remote browser connection.
+    """
+
+    def __init__(
+        self,
+        web_paths: List[str],
+        verify_ssl: bool = True,
+        trust_env: bool = False,
+        requests_per_second: Optional[float] = None,
+        continue_on_failure: bool = True,
+        headless: bool = True,
+        remove_selectors: Optional[List[str]] = None,
+        proxy: Optional[Dict[str, str]] = None,
+        playwright_ws_url: Optional[str] = None,
+    ):
+        """Initialize with additional safety parameters and remote browser support."""
+
+        proxy_server = proxy.get("server") if proxy else None
+        if trust_env and not proxy_server:
+            env_proxies = urllib.request.getproxies()
+            env_proxy_server = env_proxies.get("https") or env_proxies.get("http")
+            if env_proxy_server:
+                if proxy:
+                    proxy["server"] = env_proxy_server
+                else:
+                    proxy = {"server": env_proxy_server}
+
+        # We'll set headless to False if using playwright_ws_url since it's handled by the remote browser
+        super().__init__(
+            urls=web_paths,
+            continue_on_failure=continue_on_failure,
+            headless=headless if playwright_ws_url is None else False,
+            remove_selectors=remove_selectors,
+            proxy=proxy,
+        )
+        self.verify_ssl = verify_ssl
+        self.requests_per_second = requests_per_second
+        self.last_request_time = None
+        self.playwright_ws_url = playwright_ws_url
+        self.trust_env = trust_env
+
+    def lazy_load(self) -> Iterator[Document]:
+        """Safely load URLs synchronously with support for remote browser."""
+        from playwright.sync_api import sync_playwright
+
+        with sync_playwright() as p:
+            # Use remote browser if ws_endpoint is provided, otherwise use local browser
+            if self.playwright_ws_url:
+                browser = p.chromium.connect(self.playwright_ws_url)
+            else:
+                browser = p.chromium.launch(headless=self.headless, proxy=self.proxy)
+
+            for url in self.urls:
+                try:
+                    self._safe_process_url_sync(url)
+                    page = browser.new_page()
+                    response = page.goto(url)
+                    if response is None:
+                        raise ValueError(f"page.goto() returned None for url {url}")
+
+                    text = self.evaluator.evaluate(page, browser, response)
+                    metadata = {"source": url}
+                    yield Document(page_content=text, metadata=metadata)
+                except Exception as e:
+                    if self.continue_on_failure:
+                        log.exception(e, "Error loading %s", url)
+                        continue
+                    raise e
+            browser.close()
+
+    async def alazy_load(self) -> AsyncIterator[Document]:
+        """Safely load URLs asynchronously with support for remote browser."""
+        from playwright.async_api import async_playwright
+
+        async with async_playwright() as p:
+            # Use remote browser if ws_endpoint is provided, otherwise use local browser
+            if self.playwright_ws_url:
+                browser = await p.chromium.connect(self.playwright_ws_url)
+            else:
+                browser = await p.chromium.launch(
+                    headless=self.headless, proxy=self.proxy
+                )
+
+            for url in self.urls:
+                try:
+                    await self._safe_process_url(url)
+                    page = await browser.new_page()
+                    response = await page.goto(url)
+                    if response is None:
+                        raise ValueError(f"page.goto() returned None for url {url}")
+
+                    text = await self.evaluator.evaluate_async(page, browser, response)
+                    metadata = {"source": url}
+                    yield Document(page_content=text, metadata=metadata)
+                except Exception as e:
+                    if self.continue_on_failure:
+                        log.exception(e, "Error loading %s", url)
+                        continue
+                    raise e
+            await browser.close()
+
+    def _verify_ssl_cert(self, url: str) -> bool:
+        return verify_ssl_cert(url)
+
+    async def _wait_for_rate_limit(self):
+        """Wait to respect the rate limit if specified."""
+        if self.requests_per_second and self.last_request_time:
+            min_interval = timedelta(seconds=1.0 / self.requests_per_second)
+            time_since_last = datetime.now() - self.last_request_time
+            if time_since_last < min_interval:
+                await asyncio.sleep((min_interval - time_since_last).total_seconds())
+        self.last_request_time = datetime.now()
+
+    def _sync_wait_for_rate_limit(self):
+        """Synchronous version of rate limit wait."""
+        if self.requests_per_second and self.last_request_time:
+            min_interval = timedelta(seconds=1.0 / self.requests_per_second)
+            time_since_last = datetime.now() - self.last_request_time
+            if time_since_last < min_interval:
+                time.sleep((min_interval - time_since_last).total_seconds())
+        self.last_request_time = datetime.now()
+
+    async def _safe_process_url(self, url: str) -> bool:
+        """Perform safety checks before processing a URL."""
+        if self.verify_ssl and not self._verify_ssl_cert(url):
+            raise ValueError(f"SSL certificate verification failed for {url}")
+        await self._wait_for_rate_limit()
+        return True
+
+    def _safe_process_url_sync(self, url: str) -> bool:
+        """Synchronous version of safety checks."""
+        if self.verify_ssl and not self._verify_ssl_cert(url):
+            raise ValueError(f"SSL certificate verification failed for {url}")
+        self._sync_wait_for_rate_limit()
+        return True
+
+
 class SafeWebBaseLoader(WebBaseLoader):
     """WebBaseLoader with enhanced error handling for URLs."""
 
@@ -143,20 +467,12 @@ class SafeWebBaseLoader(WebBaseLoader):
                 text = soup.get_text(**self.bs_get_text_kwargs)
 
                 # Build metadata
-                metadata = {"source": path}
-                if title := soup.find("title"):
-                    metadata["title"] = title.get_text()
-                if description := soup.find("meta", attrs={"name": "description"}):
-                    metadata["description"] = description.get(
-                        "content", "No description found."
-                    )
-                if html := soup.find("html"):
-                    metadata["language"] = html.get("lang", "No language found.")
+                metadata = extract_metadata(soup, path)
 
                 yield Document(page_content=text, metadata=metadata)
             except Exception as e:
                 # Log the error and continue with the next URL
-                log.error(f"Error loading {path}: {e}")
+                log.exception(e, "Error loading %s", path)
 
     async def alazy_load(self) -> AsyncIterator[Document]:
         """Async lazy load text from the url(s) in web_path."""
@@ -179,6 +495,12 @@ class SafeWebBaseLoader(WebBaseLoader):
         return [document async for document in self.alazy_load()]
 
 
+RAG_WEB_LOADER_ENGINES = defaultdict(lambda: SafeWebBaseLoader)
+RAG_WEB_LOADER_ENGINES["playwright"] = SafePlaywrightURLLoader
+RAG_WEB_LOADER_ENGINES["safe_web"] = SafeWebBaseLoader
+RAG_WEB_LOADER_ENGINES["firecrawl"] = SafeFireCrawlLoader
+
+
 def get_web_loader(
     urls: Union[str, Sequence[str]],
     verify_ssl: bool = True,
@@ -188,10 +510,29 @@ def get_web_loader(
     # Check if the URLs are valid
     safe_urls = safe_validate_urls([urls] if isinstance(urls, str) else urls)
 
-    return SafeWebBaseLoader(
-        web_path=safe_urls,
-        verify_ssl=verify_ssl,
-        requests_per_second=requests_per_second,
-        continue_on_failure=True,
-        trust_env=trust_env,
+    web_loader_args = {
+        "web_paths": safe_urls,
+        "verify_ssl": verify_ssl,
+        "requests_per_second": requests_per_second,
+        "continue_on_failure": True,
+        "trust_env": trust_env,
+    }
+
+    if PLAYWRIGHT_WS_URI.value:
+        web_loader_args["playwright_ws_url"] = PLAYWRIGHT_WS_URI.value
+
+    if RAG_WEB_LOADER_ENGINE.value == "firecrawl":
+        web_loader_args["api_key"] = FIRECRAWL_API_KEY.value
+        web_loader_args["api_url"] = FIRECRAWL_API_BASE_URL.value
+
+    # Create the appropriate WebLoader based on the configuration
+    WebLoaderClass = RAG_WEB_LOADER_ENGINES[RAG_WEB_LOADER_ENGINE.value]
+    web_loader = WebLoaderClass(**web_loader_args)
+
+    log.debug(
+        "Using RAG_WEB_LOADER_ENGINE %s for %s URLs",
+        web_loader.__class__.__name__,
+        len(safe_urls),
     )
+
+    return web_loader

+ 13 - 3
backend/open_webui/routers/audio.py

@@ -37,6 +37,7 @@ from open_webui.config import (
 
 from open_webui.constants import ERROR_MESSAGES
 from open_webui.env import (
+    AIOHTTP_CLIENT_TIMEOUT,
     ENV,
     SRC_LOG_LEVELS,
     DEVICE_TYPE,
@@ -266,7 +267,10 @@ async def speech(request: Request, user=Depends(get_verified_user)):
 
         try:
             # print(payload)
-            async with aiohttp.ClientSession() as session:
+            timeout = aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT)
+            async with aiohttp.ClientSession(
+                timeout=timeout, trust_env=True
+            ) as session:
                 async with session.post(
                     url=f"{request.app.state.config.TTS_OPENAI_API_BASE_URL}/audio/speech",
                     json=payload,
@@ -323,7 +327,10 @@ async def speech(request: Request, user=Depends(get_verified_user)):
             )
 
         try:
-            async with aiohttp.ClientSession() as session:
+            timeout = aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT)
+            async with aiohttp.ClientSession(
+                timeout=timeout, trust_env=True
+            ) as session:
                 async with session.post(
                     f"https://api.elevenlabs.io/v1/text-to-speech/{voice_id}",
                     json={
@@ -380,7 +387,10 @@ async def speech(request: Request, user=Depends(get_verified_user)):
             data = f"""<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="{locale}">
                 <voice name="{language}">{payload["input"]}</voice>
             </speak>"""
-            async with aiohttp.ClientSession() as session:
+            timeout = aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT)
+            async with aiohttp.ClientSession(
+                timeout=timeout, trust_env=True
+            ) as session:
                 async with session.post(
                     f"https://{region}.tts.speech.microsoft.com/cognitiveservices/v1",
                     headers={

+ 2 - 1
backend/open_webui/routers/auths.py

@@ -546,7 +546,8 @@ async def signout(request: Request, response: Response):
                             if logout_url:
                                 response.delete_cookie("oauth_id_token")
                                 return RedirectResponse(
-                                    url=f"{logout_url}?id_token_hint={oauth_id_token}"
+                                    headers=response.headers,
+                                    url=f"{logout_url}?id_token_hint={oauth_id_token}",
                                 )
                         else:
                             raise HTTPException(

+ 12 - 0
backend/open_webui/routers/configs.py

@@ -75,6 +75,7 @@ class CodeInterpreterConfigForm(BaseModel):
     CODE_EXECUTION_JUPYTER_AUTH: Optional[str]
     CODE_EXECUTION_JUPYTER_AUTH_TOKEN: Optional[str]
     CODE_EXECUTION_JUPYTER_AUTH_PASSWORD: Optional[str]
+    CODE_EXECUTION_JUPYTER_TIMEOUT: Optional[int]
     ENABLE_CODE_INTERPRETER: bool
     CODE_INTERPRETER_ENGINE: str
     CODE_INTERPRETER_PROMPT_TEMPLATE: Optional[str]
@@ -82,6 +83,7 @@ class CodeInterpreterConfigForm(BaseModel):
     CODE_INTERPRETER_JUPYTER_AUTH: Optional[str]
     CODE_INTERPRETER_JUPYTER_AUTH_TOKEN: Optional[str]
     CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD: Optional[str]
+    CODE_INTERPRETER_JUPYTER_TIMEOUT: Optional[int]
 
 
 @router.get("/code_execution", response_model=CodeInterpreterConfigForm)
@@ -92,6 +94,7 @@ async def get_code_execution_config(request: Request, user=Depends(get_admin_use
         "CODE_EXECUTION_JUPYTER_AUTH": request.app.state.config.CODE_EXECUTION_JUPYTER_AUTH,
         "CODE_EXECUTION_JUPYTER_AUTH_TOKEN": request.app.state.config.CODE_EXECUTION_JUPYTER_AUTH_TOKEN,
         "CODE_EXECUTION_JUPYTER_AUTH_PASSWORD": request.app.state.config.CODE_EXECUTION_JUPYTER_AUTH_PASSWORD,
+        "CODE_EXECUTION_JUPYTER_TIMEOUT": request.app.state.config.CODE_EXECUTION_JUPYTER_TIMEOUT,
         "ENABLE_CODE_INTERPRETER": request.app.state.config.ENABLE_CODE_INTERPRETER,
         "CODE_INTERPRETER_ENGINE": request.app.state.config.CODE_INTERPRETER_ENGINE,
         "CODE_INTERPRETER_PROMPT_TEMPLATE": request.app.state.config.CODE_INTERPRETER_PROMPT_TEMPLATE,
@@ -99,6 +102,7 @@ async def get_code_execution_config(request: Request, user=Depends(get_admin_use
         "CODE_INTERPRETER_JUPYTER_AUTH": request.app.state.config.CODE_INTERPRETER_JUPYTER_AUTH,
         "CODE_INTERPRETER_JUPYTER_AUTH_TOKEN": request.app.state.config.CODE_INTERPRETER_JUPYTER_AUTH_TOKEN,
         "CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD": request.app.state.config.CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD,
+        "CODE_INTERPRETER_JUPYTER_TIMEOUT": request.app.state.config.CODE_INTERPRETER_JUPYTER_TIMEOUT,
     }
 
 
@@ -120,6 +124,9 @@ async def set_code_execution_config(
     request.app.state.config.CODE_EXECUTION_JUPYTER_AUTH_PASSWORD = (
         form_data.CODE_EXECUTION_JUPYTER_AUTH_PASSWORD
     )
+    request.app.state.config.CODE_EXECUTION_JUPYTER_TIMEOUT = (
+        form_data.CODE_EXECUTION_JUPYTER_TIMEOUT
+    )
 
     request.app.state.config.ENABLE_CODE_INTERPRETER = form_data.ENABLE_CODE_INTERPRETER
     request.app.state.config.CODE_INTERPRETER_ENGINE = form_data.CODE_INTERPRETER_ENGINE
@@ -141,6 +148,9 @@ async def set_code_execution_config(
     request.app.state.config.CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD = (
         form_data.CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD
     )
+    request.app.state.config.CODE_INTERPRETER_JUPYTER_TIMEOUT = (
+        form_data.CODE_INTERPRETER_JUPYTER_TIMEOUT
+    )
 
     return {
         "CODE_EXECUTION_ENGINE": request.app.state.config.CODE_EXECUTION_ENGINE,
@@ -148,6 +158,7 @@ async def set_code_execution_config(
         "CODE_EXECUTION_JUPYTER_AUTH": request.app.state.config.CODE_EXECUTION_JUPYTER_AUTH,
         "CODE_EXECUTION_JUPYTER_AUTH_TOKEN": request.app.state.config.CODE_EXECUTION_JUPYTER_AUTH_TOKEN,
         "CODE_EXECUTION_JUPYTER_AUTH_PASSWORD": request.app.state.config.CODE_EXECUTION_JUPYTER_AUTH_PASSWORD,
+        "CODE_EXECUTION_JUPYTER_TIMEOUT": request.app.state.config.CODE_EXECUTION_JUPYTER_TIMEOUT,
         "ENABLE_CODE_INTERPRETER": request.app.state.config.ENABLE_CODE_INTERPRETER,
         "CODE_INTERPRETER_ENGINE": request.app.state.config.CODE_INTERPRETER_ENGINE,
         "CODE_INTERPRETER_PROMPT_TEMPLATE": request.app.state.config.CODE_INTERPRETER_PROMPT_TEMPLATE,
@@ -155,6 +166,7 @@ async def set_code_execution_config(
         "CODE_INTERPRETER_JUPYTER_AUTH": request.app.state.config.CODE_INTERPRETER_JUPYTER_AUTH,
         "CODE_INTERPRETER_JUPYTER_AUTH_TOKEN": request.app.state.config.CODE_INTERPRETER_JUPYTER_AUTH_TOKEN,
         "CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD": request.app.state.config.CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD,
+        "CODE_INTERPRETER_JUPYTER_TIMEOUT": request.app.state.config.CODE_INTERPRETER_JUPYTER_TIMEOUT,
     }
 
 

+ 16 - 9
backend/open_webui/routers/files.py

@@ -225,17 +225,24 @@ async def get_file_content_by_id(id: str, user=Depends(get_verified_user)):
                 filename = file.meta.get("name", file.filename)
                 encoded_filename = quote(filename)  # RFC5987 encoding
 
+                content_type = file.meta.get("content_type")
+                filename = file.meta.get("name", file.filename)
+                encoded_filename = quote(filename)
                 headers = {}
-                if file.meta.get("content_type") not in [
-                    "application/pdf",
-                    "text/plain",
-                ]:
-                    headers = {
-                        **headers,
-                        "Content-Disposition": f"attachment; filename*=UTF-8''{encoded_filename}",
-                    }
 
-                return FileResponse(file_path, headers=headers)
+                if content_type == "application/pdf" or filename.lower().endswith(
+                    ".pdf"
+                ):
+                    headers["Content-Disposition"] = (
+                        f"inline; filename*=UTF-8''{encoded_filename}"
+                    )
+                    content_type = "application/pdf"
+                elif content_type != "text/plain":
+                    headers["Content-Disposition"] = (
+                        f"attachment; filename*=UTF-8''{encoded_filename}"
+                    )
+
+                return FileResponse(file_path, headers=headers, media_type=content_type)
 
             else:
                 raise HTTPException(

+ 64 - 0
backend/open_webui/routers/images.py

@@ -55,6 +55,10 @@ async def get_config(request: Request, user=Depends(get_admin_user)):
             "COMFYUI_WORKFLOW": request.app.state.config.COMFYUI_WORKFLOW,
             "COMFYUI_WORKFLOW_NODES": request.app.state.config.COMFYUI_WORKFLOW_NODES,
         },
+        "gemini": {
+            "GEMINI_API_BASE_URL": request.app.state.config.IMAGES_GEMINI_API_BASE_URL,
+            "GEMINI_API_KEY": request.app.state.config.IMAGES_GEMINI_API_KEY,
+        },
     }
 
 
@@ -78,6 +82,11 @@ class ComfyUIConfigForm(BaseModel):
     COMFYUI_WORKFLOW_NODES: list[dict]
 
 
+class GeminiConfigForm(BaseModel):
+    GEMINI_API_BASE_URL: str
+    GEMINI_API_KEY: str
+
+
 class ConfigForm(BaseModel):
     enabled: bool
     engine: str
@@ -85,6 +94,7 @@ class ConfigForm(BaseModel):
     openai: OpenAIConfigForm
     automatic1111: Automatic1111ConfigForm
     comfyui: ComfyUIConfigForm
+    gemini: GeminiConfigForm
 
 
 @router.post("/config/update")
@@ -103,6 +113,11 @@ async def update_config(
     )
     request.app.state.config.IMAGES_OPENAI_API_KEY = form_data.openai.OPENAI_API_KEY
 
+    request.app.state.config.IMAGES_GEMINI_API_BASE_URL = (
+        form_data.gemini.GEMINI_API_BASE_URL
+    )
+    request.app.state.config.IMAGES_GEMINI_API_KEY = form_data.gemini.GEMINI_API_KEY
+
     request.app.state.config.AUTOMATIC1111_BASE_URL = (
         form_data.automatic1111.AUTOMATIC1111_BASE_URL
     )
@@ -155,6 +170,10 @@ async def update_config(
             "COMFYUI_WORKFLOW": request.app.state.config.COMFYUI_WORKFLOW,
             "COMFYUI_WORKFLOW_NODES": request.app.state.config.COMFYUI_WORKFLOW_NODES,
         },
+        "gemini": {
+            "GEMINI_API_BASE_URL": request.app.state.config.IMAGES_GEMINI_API_BASE_URL,
+            "GEMINI_API_KEY": request.app.state.config.IMAGES_GEMINI_API_KEY,
+        },
     }
 
 
@@ -224,6 +243,12 @@ def get_image_model(request):
             if request.app.state.config.IMAGE_GENERATION_MODEL
             else "dall-e-2"
         )
+    elif request.app.state.config.IMAGE_GENERATION_ENGINE == "gemini":
+        return (
+            request.app.state.config.IMAGE_GENERATION_MODEL
+            if request.app.state.config.IMAGE_GENERATION_MODEL
+            else "imagen-3.0-generate-002"
+        )
     elif request.app.state.config.IMAGE_GENERATION_ENGINE == "comfyui":
         return (
             request.app.state.config.IMAGE_GENERATION_MODEL
@@ -299,6 +324,10 @@ def get_models(request: Request, user=Depends(get_verified_user)):
                 {"id": "dall-e-2", "name": "DALL·E 2"},
                 {"id": "dall-e-3", "name": "DALL·E 3"},
             ]
+        elif request.app.state.config.IMAGE_GENERATION_ENGINE == "gemini":
+            return [
+                {"id": "imagen-3-0-generate-002", "name": "imagen-3.0 generate-002"},
+            ]
         elif request.app.state.config.IMAGE_GENERATION_ENGINE == "comfyui":
             # TODO - get models from comfyui
             headers = {
@@ -483,6 +512,41 @@ async def image_generations(
                 images.append({"url": url})
             return images
 
+        elif request.app.state.config.IMAGE_GENERATION_ENGINE == "gemini":
+            headers = {}
+            headers["Content-Type"] = "application/json"
+            headers["x-goog-api-key"] = request.app.state.config.IMAGES_GEMINI_API_KEY
+
+            model = get_image_model(request)
+            data = {
+                "instances": {"prompt": form_data.prompt},
+                "parameters": {
+                    "sampleCount": form_data.n,
+                    "outputOptions": {"mimeType": "image/png"},
+                },
+            }
+
+            # Use asyncio.to_thread for the requests.post call
+            r = await asyncio.to_thread(
+                requests.post,
+                url=f"{request.app.state.config.IMAGES_GEMINI_API_BASE_URL}/models/{model}:predict",
+                json=data,
+                headers=headers,
+            )
+
+            r.raise_for_status()
+            res = r.json()
+
+            images = []
+            for image in res["predictions"]:
+                image_data, content_type = load_b64_image_data(
+                    image["bytesBase64Encoded"]
+                )
+                url = upload_image(request, data, image_data, content_type, user)
+                images.append({"url": url})
+
+            return images
+
         elif request.app.state.config.IMAGE_GENERATION_ENGINE == "comfyui":
             data = {
                 "prompt": form_data.prompt,

+ 15 - 2
backend/open_webui/routers/ollama.py

@@ -26,7 +26,7 @@ from fastapi import (
 )
 from fastapi.middleware.cors import CORSMiddleware
 from fastapi.responses import StreamingResponse
-from pydantic import BaseModel, ConfigDict
+from pydantic import BaseModel, ConfigDict, validator
 from starlette.background import BackgroundTask
 
 
@@ -936,10 +936,23 @@ async def generate_completion(
 
 class ChatMessage(BaseModel):
     role: str
-    content: str
+    content: Optional[str] = None
     tool_calls: Optional[list[dict]] = None
     images: Optional[list[str]] = None
 
+    @validator("content", pre=True)
+    @classmethod
+    def check_at_least_one_field(cls, field_value, values, **kwargs):
+        # Raise an error if both 'content' and 'tool_calls' are None
+        if field_value is None and (
+            "tool_calls" not in values or values["tool_calls"] is None
+        ):
+            raise ValueError(
+                "At least one of 'content' or 'tool_calls' must be provided"
+            )
+
+        return field_value
+
 
 class GenerateChatCompletionForm(BaseModel):
     model: str

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

@@ -351,6 +351,7 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)):
     return {
         "status": True,
         "pdf_extract_images": request.app.state.config.PDF_EXTRACT_IMAGES,
+        "RAG_FULL_CONTEXT": request.app.state.config.RAG_FULL_CONTEXT,
         "enable_google_drive_integration": request.app.state.config.ENABLE_GOOGLE_DRIVE_INTEGRATION,
         "content_extraction": {
             "engine": request.app.state.config.CONTENT_EXTRACTION_ENGINE,
@@ -463,6 +464,7 @@ class WebConfig(BaseModel):
 
 
 class ConfigUpdateForm(BaseModel):
+    RAG_FULL_CONTEXT: Optional[bool] = None
     pdf_extract_images: Optional[bool] = None
     enable_google_drive_integration: Optional[bool] = None
     file: Optional[FileConfig] = None
@@ -482,6 +484,12 @@ async def update_rag_config(
         else request.app.state.config.PDF_EXTRACT_IMAGES
     )
 
+    request.app.state.config.RAG_FULL_CONTEXT = (
+        form_data.RAG_FULL_CONTEXT
+        if form_data.RAG_FULL_CONTEXT is not None
+        else request.app.state.config.RAG_FULL_CONTEXT
+    )
+
     request.app.state.config.ENABLE_GOOGLE_DRIVE_INTEGRATION = (
         form_data.enable_google_drive_integration
         if form_data.enable_google_drive_integration is not None
@@ -588,6 +596,7 @@ async def update_rag_config(
     return {
         "status": True,
         "pdf_extract_images": request.app.state.config.PDF_EXTRACT_IMAGES,
+        "RAG_FULL_CONTEXT": request.app.state.config.RAG_FULL_CONTEXT,
         "file": {
             "max_size": request.app.state.config.FILE_MAX_SIZE,
             "max_count": request.app.state.config.FILE_MAX_COUNT,

+ 1 - 0
backend/open_webui/routers/utils.py

@@ -56,6 +56,7 @@ async def execute_code(
                 if request.app.state.config.CODE_EXECUTION_JUPYTER_AUTH == "password"
                 else None
             ),
+            request.app.state.config.CODE_EXECUTION_JUPYTER_TIMEOUT,
         )
 
         return output

+ 76 - 0
backend/open_webui/storage/provider.py

@@ -15,12 +15,18 @@ from open_webui.config import (
     S3_SECRET_ACCESS_KEY,
     GCS_BUCKET_NAME,
     GOOGLE_APPLICATION_CREDENTIALS_JSON,
+    AZURE_STORAGE_ENDPOINT,
+    AZURE_STORAGE_CONTAINER_NAME,
+    AZURE_STORAGE_KEY,
     STORAGE_PROVIDER,
     UPLOAD_DIR,
 )
 from google.cloud import storage
 from google.cloud.exceptions import GoogleCloudError, NotFound
 from open_webui.constants import ERROR_MESSAGES
+from azure.identity import DefaultAzureCredential
+from azure.storage.blob import BlobServiceClient
+from azure.core.exceptions import ResourceNotFoundError
 
 
 class StorageProvider(ABC):
@@ -221,6 +227,74 @@ class GCSStorageProvider(StorageProvider):
         LocalStorageProvider.delete_all_files()
 
 
+class AzureStorageProvider(StorageProvider):
+    def __init__(self):
+        self.endpoint = AZURE_STORAGE_ENDPOINT
+        self.container_name = AZURE_STORAGE_CONTAINER_NAME
+        storage_key = AZURE_STORAGE_KEY
+
+        if storage_key:
+            # Configure using the Azure Storage Account Endpoint and Key
+            self.blob_service_client = BlobServiceClient(
+                account_url=self.endpoint, credential=storage_key
+            )
+        else:
+            # Configure using the Azure Storage Account Endpoint and DefaultAzureCredential
+            # If the key is not configured, then the DefaultAzureCredential will be used to support Managed Identity authentication
+            self.blob_service_client = BlobServiceClient(
+                account_url=self.endpoint, credential=DefaultAzureCredential()
+            )
+        self.container_client = self.blob_service_client.get_container_client(
+            self.container_name
+        )
+
+    def upload_file(self, file: BinaryIO, filename: str) -> Tuple[bytes, str]:
+        """Handles uploading of the file to Azure Blob Storage."""
+        contents, file_path = LocalStorageProvider.upload_file(file, filename)
+        try:
+            blob_client = self.container_client.get_blob_client(filename)
+            blob_client.upload_blob(contents, overwrite=True)
+            return contents, f"{self.endpoint}/{self.container_name}/{filename}"
+        except Exception as e:
+            raise RuntimeError(f"Error uploading file to Azure Blob Storage: {e}")
+
+    def get_file(self, file_path: str) -> str:
+        """Handles downloading of the file from Azure Blob Storage."""
+        try:
+            filename = file_path.split("/")[-1]
+            local_file_path = f"{UPLOAD_DIR}/{filename}"
+            blob_client = self.container_client.get_blob_client(filename)
+            with open(local_file_path, "wb") as download_file:
+                download_file.write(blob_client.download_blob().readall())
+            return local_file_path
+        except ResourceNotFoundError as e:
+            raise RuntimeError(f"Error downloading file from Azure Blob Storage: {e}")
+
+    def delete_file(self, file_path: str) -> None:
+        """Handles deletion of the file from Azure Blob Storage."""
+        try:
+            filename = file_path.split("/")[-1]
+            blob_client = self.container_client.get_blob_client(filename)
+            blob_client.delete_blob()
+        except ResourceNotFoundError as e:
+            raise RuntimeError(f"Error deleting file from Azure Blob Storage: {e}")
+
+        # Always delete from local storage
+        LocalStorageProvider.delete_file(file_path)
+
+    def delete_all_files(self) -> None:
+        """Handles deletion of all files from Azure Blob Storage."""
+        try:
+            blobs = self.container_client.list_blobs()
+            for blob in blobs:
+                self.container_client.delete_blob(blob.name)
+        except Exception as e:
+            raise RuntimeError(f"Error deleting all files from Azure Blob Storage: {e}")
+
+        # Always delete from local storage
+        LocalStorageProvider.delete_all_files()
+
+
 def get_storage_provider(storage_provider: str):
     if storage_provider == "local":
         Storage = LocalStorageProvider()
@@ -228,6 +302,8 @@ def get_storage_provider(storage_provider: str):
         Storage = S3StorageProvider()
     elif storage_provider == "gcs":
         Storage = GCSStorageProvider()
+    elif storage_provider == "azure":
+        Storage = AzureStorageProvider()
     else:
         raise RuntimeError(f"Unsupported storage provider: {storage_provider}")
     return Storage

+ 150 - 0
backend/open_webui/test/apps/webui/storage/test_provider.py

@@ -7,6 +7,8 @@ from moto import mock_aws
 from open_webui.storage import provider
 from gcp_storage_emulator.server import create_server
 from google.cloud import storage
+from azure.storage.blob import BlobServiceClient, ContainerClient, BlobClient
+from unittest.mock import MagicMock
 
 
 def mock_upload_dir(monkeypatch, tmp_path):
@@ -22,6 +24,7 @@ def test_imports():
     provider.LocalStorageProvider
     provider.S3StorageProvider
     provider.GCSStorageProvider
+    provider.AzureStorageProvider
     provider.Storage
 
 
@@ -32,6 +35,8 @@ def test_get_storage_provider():
     assert isinstance(Storage, provider.S3StorageProvider)
     Storage = provider.get_storage_provider("gcs")
     assert isinstance(Storage, provider.GCSStorageProvider)
+    Storage = provider.get_storage_provider("azure")
+    assert isinstance(Storage, provider.AzureStorageProvider)
     with pytest.raises(RuntimeError):
         provider.get_storage_provider("invalid")
 
@@ -48,6 +53,7 @@ def test_class_instantiation():
     provider.LocalStorageProvider()
     provider.S3StorageProvider()
     provider.GCSStorageProvider()
+    provider.AzureStorageProvider()
 
 
 class TestLocalStorageProvider:
@@ -272,3 +278,147 @@ class TestGCSStorageProvider:
         assert not (upload_dir / self.filename_extra).exists()
         assert self.Storage.bucket.get_blob(self.filename) == None
         assert self.Storage.bucket.get_blob(self.filename_extra) == None
+
+
+class TestAzureStorageProvider:
+    def __init__(self):
+        super().__init__()
+
+    @pytest.fixture(scope="class")
+    def setup_storage(self, monkeypatch):
+        # Create mock Blob Service Client and related clients
+        mock_blob_service_client = MagicMock()
+        mock_container_client = MagicMock()
+        mock_blob_client = MagicMock()
+
+        # Set up return values for the mock
+        mock_blob_service_client.get_container_client.return_value = (
+            mock_container_client
+        )
+        mock_container_client.get_blob_client.return_value = mock_blob_client
+
+        # Monkeypatch the Azure classes to return our mocks
+        monkeypatch.setattr(
+            azure.storage.blob,
+            "BlobServiceClient",
+            lambda *args, **kwargs: mock_blob_service_client,
+        )
+        monkeypatch.setattr(
+            azure.storage.blob,
+            "ContainerClient",
+            lambda *args, **kwargs: mock_container_client,
+        )
+        monkeypatch.setattr(
+            azure.storage.blob, "BlobClient", lambda *args, **kwargs: mock_blob_client
+        )
+
+        self.Storage = provider.AzureStorageProvider()
+        self.Storage.endpoint = "https://myaccount.blob.core.windows.net"
+        self.Storage.container_name = "my-container"
+        self.file_content = b"test content"
+        self.filename = "test.txt"
+        self.filename_extra = "test_extra.txt"
+        self.file_bytesio_empty = io.BytesIO()
+
+        # Apply mocks to the Storage instance
+        self.Storage.blob_service_client = mock_blob_service_client
+        self.Storage.container_client = mock_container_client
+
+    def test_upload_file(self, monkeypatch, tmp_path):
+        upload_dir = mock_upload_dir(monkeypatch, tmp_path)
+
+        # Simulate an error when container does not exist
+        self.Storage.container_client.get_blob_client.side_effect = Exception(
+            "Container does not exist"
+        )
+        with pytest.raises(Exception):
+            self.Storage.upload_file(io.BytesIO(self.file_content), self.filename)
+
+        # Reset side effect and create container
+        self.Storage.container_client.get_blob_client.side_effect = None
+        self.Storage.create_container()
+        contents, azure_file_path = self.Storage.upload_file(
+            io.BytesIO(self.file_content), self.filename
+        )
+
+        # Assertions
+        self.Storage.container_client.get_blob_client.assert_called_with(self.filename)
+        self.Storage.container_client.get_blob_client().upload_blob.assert_called_once_with(
+            self.file_content, overwrite=True
+        )
+        assert contents == self.file_content
+        assert (
+            azure_file_path
+            == f"https://myaccount.blob.core.windows.net/{self.Storage.container_name}/{self.filename}"
+        )
+        assert (upload_dir / self.filename).exists()
+        assert (upload_dir / self.filename).read_bytes() == self.file_content
+
+        with pytest.raises(ValueError):
+            self.Storage.upload_file(self.file_bytesio_empty, self.filename)
+
+    def test_get_file(self, monkeypatch, tmp_path):
+        upload_dir = mock_upload_dir(monkeypatch, tmp_path)
+        self.Storage.create_container()
+
+        # Mock upload behavior
+        self.Storage.upload_file(io.BytesIO(self.file_content), self.filename)
+        # Mock blob download behavior
+        self.Storage.container_client.get_blob_client().download_blob().readall.return_value = (
+            self.file_content
+        )
+
+        file_url = f"https://myaccount.blob.core.windows.net/{self.Storage.container_name}/{self.filename}"
+        file_path = self.Storage.get_file(file_url)
+
+        assert file_path == str(upload_dir / self.filename)
+        assert (upload_dir / self.filename).exists()
+        assert (upload_dir / self.filename).read_bytes() == self.file_content
+
+    def test_delete_file(self, monkeypatch, tmp_path):
+        upload_dir = mock_upload_dir(monkeypatch, tmp_path)
+        self.Storage.create_container()
+
+        # Mock file upload
+        self.Storage.upload_file(io.BytesIO(self.file_content), self.filename)
+        # Mock deletion
+        self.Storage.container_client.get_blob_client().delete_blob.return_value = None
+
+        file_url = f"https://myaccount.blob.core.windows.net/{self.Storage.container_name}/{self.filename}"
+        self.Storage.delete_file(file_url)
+
+        self.Storage.container_client.get_blob_client().delete_blob.assert_called_once()
+        assert not (upload_dir / self.filename).exists()
+
+    def test_delete_all_files(self, monkeypatch, tmp_path):
+        upload_dir = mock_upload_dir(monkeypatch, tmp_path)
+        self.Storage.create_container()
+
+        # Mock file uploads
+        self.Storage.upload_file(io.BytesIO(self.file_content), self.filename)
+        self.Storage.upload_file(io.BytesIO(self.file_content), self.filename_extra)
+
+        # Mock listing and deletion behavior
+        self.Storage.container_client.list_blobs.return_value = [
+            {"name": self.filename},
+            {"name": self.filename_extra},
+        ]
+        self.Storage.container_client.get_blob_client().delete_blob.return_value = None
+
+        self.Storage.delete_all_files()
+
+        self.Storage.container_client.list_blobs.assert_called_once()
+        self.Storage.container_client.get_blob_client().delete_blob.assert_any_call()
+        assert not (upload_dir / self.filename).exists()
+        assert not (upload_dir / self.filename_extra).exists()
+
+    def test_get_file_not_found(self, monkeypatch):
+        self.Storage.create_container()
+
+        file_url = f"https://myaccount.blob.core.windows.net/{self.Storage.container_name}/{self.filename}"
+        # Mock behavior to raise an error for missing blobs
+        self.Storage.container_client.get_blob_client().download_blob.side_effect = (
+            Exception("Blob not found")
+        )
+        with pytest.raises(Exception, match="Blob not found"):
+            self.Storage.get_file(file_url)

+ 75 - 61
backend/open_webui/utils/middleware.py

@@ -321,89 +321,94 @@ async def chat_web_search_handler(
         )
         return form_data
 
-    searchQuery = queries[0]
+    all_results = []
 
-    await event_emitter(
-        {
-            "type": "status",
-            "data": {
-                "action": "web_search",
-                "description": 'Searching "{{searchQuery}}"',
-                "query": searchQuery,
-                "done": False,
-            },
-        }
-    )
-
-    try:
-
-        results = await process_web_search(
-            request,
-            SearchForm(
-                **{
+    for searchQuery in queries:
+        await event_emitter(
+            {
+                "type": "status",
+                "data": {
+                    "action": "web_search",
+                    "description": 'Searching "{{searchQuery}}"',
                     "query": searchQuery,
-                }
-            ),
-            user,
+                    "done": False,
+                },
+            }
         )
 
-        if results:
-            await event_emitter(
-                {
-                    "type": "status",
-                    "data": {
-                        "action": "web_search",
-                        "description": "Searched {{count}} sites",
+        try:
+            results = await process_web_search(
+                request,
+                SearchForm(
+                    **{
                         "query": searchQuery,
-                        "urls": results["filenames"],
-                        "done": True,
-                    },
-                }
+                    }
+                ),
+                user=user,
             )
 
-            files = form_data.get("files", [])
+            if results:
+                all_results.append(results)
+                files = form_data.get("files", [])
 
-            if request.app.state.config.RAG_WEB_SEARCH_FULL_CONTEXT:
-                files.append(
-                    {
-                        "docs": results.get("docs", []),
-                        "name": searchQuery,
-                        "type": "web_search_docs",
-                        "urls": results["filenames"],
-                    }
-                )
-            else:
-                files.append(
-                    {
-                        "collection_name": results["collection_name"],
-                        "name": searchQuery,
-                        "type": "web_search_results",
-                        "urls": results["filenames"],
-                    }
-                )
-            form_data["files"] = files
-        else:
+                if request.app.state.config.RAG_WEB_SEARCH_FULL_CONTEXT:
+                    files.append(
+                        {
+                            "docs": results.get("docs", []),
+                            "name": searchQuery,
+                            "type": "web_search_docs",
+                            "urls": results["filenames"],
+                        }
+                    )
+                else:
+                    files.append(
+                        {
+                            "collection_name": results["collection_name"],
+                            "name": searchQuery,
+                            "type": "web_search_results",
+                            "urls": results["filenames"],
+                        }
+                    )
+                form_data["files"] = files
+        except Exception as e:
+            log.exception(e)
             await event_emitter(
                 {
                     "type": "status",
                     "data": {
                         "action": "web_search",
-                        "description": "No search results found",
+                        "description": 'Error searching "{{searchQuery}}"',
                         "query": searchQuery,
                         "done": True,
                         "error": True,
                     },
                 }
             )
-    except Exception as e:
-        log.exception(e)
+
+    if all_results:
+        urls = []
+        for results in all_results:
+            if "filenames" in results:
+                urls.extend(results["filenames"])
+
         await event_emitter(
             {
                 "type": "status",
                 "data": {
                     "action": "web_search",
-                    "description": 'Error searching "{{searchQuery}}"',
-                    "query": searchQuery,
+                    "description": "Searched {{count}} sites",
+                    "urls": urls,
+                    "done": True,
+                },
+            }
+        )
+    else:
+        await event_emitter(
+            {
+                "type": "status",
+                "data": {
+                    "action": "web_search",
+                    "description": "No search results found",
                     "done": True,
                     "error": True,
                 },
@@ -560,9 +565,9 @@ async def chat_completion_files_handler(
                         reranking_function=request.app.state.rf,
                         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,
                     ),
                 )
-
         except Exception as e:
             log.exception(e)
 
@@ -1359,7 +1364,15 @@ async def process_chat_response(
 
             tool_calls = []
 
-            last_assistant_message = get_last_assistant_message(form_data["messages"])
+            last_assistant_message = None
+            try:
+                if form_data["messages"][-1]["role"] == "assistant":
+                    last_assistant_message = get_last_assistant_message(
+                        form_data["messages"]
+                    )
+            except Exception as e:
+                pass
+
             content = (
                 message.get("content", "")
                 if message
@@ -1748,6 +1761,7 @@ async def process_chat_response(
                                             == "password"
                                             else None
                                         ),
+                                        request.app.state.config.CODE_INTERPRETER_JUPYTER_TIMEOUT,
                                     )
                                 else:
                                     output = {

+ 47 - 7
backend/open_webui/utils/oauth.py

@@ -140,7 +140,14 @@ class OAuthManager:
         log.debug("Running OAUTH Group management")
         oauth_claim = auth_manager_config.OAUTH_GROUPS_CLAIM
 
-        user_oauth_groups: list[str] = user_data.get(oauth_claim, list())
+        # Nested claim search for groups claim
+        if oauth_claim:
+            claim_data = user_data
+            nested_claims = oauth_claim.split(".")
+            for nested_claim in nested_claims:
+                claim_data = claim_data.get(nested_claim, {})
+            user_oauth_groups = claim_data if isinstance(claim_data, list) else None
+
         user_current_groups: list[GroupModel] = Groups.get_groups_by_member_id(user.id)
         all_available_groups: list[GroupModel] = Groups.get_groups()
 
@@ -239,11 +246,46 @@ class OAuthManager:
             raise HTTPException(400, detail=ERROR_MESSAGES.INVALID_CRED)
         provider_sub = f"{provider}@{sub}"
         email_claim = auth_manager_config.OAUTH_EMAIL_CLAIM
-        email = user_data.get(email_claim, "").lower()
+        email = user_data.get(email_claim, "")
         # We currently mandate that email addresses are provided
         if not email:
-            log.warning(f"OAuth callback failed, email is missing: {user_data}")
-            raise HTTPException(400, detail=ERROR_MESSAGES.INVALID_CRED)
+            # If the provider is GitHub,and public email is not provided, we can use the access token to fetch the user's email
+            if provider == "github":
+                try:
+                    access_token = token.get("access_token")
+                    headers = {"Authorization": f"Bearer {access_token}"}
+                    async with aiohttp.ClientSession() as session:
+                        async with session.get(
+                            "https://api.github.com/user/emails", headers=headers
+                        ) as resp:
+                            if resp.ok:
+                                emails = await resp.json()
+                                # use the primary email as the user's email
+                                primary_email = next(
+                                    (e["email"] for e in emails if e.get("primary")),
+                                    None,
+                                )
+                                if primary_email:
+                                    email = primary_email
+                                else:
+                                    log.warning(
+                                        "No primary email found in GitHub response"
+                                    )
+                                    raise HTTPException(
+                                        400, detail=ERROR_MESSAGES.INVALID_CRED
+                                    )
+                            else:
+                                log.warning("Failed to fetch GitHub email")
+                                raise HTTPException(
+                                    400, detail=ERROR_MESSAGES.INVALID_CRED
+                                )
+                except Exception as e:
+                    log.warning(f"Error fetching GitHub email: {e}")
+                    raise HTTPException(400, detail=ERROR_MESSAGES.INVALID_CRED)
+            else:
+                log.warning(f"OAuth callback failed, email is missing: {user_data}")
+                raise HTTPException(400, detail=ERROR_MESSAGES.INVALID_CRED)
+        email = email.lower()
         if (
             "*" not in auth_manager_config.OAUTH_ALLOWED_DOMAINS
             and email.split("@")[-1] not in auth_manager_config.OAUTH_ALLOWED_DOMAINS
@@ -285,9 +327,7 @@ class OAuthManager:
             # If the user does not exist, check if signups are enabled
             if auth_manager_config.ENABLE_OAUTH_SIGNUP:
                 # Check if an existing user with the same email already exists
-                existing_user = Users.get_user_by_email(
-                    user_data.get("email", "").lower()
-                )
+                existing_user = Users.get_user_by_email(email)
                 if existing_user:
                     raise HTTPException(400, detail=ERROR_MESSAGES.EMAIL_TAKEN)
 

+ 77 - 49
backend/open_webui/utils/payload.py

@@ -4,6 +4,7 @@ from open_webui.utils.misc import (
 )
 
 from typing import Callable, Optional
+import json
 
 
 # inplace function: form_data is modified
@@ -66,38 +67,49 @@ def apply_model_params_to_body_openai(params: dict, form_data: dict) -> dict:
 
 
 def apply_model_params_to_body_ollama(params: dict, form_data: dict) -> dict:
-    opts = [
-        "temperature",
-        "top_p",
-        "seed",
-        "mirostat",
-        "mirostat_eta",
-        "mirostat_tau",
-        "num_ctx",
-        "num_batch",
-        "num_keep",
-        "repeat_last_n",
-        "tfs_z",
-        "top_k",
-        "min_p",
-        "use_mmap",
-        "use_mlock",
-        "num_thread",
-        "num_gpu",
-    ]
-    mappings = {i: lambda x: x for i in opts}
-    form_data = apply_model_params_to_body(params, form_data, mappings)
-
+    # Convert OpenAI parameter names to Ollama parameter names if needed.
     name_differences = {
         "max_tokens": "num_predict",
-        "frequency_penalty": "repeat_penalty",
     }
 
     for key, value in name_differences.items():
         if (param := params.get(key, None)) is not None:
-            form_data[value] = param
+            # Copy the parameter to new name then delete it, to prevent Ollama warning of invalid option provided
+            params[value] = params[key]
+            del params[key]
 
-    return form_data
+    # See https://github.com/ollama/ollama/blob/main/docs/api.md#request-8
+    mappings = {
+        "temperature": float,
+        "top_p": float,
+        "seed": lambda x: x,
+        "mirostat": int,
+        "mirostat_eta": float,
+        "mirostat_tau": float,
+        "num_ctx": int,
+        "num_batch": int,
+        "num_keep": int,
+        "num_predict": int,
+        "repeat_last_n": int,
+        "top_k": int,
+        "min_p": float,
+        "typical_p": float,
+        "repeat_penalty": float,
+        "presence_penalty": float,
+        "frequency_penalty": float,
+        "penalize_newline": bool,
+        "stop": lambda x: [bytes(s, "utf-8").decode("unicode_escape") for s in x],
+        "numa": bool,
+        "num_gpu": int,
+        "main_gpu": int,
+        "low_vram": bool,
+        "vocab_only": bool,
+        "use_mmap": bool,
+        "use_mlock": bool,
+        "num_thread": int,
+    }
+
+    return apply_model_params_to_body(params, form_data, mappings)
 
 
 def convert_messages_openai_to_ollama(messages: list[dict]) -> list[dict]:
@@ -108,11 +120,38 @@ def convert_messages_openai_to_ollama(messages: list[dict]) -> list[dict]:
         new_message = {"role": message["role"]}
 
         content = message.get("content", [])
+        tool_calls = message.get("tool_calls", None)
+        tool_call_id = message.get("tool_call_id", None)
 
         # Check if the content is a string (just a simple message)
         if isinstance(content, str):
             # If the content is a string, it's pure text
             new_message["content"] = content
+
+            # If message is a tool call, add the tool call id to the message
+            if tool_call_id:
+                new_message["tool_call_id"] = tool_call_id
+
+        elif tool_calls:
+            # If tool calls are present, add them to the message
+            ollama_tool_calls = []
+            for tool_call in tool_calls:
+                ollama_tool_call = {
+                    "index": tool_call.get("index", 0),
+                    "id": tool_call.get("id", None),
+                    "function": {
+                        "name": tool_call.get("function", {}).get("name", ""),
+                        "arguments": json.loads(
+                            tool_call.get("function", {}).get("arguments", {})
+                        ),
+                    },
+                }
+                ollama_tool_calls.append(ollama_tool_call)
+            new_message["tool_calls"] = ollama_tool_calls
+
+            # Put the content to empty string (Ollama requires an empty string for tool calls)
+            new_message["content"] = ""
+
         else:
             # Otherwise, assume the content is a list of dicts, e.g., text followed by an image URL
             content_text = ""
@@ -173,34 +212,23 @@ def convert_payload_openai_to_ollama(openai_payload: dict) -> dict:
         ollama_payload["format"] = openai_payload["format"]
 
     # If there are advanced parameters in the payload, format them in Ollama's options field
-    ollama_options = {}
-
     if openai_payload.get("options"):
         ollama_payload["options"] = openai_payload["options"]
         ollama_options = openai_payload["options"]
 
-    # Handle parameters which map directly
-    for param in ["temperature", "top_p", "seed"]:
-        if param in openai_payload:
-            ollama_options[param] = openai_payload[param]
-
-    # Mapping OpenAI's `max_tokens` -> Ollama's `num_predict`
-    if "max_completion_tokens" in openai_payload:
-        ollama_options["num_predict"] = openai_payload["max_completion_tokens"]
-    elif "max_tokens" in openai_payload:
-        ollama_options["num_predict"] = openai_payload["max_tokens"]
-
-    # Handle frequency / presence_penalty, which needs renaming and checking
-    if "frequency_penalty" in openai_payload:
-        ollama_options["repeat_penalty"] = openai_payload["frequency_penalty"]
-
-    if "presence_penalty" in openai_payload and "penalty" not in ollama_options:
-        # We are assuming presence penalty uses a similar concept in Ollama, which needs custom handling if exists.
-        ollama_options["new_topic_penalty"] = openai_payload["presence_penalty"]
-
-    # Add options to payload if any have been set
-    if ollama_options:
-        ollama_payload["options"] = ollama_options
+        # Re-Mapping OpenAI's `max_tokens` -> Ollama's `num_predict`
+        if "max_tokens" in ollama_options:
+            ollama_options["num_predict"] = ollama_options["max_tokens"]
+            del ollama_options[
+                "max_tokens"
+            ]  # To prevent Ollama warning of invalid option provided
+
+        # Ollama lacks a "system" prompt option. It has to be provided as a direct parameter, so we copy it down.
+        if "system" in ollama_options:
+            ollama_payload["system"] = ollama_options["system"]
+            del ollama_options[
+                "system"
+            ]  # To prevent Ollama warning of invalid option provided
 
     if "metadata" in openai_payload:
         ollama_payload["metadata"] = openai_payload["metadata"]

+ 31 - 50
backend/open_webui/utils/response.py

@@ -24,17 +24,8 @@ def convert_ollama_tool_call_to_openai(tool_calls: dict) -> dict:
     return openai_tool_calls
 
 
-def convert_response_ollama_to_openai(ollama_response: dict) -> dict:
-    model = ollama_response.get("model", "ollama")
-    message_content = ollama_response.get("message", {}).get("content", "")
-    tool_calls = ollama_response.get("message", {}).get("tool_calls", None)
-    openai_tool_calls = None
-
-    if tool_calls:
-        openai_tool_calls = convert_ollama_tool_call_to_openai(tool_calls)
-
-    data = ollama_response
-    usage = {
+def convert_ollama_usage_to_openai(data: dict) -> dict:
+    return {
         "response_token/s": (
             round(
                 (
@@ -66,14 +57,42 @@ def convert_response_ollama_to_openai(ollama_response: dict) -> dict:
         "total_duration": data.get("total_duration", 0),
         "load_duration": data.get("load_duration", 0),
         "prompt_eval_count": data.get("prompt_eval_count", 0),
+        "prompt_tokens": int(
+            data.get("prompt_eval_count", 0)
+        ),  # This is the OpenAI compatible key
         "prompt_eval_duration": data.get("prompt_eval_duration", 0),
         "eval_count": data.get("eval_count", 0),
+        "completion_tokens": int(
+            data.get("eval_count", 0)
+        ),  # This is the OpenAI compatible key
         "eval_duration": data.get("eval_duration", 0),
         "approximate_total": (lambda s: f"{s // 3600}h{(s % 3600) // 60}m{s % 60}s")(
             (data.get("total_duration", 0) or 0) // 1_000_000_000
         ),
+        "total_tokens": int(  # This is the OpenAI compatible key
+            data.get("prompt_eval_count", 0) + data.get("eval_count", 0)
+        ),
+        "completion_tokens_details": {  # This is the OpenAI compatible key
+            "reasoning_tokens": 0,
+            "accepted_prediction_tokens": 0,
+            "rejected_prediction_tokens": 0,
+        },
     }
 
+
+def convert_response_ollama_to_openai(ollama_response: dict) -> dict:
+    model = ollama_response.get("model", "ollama")
+    message_content = ollama_response.get("message", {}).get("content", "")
+    tool_calls = ollama_response.get("message", {}).get("tool_calls", None)
+    openai_tool_calls = None
+
+    if tool_calls:
+        openai_tool_calls = convert_ollama_tool_call_to_openai(tool_calls)
+
+    data = ollama_response
+
+    usage = convert_ollama_usage_to_openai(data)
+
     response = openai_chat_completion_message_template(
         model, message_content, openai_tool_calls, usage
     )
@@ -96,45 +115,7 @@ async def convert_streaming_response_ollama_to_openai(ollama_streaming_response)
 
         usage = None
         if done:
-            usage = {
-                "response_token/s": (
-                    round(
-                        (
-                            (
-                                data.get("eval_count", 0)
-                                / ((data.get("eval_duration", 0) / 10_000_000))
-                            )
-                            * 100
-                        ),
-                        2,
-                    )
-                    if data.get("eval_duration", 0) > 0
-                    else "N/A"
-                ),
-                "prompt_token/s": (
-                    round(
-                        (
-                            (
-                                data.get("prompt_eval_count", 0)
-                                / ((data.get("prompt_eval_duration", 0) / 10_000_000))
-                            )
-                            * 100
-                        ),
-                        2,
-                    )
-                    if data.get("prompt_eval_duration", 0) > 0
-                    else "N/A"
-                ),
-                "total_duration": data.get("total_duration", 0),
-                "load_duration": data.get("load_duration", 0),
-                "prompt_eval_count": data.get("prompt_eval_count", 0),
-                "prompt_eval_duration": data.get("prompt_eval_duration", 0),
-                "eval_count": data.get("eval_count", 0),
-                "eval_duration": data.get("eval_duration", 0),
-                "approximate_total": (
-                    lambda s: f"{s // 3600}h{(s % 3600) // 60}m{s % 60}s"
-                )((data.get("total_duration", 0) or 0) // 1_000_000_000),
-            }
+            usage = convert_ollama_usage_to_openai(data)
 
         data = openai_chat_chunk_message_template(
             model, message_content if not done else None, openai_tool_calls, usage

+ 10 - 3
backend/requirements.txt

@@ -1,6 +1,6 @@
 fastapi==0.115.7
 uvicorn[standard]==0.30.6
-pydantic==2.9.2
+pydantic==2.10.6
 python-multipart==0.0.18
 
 python-socketio==5.11.3
@@ -45,7 +45,7 @@ chromadb==0.6.2
 pymilvus==2.5.0
 qdrant-client~=1.12.0
 opensearch-py==2.8.0
-
+playwright==1.49.1 # Caution: version must match docker-compose.playwright.yaml
 
 transformers
 sentence-transformers==3.3.1
@@ -59,7 +59,7 @@ fpdf2==2.8.2
 pymdown-extensions==10.14.2
 docx2txt==0.8
 python-pptx==1.0.0
-unstructured==0.16.11
+unstructured==0.16.17
 nltk==3.9.1
 Markdown==3.7
 pypandoc==1.13
@@ -103,5 +103,12 @@ pytest-docker~=3.1.1
 googleapis-common-protos==1.63.2
 google-cloud-storage==2.19.0
 
+azure-identity==1.20.0
+azure-storage-blob==12.24.1
+
+
 ## LDAP
 ldap3==2.9.1
+
+## Firecrawl
+firecrawl-py==1.12.0

+ 11 - 0
backend/start.sh

@@ -3,6 +3,17 @@
 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
 cd "$SCRIPT_DIR" || exit
 
+# Add conditional Playwright browser installation
+if [[ "${RAG_WEB_LOADER_ENGINE,,}" == "playwright" ]]; then
+    if [[ -z "${PLAYWRIGHT_WS_URI}" ]]; then
+        echo "Installing Playwright browsers..."
+        playwright install chromium
+        playwright install-deps chromium
+    fi
+
+    python -c "import nltk; nltk.download('punkt_tab')"
+fi
+
 KEY_FILE=.webui_secret_key
 
 PORT="${PORT:-8080}"

+ 11 - 0
backend/start_windows.bat

@@ -6,6 +6,17 @@ SETLOCAL ENABLEDELAYEDEXPANSION
 SET "SCRIPT_DIR=%~dp0"
 cd /d "%SCRIPT_DIR%" || exit /b
 
+:: Add conditional Playwright browser installation
+IF /I "%RAG_WEB_LOADER_ENGINE%" == "playwright" (
+    IF "%PLAYWRIGHT_WS_URI%" == "" (
+        echo Installing Playwright browsers...
+        playwright install chromium
+        playwright install-deps chromium
+    )
+
+    python -c "import nltk; nltk.download('punkt_tab')"
+)
+
 SET "KEY_FILE=.webui_secret_key"
 IF "%PORT%"=="" SET PORT=8080
 IF "%HOST%"=="" SET HOST=0.0.0.0

+ 10 - 0
docker-compose.playwright.yaml

@@ -0,0 +1,10 @@
+services:
+  playwright:
+    image: mcr.microsoft.com/playwright:v1.49.1-noble # Version must match requirements.txt
+    container_name: playwright
+    command: npx -y playwright@1.49.1 run-server --port 3000 --host 0.0.0.0
+
+  open-webui:
+    environment:
+      - 'RAG_WEB_LOADER_ENGINE=playwright'
+      - 'PLAYWRIGHT_WS_URI=ws://playwright:3000'

+ 12 - 2
package-lock.json

@@ -1,12 +1,12 @@
 {
 	"name": "open-webui",
-	"version": "0.5.14",
+	"version": "0.5.15",
 	"lockfileVersion": 3,
 	"requires": true,
 	"packages": {
 		"": {
 			"name": "open-webui",
-			"version": "0.5.14",
+			"version": "0.5.15",
 			"dependencies": {
 				"@codemirror/lang-javascript": "^6.2.2",
 				"@codemirror/lang-python": "^6.1.6",
@@ -63,6 +63,7 @@
 				"svelte-sonner": "^0.3.19",
 				"tippy.js": "^6.3.7",
 				"turndown": "^7.2.0",
+				"undici": "^7.3.0",
 				"uuid": "^9.0.1",
 				"vite-plugin-static-copy": "^2.2.0"
 			},
@@ -11528,6 +11529,15 @@
 				"node": "*"
 			}
 		},
+		"node_modules/undici": {
+			"version": "7.3.0",
+			"resolved": "https://registry.npmjs.org/undici/-/undici-7.3.0.tgz",
+			"integrity": "sha512-Qy96NND4Dou5jKoSJ2gm8ax8AJM/Ey9o9mz7KN1bb9GP+G0l20Zw8afxTnY2f4b7hmhn/z8aC2kfArVQlAhFBw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=20.18.1"
+			}
+		},
 		"node_modules/undici-types": {
 			"version": "5.26.5",
 			"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",

+ 2 - 1
package.json

@@ -1,6 +1,6 @@
 {
 	"name": "open-webui",
-	"version": "0.5.14",
+	"version": "0.5.15",
 	"private": true,
 	"scripts": {
 		"dev": "npm run pyodide:fetch && vite dev --host",
@@ -106,6 +106,7 @@
 		"svelte-sonner": "^0.3.19",
 		"tippy.js": "^6.3.7",
 		"turndown": "^7.2.0",
+		"undici": "^7.3.0",
 		"uuid": "^9.0.1",
 		"vite-plugin-static-copy": "^2.2.0"
 	},

+ 9 - 2
pyproject.toml

@@ -8,7 +8,7 @@ license = { file = "LICENSE" }
 dependencies = [
     "fastapi==0.115.7",
     "uvicorn[standard]==0.30.6",
-    "pydantic==2.9.2",
+    "pydantic==2.10.6",
     "python-multipart==0.0.18",
 
     "python-socketio==5.11.3",
@@ -53,6 +53,7 @@ dependencies = [
     "pymilvus==2.5.0",
     "qdrant-client~=1.12.0",
     "opensearch-py==2.8.0",
+    "playwright==1.49.1",
 
     "transformers",
     "sentence-transformers==3.3.1",
@@ -65,7 +66,7 @@ dependencies = [
     "pymdown-extensions==10.14.2",
     "docx2txt==0.8",
     "python-pptx==1.0.0",
-    "unstructured==0.16.11",
+    "unstructured==0.16.17",
     "nltk==3.9.1",
     "Markdown==3.7",
     "pypandoc==1.13",
@@ -108,7 +109,13 @@ dependencies = [
     "googleapis-common-protos==1.63.2",
     "google-cloud-storage==2.19.0",
 
+    "azure-identity==1.20.0",
+    "azure-storage-blob==12.24.1",
+
     "ldap3==2.9.1",
+
+    "firecrawl-py==1.12.0",
+
     "gcp-storage-emulator>=2024.8.3",
 ]
 readme = "README.md"

+ 9 - 0
run-compose.sh

@@ -74,6 +74,7 @@ usage() {
     echo "  --enable-api[port=PORT]    Enable API and expose it on the specified port."
     echo "  --webui[port=PORT]         Set the port for the web user interface."
     echo "  --data[folder=PATH]        Bind mount for ollama data folder (by default will create the 'ollama' volume)."
+    echo "  --playwright               Enable Playwright support for web scraping."
     echo "  --build                    Build the docker image before running the compose project."
     echo "  --drop                     Drop the compose project."
     echo "  -q, --quiet                Run script in headless mode."
@@ -100,6 +101,7 @@ webui_port=3000
 headless=false
 build_image=false
 kill_compose=false
+enable_playwright=false
 
 # Function to extract value from the parameter
 extract_value() {
@@ -129,6 +131,9 @@ while [[ $# -gt 0 ]]; do
             value=$(extract_value "$key")
             data_dir=${value:-"./ollama-data"}
             ;;
+        --playwright)
+            enable_playwright=true
+            ;;
         --drop)
             kill_compose=true
             ;;
@@ -182,6 +187,9 @@ else
         DEFAULT_COMPOSE_COMMAND+=" -f docker-compose.data.yaml"
         export OLLAMA_DATA_DIR=$data_dir # Set OLLAMA_DATA_DIR environment variable
     fi
+    if [[ $enable_playwright == true ]]; then
+        DEFAULT_COMPOSE_COMMAND+=" -f docker-compose.playwright.yaml"
+    fi
     if [[ -n $webui_port ]]; then
         export OPEN_WEBUI_PORT=$webui_port # Set OPEN_WEBUI_PORT environment variable
     fi
@@ -201,6 +209,7 @@ echo -e "   ${GREEN}${BOLD}GPU Count:${NC} ${OLLAMA_GPU_COUNT:-Not Enabled}"
 echo -e "   ${GREEN}${BOLD}WebAPI Port:${NC} ${OLLAMA_WEBAPI_PORT:-Not Enabled}"
 echo -e "   ${GREEN}${BOLD}Data Folder:${NC} ${data_dir:-Using ollama volume}"
 echo -e "   ${GREEN}${BOLD}WebUI Port:${NC} $webui_port"
+echo -e "   ${GREEN}${BOLD}Playwright:${NC} ${enable_playwright:-false}"
 echo
 
 if [[ $headless == true ]]; then

+ 32 - 0
scripts/prepare-pyodide.js

@@ -16,8 +16,39 @@ const packages = [
 ];
 
 import { loadPyodide } from 'pyodide';
+import { setGlobalDispatcher, ProxyAgent } from 'undici';
 import { writeFile, readFile, copyFile, readdir, rmdir } from 'fs/promises';
 
+/**
+ * Loading network proxy configurations from the environment variables.
+ * And the proxy config with lowercase name has the highest priority to use.
+ */
+function initNetworkProxyFromEnv() {
+	// we assume all subsequent requests in this script are HTTPS:
+	// https://cdn.jsdelivr.net
+	// https://pypi.org
+	// https://files.pythonhosted.org
+	const allProxy = process.env.all_proxy || process.env.ALL_PROXY;
+	const httpsProxy = process.env.https_proxy || process.env.HTTPS_PROXY;
+	const httpProxy = process.env.http_proxy || process.env.HTTP_PROXY;
+	const preferedProxy = httpsProxy || allProxy || httpProxy;
+	/**
+	 * use only http(s) proxy because socks5 proxy is not supported currently:
+	 * @see https://github.com/nodejs/undici/issues/2224
+	 */
+	if (!preferedProxy || !preferedProxy.startsWith('http')) return;
+	let preferedProxyURL;
+	try {
+		preferedProxyURL = new URL(preferedProxy).toString();
+	} catch {
+		console.warn(`Invalid network proxy URL: "${preferedProxy}"`);
+		return;
+	}
+	const dispatcher = new ProxyAgent({ uri: preferedProxyURL });
+	setGlobalDispatcher(dispatcher);
+	console.log(`Initialized network proxy "${preferedProxy}" from env`);
+}
+
 async function downloadPackages() {
 	console.log('Setting up pyodide + micropip');
 
@@ -84,5 +115,6 @@ async function copyPyodide() {
 	}
 }
 
+initNetworkProxyFromEnv();
 await downloadPackages();
 await copyPyodide();

+ 1 - 1
src/app.css

@@ -101,7 +101,7 @@ li p {
 
 /* Dark theme scrollbar styles */
 .dark ::-webkit-scrollbar-thumb {
-	background-color: rgba(33, 33, 33, 0.8); /* Darker color for dark theme */
+	background-color: rgba(42, 42, 42, 0.8); /* Darker color for dark theme */
 	border-color: rgba(0, 0, 0, var(--tw-border-opacity));
 }
 

+ 107 - 67
src/lib/components/admin/Settings/CodeExecution.svelte

@@ -91,45 +91,65 @@
 							</div>
 						</div>
 
-						<div class=" flex gap-2 w-full items-center justify-between">
-							<div class="text-xs font-medium">
-								{$i18n.t('Jupyter Auth')}
-							</div>
+						<div class="mb-2.5 flex flex-col gap-1.5 w-full">
+							<div class=" flex gap-2 w-full items-center justify-between">
+								<div class="text-xs font-medium">
+									{$i18n.t('Jupyter Auth')}
+								</div>
 
-							<div>
-								<select
-									class="dark:bg-gray-900 w-fit pr-8 rounded-sm px-2 p-1 text-xs bg-transparent outline-hidden text-left"
-									bind:value={config.CODE_EXECUTION_JUPYTER_AUTH}
-									placeholder={$i18n.t('Select an auth method')}
-								>
-									<option selected value="">{$i18n.t('None')}</option>
-									<option value="token">{$i18n.t('Token')}</option>
-									<option value="password">{$i18n.t('Password')}</option>
-								</select>
+								<div>
+									<select
+										class="dark:bg-gray-900 w-fit pr-8 rounded-sm px-2 p-1 text-xs bg-transparent outline-hidden text-left"
+										bind:value={config.CODE_EXECUTION_JUPYTER_AUTH}
+										placeholder={$i18n.t('Select an auth method')}
+									>
+										<option selected value="">{$i18n.t('None')}</option>
+										<option value="token">{$i18n.t('Token')}</option>
+										<option value="password">{$i18n.t('Password')}</option>
+									</select>
+								</div>
 							</div>
-						</div>
 
-						{#if config.CODE_EXECUTION_JUPYTER_AUTH}
-							<div class="flex w-full gap-2">
-								<div class="flex-1">
-									{#if config.CODE_EXECUTION_JUPYTER_AUTH === 'password'}
-										<SensitiveInput
-											type="text"
-											placeholder={$i18n.t('Enter Jupyter Password')}
-											bind:value={config.CODE_EXECUTION_JUPYTER_AUTH_PASSWORD}
-											autocomplete="off"
-										/>
-									{:else}
-										<SensitiveInput
-											type="text"
-											placeholder={$i18n.t('Enter Jupyter Token')}
-											bind:value={config.CODE_EXECUTION_JUPYTER_AUTH_TOKEN}
-											autocomplete="off"
-										/>
-									{/if}
+							{#if config.CODE_EXECUTION_JUPYTER_AUTH}
+								<div class="flex w-full gap-2">
+									<div class="flex-1">
+										{#if config.CODE_EXECUTION_JUPYTER_AUTH === 'password'}
+											<SensitiveInput
+												type="text"
+												placeholder={$i18n.t('Enter Jupyter Password')}
+												bind:value={config.CODE_EXECUTION_JUPYTER_AUTH_PASSWORD}
+												autocomplete="off"
+											/>
+										{:else}
+											<SensitiveInput
+												type="text"
+												placeholder={$i18n.t('Enter Jupyter Token')}
+												bind:value={config.CODE_EXECUTION_JUPYTER_AUTH_TOKEN}
+												autocomplete="off"
+											/>
+										{/if}
+									</div>
 								</div>
+							{/if}
+						</div>
+
+						<div class="flex gap-2 w-full items-center justify-between">
+							<div class="text-xs font-medium">
+								{$i18n.t('Code Execution Timeout')}
 							</div>
-						{/if}
+
+							<div class="">
+								<Tooltip content={$i18n.t('Enter timeout in seconds')}>
+									<input
+										class="dark:bg-gray-900 w-fit rounded-sm px-2 p-1 text-xs bg-transparent outline-hidden text-right"
+										type="number"
+										bind:value={config.CODE_EXECUTION_JUPYTER_TIMEOUT}
+										placeholder={$i18n.t('e.g. 60')}
+										autocomplete="off"
+									/>
+								</Tooltip>
+							</div>
+						</div>
 					{/if}
 				</div>
 
@@ -197,45 +217,65 @@
 								</div>
 							</div>
 
+							<div class="mb-2.5 flex flex-col gap-1.5 w-full">
+								<div class="flex gap-2 w-full items-center justify-between">
+									<div class="text-xs font-medium">
+										{$i18n.t('Jupyter Auth')}
+									</div>
+
+									<div>
+										<select
+											class="dark:bg-gray-900 w-fit pr-8 rounded-sm px-2 p-1 text-xs bg-transparent outline-hidden text-left"
+											bind:value={config.CODE_INTERPRETER_JUPYTER_AUTH}
+											placeholder={$i18n.t('Select an auth method')}
+										>
+											<option selected value="">{$i18n.t('None')}</option>
+											<option value="token">{$i18n.t('Token')}</option>
+											<option value="password">{$i18n.t('Password')}</option>
+										</select>
+									</div>
+								</div>
+
+								{#if config.CODE_INTERPRETER_JUPYTER_AUTH}
+									<div class="flex w-full gap-2">
+										<div class="flex-1">
+											{#if config.CODE_INTERPRETER_JUPYTER_AUTH === 'password'}
+												<SensitiveInput
+													type="text"
+													placeholder={$i18n.t('Enter Jupyter Password')}
+													bind:value={config.CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD}
+													autocomplete="off"
+												/>
+											{:else}
+												<SensitiveInput
+													type="text"
+													placeholder={$i18n.t('Enter Jupyter Token')}
+													bind:value={config.CODE_INTERPRETER_JUPYTER_AUTH_TOKEN}
+													autocomplete="off"
+												/>
+											{/if}
+										</div>
+									</div>
+								{/if}
+							</div>
+
 							<div class="flex gap-2 w-full items-center justify-between">
 								<div class="text-xs font-medium">
-									{$i18n.t('Jupyter Auth')}
+									{$i18n.t('Code Execution Timeout')}
 								</div>
 
-								<div>
-									<select
-										class="dark:bg-gray-900 w-fit pr-8 rounded-sm px-2 p-1 text-xs bg-transparent outline-hidden text-left"
-										bind:value={config.CODE_INTERPRETER_JUPYTER_AUTH}
-										placeholder={$i18n.t('Select an auth method')}
-									>
-										<option selected value="">{$i18n.t('None')}</option>
-										<option value="token">{$i18n.t('Token')}</option>
-										<option value="password">{$i18n.t('Password')}</option>
-									</select>
+								<div class="">
+									<Tooltip content={$i18n.t('Enter timeout in seconds')}>
+										<input
+											class="dark:bg-gray-900 w-fit rounded-sm px-2 p-1 text-xs bg-transparent outline-hidden text-right"
+											type="number"
+											bind:value={config.CODE_INTERPRETER_JUPYTER_TIMEOUT}
+											placeholder={$i18n.t('e.g. 60')}
+											autocomplete="off"
+										/>
+									</Tooltip>
 								</div>
 							</div>
-
-							{#if config.CODE_INTERPRETER_JUPYTER_AUTH}
-								<div class="flex w-full gap-2">
-									<div class="flex-1">
-										{#if config.CODE_INTERPRETER_JUPYTER_AUTH === 'password'}
-											<SensitiveInput
-												type="text"
-												placeholder={$i18n.t('Enter Jupyter Password')}
-												bind:value={config.CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD}
-												autocomplete="off"
-											/>
-										{:else}
-											<SensitiveInput
-												type="text"
-												placeholder={$i18n.t('Enter Jupyter Token')}
-												bind:value={config.CODE_INTERPRETER_JUPYTER_AUTH_TOKEN}
-												autocomplete="off"
-											/>
-										{/if}
-									</div>
-								</div>
-							{/if}
 						{/if}
 
 						<hr class="border-gray-100 dark:border-gray-850 my-2" />

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

@@ -27,7 +27,6 @@
 	import SensitiveInput from '$lib/components/common/SensitiveInput.svelte';
 	import Tooltip from '$lib/components/common/Tooltip.svelte';
 	import Switch from '$lib/components/common/Switch.svelte';
-	import { text } from '@sveltejs/kit';
 	import Textarea from '$lib/components/common/Textarea.svelte';
 
 	const i18n = getContext('i18n');
@@ -56,6 +55,8 @@
 	let chunkOverlap = 0;
 	let pdfExtractImages = true;
 
+	let RAG_FULL_CONTEXT = false;
+
 	let enableGoogleDriveIntegration = false;
 
 	let OpenAIUrl = '';
@@ -182,6 +183,7 @@
 				max_size: fileMaxSize === '' ? null : fileMaxSize,
 				max_count: fileMaxCount === '' ? null : fileMaxCount
 			},
+			RAG_FULL_CONTEXT: RAG_FULL_CONTEXT,
 			chunk: {
 				text_splitter: textSplitter,
 				chunk_overlap: chunkOverlap,
@@ -242,6 +244,8 @@
 			chunkSize = res.chunk.chunk_size;
 			chunkOverlap = res.chunk.chunk_overlap;
 
+			RAG_FULL_CONTEXT = res.RAG_FULL_CONTEXT;
+
 			contentExtractionEngine = res.content_extraction.engine;
 			tikaServerUrl = res.content_extraction.tika_server_url;
 			showTikaServerUrl = contentExtractionEngine === 'tika';
@@ -388,6 +392,19 @@
 					{/if}
 				</button>
 			</div>
+
+			<div class=" py-0.5 flex w-full justify-between">
+				<div class=" self-center text-xs font-medium">{$i18n.t('Full Context Mode')}</div>
+				<div class="flex items-center relative">
+					<Tooltip
+						content={RAG_FULL_CONTEXT
+							? 'Inject entire contents as context for comprehensive processing, this is recommended for complex queries.'
+							: 'Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.'}
+					>
+						<Switch bind:state={RAG_FULL_CONTEXT} />
+					</Tooltip>
+				</div>
+			</div>
 		</div>
 
 		<hr class="border-gray-100 dark:border-gray-850" />

+ 22 - 0
src/lib/components/admin/Settings/Images.svelte

@@ -261,6 +261,9 @@
 										} else if (config.engine === 'openai' && config.openai.OPENAI_API_KEY === '') {
 											toast.error($i18n.t('OpenAI API Key is required.'));
 											config.enabled = false;
+										} else if (config.engine === 'gemini' && config.gemini.GEMINI_API_KEY === '') {
+											toast.error($i18n.t('Gemini API Key is required.'));
+											config.enabled = false;
 										}
 									}
 
@@ -294,6 +297,7 @@
 							<option value="openai">{$i18n.t('Default (Open AI)')}</option>
 							<option value="comfyui">{$i18n.t('ComfyUI')}</option>
 							<option value="automatic1111">{$i18n.t('Automatic1111')}</option>
+							<option value="gemini">{$i18n.t('Gemini')}</option>
 						</select>
 					</div>
 				</div>
@@ -605,6 +609,24 @@
 							/>
 						</div>
 					</div>
+				{:else if config?.engine === 'gemini'}
+					<div>
+						<div class=" mb-1.5 text-sm font-medium">{$i18n.t('Gemini API Config')}</div>
+
+						<div class="flex gap-2 mb-1">
+							<input
+								class="flex-1 w-full text-sm bg-transparent outline-none"
+								placeholder={$i18n.t('API Base URL')}
+								bind:value={config.gemini.GEMINI_API_BASE_URL}
+								required
+							/>
+
+							<SensitiveInput
+								placeholder={$i18n.t('API Key')}
+								bind:value={config.gemini.GEMINI_API_KEY}
+							/>
+						</div>
+					</div>
 				{/if}
 			</div>
 

+ 1 - 1
src/lib/components/admin/Settings/Interface.svelte

@@ -51,7 +51,7 @@
 	onMount(async () => {
 		taskConfig = await getTaskConfig(localStorage.token);
 
-		promptSuggestions = $config?.default_prompt_suggestions;
+		promptSuggestions = $config?.default_prompt_suggestions ?? [];
 		banners = await getBanners(localStorage.token);
 	});
 

+ 2 - 1
src/lib/components/admin/Users/UserList.svelte

@@ -85,8 +85,9 @@
 				return true;
 			} else {
 				let name = user.name.toLowerCase();
+				let email = user.email.toLowerCase();
 				const query = search.toLowerCase();
-				return name.includes(query);
+				return name.includes(query) || email.includes(query);
 			}
 		})
 		.sort((a, b) => {

+ 1 - 1
src/lib/components/chat/MessageInput.svelte

@@ -430,7 +430,7 @@
 								</div>
 							{/if}
 
-							{#if webSearchEnabled || ($settings?.webSearch ?? false) === 'always'}
+							{#if webSearchEnabled || ($config?.features?.enable_web_search && ($settings?.webSearch ?? false)) === 'always'}
 								<div class="flex items-center justify-between w-full">
 									<div class="flex items-center gap-2.5 text-sm dark:text-gray-500">
 										<div class="pl-1">

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

@@ -7,6 +7,7 @@
 
 	const i18n = getContext('i18n');
 
+	export let id = '';
 	export let sources = [];
 
 	let citations = [];
@@ -100,7 +101,7 @@
 			<div class="flex text-xs font-medium flex-wrap">
 				{#each citations as citation, idx}
 					<button
-						id={`source-${idx}`}
+						id={`source-${id}-${idx}`}
 						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;
@@ -179,7 +180,7 @@
 					<div class="flex text-xs font-medium flex-wrap">
 						{#each citations as citation, idx}
 							<button
-								id={`source-${idx}`}
+								id={`source-${id}-${idx}`}
 								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;

+ 109 - 12
src/lib/components/chat/Messages/CodeBlock.svelte

@@ -123,6 +123,12 @@
 	};
 
 	const executePython = async (code) => {
+		result = null;
+		stdout = null;
+		stderr = null;
+
+		executing = true;
+
 		if ($config?.code?.engine === 'jupyter') {
 			const output = await executeCode(localStorage.token, code).catch((error) => {
 				toast.error(`${error}`);
@@ -130,22 +136,74 @@
 			});
 
 			if (output) {
-				stdout = output.stdout;
-				stderr = output.stderr;
-				result = output.result;
+				if (output['stdout']) {
+					stdout = output['stdout'];
+					const stdoutLines = stdout.split('\n');
+
+					for (const [idx, line] of stdoutLines.entries()) {
+						if (line.startsWith('data:image/png;base64')) {
+							if (files) {
+								files.push({
+									type: 'image/png',
+									data: line
+								});
+							} else {
+								files = [
+									{
+										type: 'image/png',
+										data: line
+									}
+								];
+							}
+
+							if (stdout.startsWith(`${line}\n`)) {
+								stdout = stdout.replace(`${line}\n`, ``);
+							} else if (stdout.startsWith(`${line}`)) {
+								stdout = stdout.replace(`${line}`, ``);
+							}
+						}
+					}
+				}
+
+				if (output['result']) {
+					result = output['result'];
+					const resultLines = result.split('\n');
+
+					for (const [idx, line] of resultLines.entries()) {
+						if (line.startsWith('data:image/png;base64')) {
+							if (files) {
+								files.push({
+									type: 'image/png',
+									data: line
+								});
+							} else {
+								files = [
+									{
+										type: 'image/png',
+										data: line
+									}
+								];
+							}
+
+							if (result.startsWith(`${line}\n`)) {
+								result = result.replace(`${line}\n`, ``);
+							} else if (result.startsWith(`${line}`)) {
+								result = result.replace(`${line}`, ``);
+							}
+						}
+					}
+				}
+
+				output['stderr'] && (stderr = output['stderr']);
 			}
+
+			executing = false;
 		} else {
 			executePythonAsWorker(code);
 		}
 	};
 
 	const executePythonAsWorker = async (code) => {
-		result = null;
-		stdout = null;
-		stderr = null;
-
-		executing = true;
-
 		let packages = [
 			code.includes('requests') ? 'requests' : null,
 			code.includes('bs4') ? 'beautifulsoup4' : null,
@@ -205,7 +263,40 @@
 							];
 						}
 
-						stdout = stdout.replace(`${line}\n`, ``);
+						if (stdout.startsWith(`${line}\n`)) {
+							stdout = stdout.replace(`${line}\n`, ``);
+						} else if (stdout.startsWith(`${line}`)) {
+							stdout = stdout.replace(`${line}`, ``);
+						}
+					}
+				}
+			}
+
+			if (data['result']) {
+				result = data['result'];
+				const resultLines = result.split('\n');
+
+				for (const [idx, line] of resultLines.entries()) {
+					if (line.startsWith('data:image/png;base64')) {
+						if (files) {
+							files.push({
+								type: 'image/png',
+								data: line
+							});
+						} else {
+							files = [
+								{
+									type: 'image/png',
+									data: line
+								}
+							];
+						}
+
+						if (result.startsWith(`${line}\n`)) {
+							result = result.replace(`${line}\n`, ``);
+						} else if (result.startsWith(`${line}`)) {
+							result = result.replace(`${line}`, ``);
+						}
 					}
 				}
 			}
@@ -391,7 +482,7 @@
 				class="bg-gray-50 dark:bg-[#202123] dark:text-white max-w-full overflow-x-auto scrollbar-hidden"
 			/>
 
-			{#if executing || stdout || stderr || result}
+			{#if executing || stdout || stderr || result || files}
 				<div
 					class="bg-gray-50 dark:bg-[#202123] dark:text-white rounded-b-lg! py-4 px-4 flex flex-col gap-2"
 				>
@@ -404,7 +495,13 @@
 						{#if stdout || stderr}
 							<div class=" ">
 								<div class=" text-gray-500 text-xs mb-1">STDOUT/STDERR</div>
-								<div class="text-sm">{stdout || stderr}</div>
+								<div
+									class="text-sm {stdout?.split('\n')?.length > 100
+										? `max-h-96`
+										: ''}  overflow-y-auto"
+								>
+									{stdout || stderr}
+								</div>
 							</div>
 						{/if}
 						{#if result || files}

+ 5 - 0
src/lib/components/chat/Messages/ContentRenderer.svelte

@@ -120,6 +120,11 @@
 		sourceIds={(sources ?? []).reduce((acc, s) => {
 			let ids = [];
 			s.document.forEach((document, index) => {
+				if (model?.info?.meta?.capabilities?.citations == false) {
+					ids.push('N/A');
+					return ids;
+				}
+
 				const metadata = s.metadata?.[index];
 				const id = metadata?.source ?? 'N/A';
 

+ 1 - 1
src/lib/components/chat/Messages/Markdown/MarkdownInlineTokens.svelte

@@ -29,7 +29,7 @@
 		{:else if token.text.includes(`<iframe src="${WEBUI_BASE_URL}/api/v1/files/`)}
 			{@html `${token.text}`}
 		{:else if token.text.includes(`<source_id`)}
-			<Source {token} onClick={onSourceClick} />
+			<Source {id} {token} onClick={onSourceClick} />
 		{:else}
 			{token.text}
 		{/if}

+ 9 - 4
src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte

@@ -76,7 +76,7 @@
 	{#if token.type === 'hr'}
 		<hr class=" border-gray-100 dark:border-gray-850" />
 	{:else if token.type === 'heading'}
-		<svelte:element this={headerComponent(token.depth)}>
+		<svelte:element this={headerComponent(token.depth)} dir="auto">
 			<MarkdownInlineTokens id={`${id}-${tokenIdx}-h`} tokens={token.tokens} {onSourceClick} />
 		</svelte:element>
 	{:else if token.type === 'code'}
@@ -176,7 +176,7 @@
 		{#if token.ordered}
 			<ol start={token.start || 1}>
 				{#each token.items as item, itemIdx}
-					<li dir="auto">
+					<li dir="auto" class="text-start">
 						{#if item?.task}
 							<input
 								class=" translate-y-[1px] -translate-x-1"
@@ -208,7 +208,7 @@
 		{:else}
 			<ul>
 				{#each token.items as item, itemIdx}
-					<li dir="auto">
+					<li dir="auto" class="text-start">
 						{#if item?.task}
 							<input
 								class=" translate-y-[1px] -translate-x-1"
@@ -239,7 +239,12 @@
 			</ul>
 		{/if}
 	{:else if token.type === 'details'}
-		<Collapsible title={token.summary} attributes={token?.attributes} className="w-full space-y-1">
+		<Collapsible
+			title={token.summary}
+			attributes={token?.attributes}
+			className="w-full space-y-1"
+			dir="auto"
+		>
 			<div class=" mb-1.5" slot="content">
 				<svelte:self
 					id={`${id}-${tokenIdx}-d`}

+ 14 - 11
src/lib/components/chat/Messages/Markdown/Source.svelte

@@ -1,8 +1,9 @@
 <script lang="ts">
+	export let id;
 	export let token;
 	export let onClick: Function = () => {};
 
-	let attributes: Record<string, string> = {};
+	let attributes: Record<string, string | undefined> = {};
 
 	function extractAttributes(input: string): Record<string, string> {
 		const regex = /(\w+)="([^"]*)"/g;
@@ -35,13 +36,15 @@
 	$: attributes = extractAttributes(token.text);
 </script>
 
-<button
-	class="text-xs font-medium w-fit translate-y-[2px] px-2 py-0.5 dark:bg-white/5 dark:text-white/60 dark:hover:text-white bg-gray-50 text-black/60 hover:text-black transition rounded-lg"
-	on:click={() => {
-		onClick(attributes.data);
-	}}
->
-	<span class="line-clamp-1">
-		{formattedTitle(attributes.title)}
-	</span>
-</button>
+{#if attributes.title !== 'N/A'}
+	<button
+		class="text-xs font-medium w-fit translate-y-[2px] px-2 py-0.5 dark:bg-white/5 dark:text-white/60 dark:hover:text-white bg-gray-50 text-black/60 hover:text-black transition rounded-lg"
+		on:click={() => {
+			onClick(id, attributes.data);
+		}}
+	>
+		<span class="line-clamp-1">
+			{attributes.title ? formattedTitle(attributes.title) : ''}
+		</span>
+	</button>
+{/if}

+ 5 - 5
src/lib/components/chat/Messages/ResponseMessage.svelte

@@ -732,9 +732,9 @@
 										onTaskClick={async (e) => {
 											console.log(e);
 										}}
-										onSourceClick={async (e) => {
-											console.log(e);
-											let sourceButton = document.getElementById(`source-${e}`);
+										onSourceClick={async (id, idx) => {
+											console.log(id, idx);
+											let sourceButton = document.getElementById(`source-${message.id}-${idx}`);
 											const sourcesCollapsible = document.getElementById(`collapsible-sources`);
 
 											if (sourceButton) {
@@ -753,7 +753,7 @@
 												});
 
 												// Try clicking the source button again
-												sourceButton = document.getElementById(`source-${e}`);
+												sourceButton = document.getElementById(`source-${message.id}-${idx}`);
 												sourceButton && sourceButton.click();
 											}
 										}}
@@ -790,7 +790,7 @@
 								{/if}
 
 								{#if (message?.sources || message?.citations) && (model?.info?.meta?.capabilities?.citations ?? true)}
-									<Citations sources={message?.sources ?? message?.citations} />
+									<Citations id={message?.id} sources={message?.sources ?? message?.citations} />
 								{/if}
 
 								{#if message.code_executions}

+ 25 - 6
src/lib/components/common/FileItemModal.svelte

@@ -1,6 +1,7 @@
 <script lang="ts">
 	import { getContext, onMount } from 'svelte';
 	import { formatFileSize, getLineCount } from '$lib/utils';
+	import { WEBUI_API_BASE_URL } from '$lib/constants';
 
 	const i18n = getContext('i18n');
 
@@ -12,14 +13,15 @@
 
 	export let item;
 	export let show = false;
-
 	export let edit = false;
 
 	let enableFullContent = false;
+	$: isPDF =
+		item?.meta?.content_type === 'application/pdf' ||
+		(item?.name && item?.name.toLowerCase().endsWith('.pdf'));
 
 	onMount(() => {
 		console.log(item);
-
 		if (item?.context === 'full') {
 			enableFullContent = true;
 		}
@@ -33,9 +35,16 @@
 				<div>
 					<div class=" font-medium text-lg dark:text-gray-100">
 						<a
-							href={item.url ? (item.type === 'file' ? `${item.url}/content` : `${item.url}`) : '#'}
-							target="_blank"
+							href="#"
 							class="hover:underline line-clamp-1"
+							on:click|preventDefault={() => {
+								if (!isPDF && item.url) {
+									window.open(
+										item.type === 'file' ? `${item.url}/content` : `${item.url}`,
+										'_blank'
+									);
+								}
+							}}
 						>
 							{item?.name ?? 'File'}
 						</a>
@@ -101,8 +110,18 @@
 			</div>
 		</div>
 
-		<div class="max-h-96 overflow-scroll scrollbar-hidden text-xs whitespace-pre-wrap">
-			{item?.file?.data?.content ?? 'No content'}
+		<div class="max-h-[75vh] overflow-auto">
+			{#if isPDF}
+				<iframe
+					title={item?.name}
+					src={`${WEBUI_API_BASE_URL}/files/${item.id}/content`}
+					class="w-full h-[70vh] border-0 rounded-lg mt-4"
+				/>
+			{:else}
+				<div class="max-h-96 overflow-scroll scrollbar-hidden text-xs whitespace-pre-wrap">
+					{item?.file?.data?.content ?? 'No content'}
+				</div>
+			{/if}
 		</div>
 	</div>
 </Modal>

+ 1 - 2
src/lib/components/common/Modal.svelte

@@ -6,7 +6,6 @@
 
 	export let show = true;
 	export let size = 'md';
-
 	export let containerClassName = 'p-3';
 	export let className = 'bg-gray-50 dark:bg-gray-900 rounded-2xl';
 
@@ -74,7 +73,7 @@
 		}}
 	>
 		<div
-			class=" m-auto max-w-full {sizeToWidth(size)} {size !== 'full'
+			class="m-auto max-w-full {sizeToWidth(size)} {size !== 'full'
 				? 'mx-2'
 				: ''} shadow-3xl min-h-fit scrollbar-hidden {className}"
 			in:flyAndScale

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "أسقط أية ملفات هنا لإضافتها إلى المحادثة",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "e.g. '30s','10m'. الوحدات الزمنية الصالحة هي 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "أدخل Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "الرابط (e.g. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "URL (e.g. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "عام",
 	"General Settings": "الاعدادات العامة",
 	"Generate an image": "",

+ 795 - 789
src/lib/i18n/locales/bg-BG/translation.json

@@ -1,246 +1,247 @@
 {
-	"-1 for no limit, or a positive integer for a specific limit": "",
+	"-1 for no limit, or a positive integer for a specific limit": "-1 за липса на ограничение или положително цяло число за определено ограничение.",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' или '-1' за неограничен срок.",
-	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
-	"(e.g. `sh webui.sh --api`)": "(например `sh webui.sh --api`)",
+	"(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)": "(последна)",
-	"{{ models }}": "{{ модели }}",
-	"{{COUNT}} Replies": "",
+	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "{{COUNT}} Отговори",
 	"{{user}}'s Chats": "{{user}}'s чатове",
 	"{{webUIName}} Backend Required": "{{webUIName}} Изисква се Бекенд",
-	"*Prompt node ID(s) are required for image generation": "",
-	"A new version (v{{LATEST_VERSION}}) is now available.": "",
+	"*Prompt node ID(s) are required for image generation": "*Идентификаторът(ите) на node-а се изисква(т) за генериране на изображения",
+	"A new version (v{{LATEST_VERSION}}) is now available.": "Вече е налична нова версия (v{{LATEST_VERSION}}).",
 	"A task model is used when performing tasks such as generating titles for chats and web search queries": "Моделът на задачите се използва при изпълнение на задачи като генериране на заглавия за чатове и заявки за търсене в мрежата",
 	"a user": "потребител",
 	"About": "Относно",
-	"Access": "",
-	"Access Control": "",
-	"Accessible to all users": "",
+	"Access": "Достъп",
+	"Access Control": "Контрол на достъпа",
+	"Accessible to all users": "Достъпно за всички потребители",
 	"Account": "Акаунт",
-	"Account Activation Pending": "",
-	"Accurate information": "Точни информация",
-	"Actions": "",
-	"Activate": "",
-	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "",
-	"Active Users": "",
+	"Account Activation Pending": "Активирането на акаунта е в процес на изчакване",
+	"Accurate information": "Точна информация",
+	"Actions": "Действия",
+	"Activate": "Активиране",
+	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Активирайте тази команда, като въведете \"/{{COMMAND}}\" в полето за чат.",
+	"Active Users": "Активни потребители",
 	"Add": "Добавяне",
-	"Add a model ID": "",
+	"Add a model ID": "Добавете ID на модел",
 	"Add a short description about what this model does": "Добавете кратко описание за това какво прави този модел",
 	"Add a tag": "Добавяне на таг",
-	"Add Arena Model": "",
-	"Add Connection": "",
-	"Add Content": "",
-	"Add content here": "",
+	"Add Arena Model": "Добавяне на Arena модел",
+	"Add Connection": "Добавяне на връзка",
+	"Add Content": "Добавяне на съдържание",
+	"Add content here": "Добавете съдържание тук",
 	"Add custom prompt": "Добавяне на собствен промпт",
-	"Add Files": "Добавяне на Файлове",
-	"Add Group": "",
+	"Add Files": "Добавяне на Файлове",
+	"Add Group": "Добавяне на група",
 	"Add Memory": "Добавяне на Памет",
 	"Add Model": "Добавяне на Модел",
-	"Add Reaction": "",
-	"Add Tag": "",
-	"Add Tags": "добавяне на тагове",
-	"Add text content": "",
+	"Add Reaction": "Добавяне на реакция",
+	"Add Tag": "Добавяне на таг",
+	"Add Tags": "Добавяне на тагове",
+	"Add text content": "Добавяне на текстово съдържание",
 	"Add User": "Добавяне на потребител",
-	"Add User Group": "",
+	"Add User Group": "Добавяне на потребителска група",
 	"Adjusting these settings will apply changes universally to all users.": "При промяна на тези настройки промените се прилагат за всички потребители.",
 	"admin": "админ",
-	"Admin": "",
+	"Admin": "Администратор",
 	"Admin Panel": "Панел на Администратор",
 	"Admin Settings": "Настройки на Администратор",
-	"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
+	"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Администраторите имат достъп до всички инструменти по всяко време; потребителите се нуждаят от инструменти, присвоени за всеки модел в работното пространство.",
 	"Advanced Parameters": "Разширени Параметри",
 	"Advanced Params": "Разширени параметри",
 	"All Documents": "Всички Документи",
-	"All models deleted successfully": "",
-	"Allow Chat Controls": "",
-	"Allow Chat Delete": "",
+	"All models deleted successfully": "Всички модели са изтрити успешно",
+	"Allow Chat Controls": "Разреши контроли на чата",
+	"Allow Chat Delete": "Разреши изтриване на чат",
 	"Allow Chat Deletion": "Позволи Изтриване на Чат",
-	"Allow Chat Edit": "",
-	"Allow File Upload": "",
-	"Allow non-local voices": "",
-	"Allow Temporary Chat": "",
-	"Allow User Location": "",
-	"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. (Default: 0.0)": "",
-	"Always": "",
-	"Amazing": "",
+	"Allow Chat Edit": "Разреши редактиране на чат",
+	"Allow File Upload": "Разреши качване на файлове",
+	"Allow non-local voices": "Разреши нелокални гласове",
+	"Allow Temporary Chat": "Разреши временен чат",
+	"Allow User Location": "Разреши местоположение на потребителя",
+	"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. (Default: 0.0)": "Алтернатива на top_p, която цели да осигури баланс между качество и разнообразие. Параметърът p представлява минималната вероятност за разглеждане на токен, спрямо вероятността на най-вероятния токен. Например, при p=0.05 и най-вероятен токен с вероятност 0.9, логитите със стойност по-малка от 0.045 се филтрират. (По подразбиране: 0.0)",
+	"Always": "Винаги",
+	"Amazing": "Невероятно",
 	"an assistant": "асистент",
-	"Analyzed": "",
-	"Analyzing...": "",
+	"Analyzed": "Анализирано",
+	"Analyzing...": "Анализиране...",
 	"and": "и",
-	"and {{COUNT}} more": "",
+	"and {{COUNT}} more": "и още {{COUNT}}",
 	"and create a new shared link.": "и създай нов общ линк.",
 	"API Base URL": "API Базов URL",
 	"API Key": "API Ключ",
 	"API Key created.": "API Ключ създаден.",
-	"API Key Endpoint Restrictions": "",
+	"API Key Endpoint Restrictions": "Ограничения на крайните точки за API Ключ",
 	"API keys": "API Ключове",
-	"Application DN": "",
-	"Application DN Password": "",
-	"applies to all users with the \"user\" role": "",
+	"Application DN": "DN на приложението",
+	"Application DN Password": "Парола за DN на приложението",
+	"applies to all users with the \"user\" role": "прилага се за всички потребители с роля \"потребител\"",
 	"April": "Април",
 	"Archive": "Архивирани Чатове",
 	"Archive All Chats": "Архив Всички чатове",
 	"Archived Chats": "Архивирани Чатове",
-	"archived-chat-export": "",
-	"Are you sure you want to delete this channel?": "",
-	"Are you sure you want to delete this message?": "",
-	"Are you sure you want to unarchive all archived chats?": "",
+	"archived-chat-export": "експорт-на-архивирани-чатове",
+	"Are you sure you want to delete this channel?": "Сигурни ли сте, че искате да изтриете този канал?",
+	"Are you sure you want to delete this message?": "Сигурни ли сте, че искате да изтриете това съобщение?",
+	"Are you sure you want to unarchive all archived chats?": "Сигурни ли сте, че искате да разархивирате всички архивирани чатове?",
 	"Are you sure?": "Сигурни ли сте?",
-	"Arena Models": "",
-	"Artifacts": "",
-	"Ask a question": "",
-	"Assistant": "",
+	"Arena Models": "Arena Модели",
+	"Artifacts": "Артефакти",
+	"Ask a question": "Задайте въпрос",
+	"Assistant": "Асистент",
 	"Attach file": "Прикачване на файл",
 	"Attention to detail": "Внимание към детайлите",
-	"Attribute for Mail": "",
-	"Attribute for Username": "",
+	"Attribute for Mail": "Атрибут за поща",
+	"Attribute for Username": "Атрибут за потребителско име",
 	"Audio": "Аудио",
 	"August": "Август",
-	"Authenticate": "",
-	"Authentication": "",
-	"Auto-Copy Response to Clipboard": "Аувтоматично копиране на отговор в клипборда",
-	"Auto-playback response": "Аувтоматично възпроизвеждане на Отговора",
-	"Autocomplete Generation": "",
-	"Autocomplete Generation Input Max Length": "",
-	"Automatic1111": "",
-	"AUTOMATIC1111 Api Auth String": "",
+	"Authenticate": "Удостоверяване",
+	"Authentication": "Автентикация",
+	"Auto-Copy Response to Clipboard": "Автоматично копиране на отговор в клипборда",
+	"Auto-playback response": "Автоматично възпроизвеждане на отговора",
+	"Autocomplete Generation": "Генериране на автоматично довършване",
+	"Autocomplete Generation Input Max Length": "Максимална дължина на входа за генериране на автоматично довършване",
+	"Automatic1111": "Automatic1111",
+	"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api Auth низ",
 	"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Базов URL",
 	"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Базов URL е задължителен.",
-	"Available list": "",
+	"Available list": "Наличен списък",
 	"available!": "наличен!",
-	"Awful": "",
-	"Azure AI Speech": "",
-	"Azure Region": "",
+	"Awful": "Ужасно",
+	"Azure AI Speech": "Azure AI Реч",
+	"Azure Region": "Azure Регион",
 	"Back": "Назад",
 	"Bad Response": "Невалиден отговор от API",
 	"Banners": "Банери",
 	"Base Model (From)": "Базов модел (от)",
-	"Batch Size (num_batch)": "",
+	"Batch Size (num_batch)": "Размер на партидата (num_batch)",
 	"before": "преди",
 	"Being lazy": "Да бъдеш мързелив",
-	"Beta": "",
-	"Bing Search V7 Endpoint": "",
-	"Bing Search V7 Subscription Key": "",
-	"Bocha Search API Key": "",
-	"Brave Search API Key": "Смел ключ за API за търсене",
-	"By {{name}}": "",
+	"Beta": "Бета",
+	"Bing Search V7 Endpoint": "Крайна точка за Bing Search V7",
+	"Bing Search V7 Subscription Key": "Абонаментен ключ за Bing Search V7",
+	"Bocha Search API Key": "API ключ за Bocha Search",
+	"Brave Search API Key": "API ключ за Brave Search",
+	"By {{name}}": "От {{name}}",
 	"Bypass SSL verification for Websites": "Изключване на SSL проверката за сайтове",
-	"Calendar": "",
-	"Call": "",
-	"Call feature is not supported when using Web STT engine": "",
-	"Camera": "",
+	"Calendar": "Календар",
+	"Call": "Обаждане",
+	"Call feature is not supported when using Web STT engine": "Функцията за обаждане не се поддържа при използване на Web STT двигател",
+	"Camera": "Камера",
 	"Cancel": "Отказ",
 	"Capabilities": "Възможности",
-	"Capture": "",
-	"Certificate Path": "",
+	"Capture": "Заснемане",
+	"Certificate Path": "Път до сертификата",
 	"Change Password": "Промяна на Парола",
-	"Channel Name": "",
-	"Channels": "",
-	"Character": "",
-	"Character limit for autocomplete generation input": "",
-	"Chart new frontiers": "",
+	"Channel Name": "Име на канала",
+	"Channels": "Канали",
+	"Character": "Герой",
+	"Character limit for autocomplete generation input": "Ограничение на символите за входа на генериране на автоматично довършване",
+	"Chart new frontiers": "Начертайте нови граници",
 	"Chat": "Чат",
-	"Chat Background Image": "",
-	"Chat Bubble UI": "UI за чат бублон",
-	"Chat Controls": "",
+	"Chat Background Image": "Фоново изображение на чата",
+	"Chat Bubble UI": "UI за чат балон",
+	"Chat Controls": "Контроли на чата",
 	"Chat direction": "Направление на чата",
-	"Chat Overview": "",
-	"Chat Permissions": "",
-	"Chat Tags Auto-Generation": "",
+	"Chat Overview": "Преглед на чата",
+	"Chat Permissions": "Разрешения за чат",
+	"Chat Tags Auto-Generation": "Автоматично генериране на тагове за чат",
 	"Chats": "Чатове",
 	"Check Again": "Проверете Още Веднъж",
 	"Check for updates": "Проверка за актуализации",
 	"Checking for updates...": "Проверка за актуализации...",
 	"Choose a model before saving...": "Изберете модел преди запазване...",
-	"Chunk Overlap": "Chunk Overlap",
-	"Chunk Params": "Chunk Params",
-	"Chunk Size": "Chunk Size",
-	"Ciphers": "",
+	"Chunk Overlap": "Припокриване на чънкове",
+	"Chunk Params": "Параметри на чънковете",
+	"Chunk Size": "Размер на чънк",
+	"Ciphers": "Шифри",
 	"Citation": "Цитат",
-	"Clear memory": "",
-	"click here": "",
-	"Click here for filter guides.": "",
+	"Clear memory": "Изчистване на паметта",
+	"click here": "натиснете тук",
+	"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.": "",
-	"Click here to see available models.": "",
+	"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 see available models.": "Натиснете тук, за да видите наличните модели.",
 	"Click here to select": "Натиснете тук, за да изберете",
 	"Click here to select a csv file.": "Натиснете тук, за да изберете csv файл.",
-	"Click here to select a py file.": "",
-	"Click here to upload a workflow.json file.": "",
+	"Click here to select a py file.": "Натиснете тук, за да изберете py файл.",
+	"Click here to upload a workflow.json file.": "Натиснете тук, за да качите workflow.json файл.",
 	"click here.": "натиснете тук.",
 	"Click on the user role button to change a user's role.": "Натиснете върху бутона за промяна на ролята на потребителя.",
-	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
+	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Разрешението за запис в клипборда е отказано. Моля, проверете настройките на браузъра си, за да предоставите необходимия достъп.",
 	"Clone": "Клонинг",
-	"Clone Chat": "",
-	"Clone of {{TITLE}}": "",
+	"Clone Chat": "Клониране на чат",
+	"Clone of {{TITLE}}": "Клонинг на {{TITLE}}",
 	"Close": "Затвори",
-	"Code execution": "",
-	"Code Execution": "",
-	"Code Execution Engine": "",
-	"Code formatted successfully": "",
-	"Code Interpreter": "",
-	"Code Interpreter Engine": "",
-	"Code Interpreter Prompt Template": "",
+	"Code execution": "Изпълнение на код",
+	"Code Execution": "Изпълнение на код",
+	"Code Execution Engine": "Двигател за изпълнение на код",
+	"Code Execution Timeout": "",
+	"Code formatted successfully": "Кодът е форматиран успешно",
+	"Code Interpreter": "Интерпретатор на код",
+	"Code Interpreter Engine": "Двигател на интерпретатора на код",
+	"Code Interpreter Prompt Template": "Шаблон за промпт на интерпретатора на код",
 	"Collection": "Колекция",
-	"Color": "",
+	"Color": "Цвят",
 	"ComfyUI": "ComfyUI",
-	"ComfyUI API Key": "",
-	"ComfyUI Base URL": "ComfyUI Base URL",
-	"ComfyUI Base URL is required.": "ComfyUI Base URL е задължително.",
-	"ComfyUI Workflow": "",
-	"ComfyUI Workflow Nodes": "",
+	"ComfyUI API Key": "ComfyUI API Ключ",
+	"ComfyUI Base URL": "ComfyUI Базов URL",
+	"ComfyUI Base URL is required.": "ComfyUI Базов URL е задължителен.",
+	"ComfyUI Workflow": "ComfyUI Работен поток",
+	"ComfyUI Workflow Nodes": "Възли на ComfyUI работен поток",
 	"Command": "Команда",
-	"Completions": "",
-	"Concurrent Requests": "Едновременни искания",
-	"Configure": "",
-	"Confirm": "",
+	"Completions": "Довършвания",
+	"Concurrent Requests": "Едновременни заявки",
+	"Configure": "Конфигуриране",
+	"Confirm": "Потвърди",
 	"Confirm Password": "Потвърди Парола",
-	"Confirm your action": "",
-	"Confirm your new password": "",
-	"Connect to your own OpenAI compatible API endpoints.": "",
+	"Confirm your action": "Потвърдете действието си",
+	"Confirm your new password": "Потвърдете новата си парола",
+	"Connect to your own OpenAI compatible API endpoints.": "Свържете се със собствени крайни точки на API, съвместими с OpenAI.",
 	"Connections": "Връзки",
-	"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "",
-	"Contact Admin for WebUI Access": "",
+	"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "Ограничава усилията за разсъждение при модели за разсъждение. Приложимо само за модели за разсъждение от конкретни доставчици, които поддържат усилия за разсъждение. (По подразбиране: средно)",
+	"Contact Admin for WebUI Access": "Свържете се с администратор за достъп до WebUI",
 	"Content": "Съдържание",
-	"Content Extraction": "",
+	"Content Extraction": "Извличане на съдържание",
 	"Context Length": "Дължина на Контекста",
 	"Continue Response": "Продължи отговора",
-	"Continue with {{provider}}": "",
-	"Continue with Email": "",
-	"Continue with 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.": "",
-	"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. (Default: 1.1)": "",
-	"Controls": "",
-	"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "",
-	"Copied": "",
-	"Copied shared chat URL to clipboard!": "Копирана е връзката за чат!",
-	"Copied to clipboard": "",
+	"Continue with {{provider}}": "Продължете с {{provider}}",
+	"Continue with 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. (Default: 1.1)": "Контролирайте повторението на последователности от токени в генерирания текст. По-висока стойност (напр. 1.5) ще наказва повторенията по-силно, докато по-ниска стойност (напр. 1.1) ще бъде по-снизходителна. При 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. (Default: 5.0)": "Контролира баланса между съгласуваност и разнообразие на изхода. По-ниска стойност ще доведе до по-фокусиран и съгласуван текст. (По подразбиране: 5.0)",
+	"Copied": "Копирано",
+	"Copied shared chat URL to clipboard!": "Копирана е връзката за споделен чат в клипборда!",
+	"Copied to clipboard": "Копирано в клипборда",
 	"Copy": "Копирай",
 	"Copy last code block": "Копиране на последен код блок",
 	"Copy last response": "Копиране на последен отговор",
 	"Copy Link": "Копиране на връзка",
-	"Copy to clipboard": "",
+	"Copy to clipboard": "Копиране в клипборда",
 	"Copying to clipboard was successful!": "Копирането в клипборда беше успешно!",
-	"CORS must be properly configured by the provider to allow requests from Open WebUI.": "",
-	"Create": "",
-	"Create a knowledge base": "",
+	"CORS must be properly configured by the provider to allow requests from Open WebUI.": "CORS трябва да бъде правилно конфигуриран от доставчика, за да позволи заявки от Open WebUI.",
+	"Create": "Създай",
+	"Create a knowledge base": "Създаване на база знания",
 	"Create a model": "Създаване на модел",
 	"Create Account": "Създаване на Акаунт",
-	"Create Admin Account": "",
-	"Create Channel": "",
-	"Create Group": "",
-	"Create Knowledge": "",
+	"Create Admin Account": "Създаване на администраторски акаунт",
+	"Create Channel": "Създаване на канал",
+	"Create Group": "Създаване на група",
+	"Create Knowledge": "Създаване на знания",
 	"Create new key": "Създаване на нов ключ",
 	"Create new secret key": "Създаване на нов секретен ключ",
 	"Created at": "Създадено на",
 	"Created At": "Създадено на",
-	"Created by": "",
-	"CSV Import": "",
+	"Created by": "Създадено от",
+	"CSV Import": "Импортиране на CSV",
 	"Current Model": "Текущ модел",
 	"Current Password": "Текуща Парола",
 	"Custom": "Персонализиран",
@@ -248,897 +249,902 @@
 	"Database": "База данни",
 	"December": "Декември",
 	"Default": "По подразбиране",
-	"Default (Open AI)": "",
+	"Default (Open AI)": "По подразбиране (Open AI)",
 	"Default (SentenceTransformers)": "По подразбиране (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.": "",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "Режимът по подразбиране работи с по-широк набор от модели, като извиква инструменти веднъж преди изпълнение. Нативният режим използва вградените възможности за извикване на инструменти на модела, но изисква моделът да поддържа тази функция по същество.",
 	"Default Model": "Модел по подразбиране",
 	"Default model updated": "Моделът по подразбиране е обновен",
-	"Default Models": "",
-	"Default permissions": "",
-	"Default permissions updated successfully": "",
+	"Default Models": "Модели по подразбиране",
+	"Default permissions": "Разрешения по подразбиране",
+	"Default permissions updated successfully": "Разрешенията по подразбиране са успешно актуализирани",
 	"Default Prompt Suggestions": "Промпт Предложения по подразбиране",
-	"Default to 389 or 636 if TLS is enabled": "",
-	"Default to ALL": "",
+	"Default to 389 or 636 if TLS is enabled": "По подразбиране 389 или 636, ако TLS е активиран",
+	"Default to ALL": "По подразбиране за ВСИЧКИ",
 	"Default User Role": "Роля на потребителя по подразбиране",
 	"Delete": "Изтриване",
 	"Delete a model": "Изтриване на модел",
 	"Delete All Chats": "Изтриване на всички чатове",
-	"Delete All Models": "",
+	"Delete All Models": "Изтриване на всички модели",
 	"Delete chat": "Изтриване на чат",
 	"Delete Chat": "Изтриване на Чат",
-	"Delete chat?": "",
-	"Delete folder?": "",
-	"Delete function?": "",
-	"Delete Message": "",
-	"Delete message?": "",
-	"Delete prompt?": "",
+	"Delete chat?": "Изтриване на чата?",
+	"Delete folder?": "Изтриване на папката?",
+	"Delete function?": "Изтриване на функцията?",
+	"Delete Message": "Изтриване на съобщение",
+	"Delete message?": "Изтриване на съобщението?",
+	"Delete prompt?": "Изтриване на промпта?",
 	"delete this link": "Изтриване на този линк",
-	"Delete tool?": "",
+	"Delete tool?": "Изтриване на инструмента?",
 	"Delete User": "Изтриване на потребител",
 	"Deleted {{deleteModelTag}}": "Изтрито {{deleteModelTag}}",
-	"Deleted {{name}}": "Изтрито {{име}}",
-	"Deleted User": "",
-	"Describe your knowledge base and objectives": "",
+	"Deleted {{name}}": "Изтрито {{name}}",
+	"Deleted User": "Изтрит потребител",
+	"Describe your knowledge base and objectives": "Опишете вашата база от знания и цели",
 	"Description": "Описание",
-	"Didn't fully follow instructions": "Не следва инструкциите",
-	"Direct Connections": "",
-	"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "",
-	"Direct Connections settings updated": "",
-	"Disabled": "",
-	"Discover a function": "",
+	"Didn't fully follow instructions": "Не следва напълно инструкциите",
+	"Direct Connections": "Директни връзки",
+	"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Директните връзки позволяват на потребителите да се свързват със собствени OpenAI съвместими API крайни точки.",
+	"Direct Connections settings updated": "Настройките за директни връзки са актуализирани",
+	"Disabled": "Деактивирано",
+	"Discover a function": "Открийте функция",
 	"Discover a model": "Открийте модел",
 	"Discover a prompt": "Откриване на промпт",
-	"Discover a tool": "",
-	"Discover how to use Open WebUI and seek support from the community.": "",
-	"Discover wonders": "",
-	"Discover, download, and explore custom functions": "",
+	"Discover a tool": "Открийте инструмент",
+	"Discover how to use Open WebUI and seek support from the community.": "Открийте как да използвате Open WebUI и потърсете подкрепа от общността.",
+	"Discover wonders": "Открийте чудеса",
+	"Discover, download, and explore custom functions": "Открийте, изтеглете и разгледайте персонализирани функции",
 	"Discover, download, and explore custom prompts": "Откриване, сваляне и преглед на персонализирани промптове",
-	"Discover, download, and explore custom tools": "",
+	"Discover, download, and explore custom tools": "Открийте, изтеглете и разгледайте персонализирани инструменти",
 	"Discover, download, and explore model presets": "Откриване, сваляне и преглед на пресетове на модели",
-	"Dismissible": "",
-	"Display": "",
-	"Display Emoji in Call": "",
+	"Dismissible": "Може да се отхвърли",
+	"Display": "Показване",
+	"Display Emoji in Call": "Показване на емотикони в обаждането",
 	"Display the username instead of You in the Chat": "Показване на потребителското име вместо Вие в чата",
-	"Displays citations in the response": "",
-	"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.": "",
+	"Displays citations in the response": "Показва цитати в отговора",
+	"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.": "Не инсталирайте инструменти от източници, на които не се доверявате напълно.",
 	"Document": "Документ",
-	"Documentation": "",
+	"Documentation": "Документация",
 	"Documents": "Документи",
 	"does not make any external connections, and your data stays securely on your locally hosted server.": "няма външни връзки, и вашите данни остават сигурни на локално назначен сървър.",
-	"Domain Filter List": "",
+	"Domain Filter List": "Списък с филтри за домейни",
 	"Don't have an account?": "Нямате акаунт?",
-	"don't install random functions from sources you don't trust.": "",
-	"don't install random tools from sources you don't trust.": "",
+	"don't install random functions from sources you don't trust.": "не инсталирайте случайни функции от източници, на които не се доверявате.",
+	"don't install random tools from sources you don't trust.": "не инсталирайте случайни инструменти от източници, на които не се доверявате.",
 	"Don't like the style": "Не харесваш стила?",
-	"Done": "",
-	"Download": "Изтегляне отменено",
-	"Download as SVG": "",
+	"Done": "Готово",
+	"Download": "Изтегляне",
+	"Download as SVG": "Изтегляне като SVG",
 	"Download canceled": "Изтегляне отменено",
 	"Download Database": "Сваляне на база данни",
-	"Drag and drop a file to upload or select a file to view": "",
-	"Draw": "",
-	"Drop any files here to add to the conversation": "Пускане на файлове тук, за да ги добавите в чата",
+	"Drag and drop a file to upload or select a file to view": "Плъзнете и пуснете файл за качване или изберете файл за преглед",
+	"Draw": "Рисуване",
+	"Drop any files here to add to the conversation": "Пускане на файлове тук, за да ги добавите в чата",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "напр. '30с','10м'. Валидни единици са 'с', 'м', 'ч'.",
-	"e.g. A filter to remove profanity from text": "",
-	"e.g. My Filter": "",
-	"e.g. My Tools": "",
-	"e.g. my_filter": "",
-	"e.g. my_tools": "",
-	"e.g. Tools for performing various operations": "",
+	"e.g. 60": "",
+	"e.g. A filter to remove profanity from text": "напр. Филтър за премахване на нецензурни думи от текста",
+	"e.g. My Filter": "напр. Моят филтър",
+	"e.g. My Tools": "напр. Моите инструменти",
+	"e.g. my_filter": "напр. моят_филтър",
+	"e.g. my_tools": "напр. моите_инструменти",
+	"e.g. Tools for performing various operations": "напр. Инструменти за извършване на различни операции",
 	"Edit": "Редактиране",
-	"Edit Arena Model": "",
-	"Edit Channel": "",
-	"Edit Connection": "",
-	"Edit Default Permissions": "",
-	"Edit Memory": "",
+	"Edit Arena Model": "Редактиране на Arena модел",
+	"Edit Channel": "Редактиране на канал",
+	"Edit Connection": "Редактиране на връзка",
+	"Edit Default Permissions": "Редактиране на разрешения по подразбиране",
+	"Edit Memory": "Редактиране на памет",
 	"Edit User": "Редактиране на потребител",
-	"Edit User Group": "",
-	"ElevenLabs": "",
-	"Email": "Имейл",
-	"Embark on adventures": "",
-	"Embedding Batch Size": "",
+	"Edit User Group": "Редактиране на потребителска група",
+	"ElevenLabs": "ElevenLabs",
+	"Email": "Имейл",
+	"Embark on adventures": "Отправете се на приключения",
+	"Embedding Batch Size": "Размер на партидата за вграждане",
 	"Embedding Model": "Модел за вграждане",
-	"Embedding Model Engine": "Модел за вграждане",
+	"Embedding Model Engine": "Двигател на модела за вграждане",
 	"Embedding model set to \"{{embedding_model}}\"": "Модел за вграждане е настроен на \"{{embedding_model}}\"",
-	"Enable API Key": "",
-	"Enable autocomplete generation for chat messages": "",
-	"Enable Code Interpreter": "",
+	"Enable API Key": "Активиране на API ключ",
+	"Enable autocomplete generation for chat messages": "Активиране на автоматично довършване за съобщения в чата",
+	"Enable Code Interpreter": "Активиране на интерпретатор на код",
 	"Enable Community Sharing": "Разрешаване на споделяне в общност",
-	"Enable Google Drive": "",
-	"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.": "",
-	"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.": "",
-	"Enable Message Rating": "",
-	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
-	"Enable New Sign Ups": "Вклюване на Нови Потребители",
+	"Enable Google Drive": "Активиране на Google Drive",
+	"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 Message Rating": "Активиране на оценяване на съобщения",
+	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "Активиране на Mirostat семплиране за контрол на перплексията. (По подразбиране: 0, 0 = Деактивирано, 1 = Mirostat, 2 = Mirostat 2.0)",
+	"Enable New Sign Ups": "Включване на нови регистрации",
 	"Enable Web Search": "Разрешаване на търсене в уеб",
-	"Enabled": "",
-	"Engine": "",
+	"Enabled": "Активирано",
+	"Engine": "Двигател",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Уверете се, че вашият CSV файл включва 4 колони в следния ред: Име, Имейл, Парола, Роля.",
 	"Enter {{role}} message here": "Въведете съобщение за {{role}} тук",
-	"Enter a detail about yourself for your LLMs to recall": "Въведете подробности за себе си, за да се herinnerат вашите LLMs",
-	"Enter api auth string (e.g. username:password)": "",
-	"Enter Application DN": "",
-	"Enter Application DN Password": "",
-	"Enter Bing Search V7 Endpoint": "",
-	"Enter Bing Search V7 Subscription Key": "",
-	"Enter Bocha Search API Key": "",
-	"Enter Brave Search API Key": "Въведете Brave Search API ключ",
-	"Enter certificate path": "",
-	"Enter CFG Scale (e.g. 7.0)": "",
-	"Enter Chunk Overlap": "Въведете Chunk Overlap",
-	"Enter Chunk Size": "Въведете Chunk Size",
-	"Enter description": "",
-	"Enter domains separated by commas (e.g., example.com,site.org)": "",
-	"Enter Exa API Key": "",
-	"Enter Github Raw URL": "Въведете URL адреса на Github Raw",
-	"Enter Google PSE API Key": "Въведете Google PSE API ключ",
+	"Enter a detail about yourself for your LLMs to recall": "Въведете подробности за себе си, за да ги запомнят вашите LLMs",
+	"Enter api auth string (e.g. username:password)": "Въведете низ за удостоверяване на API (напр. потребителско_име:парола)",
+	"Enter Application DN": "Въведете DN на приложението",
+	"Enter Application DN Password": "Въведете парола за DN на приложението",
+	"Enter Bing Search V7 Endpoint": "Въведете крайна точка за Bing Search V7",
+	"Enter Bing Search V7 Subscription Key": "Въведете абонаментен ключ за Bing Search V7",
+	"Enter Bocha Search API Key": "Въведете API ключ за Bocha Search",
+	"Enter Brave Search API Key": "Въведете API ключ за Brave Search",
+	"Enter certificate path": "Въведете път до сертификата",
+	"Enter CFG Scale (e.g. 7.0)": "Въведете CFG Scale (напр. 7.0)",
+	"Enter Chunk Overlap": "Въведете припокриване на чънкове",
+	"Enter Chunk Size": "Въведете размер на чънк",
+	"Enter description": "Въведете описание",
+	"Enter domains separated by commas (e.g., example.com,site.org)": "Въведете домейни, разделени със запетаи (напр. example.com,site.org)",
+	"Enter Exa API Key": "Въведете API ключ за Exa",
+	"Enter Github Raw URL": "Въведете URL адрес на Github Raw",
+	"Enter Google PSE API Key": "Въведете API ключ за Google PSE",
 	"Enter Google PSE Engine Id": "Въведете идентификатор на двигателя на Google PSE",
 	"Enter Image Size (e.g. 512x512)": "Въведете размер на изображението (напр. 512x512)",
-	"Enter Jina API Key": "",
-	"Enter Jupyter Password": "",
-	"Enter Jupyter Token": "",
-	"Enter Jupyter URL": "",
-	"Enter Kagi Search API Key": "",
+	"Enter Jina API Key": "Въведете API ключ за Jina",
+	"Enter Jupyter Password": "Въведете парола за Jupyter",
+	"Enter Jupyter Token": "Въведете токен за Jupyter",
+	"Enter Jupyter URL": "Въведете URL адрес за Jupyter",
+	"Enter Kagi Search API Key": "Въведете API ключ за Kagi Search",
 	"Enter language codes": "Въведете кодове на езика",
-	"Enter Model ID": "",
+	"Enter Model ID": "Въведете ID на модела",
 	"Enter model tag (e.g. {{modelTag}})": "Въведете таг на модел (напр. {{modelTag}})",
-	"Enter Mojeek Search API Key": "",
+	"Enter Mojeek Search API Key": "Въведете API ключ за Mojeek Search",
 	"Enter Number of Steps (e.g. 50)": "Въведете брой стъпки (напр. 50)",
-	"Enter proxy URL (e.g. https://user:password@host:port)": "",
-	"Enter reasoning effort": "",
-	"Enter Sampler (e.g. Euler a)": "",
-	"Enter Scheduler (e.g. Karras)": "",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "Въведете URL адрес на прокси (напр. https://потребител:парола@хост:порт)",
+	"Enter reasoning effort": "Въведете усилие за разсъждение",
+	"Enter Sampler (e.g. Euler a)": "Въведете семплер (напр. Euler a)",
+	"Enter Scheduler (e.g. Karras)": "Въведете планировчик (напр. Karras)",
 	"Enter Score": "Въведете оценка",
-	"Enter SearchApi API Key": "",
-	"Enter SearchApi Engine": "",
-	"Enter Searxng Query URL": "Въведете URL адреса на заявката на Searxng",
-	"Enter Seed": "",
-	"Enter SerpApi API Key": "",
-	"Enter SerpApi Engine": "",
-	"Enter Serper API Key": "Въведете Serper API ключ",
-	"Enter Serply API Key": "",
-	"Enter Serpstack API Key": "Въведете Serpstack API ключ",
-	"Enter server host": "",
-	"Enter server label": "",
-	"Enter server port": "",
+	"Enter SearchApi API Key": "Въведете API ключ за SearchApi",
+	"Enter SearchApi Engine": "Въведете двигател за SearchApi",
+	"Enter Searxng Query URL": "Въведете URL адрес за заявка на Searxng",
+	"Enter Seed": "Въведете начално число",
+	"Enter SerpApi API Key": "Въведете API ключ за SerpApi",
+	"Enter SerpApi Engine": "Въведете двигател за SerpApi",
+	"Enter Serper API Key": "Въведете API ключ за Serper",
+	"Enter Serply API Key": "Въведете API ключ за Serply",
+	"Enter Serpstack API Key": "Въведете API ключ за Serpstack",
+	"Enter server host": "Въведете хост на сървъра",
+	"Enter server label": "Въведете етикет на сървъра",
+	"Enter server port": "Въведете порт на сървъра",
 	"Enter stop sequence": "Въведете стоп последователност",
-	"Enter system prompt": "",
-	"Enter Tavily API Key": "",
-	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
-	"Enter Tika Server URL": "",
+	"Enter system prompt": "Въведете системен промпт",
+	"Enter Tavily API Key": "Въведете API ключ за Tavily",
+	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Въведете публичния URL адрес на вашия WebUI. Този URL адрес ще бъде използван за генериране на връзки в известията.",
+	"Enter Tika Server URL": "Въведете URL адрес на Tika сървър",
+	"Enter timeout in seconds": "",
 	"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 Email": "Въведете имейл",
+	"Enter your current password": "Въведете текущата си парола",
+	"Enter Your Email": "Въведете имейл",
 	"Enter Your Full Name": "Въведете вашето пълно име",
-	"Enter your message": "",
-	"Enter your new password": "",
+	"Enter your message": "Въведете съобщението си",
+	"Enter your new password": "Въведете новата си парола",
 	"Enter Your Password": "Въведете вашата парола",
 	"Enter Your Role": "Въведете вашата роля",
-	"Enter Your Username": "",
-	"Enter your webhook URL": "",
+	"Enter Your Username": "Въведете вашето потребителско име",
+	"Enter your webhook URL": "Въведете вашия webhook URL",
 	"Error": "Грешка",
-	"ERROR": "",
-	"Error accessing Google Drive: {{error}}": "",
-	"Error uploading file: {{error}}": "",
-	"Evaluations": "",
-	"Exa API Key": "",
-	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
-	"Example: ALL": "",
-	"Example: mail": "",
-	"Example: ou=users,dc=foo,dc=example": "",
-	"Example: sAMAccountName or uid or userPrincipalName": "",
-	"Exclude": "",
-	"Execute code for analysis": "",
+	"ERROR": "ГРЕШКА",
+	"Error accessing Google Drive: {{error}}": "Грешка при достъп до Google Drive: {{error}}",
+	"Error uploading file: {{error}}": "Грешка при качване на файла: {{error}}",
+	"Evaluations": "Оценки",
+	"Exa API Key": "API ключ за Exa",
+	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Пример: (&(objectClass=inetOrgPerson)(uid=%s))",
+	"Example: ALL": "Пример: ВСИЧКИ",
+	"Example: mail": "Пример: поща",
+	"Example: ou=users,dc=foo,dc=example": "Пример: ou=users,dc=foo,dc=example",
+	"Example: sAMAccountName or uid or userPrincipalName": "Пример: sAMAccountName или uid или userPrincipalName",
+	"Exclude": "Изключи",
+	"Execute code for analysis": "Изпълнете код за анализ",
 	"Experimental": "Експериментално",
-	"Explore the cosmos": "",
+	"Explore the cosmos": "Изследвайте космоса",
 	"Export": "Износ",
-	"Export All Archived Chats": "",
+	"Export All Archived Chats": "Износ на всички архивирани чатове",
 	"Export All Chats (All Users)": "Експортване на всички чатове (За всички потребители)",
-	"Export chat (.json)": "",
+	"Export chat (.json)": "Експортиране на чат (.json)",
 	"Export Chats": "Експортване на чатове",
-	"Export Config to JSON File": "",
-	"Export Functions": "",
+	"Export Config to JSON File": "Експортиране на конфигурацията в JSON файл",
+	"Export Functions": "Експортиране на функции",
 	"Export Models": "Експортиране на модели",
-	"Export Presets": "",
+	"Export Presets": "Експортиране на предварителни настройки",
 	"Export Prompts": "Експортване на промптове",
-	"Export to CSV": "",
-	"Export Tools": "",
-	"External Models": "",
-	"Failed to add file.": "",
+	"Export to CSV": "Експортиране в CSV",
+	"Export Tools": "Експортиране на инструменти",
+	"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": "",
-	"Failed to upload file.": "",
-	"Features": "",
-	"Features Permissions": "",
+	"Failed to save models configuration": "Неуспешно запазване на конфигурацията на моделите",
+	"Failed to update settings": "Неуспешно актуализиране на настройките",
+	"Failed to upload file.": "Неуспешно качване на файл.",
+	"Features": "Функции",
+	"Features Permissions": "Разрешения за функции",
 	"February": "Февруари",
-	"Feedback History": "",
-	"Feedbacks": "",
-	"Feel free to add specific details": "Feel free to add specific details",
-	"File": "",
-	"File added successfully.": "",
-	"File content updated successfully.": "",
-	"File Mode": "Файл Мод",
+	"Feedback History": "История на обратната връзка",
+	"Feedbacks": "Обратни връзки",
+	"Feel free to add specific details": "Не се колебайте да добавите конкретни детайли",
+	"File": "Файл",
+	"File added successfully.": "Файлът е добавен успешно.",
+	"File content updated successfully.": "Съдържанието на файла е актуализирано успешно.",
+	"File Mode": "Файлов режим",
 	"File not found.": "Файл не е намерен.",
-	"File removed successfully.": "",
-	"File size should not exceed {{maxSize}} MB.": "",
-	"File uploaded successfully": "",
-	"Files": "",
-	"Filter is now globally disabled": "",
-	"Filter is now globally enabled": "",
-	"Filters": "",
+	"File removed successfully.": "Файлът е премахнат успешно.",
+	"File size should not exceed {{maxSize}} MB.": "Размерът на файла не трябва да надвишава {{maxSize}} MB.",
+	"File uploaded successfully": "Файлът е качен успешно",
+	"Files": "Файлове",
+	"Filter is now globally disabled": "Филтърът вече е глобално деактивиран",
+	"Filter is now globally enabled": "Филтърът вече е глобално активиран",
+	"Filters": "Филтри",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Потвърждаване на отпечатък: Не може да се използва инициализационна буква като аватар. Потребителят се връща към стандартна аватарка.",
 	"Fluidly stream large external response chunks": "Плавно предаване на големи части от външен отговор",
 	"Focus chat input": "Фокусиране на чат вход",
-	"Folder deleted successfully": "",
-	"Folder name cannot be empty": "",
-	"Folder name cannot be empty.": "",
-	"Folder name updated successfully": "",
+	"Folder deleted successfully": "Папката е изтрита успешно",
+	"Folder name cannot be empty": "Името на папката не може да бъде празно",
+	"Folder name cannot be empty.": "Името на папката не може да бъде празно.",
+	"Folder name updated successfully": "Името на папката е актуализирано успешно",
 	"Followed instructions perfectly": "Следвайте инструкциите перфектно",
-	"Forge new paths": "",
-	"Form": "",
-	"Format your variables using brackets like this:": "",
+	"Forge new paths": "Изковете нови пътища",
+	"Form": "Форма",
+	"Format your variables using brackets like this:": "Форматирайте вашите променливи, използвайки скоби като това:",
 	"Frequency Penalty": "Наказание за честота",
-	"Full Context Mode": "",
-	"Function": "",
-	"Function Calling": "",
-	"Function created successfully": "",
-	"Function deleted successfully": "",
-	"Function Description": "",
-	"Function ID": "",
-	"Function is now globally disabled": "",
-	"Function is now globally enabled": "",
-	"Function Name": "",
-	"Function updated successfully": "",
-	"Functions": "",
-	"Functions allow arbitrary code execution": "",
-	"Functions allow arbitrary code execution.": "",
-	"Functions imported successfully": "",
+	"Full Context Mode": "Режим на пълен контекст",
+	"Function": "Функция",
+	"Function Calling": "Извикване на функция",
+	"Function created successfully": "Функцията е създадена успешно",
+	"Function deleted successfully": "Функцията е изтрита успешно",
+	"Function Description": "Описание на функцията",
+	"Function ID": "ID на функцията",
+	"Function is now globally disabled": "Функцията вече е глобално деактивирана",
+	"Function is now globally enabled": "Функцията вече е глобално активирана",
+	"Function Name": "Име на функцията",
+	"Function updated successfully": "Функцията е актуализирана успешно",
+	"Functions": "Функции",
+	"Functions allow arbitrary code execution": "Функциите позволяват произволно изпълнение на код",
+	"Functions allow arbitrary code execution.": "Функциите позволяват произволно изпълнение на код.",
+	"Functions imported successfully": "Функциите са импортирани успешно",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Основни",
 	"General Settings": "Основни Настройки",
-	"Generate an image": "",
-	"Generate Image": "",
+	"Generate an image": "Генериране на изображение",
+	"Generate Image": "Генериране на изображение",
 	"Generating search query": "Генериране на заявка за търсене",
-	"Get started": "",
-	"Get started with {{WEBUI_NAME}}": "",
-	"Global": "",
-	"Good Response": "Добра отговор",
-	"Google Drive": "",
+	"Get started": "Започнете",
+	"Get started with {{WEBUI_NAME}}": "Започнете с {{WEBUI_NAME}}",
+	"Global": "Глобално",
+	"Good Response": "Добър отговор",
+	"Google Drive": "Google Drive",
 	"Google PSE API Key": "Google PSE API ключ",
 	"Google PSE Engine Id": "Идентификатор на двигателя на Google PSE",
-	"Group created successfully": "",
-	"Group deleted successfully": "",
-	"Group Description": "",
-	"Group Name": "",
-	"Group updated successfully": "",
-	"Groups": "",
-	"Haptic Feedback": "",
+	"Group created successfully": "Групата е създадена успешно",
+	"Group deleted successfully": "Групата е изтрита успешно",
+	"Group Description": "Описание на групата",
+	"Group Name": "Име на групата",
+	"Group updated successfully": "Групата е актуализирана успешно",
+	"Groups": "Групи",
+	"Haptic Feedback": "Тактилна обратна връзка",
 	"has no conversations.": "няма разговори.",
 	"Hello, {{name}}": "Здравей, {{name}}",
 	"Help": "Помощ",
-	"Help us create the best community leaderboard by sharing your feedback history!": "",
-	"Hex Color": "",
-	"Hex Color - Leave empty for default color": "",
+	"Help us create the best community leaderboard by sharing your feedback history!": "Помогнете ни да създадем най-добрата класация на общността, като споделите историята на вашата обратна връзка!",
+	"Hex Color": "Hex цвят",
+	"Hex Color - Leave empty for default color": "Hex цвят - Оставете празно за цвят по подразбиране",
 	"Hide": "Скрий",
-	"Home": "",
-	"Host": "",
+	"Home": "Начало",
+	"Host": "Хост",
 	"How can I help you today?": "Как мога да ви помогна днес?",
-	"How would you rate this response?": "",
-	"Hybrid Search": "Hybrid Search",
-	"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.": "",
-	"ID": "",
-	"Ignite curiosity": "",
-	"Image": "",
-	"Image Compression": "",
-	"Image Generation": "",
+	"How would you rate this response?": "Как бихте оценили този отговор?",
+	"Hybrid Search": "Хибридно търсене",
+	"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.": "Потвърждавам, че съм прочел и разбирам последствията от моето действие. Наясно съм с рисковете, свързани с изпълнението на произволен код, и съм проверил надеждността на източника.",
+	"ID": "ID",
+	"Ignite curiosity": "Запалете любопитството",
+	"Image": "Изображение",
+	"Image Compression": "Компресия на изображения",
+	"Image Generation": "Генериране на изображения",
 	"Image Generation (Experimental)": "Генерация на изображения (Експериментално)",
 	"Image Generation Engine": "Двигател за генериране на изображения",
-	"Image Max Compression Size": "",
-	"Image Prompt Generation": "",
-	"Image Prompt Generation Prompt": "",
+	"Image Max Compression Size": "Максимален размер на компресия на изображения",
+	"Image Prompt Generation": "Генериране на промпт за изображения",
+	"Image Prompt Generation Prompt": "Промпт за генериране на промпт за изображения",
 	"Image Settings": "Настройки на изображения",
 	"Images": "Изображения",
 	"Import Chats": "Импортване на чатове",
-	"Import Config from JSON File": "",
-	"Import Functions": "",
+	"Import Config from JSON File": "Импортиране на конфигурация от JSON файл",
+	"Import Functions": "Импортиране на функции",
 	"Import Models": "Импортиране на модели",
-	"Import Presets": "",
+	"Import Presets": "Импортиране на предварителни настройки",
 	"Import Prompts": "Импортване на промптове",
-	"Import Tools": "",
-	"Include": "",
+	"Import Tools": "Импортиране на инструменти",
+	"Include": "Включи",
 	"Include `--api-auth` flag when running stable-diffusion-webui": "",
-	"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. (Default: 0.1)": "",
+	"Include `--api` flag when running 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. (Default: 0.1)": "Влияе върху това колко бързо алгоритъмът реагира на обратната връзка от генерирания текст. По-ниска скорост на обучение ще доведе до по-бавни корекции, докато по-висока скорост на обучение ще направи алгоритъма по-отзивчив. (По подразбиране: 0.1)",
 	"Info": "Информация",
 	"Input commands": "Въведете команди",
 	"Install from Github URL": "Инсталиране от URL адреса на Github",
-	"Instant Auto-Send After Voice Transcription": "",
+	"Instant Auto-Send After Voice Transcription": "Незабавно автоматично изпращане след гласова транскрипция",
 	"Interface": "Интерфейс",
-	"Invalid file format.": "",
-	"Invalid Tag": "Невалиден тег",
-	"is typing...": "",
+	"Invalid file format.": "Невалиден формат на файла.",
+	"Invalid Tag": "Невалиден таг",
+	"is typing...": "пише...",
 	"January": "Януари",
-	"Jina API Key": "",
+	"Jina API Key": "API ключ за Jina",
 	"join our Discord for help.": "свържете се с нашия Discord за помощ.",
 	"JSON": "JSON",
 	"JSON Preview": "JSON Преглед",
-	"July": "Июл",
-	"June": "Июн",
-	"Jupyter Auth": "",
-	"Jupyter URL": "",
-	"JWT Expiration": "JWT Expiration",
-	"JWT Token": "JWT Token",
-	"Kagi Search API Key": "",
-	"Keep Alive": "Keep Alive",
-	"Key": "",
+	"July": "Юли",
+	"June": "Юни",
+	"Jupyter Auth": "Jupyter удостоверяване",
+	"Jupyter URL": "Jupyter URL",
+	"JWT Expiration": "JWT изтичане",
+	"JWT Token": "JWT токен",
+	"Kagi Search API Key": "API ключ за Kagi Search",
+	"Keep Alive": "Поддържай активен",
+	"Key": "Ключ",
 	"Keyboard shortcuts": "Клавиши за бърз достъп",
-	"Knowledge": "",
-	"Knowledge Access": "",
-	"Knowledge created successfully.": "",
-	"Knowledge deleted successfully.": "",
-	"Knowledge reset successfully.": "",
-	"Knowledge updated successfully": "",
-	"Kokoro.js (Browser)": "",
-	"Kokoro.js Dtype": "",
-	"Label": "",
-	"Landing Page Mode": "",
+	"Knowledge": "Знания",
+	"Knowledge Access": "Достъп до знания",
+	"Knowledge created successfully.": "Знанието е създадено успешно.",
+	"Knowledge deleted successfully.": "Знанието е изтрито успешно.",
+	"Knowledge reset successfully.": "Знанието е нулирано успешно.",
+	"Knowledge updated successfully": "Знанието е актуализирано успешно",
+	"Kokoro.js (Browser)": "Kokoro.js (Браузър)",
+	"Kokoro.js Dtype": "Kokoro.js Dtype",
+	"Label": "Етикет",
+	"Landing Page Mode": "Режим на начална страница",
 	"Language": "Език",
 	"Last Active": "Последни активни",
-	"Last Modified": "",
-	"Last reply": "",
-	"LDAP": "",
-	"LDAP server updated": "",
-	"Leaderboard": "",
-	"Leave empty for unlimited": "",
-	"Leave empty to include all models from \"{{URL}}/api/tags\" endpoint": "",
-	"Leave empty to include all models from \"{{URL}}/models\" endpoint": "",
-	"Leave empty to include all models or select specific models": "",
-	"Leave empty to use the default prompt, or enter a custom prompt": "",
-	"Leave model field empty to use the default model.": "",
-	"License": "",
+	"Last Modified": "Последно модифицирано",
+	"Last reply": "Последен отговор",
+	"LDAP": "LDAP",
+	"LDAP server updated": "LDAP сървърът е актуализиран",
+	"Leaderboard": "Класация",
+	"Leave empty for unlimited": "Оставете празно за неограничено",
+	"Leave empty to include all models from \"{{URL}}/api/tags\" endpoint": "Оставете празно, за да включите всички модели от крайната точка \"{{URL}}/api/tags\"",
+	"Leave empty to include all models from \"{{URL}}/models\" endpoint": "Оставете празно, за да включите всички модели от крайната точка \"{{URL}}/models\"",
+	"Leave empty to include all models or select specific models": "Оставете празно, за да включите всички модели или изберете конкретни модели",
+	"Leave empty to use the default prompt, or enter a custom prompt": "Оставете празно, за да използвате промпта по подразбиране, или въведете персонализиран промпт",
+	"Leave model field empty to use the default model.": "Оставете полето за модел празно, за да използвате модела по подразбиране.",
+	"License": "Лиценз",
 	"Light": "Светъл",
-	"Listening...": "",
-	"Llama.cpp": "",
+	"Listening...": "Слушане...",
+	"Llama.cpp": "Llama.cpp",
 	"LLMs can make mistakes. Verify important information.": "LLMs могат да правят грешки. Проверете важните данни.",
-	"Loading Kokoro.js...": "",
-	"Local": "",
-	"Local Models": "",
-	"Lost": "",
+	"Loading Kokoro.js...": "Зареждане на Kokoro.js...",
+	"Local": "Локално",
+	"Local Models": "Локални модели",
+	"Lost": "Изгубено",
 	"LTR": "LTR",
 	"Made by Open WebUI Community": "Направено от OpenWebUI общността",
 	"Make sure to enclose them with": "Уверете се, че са заключени с",
-	"Make sure to export a workflow.json file as API format from ComfyUI.": "",
-	"Manage": "",
-	"Manage Arena Models": "",
-	"Manage Direct Connections": "",
-	"Manage Models": "",
-	"Manage Ollama": "",
-	"Manage Ollama API Connections": "",
-	"Manage OpenAI API Connections": "",
-	"Manage Pipelines": "Управление на тръбопроводи",
+	"Make sure to export a workflow.json file as API format from ComfyUI.": "Уверете се, че експортирате файл workflow.json като API формат от ComfyUI.",
+	"Manage": "Управление",
+	"Manage Arena Models": "Управление на Arena модели",
+	"Manage Direct Connections": "Управление на директни връзки",
+	"Manage Models": "Управление на модели",
+	"Manage Ollama": "Управление на Ollama",
+	"Manage Ollama API Connections": "Управление на Ollama API връзки",
+	"Manage OpenAI API Connections": "Управление на OpenAI API връзки",
+	"Manage Pipelines": "Управление на пайплайни",
 	"March": "Март",
 	"Max Tokens (num_predict)": "Макс токени (num_predict)",
-	"Max Upload Count": "",
-	"Max Upload Size": "",
-	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимум 3 модели могат да бъдат сваляни едновременно. Моля, опитайте отново по-късно.",
+	"Max Upload Count": "Максимален брой качвания",
+	"Max Upload Size": "Максимален размер на качване",
+	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимум 3 модела могат да бъдат сваляни едновременно. Моля, опитайте отново по-късно.",
 	"May": "Май",
 	"Memories accessible by LLMs will be shown here.": "Мемории достъпни от LLMs ще бъдат показани тук.",
-	"Memory": "Мемория",
-	"Memory added successfully": "",
-	"Memory cleared successfully": "",
-	"Memory deleted successfully": "",
-	"Memory updated successfully": "",
-	"Merge Responses": "",
-	"Message rating should be enabled to use this feature": "",
+	"Memory": "Памет",
+	"Memory added successfully": "Паметта е добавена успешно",
+	"Memory cleared successfully": "Паметта е изчистена успешно",
+	"Memory deleted successfully": "Паметта е изтрита успешно",
+	"Memory updated successfully": "Паметта е актуализирана успешно",
+	"Merge Responses": "Обединяване на отговори",
+	"Message rating should be enabled to use this feature": "Оценяването на съобщения трябва да бъде активирано, за да използвате тази функция",
 	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Съобщенията, които изпращате след създаването на връзката, няма да бъдат споделяни. Потребителите с URL адреса ще могат да видят споделения чат.",
-	"Min P": "",
+	"Min P": "Мин P",
 	"Minimum Score": "Минимална оценка",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"Model": "",
+	"Model": "Модел",
 	"Model '{{modelName}}' has been successfully downloaded.": "Моделът '{{modelName}}' беше успешно свален.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Моделът '{{modelTag}}' е вече в очакване за сваляне.",
 	"Model {{modelId}} not found": "Моделът {{modelId}} не е намерен",
-	"Model {{modelName}} is not vision capable": "Моделът {{modelName}} не може да се вижда",
+	"Model {{modelName}} is not vision capable": "Моделът {{modelName}} не поддържа визуални възможности",
 	"Model {{name}} is now {{status}}": "Моделът {{name}} сега е {{status}}",
-	"Model accepts image inputs": "",
-	"Model created successfully!": "",
+	"Model accepts image inputs": "Моделът приема входни изображения",
+	"Model created successfully!": "Моделът е създаден успешно!",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Открит е път до файловата система на модела. За актуализацията се изисква съкратено име на модела, не може да продължи.",
-	"Model Filtering": "",
+	"Model Filtering": "Филтриране на модели",
 	"Model ID": "ИД на модел",
-	"Model IDs": "",
-	"Model Name": "",
+	"Model IDs": "ИД-та на модели",
+	"Model Name": "Име на модел",
 	"Model not selected": "Не е избран модел",
-	"Model Params": "Модел Params",
-	"Model Permissions": "",
-	"Model updated successfully": "",
+	"Model Params": "Параметри на модела",
+	"Model Permissions": "Разрешения на модела",
+	"Model updated successfully": "Моделът е актуализиран успешно",
 	"Modelfile Content": "Съдържание на модфайл",
 	"Models": "Модели",
-	"Models Access": "",
-	"Models configuration saved successfully": "",
-	"Mojeek Search API Key": "",
-	"more": "",
+	"Models Access": "Достъп до модели",
+	"Models configuration saved successfully": "Конфигурацията на моделите е запазена успешно",
+	"Mojeek Search API Key": "API ключ за Mojeek Search",
+	"more": "още",
 	"More": "Повече",
 	"Name": "Име",
-	"Name your knowledge base": "",
-	"Native": "",
+	"Name your knowledge base": "Именувайте вашата база от знания",
+	"Native": "Нативен",
 	"New Chat": "Нов чат",
-	"New Folder": "",
+	"New Folder": "Нова папка",
 	"New Password": "Нова парола",
-	"new-channel": "",
-	"No content found": "",
-	"No content to speak": "",
-	"No distance available": "",
-	"No feedbacks found": "",
-	"No file selected": "",
-	"No files found.": "",
-	"No groups with access, add a group to grant access": "",
-	"No HTML, CSS, or JavaScript content found.": "",
-	"No inference engine with management support found": "",
-	"No knowledge found": "",
-	"No model IDs": "",
-	"No models found": "",
-	"No models selected": "",
+	"new-channel": "нов-канал",
+	"No content found": "Не е намерено съдържание",
+	"No content to speak": "Няма съдържание за изговаряне",
+	"No distance available": "Няма налично разстояние",
+	"No feedbacks found": "Не са намерени обратни връзки",
+	"No file selected": "Не е избран файл",
+	"No files found.": "Не са намерени файлове.",
+	"No groups with access, add a group to grant access": "Няма групи с достъп, добавете група, за да предоставите достъп",
+	"No HTML, CSS, or JavaScript content found.": "Не е намерено HTML, CSS или JavaScript съдържание.",
+	"No inference engine with management support found": "Не е намерен механизъм за извод с поддръжка на управление",
+	"No knowledge found": "Не са намерени знания",
+	"No model IDs": "Няма ИД-та на модели",
+	"No models found": "Не са намерени модели",
+	"No models selected": "Няма избрани модели",
 	"No results found": "Няма намерени резултати",
 	"No search query generated": "Не е генерирана заявка за търсене",
 	"No source available": "Няма наличен източник",
-	"No users were found.": "",
-	"No valves to update": "",
+	"No users were found.": "Не са намерени потребители.",
+	"No valves to update": "Няма клапани за актуализиране",
 	"None": "Никой",
 	"Not factually correct": "Не е фактологически правилно",
-	"Not helpful": "",
+	"Not helpful": "Не е полезно",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Забележка: Ако зададете минимален резултат, търсенето ще върне само документи с резултат, по-голям или равен на минималния резултат.",
-	"Notes": "",
-	"Notification Sound": "",
-	"Notification Webhook": "",
-	"Notifications": "Десктоп Известия",
+	"Notes": "Бележки",
+	"Notification Sound": "Звук за известия",
+	"Notification Webhook": "Webhook за известия",
+	"Notifications": "Известия",
 	"November": "Ноември",
-	"num_gpu (Ollama)": "",
+	"num_gpu (Ollama)": "num_gpu (Ollama)",
 	"num_thread (Ollama)": "num_thread (Ollama)",
-	"OAuth ID": "",
+	"OAuth ID": "OAuth ID",
 	"October": "Октомври",
 	"Off": "Изкл.",
 	"Okay, Let's Go!": "ОК, Нека започваме!",
 	"OLED Dark": "OLED тъмно",
 	"Ollama": "Ollama",
 	"Ollama API": "Ollama API",
-	"Ollama API settings updated": "",
+	"Ollama API settings updated": "Настройките на Ollama API са актуализирани",
 	"Ollama Version": "Ollama Версия",
 	"On": "Вкл.",
-	"Only alphanumeric characters and hyphens are allowed": "",
+	"Only alphanumeric characters and hyphens are allowed": "Разрешени са само буквено-цифрови знаци и тирета",
 	"Only alphanumeric characters and hyphens are allowed in the command string.": "Само алфанумерични знаци и тире са разрешени в командния низ.",
-	"Only collections can be edited, create a new knowledge base to edit/add documents.": "",
-	"Only select users and groups with permission can access": "",
+	"Only collections can be edited, create a new knowledge base to edit/add documents.": "Само колекции могат да бъдат редактирани, създайте нова база от знания, за да редактирате/добавяте документи.",
+	"Only select users and groups with permission can access": "Само избрани потребители и групи с разрешение могат да имат достъп",
 	"Oops! Looks like the URL is invalid. Please double-check and try again.": "Упс! Изглежда URL адресът е невалиден. Моля, проверете отново и опитайте пак.",
-	"Oops! There are files still uploading. Please wait for the upload to complete.": "",
-	"Oops! There was an error in the previous response.": "",
+	"Oops! There are files still uploading. Please wait for the upload to complete.": "Упс! Все още има файлове, които се качват. Моля, изчакайте качването да приключи.",
+	"Oops! There was an error in the previous response.": "Упс! Имаше грешка в предишния отговор.",
 	"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Упс! Използвате неподдържан метод (само фронтенд). Моля, сервирайте WebUI от бекенда.",
-	"Open file": "",
-	"Open in full screen": "",
+	"Open file": "Отвори файл",
+	"Open in full screen": "Отвори на цял екран",
 	"Open new chat": "Отвори нов чат",
-	"Open WebUI uses faster-whisper internally.": "",
-	"Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "",
-	"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
+	"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",
 	"OpenAI API": "OpenAI API",
-	"OpenAI API Config": "OpenAI API Config",
+	"OpenAI API Config": "OpenAI API конфигурация",
 	"OpenAI API Key is required.": "OpenAI API ключ е задължителен.",
-	"OpenAI API settings updated": "",
+	"OpenAI API settings updated": "Настройките на OpenAI API са актуализирани",
 	"OpenAI URL/Key required.": "OpenAI URL/Key е задължителен.",
 	"or": "или",
-	"Organize your users": "",
-	"Other": "Other",
-	"OUTPUT": "",
-	"Output format": "",
-	"Overview": "",
-	"page": "",
+	"Organize your users": "Организирайте вашите потребители",
+	"Other": "Друго",
+	"OUTPUT": "ИЗХОД",
+	"Output format": "Изходен формат",
+	"Overview": "Преглед",
+	"page": "страница",
 	"Password": "Парола",
-	"Paste Large Text as File": "",
+	"Paste Large Text as File": "Поставете голям текст като файл",
 	"PDF document (.pdf)": "PDF документ (.pdf)",
-	"PDF Extract Images (OCR)": "PDF Extract Images (OCR)",
+	"PDF Extract Images (OCR)": "Извличане на изображения от PDF (OCR)",
 	"pending": "в очакване",
-	"Permission denied when accessing media devices": "",
-	"Permission denied when accessing microphone": "",
-	"Permission denied when accessing microphone: {{error}}": "Permission denied when accessing microphone: {{error}}",
-	"Permissions": "",
+	"Permission denied when accessing media devices": "Отказан достъп при опит за достъп до медийни устройства",
+	"Permission denied when accessing microphone": "Отказан достъп при опит за достъп до микрофона",
+	"Permission denied when accessing microphone: {{error}}": "Отказан достъп при опит за достъп до микрофона: {{error}}",
+	"Permissions": "Разрешения",
 	"Personalization": "Персонализация",
-	"Pin": "",
-	"Pinned": "",
-	"Pioneer insights": "",
-	"Pipeline deleted successfully": "",
-	"Pipeline downloaded successfully": "",
-	"Pipelines": "Тръбопроводи",
-	"Pipelines Not Detected": "",
-	"Pipelines Valves": "Тръбопроводи Вентили",
-	"Plain text (.txt)": "Plain text (.txt)",
+	"Pin": "Закачи",
+	"Pinned": "Закачено",
+	"Pioneer insights": "Пионерски прозрения",
+	"Pipeline deleted successfully": "Пайплайнът е изтрит успешно",
+	"Pipeline downloaded successfully": "Пайплайнът е изтеглен успешно",
+	"Pipelines": "Пайплайни",
+	"Pipelines Not Detected": "Не са открити пайплайни",
+	"Pipelines Valves": "Клапани на пайплайни",
+	"Plain text (.txt)": "Обикновен текст (.txt)",
 	"Playground": "Плейграунд",
-	"Please carefully review the following warnings:": "",
-	"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.": "",
-	"Please select a reason": "",
-	"Port": "",
-	"Positive attitude": "Позитивна ативност",
-	"Prefix ID": "",
-	"Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "",
-	"Presence Penalty": "",
-	"Previous 30 days": "Предыдущите 30 дни",
-	"Previous 7 days": "Предыдущите 7 дни",
+	"Please carefully review the following warnings:": "Моля, внимателно прегледайте следните предупреждения:",
+	"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.": "Моля, изберете модел.",
+	"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-тата на моделите - оставете празно, за да деактивирате",
+	"Presence Penalty": "Наказание за присъствие",
+	"Previous 30 days": "Предишните 30 дни",
+	"Previous 7 days": "Предишните 7 дни",
 	"Profile Image": "Профилна снимка",
-	"Prompt": "",
-	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Промпт (напр. Обмисли ме забавна факт за Римската империя)",
+	"Prompt": "Промпт",
+	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Промпт (напр. Кажи ми забавен факт за Римската империя)",
 	"Prompt Content": "Съдържание на промпта",
-	"Prompt created successfully": "",
+	"Prompt created successfully": "Промптът е създаден успешно",
 	"Prompt suggestions": "Промпт предложения",
-	"Prompt updated successfully": "",
+	"Prompt updated successfully": "Промптът е актуализиран успешно",
 	"Prompts": "Промптове",
-	"Prompts Access": "",
-	"Proxy URL": "",
+	"Prompts Access": "Достъп до промптове",
+	"Proxy URL": "URL на прокси",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Извади \"{{searchValue}}\" от Ollama.com",
 	"Pull a model from Ollama.com": "Издърпайте модел от Ollama.com",
-	"Query Generation Prompt": "",
-	"Query Params": "Query Параметри",
+	"Query Generation Prompt": "Промпт за генериране на запитвания",
+	"Query Params": "Параметри на запитването",
 	"RAG Template": "RAG Шаблон",
-	"Rating": "",
-	"Re-rank models by topic similarity": "",
-	"Read": "",
-	"Read Aloud": "Прочети на Голос",
-	"Reasoning Effort": "",
+	"Rating": "Оценка",
+	"Re-rank models by topic similarity": "Преоценка на моделите по сходство на темата",
+	"Read": "Четене",
+	"Read Aloud": "Прочети на глас",
+	"Reasoning Effort": "Усилие за разсъждение",
 	"Record voice": "Записване на глас",
 	"Redirecting you to Open WebUI Community": "Пренасочване към OpenWebUI общността",
-	"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)": "",
-	"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
-	"References from": "",
+	"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. (Default: 40)": "Намалява вероятността за генериране на безсмислици. По-висока стойност (напр. 100) ще даде по-разнообразни отговори, докато по-ниска стойност (напр. 10) ще бъде по-консервативна. (По подразбиране: 40)",
+	"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Отнасяйте се към себе си като \"Потребител\" (напр. \"Потребителят учи испански\")",
+	"References from": "Препратки от",
 	"Refused when it shouldn't have": "Отказано, когато не трябва да бъде",
 	"Regenerate": "Регенериране",
 	"Release Notes": "Бележки по изданието",
-	"Relevance": "",
+	"Relevance": "Релевантност",
 	"Remove": "Изтриване",
 	"Remove Model": "Изтриване на модела",
 	"Rename": "Преименуване",
-	"Reorder Models": "",
-	"Repeat Last N": "Repeat Last N",
-	"Repeat Penalty (Ollama)": "",
-	"Reply in Thread": "",
-	"Request Mode": "Request Mode",
-	"Reranking Model": "Reranking Model",
-	"Reranking model disabled": "Reranking model disabled",
-	"Reranking model set to \"{{reranking_model}}\"": "Reranking model set to \"{{reranking_model}}\"",
-	"Reset": "",
-	"Reset All Models": "",
-	"Reset Upload Directory": "",
-	"Reset Vector Storage/Knowledge": "",
-	"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 Query Generation": "",
-	"Rich Text Input for Chat": "",
-	"RK": "",
+	"Reorder Models": "Преорганизиране на модели",
+	"Repeat Last N": "Повтори последните N",
+	"Repeat Penalty (Ollama)": "Наказание за повторение (Ollama)",
+	"Reply in Thread": "Отговори в тред",
+	"Request Mode": "Режим на заявка",
+	"Reranking Model": "Модел за преподреждане",
+	"Reranking model disabled": "Моделът за преподреждане е деактивиран",
+	"Reranking model set to \"{{reranking_model}}\"": "Моделът за преподреждане е зададен на \"{{reranking_model}}\"",
+	"Reset": "Нулиране",
+	"Reset All Models": "Нулиране на всички модели",
+	"Reset Upload Directory": "Нулиране на директорията за качване",
+	"Reset Vector Storage/Knowledge": "Нулиране на векторното хранилище/знания",
+	"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 Query Generation": "Генериране на заявка за извличане",
+	"Rich Text Input for Chat": "Богат текстов вход за чат",
+	"RK": "RK",
 	"Role": "Роля",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"RTL": "RTL",
-	"Run": "",
-	"Running": "",
+	"Run": "Изпълни",
+	"Running": "Изпълнява се",
 	"Save": "Запис",
 	"Save & Create": "Запис & Създаване",
 	"Save & Update": "Запис & Актуализиране",
-	"Save As Copy": "",
-	"Save Tag": "",
-	"Saved": "",
+	"Save As Copy": "Запиши като копие",
+	"Save Tag": "Запиши таг",
+	"Saved": "Запазено",
 	"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": "Запазването на чат логове директно в хранилището на вашия браузър вече не се поддържа. Моля, отделете малко време, за да изтеглите и изтриете чат логовете си, като щракнете върху бутона по-долу. Не се притеснявайте, можете лесно да импортирате отново чат логовете си в бекенда чрез",
-	"Scroll to bottom when switching between branches": "",
+	"Scroll to bottom when switching between branches": "Превъртане до дъното при превключване между клонове",
 	"Search": "Търси",
 	"Search a model": "Търси модел",
-	"Search Base": "",
+	"Search Base": "База за търсене",
 	"Search Chats": "Търсене на чатове",
-	"Search Collection": "",
-	"Search Filters": "",
-	"search for tags": "",
-	"Search Functions": "",
-	"Search Knowledge": "",
+	"Search Collection": "Търсене в колекция",
+	"Search Filters": "Филтри за търсене",
+	"search for tags": "търсене на тагове",
+	"Search Functions": "Търсене на функции",
+	"Search Knowledge": "Търсене в знания",
 	"Search Models": "Търсене на модели",
-	"Search options": "",
+	"Search options": "Опции за търсене",
 	"Search Prompts": "Търси Промптове",
 	"Search Result Count": "Брой резултати от търсенето",
-	"Search the internet": "",
-	"Search Tools": "",
-	"SearchApi API Key": "",
-	"SearchApi Engine": "",
-	"Searched {{count}} sites": "",
-	"Searching \"{{searchQuery}}\"": "",
-	"Searching Knowledge for \"{{searchQuery}}\"": "",
+	"Search the internet": "Търсене в интернет",
+	"Search Tools": "Инструменти за търсене",
+	"SearchApi API Key": "API ключ за SearchApi",
+	"SearchApi Engine": "Двигател на SearchApi",
+	"Searched {{count}} sites": "Претърсени {{count}} сайта",
+	"Searching \"{{searchQuery}}\"": "Търсене на \"{{searchQuery}}\"",
+	"Searching Knowledge for \"{{searchQuery}}\"": "Търсене в знанията за \"{{searchQuery}}\"",
 	"Searxng Query URL": "URL адрес на заявка на Searxng",
 	"See readme.md for instructions": "Виж readme.md за инструкции",
 	"See what's new": "Виж какво е новото",
-	"Seed": "Seed",
+	"Seed": "Начално число",
 	"Select a base model": "Изберете базов модел",
-	"Select a engine": "",
-	"Select a function": "",
-	"Select a group": "",
+	"Select a engine": "Изберете двигател",
+	"Select a function": "Изберете функция",
+	"Select a group": "Изберете група",
 	"Select a model": "Изберете модел",
-	"Select a pipeline": "Изберете тръбопровод",
+	"Select a pipeline": "Изберете пайплайн",
 	"Select a pipeline url": "Избор на URL адрес на канал",
-	"Select a tool": "",
-	"Select an auth method": "",
-	"Select an Ollama instance": "",
-	"Select Engine": "",
-	"Select Knowledge": "",
+	"Select a tool": "Изберете инструмент",
+	"Select an auth method": "Изберете метод за удостоверяване",
+	"Select an Ollama instance": "Изберете инстанция на Ollama",
+	"Select Engine": "Изберете двигател",
+	"Select Knowledge": "Изберете знание",
 	"Select model": "Изберете модел",
-	"Select only one model to call": "",
+	"Select only one model to call": "Изберете само един модел за извикване",
 	"Selected model(s) do not support image inputs": "Избраният(те) модел(и) не поддържа въвеждане на изображения",
-	"Semantic distance to query": "",
+	"Semantic distance to query": "Семантично разстояние до заявката",
 	"Send": "Изпрати",
 	"Send a Message": "Изпращане на Съобщение",
 	"Send message": "Изпращане на съобщение",
 	"Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "",
 	"September": "Септември",
-	"SerpApi API Key": "",
-	"SerpApi Engine": "",
+	"SerpApi API Key": "API ключ за SerpApi",
+	"SerpApi Engine": "Двигател на SerpApi",
 	"Serper API Key": "Serper API ключ",
-	"Serply API Key": "",
+	"Serply API Key": "API ключ за Serply",
 	"Serpstack API Key": "Serpstack API ключ",
-	"Server connection verified": "Server connection verified",
+	"Server connection verified": "Връзката със сървъра е потвърдена",
 	"Set as default": "Задай по подразбиране",
-	"Set CFG Scale": "",
+	"Set CFG Scale": "Задай CFG мащаб",
 	"Set Default Model": "Задай Модел По Подразбиране",
-	"Set embedding model": "",
-	"Set embedding model (e.g. {{model}})": "Задай embedding model (e.g. {{model}})",
+	"Set embedding model": "Задай модел за вграждане",
+	"Set embedding model (e.g. {{model}})": "Задай модел за вграждане (напр. {{model}})",
 	"Set Image Size": "Задай Размер на Изображението",
-	"Set reranking model (e.g. {{model}})": "Задай reranking model (e.g. {{model}})",
-	"Set Sampler": "",
-	"Set Scheduler": "",
+	"Set reranking model (e.g. {{model}})": "Задай модел за преподреждане (напр. {{model}})",
+	"Set Sampler": "Задай семплер",
+	"Set Scheduler": "Задай планировчик",
 	"Set Steps": "Задай Стъпки",
 	"Set Task Model": "Задаване на модел на задача",
-	"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.": "",
-	"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.": "",
+	"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.": "Задайте броя слоеве, които ще бъдат прехвърлени към GPU. Увеличаването на тази стойност може значително да подобри производителността за модели, оптимизирани за GPU ускорение, но може също да консумира повече енергия и 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.": "Задайте броя работни нишки, използвани за изчисления. Тази опция контролира колко нишки се използват за едновременна обработка на входящи заявки. Увеличаването на тази стойност може да подобри производителността при високи натоварвания с паралелизъм, но може също да консумира повече CPU ресурси.",
 	"Set Voice": "Задай Глас",
-	"Set whisper model": "",
-	"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. (Default: 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. (Default: 1.1)": "",
-	"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "",
-	"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. (Default: random)": "",
-	"Sets the size of the context window used to generate the next token. (Default: 2048)": "",
-	"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.": "",
+	"Set whisper model": "Задай модел на шепот",
+	"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. (Default: 0)": "Задава плоско отклонение срещу токени, които са се появили поне веднъж. По-висока стойност (напр. 1.5) ще наказва повторенията по-силно, докато по-ниска стойност (напр. 0.9) ще бъде по-снизходителна. При 0 е деактивирано. (По подразбиране: 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. (Default: 1.1)": "Задава мащабиращо отклонение срещу токени за наказване на повторения, базирано на това колко пъти са се появили. По-висока стойност (напр. 1.5) ще наказва повторенията по-силно, докато по-ниска стойност (напр. 0.9) ще бъде по-снизходителна. При 0 е деактивирано. (По подразбиране: 1.1)",
+	"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "Задава колко назад моделът да гледа, за да предотврати повторение. (По подразбиране: 64, 0 = деактивирано, -1 = num_ctx)",
+	"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. (Default: random)": "Задава семето на случайното число, което да се използва за генериране. Задаването на конкретно число ще накара модела да генерира същия текст за същата подкана. (По подразбиране: случайно)",
+	"Sets the size of the context window used to generate the next token. (Default: 2048)": "Задава размера на контекстния прозорец, използван за генериране на следващия токен. (По подразбиране: 2048)",
+	"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Задава последователностите за спиране, които да се използват. Когато се срещне този модел, LLM ще спре да генерира текст и ще се върне. Множество модели за спиране могат да бъдат зададени чрез определяне на множество отделни параметри за спиране в моделния файл.",
 	"Settings": "Настройки",
 	"Settings saved successfully!": "Настройките са запазени успешно!",
 	"Share": "Подели",
 	"Share Chat": "Подели Чат",
-	"Share to Open WebUI Community": "Споделите с OpenWebUI Общността",
+	"Share to Open WebUI Community": "Споделете с OpenWebUI Общността",
 	"Show": "Покажи",
-	"Show \"What's New\" modal on login": "",
-	"Show Admin Details in Account Pending Overlay": "",
-	"Show shortcuts": "Покажи",
-	"Show your support!": "",
+	"Show \"What's New\" modal on login": "Покажи модалния прозорец \"Какво е ново\" при вписване",
+	"Show Admin Details in Account Pending Overlay": "Покажи детайлите на администратора в наслагването на изчакващ акаунт",
+	"Show shortcuts": "Покажи преки пътища",
+	"Show your support!": "Покажете вашата подкрепа!",
 	"Showcased creativity": "Показана креативност",
 	"Sign in": "Вписване",
-	"Sign in to {{WEBUI_NAME}}": "",
-	"Sign in to {{WEBUI_NAME}} with LDAP": "",
+	"Sign in to {{WEBUI_NAME}}": "Впишете се в {{WEBUI_NAME}}",
+	"Sign in to {{WEBUI_NAME}} with LDAP": "Впишете се в {{WEBUI_NAME}} с LDAP",
 	"Sign Out": "Изход",
 	"Sign up": "Регистрация",
-	"Sign up to {{WEBUI_NAME}}": "",
-	"Signing in to {{WEBUI_NAME}}": "",
-	"sk-1234": "",
+	"Sign up to {{WEBUI_NAME}}": "Регистрирайте се в {{WEBUI_NAME}}",
+	"Signing in to {{WEBUI_NAME}}": "Вписване в {{WEBUI_NAME}}",
+	"sk-1234": "sk-1234",
 	"Source": "Източник",
-	"Speech Playback Speed": "",
-	"Speech recognition error: {{error}}": "Speech recognition error: {{error}}",
-	"Speech-to-Text Engine": "Speech-to-Text Engine",
-	"Stop": "",
-	"Stop Sequence": "Stop Sequence",
-	"Stream Chat Response": "",
-	"STT Model": "",
+	"Speech Playback Speed": "Скорост на възпроизвеждане на речта",
+	"Speech recognition error: {{error}}": "Грешка при разпознаване на реч: {{error}}",
+	"Speech-to-Text Engine": "Двигател за преобразуване на реч в текст",
+	"Stop": "Спри",
+	"Stop Sequence": "Стоп последователност",
+	"Stream Chat Response": "Поточен чат отговор",
+	"STT Model": "STT Модел",
 	"STT Settings": "STT Настройки",
 	"Subtitle (e.g. about the Roman Empire)": "Подтитул (напр. за Римска империя)",
 	"Success": "Успех",
 	"Successfully updated.": "Успешно обновено.",
 	"Suggested": "Препоръчано",
-	"Support": "",
-	"Support this plugin:": "",
-	"Sync directory": "",
+	"Support": "Поддръжка",
+	"Support this plugin:": "Подкрепете този плъгин:",
+	"Sync directory": "Синхронизирай директория",
 	"System": "Система",
-	"System Instructions": "",
+	"System Instructions": "Системни инструкции",
 	"System Prompt": "Системен Промпт",
-	"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. (default: 1)": "",
-	"Tap to interrupt": "",
-	"Tasks": "",
-	"Tavily API Key": "",
+	"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. (default: 1)": "Безопашковото семплиране се използва за намаляване на влиянието на по-малко вероятните токени от изхода. По-висока стойност (напр. 2.0) ще намали влиянието повече, докато стойност 1.0 деактивира тази настройка. (по подразбиране: 1)",
+	"Tap to interrupt": "Докоснете за прекъсване",
+	"Tasks": "Задачи",
+	"Tavily API Key": "Tavily API Ключ",
 	"Tell us more:": "Повече информация:",
 	"Temperature": "Температура",
 	"Template": "Шаблон",
-	"Temporary Chat": "",
-	"Text Splitter": "",
-	"Text-to-Speech Engine": "Text-to-Speech Engine",
+	"Temporary Chat": "Временен чат",
+	"Text Splitter": "Разделител на текст",
+	"Text-to-Speech Engine": "Двигател за преобразуване на текст в реч",
 	"Tfs Z": "Tfs Z",
 	"Thanks for your feedback!": "Благодарим ви за вашия отзив!",
-	"The Application Account DN you bind with for search": "",
-	"The base to search for users": "",
+	"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.  (Default: 512)": "",
-	"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.": "",
-	"The LDAP attribute that maps to the mail that users use to sign in.": "",
-	"The LDAP attribute that maps to the username that users use to sign in.": "",
-	"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.": "",
-	"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.": "",
-	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "The score should be a value between 0.0 (0%) and 1.0 (100%).",
-	"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "",
+	"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 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.": "Максималният брой файлове, които могат да се използват едновременно в чата. Ако броят на файловете надвишава този лимит, файловете няма да бъдат качени.",
+	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Резултатът трябва да бъде стойност между 0.0 (0%) и 1.0 (100%).",
+	"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "Температурата на модела. Увеличаването на температурата ще накара модела да отговаря по-креативно. (По подразбиране: 0.8)",
 	"Theme": "Тема",
-	"Thinking...": "",
-	"This action cannot be undone. Do you wish to continue?": "",
+	"Thinking...": "Мисля...",
+	"This action cannot be undone. Do you wish to continue?": "Това действие не може да бъде отменено. Желаете ли да продължите?",
 	"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. (Default: 24)": "",
+	"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. (Default: 24)": "Тази опция контролира колко токена се запазват при обновяване на контекста. Например, ако е зададено на 2, последните 2 токена от контекста на разговора ще бъдат запазени. Запазването на контекста може да помогне за поддържане на непрекъснатостта на разговора, но може да намали способността за отговор на нови теми. (По подразбиране: 24)",
 	"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.  (Default: 128)": "",
-	"This option will delete all existing files in the collection and replace them with newly uploaded files.": "",
-	"This response was generated by \"{{model}}\"": "",
-	"This will delete": "",
-	"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
-	"This will delete all models including custom models": "",
-	"This will delete all models including custom models and cannot be undone.": "",
-	"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
-	"Thorough explanation": "Това е подробно описание.",
-	"Thought for {{DURATION}}": "",
-	"Thought for {{DURATION}} seconds": "",
-	"Tika": "",
-	"Tika Server URL required.": "",
-	"Tiktoken": "",
+	"This option will delete all existing files in the collection and replace them with newly uploaded files.": "Тази опция ще изтрие всички съществуващи файлове в колекцията и ще ги замени с новокачени файлове.",
+	"This response was generated by \"{{model}}\"": "Този отговор беше генериран от \"{{model}}\"",
+	"This will delete": "Това ще изтрие",
+	"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "Това ще изтрие <strong>{{NAME}}</strong> и <strong>цялото му съдържание</strong>.",
+	"This will delete all models including custom models": "Това ще изтрие всички модели, включително персонализираните модели",
+	"This will delete all models including custom models and cannot be undone.": "Това ще изтрие всички модели, включително персонализираните модели, и не може да бъде отменено.",
+	"This will reset the knowledge base and sync all files. Do you wish to continue?": "Това ще нулира базата знания и ще синхронизира всички файлове. Желаете ли да продължите?",
+	"Thorough explanation": "Подробно обяснение",
+	"Thought for {{DURATION}}": "Мислил за {{DURATION}}",
+	"Thought for {{DURATION}} seconds": "Мислил за {{DURATION}} секунди",
+	"Tika": "Tika",
+	"Tika Server URL required.": "Изисква се URL адрес на Tika сървъра.",
+	"Tiktoken": "Tiktoken",
 	"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Съвет: Актуализирайте няколко слота за променливи последователно, като натискате клавиша Tab в чат входа след всяка подмяна.",
 	"Title": "Заглавие",
-	"Title (e.g. Tell me a fun fact)": "Заглавие (напр. Моля, кажете ми нещо забавно)",
-	"Title Auto-Generation": "Автоматично Генериране на Заглавие",
+	"Title (e.g. Tell me a fun fact)": "Заглавие (напр. Кажете ми нещо забавно)",
+	"Title Auto-Generation": "Автоматично генериране на заглавие",
 	"Title cannot be an empty string.": "Заглавието не може да бъде празно.",
-	"Title Generation": "",
-	"Title Generation Prompt": "Промпт за Генериране на Заглавие",
-	"TLS": "",
-	"To access the available model names for downloading,": "За да получите достъп до наличните имена на модели за изтегляне,",
-	"To access the GGUF models available for downloading,": "За да получите достъп до GGUF моделите, налични за изтегляне,",
-	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
-	"To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "",
-	"To learn more about available endpoints, visit our documentation.": "",
-	"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.": "",
-	"To select actions here, add them to the \"Functions\" workspace first.": "",
-	"To select filters here, add them to the \"Functions\" workspace first.": "",
-	"To select toolkits here, add them to the \"Tools\" workspace first.": "",
-	"Toast notifications for new updates": "",
-	"Today": "днес",
-	"Toggle settings": "Toggle settings",
-	"Toggle sidebar": "Toggle sidebar",
-	"Token": "",
-	"Tokens To Keep On Context Refresh (num_keep)": "",
-	"Too verbose": "",
-	"Tool created successfully": "",
-	"Tool deleted successfully": "",
-	"Tool Description": "",
-	"Tool ID": "",
-	"Tool imported successfully": "",
-	"Tool Name": "",
-	"Tool updated successfully": "",
-	"Tools": "",
-	"Tools Access": "",
-	"Tools are a function calling system with arbitrary code execution": "",
-	"Tools Function Calling Prompt": "",
-	"Tools have a function calling system that allows arbitrary code execution": "",
-	"Tools have a function calling system that allows arbitrary code execution.": "",
-	"Top K": "Top K",
-	"Top P": "Top P",
-	"Transformers": "",
-	"Trouble accessing Ollama?": "Проблеми с достъпът до Ollama?",
-	"TTS Model": "",
+	"Title Generation": "Генериране на заглавие",
+	"Title Generation Prompt": "Промпт за генериране на заглавие",
+	"TLS": "TLS",
+	"To access the available model names for downloading,": "За достъп до наличните имена на модели за изтегляне,",
+	"To access the GGUF models available for downloading,": "За достъп до наличните GGUF модели за изтегляне,",
+	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "За достъп до уеб интерфейса, моля, свържете се с администратора. Администраторите могат да управляват статусите на потребителите от Административния панел.",
+	"To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "За да прикачите база знания тук, първо ги добавете към работното пространство \"Знания\".",
+	"To learn more about available endpoints, visit our documentation.": "За да научите повече за наличните крайни точки, посетете нашата документация.",
+	"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.": "За да защитим вашата поверителност, от вашата обратна връзка се споделят само оценки, идентификатори на модели, тагове и метаданни—вашите чат логове остават лични и не са включени.",
+	"To select actions here, add them to the \"Functions\" workspace first.": "За да изберете действия тук, първо ги добавете към работното пространство \"Функции\".",
+	"To select filters here, add them to the \"Functions\" workspace first.": "За да изберете филтри тук, първо ги добавете към работното пространство \"Функции\".",
+	"To select toolkits here, add them to the \"Tools\" workspace first.": "За да изберете инструменти тук, първо ги добавете към работното пространство \"Инструменти\".",
+	"Toast notifications for new updates": "Изскачащи известия за нови актуализации",
+	"Today": "Днес",
+	"Toggle settings": "Превключване на настройките",
+	"Toggle sidebar": "Превключване на страничната лента",
+	"Token": "Токен",
+	"Tokens To Keep On Context Refresh (num_keep)": "Токени за запазване при обновяване на контекста (num_keep)",
+	"Too verbose": "Прекалено многословно",
+	"Tool created successfully": "Инструментът е създаден успешно",
+	"Tool deleted successfully": "Инструментът е изтрит успешно",
+	"Tool Description": "Описание на инструмента",
+	"Tool ID": "ID на инструмента",
+	"Tool imported successfully": "Инструментът е импортиран успешно",
+	"Tool Name": "Име на инструмента",
+	"Tool updated successfully": "Инструментът е актуализиран успешно",
+	"Tools": "Инструменти",
+	"Tools Access": "Достъп до инструменти",
+	"Tools are a function calling system with arbitrary code execution": "Инструментите са система за извикване на функции с произволно изпълнение на код",
+	"Tools Function Calling Prompt": "Промпт за извикване на функции на инструментите",
+	"Tools have a function calling system that allows arbitrary code execution": "Инструментите имат система за извикване на функции, която позволява произволно изпълнение на код",
+	"Tools have a function calling system that allows arbitrary code execution.": "Инструментите имат система за извикване на функции, която позволява произволно изпълнение на код.",
+	"Top K": "Топ K",
+	"Top P": "Топ P",
+	"Transformers": "Трансформатори",
+	"Trouble accessing Ollama?": "Проблеми с достъпа до Ollama?",
+	"TTS Model": "TTS Модел",
 	"TTS Settings": "TTS Настройки",
-	"TTS Voice": "",
+	"TTS Voice": "TTS Глас",
 	"Type": "Вид",
 	"Type Hugging Face Resolve (Download) URL": "Въведете Hugging Face Resolve (Download) URL",
-	"Uh-oh! There was an issue with the response.": "",
-	"UI": "",
-	"Unarchive All": "",
-	"Unarchive All Archived Chats": "",
-	"Unarchive Chat": "",
-	"Unlock mysteries": "",
-	"Unpin": "",
-	"Unravel secrets": "",
-	"Untagged": "",
-	"Update": "",
+	"Uh-oh! There was an issue with the response.": "Ох! Имаше проблем с отговора.",
+	"UI": "Потребителски интерфейс",
+	"Unarchive All": "Разархивирай всички",
+	"Unarchive All Archived Chats": "Разархивирай всички архивирани чатове",
+	"Unarchive Chat": "Разархивирай чат",
+	"Unlock mysteries": "Разкрий мистерии",
+	"Unpin": "Откачи",
+	"Unravel secrets": "Разгадай тайни",
+	"Untagged": "Без етикет",
+	"Update": "Актуализиране",
 	"Update and Copy Link": "Обнови и копирай връзка",
-	"Update for the latest features and improvements.": "",
+	"Update for the latest features and improvements.": "Актуализирайте за най-новите функции и подобрения.",
 	"Update password": "Обновяване на парола",
-	"Updated": "",
-	"Updated at": "",
-	"Updated At": "",
-	"Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "",
-	"Upload": "",
+	"Updated": "Актуализирано",
+	"Updated at": "Актуализирано на",
+	"Updated At": "Актуализирано на",
+	"Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "Надградете до лицензиран план за разширени възможности, включително персонализирани теми и брандиране, и специализирана поддръжка.",
+	"Upload": "Качване",
 	"Upload a GGUF model": "Качване на GGUF модел",
-	"Upload directory": "",
-	"Upload files": "",
+	"Upload directory": "Качване на директория",
+	"Upload files": "Качване на файлове",
 	"Upload Files": "Качване на файлове",
-	"Upload Pipeline": "",
+	"Upload Pipeline": "Качване на конвейер",
 	"Upload Progress": "Прогрес на качването",
-	"URL": "",
-	"URL Mode": "URL Mode",
-	"Use '#' in the prompt input to load and include your knowledge.": "",
+	"URL": "URL",
+	"URL Mode": "URL режим",
+	"Use '#' in the prompt input to load and include your knowledge.": "Използвайте '#' в полето за въвеждане, за да заредите и включите вашите знания.",
 	"Use Gravatar": "Използвайте Gravatar",
-	"Use groups to group your users and assign permissions.": "",
-	"Use Initials": "Използвайте Инициали",
+	"Use groups to group your users and assign permissions.": "Използвайте групи, за да групирате вашите потребители и да присвоите разрешения.",
+	"Use Initials": "Използвайте инициали",
 	"use_mlock (Ollama)": "use_mlock (Ollama)",
 	"use_mmap (Ollama)": "use_mmap (Ollama)",
 	"user": "потребител",
-	"User": "",
-	"User location successfully retrieved.": "",
-	"Username": "",
+	"User": "Потребител",
+	"User location successfully retrieved.": "Местоположението на потребителя е успешно извлечено.",
+	"Username": "Потребителско име",
 	"Users": "Потребители",
-	"Using the default arena model with all models. Click the plus button to add custom models.": "",
+	"Using the default arena model with all models. Click the plus button to add custom models.": "Използване на стандартния арена модел с всички модели. Кликнете бутона плюс, за да добавите персонализирани модели.",
 	"Utilize": "Използване",
 	"Valid time units:": "Валидни единици за време:",
-	"Valves": "",
-	"Valves updated": "",
-	"Valves updated successfully": "",
+	"Valves": "Клапани",
+	"Valves updated": "Клапаните са актуализирани",
+	"Valves updated successfully": "Клапаните са актуализирани успешно",
 	"variable": "променлива",
-	"variable to have them replaced with clipboard content.": "променливи да се заменят съдържанието от клипборд.",
+	"variable to have them replaced with clipboard content.": "променлива, за да бъдат заменени със съдържанието от клипборда.",
 	"Version": "Версия",
-	"Version {{selectedVersion}} of {{totalVersions}}": "",
-	"View Replies": "",
-	"Visibility": "",
-	"Voice": "",
-	"Voice Input": "",
+	"Version {{selectedVersion}} of {{totalVersions}}": "Версия {{selectedVersion}} от {{totalVersions}}",
+	"View Replies": "Преглед на отговорите",
+	"Visibility": "Видимост",
+	"Voice": "Глас",
+	"Voice Input": "Гласов вход",
 	"Warning": "Предупреждение",
-	"Warning:": "",
-	"Warning: Enabling this will allow users to upload arbitrary code on the server.": "",
+	"Warning:": "Предупреждение:",
+	"Warning: Enabling this will allow users to upload arbitrary code on the server.": "Предупреждение: Активирането на това ще позволи на потребителите да качват произволен код на сървъра.",
 	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Предупреждение: Ако актуализирате или промените вашия модел за вграждане, трябва да повторите импортирането на всички документи.",
-	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
+	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Предупреждение: Изпълнението на Jupyter позволява произволно изпълнение на код, което представлява сериозни рискове за сигурността—продължете с изключително внимание.",
 	"Web": "Уеб",
-	"Web API": "",
+	"Web API": "Уеб API",
 	"Web Loader Settings": "Настройки за зареждане на уеб",
 	"Web Search": "Търсене в уеб",
 	"Web Search Engine": "Уеб търсачка",
-	"Web Search in Chat": "",
-	"Web Search Query Generation": "",
+	"Web Search in Chat": "Уеб търсене в чата",
+	"Web Search Query Generation": "Генериране на заявки за уеб търсене",
 	"Webhook URL": "Уебхук URL",
 	"WebUI Settings": "WebUI Настройки",
-	"WebUI URL": "",
-	"WebUI will make requests to \"{{url}}/api/chat\"": "",
-	"WebUI will make requests to \"{{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": "",
-	"Whisper (Local)": "",
-	"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. (Default: 0.9)": "",
+	"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?": "Върху какво работите?",
+	"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": "където и да сте",
+	"Whisper (Local)": "Whisper (Локално)",
+	"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. (Default: 0.9)": "Работи заедно с top-k. По-висока стойност (напр. 0.95) ще доведе до по-разнообразен текст, докато по-ниска стойност (напр. 0.5) ще генерира по-фокусиран и консервативен текст. (По подразбиране: 0.9)",
 	"Workspace": "Работно пространство",
-	"Workspace Permissions": "",
-	"Write": "",
+	"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 a summary in 50 words that summarizes [topic or keyword].": "Напиши описание в 50 думи, което обобщава [тема или ключова дума].",
+	"Write something...": "Напишете нещо...",
+	"Write your model template content here": "Напишете съдържанието на вашия шаблон за модел тук",
 	"Yesterday": "вчера",
-	"You": "вие",
-	"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "",
-	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
-	"You cannot upload an empty file.": "",
-	"You do not have permission to access this feature.": "",
-	"You do not have permission to upload files": "",
-	"You do not have permission to upload files.": "",
+	"You": "Вие",
+	"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Можете да чатите с максимум {{maxCount}} файл(а) наведнъж.",
+	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Можете да персонализирате взаимодействията си с LLM-и, като добавите спомени чрез бутона 'Управление' по-долу, правейки ги по-полезни и съобразени с вас.",
+	"You cannot upload an empty file.": "Не можете да качите празен файл.",
+	"You do not have permission to access this feature.": "Нямате разрешение за достъп до тази функция.",
+	"You do not have permission to upload files": "Нямате разрешение да качвате файлове",
+	"You do not have permission to upload files.": "Нямате разрешение да качвате файлове.",
 	"You have no archived conversations.": "Нямате архивирани разговори.",
-	"You have shared this chat": "Вие сте споделели този чат",
+	"You have shared this chat": "Вие сте споделили този чат",
 	"You're a helpful assistant.": "Вие сте полезен асистент.",
-	"You're now logged in.": "Сега, вие влязохте в системата.",
-	"Your account status is currently pending activation.": "",
-	"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.": "",
+	"You're now logged in.": "Сега вие влязохте в системата.",
+	"Your account status is currently pending activation.": "Статусът на вашия акаунт в момента очаква активиране.",
+	"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.": "Цялата ви вноска ще отиде директно при разработчика на плъгина; Open WebUI не взима никакъв процент. Въпреки това, избраната платформа за финансиране може да има свои собствени такси.",
 	"Youtube": "Youtube",
-	"Youtube Loader Settings": "Youtube Loader Settings"
+	"Youtube Loader Settings": "Настройки за зареждане от Youtube"
 }

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "আলোচনায় যুক্ত করার জন্য যে কোন ফাইল এখানে ড্রপ করুন",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "যেমন '30s','10m'. সময়ের অনুমোদিত অনুমোদিত এককগুলি হচ্ছে 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Top K লিখুন",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "ইউআরএল দিন (যেমন http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "ইউআরএল দিন (যেমন http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "সাধারণ",
 	"General Settings": "সাধারণ সেটিংসমূহ",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "Execució de codi",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Codi formatat correctament",
 	"Code Interpreter": "Intèrpret de codi",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "Dibuixar",
 	"Drop any files here to add to the conversation": "Deixa qualsevol arxiu aquí per afegir-lo a la conversa",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "p. ex. '30s','10m'. Les unitats de temps vàlides són 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "p. ex. Un filtre per eliminar paraules malsonants del text",
 	"e.g. My Filter": "p. ex. El meu filtre",
 	"e.g. My Tools": "p. ex. Les meves eines",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Introdueix la clau API de Tavily",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Entra la URL pública de WebUI. Aquesta URL s'utilitzarà per generar els enllaços en les notificacions.",
 	"Enter Tika Server URL": "Introdueix l'URL del servidor Tika",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Introdueix Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Introdueix l'URL (p. ex. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Introdueix l'URL (p. ex. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Les funcions permeten l'execució de codi arbitrari",
 	"Functions allow arbitrary code execution.": "Les funcions permeten l'execució de codi arbitrari.",
 	"Functions imported successfully": "Les funcions s'han importat correctament",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "General",
 	"General Settings": "Preferències generals",
 	"Generate an image": "Generar una imatge",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "Ihulog ang bisan unsang file dinhi aron idugang kini sa panag-istoryahanay",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "p. ",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Pagsulod sa Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Pagsulod sa URL (e.g. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Heneral",
 	"General Settings": "kinatibuk-ang mga setting",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "Provádění kódu",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Kód byl úspěšně naformátován.",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "Namalovat",
 	"Drop any files here to add to the conversation": "Sem přetáhněte libovolné soubory, které chcete přidat do konverzace",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "např. '30s','10m'. Platné časové jednotky jsou 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Zadejte API klíč Tavily",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "Zadejte URL serveru Tika",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Zadejte horní K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Zadejte URL (např. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Zadejte URL (např. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Funkce umožňují vykonávat libovolný kód.",
 	"Functions allow arbitrary code execution.": "Funkce umožňují provádění libovolného kódu.",
 	"Functions imported successfully": "Funkce byly úspěšně importovány",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Obecný",
 	"General Settings": "Obecná nastavení",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Kode formateret korrekt",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "Upload filer her for at tilføje til samtalen",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "f.eks. '30s', '10m'. Tilladte værdier er 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Indtast Tavily API-nøgle",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "Indtast Tika Server URL",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Indtast Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Indtast URL (f.eks. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Indtast URL (f.eks. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Funktioner tillader kørsel af vilkårlig kode",
 	"Functions allow arbitrary code execution.": "Funktioner tillader kørsel af vilkårlig kode.",
 	"Functions imported successfully": "Funktioner importeret.",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Generelt",
 	"General Settings": "Generelle indstillinger",
 	"Generate an image": "",

+ 6 - 0
src/lib/i18n/locales/de-DE/translation.json

@@ -182,6 +182,7 @@
 	"Code execution": "Codeausführung",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Code erfolgreich formatiert",
 	"Code Interpreter": "Code-Interpreter",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "Zeichnen",
 	"Drop any files here to add to the conversation": "Ziehen Sie beliebige Dateien hierher, um sie der Unterhaltung 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": "",
 	"e.g. A filter to remove profanity from text": "z. B. Ein Filter, um Schimpfwörter aus Text zu entfernen",
 	"e.g. My Filter": "z. B. Mein Filter",
 	"e.g. My Tools": "z. B. Meine Werkzeuge",
@@ -408,6 +410,7 @@
 	"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 Top K": "Geben Sie Top K ein",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Geben Sie die URL ein (z. B. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Geben Sie die URL ein (z. B. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Funktionen ermöglichen die Ausführung beliebigen Codes",
 	"Functions allow arbitrary code execution.": "Funktionen ermöglichen die Ausführung beliebigen Codes.",
 	"Functions imported successfully": "Funktionen erfolgreich importiert",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Allgemein",
 	"General Settings": "Allgemeine Einstellungen",
 	"Generate an image": "Bild erzeugen",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "Drop files here to add to conversation",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "e.g. '30s','10m'. Much time units are 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Enter Top Wow",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Enter URL (e.g. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Woweral",
 	"General Settings": "General Doge Settings",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "Εκτέλεση κώδικα",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Ο κώδικας μορφοποιήθηκε επιτυχώς",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "Σχεδίαση",
 	"Drop any files here to add to the conversation": "Αφήστε οποιαδήποτε αρχεία εδώ για να προστεθούν στη συνομιλία",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "π.χ. '30s','10m'. Οι έγκυρες μονάδες χρόνου είναι 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "π.χ. Ένα φίλτρο για να αφαιρέσετε βρισιές από το κείμενο",
 	"e.g. My Filter": "π.χ. Το Φίλτρου Μου",
 	"e.g. My Tools": "π.χ. Τα Εργαλεία Μου",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Εισάγετε το Κλειδί API Tavily",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "Εισάγετε το URL διακομιστή Tika",
+	"Enter timeout in seconds": "",
 	"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)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Οι λειτουργίες επιτρέπουν την εκτέλεση αυθαίρετου κώδικα",
 	"Functions allow arbitrary code execution.": "Οι λειτουργίες επιτρέπουν την εκτέλεση αυθαίρετου κώδικα.",
 	"Functions imported successfully": "Οι λειτουργίες εισήχθησαν με επιτυχία",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Γενικά",
 	"General Settings": "Γενικές Ρυθμίσεις",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "",
 	"Enter URL (e.g. http://localhost:11434)": "",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "",
 	"General Settings": "",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "",
 	"Enter URL (e.g. http://localhost:11434)": "",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "",
 	"General Settings": "",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "Ejecución de código",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Se ha formateado correctamente el código.",
 	"Code Interpreter": "Interprete de Código",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "Dibujar",
 	"Drop any files here to add to the conversation": "Suelta cualquier archivo aquí para agregarlo a la conversación",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "p.ej. '30s','10m'. Unidades válidas de tiempo son 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "p.ej. Un filtro para eliminar la profanidad del texto",
 	"e.g. My Filter": "p.ej. Mi Filtro",
 	"e.g. My Tools": "p.ej. Mis Herramientas",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Ingrese la clave API de Tavily",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Ingrese la URL pública de su WebUI. Esta URL se utilizará para generar enlaces en las notificaciones.",
 	"Enter Tika Server URL": "Ingrese la URL del servidor Tika",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Ingrese el Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Ingrese la URL (p.ej., http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Ingrese la URL (p.ej., http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Funciones habilitan la ejecución de código arbitrario",
 	"Functions allow arbitrary code execution.": "Funciones habilitan la ejecución de código arbitrario.",
 	"Functions imported successfully": "Funciones importadas exitosamente",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "General",
 	"General Settings": "Opciones Generales",
 	"Generate an image": "Generar una imagen",

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

@@ -182,6 +182,7 @@
 	"Code execution": "Kodearen exekuzioa",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Kodea ongi formateatu da",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "Marraztu",
 	"Drop any files here to add to the conversation": "Jaregin edozein fitxategi hemen elkarrizketara gehitzeko",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "adib. '30s','10m'. Denbora unitate baliodunak dira 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "adib. Testutik lizunkeriak kentzeko iragazki bat",
 	"e.g. My Filter": "adib. Nire Iragazkia",
 	"e.g. My Tools": "adib. Nire Tresnak",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Sartu Tavily API Gakoa",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "Sartu Tika Zerbitzari URLa",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Sartu Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Sartu URLa (adib. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Sartu URLa (adib. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Funtzioek kode arbitrarioa exekutatzea ahalbidetzen dute",
 	"Functions allow arbitrary code execution.": "Funtzioek kode arbitrarioa exekutatzea ahalbidetzen dute.",
 	"Functions imported successfully": "Funtzioak ongi inportatu dira",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Orokorra",
 	"General Settings": "Ezarpen Orokorrak",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "هر فایلی را اینجا رها کنید تا به مکالمه اضافه شود",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "به طور مثال '30s','10m'. واحد\u200cهای زمانی معتبر 's', 'm', 'h' هستند.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "",
+	"Enter timeout in seconds": "",
 	"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)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "درون\u200cریزی توابع با موفقیت انجام شد",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "عمومی",
 	"General Settings": "تنظیمات عمومی",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "Koodin suorittaminen",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Koodin muotoilu onnistui",
 	"Code Interpreter": "Ohjelmatulkki",
 	"Code Interpreter Engine": "Ohjelmatulkin moottori",
@@ -321,6 +322,7 @@
 	"Draw": "Piirros",
 	"Drop any files here to add to the conversation": "Pudota tiedostoja tähän lisätäksesi ne keskusteluun",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "esim. '30s', '10m'. Kelpoiset aikayksiköt ovat 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "esim. suodatin, joka poistaa kirosanoja tekstistä",
 	"e.g. My Filter": "esim. Oma suodatin",
 	"e.g. My Tools": "esim. Omat työkalut",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Kirjoita Tavily API -avain",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Kirjoita julkinen WebUI verkko-osoitteesi. Verkko-osoitetta käytetään osoitteiden luontiin ilmoituksissa.",
 	"Enter Tika Server URL": "Kirjoita Tika Server URL",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Kirjoita Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Kirjoita URL-osoite (esim. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Kirjoita URL-osoite (esim. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Toiminnot sallivat mielivaltaisen koodin suorittamisen",
 	"Functions allow arbitrary code execution.": "Toiminnot sallivat mielivaltaisen koodin suorittamisen.",
 	"Functions imported successfully": "Toiminnot tuotu onnistuneesti",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Yleinen",
 	"General Settings": "Yleiset asetukset",
 	"Generate an image": "Luo kuva",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Le code a été formaté avec succès",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "Déposez des fichiers ici pour les ajouter à la conversation",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "par ex. '30s', '10 min'. Les unités de temps valides sont 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Entrez la clé API Tavily",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Entrez les Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Entrez l'URL (par ex. {http://127.0.0.1:7860/})",
 	"Enter URL (e.g. http://localhost:11434)": "Entrez l'URL (par ex. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "Fonctions importées avec succès",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Général",
 	"General Settings": "Paramètres Généraux",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "Exécution de code",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Le code a été formaté avec succès",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "Match nul",
 	"Drop any files here to add to the conversation": "Déposez des fichiers ici pour les ajouter à la conversation",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "par ex. '30s', '10 min'. Les unités de temps valides sont 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "par ex. un filtre pour retirer les vulgarités du texte",
 	"e.g. My Filter": "par ex. Mon Filtre",
 	"e.g. My Tools": "par ex. Mes Outils",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Entrez la clé API Tavily",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Entrez l'URL publique de votre WebUI. Cette URL sera utilisée pour générer des liens dans les notifications.",
 	"Enter Tika Server URL": "Entrez l'URL du serveur Tika",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Entrez les Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Entrez l'URL (par ex. {http://127.0.0.1:7860/})",
 	"Enter URL (e.g. http://localhost:11434)": "Entrez l'URL (par ex. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Les fonctions permettent l'exécution de code arbitraire",
 	"Functions allow arbitrary code execution.": "Les fonctions permettent l'exécution de code arbitraire.",
 	"Functions imported successfully": "Fonctions importées avec succès",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Général",
 	"General Settings": "Paramètres généraux",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "גרור כל קובץ לכאן כדי להוסיף לשיחה",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "למשל '30s', '10m'. יחידות זמן חוקיות הן 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "",
+	"Enter timeout in seconds": "",
 	"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)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "כללי",
 	"General Settings": "הגדרות כלליות",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "बातचीत में जोड़ने के लिए कोई भी फ़ाइल यहां छोड़ें",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "जैसे '30s', '10m', मान्य समय इकाइयाँ 's', 'm', 'h' हैं।",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "शीर्ष K दर्ज करें",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "यूआरएल दर्ज करें (उदा. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "यूआरएल दर्ज करें (उदा. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "सामान्य",
 	"General Settings": "सामान्य सेटिंग्स",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "Spustite bilo koje datoteke ovdje za dodavanje u razgovor",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "npr. '30s','10m'. Važeće vremenske jedinice su 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Unesite Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Unesite URL (npr. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Unesite URL (npr. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Općenito",
 	"General Settings": "Opće postavke",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "Kód végrehajtás",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Kód sikeresen formázva",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "Rajzolás",
 	"Drop any files here to add to the conversation": "Húzz ide fájlokat a beszélgetéshez való hozzáadáshoz",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "pl. '30s','10m'. Érvényes időegységek: 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Add meg a Tavily API kulcsot",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "Add meg a Tika szerver URL-t",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Add meg a Top K értéket",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Add meg az URL-t (pl. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Add meg az URL-t (pl. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "A funkciók tetszőleges kód végrehajtását teszik lehetővé",
 	"Functions allow arbitrary code execution.": "A funkciók tetszőleges kód végrehajtását teszik lehetővé.",
 	"Functions imported successfully": "Funkciók sikeresen importálva",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Általános",
 	"General Settings": "Általános beállítások",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Kode berhasil diformat",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "Letakkan file apa pun di sini untuk ditambahkan ke percakapan",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "misalnya '30-an', '10m'. Satuan waktu yang valid adalah 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Masukkan Kunci API Tavily",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Masukkan Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Masukkan URL (mis. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Masukkan URL (mis. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "Fungsi berhasil diimpor",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Umum",
 	"General Settings": "Pengaturan Umum",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "Cód a fhorghníomhú",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Cód formáidithe go rathúil",
 	"Code Interpreter": "Ateangaire Cód",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "Tarraing",
 	"Drop any files here to add to the conversation": "Scaoil aon chomhaid anseo le cur leis an gcomhrá",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "m.sh. '30s', '10m'. Is iad aonaid ama bailí ná 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "m.h. Scagaire chun profanity a bhaint as téacs",
 	"e.g. My Filter": "m.sh. Mo Scagaire",
 	"e.g. My Tools": "e.g. Mo Uirlisí",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Cuir isteach eochair API Tavily",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Cuir isteach URL poiblí do WebUI. Bainfear úsáid as an URL seo chun naisc a ghiniúint sna fógraí.",
 	"Enter Tika Server URL": "Cuir isteach URL freastalaí Tika",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Cuir isteach Barr K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Iontráil URL (m.sh. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Iontráil URL (m.sh. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Ligeann feidhmeanna forghníomhú cód",
 	"Functions allow arbitrary code execution.": "Ceadaíonn feidhmeanna forghníomhú cód treallach.",
 	"Functions imported successfully": "Feidhmeanna allmhairi",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Ginearálta",
 	"General Settings": "Socruithe Ginearálta",
 	"Generate an image": "Gin íomhá",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "Trascina qui i file da aggiungere alla conversazione",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "ad esempio '30s','10m'. Le unità di tempo valide sono 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Inserisci Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Inserisci URL (ad esempio http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Inserisci URL (ad esempio http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Generale",
 	"General Settings": "Impostazioni generali",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "コードフォーマットに成功しました",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "会話を追加するには、ここにファイルをドロップしてください",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "例: '30秒'、'10分'。有効な時間単位は '秒'、'分'、'時間' です。",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Tavily API Keyを入力してください。",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "Tika Server URLを入力してください。",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "トップ 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)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "Functionsのインポートが成功しました",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "一般",
 	"General Settings": "一般設定",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "გადაიტანეთ ფაილები აქ, რათა დაამატოთ ისინი მიმოწერაში",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "მაგალითად, '30წ', '10მ'. მოქმედი დროის ერთეულები: 'წ', 'წთ', 'სთ'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "შეიყვანეთ Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "შეიყვანეთ მისამართი (მაგალითად http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "შეიყვანეთ მისამართი (მაგალითად http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "ზოგადი",
 	"General Settings": "ზოგადი პარამეტრები",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "코드 실행",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "성공적으로 코드가 생성되었습니다",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "그리기",
 	"Drop any files here to add to the conversation": "대화에 추가할 파일을 여기에 드롭하세요.",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "예: '30초','10분'. 유효한 시간 단위는 '초', '분', '시'입니다.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Tavily API 키 입력",
 	"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 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)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "함수로 임이의 코드 실행 허용하기",
 	"Functions allow arbitrary code execution.": "함수가 임이의 코드를 실행하도록 허용하였습니다",
 	"Functions imported successfully": "성공적으로 함수가 가져왔습니다",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "일반",
 	"General Settings": "일반 설정",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Kodas suformatuotas sėkmingai",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "Įkelkite dokumentus čia, kad juos pridėti į pokalbį",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "pvz. '30s', '10m'. Laiko vienetai yra 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Įveskite Tavily API raktą",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "Įveskite Tika serverio nuorodą",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Įveskite Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Įveskite nuorodą (pvz. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Įveskite nuorododą (pvz. http://localhost:11434",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Funkcijos leidžia nekontroliuojamo kodo vykdymą",
 	"Functions allow arbitrary code execution.": "Funkcijos leidžia nekontroliuojamo kodo vykdymą",
 	"Functions imported successfully": "Funkcijos importuotos sėkmingai",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Bendri",
 	"General Settings": "Bendri nustatymai",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Kod berjaya diformatkan",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "Letakkan mana-mana fail di sini untuk ditambahkan pada perbualan",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "cth '30s','10m'. Unit masa yang sah ialah 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Masukkan Kunci API Tavily",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "Masukkan URL Pelayan Tika",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Masukkan 'Top K'",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Masukkan URL (cth http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Masukkan URL (cth http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Fungsi membenarkan pelaksanaan kod sewenang-wenangnya",
 	"Functions allow arbitrary code execution.": "Fungsi membenarkan pelaksanaan kod sewenang-wenangnya.",
 	"Functions imported successfully": "Fungsi berjaya diimport",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Umum",
 	"General Settings": "Tetapan Umum",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "Kodekjøring",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Koden er formatert",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "Tegne",
 	"Drop any files here to add to the conversation": "Slipp filer her for å legge dem til i samtalen",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "f.eks. '30s','10m'. Gyldige tidsenheter er 's', 'm', 't'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "f.eks. et filter for å fjerne banning fra tekst",
 	"e.g. My Filter": "f.eks. Mitt filter",
 	"e.g. My Tools": "f.eks. Mine verktøy",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Angi API-nøkkel for Tavily",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "Angi server-URL for Tika",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Angi Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Angi URL (f.eks. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Angi URL (f.eks. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Funksjoner tillater vilkårlig kodekjøring",
 	"Functions allow arbitrary code execution.": "Funksjoner tillater vilkårlig kodekjøring.",
 	"Functions imported successfully": "Funksjoner er importert",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Generelt",
 	"General Settings": "Generelle innstillinger",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "Code uitvoeren",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Code succesvol geformateerd",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "Teken",
 	"Drop any files here to add to the conversation": "Sleep hier bestanden om toe te voegen aan het gesprek",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "bijv. '30s', '10m'. Geldige tijdseenheden zijn 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "bijv. Een filter om gevloek uit tekst te verwijderen",
 	"e.g. My Filter": "bijv. Mijn filter",
 	"e.g. My Tools": "bijv. Mijn gereedschappen",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Voer Tavily API-sleutel in",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "Voer Tika Server URL in",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Voeg Top K toe",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Voer URL in (Bijv. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Voer URL in (Bijv. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Functies staan willekeurige code-uitvoering toe",
 	"Functions allow arbitrary code execution.": "Functies staan willekeurige code-uitvoering toe",
 	"Functions imported successfully": "Functies succesvol geïmporteerd",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Algemeen",
 	"General Settings": "Algemene instellingen",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "ਗੱਲਬਾਤ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਕੋਈ ਵੀ ਫਾਈਲ ਇੱਥੇ ਛੱਡੋ",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "ਉਦਾਹਰਣ ਲਈ '30ਸ','10ਮਿ'. ਸਹੀ ਸਮਾਂ ਇਕਾਈਆਂ ਹਨ 'ਸ', 'ਮ', 'ਘੰ'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "ਸਿਖਰ 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)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "ਆਮ",
 	"General Settings": "ਆਮ ਸੈਟਿੰਗਾਂ",
 	"Generate an image": "",

+ 933 - 927
src/lib/i18n/locales/pl-PL/translation.json

@@ -1,1144 +1,1150 @@
 {
-	"-1 for no limit, or a positive integer for a specific limit": "",
-	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' lub '-1' dla bez wygaśnięcia.",
-	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
+	"-1 for no limit, or a positive integer for a specific limit": "-1 oznacza brak limitu, lub dodatnia liczba całkowita dla konkretnego limitu",
+	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "s, m, h, d, w lub -1 dla braku wygaśnięcia.",
+	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(np. `sh webui.sh --api --api-auth username_password`)>",
 	"(e.g. `sh webui.sh --api`)": "(np. `sh webui.sh --api`)",
 	"(latest)": "(najnowszy)",
 	"{{ models }}": "{{ modele }}",
-	"{{COUNT}} Replies": "",
-	"{{user}}'s Chats": "{{user}} - czaty",
-	"{{webUIName}} Backend Required": "Backend {{webUIName}} wymagane",
-	"*Prompt node ID(s) are required for image generation": "",
-	"A new version (v{{LATEST_VERSION}}) is now available.": "",
-	"A task model is used when performing tasks such as generating titles for chats and web search queries": "Model zadań jest używany podczas wykonywania zadań, takich jak generowanie tytułów czatów i zapytań wyszukiwania w Internecie",
+	"{{COUNT}} Replies": "{{COUNT}} odpowiedzi",
+	"{{user}}'s Chats": "Czaty użytkownika {{user}}",
+	"{{webUIName}} Backend Required": "Backend dla {{webUIName}} wymagany",
+	"*Prompt node ID(s) are required for image generation": "Wymagane są identyfikatory węzłów wyzwalających do generowania obrazu.",
+	"A new version (v{{LATEST_VERSION}}) is now available.": "Dostępna jest nowa wersja (v{{LATEST_VERSION}}).",
+	"A task model is used when performing tasks such as generating titles for chats and web search queries": "Model zadań jest wykorzystywany podczas realizacji zadań, takich jak generowanie tytułów rozmów i zapytań wyszukiwania internetowego.",
 	"a user": "użytkownik",
 	"About": "O nas",
-	"Access": "",
-	"Access Control": "",
-	"Accessible to all users": "",
+	"Access": "Dostęp",
+	"Access Control": "Kontrola dostępu",
+	"Accessible to all users": "Dostępny dla wszystkich użytkowników",
 	"Account": "Konto",
-	"Account Activation Pending": "",
-	"Accurate information": "Dokładna informacja",
-	"Actions": "",
-	"Activate": "",
-	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "",
-	"Active Users": "",
+	"Account Activation Pending": "Aktywacja konta w toku",
+	"Accurate information": "Precyzyjna informacja",
+	"Actions": "Akcje",
+	"Activate": "Włącz",
+	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Aktywuj ten rozkaz, wpisując \"/{{COMMAND}}\" do pola wprowadzania czatu.",
+	"Active Users": "Aktywni użytkownicy",
 	"Add": "Dodaj",
-	"Add a model ID": "",
+	"Add a model ID": "Dodaj identyfikator modelu",
 	"Add a short description about what this model does": "Dodaj krótki opis działania tego modelu",
 	"Add a tag": "Dodaj tag",
-	"Add Arena Model": "",
-	"Add Connection": "",
-	"Add Content": "",
-	"Add content here": "",
-	"Add custom prompt": "Dodaj własne polecenie",
+	"Add Arena Model": "Dodaj model Arena",
+	"Add Connection": "Dodaj Połączenie",
+	"Add Content": "Dodaj treść",
+	"Add content here": "Dodaj tutaj treść",
+	"Add custom prompt": "Dodaj niestandardowe polecenie",
 	"Add Files": "Dodaj pliki",
-	"Add Group": "",
+	"Add Group": "Dodaj Grupę",
 	"Add Memory": "Dodaj pamięć",
 	"Add Model": "Dodaj model",
-	"Add Reaction": "",
-	"Add Tag": "",
+	"Add Reaction": "Dodaj reakcję",
+	"Add Tag": "Dodaj Tag",
 	"Add Tags": "Dodaj tagi",
-	"Add text content": "",
+	"Add text content": "Dodaj tekstową zawartość",
 	"Add User": "Dodaj użytkownika",
-	"Add User Group": "",
-	"Adjusting these settings will apply changes universally to all users.": "Dostosowanie tych ustawień spowoduje zastosowanie zmian uniwersalnie do wszystkich użytkowników.",
-	"admin": "admin",
-	"Admin": "",
+	"Add User Group": "Dodaj grupę użytkowników",
+	"Adjusting these settings will apply changes universally to all users.": "Dostosowanie tych ustawień spowoduje wprowadzenie zmian powszechnie dla wszystkich użytkowników.",
+	"admin": "administrator",
+	"Admin": "Administrator",
 	"Admin Panel": "Panel administracyjny",
 	"Admin Settings": "Ustawienia administratora",
-	"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
-	"Advanced Parameters": "Zaawansowane parametry",
-	"Advanced Params": "Zaawansowane parametry",
+	"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Administratorzy mają dostęp do wszystkich narzędzi przez cały czas; użytkownicy potrzebują przypisanych narzędzi zgodnie z modelem w przestrzeni roboczej.",
+	"Advanced Parameters": "Zaawansowane ustawienia",
+	"Advanced Params": "Zaawansowane ustawienia",
 	"All Documents": "Wszystkie dokumenty",
-	"All models deleted successfully": "",
-	"Allow Chat Controls": "",
-	"Allow Chat Delete": "",
-	"Allow Chat Deletion": "Pozwól na usuwanie czatu",
-	"Allow Chat Edit": "",
-	"Allow File Upload": "",
-	"Allow non-local voices": "",
-	"Allow Temporary Chat": "",
-	"Allow User Location": "",
-	"Allow Voice Interruption in Call": "",
-	"Allowed Endpoints": "",
-	"Already have an account?": "Masz już konto?",
-	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
-	"Always": "",
-	"Amazing": "",
+	"All models deleted successfully": "Wszystkie modele zostały usunięte pomyślnie.",
+	"Allow Chat Controls": "Zezwól na kontrolki Chat",
+	"Allow Chat Delete": "Zezwól na usunięcie czatu",
+	"Allow Chat Deletion": "Zezwól na usuwanie czatu",
+	"Allow Chat Edit": "Zezwól na edycję czatu",
+	"Allow File Upload": "Pozwól na przesyłanie plików",
+	"Allow non-local voices": "Pozwól na głosy spoza lokalnej społeczności",
+	"Allow Temporary Chat": "Zezwól na tymczasową rozmowę",
+	"Allow User Location": "Zezwól na lokalizację użytkownika",
+	"Allow Voice Interruption in Call": "Zezwól na przerwanie połączenia głosowego",
+	"Allowed Endpoints": "Dozwolone punkty końcowe",
+	"Already have an account?": "Czy już masz konto?",
+	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Alternatywa dla top_p, mająca na celu zapewnienie równowagi między jakością a różnorodnością. Parametr p reprezentuje minimalne prawdopodobieństwo, aby token był brany pod uwagę, względem prawdopodobieństwa najbardziej prawdopodobnego tokena. Na przykład, dla p=0,05 i najbardziej prawdopodobnym tokenem o prawdopodobieństwie 0,9, logity o wartości mniejszej niż 0,045 są wykluczane. (Domyślnie: 0,0)",
+	"Always": "Zawsze",
+	"Amazing": "Niesamowite",
 	"an assistant": "asystent",
-	"Analyzed": "",
-	"Analyzing...": "",
-	"and": "i",
-	"and {{COUNT}} more": "",
-	"and create a new shared link.": "i utwórz nowy udostępniony link",
-	"API Base URL": "Podstawowy adres URL interfejsu API",
+	"Analyzed": "Przeanalizowane",
+	"Analyzing...": "Analizowanie...",
+	"and": "oraz",
+	"and {{COUNT}} more": "i {{COUNT}} więcej",
+	"and create a new shared link.": "i utwórz nowy link współdzielony.",
+	"API Base URL": "Adres bazowy interfejsu API",
 	"API Key": "Klucz API",
-	"API Key created.": "Klucz API utworzony.",
-	"API Key Endpoint Restrictions": "",
+	"API Key created.": "Klucz API został utworzony.",
+	"API Key Endpoint Restrictions": "Ograniczenia punktu końcowego klucza API",
 	"API keys": "Klucze API",
-	"Application DN": "",
-	"Application DN Password": "",
-	"applies to all users with the \"user\" role": "",
+	"Application DN": "Aplikacja DN",
+	"Application DN Password": "Aplikacja hasło DN",
+	"applies to all users with the \"user\" role": "dotyczy wszystkich użytkowników z rolą \"user\"",
 	"April": "Kwiecień",
 	"Archive": "Archiwum",
-	"Archive All Chats": "Archiwizuj wszystkie czaty",
-	"Archived Chats": "Zarchiwizowane czaty",
-	"archived-chat-export": "",
-	"Are you sure you want to delete this channel?": "",
-	"Are you sure you want to delete this message?": "",
-	"Are you sure you want to unarchive all archived chats?": "",
-	"Are you sure?": "Jesteś pewien?",
-	"Arena Models": "",
-	"Artifacts": "",
-	"Ask a question": "",
-	"Assistant": "",
+	"Archive All Chats": "Archiwizuj wszystkie rozmowy",
+	"Archived Chats": "Zarchiwizowane rozmowy",
+	"archived-chat-export": "archiwizowany eksport czatu",
+	"Are you sure you want to delete this channel?": "Czy na pewno chcesz usunąć ten kanał?",
+	"Are you sure you want to delete this message?": "Czy na pewno chcesz usunąć tę wiadomość?",
+	"Are you sure you want to unarchive all archived chats?": "Czy na pewno chcesz przywrócić wszystkie zapisane rozmowy?",
+	"Are you sure?": "Czy jesteś pewien?",
+	"Arena Models": "Modele Areny",
+	"Artifacts": "Artefakty",
+	"Ask a question": "Zadaj pytanie",
+	"Assistant": "Asystent",
 	"Attach file": "Dołącz plik",
 	"Attention to detail": "Dbałość o szczegóły",
-	"Attribute for Mail": "",
-	"Attribute for Username": "",
+	"Attribute for Mail": "Atrybut dla poczty",
+	"Attribute for Username": "Atrybut dla nazwy użytkownika",
 	"Audio": "Dźwięk",
 	"August": "Sierpień",
-	"Authenticate": "",
-	"Authentication": "",
-	"Auto-Copy Response to Clipboard": "Automatyczne kopiowanie odpowiedzi do schowka",
-	"Auto-playback response": "Odtwarzanie automatyczne odpowiedzi",
-	"Autocomplete Generation": "",
-	"Autocomplete Generation Input Max Length": "",
-	"Automatic1111": "",
-	"AUTOMATIC1111 Api Auth String": "",
-	"AUTOMATIC1111 Base URL": "Podstawowy adres URL AUTOMATIC1111",
-	"AUTOMATIC1111 Base URL is required.": "Podstawowy adres URL AUTOMATIC1111 jest wymagany.",
-	"Available list": "",
+	"Authenticate": "Uwierzytelnianie",
+	"Authentication": "Uwierzytelnianie",
+	"Auto-Copy Response to Clipboard": "Automatyczna kopiuj odpowiedz do schowka",
+	"Auto-playback response": "Automatyczna odpowiedź na powtórzenie",
+	"Autocomplete Generation": "Generowanie autouzupełniania",
+	"Autocomplete Generation Input Max Length": "Generowanie Autouzupełniania Wejścia Maksymalna Długość",
+	"Automatic1111": "Automatyczny1111",
+	"AUTOMATIC1111 Api Auth String": "Automatyczny ciąg uwierzytelniania API 1111",
+	"AUTOMATIC1111 Base URL": "Domyślny adres URL AUTOMATIC1111",
+	"AUTOMATIC1111 Base URL is required.": "Adres podstawowy AUTOMATIC1111 jest wymagany.",
+	"Available list": "Dostępna lista",
 	"available!": "dostępny!",
-	"Awful": "",
-	"Azure AI Speech": "",
-	"Azure Region": "",
+	"Awful": "Okropne",
+	"Azure AI Speech": "Azure AI Speech",
+	"Azure Region": "Region Azure",
 	"Back": "Wstecz",
-	"Bad Response": "a odpowiedź",
-	"Banners": "Banery",
-	"Base Model (From)": "Model podstawowy (od)",
-	"Batch Size (num_batch)": "",
+	"Bad Response": "Nieprawidłowa odpowiedź",
+	"Banners": "Bannery",
+	"Base Model (From)": "Model bazowy (od)",
+	"Batch Size (num_batch)": "Rozmiar partii (num_batch)",
 	"before": "przed",
-	"Being lazy": "Jest leniwy",
-	"Beta": "",
-	"Bing Search V7 Endpoint": "",
-	"Bing Search V7 Subscription Key": "",
-	"Bocha Search API Key": "",
+	"Being lazy": "Jest leniwy.",
+	"Beta": "Beta",
+	"Bing Search V7 Endpoint": "Wyszukiwarka Bing V7 Endpoint",
+	"Bing Search V7 Subscription Key": "Klucz subskrypcji Wyszukiwarki Bing V7",
+	"Bocha Search API Key": "Klucz API Bocha Search",
 	"Brave Search API Key": "Klucz API wyszukiwania Brave",
-	"By {{name}}": "",
-	"Bypass SSL verification for Websites": "Pomiń weryfikację SSL dla stron webowych",
-	"Calendar": "",
-	"Call": "",
-	"Call feature is not supported when using Web STT engine": "",
-	"Camera": "",
+	"By {{name}}": "Przez {{name}}",
+	"Bypass SSL verification for Websites": "Pomiń sprawdzanie SSL dla stron internetowych",
+	"Calendar": "Kalendarz",
+	"Call": "Wywołanie",
+	"Call feature is not supported when using Web STT engine": "Funkcja wywołania nie jest obsługiwana podczas korzystania z silnika Web STT",
+	"Camera": "Aparat fotograficzny",
 	"Cancel": "Anuluj",
 	"Capabilities": "Możliwości",
-	"Capture": "",
-	"Certificate Path": "",
+	"Capture": "Uchwycić",
+	"Certificate Path": "Ścieżka certyfikatu",
 	"Change Password": "Zmień hasło",
-	"Channel Name": "",
-	"Channels": "",
-	"Character": "",
-	"Character limit for autocomplete generation input": "",
-	"Chart new frontiers": "",
-	"Chat": "Czat",
-	"Chat Background Image": "",
-	"Chat Bubble UI": "Bąbelki czatu",
-	"Chat Controls": "",
-	"Chat direction": "Kierunek czatu",
-	"Chat Overview": "",
-	"Chat Permissions": "",
-	"Chat Tags Auto-Generation": "",
-	"Chats": "Czaty",
+	"Channel Name": "Nazwa kanału",
+	"Channels": "Kanały",
+	"Character": "Znak",
+	"Character limit for autocomplete generation input": "Limit znaków dla wejścia generowanego automatycznie",
+	"Chart new frontiers": "Odkrywaj nowe horyzonty",
+	"Chat": "Rozmowa online",
+	"Chat Background Image": "Obraz tła czatu",
+	"Chat Bubble UI": "Okno dialogowe czatu",
+	"Chat Controls": "Sterowanie czatem",
+	"Chat direction": "Kierunek rozmowy czatu",
+	"Chat Overview": "Przegląd czatu",
+	"Chat Permissions": "Uprawnienia do czatu",
+	"Chat Tags Auto-Generation": "Automatyczne generowanie tagów czatu",
+	"Chats": "Rozmowy",
 	"Check Again": "Sprawdź ponownie",
-	"Check for updates": "Sprawdź aktualizacje",
-	"Checking for updates...": "Sprawdzanie aktualizacji...",
-	"Choose a model before saving...": "Wybierz model przed zapisaniem...",
-	"Chunk Overlap": "Zachodzenie bloku",
+	"Check for updates": "Sprawdź dostępność aktualizacji",
+	"Checking for updates...": "Sprawdzanie dostępności aktualizacji...",
+	"Choose a model before saving...": "Wybierz model przed zapisaniem.",
+	"Chunk Overlap": "Nakładanie się bloków",
 	"Chunk Params": "Parametry bloku",
 	"Chunk Size": "Rozmiar bloku",
-	"Ciphers": "",
+	"Ciphers": "Szyfry",
 	"Citation": "Cytat",
-	"Clear memory": "",
-	"click here": "",
-	"Click here for filter guides.": "",
+	"Clear memory": "Wyczyść pamięć",
+	"click here": "kliknij tutaj",
+	"Click here for filter guides.": "Kliknij tutaj, aby uzyskać przewodniki filtrów.",
 	"Click here for help.": "Kliknij tutaj, aby uzyskać pomoc.",
-	"Click here to": "Kliknij tutaj, żeby",
-	"Click here to download user import template file.": "",
-	"Click here to learn more about faster-whisper and see the available models.": "",
-	"Click here to see available models.": "",
+	"Click here to": "Kliknij tutaj, aby przejść do",
+	"Click here to download user import template file.": "Kliknij tutaj, aby pobrać szablon pliku importu użytkownika.",
+	"Click here to learn more about faster-whisper and see the available models.": "Kliknij tutaj, aby dowiedzieć się więcej o faster-whisper i zobaczyć dostępne modele.",
+	"Click here to see available models.": "Kliknij tutaj, aby zobaczyć dostępne modele.",
 	"Click here to select": "Kliknij tutaj, aby wybrać",
-	"Click here to select a csv file.": "Kliknij tutaj, żeby wybrać plik CSV",
-	"Click here to select a py file.": "",
-	"Click here to upload a workflow.json file.": "",
+	"Click here to select a csv file.": "Kliknij tutaj, aby wybrać plik CSV.",
+	"Click here to select a py file.": "Kliknij tutaj, aby wybrać plik py.",
+	"Click here to upload a workflow.json file.": "Kliknij tutaj, aby przesłać plik workflow.json.",
 	"click here.": "kliknij tutaj.",
 	"Click on the user role button to change a user's role.": "Kliknij przycisk roli użytkownika, aby zmienić rolę użytkownika.",
-	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
-	"Clone": "Klon",
-	"Clone Chat": "",
-	"Clone of {{TITLE}}": "",
+	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Zezwolenie na zapis do schowka odmówione. Sprawdź ustawienia przeglądarki, aby przyznać wymagany dostęp.",
+	"Clone": "Sklonuj",
+	"Clone Chat": "Sklonuj Czat",
+	"Clone of {{TITLE}}": "Klon {{TITLE}}",
 	"Close": "Zamknij",
-	"Code execution": "",
-	"Code Execution": "",
-	"Code Execution Engine": "",
-	"Code formatted successfully": "",
-	"Code Interpreter": "",
-	"Code Interpreter Engine": "",
-	"Code Interpreter Prompt Template": "",
-	"Collection": "Kolekcja",
-	"Color": "",
+	"Code execution": "Wykonanie kodu",
+	"Code Execution": "Wykonanie kodu",
+	"Code Execution Engine": "Silnik wykonawczy kodu",
+	"Code Execution Timeout": "",
+	"Code formatted successfully": "Kod został sformatowany pomyślnie.",
+	"Code Interpreter": "Interpreter kodu",
+	"Code Interpreter Engine": "Silnik Interpretatora Kodu",
+	"Code Interpreter Prompt Template": "Szablon promtu interpretera kodu",
+	"Collection": "Zbiór",
+	"Color": "Kolor",
 	"ComfyUI": "ComfyUI",
-	"ComfyUI API Key": "",
-	"ComfyUI Base URL": "Bazowy URL ComfyUI",
-	"ComfyUI Base URL is required.": "Bazowy URL ComfyUI jest wymagany.",
-	"ComfyUI Workflow": "",
-	"ComfyUI Workflow Nodes": "",
+	"ComfyUI API Key": "Klucz API ComfyUI",
+	"ComfyUI Base URL": "Adres URL bazowy ComfyUI",
+	"ComfyUI Base URL is required.": "Adres URL bazowy ComfyUI jest wymagany.",
+	"ComfyUI Workflow": "Komfortowy przepływ pracy ComfyUI",
+	"ComfyUI Workflow Nodes": "Komfortowe węzły przepływu pracy ComfyUI",
 	"Command": "Polecenie",
-	"Completions": "",
-	"Concurrent Requests": "Równoczesne żądania",
-	"Configure": "",
-	"Confirm": "",
+	"Completions": "Uzupełnienia",
+	"Concurrent Requests": "Równoległe żądania",
+	"Configure": "Skonfigurować",
+	"Confirm": "Potwierdź",
 	"Confirm Password": "Potwierdź hasło",
-	"Confirm your action": "",
-	"Confirm your new password": "",
-	"Connect to your own OpenAI compatible API endpoints.": "",
+	"Confirm your action": "Potwierdź swoją akcję",
+	"Confirm your new password": "Potwierdź nowe hasło",
+	"Connect to your own OpenAI compatible API endpoints.": "Połącz się ze swoimi własnymi punktami końcowymi API kompatybilnego z OpenAI.",
 	"Connections": "Połączenia",
-	"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "",
-	"Contact Admin for WebUI Access": "",
-	"Content": "Zawartość",
-	"Content Extraction": "",
+	"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "Ogranicza wysiłek rozumowania dla modeli rozumowania. Stosuje się tylko do modeli rozumowania od określonych dostawców, którzy obsługują wysiłek rozumowania. (Domyślnie: średni)",
+	"Contact Admin for WebUI Access": "Skontaktuj się z administratorem, aby uzyskać dostęp do WebUI.",
+	"Content": "Treść",
+	"Content Extraction": "Ekstrakcja treści",
 	"Context Length": "Długość kontekstu",
 	"Continue Response": "Kontynuuj odpowiedź",
-	"Continue with {{provider}}": "",
-	"Continue with Email": "",
-	"Continue with 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.": "",
-	"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. (Default: 1.1)": "",
-	"Controls": "",
-	"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "",
-	"Copied": "",
-	"Copied shared chat URL to clipboard!": "Skopiowano URL czatu do schowka!",
-	"Copied to clipboard": "",
-	"Copy": "Kopiuj",
-	"Copy last code block": "Skopiuj ostatni blok kodu",
-	"Copy last response": "Skopiuj ostatnią odpowiedź",
-	"Copy Link": "Kopiuj link",
-	"Copy to clipboard": "",
-	"Copying to clipboard was successful!": "Kopiowanie do schowka zakończone powodzeniem!",
-	"CORS must be properly configured by the provider to allow requests from Open WebUI.": "",
-	"Create": "",
-	"Create a knowledge base": "",
-	"Create a model": "Tworzenie modelu",
+	"Continue with {{provider}}": "Kontynuuj z {{provider}}",
+	"Continue with Email": "Kontynuuj z e-mailem",
+	"Continue with LDAP": "Kontynuuj z 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.": "Kontroluj sposób dzielenia tekstu wiadomości dla żądań TTS. 'Punctuation' dzieli na zdania, 'paragraphs' dzieli na akapity, a 'none' pozostawia wiadomość jako pojedynczy ciąg znaków.",
+	"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. (Default: 1.1)": "Kontroluj powtarzanie się sekwencji tokenów w wygenerowanym tekście. Wyższa wartość (np. 1,5) będzie silniej penalizować powtórzenia, podczas gdy niższa wartość (np. 1,1) będzie bardziej pobłażliwa. Na poziomie 1 jest wyłączona. (Domyślnie: 1,1)",
+	"Controls": "Sterowanie",
+	"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "Kontroluje równowagę między spójnością a zróżnicowaniem wyników. Niższa wartość zaowocuje bardziej skoncentrowanym i spójnym tekstem. (Domyślnie: 5,0)",
+	"Copied": "Skopiowane",
+	"Copied shared chat URL to clipboard!": "Skopiowano udostępniony URL czatu do schowka!",
+	"Copied to clipboard": "Skopiowane do schowka",
+	"Copy": "Skopiuj",
+	"Copy last code block": "Skopiuj ostatni fragment kodu",
+	"Copy last response": "Skopiuj ostatnią wypowiedź",
+	"Copy Link": "Skopiuj link",
+	"Copy to clipboard": "Wklej do schowka",
+	"Copying to clipboard was successful!": "Kopiowanie do schowka zakończyło się sukcesem!",
+	"CORS must be properly configured by the provider to allow requests from Open WebUI.": "CORS musi być prawidłowo skonfigurowany przez dostawcę, aby umożliwić żądania z Open WebUI.",
+	"Create": "Utwórz",
+	"Create a knowledge base": "Utwórz bazę wiedzy",
+	"Create a model": "Utwórz model",
 	"Create Account": "Utwórz konto",
-	"Create Admin Account": "",
-	"Create Channel": "",
-	"Create Group": "",
-	"Create Knowledge": "",
+	"Create Admin Account": "Utwórz konto administratora",
+	"Create Channel": "Utwórz kanał",
+	"Create Group": "Utwórz grupę",
+	"Create Knowledge": "Utwórz wiedzę",
 	"Create new key": "Utwórz nowy klucz",
-	"Create new secret key": "Utwórz nowy klucz bezpieczeństwa",
-	"Created at": "Utworzono o",
+	"Create new secret key": "Utwórz nowy klucz tajny",
+	"Created at": "Stworzone o",
 	"Created At": "Utworzono o",
-	"Created by": "",
-	"CSV Import": "",
-	"Current Model": "Bieżący model",
-	"Current Password": "Bieżące hasło",
+	"Created by": "Stworzone przez",
+	"CSV Import": "Import CSV",
+	"Current Model": "Aktualny model",
+	"Current Password": "Aktualne hasło",
 	"Custom": "Niestandardowy",
 	"Dark": "Ciemny",
 	"Database": "Baza danych",
 	"December": "Grudzień",
 	"Default": "Domyślny",
-	"Default (Open AI)": "",
+	"Default (Open AI)": "Domyślny (Open AI)",
 	"Default (SentenceTransformers)": "Domyślny (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.": "",
-	"Default Model": "Model domyślny",
-	"Default model updated": "Domyślny model zaktualizowany",
-	"Default Models": "",
-	"Default permissions": "",
-	"Default permissions updated successfully": "",
-	"Default Prompt Suggestions": "Domyślne sugestie promptów",
-	"Default to 389 or 636 if TLS is enabled": "",
-	"Default to ALL": "",
+	"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.": "Tryb domyślny współpracuje z szerszym zakresem modeli, wywołując narzędzia raz przed wykonaniem. Tryb natywny wykorzystuje wbudowane możliwości wywoływania narzędzi przez model, ale wymaga, aby model wewnętrznie obsługiwał tę funkcję.",
+	"Default Model": "Model standardowy",
+	"Default model updated": "Domyślny model został zaktualizowany",
+	"Default Models": "Domyślne modele",
+	"Default permissions": "Domyślne uprawnienia",
+	"Default permissions updated successfully": "Domyślne uprawnienia zaktualizowane pomyślnie",
+	"Default Prompt Suggestions": "Domyślne propozycje wpisów",
+	"Default to 389 or 636 if TLS is enabled": "Domyślnie użyj 389 lub 636, jeśli TLS jest włączony",
+	"Default to ALL": "Domyślnie wybierz wszystkie",
 	"Default User Role": "Domyślna rola użytkownika",
 	"Delete": "Usuń",
 	"Delete a model": "Usuń model",
-	"Delete All Chats": "Usuń wszystkie czaty",
-	"Delete All Models": "",
-	"Delete chat": "Usuń czat",
-	"Delete Chat": "Usuń czat",
-	"Delete chat?": "",
-	"Delete folder?": "",
-	"Delete function?": "",
-	"Delete Message": "",
-	"Delete message?": "",
-	"Delete prompt?": "",
-	"delete this link": "usuń ten link",
-	"Delete tool?": "",
+	"Delete All Chats": "Usuń wszystkie rozmowy",
+	"Delete All Models": "Usuń Wszystkie Modele",
+	"Delete chat": "Usuń rozmowę",
+	"Delete Chat": "Usuń rozmowę",
+	"Delete chat?": "Usuń czat?",
+	"Delete folder?": "Usuń folder?",
+	"Delete function?": "Czy na pewno chcesz usunąć funkcję?",
+	"Delete Message": "Usuń wiadomość",
+	"Delete message?": "Usuń wiadomość?",
+	"Delete prompt?": "Czy chcesz usunąć podpowiedź?",
+	"delete this link": "usuń to połączenie",
+	"Delete tool?": "Usuń narzędzie?",
 	"Delete User": "Usuń użytkownika",
-	"Deleted {{deleteModelTag}}": "Usunięto {{deleteModelTag}}",
-	"Deleted {{name}}": "Usunięto {{name}}",
-	"Deleted User": "",
-	"Describe your knowledge base and objectives": "",
+	"Deleted {{deleteModelTag}}": "Usuwono {{deleteModelTag}}",
+	"Deleted {{name}}": "Usunięto użytkownika {{name}}",
+	"Deleted User": "Usunięty użytkownik",
+	"Describe your knowledge base and objectives": "Opisz swoją bazę wiedzy i cele",
 	"Description": "Opis",
-	"Didn't fully follow instructions": "Nie postępował zgodnie z instrukcjami",
-	"Direct Connections": "",
-	"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "",
-	"Direct Connections settings updated": "",
-	"Disabled": "",
-	"Discover a function": "",
+	"Didn't fully follow instructions": "Nie wykonał w pełni instrukcji",
+	"Direct Connections": "Połączenia Bezpośrednie",
+	"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Połączenia bezpośrednie umożliwiają użytkownikom łączenie się z własnymi końcówkami API kompatybilnymi z OpenAI.",
+	"Direct Connections settings updated": "Ustawienia Połączeń Bezpośrednich zaktualizowane",
+	"Disabled": "Wyłączony",
+	"Discover a function": "Odkryj funkcję",
 	"Discover a model": "Odkryj model",
-	"Discover a prompt": "Odkryj prompt",
-	"Discover a tool": "",
-	"Discover how to use Open WebUI and seek support from the community.": "",
-	"Discover wonders": "",
-	"Discover, download, and explore custom functions": "",
+	"Discover a prompt": "Odkryj prompty",
+	"Discover a tool": "Odkryj narzędzie",
+	"Discover how to use Open WebUI and seek support from the community.": "Odkryj, jak korzystać z Open WebUI i szukaj wsparcia w społeczności.",
+	"Discover wonders": "Odkryj cuda",
+	"Discover, download, and explore custom functions": "Odkryj, pobierz i eksploruj niestandardowe funkcje",
 	"Discover, download, and explore custom prompts": "Odkryj, pobierz i eksploruj niestandardowe prompty",
-	"Discover, download, and explore custom tools": "",
-	"Discover, download, and explore model presets": "Odkryj, pobierz i eksploruj ustawienia modeli",
-	"Dismissible": "",
-	"Display": "",
-	"Display Emoji in Call": "",
-	"Display the username instead of You in the Chat": "Wyświetl nazwę użytkownika zamiast Ty w czacie",
-	"Displays citations in the response": "",
-	"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.": "",
+	"Discover, download, and explore custom tools": "Odkryj, pobierz i eksploruj niestandardowe narzędzia",
+	"Discover, download, and explore model presets": "Odkryj, pobierz i badaj ustawienia modeli",
+	"Dismissible": "Możliwe do odrzucenia",
+	"Display": "Wyświetlacz",
+	"Display Emoji in Call": "Wyświetl emoji w połączeniu",
+	"Display the username instead of You in the Chat": "Wyświetl nazwę użytkownika zamiast 'You' w czacie.",
+	"Displays citations in the response": "Wyświetla cytowania w odpowiedzi",
+	"Dive into knowledge": "Zanurz się w wiedzy",
+	"Do not install functions from sources you do not fully trust.": "Nie instaluj funkcji ze źródeł, którym nie ufasz w pełni.",
+	"Do not install tools from sources you do not fully trust.": "Nie instaluj narzędzi ze źródeł, którym nie ufasz w pełni.",
 	"Document": "Dokument",
-	"Documentation": "",
+	"Documentation": "Dokumentacja",
 	"Documents": "Dokumenty",
 	"does not make any external connections, and your data stays securely on your locally hosted server.": "nie nawiązuje żadnych zewnętrznych połączeń, a Twoje dane pozostają bezpiecznie na Twoim lokalnie hostowanym serwerze.",
-	"Domain Filter List": "",
-	"Don't have an account?": "Nie masz konta?",
-	"don't install random functions from sources you don't trust.": "",
-	"don't install random tools from sources you don't trust.": "",
-	"Don't like the style": "Nie podobał mi się styl",
-	"Done": "",
+	"Domain Filter List": "Lista filtrów domeny",
+	"Don't have an account?": "Czy nie masz konta?",
+	"don't install random functions from sources you don't trust.": "Nie instaluj losowych funkcji z niezaufanych źródeł.",
+	"don't install random tools from sources you don't trust.": "Nie instaluj przypadkowych narzędzi z niezaufanych źródeł.",
+	"Don't like the style": "Nie przypadł mi do gustu styl",
+	"Done": "Wykonano",
 	"Download": "Pobieranie",
-	"Download as SVG": "",
-	"Download canceled": "Pobieranie przerwane",
+	"Download as SVG": "Pobierz jako SVG",
+	"Download canceled": "Pobieranie anulowane",
 	"Download Database": "Pobierz bazę danych",
-	"Drag and drop a file to upload or select a file to view": "",
-	"Draw": "",
-	"Drop any files here to add to the conversation": "Upuść pliki tutaj, aby dodać do rozmowy",
-	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "np. '30s', '10m'. Poprawne jednostki czasu to 's', 'm', 'h'.",
-	"e.g. A filter to remove profanity from text": "",
-	"e.g. My Filter": "",
-	"e.g. My Tools": "",
-	"e.g. my_filter": "",
-	"e.g. my_tools": "",
-	"e.g. Tools for performing various operations": "",
+	"Drag and drop a file to upload or select a file to view": "Przeciągnij i upuść plik, aby go przesłać lub wybierz plik, aby go wyświetlić.",
+	"Draw": "Rysuj",
+	"Drop any files here to add to the conversation": "Przeciągnij i upuść pliki tutaj, aby dodać je do rozmowy.",
+	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "np. '30s', '10m'. Poprawne jednostki czasu to: 's' (sekunda), 'm' (minuta), 'h' (godzina).",
+	"e.g. 60": "",
+	"e.g. A filter to remove profanity from text": "np. Filtr do usuwania wulgaryzmów z tekstu",
+	"e.g. My Filter": "np. Mój Filtr",
+	"e.g. My Tools": "np. Moje Narzędzia",
+	"e.g. my_filter": "np. moj_filtr",
+	"e.g. my_tools": "np. moje_narzędzia",
+	"e.g. Tools for performing various operations": "np. Narzędzia do wykonywania różnych operacji",
 	"Edit": "Edytuj",
-	"Edit Arena Model": "",
-	"Edit Channel": "",
-	"Edit Connection": "",
-	"Edit Default Permissions": "",
-	"Edit Memory": "",
-	"Edit User": "Edytuj użytkownika",
-	"Edit User Group": "",
-	"ElevenLabs": "",
+	"Edit Arena Model": "Edytuj model arenę",
+	"Edit Channel": "Edytuj kanał",
+	"Edit Connection": "Edytuj połączenie",
+	"Edit Default Permissions": "Edytuj domyślne uprawnienia",
+	"Edit Memory": "Edytuj pamięć",
+	"Edit User": "Edytuj profil użytkownika",
+	"Edit User Group": "Edytuj Grupa Użytkowników",
+	"ElevenLabs": "ElevenLabs",
 	"Email": "Email",
-	"Embark on adventures": "",
-	"Embedding Batch Size": "",
+	"Embark on adventures": "Wyruszaj na przygody",
+	"Embedding Batch Size": "Rozmiar partii wstępnego przetwarzania",
 	"Embedding Model": "Model osadzania",
 	"Embedding Model Engine": "Silnik modelu osadzania",
-	"Embedding model set to \"{{embedding_model}}\"": "Model osadzania ustawiono na \"{{embedding_model}}\"",
-	"Enable API Key": "",
-	"Enable autocomplete generation for chat messages": "",
-	"Enable Code Interpreter": "",
+	"Embedding model set to \"{{embedding_model}}\"": "Model osadzania ustawiony na '{{embedding_model}}'",
+	"Enable API Key": "Włącz klucz API",
+	"Enable autocomplete generation for chat messages": "Włącz generowanie autouzupełniania dla wiadomości czatu",
+	"Enable Code Interpreter": "Włącz Interpreter Kodu",
 	"Enable Community Sharing": "Włączanie udostępniania społecznościowego",
-	"Enable Google Drive": "",
-	"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.": "",
-	"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.": "",
-	"Enable Message Rating": "",
-	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
+	"Enable Google Drive": "Włącz Google Drive",
+	"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.": "Włącz blokowanie pamięci (mlock), aby zapobiec swappingowi danych modelu z RAM. Ta opcja blokuje zbiór stron roboczych modelu w RAM, co gwarantuje, że nie będą one wymieniane na dysk. Może to pomóc w utrzymaniu wydajności poprzez unikanie błędów strony i zapewnienie szybkiego dostępu do danych.",
+	"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.": "Włącz mapowanie pamięci (mmap), aby załadować dane modelu. Ta opcja pozwala systemowi traktować pliki dysku jako rozszerzenie RAM, co może poprawić wydajność modelu przez umożliwienie szybszego dostępu do danych. Należy jednak pamiętać, że ta funkcja może nie działać poprawnie ze wszystkimi systemami i zużywać znaczną ilość przestrzeni dyskowej.",
+	"Enable Message Rating": "Włącz ocenianie wiadomości",
+	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "Włącz próbkowanie Mirostat w celu kontrolowania perplexity. (Domyślnie: 0, 0 = Wyłączone, 1 = Mirostat, 2 = Mirostat 2.0)",
 	"Enable New Sign Ups": "Włącz nowe rejestracje",
-	"Enable Web Search": "Włączanie wyszukiwania w Internecie",
-	"Enabled": "",
-	"Engine": "",
-	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Upewnij się, że twój plik CSV zawiera 4 kolumny w następującym porządku: Nazwa, Email, Hasło, Rola.",
-	"Enter {{role}} message here": "Wprowadź wiadomość {{role}} tutaj",
-	"Enter a detail about yourself for your LLMs to recall": "Wprowadź szczegóły o sobie, aby LLMs mogli pamiętać",
-	"Enter api auth string (e.g. username:password)": "",
-	"Enter Application DN": "",
-	"Enter Application DN Password": "",
-	"Enter Bing Search V7 Endpoint": "",
-	"Enter Bing Search V7 Subscription Key": "",
-	"Enter Bocha Search API Key": "",
+	"Enable Web Search": "Włączanie wyszukiwania internetowego",
+	"Enabled": "Włączone",
+	"Engine": "Silnik",
+	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Upewnij się, że twój plik CSV zawiera dokładnie 4 kolumny w następującej kolejności: Nazwa, Email, Hasło, Rola.",
+	"Enter {{role}} message here": "Wprowadź komunikat dla {{role}} tutaj",
+	"Enter a detail about yourself for your LLMs to recall": "Podaj informacje o sobie, aby LLMs mogły je przypomnieć.",
+	"Enter api auth string (e.g. username:password)": "Wprowadź ciąg uwierzytelniania API (np. nazwa użytkownika:hasło)",
+	"Enter Application DN": "Wprowadź Aplikację DN",
+	"Enter Application DN Password": "Wprowadź hasło aplikacji DN",
+	"Enter Bing Search V7 Endpoint": "Wprowadź endpoint wyszukiwania Bing V7",
+	"Enter Bing Search V7 Subscription Key": "Wprowadź klucz subskrypcji Bing Search V7",
+	"Enter Bocha Search API Key": "Wprowadź klucz API Bocha Search",
 	"Enter Brave Search API Key": "Wprowadź klucz API Brave Search",
-	"Enter certificate path": "",
-	"Enter CFG Scale (e.g. 7.0)": "",
-	"Enter Chunk Overlap": "Wprowadź zakchodzenie bloku",
-	"Enter Chunk Size": "Wprowadź rozmiar bloku",
-	"Enter description": "",
-	"Enter domains separated by commas (e.g., example.com,site.org)": "",
-	"Enter Exa API Key": "",
-	"Enter Github Raw URL": "Wprowadź nieprzetworzony adres URL usługi Github",
+	"Enter certificate path": "Wprowadź ścieżkę do certyfikatu",
+	"Enter CFG Scale (e.g. 7.0)": "Wprowadź skalę CFG (np. 7.0)",
+	"Enter Chunk Overlap": "Wprowadź nakładanie się bloków",
+	"Enter Chunk Size": "Wprowadź wielkość bloku",
+	"Enter description": "Wprowadź opis",
+	"Enter domains separated by commas (e.g., example.com,site.org)": "Wprowadź domeny oddzielone przecinkami (np. example.com, site.org)",
+	"Enter Exa API Key": "Wprowadź klucz API Exa",
+	"Enter Github Raw URL": "Wprowadź surowy adres URL usługi GitHub",
 	"Enter Google PSE API Key": "Wprowadź klucz API Google PSE",
-	"Enter Google PSE Engine Id": "Wprowadź identyfikator aparatu Google PSE",
-	"Enter Image Size (e.g. 512x512)": "Wprowadź rozmiar obrazu (np. 512x512)",
-	"Enter Jina API Key": "",
-	"Enter Jupyter Password": "",
-	"Enter Jupyter Token": "",
-	"Enter Jupyter URL": "",
-	"Enter Kagi Search API Key": "",
+	"Enter Google PSE Engine Id": "Wprowadź identyfikator urządzenia Google PSE",
+	"Enter Image Size (e.g. 512x512)": "Podaj rozmiar obrazu (np. 512x512)",
+	"Enter Jina API Key": "Wprowadź klucz API Jiny",
+	"Enter Jupyter Password": "Wprowadź hasło Jupyter",
+	"Enter Jupyter Token": "Wprowadź token Jupyter",
+	"Enter Jupyter URL": "Podaj adres URL Jupytera",
+	"Enter Kagi Search API Key": "Wprowadź klucz wyszukiwania Kagi",
 	"Enter language codes": "Wprowadź kody języków",
-	"Enter Model ID": "",
-	"Enter model tag (e.g. {{modelTag}})": "Wprowadź tag modelu (np. {{modelTag}})",
-	"Enter Mojeek Search API Key": "",
-	"Enter Number of Steps (e.g. 50)": "Wprowadź liczbę kroków (np. 50)",
-	"Enter proxy URL (e.g. https://user:password@host:port)": "",
-	"Enter reasoning effort": "",
-	"Enter Sampler (e.g. Euler a)": "",
-	"Enter Scheduler (e.g. Karras)": "",
+	"Enter Model ID": "Wprowadź ID modelu",
+	"Enter model tag (e.g. {{modelTag}})": "Wprowadź znacznik modelu (np. {{modelTag}})",
+	"Enter Mojeek Search API Key": "Wprowadź klucz API Mojeek Search",
+	"Enter Number of Steps (e.g. 50)": "Podaj liczbę kroków (np. 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "Podaj adres URL proxy (np. https://user:password@host:port)",
+	"Enter reasoning effort": "Podaj powód wysiłku",
+	"Enter Sampler (e.g. Euler a)": "Wprowadź Sampler (np. Euler a)",
+	"Enter Scheduler (e.g. Karras)": "Wprowadź Harmonogram (np. Karras)",
 	"Enter Score": "Wprowadź wynik",
-	"Enter SearchApi API Key": "",
-	"Enter SearchApi Engine": "",
-	"Enter Searxng Query URL": "Wprowadź adres URL zapytania Searxng",
-	"Enter Seed": "",
-	"Enter SerpApi API Key": "",
-	"Enter SerpApi Engine": "",
+	"Enter SearchApi API Key": "Wprowadź klucz API SearchApi",
+	"Enter SearchApi Engine": "Wprowadź zapytanie do silnika wyszukiwania SearchApi",
+	"Enter Searxng Query URL": "Wprowadź adres URL zapytania wyszukiwania Searxng",
+	"Enter Seed": "Wprowadź Nasiono",
+	"Enter SerpApi API Key": "Wprowadź klucz API SerpApi",
+	"Enter SerpApi Engine": "Wprowadź silnik SerpApi",
 	"Enter Serper API Key": "Wprowadź klucz API Serper",
-	"Enter Serply API Key": "",
+	"Enter Serply API Key": "Wprowadź klucz API Serply",
 	"Enter Serpstack API Key": "Wprowadź klucz API Serpstack",
-	"Enter server host": "",
-	"Enter server label": "",
-	"Enter server port": "",
-	"Enter stop sequence": "Wprowadź sekwencję zatrzymania",
-	"Enter system prompt": "",
-	"Enter Tavily API Key": "",
-	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
-	"Enter Tika Server URL": "",
-	"Enter Top K": "Wprowadź Top K",
-	"Enter URL (e.g. http://127.0.0.1:7860/)": "Wprowadź adres URL (np. http://127.0.0.1:7860/)",
-	"Enter URL (e.g. http://localhost:11434)": "Wprowadź adres URL (np. http://localhost:11434/)",
-	"Enter your current password": "",
-	"Enter Your Email": "Wprowadź swój adres email",
-	"Enter Your Full Name": "Wprowadź swoje imię i nazwisko",
-	"Enter your message": "",
-	"Enter your new password": "",
+	"Enter server host": "Wprowadź nazwę hosta serwera",
+	"Enter server label": "Wprowadź etykietę serwera",
+	"Enter server port": "Wprowadź numer portu serwera",
+	"Enter stop sequence": "Wprowadź sekwencję stop",
+	"Enter system prompt": "Wprowadź polecenie systemowe",
+	"Enter Tavily API Key": "Wprowadź klucz API Tavily",
+	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Wprowadź publiczny adres URL Twojego WebUI. Ten adres URL zostanie użyty do generowania linków w powiadomieniach.",
+	"Enter Tika Server URL": "Wprowadź adres URL serwera Tika",
+	"Enter timeout in seconds": "",
+	"Enter Top K": "Wprowadź {Top K}",
+	"Enter URL (e.g. http://127.0.0.1:7860/)": "Podaj adres URL (np. http://127.0.0.1:7860/)",
+	"Enter URL (e.g. http://localhost:11434)": "Wprowadź adres URL (np. http://localhost:11434)",
+	"Enter your current password": "Wprowadź swoje aktualne hasło",
+	"Enter Your Email": "Podaj swój adres e-mail",
+	"Enter Your Full Name": "Podaj swoje pełne imię i nazwisko",
+	"Enter your message": "Wprowadź swój komunikat",
+	"Enter your new password": "Wprowadź nowe hasło",
 	"Enter Your Password": "Wprowadź swoje hasło",
-	"Enter Your Role": "Wprowadź swoją rolę",
-	"Enter Your Username": "",
-	"Enter your webhook URL": "",
+	"Enter Your Role": "Podaj swoją rolę",
+	"Enter Your Username": "Podaj swoją nazwę użytkownika",
+	"Enter your webhook URL": "Podaj adres URL swojego webhooka",
 	"Error": "Błąd",
-	"ERROR": "",
-	"Error accessing Google Drive: {{error}}": "",
-	"Error uploading file: {{error}}": "",
-	"Evaluations": "",
-	"Exa API Key": "",
-	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
-	"Example: ALL": "",
-	"Example: mail": "",
-	"Example: ou=users,dc=foo,dc=example": "",
-	"Example: sAMAccountName or uid or userPrincipalName": "",
-	"Exclude": "",
-	"Execute code for analysis": "",
+	"ERROR": "BŁĄD",
+	"Error accessing Google Drive: {{error}}": "Błąd podczas dostępu do Google Drive: {{error}}",
+	"Error uploading file: {{error}}": "Błąd podczas przesyłania pliku: {{error}}",
+	"Evaluations": "Oceny",
+	"Exa API Key": "Klucz API Exa",
+	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Przykład: (&(objectClass=inetOrgPerson)(uid=%s))",
+	"Example: ALL": "Przykład: ALL",
+	"Example: mail": "Przykład: poczta e-mail",
+	"Example: ou=users,dc=foo,dc=example": "Przykład: ou=users,dc=foo,dc=example",
+	"Example: sAMAccountName or uid or userPrincipalName": "Przykład: sAMAccountName lub uid lub userPrincipalName",
+	"Exclude": "Wykluczyć",
+	"Execute code for analysis": "Wykonaj kod do analizy",
 	"Experimental": "Eksperymentalne",
-	"Explore the cosmos": "",
+	"Explore the cosmos": "Odkrywaj kosmos",
 	"Export": "Eksport",
-	"Export All Archived Chats": "",
-	"Export All Chats (All Users)": "Eksportuj wszystkie czaty (wszyscy użytkownicy)",
-	"Export chat (.json)": "",
-	"Export Chats": "Eksportuj czaty",
-	"Export Config to JSON File": "",
-	"Export Functions": "",
+	"Export All Archived Chats": "Wyeksportuj wszystkie archiwalne rozmowy",
+	"Export All Chats (All Users)": "Eksportuj wszystkie rozmowy (wszyscy użytkownicy)",
+	"Export chat (.json)": "Eksport czatu (.json)",
+	"Export Chats": "Eksportuj rozmowy",
+	"Export Config to JSON File": "Eksportuj konfigurację do pliku JSON",
+	"Export Functions": "Funkcje eksportu",
 	"Export Models": "Eksportuj modele",
-	"Export Presets": "",
+	"Export Presets": "Wyeksportuj ustawienia domyślne",
 	"Export Prompts": "Eksportuj prompty",
-	"Export to CSV": "",
-	"Export Tools": "",
-	"External Models": "",
-	"Failed to add file.": "",
-	"Failed to create API Key.": "Nie udało się utworzyć klucza API.",
-	"Failed to fetch models": "",
+	"Export to CSV": "Eksport do CSV",
+	"Export Tools": "Narzędzia Eksportu",
+	"External Models": "Modele zewnętrzne",
+	"Failed to add file.": "Nie udało się dodać pliku.",
+	"Failed to create API Key.": "Nie udało się wygenerować klucza API.",
+	"Failed to fetch models": "Nie udało się pobrać modeli",
 	"Failed to read clipboard contents": "Nie udało się odczytać zawartości schowka",
-	"Failed to save models configuration": "",
-	"Failed to update settings": "",
-	"Failed to upload file.": "",
-	"Features": "",
-	"Features Permissions": "",
+	"Failed to save models configuration": "Nie udało się zapisać konfiguracji modelu",
+	"Failed to update settings": "Nie udało się zaktualizować ustawień",
+	"Failed to upload file.": "Nie udało się przesłać pliku.",
+	"Features": "Funkcje",
+	"Features Permissions": "Uprawnienia do funkcji",
 	"February": "Luty",
-	"Feedback History": "",
-	"Feedbacks": "",
-	"Feel free to add specific details": "Podaj inne szczegóły",
-	"File": "",
-	"File added successfully.": "",
-	"File content updated successfully.": "",
+	"Feedback History": "Historia powiadomień",
+	"Feedbacks": "Oceny",
+	"Feel free to add specific details": "Nie krępuj się dodawać szczegółów",
+	"File": "Plik",
+	"File added successfully.": "Plik dodany pomyślnie.",
+	"File content updated successfully.": "Plik został zaktualizowany pomyślnie.",
 	"File Mode": "Tryb pliku",
 	"File not found.": "Plik nie został znaleziony.",
-	"File removed successfully.": "",
-	"File size should not exceed {{maxSize}} MB.": "",
-	"File uploaded successfully": "",
-	"Files": "",
-	"Filter is now globally disabled": "",
-	"Filter is now globally enabled": "",
-	"Filters": "",
-	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Wykryto podszywanie się pod odcisk palca: Nie można używać inicjałów jako awatara. Przechodzenie do domyślnego obrazu profilowego.",
-	"Fluidly stream large external response chunks": "Płynnie przesyłaj strumieniowo duże fragmenty odpowiedzi zewnętrznych",
-	"Focus chat input": "Skoncentruj na czacie",
-	"Folder deleted successfully": "",
-	"Folder name cannot be empty": "",
-	"Folder name cannot be empty.": "",
-	"Folder name updated successfully": "",
-	"Followed instructions perfectly": "Postępował z idealnie według instrukcji",
-	"Forge new paths": "",
-	"Form": "",
-	"Format your variables using brackets like this:": "",
+	"File removed successfully.": "Plik został usunięty pomyślnie.",
+	"File size should not exceed {{maxSize}} MB.": "Rozmiar pliku nie powinien przekraczać {{maxSize}} MB.",
+	"File uploaded successfully": "Plik został pomyślnie przesłany",
+	"Files": "Pliki",
+	"Filter is now globally disabled": "Filtr jest teraz globalnie wyłączony",
+	"Filter is now globally enabled": "Filtr jest teraz globalnie włączony",
+	"Filters": "Filtry",
+	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Wykryto próbę oszustwa z odciskiem palca: Nie można używać inicjałów jako awatara. Powrót do domyślnego obrazu profilowego.",
+	"Fluidly stream large external response chunks": "Płynnie strumieniuj duże fragmenty odpowiedzi zewnętrznych",
+	"Focus chat input": "Skup się na czacie",
+	"Folder deleted successfully": "Folder został usunięty pomyślnie",
+	"Folder name cannot be empty": "Nazwa folderu nie może być pusta",
+	"Folder name cannot be empty.": "Nazwa folderu nie może być pusta.",
+	"Folder name updated successfully": "Nazwa folderu została zaktualizowana pomyślnie",
+	"Followed instructions perfectly": "Wykonał instrukcje idealnie",
+	"Forge new paths": "Wytyczaj nowe ścieżki",
+	"Form": "Formularz",
+	"Format your variables using brackets like this:": "Sformatuj swoje zmienne, używając nawiasów w następujący sposób:",
 	"Frequency Penalty": "Kara za częstotliwość",
-	"Full Context Mode": "",
-	"Function": "",
-	"Function Calling": "",
-	"Function created successfully": "",
-	"Function deleted successfully": "",
-	"Function Description": "",
-	"Function ID": "",
-	"Function is now globally disabled": "",
-	"Function is now globally enabled": "",
-	"Function Name": "",
-	"Function updated successfully": "",
-	"Functions": "",
-	"Functions allow arbitrary code execution": "",
-	"Functions allow arbitrary code execution.": "",
-	"Functions imported successfully": "",
+	"Full Context Mode": "Tryb pełnego kontekstu",
+	"Function": "Funkcja",
+	"Function Calling": "Wywoływanie funkcji",
+	"Function created successfully": "Funkcja utworzona pomyślnie",
+	"Function deleted successfully": "Funkcja została usunięta pomyślnie",
+	"Function Description": "Opis funkcji",
+	"Function ID": "Funkcja ID",
+	"Function is now globally disabled": "Funkcja jest teraz globalnie wyłączona",
+	"Function is now globally enabled": "Funkcja jest teraz globalnie włączona",
+	"Function Name": "Nazwa Funkcji",
+	"Function updated successfully": "Funkcja została zaktualizowana pomyślnie",
+	"Functions": "Funkcje",
+	"Functions allow arbitrary code execution": "Funkcje umożliwiają wykonanie dowolnego kodu",
+	"Functions allow arbitrary code execution.": "Funkcje umożliwiają wykonanie dowolnego kodu.",
+	"Functions imported successfully": "Funkcje zostały pomyślnie zaimportowane",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Ogólne",
-	"General Settings": "Ogólne ustawienia",
-	"Generate an image": "",
-	"Generate Image": "",
-	"Generating search query": "Generowanie zapytania",
-	"Get started": "",
-	"Get started with {{WEBUI_NAME}}": "",
-	"Global": "",
+	"General Settings": "Ustawienia ogólne",
+	"Generate an image": "Wygeneruj obraz",
+	"Generate Image": "Wygeneruj obraz",
+	"Generating search query": "Tworzenie zapytania wyszukiwania",
+	"Get started": "Rozpocznij",
+	"Get started with {{WEBUI_NAME}}": "Rozpocznij pracę z {{WEBUI_NAME}}",
+	"Global": "Globalny",
 	"Good Response": "Dobra odpowiedź",
-	"Google Drive": "",
+	"Google Drive": "Dysk Google",
 	"Google PSE API Key": "Klucz API Google PSE",
 	"Google PSE Engine Id": "Identyfikator silnika Google PSE",
-	"Group created successfully": "",
-	"Group deleted successfully": "",
-	"Group Description": "",
-	"Group Name": "",
-	"Group updated successfully": "",
-	"Groups": "",
-	"Haptic Feedback": "",
-	"has no conversations.": "nie ma rozmów.",
+	"Group created successfully": "Grupa utworzona pomyślnie",
+	"Group deleted successfully": "Grupa została usunięta pomyślnie",
+	"Group Description": "Opis grupy",
+	"Group Name": "Nazwa Grupy",
+	"Group updated successfully": "Grupa zaktualizowana pomyślnie",
+	"Groups": "Grupy",
+	"Haptic Feedback": "Sprzężenie zwrotne dotykowe",
+	"has no conversations.": "nie zawiera rozmów.",
 	"Hello, {{name}}": "Witaj, {{name}}",
 	"Help": "Pomoc",
-	"Help us create the best community leaderboard by sharing your feedback history!": "",
-	"Hex Color": "",
-	"Hex Color - Leave empty for default color": "",
+	"Help us create the best community leaderboard by sharing your feedback history!": "Pomóż nam stworzyć najlepszą tablicę liderów społeczności, dzieląc się swoją historią opinii!",
+	"Hex Color": "Kolor heksadecymalny",
+	"Hex Color - Leave empty for default color": "Kolor heksadecymalny - pozostaw puste dla domyślnego koloru",
 	"Hide": "Ukryj",
-	"Home": "",
-	"Host": "",
-	"How can I help you today?": "Jak mogę Ci dzisiaj pomóc?",
-	"How would you rate this response?": "",
-	"Hybrid Search": "Szukanie hybrydowe",
-	"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.": "",
-	"ID": "",
-	"Ignite curiosity": "",
-	"Image": "",
-	"Image Compression": "",
-	"Image Generation": "",
-	"Image Generation (Experimental)": "Generowanie obrazu (eksperymentalne)",
-	"Image Generation Engine": "Silnik generowania obrazu",
-	"Image Max Compression Size": "",
-	"Image Prompt Generation": "",
-	"Image Prompt Generation Prompt": "",
-	"Image Settings": "Ustawienia obrazu",
+	"Home": "Dom",
+	"Host": "Gospodarz",
+	"How can I help you today?": "Jak mogę Ci służyć dzisiaj?",
+	"How would you rate this response?": "Jak oceniłbyś tę odpowiedź?",
+	"Hybrid Search": "Wyszukiwanie hybrydowe",
+	"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Potwierdzam, że przeczytałem i rozumiem konsekwencje mojego działania. Jestem świadomy ryzyka związanego z wykonywaniem kodu o nieznanym pochodzeniu i zweryfikowałem wiarygodność źródła.",
+	"ID": "ID",
+	"Ignite curiosity": "Rozbudź ciekawość",
+	"Image": "Obraz",
+	"Image Compression": "Kompresja obrazu",
+	"Image Generation": "Generowanie obrazów",
+	"Image Generation (Experimental)": "Generowanie obrazu (doświadczalne)",
+	"Image Generation Engine": "Silnik generowania obrazów",
+	"Image Max Compression Size": "Maksymalny rozmiar kompresji obrazu",
+	"Image Prompt Generation": "Generowanie podpowiedzi obrazu",
+	"Image Prompt Generation Prompt": "Generowanie obrazu Prompt",
+	"Image Settings": "Ustawienia grafiki",
 	"Images": "Obrazy",
 	"Import Chats": "Importuj czaty",
-	"Import Config from JSON File": "",
-	"Import Functions": "",
+	"Import Config from JSON File": "Importuj konfigurację z pliku JSON",
+	"Import Functions": "Importowanie funkcji",
 	"Import Models": "Importowanie modeli",
-	"Import Presets": "",
+	"Import Presets": "Importuj ustawienia",
 	"Import Prompts": "Importuj prompty",
-	"Import Tools": "",
-	"Include": "",
-	"Include `--api-auth` flag when running stable-diffusion-webui": "",
-	"Include `--api` flag when running stable-diffusion-webui": "Dołącz flagę `--api` podczas uruchamiania 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. (Default: 0.1)": "",
-	"Info": "Informacji",
-	"Input commands": "Wprowadź komendy",
-	"Install from Github URL": "Instalowanie z adresu URL usługi Github",
-	"Instant Auto-Send After Voice Transcription": "",
+	"Import Tools": "Import Narzędzi",
+	"Include": "Włączyć",
+	"Include `--api-auth` flag when running stable-diffusion-webui": "Użyj flagi `--api-auth` podczas uruchamiania stable-diffusion-webui",
+	"Include `--api` flag when running stable-diffusion-webui": "Użyj flagi `--api` podczas uruchamiania 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. (Default: 0.1)": "Wpływa na to, jak szybko algorytm reaguje na informacje zwrotne z wygenerowanego tekstu. Niższa stopa uczenia się spowoduje wolniejsze dostosowania, podczas gdy wyższa stopa uczenia się sprawi, że algorytm będzie bardziej reaktywny. (Domyślna: 0.1)",
+	"Info": "Informacje",
+	"Input commands": "Wprowadź polecenia",
+	"Install from Github URL": "Instalacja z adresu URL serwisu Github",
+	"Instant Auto-Send After Voice Transcription": "Automatyczne natychmiastowe wysyłanie po transkrypcji głosowej",
 	"Interface": "Interfejs",
-	"Invalid file format.": "",
+	"Invalid file format.": "Nieprawidłowy format pliku.",
 	"Invalid Tag": "Nieprawidłowy tag",
-	"is typing...": "",
+	"is typing...": "Czy pisanie...",
 	"January": "Styczeń",
-	"Jina API Key": "",
-	"join our Discord for help.": "Dołącz do naszego Discorda po pomoc.",
+	"Jina API Key": "Klucz API Jiny",
+	"join our Discord for help.": "Dołącz do naszego Discorda, aby uzyskać pomoc.",
 	"JSON": "JSON",
-	"JSON Preview": "JSON (wersja zapoznawcza)",
+	"JSON Preview": "Podgląd JSON",
 	"July": "Lipiec",
 	"June": "Czerwiec",
-	"Jupyter Auth": "",
-	"Jupyter URL": "",
-	"JWT Expiration": "Wygaśnięcie JWT",
+	"Jupyter Auth": "Jupyter Auth",
+	"Jupyter URL": "Adres URL Jupytera",
+	"JWT Expiration": "Termin ważności JWT",
 	"JWT Token": "Token JWT",
-	"Kagi Search API Key": "",
-	"Keep Alive": "Zachowaj łączność",
-	"Key": "",
+	"Kagi Search API Key": "Klucz API Kagi Search",
+	"Keep Alive": "Utrzymuj łączność",
+	"Key": "Klucz",
 	"Keyboard shortcuts": "Skróty klawiszowe",
-	"Knowledge": "",
-	"Knowledge Access": "",
-	"Knowledge created successfully.": "",
-	"Knowledge deleted successfully.": "",
-	"Knowledge reset successfully.": "",
-	"Knowledge updated successfully": "",
-	"Kokoro.js (Browser)": "",
-	"Kokoro.js Dtype": "",
-	"Label": "",
-	"Landing Page Mode": "",
+	"Knowledge": "Wiedza",
+	"Knowledge Access": "Dostęp do wiedzy",
+	"Knowledge created successfully.": "Pomyślnie utworzona wiedza.",
+	"Knowledge deleted successfully.": "Wiedza została usunięta pomyślnie.",
+	"Knowledge reset successfully.": "Pomyślnie zresetowano wiedzę.",
+	"Knowledge updated successfully": "Wiedza zaktualizowana pomyślnie",
+	"Kokoro.js (Browser)": "Kokoro.js (Przeglądarka)",
+	"Kokoro.js Dtype": "Kokoro.js Dtype",
+	"Label": "Etykieta",
+	"Landing Page Mode": "Tryb strony lądowania",
 	"Language": "Język",
 	"Last Active": "Ostatnio aktywny",
-	"Last Modified": "",
-	"Last reply": "",
-	"LDAP": "",
-	"LDAP server updated": "",
-	"Leaderboard": "",
-	"Leave empty for unlimited": "",
-	"Leave empty to include all models from \"{{URL}}/api/tags\" endpoint": "",
-	"Leave empty to include all models from \"{{URL}}/models\" endpoint": "",
-	"Leave empty to include all models or select specific models": "",
-	"Leave empty to use the default prompt, or enter a custom prompt": "",
-	"Leave model field empty to use the default model.": "",
-	"License": "",
+	"Last Modified": "Ostatnia modyfikacja",
+	"Last reply": "Ostatnia odpowiedź",
+	"LDAP": "LDAP",
+	"LDAP server updated": "Serwer LDAP został zaktualizowany",
+	"Leaderboard": "Tablica wyników",
+	"Leave empty for unlimited": "Pozostaw puste dla nieograniczonego",
+	"Leave empty to include all models from \"{{URL}}/api/tags\" endpoint": "Pozostaw puste, aby uwzględnić wszystkie modele z końca punktu \"{{URL}}/api/tags\"",
+	"Leave empty to include all models from \"{{URL}}/models\" endpoint": "Pozostaw puste, aby uwzględnić wszystkie modele z endpointu \"{{URL}}/models\"",
+	"Leave empty to include all models or select specific models": "Pozostaw puste, aby uwzględnić wszystkie modele lub wybierz konkretne modele",
+	"Leave empty to use the default prompt, or enter a custom prompt": "Pozostaw puste, aby użyć domyślnego promptu, lub wprowadź niestandardowy prompt",
+	"Leave model field empty to use the default model.": "Pozostaw pole modelu puste, aby użyć domyślnego modelu.",
+	"License": "Licencja",
 	"Light": "Jasny",
-	"Listening...": "",
-	"Llama.cpp": "",
-	"LLMs can make mistakes. Verify important information.": "LLMy mogą popełniać błędy. Zweryfikuj ważne informacje.",
-	"Loading Kokoro.js...": "",
-	"Local": "",
-	"Local Models": "",
-	"Lost": "",
+	"Listening...": "Słuchanie...",
+	"Llama.cpp": "Llama.cpp",
+	"LLMs can make mistakes. Verify important information.": "LLMy mogą popełniać błędy. Upewnij się, że ważne informacje są poprawne.",
+	"Loading Kokoro.js...": "Wczytywanie Kokoro.js...",
+	"Local": "Lokalny",
+	"Local Models": "Modele lokalne",
+	"Lost": "Zagubiony",
 	"LTR": "LTR",
-	"Made by Open WebUI Community": "Stworzone przez społeczność OpenWebUI",
-	"Make sure to enclose them with": "Upewnij się, że są one zamknięte w",
-	"Make sure to export a workflow.json file as API format from ComfyUI.": "",
-	"Manage": "",
-	"Manage Arena Models": "",
-	"Manage Direct Connections": "",
-	"Manage Models": "",
-	"Manage Ollama": "",
-	"Manage Ollama API Connections": "",
-	"Manage OpenAI API Connections": "",
+	"Made by Open WebUI Community": "Opracowane przez społeczność Open WebUI",
+	"Make sure to enclose them with": "Upewnij się, że są one zawarte w",
+	"Make sure to export a workflow.json file as API format from ComfyUI.": "Upewnij się, że wyeksportowałeś plik workflow.json w formacie API z ComfyUI.",
+	"Manage": "Zarządzaj",
+	"Manage Arena Models": "Zarządzaj modelami Areny",
+	"Manage Direct Connections": "Zarządzaj bezpośrednimi połączeniami",
+	"Manage Models": "Zarządzaj modelami",
+	"Manage Ollama": "Zarządzaj Ollamą",
+	"Manage Ollama API Connections": "Zarządzaj połączeniami z API Ollama",
+	"Manage OpenAI API Connections": "Zarządzaj połączeniami z API OpenAI",
 	"Manage Pipelines": "Zarządzanie potokami",
 	"March": "Marzec",
 	"Max Tokens (num_predict)": "Maksymalna liczba żetonów (num_predict)",
-	"Max Upload Count": "",
-	"Max Upload Size": "",
-	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksymalnie 3 modele można pobierać jednocześnie. Spróbuj ponownie później.",
+	"Max Upload Count": "Maksymalna liczba przesyłanych plików",
+	"Max Upload Size": "Maksymalny rozmiar przesyłanego pliku",
+	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksymalnie 3 modele można pobierać jednocześnie. Proszę spróbować ponownie później.",
 	"May": "Maj",
-	"Memories accessible by LLMs will be shown here.": "Pamięci używane przez LLM będą tutaj widoczne.",
+	"Memories accessible by LLMs will be shown here.": "Wspomnienia dostępne za pomocą LLM zostaną wyświetlone tutaj.",
 	"Memory": "Pamięć",
-	"Memory added successfully": "",
-	"Memory cleared successfully": "",
-	"Memory deleted successfully": "",
-	"Memory updated successfully": "",
-	"Merge Responses": "",
-	"Message rating should be enabled to use this feature": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Wiadomości wysyłane po utworzeniu linku nie będą udostępniane. Użytkownicy z adresem URL będą mogli wyświetlić udostępniony czat.",
-	"Min P": "",
+	"Memory added successfully": "Pamięć dodana pomyślnie",
+	"Memory cleared successfully": "Pamięć oczyszczona pomyślnie",
+	"Memory deleted successfully": "Pamięć została usunięta pomyślnie",
+	"Memory updated successfully": "Pamięć zaktualizowana pomyślnie",
+	"Merge Responses": " scalaj odpowiedzi ",
+	"Message rating should be enabled to use this feature": "Ocena wiadomości powinna być włączona, aby korzystać z tej funkcji.",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Wiadomości wysyłane po utworzeniu linku nie będą udostępniane. Użytkownicy z adresem URL będą mogli wyświetlić udostępnioną rozmowę.",
+	"Min P": "Min P",
 	"Minimum Score": "Minimalny wynik",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"Model": "",
+	"Model": "Model",
 	"Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' został pomyślnie pobrany.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' jest już w kolejce do pobrania.",
-	"Model {{modelId}} not found": "Model {{modelId}} nie został znaleziony",
-	"Model {{modelName}} is not vision capable": "Model {{modelName}} nie jest w stanie zobaczyć",
-	"Model {{name}} is now {{status}}": "Model {{name}} to teraz {{status}}",
-	"Model accepts image inputs": "",
-	"Model created successfully!": "",
-	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Wykryto ścieżkę systemu plików modelu. Wymagana jest krótka nazwa modelu do aktualizacji, nie można kontynuować.",
-	"Model Filtering": "",
+	"Model {{modelId}} not found": "Model o identyfikatorze {{modelId}} nie został znaleziony.",
+	"Model {{modelName}} is not vision capable": "Model {{modelName}} nie jest zdolny do widzenia",
+	"Model {{name}} is now {{status}}": "Model {{name}} jest teraz {{status}}",
+	"Model accepts image inputs": "Model przyjmuje wejścia obrazowe",
+	"Model created successfully!": "Model utworzony pomyślnie!",
+	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Wykryto ścieżkę systemu plików modelu. Podanie krótkiej nazwy modelu jest wymagane do aktualizacji, nie można kontynuować.",
+	"Model Filtering": "Filtracja modeli",
 	"Model ID": "Identyfikator modelu",
-	"Model IDs": "",
-	"Model Name": "",
+	"Model IDs": "Identyfikatory modeli",
+	"Model Name": "Nazwa Modelu",
 	"Model not selected": "Model nie został wybrany",
 	"Model Params": "Parametry modelu",
-	"Model Permissions": "",
-	"Model updated successfully": "",
-	"Modelfile Content": "Zawartość pliku modelu",
+	"Model Permissions": "Uprawnienia modelu",
+	"Model updated successfully": "Model został zaktualizowany pomyślnie",
+	"Modelfile Content": "Treść pliku modelu",
 	"Models": "Modele",
-	"Models Access": "",
-	"Models configuration saved successfully": "",
-	"Mojeek Search API Key": "",
-	"more": "",
+	"Models Access": "Dostęp do modeli",
+	"Models configuration saved successfully": "Konfiguracja modeli została zapisana pomyślnie",
+	"Mojeek Search API Key": "Klucz API Mojeek Search",
+	"more": "więcej",
 	"More": "Więcej",
 	"Name": "Nazwa",
-	"Name your knowledge base": "",
-	"Native": "",
+	"Name your knowledge base": "Nazwij swoją bazę wiedzy",
+	"Native": "Rodzimy",
 	"New Chat": "Nowy czat",
-	"New Folder": "",
+	"New Folder": "Nowy Folder",
 	"New Password": "Nowe hasło",
-	"new-channel": "",
-	"No content found": "",
-	"No content to speak": "",
-	"No distance available": "",
-	"No feedbacks found": "",
-	"No file selected": "",
-	"No files found.": "",
-	"No groups with access, add a group to grant access": "",
-	"No HTML, CSS, or JavaScript content found.": "",
-	"No inference engine with management support found": "",
-	"No knowledge found": "",
-	"No model IDs": "",
-	"No models found": "",
-	"No models selected": "",
-	"No results found": "Nie znaleziono rezultatów",
-	"No search query generated": "Nie wygenerowano zapytania wyszukiwania",
-	"No source available": "Źródło nie dostępne",
-	"No users were found.": "",
-	"No valves to update": "",
-	"None": "Żaden",
-	"Not factually correct": "Nie zgodne z faktami",
-	"Not helpful": "",
-	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Uwaga: Jeśli ustawisz minimalny wynik, szukanie zwróci jedynie dokumenty z wynikiem większym lub równym minimalnemu.",
-	"Notes": "",
-	"Notification Sound": "",
-	"Notification Webhook": "",
+	"new-channel": "nowy-kanał",
+	"No content found": "Nie znaleziono żadnej zawartości.",
+	"No content to speak": "Brak treści do omówienia",
+	"No distance available": "Brak dostępnej odległości",
+	"No feedbacks found": "Nie znaleziono żadnych opinii",
+	"No file selected": "Nie wybrano żadnego pliku",
+	"No files found.": "Nie znaleziono żadnych plików.",
+	"No groups with access, add a group to grant access": "Brak grup z dostępem, dodaj grupę, aby przyznać dostęp",
+	"No HTML, CSS, or JavaScript content found.": "Nie znaleziono żadnej zawartości HTML, CSS ani JavaScript.",
+	"No inference engine with management support found": "Nie znaleziono silnika wnioskującego z obsługą zarządzania",
+	"No knowledge found": "Brak znalezionej wiedzy",
+	"No model IDs": "Brak identyfikatorów modeli",
+	"No models found": "Nie znaleziono modeli",
+	"No models selected": "Brak wybranych modeli",
+	"No results found": "Brak wyników znalezionych",
+	"No search query generated": "Nie wygenerowano żadnego zapytania wyszukiwania",
+	"No source available": "Źródło nie jest dostępne.",
+	"No users were found.": "Nie znaleziono użytkowników.",
+	"No valves to update": "Brak zaworów do aktualizacji",
+	"None": "Brak",
+	"Not factually correct": "Niezgodne z rzeczywistością",
+	"Not helpful": "Nieprzydatne",
+	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Uwaga: Jeśli określisz minimalną punktację, wyszukiwanie zwróci tylko dokumenty o wyniku równym lub wyższym niż minimalna punktacja.",
+	"Notes": "Uwagi",
+	"Notification Sound": "Dźwięk powiadomienia",
+	"Notification Webhook": "Powiadomienie Webhook",
 	"Notifications": "Powiadomienia",
 	"November": "Listopad",
-	"num_gpu (Ollama)": "",
+	"num_gpu (Ollama)": "num_gpu (Ollama)",
 	"num_thread (Ollama)": "num_thread (Ollama)",
-	"OAuth ID": "",
+	"OAuth ID": "Identyfikator OAuth",
 	"October": "Październik",
 	"Off": "Wyłączony",
-	"Okay, Let's Go!": "Okej, zaczynamy!",
+	"Okay, Let's Go!": "Okej, do dzieła!",
 	"OLED Dark": "Ciemny OLED",
 	"Ollama": "Ollama",
-	"Ollama API": "Ollama API",
-	"Ollama API settings updated": "",
+	"Ollama API": "Interfejs API Ollama",
+	"Ollama API settings updated": "Ustawienia API Ollama zostały zaktualizowane",
 	"Ollama Version": "Wersja Ollama",
 	"On": "Włączony",
-	"Only alphanumeric characters and hyphens are allowed": "",
-	"Only alphanumeric characters and hyphens are allowed in the command string.": "W poleceniu dozwolone są tylko znaki alfanumeryczne i myślniki.",
-	"Only collections can be edited, create a new knowledge base to edit/add documents.": "",
-	"Only select users and groups with permission can access": "",
-	"Oops! Looks like the URL is invalid. Please double-check and try again.": "Ups! Wygląda na to, że URL jest nieprawidłowy. Sprawdź jeszcze raz i spróbuj ponownie.",
-	"Oops! There are files still uploading. Please wait for the upload to complete.": "",
-	"Oops! There was an error in the previous response.": "",
-	"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ups! Używasz nieobsługiwanej metody (tylko interfejs front-end). Proszę obsłużyć interfejs WebUI z poziomu backendu.",
-	"Open file": "",
-	"Open in full screen": "",
-	"Open new chat": "Otwórz nowy czat",
-	"Open WebUI uses faster-whisper internally.": "",
-	"Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "",
-	"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
+	"Only alphanumeric characters and hyphens are allowed": "Dozwolone są tylko znaki alfanumeryczne i myślniki",
+	"Only alphanumeric characters and hyphens are allowed in the command string.": "W komendzie dozwolone są wyłącznie znaki alfanumeryczne i myślniki.",
+	"Only collections can be edited, create a new knowledge base to edit/add documents.": "Tylko kolekcje można edytować, utwórz nową bazę wiedzy, aby edytować/dodawać dokumenty.",
+	"Only select users and groups with permission can access": "Tylko wybrani użytkownicy i grupy z uprawnieniami mogą uzyskać dostęp.",
+	"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! Wygląda na to, że podany URL jest nieprawidłowy. Proszę sprawdzić go ponownie i spróbować jeszcze raz.",
+	"Oops! There are files still uploading. Please wait for the upload to complete.": "Oops! Nadal trwa przesyłanie plików. Proszę poczekać, aż przesyłanie zostanie ukończone.",
+	"Oops! There was an error in the previous response.": "Oops! Wystąpił błąd w poprzedniej odpowiedzi.",
+	"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! Używasz nieobsługiwanej metody (tylko interfejs użytkownika). Proszę serwować WebUI z poziomu backendu.",
+	"Open file": "Otwórz plik",
+	"Open in full screen": "Otwórz na pełny ekran",
+	"Open new chat": "Otwórz nową rozmowę",
+	"Open WebUI uses faster-whisper internally.": "Open WebUI korzysta wewnętrznie z szybszego faster-whisper.",
+	"Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Otwarta WebUI wykorzystuje SpeechT5 i wbudowane zbiory danych mówcy CMU Arctic.",
+	"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Otwarta wersja WebUI (v{{OPEN_WEBUI_VERSION}}) jest niższa niż wymagana wersja (v{{REQUIRED_VERSION}})",
 	"OpenAI": "OpenAI",
-	"OpenAI API": "OpenAI API",
-	"OpenAI API Config": "Konfiguracja OpenAI API",
-	"OpenAI API Key is required.": "Klucz API OpenAI jest wymagany.",
-	"OpenAI API settings updated": "",
-	"OpenAI URL/Key required.": "URL/Klucz OpenAI jest wymagany.",
+	"OpenAI API": "Interfejs API OpenAI",
+	"OpenAI API Config": "Konfiguracja interfejsu API OpenAI",
+	"OpenAI API Key is required.": "Klucz API OpenAI jest niezbędny.",
+	"OpenAI API settings updated": "Ustawienia API OpenAI zostały zaktualizowane",
+	"OpenAI URL/Key required.": "Wymagany jest URL/klucz OpenAI.",
 	"or": "lub",
-	"Organize your users": "",
-	"Other": "Inne",
-	"OUTPUT": "",
-	"Output format": "",
-	"Overview": "",
-	"page": "",
+	"Organize your users": "Zorganizuj swoich użytkowników",
+	"Other": "Pozostałe",
+	"OUTPUT": "WYNIKI",
+	"Output format": "Format wyjściowy",
+	"Overview": "Przegląd",
+	"page": "strona",
 	"Password": "Hasło",
-	"Paste Large Text as File": "",
+	"Paste Large Text as File": "Wklej duży tekst jako plik",
 	"PDF document (.pdf)": "Dokument PDF (.pdf)",
-	"PDF Extract Images (OCR)": "PDF Wyodrębnij obrazy (OCR)",
-	"pending": "oczekujące",
-	"Permission denied when accessing media devices": "",
-	"Permission denied when accessing microphone": "",
+	"PDF Extract Images (OCR)": "PDF Ekstrahuj obrazy (OCR)",
+	"pending": "w trakcie oczekiwania",
+	"Permission denied when accessing media devices": "Odmowa dostępu podczas uzyskiwania dostępu do urządzeń multimedialnych",
+	"Permission denied when accessing microphone": "Odmowa dostępu podczas uzyskiwania dostępu do mikrofonu",
 	"Permission denied when accessing microphone: {{error}}": "Odmowa dostępu do mikrofonu: {{error}}",
-	"Permissions": "",
+	"Permissions": "Uprawnienia",
 	"Personalization": "Personalizacja",
-	"Pin": "",
-	"Pinned": "",
-	"Pioneer insights": "",
-	"Pipeline deleted successfully": "",
-	"Pipeline downloaded successfully": "",
-	"Pipelines": "Rurociągów",
-	"Pipelines Not Detected": "",
-	"Pipelines Valves": "Rurociągi Zawory",
+	"Pin": "Szpilka",
+	"Pinned": "Przypięty",
+	"Pioneer insights": "Pionierskie spostrzeżenia",
+	"Pipeline deleted successfully": "Rurociąg usunięty pomyślnie",
+	"Pipeline downloaded successfully": "Rurociąg pobrany pomyślnie",
+	"Pipelines": "Rurociągi",
+	"Pipelines Not Detected": "Niewykryte potoki",
+	"Pipelines Valves": "Rurociągi i Zawory",
 	"Plain text (.txt)": "Zwykły tekst (.txt)",
 	"Playground": "Plac zabaw",
-	"Please carefully review the following warnings:": "",
-	"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.": "",
-	"Please select a reason": "",
-	"Port": "",
-	"Positive attitude": "Pozytywne podejście",
-	"Prefix ID": "",
-	"Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "",
-	"Presence Penalty": "",
-	"Previous 30 days": "Poprzednie 30 dni",
+	"Please carefully review the following warnings:": "Proszę uważnie przejrzeć poniższe ostrzeżenia:",
+	"Please do not close the settings page while loading the model.": "Proszę nie zamykać strony ustawień podczas ładowania modelu.",
+	"Please enter a prompt": "Proszę podać promp",
+	"Please fill in all fields.": "Proszę wypełnić wszystkie pola.",
+	"Please select a model first.": "Proszę najpierw wybrać model.",
+	"Please select a model.": "Proszę wybrać model.",
+	"Please select a reason": "Proszę wybrać powód",
+	"Port": "Port",
+	"Positive attitude": "Pozytywne nastawienie",
+	"Prefix ID": "Identyfikator prefiksu",
+	"Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "ID prefiksu jest używane do unikania konfliktów z innymi połączeniami poprzez dodanie prefiksu do ID modelu - pozostaw puste, aby wyłączyć",
+	"Presence Penalty": "Kara za obecność",
+	"Previous 30 days": "Ostatnie 30 dni",
 	"Previous 7 days": "Poprzednie 7 dni",
-	"Profile Image": "Obrazek profilowy",
-	"Prompt": "",
-	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (np. powiedz mi zabawny fakt o Imperium Rzymskim",
-	"Prompt Content": "Zawartość prompta",
-	"Prompt created successfully": "",
-	"Prompt suggestions": "Sugestie prompta",
-	"Prompt updated successfully": "",
+	"Profile Image": "Zdjęcie profilowe",
+	"Prompt": "Wprowadź odpowiedź: ",
+	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (np. podaj ciekawostkę o Imperium Rzymskim)",
+	"Prompt Content": "Treść prompty",
+	"Prompt created successfully": "Prompt został utworzony pomyślnie",
+	"Prompt suggestions": "Sugestie podpowiedzi",
+	"Prompt updated successfully": "Prompt został zaktualizowany pomyślnie.",
 	"Prompts": "Prompty",
-	"Prompts Access": "",
-	"Proxy URL": "",
+	"Prompts Access": "Prompty Dostęp",
+	"Proxy URL": "Adres URL pośredniczący",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Pobierz \"{{searchValue}}\" z Ollama.com",
 	"Pull a model from Ollama.com": "Pobierz model z Ollama.com",
-	"Query Generation Prompt": "",
+	"Query Generation Prompt": "Prompt do generowania zapytań",
 	"Query Params": "Parametry zapytania",
 	"RAG Template": "Szablon RAG",
-	"Rating": "",
-	"Re-rank models by topic similarity": "",
-	"Read": "",
+	"Rating": "Ocena",
+	"Re-rank models by topic similarity": "Przeankrować modele według podobieństwa tematycznego",
+	"Read": "Czytaj",
 	"Read Aloud": "Czytaj na głos",
-	"Reasoning Effort": "",
-	"Record voice": "Nagraj głos",
-	"Redirecting you to Open WebUI Community": "Przekierowujemy Cię do społeczności 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. (Default: 40)": "",
-	"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
-	"References from": "",
-	"Refused when it shouldn't have": "Odmówił, kiedy nie powinien",
-	"Regenerate": "Generuj ponownie",
+	"Reasoning Effort": "Wysiłek rozumowania",
+	"Record voice": "Nagraj swój głos",
+	"Redirecting you to Open WebUI Community": "Przekierowujemy Cię do społeczności Open WebUI",
+	"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. (Default: 40)": "Zmniejsza prawdopodobieństwo generowania bezsensownych odpowiedzi. Wyższa wartość (np. 100) daje bardziej zróżnicowane odpowiedzi, podczas gdy niższa wartość (np. 10) jest bardziej konserwatywna. (Domyślnie: 40)",
+	"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Odnosić się do siebie jako \"Użytkownik\" (np. \"Użytkownik uczy się hiszpańskiego\")",
+	"References from": "Odniesienia do",
+	"Refused when it shouldn't have": "Odmówił, gdy nie powinien",
+	"Regenerate": "Odtwórz",
 	"Release Notes": "Notatki wydania",
-	"Relevance": "",
+	"Relevance": "Znaczenie",
 	"Remove": "Usuń",
 	"Remove Model": "Usuń model",
-	"Rename": "ZMień nazwę",
-	"Reorder Models": "",
-	"Repeat Last N": "Powtórz ostatnie N",
-	"Repeat Penalty (Ollama)": "",
-	"Reply in Thread": "",
+	"Rename": "Zmień nazwę",
+	"Reorder Models": "Przeorganizuj modele",
+	"Repeat Last N": "Powtórz ostatnie N elementów",
+	"Repeat Penalty (Ollama)": "Powtórzona kara (Ollama)",
+	"Reply in Thread": "Odpowiedz w wątku",
 	"Request Mode": "Tryb żądania",
-	"Reranking Model": "Zmiana rankingu modelu",
-	"Reranking model disabled": "Zmiana rankingu modelu zablokowana",
-	"Reranking model set to \"{{reranking_model}}\"": "Zmiana rankingu modelu ustawiona na \"{{reranking_model}}\"",
-	"Reset": "",
-	"Reset All Models": "",
-	"Reset Upload Directory": "",
-	"Reset Vector Storage/Knowledge": "",
-	"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 Query Generation": "",
-	"Rich Text Input for Chat": "",
-	"RK": "",
+	"Reranking Model": "Poprawa rankingu modelu",
+	"Reranking model disabled": "Model ponownego rankingu wyłączony",
+	"Reranking model set to \"{{reranking_model}}\"": "Model rerankingu ustawiony na \"{{reranking_model}}\".",
+	"Reset": "Resetuj",
+	"Reset All Models": "Resetuj wszystkie modele",
+	"Reset Upload Directory": "Resetuj katalog pobierania",
+	"Reset Vector Storage/Knowledge": "Reset magazynu wektorowego/wiedzy",
+	"Reset view": "Resetuj widok",
+	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Powiadomienia o odpowiedziach nie mogą zostać aktywowane, ponieważ uprawnienia strony zostały odrzucone. Proszę odwiedzić ustawienia przeglądarki, aby przyznać wymagany dostęp.",
+	"Response splitting": "Rozdzielanie odpowiedzi",
+	"Result": "Wynik",
+	"Retrieval Query Generation": "Generowanie Zapytań Pobierania",
+	"Rich Text Input for Chat": "Pole do wprowadzania tekstu formatowanego dla czatu",
+	"RK": "RK",
 	"Role": "Rola",
-	"Rosé Pine": "Rosé Pine",
-	"Rosé Pine Dawn": "Rosé Pine Dawn",
-	"RTL": "RLT",
-	"Run": "",
-	"Running": "",
+	"Rosé Pine": "Różana Sosna",
+	"Rosé Pine Dawn": "Różany Poranek Pine Dawn",
+	"RTL": "RTL",
+	"Run": "Uruchomić",
+	"Running": "Bieganie",
 	"Save": "Zapisz",
-	"Save & Create": "Zapisz i utwórz",
-	"Save & Update": "Zapisz i zaktualizuj",
-	"Save As Copy": "",
-	"Save Tag": "",
-	"Saved": "",
-	"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": "Bezpośrednie zapisywanie dzienników czatu w pamięci przeglądarki nie jest już obsługiwane. Prosimy o pobranie i usunięcie dzienników czatu, klikając poniższy przycisk. Nie martw się, możesz łatwo ponownie zaimportować dzienniki czatu do backendu za pomocą",
-	"Scroll to bottom when switching between branches": "",
+	"Save & Create": "Zapisz i stwórz",
+	"Save & Update": "Zapisz i odśwież",
+	"Save As Copy": "Zapisz jako kopia",
+	"Save Tag": "Zapisz Tag",
+	"Saved": "Zapisano",
+	"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": "Zapisywanie dzienników czatu bezpośrednio w pamięci przeglądarki nie jest już obsługiwane. Prosimy o pobranie i usunięcie dzienników czatu, klikając przycisk poniżej. Nie przejmuj się, możesz łatwo ponownie zaimportować dzienniki czatu do backendu przez",
+	"Scroll to bottom when switching between branches": "Przewiń do dołu podczas przełączania gałęzi",
 	"Search": "Szukaj",
-	"Search a model": "Szukaj modelu",
-	"Search Base": "",
-	"Search Chats": "Szukaj w czatach",
-	"Search Collection": "",
-	"Search Filters": "",
-	"search for tags": "",
-	"Search Functions": "",
-	"Search Knowledge": "",
-	"Search Models": "Szukaj modeli",
-	"Search options": "",
-	"Search Prompts": "Szukaj promptów",
+	"Search a model": "Wyszukaj model",
+	"Search Base": "Baza wyszukiwania",
+	"Search Chats": "Przeszukaj czaty",
+	"Search Collection": "Przeszukaj kolekcję",
+	"Search Filters": "Filtry wyszukiwania",
+	"search for tags": "wyszukiwanie tagów",
+	"Search Functions": "Funkcje wyszukiwania",
+	"Search Knowledge": "Wyszukaj wiedzę",
+	"Search Models": "Modele wyszukiwania",
+	"Search options": "Opcje wyszukiwania",
+	"Search Prompts": "Prompty wyszukiwania",
 	"Search Result Count": "Liczba wyników wyszukiwania",
-	"Search the internet": "",
-	"Search Tools": "",
-	"SearchApi API Key": "",
-	"SearchApi Engine": "",
-	"Searched {{count}} sites": "",
-	"Searching \"{{searchQuery}}\"": "",
-	"Searching Knowledge for \"{{searchQuery}}\"": "",
+	"Search the internet": "Przeszukaj internet",
+	"Search Tools": "Narzędzia wyszukiwania",
+	"SearchApi API Key": "Klucz API SearchApi",
+	"SearchApi Engine": "Search API Engine",
+	"Searched {{count}} sites": "Przeszukano {{count}} stron",
+	"Searching \"{{searchQuery}}\"": "Wyszukiwanie \"{{searchQuery}}\"",
+	"Searching Knowledge for \"{{searchQuery}}\"": "Wyszukiwanie wiedzy dla \"{{searchQuery}}\"",
 	"Searxng Query URL": "Adres URL zapytania Searxng",
-	"See readme.md for instructions": "Zajrzyj do readme.md po instrukcje",
-	"See what's new": "Zobacz co nowego",
-	"Seed": "Seed",
-	"Select a base model": "Wybieranie modelu bazowego",
-	"Select a engine": "",
-	"Select a function": "",
-	"Select a group": "",
+	"See readme.md for instructions": "Sprawdź readme.md dla instrukcji",
+	"See what's new": "Sprawdź nowości",
+	"Seed": "Nasiono",
+	"Select a base model": "Wybór modelu bazowego",
+	"Select a engine": "Wybierz silnik",
+	"Select a function": "Wybierz funkcję",
+	"Select a group": "Wybierz grupę",
 	"Select a model": "Wybierz model",
-	"Select a pipeline": "Wybieranie potoku",
-	"Select a pipeline url": "Wybieranie adresu URL potoku",
-	"Select a tool": "",
-	"Select an auth method": "",
-	"Select an Ollama instance": "",
-	"Select Engine": "",
-	"Select Knowledge": "",
+	"Select a pipeline": "Wybierz potok",
+	"Select a pipeline url": "Wybierz adres URL potoku",
+	"Select a tool": "Wybierz narzędzie",
+	"Select an auth method": "Wybierz metodę uwierzytelniania",
+	"Select an Ollama instance": "Wybierz instancję Ollama",
+	"Select Engine": "Wybierz silnik",
+	"Select Knowledge": "Wybierz Wiedzę",
 	"Select model": "Wybierz model",
-	"Select only one model to call": "",
-	"Selected model(s) do not support image inputs": "Wybrane modele nie obsługują danych wejściowych obrazu",
-	"Semantic distance to query": "",
+	"Select only one model to call": "Wybierz tylko jeden model do wywołania",
+	"Selected model(s) do not support image inputs": "Wybrane modele nie obsługują danych wejściowych w formie obrazu",
+	"Semantic distance to query": "Odległość semantyczna od zapytania",
 	"Send": "Wyślij",
-	"Send a Message": "Wyślij Wiadomość",
+	"Send a Message": "Wyślij wiadomość",
 	"Send message": "Wyślij wiadomość",
-	"Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "",
+	"Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "Wysyła `stream_options: { include_usage: true }` w żądaniu. Wspierane dostawcy zwrócą informacje o użyciu tokena w odpowiedzi, gdy jest on ustawiony.",
 	"September": "Wrzesień",
-	"SerpApi API Key": "",
-	"SerpApi Engine": "",
+	"SerpApi API Key": "Klucz API SerpApi",
+	"SerpApi Engine": "Silnik SerpApi",
 	"Serper API Key": "Klucz API Serper",
-	"Serply API Key": "",
+	"Serply API Key": "Klucz API Serply",
 	"Serpstack API Key": "Klucz API Serpstack",
-	"Server connection verified": "Połączenie z serwerem zweryfikowane",
+	"Server connection verified": "Połączenie z serwerem zostało zweryfikowane",
 	"Set as default": "Ustaw jako domyślne",
-	"Set CFG Scale": "",
-	"Set Default Model": "Ustaw domyślny model",
-	"Set embedding model": "",
-	"Set embedding model (e.g. {{model}})": "Ustaw model osadzania (e.g. {{model}})",
+	"Set CFG Scale": "Ustaw skalę CFG",
+	"Set Default Model": "Ustaw model domyślny",
+	"Set embedding model": "Ustawianie modelu osadzania",
+	"Set embedding model (e.g. {{model}})": "Skonfiguruj model osadzania (np. {{model}})",
 	"Set Image Size": "Ustaw rozmiar obrazu",
-	"Set reranking model (e.g. {{model}})": "Ustaw zmianę rankingu modelu (e.g. {{model}})",
-	"Set Sampler": "",
-	"Set Scheduler": "",
+	"Set reranking model (e.g. {{model}})": "Skonfiguruj model ponownego rankingu (np. {{model}})",
+	"Set Sampler": "Próbnik Samplera",
+	"Set Scheduler": "Ustawiacz Harmonogramu",
 	"Set Steps": "Ustaw kroki",
-	"Set Task Model": "Ustawianie modelu zadań",
-	"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.": "",
-	"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.": "",
+	"Set Task Model": "Konfiguracja modelu zadań",
+	"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.": "Ustaw liczbę warstw, które zostaną przeniesione na GPU. Zwiększenie tej wartości może znacząco poprawić wydajność dla modeli optymalizowanych pod kątem akceleracji GPU, ale także może zużywać więcej energii i zasobów 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.": "Ustaw liczbę wątków pracowników używanych do obliczeń. Ta opcja kontroluje, ile wątków jest używanych do jednoczesnego przetwarzania przychodzących żądań. Zwiększenie tej wartości może poprawić wydajność pod wysokim obciążeniem, ale może również zużywać więcej zasobów CPU.",
 	"Set Voice": "Ustaw głos",
-	"Set whisper model": "",
-	"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. (Default: 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. (Default: 1.1)": "",
-	"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "",
-	"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. (Default: random)": "",
-	"Sets the size of the context window used to generate the next token. (Default: 2048)": "",
-	"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.": "",
+	"Set whisper model": "Ustaw model szeptu",
+	"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. (Default: 0)": "Ustawia płaską karę za tokeny, które pojawiły się przynajmniej raz. Wyższa wartość (np. 1,5) bardziej surowo karze powtórzenia, podczas gdy niższa wartość (np. 0,9) jest bardziej pobłażliwa. Przy 0 jest wyłączona. (Domyślnie: 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. (Default: 1.1)": "Ustawia skalowanie przeciwko tokenom, aby penalizować powtórzenia na podstawie liczby ich wystąpień. Wyższa wartość (np. 1,5) bardziej penalizuje powtórzenia, natomiast niższa wartość (np. 0,9) jest bardziej pobłażliwa. Przy 0 jest wyłączona. (Domyślnie: 1,1)",
+	"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "Określa, jak daleko wstecz model powinien sięgać, aby zapobiec powtarzaniu się. (Domyślnie: 64, 0 = wyłączone, -1 = num_ctx)",
+	"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. (Default: random)": "Ustawia ziarno liczby losowej do użycia podczas generowania. Ustawienie tego na konkretną liczbę spowoduje, że model będzie generował ten sam tekst dla tego samego zapytania. (Domyślnie: losowe)",
+	"Sets the size of the context window used to generate the next token. (Default: 2048)": "Ustawia rozmiar okna kontekstowego używanego do generowania następnego tokenu. (Domyślnie: 2048)",
+	"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Ustawia sekwencje stopu do użycia. Gdy ten wzorzec zostanie napotkany, LLM przestanie generować tekst i zwróci wynik. Można skonfigurować wiele sekwencji stopu, określając kilka oddzielnych parametrów stopu w pliku modelu.",
 	"Settings": "Ustawienia",
-	"Settings saved successfully!": "Ustawienia zapisane pomyślnie!",
-	"Share": "Udostępnij",
-	"Share Chat": "Udostępnij czat",
-	"Share to Open WebUI Community": "Dziel się z społecznością OpenWebUI",
-	"Show": "Pokaż",
-	"Show \"What's New\" modal on login": "",
-	"Show Admin Details in Account Pending Overlay": "",
-	"Show shortcuts": "Pokaż skróty",
-	"Show your support!": "",
-	"Showcased creativity": "Pokaz kreatywności",
+	"Settings saved successfully!": "Ustawienia zostały zapisane pomyślnie!",
+	"Share": "Podziel się",
+	"Share Chat": "Udostępnij rozmowę",
+	"Share to Open WebUI Community": "Udostępnij w społeczności OpenWebUI",
+	"Show": "Wyświetl",
+	"Show \"What's New\" modal on login": "Wyświetl okno dialogowe \"What's New\" podczas logowania",
+	"Show Admin Details in Account Pending Overlay": "Wyświetl szczegóły administratora w okienku podręcznym konta",
+	"Show shortcuts": "Wyświetl skróty",
+	"Show your support!": "Wyraź swoje poparcie!",
+	"Showcased creativity": "Prezentacja kreatywności",
 	"Sign in": "Zaloguj się",
-	"Sign in to {{WEBUI_NAME}}": "",
-	"Sign in to {{WEBUI_NAME}} with LDAP": "",
+	"Sign in to {{WEBUI_NAME}}": "Zaloguj się do {{WEBUI_NAME}}",
+	"Sign in to {{WEBUI_NAME}} with LDAP": "Zaloguj się do {{WEBUI_NAME}} przy użyciu LDAP",
 	"Sign Out": "Wyloguj się",
 	"Sign up": "Zarejestruj się",
-	"Sign up to {{WEBUI_NAME}}": "",
-	"Signing in to {{WEBUI_NAME}}": "",
-	"sk-1234": "",
+	"Sign up to {{WEBUI_NAME}}": "Zarejestruj się w {{WEBUI_NAME}}",
+	"Signing in to {{WEBUI_NAME}}": "Logowanie do {{WEBUI_NAME}}",
+	"sk-1234": "sk-1234",
 	"Source": "Źródło",
-	"Speech Playback Speed": "",
+	"Speech Playback Speed": "Prędkość odtwarzania mowy",
 	"Speech recognition error: {{error}}": "Błąd rozpoznawania mowy: {{error}}",
-	"Speech-to-Text Engine": "Silnik mowy na tekst",
-	"Stop": "",
+	"Speech-to-Text Engine": "Silnik konwersji mowy na tekst",
+	"Stop": "Zatrzymaj się",
 	"Stop Sequence": "Zatrzymaj sekwencję",
-	"Stream Chat Response": "",
-	"STT Model": "",
+	"Stream Chat Response": "Odpowiedź na czacie strumieniowym",
+	"STT Model": "Model STT",
 	"STT Settings": "Ustawienia STT",
 	"Subtitle (e.g. about the Roman Empire)": "Podtytuł (np. o Imperium Rzymskim)",
 	"Success": "Sukces",
-	"Successfully updated.": "Pomyślnie zaktualizowano.",
-	"Suggested": "Sugerowane",
-	"Support": "",
-	"Support this plugin:": "",
-	"Sync directory": "",
+	"Successfully updated.": "Uaktualniono pomyślnie.",
+	"Suggested": "Proponowane",
+	"Support": "Wsparcie",
+	"Support this plugin:": "Wesprzyj ten plugin:",
+	"Sync directory": "Sync directory",
 	"System": "System",
-	"System Instructions": "",
+	"System Instructions": "Instrukcje systemowe",
 	"System Prompt": "Prompt systemowy",
-	"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. (default: 1)": "",
-	"Tap to interrupt": "",
-	"Tasks": "",
-	"Tavily API Key": "",
-	"Tell us more:": "Powiedz nam więcej",
+	"Tags Generation": "Generowanie tagów",
+	"Tags Generation Prompt": "Prompt generowania tagów",
+	"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. (default: 1)": "Próbkowanie bez ogona jest używane do zmniejszenia wpływu mniej prawdopodobnych tokenów na wyjście. Wyższa wartość (np. 2,0) zmniejszy ten wpływ bardziej, podczas gdy wartość 1,0 wyłącza to ustawienie. (domyślnie: 1)",
+	"Tap to interrupt": "Kliknij, aby przerwać",
+	"Tasks": "Zadania",
+	"Tavily API Key": "Klucz API Tavily",
+	"Tell us more:": "Podaj więcej informacji",
 	"Temperature": "Temperatura",
 	"Template": "Szablon",
-	"Temporary Chat": "",
-	"Text Splitter": "",
-	"Text-to-Speech Engine": "Silnik tekstu na mowę",
+	"Temporary Chat": "Tymczasowa rozmowa",
+	"Text Splitter": "Rozdzielacz tekstu",
+	"Text-to-Speech Engine": "Silnik konwersji tekstu na mowę",
 	"Tfs Z": "Tfs Z",
-	"Thanks for your feedback!": "Dzięki za informację zwrotną!",
-	"The Application Account DN you bind with for search": "",
-	"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.  (Default: 512)": "",
-	"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.": "",
-	"The LDAP attribute that maps to the mail that users use to sign in.": "",
-	"The LDAP attribute that maps to the username that users use to sign in.": "",
-	"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.": "",
-	"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.": "",
-	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Wynik powinien być wartością pomiędzy 0.0 (0%) a 1.0 (100%).",
-	"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "",
-	"Theme": "Motyw",
-	"Thinking...": "",
-	"This action cannot be undone. Do you wish to continue?": "",
-	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "To zapewnia, że Twoje cenne rozmowy są bezpiecznie zapisywane w bazie danych backendowej. Dziękujemy!",
-	"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. (Default: 24)": "",
-	"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.  (Default: 128)": "",
-	"This option will delete all existing files in the collection and replace them with newly uploaded files.": "",
-	"This response was generated by \"{{model}}\"": "",
-	"This will delete": "",
-	"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
-	"This will delete all models including custom models": "",
-	"This will delete all models including custom models and cannot be undone.": "",
-	"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
-	"Thorough explanation": "Dokładne wyjaśnienie",
-	"Thought for {{DURATION}}": "",
-	"Thought for {{DURATION}} seconds": "",
-	"Tika": "",
-	"Tika Server URL required.": "",
-	"Tiktoken": "",
-	"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Porada: Aktualizuj wiele zmiennych kolejno, naciskając klawisz tabulatora w polu wprowadzania czatu po każdej zmianie.",
+	"Thanks for your feedback!": "Dziękuję za Twoją opinię!",
+	"The Application Account DN you bind with for search": "Konto aplikacji DN, z którym się wiążesz w celu przeszukiwania",
+	"The base to search for users": "Podstawa do wyszukiwania użytkowników",
+	"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.  (Default: 512)": "Rozmiar partii określa, ile żądań tekstu jest przetwarzanych razem w jednym czasie. Większy rozmiar partii może zwiększyć wydajność i szybkość modelu, ale wymaga również więcej pamięci. (Domyślnie: 512)",
+	"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Twórcy tego wtyczki to entuzjaści, którzy działają jako wolontariusze ze społeczności. Jeśli uważasz, że ta wtyczka jest pomocna, rozważ wsparcie jej rozwoju.",
+	"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Tablica wyników oceny opiera się na systemie rankingu Elo i jest aktualizowana w czasie rzeczywistym.",
+	"The LDAP attribute that maps to the mail that users use to sign in.": "Atrybut LDAP, który mapuje się na adres e-mail używany przez użytkowników do logowania.",
+	"The LDAP attribute that maps to the username that users use to sign in.": "Atrybut LDAP, który mapuje się na nazwę użytkownika, którą użytkownicy używają do logowania.",
+	"The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Tablica wyników jest obecnie w fazie beta i możemy dostosować obliczenia oceny, gdy udoskonalamy algorytm.",
+	"The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "Maksymalny rozmiar pliku w MB. Jeśli rozmiar pliku przekroczy ten limit, plik nie zostanie przesłany.",
+	"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.": "Maksymalna liczba plików, które można użyć jednocześnie w czacie. Jeśli liczba plików przekroczy ten limit, pliki nie zostaną przesłane.",
+	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Wynik powinien być wartością pomiędzy 0,0 (0%) a 1,0 (100%).",
+	"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "Temperatura modelu. Zwiększenie temperatury sprawi, że model będzie odpowiadał w sposób bardziej kreatywny. (Domyślnie: 0.8)",
+	"Theme": "Temat",
+	"Thinking...": "Myślę...",
+	"This action cannot be undone. Do you wish to continue?": "Czy na pewno chcesz kontynuować? Ta akcja nie może zostać cofnięta.",
+	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "To gwarantuje, że Twoje wartościowe rozmowy są bezpiecznie zapisywane w bazie danych backendowej. Dziękujemy!",
+	"This is an experimental feature, it may not function as expected and is subject to change at any time.": "To jest funkcja eksperymentalna, może nie działać zgodnie z oczekiwaniami i jest podatna na zmiany w dowolnym momencie.",
+	"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. (Default: 24)": "Ta opcja kontroluje, ile tokenów jest zachowanych podczas odświeżania kontekstu. Na przykład, jeśli ustawiona na 2, ostatnie 2 tokeny kontekstu rozmowy zostaną zachowane. Zachowywanie kontekstu może pomóc w utrzymaniu ciągłości rozmowy, ale może zmniejszyć zdolność do odpowiadania na nowe tematy. (Domyślnie: 24)",
+	"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.  (Default: 128)": "Ta opcja ustawia maksymalną liczbę tokenów, które model może wygenerować w swojej odpowiedzi. Zwiększenie tego limitu pozwala modelowi na dostarczanie dłuższych odpowiedzi, ale może również zwiększyć prawdopodobieństwo generowania nieprzydatnych lub nieistotnych treści. (Domyślnie: 128)",
+	"This option will delete all existing files in the collection and replace them with newly uploaded files.": "Ta opcja usunie wszystkie istniejące pliki w kolekcji i zastąpi je nowo przesłanymi plikami.",
+	"This response was generated by \"{{model}}\"": "Ta odpowiedź została wygenerowana przez \"{{model}}\".",
+	"This will delete": "To usunie wszystkie pliki z katalogu.",
+	"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "To usunie <strong>{{NAME}}</strong> i <strong>wszystkie jego zawartości</strong>.",
+	"This will delete all models including custom models": "To usunie wszystkie modele, w tym niestandardowe.",
+	"This will delete all models including custom models and cannot be undone.": "To usunie wszystkie modele, w tym niestandardowe modele, i nie można tego cofnąć.",
+	"This will reset the knowledge base and sync all files. Do you wish to continue?": "Czy chcesz wyzerować bazę wiedzy i zsynchronizować wszystkie pliki? Proszę potwierdź swoją decyzję.",
+	"Thorough explanation": "Szczegółowe wyjaśnienie",
+	"Thought for {{DURATION}}": "Myśl na {{DURATION}}",
+	"Thought for {{DURATION}} seconds": "Myśl przez {{DURATION}} sekund",
+	"Tika": "Tika",
+	"Tika Server URL required.": "Wymagany jest adres URL serwera Tika.",
+	"Tiktoken": "Tiktoken",
+	"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Porada: Aby zaktualizować wiele zmiennych jednocześnie, naciśnij klawisz Tab w polu wprowadzania czatu po każdej zmianie.",
 	"Title": "Tytuł",
-	"Title (e.g. Tell me a fun fact)": "Tytuł (np. Powiedz mi jakiś zabawny fakt)",
-	"Title Auto-Generation": "Automatyczne generowanie tytułu",
-	"Title cannot be an empty string.": "Tytuł nie może być pusty",
-	"Title Generation": "",
-	"Title Generation Prompt": "Prompt generowania tytułu",
-	"TLS": "",
-	"To access the available model names for downloading,": "Aby uzyskać dostęp do dostępnych nazw modeli do pobrania,",
-	"To access the GGUF models available for downloading,": "Aby uzyskać dostęp do dostępnych modeli GGUF do pobrania,",
-	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
-	"To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "",
-	"To learn more about available endpoints, visit our documentation.": "",
-	"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.": "",
-	"To select actions here, add them to the \"Functions\" workspace first.": "",
-	"To select filters here, add them to the \"Functions\" workspace first.": "",
-	"To select toolkits here, add them to the \"Tools\" workspace first.": "",
-	"Toast notifications for new updates": "",
+	"Title (e.g. Tell me a fun fact)": "Tytuł (na przykład {e.g.} Powiedz mi jakiś zabawny fakt)",
+	"Title Auto-Generation": "Automatyczne tworzenie tytułu",
+	"Title cannot be an empty string.": "Tytuł nie może być pustą stringiem.",
+	"Title Generation": "Generowanie tytułów",
+	"Title Generation Prompt": "Prompt do generowania tytułu",
+	"TLS": "TLS",
+	"To access the available model names for downloading,": "Aby wyświetlić dostępne nazwy modeli do pobrania,",
+	"To access the GGUF models available for downloading,": "Aby uzyskać dostęp do modeli GGUF dostępnych do pobrania,",
+	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Aby uzyskać dostęp do interfejsu WebUI, skontaktuj się z administratorem. Administratorzy mogą zarządzać statusami użytkowników z Panelu Administracyjnego.",
+	"To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Aby dołączyć bazę wiedzy tutaj, dodaj je najpierw do przestrzeni roboczej \"Wiedza\". ",
+	"To learn more about available endpoints, visit our documentation.": "Aby dowiedzieć się więcej o dostępnych punktach końcowych, odwiedź naszą dokumentację.",
+	"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.": "Aby chronić Twoją prywatność, udostępniane są tylko oceny, identyfikatory modeli, tagi i metadane z Twoich opinii – Twoje dzienniki czatu pozostają prywatne i nie są uwzględniane.",
+	"To select actions here, add them to the \"Functions\" workspace first.": "Aby wybrać działania tutaj, najpierw dodaj je do przestrzeni roboczej \"Funkcje\".",
+	"To select filters here, add them to the \"Functions\" workspace first.": "Aby wybrać filtry tutaj, najpierw dodaj je do przestrzeni roboczej \"Funkcje\".",
+	"To select toolkits here, add them to the \"Tools\" workspace first.": "Aby wybrać zestawy narzędzi tutaj, dodaj je najpierw do przestrzeni roboczej \"Narzędzia\". ",
+	"Toast notifications for new updates": "Powiadomienia o nowych aktualizacjach",
 	"Today": "Dzisiaj",
-	"Toggle settings": "Przełącz ustawienia",
-	"Toggle sidebar": "Przełącz panel boczny",
-	"Token": "",
-	"Tokens To Keep On Context Refresh (num_keep)": "",
-	"Too verbose": "",
-	"Tool created successfully": "",
-	"Tool deleted successfully": "",
-	"Tool Description": "",
-	"Tool ID": "",
-	"Tool imported successfully": "",
-	"Tool Name": "",
-	"Tool updated successfully": "",
-	"Tools": "",
-	"Tools Access": "",
-	"Tools are a function calling system with arbitrary code execution": "",
-	"Tools Function Calling Prompt": "",
-	"Tools have a function calling system that allows arbitrary code execution": "",
-	"Tools have a function calling system that allows arbitrary code execution.": "",
+	"Toggle settings": "Przełącz opcje",
+	"Toggle sidebar": "Przełącz pasek boczny",
+	"Token": "Żeton",
+	"Tokens To Keep On Context Refresh (num_keep)": "Tokeny do zachowania podczas odświeżania kontekstu (num_keep)",
+	"Too verbose": "Zbyt rozwlekłe",
+	"Tool created successfully": "Narzędzie utworzone pomyślnie",
+	"Tool deleted successfully": "Narzędzie zostało usunięte pomyślnie",
+	"Tool Description": "Opis narzędzia",
+	"Tool ID": "Narzędzie ID",
+	"Tool imported successfully": "Narzędzie zostało pomyślnie zaimportowane",
+	"Tool Name": "Nazwa narzędzia",
+	"Tool updated successfully": "Narzędzie zaktualizowane pomyślnie",
+	"Tools": "Narzędzia",
+	"Tools Access": "Narzędzia Dostępu",
+	"Tools are a function calling system with arbitrary code execution": "Narzędzia to system wywoływania funkcji z możliwością wykonania dowolnego kodu.",
+	"Tools Function Calling Prompt": "Narzędzia Funkcja Wywołania Prompta",
+	"Tools have a function calling system that allows arbitrary code execution": "Narzędzia mają funkcję wywoływania systemu, która umożliwia wykonywanie dowolnego kodu",
+	"Tools have a function calling system that allows arbitrary code execution.": "Narzędzia mają funkcję wywoływania systemu, która umożliwia wykonanie dowolnego kodu.",
 	"Top K": "Najlepsze K",
 	"Top P": "Najlepsze P",
-	"Transformers": "",
-	"Trouble accessing Ollama?": "Problemy z dostępem do Ollama?",
-	"TTS Model": "",
-	"TTS Settings": "Ustawienia TTS",
-	"TTS Voice": "",
+	"Transformers": "Transformery",
+	"Trouble accessing Ollama?": "Czy masz problemy z dostępem do Ollama?",
+	"TTS Model": "Model TTS",
+	"TTS Settings": "Ustawienia Syntezatora Mowy",
+	"TTS Voice": "Głos TTS",
 	"Type": "Typ",
-	"Type Hugging Face Resolve (Download) URL": "Wprowadź adres URL do pobrania z Hugging Face",
-	"Uh-oh! There was an issue with the response.": "",
-	"UI": "",
-	"Unarchive All": "",
-	"Unarchive All Archived Chats": "",
-	"Unarchive Chat": "",
-	"Unlock mysteries": "",
-	"Unpin": "",
-	"Unravel secrets": "",
-	"Untagged": "",
-	"Update": "",
-	"Update and Copy Link": "Uaktualnij i skopiuj link",
-	"Update for the latest features and improvements.": "",
-	"Update password": "Aktualizacja hasła",
-	"Updated": "",
-	"Updated at": "",
-	"Updated At": "",
-	"Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "",
-	"Upload": "",
+	"Type Hugging Face Resolve (Download) URL": "Podaj adres URL do pobrania z Hugging Face",
+	"Uh-oh! There was an issue with the response.": "Ojej! Wystąpił problem z odpowiedzią.",
+	"UI": "Interfejs użytkownika",
+	"Unarchive All": "Odarchiwizuj wszystko",
+	"Unarchive All Archived Chats": "Odblokuj wszystkie ukryte rozmowy",
+	"Unarchive Chat": "Odblokuj czat",
+	"Unlock mysteries": "Rozwiązywanie zagadek",
+	"Unpin": "Odpiąć (pinę)",
+	"Unravel secrets": "Odkryj tajemnice",
+	"Untagged": "Nieoznaczone",
+	"Update": "Aktualizacja",
+	"Update and Copy Link": "Aktualizuj i kopiuj link",
+	"Update for the latest features and improvements.": "Aktualizacja do najnowszych funkcji i ulepszeń.",
+	"Update password": "Zmiana hasła",
+	"Updated": "Aby zwiększyć wydajność aplikacji, należy rozważyć optymalizację kodu i użycie odpowiednich struktur danych. {optimization} [optimizations] mogą obejmować minimalizację liczby operacji we/wy, zwiększenie wydajności algorytmów oraz zmniejszenie zużycia pamięci. Ponadto, warto rozważyć użycie {caching} [pamięci podręcznej] do przechowywania często używanych danych, co może znacząco przyspieszyć działanie aplikacji. Wreszcie, monitorowanie wydajności aplikacji za pomocą narzędzi takich jak {profiling} [profilowanie] może pomóc zidentyfikować wolne miejsca i dalsze obszary do optymalizacji.",
+	"Updated at": "Aktualizacja dnia",
+	"Updated At": "Aktualizacja",
+	"Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "Przejdź na licencjonowany plan, aby uzyskać rozszerzone możliwości, w tym niestandardowe motywy i personalizację oraz dedykowane wsparcie.",
+	"Upload": "Prześlij",
 	"Upload a GGUF model": "Prześlij model GGUF",
-	"Upload directory": "",
-	"Upload files": "",
+	"Upload directory": "Prześlij katalog",
+	"Upload files": "Prześlij pliki",
 	"Upload Files": "Prześlij pliki",
-	"Upload Pipeline": "",
-	"Upload Progress": "Postęp przesyłania",
-	"URL": "",
-	"URL Mode": "Tryb adresu URL",
-	"Use '#' in the prompt input to load and include your knowledge.": "",
+	"Upload Pipeline": "Prześlij potok",
+	"Upload Progress": "Postęp przesyłania plików",
+	"URL": "Adres URL",
+	"URL Mode": "Tryb URL",
+	"Use '#' in the prompt input to load and include your knowledge.": "Użyj '#' w polu wprowadzania zapytania, aby załadować i uwzględnić swoją wiedzę.",
 	"Use Gravatar": "Użyj Gravatara",
-	"Use groups to group your users and assign permissions.": "",
+	"Use groups to group your users and assign permissions.": "Wykorzystaj grupy do grupowania użytkowników i przypisywania uprawnień.",
 	"Use Initials": "Użyj inicjałów",
-	"use_mlock (Ollama)": "use_mlock (Ollama)",
-	"use_mmap (Ollama)": "use_mmap (Ollama)",
+	"use_mlock (Ollama)": "użyj_mlock (Ollama)",
+	"use_mmap (Ollama)": "użyj_mmap (Ollama)",
 	"user": "użytkownik",
-	"User": "",
-	"User location successfully retrieved.": "",
-	"Username": "",
+	"User": "Użytkownik",
+	"User location successfully retrieved.": "Lokalizacja użytkownika została pomyślnie pobrana.",
+	"Username": "Nazwa użytkownika",
 	"Users": "Użytkownicy",
-	"Using the default arena model with all models. Click the plus button to add custom models.": "",
+	"Using the default arena model with all models. Click the plus button to add custom models.": "Korzystanie z domyślnego modelu areny ze wszystkimi modelami. Kliknij przycisk plus, aby dodać niestandardowe modele.",
 	"Utilize": "Wykorzystaj",
-	"Valid time units:": "Poprawne jednostki czasu:",
-	"Valves": "",
-	"Valves updated": "",
-	"Valves updated successfully": "",
+	"Valid time units:": "Dozwolone jednostki czasu:",
+	"Valves": "Zawory",
+	"Valves updated": "Zawory zaktualizowane",
+	"Valves updated successfully": "Zawory zaktualizowane pomyślnie",
 	"variable": "zmienna",
-	"variable to have them replaced with clipboard content.": "zmienna która zostanie zastąpiona zawartością schowka.",
+	"variable to have them replaced with clipboard content.": "Zmienna, która ma zostać zastąpiona zawartością schowka.",
 	"Version": "Wersja",
-	"Version {{selectedVersion}} of {{totalVersions}}": "",
-	"View Replies": "",
-	"Visibility": "",
-	"Voice": "",
-	"Voice Input": "",
-	"Warning": "Ostrzeżenie",
-	"Warning:": "",
-	"Warning: Enabling this will allow users to upload arbitrary code on the server.": "",
-	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Uwaga: Jeśli uaktualnisz lub zmienisz model osadzania, będziesz musiał ponownie zaimportować wszystkie dokumenty.",
-	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
-	"Web": "Sieć",
-	"Web API": "",
-	"Web Loader Settings": "Ustawienia pobierania z sieci",
-	"Web Search": "Wyszukiwarka w Internecie",
-	"Web Search Engine": "Wyszukiwarka internetowa",
-	"Web Search in Chat": "",
-	"Web Search Query Generation": "",
-	"Webhook URL": "URL webhook",
+	"Version {{selectedVersion}} of {{totalVersions}}": "Wersja {{selectedVersion}} z {{totalVersions}}",
+	"View Replies": "Wyświetl odpowiedzi",
+	"Visibility": "Widoczność",
+	"Voice": "Głos",
+	"Voice Input": "Wprowadzanie głosowe",
+	"Warning": "Uwaga",
+	"Warning:": "Uwaga:",
+	"Warning: Enabling this will allow users to upload arbitrary code on the server.": "Uwaga: Włączenie tego pozwoli użytkownikom na przesyłanie dowolnego kodu na serwer.",
+	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Uwaga: W przypadku aktualizacji lub zmiany modelu osadzania, konieczne będzie ponowne zaimportowanie wszystkich dokumentów.",
+	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Uwaga: Uruchamianie Jupytera umożliwia wykonywanie dowolnego kodu, co stwarza poważne zagrożenia dla bezpieczeństwa – postępuj z ekstremalną ostrożnością.",
+	"Web": "Sieć internetowa",
+	"Web API": "Interfejs API sieci web",
+	"Web Loader Settings": "Ustawienia ładowania strony",
+	"Web Search": "Wyszukiwarka internetowa",
+	"Web Search Engine": "Wyszukiwarka sieciowa",
+	"Web Search in Chat": "Wyszukiwanie w sieci Web w czacie",
+	"Web Search Query Generation": "Generowanie Zapytań Wyszukiwania Sieciowego",
+	"Webhook URL": "Adres URL webhooka",
 	"WebUI Settings": "Ustawienia interfejsu WebUI",
-	"WebUI URL": "",
-	"WebUI will make requests to \"{{url}}/api/chat\"": "",
-	"WebUI will make requests to \"{{url}}/chat/completions\"": "",
-	"What are you trying to achieve?": "",
-	"What are you working on?": "",
+	"WebUI URL": "Adres URL interfejsu internetowego",
+	"WebUI will make requests to \"{{url}}/api/chat\"": "WebUI będzie wysyłać żądania do \"{{url}}/api/chat\".",
+	"WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI będzie wysyłać żądania do \"{{url}}/chat/completions\".",
+	"What are you trying to achieve?": "Do czego dążysz?",
+	"What are you working on?": "Nad czym pracujesz?",
 	"What’s New in": "Co nowego w",
-	"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": "",
-	"Whisper (Local)": "",
-	"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. (Default: 0.9)": "",
+	"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "Gdy jest włączony, model będzie reagował na każdą wiadomość czatu w czasie rzeczywistym, generując odpowiedź tak szybko, jak użytkownik wyśle wiadomość. Ten tryb jest przydatny dla aplikacji czatu na żywo, ale może wpływać na wydajność na wolniejszym sprzęcie.",
+	"wherever you are": "gdziekolwiek jesteś",
+	"Whisper (Local)": "Szept (Lokalny)",
+	"Why?": "Dlaczego?",
+	"Widescreen Mode": "Tryb panoramiczny",
+	"Won": "Wygrał",
+	"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. (Default: 0.9)": "Działa razem z top-k. Wyższa wartość (np. 0,95) prowadzi do bardziej zróżnicowanego tekstu, podczas gdy niższa wartość (np. 0,5) generuje bardziej skoncentrowany i konserwatywny tekst. (Domyślnie: 0,9)",
 	"Workspace": "Obszar roboczy",
-	"Workspace Permissions": "",
-	"Write": "",
-	"Write a prompt suggestion (e.g. Who are you?)": "Napisz sugestię do polecenia (np. Kim jesteś?)",
-	"Write a summary in 50 words that summarizes [topic or keyword].": "Napisz podsumowanie w 50 słowach, które podsumowuje [temat lub słowo kluczowe].",
-	"Write something...": "",
-	"Write your model template content here": "",
+	"Workspace Permissions": "Uprawnienia do przestrzeni roboczej",
+	"Write": "Napisz",
+	"Write a prompt suggestion (e.g. Who are you?)": "Podaj przykładową sugestię dla polecenia (np. Kto jesteś?)",
+	"Write a summary in 50 words that summarizes [topic or keyword].": "Napisz krótkie podsumowanie w maksymalnie 50 słowach, które streszcza [temat lub słowo kluczowe].",
+	"Write something...": "Napisz coś...",
+	"Write your model template content here": "Napisz tutaj zawartość szablonu modelu",
 	"Yesterday": "Wczoraj",
 	"You": "Ty",
-	"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "",
-	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
-	"You cannot upload an empty file.": "",
-	"You do not have permission to access this feature.": "",
-	"You do not have permission to upload files": "",
-	"You do not have permission to upload files.": "",
-	"You have no archived conversations.": "Nie masz zarchiwizowanych rozmów.",
-	"You have shared this chat": "Udostępniłeś ten czat",
+	"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Możesz rozmawiać jednocześnie maksymalnie z {{maxCount}} plikiem(i).",
+	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Możesz spersonalizować swoje interakcje z LLM, dodając wspomnienia za pomocą przycisku 'Zarządzaj' poniżej, dzięki czemu będą one bardziej pomocne i dostosowane do Ciebie.",
+	"You cannot upload an empty file.": "Nie możesz przesłać pustego pliku.",
+	"You do not have permission to access this feature.": "Nie masz uprawnień do korzystania z tej funkcji.",
+	"You do not have permission to upload files": "Nie masz uprawnień do przesyłania plików.",
+	"You do not have permission to upload files.": "Nie masz uprawnień do przesyłania plików.",
+	"You have no archived conversations.": "Nie posiadasz zarchiwizowanych konwersacji.",
+	"You have shared this chat": "Udostępniłeś tę rozmowę",
 	"You're a helpful assistant.": "Jesteś pomocnym asystentem.",
 	"You're now logged in.": "Jesteś teraz zalogowany.",
-	"Your account status is currently pending activation.": "",
-	"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.": "",
+	"Your account status is currently pending activation.": "Twoje konto oczekuje obecnie na aktywację.",
+	"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "Cała Twoja wpłata trafi bezpośrednio do dewelopera wtyczki; Open WebUI nie pobiera żadnej prowizji. Należy jednak pamiętać, że wybrana platforma finansowania może mieć własne opłaty.",
 	"Youtube": "Youtube",
-	"Youtube Loader Settings": "Ustawienia pobierania z Youtube"
+	"Youtube Loader Settings": "Ustawienia ładowania z YouTube"
 }

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

@@ -182,6 +182,7 @@
 	"Code execution": "Execução de código",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Código formatado com sucesso",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "Empate",
 	"Drop any files here to add to the conversation": "Solte qualquer arquivo aqui para adicionar à conversa",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "por exemplo, '30s', '10m'. Unidades de tempo válidas são 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "Exemplo: Um filtro para remover palavrões do texto",
 	"e.g. My Filter": "Exemplo: Meu Filtro",
 	"e.g. My Tools": "Exemplo: Minhas Ferramentas",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Digite a Chave API do Tavily",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "Digite a URL do Servidor Tika",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Digite o Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Digite a URL (por exemplo, http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Digite a URL (por exemplo, http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Funções permitem a execução arbitrária de código",
 	"Functions allow arbitrary code execution.": "Funções permitem a execução arbitrária de código.",
 	"Functions imported successfully": "Funções importadas com sucesso",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Geral",
 	"General Settings": "Configurações Gerais",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "Largue os ficheiros aqui para adicionar à conversa",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "por exemplo, '30s', '10m'. Unidades de tempo válidas são 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Escreva o Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Escreva o URL (por exemplo, http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Escreva o URL (por exemplo, http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Geral",
 	"General Settings": "Configurações Gerais",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "Executarea codului",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Cod formatat cu succes",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "Desenează",
 	"Drop any files here to add to the conversation": "Plasează orice fișiere aici pentru a le adăuga la conversație",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "de ex. '30s', '10m'. Unitățile de timp valide sunt 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Introduceți Cheia API Tavily",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "Introduceți URL-ul Serverului Tika",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Introduceți Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Introduceți URL-ul (de ex. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Introduceți URL-ul (de ex. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Funcțiile permit executarea arbitrară a codului",
 	"Functions allow arbitrary code execution.": "Funcțiile permit executarea arbitrară a codului.",
 	"Functions imported successfully": "Funcțiile au fost importate cu succes",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "General",
 	"General Settings": "Setări Generale",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "Выполнение кода",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Код успешно отформатирован",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "Рисовать",
 	"Drop any files here to add to the conversation": "Перетащите сюда файлы, чтобы добавить их в разговор",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "например, '30s','10m'. Допустимые единицы времени: 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Введите ключ API Tavily",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "Введите URL-адрес сервера Tika",
+	"Enter timeout in seconds": "",
 	"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)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Функции позволяют выполнять произвольный код",
 	"Functions allow arbitrary code execution.": "Функции позволяют выполнять произвольный код.",
 	"Functions imported successfully": "Функции успешно импортированы",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Общее",
 	"General Settings": "Общие настройки",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "Vykonávanie kódu",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Kód bol úspešne naformátovaný.",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "Nakresliť",
 	"Drop any files here to add to the conversation": "Sem presuňte akékoľvek súbory, ktoré chcete pridať do konverzácie",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "napr. '30s','10m'. Platné časové jednotky sú 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Zadajte API kľúč Tavily",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "Zadajte URL servera Tika",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Zadajte horné K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Zadajte URL (napr. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Zadajte URL (napr. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Funkcie umožňujú vykonávať ľubovoľný kód.",
 	"Functions allow arbitrary code execution.": "Funkcie umožňujú vykonávanie ľubovoľného kódu.",
 	"Functions imported successfully": "Funkcie boli úspešne importované",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Všeobecné",
 	"General Settings": "Všeobecné nastavenia",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "Извршавање кода",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Код форматиран успешно",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "Нацртај",
 	"Drop any files here to add to the conversation": "Убаците било које датотеке овде да их додате у разговор",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "нпр. '30s', '10m'. Важеће временске јединице су 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Унесите Топ К",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Унесите адресу (нпр. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Унесите адресу (нпр. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Опште",
 	"General Settings": "Општа подешавања",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "Släpp filer här för att lägga till i samtalet",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "t.ex. '30s', '10m'. Giltiga tidsenheter är 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Ange Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Ange URL (t.ex. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Ange URL (t.ex. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Allmän",
 	"General Settings": "Allmänna inställningar",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "จัดรูปแบบโค้ดสำเร็จแล้ว",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "วางไฟล์ใดๆ ที่นี่เพื่อเพิ่มในการสนทนา",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "เช่น '30s', '10m' หน่วยเวลาที่ถูกต้องคือ 's', 'm', 'h'",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "ใส่คีย์ API ของ Tavily",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "ใส่ URL เซิร์ฟเวอร์ของ Tika",
+	"Enter timeout in seconds": "",
 	"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)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "ฟังก์ชันอนุญาตการเรียกใช้โค้ดโดยพลการ",
 	"Functions allow arbitrary code execution.": "ฟังก์ชันอนุญาตการเรียกใช้โค้ดโดยพลการ",
 	"Functions imported successfully": "นำเข้าฟังก์ชันสำเร็จ",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "ทั่วไป",
 	"General Settings": "การตั้งค่าทั่วไป",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "",
 	"Enter URL (e.g. http://localhost:11434)": "",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "",
 	"Functions allow arbitrary code execution.": "",
 	"Functions imported successfully": "",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "",
 	"General Settings": "",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "Kod yürütme",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Kod başarıyla biçimlendirildi",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "Çiz",
 	"Drop any files here to add to the conversation": "Sohbete eklemek istediğiniz dosyaları buraya bırakın",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "örn. '30s', '10m'. Geçerli zaman birimleri 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "örn. Metinden küfürleri kaldırmak için bir filtre",
 	"e.g. My Filter": "örn. Benim Filtrem",
 	"e.g. My Tools": "örn. Benim Araçlarım",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Tavily API Anahtarını Girin",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "Tika Sunucu URL'sini Girin",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Top K'yı girin",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "URL'yi Girin (örn. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "URL'yi Girin (e.g. http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Fonksiyonlar keyfi kod yürütülmesine izin verir",
 	"Functions allow arbitrary code execution.": "Fonksiyonlar keyfi kod yürütülmesine izin verir.",
 	"Functions imported successfully": "Fonksiyonlar başarıyla içe aktarıldı",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Genel",
 	"General Settings": "Genel Ayarlar",
 	"Generate an image": "",

+ 6 - 0
src/lib/i18n/locales/uk-UA/translation.json

@@ -182,6 +182,7 @@
 	"Code execution": "Виконання коду",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Код успішно відформатовано",
 	"Code Interpreter": "Інтерпретатор коду",
 	"Code Interpreter Engine": "Двигун інтерпретатора коду",
@@ -321,6 +322,7 @@
 	"Draw": "Малювати",
 	"Drop any files here to add to the conversation": "Перетягніть сюди файли, щоб додати до розмови",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "напр., '30s','10m'. Дійсні одиниці часу: 'с', 'хв', 'г'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "напр., фільтр для видалення нецензурної лексики з тексту",
 	"e.g. My Filter": "напр., Мій фільтр",
 	"e.g. My Tools": "напр., Мої інструменти",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Введіть ключ API Tavily",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Введіть публічний URL вашого WebUI. Цей URL буде використовуватися для генерування посилань у сповіщеннях.",
 	"Enter Tika Server URL": "Введіть URL-адресу сервера Tika ",
+	"Enter timeout in seconds": "",
 	"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)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Функції дозволяють виконання довільного коду",
 	"Functions allow arbitrary code execution.": "Функції дозволяють виконання довільного коду.",
 	"Functions imported successfully": "Функції успішно імпортовано",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Загальні",
 	"General Settings": "Загальні налаштування",
 	"Generate an image": "Згенерувати зображення",

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

@@ -182,6 +182,7 @@
 	"Code execution": "کوڈ کا نفاذ",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "کوڈ کامیابی سے فارمیٹ ہو گیا",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "ڈرائنگ کریں",
 	"Drop any files here to add to the conversation": "گفتگو میں شامل کرنے کے لیے کوئی بھی فائل یہاں چھوڑیں",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "مثلاً '30s'، '10m' درست وقت کی اکائیاں ہیں 's'، 'm'، 'h'",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Tavily API کلید درج کریں",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "ٹیکا سرور یو آر ایل درج کریں",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "اوپر کے K درج کریں",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "یو آر ایل درج کریں (جیسے کہ http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "یو آر ایل درج کریں (مثلاً http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "فنکشنز کوڈ کے بلاواسطہ نفاذ کی اجازت دیتے ہیں",
 	"Functions allow arbitrary code execution.": "افعال صوابدیدی کوڈ کے اجرا کی اجازت دیتے ہیں",
 	"Functions imported successfully": "فنکشنز کامیابی سے درآمد ہو گئے ہیں",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "عمومی",
 	"General Settings": "عمومی ترتیبات",
 	"Generate an image": "",

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

@@ -182,6 +182,7 @@
 	"Code execution": "",
 	"Code Execution": "",
 	"Code Execution Engine": "",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "Mã được định dạng thành công",
 	"Code Interpreter": "",
 	"Code Interpreter Engine": "",
@@ -321,6 +322,7 @@
 	"Draw": "",
 	"Drop any files here to add to the conversation": "Thả bất kỳ tệp nào ở đây để thêm vào nội dung chat",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "vd: '30s','10m'. Đơn vị thời gian hợp lệ là 's', 'm', 'h'.",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "",
 	"e.g. My Filter": "",
 	"e.g. My Tools": "",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "Nhập Tavily API Key",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
 	"Enter Tika Server URL": "Nhập URL cho  Tika Server",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "Nhập Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Nhập URL (vd: http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Nhập URL (vd: http://localhost:11434)",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "Các Function cho phép thực thi mã tùy ý",
 	"Functions allow arbitrary code execution.": "Các Function cho phép thực thi mã tùy ý.",
 	"Functions imported successfully": "Các function đã được nạp thành công",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "Cài đặt chung",
 	"General Settings": "Cấu hình chung",
 	"Generate an image": "",

+ 36 - 30
src/lib/i18n/locales/zh-CN/translation.json

@@ -20,7 +20,7 @@
 	"Account Activation Pending": "账号待激活",
 	"Accurate information": "提供的信息很准确",
 	"Actions": "自动化",
-	"Activate": "",
+	"Activate": "激活",
 	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "通过输入 \"/{{COMMAND}}\" 激活此命令",
 	"Active Users": "当前在线用户",
 	"Add": "添加",
@@ -100,7 +100,7 @@
 	"Audio": "语音",
 	"August": "八月",
 	"Authenticate": "认证",
-	"Authentication": "",
+	"Authentication": "身份验证",
 	"Auto-Copy Response to Clipboard": "自动复制回复到剪贴板",
 	"Auto-playback response": "自动念出回复内容",
 	"Autocomplete Generation": "输入框内容猜测补全",
@@ -167,7 +167,7 @@
 	"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 see available models.": "单击此处查看可用型。",
+	"Click here to see available models.": "单击此处查看可用型。",
 	"Click here to select": "点击这里选择",
 	"Click here to select a csv file.": "点击此处选择 csv 文件。",
 	"Click here to select a py file.": "点击此处选择 py 文件。",
@@ -180,12 +180,13 @@
 	"Clone of {{TITLE}}": "{{TITLE}} 的副本",
 	"Close": "关闭",
 	"Code execution": "代码执行",
-	"Code Execution": "",
-	"Code Execution Engine": "",
+	"Code Execution": "代码执行",
+	"Code Execution Engine": "代码执行引擎",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "代码格式化成功",
 	"Code Interpreter": "代码解释器",
 	"Code Interpreter Engine": "代码解释引擎",
-	"Code Interpreter Prompt Template": "代码解释器提示模板",
+	"Code Interpreter Prompt Template": "代码解释器提示模板",
 	"Collection": "文件集",
 	"Color": "颜色",
 	"ComfyUI": "ComfyUI",
@@ -202,7 +203,7 @@
 	"Confirm Password": "确认密码",
 	"Confirm your action": "确定吗?",
 	"Confirm your new password": "确认新密码",
-	"Connect to your own OpenAI compatible API endpoints.": "连接到您自己的 OpenAI 兼容 API 端点。",
+	"Connect to your own OpenAI compatible API endpoints.": "连接到你自己的与 OpenAI 兼容的 API 接口端点。",
 	"Connections": "外部连接",
 	"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "限制推理模型的推理努力。仅适用于支持推理努力的特定提供商的推理模型。(默认值:中等)",
 	"Contact Admin for WebUI Access": "请联系管理员以获取访问权限",
@@ -214,7 +215,7 @@
 	"Continue with 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 请求。“Punctuation”拆分为句子,“paragraphs”拆分为段落,“none”将消息保留为单个字符串。",
-	"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. (Default: 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. (Default: 1.1)": "控制生成文本中 Token 的重复。较高的值(例如 1.5)会更强烈地惩罚重复,而较低的值(例如 1.1)则更宽松。设置为 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. (Default: 5.0)": "控制输出的连贯性和多样性之间的平衡。较低的值将导致更集中和连贯的文本。(默认值:5.0)",
 	"Copied": "已复制",
@@ -270,7 +271,7 @@
 	"Delete folder?": "删除分组?",
 	"Delete function?": "删除函数?",
 	"Delete Message": "删除消息",
-	"Delete message?": "",
+	"Delete message?": "删除消息?",
 	"Delete prompt?": "删除提示词?",
 	"delete this link": "此处删除这个链接",
 	"Delete tool?": "删除工具?",
@@ -282,14 +283,14 @@
 	"Description": "描述",
 	"Didn't fully follow instructions": "没有完全遵照指示",
 	"Direct Connections": "直接连接",
-	"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "直接连接允许用户连接到他们自己的与 OpenAI 兼容的 API 端点。",
+	"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "直接连接功能允许用户连接至其自有的、兼容 OpenAI 的 API 端点。",
 	"Direct Connections settings updated": "直接连接设置已更新",
 	"Disabled": "禁用",
 	"Discover a function": "发现更多函数",
 	"Discover a model": "发现更多模型",
 	"Discover a prompt": "发现更多提示词",
 	"Discover a tool": "发现更多工具",
-	"Discover how to use Open WebUI and seek support from the community.": "",
+	"Discover how to use Open WebUI and seek support from the community.": "了解如何使用 Open WebUI 并寻求社区支持。",
 	"Discover wonders": "发现奇迹",
 	"Discover, download, and explore custom functions": "发现、下载并探索更多函数",
 	"Discover, download, and explore custom prompts": "发现、下载并探索更多自定义提示词",
@@ -314,13 +315,14 @@
 	"Don't like the style": "不喜欢这个文风",
 	"Done": "完成",
 	"Download": "下载",
-	"Download as SVG": "",
+	"Download as SVG": "下载为 SVG",
 	"Download canceled": "下载已取消",
 	"Download Database": "下载数据库",
 	"Drag and drop a file to upload or select a file to view": "拖动文件上传或选择文件查看",
 	"Draw": "平局",
 	"Drop any files here to add to the conversation": "拖动文件到此处以添加到对话中",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "例如 '30s','10m'。有效的时间单位是秒:'s',分:'m',时:'h'。",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "例如:一个用于过滤文本中不当内容的过滤器",
 	"e.g. My Filter": "例如:我的过滤器",
 	"e.g. My Tools": "例如:我的工具",
@@ -370,7 +372,7 @@
 	"Enter Chunk Overlap": "输入块重叠 (Chunk Overlap)",
 	"Enter Chunk Size": "输入块大小 (Chunk Size)",
 	"Enter description": "输入简介描述",
-	"Enter domains separated by commas (e.g., example.com,site.org)": "输入以逗号分隔的域名(例如:example.com,site.org)",
+	"Enter domains separated by commas (e.g., example.com,site.org)": "输入以逗号分隔的域名(例如:example.comsite.org)",
 	"Enter Exa API Key": "输入 Exa API 密钥",
 	"Enter Github Raw URL": "输入 Github Raw 地址",
 	"Enter Google PSE API Key": "输入 Google PSE API 密钥",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "输入 Tavily API 密钥",
 	"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 服务器地址",
+	"Enter timeout in seconds": "",
 	"Enter Top K": "输入 Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "输入地址 (例如:http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "输入地址 (例如:http://localhost:11434)",
@@ -455,7 +458,7 @@
 	"Failed to save models configuration": "无法保存模型配置",
 	"Failed to update settings": "无法更新设置",
 	"Failed to upload file.": "上传文件失败",
-	"Features": "",
+	"Features": "功能",
 	"Features Permissions": "功能权限",
 	"February": "二月",
 	"Feedback History": "反馈历史",
@@ -485,7 +488,7 @@
 	"Form": "手动创建",
 	"Format your variables using brackets like this:": "使用括号格式化你的变量,如下所示:",
 	"Frequency Penalty": "频率惩罚",
-	"Full Context Mode": "",
+	"Full Context Mode": "完整上下文模式",
 	"Function": "函数",
 	"Function Calling": "函数调用 (Function Calling)",
 	"Function created successfully": "函数创建成功",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "注意:函数有权执行任意代码",
 	"Functions allow arbitrary code execution.": "注意:函数有权执行任意代码。",
 	"Functions imported successfully": "函数导入成功",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "通用",
 	"General Settings": "通用设置",
 	"Generate an image": "生成图像",
@@ -601,7 +607,7 @@
 	"Leave empty to include all models or select specific models": "留空表示包含所有模型或请选择模型",
 	"Leave empty to use the default prompt, or enter a custom prompt": "留空以使用默认提示词,或输入自定义提示词。",
 	"Leave model field empty to use the default model.": "将模型字段留空以使用默认模型。",
-	"License": "",
+	"License": "授权",
 	"Light": "浅色",
 	"Listening...": "正在倾听...",
 	"Llama.cpp": "Llama.cpp",
@@ -761,7 +767,7 @@
 	"Playground": "AI 对话游乐场",
 	"Please carefully review the following warnings:": "请仔细阅读以下警告信息:",
 	"Please do not close the settings page while loading the model.": "加载模型时请不要关闭设置页面。",
-	"Please enter a prompt": "请输一个 Prompt",
+	"Please enter a prompt": "请输一个 Prompt",
 	"Please fill in all fields.": "请填写所有字段。",
 	"Please select a model first.": "请先选择一个模型。",
 	"Please select a model.": "请选择一个模型。",
@@ -770,7 +776,7 @@
 	"Positive attitude": "积极的态度",
 	"Prefix ID": "Prefix ID",
 	"Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "Prefix ID 用于通过为模型 ID 添加前缀来避免与其他连接发生冲突 - 留空则禁用此功能",
-	"Presence Penalty": "",
+	"Presence Penalty": "重复惩罚(Presence Penalty)",
 	"Previous 30 days": "过去 30 天",
 	"Previous 7 days": "过去 7 天",
 	"Profile Image": "用户头像",
@@ -807,7 +813,7 @@
 	"Rename": "重命名",
 	"Reorder Models": "重新排序模型",
 	"Repeat Last N": "重复最后 N 次",
-	"Repeat Penalty (Ollama)": "",
+	"Repeat Penalty (Ollama)": "重复惩罚(Ollama)",
 	"Reply in Thread": "在主题中回复",
 	"Request Mode": "请求模式",
 	"Reranking Model": "重排模型",
@@ -870,7 +876,7 @@
 	"Select a pipeline": "选择一个管道",
 	"Select a pipeline url": "选择一个管道 URL",
 	"Select a tool": "选择一个工具",
-	"Select an auth method": "选择身份验证方",
+	"Select an auth method": "选择身份验证方",
 	"Select an Ollama instance": "选择一个 Ollama 实例。",
 	"Select Engine": "选择引擎",
 	"Select Knowledge": "选择知识",
@@ -904,10 +910,10 @@
 	"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "设置用于计算的工作线程数量。该选项可控制并发处理传入请求的线程数量。增加该值可以提高高并发工作负载下的性能,但也可能消耗更多的 CPU 资源。",
 	"Set Voice": "设置音色",
 	"Set whisper model": "设置 whisper 模型",
-	"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. (Default: 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. (Default: 1.1)": "",
+	"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. (Default: 0)": "这个设置项用于调整对重复 tokens 的抑制强度。当某个 token 至少出现过一次后,系统会通过 flat bias 参数施加惩罚力度:数值越大(如 1.5),抑制重复的效果越强烈;数值较小(如 0.9)则相对宽容。当设为 0 时,系统会完全关闭这个重复抑制功能(默认值为 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. (Default: 1.1)": "这个参数用于通过 scaling bias 机制抑制重复内容:当某些 tokens 重复出现时,系统会根据它们已出现的次数自动施加惩罚。数值越大(如 1.5)惩罚力度越强,能更有效减少重复;数值较小(如 0.9)则允许更多重复。当设为 0 时完全关闭该功能,默认值设置为 1.1 保持适度抑制。",
 	"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "设置模型回溯多远以防止重复。(默认值:64,0 = 禁用,-1 = num_ctx)",
-	"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. (Default: random)": "设置生成文本时使用的随机数种子。将其设置为一个特定的数字将使模型在同一提示下生成相同的文本。 默认值:随机",
+	"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. (Default: random)": "设置 random number seed 可以控制模型生成文本的随机起点。如果指定一个具体数字,当输入相同的提示语时,模型每次都会生成完全相同的文本内容(默认是随机选取 seed)。",
 	"Sets the size of the context window used to generate the next token. (Default: 2048)": "设置用于生成下一个 Token 的上下文大小。(默认值:2048)",
 	"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": "设置",
@@ -952,7 +958,7 @@
 	"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. (default: 1)": "Tail free sampling 用于减少输出中可能性较低的标记的影响。数值越大(如 2.0),影响就越小,而数值为 1.0 则会禁用此设置。(默认值:1)",
 	"Tap to interrupt": "点击以中断",
-	"Tasks": "",
+	"Tasks": "任务",
 	"Tavily API Key": "Tavily API 密钥",
 	"Tell us more:": "请告诉我们更多细节",
 	"Temperature": "温度 (Temperature)",
@@ -975,7 +981,7 @@
 	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "分值应介于 0.0(0%)和 1.0(100%)之间。",
 	"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "模型的温度。提高温度将使模型更具创造性地回答。(默认值:0.8)",
 	"Theme": "主题",
-	"Thinking...": "正在思考...",
+	"Thinking...": "正在深度思考...",
 	"This action cannot be undone. Do you wish to continue?": "此操作无法撤销。是否确认继续?",
 	"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.": "这是一个实验功能,可能不会如预期那样工作,而且可能随时发生变化。",
@@ -989,8 +995,8 @@
 	"This will delete all models including custom models and cannot be undone.": "这将删除所有模型,包括自定义模型,且无法撤销。",
 	"This will reset the knowledge base and sync all files. Do you wish to continue?": "这将重置知识库并替换所有文件为目录下文件。确认继续?",
 	"Thorough explanation": "解释较为详细",
-	"Thought for {{DURATION}}": "已推理 持续 {{DURATION}}",
-	"Thought for {{DURATION}} seconds": "已推理 持续 {{DURATION}} 秒",
+	"Thought for {{DURATION}}": "已深度思考 用时 {{DURATION}}",
+	"Thought for {{DURATION}} seconds": "已深度思考 用时 {{DURATION}} 秒",
 	"Tika": "Tika",
 	"Tika Server URL required.": "请输入 Tika 服务器地址。",
 	"Tiktoken": "Tiktoken",
@@ -1011,7 +1017,7 @@
 	"To select actions here, add them to the \"Functions\" workspace first.": "要在这里选择自动化,请先将其添加到工作空间中的“函数”。",
 	"To select filters here, add them to the \"Functions\" workspace first.": "要在这里选择过滤器,请先将其添加到工作空间中的“函数”。",
 	"To select toolkits here, add them to the \"Tools\" workspace first.": "要在这里选择工具包,请先将其添加到工作空间中的“工具”。",
-	"Toast notifications for new updates": "新更新的弹窗提示",
+	"Toast notifications for new updates": "更新后弹窗提示更新内容",
 	"Today": "今天",
 	"Toggle settings": "切换设置",
 	"Toggle sidebar": "切换侧边栏",
@@ -1056,7 +1062,7 @@
 	"Updated": "已更新",
 	"Updated at": "更新于",
 	"Updated At": "更新于",
-	"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.": "升级到授权计划以获得增强功能,包括自定义主题与品牌以及专属支持。",
 	"Upload": "上传",
 	"Upload a GGUF model": "上传一个 GGUF 模型",
 	"Upload directory": "上传目录",
@@ -1095,7 +1101,7 @@
 	"Warning:": "警告:",
 	"Warning: Enabling this will allow users to upload arbitrary code on the server.": "警告:启用此功能将允许用户在服务器上上传任意代码。",
 	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "警告:如果您修改了语义向量模型,则需要重新导入所有文档。",
-	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
+	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "警告:Jupyter 执行允许任意代码执行,存在严重的安全风险——请极其谨慎地操作。",
 	"Web": "网页",
 	"Web API": "网页 API",
 	"Web Loader Settings": "网页爬取设置",

+ 26 - 20
src/lib/i18n/locales/zh-TW/translation.json

@@ -20,7 +20,7 @@
 	"Account Activation Pending": "帳號待啟用",
 	"Accurate information": "準確資訊",
 	"Actions": "動作",
-	"Activate": "",
+	"Activate": "啟用",
 	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "在對話輸入框中輸入 \"/{{COMMAND}}\" 來啟用此命令。",
 	"Active Users": "活躍使用者",
 	"Add": "新增",
@@ -100,7 +100,7 @@
 	"Audio": "音訊",
 	"August": "8 月",
 	"Authenticate": "驗證",
-	"Authentication": "",
+	"Authentication": "驗證",
 	"Auto-Copy Response to Clipboard": "自動將回應複製到剪貼簿",
 	"Auto-playback response": "自動播放回應",
 	"Autocomplete Generation": "自動完成生成",
@@ -180,8 +180,9 @@
 	"Clone of {{TITLE}}": "{{TITLE}} 的副本",
 	"Close": "關閉",
 	"Code execution": "程式碼執行",
-	"Code Execution": "",
-	"Code Execution Engine": "",
+	"Code Execution": "程式碼執行",
+	"Code Execution Engine": "程式碼執行引擎",
+	"Code Execution Timeout": "",
 	"Code formatted successfully": "程式碼格式化成功",
 	"Code Interpreter": "程式碼解釋器",
 	"Code Interpreter Engine": "程式碼解釋器引擎",
@@ -214,7 +215,7 @@
 	"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. (Default: 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. (Default: 1.1)": "控制在生成文本中 token 序列的重複程度。 數值越高(例如 1.5)將會更強烈地懲罰重複,而數值越低(例如 1.1)則會較為寬鬆。 若數值為 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. (Default: 5.0)": "控制輸出的連貫性和多樣性之間的平衡。較低的值會產生更專注和連貫的文字。(預設:5.0)",
 	"Copied": "已複製",
@@ -269,8 +270,8 @@
 	"Delete chat?": "刪除對話紀錄?",
 	"Delete folder?": "刪除資料夾?",
 	"Delete function?": "刪除函式?",
-	"Delete Message": "刪除訊息",
-	"Delete message?": "",
+	"Delete Message": "刪除訊息",
+	"Delete message?": "刪除訊息?",
 	"Delete prompt?": "刪除提示詞?",
 	"delete this link": "刪除此連結",
 	"Delete tool?": "刪除工具?",
@@ -289,7 +290,7 @@
 	"Discover a model": "發掘模型",
 	"Discover a prompt": "發掘提示詞",
 	"Discover a tool": "發掘工具",
-	"Discover how to use Open WebUI and seek support from the community.": "",
+	"Discover how to use Open WebUI and seek support from the community.": "探索如何使用 Open WebUI 並從社群尋求支援。",
 	"Discover wonders": "發掘奇蹟",
 	"Discover, download, and explore custom functions": "發掘、下載及探索自訂函式",
 	"Discover, download, and explore custom prompts": "發掘、下載及探索自訂提示詞",
@@ -314,13 +315,14 @@
 	"Don't like the style": "不喜歡這個樣式",
 	"Done": "完成",
 	"Download": "下載",
-	"Download as SVG": "",
+	"Download as SVG": "以 SVG 格式下載",
 	"Download canceled": "已取消下載",
 	"Download Database": "下載資料庫",
 	"Drag and drop a file to upload or select a file to view": "拖放檔案以上傳或選擇檔案以檢視",
 	"Draw": "繪製",
 	"Drop any files here to add to the conversation": "拖拽任意檔案到此處以新增至對話",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "例如:'30s'、'10m'。有效的時間單位為 's'、'm'、'h'。",
+	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "例如:從文字中移除髒話的篩選器",
 	"e.g. My Filter": "例如:我的篩選器",
 	"e.g. My Tools": "例如:我的工具",
@@ -408,6 +410,7 @@
 	"Enter Tavily API Key": "輸入 Tavily API 金鑰",
 	"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 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)",
@@ -455,7 +458,7 @@
 	"Failed to save models configuration": "儲存模型設定失敗",
 	"Failed to update settings": "更新設定失敗",
 	"Failed to upload file.": "上傳檔案失敗。",
-	"Features": "",
+	"Features": "功能",
 	"Features Permissions": "功能權限",
 	"February": "2 月",
 	"Feedback History": "回饋歷史",
@@ -485,7 +488,7 @@
 	"Form": "表單",
 	"Format your variables using brackets like this:": "使用方括號格式化您的變數,如下所示:",
 	"Frequency Penalty": "頻率懲罰",
-	"Full Context Mode": "",
+	"Full Context Mode": "完整上下文模式",
 	"Function": "函式",
 	"Function Calling": "函式呼叫",
 	"Function created successfully": "成功建立函式",
@@ -500,6 +503,9 @@
 	"Functions allow arbitrary code execution": "函式允許執行任意程式碼",
 	"Functions allow arbitrary code execution.": "函式允許執行任意程式碼。",
 	"Functions imported successfully": "成功匯入函式",
+	"Gemini": "",
+	"Gemini API Config": "",
+	"Gemini API Key is required.": "",
 	"General": "一般",
 	"General Settings": "一般設定",
 	"Generate an image": "產生圖片",
@@ -601,7 +607,7 @@
 	"Leave empty to include all models or select specific models": "留空以包含所有模型或選擇特定模型",
 	"Leave empty to use the default prompt, or enter a custom prompt": "留空以使用預設提示詞,或輸入自訂提示詞",
 	"Leave model field empty to use the default model.": "留空模型欄位以使用預設模型。",
-	"License": "",
+	"License": "授權",
 	"Light": "淺色",
 	"Listening...": "正在聆聽...",
 	"Llama.cpp": "Llama.cpp",
@@ -770,7 +776,7 @@
 	"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 新增前綴以避免與其他連線衝突 - 留空以停用",
-	"Presence Penalty": "",
+	"Presence Penalty": "在場懲罰",
 	"Previous 30 days": "過去 30 天",
 	"Previous 7 days": "過去 7 天",
 	"Profile Image": "個人檔案圖片",
@@ -807,7 +813,7 @@
 	"Rename": "重新命名",
 	"Reorder Models": "重新排序模型",
 	"Repeat Last N": "重複最後 N 個",
-	"Repeat Penalty (Ollama)": "",
+	"Repeat Penalty (Ollama)": "重複懲罰 (Ollama)",
 	"Reply in Thread": "在討論串中回覆",
 	"Request Mode": "請求模式",
 	"Reranking Model": "重新排序模型",
@@ -904,8 +910,8 @@
 	"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "設定用於計算的工作執行緒數量。此選項控制使用多少執行緒來同時處理傳入的請求。增加此值可以在高併發工作負載下提升效能,但也可能消耗更多 CPU 資源。",
 	"Set Voice": "設定語音",
 	"Set whisper model": "設定 whisper 模型",
-	"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. (Default: 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. (Default: 1.1)": "",
+	"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. (Default: 0)": "針對至少出現一次的 token,設定固定的負面偏見。 數值越高(例如 1.5)將會更強烈地懲罰重複,而數值越低(例如 0.9)則會較為寬鬆。 若數值為 0,則停用此功能。(預設值: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. (Default: 1.1)": "針對 token 設定比例偏差以懲罰重複,其基於 token 出現的次數。 數值越高(例如 1.5)將會更強烈地懲罰重複,而數值越低(例如 0.9)則會較為寬鬆。 若數值為 0,則停用此功能。(預設值:1.1)",
 	"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "設定模型向後查看以防止重複的距離。(預設:64,0 = 停用,-1 = num_ctx)",
 	"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. (Default: random)": "設定用於生成的隨機數種子。將其設定為特定數字會使模型對相同的提示詞產生相同的文字。(預設:隨機)",
 	"Sets the size of the context window used to generate the next token. (Default: 2048)": "設定用於生成下一個 token 的上下文視窗大小。(預設:2048)",
@@ -952,7 +958,7 @@
 	"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. (default: 1)": "使用無尾採樣來減少較不可能的 token 對輸出的影響。較高的值(例如 2.0)會減少更多影響,而值為 1.0 則停用此設定。(預設:1)",
 	"Tap to interrupt": "點選以中斷",
-	"Tasks": "",
+	"Tasks": "任務",
 	"Tavily API Key": "Tavily API 金鑰",
 	"Tell us more:": "告訴我們更多:",
 	"Temperature": "溫度",
@@ -1056,7 +1062,7 @@
 	"Updated": "已更新",
 	"Updated at": "更新於",
 	"Updated At": "更新於",
-	"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.": "升級至授權方案以獲得更強大功能,包括客製化主題與品牌,和專屬支援。",
 	"Upload": "上傳",
 	"Upload a GGUF model": "上傳 GGUF 模型",
 	"Upload directory": "上傳目錄",
@@ -1095,7 +1101,7 @@
 	"Warning:": "警告:",
 	"Warning: Enabling this will allow users to upload arbitrary code on the server.": "警告:啟用此功能將允許使用者在伺服器上上傳任意程式碼。",
 	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "警告:如果您更新或更改嵌入模型,您將需要重新匯入所有文件。",
-	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
+	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "警告:Jupyter 執行允許任意程式碼執行,構成嚴重安全風險——請務必極度謹慎。",
 	"Web": "網頁",
 	"Web API": "網頁 API",
 	"Web Loader Settings": "網頁載入器設定",
@@ -1109,7 +1115,7 @@
 	"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 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": "無論您在何處",

+ 6 - 0
src/lib/utils/marked/katex-extension.ts

@@ -134,6 +134,9 @@ function inlineKatex(options) {
 		},
 		tokenizer(src, tokens) {
 			return katexTokenizer(src, tokens, false);
+		},
+		renderer(token) {
+			return `${token?.text ?? ''}`;
 		}
 	};
 }
@@ -147,6 +150,9 @@ function blockKatex(options) {
 		},
 		tokenizer(src, tokens) {
 			return katexTokenizer(src, tokens, true);
+		},
+		renderer(token) {
+			return `${token?.text ?? ''}`;
 		}
 	};
 }

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

@@ -28,6 +28,12 @@
 
 	let ldapUsername = '';
 
+	const querystringValue = (key) => {
+		const querystring = window.location.search;
+		const urlParams = new URLSearchParams(querystring);
+		return urlParams.get(key);
+	};
+
 	const setSessionUser = async (sessionUser) => {
 		if (sessionUser) {
 			console.log(sessionUser);
@@ -39,7 +45,9 @@
 			$socket.emit('user-join', { auth: { token: sessionUser.token } });
 			await user.set(sessionUser);
 			await config.set(await getBackendConfig());
-			goto('/');
+
+			const redirectPath = querystringValue('redirect') || '/';
+			goto(redirectPath);
 		}
 	};
 

+ 2 - 0
src/tailwind.css

@@ -36,3 +36,5 @@
 		@apply cursor-pointer;
 	}
 }
+
+@custom-variant hover (&:hover);