Browse Source

Merge branch 'open-webui:main' into main

Jarrod Lowe 2 months ago
parent
commit
dfe50b4e56
100 changed files with 4308 additions and 2462 deletions
  1. 61 0
      CHANGELOG.md
  2. 4 4
      backend/open_webui/__init__.py
  3. 102 57
      backend/open_webui/config.py
  4. 1 1
      backend/open_webui/env.py
  5. 54 32
      backend/open_webui/main.py
  6. 3 2
      backend/open_webui/models/memories.py
  7. 9 3
      backend/open_webui/retrieval/utils.py
  8. 25 23
      backend/open_webui/retrieval/web/utils.py
  9. 41 25
      backend/open_webui/routers/audio.py
  10. 3 1
      backend/open_webui/routers/auths.py
  11. 6 1
      backend/open_webui/routers/chats.py
  12. 19 20
      backend/open_webui/routers/knowledge.py
  13. 3 1
      backend/open_webui/routers/memories.py
  14. 411 409
      backend/open_webui/routers/retrieval.py
  15. 4 0
      backend/open_webui/routers/users.py
  16. 16 21
      backend/open_webui/socket/main.py
  17. 24 4
      backend/open_webui/tasks.py
  18. 31 38
      backend/open_webui/utils/middleware.py
  19. 6 3
      backend/open_webui/utils/models.py
  20. 13 64
      backend/open_webui/utils/redis.py
  21. 2 0
      backend/open_webui/utils/task.py
  22. 1 1
      backend/requirements.txt
  23. 2 2
      backend/start.sh
  24. 2 2
      backend/start_windows.bat
  25. 2 2
      docker-compose.playwright.yaml
  26. 496 102
      package-lock.json
  27. 4 4
      package.json
  28. 8 6
      pyproject.toml
  29. 22 0
      src/app.css
  30. 32 0
      src/lib/apis/index.ts
  31. 1 2
      src/lib/apis/knowledge/index.ts
  32. 3 30
      src/lib/apis/retrieval/index.ts
  33. 1 1
      src/lib/components/AddServerModal.svelte
  34. 43 40
      src/lib/components/admin/Settings/Audio.svelte
  35. 552 622
      src/lib/components/admin/Settings/Documents.svelte
  36. 9 1
      src/lib/components/admin/Settings/Models.svelte
  37. 236 116
      src/lib/components/admin/Settings/WebSearch.svelte
  38. 4 0
      src/lib/components/admin/Users/Groups.svelte
  39. 40 5
      src/lib/components/admin/Users/Groups/Permissions.svelte
  40. 25 0
      src/lib/components/admin/Users/UserList.svelte
  41. 113 105
      src/lib/components/chat/Artifacts.svelte
  42. 69 93
      src/lib/components/chat/Chat.svelte
  43. 1 1
      src/lib/components/chat/ChatPlaceholder.svelte
  44. 89 92
      src/lib/components/chat/MessageInput.svelte
  45. 9 1
      src/lib/components/chat/MessageInput/Commands/Knowledge.svelte
  46. 4 1
      src/lib/components/chat/MessageInput/VoiceRecording.svelte
  47. 11 3
      src/lib/components/chat/Messages/Citations.svelte
  48. 9 1
      src/lib/components/chat/Messages/CitationsModal.svelte
  49. 7 5
      src/lib/components/chat/Messages/Markdown/AlertRenderer.svelte
  50. 103 87
      src/lib/components/chat/Messages/ResponseMessage.svelte
  51. 52 50
      src/lib/components/chat/ModelSelector.svelte
  52. 3 1
      src/lib/components/chat/ModelSelector/Selector.svelte
  53. 170 115
      src/lib/components/chat/Navbar.svelte
  54. 85 1
      src/lib/components/chat/Settings/Interface.svelte
  55. 12 8
      src/lib/components/common/FileItem.svelte
  56. 1 1
      src/lib/components/layout/Sidebar/ChannelModal.svelte
  57. 1 1
      src/lib/components/workspace/Knowledge/CreateKnowledgeBase.svelte
  58. 9 1
      src/lib/components/workspace/Knowledge/KnowledgeBase.svelte
  59. 1 1
      src/lib/components/workspace/Prompts/PromptEditor.svelte
  60. 18 13
      src/lib/components/workspace/Tools/ToolkitEditor.svelte
  61. 1 1
      src/lib/components/workspace/common/AccessControl.svelte
  62. 1 1
      src/lib/components/workspace/common/AccessControlModal.svelte
  63. 28 2
      src/lib/i18n/locales/ar-BH/translation.json
  64. 28 2
      src/lib/i18n/locales/ar/translation.json
  65. 28 2
      src/lib/i18n/locales/bg-BG/translation.json
  66. 28 2
      src/lib/i18n/locales/bn-BD/translation.json
  67. 28 2
      src/lib/i18n/locales/bo-TB/translation.json
  68. 28 2
      src/lib/i18n/locales/ca-ES/translation.json
  69. 28 2
      src/lib/i18n/locales/ceb-PH/translation.json
  70. 28 2
      src/lib/i18n/locales/cs-CZ/translation.json
  71. 28 2
      src/lib/i18n/locales/da-DK/translation.json
  72. 28 2
      src/lib/i18n/locales/de-DE/translation.json
  73. 28 2
      src/lib/i18n/locales/dg-DG/translation.json
  74. 28 2
      src/lib/i18n/locales/el-GR/translation.json
  75. 28 2
      src/lib/i18n/locales/en-GB/translation.json
  76. 28 6
      src/lib/i18n/locales/en-US/translation.json
  77. 182 156
      src/lib/i18n/locales/es-ES/translation.json
  78. 28 2
      src/lib/i18n/locales/et-EE/translation.json
  79. 28 2
      src/lib/i18n/locales/eu-ES/translation.json
  80. 28 2
      src/lib/i18n/locales/fa-IR/translation.json
  81. 28 2
      src/lib/i18n/locales/fi-FI/translation.json
  82. 28 2
      src/lib/i18n/locales/fr-CA/translation.json
  83. 28 2
      src/lib/i18n/locales/fr-FR/translation.json
  84. 28 2
      src/lib/i18n/locales/he-IL/translation.json
  85. 28 2
      src/lib/i18n/locales/hi-IN/translation.json
  86. 28 2
      src/lib/i18n/locales/hr-HR/translation.json
  87. 28 2
      src/lib/i18n/locales/hu-HU/translation.json
  88. 28 2
      src/lib/i18n/locales/id-ID/translation.json
  89. 28 2
      src/lib/i18n/locales/ie-GA/translation.json
  90. 28 2
      src/lib/i18n/locales/it-IT/translation.json
  91. 28 2
      src/lib/i18n/locales/ja-JP/translation.json
  92. 28 2
      src/lib/i18n/locales/ka-GE/translation.json
  93. 28 2
      src/lib/i18n/locales/ko-KR/translation.json
  94. 28 2
      src/lib/i18n/locales/lt-LT/translation.json
  95. 28 2
      src/lib/i18n/locales/ms-MY/translation.json
  96. 28 2
      src/lib/i18n/locales/nb-NO/translation.json
  97. 28 2
      src/lib/i18n/locales/nl-NL/translation.json
  98. 28 2
      src/lib/i18n/locales/pa-IN/translation.json
  99. 28 2
      src/lib/i18n/locales/pl-PL/translation.json
  100. 28 2
      src/lib/i18n/locales/pt-BR/translation.json

+ 61 - 0
CHANGELOG.md

@@ -5,6 +5,67 @@ 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.6.5] - 2025-04-14
+
+### Added
+
+- 🛂 **Granular Voice Feature Permissions Per User Group**: Admins can now separately manage access to Speech-to-Text (record voice), Text-to-Speech (read aloud), and Tool Calls for each user group—giving teams tighter control over voice features and enhanced governance across roles.
+- 🗣️ **Toggle Voice Activity Detection (VAD) for Whisper STT**: New environment variable lets you enable/disable VAD filtering with built-in Whisper speech-to-text, giving you flexibility to optimize for different audio quality and response accuracy levels.
+- 📋 **Copy Formatted Response Mode**: You can now enable “Copy Formatted” in Settings > Interface to copy AI responses exactly as styled (with rich formatting, links, and structure preserved), making it faster and cleaner to paste into documents, emails, or reports.
+- ⚙️ **Backend Stability and Performance Enhancements**: General backend refactoring improves system resilience, consistency, and overall reliability—offering smoother performance across workflows whether chatting, generating media, or using external tools.
+- 🌎 **Translation Refinements Across Multiple Languages**: Updated translations deliver smoother language localization, clearer labels, and improved international usability throughout the UI—ensuring a better experience for non-English speakers.
+
+### Fixed
+
+- 🛠️ **LDAP Login Reliability Restored**: Resolved a critical issue where some LDAP setups failed due to attribute parsing—ensuring consistent, secure, and seamless user authentication across enterprise deployments.
+- 🖼️ **Image Generation in Temporary Chats Now Works Properly**: Fixed a bug where image outputs weren’t generated during temporary chats—visual content can now be used reliably in all chat modes without interruptions.
+
+## [0.6.4] - 2025-04-12
+
+### Fixed
+
+- 🛠️ **RAG_TEMPLATE Display Issue Resolved**: Fixed a formatting problem where the custom RAG_TEMPLATE wasn't correctly rendered in the interface—ensuring that custom retrieval prompts now appear exactly as intended for more reliable prompt engineering.
+
+## [0.6.3] - 2025-04-12
+
+### Added
+
+- 🧪 **Auto-Artifact Detection Toggle**: Automatically detects artifacts in results—but now you can disable this behavior under advanced settings for full control.
+- 🖼️ **Widescreen Mode for Shared Chats**: Shared link conversations now support widescreen layouts—perfect for presentations or easier review across wider displays.
+- 🔁 **Reindex Knowledge Files on Demand**: Admins can now trigger reindexing of all knowledge files after changing embeddings—ensuring immediate alignment with new models for optimal RAG performance.
+- 📄 **OpenAPI YAML Format Support**: External tools can now use YAML-format OpenAPI specs—making integration simpler for developers familiar with YAML-based configurations.
+- 💬 **Message Content Copy Behavior**: Copy action now excludes 'details' tags—streamlining clipboard content when sharing or pasting summaries elsewhere.
+- 🧭 **Sougou Web Search Integration**: New search engine option added—enhancing global relevance and diversity of search sources for multilingual users.
+- 🧰 **Frontend Web Loader Engine Configuration**: Admins can now set preferred web loader engine for RAG workflows directly from the frontend—offering more control across setups.
+- 👥 **Multi-Model Chat Permission Control**: Admins can manage access to multi-model chats per user group—allowing tighter governance in team environments.
+- 🧱 **Persistent Configuration Can Be Disabled**: New environment variable lets advanced users and hosts turn off persistent configs—ideal for volatile or stateless deployments.
+- 🧠 **Elixir Code Highlighting Support**: Elixir syntax is now beautifully rendered in code blocks—perfect for developers using this language in AI or automation projects.
+- 🌐 **PWA External Manifest URL Support**: You can now define an external manifest.json—integrate Open WebUI seamlessly in managed or proxy-based PWA environments like Cloudflare Zero Trust.
+- 🧪 **Azure AI Speech-to-Text Provider Integration**: Easily transcribe large audio files (up to 200MB) with high accuracy using Microsoft's Azure STT—fully configurable in Audio Settings.
+- 🔏 **PKCE (Code Challenge Method) Support for OIDC**: Enhance your OIDC login security with Proof Key for Code Exchange—ideal for zero-trust and native client apps.
+- ✨ **General UI/UX Enhancements**: Numerous refinements across layout, styling, and tool interactions—reducing visual noise and improving overall usability across key workflows.
+- 🌍 **Translation Updates Across Multiple Languages**: Refined Catalan, Russian, Chinese (Simplified & Traditional), Hungarian, and Spanish translations for clearer navigation and instructions globally.
+
+### Fixed
+
+- 💥 **Chat Completion Error with Missing Models Resolved**: Fixed internal server error when referencing a model that doesn’t exist—ensuring graceful fallback and clear error guidance.
+- 🔧 **Correct Knowledge Base Citations Restored**: Citations generated by RAG workflows now show accurate references—ensuring verifiability in outputs from sourced content.
+- 🎙️ **Broken OGG/WebM Audio Upload Handling for OpenAI Fixed**: Uploading OGG or WebM files now converts properly to WAV before transcription—restoring accurate AI speech recognition workflows.
+- 🔐 **Tool Server 'Session' Authentication Restored**: Previously broken session auth on external tool servers is now fully functional—ensuring secure and seamless access to connected tools.
+- 🌐 **Folder-Based Chat Rename Now Updates Correctly**: Renaming chats in folders now reflects instantly everywhere—improving chat organization and clarity.
+- 📜 **KaTeX Overflow Displays Fixed**: Math expressions now stay neatly within message bounds—preserving layout consistency even with long formulas.
+- 🚫 **Stopping Ongoing Chat Fixed**: You can now return to an active (ongoing) chat and stop generation at any time—ensuring full control over sessions.
+- 🔧 **TOOL_SERVERS / TOOL_SERVER_CONNECTIONS Indexing Issue Fixed**: Fixed a mismatch between tool lists and their access paths—restoring full function and preventing confusion in tool management.
+- 🔐 **LDAP Login Handles Multiple Emails**: When LDAP returns multiple email attributes, the first valid one is now used—ensuring login success and account consistency.
+- 🧩 **Model Visibility Toggle Fix**: Toggling model visibility now works even for untouched models—letting admins smoothly manage user access across base models.
+- ⚙️ **Cross-Origin manifest.json Now Loads Properly**: Compatibility issues with Cloudflare Zero Trust (and others) resolved, allowing manifest.json to load behind authenticated proxies.
+
+### Changed
+
+- 🔒 **Default Access Scopes Set to Private for All Resources**: Models, tools, and knowledge are now private by default when created—ensuring better baseline security and visibility controls.
+- 🧱 **General Backend Refactoring for Stability**: Numerous invisible improvements enhance backend scalability, security, and maintainability—powering upcoming features with a stronger foundation.
+- 🧩 **Stable Dependency Upgrades**: Updated key platform libraries—Chromadb (0.6.3), pgvector (0.4.0), Azure Identity (1.21.0), and Youtube Transcript API (1.0.3)—for improved compatibility, functionality, and security.
+
 ## [0.6.2] - 2025-04-06
 
 ### Added

+ 4 - 4
backend/open_webui/__init__.py

@@ -76,11 +76,11 @@ def serve(
     from open_webui.env import UVICORN_WORKERS  # Import the workers setting
 
     uvicorn.run(
-        open_webui.main.app, 
-        host=host, 
-        port=port, 
+        open_webui.main.app,
+        host=host,
+        port=port,
         forwarded_allow_ips="*",
-        workers=UVICORN_WORKERS
+        workers=UVICORN_WORKERS,
     )
 
 

+ 102 - 57
backend/open_webui/config.py

@@ -201,7 +201,10 @@ def save_config(config):
 
 T = TypeVar("T")
 
-ENABLE_PERSISTENT_CONFIG = os.environ.get("ENABLE_PERSISTENT_CONFIG", "True").lower() == "true"
+ENABLE_PERSISTENT_CONFIG = (
+    os.environ.get("ENABLE_PERSISTENT_CONFIG", "True").lower() == "true"
+)
+
 
 class PersistentConfig(Generic[T]):
     def __init__(self, env_name: str, config_path: str, env_value: T):
@@ -612,10 +615,16 @@ def load_oauth_providers():
                 "scope": OAUTH_SCOPES.value,
             }
 
-            if OAUTH_CODE_CHALLENGE_METHOD.value and OAUTH_CODE_CHALLENGE_METHOD.value == "S256":
+            if (
+                OAUTH_CODE_CHALLENGE_METHOD.value
+                and OAUTH_CODE_CHALLENGE_METHOD.value == "S256"
+            ):
                 client_kwargs["code_challenge_method"] = "S256"
             elif OAUTH_CODE_CHALLENGE_METHOD.value:
-                raise Exception('Code challenge methods other than "%s" not supported. Given: "%s"' % ("S256", OAUTH_CODE_CHALLENGE_METHOD.value))
+                raise Exception(
+                    'Code challenge methods other than "%s" not supported. Given: "%s"'
+                    % ("S256", OAUTH_CODE_CHALLENGE_METHOD.value)
+                )
 
             client.register(
                 name="oidc",
@@ -1053,6 +1062,22 @@ USER_PERMISSIONS_CHAT_EDIT = (
     os.environ.get("USER_PERMISSIONS_CHAT_EDIT", "True").lower() == "true"
 )
 
+USER_PERMISSIONS_CHAT_STT = (
+    os.environ.get("USER_PERMISSIONS_CHAT_STT", "True").lower() == "true"
+)
+
+USER_PERMISSIONS_CHAT_TTS = (
+    os.environ.get("USER_PERMISSIONS_CHAT_TTS", "True").lower() == "true"
+)
+
+USER_PERMISSIONS_CHAT_CALL = (
+    os.environ.get("USER_PERMISSIONS_CHAT_CALL", "True").lower() == "true"
+)
+
+USER_PERMISSIONS_CHAT_MULTIPLE_MODELS = (
+    os.environ.get("USER_PERMISSIONS_CHAT_MULTIPLE_MODELS", "True").lower() == "true"
+)
+
 USER_PERMISSIONS_CHAT_TEMPORARY = (
     os.environ.get("USER_PERMISSIONS_CHAT_TEMPORARY", "True").lower() == "true"
 )
@@ -1062,6 +1087,7 @@ USER_PERMISSIONS_CHAT_TEMPORARY_ENFORCED = (
     == "true"
 )
 
+
 USER_PERMISSIONS_FEATURES_DIRECT_TOOL_SERVERS = (
     os.environ.get("USER_PERMISSIONS_FEATURES_DIRECT_TOOL_SERVERS", "False").lower()
     == "true"
@@ -1100,6 +1126,10 @@ DEFAULT_USER_PERMISSIONS = {
         "file_upload": USER_PERMISSIONS_CHAT_FILE_UPLOAD,
         "delete": USER_PERMISSIONS_CHAT_DELETE,
         "edit": USER_PERMISSIONS_CHAT_EDIT,
+        "stt": USER_PERMISSIONS_CHAT_STT,
+        "tts": USER_PERMISSIONS_CHAT_TTS,
+        "call": USER_PERMISSIONS_CHAT_CALL,
+        "multiple_models": USER_PERMISSIONS_CHAT_MULTIPLE_MODELS,
         "temporary": USER_PERMISSIONS_CHAT_TEMPORARY,
         "temporary_enforced": USER_PERMISSIONS_CHAT_TEMPORARY_ENFORCED,
     },
@@ -1820,12 +1850,6 @@ RAG_FILE_MAX_SIZE = PersistentConfig(
     ),
 )
 
-ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION = PersistentConfig(
-    "ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION",
-    "rag.enable_web_loader_ssl_verification",
-    os.environ.get("ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION", "True").lower() == "true",
-)
-
 RAG_EMBEDDING_ENGINE = PersistentConfig(
     "RAG_EMBEDDING_ENGINE",
     "rag.embedding_engine",
@@ -1990,16 +2014,20 @@ YOUTUBE_LOADER_PROXY_URL = PersistentConfig(
 )
 
 
-ENABLE_RAG_WEB_SEARCH = PersistentConfig(
-    "ENABLE_RAG_WEB_SEARCH",
+####################################
+# Web Search (RAG)
+####################################
+
+ENABLE_WEB_SEARCH = PersistentConfig(
+    "ENABLE_WEB_SEARCH",
     "rag.web.search.enable",
-    os.getenv("ENABLE_RAG_WEB_SEARCH", "False").lower() == "true",
+    os.getenv("ENABLE_WEB_SEARCH", "False").lower() == "true",
 )
 
-RAG_WEB_SEARCH_ENGINE = PersistentConfig(
-    "RAG_WEB_SEARCH_ENGINE",
+WEB_SEARCH_ENGINE = PersistentConfig(
+    "WEB_SEARCH_ENGINE",
     "rag.web.search.engine",
-    os.getenv("RAG_WEB_SEARCH_ENGINE", ""),
+    os.getenv("WEB_SEARCH_ENGINE", ""),
 )
 
 BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL = PersistentConfig(
@@ -2008,10 +2036,18 @@ BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL = PersistentConfig(
     os.getenv("BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL", "False").lower() == "true",
 )
 
+
+WEB_SEARCH_RESULT_COUNT = PersistentConfig(
+    "WEB_SEARCH_RESULT_COUNT",
+    "rag.web.search.result_count",
+    int(os.getenv("WEB_SEARCH_RESULT_COUNT", "3")),
+)
+
+
 # You can provide a list of your own websites to filter after performing a web search.
 # This ensures the highest level of safety and reliability of the information sources.
-RAG_WEB_SEARCH_DOMAIN_FILTER_LIST = PersistentConfig(
-    "RAG_WEB_SEARCH_DOMAIN_FILTER_LIST",
+WEB_SEARCH_DOMAIN_FILTER_LIST = PersistentConfig(
+    "WEB_SEARCH_DOMAIN_FILTER_LIST",
     "rag.web.search.domain.filter_list",
     [
         # "wikipedia.com",
@@ -2020,6 +2056,30 @@ RAG_WEB_SEARCH_DOMAIN_FILTER_LIST = PersistentConfig(
     ],
 )
 
+WEB_SEARCH_CONCURRENT_REQUESTS = PersistentConfig(
+    "WEB_SEARCH_CONCURRENT_REQUESTS",
+    "rag.web.search.concurrent_requests",
+    int(os.getenv("WEB_SEARCH_CONCURRENT_REQUESTS", "10")),
+)
+
+WEB_LOADER_ENGINE = PersistentConfig(
+    "WEB_LOADER_ENGINE",
+    "rag.web.loader.engine",
+    os.environ.get("WEB_LOADER_ENGINE", ""),
+)
+
+ENABLE_WEB_LOADER_SSL_VERIFICATION = PersistentConfig(
+    "ENABLE_WEB_LOADER_SSL_VERIFICATION",
+    "rag.web.loader.ssl_verification",
+    os.environ.get("ENABLE_WEB_LOADER_SSL_VERIFICATION", "True").lower() == "true",
+)
+
+WEB_SEARCH_TRUST_ENV = PersistentConfig(
+    "WEB_SEARCH_TRUST_ENV",
+    "rag.web.search.trust_env",
+    os.getenv("WEB_SEARCH_TRUST_ENV", "False").lower() == "true",
+)
+
 
 SEARXNG_QUERY_URL = PersistentConfig(
     "SEARXNG_QUERY_URL",
@@ -2087,18 +2147,6 @@ SERPLY_API_KEY = PersistentConfig(
     os.getenv("SERPLY_API_KEY", ""),
 )
 
-TAVILY_API_KEY = PersistentConfig(
-    "TAVILY_API_KEY",
-    "rag.web.search.tavily_api_key",
-    os.getenv("TAVILY_API_KEY", ""),
-)
-
-TAVILY_EXTRACT_DEPTH = PersistentConfig(
-    "TAVILY_EXTRACT_DEPTH",
-    "rag.web.search.tavily_extract_depth",
-    os.getenv("TAVILY_EXTRACT_DEPTH", "basic"),
-)
-
 JINA_API_KEY = PersistentConfig(
     "JINA_API_KEY",
     "rag.web.search.jina_api_key",
@@ -2167,54 +2215,43 @@ SOUGOU_API_SK = PersistentConfig(
     os.getenv("SOUGOU_API_SK", ""),
 )
 
-RAG_WEB_SEARCH_RESULT_COUNT = PersistentConfig(
-    "RAG_WEB_SEARCH_RESULT_COUNT",
-    "rag.web.search.result_count",
-    int(os.getenv("RAG_WEB_SEARCH_RESULT_COUNT", "3")),
-)
-
-RAG_WEB_SEARCH_CONCURRENT_REQUESTS = PersistentConfig(
-    "RAG_WEB_SEARCH_CONCURRENT_REQUESTS",
-    "rag.web.search.concurrent_requests",
-    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"),
+TAVILY_API_KEY = PersistentConfig(
+    "TAVILY_API_KEY",
+    "rag.web.search.tavily_api_key",
+    os.getenv("TAVILY_API_KEY", ""),
 )
 
-RAG_WEB_SEARCH_TRUST_ENV = PersistentConfig(
-    "RAG_WEB_SEARCH_TRUST_ENV",
-    "rag.web.search.trust_env",
-    os.getenv("RAG_WEB_SEARCH_TRUST_ENV", "False").lower() == "true",
+TAVILY_EXTRACT_DEPTH = PersistentConfig(
+    "TAVILY_EXTRACT_DEPTH",
+    "rag.web.search.tavily_extract_depth",
+    os.getenv("TAVILY_EXTRACT_DEPTH", "basic"),
 )
 
-PLAYWRIGHT_WS_URI = PersistentConfig(
-    "PLAYWRIGHT_WS_URI",
-    "rag.web.loader.engine.playwright.ws.uri",
-    os.environ.get("PLAYWRIGHT_WS_URI", None),
+PLAYWRIGHT_WS_URL = PersistentConfig(
+    "PLAYWRIGHT_WS_URL",
+    "rag.web.loader.playwright_ws_url",
+    os.environ.get("PLAYWRIGHT_WS_URL", ""),
 )
 
 PLAYWRIGHT_TIMEOUT = PersistentConfig(
     "PLAYWRIGHT_TIMEOUT",
-    "rag.web.loader.engine.playwright.timeout",
-    int(os.environ.get("PLAYWRIGHT_TIMEOUT", "10")),
+    "rag.web.loader.playwright_timeout",
+    int(os.environ.get("PLAYWRIGHT_TIMEOUT", "10000")),
 )
 
 FIRECRAWL_API_KEY = PersistentConfig(
     "FIRECRAWL_API_KEY",
-    "firecrawl.api_key",
+    "rag.web.loader.firecrawl_api_key",
     os.environ.get("FIRECRAWL_API_KEY", ""),
 )
 
 FIRECRAWL_API_BASE_URL = PersistentConfig(
     "FIRECRAWL_API_BASE_URL",
-    "firecrawl.api_url",
+    "rag.web.loader.firecrawl_api_url",
     os.environ.get("FIRECRAWL_API_BASE_URL", "https://api.firecrawl.dev"),
 )
 
+
 ####################################
 # Images
 ####################################
@@ -2467,6 +2504,13 @@ WHISPER_MODEL_AUTO_UPDATE = (
     and os.environ.get("WHISPER_MODEL_AUTO_UPDATE", "").lower() == "true"
 )
 
+WHISPER_VAD_FILTER = PersistentConfig(
+    "WHISPER_VAD_FILTER",
+    "audio.stt.whisper_vad_filter",
+    os.getenv("WHISPER_VAD_FILTER", "False").lower() == "true",
+)
+
+
 # Add Deepgram configuration
 DEEPGRAM_API_KEY = PersistentConfig(
     "DEEPGRAM_API_KEY",
@@ -2474,6 +2518,7 @@ DEEPGRAM_API_KEY = PersistentConfig(
     os.getenv("DEEPGRAM_API_KEY", ""),
 )
 
+
 AUDIO_STT_OPENAI_API_BASE_URL = PersistentConfig(
     "AUDIO_STT_OPENAI_API_BASE_URL",
     "audio.stt.openai.api_base_url",

+ 1 - 1
backend/open_webui/env.py

@@ -498,4 +498,4 @@ PIP_PACKAGE_INDEX_OPTIONS = os.getenv("PIP_PACKAGE_INDEX_OPTIONS", "").split()
 # PROGRESSIVE WEB APP OPTIONS
 ####################################
 
-EXTERNAL_PWA_MANIFEST_URL = os.environ.get("EXTERNAL_PWA_MANIFEST_URL")
+EXTERNAL_PWA_MANIFEST_URL = os.environ.get("EXTERNAL_PWA_MANIFEST_URL")

+ 54 - 32
backend/open_webui/main.py

@@ -160,12 +160,13 @@ from open_webui.config import (
     AUDIO_TTS_VOICE,
     AUDIO_TTS_AZURE_SPEECH_REGION,
     AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT,
-    PLAYWRIGHT_WS_URI,
+    PLAYWRIGHT_WS_URL,
     PLAYWRIGHT_TIMEOUT,
     FIRECRAWL_API_BASE_URL,
     FIRECRAWL_API_KEY,
-    RAG_WEB_LOADER_ENGINE,
+    WEB_LOADER_ENGINE,
     WHISPER_MODEL,
+    WHISPER_VAD_FILTER,
     DEEPGRAM_API_KEY,
     WHISPER_MODEL_AUTO_UPDATE,
     WHISPER_MODEL_DIR,
@@ -205,12 +206,13 @@ from open_webui.config import (
     YOUTUBE_LOADER_LANGUAGE,
     YOUTUBE_LOADER_PROXY_URL,
     # Retrieval (Web Search)
-    RAG_WEB_SEARCH_ENGINE,
+    ENABLE_WEB_SEARCH,
+    WEB_SEARCH_ENGINE,
     BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL,
-    RAG_WEB_SEARCH_RESULT_COUNT,
-    RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
-    RAG_WEB_SEARCH_TRUST_ENV,
-    RAG_WEB_SEARCH_DOMAIN_FILTER_LIST,
+    WEB_SEARCH_RESULT_COUNT,
+    WEB_SEARCH_CONCURRENT_REQUESTS,
+    WEB_SEARCH_TRUST_ENV,
+    WEB_SEARCH_DOMAIN_FILTER_LIST,
     JINA_API_KEY,
     SEARCHAPI_API_KEY,
     SEARCHAPI_ENGINE,
@@ -240,8 +242,7 @@ from open_webui.config import (
     ONEDRIVE_CLIENT_ID,
     ENABLE_RAG_HYBRID_SEARCH,
     ENABLE_RAG_LOCAL_WEB_FETCH,
-    ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION,
-    ENABLE_RAG_WEB_SEARCH,
+    ENABLE_WEB_LOADER_SSL_VERIFICATION,
     ENABLE_GOOGLE_DRIVE_INTEGRATION,
     ENABLE_ONEDRIVE_INTEGRATION,
     UPLOAD_DIR,
@@ -373,7 +374,11 @@ from open_webui.utils.auth import (
 from open_webui.utils.oauth import OAuthManager
 from open_webui.utils.security_headers import SecurityHeadersMiddleware
 
-from open_webui.tasks import stop_task, list_tasks  # Import from tasks.py
+from open_webui.tasks import (
+    list_task_ids_by_chat_id,
+    stop_task,
+    list_tasks,
+)  # Import from tasks.py
 
 from open_webui.utils.redis import get_sentinels_from_env
 
@@ -596,9 +601,7 @@ app.state.config.FILE_MAX_COUNT = RAG_FILE_MAX_COUNT
 app.state.config.RAG_FULL_CONTEXT = RAG_FULL_CONTEXT
 app.state.config.BYPASS_EMBEDDING_AND_RETRIEVAL = BYPASS_EMBEDDING_AND_RETRIEVAL
 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
-)
+app.state.config.ENABLE_WEB_LOADER_SSL_VERIFICATION = ENABLE_WEB_LOADER_SSL_VERIFICATION
 
 app.state.config.CONTENT_EXTRACTION_ENGINE = CONTENT_EXTRACTION_ENGINE
 app.state.config.TIKA_SERVER_URL = TIKA_SERVER_URL
@@ -631,12 +634,16 @@ app.state.config.YOUTUBE_LOADER_LANGUAGE = YOUTUBE_LOADER_LANGUAGE
 app.state.config.YOUTUBE_LOADER_PROXY_URL = YOUTUBE_LOADER_PROXY_URL
 
 
-app.state.config.ENABLE_RAG_WEB_SEARCH = ENABLE_RAG_WEB_SEARCH
-app.state.config.RAG_WEB_SEARCH_ENGINE = RAG_WEB_SEARCH_ENGINE
+app.state.config.ENABLE_WEB_SEARCH = ENABLE_WEB_SEARCH
+app.state.config.WEB_SEARCH_ENGINE = WEB_SEARCH_ENGINE
+app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST = WEB_SEARCH_DOMAIN_FILTER_LIST
+app.state.config.WEB_SEARCH_RESULT_COUNT = WEB_SEARCH_RESULT_COUNT
+app.state.config.WEB_SEARCH_CONCURRENT_REQUESTS = WEB_SEARCH_CONCURRENT_REQUESTS
+app.state.config.WEB_LOADER_ENGINE = WEB_LOADER_ENGINE
+app.state.config.WEB_SEARCH_TRUST_ENV = WEB_SEARCH_TRUST_ENV
 app.state.config.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL = (
     BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL
 )
-app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST = RAG_WEB_SEARCH_DOMAIN_FILTER_LIST
 
 app.state.config.ENABLE_GOOGLE_DRIVE_INTEGRATION = ENABLE_GOOGLE_DRIVE_INTEGRATION
 app.state.config.ENABLE_ONEDRIVE_INTEGRATION = ENABLE_ONEDRIVE_INTEGRATION
@@ -664,11 +671,8 @@ app.state.config.PERPLEXITY_API_KEY = PERPLEXITY_API_KEY
 app.state.config.SOUGOU_API_SID = SOUGOU_API_SID
 app.state.config.SOUGOU_API_SK = SOUGOU_API_SK
 
-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.PLAYWRIGHT_WS_URL = PLAYWRIGHT_WS_URL
 app.state.config.PLAYWRIGHT_TIMEOUT = PLAYWRIGHT_TIMEOUT
 app.state.config.FIRECRAWL_API_BASE_URL = FIRECRAWL_API_BASE_URL
 app.state.config.FIRECRAWL_API_KEY = FIRECRAWL_API_KEY
@@ -788,6 +792,7 @@ app.state.config.STT_ENGINE = AUDIO_STT_ENGINE
 app.state.config.STT_MODEL = AUDIO_STT_MODEL
 
 app.state.config.WHISPER_MODEL = WHISPER_MODEL
+app.state.config.WHISPER_VAD_FILTER = WHISPER_VAD_FILTER
 app.state.config.DEEPGRAM_API_KEY = DEEPGRAM_API_KEY
 
 app.state.config.AUDIO_STT_AZURE_API_KEY = AUDIO_STT_AZURE_API_KEY
@@ -1022,14 +1027,19 @@ async def get_models(request: Request, user=Depends(get_verified_user)):
         if "pipeline" in model and model["pipeline"].get("type", None) == "filter":
             continue
 
-        model_tags = [
-            tag.get("name")
-            for tag in model.get("info", {}).get("meta", {}).get("tags", [])
-        ]
-        tags = [tag.get("name") for tag in model.get("tags", [])]
-
-        tags = list(set(model_tags + tags))
-        model["tags"] = [{"name": tag} for tag in tags]
+        try:
+            model_tags = [
+                tag.get("name")
+                for tag in model.get("info", {}).get("meta", {}).get("tags", [])
+            ]
+            tags = [tag.get("name") for tag in model.get("tags", [])]
+
+            tags = list(set(model_tags + tags))
+            model["tags"] = [{"name": tag} for tag in tags]
+        except Exception as e:
+            log.debug(f"Error processing model tags: {e}")
+            model["tags"] = []
+            pass
 
         models.append(model)
 
@@ -1199,7 +1209,7 @@ async def chat_action(
 @app.post("/api/tasks/stop/{task_id}")
 async def stop_task_endpoint(task_id: str, user=Depends(get_verified_user)):
     try:
-        result = await stop_task(task_id)  # Use the function from tasks.py
+        result = await stop_task(task_id)
         return result
     except ValueError as e:
         raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(e))
@@ -1207,7 +1217,19 @@ async def stop_task_endpoint(task_id: str, user=Depends(get_verified_user)):
 
 @app.get("/api/tasks")
 async def list_tasks_endpoint(user=Depends(get_verified_user)):
-    return {"tasks": list_tasks()}  # Use the function from tasks.py
+    return {"tasks": list_tasks()}
+
+
+@app.get("/api/tasks/chat/{chat_id}")
+async def list_tasks_by_chat_id_endpoint(chat_id: str, user=Depends(get_verified_user)):
+    chat = Chats.get_chat_by_id(chat_id)
+    if chat is None or chat.user_id != user.id:
+        return {"task_ids": []}
+
+    task_ids = list_task_ids_by_chat_id(chat_id)
+
+    print(f"Task IDs for chat {chat_id}: {task_ids}")
+    return {"task_ids": task_ids}
 
 
 ##################################
@@ -1263,7 +1285,7 @@ async def get_app_config(request: Request):
                 {
                     "enable_direct_connections": app.state.config.ENABLE_DIRECT_CONNECTIONS,
                     "enable_channels": app.state.config.ENABLE_CHANNELS,
-                    "enable_web_search": app.state.config.ENABLE_RAG_WEB_SEARCH,
+                    "enable_web_search": app.state.config.ENABLE_WEB_SEARCH,
                     "enable_code_execution": app.state.config.ENABLE_CODE_EXECUTION,
                     "enable_code_interpreter": app.state.config.ENABLE_CODE_INTERPRETER,
                     "enable_image_generation": app.state.config.ENABLE_IMAGE_GENERATION,

+ 3 - 2
backend/open_webui/models/memories.py

@@ -63,14 +63,15 @@ class MemoriesTable:
             else:
                 return None
 
-    def update_memory_by_id(
+    def update_memory_by_id_and_user_id(
         self,
         id: str,
+        user_id: str,
         content: str,
     ) -> Optional[MemoryModel]:
         with get_db() as db:
             try:
-                db.query(Memory).filter_by(id=id).update(
+                db.query(Memory).filter_by(id=id, user_id=user_id).update(
                     {"content": content, "updated_at": int(time.time())}
                 )
                 db.commit()

+ 9 - 3
backend/open_webui/retrieval/utils.py

@@ -297,7 +297,9 @@ def query_collection_with_hybrid_search(
     collection_results = {}
     for collection_name in collection_names:
         try:
-            log.debug(f"query_collection_with_hybrid_search:VECTOR_DB_CLIENT.get:collection {collection_name}")
+            log.debug(
+                f"query_collection_with_hybrid_search:VECTOR_DB_CLIENT.get:collection {collection_name}"
+            )
             collection_results[collection_name] = VECTOR_DB_CLIENT.get(
                 collection_name=collection_name
             )
@@ -619,7 +621,9 @@ def generate_openai_batch_embeddings(
     user: UserModel = None,
 ) -> Optional[list[list[float]]]:
     try:
-        log.debug(f"generate_openai_batch_embeddings:model {model} batch size: {len(texts)}")
+        log.debug(
+            f"generate_openai_batch_embeddings:model {model} batch size: {len(texts)}"
+        )
         json_data = {"input": texts, "model": model}
         if isinstance(RAG_EMBEDDING_PREFIX_FIELD_NAME, str) and isinstance(prefix, str):
             json_data[RAG_EMBEDDING_PREFIX_FIELD_NAME] = prefix
@@ -662,7 +666,9 @@ def generate_ollama_batch_embeddings(
     user: UserModel = None,
 ) -> Optional[list[list[float]]]:
     try:
-        log.debug(f"generate_ollama_batch_embeddings:model {model} batch size: {len(texts)}")
+        log.debug(
+            f"generate_ollama_batch_embeddings:model {model} batch size: {len(texts)}"
+        )
         json_data = {"input": texts, "model": model}
         if isinstance(RAG_EMBEDDING_PREFIX_FIELD_NAME, str) and isinstance(prefix, str):
             json_data[RAG_EMBEDDING_PREFIX_FIELD_NAME] = prefix

+ 25 - 23
backend/open_webui/retrieval/web/utils.py

@@ -28,9 +28,9 @@ from open_webui.retrieval.loaders.tavily import TavilyLoader
 from open_webui.constants import ERROR_MESSAGES
 from open_webui.config import (
     ENABLE_RAG_LOCAL_WEB_FETCH,
-    PLAYWRIGHT_WS_URI,
+    PLAYWRIGHT_WS_URL,
     PLAYWRIGHT_TIMEOUT,
-    RAG_WEB_LOADER_ENGINE,
+    WEB_LOADER_ENGINE,
     FIRECRAWL_API_BASE_URL,
     FIRECRAWL_API_KEY,
     TAVILY_API_KEY,
@@ -584,13 +584,6 @@ 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
-RAG_WEB_LOADER_ENGINES["tavily"] = SafeTavilyLoader
-
-
 def get_web_loader(
     urls: Union[str, Sequence[str]],
     verify_ssl: bool = True,
@@ -608,27 +601,36 @@ def get_web_loader(
         "trust_env": trust_env,
     }
 
-    if RAG_WEB_LOADER_ENGINE.value == "playwright":
+    if WEB_LOADER_ENGINE.value == "" or WEB_LOADER_ENGINE.value == "safe_web":
+        WebLoaderClass = SafeWebBaseLoader
+    if WEB_LOADER_ENGINE.value == "playwright":
+        WebLoaderClass = SafePlaywrightURLLoader
         web_loader_args["playwright_timeout"] = PLAYWRIGHT_TIMEOUT.value * 1000
-        if PLAYWRIGHT_WS_URI.value:
-            web_loader_args["playwright_ws_url"] = PLAYWRIGHT_WS_URI.value
+        if PLAYWRIGHT_WS_URL.value:
+            web_loader_args["playwright_ws_url"] = PLAYWRIGHT_WS_URL.value
 
-    if RAG_WEB_LOADER_ENGINE.value == "firecrawl":
+    if WEB_LOADER_ENGINE.value == "firecrawl":
+        WebLoaderClass = SafeFireCrawlLoader
         web_loader_args["api_key"] = FIRECRAWL_API_KEY.value
         web_loader_args["api_url"] = FIRECRAWL_API_BASE_URL.value
 
-    if RAG_WEB_LOADER_ENGINE.value == "tavily":
+    if WEB_LOADER_ENGINE.value == "tavily":
+        WebLoaderClass = SafeTavilyLoader
         web_loader_args["api_key"] = TAVILY_API_KEY.value
         web_loader_args["extract_depth"] = TAVILY_EXTRACT_DEPTH.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)
+    if WebLoaderClass:
+        web_loader = WebLoaderClass(**web_loader_args)
 
-    log.debug(
-        "Using RAG_WEB_LOADER_ENGINE %s for %s URLs",
-        web_loader.__class__.__name__,
-        len(safe_urls),
-    )
+        log.debug(
+            "Using WEB_LOADER_ENGINE %s for %s URLs",
+            web_loader.__class__.__name__,
+            len(safe_urls),
+        )
 
-    return web_loader
+        return web_loader
+    else:
+        raise ValueError(
+            f"Invalid WEB_LOADER_ENGINE: {WEB_LOADER_ENGINE.value}. "
+            "Please set it to 'safe_web', 'playwright', 'firecrawl', or 'tavily'."
+        )

+ 41 - 25
backend/open_webui/routers/audio.py

@@ -330,7 +330,7 @@ async def speech(request: Request, user=Depends(get_verified_user)):
                 detail = f"External: {e}"
 
             raise HTTPException(
-                status_code=getattr(r, "status", 500),
+                status_code=getattr(r, "status", 500) if r else 500,
                 detail=detail if detail else "Open WebUI: Server Connection Error",
             )
 
@@ -384,7 +384,7 @@ async def speech(request: Request, user=Depends(get_verified_user)):
                 detail = f"External: {e}"
 
             raise HTTPException(
-                status_code=getattr(r, "status", 500),
+                status_code=getattr(r, "status", 500) if r else 500,
                 detail=detail if detail else "Open WebUI: Server Connection Error",
             )
 
@@ -440,7 +440,7 @@ async def speech(request: Request, user=Depends(get_verified_user)):
                 detail = f"External: {e}"
 
             raise HTTPException(
-                status_code=getattr(r, "status", 500),
+                status_code=getattr(r, "status", 500) if r else 500,
                 detail=detail if detail else "Open WebUI: Server Connection Error",
             )
 
@@ -497,7 +497,11 @@ def transcribe(request: Request, file_path):
             )
 
         model = request.app.state.faster_whisper_model
-        segments, info = model.transcribe(file_path, beam_size=5)
+        segments, info = model.transcribe(
+            file_path,
+            beam_size=5,
+            vad_filter=request.app.state.config.WHISPER_VAD_FILTER,
+        )
         log.info(
             "Detected language '%s' with probability %f"
             % (info.language, info.language_probability)
@@ -624,10 +628,7 @@ def transcribe(request: Request, file_path):
     elif request.app.state.config.STT_ENGINE == "azure":
         # Check file exists and size
         if not os.path.exists(file_path):
-            raise HTTPException(
-                status_code=400,
-                detail="Audio file not found"
-            )
+            raise HTTPException(status_code=400, detail="Audio file not found")
 
         # Check file size (Azure has a larger limit of 200MB)
         file_size = os.path.getsize(file_path)
@@ -643,11 +644,22 @@ def transcribe(request: Request, file_path):
 
         # IF NO LOCALES, USE DEFAULTS
         if len(locales) < 2:
-            locales = ['en-US', 'es-ES', 'es-MX', 'fr-FR', 'hi-IN', 
-                       'it-IT','de-DE', 'en-GB', 'en-IN', 'ja-JP', 
-                       'ko-KR', 'pt-BR', 'zh-CN']
-            locales = ','.join(locales)
-
+            locales = [
+                "en-US",
+                "es-ES",
+                "es-MX",
+                "fr-FR",
+                "hi-IN",
+                "it-IT",
+                "de-DE",
+                "en-GB",
+                "en-IN",
+                "ja-JP",
+                "ko-KR",
+                "pt-BR",
+                "zh-CN",
+            ]
+            locales = ",".join(locales)
 
         if not api_key or not region:
             raise HTTPException(
@@ -658,22 +670,26 @@ def transcribe(request: Request, file_path):
         r = None
         try:
             # Prepare the request
-            data = {'definition': json.dumps({
-                                                "locales": locales.split(','),
-                                                "diarization": {"maxSpeakers": 3,"enabled": True}
-                                              } if locales else {}
-                                              )
+            data = {
+                "definition": json.dumps(
+                    {
+                        "locales": locales.split(","),
+                        "diarization": {"maxSpeakers": 3, "enabled": True},
+                    }
+                    if locales
+                    else {}
+                )
             }
             url = f"https://{region}.api.cognitive.microsoft.com/speechtotext/transcriptions:transcribe?api-version=2024-11-15"
-            
+
             # Use context manager to ensure file is properly closed
-            with open(file_path, 'rb') as audio_file:
+            with open(file_path, "rb") as audio_file:
                 r = requests.post(
                     url=url,
-                    files={'audio': audio_file},
+                    files={"audio": audio_file},
                     data=data,
                     headers={
-                        'Ocp-Apim-Subscription-Key': api_key,
+                        "Ocp-Apim-Subscription-Key": api_key,
                     },
                 )
 
@@ -681,11 +697,11 @@ def transcribe(request: Request, file_path):
             response = r.json()
 
             # Extract transcript from response
-            if not response.get('combinedPhrases'):
+            if not response.get("combinedPhrases"):
                 raise ValueError("No transcription found in response")
 
             # Get the full transcript from combinedPhrases
-            transcript = response['combinedPhrases'][0].get('text', '').strip()
+            transcript = response["combinedPhrases"][0].get("text", "").strip()
             if not transcript:
                 raise ValueError("Empty transcript in response")
 
@@ -718,7 +734,7 @@ def transcribe(request: Request, file_path):
                 detail = f"External: {e}"
 
             raise HTTPException(
-                status_code=getattr(r, 'status_code', 500) if r else 500,
+                status_code=getattr(r, "status_code", 500) if r else 500,
                 detail=detail if detail else "Open WebUI: Server Connection Error",
             )
 

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

@@ -231,13 +231,15 @@ async def ldap_auth(request: Request, response: Response, form_data: LdapForm):
 
         entry = connection_app.entries[0]
         username = str(entry[f"{LDAP_ATTRIBUTE_FOR_USERNAME}"]).lower()
-        email = entry[f"{LDAP_ATTRIBUTE_FOR_MAIL}"]
+        email = entry[f"{LDAP_ATTRIBUTE_FOR_MAIL}"].value  # retrive the Attribute value
         if not email:
             raise HTTPException(400, "User does not have a valid email address.")
         elif isinstance(email, str):
             email = email.lower()
         elif isinstance(email, list):
             email = email[0].lower()
+        else:
+            email = str(email).lower()
 
         cn = str(entry["cn"])
         user_dn = entry.entry_dn

+ 6 - 1
backend/open_webui/routers/chats.py

@@ -579,7 +579,12 @@ async def clone_chat_by_id(
 
 @router.post("/{id}/clone/shared", response_model=Optional[ChatResponse])
 async def clone_shared_chat_by_id(id: str, user=Depends(get_verified_user)):
-    chat = Chats.get_chat_by_share_id(id)
+
+    if user.role == "admin":
+        chat = Chats.get_chat_by_id(id)
+    else:
+        chat = Chats.get_chat_by_share_id(id)
+
     if chat:
         updated_chat = {
             **chat.chat,

+ 19 - 20
backend/open_webui/routers/knowledge.py

@@ -159,7 +159,6 @@ async def create_new_knowledge(
             status_code=status.HTTP_400_BAD_REQUEST,
             detail=ERROR_MESSAGES.FILE_EXISTS,
         )
-    
 
 
 ############################
@@ -168,20 +167,17 @@ async def create_new_knowledge(
 
 
 @router.post("/reindex", response_model=bool)
-async def reindex_knowledge_files(
-    request: Request,
-    user=Depends(get_verified_user)
-):
+async def reindex_knowledge_files(request: Request, user=Depends(get_verified_user)):
     if user.role != "admin":
         raise HTTPException(
             status_code=status.HTTP_401_UNAUTHORIZED,
             detail=ERROR_MESSAGES.UNAUTHORIZED,
         )
-    
+
     knowledge_bases = Knowledges.get_knowledge_bases()
-         
+
     log.info(f"Starting reindexing for {len(knowledge_bases)} knowledge bases")
-    
+
     for knowledge_base in knowledge_bases:
         try:
             files = Files.get_files_by_ids(knowledge_base.data.get("file_ids", []))
@@ -195,34 +191,40 @@ async def reindex_knowledge_files(
                 log.error(f"Error deleting collection {knowledge_base.id}: {str(e)}")
                 raise HTTPException(
                     status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
-                    detail=f"Error deleting vector DB collection"
+                    detail=f"Error deleting vector DB collection",
                 )
-            
+
             failed_files = []
             for file in files:
                 try:
                     process_file(
                         request,
-                        ProcessFileForm(file_id=file.id, collection_name=knowledge_base.id),
+                        ProcessFileForm(
+                            file_id=file.id, collection_name=knowledge_base.id
+                        ),
                         user=user,
                     )
                 except Exception as e:
-                    log.error(f"Error processing file {file.filename} (ID: {file.id}): {str(e)}")
+                    log.error(
+                        f"Error processing file {file.filename} (ID: {file.id}): {str(e)}"
+                    )
                     failed_files.append({"file_id": file.id, "error": str(e)})
                     continue
-          
+
         except Exception as e:
             log.error(f"Error processing knowledge base {knowledge_base.id}: {str(e)}")
             raise HTTPException(
                 status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
-                detail=f"Error processing knowledge base"
+                detail=f"Error processing knowledge base",
             )
-        
+
         if failed_files:
-            log.warning(f"Failed to process {len(failed_files)} files in knowledge base {knowledge_base.id}")
+            log.warning(
+                f"Failed to process {len(failed_files)} files in knowledge base {knowledge_base.id}"
+            )
             for failed in failed_files:
                 log.warning(f"File ID: {failed['file_id']}, Error: {failed['error']}")
-    
+
     log.info("Reindexing completed successfully")
     return True
 
@@ -742,6 +744,3 @@ def add_files_to_knowledge_batch(
     return KnowledgeFilesResponse(
         **knowledge.model_dump(), files=Files.get_files_by_ids(existing_file_ids)
     )
-
-
-

+ 3 - 1
backend/open_webui/routers/memories.py

@@ -153,7 +153,9 @@ async def update_memory_by_id(
     form_data: MemoryUpdateModel,
     user=Depends(get_verified_user),
 ):
-    memory = Memories.update_memory_by_id(memory_id, form_data.content)
+    memory = Memories.update_memory_by_id_and_user_id(
+        memory_id, user.id, form_data.content
+    )
     if memory is None:
         raise HTTPException(status_code=404, detail="Memory not found")
 

File diff suppressed because it is too large
+ 411 - 409
backend/open_webui/routers/retrieval.py


+ 4 - 0
backend/open_webui/routers/users.py

@@ -88,6 +88,10 @@ class ChatPermissions(BaseModel):
     file_upload: bool = True
     delete: bool = True
     edit: bool = True
+    stt: bool = True
+    tts: bool = True
+    call: bool = True
+    multiple_models: bool = True
     temporary: bool = True
     temporary_enforced: bool = False
 

+ 16 - 21
backend/open_webui/socket/main.py

@@ -9,9 +9,8 @@ from open_webui.models.users import Users, UserNameResponse
 from open_webui.models.channels import Channels
 from open_webui.models.chats import Chats
 from open_webui.utils.redis import (
-    parse_redis_sentinel_url,
     get_sentinels_from_env,
-    AsyncRedisSentinelManager,
+    get_sentinel_url_from_env,
 )
 
 from open_webui.env import (
@@ -38,15 +37,10 @@ log.setLevel(SRC_LOG_LEVELS["SOCKET"])
 
 if WEBSOCKET_MANAGER == "redis":
     if WEBSOCKET_SENTINEL_HOSTS:
-        redis_config = parse_redis_sentinel_url(WEBSOCKET_REDIS_URL)
-        mgr = AsyncRedisSentinelManager(
-            WEBSOCKET_SENTINEL_HOSTS.split(","),
-            sentinel_port=int(WEBSOCKET_SENTINEL_PORT),
-            redis_port=redis_config["port"],
-            service=redis_config["service"],
-            db=redis_config["db"],
-            username=redis_config["username"],
-            password=redis_config["password"],
+        mgr = socketio.AsyncRedisManager(
+            get_sentinel_url_from_env(
+                WEBSOCKET_REDIS_URL, WEBSOCKET_SENTINEL_HOSTS, WEBSOCKET_SENTINEL_PORT
+            )
         )
     else:
         mgr = socketio.AsyncRedisManager(WEBSOCKET_REDIS_URL)
@@ -345,16 +339,17 @@ def get_event_emitter(request_info, update_db=True):
                     request_info["message_id"],
                 )
 
-                content = message.get("content", "")
-                content += event_data.get("data", {}).get("content", "")
-
-                Chats.upsert_message_to_chat_by_id_and_message_id(
-                    request_info["chat_id"],
-                    request_info["message_id"],
-                    {
-                        "content": content,
-                    },
-                )
+                if message:
+                    content = message.get("content", "")
+                    content += event_data.get("data", {}).get("content", "")
+
+                    Chats.upsert_message_to_chat_by_id_and_message_id(
+                        request_info["chat_id"],
+                        request_info["message_id"],
+                        {
+                            "content": content,
+                        },
+                    )
 
             if "type" in event_data and event_data["type"] == "replace":
                 content = event_data.get("data", {}).get("content", "")

+ 24 - 4
backend/open_webui/tasks.py

@@ -5,16 +5,23 @@ from uuid import uuid4
 
 # A dictionary to keep track of active tasks
 tasks: Dict[str, asyncio.Task] = {}
+chat_tasks = {}
 
 
-def cleanup_task(task_id: str):
+def cleanup_task(task_id: str, id=None):
     """
     Remove a completed or canceled task from the global `tasks` dictionary.
     """
     tasks.pop(task_id, None)  # Remove the task if it exists
 
+    # If an ID is provided, remove the task from the chat_tasks dictionary
+    if id and task_id in chat_tasks.get(id, []):
+        chat_tasks[id].remove(task_id)
+        if not chat_tasks[id]:  # If no tasks left for this ID, remove the entry
+            chat_tasks.pop(id, None)
 
-def create_task(coroutine):
+
+def create_task(coroutine, id=None):
     """
     Create a new asyncio task and add it to the global task dictionary.
     """
@@ -22,9 +29,15 @@ def create_task(coroutine):
     task = asyncio.create_task(coroutine)  # Create the task
 
     # Add a done callback for cleanup
-    task.add_done_callback(lambda t: cleanup_task(task_id))
-
+    task.add_done_callback(lambda t: cleanup_task(task_id, id))
     tasks[task_id] = task
+
+    # If an ID is provided, associate the task with that ID
+    if chat_tasks.get(id):
+        chat_tasks[id].append(task_id)
+    else:
+        chat_tasks[id] = [task_id]
+
     return task_id, task
 
 
@@ -42,6 +55,13 @@ def list_tasks():
     return list(tasks.keys())
 
 
+def list_task_ids_by_chat_id(id):
+    """
+    List all tasks associated with a specific ID.
+    """
+    return chat_tasks.get(id, [])
+
+
 async def stop_task(task_id: str):
     """
     Cancel a running task and remove it from the global task list.

+ 31 - 38
backend/open_webui/utils/middleware.py

@@ -235,46 +235,30 @@ async def chat_completion_tools_handler(
                 if isinstance(tool_result, str):
                     tool = tools[tool_function_name]
                     tool_id = tool.get("tool_id", "")
+
+                    tool_name = (
+                        f"{tool_id}/{tool_function_name}"
+                        if tool_id
+                        else f"{tool_function_name}"
+                    )
                     if tool.get("metadata", {}).get("citation", False) or tool.get(
                         "direct", False
                     ):
-
+                        # Citation is enabled for this tool
                         sources.append(
                             {
                                 "source": {
-                                    "name": (
-                                        f"TOOL:" + f"{tool_id}/{tool_function_name}"
-                                        if tool_id
-                                        else f"{tool_function_name}"
-                                    ),
+                                    "name": (f"TOOL:{tool_name}"),
                                 },
-                                "document": [tool_result, *tool_result_files],
-                                "metadata": [
-                                    {
-                                        "source": (
-                                            f"TOOL:" + f"{tool_id}/{tool_function_name}"
-                                            if tool_id
-                                            else f"{tool_function_name}"
-                                        )
-                                    }
-                                ],
+                                "document": [tool_result],
+                                "metadata": [{"source": (f"TOOL:{tool_name}")}],
                             }
                         )
                     else:
-                        sources.append(
-                            {
-                                "source": {},
-                                "document": [tool_result, *tool_result_files],
-                                "metadata": [
-                                    {
-                                        "source": (
-                                            f"TOOL:" + f"{tool_id}/{tool_function_name}"
-                                            if tool_id
-                                            else f"{tool_function_name}"
-                                        )
-                                    }
-                                ],
-                            }
+                        # Citation is not enabled for this tool
+                        body["messages"] = add_or_update_user_message(
+                            f"\nTool `{tool_name}` Output: {tool_result}",
+                            body["messages"],
                         )
 
                     if (
@@ -550,13 +534,20 @@ async def chat_image_generation_handler(
             }
         )
 
-        for image in images:
-            await __event_emitter__(
-                {
-                    "type": "message",
-                    "data": {"content": f"![Generated Image]({image['url']})\n"},
-                }
-            )
+        await __event_emitter__(
+            {
+                "type": "files",
+                "data": {
+                    "files": [
+                        {
+                            "type": "image",
+                            "url": image["url"],
+                        }
+                        for image in images
+                    ]
+                },
+            }
+        )
 
         system_message_content = "<context>User is shown the generated image, tell the user that the image has been generated</context>"
     except Exception as e:
@@ -2261,7 +2252,9 @@ async def process_chat_response(
                 await response.background()
 
         # background_tasks.add_task(post_response_handler, response, events)
-        task_id, _ = create_task(post_response_handler(response, events))
+        task_id, _ = create_task(
+            post_response_handler(response, events), id=metadata["chat_id"]
+        )
         return {"status": True, "task_id": task_id}
 
     else:

+ 6 - 3
backend/open_webui/utils/models.py

@@ -114,9 +114,12 @@ async def get_all_models(request, user: UserModel = None):
     for custom_model in custom_models:
         if custom_model.base_model_id is None:
             for model in models:
-                if (
-                    custom_model.id == model["id"]
-                    or custom_model.id == model["id"].split(":")[0]
+                if custom_model.id == model["id"] or (
+                    model.get("owned_by") == "ollama"
+                    and custom_model.id
+                    == model["id"].split(":")[
+                        0
+                    ]  # Ollama may return model ids in different formats (e.g., 'llama3' vs. 'llama3:7b')
                 ):
                     if custom_model.is_active:
                         model["name"] = custom_model.name

+ 13 - 64
backend/open_webui/utils/redis.py

@@ -4,7 +4,7 @@ from redis import asyncio as aioredis
 from urllib.parse import urlparse
 
 
-def parse_redis_sentinel_url(redis_url):
+def parse_redis_service_url(redis_url):
     parsed_url = urlparse(redis_url)
     if parsed_url.scheme != "redis":
         raise ValueError("Invalid Redis URL scheme. Must be 'redis'.")
@@ -20,7 +20,7 @@ def parse_redis_sentinel_url(redis_url):
 
 def get_redis_connection(redis_url, redis_sentinels, decode_responses=True):
     if redis_sentinels:
-        redis_config = parse_redis_sentinel_url(redis_url)
+        redis_config = parse_redis_service_url(redis_url)
         sentinel = redis.sentinel.Sentinel(
             redis_sentinels,
             port=redis_config["port"],
@@ -45,65 +45,14 @@ def get_sentinels_from_env(sentinel_hosts_env, sentinel_port_env):
     return []
 
 
-class AsyncRedisSentinelManager(socketio.AsyncRedisManager):
-    def __init__(
-        self,
-        sentinel_hosts,
-        sentinel_port=26379,
-        redis_port=6379,
-        service="mymaster",
-        db=0,
-        username=None,
-        password=None,
-        channel="socketio",
-        write_only=False,
-        logger=None,
-        redis_options=None,
-    ):
-        """
-        Initialize the Redis Sentinel Manager.
-        This implementation mostly replicates the __init__ of AsyncRedisManager and
-        overrides _redis_connect() with a version that uses Redis Sentinel
-
-        :param sentinel_hosts: List of Sentinel hosts
-        :param sentinel_port: Sentinel Port
-        :param redis_port: Redis Port (currently unsupported by aioredis!)
-        :param service: Master service name in Sentinel
-        :param db: Redis database to use
-        :param username: Redis username (if any) (currently unsupported by aioredis!)
-        :param password: Redis password (if any)
-        :param channel: The channel name on which the server sends and receives
-                        notifications. Must be the same in all the servers.
-        :param write_only: If set to ``True``, only initialize to emit events. The
-                           default of ``False`` initializes the class for emitting
-                           and receiving.
-        :param redis_options: additional keyword arguments to be passed to
-                              ``aioredis.from_url()``.
-        """
-        self._sentinels = [(host, sentinel_port) for host in sentinel_hosts]
-        self._redis_port = redis_port
-        self._service = service
-        self._db = db
-        self._username = username
-        self._password = password
-        self._channel = channel
-        self.redis_options = redis_options or {}
-
-        # connect and call grandparent constructor
-        self._redis_connect()
-        super(socketio.AsyncRedisManager, self).__init__(
-            channel=channel, write_only=write_only, logger=logger
-        )
-
-    def _redis_connect(self):
-        """Establish connections to Redis through Sentinel."""
-        sentinel = aioredis.sentinel.Sentinel(
-            self._sentinels,
-            port=self._redis_port,
-            db=self._db,
-            password=self._password,
-            **self.redis_options,
-        )
-
-        self.redis = sentinel.master_for(self._service)
-        self.pubsub = self.redis.pubsub(ignore_subscribe_messages=True)
+def get_sentinel_url_from_env(redis_url, sentinel_hosts_env, sentinel_port_env):
+    redis_config = parse_redis_service_url(redis_url)
+    username = redis_config["username"] or ""
+    password = redis_config["password"] or ""
+    auth_part = ""
+    if username or password:
+        auth_part = f"{username}:{password}@"
+    hosts_part = ",".join(
+        f"{host}:{sentinel_port_env}" for host in sentinel_hosts_env.split(",")
+    )
+    return f"redis+sentinel://{auth_part}{hosts_part}/{redis_config['db']}/{redis_config['service']}"

+ 2 - 0
backend/open_webui/utils/task.py

@@ -152,6 +152,8 @@ def rag_template(template: str, context: str, query: str):
     if template.strip() == "":
         template = DEFAULT_RAG_TEMPLATE
 
+    template = prompt_template(template)
+
     if "[context]" not in template and "{{CONTEXT}}" not in template:
         log.debug(
             "WARNING: The RAG template does not contain the '[context]' or '{{CONTEXT}}' placeholder."

+ 1 - 1
backend/requirements.txt

@@ -3,7 +3,7 @@ uvicorn[standard]==0.34.0
 pydantic==2.10.6
 python-multipart==0.0.20
 
-python-socketio==5.11.3
+python-socketio==5.13.0
 python-jose==3.4.0
 passlib[bcrypt]==1.7.4
 

+ 2 - 2
backend/start.sh

@@ -4,8 +4,8 @@ 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
+if [[ "${WEB_LOADER_ENGINE,,}" == "playwright" ]]; then
+    if [[ -z "${PLAYWRIGHT_WS_URL}" ]]; then
         echo "Installing Playwright browsers..."
         playwright install chromium
         playwright install-deps chromium

+ 2 - 2
backend/start_windows.bat

@@ -7,8 +7,8 @@ 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%" == "" (
+IF /I "%WEB_LOADER_ENGINE%" == "playwright" (
+    IF "%PLAYWRIGHT_WS_URL%" == "" (
         echo Installing Playwright browsers...
         playwright install chromium
         playwright install-deps chromium

+ 2 - 2
docker-compose.playwright.yaml

@@ -6,5 +6,5 @@ services:
 
   open-webui:
     environment:
-      - 'RAG_WEB_LOADER_ENGINE=playwright'
-      - 'PLAYWRIGHT_WS_URI=ws://playwright:3000'
+      - 'WEB_LOADER_ENGINE=playwright'
+      - 'PLAYWRIGHT_WS_URL=ws://playwright:3000'

File diff suppressed because it is too large
+ 496 - 102
package-lock.json


+ 4 - 4
package.json

@@ -1,6 +1,6 @@
 {
 	"name": "open-webui",
-	"version": "0.6.2",
+	"version": "0.6.5",
 	"private": true,
 	"scripts": {
 		"dev": "npm run pyodide:fetch && vite dev --host",
@@ -72,11 +72,11 @@
 		"async": "^3.2.5",
 		"bits-ui": "^0.19.7",
 		"codemirror": "^6.0.1",
-		"codemirror-lang-hcl": "^0.0.0-beta.2",
 		"codemirror-lang-elixir": "^4.0.0",
+		"codemirror-lang-hcl": "^0.0.0-beta.2",
 		"crc-32": "^1.2.2",
 		"dayjs": "^1.11.10",
-		"dompurify": "^3.1.6",
+		"dompurify": "^3.2.5",
 		"eventsource-parser": "^1.1.2",
 		"file-saver": "^2.0.5",
 		"fuse.js": "^7.0.0",
@@ -92,7 +92,7 @@
 		"katex": "^0.16.21",
 		"kokoro-js": "^1.1.1",
 		"marked": "^9.1.0",
-		"mermaid": "^10.9.3",
+		"mermaid": "^11.6.0",
 		"paneforge": "^0.0.6",
 		"panzoom": "^9.4.3",
 		"prosemirror-commands": "^1.6.0",

+ 8 - 6
pyproject.toml

@@ -9,9 +9,9 @@ dependencies = [
     "fastapi==0.115.7",
     "uvicorn[standard]==0.34.0",
     "pydantic==2.10.6",
-    "python-multipart==0.0.18",
+    "python-multipart==0.0.20",
 
-    "python-socketio==5.11.3",
+    "python-socketio==5.13.0",
     "python-jose==3.4.0",
     "passlib[bcrypt]==1.7.4",
 
@@ -26,7 +26,7 @@ dependencies = [
     "peewee==3.17.9",
     "peewee-migrate==1.12.2",
     "psycopg2-binary==2.9.9",
-    "pgvector==0.3.5",
+    "pgvector==0.4.0",
     "PyMySQL==1.1.1",
     "bcrypt==4.3.0",
 
@@ -52,7 +52,7 @@ dependencies = [
     "langchain-community==0.3.18",
 
     "fake-useragent==2.1.0",
-    "chromadb==0.6.2",
+    "chromadb==0.6.3",
     "pymilvus==2.5.0",
     "qdrant-client~=1.12.0",
     "opensearch-py==2.8.0",
@@ -99,7 +99,7 @@ dependencies = [
 
     "black==25.1.0",
     "langfuse==2.44.0",
-    "youtube-transcript-api==0.6.3",
+    "youtube-transcript-api==1.0.3",
     "pytube==15.0.0",
 
     "extract_msg",
@@ -113,7 +113,6 @@ dependencies = [
     "docker~=7.1.0",
     "pytest~=8.3.2",
     "pytest-docker~=3.1.1",
-    "moto[s3]>=5.0.26",
 
     "googleapis-common-protos==1.63.2",
     "google-cloud-storage==2.19.0",
@@ -128,6 +127,9 @@ dependencies = [
     "tencentcloud-sdk-python==3.0.1336",
 
     "gcp-storage-emulator>=2024.8.3",
+
+    "moto[s3]>=5.0.26",
+
 ]
 readme = "README.md"
 requires-python = ">= 3.11, < 3.13.0a1"

+ 22 - 0
src/app.css

@@ -218,6 +218,28 @@ input[type='number'] {
 	-moz-appearance: textfield; /* Firefox */
 }
 
+.katex-display {
+	@apply overflow-y-hidden overflow-x-auto max-w-full;
+}
+
+.katex-display::-webkit-scrollbar {
+	height: 0.4rem;
+	width: 0.4rem;
+}
+
+.katex-display:active::-webkit-scrollbar-thumb,
+.katex-display:focus::-webkit-scrollbar-thumb,
+.katex-display:hover::-webkit-scrollbar-thumb {
+	visibility: visible;
+}
+.katex-display::-webkit-scrollbar-thumb {
+	visibility: hidden;
+}
+
+.katex-display::-webkit-scrollbar-corner {
+	display: none;
+}
+
 .cm-editor {
 	height: 100%;
 	width: 100%;

+ 32 - 0
src/lib/apis/index.ts

@@ -260,6 +260,38 @@ export const stopTask = async (token: string, id: string) => {
 	return res;
 };
 
+export const getTaskIdsByChatId = async (token: string, chat_id: string) => {
+	let error = null;
+
+	const res = await fetch(`${WEBUI_BASE_URL}/api/tasks/chat/${chat_id}`, {
+		method: 'GET',
+		headers: {
+			Accept: 'application/json',
+			'Content-Type': 'application/json',
+			...(token && { authorization: `Bearer ${token}` })
+		}
+	})
+		.then(async (res) => {
+			if (!res.ok) throw await res.json();
+			return res.json();
+		})
+		.catch((err) => {
+			console.log(err);
+			if ('detail' in err) {
+				error = err.detail;
+			} else {
+				error = err;
+			}
+			return null;
+		});
+
+	if (error) {
+		throw error;
+	}
+
+	return res;
+};
+
 export const getToolServerData = async (token: string, url: string) => {
 	let error = null;
 

+ 1 - 2
src/lib/apis/knowledge/index.ts

@@ -346,7 +346,6 @@ export const deleteKnowledgeById = async (token: string, id: string) => {
 	return res;
 };
 
-
 export const reindexKnowledgeFiles = async (token: string) => {
 	let error = null;
 
@@ -373,4 +372,4 @@ export const reindexKnowledgeFiles = async (token: string) => {
 	}
 
 	return res;
-};
+};

+ 3 - 30
src/lib/apis/retrieval/index.ts

@@ -50,9 +50,9 @@ type YoutubeConfigForm = {
 };
 
 type RAGConfigForm = {
-	pdf_extract_images?: boolean;
-	enable_google_drive_integration?: boolean;
-	enable_onedrive_integration?: boolean;
+	PDF_EXTRACT_IMAGES?: boolean;
+	ENABLE_GOOGLE_DRIVE_INTEGRATION?: boolean;
+	ENABLE_ONEDRIVE_INTEGRATION?: boolean;
 	chunk?: ChunkConfigForm;
 	content_extraction?: ContentExtractConfigForm;
 	web_loader_ssl_verification?: boolean;
@@ -89,33 +89,6 @@ export const updateRAGConfig = async (token: string, payload: RAGConfigForm) =>
 	return res;
 };
 
-export const getRAGTemplate = async (token: string) => {
-	let error = null;
-
-	const res = await fetch(`${RETRIEVAL_API_BASE_URL}/template`, {
-		method: 'GET',
-		headers: {
-			'Content-Type': 'application/json',
-			Authorization: `Bearer ${token}`
-		}
-	})
-		.then(async (res) => {
-			if (!res.ok) throw await res.json();
-			return res.json();
-		})
-		.catch((err) => {
-			console.log(err);
-			error = err.detail;
-			return null;
-		});
-
-	if (error) {
-		throw error;
-	}
-
-	return res?.template ?? '';
-};
-
 export const getQuerySettings = async (token: string) => {
 	let error = null;
 

+ 1 - 1
src/lib/components/AddServerModal.svelte

@@ -35,7 +35,7 @@
 	let auth_type = 'bearer';
 	let key = '';
 
-	let accessControl = null;
+	let accessControl = {};
 
 	let enable = true;
 

+ 43 - 40
src/lib/components/admin/Settings/Audio.svelte

@@ -106,15 +106,15 @@
 				AZURE_SPEECH_OUTPUT_FORMAT: TTS_AZURE_SPEECH_OUTPUT_FORMAT
 			},
 			stt: {
-			    OPENAI_API_BASE_URL: STT_OPENAI_API_BASE_URL,
-			    OPENAI_API_KEY: STT_OPENAI_API_KEY,
-			    ENGINE: STT_ENGINE,
-			    MODEL: STT_MODEL,
-			    WHISPER_MODEL: STT_WHISPER_MODEL,
-			    DEEPGRAM_API_KEY: STT_DEEPGRAM_API_KEY,
-			    AZURE_API_KEY: STT_AZURE_API_KEY,
-			    AZURE_REGION: STT_AZURE_REGION,
-			    AZURE_LOCALES: STT_AZURE_LOCALES
+				OPENAI_API_BASE_URL: STT_OPENAI_API_BASE_URL,
+				OPENAI_API_KEY: STT_OPENAI_API_KEY,
+				ENGINE: STT_ENGINE,
+				MODEL: STT_MODEL,
+				WHISPER_MODEL: STT_WHISPER_MODEL,
+				DEEPGRAM_API_KEY: STT_DEEPGRAM_API_KEY,
+				AZURE_API_KEY: STT_AZURE_API_KEY,
+				AZURE_REGION: STT_AZURE_REGION,
+				AZURE_LOCALES: STT_AZURE_LOCALES
 			}
 		});
 
@@ -150,7 +150,7 @@
 
 			STT_OPENAI_API_BASE_URL = res.stt.OPENAI_API_BASE_URL;
 			STT_OPENAI_API_KEY = res.stt.OPENAI_API_KEY;
-			
+
 			STT_ENGINE = res.stt.ENGINE;
 			STT_MODEL = res.stt.MODEL;
 			STT_WHISPER_MODEL = res.stt.WHISPER_MODEL;
@@ -190,7 +190,7 @@
 							<option value="web">{$i18n.t('Web API')}</option>
 							<option value="deepgram">Deepgram</option>
 							<option value="azure">Azure AI Speech</option>
-							</select>
+						</select>
 					</div>
 				</div>
 
@@ -259,34 +259,38 @@
 						</div>
 					</div>
 				{:else if STT_ENGINE === 'azure'}
-				<div>
-				<div class="mt-1 flex gap-2 mb-1">
-				    <SensitiveInput placeholder={$i18n.t('API Key')} bind:value={STT_AZURE_API_KEY} required />
-				    <input
-				        class="flex-1 w-full rounded-lg py-2 pl-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
-				        placeholder={$i18n.t('Azure Region')}
-				        bind:value={STT_AZURE_REGION}
-				        required
-				    />
-				</div>
-				
-				<hr class="border-gray-100 dark:border-gray-850 my-2" />
-				
-				<div>
-				<div class=" mb-1.5 text-sm font-medium">{$i18n.t('Language Locales')}</div>
-				<div class="flex w-full">
-				    <div class="flex-1">
-				        <input
-				            class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
-				            bind:value={STT_AZURE_LOCALES}
-				            placeholder={$i18n.t('e.g., en-US,ja-JP (leave blank for auto-detect)')}
-				        />
-				    </div>
-				</div>
-				</div>
-				</div>
+					<div>
+						<div class="mt-1 flex gap-2 mb-1">
+							<SensitiveInput
+								placeholder={$i18n.t('API Key')}
+								bind:value={STT_AZURE_API_KEY}
+								required
+							/>
+							<input
+								class="flex-1 w-full rounded-lg py-2 pl-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
+								placeholder={$i18n.t('Azure Region')}
+								bind:value={STT_AZURE_REGION}
+								required
+							/>
+						</div>
+
+						<hr class="border-gray-100 dark:border-gray-850 my-2" />
+
+						<div>
+							<div class=" mb-1.5 text-sm font-medium">{$i18n.t('Language Locales')}</div>
+							<div class="flex w-full">
+								<div class="flex-1">
+									<input
+										class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
+										bind:value={STT_AZURE_LOCALES}
+										placeholder={$i18n.t('e.g., en-US,ja-JP (leave blank for auto-detect)')}
+									/>
+								</div>
+							</div>
+						</div>
+					</div>
 				{:else if STT_ENGINE === ''}
-				<div>
+					<div>
 						<div class=" mb-1.5 text-sm font-medium">{$i18n.t('STT Model')}</div>
 
 						<div class="flex w-full">
@@ -464,8 +468,7 @@
 										<option
 											value={voice.voiceURI}
 											class="bg-gray-100 dark:bg-gray-700"
-											selected={TTS_VOICE === voice.voiceURI}
-											>{voice.name.replace('+', ', ')}</option
+											selected={TTS_VOICE === voice.voiceURI}>{voice.name}</option
 										>
 									{/each}
 								</select>

+ 552 - 622
src/lib/components/admin/Settings/Documents.svelte

@@ -17,8 +17,8 @@
 		updateRAGConfig
 	} from '$lib/apis/retrieval';
 
-	import {  reindexKnowledgeFiles} from '$lib/apis/knowledge';
-	import {  deleteAllFiles } from '$lib/apis/files';
+	import { reindexKnowledgeFiles } from '$lib/apis/knowledge';
+	import { deleteAllFiles } from '$lib/apis/files';
 
 	import ResetUploadDirConfirmDialog from '$lib/components/common/ConfirmDialog.svelte';
 	import ResetVectorDBConfirmDialog from '$lib/components/common/ConfirmDialog.svelte';
@@ -27,6 +27,7 @@
 	import Tooltip from '$lib/components/common/Tooltip.svelte';
 	import Switch from '$lib/components/common/Switch.svelte';
 	import Textarea from '$lib/components/common/Textarea.svelte';
+	import Spinner from '$lib/components/common/Spinner.svelte';
 
 	const i18n = getContext('i18n');
 
@@ -42,31 +43,6 @@
 	let embeddingBatchSize = 1;
 	let rerankingModel = '';
 
-	let fileMaxSize = null;
-	let fileMaxCount = null;
-
-	let contentExtractionEngine = 'default';
-	let tikaServerUrl = '';
-	let showTikaServerUrl = false;
-	let doclingServerUrl = '';
-	let showDoclingServerUrl = false;
-	let documentIntelligenceEndpoint = '';
-	let documentIntelligenceKey = '';
-	let showDocumentIntelligenceConfig = false;
-	let mistralApiKey = '';
-	let showMistralOcrConfig = false;
-
-	let textSplitter = '';
-	let chunkSize = 0;
-	let chunkOverlap = 0;
-	let pdfExtractImages = true;
-
-	let RAG_FULL_CONTEXT = false;
-	let BYPASS_EMBEDDING_AND_RETRIEVAL = false;
-
-	let enableGoogleDriveIntegration = false;
-	let enableOneDriveIntegration = false;
-
 	let OpenAIUrl = '';
 	let OpenAIKey = '';
 
@@ -81,6 +57,8 @@
 		hybrid: false
 	};
 
+	let RAGConfig = null;
+
 	const embeddingModelUpdateHandler = async () => {
 		if (embeddingEngine === '' && embeddingModel.split('/').length - 1 > 1) {
 			toast.error(
@@ -175,65 +153,40 @@
 	};
 
 	const submitHandler = async () => {
-		if (contentExtractionEngine === 'tika' && tikaServerUrl === '') {
+		if (RAGConfig.CONTENT_EXTRACTION_ENGINE === 'tika' && RAGConfig.TIKA_SERVER_URL === '') {
 			toast.error($i18n.t('Tika Server URL required.'));
 			return;
 		}
-		if (contentExtractionEngine === 'docling' && doclingServerUrl === '') {
+		if (RAGConfig.CONTENT_EXTRACTION_ENGINE === 'docling' && RAGConfig.DOCLING_SERVER_URL === '') {
 			toast.error($i18n.t('Docling Server URL required.'));
 			return;
 		}
+
 		if (
-			contentExtractionEngine === 'document_intelligence' &&
-			(documentIntelligenceEndpoint === '' || documentIntelligenceKey === '')
+			RAGConfig.CONTENT_EXTRACTION_ENGINE === 'document_intelligence' &&
+			(RAGConfig.DOCUMENT_INTELLIGENCE_ENDPOINT === '' ||
+				RAGConfig.DOCUMENT_INTELLIGENCE_KEY === '')
 		) {
 			toast.error($i18n.t('Document Intelligence endpoint and key required.'));
 			return;
 		}
-		if (contentExtractionEngine === 'mistral_ocr' && mistralApiKey === '') {
+		if (
+			RAGConfig.CONTENT_EXTRACTION_ENGINE === 'mistral_ocr' &&
+			RAGConfig.MISTRAL_OCR_API_KEY === ''
+		) {
 			toast.error($i18n.t('Mistral OCR API Key required.'));
 			return;
 		}
 
-		if (!BYPASS_EMBEDDING_AND_RETRIEVAL) {
+		if (!RAGConfig.BYPASS_EMBEDDING_AND_RETRIEVAL) {
 			await embeddingModelUpdateHandler();
 
-			if (querySettings.hybrid) {
+			if (RAGConfig.ENABLE_RAG_HYBRID_SEARCH) {
 				await rerankingModelUpdateHandler();
 			}
 		}
 
-		const res = await updateRAGConfig(localStorage.token, {
-			pdf_extract_images: pdfExtractImages,
-			enable_google_drive_integration: enableGoogleDriveIntegration,
-			enable_onedrive_integration: enableOneDriveIntegration,
-			file: {
-				max_size: fileMaxSize === '' ? null : fileMaxSize,
-				max_count: fileMaxCount === '' ? null : fileMaxCount
-			},
-			RAG_FULL_CONTEXT: RAG_FULL_CONTEXT,
-			BYPASS_EMBEDDING_AND_RETRIEVAL: BYPASS_EMBEDDING_AND_RETRIEVAL,
-			chunk: {
-				text_splitter: textSplitter,
-				chunk_overlap: chunkOverlap,
-				chunk_size: chunkSize
-			},
-			content_extraction: {
-				engine: contentExtractionEngine,
-				tika_server_url: tikaServerUrl,
-				docling_server_url: doclingServerUrl,
-				document_intelligence_config: {
-					key: documentIntelligenceKey,
-					endpoint: documentIntelligenceEndpoint
-				},
-				mistral_ocr_config: {
-					api_key: mistralApiKey
-				}
-			}
-		});
-
-		await updateQuerySettings(localStorage.token, querySettings);
-
+		const res = await updateRAGConfig(localStorage.token, RAGConfig);
 		dispatch('save');
 	};
 
@@ -261,46 +214,11 @@
 		}
 	};
 
-	const toggleHybridSearch = async () => {
-		querySettings = await updateQuerySettings(localStorage.token, querySettings);
-	};
-
 	onMount(async () => {
 		await setEmbeddingConfig();
 		await setRerankingConfig();
 
-		querySettings = await getQuerySettings(localStorage.token);
-
-		const res = await getRAGConfig(localStorage.token);
-
-		if (res) {
-			pdfExtractImages = res.pdf_extract_images;
-
-			textSplitter = res.chunk.text_splitter;
-			chunkSize = res.chunk.chunk_size;
-			chunkOverlap = res.chunk.chunk_overlap;
-
-			RAG_FULL_CONTEXT = res.RAG_FULL_CONTEXT;
-			BYPASS_EMBEDDING_AND_RETRIEVAL = res.BYPASS_EMBEDDING_AND_RETRIEVAL;
-
-			contentExtractionEngine = res.content_extraction.engine;
-			tikaServerUrl = res.content_extraction.tika_server_url;
-			doclingServerUrl = res.content_extraction.docling_server_url;
-
-			showTikaServerUrl = contentExtractionEngine === 'tika';
-			showDoclingServerUrl = contentExtractionEngine === 'docling';
-			documentIntelligenceEndpoint = res.content_extraction.document_intelligence_config.endpoint;
-			documentIntelligenceKey = res.content_extraction.document_intelligence_config.key;
-			showDocumentIntelligenceConfig = contentExtractionEngine === 'document_intelligence';
-			mistralApiKey = res.content_extraction.mistral_ocr_config.api_key;
-			showMistralOcrConfig = contentExtractionEngine === 'mistral_ocr';
-
-			fileMaxSize = res?.file.max_size ?? '';
-			fileMaxCount = res?.file.max_count ?? '';
-
-			enableGoogleDriveIntegration = res.enable_google_drive_integration;
-			enableOneDriveIntegration = res.enable_onedrive_integration;
-		}
+		RAGConfig = await getRAGConfig(localStorage.token);
 	});
 </script>
 
@@ -332,7 +250,6 @@
 	}}
 />
 
-
 <ReindexKnowledgeFilesConfirmDialog
 	bind:show={showReindexConfirm}
 	on:confirm={async () => {
@@ -353,339 +270,93 @@
 		submitHandler();
 	}}
 >
-	<div class=" space-y-2.5 overflow-y-scroll scrollbar-hidden h-full pr-1.5">
-		<div class="">
-			<div class="mb-3">
-				<div class=" mb-2.5 text-base font-medium">{$i18n.t('General')}</div>
-
-				<hr class=" border-gray-100 dark:border-gray-850 my-2" />
-
-				<div class="mb-2.5 flex flex-col w-full justify-between">
-					<div class="flex w-full justify-between">
-						<div class="self-center text-xs font-medium">
-							{$i18n.t('Content Extraction Engine')}
-						</div>
-						<div class="">
-							<select
-								class="dark:bg-gray-900 w-fit pr-8 rounded-sm px-2 text-xs bg-transparent outline-hidden text-right"
-								bind:value={contentExtractionEngine}
-							>
-								<option value="">{$i18n.t('Default')}</option>
-								<option value="tika">{$i18n.t('Tika')}</option>
-								<option value="docling">{$i18n.t('Docling')}</option>
-								<option value="document_intelligence">{$i18n.t('Document Intelligence')}</option>
-								<option value="mistral_ocr">{$i18n.t('Mistral OCR')}</option>
-							</select>
-						</div>
-					</div>
-					{#if contentExtractionEngine === 'tika'}
-						<div class="flex w-full mt-1">
-							<div class="flex-1 mr-2">
-								<input
-									class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
-									placeholder={$i18n.t('Enter Tika Server URL')}
-									bind:value={tikaServerUrl}
-								/>
-							</div>
-						</div>
-					{:else if contentExtractionEngine === 'docling'}
-						<div class="flex w-full mt-1">
-							<input
-								class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
-								placeholder={$i18n.t('Enter Docling Server URL')}
-								bind:value={doclingServerUrl}
-							/>
-						</div>
-					{:else if contentExtractionEngine === 'document_intelligence'}
-						<div class="my-0.5 flex gap-2 pr-2">
-							<input
-								class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
-								placeholder={$i18n.t('Enter Document Intelligence Endpoint')}
-								bind:value={documentIntelligenceEndpoint}
-							/>
-							<SensitiveInput
-								placeholder={$i18n.t('Enter Document Intelligence Key')}
-								bind:value={documentIntelligenceKey}
-							/>
-						</div>
-					{:else if contentExtractionEngine === 'mistral_ocr'}
-						<div class="my-0.5 flex gap-2 pr-2">
-							<SensitiveInput
-								placeholder={$i18n.t('Enter Mistral API Key')}
-								bind:value={mistralApiKey}
-							/>
-						</div>
-					{/if}
-				</div>
-
-				{#if contentExtractionEngine === ''}
-					<div class="  mb-2.5 flex w-full justify-between">
-						<div class=" self-center text-xs font-medium">
-							{$i18n.t('PDF Extract Images (OCR)')}
-						</div>
-						<div class="flex items-center relative">
-							<Switch bind:state={pdfExtractImages} />
-						</div>
-					</div>
-				{/if}
-
-				<div class="  mb-2.5 flex w-full justify-between">
-					<div class=" self-center text-xs font-medium">
-						<Tooltip content={$i18n.t('Full Context Mode')} placement="top-start">
-							{$i18n.t('Bypass Embedding and Retrieval')}
-						</Tooltip>
-					</div>
-					<div class="flex items-center relative">
-						<Tooltip
-							content={BYPASS_EMBEDDING_AND_RETRIEVAL
-								? $i18n.t(
-										'Inject the entire content as context for comprehensive processing, this is recommended for complex queries.'
-									)
-								: $i18n.t(
-										'Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.'
-									)}
-						>
-							<Switch bind:state={BYPASS_EMBEDDING_AND_RETRIEVAL} />
-						</Tooltip>
-					</div>
-				</div>
-
-				{#if !BYPASS_EMBEDDING_AND_RETRIEVAL}
-					<div class="  mb-2.5 flex w-full justify-between">
-						<div class=" self-center text-xs font-medium">{$i18n.t('Text Splitter')}</div>
-						<div class="flex items-center relative">
-							<select
-								class="dark:bg-gray-900 w-fit pr-8 rounded-sm px-2 text-xs bg-transparent outline-hidden text-right"
-								bind:value={textSplitter}
-							>
-								<option value="">{$i18n.t('Default')} ({$i18n.t('Character')})</option>
-								<option value="token">{$i18n.t('Token')} ({$i18n.t('Tiktoken')})</option>
-							</select>
-						</div>
-					</div>
-
-					<div class="  mb-2.5 flex w-full justify-between">
-						<div class=" flex gap-1.5 w-full">
-							<div class="  w-full justify-between">
-								<div class="self-center text-xs font-medium min-w-fit mb-1">
-									{$i18n.t('Chunk Size')}
-								</div>
-								<div class="self-center">
-									<input
-										class=" w-full rounded-lg py-1.5 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
-										type="number"
-										placeholder={$i18n.t('Enter Chunk Size')}
-										bind:value={chunkSize}
-										autocomplete="off"
-										min="0"
-									/>
-								</div>
-							</div>
-
-							<div class="w-full">
-								<div class=" self-center text-xs font-medium min-w-fit mb-1">
-									{$i18n.t('Chunk Overlap')}
-								</div>
-
-								<div class="self-center">
-									<input
-										class="w-full rounded-lg py-1.5 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
-										type="number"
-										placeholder={$i18n.t('Enter Chunk Overlap')}
-										bind:value={chunkOverlap}
-										autocomplete="off"
-										min="0"
-									/>
-								</div>
-							</div>
-						</div>
-					</div>
-				{/if}
-			</div>
-
-			{#if !BYPASS_EMBEDDING_AND_RETRIEVAL}
+	{#if RAGConfig}
+		<div class=" space-y-2.5 overflow-y-scroll scrollbar-hidden h-full pr-1.5">
+			<div class="">
 				<div class="mb-3">
-					<div class=" mb-2.5 text-base font-medium">{$i18n.t('Embedding')}</div>
+					<div class=" mb-2.5 text-base font-medium">{$i18n.t('General')}</div>
 
 					<hr class=" border-gray-100 dark:border-gray-850 my-2" />
 
-					<div class="  mb-2.5 flex flex-col w-full justify-between">
+					<div class="mb-2.5 flex flex-col w-full justify-between">
 						<div class="flex w-full justify-between">
-							<div class=" self-center text-xs font-medium">
-								{$i18n.t('Embedding Model Engine')}
+							<div class="self-center text-xs font-medium">
+								{$i18n.t('Content Extraction Engine')}
 							</div>
-							<div class="flex items-center relative">
+							<div class="">
 								<select
-									class="dark:bg-gray-900 w-fit pr-8 rounded-sm px-2 p-1 text-xs bg-transparent outline-hidden text-right"
-									bind:value={embeddingEngine}
-									placeholder="Select an embedding model engine"
-									on:change={(e) => {
-										if (e.target.value === 'ollama') {
-											embeddingModel = '';
-										} else if (e.target.value === 'openai') {
-											embeddingModel = 'text-embedding-3-small';
-										} else if (e.target.value === '') {
-											embeddingModel = 'sentence-transformers/all-MiniLM-L6-v2';
-										}
-									}}
+									class="dark:bg-gray-900 w-fit pr-8 rounded-sm px-2 text-xs bg-transparent outline-hidden text-right"
+									bind:value={RAGConfig.CONTENT_EXTRACTION_ENGINE}
 								>
-									<option value="">{$i18n.t('Default (SentenceTransformers)')}</option>
-									<option value="ollama">{$i18n.t('Ollama')}</option>
-									<option value="openai">{$i18n.t('OpenAI')}</option>
+									<option value="">{$i18n.t('Default')}</option>
+									<option value="tika">{$i18n.t('Tika')}</option>
+									<option value="docling">{$i18n.t('Docling')}</option>
+									<option value="document_intelligence">{$i18n.t('Document Intelligence')}</option>
+									<option value="mistral_ocr">{$i18n.t('Mistral OCR')}</option>
 								</select>
 							</div>
 						</div>
 
-						{#if embeddingEngine === 'openai'}
-							<div class="my-0.5 flex gap-2 pr-2">
+						{#if RAGConfig.CONTENT_EXTRACTION_ENGINE === ''}
+							<div class="flex w-full mt-1">
+								<div class="flex-1 flex justify-between">
+									<div class=" self-center text-xs font-medium">
+										{$i18n.t('PDF Extract Images (OCR)')}
+									</div>
+									<div class="flex items-center relative">
+										<Switch bind:state={RAGConfig.PDF_EXTRACT_IMAGES} />
+									</div>
+								</div>
+							</div>
+						{:else if RAGConfig.CONTENT_EXTRACTION_ENGINE === 'tika'}
+							<div class="flex w-full mt-1">
+								<div class="flex-1 mr-2">
+									<input
+										class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
+										placeholder={$i18n.t('Enter Tika Server URL')}
+										bind:value={RAGConfig.TIKA_SERVER_URL}
+									/>
+								</div>
+							</div>
+						{:else if RAGConfig.CONTENT_EXTRACTION_ENGINE === 'docling'}
+							<div class="flex w-full mt-1">
 								<input
 									class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
-									placeholder={$i18n.t('API Base URL')}
-									bind:value={OpenAIUrl}
-									required
+									placeholder={$i18n.t('Enter Docling Server URL')}
+									bind:value={RAGConfig.DOCLING_SERVER_URL}
 								/>
-
-								<SensitiveInput placeholder={$i18n.t('API Key')} bind:value={OpenAIKey} />
 							</div>
-						{:else if embeddingEngine === 'ollama'}
+						{:else if RAGConfig.CONTENT_EXTRACTION_ENGINE === 'document_intelligence'}
 							<div class="my-0.5 flex gap-2 pr-2">
 								<input
 									class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
-									placeholder={$i18n.t('API Base URL')}
-									bind:value={OllamaUrl}
-									required
+									placeholder={$i18n.t('Enter Document Intelligence Endpoint')}
+									bind:value={RAGConfig.DOCUMENT_INTELLIGENCE_ENDPOINT}
 								/>
-
 								<SensitiveInput
-									placeholder={$i18n.t('API Key')}
-									bind:value={OllamaKey}
-									required={false}
+									placeholder={$i18n.t('Enter Document Intelligence Key')}
+									bind:value={RAGConfig.DOCUMENT_INTELLIGENCE_KEY}
 								/>
 							</div>
-						{/if}
-					</div>
-
-					<div class="  mb-2.5 flex flex-col w-full">
-						<div class=" mb-1 text-xs font-medium">{$i18n.t('Embedding Model')}</div>
-
-						<div class="">
-							{#if embeddingEngine === 'ollama'}
-								<div class="flex w-full">
-									<div class="flex-1 mr-2">
-										<input
-											class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
-											bind:value={embeddingModel}
-											placeholder={$i18n.t('Set embedding model')}
-											required
-										/>
-									</div>
-								</div>
-							{:else}
-								<div class="flex w-full">
-									<div class="flex-1 mr-2">
-										<input
-											class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
-											placeholder={$i18n.t('Set embedding model (e.g. {{model}})', {
-												model: embeddingModel.slice(-40)
-											})}
-											bind:value={embeddingModel}
-										/>
-									</div>
-
-									{#if embeddingEngine === ''}
-										<button
-											class="px-2.5 bg-transparent text-gray-800 dark:bg-transparent dark:text-gray-100 rounded-lg transition"
-											on:click={() => {
-												embeddingModelUpdateHandler();
-											}}
-											disabled={updateEmbeddingModelLoading}
-										>
-											{#if updateEmbeddingModelLoading}
-												<div class="self-center">
-													<svg
-														class=" w-4 h-4"
-														viewBox="0 0 24 24"
-														fill="currentColor"
-														xmlns="http://www.w3.org/2000/svg"
-													>
-														<style>
-															.spinner_ajPY {
-																transform-origin: center;
-																animation: spinner_AtaB 0.75s infinite linear;
-															}
-
-															@keyframes spinner_AtaB {
-																100% {
-																	transform: rotate(360deg);
-																}
-															}
-														</style>
-														<path
-															d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
-															opacity=".25"
-														/>
-														<path
-															d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
-															class="spinner_ajPY"
-														/>
-													</svg>
-												</div>
-											{:else}
-												<svg
-													xmlns="http://www.w3.org/2000/svg"
-													viewBox="0 0 16 16"
-													fill="currentColor"
-													class="w-4 h-4"
-												>
-													<path
-														d="M8.75 2.75a.75.75 0 0 0-1.5 0v5.69L5.03 6.22a.75.75 0 0 0-1.06 1.06l3.5 3.5a.75.75 0 0 0 1.06 0l3.5-3.5a.75.75 0 0 0-1.06-1.06L8.75 8.44V2.75Z"
-													/>
-													<path
-														d="M3.5 9.75a.75.75 0 0 0-1.5 0v1.5A2.75 2.75 0 0 0 4.75 14h6.5A2.75 2.75 0 0 0 14 11.25v-1.5a.75.75 0 0 0-1.5 0v1.5c0 .69-.56 1.25-1.25 1.25h-6.5c-.69 0-1.25-.56-1.25-1.25v-1.5Z"
-													/>
-												</svg>
-											{/if}
-										</button>
-									{/if}
-								</div>
-							{/if}
-						</div>
-
-						<div class="mt-1 mb-1 text-xs text-gray-400 dark:text-gray-500">
-							{$i18n.t(
-								'Warning: If you update or change your embedding model, you will need to re-import all documents.'
-							)}
-						</div>
-					</div>
-
-					{#if embeddingEngine === 'ollama' || embeddingEngine === 'openai'}
-						<div class="  mb-2.5 flex w-full justify-between">
-							<div class=" self-center text-xs font-medium">{$i18n.t('Embedding Batch Size')}</div>
-
-							<div class="">
-								<input
-									bind:value={embeddingBatchSize}
-									type="number"
-									class=" bg-transparent text-center w-14 outline-none"
-									min="-2"
-									max="16000"
-									step="1"
+						{:else if RAGConfig.CONTENT_EXTRACTION_ENGINE === 'mistral_ocr'}
+							<div class="my-0.5 flex gap-2 pr-2">
+								<SensitiveInput
+									placeholder={$i18n.t('Enter Mistral API Key')}
+									bind:value={RAGConfig.MISTRAL_OCR_API_KEY}
 								/>
 							</div>
-						</div>
-					{/if}
-				</div>
-
-				<div class="mb-3">
-					<div class=" mb-2.5 text-base font-medium">{$i18n.t('Retrieval')}</div>
-
-					<hr class=" border-gray-100 dark:border-gray-850 my-2" />
+						{/if}
+					</div>
 
 					<div class="  mb-2.5 flex w-full justify-between">
-						<div class=" self-center text-xs font-medium">{$i18n.t('Full Context Mode')}</div>
+						<div class=" self-center text-xs font-medium">
+							<Tooltip content={$i18n.t('Full Context Mode')} placement="top-start">
+								{$i18n.t('Bypass Embedding and Retrieval')}
+							</Tooltip>
+						</div>
 						<div class="flex items-center relative">
 							<Tooltip
-								content={RAG_FULL_CONTEXT
+								content={RAGConfig.BYPASS_EMBEDDING_AND_RETRIEVAL
 									? $i18n.t(
 											'Inject the entire content as context for comprehensive processing, this is recommended for complex queries.'
 										)
@@ -693,301 +364,560 @@
 											'Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.'
 										)}
 							>
-								<Switch bind:state={RAG_FULL_CONTEXT} />
+								<Switch bind:state={RAGConfig.BYPASS_EMBEDDING_AND_RETRIEVAL} />
 							</Tooltip>
 						</div>
 					</div>
 
-					{#if !RAG_FULL_CONTEXT}
+					{#if !RAGConfig.BYPASS_EMBEDDING_AND_RETRIEVAL}
 						<div class="  mb-2.5 flex w-full justify-between">
-							<div class=" self-center text-xs font-medium">{$i18n.t('Hybrid Search')}</div>
+							<div class=" self-center text-xs font-medium">{$i18n.t('Text Splitter')}</div>
 							<div class="flex items-center relative">
-								<Switch
-									bind:state={querySettings.hybrid}
-									on:change={() => {
-										toggleHybridSearch();
-									}}
-								/>
+								<select
+									class="dark:bg-gray-900 w-fit pr-8 rounded-sm px-2 text-xs bg-transparent outline-hidden text-right"
+									bind:value={RAGConfig.TEXT_SPLITTER}
+								>
+									<option value="">{$i18n.t('Default')} ({$i18n.t('Character')})</option>
+									<option value="token">{$i18n.t('Token')} ({$i18n.t('Tiktoken')})</option>
+								</select>
 							</div>
 						</div>
 
-						{#if querySettings.hybrid === true}
-							<div class="  mb-2.5 flex flex-col w-full">
-								<div class=" mb-1 text-xs font-medium">{$i18n.t('Reranking Model')}</div>
+						<div class="  mb-2.5 flex w-full justify-between">
+							<div class=" flex gap-1.5 w-full">
+								<div class="  w-full justify-between">
+									<div class="self-center text-xs font-medium min-w-fit mb-1">
+										{$i18n.t('Chunk Size')}
+									</div>
+									<div class="self-center">
+										<input
+											class=" w-full rounded-lg py-1.5 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
+											type="number"
+											placeholder={$i18n.t('Enter Chunk Size')}
+											bind:value={RAGConfig.CHUNK_SIZE}
+											autocomplete="off"
+											min="0"
+										/>
+									</div>
+								</div>
+
+								<div class="w-full">
+									<div class=" self-center text-xs font-medium min-w-fit mb-1">
+										{$i18n.t('Chunk Overlap')}
+									</div>
 
-								<div class="">
+									<div class="self-center">
+										<input
+											class="w-full rounded-lg py-1.5 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
+											type="number"
+											placeholder={$i18n.t('Enter Chunk Overlap')}
+											bind:value={RAGConfig.CHUNK_OVERLAP}
+											autocomplete="off"
+											min="0"
+										/>
+									</div>
+								</div>
+							</div>
+						</div>
+					{/if}
+				</div>
+
+				{#if !RAGConfig.BYPASS_EMBEDDING_AND_RETRIEVAL}
+					<div class="mb-3">
+						<div class=" mb-2.5 text-base font-medium">{$i18n.t('Embedding')}</div>
+
+						<hr class=" border-gray-100 dark:border-gray-850 my-2" />
+
+						<div class="  mb-2.5 flex flex-col w-full justify-between">
+							<div class="flex w-full justify-between">
+								<div class=" self-center text-xs font-medium">
+									{$i18n.t('Embedding Model Engine')}
+								</div>
+								<div class="flex items-center relative">
+									<select
+										class="dark:bg-gray-900 w-fit pr-8 rounded-sm px-2 p-1 text-xs bg-transparent outline-hidden text-right"
+										bind:value={embeddingEngine}
+										placeholder="Select an embedding model engine"
+										on:change={(e) => {
+											if (e.target.value === 'ollama') {
+												embeddingModel = '';
+											} else if (e.target.value === 'openai') {
+												embeddingModel = 'text-embedding-3-small';
+											} else if (e.target.value === '') {
+												embeddingModel = 'sentence-transformers/all-MiniLM-L6-v2';
+											}
+										}}
+									>
+										<option value="">{$i18n.t('Default (SentenceTransformers)')}</option>
+										<option value="ollama">{$i18n.t('Ollama')}</option>
+										<option value="openai">{$i18n.t('OpenAI')}</option>
+									</select>
+								</div>
+							</div>
+
+							{#if embeddingEngine === 'openai'}
+								<div class="my-0.5 flex gap-2 pr-2">
+									<input
+										class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
+										placeholder={$i18n.t('API Base URL')}
+										bind:value={OpenAIUrl}
+										required
+									/>
+
+									<SensitiveInput placeholder={$i18n.t('API Key')} bind:value={OpenAIKey} />
+								</div>
+							{:else if embeddingEngine === 'ollama'}
+								<div class="my-0.5 flex gap-2 pr-2">
+									<input
+										class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
+										placeholder={$i18n.t('API Base URL')}
+										bind:value={OllamaUrl}
+										required
+									/>
+
+									<SensitiveInput
+										placeholder={$i18n.t('API Key')}
+										bind:value={OllamaKey}
+										required={false}
+									/>
+								</div>
+							{/if}
+						</div>
+
+						<div class="  mb-2.5 flex flex-col w-full">
+							<div class=" mb-1 text-xs font-medium">{$i18n.t('Embedding Model')}</div>
+
+							<div class="">
+								{#if embeddingEngine === 'ollama'}
+									<div class="flex w-full">
+										<div class="flex-1 mr-2">
+											<input
+												class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
+												bind:value={embeddingModel}
+												placeholder={$i18n.t('Set embedding model')}
+												required
+											/>
+										</div>
+									</div>
+								{:else}
 									<div class="flex w-full">
 										<div class="flex-1 mr-2">
 											<input
 												class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
-												placeholder={$i18n.t('Set reranking model (e.g. {{model}})', {
-													model: 'BAAI/bge-reranker-v2-m3'
+												placeholder={$i18n.t('Set embedding model (e.g. {{model}})', {
+													model: embeddingModel.slice(-40)
 												})}
-												bind:value={rerankingModel}
+												bind:value={embeddingModel}
 											/>
 										</div>
-										<button
-											class="px-2.5 bg-transparent text-gray-800 dark:bg-transparent dark:text-gray-100 rounded-lg transition"
-											on:click={() => {
-												rerankingModelUpdateHandler();
-											}}
-											disabled={updateRerankingModelLoading}
-										>
-											{#if updateRerankingModelLoading}
-												<div class="self-center">
+
+										{#if embeddingEngine === ''}
+											<button
+												class="px-2.5 bg-transparent text-gray-800 dark:bg-transparent dark:text-gray-100 rounded-lg transition"
+												on:click={() => {
+													embeddingModelUpdateHandler();
+												}}
+												disabled={updateEmbeddingModelLoading}
+											>
+												{#if updateEmbeddingModelLoading}
+													<div class="self-center">
+														<svg
+															class=" w-4 h-4"
+															viewBox="0 0 24 24"
+															fill="currentColor"
+															xmlns="http://www.w3.org/2000/svg"
+														>
+															<style>
+																.spinner_ajPY {
+																	transform-origin: center;
+																	animation: spinner_AtaB 0.75s infinite linear;
+																}
+
+																@keyframes spinner_AtaB {
+																	100% {
+																		transform: rotate(360deg);
+																	}
+																}
+															</style>
+															<path
+																d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
+																opacity=".25"
+															/>
+															<path
+																d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
+																class="spinner_ajPY"
+															/>
+														</svg>
+													</div>
+												{:else}
 													<svg
-														class=" w-4 h-4"
-														viewBox="0 0 24 24"
-														fill="currentColor"
 														xmlns="http://www.w3.org/2000/svg"
+														viewBox="0 0 16 16"
+														fill="currentColor"
+														class="w-4 h-4"
 													>
-														<style>
-															.spinner_ajPY {
-																transform-origin: center;
-																animation: spinner_AtaB 0.75s infinite linear;
-															}
-
-															@keyframes spinner_AtaB {
-																100% {
-																	transform: rotate(360deg);
-																}
-															}
-														</style>
 														<path
-															d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
-															opacity=".25"
+															d="M8.75 2.75a.75.75 0 0 0-1.5 0v5.69L5.03 6.22a.75.75 0 0 0-1.06 1.06l3.5 3.5a.75.75 0 0 0 1.06 0l3.5-3.5a.75.75 0 0 0-1.06-1.06L8.75 8.44V2.75Z"
 														/>
 														<path
-															d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
-															class="spinner_ajPY"
+															d="M3.5 9.75a.75.75 0 0 0-1.5 0v1.5A2.75 2.75 0 0 0 4.75 14h6.5A2.75 2.75 0 0 0 14 11.25v-1.5a.75.75 0 0 0-1.5 0v1.5c0 .69-.56 1.25-1.25 1.25h-6.5c-.69 0-1.25-.56-1.25-1.25v-1.5Z"
 														/>
 													</svg>
-												</div>
-											{:else}
-												<svg
-													xmlns="http://www.w3.org/2000/svg"
-													viewBox="0 0 16 16"
-													fill="currentColor"
-													class="w-4 h-4"
-												>
-													<path
-														d="M8.75 2.75a.75.75 0 0 0-1.5 0v5.69L5.03 6.22a.75.75 0 0 0-1.06 1.06l3.5 3.5a.75.75 0 0 0 1.06 0l3.5-3.5a.75.75 0 0 0-1.06-1.06L8.75 8.44V2.75Z"
-													/>
-													<path
-														d="M3.5 9.75a.75.75 0 0 0-1.5 0v1.5A2.75 2.75 0 0 0 4.75 14h6.5A2.75 2.75 0 0 0 14 11.25v-1.5a.75.75 0 0 0-1.5 0v1.5c0 .69-.56 1.25-1.25 1.25h-6.5c-.69 0-1.25-.56-1.25-1.25v-1.5Z"
-													/>
-												</svg>
-											{/if}
-										</button>
+												{/if}
+											</button>
+										{/if}
 									</div>
+								{/if}
+							</div>
+
+							<div class="mt-1 mb-1 text-xs text-gray-400 dark:text-gray-500">
+								{$i18n.t(
+									'Warning: If you update or change your embedding model, you will need to re-import all documents.'
+								)}
+							</div>
+						</div>
+
+						{#if embeddingEngine === 'ollama' || embeddingEngine === 'openai'}
+							<div class="  mb-2.5 flex w-full justify-between">
+								<div class=" self-center text-xs font-medium">
+									{$i18n.t('Embedding Batch Size')}
+								</div>
+
+								<div class="">
+									<input
+										bind:value={embeddingBatchSize}
+										type="number"
+										class=" bg-transparent text-center w-14 outline-none"
+										min="-2"
+										max="16000"
+										step="1"
+									/>
 								</div>
 							</div>
 						{/if}
+					</div>
+
+					<div class="mb-3">
+						<div class=" mb-2.5 text-base font-medium">{$i18n.t('Retrieval')}</div>
+
+						<hr class=" border-gray-100 dark:border-gray-850 my-2" />
 
 						<div class="  mb-2.5 flex w-full justify-between">
-							<div class=" self-center text-xs font-medium">{$i18n.t('Top K')}</div>
+							<div class=" self-center text-xs font-medium">{$i18n.t('Full Context Mode')}</div>
 							<div class="flex items-center relative">
-								<input
-									class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
-									type="number"
-									placeholder={$i18n.t('Enter Top K')}
-									bind:value={querySettings.k}
-									autocomplete="off"
-									min="0"
-								/>
+								<Tooltip
+									content={RAGConfig.RAG_FULL_CONTEXT
+										? $i18n.t(
+												'Inject the entire content as context for comprehensive processing, this is recommended for complex queries.'
+											)
+										: $i18n.t(
+												'Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.'
+											)}
+								>
+									<Switch bind:state={RAGConfig.RAG_FULL_CONTEXT} />
+								</Tooltip>
 							</div>
 						</div>
 
-						{#if querySettings.hybrid === true}
-							<div class="mb-2.5 flex w-full justify-between">
-								<div class="self-center text-xs font-medium">{$i18n.t('Top K Reranker')}</div>
+						{#if !RAGConfig.RAG_FULL_CONTEXT}
+							<div class="  mb-2.5 flex w-full justify-between">
+								<div class=" self-center text-xs font-medium">{$i18n.t('Hybrid Search')}</div>
+								<div class="flex items-center relative">
+									<Switch
+										bind:state={RAGConfig.ENABLE_RAG_HYBRID_SEARCH}
+										on:change={() => {
+											submitHandler();
+										}}
+									/>
+								</div>
+							</div>
+
+							{#if RAGConfig.ENABLE_RAG_HYBRID_SEARCH === true}
+								<div class="  mb-2.5 flex flex-col w-full">
+									<div class=" mb-1 text-xs font-medium">{$i18n.t('Reranking Model')}</div>
+
+									<div class="">
+										<div class="flex w-full">
+											<div class="flex-1 mr-2">
+												<input
+													class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
+													placeholder={$i18n.t('Set reranking model (e.g. {{model}})', {
+														model: 'BAAI/bge-reranker-v2-m3'
+													})}
+													bind:value={rerankingModel}
+												/>
+											</div>
+											<button
+												class="px-2.5 bg-transparent text-gray-800 dark:bg-transparent dark:text-gray-100 rounded-lg transition"
+												on:click={() => {
+													rerankingModelUpdateHandler();
+												}}
+												disabled={updateRerankingModelLoading}
+											>
+												{#if updateRerankingModelLoading}
+													<div class="self-center">
+														<svg
+															class=" w-4 h-4"
+															viewBox="0 0 24 24"
+															fill="currentColor"
+															xmlns="http://www.w3.org/2000/svg"
+														>
+															<style>
+																.spinner_ajPY {
+																	transform-origin: center;
+																	animation: spinner_AtaB 0.75s infinite linear;
+																}
+
+																@keyframes spinner_AtaB {
+																	100% {
+																		transform: rotate(360deg);
+																	}
+																}
+															</style>
+															<path
+																d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
+																opacity=".25"
+															/>
+															<path
+																d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
+																class="spinner_ajPY"
+															/>
+														</svg>
+													</div>
+												{:else}
+													<svg
+														xmlns="http://www.w3.org/2000/svg"
+														viewBox="0 0 16 16"
+														fill="currentColor"
+														class="w-4 h-4"
+													>
+														<path
+															d="M8.75 2.75a.75.75 0 0 0-1.5 0v5.69L5.03 6.22a.75.75 0 0 0-1.06 1.06l3.5 3.5a.75.75 0 0 0 1.06 0l3.5-3.5a.75.75 0 0 0-1.06-1.06L8.75 8.44V2.75Z"
+														/>
+														<path
+															d="M3.5 9.75a.75.75 0 0 0-1.5 0v1.5A2.75 2.75 0 0 0 4.75 14h6.5A2.75 2.75 0 0 0 14 11.25v-1.5a.75.75 0 0 0-1.5 0v1.5c0 .69-.56 1.25-1.25 1.25h-6.5c-.69 0-1.25-.56-1.25-1.25v-1.5Z"
+														/>
+													</svg>
+												{/if}
+											</button>
+										</div>
+									</div>
+								</div>
+							{/if}
+
+							<div class="  mb-2.5 flex w-full justify-between">
+								<div class=" self-center text-xs font-medium">{$i18n.t('Top K')}</div>
 								<div class="flex items-center relative">
 									<input
 										class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
 										type="number"
-										placeholder={$i18n.t('Enter Top K Reranker')}
-										bind:value={querySettings.k_reranker}
+										placeholder={$i18n.t('Enter Top K')}
+										bind:value={RAGConfig.TOP_K}
 										autocomplete="off"
 										min="0"
 									/>
 								</div>
 							</div>
-						{/if}
 
-						{#if querySettings.hybrid === true}
-							<div class="  mb-2.5 flex flex-col w-full justify-between">
-								<div class=" flex w-full justify-between">
-									<div class=" self-center text-xs font-medium">{$i18n.t('Minimum Score')}</div>
+							{#if RAGConfig.ENABLE_RAG_HYBRID_SEARCH === true}
+								<div class="mb-2.5 flex w-full justify-between">
+									<div class="self-center text-xs font-medium">{$i18n.t('Top K Reranker')}</div>
 									<div class="flex items-center relative">
 										<input
 											class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
 											type="number"
-											step="0.01"
-											placeholder={$i18n.t('Enter Score')}
-											bind:value={querySettings.r}
+											placeholder={$i18n.t('Enter Top K Reranker')}
+											bind:value={RAGConfig.TOP_K_RERANKER}
 											autocomplete="off"
-											min="0.0"
-											title={$i18n.t(
-												'The score should be a value between 0.0 (0%) and 1.0 (100%).'
-											)}
+											min="0"
 										/>
 									</div>
 								</div>
-								<div class="mt-1 text-xs text-gray-400 dark:text-gray-500">
-									{$i18n.t(
-										'Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.'
-									)}
+							{/if}
+
+							{#if RAGConfig.ENABLE_RAG_HYBRID_SEARCH === true}
+								<div class="  mb-2.5 flex flex-col w-full justify-between">
+									<div class=" flex w-full justify-between">
+										<div class=" self-center text-xs font-medium">
+											{$i18n.t('Relevance Threshold')}
+										</div>
+										<div class="flex items-center relative">
+											<input
+												class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
+												type="number"
+												step="0.01"
+												placeholder={$i18n.t('Enter Score')}
+												bind:value={RAGConfig.RELEVANCE_THRESHOLD}
+												autocomplete="off"
+												min="0.0"
+												title={$i18n.t(
+													'The score should be a value between 0.0 (0%) and 1.0 (100%).'
+												)}
+											/>
+										</div>
+									</div>
+									<div class="mt-1 text-xs text-gray-400 dark:text-gray-500">
+										{$i18n.t(
+											'Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.'
+										)}
+									</div>
 								</div>
-							</div>
+							{/if}
 						{/if}
-					{/if}
 
-					<div class="  mb-2.5 flex flex-col w-full justify-between">
-						<div class=" mb-1 text-xs font-medium">{$i18n.t('RAG Template')}</div>
-						<div class="flex w-full items-center relative">
+						<div class="  mb-2.5 flex flex-col w-full justify-between">
+							<div class=" mb-1 text-xs font-medium">{$i18n.t('RAG Template')}</div>
+							<div class="flex w-full items-center relative">
+								<Tooltip
+									content={$i18n.t(
+										'Leave empty to use the default prompt, or enter a custom prompt'
+									)}
+									placement="top-start"
+									className="w-full"
+								>
+									<Textarea
+										bind:value={RAGConfig.RAG_TEMPLATE}
+										placeholder={$i18n.t(
+											'Leave empty to use the default prompt, or enter a custom prompt'
+										)}
+									/>
+								</Tooltip>
+							</div>
+						</div>
+					</div>
+				{/if}
+
+				<div class="mb-3">
+					<div class=" mb-2.5 text-base font-medium">{$i18n.t('Files')}</div>
+
+					<hr class=" border-gray-100 dark:border-gray-850 my-2" />
+
+					<div class="  mb-2.5 flex w-full justify-between">
+						<div class=" self-center text-xs font-medium">{$i18n.t('Max Upload Size')}</div>
+						<div class="flex items-center relative">
 							<Tooltip
-								content={$i18n.t('Leave empty to use the default prompt, or enter a custom prompt')}
+								content={$i18n.t(
+									'The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.'
+								)}
 								placement="top-start"
-								className="w-full"
 							>
-								<Textarea
-									bind:value={querySettings.template}
-									placeholder={$i18n.t(
-										'Leave empty to use the default prompt, or enter a custom prompt'
-									)}
+								<input
+									class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
+									type="number"
+									placeholder={$i18n.t('Leave empty for unlimited')}
+									bind:value={RAGConfig.FILE_MAX_SIZE}
+									autocomplete="off"
+									min="0"
 								/>
 							</Tooltip>
 						</div>
 					</div>
-				</div>
-			{/if}
-
-			<div class="mb-3">
-				<div class=" mb-2.5 text-base font-medium">{$i18n.t('Files')}</div>
-
-				<hr class=" border-gray-100 dark:border-gray-850 my-2" />
-
-				<div class="  mb-2.5 flex w-full justify-between">
-					<div class=" self-center text-xs font-medium">{$i18n.t('Max Upload Size')}</div>
-					<div class="flex items-center relative">
-						<Tooltip
-							content={$i18n.t(
-								'The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.'
-							)}
-							placement="top-start"
-						>
-							<input
-								class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
-								type="number"
-								placeholder={$i18n.t('Leave empty for unlimited')}
-								bind:value={fileMaxSize}
-								autocomplete="off"
-								min="0"
-							/>
-						</Tooltip>
-					</div>
-				</div>
 
-				<div class="  mb-2.5 flex w-full justify-between">
-					<div class=" self-center text-xs font-medium">{$i18n.t('Max Upload Count')}</div>
-					<div class="flex items-center relative">
-						<Tooltip
-							content={$i18n.t(
-								'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.'
-							)}
-							placement="top-start"
-						>
-							<input
-								class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
-								type="number"
-								placeholder={$i18n.t('Leave empty for unlimited')}
-								bind:value={fileMaxCount}
-								autocomplete="off"
-								min="0"
-							/>
-						</Tooltip>
+					<div class="  mb-2.5 flex w-full justify-between">
+						<div class=" self-center text-xs font-medium">{$i18n.t('Max Upload Count')}</div>
+						<div class="flex items-center relative">
+							<Tooltip
+								content={$i18n.t(
+									'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.'
+								)}
+								placement="top-start"
+							>
+								<input
+									class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
+									type="number"
+									placeholder={$i18n.t('Leave empty for unlimited')}
+									bind:value={RAGConfig.FILE_MAX_COUNT}
+									autocomplete="off"
+									min="0"
+								/>
+							</Tooltip>
+						</div>
 					</div>
 				</div>
-			</div>
 
-			<div class="mb-3">
-				<div class=" mb-2.5 text-base font-medium">{$i18n.t('Integration')}</div>
+				<div class="mb-3">
+					<div class=" mb-2.5 text-base font-medium">{$i18n.t('Integration')}</div>
 
-				<hr class=" border-gray-100 dark:border-gray-850 my-2" />
+					<hr class=" border-gray-100 dark:border-gray-850 my-2" />
 
-				<div class="  mb-2.5 flex w-full justify-between">
-					<div class=" self-center text-xs font-medium">{$i18n.t('Google Drive')}</div>
-					<div class="flex items-center relative">
-						<Switch bind:state={enableGoogleDriveIntegration} />
+					<div class="  mb-2.5 flex w-full justify-between">
+						<div class=" self-center text-xs font-medium">{$i18n.t('Google Drive')}</div>
+						<div class="flex items-center relative">
+							<Switch bind:state={RAGConfig.ENABLE_GOOGLE_DRIVE_INTEGRATION} />
+						</div>
 					</div>
-				</div>
 
-				<div class="  mb-2.5 flex w-full justify-between">
-					<div class=" self-center text-xs font-medium">{$i18n.t('OneDrive')}</div>
-					<div class="flex items-center relative">
-						<Switch bind:state={enableOneDriveIntegration} />
+					<div class="  mb-2.5 flex w-full justify-between">
+						<div class=" self-center text-xs font-medium">{$i18n.t('OneDrive')}</div>
+						<div class="flex items-center relative">
+							<Switch bind:state={RAGConfig.ENABLE_ONEDRIVE_INTEGRATION} />
+						</div>
 					</div>
 				</div>
-			</div>
 
-			<div class="mb-3">
-				<div class=" mb-2.5 text-base font-medium">{$i18n.t('Danger Zone')}</div>
-
-				<hr class=" border-gray-100 dark:border-gray-850 my-2" />
-
-				<div class="  mb-2.5 flex w-full justify-between">
-					<div class=" self-center text-xs font-medium">{$i18n.t('Reset Upload Directory')}</div>
-					<div class="flex items-center relative">
-						<button
-							class="text-xs"
-							on:click={() => {
-								showResetUploadDirConfirm = true;
-							}}
-						>
-							{$i18n.t('Reset')}
-						</button>
-					</div>
-				</div>
+				<div class="mb-3">
+					<div class=" mb-2.5 text-base font-medium">{$i18n.t('Danger Zone')}</div>
 
-				<div class="  mb-2.5 flex w-full justify-between">
-					<div class=" self-center text-xs font-medium">
-						{$i18n.t('Reset Vector Storage/Knowledge')}
-					</div>
-					<div class="flex items-center relative">
-						<button
-							class="text-xs"
-							on:click={() => {
-								showResetConfirm = true;
-							}}
-						>
-							{$i18n.t('Reset')}
-						</button>
+					<hr class=" border-gray-100 dark:border-gray-850 my-2" />
+
+					<div class="  mb-2.5 flex w-full justify-between">
+						<div class=" self-center text-xs font-medium">{$i18n.t('Reset Upload Directory')}</div>
+						<div class="flex items-center relative">
+							<button
+								class="text-xs"
+								on:click={() => {
+									showResetUploadDirConfirm = true;
+								}}
+							>
+								{$i18n.t('Reset')}
+							</button>
+						</div>
 					</div>
-				</div>
-				<div class="  mb-2.5 flex w-full justify-between">
-					<div class=" self-center text-xs font-medium">
-						{$i18n.t('Reindex Knowledge Base Vectors')}
+
+					<div class="  mb-2.5 flex w-full justify-between">
+						<div class=" self-center text-xs font-medium">
+							{$i18n.t('Reset Vector Storage/Knowledge')}
+						</div>
+						<div class="flex items-center relative">
+							<button
+								class="text-xs"
+								on:click={() => {
+									showResetConfirm = true;
+								}}
+							>
+								{$i18n.t('Reset')}
+							</button>
+						</div>
 					</div>
-					<div class="flex items-center relative">
-						<button
-							class="text-xs"
-							on:click={() => {
-								showReindexConfirm = true;
-							}}
-						>
-							{$i18n.t('Reindex')}
-						</button>
+					<div class="  mb-2.5 flex w-full justify-between">
+						<div class=" self-center text-xs font-medium">
+							{$i18n.t('Reindex Knowledge Base Vectors')}
+						</div>
+						<div class="flex items-center relative">
+							<button
+								class="text-xs"
+								on:click={() => {
+									showReindexConfirm = true;
+								}}
+							>
+								{$i18n.t('Reindex')}
+							</button>
+						</div>
 					</div>
 				</div>
 			</div>
 		</div>
-	</div>
-	<div class="flex justify-end pt-3 text-sm font-medium">
-		<button
-			class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full"
-			type="submit"
-		>
-			{$i18n.t('Save')}
-		</button>
-	</div>
+		<div class="flex justify-end pt-3 text-sm font-medium">
+			<button
+				class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full"
+				type="submit"
+			>
+				{$i18n.t('Save')}
+			</button>
+		</div>
+	{:else}
+		<div class="flex items-center justify-center h-full">
+			<Spinner />
+		</div>
+	{/if}
 </form>

+ 9 - 1
src/lib/components/admin/Settings/Models.svelte

@@ -108,7 +108,15 @@
 				toast.success($i18n.t('Model updated successfully'));
 			}
 		} else {
-			const res = await createNewModel(localStorage.token, model).catch((error) => {
+			const res = await createNewModel(localStorage.token, {
+				meta: {},
+				id: model.id,
+				name: model.name,
+				base_model_id: null,
+				params: {},
+				access_control: {},
+				...model
+			}).catch((error) => {
 				return null;
 			});
 

+ 236 - 116
src/lib/components/admin/Settings/WebSearch.svelte

@@ -12,7 +12,6 @@
 
 	export let saveHandler: Function;
 
-	let webConfig = null;
 	let webSearchEngines = [
 		'searxng',
 		'google_pse',
@@ -33,32 +32,35 @@
 		'perplexity',
 		'sougou'
 	];
+	let webLoaderEngines = ['playwright', 'firecrawl', 'tavily'];
 
-	let youtubeLanguage = 'en';
-	let youtubeTranslation = null;
-	let youtubeProxyUrl = '';
+	let webConfig = null;
 
 	const submitHandler = async () => {
 		// Convert domain filter string to array before sending
-		if (webConfig.search.domain_filter_list) {
-			webConfig.search.domain_filter_list = webConfig.search.domain_filter_list
-				.split(',')
+		if (webConfig.WEB_SEARCH_DOMAIN_FILTER_LIST) {
+			webConfig.WEB_SEARCH_DOMAIN_FILTER_LIST = webConfig.WEB_SEARCH_DOMAIN_FILTER_LIST.split(',')
 				.map((domain) => domain.trim())
 				.filter((domain) => domain.length > 0);
 		} else {
-			webConfig.search.domain_filter_list = [];
+			webConfig.WEB_SEARCH_DOMAIN_FILTER_LIST = [];
+		}
+
+		// Convert Youtube loader language string to array before sending
+		if (webConfig.YOUTUBE_LOADER_LANGUAGE) {
+			webConfig.YOUTUBE_LOADER_LANGUAGE = webConfig.YOUTUBE_LOADER_LANGUAGE.split(',')
+				.map((lang) => lang.trim())
+				.filter((lang) => lang.length > 0);
+		} else {
+			webConfig.YOUTUBE_LOADER_LANGUAGE = [];
 		}
 
 		const res = await updateRAGConfig(localStorage.token, {
-			web: webConfig,
-			youtube: {
-				language: youtubeLanguage.split(',').map((lang) => lang.trim()),
-				translation: youtubeTranslation,
-				proxy_url: youtubeProxyUrl
-			}
+			web: webConfig
 		});
 
-		webConfig.search.domain_filter_list = webConfig.search.domain_filter_list.join(', ');
+		webConfig.WEB_SEARCH_DOMAIN_FILTER_LIST = webConfig.WEB_SEARCH_DOMAIN_FILTER_LIST.join(',');
+		webConfig.YOUTUBE_LOADER_LANGUAGE = webConfig.YOUTUBE_LOADER_LANGUAGE.join(',');
 	};
 
 	onMount(async () => {
@@ -66,14 +68,13 @@
 
 		if (res) {
 			webConfig = res.web;
+
 			// Convert array back to comma-separated string for display
-			if (webConfig?.search?.domain_filter_list) {
-				webConfig.search.domain_filter_list = webConfig.search.domain_filter_list.join(', ');
+			if (webConfig?.WEB_SEARCH_DOMAIN_FILTER_LIST) {
+				webConfig.WEB_SEARCH_DOMAIN_FILTER_LIST = webConfig.WEB_SEARCH_DOMAIN_FILTER_LIST.join(',');
 			}
 
-			youtubeLanguage = res.youtube.language.join(',');
-			youtubeTranslation = res.youtube.translation;
-			youtubeProxyUrl = res.youtube.proxy_url;
+			webConfig.YOUTUBE_LOADER_LANGUAGE = webConfig.YOUTUBE_LOADER_LANGUAGE.join(',');
 		}
 	});
 </script>
@@ -98,7 +99,7 @@
 							{$i18n.t('Web Search')}
 						</div>
 						<div class="flex items-center relative">
-							<Switch bind:state={webConfig.search.enabled} />
+							<Switch bind:state={webConfig.ENABLE_WEB_SEARCH} />
 						</div>
 					</div>
 
@@ -109,7 +110,7 @@
 						<div class="flex items-center relative">
 							<select
 								class="dark:bg-gray-900 w-fit pr-8 rounded-sm px-2 p-1 text-xs bg-transparent outline-hidden text-right"
-								bind:value={webConfig.search.engine}
+								bind:value={webConfig.WEB_SEARCH_ENGINE}
 								placeholder={$i18n.t('Select a engine')}
 								required
 							>
@@ -121,8 +122,8 @@
 						</div>
 					</div>
 
-					{#if webConfig.search.engine !== ''}
-						{#if webConfig.search.engine === 'searxng'}
+					{#if webConfig.WEB_SEARCH_ENGINE !== ''}
+						{#if webConfig.WEB_SEARCH_ENGINE === 'searxng'}
 							<div class="mb-2.5 flex w-full flex-col">
 								<div>
 									<div class=" self-center text-xs font-medium mb-1">
@@ -135,14 +136,14 @@
 												class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
 												type="text"
 												placeholder={$i18n.t('Enter Searxng Query URL')}
-												bind:value={webConfig.search.searxng_query_url}
+												bind:value={webConfig.SEARXNG_QUERY_URL}
 												autocomplete="off"
 											/>
 										</div>
 									</div>
 								</div>
 							</div>
-						{:else if webConfig.search.engine === 'google_pse'}
+						{:else if webConfig.WEB_SEARCH_ENGINE === 'google_pse'}
 							<div class="mb-2.5 flex w-full flex-col">
 								<div>
 									<div class=" self-center text-xs font-medium mb-1">
@@ -151,7 +152,7 @@
 
 									<SensitiveInput
 										placeholder={$i18n.t('Enter Google PSE API Key')}
-										bind:value={webConfig.search.google_pse_api_key}
+										bind:value={webConfig.GOOGLE_PSE_API_KEY}
 									/>
 								</div>
 								<div class="mt-1.5">
@@ -165,14 +166,14 @@
 												class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
 												type="text"
 												placeholder={$i18n.t('Enter Google PSE Engine Id')}
-												bind:value={webConfig.search.google_pse_engine_id}
+												bind:value={webConfig.GOOGLE_PSE_ENGINE_ID}
 												autocomplete="off"
 											/>
 										</div>
 									</div>
 								</div>
 							</div>
-						{:else if webConfig.search.engine === 'brave'}
+						{:else if webConfig.WEB_SEARCH_ENGINE === 'brave'}
 							<div class="mb-2.5 flex w-full flex-col">
 								<div>
 									<div class=" self-center text-xs font-medium mb-1">
@@ -181,11 +182,11 @@
 
 									<SensitiveInput
 										placeholder={$i18n.t('Enter Brave Search API Key')}
-										bind:value={webConfig.search.brave_search_api_key}
+										bind:value={webConfig.BRAVE_SEARCH_API_KEY}
 									/>
 								</div>
 							</div>
-						{:else if webConfig.search.engine === 'kagi'}
+						{:else if webConfig.WEB_SEARCH_ENGINE === 'kagi'}
 							<div class="mb-2.5 flex w-full flex-col">
 								<div>
 									<div class=" self-center text-xs font-medium mb-1">
@@ -194,12 +195,12 @@
 
 									<SensitiveInput
 										placeholder={$i18n.t('Enter Kagi Search API Key')}
-										bind:value={webConfig.search.kagi_search_api_key}
+										bind:value={webConfig.KAGI_SEARCH_API_KEY}
 									/>
 								</div>
 								.
 							</div>
-						{:else if webConfig.search.engine === 'mojeek'}
+						{:else if webConfig.WEB_SEARCH_ENGINE === 'mojeek'}
 							<div class="mb-2.5 flex w-full flex-col">
 								<div>
 									<div class=" self-center text-xs font-medium mb-1">
@@ -208,11 +209,11 @@
 
 									<SensitiveInput
 										placeholder={$i18n.t('Enter Mojeek Search API Key')}
-										bind:value={webConfig.search.mojeek_search_api_key}
+										bind:value={webConfig.MOJEEK_SEARCH_API_KEY}
 									/>
 								</div>
 							</div>
-						{:else if webConfig.search.engine === 'bocha'}
+						{:else if webConfig.WEB_SEARCH_ENGINE === 'bocha'}
 							<div class="mb-2.5 flex w-full flex-col">
 								<div>
 									<div class=" self-center text-xs font-medium mb-1">
@@ -221,11 +222,11 @@
 
 									<SensitiveInput
 										placeholder={$i18n.t('Enter Bocha Search API Key')}
-										bind:value={webConfig.search.bocha_search_api_key}
+										bind:value={webConfig.BOCHA_SEARCH_API_KEY}
 									/>
 								</div>
 							</div>
-						{:else if webConfig.search.engine === 'serpstack'}
+						{:else if webConfig.WEB_SEARCH_ENGINE === 'serpstack'}
 							<div class="mb-2.5 flex w-full flex-col">
 								<div>
 									<div class=" self-center text-xs font-medium mb-1">
@@ -234,11 +235,11 @@
 
 									<SensitiveInput
 										placeholder={$i18n.t('Enter Serpstack API Key')}
-										bind:value={webConfig.search.serpstack_api_key}
+										bind:value={webConfig.SERPSTACK_API_KEY}
 									/>
 								</div>
 							</div>
-						{:else if webConfig.search.engine === 'serper'}
+						{:else if webConfig.WEB_SEARCH_ENGINE === 'serper'}
 							<div class="mb-2.5 flex w-full flex-col">
 								<div>
 									<div class=" self-center text-xs font-medium mb-1">
@@ -247,11 +248,11 @@
 
 									<SensitiveInput
 										placeholder={$i18n.t('Enter Serper API Key')}
-										bind:value={webConfig.search.serper_api_key}
+										bind:value={webConfig.SERPER_API_KEY}
 									/>
 								</div>
 							</div>
-						{:else if webConfig.search.engine === 'serply'}
+						{:else if webConfig.WEB_SEARCH_ENGINE === 'serply'}
 							<div class="mb-2.5 flex w-full flex-col">
 								<div>
 									<div class=" self-center text-xs font-medium mb-1">
@@ -260,11 +261,24 @@
 
 									<SensitiveInput
 										placeholder={$i18n.t('Enter Serply API Key')}
-										bind:value={webConfig.search.serply_api_key}
+										bind:value={webConfig.SERPLY_API_KEY}
+									/>
+								</div>
+							</div>
+						{:else if webConfig.WEB_SEARCH_ENGINE === 'tavily'}
+							<div class="mb-2.5 flex w-full flex-col">
+								<div>
+									<div class=" self-center text-xs font-medium mb-1">
+										{$i18n.t('Tavily API Key')}
+									</div>
+
+									<SensitiveInput
+										placeholder={$i18n.t('Enter Tavily API Key')}
+										bind:value={webConfig.TAVILY_API_KEY}
 									/>
 								</div>
 							</div>
-						{:else if webConfig.search.engine === 'searchapi'}
+						{:else if webConfig.WEB_SEARCH_ENGINE === 'searchapi'}
 							<div class="mb-2.5 flex w-full flex-col">
 								<div>
 									<div class=" self-center text-xs font-medium mb-1">
@@ -273,7 +287,7 @@
 
 									<SensitiveInput
 										placeholder={$i18n.t('Enter SearchApi API Key')}
-										bind:value={webConfig.search.searchapi_api_key}
+										bind:value={webConfig.SEARCHAPI_API_KEY}
 									/>
 								</div>
 								<div class="mt-1.5">
@@ -287,14 +301,14 @@
 												class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
 												type="text"
 												placeholder={$i18n.t('Enter SearchApi Engine')}
-												bind:value={webConfig.search.searchapi_engine}
+												bind:value={webConfig.SEARCHAPI_ENGINE}
 												autocomplete="off"
 											/>
 										</div>
 									</div>
 								</div>
 							</div>
-						{:else if webConfig.search.engine === 'serpapi'}
+						{:else if webConfig.WEB_SEARCH_ENGINE === 'serpapi'}
 							<div class="mb-2.5 flex w-full flex-col">
 								<div>
 									<div class=" self-center text-xs font-medium mb-1">
@@ -303,7 +317,7 @@
 
 									<SensitiveInput
 										placeholder={$i18n.t('Enter SerpApi API Key')}
-										bind:value={webConfig.search.serpapi_api_key}
+										bind:value={webConfig.SERPAPI_API_KEY}
 									/>
 								</div>
 								<div class="mt-1.5">
@@ -317,40 +331,58 @@
 												class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
 												type="text"
 												placeholder={$i18n.t('Enter SerpApi Engine')}
-												bind:value={webConfig.search.serpapi_engine}
+												bind:value={webConfig.SERPAPI_ENGINE}
 												autocomplete="off"
 											/>
 										</div>
 									</div>
 								</div>
 							</div>
-						{:else if webConfig.search.engine === 'tavily'}
+						{:else if webConfig.WEB_SEARCH_ENGINE === 'jina'}
 							<div class="mb-2.5 flex w-full flex-col">
 								<div>
 									<div class=" self-center text-xs font-medium mb-1">
-										{$i18n.t('Tavily API Key')}
+										{$i18n.t('Jina API Key')}
 									</div>
 
 									<SensitiveInput
-										placeholder={$i18n.t('Enter Tavily API Key')}
-										bind:value={webConfig.search.tavily_api_key}
+										placeholder={$i18n.t('Enter Jina API Key')}
+										bind:value={webConfig.JINA_API_KEY}
 									/>
 								</div>
 							</div>
-						{:else if webConfig.search.engine === 'jina'}
+						{:else if webConfig.WEB_SEARCH_ENGINE === 'bing'}
 							<div class="mb-2.5 flex w-full flex-col">
 								<div>
 									<div class=" self-center text-xs font-medium mb-1">
-										{$i18n.t('Jina API Key')}
+										{$i18n.t('Bing Search V7 Endpoint')}
+									</div>
+
+									<div class="flex w-full">
+										<div class="flex-1">
+											<input
+												class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
+												type="text"
+												placeholder={$i18n.t('Enter Bing Search V7 Endpoint')}
+												bind:value={webConfig.BING_SEARCH_V7_ENDPOINT}
+												autocomplete="off"
+											/>
+										</div>
+									</div>
+								</div>
+
+								<div class="mt-2">
+									<div class=" self-center text-xs font-medium mb-1">
+										{$i18n.t('Bing Search V7 Subscription Key')}
 									</div>
 
 									<SensitiveInput
-										placeholder={$i18n.t('Enter Jina API Key')}
-										bind:value={webConfig.search.jina_api_key}
+										placeholder={$i18n.t('Enter Bing Search V7 Subscription Key')}
+										bind:value={webConfig.BING_SEARCH_V7_SUBSCRIPTION_KEY}
 									/>
 								</div>
 							</div>
-						{:else if webConfig.search.engine === 'exa'}
+						{:else if webConfig.WEB_SEARCH_ENGINE === 'exa'}
 							<div class="mb-2.5 flex w-full flex-col">
 								<div>
 									<div class=" self-center text-xs font-medium mb-1">
@@ -359,11 +391,11 @@
 
 									<SensitiveInput
 										placeholder={$i18n.t('Enter Exa API Key')}
-										bind:value={webConfig.search.exa_api_key}
+										bind:value={webConfig.EXA_API_KEY}
 									/>
 								</div>
 							</div>
-						{:else if webConfig.search.engine === 'perplexity'}
+						{:else if webConfig.WEB_SEARCH_ENGINE === 'perplexity'}
 							<div>
 								<div class=" self-center text-xs font-medium mb-1">
 									{$i18n.t('Perplexity API Key')}
@@ -371,69 +403,38 @@
 
 								<SensitiveInput
 									placeholder={$i18n.t('Enter Perplexity API Key')}
-									bind:value={webConfig.search.perplexity_api_key}
+									bind:value={webConfig.PERPLEXITY_API_KEY}
 								/>
 							</div>
-						{:else if webConfig.search.engine === 'bing'}
+						{:else if webConfig.WEB_SEARCH_ENGINE === 'sougou'}
 							<div class="mb-2.5 flex w-full flex-col">
 								<div>
 									<div class=" self-center text-xs font-medium mb-1">
-										{$i18n.t('Bing Search V7 Endpoint')}
+										{$i18n.t('Sougou Search API sID')}
 									</div>
 
-									<div class="flex w-full">
-										<div class="flex-1">
-											<input
-												class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
-												type="text"
-												placeholder={$i18n.t('Enter Bing Search V7 Endpoint')}
-												bind:value={webConfig.search.bing_search_v7_endpoint}
-												autocomplete="off"
-											/>
-										</div>
-									</div>
+									<SensitiveInput
+										placeholder={$i18n.t('Enter Sougou Search API sID')}
+										bind:value={webConfig.SOUGOU_API_SID}
+									/>
 								</div>
-
-								<div class="mt-2">
+							</div>
+							<div class="mb-2.5 flex w-full flex-col">
+								<div>
 									<div class=" self-center text-xs font-medium mb-1">
-										{$i18n.t('Bing Search V7 Subscription Key')}
+										{$i18n.t('Sougou Search API SK')}
 									</div>
 
 									<SensitiveInput
-										placeholder={$i18n.t('Enter Bing Search V7 Subscription Key')}
-										bind:value={webConfig.search.bing_search_v7_subscription_key}
+										placeholder={$i18n.t('Enter Sougou Search API SK')}
+										bind:value={webConfig.SOUGOU_API_SK}
 									/>
 								</div>
 							</div>
-							{:else if webConfig.search.engine === 'sougou'}
-								<div class="mb-2.5 flex w-full flex-col">
-									<div>
-										<div class=" self-center text-xs font-medium mb-1">
-											{$i18n.t('Sougou Search API sID')}
-										</div>
-	
-										<SensitiveInput
-											placeholder={$i18n.t('Enter Sougou Search API sID')}
-											bind:value={webConfig.search.sougou_api_sid}
-										/>
-									</div>
-								</div>
-								<div class="mb-2.5 flex w-full flex-col">
-									<div>
-										<div class=" self-center text-xs font-medium mb-1">
-											{$i18n.t('Sougou Search API SK')}
-										</div>
-	
-										<SensitiveInput
-											placeholder={$i18n.t('Enter Sougou Search API SK')}
-											bind:value={webConfig.search.sougou_api_sk}
-										/>
-									</div>
-								</div>
 						{/if}
 					{/if}
 
-					{#if webConfig.search.enabled}
+					{#if webConfig.ENABLE_WEB_SEARCH}
 						<div class="mb-2.5 flex w-full flex-col">
 							<div class="flex gap-2">
 								<div class="w-full">
@@ -444,7 +445,7 @@
 									<input
 										class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
 										placeholder={$i18n.t('Search Result Count')}
-										bind:value={webConfig.search.result_count}
+										bind:value={webConfig.WEB_SEARCH_RESULT_COUNT}
 										required
 									/>
 								</div>
@@ -457,7 +458,7 @@
 									<input
 										class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
 										placeholder={$i18n.t('Concurrent Requests')}
-										bind:value={webConfig.search.concurrent_requests}
+										bind:value={webConfig.WEB_SEARCH_CONCURRENT_REQUESTS}
 										required
 									/>
 								</div>
@@ -474,7 +475,7 @@
 								placeholder={$i18n.t(
 									'Enter domains separated by commas (e.g., example.com,site.org)'
 								)}
-								bind:value={webConfig.search.domain_filter_list}
+								bind:value={webConfig.WEB_SEARCH_DOMAIN_FILTER_LIST}
 							/>
 						</div>
 					{/if}
@@ -506,15 +507,13 @@
 						</div>
 						<div class="flex items-center relative">
 							<Tooltip
-								content={webConfig.search.trust_env
+								content={webConfig.WEB_SEARCH_TRUST_ENV
 									? $i18n.t(
 											'Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.'
 										)
-									: $i18n.t(
-											'Use no proxy to fetch page contents.'
-										)}
+									: $i18n.t('Use no proxy to fetch page contents.')}
 							>
-								<Switch bind:state={webConfig.search.trust_env} />
+								<Switch bind:state={webConfig.WEB_SEARCH_TRUST_ENV} />
 							</Tooltip>
 						</div>
 					</div>
@@ -527,13 +526,134 @@
 
 					<div class="  mb-2.5 flex w-full justify-between">
 						<div class=" self-center text-xs font-medium">
-							{$i18n.t('Bypass SSL verification for Websites')}
+							{$i18n.t('Web Loader Engine')}
 						</div>
 						<div class="flex items-center relative">
-							<Switch bind:state={webConfig.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION} />
+							<select
+								class="dark:bg-gray-900 w-fit pr-8 rounded-sm px-2 p-1 text-xs bg-transparent outline-hidden text-right"
+								bind:value={webConfig.WEB_LOADER_ENGINE}
+								placeholder={$i18n.t('Select a engine')}
+							>
+								<option value="">{$i18n.t('Default')}</option>
+								{#each webLoaderEngines as engine}
+									<option value={engine}>{engine}</option>
+								{/each}
+							</select>
 						</div>
 					</div>
 
+					{#if webConfig.WEB_LOADER_ENGINE === '' || webConfig.WEB_LOADER_ENGINE === 'safe_web'}
+						<div class="  mb-2.5 flex w-full justify-between">
+							<div class=" self-center text-xs font-medium">
+								{$i18n.t('Verify SSL Certificate')}
+							</div>
+							<div class="flex items-center relative">
+								<Switch bind:state={webConfig.ENABLE_WEB_LOADER_SSL_VERIFICATION} />
+							</div>
+						</div>
+					{:else if webConfig.WEB_LOADER_ENGINE === 'playwright'}
+						<div class="mb-2.5 flex w-full flex-col">
+							<div>
+								<div class=" self-center text-xs font-medium mb-1">
+									{$i18n.t('Playwright WebSocket URL')}
+								</div>
+
+								<div class="flex w-full">
+									<div class="flex-1">
+										<input
+											class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
+											type="text"
+											placeholder={$i18n.t('Enter Playwright WebSocket URL')}
+											bind:value={webConfig.PLAYWRIGHT_WS_URL}
+											autocomplete="off"
+										/>
+									</div>
+								</div>
+							</div>
+
+							<div class="mt-2">
+								<div class=" self-center text-xs font-medium mb-1">
+									{$i18n.t('Playwright Timeout (ms)')}
+								</div>
+
+								<div class="flex w-full">
+									<div class="flex-1">
+										<input
+											class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
+											placeholder={$i18n.t('Enter Playwright Timeout')}
+											bind:value={webConfig.PLAYWRIGHT_TIMEOUT}
+											autocomplete="off"
+										/>
+									</div>
+								</div>
+							</div>
+						</div>
+					{:else if webConfig.WEB_LOADER_ENGINE === 'firecrawl'}
+						<div class="mb-2.5 flex w-full flex-col">
+							<div>
+								<div class=" self-center text-xs font-medium mb-1">
+									{$i18n.t('Firecrawl API Base URL')}
+								</div>
+
+								<div class="flex w-full">
+									<div class="flex-1">
+										<input
+											class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
+											type="text"
+											placeholder={$i18n.t('Enter Firecrawl API Base URL')}
+											bind:value={webConfig.FIRECRAWL_API_BASE_URL}
+											autocomplete="off"
+										/>
+									</div>
+								</div>
+							</div>
+
+							<div class="mt-2">
+								<div class=" self-center text-xs font-medium mb-1">
+									{$i18n.t('Firecrawl API Key')}
+								</div>
+
+								<SensitiveInput
+									placeholder={$i18n.t('Enter Firecrawl API Key')}
+									bind:value={webConfig.FIRECRAWL_API_KEY}
+								/>
+							</div>
+						</div>
+					{:else if webConfig.WEB_LOADER_ENGINE === 'tavily'}
+						<div class="mb-2.5 flex w-full flex-col">
+							<div>
+								<div class=" self-center text-xs font-medium mb-1">
+									{$i18n.t('Tavily Extract Depth')}
+								</div>
+
+								<div class="flex w-full">
+									<div class="flex-1">
+										<input
+											class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
+											type="text"
+											placeholder={$i18n.t('Enter Tavily Extract Depth')}
+											bind:value={webConfig.TAVILY_EXTRACT_DEPTH}
+											autocomplete="off"
+										/>
+									</div>
+								</div>
+							</div>
+
+							{#if webConfig.WEB_SEARCH_ENGINE !== 'tavily'}
+								<div class="mt-2">
+									<div class=" self-center text-xs font-medium mb-1">
+										{$i18n.t('Tavily API Key')}
+									</div>
+
+									<SensitiveInput
+										placeholder={$i18n.t('Enter Tavily API Key')}
+										bind:value={webConfig.TAVILY_API_KEY}
+									/>
+								</div>
+							{/if}
+						</div>
+					{/if}
+
 					<div class="  mb-2.5 flex w-full justify-between">
 						<div class=" self-center text-xs font-medium">
 							{$i18n.t('Youtube Language')}
@@ -543,7 +663,7 @@
 								class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
 								type="text"
 								placeholder={$i18n.t('Enter language codes')}
-								bind:value={youtubeLanguage}
+								bind:value={webConfig.YOUTUBE_LOADER_LANGUAGE}
 								autocomplete="off"
 							/>
 						</div>
@@ -558,7 +678,7 @@
 								class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
 								type="text"
 								placeholder={$i18n.t('Enter proxy URL (e.g. https://user:password@host:port)')}
-								bind:value={youtubeProxyUrl}
+								bind:value={webConfig.YOUTUBE_LOADER_PROXY_URL}
 								autocomplete="off"
 							/>
 						</div>

+ 4 - 0
src/lib/components/admin/Users/Groups.svelte

@@ -63,6 +63,10 @@
 			file_upload: true,
 			delete: true,
 			edit: true,
+			stt: true,
+			tts: true,
+			call: true,
+			multiple_models: true,
 			temporary: true,
 			temporary_enforced: false
 		},

+ 40 - 5
src/lib/components/admin/Users/Groups/Permissions.svelte

@@ -21,9 +21,13 @@
 		},
 		chat: {
 			controls: true,
+			file_upload: true,
 			delete: true,
 			edit: true,
-			file_upload: true,
+			stt: true,
+			tts: true,
+			call: true,
+			multiple_models: true,
 			temporary: true,
 			temporary_enforced: false
 		},
@@ -242,18 +246,18 @@
 
 		<div class="  flex w-full justify-between my-2 pr-2">
 			<div class=" self-center text-xs font-medium">
-				{$i18n.t('Allow Chat Controls')}
+				{$i18n.t('Allow File Upload')}
 			</div>
 
-			<Switch bind:state={permissions.chat.controls} />
+			<Switch bind:state={permissions.chat.file_upload} />
 		</div>
 
 		<div class="  flex w-full justify-between my-2 pr-2">
 			<div class=" self-center text-xs font-medium">
-				{$i18n.t('Allow File Upload')}
+				{$i18n.t('Allow Chat Controls')}
 			</div>
 
-			<Switch bind:state={permissions.chat.file_upload} />
+			<Switch bind:state={permissions.chat.controls} />
 		</div>
 
 		<div class="  flex w-full justify-between my-2 pr-2">
@@ -272,6 +276,37 @@
 			<Switch bind:state={permissions.chat.edit} />
 		</div>
 
+		<div class="  flex w-full justify-between my-2 pr-2">
+			<div class=" self-center text-xs font-medium">
+				{$i18n.t('Allow Speech to Text')}
+			</div>
+
+			<Switch bind:state={permissions.chat.stt} />
+		</div>
+		<div class="  flex w-full justify-between my-2 pr-2">
+			<div class=" self-center text-xs font-medium">
+				{$i18n.t('Allow Text to Speech')}
+			</div>
+
+			<Switch bind:state={permissions.chat.tts} />
+		</div>
+
+		<div class="  flex w-full justify-between my-2 pr-2">
+			<div class=" self-center text-xs font-medium">
+				{$i18n.t('Allow Call')}
+			</div>
+
+			<Switch bind:state={permissions.chat.call} />
+		</div>
+
+		<div class="  flex w-full justify-between my-2 pr-2">
+			<div class=" self-center text-xs font-medium">
+				{$i18n.t('Allow Multiple Models in Chat')}
+			</div>
+
+			<Switch bind:state={permissions.chat.multiple_models} />
+		</div>
+
 		<div class="  flex w-full justify-between my-2 pr-2">
 			<div class=" self-center text-xs font-medium">
 				{$i18n.t('Allow Temporary Chat')}

+ 25 - 0
src/lib/components/admin/Users/UserList.svelte

@@ -29,6 +29,7 @@
 	import ChevronDown from '$lib/components/icons/ChevronDown.svelte';
 	import About from '$lib/components/chat/Settings/About.svelte';
 	import Banner from '$lib/components/common/Banner.svelte';
+	import Markdown from '$lib/components/chat/Messages/Markdown.svelte';
 
 	const i18n = getContext('i18n');
 
@@ -486,3 +487,27 @@
 </div>
 
 <Pagination bind:page count={users.length} />
+
+{#if !$config?.license_metadata}
+	{#if users.length > 50}
+		<div class="text-sm">
+			<Markdown
+				content={`
+> [!NOTE]
+> # **Hey there! 👋**
+>
+> It looks like you have over 50 users — that usually falls under organizational usage.
+> 
+> Open WebUI is proudly open source and completely free, with no hidden limits — and we'd love to keep it that way. 🌱  
+>
+> By supporting the project through sponsorship or an enterprise license, you’re not only helping us stay independent, you’re also helping us ship new features faster, improve stability, and grow the project for the long haul. With an *enterprise license*, you also get additional perks like dedicated support, customization options, and more — all at a fraction of what it would cost to build and maintain internally.  
+> 
+> Your support helps us stay independent and continue building great tools for everyone. 💛
+> 
+> - 👉 **[Click here to learn more about enterprise licensing](https://docs.openwebui.com/enterprise)**
+> - 👉 *[Click here to sponsor the project on GitHub](https://github.com/sponsors/tjbck)*
+`}
+			/>
+		</div>
+	{/if}
+{/if}

+ 113 - 105
src/lib/components/chat/Artifacts.svelte

@@ -4,7 +4,7 @@
 	const i18n = getContext('i18n');
 	const dispatch = createEventDispatcher();
 
-	import { chatId, showArtifacts, showControls } from '$lib/stores';
+	import { chatId, settings, showArtifacts, showControls } from '$lib/stores';
 	import XMark from '../icons/XMark.svelte';
 	import { copyToClipboard, createMessagesList } from '$lib/utils';
 	import ArrowsPointingOut from '../icons/ArrowsPointingOut.svelte';
@@ -184,35 +184,117 @@
 </script>
 
 <div class=" w-full h-full relative flex flex-col bg-gray-50 dark:bg-gray-850">
-	<div class="w-full h-full flex-1 relative">
+	<div class="w-full h-full flex flex-col flex-1 relative">
+		{#if contents.length > 0}
+			<div
+				class="pointer-events-auto z-20 flex justify-between items-center p-2.5 font-primar text-gray-900 dark:text-white"
+			>
+				<button
+					class="self-center pointer-events-auto p-1 rounded-full bg-white dark:bg-gray-850"
+					on:click={() => {
+						showArtifacts.set(false);
+					}}
+				>
+					<ArrowLeft className="size-3.5  text-gray-900 dark:text-white" />
+				</button>
+
+				<div class="flex-1 flex items-center justify-between">
+					<div class="flex items-center space-x-2">
+						<div class="flex items-center gap-0.5 self-center min-w-fit" dir="ltr">
+							<button
+								class="self-center p-1 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-white hover:text-black rounded-md transition disabled:cursor-not-allowed"
+								on:click={() => navigateContent('prev')}
+								disabled={contents.length <= 1}
+							>
+								<svg
+									xmlns="http://www.w3.org/2000/svg"
+									fill="none"
+									viewBox="0 0 24 24"
+									stroke="currentColor"
+									stroke-width="2.5"
+									class="size-3.5"
+								>
+									<path
+										stroke-linecap="round"
+										stroke-linejoin="round"
+										d="M15.75 19.5 8.25 12l7.5-7.5"
+									/>
+								</svg>
+							</button>
+
+							<div class="text-xs self-center dark:text-gray-100 min-w-fit">
+								{$i18n.t('Version {{selectedVersion}} of {{totalVersions}}', {
+									selectedVersion: selectedContentIdx + 1,
+									totalVersions: contents.length
+								})}
+							</div>
+
+							<button
+								class="self-center p-1 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-white hover:text-black rounded-md transition disabled:cursor-not-allowed"
+								on:click={() => navigateContent('next')}
+								disabled={contents.length <= 1}
+							>
+								<svg
+									xmlns="http://www.w3.org/2000/svg"
+									fill="none"
+									viewBox="0 0 24 24"
+									stroke="currentColor"
+									stroke-width="2.5"
+									class="size-3.5"
+								>
+									<path
+										stroke-linecap="round"
+										stroke-linejoin="round"
+										d="m8.25 4.5 7.5 7.5-7.5 7.5"
+									/>
+								</svg>
+							</button>
+						</div>
+					</div>
+
+					<div class="flex items-center gap-1">
+						<button
+							class="copy-code-button bg-none border-none text-xs bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-md px-1.5 py-0.5"
+							on:click={() => {
+								copyToClipboard(contents[selectedContentIdx].content);
+								copied = true;
+
+								setTimeout(() => {
+									copied = false;
+								}, 2000);
+							}}>{copied ? $i18n.t('Copied') : $i18n.t('Copy')}</button
+						>
+
+						{#if contents[selectedContentIdx].type === 'iframe'}
+							<Tooltip content={$i18n.t('Open in full screen')}>
+								<button
+									class=" bg-none border-none text-xs bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-md p-0.5"
+									on:click={showFullScreen}
+								>
+									<ArrowsPointingOut className="size-3.5" />
+								</button>
+							</Tooltip>
+						{/if}
+					</div>
+				</div>
+
+				<button
+					class="self-center pointer-events-auto p-1 rounded-full bg-white dark:bg-gray-850"
+					on:click={() => {
+						dispatch('close');
+						showControls.set(false);
+						showArtifacts.set(false);
+					}}
+				>
+					<XMark className="size-3.5 text-gray-900 dark:text-white" />
+				</button>
+			</div>
+		{/if}
+
 		{#if overlay}
 			<div class=" absolute top-0 left-0 right-0 bottom-0 z-10"></div>
 		{/if}
 
-		<div class="absolute pointer-events-none z-50 w-full flex items-center justify-start p-4">
-			<button
-				class="self-center pointer-events-auto p-1 rounded-full bg-white dark:bg-gray-850"
-				on:click={() => {
-					showArtifacts.set(false);
-				}}
-			>
-				<ArrowLeft className="size-3.5  text-gray-900 dark:text-white" />
-			</button>
-		</div>
-
-		<div class=" absolute pointer-events-none z-50 w-full flex items-center justify-end p-4">
-			<button
-				class="self-center pointer-events-auto p-1 rounded-full bg-white dark:bg-gray-850"
-				on:click={() => {
-					dispatch('close');
-					showControls.set(false);
-					showArtifacts.set(false);
-				}}
-			>
-				<XMark className="size-3.5 text-gray-900 dark:text-white" />
-			</button>
-		</div>
-
 		<div class="flex-1 w-full h-full">
 			<div class=" h-full flex flex-col">
 				{#if contents.length > 0}
@@ -223,7 +305,11 @@
 								title="Content"
 								srcdoc={contents[selectedContentIdx].content}
 								class="w-full border-0 h-full rounded-none"
-								sandbox="allow-scripts allow-forms allow-same-origin"
+								sandbox="allow-scripts{($settings?.iframeSandboxAllowForms ?? false)
+									? ' allow-forms'
+									: ''}{($settings?.iframeSandboxAllowSameOrigin ?? false)
+									? ' allow-same-origin'
+									: ''}"
 								on:load={iframeLoadHandler}
 							></iframe>
 						{:else if contents[selectedContentIdx].type === 'svg'}
@@ -241,82 +327,4 @@
 			</div>
 		</div>
 	</div>
-
-	{#if contents.length > 0}
-		<div class="flex justify-between items-center p-2.5 font-primar text-gray-900 dark:text-white">
-			<div class="flex items-center space-x-2">
-				<div class="flex items-center gap-0.5 self-center min-w-fit" dir="ltr">
-					<button
-						class="self-center p-1 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-white hover:text-black rounded-md transition disabled:cursor-not-allowed"
-						on:click={() => navigateContent('prev')}
-						disabled={contents.length <= 1}
-					>
-						<svg
-							xmlns="http://www.w3.org/2000/svg"
-							fill="none"
-							viewBox="0 0 24 24"
-							stroke="currentColor"
-							stroke-width="2.5"
-							class="size-3.5"
-						>
-							<path
-								stroke-linecap="round"
-								stroke-linejoin="round"
-								d="M15.75 19.5 8.25 12l7.5-7.5"
-							/>
-						</svg>
-					</button>
-
-					<div class="text-xs self-center dark:text-gray-100 min-w-fit">
-						{$i18n.t('Version {{selectedVersion}} of {{totalVersions}}', {
-							selectedVersion: selectedContentIdx + 1,
-							totalVersions: contents.length
-						})}
-					</div>
-
-					<button
-						class="self-center p-1 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-white hover:text-black rounded-md transition disabled:cursor-not-allowed"
-						on:click={() => navigateContent('next')}
-						disabled={contents.length <= 1}
-					>
-						<svg
-							xmlns="http://www.w3.org/2000/svg"
-							fill="none"
-							viewBox="0 0 24 24"
-							stroke="currentColor"
-							stroke-width="2.5"
-							class="size-3.5"
-						>
-							<path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5" />
-						</svg>
-					</button>
-				</div>
-			</div>
-
-			<div class="flex items-center gap-1">
-				<button
-					class="copy-code-button bg-none border-none text-xs bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-md px-1.5 py-0.5"
-					on:click={() => {
-						copyToClipboard(contents[selectedContentIdx].content);
-						copied = true;
-
-						setTimeout(() => {
-							copied = false;
-						}, 2000);
-					}}>{copied ? $i18n.t('Copied') : $i18n.t('Copy')}</button
-				>
-
-				{#if contents[selectedContentIdx].type === 'iframe'}
-					<Tooltip content={$i18n.t('Open in full screen')}>
-						<button
-							class=" bg-none border-none text-xs bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-md p-0.5"
-							on:click={showFullScreen}
-						>
-							<ArrowsPointingOut className="size-3.5" />
-						</button>
-					</Tooltip>
-				{/if}
-			</div>
-		</div>
-	{/if}
 </div>

+ 69 - 93
src/lib/components/chat/Chat.svelte

@@ -74,7 +74,8 @@
 		generateQueries,
 		chatAction,
 		generateMoACompletion,
-		stopTask
+		stopTask,
+		getTaskIdsByChatId
 	} from '$lib/apis';
 	import { getTools } from '$lib/apis/tools';
 
@@ -130,7 +131,7 @@
 		currentId: null
 	};
 
-	let taskId = null;
+	let taskIds = null;
 
 	// Chat Input
 	let prompt = '';
@@ -261,6 +262,21 @@
 					} else {
 						message.statusHistory = [data];
 					}
+				} else if (type === 'chat:completion') {
+					chatCompletionEventHandler(data, message, event.chat_id);
+				} else if (type === 'chat:message:delta' || type === 'message') {
+					message.content += data.content;
+				} else if (type === 'chat:message' || type === 'replace') {
+					message.content = data.content;
+				} else if (type === 'chat:message:files' || type === 'files') {
+					message.files = data.files;
+				} else if (type === 'chat:title') {
+					chatTitle.set(data);
+					currentChatPage.set(1);
+					await chats.set(await getChatList(localStorage.token, $currentChatPage));
+				} else if (type === 'chat:tags') {
+					chat = await getChatById(localStorage.token, $chatId);
+					allTags.set(await getAllTags(localStorage.token));
 				} else if (type === 'source' || type === 'citation') {
 					if (data?.type === 'code_execution') {
 						// Code execution; update existing code execution by ID, or add new one.
@@ -287,19 +303,19 @@
 							message.sources = [data];
 						}
 					}
-				} else if (type === 'chat:completion') {
-					chatCompletionEventHandler(data, message, event.chat_id);
-				} else if (type === 'chat:title') {
-					chatTitle.set(data);
-					currentChatPage.set(1);
-					await chats.set(await getChatList(localStorage.token, $currentChatPage));
-				} else if (type === 'chat:tags') {
-					chat = await getChatById(localStorage.token, $chatId);
-					allTags.set(await getAllTags(localStorage.token));
-				} else if (type === 'chat:message:delta' || type === 'message') {
-					message.content += data.content;
-				} else if (type === 'chat:message' || type === 'replace') {
-					message.content = data.content;
+				} else if (type === 'notification') {
+					const toastType = data?.type ?? 'info';
+					const toastContent = data?.content ?? '';
+
+					if (toastType === 'success') {
+						toast.success(toastContent);
+					} else if (toastType === 'error') {
+						toast.error(toastContent);
+					} else if (toastType === 'warning') {
+						toast.warning(toastContent);
+					} else {
+						toast.info(toastContent);
+					}
 				} else if (type === 'confirmation') {
 					eventCallback = cb;
 
@@ -332,19 +348,6 @@
 					eventConfirmationMessage = data.message;
 					eventConfirmationInputPlaceholder = data.placeholder;
 					eventConfirmationInputValue = data?.value ?? '';
-				} else if (type === 'notification') {
-					const toastType = data?.type ?? 'info';
-					const toastContent = data?.content ?? '';
-
-					if (toastType === 'success') {
-						toast.success(toastContent);
-					} else if (toastType === 'error') {
-						toast.error(toastContent);
-					} else if (toastType === 'warning') {
-						toast.warning(toastContent);
-					} else {
-						toast.info(toastContent);
-					}
 				} else {
 					console.log('Unknown message type', data);
 				}
@@ -818,8 +821,21 @@
 				await tick();
 
 				if (history.currentId) {
-					history.messages[history.currentId].done = true;
+					for (const message of Object.values(history.messages)) {
+						if (message.role === 'assistant') {
+							message.done = true;
+						}
+					}
 				}
+
+				const taskRes = await getTaskIdsByChatId(localStorage.token, $chatId).catch((error) => {
+					return null;
+				});
+
+				if (taskRes) {
+					taskIds = taskRes.task_ids;
+				}
+
 				await tick();
 
 				return true;
@@ -891,7 +907,7 @@
 			}
 		}
 
-		taskId = null;
+		taskIds = null;
 	};
 
 	const chatActionHandler = async (chatId, actionId, modelId, responseMessageId, event = null) => {
@@ -1649,7 +1665,11 @@
 			if (res.error) {
 				await handleOpenAIError(res.error, responseMessage);
 			} else {
-				taskId = res.task_id;
+				if (taskIds) {
+					taskIds.push(res.task_id);
+				} else {
+					taskIds = [res.task_id];
+				}
 			}
 		}
 
@@ -1700,23 +1720,26 @@
 	};
 
 	const stopResponse = async () => {
-		if (taskId) {
-			const res = await stopTask(localStorage.token, taskId).catch((error) => {
-				toast.error(`${error}`);
-				return null;
-			});
+		if (taskIds) {
+			for (const taskId of taskIds) {
+				const res = await stopTask(localStorage.token, taskId).catch((error) => {
+					toast.error(`${error}`);
+					return null;
+				});
+			}
 
-			if (res) {
-				taskId = null;
+			taskIds = null;
 
-				const responseMessage = history.messages[history.currentId];
-				responseMessage.done = true;
+			const responseMessage = history.messages[history.currentId];
+			// Set all response messages to done
+			for (const messageId of history.messages[responseMessage.parentId].childrenIds) {
+				history.messages[messageId].done = true;
+			}
 
-				history.messages[history.currentId] = responseMessage;
+			history.messages[history.currentId] = responseMessage;
 
-				if (autoScroll) {
-					scrollToBottom();
-				}
+			if (autoScroll) {
+				scrollToBottom();
 			}
 		}
 	};
@@ -1957,61 +1980,13 @@
 							timestamp: Date.now()
 						}
 					}}
+					{history}
 					title={$chatTitle}
 					bind:selectedModels
 					shareEnabled={!!history.currentId}
 					{initNewChat}
 				/>
 
-				{#if !history.currentId && !$chatId && selectedModels.length <= 1 && ($banners.length > 0 || ($config?.license_metadata?.type ?? null) === 'trial' || (($config?.license_metadata?.seats ?? null) !== null && $config?.user_count > $config?.license_metadata?.seats))}
-					<div class="absolute top-12 left-0 right-0 w-full z-30">
-						<div class=" flex flex-col gap-1 w-full">
-							{#if ($config?.license_metadata?.type ?? null) === 'trial'}
-								<Banner
-									banner={{
-										type: 'info',
-										title: 'Trial License',
-										content: $i18n.t(
-											'You are currently using a trial license. Please contact support to upgrade your license.'
-										)
-									}}
-								/>
-							{/if}
-
-							{#if ($config?.license_metadata?.seats ?? null) !== null && $config?.user_count > $config?.license_metadata?.seats}
-								<Banner
-									banner={{
-										type: 'error',
-										title: 'License Error',
-										content: $i18n.t(
-											'Exceeded the number of seats in your license. Please contact support to increase the number of seats.'
-										)
-									}}
-								/>
-							{/if}
-
-							{#each $banners.filter( (b) => (b.dismissible ? !JSON.parse(localStorage.getItem('dismissedBannerIds') ?? '[]').includes(b.id) : true) ) as banner}
-								<Banner
-									{banner}
-									on:dismiss={(e) => {
-										const bannerId = e.detail;
-
-										localStorage.setItem(
-											'dismissedBannerIds',
-											JSON.stringify(
-												[
-													bannerId,
-													...JSON.parse(localStorage.getItem('dismissedBannerIds') ?? '[]')
-												].filter((id) => $banners.find((b) => b.id === id))
-											)
-										);
-									}}
-								/>
-							{/each}
-						</div>
-					</div>
-				{/if}
-
 				<div class="flex flex-col flex-auto z-10 w-full @container">
 					{#if $settings?.landingPageMode === 'chat' || createMessagesList(history, history.currentId).length > 0}
 						<div
@@ -2048,6 +2023,7 @@
 						<div class=" pb-[1rem]">
 							<MessageInput
 								{history}
+								{taskIds}
 								{selectedModels}
 								bind:files
 								bind:prompt

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

@@ -56,7 +56,7 @@
 									($i18n.language === 'dg-DG'
 										? `/doge.png`
 										: `${WEBUI_BASE_URL}/static/favicon.png`)}
-								class=" size-[2.7rem] rounded-full border-[1px] border-gray-200 dark:border-none"
+								class=" size-[2.7rem] rounded-full border-[1px] border-gray-100 dark:border-none"
 								alt="logo"
 								draggable="false"
 							/>

+ 89 - 92
src/lib/components/chat/MessageInput.svelte

@@ -71,6 +71,7 @@
 	$: selectedModelIds = atSelectedModel !== undefined ? [atSelectedModel.id] : selectedModels;
 
 	export let history;
+	export let taskIds = null;
 
 	export let prompt = '';
 	export let files = [];
@@ -509,7 +510,7 @@
 							}}
 						>
 							<div
-								class="flex-1 flex flex-col relative w-full shadow-lg rounded-3xl border border-gray-100 dark:border-gray-850 hover:border-gray-200 focus-within:border-gray-200 hover:dark:border-gray-800 focus-within:dark:border-gray-800 transition px-1 bg-white/90 dark:bg-gray-400/5 dark:text-gray-100"
+								class="flex-1 flex flex-col relative w-full shadow-lg rounded-3xl border border-gray-50 dark:border-gray-850 hover:border-gray-100 focus-within:border-gray-100 hover:dark:border-gray-800 focus-within:dark:border-gray-800 transition px-1 bg-white/90 dark:bg-gray-400/5 dark:text-gray-100"
 								dir={$settings?.chatDirection ?? 'auto'}
 							>
 								{#if files.length > 0}
@@ -1188,7 +1189,7 @@
 									</div>
 
 									<div class="self-end flex space-x-1 mr-1 shrink-0">
-										{#if !history?.currentId || history.messages[history.currentId]?.done == true}
+										{#if (!history?.currentId || history.messages[history.currentId]?.done == true) && ($_user?.role === 'admin' || ($_user?.permissions?.chat?.stt ?? true))}
 											<Tooltip content={$i18n.t('Record voice')}>
 												<button
 													id="voice-input-button"
@@ -1237,116 +1238,112 @@
 											</Tooltip>
 										{/if}
 
-										{#if !history.currentId || history.messages[history.currentId]?.done == true}
-											{#if prompt === '' && files.length === 0}
-												<div class=" flex items-center">
-													<Tooltip content={$i18n.t('Call')}>
-														<button
-															class=" bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full p-1.5 self-center"
-															type="button"
-															on:click={async () => {
-																if (selectedModels.length > 1) {
-																	toast.error($i18n.t('Select only one model to call'));
+										{#if (taskIds && taskIds.length > 0) || (history.currentId && history.messages[history.currentId]?.done != true)}
+											<div class=" flex items-center">
+												<Tooltip content={$i18n.t('Stop')}>
+													<button
+														class="bg-white hover:bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-800 transition rounded-full p-1.5"
+														on:click={() => {
+															stopResponse();
+														}}
+													>
+														<svg
+															xmlns="http://www.w3.org/2000/svg"
+															viewBox="0 0 24 24"
+															fill="currentColor"
+															class="size-5"
+														>
+															<path
+																fill-rule="evenodd"
+																d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zm6-2.438c0-.724.588-1.312 1.313-1.312h4.874c.725 0 1.313.588 1.313 1.313v4.874c0 .725-.588 1.313-1.313 1.313H9.564a1.312 1.312 0 01-1.313-1.313V9.564z"
+																clip-rule="evenodd"
+															/>
+														</svg>
+													</button>
+												</Tooltip>
+											</div>
+										{:else if prompt === '' && files.length === 0 && ($_user?.role === 'admin' || ($_user?.permissions?.chat?.call ?? true))}
+											<div class=" flex items-center">
+												<Tooltip content={$i18n.t('Call')}>
+													<button
+														class=" bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full p-1.5 self-center"
+														type="button"
+														on:click={async () => {
+															if (selectedModels.length > 1) {
+																toast.error($i18n.t('Select only one model to call'));
 
-																	return;
-																}
+																return;
+															}
 
-																if ($config.audio.stt.engine === 'web') {
-																	toast.error(
-																		$i18n.t(
-																			'Call feature is not supported when using Web STT engine'
-																		)
-																	);
+															if ($config.audio.stt.engine === 'web') {
+																toast.error(
+																	$i18n.t('Call feature is not supported when using Web STT engine')
+																);
 
-																	return;
-																}
-																// check if user has access to getUserMedia
-																try {
-																	let stream = await navigator.mediaDevices.getUserMedia({
-																		audio: true
-																	});
-																	// If the user grants the permission, proceed to show the call overlay
+																return;
+															}
+															// check if user has access to getUserMedia
+															try {
+																let stream = await navigator.mediaDevices.getUserMedia({
+																	audio: true
+																});
+																// If the user grants the permission, proceed to show the call overlay
 
-																	if (stream) {
-																		const tracks = stream.getTracks();
-																		tracks.forEach((track) => track.stop());
-																	}
+																if (stream) {
+																	const tracks = stream.getTracks();
+																	tracks.forEach((track) => track.stop());
+																}
 
-																	stream = null;
+																stream = null;
 
-																	if ($settings.audio?.tts?.engine === 'browser-kokoro') {
-																		// If the user has not initialized the TTS worker, initialize it
-																		if (!$TTSWorker) {
-																			await TTSWorker.set(
-																				new KokoroWorker({
-																					dtype: $settings.audio?.tts?.engineConfig?.dtype ?? 'fp32'
-																				})
-																			);
+																if ($settings.audio?.tts?.engine === 'browser-kokoro') {
+																	// If the user has not initialized the TTS worker, initialize it
+																	if (!$TTSWorker) {
+																		await TTSWorker.set(
+																			new KokoroWorker({
+																				dtype: $settings.audio?.tts?.engineConfig?.dtype ?? 'fp32'
+																			})
+																		);
 
-																			await $TTSWorker.init();
-																		}
+																		await $TTSWorker.init();
 																	}
-
-																	showCallOverlay.set(true);
-																	showControls.set(true);
-																} catch (err) {
-																	// If the user denies the permission or an error occurs, show an error message
-																	toast.error(
-																		$i18n.t('Permission denied when accessing media devices')
-																	);
 																}
-															}}
-															aria-label="Call"
-														>
-															<Headphone className="size-5" />
-														</button>
-													</Tooltip>
-												</div>
-											{:else}
-												<div class=" flex items-center">
-													<Tooltip content={$i18n.t('Send message')}>
-														<button
-															id="send-message-button"
-															class="{!(prompt === '' && files.length === 0)
-																? 'bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-100 '
-																: 'text-white bg-gray-200 dark:text-gray-900 dark:bg-gray-700 disabled'} transition rounded-full p-1.5 self-center"
-															type="submit"
-															disabled={prompt === '' && files.length === 0}
-														>
-															<svg
-																xmlns="http://www.w3.org/2000/svg"
-																viewBox="0 0 16 16"
-																fill="currentColor"
-																class="size-5"
-															>
-																<path
-																	fill-rule="evenodd"
-																	d="M8 14a.75.75 0 0 1-.75-.75V4.56L4.03 7.78a.75.75 0 0 1-1.06-1.06l4.5-4.5a.75.75 0 0 1 1.06 0l4.5 4.5a.75.75 0 0 1-1.06 1.06L8.75 4.56v8.69A.75.75 0 0 1 8 14Z"
-																	clip-rule="evenodd"
-																/>
-															</svg>
-														</button>
-													</Tooltip>
-												</div>
-											{/if}
+
+																showCallOverlay.set(true);
+																showControls.set(true);
+															} catch (err) {
+																// If the user denies the permission or an error occurs, show an error message
+																toast.error(
+																	$i18n.t('Permission denied when accessing media devices')
+																);
+															}
+														}}
+														aria-label="Call"
+													>
+														<Headphone className="size-5" />
+													</button>
+												</Tooltip>
+											</div>
 										{:else}
 											<div class=" flex items-center">
-												<Tooltip content={$i18n.t('Stop')}>
+												<Tooltip content={$i18n.t('Send message')}>
 													<button
-														class="bg-white hover:bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-800 transition rounded-full p-1.5"
-														on:click={() => {
-															stopResponse();
-														}}
+														id="send-message-button"
+														class="{!(prompt === '' && files.length === 0)
+															? 'bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-100 '
+															: 'text-white bg-gray-200 dark:text-gray-900 dark:bg-gray-700 disabled'} transition rounded-full p-1.5 self-center"
+														type="submit"
+														disabled={prompt === '' && files.length === 0}
 													>
 														<svg
 															xmlns="http://www.w3.org/2000/svg"
-															viewBox="0 0 24 24"
+															viewBox="0 0 16 16"
 															fill="currentColor"
 															class="size-5"
 														>
 															<path
 																fill-rule="evenodd"
-																d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zm6-2.438c0-.724.588-1.312 1.313-1.312h4.874c.725 0 1.313.588 1.313 1.313v4.874c0 .725-.588 1.313-1.313 1.313H9.564a1.312 1.312 0 01-1.313-1.313V9.564z"
+																d="M8 14a.75.75 0 0 1-.75-.75V4.56L4.03 7.78a.75.75 0 0 1-1.06-1.06l4.5-4.5a.75.75 0 0 1 1.06 0l4.5 4.5a.75.75 0 0 1-1.06 1.06L8.75 4.56v8.69A.75.75 0 0 1 8 14Z"
 																clip-rule="evenodd"
 															/>
 														</svg>

+ 9 - 1
src/lib/components/chat/MessageInput/Commands/Knowledge.svelte

@@ -154,6 +154,14 @@
 			keys: ['name', 'description']
 		});
 	});
+
+	const decodeString = (str: string) => {
+		try {
+			return decodeURIComponent(str);
+		} catch (e) {
+			return str;
+		}
+	};
 </script>
 
 {#if filteredItems.length > 0 || prompt.split(' ')?.at(0)?.substring(1).startsWith('http')}
@@ -210,7 +218,7 @@
 									{/if}
 
 									<div class="line-clamp-1">
-										{decodeURIComponent(item?.name)}
+										{decodeString(item?.name)}
 									</div>
 								</div>
 

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

@@ -159,7 +159,7 @@
 	};
 
 	const startRecording = async () => {
-		startDurationCounter();
+		loading = true;
 
 		stream = await navigator.mediaDevices.getUserMedia({
 			audio: {
@@ -171,6 +171,9 @@
 		mediaRecorder = new MediaRecorder(stream);
 		mediaRecorder.onstart = () => {
 			console.log('Recording started');
+			loading = false;
+			startDurationCounter();
+
 			audioChunks = [];
 			analyseAudio(stream);
 		};

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

@@ -87,6 +87,14 @@
 		showRelevance = calculateShowRelevance(citations);
 		showPercentage = shouldShowPercentage(citations);
 	}
+
+	const decodeString = (str: string) => {
+		try {
+			return decodeURIComponent(str);
+		} catch (e) {
+			return str;
+		}
+	};
 </script>
 
 <CitationsModal
@@ -117,7 +125,7 @@
 						<div
 							class="flex-1 mx-1 truncate text-black/60 hover:text-black dark:text-white/60 dark:hover:text-white transition"
 						>
-							{decodeURIComponent(citation.source.name)}
+							{decodeString(citation.source.name)}
 						</div>
 					</button>
 				{/each}
@@ -157,7 +165,7 @@
 											</div>
 										{/if}
 										<div class="flex-1 mx-1 truncate">
-											{decodeURIComponent(citation.source.name)}
+											{decodeString(citation.source.name)}
 										</div>
 									</button>
 								{/each}
@@ -194,7 +202,7 @@
 									</div>
 								{/if}
 								<div class="flex-1 mx-1 truncate">
-									{decodeURIComponent(citation.source.name)}
+									{decodeString(citation.source.name)}
 								</div>
 							</button>
 						{/each}

+ 9 - 1
src/lib/components/chat/Messages/CitationsModal.svelte

@@ -45,6 +45,14 @@
 			);
 		}
 	}
+
+	const decodeString = (str: string) => {
+		try {
+			return decodeURIComponent(str);
+		} catch (e) {
+			return str;
+		}
+	};
 </script>
 
 <Modal size="lg" bind:show>
@@ -99,7 +107,7 @@
 												: `#`}
 										target="_blank"
 									>
-										{decodeURIComponent(document?.metadata?.name ?? document.source.name)}
+										{decodeString(document?.metadata?.name ?? document.source.name)}
 									</a>
 									{#if document?.metadata?.page}
 										<span class="text-xs text-gray-500 dark:text-gray-400">

+ 7 - 5
src/lib/components/chat/Messages/Markdown/AlertRenderer.svelte

@@ -99,10 +99,12 @@ Renders the following Markdown as alerts:
 > Example warning
 
 -->
-<div class={`border-l-2 pl-2 ${alertStyles[alert.type].border}`}>
-	<p class={alertStyles[alert.type].text}>
+<div class={`border-l-4 pl-2.5 ${alertStyles[alert.type].border} my-0.5`}>
+	<div class="{alertStyles[alert.type].text} items-center flex gap-1 py-1.5">
 		<svelte:component this={alertStyles[alert.type].icon} className="inline-block size-4" />
-		<b>{alert.type}</b>
-	</p>
-	<MarkdownTokens id={`${id}-${tokenIdx}`} tokens={alert.tokens} {onTaskClick} {onSourceClick} />
+		<span class=" font-medium">{alert.type}</span>
+	</div>
+	<div class="pb-2">
+		<MarkdownTokens id={`${id}-${tokenIdx}`} tokens={alert.tokens} {onTaskClick} {onSourceClick} />
+	</div>
 </div>

+ 103 - 87
src/lib/components/chat/Messages/ResponseMessage.svelte

@@ -24,7 +24,9 @@
 		getMessageContentParts,
 		sanitizeResponseContent,
 		createMessagesList,
-		formatDate
+		formatDate,
+		removeDetails,
+		removeAllDetails
 	} from '$lib/utils';
 	import { WEBUI_BASE_URL } from '$lib/constants';
 
@@ -45,6 +47,7 @@
 	import CodeExecutions from './CodeExecutions.svelte';
 	import ContentRenderer from './ContentRenderer.svelte';
 	import { KokoroWorker } from '$lib/workers/KokoroWorker';
+	import FileItem from '$lib/components/common/FileItem.svelte';
 
 	interface MessageType {
 		id: string;
@@ -152,7 +155,9 @@
 	let showRateComment = false;
 
 	const copyToClipboard = async (text) => {
-		const res = await _copyToClipboard(text);
+		text = removeAllDetails(text);
+
+		const res = await _copyToClipboard(text, $settings?.copyFormatted ?? false);
 		if (res) {
 			toast.success($i18n.t('Copying to clipboard was successful!'));
 		}
@@ -610,18 +615,6 @@
 			</Name>
 
 			<div>
-				{#if message?.files && message.files?.filter((f) => f.type === 'image').length > 0}
-					<div class="my-2.5 w-full flex overflow-x-auto gap-2 flex-wrap">
-						{#each message.files as file}
-							<div>
-								{#if file.type === 'image'}
-									<Image src={file.url} alt={message.content} />
-								{/if}
-							</div>
-						{/each}
-					</div>
-				{/if}
-
 				<div class="chat-{message.role} w-full min-w-full markdown-prose">
 					<div>
 						{#if (message?.statusHistory ?? [...(message?.status ? [message?.status] : [])]).length > 0}
@@ -700,6 +693,27 @@
 							{/if}
 						{/if}
 
+						{#if message?.files && message.files?.filter((f) => f.type === 'image').length > 0}
+							<div class="my-1 w-full flex overflow-x-auto gap-2 flex-wrap">
+								{#each message.files as file}
+									<div>
+										{#if file.type === 'image'}
+											<Image src={file.url} alt={message.content} />
+										{:else}
+											<FileItem
+												item={file}
+												url={file.url}
+												name={file.name}
+												type={file.type}
+												size={file?.size}
+												colorClassName="bg-white dark:bg-gray-850 "
+											/>
+										{/if}
+									</div>
+								{/each}
+							</div>
+						{/if}
+
 						{#if edit === true}
 							<div class="w-full bg-gray-50 dark:bg-gray-800 rounded-3xl px-5 py-3 my-2">
 								<textarea
@@ -1006,83 +1020,85 @@
 									</button>
 								</Tooltip>
 
-								<Tooltip content={$i18n.t('Read Aloud')} placement="bottom">
-									<button
-										id="speak-button-{message.id}"
-										class="{isLastMessage
-											? 'visible'
-											: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition"
-										on:click={() => {
-											if (!loadingSpeech) {
-												toggleSpeakMessage();
-											}
-										}}
-									>
-										{#if loadingSpeech}
-											<svg
-												class=" w-4 h-4"
-												fill="currentColor"
-												viewBox="0 0 24 24"
-												xmlns="http://www.w3.org/2000/svg"
-											>
-												<style>
-													.spinner_S1WN {
-														animation: spinner_MGfb 0.8s linear infinite;
-														animation-delay: -0.8s;
-													}
+								{#if $user?.role === 'admin' || ($user?.permissions?.chat?.tts ?? true)}
+									<Tooltip content={$i18n.t('Read Aloud')} placement="bottom">
+										<button
+											id="speak-button-{message.id}"
+											class="{isLastMessage
+												? 'visible'
+												: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition"
+											on:click={() => {
+												if (!loadingSpeech) {
+													toggleSpeakMessage();
+												}
+											}}
+										>
+											{#if loadingSpeech}
+												<svg
+													class=" w-4 h-4"
+													fill="currentColor"
+													viewBox="0 0 24 24"
+													xmlns="http://www.w3.org/2000/svg"
+												>
+													<style>
+														.spinner_S1WN {
+															animation: spinner_MGfb 0.8s linear infinite;
+															animation-delay: -0.8s;
+														}
 
-													.spinner_Km9P {
-														animation-delay: -0.65s;
-													}
+														.spinner_Km9P {
+															animation-delay: -0.65s;
+														}
 
-													.spinner_JApP {
-														animation-delay: -0.5s;
-													}
+														.spinner_JApP {
+															animation-delay: -0.5s;
+														}
 
-													@keyframes spinner_MGfb {
-														93.75%,
-														100% {
-															opacity: 0.2;
+														@keyframes spinner_MGfb {
+															93.75%,
+															100% {
+																opacity: 0.2;
+															}
 														}
-													}
-												</style>
-												<circle class="spinner_S1WN" cx="4" cy="12" r="3" />
-												<circle class="spinner_S1WN spinner_Km9P" cx="12" cy="12" r="3" />
-												<circle class="spinner_S1WN spinner_JApP" cx="20" cy="12" r="3" />
-											</svg>
-										{:else if speaking}
-											<svg
-												xmlns="http://www.w3.org/2000/svg"
-												fill="none"
-												viewBox="0 0 24 24"
-												stroke-width="2.3"
-												stroke="currentColor"
-												class="w-4 h-4"
-											>
-												<path
-													stroke-linecap="round"
-													stroke-linejoin="round"
-													d="M17.25 9.75 19.5 12m0 0 2.25 2.25M19.5 12l2.25-2.25M19.5 12l-2.25 2.25m-10.5-6 4.72-4.72a.75.75 0 0 1 1.28.53v15.88a.75.75 0 0 1-1.28.53l-4.72-4.72H4.51c-.88 0-1.704-.507-1.938-1.354A9.009 9.009 0 0 1 2.25 12c0-.83.112-1.633.322-2.396C2.806 8.756 3.63 8.25 4.51 8.25H6.75Z"
-												/>
-											</svg>
-										{:else}
-											<svg
-												xmlns="http://www.w3.org/2000/svg"
-												fill="none"
-												viewBox="0 0 24 24"
-												stroke-width="2.3"
-												stroke="currentColor"
-												class="w-4 h-4"
-											>
-												<path
-													stroke-linecap="round"
-													stroke-linejoin="round"
-													d="M19.114 5.636a9 9 0 010 12.728M16.463 8.288a5.25 5.25 0 010 7.424M6.75 8.25l4.72-4.72a.75.75 0 011.28.53v15.88a.75.75 0 01-1.28.53l-4.72-4.72H4.51c-.88 0-1.704-.507-1.938-1.354A9.01 9.01 0 012.25 12c0-.83.112-1.633.322-2.396C2.806 8.756 3.63 8.25 4.51 8.25H6.75z"
-												/>
-											</svg>
-										{/if}
-									</button>
-								</Tooltip>
+													</style>
+													<circle class="spinner_S1WN" cx="4" cy="12" r="3" />
+													<circle class="spinner_S1WN spinner_Km9P" cx="12" cy="12" r="3" />
+													<circle class="spinner_S1WN spinner_JApP" cx="20" cy="12" r="3" />
+												</svg>
+											{:else if speaking}
+												<svg
+													xmlns="http://www.w3.org/2000/svg"
+													fill="none"
+													viewBox="0 0 24 24"
+													stroke-width="2.3"
+													stroke="currentColor"
+													class="w-4 h-4"
+												>
+													<path
+														stroke-linecap="round"
+														stroke-linejoin="round"
+														d="M17.25 9.75 19.5 12m0 0 2.25 2.25M19.5 12l2.25-2.25M19.5 12l-2.25 2.25m-10.5-6 4.72-4.72a.75.75 0 0 1 1.28.53v15.88a.75.75 0 0 1-1.28.53l-4.72-4.72H4.51c-.88 0-1.704-.507-1.938-1.354A9.009 9.009 0 0 1 2.25 12c0-.83.112-1.633.322-2.396C2.806 8.756 3.63 8.25 4.51 8.25H6.75Z"
+													/>
+												</svg>
+											{:else}
+												<svg
+													xmlns="http://www.w3.org/2000/svg"
+													fill="none"
+													viewBox="0 0 24 24"
+													stroke-width="2.3"
+													stroke="currentColor"
+													class="w-4 h-4"
+												>
+													<path
+														stroke-linecap="round"
+														stroke-linejoin="round"
+														d="M19.114 5.636a9 9 0 010 12.728M16.463 8.288a5.25 5.25 0 010 7.424M6.75 8.25l4.72-4.72a.75.75 0 011.28.53v15.88a.75.75 0 01-1.28.53l-4.72-4.72H4.51c-.88 0-1.704-.507-1.938-1.354A9.01 9.01 0 012.25 12c0-.83.112-1.633.322-2.396C2.806 8.756 3.63 8.25 4.51 8.25H6.75z"
+													/>
+												</svg>
+											{/if}
+										</button>
+									</Tooltip>
+								{/if}
 
 								{#if $config?.features.enable_image_generation && ($user?.role === 'admin' || $user?.permissions?.features?.image_generation) && !readOnly}
 									<Tooltip content={$i18n.t('Generate Image')} placement="bottom">

+ 52 - 50
src/lib/components/chat/ModelSelector.svelte

@@ -54,58 +54,60 @@
 				</div>
 			</div>
 
-			{#if selectedModelIdx === 0}
-				<div
-					class="  self-center mx-1 disabled:text-gray-600 disabled:hover:text-gray-600 -translate-y-[0.5px]"
-				>
-					<Tooltip content={$i18n.t('Add Model')}>
-						<button
-							class=" "
-							{disabled}
-							on:click={() => {
-								selectedModels = [...selectedModels, ''];
-							}}
-							aria-label="Add Model"
-						>
-							<svg
-								xmlns="http://www.w3.org/2000/svg"
-								fill="none"
-								viewBox="0 0 24 24"
-								stroke-width="2"
-								stroke="currentColor"
-								class="size-3.5"
+			{#if $user?.role === 'admin' || ($user?.permissions?.chat?.multiple_models ?? true)}
+				{#if selectedModelIdx === 0}
+					<div
+						class="  self-center mx-1 disabled:text-gray-600 disabled:hover:text-gray-600 -translate-y-[0.5px]"
+					>
+						<Tooltip content={$i18n.t('Add Model')}>
+							<button
+								class=" "
+								{disabled}
+								on:click={() => {
+									selectedModels = [...selectedModels, ''];
+								}}
+								aria-label="Add Model"
 							>
-								<path stroke-linecap="round" stroke-linejoin="round" d="M12 6v12m6-6H6" />
-							</svg>
-						</button>
-					</Tooltip>
-				</div>
-			{:else}
-				<div
-					class="  self-center mx-1 disabled:text-gray-600 disabled:hover:text-gray-600 -translate-y-[0.5px]"
-				>
-					<Tooltip content={$i18n.t('Remove Model')}>
-						<button
-							{disabled}
-							on:click={() => {
-								selectedModels.splice(selectedModelIdx, 1);
-								selectedModels = selectedModels;
-							}}
-							aria-label="Remove Model"
-						>
-							<svg
-								xmlns="http://www.w3.org/2000/svg"
-								fill="none"
-								viewBox="0 0 24 24"
-								stroke-width="2"
-								stroke="currentColor"
-								class="size-3"
+								<svg
+									xmlns="http://www.w3.org/2000/svg"
+									fill="none"
+									viewBox="0 0 24 24"
+									stroke-width="2"
+									stroke="currentColor"
+									class="size-3.5"
+								>
+									<path stroke-linecap="round" stroke-linejoin="round" d="M12 6v12m6-6H6" />
+								</svg>
+							</button>
+						</Tooltip>
+					</div>
+				{:else}
+					<div
+						class="  self-center mx-1 disabled:text-gray-600 disabled:hover:text-gray-600 -translate-y-[0.5px]"
+					>
+						<Tooltip content={$i18n.t('Remove Model')}>
+							<button
+								{disabled}
+								on:click={() => {
+									selectedModels.splice(selectedModelIdx, 1);
+									selectedModels = selectedModels;
+								}}
+								aria-label="Remove Model"
 							>
-								<path stroke-linecap="round" stroke-linejoin="round" d="M19.5 12h-15" />
-							</svg>
-						</button>
-					</Tooltip>
-				</div>
+								<svg
+									xmlns="http://www.w3.org/2000/svg"
+									fill="none"
+									viewBox="0 0 24 24"
+									stroke-width="2"
+									stroke="currentColor"
+									class="size-3"
+								>
+									<path stroke-linecap="round" stroke-linejoin="round" d="M19.5 12h-15" />
+								</svg>
+							</button>
+						</Tooltip>
+					</div>
+				{/if}
 			{/if}
 		</div>
 	{/each}

+ 3 - 1
src/lib/components/chat/ModelSelector/Selector.svelte

@@ -634,7 +634,7 @@
 						{/if}
 					</button>
 				{:else}
-					<div>
+					<div class="">
 						<div class="block px-3 py-2 text-sm text-gray-700 dark:text-gray-100">
 							{$i18n.t('No results found')}
 						</div>
@@ -778,6 +778,8 @@
 						</div>
 					</button>
 				</div>
+			{:else if filteredItems.length === 0}
+				<div class="mb-3"></div>
 			{/if}
 
 			<div class="hidden w-[42rem]" />

+ 170 - 115
src/lib/components/chat/Navbar.svelte

@@ -4,7 +4,9 @@
 
 	import {
 		WEBUI_NAME,
+		banners,
 		chatId,
+		config,
 		mobile,
 		settings,
 		showArchivedChats,
@@ -26,6 +28,7 @@
 	import AdjustmentsHorizontal from '../icons/AdjustmentsHorizontal.svelte';
 
 	import PencilSquare from '../icons/PencilSquare.svelte';
+	import Banner from '../common/Banner.svelte';
 
 	const i18n = getContext('i18n');
 
@@ -34,6 +37,7 @@
 	export let shareEnabled: boolean = false;
 
 	export let chat;
+	export let history;
 	export let selectedModels;
 	export let showModelSelector = true;
 
@@ -43,136 +47,187 @@
 
 <ShareChatModal bind:show={showShareChatModal} chatId={$chatId} />
 
-<nav class="sticky top-0 z-30 w-full px-1.5 py-1.5 -mb-8 flex items-center drag-region">
-	<div
-		class=" bg-linear-to-b via-50% from-white via-white to-transparent dark:from-gray-900 dark:via-gray-900 dark:to-transparent pointer-events-none absolute inset-0 -bottom-7 z-[-1]"
-	></div>
-
-	<div class=" flex max-w-full w-full mx-auto px-1 pt-0.5 bg-transparent">
-		<div class="flex items-center w-full max-w-full">
-			<div
-				class="{$showSidebar
-					? 'md:hidden'
-					: ''} mr-1 self-start flex flex-none items-center text-gray-600 dark:text-gray-400"
-			>
-				<button
-					id="sidebar-toggle-button"
-					class="cursor-pointer px-2 py-2 flex rounded-xl hover:bg-gray-50 dark:hover:bg-gray-850 transition"
-					on:click={() => {
-						showSidebar.set(!$showSidebar);
-					}}
-					aria-label="Toggle Sidebar"
+<nav class="sticky top-0 z-30 w-full py-1.5 -mb-8 flex flex-col items-center drag-region">
+	<div class="flex items-center w-full px-1.5">
+		<div
+			class=" bg-linear-to-b via-50% from-white via-white to-transparent dark:from-gray-900 dark:via-gray-900 dark:to-transparent pointer-events-none absolute inset-0 -bottom-7 z-[-1]"
+		></div>
+
+		<div class=" flex max-w-full w-full mx-auto px-1 pt-0.5 bg-transparent">
+			<div class="flex items-center w-full max-w-full">
+				<div
+					class="{$showSidebar
+						? 'md:hidden'
+						: ''} mr-1 self-start flex flex-none items-center text-gray-600 dark:text-gray-400"
 				>
-					<div class=" m-auto self-center">
-						<MenuLines />
-					</div>
-				</button>
-			</div>
+					<button
+						id="sidebar-toggle-button"
+						class="cursor-pointer px-2 py-2 flex rounded-xl hover:bg-gray-50 dark:hover:bg-gray-850 transition"
+						on:click={() => {
+							showSidebar.set(!$showSidebar);
+						}}
+						aria-label="Toggle Sidebar"
+					>
+						<div class=" m-auto self-center">
+							<MenuLines />
+						</div>
+					</button>
+				</div>
 
-			<div
-				class="flex-1 overflow-hidden max-w-full py-0.5
+				<div
+					class="flex-1 overflow-hidden max-w-full py-0.5
 			{$showSidebar ? 'ml-1' : ''}
 			"
-			>
-				{#if showModelSelector}
-					<ModelSelector bind:selectedModels showSetDefault={!shareEnabled} />
-				{/if}
-			</div>
-
-			<div class="self-start flex flex-none items-center text-gray-600 dark:text-gray-400">
-				<!-- <div class="md:hidden flex self-center w-[1px] h-5 mx-2 bg-gray-300 dark:bg-stone-700" /> -->
-				{#if shareEnabled && chat && (chat.id || $temporaryChatEnabled)}
-					<Menu
-						{chat}
-						{shareEnabled}
-						shareHandler={() => {
-							showShareChatModal = !showShareChatModal;
-						}}
-						downloadHandler={() => {
-							showDownloadChatModal = !showDownloadChatModal;
-						}}
-					>
+				>
+					{#if showModelSelector}
+						<ModelSelector bind:selectedModels showSetDefault={!shareEnabled} />
+					{/if}
+				</div>
+
+				<div class="self-start flex flex-none items-center text-gray-600 dark:text-gray-400">
+					<!-- <div class="md:hidden flex self-center w-[1px] h-5 mx-2 bg-gray-300 dark:bg-stone-700" /> -->
+					{#if shareEnabled && chat && (chat.id || $temporaryChatEnabled)}
+						<Menu
+							{chat}
+							{shareEnabled}
+							shareHandler={() => {
+								showShareChatModal = !showShareChatModal;
+							}}
+							downloadHandler={() => {
+								showDownloadChatModal = !showDownloadChatModal;
+							}}
+						>
+							<button
+								class="flex cursor-pointer px-2 py-2 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-850 transition"
+								id="chat-context-menu-button"
+							>
+								<div class=" m-auto self-center">
+									<svg
+										xmlns="http://www.w3.org/2000/svg"
+										fill="none"
+										viewBox="0 0 24 24"
+										stroke-width="1.5"
+										stroke="currentColor"
+										class="size-5"
+									>
+										<path
+											stroke-linecap="round"
+											stroke-linejoin="round"
+											d="M6.75 12a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0ZM12.75 12a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0ZM18.75 12a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0Z"
+										/>
+									</svg>
+								</div>
+							</button>
+						</Menu>
+					{/if}
+
+					<Tooltip content={$i18n.t('Controls')}>
 						<button
-							class="flex cursor-pointer px-2 py-2 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-850 transition"
-							id="chat-context-menu-button"
+							class=" flex cursor-pointer px-2 py-2 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-850 transition"
+							on:click={async () => {
+								await showControls.set(!$showControls);
+							}}
+							aria-label="Controls"
 						>
 							<div class=" m-auto self-center">
-								<svg
-									xmlns="http://www.w3.org/2000/svg"
-									fill="none"
-									viewBox="0 0 24 24"
-									stroke-width="1.5"
-									stroke="currentColor"
-									class="size-5"
-								>
-									<path
-										stroke-linecap="round"
-										stroke-linejoin="round"
-										d="M6.75 12a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0ZM12.75 12a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0ZM18.75 12a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0Z"
-									/>
-								</svg>
+								<AdjustmentsHorizontal className=" size-5" strokeWidth="0.5" />
 							</div>
 						</button>
-					</Menu>
-				{/if}
-
-				<Tooltip content={$i18n.t('Controls')}>
-					<button
-						class=" flex cursor-pointer px-2 py-2 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-850 transition"
-						on:click={async () => {
-							await showControls.set(!$showControls);
-						}}
-						aria-label="Controls"
-					>
-						<div class=" m-auto self-center">
-							<AdjustmentsHorizontal className=" size-5" strokeWidth="0.5" />
-						</div>
-					</button>
-				</Tooltip>
+					</Tooltip>
 
-				<Tooltip content={$i18n.t('New Chat')}>
-					<button
-						id="new-chat-button"
-						class=" flex {$showSidebar
-							? 'md:hidden'
-							: ''} cursor-pointer px-2 py-2 rounded-xl text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-850 transition"
-						on:click={() => {
-							initNewChat();
-						}}
-						aria-label="New Chat"
-					>
-						<div class=" m-auto self-center">
-							<PencilSquare className=" size-5" strokeWidth="2" />
-						</div>
-					</button>
-				</Tooltip>
-
-				{#if $user !== undefined && $user !== null}
-					<UserMenu
-						className="max-w-[200px]"
-						role={$user?.role}
-						on:show={(e) => {
-							if (e.detail === 'archived-chat') {
-								showArchivedChats.set(true);
-							}
-						}}
-					>
+					<Tooltip content={$i18n.t('New Chat')}>
 						<button
-							class="select-none flex rounded-xl p-1.5 w-full hover:bg-gray-50 dark:hover:bg-gray-850 transition"
-							aria-label="User Menu"
+							id="new-chat-button"
+							class=" flex {$showSidebar
+								? 'md:hidden'
+								: ''} cursor-pointer px-2 py-2 rounded-xl text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-850 transition"
+							on:click={() => {
+								initNewChat();
+							}}
+							aria-label="New Chat"
 						>
-							<div class=" self-center">
-								<img
-									src={$user?.profile_image_url}
-									class="size-6 object-cover rounded-full"
-									alt="User profile"
-									draggable="false"
-								/>
+							<div class=" m-auto self-center">
+								<PencilSquare className=" size-5" strokeWidth="2" />
 							</div>
 						</button>
-					</UserMenu>
-				{/if}
+					</Tooltip>
+
+					{#if $user !== undefined && $user !== null}
+						<UserMenu
+							className="max-w-[200px]"
+							role={$user?.role}
+							on:show={(e) => {
+								if (e.detail === 'archived-chat') {
+									showArchivedChats.set(true);
+								}
+							}}
+						>
+							<button
+								class="select-none flex rounded-xl p-1.5 w-full hover:bg-gray-50 dark:hover:bg-gray-850 transition"
+								aria-label="User Menu"
+							>
+								<div class=" self-center">
+									<img
+										src={$user?.profile_image_url}
+										class="size-6 object-cover rounded-full"
+										alt="User profile"
+										draggable="false"
+									/>
+								</div>
+							</button>
+						</UserMenu>
+					{/if}
+				</div>
 			</div>
 		</div>
 	</div>
+
+	{#if !history.currentId && !$chatId && ($banners.length > 0 || ($config?.license_metadata?.type ?? null) === 'trial' || (($config?.license_metadata?.seats ?? null) !== null && $config?.user_count > $config?.license_metadata?.seats))}
+		<div class=" w-full z-30 mt-5">
+			<div class=" flex flex-col gap-1 w-full">
+				{#if ($config?.license_metadata?.type ?? null) === 'trial'}
+					<Banner
+						banner={{
+							type: 'info',
+							title: 'Trial License',
+							content: $i18n.t(
+								'You are currently using a trial license. Please contact support to upgrade your license.'
+							)
+						}}
+					/>
+				{/if}
+
+				{#if ($config?.license_metadata?.seats ?? null) !== null && $config?.user_count > $config?.license_metadata?.seats}
+					<Banner
+						banner={{
+							type: 'error',
+							title: 'License Error',
+							content: $i18n.t(
+								'Exceeded the number of seats in your license. Please contact support to increase the number of seats.'
+							)
+						}}
+					/>
+				{/if}
+
+				{#each $banners.filter( (b) => (b.dismissible ? !JSON.parse(localStorage.getItem('dismissedBannerIds') ?? '[]').includes(b.id) : true) ) as banner}
+					<Banner
+						{banner}
+						on:dismiss={(e) => {
+							const bannerId = e.detail;
+
+							localStorage.setItem(
+								'dismissedBannerIds',
+								JSON.stringify(
+									[
+										bannerId,
+										...JSON.parse(localStorage.getItem('dismissedBannerIds') ?? '[]')
+									].filter((id) => $banners.find((b) => b.id === id))
+								)
+							);
+						}}
+					/>
+				{/each}
+			</div>
+		</div>
+	{/if}
 </nav>

+ 85 - 1
src/lib/components/chat/Settings/Interface.svelte

@@ -43,6 +43,7 @@
 	let chatBubble = true;
 	let chatDirection: 'LTR' | 'RTL' | 'auto' = 'auto';
 	let ctrlEnterToSend = false;
+	let copyFormatted = false;
 
 	let collapseCodeBlocks = false;
 	let expandDetails = false;
@@ -63,6 +64,9 @@
 
 	let webSearch = null;
 
+	let iframeSandboxAllowSameOrigin = false;
+	let iframeSandboxAllowForms = false;
+
 	const toggleExpandDetails = () => {
 		expandDetails = !expandDetails;
 		saveSettings({ expandDetails });
@@ -217,6 +221,11 @@
 		}
 	};
 
+	const toggleCopyFormatted = async () => {
+		copyFormatted = !copyFormatted;
+		saveSettings({ copyFormatted });
+	};
+
 	const toggleChangeChatDirection = async () => {
 		if (chatDirection === 'auto') {
 			chatDirection = 'LTR';
@@ -245,6 +254,16 @@
 		saveSettings({ webSearch: webSearch });
 	};
 
+	const toggleIframeSandboxAllowSameOrigin = async () => {
+		iframeSandboxAllowSameOrigin = !iframeSandboxAllowSameOrigin;
+		saveSettings({ iframeSandboxAllowSameOrigin });
+	};
+
+	const toggleIframeSandboxAllowForms = async () => {
+		iframeSandboxAllowForms = !iframeSandboxAllowForms;
+		saveSettings({ iframeSandboxAllowForms });
+	};
+
 	onMount(async () => {
 		titleAutoGenerate = $settings?.title?.auto ?? true;
 		autoTags = $settings.autoTags ?? true;
@@ -262,6 +281,7 @@
 		richTextInput = $settings.richTextInput ?? true;
 		promptAutocomplete = $settings.promptAutocomplete ?? false;
 		largeTextAsFile = $settings.largeTextAsFile ?? false;
+		copyFormatted = $settings.copyFormatted ?? false;
 
 		collapseCodeBlocks = $settings.collapseCodeBlocks ?? false;
 		expandDetails = $settings.expandDetails ?? false;
@@ -657,6 +677,28 @@
 				</div>
 			</div>
 
+			<div>
+				<div class=" py-0.5 flex w-full justify-between">
+					<div class=" self-center text-xs">
+						{$i18n.t('Copy Formatted Text')}
+					</div>
+
+					<button
+						class="p-1 px-3 text-xs flex rounded-sm transition"
+						on:click={() => {
+							toggleCopyFormatted();
+						}}
+						type="button"
+					>
+						{#if copyFormatted === true}
+							<span class="ml-2 self-center">{$i18n.t('On')}</span>
+						{:else}
+							<span class="ml-2 self-center">{$i18n.t('Off')}</span>
+						{/if}
+					</button>
+				</div>
+			</div>
+
 			<div>
 				<div class=" py-0.5 flex w-full justify-between">
 					<div class=" self-center text-xs">{$i18n.t('Always Collapse Code Blocks')}</div>
@@ -746,7 +788,9 @@
 
 			<div>
 				<div class=" py-0.5 flex w-full justify-between">
-					<div class=" self-center text-xs">{$i18n.t('Haptic Feedback')}</div>
+					<div class=" self-center text-xs">
+						{$i18n.t('Haptic Feedback')} ({$i18n.t('Android')})
+					</div>
 
 					<button
 						class="p-1 px-3 text-xs flex rounded-sm transition"
@@ -850,6 +894,46 @@
 				</div>
 			</div>
 
+			<div>
+				<div class=" py-0.5 flex w-full justify-between">
+					<div class=" self-center text-xs">{$i18n.t('iframe Sandbox Allow Same Origin')}</div>
+
+					<button
+						class="p-1 px-3 text-xs flex rounded-sm transition"
+						on:click={() => {
+							toggleIframeSandboxAllowSameOrigin();
+						}}
+						type="button"
+					>
+						{#if iframeSandboxAllowSameOrigin === true}
+							<span class="ml-2 self-center">{$i18n.t('On')}</span>
+						{:else}
+							<span class="ml-2 self-center">{$i18n.t('Off')}</span>
+						{/if}
+					</button>
+				</div>
+			</div>
+
+			<div>
+				<div class=" py-0.5 flex w-full justify-between">
+					<div class=" self-center text-xs">{$i18n.t('iframe Sandbox Allow Forms')}</div>
+
+					<button
+						class="p-1 px-3 text-xs flex rounded-sm transition"
+						on:click={() => {
+							toggleIframeSandboxAllowForms();
+						}}
+						type="button"
+					>
+						{#if iframeSandboxAllowForms === true}
+							<span class="ml-2 self-center">{$i18n.t('On')}</span>
+						{:else}
+							<span class="ml-2 self-center">{$i18n.t('Off')}</span>
+						{/if}
+					</button>
+				</div>
+			</div>
+
 			<div class=" my-1.5 text-sm font-medium">{$i18n.t('Voice')}</div>
 
 			<div>

+ 12 - 8
src/lib/components/common/FileItem.svelte

@@ -28,6 +28,14 @@
 	import { deleteFileById } from '$lib/apis/files';
 
 	let showModal = false;
+
+	const decodeString = (str: string) => {
+		try {
+			return decodeURIComponent(str);
+		} catch (e) {
+			return str;
+		}
+	};
 </script>
 
 {#if item}
@@ -82,7 +90,7 @@
 	{#if !small}
 		<div class="flex flex-col justify-center -space-y-0.5 px-2.5 w-full">
 			<div class=" dark:text-gray-100 text-sm font-medium line-clamp-1 mb-1">
-				{decodeURIComponent(name)}
+				{decodeString(name)}
 			</div>
 
 			<div class=" flex justify-between text-gray-500 text-xs line-clamp-1">
@@ -101,11 +109,7 @@
 			</div>
 		</div>
 	{:else}
-		<Tooltip
-			content={decodeURIComponent(name)}
-			className="flex flex-col w-full"
-			placement="top-start"
-		>
+		<Tooltip content={decodeString(name)} className="flex flex-col w-full" placement="top-start">
 			<div class="flex flex-col justify-center -space-y-0.5 px-2.5 w-full">
 				<div class=" dark:text-gray-100 text-sm flex justify-between items-center">
 					{#if loading}
@@ -113,7 +117,7 @@
 							<Spinner className="size-4" />
 						</div>
 					{/if}
-					<div class="font-medium line-clamp-1 flex-1">{decodeURIComponent(name)}</div>
+					<div class="font-medium line-clamp-1 flex-1">{decodeString(name)}</div>
 					<div class="text-gray-500 text-xs capitalize shrink-0">{formatFileSize(size)}</div>
 				</div>
 			</div>
@@ -123,7 +127,7 @@
 	{#if dismissible}
 		<div class=" absolute -top-1 -right-1">
 			<button
-				class=" bg-white text-black border border-white rounded-full group-hover:visible invisible transition"
+				class=" bg-white text-black border border-gray-50 rounded-full group-hover:visible invisible transition"
 				type="button"
 				on:click|stopPropagation={() => {
 					dispatch('dismiss');

+ 1 - 1
src/lib/components/layout/Sidebar/ChannelModal.svelte

@@ -19,7 +19,7 @@
 	export let edit = false;
 
 	let name = '';
-	let accessControl = null;
+	let accessControl = {};
 
 	let loading = false;
 

+ 1 - 1
src/lib/components/workspace/Knowledge/CreateKnowledgeBase.svelte

@@ -12,7 +12,7 @@
 
 	let name = '';
 	let description = '';
-	let accessControl = null;
+	let accessControl = {};
 
 	const submitHandler = async () => {
 		loading = true;

+ 9 - 1
src/lib/components/workspace/Knowledge/KnowledgeBase.svelte

@@ -547,6 +547,14 @@
 		dropZone?.removeEventListener('drop', onDrop);
 		dropZone?.removeEventListener('dragleave', onDragLeave);
 	});
+
+	const decodeString = (str: string) => {
+		try {
+			return decodeURIComponent(str);
+		} catch (e) {
+			return str;
+		}
+	};
 </script>
 
 {#if dragged}
@@ -698,7 +706,7 @@
 										href={selectedFile.id ? `/api/v1/files/${selectedFile.id}/content` : '#'}
 										target="_blank"
 									>
-										{decodeURIComponent(selectedFile?.meta?.name)}
+										{decodeString(selectedFile?.meta?.name)}
 									</a>
 								</div>
 

+ 1 - 1
src/lib/components/workspace/Prompts/PromptEditor.svelte

@@ -21,7 +21,7 @@
 	let command = '';
 	let content = '';
 
-	let accessControl = null;
+	let accessControl = {};
 
 	let showAccessControlModal = false;
 

+ 18 - 13
src/lib/components/workspace/Tools/ToolkitEditor.svelte

@@ -30,7 +30,7 @@
 		description: ''
 	};
 	export let content = '';
-	export let accessControl = null;
+	export let accessControl = {};
 
 	let _content = '';
 
@@ -50,22 +50,20 @@
 	let boilerplate = `import os
 import requests
 from datetime import datetime
-
+from pydantic import BaseModel, Field
 
 class Tools:
     def __init__(self):
         pass
 
-    # Add your custom tools using pure Python code here, make sure to add type hints
-    # Use Sphinx-style docstrings to document your tools, they will be used for generating tools specifications
-    # Please refer to function_calling_filter_pipeline.py file from pipelines project for an example
-
+    # Add your custom tools using pure Python code here, make sure to add type hints and descriptions
+	
     def get_user_name_and_email_and_id(self, __user__: dict = {}) -> str:
         """
         Get the user name, Email and ID from the user object.
         """
 
-        # Do not include :param for __user__ in the docstring as it should not be shown in the tool's specification
+        # Do not include a descrption for __user__ as it should not be shown in the tool's specification
         # The session user object will be passed as a parameter when the function is called
 
         print(__user__)
@@ -86,7 +84,6 @@ class Tools:
     def get_current_time(self) -> str:
         """
         Get the current time in a more human-readable format.
-        :return: The current time.
         """
 
         now = datetime.now()
@@ -97,10 +94,14 @@ class Tools:
 
         return f"Current Date and Time = {current_date}, {current_time}"
 
-    def calculator(self, equation: str) -> str:
+    def calculator(
+        self,
+        equation: str = Field(
+            ..., description="The mathematical equation to calculate."
+        ),
+    ) -> str:
         """
         Calculate the result of an equation.
-        :param equation: The equation to calculate.
         """
 
         # Avoid using eval in production code
@@ -112,12 +113,16 @@ class Tools:
             print(e)
             return "Invalid equation"
 
-    def get_current_weather(self, city: str) -> str:
+    def get_current_weather(
+        self,
+        city: str = Field(
+            "New York, NY", description="Get the current weather for a given city."
+        ),
+    ) -> str:
         """
         Get the current weather for a given city.
-        :param city: The name of the city to get the weather for.
-        :return: The current weather information or an error message.
         """
+
         api_key = os.getenv("OPENWEATHER_API_KEY")
         if not api_key:
             return (

+ 1 - 1
src/lib/components/workspace/common/AccessControl.svelte

@@ -13,7 +13,7 @@
 	export let onChange: Function = () => {};
 
 	export let accessRoles = ['read'];
-	export let accessControl = null;
+	export let accessControl = {};
 
 	export let allowPublic = true;
 

+ 1 - 1
src/lib/components/workspace/common/AccessControlModal.svelte

@@ -6,7 +6,7 @@
 	import AccessControl from './AccessControl.svelte';
 
 	export let show = false;
-	export let accessControl = null;
+	export let accessControl = {};
 	export let accessRoles = ['read'];
 	export let allowPublic = true;
 

+ 28 - 2
src/lib/i18n/locales/ar-BH/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "جميع الملفات",
 	"All models deleted successfully": "",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "",
 	"Allow Chat Deletion": "يستطيع حذف المحادثات",
 	"Allow Chat Edit": "",
 	"Allow File Upload": "",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "",
+	"Allow Text to Speech": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "و",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "و أنشئ رابط مشترك جديد.",
+	"Android": "",
 	"API Base URL": "API الرابط الرئيسي",
 	"API Key": "API مفتاح",
 	"API Key created.": "API تم أنشاء المفتاح",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "مفتاح واجهة برمجة تطبيقات البحث الشجاع",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "تجاوز التحقق من SSL للموقع",
 	"Calendar": "",
 	"Call": "",
 	"Call feature is not supported when using Web STT engine": "",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "تم نسخ عنوان URL للدردشة المشتركة إلى الحافظة",
 	"Copied to clipboard": "",
 	"Copy": "نسخ",
+	"Copy Formatted Text": "",
 	"Copy last code block": "انسخ كتلة التعليمات البرمجية الأخيرة",
 	"Copy last response": "انسخ الرد الأخير",
 	"Copy Link": "أنسخ الرابط",
@@ -303,6 +308,7 @@
 	"Deleted User": "",
 	"Describe your knowledge base and objectives": "",
 	"Description": "وصف",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "لم أتبع التعليمات بشكل كامل",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "تعديل",
 	"Edit Arena Model": "",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "أدخل عنوان URL ل Github Raw",
 	"Enter Google PSE API Key": "أدخل مفتاح واجهة برمجة تطبيقات PSE من Google",
 	"Enter Google PSE Engine Id": "أدخل معرف محرك PSE من Google",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "(e.g. 50) أدخل عدد الخطوات",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "أدخل تسلسل التوقف",
 	"Enter system prompt": "",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "",
 	"Filters": "",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "تم اكتشاف انتحال بصمة الإصبع: غير قادر على استخدام الأحرف الأولى كصورة رمزية. الافتراضي لصورة الملف الشخصي الافتراضية.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "دفق قطع الاستجابة الخارجية الكبيرة بسلاسة",
 	"Focus chat input": "التركيز على إدخال الدردشة",
 	"Folder deleted successfully": "",
@@ -589,6 +605,8 @@
 	"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": "",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "",
 	"Language": "اللغة",
+	"Language Locales": "",
 	"Last Active": "آخر نشاط",
 	"Last Modified": "",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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": "",
-	"Minimum Score": "الحد الأدنى من النقاط",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "صمامات خطوط الأنابيب",
 	"Plain text (.txt)": "نص عادي (.txt)",
 	"Playground": "مكان التجربة",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "ملاحظات الإصدار",
 	"Relevance": "",
+	"Relevance Threshold": "",
 	"Remove": "إزالة",
 	"Remove Model": "حذف الموديل",
 	"Rename": "إعادة تسمية",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "",
 	"Signing in to {{WEBUI_NAME}}": "",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "المصدر",
 	"Speech Playback Speed": "",
 	"Speech recognition error: {{error}}": "{{error}} خطأ في التعرف على الكلام",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "",
 	"Tasks": "",
 	"Tavily API Key": "",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "أخبرنا المزيد:",
 	"Temperature": "درجة حرارة",
 	"Template": "نموذج",
@@ -1179,6 +1203,7 @@
 	"variable": "المتغير",
 	"variable to have them replaced with clipboard content.": "متغير لاستبدالها بمحتوى الحافظة.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "إصدار",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "Web",
 	"Web API": "",
+	"Web Loader Engine": "",
 	"Web Search": "بحث الويب",
 	"Web Search Engine": "محرك بحث الويب",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/ar/translation.json

@@ -57,13 +57,17 @@
 	"All": "الكل",
 	"All Documents": "جميع المستندات",
 	"All models deleted successfully": "تم حذف جميع النماذج بنجاح",
+	"Allow Call": "",
 	"Allow Chat Controls": "السماح بوسائل التحكم في المحادثة",
 	"Allow Chat Delete": "السماح بحذف المحادثة",
 	"Allow Chat Deletion": "السماح بحذف المحادثة",
 	"Allow Chat Edit": "السماح بتعديل المحادثة",
 	"Allow File Upload": "السماح بتحميل الملفات",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "السماح بالأصوات غير المحلية",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "السماح بالمحادثة المؤقتة",
+	"Allow Text to Speech": "",
 	"Allow User Location": "السماح بتحديد موقع المستخدم",
 	"Allow Voice Interruption in Call": "السماح بانقطاع الصوت أثناء المكالمة",
 	"Allowed Endpoints": "النقاط النهائية المسموح بها",
@@ -79,6 +83,7 @@
 	"and": "و",
 	"and {{COUNT}} more": "و{{COUNT}} المزيد",
 	"and create a new shared link.": "وإنشاء رابط مشترك جديد.",
+	"Android": "",
 	"API Base URL": "الرابط الأساسي لواجهة API",
 	"API Key": "مفتاح واجهة برمجة التطبيقات (API)",
 	"API Key created.": "تم إنشاء مفتاح واجهة API.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "مفتاح API لـ Brave Search",
 	"By {{name}}": "بواسطة {{name}}",
 	"Bypass Embedding and Retrieval": "تجاوز التضمين والاسترجاع",
-	"Bypass SSL verification for Websites": "تجاوز التحقق من SSL للمواقع",
 	"Calendar": "التقويم",
 	"Call": "مكالمة",
 	"Call feature is not supported when using Web STT engine": "ميزة الاتصال غير مدعومة عند استخدام محرك Web STT",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "تم نسخ رابط المحادثة المشترك إلى الحافظة!",
 	"Copied to clipboard": "تم النسخ إلى الحافظة",
 	"Copy": "نسخ",
+	"Copy Formatted Text": "",
 	"Copy last code block": "نسخ آخر كتلة شيفرة",
 	"Copy last response": "نسخ آخر رد",
 	"Copy Link": "نسخ الرابط",
@@ -303,6 +308,7 @@
 	"Deleted User": "مستخدم محذوف",
 	"Describe your knowledge base and objectives": "صف قاعدة معرفتك وأهدافك",
 	"Description": "وصف",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "لم أتبع التعليمات بشكل كامل",
 	"Direct": "",
 	"Direct Connections": "الاتصالات المباشرة",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "مثال: my_filter",
 	"e.g. my_tools": "مثال: my_tools",
 	"e.g. Tools for performing various operations": "مثال: أدوات لتنفيذ عمليات متنوعة",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "تعديل",
 	"Edit Arena Model": "تعديل نموذج Arena",
 	"Edit Channel": "تعديل القناة",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "أدخل مفتاح تحليل المستندات",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "أدخل النطاقات مفصولة بفواصل (مثال: example.com,site.org)",
 	"Enter Exa API Key": "أدخل مفتاح API لـ Exa",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "أدخل عنوان URL ل Github Raw",
 	"Enter Google PSE API Key": "أدخل مفتاح واجهة برمجة تطبيقات PSE من Google",
 	"Enter Google PSE Engine Id": "أدخل معرف محرك PSE من Google",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "أدخل مفتاح API لـ Mojeek Search",
 	"Enter Number of Steps (e.g. 50)": "(e.g. 50) أدخل عدد الخطوات",
 	"Enter Perplexity API Key": "أدخل مفتاح API لـ Perplexity",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "أدخل عنوان البروكسي (مثال: https://user:password@host:port)",
 	"Enter reasoning effort": "أدخل مستوى الجهد في الاستدلال",
 	"Enter Sampler (e.g. Euler a)": "أدخل العينة (مثال: Euler a)",
@@ -441,10 +452,13 @@
 	"Enter server host": "أدخل مضيف الخادم",
 	"Enter server label": "أدخل تسمية الخادم",
 	"Enter server port": "أدخل منفذ الخادم",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "أدخل تسلسل التوقف",
 	"Enter system prompt": "أدخل موجه النظام",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "أدخل مفتاح API لـ Tavily",
+	"Enter Tavily Extract Depth": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "أدخل الرابط العلني لـ WebUI الخاص بك. سيتم استخدام هذا الرابط لإنشاء روابط داخل الإشعارات.",
 	"Enter Tika Server URL": "أدخل رابط خادم Tika",
 	"Enter timeout in seconds": "أدخل المهلة بالثواني",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "تم الآن تفعيل الفلتر على مستوى النظام",
 	"Filters": "الفلاتر",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "تم اكتشاف انتحال بصمة الإصبع: غير قادر على استخدام الأحرف الأولى كصورة رمزية. الافتراضي لصورة الملف الشخصي الافتراضية.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "دفق قطع الاستجابة الخارجية الكبيرة بسلاسة",
 	"Focus chat input": "التركيز على إدخال الدردشة",
 	"Folder deleted successfully": "تم حذف المجلد بنجاح",
@@ -589,6 +605,8 @@
 	"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": "المعرّف",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "أشعل الفضول",
 	"Image": "صورة",
 	"Image Compression": "ضغط الصور",
@@ -649,6 +667,7 @@
 	"Label": "التسمية",
 	"Landing Page Mode": "وضع الصفحة الرئيسية",
 	"Language": "اللغة",
+	"Language Locales": "",
 	"Last Active": "آخر نشاط",
 	"Last Modified": "آخر تعديل",
 	"Last reply": "آخر رد",
@@ -702,7 +721,6 @@
 	"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": "الحد الأدنى P",
-	"Minimum Score": "الحد الأدنى من النقاط",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "صمامات خطوط الأنابيب",
 	"Plain text (.txt)": "نص عادي (.txt)",
 	"Playground": "مكان التجربة",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "يرجى مراجعة التحذيرات التالية بعناية:",
 	"Please do not close the settings page while loading the model.": "الرجاء عدم إغلاق صفحة الإعدادات أثناء تحميل النموذج.",
 	"Please enter a prompt": "الرجاء إدخال توجيه",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "ملاحظات الإصدار",
 	"Relevance": "الصلة",
+	"Relevance Threshold": "",
 	"Remove": "إزالة",
 	"Remove Model": "حذف الموديل",
 	"Rename": "إعادة تسمية",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "سجّل في {{WEBUI_NAME}}",
 	"Signing in to {{WEBUI_NAME}}": "جارٍ تسجيل الدخول إلى {{WEBUI_NAME}}",
 	"sk-1234": "sk-1234",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "المصدر",
 	"Speech Playback Speed": "سرعة تشغيل الصوت",
 	"Speech recognition error: {{error}}": "{{error}} خطأ في التعرف على الكلام",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "اضغط للمقاطعة",
 	"Tasks": "المهام",
 	"Tavily API Key": "مفتاح API لـ Tavily",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "أخبرنا المزيد:",
 	"Temperature": "درجة حرارة",
 	"Template": "نموذج",
@@ -1179,6 +1203,7 @@
 	"variable": "المتغير",
 	"variable to have them replaced with clipboard content.": "متغير لاستبدالها بمحتوى الحافظة.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "إصدار",
 	"Version {{selectedVersion}} of {{totalVersions}}": "الإصدار {{selectedVersion}} من {{totalVersions}}",
 	"View Replies": "عرض الردود",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "تحذير: تنفيذ كود Jupyter يتيح تنفيذ كود عشوائي مما يشكل مخاطر أمنية جسيمة—تابع بحذر شديد.",
 	"Web": "Web",
 	"Web API": "واجهة برمجة التطبيقات (API)",
+	"Web Loader Engine": "",
 	"Web Search": "بحث الويب",
 	"Web Search Engine": "محرك بحث الويب",
 	"Web Search in Chat": "بحث ويب داخل المحادثة",

+ 28 - 2
src/lib/i18n/locales/bg-BG/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "Всички Документи",
 	"All models deleted successfully": "Всички модели са изтрити успешно",
+	"Allow Call": "",
 	"Allow Chat Controls": "Разреши контроли на чата",
 	"Allow Chat Delete": "Разреши изтриване на чат",
 	"Allow Chat Deletion": "Позволи Изтриване на Чат",
 	"Allow Chat Edit": "Разреши редактиране на чат",
 	"Allow File Upload": "Разреши качване на файлове",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Разреши нелокални гласове",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "Разреши временен чат",
+	"Allow Text to Speech": "",
 	"Allow User Location": "Разреши местоположение на потребителя",
 	"Allow Voice Interruption in Call": "Разреши прекъсване на гласа по време на разговор",
 	"Allowed Endpoints": "Разрешени крайни точки",
@@ -79,6 +83,7 @@
 	"and": "и",
 	"and {{COUNT}} more": "и още {{COUNT}}",
 	"and create a new shared link.": "и създай нов общ линк.",
+	"Android": "",
 	"API Base URL": "API Базов URL",
 	"API Key": "API Ключ",
 	"API Key created.": "API Ключ създаден.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "API ключ за Brave Search",
 	"By {{name}}": "От {{name}}",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "Изключване на SSL проверката за сайтове",
 	"Calendar": "Календар",
 	"Call": "Обаждане",
 	"Call feature is not supported when using Web STT engine": "Функцията за обаждане не се поддържа при използване на Web STT двигател",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "Копирана е връзката за споделен чат в клипборда!",
 	"Copied to clipboard": "Копирано в клипборда",
 	"Copy": "Копирай",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Копиране на последен код блок",
 	"Copy last response": "Копиране на последен отговор",
 	"Copy Link": "Копиране на връзка",
@@ -303,6 +308,7 @@
 	"Deleted User": "Изтрит потребител",
 	"Describe your knowledge base and objectives": "Опишете вашата база от знания и цели",
 	"Description": "Описание",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "Не следва напълно инструкциите",
 	"Direct": "",
 	"Direct Connections": "Директни връзки",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "напр. моят_филтър",
 	"e.g. my_tools": "напр. моите_инструменти",
 	"e.g. Tools for performing various operations": "напр. Инструменти за извършване на различни операции",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Редактиране",
 	"Edit Arena Model": "Редактиране на Arena модел",
 	"Edit Channel": "Редактиране на канал",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "Въведете домейни, разделени със запетаи (напр. example.com,site.org)",
 	"Enter Exa API Key": "Въведете API ключ за Exa",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Въведете URL адрес на Github Raw",
 	"Enter Google PSE API Key": "Въведете API ключ за Google PSE",
 	"Enter Google PSE Engine Id": "Въведете идентификатор на двигателя на Google PSE",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "Въведете API ключ за Mojeek Search",
 	"Enter Number of Steps (e.g. 50)": "Въведете брой стъпки (напр. 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "Въведете URL адрес на прокси (напр. https://потребител:парола@хост:порт)",
 	"Enter reasoning effort": "Въведете усилие за разсъждение",
 	"Enter Sampler (e.g. Euler a)": "Въведете семплер (напр. Euler a)",
@@ -441,10 +452,13 @@
 	"Enter server host": "Въведете хост на сървъра",
 	"Enter server label": "Въведете етикет на сървъра",
 	"Enter server port": "Въведете порт на сървъра",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Въведете стоп последователност",
 	"Enter system prompt": "Въведете системен промпт",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Въведете API ключ за Tavily",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "Филтърът вече е глобално активиран",
 	"Filters": "Филтри",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Потвърждаване на отпечатък: Не може да се използва инициализационна буква като аватар. Потребителят се връща към стандартна аватарка.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Плавно предаване на големи части от външен отговор",
 	"Focus chat input": "Фокусиране на чат вход",
 	"Folder deleted successfully": "Папката е изтрита успешно",
@@ -589,6 +605,8 @@
 	"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",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "Запалете любопитството",
 	"Image": "Изображение",
 	"Image Compression": "Компресия на изображения",
@@ -649,6 +667,7 @@
 	"Label": "Етикет",
 	"Landing Page Mode": "Режим на начална страница",
 	"Language": "Език",
+	"Language Locales": "",
 	"Last Active": "Последни активни",
 	"Last Modified": "Последно модифицирано",
 	"Last reply": "Последен отговор",
@@ -702,7 +721,6 @@
 	"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": "Мин P",
-	"Minimum Score": "Минимална оценка",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Клапани на пайплайни",
 	"Plain text (.txt)": "Обикновен текст (.txt)",
 	"Playground": "Плейграунд",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "Моля, внимателно прегледайте следните предупреждения:",
 	"Please do not close the settings page while loading the model.": "Моля, не затваряйте страницата с настройки, докато моделът се зарежда.",
 	"Please enter a prompt": "Моля, въведете промпт",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Бележки по изданието",
 	"Relevance": "Релевантност",
+	"Relevance Threshold": "",
 	"Remove": "Изтриване",
 	"Remove Model": "Изтриване на модела",
 	"Rename": "Преименуване",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "Регистрирайте се в {{WEBUI_NAME}}",
 	"Signing in to {{WEBUI_NAME}}": "Вписване в {{WEBUI_NAME}}",
 	"sk-1234": "sk-1234",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Източник",
 	"Speech Playback Speed": "Скорост на възпроизвеждане на речта",
 	"Speech recognition error: {{error}}": "Грешка при разпознаване на реч: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Докоснете за прекъсване",
 	"Tasks": "Задачи",
 	"Tavily API Key": "Tavily API Ключ",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Повече информация:",
 	"Temperature": "Температура",
 	"Template": "Шаблон",
@@ -1179,6 +1203,7 @@
 	"variable": "променлива",
 	"variable to have them replaced with clipboard content.": "променлива, за да бъдат заменени със съдържанието от клипборда.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "Версия",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Версия {{selectedVersion}} от {{totalVersions}}",
 	"View Replies": "Преглед на отговорите",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Предупреждение: Изпълнението на Jupyter позволява произволно изпълнение на код, което представлява сериозни рискове за сигурността—продължете с изключително внимание.",
 	"Web": "Уеб",
 	"Web API": "Уеб API",
+	"Web Loader Engine": "",
 	"Web Search": "Търсене в уеб",
 	"Web Search Engine": "Уеб търсачка",
 	"Web Search in Chat": "Уеб търсене в чата",

+ 28 - 2
src/lib/i18n/locales/bn-BD/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "সব ডকুমেন্ট",
 	"All models deleted successfully": "",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "",
 	"Allow Chat Deletion": "চ্যাট ডিলিট করতে দিন",
 	"Allow Chat Edit": "",
 	"Allow File Upload": "",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "",
+	"Allow Text to Speech": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "এবং",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "এবং একটি নতুন শেয়ারে লিংক তৈরি করুন.",
+	"Android": "",
 	"API Base URL": "এপিআই বেজ ইউআরএল",
 	"API Key": "এপিআই কোড",
 	"API Key created.": "একটি এপিআই কোড তৈরি করা হয়েছে.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "সাহসী অনুসন্ধান API কী",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "ওয়েবসাইটের জন্য SSL যাচাই বাতিল করুন",
 	"Calendar": "",
 	"Call": "",
 	"Call feature is not supported when using Web STT engine": "",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "শেয়ারকৃত কথা-ব্যবহারের URL ক্লিপবোর্ডে কপি করা হয়েছে!",
 	"Copied to clipboard": "",
 	"Copy": "অনুলিপি",
+	"Copy Formatted Text": "",
 	"Copy last code block": "সর্বশেষ কোড ব্লক কপি করুন",
 	"Copy last response": "সর্বশেষ রেসপন্স কপি করুন",
 	"Copy Link": "লিংক কপি করুন",
@@ -303,6 +308,7 @@
 	"Deleted User": "",
 	"Describe your knowledge base and objectives": "",
 	"Description": "বিবরণ",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "ইনস্ট্রাকশন সম্পূর্ণ অনুসরণ করা হয়নি",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "এডিট করুন",
 	"Edit Arena Model": "",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "গিটহাব কাঁচা URL লিখুন",
 	"Enter Google PSE API Key": "গুগল পিএসই এপিআই কী লিখুন",
 	"Enter Google PSE Engine Id": "গুগল পিএসই ইঞ্জিন আইডি লিখুন",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "ধাপের সংখ্যা দিন (যেমন: 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "স্টপ সিকোয়েন্স লিখুন",
 	"Enter system prompt": "",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "",
 	"Filters": "",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "ফিঙ্গারপ্রিন্ট স্পুফিং ধরা পড়েছে: অ্যাভাটার হিসেবে নামের আদ্যক্ষর ব্যবহার করা যাচ্ছে না। ডিফল্ট প্রোফাইল পিকচারে ফিরিয়ে নেয়া হচ্ছে।",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "বড় এক্সটার্নাল রেসপন্স চাঙ্কগুলো মসৃণভাবে প্রবাহিত করুন",
 	"Focus chat input": "চ্যাট ইনপুট ফোকাস করুন",
 	"Folder deleted successfully": "",
@@ -589,6 +605,8 @@
 	"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": "",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "",
 	"Language": "ভাষা",
+	"Language Locales": "",
 	"Last Active": "সর্বশেষ সক্রিয়",
 	"Last Modified": "",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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.": "আপনার লিঙ্ক তৈরি করার পরে আপনার পাঠানো বার্তাগুলি শেয়ার করা হবে না। ইউআরএল ব্যবহারকারীরা শেয়ার করা চ্যাট দেখতে পারবেন।",
 	"Min P": "",
-	"Minimum Score": "Minimum Score",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "পাইপলাইন ভালভ",
 	"Plain text (.txt)": "প্লায়েন টেক্সট (.txt)",
 	"Playground": "খেলাঘর",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "রিলিজ নোটসমূহ",
 	"Relevance": "",
+	"Relevance Threshold": "",
 	"Remove": "রিমুভ করুন",
 	"Remove Model": "মডেল রিমুভ করুন",
 	"Rename": "রেনেম",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "",
 	"Signing in to {{WEBUI_NAME}}": "",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "উৎস",
 	"Speech Playback Speed": "",
 	"Speech recognition error: {{error}}": "স্পিচ রিকগনিশনে সমস্যা: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "",
 	"Tasks": "",
 	"Tavily API Key": "",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "আরও বলুন:",
 	"Temperature": "তাপমাত্রা",
 	"Template": "টেম্পলেট",
@@ -1179,6 +1203,7 @@
 	"variable": "ভেরিয়েবল",
 	"variable to have them replaced with clipboard content.": "ক্লিপবোর্ডের কন্টেন্ট দিয়ে যেই ভেরিয়েবল রিপ্লেস করা যাবে।",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "ভার্সন",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "ওয়েব",
 	"Web API": "",
+	"Web Loader Engine": "",
 	"Web Search": "ওয়েব অনুসন্ধান",
 	"Web Search Engine": "ওয়েব সার্চ ইঞ্জিন",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/bo-TB/translation.json

@@ -57,13 +57,17 @@
 	"All": "ཡོངས།",
 	"All Documents": "ཡིག་ཆ་ཡོངས།",
 	"All models deleted successfully": "དཔེ་དབྱིབས་ཡོངས་རྫོགས་ལེགས་པར་བསུབས་ཟིན།",
+	"Allow Call": "",
 	"Allow Chat Controls": "ཁ་བརྡའི་ཚོད་འཛིན་ལ་གནང་བ་སྤྲོད་པ།",
 	"Allow Chat Delete": "ཁ་བརྡ་བསུབ་པར་གནང་བ་སྤྲོད་པ།",
 	"Allow Chat Deletion": "ཁ་བརྡ་བསུབ་པར་གནང་བ་སྤྲོད་པ།",
 	"Allow Chat Edit": "ཁ་བརྡ་ཞུ་དག་ལ་གནང་བ་སྤྲོད་པ།",
 	"Allow File Upload": "ཡིག་ཆ་སྤར་བར་གནང་བ་སྤྲོད་པ།",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "ས་གནས་མིན་པའི་སྐད་གདངས་ལ་གནང་བ་སྤྲོད་པ།",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "གནས་སྐབས་ཁ་བརྡར་གནང་བ་སྤྲོད་པ།",
+	"Allow Text to Speech": "",
 	"Allow User Location": "བེད་སྤྱོད་མཁན་གནས་ཡུལ་ལ་གནང་བ་སྤྲོད་པ།",
 	"Allow Voice Interruption in Call": "སྐད་འབོད་ནང་གི་སྐད་ཆའི་བར་ཆད་ལ་གནང་བ་སྤྲོད་པ།",
 	"Allowed Endpoints": "གནང་བ་ཐོབ་པའི་མཇུག་མཐུད།",
@@ -79,6 +83,7 @@
 	"and": "དང་།",
 	"and {{COUNT}} more": "ད་དུང་ {{COUNT}}",
 	"and create a new shared link.": "དང་མཉམ་སྤྱོད་སྦྲེལ་ཐག་གསར་པ་ཞིག་བཟོ་བ།",
+	"Android": "",
 	"API Base URL": "API གཞི་རྩའི་ URL",
 	"API Key": "API ལྡེ་མིག",
 	"API Key created.": "API ལྡེ་མིག་བཟོས་ཟིན།",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Brave Search API ལྡེ་མིག",
 	"By {{name}}": "{{name}} ཡིས།",
 	"Bypass Embedding and Retrieval": "ཚུད་འཇུག་དང་ལེན་ཚུར་སྒྲུབ་ལས་བརྒལ་བ།",
-	"Bypass SSL verification for Websites": "དྲ་ཚིགས་ཀྱི་ SSL ར་སྤྲོད་བརྒལ་བ།",
 	"Calendar": "ལོ་ཐོ།",
 	"Call": "སྐད་འབོད།",
 	"Call feature is not supported when using Web STT engine": "Web STT མ་ལག་སྤྱོད་སྐབས་སྐད་འབོད་ཀྱི་ཁྱད་ཆོས་ལ་རྒྱབ་སྐྱོར་མེད།",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "མཉམ་སྤྱོད་ཁ་བརྡའི་ URL སྦྱར་སྡེར་དུ་འདྲ་བཤུས་བྱས་ཟིན།",
 	"Copied to clipboard": "སྦྱར་སྡེར་དུ་འདྲ་བཤུས་བྱས་པ།",
 	"Copy": "འདྲ་བཤུས།",
+	"Copy Formatted Text": "",
 	"Copy last code block": "ཀོཌ་གཏོགས་ཁོངས་མཐའ་མ་འདྲ་བཤུས།",
 	"Copy last response": "ལན་མཐའ་མ་འདྲ་བཤུས།",
 	"Copy Link": "སྦྲེལ་ཐག་འདྲ་བཤུས།",
@@ -303,6 +308,7 @@
 	"Deleted User": "བེད་སྤྱོད་མཁན་བསུབས་ཟིན།",
 	"Describe your knowledge base and objectives": "ཁྱེད་ཀྱི་ཤེས་བྱའི་རྟེན་གཞི་དང་དམིགས་ཡུལ་འགྲེལ་བཤད་བྱེད་པ།",
 	"Description": "འགྲེལ་བཤད།",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "ལམ་སྟོན་ཡོངས་སུ་མ་བསྒྲུབས།",
 	"Direct": "ཐད་ཀར།",
 	"Direct Connections": "ཐད་ཀར་སྦྲེལ་མཐུད།",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "དཔེར་ན། my_filter",
 	"e.g. my_tools": "དཔེར་ན། my_tools",
 	"e.g. Tools for performing various operations": "དཔེར་ན། ལས་ཀ་སྣ་ཚོགས་སྒྲུབ་བྱེད་ཀྱི་ལག་ཆ།",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "ཞུ་དག",
 	"Edit Arena Model": "Arena དཔེ་དབྱིབས་ཞུ་དག",
 	"Edit Channel": "བགྲོ་གླེང་ཞུ་དག",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "ཡིག་ཆའི་རིག་ནུས་ལྡེ་མིག་འཇུག་པ།",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "ཚེག་བསྐུངས་ཀྱིས་ལོགས་སུ་བཀར་བའི་ཁྱབ་ཁོངས་འཇུག་པ། (དཔེར་ན། example.com,site.org)",
 	"Enter Exa API Key": "Exa API ལྡེ་མིག་འཇུག་པ།",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Github Raw URL འཇུག་པ།",
 	"Enter Google PSE API Key": "Google PSE API ལྡེ་མིག་འཇུག་པ།",
 	"Enter Google PSE Engine Id": "Google PSE Engine Id འཇུག་པ།",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "Mojeek Search API ལྡེ་མིག་འཇུག་པ།",
 	"Enter Number of Steps (e.g. 50)": "གོམ་གྲངས་འཇུག་པ། (དཔེར་ན། ༥༠)",
 	"Enter Perplexity API Key": "Perplexity API ལྡེ་མིག་འཇུག་པ།",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "Proxy URL འཇུག་པ། (དཔེར་ན། https://user:password@host:port)",
 	"Enter reasoning effort": "རྒྱུ་མཚན་འདྲེན་པའི་འབད་བརྩོན་འཇུག་པ།",
 	"Enter Sampler (e.g. Euler a)": "Sampler འཇུག་པ། (དཔེར་ན། Euler a)",
@@ -441,10 +452,13 @@
 	"Enter server host": "སར་བར་གྱི་ Host འཇུག་པ།",
 	"Enter server label": "སར་བར་གྱི་བྱང་རྟགས་འཇུག་པ།",
 	"Enter server port": "སར་བར་གྱི་ Port འཇུག་པ།",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "མཚམས་འཇོག་རིམ་པ་འཇུག་པ།",
 	"Enter system prompt": "མ་ལག་གི་འགུལ་སློང་འཇུག་པ།",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Tavily API ལྡེ་མིག་འཇུག་པ།",
+	"Enter Tavily Extract Depth": "",
 	"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 Server URL འཇུག་པ།",
 	"Enter timeout in seconds": "སྐར་ཆའི་ནང་དུས་ཚོད་བཀག་པ་འཇུག་པ།",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "འཚག་མ་དེ་ད་ལྟ་འཛམ་གླིང་ཡོངས་ནས་སྒུལ་བསྐྱོད་བྱས་ཡོད།",
 	"Filters": "འཚག་མ།",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "མཛུབ་ཐེལ་རྫུན་བཟོ་རྙེད་སོང་།: མིང་གི་ཡིག་འབྲུ་མགོ་མ་སྐུ་ཚབ་ཏུ་བེད་སྤྱོད་གཏོང་མི་ཐུབ། སྔོན་སྒྲིག་ཕྱི་ཐག་པར་རིས་ལ་སྔོན་སྒྲིག་བྱེད་བཞིན་པ།",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "ཕྱི་རོལ་གྱི་ལན་གྱི་དུམ་བུ་ཆེན་པོ་རྒྱུན་བཞིན་རྒྱུག་པ།",
 	"Focus chat input": "ཁ་བརྡའི་ནང་འཇུག་ལ་དམིགས་པ།",
 	"Folder deleted successfully": "ཡིག་སྣོད་ལེགས་པར་བསུབས་ཟིན།",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Hybrid འཚོལ་བཤེར།",
 	"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",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "ཤེས་འདོད་སློང་བ།",
 	"Image": "པར།",
 	"Image Compression": "པར་བསྡུ་སྐུམ།",
@@ -649,6 +667,7 @@
 	"Label": "བྱང་རྟགས།",
 	"Landing Page Mode": "འབབ་ཤོག་མ་དཔེ།",
 	"Language": "སྐད་ཡིག",
+	"Language Locales": "",
 	"Last Active": "མཐའ་མའི་ལས་བྱེད།",
 	"Last Modified": "མཐའ་མའི་བཟོ་བཅོས།",
 	"Last reply": "ལན་མཐའ་མ།",
@@ -702,7 +721,6 @@
 	"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": "P ཉུང་ཤོས།",
-	"Minimum Score": "སྐར་མ་ཉུང་ཤོས།",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "རྒྱུ་ལམ་གྱི་ Valve",
 	"Plain text (.txt)": "ཡིག་རྐྱང་རྐྱང་པ། (.txt)",
 	"Playground": "རྩེད་ཐང་།",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "གཤམ་གསལ་ཉེན་བརྡ་དག་ལ་ཞིབ་ཚགས་ངང་བལྟ་ཞིབ་བྱེད་རོགས།:",
 	"Please do not close the settings page while loading the model.": "དཔེ་དབྱིབས་ནང་འཇུག་བྱེད་སྐབས་སྒྲིག་འགོད་ཤོག་ངོས་ཁ་མ་རྒྱག་རོགས།",
 	"Please enter a prompt": "འགུལ་སློང་ཞིག་འཇུག་རོགས།",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "འགྲེམས་སྤེལ་མཆན་བུ།",
 	"Relevance": "འབྲེལ་ཡོད་རང་བཞིན།",
+	"Relevance Threshold": "",
 	"Remove": "འདོར་བ།",
 	"Remove Model": "དཔེ་དབྱིབས་འདོར་བ།",
 	"Rename": "མིང་བསྐྱར་འདོགས།",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "{{WEBUI_NAME}} ལ་ཐོ་འགོད།",
 	"Signing in to {{WEBUI_NAME}}": "{{WEBUI_NAME}} ལ་ནང་འཛུལ་བྱེད་བཞིན་པ།",
 	"sk-1234": "sk-༡༢༣༤",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "འབྱུང་ཁུངས།",
 	"Speech Playback Speed": "གཏམ་བཤད་ཕྱིར་གཏོང་གི་མྱུར་ཚད།",
 	"Speech recognition error: {{error}}": "གཏམ་བཤད་ངོས་འཛིན་ནོར་འཁྲུལ།: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "བར་ཆད་བྱེད་པར་མནན་པ།",
 	"Tasks": "ལས་འགན།",
 	"Tavily API Key": "Tavily API ལྡེ་མིག",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "ང་ཚོ་ལ་མང་ཙམ་ཤོད།:",
 	"Temperature": "དྲོད་ཚད།",
 	"Template": "མ་དཔེ།",
@@ -1179,6 +1203,7 @@
 	"variable": "འགྱུར་ཚད།",
 	"variable to have them replaced with clipboard content.": "འགྱུར་ཚད་དེ་དག་སྦྱར་སྡེར་གྱི་ནང་དོན་གྱིས་ཚབ་བྱེད་པར་ཡོད་པ།",
 	"Verify Connection": "སྦྲེལ་མཐུད་ར་སྤྲོད།",
+	"Verify SSL Certificate": "",
 	"Version": "པར་གཞི།",
 	"Version {{selectedVersion}} of {{totalVersions}}": "པར་གཞི་ {{selectedVersion}} ། {{totalVersions}} ནས།",
 	"View Replies": "ལན་ལྟ་བ།",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "ཉེན་བརྡ།: Jupyter ལག་བསྟར་གྱིས་གང་འདོད་ཀྱི་ཀོཌ་ལག་བསྟར་སྒུལ་བསྐྱོད་བྱས་ནས། བདེ་འཇགས་ཀྱི་ཉེན་ཁ་ཚབས་ཆེན་བཟོ་གི་ཡོད།—ཧ་ཅང་གཟབ་ནན་གྱིས་སྔོན་སྐྱོད་བྱེད་རོགས།",
 	"Web": "དྲ་བ།",
 	"Web API": "Web API",
+	"Web Loader Engine": "",
 	"Web Search": "དྲ་བའི་འཚོལ་བཤེར།",
 	"Web Search Engine": "དྲ་བའི་འཚོལ་བཤེར་འཕྲུལ་འཁོར།",
 	"Web Search in Chat": "ཁ་བརྡའི་ནང་དྲ་བའི་འཚོལ་བཤེར།",

+ 28 - 2
src/lib/i18n/locales/ca-ES/translation.json

@@ -57,13 +57,17 @@
 	"All": "Tots",
 	"All Documents": "Tots els documents",
 	"All models deleted successfully": "Tots els models s'han eliminat correctament",
+	"Allow Call": "",
 	"Allow Chat Controls": "Permetre els controls de xat",
 	"Allow Chat Delete": "Permetre eliminar el xat",
 	"Allow Chat Deletion": "Permetre la supressió del xat",
 	"Allow Chat Edit": "Permetre editar el xat",
 	"Allow File Upload": "Permetre la pujada d'arxius",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Permetre veus no locals",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "Permetre el xat temporal",
+	"Allow Text to Speech": "",
 	"Allow User Location": "Permetre la ubicació de l'usuari",
 	"Allow Voice Interruption in Call": "Permetre la interrupció de la veu en una trucada",
 	"Allowed Endpoints": "Punts d'accés permesos",
@@ -79,6 +83,7 @@
 	"and": "i",
 	"and {{COUNT}} more": "i {{COUNT}} més",
 	"and create a new shared link.": "i crear un nou enllaç compartit.",
+	"Android": "",
 	"API Base URL": "URL Base de l'API",
 	"API Key": "clau API",
 	"API Key created.": "clau API creada.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Clau API de Brave Search",
 	"By {{name}}": "Per {{name}}",
 	"Bypass Embedding and Retrieval": "Desactivar l'Embedding i el Retrieval",
-	"Bypass SSL verification for Websites": "Desactivar la verificació SSL per a l'accés a Internet",
 	"Calendar": "Calendari",
 	"Call": "Trucada",
 	"Call feature is not supported when using Web STT engine": "La funció de trucada no s'admet quan s'utilitza el motor Web STT",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "S'ha copiat l'URL compartida al porta-retalls!",
 	"Copied to clipboard": "Copiat al porta-retalls",
 	"Copy": "Copiar",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Copiar l'últim bloc de codi",
 	"Copy last response": "Copiar l'última resposta",
 	"Copy Link": "Copiar l'enllaç",
@@ -303,6 +308,7 @@
 	"Deleted User": "Usuari eliminat",
 	"Describe your knowledge base and objectives": "Descriu la teva base de coneixement i objectius",
 	"Description": "Descripció",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "No s'han seguit les instruccions completament",
 	"Direct": "Directe",
 	"Direct Connections": "Connexions directes",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "p. ex. els_meus_filtres",
 	"e.g. my_tools": "p. ex. les_meves_eines",
 	"e.g. Tools for performing various operations": "p. ex. Eines per dur a terme operacions",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Editar",
 	"Edit Arena Model": "Editar model de l'Arena",
 	"Edit Channel": "Editar el canal",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "Introdueix la clau de Document Intelligence",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "Introdueix els dominis separats per comes (p. ex. example.com,site.org)",
 	"Enter Exa API Key": "Introdueix la clau API de d'EXA",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Introdueix l'URL en brut de Github",
 	"Enter Google PSE API Key": "Introdueix la clau API de Google PSE",
 	"Enter Google PSE Engine Id": "Introdueix l'identificador del motor PSE de Google",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "Introdueix la clau API de Mojeek Search",
 	"Enter Number of Steps (e.g. 50)": "Introdueix el nombre de passos (p. ex. 50)",
 	"Enter Perplexity API Key": "Introdueix la clau API de Perplexity",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "Entra l'URL (p. ex. https://user:password@host:port)",
 	"Enter reasoning effort": "Introdueix l'esforç de raonament",
 	"Enter Sampler (e.g. Euler a)": "Introdueix el mostrejador (p.ex. Euler a)",
@@ -441,10 +452,13 @@
 	"Enter server host": "Introdueix el servidor",
 	"Enter server label": "Introdueix l'etiqueta del servidor",
 	"Enter server port": "Introdueix el port del servidor",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Introdueix la seqüència de parada",
 	"Enter system prompt": "Introdueix la indicació de sistema",
 	"Enter system prompt here": "Entra la indicació de sistema aquí",
 	"Enter Tavily API Key": "Introdueix la clau API de Tavily",
+	"Enter Tavily Extract Depth": "",
 	"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": "Entra el temps màxim en segons",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "El filtre ha estat activat globalment",
 	"Filters": "Filtres",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "S'ha detectat la suplantació d'identitat de l'empremta digital: no es poden utilitzar les inicials com a avatar. S'estableix la imatge de perfil predeterminada.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Transmetre amb fluïdesa grans trossos de resposta externa",
 	"Focus chat input": "Estableix el focus a l'entrada del xat",
 	"Folder deleted successfully": "Carpeta eliminada correctament",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Cerca híbrida",
 	"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Afirmo que he llegit i entenc les implicacions de la meva acció. Soc conscient dels riscos associats a l'execució de codi arbitrari i he verificat la fiabilitat de la font.",
 	"ID": "ID",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "Despertar la curiositat",
 	"Image": "Imatge",
 	"Image Compression": "Compressió d'imatges",
@@ -649,6 +667,7 @@
 	"Label": "Etiqueta",
 	"Landing Page Mode": "Mode de la pàgina d'entrada",
 	"Language": "Idioma",
+	"Language Locales": "",
 	"Last Active": "Activitat recent",
 	"Last Modified": "Modificació",
 	"Last reply": "Darrera resposta",
@@ -702,7 +721,6 @@
 	"Message rating should be enabled to use this feature": "La classificació dels missatges s'hauria d'activar per utilitzar aquesta funció",
 	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Els missatges enviats després de crear el teu enllaç no es compartiran. Els usuaris amb l'URL podran veure el xat compartit.",
 	"Min P": "Min P",
-	"Minimum Score": "Puntuació mínima",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Eta de Mirostat",
 	"Mirostat Tau": "Tau de Mirostat",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Vàlvules de les Pipelines",
 	"Plain text (.txt)": "Text pla (.txt)",
 	"Playground": "Zona de jocs",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "Si us plau, revisa els següents avisos amb cura:",
 	"Please do not close the settings page while loading the model.": "No tanquis la pàgina de configuració mentre carregues el model.",
 	"Please enter a prompt": "Si us plau, entra una indicació",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Notes de la versió",
 	"Relevance": "Rellevància",
+	"Relevance Threshold": "",
 	"Remove": "Eliminar",
 	"Remove Model": "Eliminar el model",
 	"Rename": "Canviar el nom",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "Registrar-se a {{WEBUI_NAME}}",
 	"Signing in to {{WEBUI_NAME}}": "Iniciant sessió a {{WEBUI_NAME}}",
 	"sk-1234": "sk-1234",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Font",
 	"Speech Playback Speed": "Velocitat de la parla",
 	"Speech recognition error: {{error}}": "Error de reconeixement de veu: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Prem per interrompre",
 	"Tasks": "Tasques",
 	"Tavily API Key": "Clau API de Tavily",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Dona'ns més informació:",
 	"Temperature": "Temperatura",
 	"Template": "Plantilla",
@@ -1179,6 +1203,7 @@
 	"variable": "variable",
 	"variable to have them replaced with clipboard content.": "variable per tenir-les reemplaçades amb el contingut del porta-retalls.",
 	"Verify Connection": "Verificar la connexió",
+	"Verify SSL Certificate": "",
 	"Version": "Versió",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Versió {{selectedVersion}} de {{totalVersions}}",
 	"View Replies": "Veure les respostes",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Avís: l'execució de Jupyter permet l'execució de codi arbitrari, la qual cosa comporta greus riscos de seguretat; procediu amb extrema precaució.",
 	"Web": "Web",
 	"Web API": "Web API",
+	"Web Loader Engine": "",
 	"Web Search": "Cerca la web",
 	"Web Search Engine": "Motor de cerca de la web",
 	"Web Search in Chat": "Cerca a internet al xat",

+ 28 - 2
src/lib/i18n/locales/ceb-PH/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "",
 	"All models deleted successfully": "",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "",
 	"Allow Chat Deletion": "Tugoti nga mapapas ang mga chat",
 	"Allow Chat Edit": "",
 	"Allow File Upload": "",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "",
+	"Allow Text to Speech": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "Ug",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "",
+	"Android": "",
 	"API Base URL": "API Base URL",
 	"API Key": "yawe sa API",
 	"API Key created.": "",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "",
 	"Calendar": "",
 	"Call": "",
 	"Call feature is not supported when using Web STT engine": "",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "",
 	"Copied to clipboard": "",
 	"Copy": "",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Kopyaha ang katapusang bloke sa code",
 	"Copy last response": "Kopyaha ang kataposang tubag",
 	"Copy Link": "",
@@ -303,6 +308,7 @@
 	"Deleted User": "",
 	"Describe your knowledge base and objectives": "",
 	"Description": "Deskripsyon",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "",
 	"Edit Arena Model": "",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "",
 	"Enter Google PSE API Key": "",
 	"Enter Google PSE Engine Id": "",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Pagsulod sa gidaghanon sa mga lakang (e.g. 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Pagsulod sa katapusan nga han-ay",
 	"Enter system prompt": "",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "",
 	"Filters": "",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Hapsay nga paghatud sa daghang mga tipik sa eksternal nga mga tubag",
 	"Focus chat input": "Pag-focus sa entry sa diskusyon",
 	"Folder deleted successfully": "",
@@ -589,6 +605,8 @@
 	"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": "",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "",
 	"Language": "Pinulongan",
+	"Language Locales": "",
 	"Last Active": "",
 	"Last Modified": "",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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.": "",
 	"Min P": "",
-	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "",
 	"Plain text (.txt)": "",
 	"Playground": "Dulaanan",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Release Notes",
 	"Relevance": "",
+	"Relevance Threshold": "",
 	"Remove": "",
 	"Remove Model": "",
 	"Rename": "",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "",
 	"Signing in to {{WEBUI_NAME}}": "",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Tinubdan",
 	"Speech Playback Speed": "",
 	"Speech recognition error: {{error}}": "Sayop sa pag-ila sa tingog: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "",
 	"Tasks": "",
 	"Tavily API Key": "",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "",
 	"Temperature": "Temperatura",
 	"Template": "Modelo",
@@ -1179,6 +1203,7 @@
 	"variable": "variable",
 	"variable to have them replaced with clipboard content.": "variable aron pulihan kini sa mga sulud sa clipboard.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "Bersyon",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "Web",
 	"Web API": "",
+	"Web Loader Engine": "",
 	"Web Search": "",
 	"Web Search Engine": "",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/cs-CZ/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "Všechny dokumenty",
 	"All models deleted successfully": "Všechny modely úspěšně odstráněny",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "Povolit odstranění chatu",
 	"Allow Chat Deletion": "Povolit odstranění chatu",
 	"Allow Chat Edit": "Povolit úpravu chatu",
 	"Allow File Upload": "Povolit nahrávat soubory",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Povolit ne-místní hlasy",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "Povolit dočasný chat",
+	"Allow Text to Speech": "",
 	"Allow User Location": "Povolit uživatelskou polohu",
 	"Allow Voice Interruption in Call": "Povolit přerušení hlasu při hovoru",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "a",
 	"and {{COUNT}} more": "a {{COUNT}} další/ch",
 	"and create a new shared link.": "a vytvořit nový sdílený odkaz.",
+	"Android": "",
 	"API Base URL": "Základní URL adresa API",
 	"API Key": "Klíč API",
 	"API Key created.": "API klíč byl vytvořen.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Klíč API pro Brave Search",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "Obcházení ověření SSL pro webové stránky",
 	"Calendar": "",
 	"Call": "Volání",
 	"Call feature is not supported when using Web STT engine": "Funkce pro volání není podporována při použití Web STT engine.",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "URL sdíleného chatu zkopírován do schránky!",
 	"Copied to clipboard": "Zkopírováno do schránky",
 	"Copy": "Kopírovat",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Zkopírujte poslední blok kódu",
 	"Copy last response": "Zkopírujte poslední odpověď",
 	"Copy Link": "Kopírovat odkaz",
@@ -303,6 +308,7 @@
 	"Deleted User": "",
 	"Describe your knowledge base and objectives": "",
 	"Description": "Popis",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "Nenásledovali jste přesně všechny instrukce.",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Upravit",
 	"Edit Arena Model": "Upravit Arena Model",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Zadejte URL adresu Github Raw",
 	"Enter Google PSE API Key": "Zadejte klíč rozhraní API Google PSE",
 	"Enter Google PSE Engine Id": "Zadejte ID vyhledávacího mechanismu Google PSE",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Zadejte počet kroků (např. 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "Zadejte vzorkovač (např. Euler a)",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Zadejte ukončovací sekvenci",
 	"Enter system prompt": "Vložte systémový prompt",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Zadejte API klíč Tavily",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "Filtr je nyní globálně povolen.",
 	"Filters": "Filtry",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Detekováno padělání otisku prstu: Není možné použít iniciály jako avatar. Používá se výchozí profilový obrázek.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Plynule streamujte velké externí části odpovědí",
 	"Focus chat input": "Zaměřte se na vstup chatu",
 	"Folder deleted successfully": "Složka byla úspěšně smazána",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Hybridní vyhledávání",
 	"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.": "Beru na vědomí, že jsem si přečetl a chápu důsledky svých činů. Jsem si vědom rizik spojených s vykonáváním libovolného kódu a ověřil jsem důvěryhodnost zdroje.",
 	"ID": "ID",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "Režim vstupní stránky",
 	"Language": "Jazyk",
+	"Language Locales": "",
 	"Last Active": "Naposledy aktivní",
 	"Last Modified": "Poslední změna",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"Message rating should be enabled to use this feature": "Hodnocení zpráv musí být povoleno, aby bylo možné tuto funkci používat.",
 	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Zprávy, které odešlete po vytvoření odkazu, nebudou sdíleny. Uživatelé s URL budou moci zobrazit sdílený chat.",
 	"Min P": "Min P",
-	"Minimum Score": "Minimální skóre",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "",
 	"Plain text (.txt)": "Čistý text (.txt)",
 	"Playground": "",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "Prosím, pečlivě si přečtěte následující upozornění:",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "Prosím, zadejte zadání.",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Záznamy o vydání",
 	"Relevance": "Relevance",
+	"Relevance Threshold": "",
 	"Remove": "Odebrat",
 	"Remove Model": "Odebrat model",
 	"Rename": "Přejmenovat",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "Zaregistrujte se na {{WEBUI_NAME}}",
 	"Signing in to {{WEBUI_NAME}}": "Přihlašování do {{WEBUI_NAME}}",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Zdroj",
 	"Speech Playback Speed": "Rychlost přehrávání řeči",
 	"Speech recognition error: {{error}}": "Chyba rozpoznávání řeči: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Klepněte pro přerušení",
 	"Tasks": "",
 	"Tavily API Key": "Klíč API pro Tavily",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Řekněte nám více.",
 	"Temperature": "",
 	"Template": "Šablona",
@@ -1179,6 +1203,7 @@
 	"variable": "proměnná",
 	"variable to have them replaced with clipboard content.": "proměnnou, aby byl jejich obsah nahrazen obsahem schránky.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "Verze",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Verze {{selectedVersion}} z {{totalVersions}}",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "Web",
 	"Web API": "Webové API",
+	"Web Loader Engine": "",
 	"Web Search": "Vyhledávání na webu",
 	"Web Search Engine": "Webový vyhledávač",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/da-DK/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "Alle dokumenter",
 	"All models deleted successfully": "",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "",
 	"Allow Chat Deletion": "Tillad sletning af chats",
 	"Allow Chat Edit": "",
 	"Allow File Upload": "",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Tillad ikke-lokale stemmer",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "Tillad midlertidig chat",
+	"Allow Text to Speech": "",
 	"Allow User Location": "Tillad bruger-lokation",
 	"Allow Voice Interruption in Call": "Tillad afbrydelser i stemme i opkald",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "og",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "og lav et nyt link til deling",
+	"Android": "",
 	"API Base URL": "API Base URL",
 	"API Key": "API nøgle",
 	"API Key created.": "API nøgle lavet",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Brave Search API nøgle",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "Forbigå SSL verifikation på websider",
 	"Calendar": "",
 	"Call": "Opkald",
 	"Call feature is not supported when using Web STT engine": "Opkaldsfunktion er ikke understøttet for Web STT engine",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "Link til deling kopieret til udklipsholder",
 	"Copied to clipboard": "Kopieret til udklipsholder",
 	"Copy": "Kopier",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Kopier seneste kode",
 	"Copy last response": "Kopier senester svar",
 	"Copy Link": "Kopier link",
@@ -303,6 +308,7 @@
 	"Deleted User": "",
 	"Describe your knowledge base and objectives": "",
 	"Description": "Beskrivelse",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "Fulgte ikke instruktioner",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Rediger",
 	"Edit Arena Model": "",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Indtast Github Raw URL",
 	"Enter Google PSE API Key": "Indtast Google PSE API-nøgle",
 	"Enter Google PSE Engine Id": "Indtast Google PSE Engine ID",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Indtast antal trin (f.eks. 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "Indtast sampler (f.eks. Euler a)",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Indtast stopsekvens",
 	"Enter system prompt": "Indtast systemprompt",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Indtast Tavily API-nøgle",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "Filter er nu globalt aktiveret",
 	"Filters": "Filtre",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Fingeraftryksspoofing registreret: Kan ikke bruge initialer som avatar. Bruger standard profilbillede.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Stream store eksterne svar chunks flydende",
 	"Focus chat input": "Fokuser på chatinput",
 	"Folder deleted successfully": "",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Hybrid søgning",
 	"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.": "Jeg anerkender, at jeg har læst og forstået konsekvenserne af min handling. Jeg er opmærksom på de risici, der er forbundet med at udføre vilkårlig kode, og jeg har verificeret kildens troværdighed.",
 	"ID": "",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "Landing Page-tilstand",
 	"Language": "Sprog",
+	"Language Locales": "",
 	"Last Active": "Sidst aktiv",
 	"Last Modified": "Sidst ændret",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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.": "Beskeder, du sender efter at have oprettet dit link, deles ikke. Brugere med URL'en vil kunne se den delte chat.",
 	"Min P": "Min P",
-	"Minimum Score": "Minimumscore",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Pipelines-ventiler",
 	"Plain text (.txt)": "Almindelig tekst (.txt)",
 	"Playground": "Legeplads",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "Gennemgå omhyggeligt følgende advarsler:",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Udgivelsesnoter",
 	"Relevance": "",
+	"Relevance Threshold": "",
 	"Remove": "Fjern",
 	"Remove Model": "Fjern model",
 	"Rename": "Omdøb",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "Tilmeld dig {{WEBUI_NAME}}",
 	"Signing in to {{WEBUI_NAME}}": "Logger ind på {{WEBUI_NAME}}",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Kilde",
 	"Speech Playback Speed": "Talehastighed",
 	"Speech recognition error: {{error}}": "Talegenkendelsesfejl: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Tryk for at afbryde",
 	"Tasks": "",
 	"Tavily API Key": "Tavily API-nøgle",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Fortæl os mere:",
 	"Temperature": "Temperatur",
 	"Template": "Skabelon",
@@ -1179,6 +1203,7 @@
 	"variable": "variabel",
 	"variable to have them replaced with clipboard content.": "variabel for at få dem erstattet med indholdet af udklipsholderen.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "Version",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Version {{selectedVersion}} af {{totalVersions}}",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "Web",
 	"Web API": "Web API",
+	"Web Loader Engine": "",
 	"Web Search": "Websøgning",
 	"Web Search Engine": "Websøgemaskine",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/de-DE/translation.json

@@ -57,13 +57,17 @@
 	"All": "Alle",
 	"All Documents": "Alle Dokumente",
 	"All models deleted successfully": "Alle Modelle erfolgreich gelöscht",
+	"Allow Call": "",
 	"Allow Chat Controls": "Chat-Steuerung erlauben",
 	"Allow Chat Delete": "Löschen von Chats erlauben",
 	"Allow Chat Deletion": "Löschen von Chats erlauben",
 	"Allow Chat Edit": "Bearbeiten von Chats erlauben",
 	"Allow File Upload": "Hochladen von Dateien erlauben",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Nicht-lokale Stimmen erlauben",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "Temporäre Chats erlauben",
+	"Allow Text to Speech": "",
 	"Allow User Location": "Standort freigeben",
 	"Allow Voice Interruption in Call": "Unterbrechung durch Stimme im Anruf zulassen",
 	"Allowed Endpoints": "Erlaubte Endpunkte",
@@ -79,6 +83,7 @@
 	"and": "und",
 	"and {{COUNT}} more": "und {{COUNT}} mehr",
 	"and create a new shared link.": "und erstellen Sie einen neuen freigegebenen Link.",
+	"Android": "",
 	"API Base URL": "API-Basis-URL",
 	"API Key": "API-Schlüssel",
 	"API Key created.": "API-Schlüssel erstellt.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Brave Search API-Schlüssel",
 	"By {{name}}": "Von {{name}}",
 	"Bypass Embedding and Retrieval": "Embedding und Retrieval umgehen",
-	"Bypass SSL verification for Websites": "SSL-Überprüfung für Webseiten umgehen",
 	"Calendar": "Kalender",
 	"Call": "Anrufen",
 	"Call feature is not supported when using Web STT engine": "Die Anruffunktion wird nicht unterstützt, wenn die Web-STT-Engine verwendet wird.",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "Freigabelink in die Zwischenablage kopiert!",
 	"Copied to clipboard": "In die Zwischenablage kopiert",
 	"Copy": "Kopieren",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Letzten Codeblock kopieren",
 	"Copy last response": "Letzte Antwort kopieren",
 	"Copy Link": "Link kopieren",
@@ -303,6 +308,7 @@
 	"Deleted User": "Benutzer gelöscht",
 	"Describe your knowledge base and objectives": "Beschreibe deinen Wissensspeicher und deine Ziele",
 	"Description": "Beschreibung",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "Nicht genau den Answeisungen gefolgt",
 	"Direct": "Direkt",
 	"Direct Connections": "Direktverbindungen",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "z. B. mein_filter",
 	"e.g. my_tools": "z. B. meine_werkzeuge",
 	"e.g. Tools for performing various operations": "z. B. Werkzeuge für verschiedene Operationen",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Bearbeiten",
 	"Edit Arena Model": "Arena-Modell bearbeiten",
 	"Edit Channel": "Kanal bearbeiten",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "Geben Sie die Domains durch Kommas separiert ein (z.B. example.com,site.org)",
 	"Enter Exa API Key": "Geben Sie den Exa-API-Schlüssel ein",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Geben Sie die Github Raw-URL ein",
 	"Enter Google PSE API Key": "Geben Sie den Google PSE-API-Schlüssel ein",
 	"Enter Google PSE Engine Id": "Geben Sie die Google PSE-Engine-ID ein",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "Geben Sie den Mojeek Search API-Schlüssel ein",
 	"Enter Number of Steps (e.g. 50)": "Geben Sie die Anzahl an Schritten ein (z. B. 50)",
 	"Enter Perplexity API Key": "Geben Sie den Perplexity API-Key ein",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "Geben sie die Proxy-URL ein (z. B. https://user:password@host:port)",
 	"Enter reasoning effort": "Geben Sie den Schlussfolgerungsaufwand ein",
 	"Enter Sampler (e.g. Euler a)": "Geben Sie den Sampler ein (z. B. Euler a)",
@@ -441,10 +452,13 @@
 	"Enter server host": "Geben Sie den Server-Host ein",
 	"Enter server label": "Geben Sie das Server-Label ein",
 	"Enter server port": "Geben Sie den Server-Port ein",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Stop-Sequenz eingeben",
 	"Enter system prompt": "Systemprompt eingeben",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Geben Sie den Tavily-API-Schlüssel ein",
+	"Enter Tavily Extract Depth": "",
 	"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": "Geben Sie den Timeout in Sekunden ein",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "Filter ist jetzt global aktiviert",
 	"Filters": "Filter",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Fingerabdruck-Spoofing erkannt: Initialen können nicht als Avatar verwendet werden. Standard-Avatar wird verwendet.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Nahtlose Übertragung großer externer Antwortabschnitte",
 	"Focus chat input": "Chat-Eingabe fokussieren",
 	"Folder deleted successfully": "Ordner erfolgreich gelöscht",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Hybride Suche",
 	"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.": "Ich bestätige, dass ich gelesen habe und die Auswirkungen meiner Aktion verstehe. Mir sind die Risiken bewusst, die mit der Ausführung beliebigen Codes verbunden sind, und ich habe die Vertrauenswürdigkeit der Quelle überprüft.",
 	"ID": "ID",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "Neugier entfachen",
 	"Image": "Bild",
 	"Image Compression": "Bildkomprimierung",
@@ -649,6 +667,7 @@
 	"Label": "Label",
 	"Landing Page Mode": "Startseitenmodus",
 	"Language": "Sprache",
+	"Language Locales": "",
 	"Last Active": "Zuletzt aktiv",
 	"Last Modified": "Zuletzt bearbeitet",
 	"Last reply": "Letzte Antwort",
@@ -702,7 +721,6 @@
 	"Message rating should be enabled to use this feature": "Antwortbewertung muss aktiviert sein, um diese Funktion zu verwenden",
 	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Nachrichten, die Sie nach der Erstellung Ihres Links senden, werden nicht geteilt. Nutzer mit der URL können den freigegebenen Chat einsehen.",
 	"Min P": "Min P",
-	"Minimum Score": "Mindestpunktzahl",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Pipeline Valves",
 	"Plain text (.txt)": "Nur Text (.txt)",
 	"Playground": "Testumgebung",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "Bitte überprüfen Sie die folgenden Warnungen sorgfältig:",
 	"Please do not close the settings page while loading the model.": "Bitte schließen die Einstellungen-Seite nicht, während das Modell lädt.",
 	"Please enter a prompt": "Bitte geben Sie einen Prompt ein",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Veröffentlichungshinweise",
 	"Relevance": "Relevanz",
+	"Relevance Threshold": "",
 	"Remove": "Entfernen",
 	"Remove Model": "Modell entfernen",
 	"Rename": "Umbenennen",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "Bei {{WEBUI_NAME}} registrieren",
 	"Signing in to {{WEBUI_NAME}}": "Wird bei {{WEBUI_NAME}} angemeldet",
 	"sk-1234": "sk-1234",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Quelle",
 	"Speech Playback Speed": "Sprachwiedergabegeschwindigkeit",
 	"Speech recognition error: {{error}}": "Spracherkennungsfehler: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Zum Unterbrechen tippen",
 	"Tasks": "Aufgaben",
 	"Tavily API Key": "Tavily-API-Schlüssel",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Erzähl uns mehr",
 	"Temperature": "Temperatur",
 	"Template": "Vorlage",
@@ -1179,6 +1203,7 @@
 	"variable": "Variable",
 	"variable to have them replaced with clipboard content.": "Variable, um den Inhalt der Zwischenablage beim Nutzen des Prompts zu ersetzen.",
 	"Verify Connection": "Verbindung verifizieren",
+	"Verify SSL Certificate": "",
 	"Version": "Version",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Version {{selectedVersion}} von {{totalVersions}}",
 	"View Replies": "Antworten anzeigen",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "Web",
 	"Web API": "Web-API",
+	"Web Loader Engine": "",
 	"Web Search": "Websuche",
 	"Web Search Engine": "Suchmaschine",
 	"Web Search in Chat": "Websuche im Chat",

+ 28 - 2
src/lib/i18n/locales/dg-DG/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "",
 	"All models deleted successfully": "",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "",
 	"Allow Chat Deletion": "Allow Delete Chats",
 	"Allow Chat Edit": "",
 	"Allow File Upload": "",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "",
+	"Allow Text to Speech": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "and",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "",
+	"Android": "",
 	"API Base URL": "API Base URL",
 	"API Key": "API Key",
 	"API Key created.": "",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "",
 	"Calendar": "",
 	"Call": "",
 	"Call feature is not supported when using Web STT engine": "",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "",
 	"Copied to clipboard": "",
 	"Copy": "",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Copy last code block",
 	"Copy last response": "Copy last response",
 	"Copy Link": "",
@@ -303,6 +308,7 @@
 	"Deleted User": "",
 	"Describe your knowledge base and objectives": "",
 	"Description": "Description",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "",
 	"Edit Arena Model": "",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "",
 	"Enter Google PSE API Key": "",
 	"Enter Google PSE Engine Id": "",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Enter Number of Steps (e.g. 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Enter stop bark",
 	"Enter system prompt": "",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "",
 	"Filters": "",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Fingerprint dogeing: Unable to use initials as avatar. Defaulting to default doge image.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Fluidly wow big chunks",
 	"Focus chat input": "Focus chat bork",
 	"Folder deleted successfully": "",
@@ -589,6 +605,8 @@
 	"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": "",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "",
 	"Language": "Doge Speak",
+	"Language Locales": "",
 	"Last Active": "",
 	"Last Modified": "",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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.": "",
 	"Min P": "",
-	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "",
 	"Plain text (.txt)": "Plain text (.txt)",
 	"Playground": "Playground",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Release Borks",
 	"Relevance": "",
+	"Relevance Threshold": "",
 	"Remove": "",
 	"Remove Model": "",
 	"Rename": "",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "",
 	"Signing in to {{WEBUI_NAME}}": "",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Source",
 	"Speech Playback Speed": "",
 	"Speech recognition error: {{error}}": "Speech recognition error: {{error}} so error",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "",
 	"Tasks": "",
 	"Tavily API Key": "",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "",
 	"Temperature": "Temperature very temp",
 	"Template": "Template much template",
@@ -1179,6 +1203,7 @@
 	"variable": "variable very variable",
 	"variable to have them replaced with clipboard content.": "variable to have them replaced with clipboard content. Very replace.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "Version much version",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "Web very web",
 	"Web API": "",
+	"Web Loader Engine": "",
 	"Web Search": "",
 	"Web Search Engine": "",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/el-GR/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "Όλα τα Έγγραφα",
 	"All models deleted successfully": "Όλα τα μοντέλα διαγράφηκαν με επιτυχία",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "Επιτρέπεται η διαγραφή συνομιλίας",
 	"Allow Chat Deletion": "Επιτρέπεται η Διαγραφή Συνομιλίας",
 	"Allow Chat Edit": "Επιτρέπεται η Επεξεργασία Συνομιλίας",
 	"Allow File Upload": "Επιτρέπεται η Αποστολή Αρχείων",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Επιτρέπονται μη τοπικές φωνές",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "Επιτρέπεται η Προσωρινή Συνομιλία",
+	"Allow Text to Speech": "",
 	"Allow User Location": "Επιτρέπεται η Τοποθεσία Χρήστη",
 	"Allow Voice Interruption in Call": "Επιτρέπεται η Παύση Φωνής στην Κλήση",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "και",
 	"and {{COUNT}} more": "και {{COUNT}} ακόμα",
 	"and create a new shared link.": "και δημιουργήστε έναν νέο κοινόχρηστο σύνδεσμο.",
+	"Android": "",
 	"API Base URL": "API Βασικό URL",
 	"API Key": "Κλειδί API",
 	"API Key created.": "Το κλειδί API δημιουργήθηκε.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Κλειδί API Brave Search",
 	"By {{name}}": "Από {{name}}",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "Παράκαμψη επαλήθευσης SSL για Ιστότοπους",
 	"Calendar": "",
 	"Call": "Κλήση",
 	"Call feature is not supported when using Web STT engine": "Η λειτουργία κλήσης δεν υποστηρίζεται όταν χρησιμοποιείται η μηχανή Web STT",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "Αντιγράφηκε το URL της κοινόχρηστης συνομιλίας στο πρόχειρο!",
 	"Copied to clipboard": "Αντιγράφηκε στο πρόχειρο",
 	"Copy": "Αντιγραφή",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Αντιγραφή τελευταίου μπλοκ κώδικα",
 	"Copy last response": "Αντιγραφή τελευταίας απάντησης",
 	"Copy Link": "Αντιγραφή Συνδέσμου",
@@ -303,6 +308,7 @@
 	"Deleted User": "Διαγράφηκε ο Χρήστης",
 	"Describe your knowledge base and objectives": "Περιγράψτε τη βάση γνώσης και τους στόχους σας",
 	"Description": "Περιγραφή",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "Δεν ακολούθησε πλήρως τις οδηγίες",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "π.χ. my_filter",
 	"e.g. my_tools": "π.χ. my_tools",
 	"e.g. Tools for performing various operations": "π.χ. Εργαλεία για την εκτέλεση διάφορων λειτουργιών",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Επεξεργασία",
 	"Edit Arena Model": "Επεξεργασία Μοντέλου Arena",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Εισάγετε το Github Raw URL",
 	"Enter Google PSE API Key": "Εισάγετε το Κλειδί API Google PSE",
 	"Enter Google PSE Engine Id": "Εισάγετε το Αναγνωριστικό Μηχανής Google PSE",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "Εισάγετε το Κλειδί API Mojeek Search",
 	"Enter Number of Steps (e.g. 50)": "Εισάγετε τον Αριθμό Βημάτων (π.χ. 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "Εισάγετε τον Sampler (π.χ. Euler a)",
@@ -441,10 +452,13 @@
 	"Enter server host": "Εισάγετε τον διακομιστή host",
 	"Enter server label": "Εισάγετε την ετικέτα διακομιστή",
 	"Enter server port": "Εισάγετε την θύρα διακομιστή",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Εισάγετε τη σειρά παύσης",
 	"Enter system prompt": "Εισάγετε την προτροπή συστήματος",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Εισάγετε το Κλειδί API Tavily",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "Το φίλτρο είναι τώρα καθολικά ενεργοποιημένο",
 	"Filters": "Φίλτρα",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Εντοπίστηκε spoofing δακτυλικού αποτυπώματος: Αδυναμία χρήσης αρχικών ως avatar. Χρήση της προεπιλεγμένης εικόνας προφίλ.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Ροή μεγάλων εξωτερικών τμημάτων απάντησης ομαλά",
 	"Focus chat input": "Εστίαση στο πεδίο συνομιλίας",
 	"Folder deleted successfully": "Ο φάκελος διαγράφηκε με επιτυχία",
@@ -589,6 +605,8 @@
 	"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",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "Ξύπνημα της περιέργειας",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "Ετικέτα",
 	"Landing Page Mode": "Λειτουργία Σελίδας Άφιξης",
 	"Language": "Γλώσσα",
+	"Language Locales": "",
 	"Last Active": "Τελευταία Ενεργή",
 	"Last Modified": "Τελευταία Τροποποίηση",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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",
-	"Minimum Score": "Ελάχιστο Score",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Βαλβίδες Συναρτήσεων",
 	"Plain text (.txt)": "Απλό κείμενο (.txt)",
 	"Playground": "Γήπεδο παιχνιδιών",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "Παρακαλώ αναθεωρήστε προσεκτικά τις ακόλουθες προειδοποιήσεις:",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "Παρακαλώ εισάγετε μια προτροπή",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Σημειώσεις Έκδοσης",
 	"Relevance": "Σχετικότητα",
+	"Relevance Threshold": "",
 	"Remove": "Αφαίρεση",
 	"Remove Model": "Αφαίρεση Μοντέλου",
 	"Rename": "Μετονομασία",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "Εγγραφή στο {{WEBUI_NAME}}",
 	"Signing in to {{WEBUI_NAME}}": "Σύνδεση στο {{WEBUI_NAME}}",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Πηγή",
 	"Speech Playback Speed": "Ταχύτητα Αναπαραγωγής Ομιλίας",
 	"Speech recognition error: {{error}}": "Σφάλμα αναγνώρισης ομιλίας: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Πατήστε για παύση",
 	"Tasks": "",
 	"Tavily API Key": "Κλειδί API Tavily",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Πείτε μας περισσότερα:",
 	"Temperature": "Temperature",
 	"Template": "Πρότυπο",
@@ -1179,6 +1203,7 @@
 	"variable": "μεταβλητή",
 	"variable to have them replaced with clipboard content.": "μεταβλητή να αντικατασταθούν με το περιεχόμενο του πρόχειρου.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "Έκδοση",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Έκδοση {{selectedVersion}} από {{totalVersions}}",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "Διαδίκτυο",
 	"Web API": "Web API",
+	"Web Loader Engine": "",
 	"Web Search": "Αναζήτηση στο Διαδίκτυο",
 	"Web Search Engine": "Μηχανή Αναζήτησης στο Διαδίκτυο",
 	"Web Search in Chat": "",

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

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "",
 	"All models deleted successfully": "",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "",
 	"Allow Chat Deletion": "",
 	"Allow Chat Edit": "",
 	"Allow File Upload": "",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "",
+	"Allow Text to Speech": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "",
+	"Android": "",
 	"API Base URL": "",
 	"API Key": "",
 	"API Key created.": "",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "",
 	"Calendar": "",
 	"Call": "",
 	"Call feature is not supported when using Web STT engine": "",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "",
 	"Copied to clipboard": "",
 	"Copy": "",
+	"Copy Formatted Text": "",
 	"Copy last code block": "",
 	"Copy last response": "",
 	"Copy Link": "",
@@ -303,6 +308,7 @@
 	"Deleted User": "",
 	"Describe your knowledge base and objectives": "",
 	"Description": "",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "",
 	"Edit Arena Model": "",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "",
 	"Enter Google PSE API Key": "",
 	"Enter Google PSE Engine Id": "",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "",
 	"Enter system prompt": "",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "",
 	"Filters": "",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "",
 	"Focus chat input": "",
 	"Folder deleted successfully": "",
@@ -589,6 +605,8 @@
 	"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": "",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "",
 	"Language": "",
+	"Language Locales": "",
 	"Last Active": "",
 	"Last Modified": "",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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.": "",
 	"Min P": "",
-	"Minimum Score": "",
 	"Mirostat": "",
 	"Mirostat Eta": "",
 	"Mirostat Tau": "",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "",
 	"Plain text (.txt)": "",
 	"Playground": "",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "",
 	"Relevance": "",
+	"Relevance Threshold": "",
 	"Remove": "",
 	"Remove Model": "",
 	"Rename": "",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "",
 	"Signing in to {{WEBUI_NAME}}": "",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "",
 	"Speech Playback Speed": "",
 	"Speech recognition error: {{error}}": "",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "",
 	"Tasks": "",
 	"Tavily API Key": "",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "",
 	"Temperature": "",
 	"Template": "",
@@ -1179,6 +1203,7 @@
 	"variable": "",
 	"variable to have them replaced with clipboard content.": "",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "",
 	"Web API": "",
+	"Web Loader Engine": "",
 	"Web Search": "",
 	"Web Search Engine": "",
 	"Web Search in Chat": "",

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

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "",
 	"All models deleted successfully": "",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "",
 	"Allow Chat Deletion": "",
 	"Allow Chat Edit": "",
 	"Allow File Upload": "",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "",
+	"Allow Text to Speech": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "",
+	"Android": "",
 	"API Base URL": "",
 	"API Key": "",
 	"API Key created.": "",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "",
 	"Calendar": "",
 	"Call": "",
 	"Call feature is not supported when using Web STT engine": "",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "",
 	"Copied to clipboard": "",
 	"Copy": "",
+	"Copy Formatted Text": "",
 	"Copy last code block": "",
 	"Copy last response": "",
 	"Copy Link": "",
@@ -303,6 +308,7 @@
 	"Deleted User": "",
 	"Describe your knowledge base and objectives": "",
 	"Description": "",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "",
 	"Edit Arena Model": "",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "",
 	"Enter Google PSE API Key": "",
 	"Enter Google PSE Engine Id": "",
@@ -424,8 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "",
 	"Enter Perplexity API Key": "",
-	"Enter Sougou Search API sID": "",
-	"Enter Sougou Search API SK": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "",
@@ -443,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "",
 	"Enter system prompt": "",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -527,6 +539,8 @@
 	"Filter is now globally enabled": "",
 	"Filters": "",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "",
 	"Focus chat input": "",
 	"Folder deleted successfully": "",
@@ -591,6 +605,8 @@
 	"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": "",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
@@ -651,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "",
 	"Language": "",
+	"Language Locales": "",
 	"Last Active": "",
 	"Last Modified": "",
 	"Last reply": "",
@@ -704,7 +721,6 @@
 	"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.": "",
 	"Min P": "",
-	"Minimum Score": "",
 	"Mirostat": "",
 	"Mirostat Eta": "",
 	"Mirostat Tau": "",
@@ -824,8 +840,6 @@
 	"Permission denied when accessing microphone: {{error}}": "",
 	"Permissions": "",
 	"Perplexity API Key": "",
-	"Sougou Search API sID": "",
-	"Sougou Search API SK": "",
 	"Personalization": "",
 	"Pin": "",
 	"Pinned": "",
@@ -837,6 +851,8 @@
 	"Pipelines Valves": "",
 	"Plain text (.txt)": "",
 	"Playground": "",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "",
@@ -886,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "",
 	"Relevance": "",
+	"Relevance Threshold": "",
 	"Remove": "",
 	"Remove Model": "",
 	"Rename": "",
@@ -1015,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "",
 	"Signing in to {{WEBUI_NAME}}": "",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "",
 	"Speech Playback Speed": "",
 	"Speech recognition error: {{error}}": "",
@@ -1042,6 +1061,7 @@
 	"Tap to interrupt": "",
 	"Tasks": "",
 	"Tavily API Key": "",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "",
 	"Temperature": "",
 	"Template": "",
@@ -1183,6 +1203,7 @@
 	"variable": "",
 	"variable to have them replaced with clipboard content.": "",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
 	"View Replies": "",
@@ -1197,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "",
 	"Web API": "",
+	"Web Loader Engine": "",
 	"Web Search": "",
 	"Web Search Engine": "",
 	"Web Search in Chat": "",

+ 182 - 156
src/lib/i18n/locales/es-ES/translation.json

@@ -14,19 +14,19 @@
 	"*Prompt node ID(s) are required for image generation": "Los ID de nodo son requeridos para la generación de imágenes",
 	"A new version (v{{LATEST_VERSION}}) is now available.": "Nueva versión (v{{LATEST_VERSION}}) disponible.",
 	"A task model is used when performing tasks such as generating titles for chats and web search queries": "El modelo de tareas realiza tareas como la generación de títulos para chats y consultas de búsqueda web",
-	"a user": "un usuario",
+	"a user": "un/a usuari@",
 	"About": "Acerca de",
-	"Accept autocomplete generation / Jump to prompt variable": "Aceptar generación de autocompletado / Saltar a la variable de Indicadión (prompt)",
+	"Accept autocomplete generation / Jump to prompt variable": "Aceptar generación de autocompletado / Saltar a indicador variable",
 	"Access": "Acceso",
 	"Access Control": "Control de Acceso",
-	"Accessible to all users": "Accesible para todos los usuarios",
+	"Accessible to all users": "Accesible para todos l@s usuari@s",
 	"Account": "Cuenta",
 	"Account Activation Pending": "Activación de cuenta Pendiente",
 	"Accurate information": "Información precisa",
 	"Actions": "Acciones",
 	"Activate": "Activar",
 	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Activar este comando escribiendo \"/{{COMMAND}}\" en el chat",
-	"Active Users": "Usuarios activos",
+	"Active Users": "Usuari@s activos",
 	"Add": "Añadir",
 	"Add a model ID": "Añadir un ID de modelo",
 	"Add a short description about what this model does": "Añadir una breve descripción sobre lo que hace este modelo",
@@ -35,7 +35,7 @@
 	"Add Connection": "Añadir Conexión",
 	"Add Content": "Añadir Contenido",
 	"Add content here": "Añadir contenido aquí",
-	"Add custom prompt": "Añadir un indicador(prompt) personalizado",
+	"Add custom prompt": "Añadir un indicador personalizado",
 	"Add Files": "Añadir Ficheros",
 	"Add Group": "Añadir Grupo",
 	"Add Memory": "Añadir Memoria",
@@ -44,27 +44,31 @@
 	"Add Tag": "Añadir etiqueta",
 	"Add Tags": "Añadir etiquetas",
 	"Add text content": "Añade contenido de texto",
-	"Add User": "Añadir Usuario",
-	"Add User Group": "Añadir Grupo de Usuario",
-	"Adjusting these settings will apply changes universally to all users.": "El ajuste de estas opciones se aplicará globalmente a todos los usuarios.",
+	"Add User": "Añadir Usuari@",
+	"Add User Group": "Añadir Grupo de Usuari@",
+	"Adjusting these settings will apply changes universally to all users.": "El ajuste de estas opciones se aplicará globalmente a todos l@s usuari@s.",
 	"admin": "admin",
 	"Admin": "Admin",
-	"Admin Panel": "Panel de Admin",
+	"Admin Panel": "Administración",
 	"Admin Settings": "Ajustes de Admin",
-	"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Los Admins tienen acceso a todas las herramientas en todo momento; los usuarios necesitan, en el área de trabajo, que los modelos tengan asignadas las herramentas.",
+	"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Los Admins tienen acceso a todas las herramientas en todo momento; l@s usuari@s necesitan, en el área de trabajo, que los modelos tengan asignadas las herramentas.",
 	"Advanced Parameters": "Parámetros Avanzados",
 	"Advanced Params": "Param. Avanz.",
 	"All": "Todos",
 	"All Documents": "Todos los Documentos",
 	"All models deleted successfully": "Todos los modelos borrados correctamnete",
+	"Allow Call": "",
 	"Allow Chat Controls": "Permitir Controles del Chat",
 	"Allow Chat Delete": "Permitir Borrar Chat",
 	"Allow Chat Deletion": "Permitir Borrado de Chat",
 	"Allow Chat Edit": "Pemritir Editar Chat",
 	"Allow File Upload": "Permitir Subida de Ficheros",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Permitir voces no locales",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "Permitir Chat Temporal",
-	"Allow User Location": "Permitir Ubicación del Usuario",
+	"Allow Text to Speech": "",
+	"Allow User Location": "Permitir Ubicación de Usuari@",
 	"Allow Voice Interruption in Call": "Permitir Interrupción de Voz en Llamada",
 	"Allowed Endpoints": "Endpoints Permitidos",
 	"Already have an account?": "¿Ya tienes una cuenta?",
@@ -79,14 +83,15 @@
 	"and": "y",
 	"and {{COUNT}} more": "y {{COUNT}} más",
 	"and create a new shared link.": "y crear un nuevo enlace compartido.",
+	"Android": "",
 	"API Base URL": "URL Base API",
 	"API Key": "Clave API ",
 	"API Key created.": "Clave API creada.",
-	"API Key Endpoint Restrictions": "Clave API Restricciones de Endpoint",
+	"API Key Endpoint Restrictions": "Clave API para Endpoints Restringidos",
 	"API keys": "Claves API",
 	"Application DN": "Aplicacion DN",
 	"Application DN Password": "Contraseña Aplicacion DN",
-	"applies to all users with the \"user\" role": "se aplica a todos los usuarios con el rol \"user\" ",
+	"applies to all users with the \"user\" role": "se aplica a todos l@s usuari@s con el rol \"user\" ",
 	"April": "Abril",
 	"Archive": "Archivar",
 	"Archive All Chats": "Archivar Todos los Chats",
@@ -105,15 +110,15 @@
 	"Attach file from knowledge": "Adjuntar fichero desde el conocimiento",
 	"Attention to detail": "Atención al detalle",
 	"Attribute for Mail": "Atributo para Correo",
-	"Attribute for Username": "Atributo para Nombre de Usuario",
+	"Attribute for Username": "Atributo para Nombre de Usuari@",
 	"Audio": "Audio",
 	"August": "Agosto",
-	"Auth": "",
+	"Auth": "Autorización",
 	"Authenticate": "Autentificar",
 	"Authentication": "Autentificación",
-	"Auto": "",
-	"Auto-Copy Response to Clipboard": "Auto-Copiar respuesta al Portapapeles",
-	"Auto-playback response": "Auto-Reproducir Respuesta",
+	"Auto": "Auto",
+	"Auto-Copy Response to Clipboard": "AutoCopiado de respuesta al Portapapeles",
+	"Auto-playback response": "AutoReproducir Respuesta",
 	"Autocomplete Generation": "Generación de Autocompletado",
 	"Autocomplete Generation Input Max Length": "Max. Longitud de Entrada en Generación de Autocompletado",
 	"Automatic1111": "AUTOMATIC1111",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Clave API de Brave Search",
 	"By {{name}}": "Por {{name}}",
 	"Bypass Embedding and Retrieval": "Evitar Incrustración y Recuperación",
-	"Bypass SSL verification for Websites": "Evitar Verificación SSL para sitios web",
 	"Calendar": "Calendario",
 	"Call": "Llamada",
 	"Call feature is not supported when using Web STT engine": "La característica Llamada no está soportada cuando se usa el motor Web STT",
@@ -158,19 +162,19 @@
 	"Chart new frontiers": "Trazar nuevas fronteras",
 	"Chat": "Chat",
 	"Chat Background Image": "Imágen de Fondo del Chat",
-	"Chat Bubble UI": "Interface Burbuja de Chat",
+	"Chat Bubble UI": "Interface del Chat tipo Burbuja",
 	"Chat Controls": "Controles del chat",
 	"Chat direction": "Dirección del Chat",
 	"Chat Overview": "Vista General del Chat",
 	"Chat Permissions": "Permisos del Chat",
-	"Chat Tags Auto-Generation": "Auto-Generación de Etiquetas de Chat",
+	"Chat Tags Auto-Generation": "AutoGeneración de Etiquetas de Chat",
 	"Chats": "Chats",
 	"Check Again": "Verifica de nuevo",
 	"Check for updates": "Buscar actualizaciones",
 	"Checking for updates...": "Buscando actualizaciones...",
 	"Choose a model before saving...": "Escoge un modelo antes de guardar...",
 	"Chunk Overlap": "Superposición de Fragmentos",
-	"Chunk Size": "Tamaño de Fragmentos",
+	"Chunk Size": "Tamaño de los Fragmentos",
 	"Ciphers": "Cifrado",
 	"Citation": "Cita",
 	"Clear memory": "Liberar memoria",
@@ -179,7 +183,7 @@
 	"Click here for filter guides.": "Pulsar aquí para guías de filtros",
 	"Click here for help.": "Pulsar aquí para Ayuda.",
 	"Click here to": "Pulsa aquí para",
-	"Click here to download user import template file.": "Pulsa aquí para descargar la plantilla de importación del usuario.",
+	"Click here to download user import template file.": "Pulsa aquí para descargar la plantilla de importación de usuari@.",
 	"Click here to learn more about faster-whisper and see the available models.": "Pulsa aquí para saber más sobre faster-whisper y ver modelos disponibles.",
 	"Click here to see available models.": "Pulsa aquí para ver modelos disponibles.",
 	"Click here to select": "Pulsa aquí para seleccionar",
@@ -187,7 +191,7 @@
 	"Click here to select a py file.": "Pulsa aquí para seleccionar un fichero Python (.py)",
 	"Click here to upload a workflow.json file.": "Pulsa aquí para subir un fichero workflow.json",
 	"click here.": "Pulsa aquí.",
-	"Click on the user role button to change a user's role.": "Pulsa en el botón rol del usuario para cambiar su rol.",
+	"Click on the user role button to change a user's role.": "Pulsa en el botón rol de usuari@ para cambiar su rol.",
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Permisos de escritura del portapapeles denegado. Por favor, comprueba la configuración de tu navegador para otorgar el permiso necesario.",
 	"Clone": "Clonar",
 	"Clone Chat": "Clonar Chat",
@@ -199,20 +203,20 @@
 	"Code Execution Timeout": "Tiempo",
 	"Code formatted successfully": "Se ha formateado correctamente el código.",
 	"Code Interpreter": "Interprete de Código",
-	"Code Interpreter Engine": "Motor Interpretador de Código",
-	"Code Interpreter Prompt Template": "Plantilla de Prompt del Interpretador de Código",
+	"Code Interpreter Engine": "Motor del Interprete de Código",
+	"Code Interpreter Prompt Template": "Plantilla del Indicador del Interprete de Código",
 	"Collapse": "Plegar",
 	"Collection": "Colección",
 	"Color": "Color",
 	"ComfyUI": "ComfyUI",
-	"ComfyUI API Key": "ComfyUI Clave API",
-	"ComfyUI Base URL": "ComfyUI URL Base",
-	"ComfyUI Base URL is required.": "ComfyUI URL Base es necesaria.",
-	"ComfyUI Workflow": "ComfyUI Flujo de Trabajo",
-	"ComfyUI Workflow Nodes": "Comfy Nodos del Flujo de Trabajo",
+	"ComfyUI API Key": "Clave API de ComfyUI",
+	"ComfyUI Base URL": "URL Base de ComfyUI",
+	"ComfyUI Base URL is required.": "La URL Base de ComfyUI es necesaria.",
+	"ComfyUI Workflow": "Flujo de Trabajo de ComfyUI",
+	"ComfyUI Workflow Nodes": "Nodos del Flujo de Trabajo de ComfyUI",
 	"Command": "Comando",
 	"Completions": "Cumplimientos",
-	"Concurrent Requests": "Solicitudes Concurrentes",
+	"Concurrent Requests": "Número de Solicitudes Concurrentes",
 	"Configure": "Configurar",
 	"Confirm": "Confirmar",
 	"Confirm Password": "Confirma Contraseña",
@@ -220,10 +224,10 @@
 	"Confirm your new password": "Confirma tu nueva contraseña",
 	"Connect to your own OpenAI compatible API endpoints.": "Conectar a tus propios endpoints compatibles API OpenAI.",
 	"Connect to your own OpenAPI compatible external tool servers.": "Conectar a tus propios endpoints externos de herramientas compatibles API OpenAI.",
-	"Connection failed": "",
-	"Connection successful": "",
+	"Connection failed": "Conexión fallida",
+	"Connection successful": "Conexión realizada",
 	"Connections": "Conexiones",
-	"Connections saved successfully": "",
+	"Connections saved successfully": "Conexiones grabadas correctamente",
 	"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "Limita el esfuerzo de razonamiento para los modelos de razonamiento. Solo aplicable a modelos de razonamiento de proveedores específicos que soportan el esfuerzo de razonamiento.",
 	"Contact Admin for WebUI Access": "Contacta con Admin para obtener acceso a WebUI",
 	"Content": "Contenido",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "¡Copiada al portapapeles la URL del chat compartido!",
 	"Copied to clipboard": "Copiado al portapapeles",
 	"Copy": "Copiar",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Copia el último bloque de código",
 	"Copy last response": "Copia la última respuesta",
 	"Copy Link": "Copiar enlace",
@@ -261,7 +266,7 @@
 	"Created At": "Creado En",
 	"Created by": "Creado por",
 	"CSV Import": "Importar CSV",
-	"Ctrl+Enter to Send": "Ctrl+Enter para Enviar",
+	"Ctrl+Enter to Send": "'Ctrl+Enter' para Enviar",
 	"Current Model": "Modelo Actual",
 	"Current Password": "Contraseña Actual",
 	"Custom": "Personalizado",
@@ -278,11 +283,11 @@
 	"Default Models": "Modelos Predeterminados",
 	"Default permissions": "Permisos Predeterminados",
 	"Default permissions updated successfully": "Permisos predeterminados actualizados correctamente",
-	"Default Prompt Suggestions": "Sugerencias de Indicador(prompt) Predetermonadas",
+	"Default Prompt Suggestions": "Sugerencias Predeterminadas de Indicador",
 	"Default to 389 or 636 if TLS is enabled": "Predeterminado a 389, o 636 si TLS está habilitado",
 	"Default to ALL": "Predeterminado a TODOS",
-	"Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "Predeterminada una segmentación de la recuperación para una extracción de contenido centrado y relevante, recomendado para la mayoría de los casos.",
-	"Default User Role": "Rol Predeterminado Usuarios",
+	"Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "Por defecto está predeterminada una segmentación de la recuperación para una extracción de contenido centrado y relevante, recomendado para la mayoría de los casos.",
+	"Default User Role": "Rol Predeterminado de l@s Usuari@s Nuev@s",
 	"Delete": "Borrar",
 	"Delete a model": "Borrar un modelo",
 	"Delete All Chats": "Borrar todos los chats",
@@ -294,36 +299,37 @@
 	"Delete function?": "Borrar la función?",
 	"Delete Message": "Borrar mensaje",
 	"Delete message?": "¿Borrar mensaje?",
-	"Delete prompt?": "¿Borrar el indicador(prompt)?",
+	"Delete prompt?": "¿Borrar el indicador?",
 	"delete this link": "Borrar este enlace",
 	"Delete tool?": "¿Borrar la herramienta?",
-	"Delete User": "Borrar Usuario",
+	"Delete User": "Borrar Usuari@",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} Borrado",
 	"Deleted {{name}}": "{{nombre}} Borrado",
-	"Deleted User": "Usuario Borrado",
+	"Deleted User": "Usuari@ Borrado",
 	"Describe your knowledge base and objectives": "Describe tu Base de Conocimientos y sus objetivos",
 	"Description": "Descripción",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "No seguiste completamente las instrucciones",
 	"Direct": "Directo",
 	"Direct Connections": "Conexiones Directas",
-	"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Las Conexiones Directas permiten a los usuarios conectar a sus propios endpoints compatibles API OpenAI.",
+	"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Las Conexiones Directas permiten a l@s usuari@s conectar a sus propios endpoints compatibles API OpenAI.",
 	"Direct Connections settings updated": "Se actualizaron las configuraciones de las Conexiones Directas",
-	"Direct Tool Servers": "",
+	"Direct Tool Servers": "Servidores de Herramientas Directos",
 	"Disabled": "Deshabilitado",
-	"Discover a function": "Descubre una Función",
-	"Discover a model": "Descubre un Modelo",
-	"Discover a prompt": "Descubre un Indicador(prompt)",
-	"Discover a tool": "Descubre una Herramienta",
+	"Discover a function": "Descubrir Funciónes",
+	"Discover a model": "Descubrir Modelos",
+	"Discover a prompt": "Descubrir Indicadores",
+	"Discover a tool": "Descubrir Herramientas",
 	"Discover how to use Open WebUI and seek support from the community.": "Descubre cómo usar Open WebUI y busca Soporte Comunitario.",
 	"Discover wonders": "Descubre Maravillas",
 	"Discover, download, and explore custom functions": "Descubre, descarga y explora funciones personalizadas",
-	"Discover, download, and explore custom prompts": "Descubre, descarga, y explora indicadores(prompts) personalizados",
+	"Discover, download, and explore custom prompts": "Descubre, descarga, y explora indicadores personalizados",
 	"Discover, download, and explore custom tools": "Descubre, descarga y explora herramientas personalizadas",
 	"Discover, download, and explore model presets": "Descubre, descarga y explora modelos con preajustados",
 	"Dismissible": "Desestimable",
 	"Display": "Mostrar",
 	"Display Emoji in Call": "Muestra chirimbolitos(Emojis) en Llamada",
-	"Display the username instead of You in the Chat": "Mostrar en el chat el nombre de usuario en lugar del genérico Tu/Usted",
+	"Display the username instead of You in the Chat": "Mostrar en el chat el nombre de usuari@ en lugar del genérico Tu/Usted",
 	"Displays citations in the response": "Mostrar citas en la respuesta",
 	"Dive into knowledge": "Sumérgete en el conocimiento",
 	"Do not install functions from sources you do not fully trust.": "¡No instalar funciones de fuentes en las que que no se confíe totalmente!",
@@ -358,32 +364,33 @@
 	"e.g. my_filter": "p.ej. mi_filtro",
 	"e.g. my_tools": "p.ej. mis_herramientas",
 	"e.g. Tools for performing various operations": "p.ej. Herramientas para realizar varias operaciones",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Editar",
 	"Edit Arena Model": "Editar Modelo en Arena",
 	"Edit Channel": "Editar Canal",
 	"Edit Connection": "Editar Conexión",
 	"Edit Default Permissions": "Editar Permisos Predeterminados",
 	"Edit Memory": "Editar Memoria",
-	"Edit User": "Editar Usuario",
-	"Edit User Group": "Editar Grupo de Usuario",
+	"Edit User": "Editar Usuari@",
+	"Edit User Group": "Editar Grupo de Usuari@",
 	"ElevenLabs": "ElevenLabs",
 	"Email": "Email",
 	"Embark on adventures": "Embarcate en aventuras",
-	"Embedding": "Incrustado",
-	"Embedding Batch Size": "Tamaño Lote Incrustación",
-	"Embedding Model": "Modelo de Incruswtación",
+	"Embedding": "Incrustación",
+	"Embedding Batch Size": "Tamaño del Lote de Incrustación",
+	"Embedding Model": "Modelo de Incrustación",
 	"Embedding Model Engine": "Motor del Modelo de Incrustación",
 	"Embedding model set to \"{{embedding_model}}\"": "Modelo de Incrustación configurado a \"{{embedding_model}}\"",
-	"Enable API Key": "Habilitar clave API",
+	"Enable API Key": "Habilitar Clave API",
 	"Enable autocomplete generation for chat messages": "Habilitar generación de autocompletado para mensajes de chat",
 	"Enable Code Execution": "Habilitar Ejecución de Código",
 	"Enable Code Interpreter": "Habilitar Interprete de Código",
 	"Enable Community Sharing": "Habilitar Compartir con la Comunidad",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Habilitar bloqueo de memoria (mlock) para prevenir que los datos del modelo se intercambien fuera de la RAM. Esta opción bloquea el conjunto de páginas de trabajo del modelo en RAM, asegurando que no se intercambiarán fuera a disco. Esto puede ayudar a mantener el rendimiento evitando fallos de página y asegurando un acceso rápido a los datos.",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "Habilitar Mapeado de Memoria (mmap) para cargar datos del modelo. Esta opción permite al sistema usar el almacenamiento del disco como una extensión de la RAM al tratar los archivos en disco como si estuvieran en la RAM. Esto puede mejorar el rendimiento del modelo al permitir un acceso más rápido a los datos. Sin embargo, puede no funcionar correctamente con todos los sistemas y puede consumir una cantidad significativa de espacio en disco.",
-	"Enable Message Rating": "Habilitar la calificación de los Mensajes",
-	"Enable Mirostat sampling for controlling perplexity.": "Habilitar muestreo Mirostat para controlar la perplejidad.",
-	"Enable New Sign Ups": "Habilitar Registros de Nuevos Usuarios",
+	"Enable Message Rating": "Habilitar Calificación de los Mensajes",
+	"Enable Mirostat sampling for controlling perplexity.": "Algoritmo de decodificación de texto neuronal que controla activamente el proceso generativo para mantener la perplejidad del texto generado en un valor deseado. Previene las trampas de aburrimiento (por excesivas repeticiones) y de incoherencia (por generación de excesivo texto).",
+	"Enable New Sign Ups": "Habilitar Registros de Nuev@s Usuari@s",
 	"Enabled": "Habilitado",
 	"Enforce Temporary Chat": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Asegúrese de que su archivo CSV incluya 4 columnas en este orden: Nombre, Correo Electrónico, Contraseña, Rol.",
@@ -398,7 +405,7 @@
 	"Enter Brave Search API Key": "Ingresar la Clave API de Brave Search",
 	"Enter certificate path": "Ingresar la ruta del certificado",
 	"Enter CFG Scale (e.g. 7.0)": "Ingresa escala CFG (p.ej., 7.0)",
-	"Enter Chunk Overlap": "Ingresar Superposición de Fragmentos",
+	"Enter Chunk Overlap": "Ingresar Superposición de los Fragmentos",
 	"Enter Chunk Size": "Ingresar el Tamaño del Fragmento",
 	"Enter comma-seperated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "Ingresar pares \"token:valor_sesgo\" separados por comas (ejemplo: 5432:100, 413:-100)",
 	"Enter description": "Ingresar Descripción",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "Ingresar Clave de Azure Document Intelligence",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "Ingresar dominios separados por comas (p.ej., ejemplo.com,sitio.org)",
 	"Enter Exa API Key": "Ingresar Clave API de Exa",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Ingresar URL Github en Bruto(raw)",
 	"Enter Google PSE API Key": "Ingresar Clave API de Google PSE",
 	"Enter Google PSE Engine Id": "Ingresa ID del Motor PSE de Google",
@@ -416,14 +425,16 @@
 	"Enter Jupyter Token": "Ingresar Token de Jupyter",
 	"Enter Jupyter URL": "Ingresar URL de Jupyter",
 	"Enter Kagi Search API Key": "Ingresar Clave API de Kagi Search",
-	"Enter Key Behavior": "Ingresar Clave de Comportamiento",
+	"Enter Key Behavior": "Comportamiento de la Tecla de Envío",
 	"Enter language codes": "Ingresar Códigos de Idioma",
-	"Enter Mistral API Key": "",
+	"Enter Mistral API Key": "Ingresar Clave API de Mistral",
 	"Enter Model ID": "Ingresar ID del Modelo",
 	"Enter model tag (e.g. {{modelTag}})": "Ingresar la etiqueta del modelo (p.ej. {{modelTag}})",
 	"Enter Mojeek Search API Key": "Ingresar Clave API de Mojeek Search",
 	"Enter Number of Steps (e.g. 50)": "Ingresar Número de Pasos (p.ej., 50)",
 	"Enter Perplexity API Key": "Ingresar Clave API de Perplexity",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "Ingresar URL del proxy (p.ej. https://user:password@host:port)",
 	"Enter reasoning effort": "Ingresar esfuerzo de razonamiento",
 	"Enter Sampler (e.g. Euler a)": "Ingresar Muestreador (p.ej., Euler a)",
@@ -441,14 +452,17 @@
 	"Enter server host": "Ingresar host del servidor",
 	"Enter server label": "Ingresar etiqueta del servidor",
 	"Enter server port": "Ingresar puerto del servidor",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Ingresar secuencia de parada",
-	"Enter system prompt": "Ingresar Indicador(prompt) del sistema",
-	"Enter system prompt here": "",
+	"Enter system prompt": "Ingresar Indicador del sistema",
+	"Enter system prompt here": "Ingresa aquí el indicador del sistema",
 	"Enter Tavily API Key": "Ingresar Clave API de Tavily",
+	"Enter Tavily Extract Depth": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Ingresar URL pública de su WebUI. Esta URL se usará para generar enlaces en las notificaciones.",
 	"Enter Tika Server URL": "Ingresar URL del servidor Tika",
 	"Enter timeout in seconds": "Ingresar timeout en segundos",
-	"Enter to Send": "Ingresar Enviar a",
+	"Enter to Send": "'Enter' para Enviar",
 	"Enter Top K": "Ingresar Top K",
 	"Enter Top K Reranker": "Ingresar Top K Reclasificador",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Ingresar URL (p.ej., http://127.0.0.1:7860/)",
@@ -457,12 +471,12 @@
 	"Enter Your Email": "Ingresa tu correo electrónico",
 	"Enter Your Full Name": "Ingresa su nombre completo",
 	"Enter your message": "Ingresa tu mensaje",
-	"Enter your name": "",
+	"Enter your name": "Ingresa tu nombre",
 	"Enter your new password": "Ingresa tu contraseña nueva",
 	"Enter Your Password": "Ingresa tu contraseña",
 	"Enter Your Role": "Ingresa tu rol",
-	"Enter Your Username": "Ingresa tu nombre de usuario",
-	"Enter your webhook URL": "Ingresa tu URL de EngancheWeb(webhook)",
+	"Enter Your Username": "Ingresa tu nombre de usuari@",
+	"Enter your webhook URL": "Ingresa tu URL de enganchesWeb(webhook)",
 	"Error": "Error",
 	"ERROR": "ERROR",
 	"Error accessing Google Drive: {{error}}": "Error accediendo a Google Drive: {{error}}",
@@ -485,14 +499,14 @@
 	"Explore the cosmos": "Explora el cosmos",
 	"Export": "Exportar",
 	"Export All Archived Chats": "Exportar Todos los Chats Archivados",
-	"Export All Chats (All Users)": "Exportar Todos los Chats (Todos los Usuarios)",
+	"Export All Chats (All Users)": "Exportar Todos los Chats (Todos l@s Usuari@s)",
 	"Export chat (.json)": "Exportar chat (.json)",
 	"Export Chats": "Exportar Chats",
 	"Export Config to JSON File": "Exportar Configuración a archivo JSON",
 	"Export Functions": "Exportar Funciones",
 	"Export Models": "Exportar Modelos",
 	"Export Presets": "Exportar Preajustes",
-	"Export Prompts": "Exportar Indicadores(prompts)",
+	"Export Prompts": "Exportar Indicadores",
 	"Export to CSV": "Exportar a CSV",
 	"Export Tools": "Exportar Herramientas",
 	"External": "Externo",
@@ -502,7 +516,7 @@
 	"Failed to create API Key.": "Fallo al crear la Clave API.",
 	"Failed to fetch models": "Fallo al obtener los modelos",
 	"Failed to read clipboard contents": "Fallo al leer el contenido del portapapeles",
-	"Failed to save connections": "",
+	"Failed to save connections": "Fallo al grabar las conexiones",
 	"Failed to save models configuration": "Fallo al guardar la configuración de los modelos",
 	"Failed to update settings": "Fallo al actualizar los ajustes",
 	"Failed to upload file.": "Fallo al subir el archivo.",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "El filtro ahora está habilitado globalmente",
 	"Filters": "Filtros",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Se detectó suplantación de huellas: No se pueden usar las iniciales como avatar. Se establece la imagen de perfil predeterminada.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Transmisión fluida de fragmentos de grandes respuestas externas",
 	"Focus chat input": "Enfoque entrada del chat",
 	"Folder deleted successfully": "Carpeta bollada correctamente",
@@ -535,13 +551,13 @@
 	"Forge new paths": "Forjar nuevos caminos",
 	"Form": "Formulario",
 	"Format your variables using brackets like this:": "Formatea tus variables usando corchetes así:",
-	"Forwards system user session credentials to authenticate": "",
+	"Forwards system user session credentials to authenticate": "Reenvío de las credenciales de la sesión del usuario del sistema para autenticación",
 	"Frequency Penalty": "Penalización de Frecuencia",
 	"Full Context Mode": "Modo Contexto Completo",
 	"Function": "Función",
-	"Function Calling": "Llamada de Función",
-	"Function created successfully": "Función creada exitosamente",
-	"Function deleted successfully": "Función borrada exitosamente",
+	"Function Calling": "Modo de Llamada a Funciones (Herramientas)",
+	"Function created successfully": "Función creada correctamente",
+	"Function deleted successfully": "Función borrada correctamente",
 	"Function Description": "Descripción de la Función",
 	"Function ID": "ID de la Función",
 	"Function is now globally disabled": "La Función ahora está deshabilitada globalmente",
@@ -558,7 +574,7 @@
 	"General": "General",
 	"Generate an image": "Generar una imagen",
 	"Generate Image": "Generar imagen",
-	"Generate prompt pair": "Generar par de indicadores(prompt)",
+	"Generate prompt pair": "Generar par de indicadores",
 	"Generating search query": "Generando consulta de búsqueda",
 	"Get started": "Empezar",
 	"Get started with {{WEBUI_NAME}}": "Empezar con {{WEBUI_NAME}}",
@@ -573,7 +589,7 @@
 	"Group Name": "Nombre del Grupo",
 	"Group updated successfully": "Grupo actualizado correctamente",
 	"Groups": "Grupos",
-	"Haptic Feedback": "Realimentación háptica",
+	"Haptic Feedback": "Realimentación Háptica",
 	"has no conversations.": "no tiene conversaciones.",
 	"Hello, {{name}}": "Hola, {{name}}",
 	"Help": "Ayuda",
@@ -581,7 +597,7 @@
 	"Hex Color": "Color Hex",
 	"Hex Color - Leave empty for default color": "Color Hex - Deja vacío para el color predeterminado",
 	"Hide": "Esconder",
-	"Hide Model": "",
+	"Hide Model": "Ocultar Modelo",
 	"Home": "Inicio",
 	"Host": "Host",
 	"How can I help you today?": "¿Cómo puedo ayudarte hoy?",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Búsqueda Híbrida",
 	"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Aseguro que he leído y entiendo las implicaciones de mi acción. Soy consciente de los riesgos asociados con la ejecución de código arbitrario y he verificado la confiabilidad de la fuente.",
 	"ID": "ID",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "Encender la curiosidad",
 	"Image": "Imagen",
 	"Image Compression": "Compresión de Imagen",
@@ -596,16 +614,16 @@
 	"Image Generation (Experimental)": "Generación de Imagen (experimental)",
 	"Image Generation Engine": "Motor de Generación de Imagen",
 	"Image Max Compression Size": "Tamaño Máximo de Compresión de Imagen",
-	"Image Prompt Generation": "Indicador(prompt) para Generación de Imagen",
-	"Image Prompt Generation Prompt": "Indicador para la Generación de Inficador de Imagen",
-	"Image Settings": "Configuración de la Imágen",
+	"Image Prompt Generation": "Indicador para Generación de Imagen",
+	"Image Prompt Generation Prompt": "Indicador para la Generación de Imagen",
+	"Image Settings": "Configuración de Imágen",
 	"Images": "Imágenes",
 	"Import Chats": "Importar Chats",
 	"Import Config from JSON File": "Importar Config desde Archivo JSON",
 	"Import Functions": "Importar Funciones",
 	"Import Models": "Importar Modelos",
 	"Import Presets": "Importar Preajustes",
-	"Import Prompts": "Importar Indicadores(prompts)",
+	"Import Prompts": "Importar Indicadores",
 	"Import Tools": "Importar Herramientas",
 	"Include": "Incluir",
 	"Include `--api-auth` flag when running stable-diffusion-webui": "Incluir el señalizador `--api-auth` al ejecutar stable-diffusion-webui",
@@ -615,7 +633,7 @@
 	"Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Inyecta el contenido completo como contexto para un procesado comprensivo, recomendado para consultas complejas.",
 	"Input commands": "Ingresar comandos",
 	"Install from Github URL": "Instalar desde la URL de Github",
-	"Instant Auto-Send After Voice Transcription": "Auto-Envio Instantaneo tras la Transcripción de Voz",
+	"Instant Auto-Send After Voice Transcription": "AutoEnvio Instantaneo tras la Transcripción de Voz",
 	"Integration": "Integración",
 	"Interface": "Interface",
 	"Invalid file format.": "Formato de archivo Inválido.",
@@ -631,8 +649,8 @@
 	"June": "Junio",
 	"Jupyter Auth": "Autenticación de Jupyter",
 	"Jupyter URL": "URL de Jupyter",
-	"JWT Expiration": "Expiración del JWT",
-	"JWT Token": "Token JWT",
+	"JWT Expiration": "Expiración del JSON Web Token (JWT)",
+	"JWT Token": "JSON Web Token",
 	"Kagi Search API Key": "Clave API de Kagi Search",
 	"Keep Alive": "Mantener Vivo",
 	"Key": "Clave",
@@ -648,19 +666,20 @@
 	"Kokoro.js Dtype": "Kokoro.js DType",
 	"Label": "Etiqueta",
 	"Landing Page Mode": "Modo Página Inicial",
-	"Language": "Lenguaje",
+	"Language": "Idioma",
+	"Language Locales": "",
 	"Last Active": "Última Actividad",
 	"Last Modified": "Último Modificación",
 	"Last reply": "Última Respuesta",
 	"LDAP": "LDAP",
 	"LDAP server updated": "Servidor LDAP actualizado",
 	"Leaderboard": "Tabla Clasificatoria",
-	"Learn more about OpenAPI tool servers.": "",
+	"Learn more about OpenAPI tool servers.": "Saber más sobre los servidores de herramientas OpenAPI",
 	"Leave empty for unlimited": "Dejar vacío para ilimitado",
 	"Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "Dejar vacío para incluir todos los modelos desde el endpoint \"{{url}}/api/tags\"",
 	"Leave empty to include all models from \"{{url}}/models\" endpoint": "Dejar vacío para incluir todos los modelos desde el endpoint \"{{url}}/models\"",
 	"Leave empty to include all models or select specific models": "Dejar vacío para incluir todos los modelos o Seleccionar modelos específicos",
-	"Leave empty to use the default prompt, or enter a custom prompt": "Dejar vacío para usar el indicador(prompt) predeterminado, o Ingresar un indicador(prompt) personalizado",
+	"Leave empty to use the default prompt, or enter a custom prompt": "Dejar vacío para usar el indicador predeterminado, o Ingresar un indicador personalizado",
 	"Leave model field empty to use the default model.": "Dejar vacío el campo modelo para usar el modelo predeterminado.",
 	"License": "Licencia",
 	"Light": "Claro",
@@ -676,7 +695,7 @@
 	"Lost": "Perdido",
 	"LTR": "LTR",
 	"Made by Open WebUI Community": "Creado por la Comunidad Open-WebUI",
-	"Make sure to enclose them with": "Asegúrate de adjuntarlos con",
+	"Make sure to enclose them with": "Asegúrate de delimitarlos con",
 	"Make sure to export a workflow.json file as API format from ComfyUI.": "Asegúrate de exportar un archivo workflow.json en formato API desde ComfyUI.",
 	"Manage": "Gestionar",
 	"Manage Direct Connections": "Gestionar Conexiones Directas",
@@ -700,14 +719,13 @@
 	"Memory updated successfully": "Memoria actualizada correctamente",
 	"Merge Responses": "Fusionar Respuestas",
 	"Message rating should be enabled to use this feature": "Para usar esta función debe estar habilitada la calificación de mensajes",
-	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Los mensajes que envíe después de la creación del enlace no se compartirán. Los usuarios con la URL del enlace podrán ver el chat compartido.",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Los mensajes que envíe después de la creación del enlace no se compartirán. L@s usuari@s con la URL del enlace podrán ver el chat compartido.",
 	"Min P": "Min P",
-	"Minimum Score": "Puntuación Mínima",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"Mistral OCR": "",
-	"Mistral OCR API Key required.": "",
+	"Mistral OCR": "OCR Mistral",
+	"Mistral OCR API Key required.": "Clave API de Mistral OCR requerida",
 	"Model": "Modelo",
 	"Model '{{modelName}}' has been successfully downloaded.": "Modelo '{{modelName}}' se ha descargado correctamente.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Modelo '{{modelTag}}' ya está en cola para descargar.",
@@ -759,15 +777,15 @@
 	"No results found": "No se encontraron resultados",
 	"No search query generated": "No se generó ninguna consulta de búsqueda",
 	"No source available": "No hay fuente disponible",
-	"No users were found.": "No se encontraron usuarios.",
+	"No users were found.": "No se encontraron usuari@s.",
 	"No valves to update": "No hay válvulas para actualizar",
 	"None": "Ninguno",
 	"Not factually correct": "No es correcto en todos los aspectos",
 	"Not helpful": "No aprovechable",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Si estableces una puntuación mínima, la búsqueda sólo devolverá documentos con una puntuación mayor o igual a la puntuación mínima establecida.",
 	"Notes": "Notas",
-	"Notification Sound": "Notificación Sonido",
-	"Notification Webhook": "Notificación EngancheWeb(webhook)",
+	"Notification Sound": "Notificación Sonora",
+	"Notification Webhook": "Notificación Enganchada (webhook)",
 	"Notifications": "Notificaciones",
 	"November": "Noviembre",
 	"num_gpu (Ollama)": "num_gpu (capas Ollama)",
@@ -786,7 +804,7 @@
 	"Only alphanumeric characters and hyphens are allowed": "Sólo están permitidos caracteres alfanuméricos y guiones",
 	"Only alphanumeric characters and hyphens are allowed in the command string.": "Sólo están permitidos en la cadena de comandos caracteres alfanuméricos y guiones.",
 	"Only collections can be edited, create a new knowledge base to edit/add documents.": "Solo se pueden editar las colecciones, para añadir/editar documentos hay que crear una nueva base de conocimientos",
-	"Only select users and groups with permission can access": "Solo pueden acceder los usuarios y grupos con permiso",
+	"Only select users and groups with permission can access": "Solo pueden acceder l@s usuari@s y grupos con permiso",
 	"Oops! Looks like the URL is invalid. Please double-check and try again.": "¡vaya! Parece que la URL es inválida. Por favor, revisala y reintenta de nuevo.",
 	"Oops! There are files still uploading. Please wait for the upload to complete.": "¡vaya! Todavía hay archivos subiendose. Por favor, espera a que se complete la subida.",
 	"Oops! There was an error in the previous response.": "¡vaya! Hubo un error en la respuesta previa.",
@@ -794,7 +812,7 @@
 	"Open file": "Abrir archivo",
 	"Open in full screen": "Abrir en pantalla completa",
 	"Open new chat": "Abrir nuevo chat",
-	"Open WebUI can use tools provided by any OpenAPI server.": "",
+	"Open WebUI can use tools provided by any OpenAPI server.": "Open-WebUI puede usar herramientas proporcionadas por cualquier servidor OpenAPI",
 	"Open WebUI uses faster-whisper internally.": "Open-WebUI usa faster-whisper internamente.",
 	"Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Open-WebUI usa SpeechT5 y la incrustración de locutores de CMU Arctic.",
 	"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "La versión de Open-WebUI (v{{OPEN_WEBUI_VERSION}}) es inferior a la versión  (v{{REQUIRED_VERSION}}) requerida",
@@ -804,16 +822,16 @@
 	"OpenAI API Key is required.": "Clave API de OpenAI requerida.",
 	"OpenAI API settings updated": "Ajustes de API OpenAI actualizados",
 	"OpenAI URL/Key required.": "URL/Clave de OpenAI requerida.",
-	"openapi.json Path": "",
+	"openapi.json Path": "Ruta a openapi.json",
 	"or": "o",
-	"Organize your users": "Organiza tus usuarios",
+	"Organize your users": "Organiza tus usuari@s",
 	"Other": "Otro",
 	"OUTPUT": "SALIDA",
 	"Output format": "Formato de salida",
 	"Overview": "Vista General",
 	"page": "página",
 	"Password": "Contraseña",
-	"Paste Large Text as File": "Pegar el texto largo como archivo",
+	"Paste Large Text as File": "Pegar el Texto Largo como Archivo",
 	"PDF document (.pdf)": "Documento PDF (.pdf)",
 	"PDF Extract Images (OCR)": "Extraer imágenes del PDF (OCR)",
 	"pending": "pendiente",
@@ -829,15 +847,17 @@
 	"Pipeline deleted successfully": "Tubería borrada correctamente",
 	"Pipeline downloaded successfully": "Tubería descargada correctamente",
 	"Pipelines": "Tuberías",
-	"Pipelines Not Detected": "Tuberías(pipelines) No Detectada",
+	"Pipelines Not Detected": "Servicio de Tuberías (Pipelines) No Detectado",
 	"Pipelines Valves": "Válvulas de Tuberías",
 	"Plain text (.txt)": "Texto plano (.txt)",
-	"Playground": "Recreo",
+	"Playground": "Zona de Pruebas",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "Por favor revisar cuidadosamente los siguientes avisos:",
 	"Please do not close the settings page while loading the model.": "Por favor no cerrar la página de ajustes mientras se está descargando el modelo.",
-	"Please enter a prompt": "Por favor ingresar un indicador(prompt)",
-	"Please enter a valid path": "",
-	"Please enter a valid URL": "",
+	"Please enter a prompt": "Por favor ingresar un indicador",
+	"Please enter a valid path": "Por favor, ingresa una ruta válida",
+	"Please enter a valid URL": "Por favor, ingresa una URL válida",
 	"Please fill in all fields.": "Por favor rellenar todos los campos.",
 	"Please select a model first.": "Por favor primero seleccionar un modelo.",
 	"Please select a model.": "Por favor seleccionar un modelo.",
@@ -851,20 +871,20 @@
 	"Previous 7 days": "7 días previos",
 	"Private": "Privado",
 	"Profile Image": "Imagen del Perfil",
-	"Prompt": "Indicador(prompt)",
-	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Indicador(prompt) (p.ej. Cuéntame una cosa divertida sobre el Imperio Romano)",
-	"Prompt Autocompletion": "Autocompletado del Indicador(prompt)",
-	"Prompt Content": "Contenido del Indicador(prompt)",
-	"Prompt created successfully": "Indicador(prompt) creado exitosamente",
-	"Prompt suggestions": "Indicadores(prompts) Sugeridos",
-	"Prompt updated successfully": "Indicador(prompt) actualizado correctamente",
-	"Prompts": "Indicadores(prompts)",
-	"Prompts Access": "Acceso a Indicadores(prompts)",
+	"Prompt": "Indicador",
+	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Indicador (p.ej. Cuéntame una cosa divertida sobre el Imperio Romano)",
+	"Prompt Autocompletion": "Autocompletado del Indicador",
+	"Prompt Content": "Contenido del Indicador",
+	"Prompt created successfully": "Indicador creado exitosamente",
+	"Prompt suggestions": "Indicadores Sugeridos",
+	"Prompt updated successfully": "Indicador actualizado correctamente",
+	"Prompts": "Indicadores",
+	"Prompts Access": "Acceso a Indicadores",
 	"Prompts Public Sharing": "",
 	"Public": "Público",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Extraer \"{{searchValue}}\" desde Ollama.com",
 	"Pull a model from Ollama.com": "Extraer un modelo desde Ollama.com",
-	"Query Generation Prompt": "Consulta de Generación del Indicador(prompt)",
+	"Query Generation Prompt": "Indicador para la Consulta de Generación",
 	"RAG Template": "Plantilla del RAG",
 	"Rating": "Calificación",
 	"Re-rank models by topic similarity": "Reclasificar modelos por similitud temática",
@@ -874,19 +894,20 @@
 	"Record voice": "Grabar voz",
 	"Redirecting you to Open WebUI Community": "Redireccionando a la Comunidad 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.": "Reduce la probabilidad de generación sin sentido. Un valor más alto (p.ej. 100) dará respuestas más diversas, mientras que un valor más bajo (p.ej. 10) será más conservador.",
-	"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Referir a ti mismo como \"Usuario\" (p.ej. \"Usuario está aprendiendo Español\")",
+	"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Referir a ti mismo como \"Usuari@\" (p.ej. \"Usuari@ está aprendiendo Español\")",
 	"References from": "Referencias desde",
 	"Refused when it shouldn't have": "Rechazado cuando no debería haberlo hecho",
 	"Regenerate": "Regenerar",
-	"Reindex": "",
-	"Reindex Knowledge Base Vectors": "",
+	"Reindex": "Reindexar",
+	"Reindex Knowledge Base Vectors": "Reindexar Base Vectorial de Conocimiento",
 	"Release Notes": "Notas de la Versión",
 	"Relevance": "Relevancia",
+	"Relevance Threshold": "",
 	"Remove": "Eliminar",
 	"Remove Model": "Eliminar Modelo",
 	"Rename": "Renombrar",
 	"Reorder Models": "Reordenar Modelos",
-	"Repeat Last N": "Repetir Últimas N",
+	"Repeat Last N": "Repetición - Últimos N",
 	"Repeat Penalty (Ollama)": "Penalización Repetición (Ollama)",
 	"Reply in Thread": "Responder en Hilo",
 	"Request Mode": "Modo de Petición",
@@ -930,8 +951,8 @@
 	"Search Knowledge": "Buscar Conocimiento",
 	"Search Models": "Buscar Modelos",
 	"Search options": "Opciones de Búsqueda",
-	"Search Prompts": "Buscar Indicadores(prompts)",
-	"Search Result Count": "Recuento de resultados de búsqueda",
+	"Search Prompts": "Buscar Indicadores",
+	"Search Result Count": "Número de resultados de la búsqueda",
 	"Search the internet": "Buscar en internet",
 	"Search Tools": "Buscar Herramientas",
 	"SearchApi API Key": "Clave API de SearchApi",
@@ -986,7 +1007,7 @@
 	"Set whisper model": "Establecer modelo whisper (transcripción)",
 	"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "Establece un sesgo plano contra los tokens que han aparecido al menos una vez. Un valor más alto (p.ej. 1.5) penalizará las repeticiones más fuertemente, mientras que un valor más bajo (p.ej. 0.9) será más indulgente. En 0, está deshabilitado.",
 	"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "Establece un sesgo escalado contra los tokens para penalizar las repeticiones, basado en cuántas veces han aparecido. Un valor más alto (por ejemplo, 1.5) penalizará las repeticiones más fuertemente, mientras que un valor más bajo (por ejemplo, 0.9) será más indulgente. En 0, está deshabilitado.",
-	"Sets how far back for the model to look back to prevent repetition.": "Establece cuánto debe mirar atrás el modelo para prevenir la repetición.",
+	"Sets how far back for the model to look back to prevent repetition.": "Establece cuántos tokens debe mirar atrás el modelo para prevenir la repetición. ",
 	"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "Establece la semilla de números aleatorios a usar para la generación. Establecer esto en un número específico hará que el modelo genere el mismo texto para el mismo indicador(prompt).",
 	"Sets the size of the context window used to generate the next token.": "Establece el tamaño de la ventana del contexto utilizada para generar el siguiente token.",
 	"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Establece las secuencias de parada a usar. Cuando se encuentre este patrón, el LLM dejará de generar texto y retornará. Se pueden establecer varios patrones de parada especificando separadamente múltiples parámetros de parada en un archivo de modelo.",
@@ -998,7 +1019,7 @@
 	"Sharing Permissions": "",
 	"Show": "Mostrar",
 	"Show \"What's New\" modal on login": "Mostrar modal \"Qué hay de Nuevo\" al iniciar sesión",
-	"Show Admin Details in Account Pending Overlay": "Mostrar Detalles Admin en la Sobrecapa Cuenta Pendiente",
+	"Show Admin Details in Account Pending Overlay": "Mostrar Detalles Admin en la sobrecapa de 'Cuenta Pendiente'",
 	"Show Model": "",
 	"Show shortcuts": "Mostrar Atajos",
 	"Show your support!": "¡Muestra tu apoyo!",
@@ -1011,15 +1032,17 @@
 	"Sign up to {{WEBUI_NAME}}": "Crear una Cuenta en {{WEBUI_NAME}}",
 	"Signing in to {{WEBUI_NAME}}": "Iniciando Sesión en {{WEBUI_NAME}}",
 	"sk-1234": "sk-1234",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Fuente",
 	"Speech Playback Speed": "Velocidad de Reproducción de Voz",
 	"Speech recognition error: {{error}}": "Error en reconocimiento de voz: {{error}}",
 	"Speech-to-Text Engine": "Motor Voz a Texto(STT)",
 	"Stop": "Detener",
-	"Stop Sequence": "Detener Secuencia",
-	"Stream Chat Response": "Transmitir Respuesta del Chat",
+	"Stop Sequence": "Secuencia de Parada",
+	"Stream Chat Response": "Transmisión Directa de la  Respuesta del Chat",
 	"STT Model": "Modelo STT",
-	"STT Settings": "Ajustes STT",
+	"STT Settings": "Ajustes Voz a Texto (STT)",
 	"Subtitle (e.g. about the Roman Empire)": "Subtítulo (p.ej. sobre el Imperio Romano)",
 	"Success": "Correcto",
 	"Successfully updated.": "Actualizado correctamente.",
@@ -1029,15 +1052,16 @@
 	"Sync directory": "Sincroniza Directorio",
 	"System": "Sistema",
 	"System Instructions": "Instrucciones del sistema",
-	"System Prompt": "Indicador(prompt) del sistema",
+	"System Prompt": "Indicador del sistema",
 	"Tags": "Etiquetas",
 	"Tags Generation": "Generación de Etiquetas",
-	"Tags Generation Prompt": "Indicador(prompt) para la Generación de Etiquetas",
+	"Tags Generation Prompt": "Indicador para la Generación de Etiquetas",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "El Muestreo de cola libre(TFS_Z) es usado para reducir el impacto de los tokens menos probables en la salida. Un valor más alto (p.ej. 2.0) reduce más fuertemente el impacto, mientras que un valor de 1.0 deshabilita este ajuste.",
 	"Talk to model": "Hablar con el modelo",
 	"Tap to interrupt": "Toca para interrumpir",
 	"Tasks": "Tareas",
 	"Tavily API Key": "Clave API de Tavily",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Dinos algo más:",
 	"Temperature": "Temperatura",
 	"Template": "Plantilla",
@@ -1047,12 +1071,12 @@
 	"Tfs Z": "TFS Z",
 	"Thanks for your feedback!": "¡Gracias por tu realimentación!",
 	"The Application Account DN you bind with for search": "Cuenta DN de la aplicación vinculada para búsqueda",
-	"The base to search for users": "La base para buscar usuarios",
+	"The base to search for users": "La base para buscar usuari@s",
 	"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.": "El tamaño de lote determina cuántas solicitudes de texto se procesan juntas de una vez. Un tamaño de lote más alto puede aumentar el rendimiento y la velocidad del modelo, pero también requiere más memoria.",
 	"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "L@s desarrolladores de este complemento son apasionad@s voluntari@s de la comunidad. Si este complemento te es útil, por favor considera contribuir a su desarrollo.",
 	"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "La tabla clasificatoria de evaluación se basa en el sistema de clasificación Elo y se actualiza en tiempo real.",
-	"The LDAP attribute that maps to the mail that users use to sign in.": "El atributo LDAP que mapea el correo que los usuarios utilizan para iniciar sesión.",
-	"The LDAP attribute that maps to the username that users use to sign in.": "El atributo LDAP que mapea el nombre de usuario que los usuarios utilizan para iniciar sesión.",
+	"The LDAP attribute that maps to the mail that users use to sign in.": "El atributo LDAP que mapea el correo que l@s usuari@s utilizan para iniciar sesión.",
+	"The LDAP attribute that maps to the username that users use to sign in.": "El atributo LDAP que mapea el nombre de usuari@ que l@s usuari@s utilizan para iniciar sesión.",
 	"The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "La tabla clasificatoria está actualmente en beta, por lo que los cálculos de clasificación pueden reajustarse a medida que se refina el algoritmo.",
 	"The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "El tamaño máximo del archivo en MB. Si el tamaño del archivo supera este límite, el archivo no se subirá.",
 	"The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "El número máximo de archivos que se pueden utilizar a la vez en el chat. Si se supera este límite, los archivos no se subirán.",
@@ -1062,10 +1086,10 @@
 	"Thinking...": "Pensando...",
 	"This action cannot be undone. Do you wish to continue?": "Esta acción no se puede deshacer. ¿Desea continuar?",
 	"This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Este canal fue creado el {{createdAt}}. Este es el comienzo del canal {{channelName}}.",
-	"This chat won’t appear in history and your messages will not be saved.": "",
+	"This chat won’t appear in history and your messages will not be saved.": "Este chat no aparecerá en el historial y los mensajes no se guardarán.",
 	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Esto garantiza que sus valiosas conversaciones se guardan de forma segura en tu base de datos del servidor trasero (backend). ¡Gracias!",
 	"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Esta es una característica experimental, por lo que puede no funcionar como se esperaba y está sujeta a cambios en cualquier momento.",
-	"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "Esta opción controla cuántos tokens se conservan cuando se actualiza el contexto. Por ejemplo, si se establece en 2, se conservarán los últimos 2 tokens del contexto de la conversación. Conservar el contexto puede ayudar a mantener la continuidad de una conversación, pero puede reducir la habilidad para responder a nuevos temas.",
+	"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.": "Esta opción controla cuántos tokens se conservan cuando se actualiza el contexto. Por ejemplo, si se establece en 2, se conservarán los primeros 2 tokens del contexto de la conversación. Conservar el contexto puede ayudar a mantener la continuidad de una conversación, pero puede reducir la habilidad para responder a nuevos temas.",
 	"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.": "Esta opción establece el número máximo de tokens que el modelo puede generar en sus respuestas. Aumentar este límite permite al modelo proporcionar respuestas más largas, pero también puede aumentar la probabilidad de que se genere contenido inútil o irrelevante.",
 	"This option will delete all existing files in the collection and replace them with newly uploaded files.": "Esta opción eliminará todos los archivos existentes en la colección y los reemplazará con los nuevos archivos subidos.",
 	"This response was generated by \"{{model}}\"": "Esta respuesta fue generada por \"{{model}}\"",
@@ -1086,11 +1110,11 @@
 	"Title Auto-Generation": "AutoGeneración de Títulos",
 	"Title cannot be an empty string.": "El título no puede ser una cadena vacía.",
 	"Title Generation": "Generación de Títulos",
-	"Title Generation Prompt": "Indicador(prompt) para la Generación de Título",
+	"Title Generation Prompt": "Indicador para la Generación de Título",
 	"TLS": "TLS",
 	"To access the available model names for downloading,": "Para acceder a los nombres de modelos disponibles para descargar,",
 	"To access the GGUF models available for downloading,": "Para acceder a los modelos GGUF disponibles para descargar,",
-	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Para acceder a WebUI, por favor contacte con Admins. L@s administradores pueden gestionar los estados de l@s usuarios desde el panel de administración.",
+	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Para acceder a WebUI, por favor contacte con Admins. L@s administradores pueden gestionar los estados de l@s usuari@s esde el panel de administración.",
 	"To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Para adjuntar la base de conocimientos aquí, primero añadirla a \"Conocimiento\" en el área de trabajo.",
 	"To learn more about available endpoints, visit our documentation.": "Para aprender más sobre los endpoints disponibles, visite nuestra documentación.",
 	"To protect your privacy, only ratings, model IDs, tags, and metadata are shared from your feedback—your chat logs remain private and are not included.": "Para proteger tu privacidad, de tu realimentación solo se comparten las calificaciones, IDs de modelo, etiquetas y metadatos; tus chat registrados permanecen privados y no se incluyen.",
@@ -1110,12 +1134,12 @@
 	"Tool ID": "ID de la Herramienta",
 	"Tool imported successfully": "Herramienta importada correctamente",
 	"Tool Name": "Nombre de la Herramienta",
-	"Tool Servers": "",
+	"Tool Servers": "Servidores de Herraientas",
 	"Tool updated successfully": "Herramienta actualizada correctamente",
 	"Tools": "Herramientas",
 	"Tools Access": "Acceso a Herramientas",
 	"Tools are a function calling system with arbitrary code execution": "Las herramientas son un sistema de llamada de funciones con ejecución de código arbitrario",
-	"Tools Function Calling Prompt": "Indicador(prompt) para la Función de Llamada a las Herramientas",
+	"Tools Function Calling Prompt": "Indicador para la Función de Llamada a las Herramientas",
 	"Tools have a function calling system that allows arbitrary code execution": "Las herramientas tienen un sistema de llamadas de funciones que permite la ejecución de código arbitrario",
 	"Tools have a function calling system that allows arbitrary code execution.": "Las herramientas tienen un sistema de llamada de funciones que permite la ejecución de código arbitrario.",
 	"Tools Public Sharing": "",
@@ -1125,9 +1149,9 @@
 	"Transformers": "Transformadores",
 	"Trouble accessing Ollama?": "¿Problemas para acceder a Ollama?",
 	"Trust Proxy Environment": "Entorno Proxy Confiable",
-	"TTS Model": "TTS Modelo",
-	"TTS Settings": "TTS Ajustes",
-	"TTS Voice": "TTS Voz",
+	"TTS Model": "Modelo TTS",
+	"TTS Settings": "Ajustes Texto a Voz (TTS)",
+	"TTS Voice": "Voz TTS",
 	"Type": "Tipo",
 	"Type Hugging Face Resolve (Download) URL": "Escribir la URL de Hugging Face Resolve (Descarga)",
 	"Uh-oh! There was an issue with the response.": "¡Vaya! Hubo un problema con la respuesta.",
@@ -1156,20 +1180,20 @@
 	"Upload Progress": "Progreso de la Subida",
 	"URL": "URL",
 	"URL Mode": "Modo URL",
-	"Use '#' in the prompt input to load and include your knowledge.": "Utilizar '#' en el indicador(prompt) para cargar e incluir tu conocimiento.",
+	"Use '#' in the prompt input to load and include your knowledge.": "Utilizar '#' en el indicador para cargar e incluir tu conocimiento.",
 	"Use Gravatar": "Usar Gravatar",
-	"Use groups to group your users and assign permissions.": "Usar grupos para agrupar a usuarios y asignar permisos.",
+	"Use groups to group your users and assign permissions.": "Usar grupos para agrupar a usuari@s y asignar permisos.",
 	"Use Initials": "Usar Iniciales",
-	"Use no proxy to fetch page contents.": "",
-	"Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "",
+	"Use no proxy to fetch page contents.": "No usar proxy para extraer contenidos",
+	"Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "Usar el proxy asignado en las variables del entorno http_proxy y/o https_proxy para extraer contenido",
 	"use_mlock (Ollama)": "use_mlock (Ollama)",
 	"use_mmap (Ollama)": "use_mmap (Ollama)",
-	"user": "usuario",
-	"User": "Usuario",
-	"User location successfully retrieved.": "Ubicación del usuario obtenida correctamente.",
-	"User Webhooks": "Usuario EnganchesWeb(webhooks)",
-	"Username": "Nombre de Usuario",
-	"Users": "Usuarios",
+	"user": "usuari@",
+	"User": "Usuari@",
+	"User location successfully retrieved.": "Ubicación de usuari@ obtenida correctamente.",
+	"User Webhooks": "Usuari@ EnganchesWeb(webhooks)",
+	"Username": "Nombre de Usuari@",
+	"Users": "Usuari@s",
 	"Using the default arena model with all models. Click the plus button to add custom models.": "Usando el modelo de arena predeterminado con todos los modelos. Pulsar en el botón + para agregar modelos personalizados.",
 	"Utilize": "Utilizar",
 	"Valid time units:": "Unidades de tiempo válidas:",
@@ -1177,8 +1201,9 @@
 	"Valves updated": "Válvulas actualizadas",
 	"Valves updated successfully": "Válvulas actualizados correctamente",
 	"variable": "variable",
-	"variable to have them replaced with clipboard content.": "variable para ser reemplazada con el contenido del portapapeles.",
+	"variable to have them replaced with clipboard content.": "hace que la variable sea reemplazada con el contenido del portapapeles.",
 	"Verify Connection": "Verificar Conexión",
+	"Verify SSL Certificate": "",
 	"Version": "Versión",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Versión {{selectedVersion}} de {{totalVersions}}",
 	"View Replies": "Ver Respuestas",
@@ -1188,16 +1213,17 @@
 	"Voice Input": "Entrada de Voz",
 	"Warning": "Aviso",
 	"Warning:": "Aviso:",
-	"Warning: Enabling this will allow users to upload arbitrary code on the server.": "Aviso: Habilitar esto permitirá a los usuarios subir código arbitrario al servidor.",
+	"Warning: Enabling this will allow users to upload arbitrary code on the server.": "Aviso: Habilitar esto permitirá a l@s usuari@s subir código arbitrario al servidor.",
 	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Aviso: Si actualizas o cambias el modelo de incrustacción, necesitarás re-importar todos los documentos.",
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Aviso: La ejecución Jupyter habilita la ejecución de código arbitrario, planteando graves riesgos de seguridad; Proceder con extrema precaución.",
 	"Web": "Web",
 	"Web API": "API Web",
+	"Web Loader Engine": "",
 	"Web Search": "Búsqueda Web",
 	"Web Search Engine": "Motor Búsqueda Web",
 	"Web Search in Chat": "Búsqueda Web en Chat",
 	"Web Search Query Generation": "Generación de Consulta Búsqueda Web",
-	"Webhook URL": "URL EngancheWeb(Webhook)",
+	"Webhook URL": "URL EnganchesWeb(Webhook)",
 	"WebUI Settings": "WebUI Ajustes",
 	"WebUI URL": "WebUI URL",
 	"WebUI will make requests to \"{{url}}\"": "",
@@ -1206,7 +1232,7 @@
 	"What are you trying to achieve?": "¿Qué estás tratando de conseguir?",
 	"What are you working on?": "¿En qué estás trabajando?",
 	"What’s New in": "Que hay de Nuevo en",
-	"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "Cuando está habilitado, el modelo responderá a cada mensaje de chat en tiempo real, generando una respuesta tan pronto como el usuario envíe un mensaje. Este modo es útil para aplicaciones de chat en vivo, pero puede afectar al rendimiento en equipos más lentos.",
+	"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "Cuando está habilitado, el modelo responderá a cada mensaje de chat en tiempo real, generando una respuesta tan pronto como se envíe un mensaje. Este modo es útil para aplicaciones de chat en vivo, pero puede afectar al rendimiento en equipos más lentos.",
 	"wherever you are": "dondequiera que estés",
 	"Whisper (Local)": "Whisper (Local)",
 	"Why?": "¿Por qué?",
@@ -1216,7 +1242,7 @@
 	"Workspace": "Espacio de Trabajo",
 	"Workspace Permissions": "Permisos del Espacio de Trabajo",
 	"Write": "Escribir",
-	"Write a prompt suggestion (e.g. Who are you?)": "Escribe una sugerencia de Indicador(prompt) (p.ej. ¿quién eres?)",
+	"Write a prompt suggestion (e.g. Who are you?)": "Escribe una sugerencia de indicador (p.ej. ¿quién eres?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Escribe un resumen en 50 palabras que resuma [tema o palabra clave].",
 	"Write something...": "Escribe algo...",
 	"Write your model template content here": "Escribe el contenido de la plantilla de tu modelo aquí",

+ 28 - 2
src/lib/i18n/locales/et-EE/translation.json

@@ -57,13 +57,17 @@
 	"All": "Kõik",
 	"All Documents": "Kõik dokumendid",
 	"All models deleted successfully": "Kõik mudelid edukalt kustutatud",
+	"Allow Call": "",
 	"Allow Chat Controls": "Luba vestluse kontrollnupud",
 	"Allow Chat Delete": "Luba vestluse kustutamine",
 	"Allow Chat Deletion": "Luba vestluse kustutamine",
 	"Allow Chat Edit": "Luba vestluse muutmine",
 	"Allow File Upload": "Luba failide üleslaadimine",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Luba mitte-lokaalsed hääled",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "Luba ajutine vestlus",
+	"Allow Text to Speech": "",
 	"Allow User Location": "Luba kasutaja asukoht",
 	"Allow Voice Interruption in Call": "Luba hääle katkestamine kõnes",
 	"Allowed Endpoints": "Lubatud lõpp-punktid",
@@ -79,6 +83,7 @@
 	"and": "ja",
 	"and {{COUNT}} more": "ja veel {{COUNT}}",
 	"and create a new shared link.": "ja looge uus jagatud link.",
+	"Android": "",
 	"API Base URL": "API baas-URL",
 	"API Key": "API võti",
 	"API Key created.": "API võti loodud.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Brave Search API võti",
 	"By {{name}}": "Autor: {{name}}",
 	"Bypass Embedding and Retrieval": "Möödaminek sisestamisest ja taastamisest",
-	"Bypass SSL verification for Websites": "Möödaminek veebisaitide SSL-kontrollimisest",
 	"Calendar": "Kalender",
 	"Call": "Kõne",
 	"Call feature is not supported when using Web STT engine": "Kõnefunktsioon ei ole Web STT mootorit kasutades toetatud",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "Jagatud vestluse URL kopeeritud lõikelauale!",
 	"Copied to clipboard": "Kopeeritud lõikelauale",
 	"Copy": "Kopeeri",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Kopeeri viimane koodiplokk",
 	"Copy last response": "Kopeeri viimane vastus",
 	"Copy Link": "Kopeeri link",
@@ -303,6 +308,7 @@
 	"Deleted User": "Kustutatud kasutaja",
 	"Describe your knowledge base and objectives": "Kirjeldage oma teadmiste baasi ja eesmärke",
 	"Description": "Kirjeldus",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "Ei järginud täielikult juhiseid",
 	"Direct": "",
 	"Direct Connections": "Otsesed ühendused",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "nt minu_filter",
 	"e.g. my_tools": "nt minu_toriistad",
 	"e.g. Tools for performing various operations": "nt tööriistad mitmesuguste operatsioonide teostamiseks",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Muuda",
 	"Edit Arena Model": "Muuda Areena mudelit",
 	"Edit Channel": "Muuda kanalit",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "Sisestage dokumendi intelligentsuse võti",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "Sisestage domeenid komadega eraldatult (nt example.com,site.org)",
 	"Enter Exa API Key": "Sisestage Exa API võti",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Sisestage Github toorURL",
 	"Enter Google PSE API Key": "Sisestage Google PSE API võti",
 	"Enter Google PSE Engine Id": "Sisestage Google PSE mootori ID",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "Sisestage Mojeek Search API võti",
 	"Enter Number of Steps (e.g. 50)": "Sisestage sammude arv (nt 50)",
 	"Enter Perplexity API Key": "Sisestage Perplexity API võti",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "Sisestage puhverserveri URL (nt https://kasutaja:parool@host:port)",
 	"Enter reasoning effort": "Sisestage arutluspingutus",
 	"Enter Sampler (e.g. Euler a)": "Sisestage valimismeetod (nt Euler a)",
@@ -441,10 +452,13 @@
 	"Enter server host": "Sisestage serveri host",
 	"Enter server label": "Sisestage serveri silt",
 	"Enter server port": "Sisestage serveri port",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Sisestage lõpetamise järjestus",
 	"Enter system prompt": "Sisestage süsteemi vihjed",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Sisestage Tavily API võti",
+	"Enter Tavily Extract Depth": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Sisestage oma WebUI avalik URL. Seda URL-i kasutatakse teadaannetes linkide genereerimiseks.",
 	"Enter Tika Server URL": "Sisestage Tika serveri URL",
 	"Enter timeout in seconds": "Sisestage aegumine sekundites",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "Filter on nüüd globaalselt lubatud",
 	"Filters": "Filtrid",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Tuvastati sõrmejälje võltsimine: initsiaalide kasutamine avatarina pole võimalik. Kasutatakse vaikimisi profiilikujutist.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Suurte väliste vastuste tükkide sujuv voogedastus",
 	"Focus chat input": "Fokuseeri vestluse sisendile",
 	"Folder deleted successfully": "Kaust edukalt kustutatud",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Hübriidotsing",
 	"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.": "Kinnitan, et olen lugenud ja mõistan oma tegevuse tagajärgi. Olen teadlik suvalise koodi käivitamisega seotud riskidest ja olen kontrollinud allika usaldusväärsust.",
 	"ID": "ID",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "Süüta uudishimu",
 	"Image": "Pilt",
 	"Image Compression": "Pildi tihendamine",
@@ -649,6 +667,7 @@
 	"Label": "Silt",
 	"Landing Page Mode": "Maandumislehe režiim",
 	"Language": "Keel",
+	"Language Locales": "",
 	"Last Active": "Viimati aktiivne",
 	"Last Modified": "Viimati muudetud",
 	"Last reply": "Viimane vastus",
@@ -702,7 +721,6 @@
 	"Message rating should be enabled to use this feature": "Selle funktsiooni kasutamiseks peaks sõnumite hindamine olema lubatud",
 	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Teie saadetud sõnumeid pärast lingi loomist ei jagata. Kasutajad, kellel on URL, saavad vaadata jagatud vestlust.",
 	"Min P": "Min P",
-	"Minimum Score": "Minimaalne skoor",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Torustike klapid",
 	"Plain text (.txt)": "Lihttekst (.txt)",
 	"Playground": "Mänguväljak",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "Palun vaadake hoolikalt läbi järgmised hoiatused:",
 	"Please do not close the settings page while loading the model.": "Palun ärge sulgege seadete lehte mudeli laadimise ajal.",
 	"Please enter a prompt": "Palun sisestage vihje",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Väljalaskemärkmed",
 	"Relevance": "Asjakohasus",
+	"Relevance Threshold": "",
 	"Remove": "Eemalda",
 	"Remove Model": "Eemalda mudel",
 	"Rename": "Nimeta ümber",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "Registreeru {{WEBUI_NAME}}",
 	"Signing in to {{WEBUI_NAME}}": "Sisselogimine {{WEBUI_NAME}}",
 	"sk-1234": "sk-1234",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Allikas",
 	"Speech Playback Speed": "Kõne taasesituse kiirus",
 	"Speech recognition error: {{error}}": "Kõnetuvastuse viga: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Puuduta katkestamiseks",
 	"Tasks": "Ülesanded",
 	"Tavily API Key": "Tavily API võti",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Räägi meile lähemalt:",
 	"Temperature": "Temperatuur",
 	"Template": "Mall",
@@ -1179,6 +1203,7 @@
 	"variable": "muutuja",
 	"variable to have them replaced with clipboard content.": "muutuja, et need asendataks lõikelaua sisuga.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "Versioon",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Versioon {{selectedVersion}} / {{totalVersions}}",
 	"View Replies": "Vaata vastuseid",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Hoiatus: Jupyter täitmine võimaldab suvalise koodi käivitamist, mis kujutab endast tõsist turvariski - jätkake äärmise ettevaatusega.",
 	"Web": "Veeb",
 	"Web API": "Veebi API",
+	"Web Loader Engine": "",
 	"Web Search": "Veebiotsing",
 	"Web Search Engine": "Veebi otsingumootor",
 	"Web Search in Chat": "Veebiotsing vestluses",

+ 28 - 2
src/lib/i18n/locales/eu-ES/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "Dokumentu Guztiak",
 	"All models deleted successfully": "Eredu guztiak ongi ezabatu dira",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "Baimendu Txata Ezabatzea",
 	"Allow Chat Deletion": "Baimendu Txata Ezabatzea",
 	"Allow Chat Edit": "Baimendu Txata Editatzea",
 	"Allow File Upload": "Baimendu Fitxategiak Igotzea",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Baimendu urruneko ahotsak",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "Baimendu Behin-behineko Txata",
+	"Allow Text to Speech": "",
 	"Allow User Location": "Baimendu Erabiltzailearen Kokapena",
 	"Allow Voice Interruption in Call": "Baimendu Ahots Etena Deietan",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "eta",
 	"and {{COUNT}} more": "eta {{COUNT}} gehiago",
 	"and create a new shared link.": "eta sortu partekatutako esteka berri bat.",
+	"Android": "",
 	"API Base URL": "API Oinarri URLa",
 	"API Key": "API Gakoa",
 	"API Key created.": "API Gakoa sortu da.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Brave Bilaketa API Gakoa",
 	"By {{name}}": "{{name}}-k",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "Saihestu SSL egiaztapena Webguneentzat",
 	"Calendar": "",
 	"Call": "Deia",
 	"Call feature is not supported when using Web STT engine": "Dei funtzioa ez da onartzen Web STT motorra erabiltzean",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "Partekatutako txataren URLa arbelera kopiatu da!",
 	"Copied to clipboard": "Arbelera kopiatuta",
 	"Copy": "Kopiatu",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Kopiatu azken kode blokea",
 	"Copy last response": "Kopiatu azken erantzuna",
 	"Copy Link": "Kopiatu Esteka",
@@ -303,6 +308,7 @@
 	"Deleted User": "Ezabatutako Erabiltzailea",
 	"Describe your knowledge base and objectives": "Deskribatu zure ezagutza-basea eta helburuak",
 	"Description": "Deskribapena",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "Ez ditu jarraibideak guztiz jarraitu",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "adib. nire_iragazkia",
 	"e.g. my_tools": "adib. nire_tresnak",
 	"e.g. Tools for performing various operations": "adib. Hainbat eragiketa egiteko tresnak",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Editatu",
 	"Edit Arena Model": "Editatu Arena Eredua",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Sartu Github Raw URLa",
 	"Enter Google PSE API Key": "Sartu Google PSE API Gakoa",
 	"Enter Google PSE Engine Id": "Sartu Google PSE Motor IDa",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "Sartu Mojeek Bilaketa API Gakoa",
 	"Enter Number of Steps (e.g. 50)": "Sartu Urrats Kopurua (adib. 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "Sartu Sampler-a (adib. Euler a)",
@@ -441,10 +452,13 @@
 	"Enter server host": "Sartu zerbitzariaren ostalaria",
 	"Enter server label": "Sartu zerbitzariaren etiketa",
 	"Enter server port": "Sartu zerbitzariaren portua",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Sartu gelditze sekuentzia",
 	"Enter system prompt": "Sartu sistema prompta",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Sartu Tavily API Gakoa",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "Iragazkia orain globalki gaituta dago",
 	"Filters": "Iragazkiak",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Hatz-marka faltsutzea detektatu da: Ezin dira inizialak avatar gisa erabili. Profil irudi lehenetsia erabiliko da.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Modu jariagarrian transmititu kanpoko erantzun zati handiak",
 	"Focus chat input": "Fokuratu txataren sarrera",
 	"Folder deleted successfully": "Karpeta ongi ezabatu da",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Bilaketa Hibridoa",
 	"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.": "Onartzen dut irakurri dudala eta nire ekintzaren ondorioak ulertzen ditudala. Kode arbitrarioa exekutatzearekin lotutako arriskuez jabetzen naiz eta iturriaren fidagarritasuna egiaztatu dut.",
 	"ID": "IDa",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "Piztu jakin-mina",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "Etiketa",
 	"Landing Page Mode": "Hasiera Orriaren Modua",
 	"Language": "Hizkuntza",
+	"Language Locales": "",
 	"Last Active": "Azken Aktibitatea",
 	"Last Modified": "Azken Aldaketa",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"Message rating should be enabled to use this feature": "Mezuen balorazioa gaitu behar da funtzionalitate hau erabiltzeko",
 	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Esteka sortu ondoren bidaltzen dituzun mezuak ez dira partekatuko. URLa duten erabiltzaileek partekatutako txata ikusi ahal izango dute.",
 	"Min P": "Min P",
-	"Minimum Score": "Puntuazio minimoa",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Pipeline balbulak",
 	"Plain text (.txt)": "Testu laua (.txt)",
 	"Playground": "Jolaslekua",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "Mesedez, berrikusi arretaz hurrengo oharrak:",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "Mesedez, sartu prompt bat",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Bertsio oharrak",
 	"Relevance": "Garrantzia",
+	"Relevance Threshold": "",
 	"Remove": "Kendu",
 	"Remove Model": "Kendu modeloa",
 	"Rename": "Berrizendatu",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "Erregistratu {{WEBUI_NAME}}-n",
 	"Signing in to {{WEBUI_NAME}}": "{{WEBUI_NAME}}-n saioa hasten",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Iturria",
 	"Speech Playback Speed": "Ahots erreprodukzio abiadura",
 	"Speech recognition error: {{error}}": "Ahots ezagutze errorea: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Ukitu eteteko",
 	"Tasks": "",
 	"Tavily API Key": "Tavily API gakoa",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Kontatu gehiago:",
 	"Temperature": "Tenperatura",
 	"Template": "Txantiloia",
@@ -1179,6 +1203,7 @@
 	"variable": "aldagaia",
 	"variable to have them replaced with clipboard content.": "aldagaia arbeleko edukiarekin ordezkatzeko.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "Bertsioa",
 	"Version {{selectedVersion}} of {{totalVersions}}": "{{totalVersions}}-tik {{selectedVersion}}. bertsioa",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "Weba",
 	"Web API": "Web APIa",
+	"Web Loader Engine": "",
 	"Web Search": "Web bilaketa",
 	"Web Search Engine": "Web bilaketa motorra",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/fa-IR/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "همهٔ سند\u200cها",
 	"All models deleted successfully": "",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "",
 	"Allow Chat Deletion": "اجازهٔ حذف گفتگو",
 	"Allow Chat Edit": "",
 	"Allow File Upload": "",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "اجازهٔ گفتگوی موقتی",
+	"Allow Text to Speech": "",
 	"Allow User Location": "اجازهٔ موقعیت مکانی کاربر",
 	"Allow Voice Interruption in Call": "",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "و",
 	"and {{COUNT}} more": "و {{COUNT}} مورد دیگر",
 	"and create a new shared link.": "و یک پیوند اشتراک\u200cگذاری جدید ایجاد کنید.",
+	"Android": "",
 	"API Base URL": "نشانی پایهٔ API",
 	"API Key": "کلید API",
 	"API Key created.": "کلید API ساخته شد.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "کلید API جستجوی شجاع",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "عبور از تأیید SSL برای وب سایت ها",
 	"Calendar": "",
 	"Call": "",
 	"Call feature is not supported when using Web STT engine": "",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "URL چت به کلیپ بورد کپی شد!",
 	"Copied to clipboard": "به بریده\u200cدان کپی\u200cشد",
 	"Copy": "کپی",
+	"Copy Formatted Text": "",
 	"Copy last code block": "کپی آخرین بلوک کد",
 	"Copy last response": "کپی آخرین پاسخ",
 	"Copy Link": "کپی لینک",
@@ -303,6 +308,7 @@
 	"Deleted User": "",
 	"Describe your knowledge base and objectives": "",
 	"Description": "توضیحات",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "نمی تواند دستورالعمل را کامل پیگیری کند",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "ویرایش",
 	"Edit Arena Model": "",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "ادرس Github Raw را وارد کنید",
 	"Enter Google PSE API Key": "کلید API گوگل PSE را وارد کنید",
 	"Enter Google PSE Engine Id": "شناسه موتور PSE گوگل را وارد کنید",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "تعداد گام ها را وارد کنید (مثال: 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "توالی توقف را وارد کنید",
 	"Enter system prompt": "",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "",
 	"Filters": "",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "فانگ سرفیس شناسایی شد: نمی توان از نمایه شما به عنوان آواتار استفاده کرد. پیش فرض به عکس پروفایل پیش فرض برگشت داده شد.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "تکه های پاسخ خارجی بزرگ را به صورت سیال پخش کنید",
 	"Focus chat input": "فوکوس کردن ورودی گپ",
 	"Folder deleted successfully": "",
@@ -589,6 +605,8 @@
 	"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": "",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "",
 	"Language": "زبان",
+	"Language Locales": "",
 	"Last Active": "آخرین فعال",
 	"Last Modified": "",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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": "",
-	"Minimum Score": "نماد کمینه",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "شیرالات خطوط لوله",
 	"Plain text (.txt)": "متن ساده (.txt)",
 	"Playground": "زمین بازی",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "یادداشت\u200cهای انتشار",
 	"Relevance": "ارتباط",
+	"Relevance Threshold": "",
 	"Remove": "حذف",
 	"Remove Model": "حذف مدل",
 	"Rename": "تغییر نام",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "",
 	"Signing in to {{WEBUI_NAME}}": "",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "منبع",
 	"Speech Playback Speed": "",
 	"Speech recognition error: {{error}}": "خطای تشخیص گفتار: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "",
 	"Tasks": "",
 	"Tavily API Key": "",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "بیشتر بگویید:",
 	"Temperature": "دما",
 	"Template": "الگو",
@@ -1179,6 +1203,7 @@
 	"variable": "متغیر",
 	"variable to have them replaced with clipboard content.": "متغیر برای جایگزینی آنها با محتوای بریده\u200cدان.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "نسخه",
 	"Version {{selectedVersion}} of {{totalVersions}}": "نسخهٔ {{selectedVersion}} از {{totalVersions}}",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "وب",
 	"Web API": "",
+	"Web Loader Engine": "",
 	"Web Search": "جستجوی وب",
 	"Web Search Engine": "موتور جستجوی وب",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/fi-FI/translation.json

@@ -57,13 +57,17 @@
 	"All": "Kaikki",
 	"All Documents": "Kaikki asiakirjat",
 	"All models deleted successfully": "Kaikki mallit poistettu onnistuneesti",
+	"Allow Call": "",
 	"Allow Chat Controls": "Salli keskustelujen hallinta",
 	"Allow Chat Delete": "Salli keskustelujen poisto",
 	"Allow Chat Deletion": "Salli keskustelujen poisto",
 	"Allow Chat Edit": "Salli keskustelujen muokkaus",
 	"Allow File Upload": "Salli tiedostojen lataus",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Salli ei-paikalliset äänet",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "Salli väliaikaiset keskustelut",
+	"Allow Text to Speech": "",
 	"Allow User Location": "Salli käyttäjän sijainti",
 	"Allow Voice Interruption in Call": "Salli äänen keskeytys puhelussa",
 	"Allowed Endpoints": "Hyväksytyt päätepisteet",
@@ -79,6 +83,7 @@
 	"and": "ja",
 	"and {{COUNT}} more": "ja {{COUNT}} muuta",
 	"and create a new shared link.": "ja luo uusi jaettu linkki.",
+	"Android": "",
 	"API Base URL": "API:n verkko-osoite",
 	"API Key": "API-avain",
 	"API Key created.": "API-avain luotu.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Brave Search API -avain",
 	"By {{name}}": "Tekijä {{name}}",
 	"Bypass Embedding and Retrieval": "Ohita upotus ja haku",
-	"Bypass SSL verification for Websites": "Ohita SSL-varmennus verkkosivustoille",
 	"Calendar": "Kalenteri",
 	"Call": "Puhelu",
 	"Call feature is not supported when using Web STT engine": "Puhelutoimintoa ei tueta käytettäessä web-puheentunnistusmoottoria",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "Jaettu keskustelulinkki kopioitu leikepöydälle!",
 	"Copied to clipboard": "Kopioitu leikepöydälle",
 	"Copy": "Kopioi",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Kopioi viimeisin koodilohko",
 	"Copy last response": "Kopioi viimeisin vastaus",
 	"Copy Link": "Kopioi linkki",
@@ -303,6 +308,7 @@
 	"Deleted User": "Käyttäjä poistettu",
 	"Describe your knowledge base and objectives": "Kuvaa tietokantasi ja tavoitteesi",
 	"Description": "Kuvaus",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "Ei noudattanut ohjeita täysin",
 	"Direct": "Suora",
 	"Direct Connections": "Suorat yhteydet",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "esim. oma_suodatin",
 	"e.g. my_tools": "esim. omat_työkalut",
 	"e.g. Tools for performing various operations": "esim. työkaluja erilaisten toimenpiteiden suorittamiseen",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Muokkaa",
 	"Edit Arena Model": "Muokkaa Arena-mallia",
 	"Edit Channel": "Muokkaa kanavaa",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "Kirjoiuta asiakirja tiedustelun avain",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "Verkko-osoitteet erotetaan pilkulla (esim. esimerkki.com,sivu.org)",
 	"Enter Exa API Key": "Kirjoita Exa API -avain",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Kirjoita Github Raw -verkko-osoite",
 	"Enter Google PSE API Key": "Kirjoita Google PSE API -avain",
 	"Enter Google PSE Engine Id": "Kirjoita Google PSE -moottorin tunnus",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "Kirjoita Mojeek Search API -avain",
 	"Enter Number of Steps (e.g. 50)": "Kirjoita askelten määrä (esim. 50)",
 	"Enter Perplexity API Key": "Aseta Perplexity API-avain",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "Kirjoita välityspalvelimen verkko-osoite (esim. https://käyttäjä:salasana@host:portti)",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "Kirjoita näytteistäjä (esim. Euler a)",
@@ -441,10 +452,13 @@
 	"Enter server host": "Kirjoita palvelimen isäntänimi",
 	"Enter server label": "Kirjoita palvelimen tunniste",
 	"Enter server port": "Kirjoita palvelimen portti",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Kirjoita lopetussekvenssi",
 	"Enter system prompt": "Kirjoita järjestelmäkehote",
 	"Enter system prompt here": "Kirjoita järjestelmäkehote tähän",
 	"Enter Tavily API Key": "Kirjoita Tavily API -avain",
+	"Enter Tavily Extract Depth": "",
 	"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": "Aseta aikakatkaisu sekunneissa",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "Suodatin on nyt otettu käyttöön globaalisti",
 	"Filters": "Suodattimet",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Sormenjäljen väärentäminen havaittu: Alkukirjaimia ei voi käyttää avatarina. Käytetään oletusprofiilikuvaa.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Virtaa suuria ulkoisia vastausosia joustavasti",
 	"Focus chat input": "Fokusoi syöttökenttään",
 	"Folder deleted successfully": "Kansio poistettu onnistuneesti",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Hybridihaku",
 	"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.": "Vahvistan, että olen lukenut ja ymmärrän toimintani seuraukset. Olen tietoinen mielivaltaisen koodin suorittamiseen liittyvistä riskeistä ja olen varmistanut lähteen luotettavuuden.",
 	"ID": "Tunnus",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "Sytytä uteliaisuus",
 	"Image": "Kuva",
 	"Image Compression": "Kuvan pakkaus",
@@ -649,6 +667,7 @@
 	"Label": "Tunniste",
 	"Landing Page Mode": "Etusivun tila",
 	"Language": "Kieli",
+	"Language Locales": "",
 	"Last Active": "Viimeksi aktiivinen",
 	"Last Modified": "Viimeksi muokattu",
 	"Last reply": "Viimeksi vastattu",
@@ -702,7 +721,6 @@
 	"Message rating should be enabled to use this feature": "Tämän toiminnon käyttämiseksi viestiarviointi on otettava käyttöön",
 	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Linkin luomisen jälkeen lähettämäsi viestit eivät ole jaettuja. Käyttäjät, joilla on verkko-osoite, voivat tarkastella jaettua keskustelua.",
 	"Min P": "Min P",
-	"Minimum Score": "Vähimmäispisteet",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Putkistojen venttiilit",
 	"Plain text (.txt)": "Pelkkä teksti (.txt)",
 	"Playground": "Leikkipaikka",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "Tarkista huolellisesti seuraavat varoitukset:",
 	"Please do not close the settings page while loading the model.": "Älä sulje asetussivua mallin latautuessa.",
 	"Please enter a prompt": "Kirjoita kehote",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Julkaisutiedot",
 	"Relevance": "Relevanssi",
+	"Relevance Threshold": "",
 	"Remove": "Poista",
 	"Remove Model": "Poista malli",
 	"Rename": "Nimeä uudelleen",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "Rekisteröidy palveluun {{WEBUI_NAME}}",
 	"Signing in to {{WEBUI_NAME}}": "Kirjaudutaan sisään palveluun {{WEBUI_NAME}}",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Lähde",
 	"Speech Playback Speed": "Puhetoiston nopeus",
 	"Speech recognition error: {{error}}": "Puheentunnistusvirhe: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Napauta keskeyttääksesi",
 	"Tasks": "Tehtävät",
 	"Tavily API Key": "Tavily API -avain",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Kerro lisää:",
 	"Temperature": "Lämpötila",
 	"Template": "Malli",
@@ -1179,6 +1203,7 @@
 	"variable": "muuttuja",
 	"variable to have them replaced with clipboard content.": "muuttuja korvataan leikepöydän sisällöllä.",
 	"Verify Connection": "Tarkista yhteys",
+	"Verify SSL Certificate": "",
 	"Version": "Versio",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Versio {{selectedVersion}} / {{totalVersions}}",
 	"View Replies": "Näytä vastaukset",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Varoitus: Jupyter käyttö voi mahdollistaa mielivaltaiseen koodin suorittamiseen, mikä voi aiheuttaa tietoturvariskejä - käytä äärimmäisen varoen.",
 	"Web": "Web",
 	"Web API": "Web-API",
+	"Web Loader Engine": "",
 	"Web Search": "Verkkohaku",
 	"Web Search Engine": "Hakukoneet",
 	"Web Search in Chat": "Verkkohaku keskustelussa",

+ 28 - 2
src/lib/i18n/locales/fr-CA/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "Tous les documents",
 	"All models deleted successfully": "",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "",
 	"Allow Chat Deletion": "Autoriser la suppression de l'historique de chat",
 	"Allow Chat Edit": "",
 	"Allow File Upload": "",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Autoriser les voix non locales",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "",
+	"Allow Text to Speech": "",
 	"Allow User Location": "Autoriser l'emplacement de l'utilisateur",
 	"Allow Voice Interruption in Call": "Autoriser l'interruption vocale pendant un appel",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "et",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "et créer un nouveau lien partagé.",
+	"Android": "",
 	"API Base URL": "URL de base de l'API",
 	"API Key": "Clé d'API",
 	"API Key created.": "Clé d'API générée.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Clé API Brave Search",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "Bypasser la vérification SSL pour les sites web",
 	"Calendar": "",
 	"Call": "Appeler",
 	"Call feature is not supported when using Web STT engine": "La fonction d'appel n'est pas prise en charge lors de l'utilisation du moteur Web STT",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "URL du chat copiée dans le presse-papiers\u00a0!",
 	"Copied to clipboard": "",
 	"Copy": "Copie",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Copier le dernier bloc de code",
 	"Copy last response": "Copier la dernière réponse",
 	"Copy Link": "Copier le lien",
@@ -303,6 +308,7 @@
 	"Deleted User": "",
 	"Describe your knowledge base and objectives": "",
 	"Description": "Description",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "N'a pas entièrement respecté les instructions",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Modifier",
 	"Edit Arena Model": "",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Entrez l'URL brute de GitHub",
 	"Enter Google PSE API Key": "Entrez la clé API Google PSE",
 	"Enter Google PSE Engine Id": "Entrez l'identifiant du moteur Google PSE",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Entrez le nombre de pas (par ex. 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Entrez la séquence d'arrêt",
 	"Enter system prompt": "",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Entrez la clé API Tavily",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "Le filtre est désormais activé globalement",
 	"Filters": "Filtres",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Spoofing détecté : impossible d'utiliser les initiales comme avatar. Retour à l'image de profil par défaut.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Diffuser de manière fluide de larges portions de réponses externes",
 	"Focus chat input": "Se concentrer sur le chat en entrée",
 	"Folder deleted successfully": "",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Recherche hybride",
 	"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": "",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "",
 	"Language": "Langue",
+	"Language Locales": "",
 	"Last Active": "Dernière activité",
 	"Last Modified": "Dernière modification",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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.": "Les messages que vous envoyez après avoir créé votre lien ne seront pas partagés. Les utilisateurs disposant de l'URL pourront voir le chat partagé.",
 	"Min P": "",
-	"Minimum Score": "Score minimal",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Vannes de Pipelines",
 	"Plain text (.txt)": "Texte simple (.txt)",
 	"Playground": "Aire de jeux",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Notes de publication",
 	"Relevance": "",
+	"Relevance Threshold": "",
 	"Remove": "Retirer",
 	"Remove Model": "Retirer le modèle",
 	"Rename": "Renommer",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "",
 	"Signing in to {{WEBUI_NAME}}": "",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Source",
 	"Speech Playback Speed": "",
 	"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale\u00a0: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Appuyez pour interrompre",
 	"Tasks": "",
 	"Tavily API Key": "Clé API Tavily",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Dites-nous en plus à ce sujet : ",
 	"Temperature": "Température",
 	"Template": "Template",
@@ -1179,6 +1203,7 @@
 	"variable": "variable",
 	"variable to have them replaced with clipboard content.": "variable pour qu'elles soient remplacées par le contenu du presse-papiers.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "Version améliorée",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "Web",
 	"Web API": "API Web",
+	"Web Loader Engine": "",
 	"Web Search": "Recherche Web",
 	"Web Search Engine": "Moteur de recherche Web",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/fr-FR/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "Tous les documents",
 	"All models deleted successfully": "Tous les modèles ont été supprimés avec succès",
+	"Allow Call": "",
 	"Allow Chat Controls": "Autoriser les contrôles de chat",
 	"Allow Chat Delete": "Autoriser la suppression de la conversation",
 	"Allow Chat Deletion": "Autoriser la suppression de l'historique de chat",
 	"Allow Chat Edit": "Autoriser la modification de la conversation",
 	"Allow File Upload": "Autoriser le téléchargement de fichiers",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Autoriser les voix non locales",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "Autoriser le chat éphémère",
+	"Allow Text to Speech": "",
 	"Allow User Location": "Autoriser l'emplacement de l'utilisateur",
 	"Allow Voice Interruption in Call": "Autoriser l'interruption vocale pendant un appel",
 	"Allowed Endpoints": "Points de terminaison autorisés",
@@ -79,6 +83,7 @@
 	"and": "et",
 	"and {{COUNT}} more": "et {{COUNT}} autres",
 	"and create a new shared link.": "et créer un nouveau lien partagé.",
+	"Android": "",
 	"API Base URL": "URL de base de l'API",
 	"API Key": "Clé d'API",
 	"API Key created.": "Clé d'API générée.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Clé API Brave Search",
 	"By {{name}}": "Par {{name}}",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "Bypasser la vérification SSL pour les sites web",
 	"Calendar": "",
 	"Call": "Appeler",
 	"Call feature is not supported when using Web STT engine": "La fonction d'appel n'est pas prise en charge lors de l'utilisation du moteur Web STT",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "URL du chat copié dans le presse-papiers !",
 	"Copied to clipboard": "Copié dans le presse-papiers",
 	"Copy": "Copier",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Copier le dernier bloc de code",
 	"Copy last response": "Copier la dernière réponse",
 	"Copy Link": "Copier le lien",
@@ -303,6 +308,7 @@
 	"Deleted User": "Utilisateur supprimé",
 	"Describe your knowledge base and objectives": "Décrivez votre base de connaissances et vos objectifs",
 	"Description": "Description",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "N'a pas entièrement respecté les instructions",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "par ex. mon_filtre",
 	"e.g. my_tools": "par ex. mes_outils",
 	"e.g. Tools for performing various operations": "par ex. Outils pour effectuer diverses opérations",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Modifier",
 	"Edit Arena Model": "Modifier le modèle d'arène",
 	"Edit Channel": "Modifier le canal",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Entrez l'URL brute de GitHub",
 	"Enter Google PSE API Key": "Entrez la clé API Google PSE",
 	"Enter Google PSE Engine Id": "Entrez l'identifiant du moteur Google PSE",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "Entrez la clé API Mojeek",
 	"Enter Number of Steps (e.g. 50)": "Entrez le nombre d'étapes (par ex. 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "Entrez l'URL du proxy (par ex. https://use:password@host:port)",
 	"Enter reasoning effort": "Entrez l'effort de raisonnement",
 	"Enter Sampler (e.g. Euler a)": "Entrez le sampler (par ex. Euler a)",
@@ -441,10 +452,13 @@
 	"Enter server host": "Entrez l'hôte du serveur",
 	"Enter server label": "Entrez l'étiquette du serveur",
 	"Enter server port": "Entrez le port du serveur",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Entrez la séquence d'arrêt",
 	"Enter system prompt": "Entrez le prompt système",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Entrez la clé API Tavily",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "Le filtre est désormais activé globalement",
 	"Filters": "Filtres",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Spoofing détecté : impossible d'utiliser les initiales comme avatar. Retour à l'image de profil par défaut.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Streaming fluide de gros chunks de réponses externes",
 	"Focus chat input": "Mettre le focus sur le champ de chat",
 	"Folder deleted successfully": "Dossier supprimé avec succès",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Recherche hybride",
 	"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.": "Je reconnais avoir lu et compris les implications de mes actions. Je suis conscient des risques associés à l'exécution d'un code arbitraire et j'ai vérifié la fiabilité de la source.",
 	"ID": "ID",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "Éveiller la curiosité",
 	"Image": "Image",
 	"Image Compression": "Compression d'image",
@@ -649,6 +667,7 @@
 	"Label": "Étiquette",
 	"Landing Page Mode": "Mode de la page d'accueil",
 	"Language": "Langue",
+	"Language Locales": "",
 	"Last Active": "Dernière activité",
 	"Last Modified": "Dernière modification",
 	"Last reply": "Déernière réponse",
@@ -702,7 +721,6 @@
 	"Message rating should be enabled to use this feature": "L'évaluation des messages doit être activée pour pouvoir utiliser cette fonctionnalité",
 	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Les messages que vous envoyez après avoir créé votre lien ne seront pas partagés. Les utilisateurs disposant de l'URL pourront voir la conversation partagée.",
 	"Min P": "P min",
-	"Minimum Score": "Score minimal",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Vannes de pipelines",
 	"Plain text (.txt)": "Texte (.txt)",
 	"Playground": "Playground",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "Veuillez lire attentivement les avertissements suivants :",
 	"Please do not close the settings page while loading the model.": "Veuillez ne pas fermer les paramètres pendant le chargement du modèle.",
 	"Please enter a prompt": "Veuillez saisir un prompt",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Notes de mise à jour",
 	"Relevance": "Pertinence",
+	"Relevance Threshold": "",
 	"Remove": "Retirer",
 	"Remove Model": "Retirer le modèle",
 	"Rename": "Renommer",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "Inscrivez-vous à {{WEBUI_NAME}}",
 	"Signing in to {{WEBUI_NAME}}": "Connexion à {{WEBUI_NAME}}",
 	"sk-1234": "sk-1234",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Source",
 	"Speech Playback Speed": "Vitesse de lecture de la parole",
 	"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Appuyez pour interrompre",
 	"Tasks": "Tâches",
 	"Tavily API Key": "Clé API Tavily",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Dites-nous en plus à ce sujet : ",
 	"Temperature": "Température",
 	"Template": "Template",
@@ -1179,6 +1203,7 @@
 	"variable": "variable",
 	"variable to have them replaced with clipboard content.": "variable pour qu'elles soient remplacées par le contenu du presse-papiers.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "Version:",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Version {{selectedVersion}} de {{totalVersions}}",
 	"View Replies": "Voir les réponses",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "Web",
 	"Web API": "API Web",
+	"Web Loader Engine": "",
 	"Web Search": "Recherche Web",
 	"Web Search Engine": "Moteur de recherche Web",
 	"Web Search in Chat": "Recherche web depuis le chat",

+ 28 - 2
src/lib/i18n/locales/he-IL/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "כל המסמכים",
 	"All models deleted successfully": "",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "",
 	"Allow Chat Deletion": "אפשר מחיקת צ'אט",
 	"Allow Chat Edit": "",
 	"Allow File Upload": "",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "",
+	"Allow Text to Speech": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "וגם",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "וצור קישור משותף חדש.",
+	"Android": "",
 	"API Base URL": "כתובת URL בסיסית ל-API",
 	"API Key": "מפתח API",
 	"API Key created.": "מפתח API נוצר.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "מפתח API של חיפוש אמיץ",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "עקוף אימות SSL עבור אתרים",
 	"Calendar": "",
 	"Call": "",
 	"Call feature is not supported when using Web STT engine": "",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "העתקת כתובת URL של צ'אט משותף ללוח!",
 	"Copied to clipboard": "",
 	"Copy": "העתק",
+	"Copy Formatted Text": "",
 	"Copy last code block": "העתק את בלוק הקוד האחרון",
 	"Copy last response": "העתק את התגובה האחרונה",
 	"Copy Link": "העתק קישור",
@@ -303,6 +308,7 @@
 	"Deleted User": "",
 	"Describe your knowledge base and objectives": "",
 	"Description": "תיאור",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "לא עקב אחרי ההוראות באופן מלא",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "ערוך",
 	"Edit Arena Model": "",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "הזן כתובת URL של Github Raw",
 	"Enter Google PSE API Key": "הזן מפתח API של Google PSE",
 	"Enter Google PSE Engine Id": "הזן את מזהה מנוע PSE של Google",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "הזן מספר שלבים (למשל 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "הזן רצף עצירה",
 	"Enter system prompt": "",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "",
 	"Filters": "",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "התגלתה הזיית טביעת אצבע: לא ניתן להשתמש בראשי תיבות כאווטאר. משתמש בתמונת פרופיל ברירת מחדל.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "שידור נתונים חיצוניים בקצב רציף",
 	"Focus chat input": "מיקוד הקלט לצ'אט",
 	"Folder deleted successfully": "",
@@ -589,6 +605,8 @@
 	"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": "",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "",
 	"Language": "שפה",
+	"Language Locales": "",
 	"Last Active": "פעיל לאחרונה",
 	"Last Modified": "",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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.": "הודעות שתשלח לאחר יצירת הקישור לא ישותפו. משתמשים עם כתובת האתר יוכלו לצפות בצ'אט המשותף.",
 	"Min P": "",
-	"Minimum Score": "ציון מינימלי",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "צינורות שסתומים",
 	"Plain text (.txt)": "טקסט פשוט (.txt)",
 	"Playground": "אזור משחקים",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "הערות שחרור",
 	"Relevance": "",
+	"Relevance Threshold": "",
 	"Remove": "הסר",
 	"Remove Model": "הסר מודל",
 	"Rename": "שנה שם",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "",
 	"Signing in to {{WEBUI_NAME}}": "",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "מקור",
 	"Speech Playback Speed": "",
 	"Speech recognition error: {{error}}": "שגיאת תחקור שמע: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "",
 	"Tasks": "",
 	"Tavily API Key": "",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "תרשמו יותר:",
 	"Temperature": "טמפרטורה",
 	"Template": "תבנית",
@@ -1179,6 +1203,7 @@
 	"variable": "משתנה",
 	"variable to have them replaced with clipboard content.": "משתנה להחליפו ב- clipboard תוכן.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "גרסה",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "רשת",
 	"Web API": "",
+	"Web Loader Engine": "",
 	"Web Search": "חיפוש באינטרנט",
 	"Web Search Engine": "מנוע חיפוש באינטרנט",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/hi-IN/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "सभी डॉक्यूमेंट्स",
 	"All models deleted successfully": "",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "",
 	"Allow Chat Deletion": "चैट हटाने की अनुमति दें",
 	"Allow Chat Edit": "",
 	"Allow File Upload": "",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "",
+	"Allow Text to Speech": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "और",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "और एक नई साझा लिंक बनाएं.",
+	"Android": "",
 	"API Base URL": "एपीआई बेस यूआरएल",
 	"API Key": "एपीआई कुंजी",
 	"API Key created.": "एपीआई कुंजी बनाई गई",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Brave सर्च एपीआई कुंजी",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "वेबसाइटों के लिए SSL सुनिश्चिती को छोड़ें",
 	"Calendar": "",
 	"Call": "",
 	"Call feature is not supported when using Web STT engine": "",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "साझा चैट URL को क्लिपबोर्ड पर कॉपी किया गया!",
 	"Copied to clipboard": "",
 	"Copy": "कॉपी",
+	"Copy Formatted Text": "",
 	"Copy last code block": "अंतिम कोड ब्लॉक कॉपी करें",
 	"Copy last response": "अंतिम प्रतिक्रिया कॉपी करें",
 	"Copy Link": "लिंक को कॉपी करें",
@@ -303,6 +308,7 @@
 	"Deleted User": "",
 	"Describe your knowledge base and objectives": "",
 	"Description": "विवरण",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "निर्देशों का पूरी तरह से पालन नहीं किया",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "संपादित करें",
 	"Edit Arena Model": "",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Github Raw URL दर्ज करें",
 	"Enter Google PSE API Key": "Google PSE API कुंजी दर्ज करें",
 	"Enter Google PSE Engine Id": "Google PSE इंजन आईडी दर्ज करें",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "चरणों की संख्या दर्ज करें (उदा. 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "स्टॉप अनुक्रम दर्ज करें",
 	"Enter system prompt": "",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "",
 	"Filters": "",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "फ़िंगरप्रिंट स्पूफ़िंग का पता चला: प्रारंभिक अक्षरों को अवतार के रूप में उपयोग करने में असमर्थ। प्रोफ़ाइल छवि को डिफ़ॉल्ट पर डिफ़ॉल्ट किया जा रहा है.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "बड़े बाह्य प्रतिक्रिया खंडों को तरल रूप से प्रवाहित करें",
 	"Focus chat input": "चैट इनपुट पर फ़ोकस करें",
 	"Folder deleted successfully": "",
@@ -589,6 +605,8 @@
 	"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": "",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "",
 	"Language": "भाषा",
+	"Language Locales": "",
 	"Last Active": "पिछली बार सक्रिय",
 	"Last Modified": "",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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.": "अपना लिंक बनाने के बाद आपके द्वारा भेजे गए संदेश साझा नहीं किए जाएंगे। यूआरएल वाले यूजर्स शेयर की गई चैट देख पाएंगे।",
 	"Min P": "",
-	"Minimum Score": "न्यूनतम स्कोर",
 	"Mirostat": "मिरोस्टा",
 	"Mirostat Eta": "मिरोस्टा ईटा",
 	"Mirostat Tau": "मिरोस्तात ताऊ",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "पाइपलाइन वाल्व",
 	"Plain text (.txt)": "सादा पाठ (.txt)",
 	"Playground": "कार्यक्षेत्र",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "रिलीज नोट्स",
 	"Relevance": "",
+	"Relevance Threshold": "",
 	"Remove": "हटा दें",
 	"Remove Model": "मोडेल हटाएँ",
 	"Rename": "नाम बदलें",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "",
 	"Signing in to {{WEBUI_NAME}}": "",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "स्रोत",
 	"Speech Playback Speed": "",
 	"Speech recognition error: {{error}}": "वाक् पहचान त्रुटि: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "",
 	"Tasks": "",
 	"Tavily API Key": "",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "हमें और अधिक बताएँ:",
 	"Temperature": "टेंपेरेचर",
 	"Template": "टेम्पलेट",
@@ -1179,6 +1203,7 @@
 	"variable": "वेरिएबल",
 	"variable to have them replaced with clipboard content.": "उन्हें क्लिपबोर्ड सामग्री से बदलने के लिए वेरिएबल।",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "संस्करण",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "वेब",
 	"Web API": "",
+	"Web Loader Engine": "",
 	"Web Search": "वेब खोज",
 	"Web Search Engine": "वेब खोज इंजन",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/hr-HR/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "Svi dokumenti",
 	"All models deleted successfully": "",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "",
 	"Allow Chat Deletion": "Dopusti brisanje razgovora",
 	"Allow Chat Edit": "",
 	"Allow File Upload": "",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Dopusti nelokalne glasove",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "",
+	"Allow Text to Speech": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "i",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "i stvorite novu dijeljenu vezu.",
+	"Android": "",
 	"API Base URL": "Osnovni URL API-ja",
 	"API Key": "API ključ",
 	"API Key created.": "API ključ je stvoren.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Brave tražilica - API ključ",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "Zaobiđi SSL provjeru za web stranice",
 	"Calendar": "",
 	"Call": "Poziv",
 	"Call feature is not supported when using Web STT engine": "Značajka poziva nije podržana kada se koristi Web STT mehanizam",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "URL dijeljenog razgovora kopiran u međuspremnik!",
 	"Copied to clipboard": "",
 	"Copy": "Kopiraj",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Kopiraj zadnji blok koda",
 	"Copy last response": "Kopiraj zadnji odgovor",
 	"Copy Link": "Kopiraj vezu",
@@ -303,6 +308,7 @@
 	"Deleted User": "",
 	"Describe your knowledge base and objectives": "",
 	"Description": "Opis",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "Nije u potpunosti slijedio upute",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Uredi",
 	"Edit Arena Model": "",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Unesite Github sirovi URL",
 	"Enter Google PSE API Key": "Unesite Google PSE API ključ",
 	"Enter Google PSE Engine Id": "Unesite ID Google PSE motora",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Unesite broj koraka (npr. 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Unesite sekvencu zaustavljanja",
 	"Enter system prompt": "",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "",
 	"Filters": "",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Otkriveno krivotvorenje otisaka prstiju: Nemoguće je koristiti inicijale kao avatar. Postavljanje na zadanu profilnu sliku.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Glavno strujanje velikih vanjskih dijelova odgovora",
 	"Focus chat input": "Fokusiraj unos razgovora",
 	"Folder deleted successfully": "",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Hibridna pretraga",
 	"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": "",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "",
 	"Language": "Jezik",
+	"Language Locales": "",
 	"Last Active": "Zadnja aktivnost",
 	"Last Modified": "",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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.": "Poruke koje pošaljete nakon stvaranja veze neće se dijeliti. Korisnici s URL-om moći će vidjeti zajednički chat.",
 	"Min P": "",
-	"Minimum Score": "Minimalna ocjena",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Ventili za cjevovode",
 	"Plain text (.txt)": "Običan tekst (.txt)",
 	"Playground": "Igralište",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Bilješke o izdanju",
 	"Relevance": "",
+	"Relevance Threshold": "",
 	"Remove": "Ukloni",
 	"Remove Model": "Ukloni model",
 	"Rename": "Preimenuj",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "",
 	"Signing in to {{WEBUI_NAME}}": "",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Izvor",
 	"Speech Playback Speed": "",
 	"Speech recognition error: {{error}}": "Pogreška prepoznavanja govora: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "",
 	"Tasks": "",
 	"Tavily API Key": "",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Recite nam više:",
 	"Temperature": "Temperatura",
 	"Template": "Predložak",
@@ -1179,6 +1203,7 @@
 	"variable": "varijabla",
 	"variable to have them replaced with clipboard content.": "varijabla za zamjenu sadržajem međuspremnika.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "Verzija",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "Web",
 	"Web API": "Web API",
+	"Web Loader Engine": "",
 	"Web Search": "Internet pretraga",
 	"Web Search Engine": "Web tražilica",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/hu-HU/translation.json

@@ -57,13 +57,17 @@
 	"All": "Mind",
 	"All Documents": "Minden dokumentum",
 	"All models deleted successfully": "Minden modell sikeresen törölve",
+	"Allow Call": "",
 	"Allow Chat Controls": "Csevegésvezérlők engedélyezése",
 	"Allow Chat Delete": "Csevegés törlésének engedélyezése",
 	"Allow Chat Deletion": "Beszélgetések törlésének engedélyezése",
 	"Allow Chat Edit": "Csevegés szerkesztésének engedélyezése",
 	"Allow File Upload": "Fájlfeltöltés engedélyezése",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Nem helyi hangok engedélyezése",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "Ideiglenes beszélgetés engedélyezése",
+	"Allow Text to Speech": "",
 	"Allow User Location": "Felhasználói helyzet engedélyezése",
 	"Allow Voice Interruption in Call": "Hang megszakítás engedélyezése hívás közben",
 	"Allowed Endpoints": "Engedélyezett végpontok",
@@ -79,6 +83,7 @@
 	"and": "és",
 	"and {{COUNT}} more": "és még {{COUNT}} db",
 	"and create a new shared link.": "és hozz létre egy új megosztott linket.",
+	"Android": "",
 	"API Base URL": "API alap URL",
 	"API Key": "API kulcs",
 	"API Key created.": "API kulcs létrehozva.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Brave Search API kulcs",
 	"By {{name}}": "Készítette: {{name}}",
 	"Bypass Embedding and Retrieval": "Beágyazás és visszakeresés kihagyása",
-	"Bypass SSL verification for Websites": "SSL ellenőrzés kihagyása weboldalakhoz",
 	"Calendar": "Naptár",
 	"Call": "Hívás",
 	"Call feature is not supported when using Web STT engine": "A hívás funkció nem támogatott Web STT motor használatakor",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "Megosztott beszélgetés URL másolva a vágólapra!",
 	"Copied to clipboard": "Vágólapra másolva",
 	"Copy": "Másolás",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Utolsó kódblokk másolása",
 	"Copy last response": "Utolsó válasz másolása",
 	"Copy Link": "Link másolása",
@@ -303,6 +308,7 @@
 	"Deleted User": "Felhasználó törölve",
 	"Describe your knowledge base and objectives": "Írd le a tudásbázisodat és céljaidat",
 	"Description": "Leírás",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "Nem követte teljesen az utasításokat",
 	"Direct": "Közvetlen",
 	"Direct Connections": "Közvetlen kapcsolatok",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "pl. az_en_szűrőm",
 	"e.g. my_tools": "pl. az_en_eszkozeim",
 	"e.g. Tools for performing various operations": "pl. Eszközök különböző műveletek elvégzéséhez",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Szerkesztés",
 	"Edit Arena Model": "Arena modell szerkesztése",
 	"Edit Channel": "Csatorna szerkesztése",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "Add meg a dokumentum intelligencia kulcsot",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "Add meg a domaineket vesszővel elválasztva (pl. example.com,site.org)",
 	"Enter Exa API Key": "Add meg az Exa API kulcsot",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Add meg a Github Raw URL-t",
 	"Enter Google PSE API Key": "Add meg a Google PSE API kulcsot",
 	"Enter Google PSE Engine Id": "Add meg a Google PSE motor azonosítót",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "Add meg a Mojeek Search API kulcsot",
 	"Enter Number of Steps (e.g. 50)": "Add meg a lépések számát (pl. 50)",
 	"Enter Perplexity API Key": "Add meg a Perplexity API kulcsot",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "Add meg a proxy URL-t (pl. https://user:password@host:port)",
 	"Enter reasoning effort": "Add meg az érvelési erőfeszítést",
 	"Enter Sampler (e.g. Euler a)": "Add meg a mintavételezőt (pl. Euler a)",
@@ -441,10 +452,13 @@
 	"Enter server host": "Add meg a szerver hosztot",
 	"Enter server label": "Add meg a szerver címkét",
 	"Enter server port": "Add meg a szerver portot",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Add meg a leállítási szekvenciát",
 	"Enter system prompt": "Add meg a rendszer promptot",
 	"Enter system prompt here": "Írd ide a rendszer promptot",
 	"Enter Tavily API Key": "Add meg a Tavily API kulcsot",
+	"Enter Tavily Extract Depth": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Add meg a WebUI nyilvános URL-jét. Ez az URL lesz használva az értesítésekben lévő linkek generálásához.",
 	"Enter Tika Server URL": "Add meg a Tika szerver URL-t",
 	"Enter timeout in seconds": "Add meg az időtúllépést másodpercekben",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "A szűrő globálisan engedélyezve",
 	"Filters": "Szűrők",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Ujjlenyomat hamisítás észlelve: Nem lehet a kezdőbetűket avatárként használni. Alapértelmezett profilkép használata.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Nagy külső válasz darabok folyamatos streamelése",
 	"Focus chat input": "Chat bevitel fókuszálása",
 	"Folder deleted successfully": "Mappa sikeresen törölve",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Hibrid keresés",
 	"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.": "Elismerem, hogy elolvastam és megértem a cselekedetem következményeit. Tisztában vagyok a tetszőleges kód végrehajtásával járó kockázatokkal, és ellenőriztem a forrás megbízhatóságát.",
 	"ID": "Azonosító",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "Kíváncsiság felkeltése",
 	"Image": "Kép",
 	"Image Compression": "Képtömörítés",
@@ -649,6 +667,7 @@
 	"Label": "Címke",
 	"Landing Page Mode": "Kezdőlap mód",
 	"Language": "Nyelv",
+	"Language Locales": "",
 	"Last Active": "Utoljára aktív",
 	"Last Modified": "Utoljára módosítva",
 	"Last reply": "Utolsó válasz",
@@ -702,7 +721,6 @@
 	"Message rating should be enabled to use this feature": "Az üzenetértékelésnek engedélyezve kell lennie ehhez a funkcióhoz",
 	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "A link létrehozása után küldött üzenetei nem lesznek megosztva. A URL-lel rendelkező felhasználók megtekinthetik a megosztott beszélgetést.",
 	"Min P": "Min P",
-	"Minimum Score": "Minimum pontszám",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Folyamat szelepek",
 	"Plain text (.txt)": "Egyszerű szöveg (.txt)",
 	"Playground": "Játszótér",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "Kérjük, gondosan tekintse át a következő figyelmeztetéseket:",
 	"Please do not close the settings page while loading the model.": "Kérjük, ne zárja be a beállítások oldalt a modell betöltése közben.",
 	"Please enter a prompt": "Kérjük, adjon meg egy promptot",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Kiadási jegyzetek",
 	"Relevance": "Relevancia",
+	"Relevance Threshold": "",
 	"Remove": "Eltávolítás",
 	"Remove Model": "Modell eltávolítása",
 	"Rename": "Átnevezés",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "Regisztráció ide: {{WEBUI_NAME}}",
 	"Signing in to {{WEBUI_NAME}}": "Bejelentkezés ide: {{WEBUI_NAME}}",
 	"sk-1234": "sk-1234",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Forrás",
 	"Speech Playback Speed": "Beszéd lejátszási sebesség",
 	"Speech recognition error: {{error}}": "Beszédfelismerési hiba: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Koppintson a megszakításhoz",
 	"Tasks": "Feladatok",
 	"Tavily API Key": "Tavily API kulcs",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Mondjon többet:",
 	"Temperature": "Hőmérséklet",
 	"Template": "Sablon",
@@ -1179,6 +1203,7 @@
 	"variable": "változó",
 	"variable to have them replaced with clipboard content.": "változó, hogy a vágólap tartalmával helyettesítse őket.",
 	"Verify Connection": "Kapcsolat ellenőrzése",
+	"Verify SSL Certificate": "",
 	"Version": "Verzió",
 	"Version {{selectedVersion}} of {{totalVersions}}": "{{selectedVersion}}. verzió a {{totalVersions}}-ból",
 	"View Replies": "Válaszok megtekintése",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Figyelmeztetés: A Jupyter végrehajtás lehetővé teszi a tetszőleges kód végrehajtását, ami súlyos biztonsági kockázatot jelent – óvatosan folytassa.",
 	"Web": "Web",
 	"Web API": "Web API",
+	"Web Loader Engine": "",
 	"Web Search": "Webes keresés",
 	"Web Search Engine": "Webes keresőmotor",
 	"Web Search in Chat": "Webes keresés a csevegésben",

+ 28 - 2
src/lib/i18n/locales/id-ID/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "Semua Dokumen",
 	"All models deleted successfully": "",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "",
 	"Allow Chat Deletion": "Izinkan Penghapusan Obrolan",
 	"Allow Chat Edit": "",
 	"Allow File Upload": "",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Izinkan suara non-lokal",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "",
+	"Allow Text to Speech": "",
 	"Allow User Location": "Izinkan Lokasi Pengguna",
 	"Allow Voice Interruption in Call": "Izinkan Gangguan Suara dalam Panggilan",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "dan",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "dan membuat tautan bersama baru.",
+	"Android": "",
 	"API Base URL": "URL Dasar API",
 	"API Key": "Kunci API",
 	"API Key created.": "Kunci API dibuat.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Kunci API Pencarian Berani",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "Lewati verifikasi SSL untuk Situs Web",
 	"Calendar": "",
 	"Call": "Panggilan",
 	"Call feature is not supported when using Web STT engine": "Fitur panggilan tidak didukung saat menggunakan mesin Web STT",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "Menyalin URL obrolan bersama ke papan klip!",
 	"Copied to clipboard": "",
 	"Copy": "Menyalin",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Salin blok kode terakhir",
 	"Copy last response": "Salin tanggapan terakhir",
 	"Copy Link": "Salin Tautan",
@@ -303,6 +308,7 @@
 	"Deleted User": "",
 	"Describe your knowledge base and objectives": "",
 	"Description": "Deskripsi",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "Tidak sepenuhnya mengikuti instruksi",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Edit",
 	"Edit Arena Model": "",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Masukkan URL Mentah Github",
 	"Enter Google PSE API Key": "Masukkan Kunci API Google PSE",
 	"Enter Google PSE Engine Id": "Masukkan Id Mesin Google PSE",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Masukkan Jumlah Langkah (mis. 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Masukkan urutan berhenti",
 	"Enter system prompt": "",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Masukkan Kunci API Tavily",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "Filter sekarang diaktifkan secara global",
 	"Filters": "Filter",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Pemalsuan sidik jari terdeteksi: Tidak dapat menggunakan inisial sebagai avatar. Default ke gambar profil default.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Mengalirkan potongan respons eksternal yang besar dengan lancar",
 	"Focus chat input": "Memfokuskan input obrolan",
 	"Folder deleted successfully": "",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Pencarian Hibrida",
 	"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": "",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "",
 	"Language": "Bahasa",
+	"Language Locales": "",
 	"Last Active": "Terakhir Aktif",
 	"Last Modified": "Terakhir Dimodifikasi",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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.": "Pesan yang Anda kirim setelah membuat tautan tidak akan dibagikan. Pengguna yang memiliki URL tersebut akan dapat melihat obrolan yang dibagikan.",
 	"Min P": "",
-	"Minimum Score": "Skor Minimum",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Katup Saluran Pipa",
 	"Plain text (.txt)": "Teks biasa (.txt)",
 	"Playground": "Taman bermain",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Catatan Rilis",
 	"Relevance": "",
+	"Relevance Threshold": "",
 	"Remove": "Hapus",
 	"Remove Model": "Hapus Model",
 	"Rename": "Ganti nama",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "",
 	"Signing in to {{WEBUI_NAME}}": "",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Sumber",
 	"Speech Playback Speed": "",
 	"Speech recognition error: {{error}}": "Kesalahan pengenalan suara: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Ketuk untuk menyela",
 	"Tasks": "",
 	"Tavily API Key": "Kunci API Tavily",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Beri tahu kami lebih lanjut:",
 	"Temperature": "Suhu",
 	"Template": "Templat",
@@ -1179,6 +1203,7 @@
 	"variable": "variabel",
 	"variable to have them replaced with clipboard content.": "variabel untuk diganti dengan konten papan klip.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "Versi",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "Web",
 	"Web API": "API Web",
+	"Web Loader Engine": "",
 	"Web Search": "Pencarian Web",
 	"Web Search Engine": "Mesin Pencari Web",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/ie-GA/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "Gach Doiciméad",
 	"All models deleted successfully": "Scriosadh na múnlaí go léir go rathúil",
+	"Allow Call": "",
 	"Allow Chat Controls": "Ceadaigh Rialuithe Comhrá",
 	"Allow Chat Delete": "Ceadaigh Comhrá a Scriosadh",
 	"Allow Chat Deletion": "Cead Scriosadh Comhrá",
 	"Allow Chat Edit": "Ceadaigh Eagarthóireacht Comhrá",
 	"Allow File Upload": "Ceadaigh Uaslódáil Comhad",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Lig guthanna neamh-áitiúla",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "Cead Comhrá Sealadach",
+	"Allow Text to Speech": "",
 	"Allow User Location": "Ceadaigh Suíomh Úsáideora",
 	"Allow Voice Interruption in Call": "Ceadaigh Briseadh Guth i nGlao",
 	"Allowed Endpoints": "Críochphointí Ceadaithe",
@@ -79,6 +83,7 @@
 	"and": "agus",
 	"and {{COUNT}} more": "agus {{COUNT}} eile",
 	"and create a new shared link.": "agus cruthaigh nasc nua roinnte.",
+	"Android": "",
 	"API Base URL": "URL Bonn API",
 	"API Key": "Eochair API",
 	"API Key created.": "Cruthaíodh Eochair API.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Eochair API Cuardaigh Brave",
 	"By {{name}}": "Le {{name}}",
 	"Bypass Embedding and Retrieval": "Seachbhóthar Leabú agus Aisghabháil",
-	"Bypass SSL verification for Websites": "Seachbhachtar fíorú SSL do Láithreáin",
 	"Calendar": "Féilire",
 	"Call": "Glaoigh",
 	"Call feature is not supported when using Web STT engine": "Ní thacaítear le gné glaonna agus inneall Web STT á úsáid",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "Cóipeáladh URL an chomhrá roinnte chuig an ngearrthaisce!",
 	"Copied to clipboard": "Cóipeáilte go gear",
 	"Copy": "Cóipeáil",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Cóipeáil bloc cód deireanach",
 	"Copy last response": "Cóipeáil an fhreagairt",
 	"Copy Link": "Cóipeáil Nasc",
@@ -303,6 +308,7 @@
 	"Deleted User": "Úsáideoir Scriosta",
 	"Describe your knowledge base and objectives": "Déan cur síos ar do bhunachar eolais agus do chuspóirí",
 	"Description": "Cur síos",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "Níor lean sé treoracha go hiomlán",
 	"Direct": "",
 	"Direct Connections": "Naisc Dhíreacha",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "m.sh. mo_scagaire",
 	"e.g. my_tools": "m.sh. mo_uirlisí",
 	"e.g. Tools for performing various operations": "m.sh. Uirlisí chun oibríochtaí éagsúla a dhéanamh",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Cuir in eagar",
 	"Edit Arena Model": "Cuir Samhail Airéine in Eagar",
 	"Edit Channel": "Cuir Cainéal in Eagar",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "Iontráil Eochair Faisnéise Doiciméad",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "Cuir isteach fearainn atá scartha le camóga (m.sh., example.com,site.org)",
 	"Enter Exa API Key": "Cuir isteach Eochair Exa API",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Cuir isteach URL Github Raw",
 	"Enter Google PSE API Key": "Cuir isteach Eochair API Google PSE",
 	"Enter Google PSE Engine Id": "Cuir isteach ID Inneall Google PSE",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "Cuir isteach Eochair API Cuardach Mojeek",
 	"Enter Number of Steps (e.g. 50)": "Iontráil Líon na gCéimeanna (m.sh. 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "Cuir isteach URL seachfhreastalaí (m.sh. https://user:password@host:port)",
 	"Enter reasoning effort": "Cuir isteach iarracht réasúnaíochta",
 	"Enter Sampler (e.g. Euler a)": "Cuir isteach Sampler (m.sh. Euler a)",
@@ -441,10 +452,13 @@
 	"Enter server host": "Cuir isteach óstach freastalaí",
 	"Enter server label": "Cuir isteach lipéad freastalaí",
 	"Enter server port": "Cuir isteach port freastalaí",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Cuir isteach seicheamh stad",
 	"Enter system prompt": "Cuir isteach an chóras leid",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Cuir isteach eochair API Tavily",
+	"Enter Tavily Extract Depth": "",
 	"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": "Cuir isteach an t-am istigh i soicindí",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "Tá an scagaire cumasaithe go domhanda anois",
 	"Filters": "Scagairí",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Braithíodh spoofing méarloirg: Ní féidir teachlitreacha a úsáid mar avatar. Réamhshocrú ar íomhá próifíle réamhshocraithe.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Sruthaigh codanna móra freagartha seachtracha go sreabhach",
 	"Focus chat input": "Ionchur comhrá fócas",
 	"Folder deleted successfully": "Scriosadh an fillteán go rathúil",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Cuardach Hibrideach",
 	"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.": "Admhaím gur léigh mé agus tuigim impleachtaí mo ghníomhaíochta. Táim ar an eolas faoi na rioscaí a bhaineann le cód treallach a fhorghníomhú agus tá iontaofacht na foinse fíoraithe agam.",
 	"ID": "ID",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "Las fiosracht",
 	"Image": "Íomhá",
 	"Image Compression": "Comhbhrú Íomhá",
@@ -649,6 +667,7 @@
 	"Label": "Lipéad",
 	"Landing Page Mode": "Mód Leathanach Tuirlingthe",
 	"Language": "Teanga",
+	"Language Locales": "",
 	"Last Active": "Gníomhach Deiridh",
 	"Last Modified": "Athraithe Deiridh",
 	"Last reply": "Freagra deiridh",
@@ -702,7 +721,6 @@
 	"Message rating should be enabled to use this feature": "Ba cheart rátáil teachtaireachta a chumasú chun an ghné seo a úsáid",
 	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Ní roinnfear teachtaireachtaí a sheolann tú tar éis do nasc a chruthú. Beidh úsáideoirí leis an URL in ann féachaint ar an gcomhrá roinnte.",
 	"Min P": "Min P",
-	"Minimum Score": "Scór Íosta",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Comhlaí Píblíne",
 	"Plain text (.txt)": "Téacs simplí (.txt)",
 	"Playground": "Clós súgartha",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "Déan athbhreithniú cúramach ar na rabhaidh seo a leanas le do thoil:",
 	"Please do not close the settings page while loading the model.": "Ná dún leathanach na socruithe agus an tsamhail á luchtú.",
 	"Please enter a prompt": "Cuir isteach leid",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Nótaí Scaoilte",
 	"Relevance": "Ábharthacht",
+	"Relevance Threshold": "",
 	"Remove": "Bain",
 	"Remove Model": "Bain Múnla",
 	"Rename": "Athainmnigh",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "Cláraigh le {{WEBUI_NAME}}",
 	"Signing in to {{WEBUI_NAME}}": "Ag síniú isteach ar {{WEBUI_NAME}}",
 	"sk-1234": "sk-1234",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Foinse",
 	"Speech Playback Speed": "Luas Athsheinm Urlabhra",
 	"Speech recognition error: {{error}}": "Earráid aitheantais cainte: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Tapáil chun cur isteach",
 	"Tasks": "Tascanna",
 	"Tavily API Key": "Eochair API Tavily",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Inis dúinn níos mó:",
 	"Temperature": "Teocht",
 	"Template": "Teimpléad",
@@ -1179,6 +1203,7 @@
 	"variable": "athraitheach",
 	"variable to have them replaced with clipboard content.": "athróg chun ábhar gearrthaisce a chur in ionad iad.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "Leagan",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Leagan {{selectedVersion}} de {{totalVersions}}",
 	"View Replies": "Féach ar Fhreagraí",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Rabhadh: Trí fhorghníomhú Jupyter is féidir cód a fhorghníomhú go treallach, rud a chruthaíonn mór-rioscaí slándála - bí fíorchúramach.",
 	"Web": "Gréasán",
 	"Web API": "API Gréasáin",
+	"Web Loader Engine": "",
 	"Web Search": "Cuardach Gréasáin",
 	"Web Search Engine": "Inneall Cuardaigh Gréasáin",
 	"Web Search in Chat": "Cuardach Gréasáin i gComhrá",

+ 28 - 2
src/lib/i18n/locales/it-IT/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "Tutti i documenti",
 	"All models deleted successfully": "",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "",
 	"Allow Chat Deletion": "Consenti l'eliminazione della chat",
 	"Allow Chat Edit": "",
 	"Allow File Upload": "",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "",
+	"Allow Text to Speech": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "e",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "e crea un nuovo link condiviso.",
+	"Android": "",
 	"API Base URL": "URL base API",
 	"API Key": "Chiave API",
 	"API Key created.": "Chiave API creata.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Chiave API di ricerca Brave",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "Aggira la verifica SSL per i siti web",
 	"Calendar": "",
 	"Call": "",
 	"Call feature is not supported when using Web STT engine": "",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "URL della chat condivisa copiato negli appunti!",
 	"Copied to clipboard": "",
 	"Copy": "Copia",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Copia ultimo blocco di codice",
 	"Copy last response": "Copia ultima risposta",
 	"Copy Link": "Copia link",
@@ -303,6 +308,7 @@
 	"Deleted User": "",
 	"Describe your knowledge base and objectives": "",
 	"Description": "Descrizione",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "Non ha seguito completamente le istruzioni",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Modifica",
 	"Edit Arena Model": "",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Immettere l'URL grezzo di Github",
 	"Enter Google PSE API Key": "Inserisci la chiave API PSE di Google",
 	"Enter Google PSE Engine Id": "Inserisci l'ID motore PSE di Google",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Inserisci il numero di passaggi (ad esempio 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Inserisci la sequenza di arresto",
 	"Enter system prompt": "",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "",
 	"Filters": "",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Rilevato spoofing delle impronte digitali: impossibile utilizzare le iniziali come avatar. Ripristino all'immagine del profilo predefinita.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Trasmetti in modo fluido blocchi di risposta esterni di grandi dimensioni",
 	"Focus chat input": "Metti a fuoco l'input della chat",
 	"Folder deleted successfully": "",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Ricerca ibrida",
 	"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": "",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "",
 	"Language": "Lingua",
+	"Language Locales": "",
 	"Last Active": "Ultima attività",
 	"Last Modified": "",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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.": "I messaggi inviati dopo la creazione del link non verranno condivisi. Gli utenti con l'URL saranno in grado di visualizzare la chat condivisa.",
 	"Min P": "",
-	"Minimum Score": "Punteggio minimo",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Valvole per tubazioni",
 	"Plain text (.txt)": "Testo normale (.txt)",
 	"Playground": "Terreno di gioco",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Note di rilascio",
 	"Relevance": "",
+	"Relevance Threshold": "",
 	"Remove": "Rimuovi",
 	"Remove Model": "Rimuovi modello",
 	"Rename": "Rinomina",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "",
 	"Signing in to {{WEBUI_NAME}}": "",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Fonte",
 	"Speech Playback Speed": "",
 	"Speech recognition error: {{error}}": "Errore di riconoscimento vocale: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "",
 	"Tasks": "",
 	"Tavily API Key": "",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Raccontaci di più:",
 	"Temperature": "Temperatura",
 	"Template": "Modello",
@@ -1179,6 +1203,7 @@
 	"variable": "variabile",
 	"variable to have them replaced with clipboard content.": "variabile per farli sostituire con il contenuto degli appunti.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "Versione",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "Web",
 	"Web API": "",
+	"Web Loader Engine": "",
 	"Web Search": "Ricerca sul Web",
 	"Web Search Engine": "Motore di ricerca Web",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/ja-JP/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "全てのドキュメント",
 	"All models deleted successfully": "",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "",
 	"Allow Chat Deletion": "チャットの削除を許可",
 	"Allow Chat Edit": "",
 	"Allow File Upload": "",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "ローカル以外のボイスを許可",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "一時的なチャットを許可",
+	"Allow Text to Speech": "",
 	"Allow User Location": "ユーザーロケーションの許可",
 	"Allow Voice Interruption in Call": "通話中に音声の割り込みを許可",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "および",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "し、新しい共有リンクを作成します。",
+	"Android": "",
 	"API Base URL": "API ベース URL",
 	"API Key": "API キー",
 	"API Key created.": "API キーが作成されました。",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Brave Search APIキー",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "SSL 検証をバイパスする",
 	"Calendar": "",
 	"Call": "コール",
 	"Call feature is not supported when using Web STT engine": "",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "共有チャットURLをクリップボードにコピーしました!",
 	"Copied to clipboard": "クリップボードにコピーしました。",
 	"Copy": "コピー",
+	"Copy Formatted Text": "",
 	"Copy last code block": "最後のコードブロックをコピー",
 	"Copy last response": "最後の応答をコピー",
 	"Copy Link": "リンクをコピー",
@@ -303,6 +308,7 @@
 	"Deleted User": "",
 	"Describe your knowledge base and objectives": "",
 	"Description": "説明",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "説明に沿って操作していませんでした",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "編集",
 	"Edit Arena Model": "",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Github Raw URLを入力",
 	"Enter Google PSE API Key": "Google PSE APIキーの入力",
 	"Enter Google PSE Engine Id": "Google PSE エンジン ID を入力します。",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "ステップ数を入力してください (例: 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "サンプラーを入力してください(e.g. Euler a)。",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "ストップシーケンスを入力してください",
 	"Enter system prompt": "システムプロンプト入力",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Tavily API Keyを入力してください。",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "グローバルフィルタが有効です。",
 	"Filters": "フィルター",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "指紋のなりすましが検出されました: イニシャルをアバターとして使用できません。デフォルトのプロファイル画像にデフォルト設定されています。",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "大規模な外部応答チャンクをスムーズにストリーミングする",
 	"Focus chat input": "チャット入力をフォーカス",
 	"Folder deleted successfully": "",
@@ -589,6 +605,8 @@
 	"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": "",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "ランディングページモード",
 	"Language": "言語",
+	"Language Locales": "",
 	"Last Active": "最終アクティブ",
 	"Last Modified": "",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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": "",
-	"Minimum Score": "最低スコア",
 	"Mirostat": "ミロスタット",
 	"Mirostat Eta": "ミロスタット Eta",
 	"Mirostat Tau": "ミロスタット Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "パイプラインバルブ",
 	"Plain text (.txt)": "プレーンテキスト (.txt)",
 	"Playground": "プレイグラウンド",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "リリースノート",
 	"Relevance": "",
+	"Relevance Threshold": "",
 	"Remove": "削除",
 	"Remove Model": "モデルを削除",
 	"Rename": "名前を変更",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "",
 	"Signing in to {{WEBUI_NAME}}": "",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "ソース",
 	"Speech Playback Speed": "音声の再生速度",
 	"Speech recognition error: {{error}}": "音声認識エラー: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "",
 	"Tasks": "",
 	"Tavily API Key": "",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "もっと話してください:",
 	"Temperature": "温度",
 	"Template": "テンプレート",
@@ -1179,6 +1203,7 @@
 	"variable": "変数",
 	"variable to have them replaced with clipboard content.": "クリップボードの内容に置き換える変数。",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "バージョン",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "ウェブ",
 	"Web API": "ウェブAPI",
+	"Web Loader Engine": "",
 	"Web Search": "ウェブ検索",
 	"Web Search Engine": "ウェブ検索エンジン",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/ka-GE/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "ყველა დოკუმენტი",
 	"All models deleted successfully": "ყველა მოდელი წარმატებით წაიშალა",
+	"Allow Call": "",
 	"Allow Chat Controls": "ჩატის კონტროლის ელემენტების დაშვება",
 	"Allow Chat Delete": "ჩატის წაშლის დაშვება",
 	"Allow Chat Deletion": "ჩატის წაშლის დაშვება",
 	"Allow Chat Edit": "ჩატის ჩასწორების დაშვება",
 	"Allow File Upload": "ფაილის ატვირთვის დაშვება",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "არალოკალური ხმების დაშვება",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "დროებითი ჩატის დაშვება",
+	"Allow Text to Speech": "",
 	"Allow User Location": "მომხმარებლის მდებარეობის დაშვება",
 	"Allow Voice Interruption in Call": "",
 	"Allowed Endpoints": "დაშვებული ბოლოწერტილები",
@@ -79,6 +83,7 @@
 	"and": "და",
 	"and {{COUNT}} more": "და კიდევ {{COUNT}}",
 	"and create a new shared link.": "და ახალი გაზიარებული ბმულის შექმნა.",
+	"Android": "",
 	"API Base URL": "API-ის საბაზისო URL",
 	"API Key": "API გასაღები",
 	"API Key created.": "API გასაღები შეიქმნა.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Brave Search API-ის გასაღები",
 	"By {{name}}": "ავტორი {{name}}",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "SSL-ის ვერიფიკაციის გააუქმება ვებსაიტებზე",
 	"Calendar": "კალენდარი",
 	"Call": "ზარი",
 	"Call feature is not supported when using Web STT engine": "",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "გაზიარებული ჩატის ბმული დაკოპირდა ბუფერში!",
 	"Copied to clipboard": "დაკოპირდა გაცვლის ბაფერში",
 	"Copy": "კოპირება",
+	"Copy Formatted Text": "",
 	"Copy last code block": "ბოლო კოდის ბლოკის კოპირება",
 	"Copy last response": "ბოლო პასუხის კოპირება",
 	"Copy Link": "ბმულის კოპირება",
@@ -303,6 +308,7 @@
 	"Deleted User": "წაშლილი მომხმარებელი",
 	"Describe your knowledge base and objectives": "",
 	"Description": "აღწერა",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "ინსტრუქციებს სრულად არ მივყევი",
 	"Direct": "",
 	"Direct Connections": "პირდაპირი მიერთება",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "მაგ: ჩემი_ფილტრი",
 	"e.g. my_tools": "მაგ: ჩემი_ხელსაწყოები",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "ჩასწორება",
 	"Edit Arena Model": "არენის მოდელის ჩასწორება",
 	"Edit Channel": "არხის ჩასწორება",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "შეიყვანეთ Github Raw URL",
 	"Enter Google PSE API Key": "შეიყვანეთ Google PSE API-ის გასაღები",
 	"Enter Google PSE Engine Id": "შეიყვანეთ Google PSE ძრავის ID",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "შეიყვანეთ ნაბიჯების რაოდენობა (მაგ. 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "შეიყვანეთ გაჩერების მიმდევრობა",
 	"Enter system prompt": "",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "",
 	"Filters": "ფილტრები",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "აღმოჩენილია ანაბეჭდის გაყალბება: ინიციალების გამოყენება ავატარად შეუძლებელია. გამოყენებული იქნეა ნაგულისხმევი პროფილის სურათი.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "დიდი გარე პასუხის ფრაგმენტების გლუვად დასტრიმვა",
 	"Focus chat input": "ჩატში შეყვანის ფოკუსი",
 	"Folder deleted successfully": "",
@@ -589,6 +605,8 @@
 	"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",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "გამოსახულება",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "ჭდე",
 	"Landing Page Mode": "",
 	"Language": "ენა",
+	"Language Locales": "",
 	"Last Active": "ბოლოს აქტიური",
 	"Last Modified": "ბოლო ცვლილება",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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": "",
-	"Minimum Score": "მინიმალური ქულა",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "მილსადენის სარქველები",
 	"Plain text (.txt)": "უბრალო ტექსტი (.txt)",
 	"Playground": "საცდელი ფუნქციები",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "გამოცემის შენიშვნები",
 	"Relevance": "შესაბამისობა",
+	"Relevance Threshold": "",
 	"Remove": "წაშლა",
 	"Remove Model": "მოდელის წაშლა",
 	"Rename": "სახელის გადარქმევა",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "",
 	"Signing in to {{WEBUI_NAME}}": "",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "წყარო",
 	"Speech Playback Speed": "",
 	"Speech recognition error: {{error}}": "საუბრის ამოცნობის შეცდომა: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "",
 	"Tasks": "ამოცანები",
 	"Tavily API Key": "",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "გვითხარით მეტი:",
 	"Temperature": "ტემპერატურა",
 	"Template": "ნიმუში",
@@ -1179,6 +1203,7 @@
 	"variable": "ცვლადი",
 	"variable to have them replaced with clipboard content.": "ცვლადი მისი ბუფერის მნიშვნელობით ჩასანაცვლებლად.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "ვერსია",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "ვები",
 	"Web API": "",
+	"Web Loader Engine": "",
 	"Web Search": "ვებში ძებნა",
 	"Web Search Engine": "ვებ საძიებო სისტემა",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/ko-KR/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "모든 문서",
 	"All models deleted successfully": "성공적으로 모든 모델이 삭제되었습니다",
+	"Allow Call": "",
 	"Allow Chat Controls": "채팅 제어 허용",
 	"Allow Chat Delete": "채팅 삭제 허용",
 	"Allow Chat Deletion": "채팅 삭제 허용",
 	"Allow Chat Edit": "채팅 수정 허용",
 	"Allow File Upload": "파일 업로드 허용",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "외부 음성 허용",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "임시 채팅 허용",
+	"Allow Text to Speech": "",
 	"Allow User Location": "사용자 위치 활용 허용",
 	"Allow Voice Interruption in Call": "음성 기능에서 음성 방해 허용",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "그리고",
 	"and {{COUNT}} more": "그리고 {{COUNT}} 더",
 	"and create a new shared link.": "새로운 공유 링크를 생성합니다.",
+	"Android": "",
 	"API Base URL": "API 기본 URL",
 	"API Key": "API 키",
 	"API Key created.": "API 키가 생성되었습니다.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Brave Search API 키",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "웹 사이트에 대한 SSL 검증 무시: ",
 	"Calendar": "",
 	"Call": "음성 기능",
 	"Call feature is not supported when using Web STT engine": "웹 STT 엔진 사용 시, 음성 기능은 지원되지 않습니다.",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "채팅 공유 URL이 클립보드에 복사되었습니다!",
 	"Copied to clipboard": "클립보드에 복사되었습니다",
 	"Copy": "복사",
+	"Copy Formatted Text": "",
 	"Copy last code block": "마지막 코드 블록 복사",
 	"Copy last response": "마지막 응답 복사",
 	"Copy Link": "링크 복사",
@@ -303,6 +308,7 @@
 	"Deleted User": "삭제된 사용자",
 	"Describe your knowledge base and objectives": "지식 기반에 대한 설명과 목적을 입력하세요",
 	"Description": "설명",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "완전히 지침을 따르지 않음",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "편집",
 	"Edit Arena Model": "아레나 모델 편집",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Github Raw URL 입력",
 	"Enter Google PSE API Key": "Google PSE API 키 입력",
 	"Enter Google PSE Engine Id": "Google PSE 엔진 ID 입력",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "Mojeek Search API 키 입력",
 	"Enter Number of Steps (e.g. 50)": "단계 수 입력(예: 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "프록시 URL 입력(예: https://user:password@host:port)",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "샘플러 입력 (예: 오일러 a(Euler a))",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "중지 시퀀스 입력",
 	"Enter system prompt": "시스템 프롬프트 입력",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Tavily API 키 입력",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "전반적으로 필터 활성화됨",
 	"Filters": "필터",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Fingerprint spoofing 감지: 이니셜을 아바타로 사용할 수 없습니다. 기본 프로필 이미지로 설정합니다.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "대규모 외부 응답 청크를 유연하게 스트리밍",
 	"Focus chat input": "채팅 입력창에 포커스",
 	"Folder deleted successfully": "성공적으로 폴터가 생성되었습니다",
@@ -589,6 +605,8 @@
 	"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",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "이미지",
 	"Image Compression": "이미지 압축",
@@ -649,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "랜딩페이지 모드",
 	"Language": "언어",
+	"Language Locales": "",
 	"Last Active": "최근 활동",
 	"Last Modified": "마지막 수정",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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": "최소 P",
-	"Minimum Score": "최소 점수",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "파이프라인 밸브",
 	"Plain text (.txt)": "일반 텍스트(.txt)",
 	"Playground": "놀이터",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "다음 주의를 조심히 확인해주십시오",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "프롬프트를 입력해주세요",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "릴리스 노트",
 	"Relevance": "관련도",
+	"Relevance Threshold": "",
 	"Remove": "삭제",
 	"Remove Model": "모델 삭제",
 	"Rename": "이름 변경",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "{{WEBUI_NAME}}로 가입",
 	"Signing in to {{WEBUI_NAME}}": "{{WEBUI_NAME}}로 가입중",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "출처",
 	"Speech Playback Speed": "음성 재생 속도",
 	"Speech recognition error: {{error}}": "음성 인식 오류: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "탭하여 중단",
 	"Tasks": "",
 	"Tavily API Key": "Tavily API 키",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "더 알려주세요:",
 	"Temperature": "온도",
 	"Template": "템플릿",
@@ -1179,6 +1203,7 @@
 	"variable": "변수",
 	"variable to have them replaced with clipboard content.": "변수를 사용하여 클립보드 내용으로 바꾸세요.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "버전",
 	"Version {{selectedVersion}} of {{totalVersions}}": "버전 {{totalVersions}}의 {{selectedVersion}}",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "웹",
 	"Web API": "웹 API",
+	"Web Loader Engine": "",
 	"Web Search": "웹 검색",
 	"Web Search Engine": "웹 검색 엔진",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/lt-LT/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "Visi dokumentai",
 	"All models deleted successfully": "",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "",
 	"Allow Chat Deletion": "Leisti pokalbių ištrynimą",
 	"Allow Chat Edit": "",
 	"Allow File Upload": "",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Leisti nelokalius balsus",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "",
+	"Allow Text to Speech": "",
 	"Allow User Location": "Leisti naudotojo vietos matymą",
 	"Allow Voice Interruption in Call": "Leisti pertraukimą skambučio metu",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "ir",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "sukurti naują dalinimosi nuorodą",
+	"Android": "",
 	"API Base URL": "API basės nuoroda",
 	"API Key": "API raktas",
 	"API Key created.": "API raktas sukurtas",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Brave Search API raktas",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "Išvengti SSL patikros puslapiams",
 	"Calendar": "",
 	"Call": "Skambinti",
 	"Call feature is not supported when using Web STT engine": "Skambučio funkcionalumas neleidžiamas naudojant Web STT variklį",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "Nukopijavote pokalbio nuorodą",
 	"Copied to clipboard": "",
 	"Copy": "Kopijuoti",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Kopijuoti paskutinį kodo bloką",
 	"Copy last response": "Kopijuoti paskutinį atsakymą",
 	"Copy Link": "Kopijuoti nuorodą",
@@ -303,6 +308,7 @@
 	"Deleted User": "",
 	"Describe your knowledge base and objectives": "",
 	"Description": "Aprašymas",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "Pilnai nesekė instrukcijų",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Redaguoti",
 	"Edit Arena Model": "",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Įveskite GitHub Raw nuorodą",
 	"Enter Google PSE API Key": "Įveskite Google PSE API raktą",
 	"Enter Google PSE Engine Id": "Įveskite Google PSE variklio ID",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Įveskite žingsnių kiekį (pvz. 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Įveskite pabaigos sekvenciją",
 	"Enter system prompt": "Įveskite sistemos užklausą",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Įveskite Tavily API raktą",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "Filtrai globaliai leidžiami",
 	"Filters": "Filtrai",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Nepavyko nsutatyti profilio nuotraukos",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Sklandžiai transliuoti ilgus atsakymus",
 	"Focus chat input": "Fokusuoti žinutės įvestį",
 	"Folder deleted successfully": "",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Hibridinė paieška",
 	"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.": "Suprantu veiksmų ir kodo vykdymo rizikas.",
 	"ID": "",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "",
 	"Language": "Kalba",
+	"Language Locales": "",
 	"Last Active": "Paskutinį kartą aktyvus",
 	"Last Modified": "Paskutinis pakeitimas",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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.": "Žinutės, kurias siunčiate po nuorodos sukūrimo nebus matomos nuorodos turėtojams. Naudotojai su nuoroda matys žinutes iki nuorodos sukūrimo.",
 	"Min P": "Mažiausias p",
-	"Minimum Score": "Minimalus rezultatas",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Procesų įeitys",
 	"Plain text (.txt)": "Grynas tekstas (.txt)",
 	"Playground": "Eksperimentavimo erdvė",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "Peržiūrėkite šiuos perspėjimus:",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Naujovės",
 	"Relevance": "",
+	"Relevance Threshold": "",
 	"Remove": "Pašalinti",
 	"Remove Model": "Pašalinti modelį",
 	"Rename": "Pervadinti",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "",
 	"Signing in to {{WEBUI_NAME}}": "",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Šaltinis",
 	"Speech Playback Speed": "",
 	"Speech recognition error: {{error}}": "Balso atpažinimo problema: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Paspauskite norėdami pertraukti",
 	"Tasks": "",
 	"Tavily API Key": "Tavily API raktas",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Papasakokite daugiau",
 	"Temperature": "Temperatūra",
 	"Template": "Modelis",
@@ -1179,6 +1203,7 @@
 	"variable": "kintamasis",
 	"variable to have them replaced with clipboard content.": "kintamoji pakeičiama kopijuoklės turiniu.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "Versija",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "Web",
 	"Web API": "Web API",
+	"Web Loader Engine": "",
 	"Web Search": "Web paieška",
 	"Web Search Engine": "Web paieškos variklis",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/ms-MY/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "Semua Dokumen",
 	"All models deleted successfully": "",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "",
 	"Allow Chat Deletion": "Benarkan Penghapusan Perbualan",
 	"Allow Chat Edit": "",
 	"Allow File Upload": "",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Benarkan suara bukan tempatan ",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "",
+	"Allow Text to Speech": "",
 	"Allow User Location": "Benarkan Lokasi Pengguna",
 	"Allow Voice Interruption in Call": "Benarkan gangguan suara dalam panggilan",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "dan",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "dan cipta pautan kongsi baharu",
+	"Android": "",
 	"API Base URL": "URL Asas API",
 	"API Key": "Kunci API",
 	"API Key created.": "Kunci API dicipta",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Kunci API Carian Brave",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "Pintas pengesahan SSL untuk Laman Web",
 	"Calendar": "",
 	"Call": "Hubungi",
 	"Call feature is not supported when using Web STT engine": "Ciri panggilan tidak disokong apabila menggunakan enjin Web STT",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "Menyalin URL sembang kongsi ke papan klip",
 	"Copied to clipboard": "",
 	"Copy": "Salin",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Salin Blok Kod Terakhir",
 	"Copy last response": "Salin Respons Terakhir",
 	"Copy Link": "Salin Pautan",
@@ -303,6 +308,7 @@
 	"Deleted User": "",
 	"Describe your knowledge base and objectives": "",
 	"Description": "Penerangan",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "Tidak mengikut arahan sepenuhnya",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Edit",
 	"Edit Arena Model": "",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Masukkan URL 'Github Raw'",
 	"Enter Google PSE API Key": "Masukkan kunci API Google PSE",
 	"Enter Google PSE Engine Id": "Masukkan Id Enjin Google PSE",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Masukkan Bilangan Langkah (cth 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Masukkan urutan hentian",
 	"Enter system prompt": "Masukkan gesaan sistem",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Masukkan Kunci API Tavily",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "Tapisan kini dibenarkan secara global",
 	"Filters": "Tapisan",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Peniruan cap jari dikesan, tidak dapat menggunakan nama pendek sebagai avatar. Lalai kepada imej profail asal",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Strim 'chunks' respons luaran yang besar dengan lancar",
 	"Focus chat input": "Fokus kepada input perbualan",
 	"Folder deleted successfully": "",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Carian Hibrid",
 	"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.": "Saya mengakui bahawa saya telah membaca dan saya memahami implikasi tindakan saya. Saya sedar tentang risiko yang berkaitan dengan melaksanakan kod sewenang-wenangnya dan saya telah mengesahkan kebolehpercayaan sumber tersebut.",
 	"ID": "",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "",
 	"Language": "Bahasa",
+	"Language Locales": "",
 	"Last Active": "Dilihat aktif terakhir pada",
 	"Last Modified": "Kemaskini terakhir pada",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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.": "Mesej yang anda hantar selepas membuat pautan anda tidak akan dikongsi. Pengguna dengan URL akan dapat melihat perbualan yang dikongsi.",
 	"Min P": "P Minimum",
-	"Minimum Score": "Skor Minimum",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "'Pipeline Valves'",
 	"Plain text (.txt)": "Teks biasa (.txt)",
 	"Playground": "Taman Permainan",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "Sila semak dengan teliti amaran berikut:",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Nota Keluaran",
 	"Relevance": "",
+	"Relevance Threshold": "",
 	"Remove": "Hapuskan",
 	"Remove Model": "Hapuskan Model",
 	"Rename": "Namakan Semula",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "",
 	"Signing in to {{WEBUI_NAME}}": "",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Sumber",
 	"Speech Playback Speed": "",
 	"Speech recognition error: {{error}}": "Ralat pengecaman pertuturan: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Sentuh untuk mengganggu",
 	"Tasks": "",
 	"Tavily API Key": "Kunci API Tavily",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Beritahu kami lebih lanjut",
 	"Temperature": "Suhu",
 	"Template": "Templat",
@@ -1179,6 +1203,7 @@
 	"variable": "pembolehubah",
 	"variable to have them replaced with clipboard content.": "pembolehubah untuk ia digantikan dengan kandungan papan klip.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "Versi",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "Web",
 	"Web API": "API Web",
+	"Web Loader Engine": "",
 	"Web Search": "Carian Web",
 	"Web Search Engine": "Enjin Carian Web",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/nb-NO/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "Alle dokumenter",
 	"All models deleted successfully": "Alle modeller er slettet",
+	"Allow Call": "",
 	"Allow Chat Controls": "Tillatt chatkontroller",
 	"Allow Chat Delete": "Tillat sletting av chatter",
 	"Allow Chat Deletion": "Tillat sletting av chatter",
 	"Allow Chat Edit": "Tillat redigering av chatter",
 	"Allow File Upload": "Tillatt opplasting av filer",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Tillat ikke-lokale stemmer",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "Tillat midlertidige chatter",
+	"Allow Text to Speech": "",
 	"Allow User Location": "Aktiver stedstjenester",
 	"Allow Voice Interruption in Call": "Muliggjør taleavbrytelse i samtaler",
 	"Allowed Endpoints": "Tillatte endepunkter",
@@ -79,6 +83,7 @@
 	"and": "og",
 	"and {{COUNT}} more": "og {{COUNT}} til",
 	"and create a new shared link.": "og opprett en ny delt lenke.",
+	"Android": "",
 	"API Base URL": "Absolutt API-URL",
 	"API Key": "API-nøkkel",
 	"API Key created.": "API-nøkkel opprettet.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "API-nøkkel for Brave Search",
 	"By {{name}}": "Etter {{name}}",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "Omgå SSL-verifisering for nettsteder",
 	"Calendar": "Kalender",
 	"Call": "Ring",
 	"Call feature is not supported when using Web STT engine": "Ringefunksjonen støttes ikke når du bruker Web STT-motoren",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "Kopierte delt chat-URL til utklippstavlen!",
 	"Copied to clipboard": "Kopier til utklippstaveln",
 	"Copy": "Kopier",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Kopier siste kodeblokk",
 	"Copy last response": "Kopier siste svar",
 	"Copy Link": "Kopier lenke",
@@ -303,6 +308,7 @@
 	"Deleted User": "Slettet bruker",
 	"Describe your knowledge base and objectives": "Beskriv kunnskapsbasen din og målene dine",
 	"Description": "Beskrivelse",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "Fulgte ikke instruksjonene fullstendig",
 	"Direct": "",
 	"Direct Connections": "Direkte koblinger",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "f.eks. mitt_filter",
 	"e.g. my_tools": "f.eks. mine_verktøy",
 	"e.g. Tools for performing various operations": "f.eks. Verktøy for å gjøre ulike handlinger",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Rediger",
 	"Edit Arena Model": "Rediger Arena-modell",
 	"Edit Channel": "Rediger kanal",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "Angi nøkkel for Intelligens i dokumenter",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "Angi domener atskilt med komma (f.eks. eksempel.com, side.org)",
 	"Enter Exa API Key": "Angi API-nøkkel for Exa",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Angi Github Raw-URL",
 	"Enter Google PSE API Key": "Angi API-nøkkel for Google PSE",
 	"Enter Google PSE Engine Id": "Angi motor-ID for Google PSE",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "Angi API-nøkkel for Mojeek-søk",
 	"Enter Number of Steps (e.g. 50)": "Angi antall steg (f.eks. 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "Angi proxy-URL (f.eks. https://bruker:passord@host:port)",
 	"Enter reasoning effort": "Angi hvor mye resonneringsinnsats som skal til",
 	"Enter Sampler (e.g. Euler a)": "Angi Sampler (e.g. Euler a)",
@@ -441,10 +452,13 @@
 	"Enter server host": "Angi server host",
 	"Enter server label": "Angi server etikett",
 	"Enter server port": "Angi server port",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Angi stoppsekvens",
 	"Enter system prompt": "Angi systemledetekst",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Angi API-nøkkel for Tavily",
+	"Enter Tavily Extract Depth": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Angi den offentlige URL-adressen til WebUI. Denne URL-adressen vil bli brukt til å generere koblinger i varslene.",
 	"Enter Tika Server URL": "Angi server-URL for Tika",
 	"Enter timeout in seconds": "Angi tidsavbrudd i sekunder",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "Filteret er nå globalt aktivert",
 	"Filters": "Filtre",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Fingeravtrykk-spoofing oppdaget: kan ikke bruke initialer som avatar. Bruker standard profilbilde.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Flytende strømming av store eksterne svarpakker",
 	"Focus chat input": "Fokusert chat-inndata",
 	"Folder deleted successfully": "Mappe slettet",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Hybrid-søk",
 	"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.": "Jeg bekrefter at jeg har lest og forstår konsekvensene av mine handlinger. Jeg er klar over risikoen forbundet med å kjøre vilkårlig kode, og jeg har verifisert kildens pålitelighet.",
 	"ID": "ID",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "Vekk nysgjerrigheten",
 	"Image": "Bilde",
 	"Image Compression": "Bildekomprimering",
@@ -649,6 +667,7 @@
 	"Label": "Etikett",
 	"Landing Page Mode": "Modus for startside",
 	"Language": "Språk",
+	"Language Locales": "",
 	"Last Active": "Sist aktiv",
 	"Last Modified": "Sist endret",
 	"Last reply": "Siste svar",
@@ -702,7 +721,6 @@
 	"Message rating should be enabled to use this feature": "Vurdering av meldinger må være aktivert for å ta i bruk denne funksjonen",
 	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Meldinger du sender etter at du har opprettet lenken, blir ikke delt. Brukere med URL-en vil kunne se den delte chatten.",
 	"Min P": "Min P",
-	"Minimum Score": "Minimum poengsum",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Pipeline-ventiler",
 	"Plain text (.txt)": "Ren tekst (.txt)",
 	"Playground": "Lekeplass",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "Les gjennom følgende advarsler grundig:",
 	"Please do not close the settings page while loading the model.": "Ikke lukk siden Innstillinger mens du laster inn modellen.",
 	"Please enter a prompt": "Angi en ledetekst",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Utgivelsesnotater",
 	"Relevance": "Relevans",
+	"Relevance Threshold": "",
 	"Remove": "Fjern",
 	"Remove Model": "Fjern modell",
 	"Rename": "Gi nytt navn",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "Registrer deg for {{WEBUI_NAME}}",
 	"Signing in to {{WEBUI_NAME}}": "Logger på {{WEBUI_NAME}}",
 	"sk-1234": "sk-1234",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Kilde",
 	"Speech Playback Speed": "Hastighet på avspilling av tale",
 	"Speech recognition error: {{error}}": "Feil ved talegjenkjenning: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Trykk for å avbryte",
 	"Tasks": "Oppgaver",
 	"Tavily API Key": "API-nøkkel for Tavily",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Fortell oss mer:",
 	"Temperature": "Temperatur",
 	"Template": "Mal",
@@ -1179,6 +1203,7 @@
 	"variable": "variabel",
 	"variable to have them replaced with clipboard content.": "variabel for å erstatte dem med utklippstavleinnhold.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "Versjon",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Version {{selectedVersion}} av {{totalVersions}}",
 	"View Replies": "Vis svar",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Advarsel! Jupyter gjør det mulig å kjøre vilkårlig kode, noe som utgjør en alvorlig sikkerhetsrisiko. Utvis ekstrem forsiktighet.",
 	"Web": "Web",
 	"Web API": "Web-API",
+	"Web Loader Engine": "",
 	"Web Search": "Nettsøk",
 	"Web Search Engine": "Nettsøkmotor",
 	"Web Search in Chat": "Nettsøk i chat",

+ 28 - 2
src/lib/i18n/locales/nl-NL/translation.json

@@ -57,13 +57,17 @@
 	"All": "Alle",
 	"All Documents": "Alle documenten",
 	"All models deleted successfully": "Alle modellen zijn succesvol verwijderd",
+	"Allow Call": "",
 	"Allow Chat Controls": "Chatbesturing toestaan",
 	"Allow Chat Delete": "Chatverwijdering toestaan",
 	"Allow Chat Deletion": "Chatverwijdering toestaan",
 	"Allow Chat Edit": "Chatwijziging toestaan",
 	"Allow File Upload": "Bestandenupload toestaan",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Niet-lokale stemmen toestaan",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "Tijdelijke chat toestaan",
+	"Allow Text to Speech": "",
 	"Allow User Location": "Gebruikerslocatie toestaan",
 	"Allow Voice Interruption in Call": "Stemonderbreking tijdens gesprek toestaan",
 	"Allowed Endpoints": "Endpoints toestaan",
@@ -79,6 +83,7 @@
 	"and": "en",
 	"and {{COUNT}} more": "en {{COUNT}} meer",
 	"and create a new shared link.": "en maak een nieuwe gedeelde link.",
+	"Android": "",
 	"API Base URL": "API Base URL",
 	"API Key": "API-sleutel",
 	"API Key created.": "API-sleutel aangemaakt.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Brave Search API-sleutel",
 	"By {{name}}": "Op {{name}}",
 	"Bypass Embedding and Retrieval": "Embedding en ophalen omzeilen ",
-	"Bypass SSL verification for Websites": "SSL-verificatie omzeilen voor websites",
 	"Calendar": "Agenda",
 	"Call": "Oproep",
 	"Call feature is not supported when using Web STT engine": "Belfunctie wordt niet ondersteund bij gebruik van de Web STT engine",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "URL van gedeelde gesprekspagina gekopieerd naar klembord!",
 	"Copied to clipboard": "Gekopieerd naar klembord",
 	"Copy": "Kopieer",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Kopieer laatste codeblok",
 	"Copy last response": "Kopieer laatste antwoord",
 	"Copy Link": "Kopieer link",
@@ -303,6 +308,7 @@
 	"Deleted User": "Gebruiker verwijderd",
 	"Describe your knowledge base and objectives": "Beschrijf je kennisbasis en doelstellingen",
 	"Description": "Beschrijving",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "Heeft niet alle instructies gevolgt",
 	"Direct": "Direct",
 	"Direct Connections": "Directe verbindingen",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "bijv. mijn_filter",
 	"e.g. my_tools": "bijv. mijn_gereedschappen",
 	"e.g. Tools for performing various operations": "Gereedschappen om verschillende bewerkingen uit te voeren",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Wijzig",
 	"Edit Arena Model": "Bewerk arenamodel",
 	"Edit Channel": "Bewerk kanaal",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "Voer Document Intelligence sleutel in",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "Voer domeinen in gescheiden met komma's (bijv., voorbeeld.com,site.org)",
 	"Enter Exa API Key": "Voer Exa API-sleutel in",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Voer de Github Raw-URL in",
 	"Enter Google PSE API Key": "Voer de Google PSE API-sleutel in",
 	"Enter Google PSE Engine Id": "Voer Google PSE Engine-ID in",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "Voer Mojeek Search API-sleutel in",
 	"Enter Number of Steps (e.g. 50)": "Voeg aantal stappen toe (Bijv. 50)",
 	"Enter Perplexity API Key": "Voer Perplexity API-sleutel in",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "Voer proxy-URL in (bijv. https://gebruiker:wachtwoord@host:port)",
 	"Enter reasoning effort": "Voer redeneerinspanning in",
 	"Enter Sampler (e.g. Euler a)": "Voer Sampler in (bv. Euler a)",
@@ -441,10 +452,13 @@
 	"Enter server host": "Voer serverhost in",
 	"Enter server label": "Voer serverlabel in",
 	"Enter server port": "Voer serverpoort in",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Voer stopsequentie in",
 	"Enter system prompt": "Voer systeem prompt in",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Voer Tavily API-sleutel in",
+	"Enter Tavily Extract Depth": "",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Voer de publieke URL van je WebUI in. Deze URL wordt gebruikt om links in de notificaties te maken.",
 	"Enter Tika Server URL": "Voer Tika Server URL in",
 	"Enter timeout in seconds": "Voer time-out in seconden in",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "Filter is nu globaal ingeschakeld",
 	"Filters": "Filters",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Vingerafdruk spoofing gedetecteerd: kan initialen niet gebruiken als avatar. Standaardprofielafbeelding wordt gebruikt.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Stream grote externe responsbrokken vloeiend",
 	"Focus chat input": "Focus chat input",
 	"Folder deleted successfully": "Map succesvol verwijderd",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Hybride Zoeken",
 	"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.": "Ik bevestig dat ik de implicaties van mijn actie heb gelezen en begrepen. Ik ben me bewust van de risico's die gepaard gaan met het uitvoeren van willekeurige code en ik heb de betrouwbaarheid van de bron gecontroleerd.",
 	"ID": "ID",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "Wakker nieuwsgierigheid aan",
 	"Image": "Afbeelding",
 	"Image Compression": "Afbeeldingscompressie",
@@ -649,6 +667,7 @@
 	"Label": "Label",
 	"Landing Page Mode": "Landingspaginamodus",
 	"Language": "Taal",
+	"Language Locales": "",
 	"Last Active": "Laatst Actief",
 	"Last Modified": "Laatst aangepast",
 	"Last reply": "Laatste antwoord",
@@ -702,7 +721,6 @@
 	"Message rating should be enabled to use this feature": "Berichtbeoordeling moet ingeschakeld zijn om deze functie te gebruiken",
 	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Berichten die je verzendt nadat je jouw link hebt gemaakt, worden niet gedeeld. Gebruikers met de URL kunnen de gedeelde chat bekijken.",
 	"Min P": "Min P",
-	"Minimum Score": "Minimale score",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Pijpleidingen Kleppen",
 	"Plain text (.txt)": "Platte tekst (.txt)",
 	"Playground": "Speeltuin",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "Beoordeel de volgende waarschuwingen nauwkeurig:",
 	"Please do not close the settings page while loading the model.": "Sluit de instellingenpagina niet terwijl het model geladen wordt.",
 	"Please enter a prompt": "Voer een prompt in",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Release-opmerkingen",
 	"Relevance": "Relevantie",
+	"Relevance Threshold": "",
 	"Remove": "Verwijderen",
 	"Remove Model": "Verwijder model",
 	"Rename": "Hernoemen",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "Meld je aan bij {{WEBUI_NAME}}",
 	"Signing in to {{WEBUI_NAME}}": "Aan het inloggen bij {{WEBUI_NAME}}",
 	"sk-1234": "sk-1234",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Bron",
 	"Speech Playback Speed": "Afspeelsnelheid spraak",
 	"Speech recognition error: {{error}}": "Spraakherkenning fout: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Tik om te onderbreken",
 	"Tasks": "Taken",
 	"Tavily API Key": "Tavily API-sleutel",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Vertel ons meer:",
 	"Temperature": "Temperatuur",
 	"Template": "Template",
@@ -1179,6 +1203,7 @@
 	"variable": "variabele",
 	"variable to have them replaced with clipboard content.": "variabele om ze te laten vervangen door klembord inhoud.",
 	"Verify Connection": "Controleer verbinding",
+	"Verify SSL Certificate": "",
 	"Version": "Versie",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Versie {{selectedVersion}} van {{totalVersions}}",
 	"View Replies": "Bekijke resultaten",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Waarschuwing: Jupyter kan willekeurige code uitvoeren, wat ernstige veiligheidsrisico's met zich meebrengt - ga uiterst voorzichtig te werk. ",
 	"Web": "Web",
 	"Web API": "Web-API",
+	"Web Loader Engine": "",
 	"Web Search": "Zoeken op het web",
 	"Web Search Engine": "Zoekmachine op het web",
 	"Web Search in Chat": "Zoekopdracht in chat",

+ 28 - 2
src/lib/i18n/locales/pa-IN/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "ਸਾਰੇ ਡਾਕੂਮੈਂਟ",
 	"All models deleted successfully": "",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "",
 	"Allow Chat Deletion": "ਗੱਲਬਾਤ ਮਿਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ",
 	"Allow Chat Edit": "",
 	"Allow File Upload": "",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "",
+	"Allow Text to Speech": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "ਅਤੇ",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "ਅਤੇ ਇੱਕ ਨਵਾਂ ਸਾਂਝਾ ਲਿੰਕ ਬਣਾਓ।",
+	"Android": "",
 	"API Base URL": "API ਬੇਸ URL",
 	"API Key": "API ਕੁੰਜੀ",
 	"API Key created.": "API ਕੁੰਜੀ ਬਣਾਈ ਗਈ।",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "ਬਹਾਦਰ ਖੋਜ API ਕੁੰਜੀ",
 	"By {{name}}": "",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "ਵੈਬਸਾਈਟਾਂ ਲਈ SSL ਪ੍ਰਮਾਣਿਕਤਾ ਨੂੰ ਬਾਈਪਾਸ ਕਰੋ",
 	"Calendar": "",
 	"Call": "",
 	"Call feature is not supported when using Web STT engine": "",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "ਸਾਂਝੇ ਕੀਤੇ ਗੱਲਬਾਤ URL ਨੂੰ ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕਰ ਦਿੱਤਾ!",
 	"Copied to clipboard": "",
 	"Copy": "ਕਾਪੀ ਕਰੋ",
+	"Copy Formatted Text": "",
 	"Copy last code block": "ਆਖਰੀ ਕੋਡ ਬਲਾਕ ਨੂੰ ਕਾਪੀ ਕਰੋ",
 	"Copy last response": "ਆਖਰੀ ਜਵਾਬ ਨੂੰ ਕਾਪੀ ਕਰੋ",
 	"Copy Link": "ਲਿੰਕ ਕਾਪੀ ਕਰੋ",
@@ -303,6 +308,7 @@
 	"Deleted User": "",
 	"Describe your knowledge base and objectives": "",
 	"Description": "ਵਰਣਨਾ",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "ਹਦਾਇਤਾਂ ਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਫਾਲੋ ਨਹੀਂ ਕੀਤਾ",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "ਸੰਪਾਦਨ ਕਰੋ",
 	"Edit Arena Model": "",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Github ਕੱਚਾ URL ਦਾਖਲ ਕਰੋ",
 	"Enter Google PSE API Key": "Google PSE API ਕੁੰਜੀ ਦਾਖਲ ਕਰੋ",
 	"Enter Google PSE Engine Id": "Google PSE ਇੰਜਣ ID ਦਾਖਲ ਕਰੋ",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "ਕਦਮਾਂ ਦੀ ਗਿਣਤੀ ਦਰਜ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "",
@@ -441,10 +452,13 @@
 	"Enter server host": "",
 	"Enter server label": "",
 	"Enter server port": "",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "ਰੋਕਣ ਦਾ ਕ੍ਰਮ ਦਰਜ ਕਰੋ",
 	"Enter system prompt": "",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "",
 	"Filters": "",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "ਫਿੰਗਰਪ੍ਰਿੰਟ ਸਪੂਫਿੰਗ ਪਾਈ ਗਈ: ਅਵਤਾਰ ਵਜੋਂ ਸ਼ੁਰੂਆਤੀ ਅੱਖਰ ਵਰਤਣ ਵਿੱਚ ਅਸਮਰੱਥ। ਮੂਲ ਪ੍ਰੋਫਾਈਲ ਚਿੱਤਰ 'ਤੇ ਡਿਫਾਲਟ।",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "ਵੱਡੇ ਬਾਹਰੀ ਜਵਾਬ ਚੰਕਾਂ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਸਟ੍ਰੀਮ ਕਰੋ",
 	"Focus chat input": "ਗੱਲਬਾਤ ਇਨਪੁਟ 'ਤੇ ਧਿਆਨ ਦਿਓ",
 	"Folder deleted successfully": "",
@@ -589,6 +605,8 @@
 	"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": "",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "",
 	"Landing Page Mode": "",
 	"Language": "ਭਾਸ਼ਾ",
+	"Language Locales": "",
 	"Last Active": "ਆਖਰੀ ਸਰਗਰਮ",
 	"Last Modified": "",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"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": "",
-	"Minimum Score": "ਘੱਟੋ-ਘੱਟ ਸਕੋਰ",
 	"Mirostat": "ਮਿਰੋਸਟੈਟ",
 	"Mirostat Eta": "ਮਿਰੋਸਟੈਟ ਈਟਾ",
 	"Mirostat Tau": "ਮਿਰੋਸਟੈਟ ਟਾਉ",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "ਪਾਈਪਲਾਈਨਾਂ ਵਾਲਵ",
 	"Plain text (.txt)": "ਸਧਾਰਨ ਪਾਠ (.txt)",
 	"Playground": "ਖੇਡ ਦਾ ਮੈਦਾਨ",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "ਰਿਲੀਜ਼ ਨੋਟਸ",
 	"Relevance": "",
+	"Relevance Threshold": "",
 	"Remove": "ਹਟਾਓ",
 	"Remove Model": "ਮਾਡਲ ਹਟਾਓ",
 	"Rename": "ਨਾਮ ਬਦਲੋ",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "",
 	"Signing in to {{WEBUI_NAME}}": "",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "ਸਰੋਤ",
 	"Speech Playback Speed": "",
 	"Speech recognition error: {{error}}": "ਬੋਲ ਪਛਾਣ ਗਲਤੀ: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "",
 	"Tasks": "",
 	"Tavily API Key": "",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "ਸਾਨੂੰ ਹੋਰ ਦੱਸੋ:",
 	"Temperature": "ਤਾਪਮਾਨ",
 	"Template": "ਟੈਮਪਲੇਟ",
@@ -1179,6 +1203,7 @@
 	"variable": "ਵੈਰੀਏਬਲ",
 	"variable to have them replaced with clipboard content.": "ਕਲਿੱਪਬੋਰਡ ਸਮੱਗਰੀ ਨਾਲ ਬਦਲਣ ਲਈ ਵੈਰੀਏਬਲ।",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "ਵਰਜਨ",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "ਵੈਬ",
 	"Web API": "",
+	"Web Loader Engine": "",
 	"Web Search": "ਵੈੱਬ ਖੋਜ",
 	"Web Search Engine": "ਵੈੱਬ ਖੋਜ ਇੰਜਣ",
 	"Web Search in Chat": "",

+ 28 - 2
src/lib/i18n/locales/pl-PL/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "Wszystkie dokumenty",
 	"All models deleted successfully": "Wszystkie modele zostały usunięte pomyślnie.",
+	"Allow Call": "",
 	"Allow Chat Controls": "Zezwól na dostęp do ustawień czatu",
 	"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 Multiple Models in Chat": "",
 	"Allow non-local voices": "Pozwól na głosy spoza lokalnej społeczności",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "Zezwól na tymczasową rozmowę",
+	"Allow Text to Speech": "",
 	"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",
@@ -79,6 +83,7 @@
 	"and": "oraz",
 	"and {{COUNT}} more": "i {{COUNT}} więcej",
 	"and create a new shared link.": "i utwórz nowy link współdzielony.",
+	"Android": "",
 	"API Base URL": "Adres bazowy interfejsu API",
 	"API Key": "Klucz API",
 	"API Key created.": "Klucz API został utworzony.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Klucz API wyszukiwania Brave",
 	"By {{name}}": "Przez {{name}}",
 	"Bypass Embedding and Retrieval": "",
-	"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",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "Skopiowano udostępniony URL czatu do schowka!",
 	"Copied to clipboard": "Skopiowane do schowka",
 	"Copy": "Skopiuj",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Skopiuj ostatni fragment kodu",
 	"Copy last response": "Skopiuj ostatnią wypowiedź",
 	"Copy Link": "Skopiuj link",
@@ -303,6 +308,7 @@
 	"Deleted User": "Usunięty użytkownik",
 	"Describe your knowledge base and objectives": "Opisz swoją bazę wiedzy i cele",
 	"Description": "Opis",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "Nie wykonał w pełni instrukcji",
 	"Direct": "",
 	"Direct Connections": "Połączenia bezpośrednie",
@@ -358,6 +364,7 @@
 	"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",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Edytuj",
 	"Edit Arena Model": "Edytuj model arenę",
 	"Edit Channel": "Edytuj kanał",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"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 Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"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 urządzenia Google PSE",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "Wprowadź klucz API Mojeek Search",
 	"Enter Number of Steps (e.g. 50)": "Podaj liczbę kroków (np. 50)",
 	"Enter Perplexity API Key": "Klucz API Perplexity",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"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)",
@@ -441,10 +452,13 @@
 	"Enter server host": "Wprowadź nazwę hosta serwera",
 	"Enter server label": "Wprowadź etykietę serwera",
 	"Enter server port": "Wprowadź numer portu serwera",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Wprowadź sekwencję stop",
 	"Enter system prompt": "Wprowadź polecenie systemowe",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Wprowadź klucz API Tavily",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"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.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"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",
@@ -589,6 +605,8 @@
 	"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",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "Rozbudź ciekawość",
 	"Image": "Obraz",
 	"Image Compression": "Kompresja obrazu",
@@ -649,6 +667,7 @@
 	"Label": "Nazwa serwera",
 	"Landing Page Mode": "Tryb strony głównej",
 	"Language": "Język",
+	"Language Locales": "",
 	"Last Active": "Ostatnio aktywny",
 	"Last Modified": "Ostatnia modyfikacja",
 	"Last reply": "Ostatnia odpowiedź",
@@ -702,7 +721,6 @@
 	"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",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Przepływy i Zawory",
 	"Plain text (.txt)": "Zwykły tekst (.txt)",
 	"Playground": "Plac zabaw",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"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",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Notatki do wydania",
 	"Relevance": "Trafność",
+	"Relevance Threshold": "",
 	"Remove": "Usuń",
 	"Remove Model": "Usuń model",
 	"Rename": "Zmień nazwę",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "Zarejestruj się w {{WEBUI_NAME}}",
 	"Signing in to {{WEBUI_NAME}}": "Logowanie do {{WEBUI_NAME}}",
 	"sk-1234": "sk-1234",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Źródło",
 	"Speech Playback Speed": "Prędkość odtwarzania mowy",
 	"Speech recognition error: {{error}}": "Błąd rozpoznawania mowy: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Kliknij, aby przerwać",
 	"Tasks": "Zadania",
 	"Tavily API Key": "Klucz API Tavily",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Podaj więcej informacji",
 	"Temperature": "Temperatura",
 	"Template": "Szablon",
@@ -1179,6 +1203,7 @@
 	"variable": "zmienna",
 	"variable to have them replaced with clipboard content.": "Zmienna, która ma zostać zastąpiona zawartością schowka.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "Wersja",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Wersja {{selectedVersion}} z {{totalVersions}}",
 	"View Replies": "Wyświetl odpowiedzi",
@@ -1193,6 +1218,7 @@
 	"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 Engine": "",
 	"Web Search": "Wyszukiwarka internetowa",
 	"Web Search Engine": "Silnik wyszukiweania w sieci",
 	"Web Search in Chat": "Wyszukiwanie w sieci Web na czacie",

+ 28 - 2
src/lib/i18n/locales/pt-BR/translation.json

@@ -57,13 +57,17 @@
 	"All": "",
 	"All Documents": "Todos os Documentos",
 	"All models deleted successfully": "Todos os modelos foram excluídos com sucesso",
+	"Allow Call": "",
 	"Allow Chat Controls": "",
 	"Allow Chat Delete": "Permitir Exclusão de Chats",
 	"Allow Chat Deletion": "Permitir Exclusão de Chats",
 	"Allow Chat Edit": "Permitir Edição de Chats",
 	"Allow File Upload": "Permitir Envio de arquivos",
+	"Allow Multiple Models in Chat": "",
 	"Allow non-local voices": "Permitir vozes não locais",
+	"Allow Speech to Text": "",
 	"Allow Temporary Chat": "Permitir Conversa Temporária",
+	"Allow Text to Speech": "",
 	"Allow User Location": "Permitir Localização do Usuário",
 	"Allow Voice Interruption in Call": "Permitir Interrupção de Voz na Chamada",
 	"Allowed Endpoints": "",
@@ -79,6 +83,7 @@
 	"and": "e",
 	"and {{COUNT}} more": "e mais {{COUNT}}",
 	"and create a new shared link.": "e criar um novo link compartilhado.",
+	"Android": "",
 	"API Base URL": "URL Base da API",
 	"API Key": "Chave API",
 	"API Key created.": "Chave API criada.",
@@ -141,7 +146,6 @@
 	"Brave Search API Key": "Chave API do Brave Search",
 	"By {{name}}": "Por {{name}}",
 	"Bypass Embedding and Retrieval": "",
-	"Bypass SSL verification for Websites": "Ignorar verificação SSL para Sites",
 	"Calendar": "",
 	"Call": "Chamada",
 	"Call feature is not supported when using Web STT engine": "O recurso de chamada não é suportado ao usar o mecanismo Web STT",
@@ -241,6 +245,7 @@
 	"Copied shared chat URL to clipboard!": "URL de chat compartilhado copiado para a área de transferência!",
 	"Copied to clipboard": "Copiado para a área de transferência",
 	"Copy": "Copiar",
+	"Copy Formatted Text": "",
 	"Copy last code block": "Copiar último bloco de código",
 	"Copy last response": "Copiar última resposta",
 	"Copy Link": "Copiar Link",
@@ -303,6 +308,7 @@
 	"Deleted User": "Usuário Excluído",
 	"Describe your knowledge base and objectives": "Descreva sua base de conhecimento e objetivos",
 	"Description": "Descrição",
+	"Detect Artifacts Automatically": "",
 	"Didn't fully follow instructions": "Não seguiu completamente as instruções",
 	"Direct": "",
 	"Direct Connections": "",
@@ -358,6 +364,7 @@
 	"e.g. my_filter": "Exemplo: my_filter",
 	"e.g. my_tools": "Exemplo: my_tools",
 	"e.g. Tools for performing various operations": "Exemplo: Ferramentas para executar operações diversas",
+	"e.g., en-US,ja-JP (leave blank for auto-detect)": "",
 	"Edit": "Editar",
 	"Edit Arena Model": "Editar Arena de Modelos",
 	"Edit Channel": "",
@@ -407,6 +414,8 @@
 	"Enter Document Intelligence Key": "",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "",
 	"Enter Exa API Key": "",
+	"Enter Firecrawl API Base URL": "",
+	"Enter Firecrawl API Key": "",
 	"Enter Github Raw URL": "Digite a URL bruta do Github",
 	"Enter Google PSE API Key": "Digite a Chave API do Google PSE",
 	"Enter Google PSE Engine Id": "Digite o ID do Motor do Google PSE",
@@ -424,6 +433,8 @@
 	"Enter Mojeek Search API Key": "Digite a Chave API do Mojeek Search",
 	"Enter Number of Steps (e.g. 50)": "Digite o Número de Passos (por exemplo, 50)",
 	"Enter Perplexity API Key": "",
+	"Enter Playwright Timeout": "",
+	"Enter Playwright WebSocket URL": "",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "Digite o Sampler (por exemplo, Euler a)",
@@ -441,10 +452,13 @@
 	"Enter server host": "Digite o host do servidor",
 	"Enter server label": "Digite o label do servidor",
 	"Enter server port": "Digite a porta do servidor",
+	"Enter Sougou Search API sID": "",
+	"Enter Sougou Search API SK": "",
 	"Enter stop sequence": "Digite a sequência de parada",
 	"Enter system prompt": "Digite o prompt do sistema",
 	"Enter system prompt here": "",
 	"Enter Tavily API Key": "Digite a Chave API do Tavily",
+	"Enter Tavily Extract Depth": "",
 	"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": "",
@@ -525,6 +539,8 @@
 	"Filter is now globally enabled": "O filtro está agora ativado globalmente",
 	"Filters": "Filtros",
 	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Falsificação de impressão digital detectada: Não foi possível usar as iniciais como avatar. Usando a imagem de perfil padrão.",
+	"Firecrawl API Base URL": "",
+	"Firecrawl API Key": "",
 	"Fluidly stream large external response chunks": "Transmitir fluentemente grandes blocos de respostas externas",
 	"Focus chat input": "Focar entrada de chat",
 	"Folder deleted successfully": "Pasta excluída com sucesso",
@@ -589,6 +605,8 @@
 	"Hybrid Search": "Pesquisa Híbrida",
 	"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Eu reconheço que li e entendi as implicações da minha ação. Estou ciente dos riscos associados à execução de código arbitrário e verifiquei a confiabilidade da fonte.",
 	"ID": "",
+	"iframe Sandbox Allow Forms": "",
+	"iframe Sandbox Allow Same Origin": "",
 	"Ignite curiosity": "Desperte a curiosidade",
 	"Image": "",
 	"Image Compression": "",
@@ -649,6 +667,7 @@
 	"Label": "Rótulo",
 	"Landing Page Mode": "Modo Landing Page",
 	"Language": "Idioma",
+	"Language Locales": "",
 	"Last Active": "Última Atividade",
 	"Last Modified": "Última Modificação",
 	"Last reply": "",
@@ -702,7 +721,6 @@
 	"Message rating should be enabled to use this feature": "Mensagem de avaliação deve estar habilitada para usar esta função",
 	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Mensagens enviadas após criar seu link não serão compartilhadas. Usuários com o URL poderão visualizar o chat compartilhado.",
 	"Min P": "",
-	"Minimum Score": "Pontuação Mínima",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
@@ -833,6 +851,8 @@
 	"Pipelines Valves": "Válvulas de Pipelines",
 	"Plain text (.txt)": "Texto simples (.txt)",
 	"Playground": "Playground",
+	"Playwright Timeout (ms)": "",
+	"Playwright WebSocket URL": "",
 	"Please carefully review the following warnings:": "Por favor, revise cuidadosamente os seguintes avisos:",
 	"Please do not close the settings page while loading the model.": "",
 	"Please enter a prompt": "Por favor, digite um prompt",
@@ -882,6 +902,7 @@
 	"Reindex Knowledge Base Vectors": "",
 	"Release Notes": "Notas de Lançamento",
 	"Relevance": "Relevância",
+	"Relevance Threshold": "",
 	"Remove": "Remover",
 	"Remove Model": "Remover Modelo",
 	"Rename": "Renomear",
@@ -1011,6 +1032,8 @@
 	"Sign up to {{WEBUI_NAME}}": "Inscreva-se em {{WEBUI_NAME}}",
 	"Signing in to {{WEBUI_NAME}}": "Fazendo login em {{WEBUI_NAME}}",
 	"sk-1234": "",
+	"Sougou Search API sID": "",
+	"Sougou Search API SK": "",
 	"Source": "Fonte",
 	"Speech Playback Speed": "Velocidade de reprodução de fala",
 	"Speech recognition error: {{error}}": "Erro de reconhecimento de fala: {{error}}",
@@ -1038,6 +1061,7 @@
 	"Tap to interrupt": "Toque para interromper",
 	"Tasks": "",
 	"Tavily API Key": "Chave da API Tavily",
+	"Tavily Extract Depth": "",
 	"Tell us more:": "Conte-nos mais:",
 	"Temperature": "Temperatura",
 	"Template": "Template",
@@ -1179,6 +1203,7 @@
 	"variable": "variável",
 	"variable to have them replaced with clipboard content.": "variável para ser substituída pelo conteúdo da área de transferência.",
 	"Verify Connection": "",
+	"Verify SSL Certificate": "",
 	"Version": "Versão",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Versão {{selectedVersion}} de {{totalVersions}}",
 	"View Replies": "",
@@ -1193,6 +1218,7 @@
 	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
 	"Web": "Web",
 	"Web API": "API Web",
+	"Web Loader Engine": "",
 	"Web Search": "Pesquisa na Web",
 	"Web Search Engine": "Mecanismo de Busca na Web",
 	"Web Search in Chat": "",

Some files were not shown because too many files changed in this diff