Ver código fonte

Merge remote-tracking branch 'upstream/dev' into dev

oyve 5 meses atrás
pai
commit
2f2bd88dd1
100 arquivos alterados com 4007 adições e 1654 exclusões
  1. 33 0
      CHANGELOG.md
  2. 1 1
      backend/open_webui/apps/audio/main.py
  3. 2 2
      backend/open_webui/apps/images/main.py
  4. 104 4
      backend/open_webui/apps/ollama/main.py
  5. 3 2
      backend/open_webui/apps/openai/main.py
  6. 21 2
      backend/open_webui/apps/retrieval/loaders/youtube.py
  7. 33 8
      backend/open_webui/apps/retrieval/main.py
  8. 50 0
      backend/open_webui/apps/retrieval/web/kagi.py
  9. 1 1
      backend/open_webui/apps/socket/main.py
  10. 1 1
      backend/open_webui/apps/webui/models/auths.py
  11. 7 3
      backend/open_webui/apps/webui/models/tools.py
  12. 31 3
      backend/open_webui/apps/webui/routers/auths.py
  13. 1 2
      backend/open_webui/apps/webui/routers/chats.py
  14. 1 1
      backend/open_webui/apps/webui/routers/configs.py
  15. 1 1
      backend/open_webui/apps/webui/routers/evaluations.py
  16. 1 1
      backend/open_webui/apps/webui/routers/files.py
  17. 1 1
      backend/open_webui/apps/webui/routers/folders.py
  18. 1 1
      backend/open_webui/apps/webui/routers/functions.py
  19. 1 1
      backend/open_webui/apps/webui/routers/groups.py
  20. 1 1
      backend/open_webui/apps/webui/routers/knowledge.py
  21. 1 1
      backend/open_webui/apps/webui/routers/memories.py
  22. 1 1
      backend/open_webui/apps/webui/routers/models.py
  23. 1 1
      backend/open_webui/apps/webui/routers/prompts.py
  24. 1 1
      backend/open_webui/apps/webui/routers/tools.py
  25. 1 1
      backend/open_webui/apps/webui/routers/users.py
  26. 1 1
      backend/open_webui/apps/webui/routers/utils.py
  27. 85 1
      backend/open_webui/config.py
  28. 1 0
      backend/open_webui/constants.py
  29. 5 2
      backend/open_webui/env.py
  30. 118 6
      backend/open_webui/main.py
  31. 2 2
      backend/open_webui/static/assets/pdf-style.css
  32. BIN
      backend/open_webui/static/fonts/Twemoji.ttf
  33. 3 3
      backend/open_webui/test/apps/webui/routers/test_auths.py
  34. 1 1
      backend/open_webui/test/util/mock_user.py
  35. 0 0
      backend/open_webui/utils/auth.py
  36. 16 2
      backend/open_webui/utils/oauth.py
  37. 22 18
      backend/open_webui/utils/pdf_generator.py
  38. 7 0
      backend/open_webui/utils/security_headers.py
  39. 35 8
      backend/open_webui/utils/task.py
  40. 5 5
      backend/requirements.txt
  41. 34 26
      package-lock.json
  42. 1 1
      package.json
  43. 5 5
      pyproject.toml
  44. 12 4
      src/app.css
  45. 6 3
      src/app.html
  46. 71 0
      src/lib/apis/index.ts
  47. 1 0
      src/lib/apis/retrieval/index.ts
  48. 9 4
      src/lib/components/admin/Settings/Images.svelte
  49. 39 6
      src/lib/components/admin/Settings/Interface.svelte
  50. 5 5
      src/lib/components/admin/Settings/Models.svelte
  51. 29 21
      src/lib/components/admin/Settings/Models/ConfigureModelsModal.svelte
  52. 31 1
      src/lib/components/admin/Settings/WebSearch.svelte
  53. 31 27
      src/lib/components/admin/Users/UserList/UserChatsModal.svelte
  54. 3 3
      src/lib/components/chat/Chat.svelte
  55. 144 116
      src/lib/components/chat/MessageInput.svelte
  56. 1 1
      src/lib/components/chat/MessageInput/Commands.svelte
  57. 1 1
      src/lib/components/chat/MessageInput/Commands/Knowledge.svelte
  58. 1 1
      src/lib/components/chat/MessageInput/Commands/Models.svelte
  59. 1 1
      src/lib/components/chat/MessageInput/Commands/Prompts.svelte
  60. 1 0
      src/lib/components/chat/Messages.svelte
  61. 2 2
      src/lib/components/chat/Messages/Error.svelte
  62. 14 14
      src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte
  63. 1 1
      src/lib/components/chat/Messages/ResponseMessage.svelte
  64. 3 1
      src/lib/components/common/Banner.svelte
  65. 62 40
      src/lib/components/common/FileItem.svelte
  66. 3 1
      src/lib/components/common/Modal.svelte
  67. 84 20
      src/lib/components/common/RichTextInput.svelte
  68. 278 0
      src/lib/components/common/RichTextInput/AutoCompletion.js
  69. 49 9
      src/lib/components/common/Textarea.svelte
  70. 198 213
      src/lib/components/workspace/Knowledge/KnowledgeBase.svelte
  71. 7 3
      src/lib/components/workspace/Knowledge/KnowledgeBase/AddTextContentModal.svelte
  72. 3 0
      src/lib/components/workspace/Knowledge/KnowledgeBase/Files.svelte
  73. 13 3
      src/lib/components/workspace/Models/ModelEditor.svelte
  74. 11 3
      src/lib/i18n/locales/ar-BH/translation.json
  75. 11 3
      src/lib/i18n/locales/bg-BG/translation.json
  76. 11 3
      src/lib/i18n/locales/bn-BD/translation.json
  77. 18 10
      src/lib/i18n/locales/ca-ES/translation.json
  78. 11 3
      src/lib/i18n/locales/ceb-PH/translation.json
  79. 94 86
      src/lib/i18n/locales/cs-CZ/translation.json
  80. 11 3
      src/lib/i18n/locales/da-DK/translation.json
  81. 11 3
      src/lib/i18n/locales/de-DE/translation.json
  82. 11 3
      src/lib/i18n/locales/dg-DG/translation.json
  83. 1025 0
      src/lib/i18n/locales/el-GR/translation.json
  84. 11 3
      src/lib/i18n/locales/en-GB/translation.json
  85. 11 3
      src/lib/i18n/locales/en-US/translation.json
  86. 11 3
      src/lib/i18n/locales/es-ES/translation.json
  87. 11 3
      src/lib/i18n/locales/eu-ES/translation.json
  88. 11 3
      src/lib/i18n/locales/fa-IR/translation.json
  89. 670 663
      src/lib/i18n/locales/fi-FI/translation.json
  90. 11 3
      src/lib/i18n/locales/fr-CA/translation.json
  91. 214 206
      src/lib/i18n/locales/fr-FR/translation.json
  92. 11 3
      src/lib/i18n/locales/he-IL/translation.json
  93. 11 3
      src/lib/i18n/locales/hi-IN/translation.json
  94. 11 3
      src/lib/i18n/locales/hr-HR/translation.json
  95. 11 3
      src/lib/i18n/locales/hu-HU/translation.json
  96. 11 3
      src/lib/i18n/locales/id-ID/translation.json
  97. 11 3
      src/lib/i18n/locales/ie-GA/translation.json
  98. 11 3
      src/lib/i18n/locales/it-IT/translation.json
  99. 11 3
      src/lib/i18n/locales/ja-JP/translation.json
  100. 11 3
      src/lib/i18n/locales/ka-GE/translation.json

+ 33 - 0
CHANGELOG.md

@@ -5,6 +5,39 @@ 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.4.8] - 2024-12-07
+
+### Added
+
+- **🔓 Bypass Model Access Control**: Introduced the 'BYPASS_MODEL_ACCESS_CONTROL' environment variable. Easily bypass model access controls for user roles when access control isn't required, simplifying workflows for trusted environments.
+- **📝 Markdown in Banners**: Now supports markdown for banners, enabling richer, more visually engaging announcements.
+- **🌐 Internationalization Updates**: Enhanced translations across multiple languages, further improving accessibility and global user experience.
+- **🎨 Styling Enhancements**: General UI style refinements for a cleaner and more polished interface.
+- **📋 Rich Text Reliability**: Improved the reliability and stability of rich text input across chats for smoother interactions.
+
+### Fixed
+
+- **💡 Tailwind Build Issue**: Resolved a breaking bug caused by Tailwind, ensuring smoother builds and overall system reliability.
+- **📚 Knowledge Collection Query Fix**: Addressed API endpoint issues with querying knowledge collections, ensuring accurate and reliable information retrieval.
+
+## [0.4.7] - 2024-12-01
+
+### Added
+
+- **✨ Prompt Input Auto-Completion**: Type a prompt and let AI intelligently suggest and complete your inputs. Simply press 'Tab' or swipe right on mobile to confirm. Available only with Rich Text Input (default setting). Disable via Admin Settings for full control.
+- **🌍 Improved Translations**: Enhanced localization for multiple languages, ensuring a more polished and accessible experience for international users.
+
+### Fixed
+
+- **🛠️ Tools Export Issue**: Resolved a critical issue where exporting tools wasn’t functioning, restoring seamless export capabilities.
+- **🔗 Model ID Registration**: Fixed an issue where model IDs weren’t registering correctly in the model editor, ensuring reliable model setup and tracking.
+- **🖋️ Textarea Auto-Expansion**: Corrected a bug where textareas didn’t expand automatically on certain browsers, improving usability for multi-line inputs.
+- **🔧 Ollama Embed Endpoint**: Addressed the /ollama/embed endpoint malfunction, ensuring consistent performance and functionality.
+
+### Changed
+
+- **🎨 Knowledge Base Styling**: Refined knowledge base visuals for a cleaner, more modern look, laying the groundwork for further enhancements in upcoming releases.
+
 ## [0.4.6] - 2024-11-26
 
 ### Added

+ 1 - 1
backend/open_webui/apps/audio/main.py

@@ -45,7 +45,7 @@ from fastapi import Depends, FastAPI, File, HTTPException, Request, UploadFile,
 from fastapi.middleware.cors import CORSMiddleware
 from fastapi.responses import FileResponse
 from pydantic import BaseModel
-from open_webui.utils.utils import get_admin_user, get_verified_user
+from open_webui.utils.auth import get_admin_user, get_verified_user
 
 # Constants
 MAX_FILE_SIZE_MB = 25

+ 2 - 2
backend/open_webui/apps/images/main.py

@@ -40,7 +40,7 @@ from open_webui.env import ENV, SRC_LOG_LEVELS, ENABLE_FORWARD_USER_INFO_HEADERS
 from fastapi import Depends, FastAPI, HTTPException, Request
 from fastapi.middleware.cors import CORSMiddleware
 from pydantic import BaseModel
-from open_webui.utils.utils import get_admin_user, get_verified_user
+from open_webui.utils.auth import get_admin_user, get_verified_user
 
 log = logging.getLogger(__name__)
 log.setLevel(SRC_LOG_LEVELS["IMAGES"])
@@ -117,7 +117,7 @@ class OpenAIConfigForm(BaseModel):
 class Automatic1111ConfigForm(BaseModel):
     AUTOMATIC1111_BASE_URL: str
     AUTOMATIC1111_API_AUTH: str
-    AUTOMATIC1111_CFG_SCALE: Optional[str]
+    AUTOMATIC1111_CFG_SCALE: Optional[str | float | int]
     AUTOMATIC1111_SAMPLER: Optional[str]
     AUTOMATIC1111_SCHEDULER: Optional[str]
 

+ 104 - 4
backend/open_webui/apps/ollama/main.py

@@ -24,6 +24,7 @@ from open_webui.config import (
 from open_webui.env import (
     AIOHTTP_CLIENT_TIMEOUT,
     AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST,
+    BYPASS_MODEL_ACCESS_CONTROL,
 )
 
 
@@ -44,7 +45,7 @@ from open_webui.utils.payload import (
     apply_model_params_to_body_openai,
     apply_model_system_prompt_to_body,
 )
-from open_webui.utils.utils import get_admin_user, get_verified_user
+from open_webui.utils.auth import get_admin_user, get_verified_user
 from open_webui.utils.access_control import has_access
 
 log = logging.getLogger(__name__)
@@ -359,7 +360,7 @@ async def get_ollama_tags(
                 detail=error_detail,
             )
 
-    if user.role == "user":
+    if user.role == "user" and not BYPASS_MODEL_ACCESS_CONTROL:
         # Filter models based on user access control
         filtered_models = []
         for model in models.get("models", []):
@@ -432,6 +433,26 @@ async def get_ollama_versions(url_idx: Optional[int] = None):
         return {"version": False}
 
 
+@app.get("/api/ps")
+async def get_ollama_loaded_models(user=Depends(get_verified_user)):
+    """
+    List models that are currently loaded into Ollama memory, and which node they are loaded on.
+    """
+    if app.state.config.ENABLE_OLLAMA_API:
+        tasks = [
+            aiohttp_get(
+                f"{url}/api/ps",
+                app.state.config.OLLAMA_API_CONFIGS.get(url, {}).get("key", None),
+            )
+            for url in app.state.config.OLLAMA_BASE_URLS
+        ]
+        responses = await asyncio.gather(*tasks)
+
+        return dict(zip(app.state.config.OLLAMA_BASE_URLS, responses))
+    else:
+        return {}
+
+
 class ModelNameForm(BaseModel):
     name: str
 
@@ -706,7 +727,7 @@ async def generate_embeddings(
     url_idx: Optional[int] = None,
     user=Depends(get_verified_user),
 ):
-    return generate_ollama_batch_embeddings(form_data, url_idx)
+    return await generate_ollama_batch_embeddings(form_data, url_idx)
 
 
 @app.post("/api/embeddings")
@@ -946,6 +967,9 @@ async def generate_chat_completion(
     user=Depends(get_verified_user),
     bypass_filter: Optional[bool] = False,
 ):
+    if BYPASS_MODEL_ACCESS_CONTROL:
+        bypass_filter = True
+
     payload = {**form_data.model_dump(exclude_none=True)}
     log.debug(f"generate_chat_completion() - 1.payload = {payload}")
     if "metadata" in payload:
@@ -1031,6 +1055,82 @@ class OpenAIChatCompletionForm(BaseModel):
     model_config = ConfigDict(extra="allow")
 
 
+class OpenAICompletionForm(BaseModel):
+    model: str
+    prompt: str
+
+    model_config = ConfigDict(extra="allow")
+
+
+@app.post("/v1/completions")
+@app.post("/v1/completions/{url_idx}")
+async def generate_openai_completion(
+    form_data: dict, url_idx: Optional[int] = None, user=Depends(get_verified_user)
+):
+    try:
+        form_data = OpenAICompletionForm(**form_data)
+    except Exception as e:
+        log.exception(e)
+        raise HTTPException(
+            status_code=400,
+            detail=str(e),
+        )
+
+    payload = {**form_data.model_dump(exclude_none=True, exclude=["metadata"])}
+    if "metadata" in payload:
+        del payload["metadata"]
+
+    model_id = form_data.model
+    if ":" not in model_id:
+        model_id = f"{model_id}:latest"
+
+    model_info = Models.get_model_by_id(model_id)
+    if model_info:
+        if model_info.base_model_id:
+            payload["model"] = model_info.base_model_id
+        params = model_info.params.model_dump()
+
+        if params:
+            payload = apply_model_params_to_body_openai(params, payload)
+
+        # Check if user has access to the model
+        if user.role == "user":
+            if not (
+                user.id == model_info.user_id
+                or has_access(
+                    user.id, type="read", access_control=model_info.access_control
+                )
+            ):
+                raise HTTPException(
+                    status_code=403,
+                    detail="Model not found",
+                )
+    else:
+        if user.role != "admin":
+            raise HTTPException(
+                status_code=403,
+                detail="Model not found",
+            )
+
+    if ":" not in payload["model"]:
+        payload["model"] = f"{payload['model']}:latest"
+
+    url = await get_ollama_url(url_idx, payload["model"])
+    log.info(f"url: {url}")
+
+    api_config = app.state.config.OLLAMA_API_CONFIGS.get(url, {})
+    prefix_id = api_config.get("prefix_id", None)
+
+    if prefix_id:
+        payload["model"] = payload["model"].replace(f"{prefix_id}.", "")
+
+    return await post_streaming_url(
+        f"{url}/v1/completions",
+        json.dumps(payload),
+        stream=payload.get("stream", False),
+    )
+
+
 @app.post("/v1/chat/completions")
 @app.post("/v1/chat/completions/{url_idx}")
 async def generate_openai_chat_completion(
@@ -1156,7 +1256,7 @@ async def get_openai_models(
                 detail=error_detail,
             )
 
-    if user.role == "user":
+    if user.role == "user" and not BYPASS_MODEL_ACCESS_CONTROL:
         # Filter models based on user access control
         filtered_models = []
         for model in models:

+ 3 - 2
backend/open_webui/apps/openai/main.py

@@ -24,6 +24,7 @@ from open_webui.env import (
     AIOHTTP_CLIENT_TIMEOUT,
     AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST,
     ENABLE_FORWARD_USER_INFO_HEADERS,
+    BYPASS_MODEL_ACCESS_CONTROL,
 )
 
 from open_webui.constants import ERROR_MESSAGES
@@ -39,7 +40,7 @@ from open_webui.utils.payload import (
     apply_model_system_prompt_to_body,
 )
 
-from open_webui.utils.utils import get_admin_user, get_verified_user
+from open_webui.utils.auth import get_admin_user, get_verified_user
 from open_webui.utils.access_control import has_access
 
 
@@ -422,7 +423,7 @@ async def get_models(url_idx: Optional[int] = None, user=Depends(get_verified_us
                 error_detail = f"Unexpected error: {str(e)}"
                 raise HTTPException(status_code=500, detail=error_detail)
 
-    if user.role == "user":
+    if user.role == "user" and not BYPASS_MODEL_ACCESS_CONTROL:
         # Filter models based on user access control
         filtered_models = []
         for model in models.get("data", []):

+ 21 - 2
backend/open_webui/apps/retrieval/loaders/youtube.py

@@ -1,7 +1,12 @@
+import logging
+
 from typing import Any, Dict, Generator, List, Optional, Sequence, Union
 from urllib.parse import parse_qs, urlparse
 from langchain_core.documents import Document
+from open_webui.env import SRC_LOG_LEVELS
 
+log = logging.getLogger(__name__)
+log.setLevel(SRC_LOG_LEVELS["RAG"])
 
 ALLOWED_SCHEMES = {"http", "https"}
 ALLOWED_NETLOCS = {
@@ -51,12 +56,14 @@ class YoutubeLoader:
         self,
         video_id: str,
         language: Union[str, Sequence[str]] = "en",
+        proxy_url: Optional[str] = None,
     ):
         """Initialize with YouTube video ID."""
         _video_id = _parse_video_id(video_id)
         self.video_id = _video_id if _video_id is not None else video_id
         self._metadata = {"source": video_id}
         self.language = language
+        self.proxy_url = proxy_url
         if isinstance(language, str):
             self.language = [language]
         else:
@@ -76,10 +83,22 @@ class YoutubeLoader:
                 "Please install it with `pip install youtube-transcript-api`."
             )
 
+        if self.proxy_url:
+            youtube_proxies = {
+                "http": self.proxy_url,
+                "https": self.proxy_url,
+            }
+            # Don't log complete URL because it might contain secrets
+            log.debug(f"Using proxy URL: {self.proxy_url[:14]}...")
+        else:
+            youtube_proxies = None
+
         try:
-            transcript_list = YouTubeTranscriptApi.list_transcripts(self.video_id)
+            transcript_list = YouTubeTranscriptApi.list_transcripts(
+                self.video_id, proxies=youtube_proxies
+            )
         except Exception as e:
-            print(e)
+            log.exception("Loading YouTube transcript failed")
             return []
 
         try:

+ 33 - 8
backend/open_webui/apps/retrieval/main.py

@@ -29,6 +29,7 @@ from open_webui.apps.retrieval.loaders.youtube import YoutubeLoader
 from open_webui.apps.retrieval.web.main import SearchResult
 from open_webui.apps.retrieval.web.utils import get_web_loader
 from open_webui.apps.retrieval.web.brave import search_brave
+from open_webui.apps.retrieval.web.kagi import search_kagi
 from open_webui.apps.retrieval.web.mojeek import search_mojeek
 from open_webui.apps.retrieval.web.duckduckgo import search_duckduckgo
 from open_webui.apps.retrieval.web.google_pse import search_google_pse
@@ -54,6 +55,7 @@ from open_webui.apps.retrieval.utils import (
 from open_webui.apps.webui.models.files import Files
 from open_webui.config import (
     BRAVE_SEARCH_API_KEY,
+    KAGI_SEARCH_API_KEY,
     MOJEEK_SEARCH_API_KEY,
     TIKTOKEN_ENCODING_NAME,
     RAG_TEXT_SPLITTER,
@@ -105,6 +107,7 @@ from open_webui.config import (
     TIKA_SERVER_URL,
     UPLOAD_DIR,
     YOUTUBE_LOADER_LANGUAGE,
+    YOUTUBE_LOADER_PROXY_URL,
     DEFAULT_LOCALE,
     AppConfig,
 )
@@ -120,7 +123,7 @@ from open_webui.utils.misc import (
     extract_folders_after_data_docs,
     sanitize_filename,
 )
-from open_webui.utils.utils import get_admin_user, get_verified_user
+from open_webui.utils.auth import get_admin_user, get_verified_user
 
 from langchain.text_splitter import RecursiveCharacterTextSplitter, TokenTextSplitter
 from langchain_core.documents import Document
@@ -171,6 +174,7 @@ app.state.config.OLLAMA_API_KEY = RAG_OLLAMA_API_KEY
 app.state.config.PDF_EXTRACT_IMAGES = PDF_EXTRACT_IMAGES
 
 app.state.config.YOUTUBE_LOADER_LANGUAGE = YOUTUBE_LOADER_LANGUAGE
+app.state.config.YOUTUBE_LOADER_PROXY_URL = YOUTUBE_LOADER_PROXY_URL
 app.state.YOUTUBE_LOADER_TRANSLATION = None
 
 
@@ -182,6 +186,7 @@ app.state.config.SEARXNG_QUERY_URL = SEARXNG_QUERY_URL
 app.state.config.GOOGLE_PSE_API_KEY = GOOGLE_PSE_API_KEY
 app.state.config.GOOGLE_PSE_ENGINE_ID = GOOGLE_PSE_ENGINE_ID
 app.state.config.BRAVE_SEARCH_API_KEY = BRAVE_SEARCH_API_KEY
+app.state.config.KAGI_SEARCH_API_KEY = KAGI_SEARCH_API_KEY
 app.state.config.MOJEEK_SEARCH_API_KEY = MOJEEK_SEARCH_API_KEY
 app.state.config.SERPSTACK_API_KEY = SERPSTACK_API_KEY
 app.state.config.SERPSTACK_HTTPS = SERPSTACK_HTTPS
@@ -471,6 +476,7 @@ async def get_rag_config(user=Depends(get_admin_user)):
         "youtube": {
             "language": app.state.config.YOUTUBE_LOADER_LANGUAGE,
             "translation": app.state.YOUTUBE_LOADER_TRANSLATION,
+            "proxy_url": app.state.config.YOUTUBE_LOADER_PROXY_URL,
         },
         "web": {
             "web_loader_ssl_verification": app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION,
@@ -481,6 +487,7 @@ async def get_rag_config(user=Depends(get_admin_user)):
                 "google_pse_api_key": app.state.config.GOOGLE_PSE_API_KEY,
                 "google_pse_engine_id": app.state.config.GOOGLE_PSE_ENGINE_ID,
                 "brave_search_api_key": app.state.config.BRAVE_SEARCH_API_KEY,
+                "kagi_search_api_key": app.state.config.KAGI_SEARCH_API_KEY,
                 "mojeek_search_api_key": app.state.config.MOJEEK_SEARCH_API_KEY,
                 "serpstack_api_key": app.state.config.SERPSTACK_API_KEY,
                 "serpstack_https": app.state.config.SERPSTACK_HTTPS,
@@ -518,6 +525,7 @@ class ChunkParamUpdateForm(BaseModel):
 class YoutubeLoaderConfig(BaseModel):
     language: list[str]
     translation: Optional[str] = None
+    proxy_url: str = ""
 
 
 class WebSearchConfig(BaseModel):
@@ -527,6 +535,7 @@ class WebSearchConfig(BaseModel):
     google_pse_api_key: Optional[str] = None
     google_pse_engine_id: Optional[str] = None
     brave_search_api_key: Optional[str] = None
+    kagi_search_api_key: Optional[str] = None
     mojeek_search_api_key: Optional[str] = None
     serpstack_api_key: Optional[str] = None
     serpstack_https: Optional[bool] = None
@@ -580,6 +589,7 @@ async def update_rag_config(form_data: ConfigUpdateForm, user=Depends(get_admin_
 
     if form_data.youtube is not None:
         app.state.config.YOUTUBE_LOADER_LANGUAGE = form_data.youtube.language
+        app.state.config.YOUTUBE_LOADER_PROXY_URL = form_data.youtube.proxy_url
         app.state.YOUTUBE_LOADER_TRANSLATION = form_data.youtube.translation
 
     if form_data.web is not None:
@@ -598,6 +608,7 @@ async def update_rag_config(form_data: ConfigUpdateForm, user=Depends(get_admin_
         app.state.config.BRAVE_SEARCH_API_KEY = (
             form_data.web.search.brave_search_api_key
         )
+        app.state.config.KAGI_SEARCH_API_KEY = form_data.web.search.kagi_search_api_key
         app.state.config.MOJEEK_SEARCH_API_KEY = (
             form_data.web.search.mojeek_search_api_key
         )
@@ -640,6 +651,7 @@ async def update_rag_config(form_data: ConfigUpdateForm, user=Depends(get_admin_
         },
         "youtube": {
             "language": app.state.config.YOUTUBE_LOADER_LANGUAGE,
+            "proxy_url": app.state.config.YOUTUBE_LOADER_PROXY_URL,
             "translation": app.state.YOUTUBE_LOADER_TRANSLATION,
         },
         "web": {
@@ -651,6 +663,7 @@ async def update_rag_config(form_data: ConfigUpdateForm, user=Depends(get_admin_
                 "google_pse_api_key": app.state.config.GOOGLE_PSE_API_KEY,
                 "google_pse_engine_id": app.state.config.GOOGLE_PSE_ENGINE_ID,
                 "brave_search_api_key": app.state.config.BRAVE_SEARCH_API_KEY,
+                "kagi_search_api_key": app.state.config.KAGI_SEARCH_API_KEY,
                 "mojeek_search_api_key": app.state.config.MOJEEK_SEARCH_API_KEY,
                 "serpstack_api_key": app.state.config.SERPSTACK_API_KEY,
                 "serpstack_https": app.state.config.SERPSTACK_HTTPS,
@@ -867,7 +880,7 @@ def save_docs_to_vector_db(
         return True
     except Exception as e:
         log.exception(e)
-        return False
+        raise e
 
 
 class ProcessFileForm(BaseModel):
@@ -897,7 +910,7 @@ def process_file(
 
             docs = [
                 Document(
-                    page_content=form_data.content,
+                    page_content=form_data.content.replace("<br/>", "\n"),
                     metadata={
                         **file.meta,
                         "name": file.filename,
@@ -1081,7 +1094,9 @@ def process_youtube_video(form_data: ProcessUrlForm, user=Depends(get_verified_u
             collection_name = calculate_sha256_string(form_data.url)[:63]
 
         loader = YoutubeLoader(
-            form_data.url, language=app.state.config.YOUTUBE_LOADER_LANGUAGE
+            form_data.url,
+            language=app.state.config.YOUTUBE_LOADER_LANGUAGE,
+            proxy_url=app.state.config.YOUTUBE_LOADER_PROXY_URL,
         )
 
         docs = loader.load()
@@ -1154,6 +1169,7 @@ def search_web(engine: str, query: str) -> list[SearchResult]:
     - SEARXNG_QUERY_URL
     - GOOGLE_PSE_API_KEY + GOOGLE_PSE_ENGINE_ID
     - BRAVE_SEARCH_API_KEY
+    - KAGI_SEARCH_API_KEY
     - MOJEEK_SEARCH_API_KEY
     - SERPSTACK_API_KEY
     - SERPER_API_KEY
@@ -1201,6 +1217,16 @@ def search_web(engine: str, query: str) -> list[SearchResult]:
             )
         else:
             raise Exception("No BRAVE_SEARCH_API_KEY found in environment variables")
+    elif engine == "kagi":
+        if app.state.config.KAGI_SEARCH_API_KEY:
+            return search_kagi(
+                app.state.config.KAGI_SEARCH_API_KEY,
+                query,
+                app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
+                app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST,
+            )
+        else:
+            raise Exception("No KAGI_SEARCH_API_KEY found in environment variables")
     elif engine == "mojeek":
         if app.state.config.MOJEEK_SEARCH_API_KEY:
             return search_mojeek(
@@ -1362,8 +1388,7 @@ def query_doc_handler(
         else:
             return query_doc(
                 collection_name=form_data.collection_name,
-                query=form_data.query,
-                embedding_function=app.state.EMBEDDING_FUNCTION,
+                query_embedding=app.state.EMBEDDING_FUNCTION(form_data.query),
                 k=form_data.k if form_data.k else app.state.config.TOP_K,
             )
     except Exception as e:
@@ -1391,7 +1416,7 @@ def query_collection_handler(
         if app.state.config.ENABLE_RAG_HYBRID_SEARCH:
             return query_collection_with_hybrid_search(
                 collection_names=form_data.collection_names,
-                query=form_data.query,
+                queries=[form_data.query],
                 embedding_function=app.state.EMBEDDING_FUNCTION,
                 k=form_data.k if form_data.k else app.state.config.TOP_K,
                 reranking_function=app.state.sentence_transformer_rf,
@@ -1402,7 +1427,7 @@ def query_collection_handler(
         else:
             return query_collection(
                 collection_names=form_data.collection_names,
-                query=form_data.query,
+                queries=[form_data.query],
                 embedding_function=app.state.EMBEDDING_FUNCTION,
                 k=form_data.k if form_data.k else app.state.config.TOP_K,
             )

+ 50 - 0
backend/open_webui/apps/retrieval/web/kagi.py

@@ -0,0 +1,50 @@
+import logging
+from typing import Optional
+
+import requests
+from open_webui.apps.retrieval.web.main import SearchResult, get_filtered_results
+from open_webui.env import SRC_LOG_LEVELS
+
+log = logging.getLogger(__name__)
+log.setLevel(SRC_LOG_LEVELS["RAG"])
+
+
+def search_kagi(
+    api_key: str, query: str, count: int, filter_list: Optional[list[str]] = None
+) -> list[SearchResult]:
+    """Search using Kagi's Search API and return the results as a list of SearchResult objects.
+
+    The Search API will inherit the settings in your account, including results personalization and snippet length.
+
+    Args:
+        api_key (str): A Kagi Search API key
+        query (str): The query to search for
+        count (int): The number of results to return
+    """
+    url = "https://kagi.com/api/v0/search"
+    headers = {
+        "Authorization": f"Bot {api_key}",
+    }
+    params = {"q": query, "limit": count}
+
+    response = requests.get(url, headers=headers, params=params)
+    response.raise_for_status()
+    json_response = response.json()
+    search_results = json_response.get("data", [])
+    
+    results = [
+        SearchResult(
+            link=result["url"],
+            title=result["title"],
+            snippet=result.get("snippet")
+        )
+        for result in search_results
+        if result["t"] == 0
+    ]
+    
+    print(results)
+
+    if filter_list:
+        results = get_filtered_results(results, filter_list)
+
+    return results

+ 1 - 1
backend/open_webui/apps/socket/main.py

@@ -12,7 +12,7 @@ from open_webui.env import (
     WEBSOCKET_MANAGER,
     WEBSOCKET_REDIS_URL,
 )
-from open_webui.utils.utils import decode_token
+from open_webui.utils.auth import decode_token
 from open_webui.apps.socket.utils import RedisDict
 
 from open_webui.env import (

+ 1 - 1
backend/open_webui/apps/webui/models/auths.py

@@ -7,7 +7,7 @@ from open_webui.apps.webui.models.users import UserModel, Users
 from open_webui.env import SRC_LOG_LEVELS
 from pydantic import BaseModel
 from sqlalchemy import Boolean, Column, String, Text
-from open_webui.utils.utils import verify_password
+from open_webui.utils.auth import verify_password
 
 log = logging.getLogger(__name__)
 log.setLevel(SRC_LOG_LEVELS["MODELS"])

+ 7 - 3
backend/open_webui/apps/webui/models/tools.py

@@ -76,6 +76,10 @@ class ToolModel(BaseModel):
 ####################
 
 
+class ToolUserModel(ToolModel):
+    user: Optional[UserResponse] = None
+
+
 class ToolResponse(BaseModel):
     id: str
     user_id: str
@@ -138,13 +142,13 @@ class ToolsTable:
         except Exception:
             return None
 
-    def get_tools(self) -> list[ToolUserResponse]:
+    def get_tools(self) -> list[ToolUserModel]:
         with get_db() as db:
             tools = []
             for tool in db.query(Tool).order_by(Tool.updated_at.desc()).all():
                 user = Users.get_user_by_id(tool.user_id)
                 tools.append(
-                    ToolUserResponse.model_validate(
+                    ToolUserModel.model_validate(
                         {
                             **ToolModel.model_validate(tool).model_dump(),
                             "user": user.model_dump() if user else None,
@@ -155,7 +159,7 @@ class ToolsTable:
 
     def get_tools_by_user_id(
         self, user_id: str, permission: str = "write"
-    ) -> list[ToolUserResponse]:
+    ) -> list[ToolUserModel]:
         tools = self.get_tools()
 
         return [

+ 31 - 3
backend/open_webui/apps/webui/routers/auths.py

@@ -3,6 +3,7 @@ import uuid
 import time
 import datetime
 import logging
+from aiohttp import ClientSession
 
 from open_webui.apps.webui.models.auths import (
     AddUserForm,
@@ -29,10 +30,14 @@ from open_webui.env import (
     SRC_LOG_LEVELS,
 )
 from fastapi import APIRouter, Depends, HTTPException, Request, status
-from fastapi.responses import Response
+from fastapi.responses import RedirectResponse, Response
+from open_webui.config import (
+    OPENID_PROVIDER_URL,
+    ENABLE_OAUTH_SIGNUP,
+)
 from pydantic import BaseModel
 from open_webui.utils.misc import parse_duration, validate_email_format
-from open_webui.utils.utils import (
+from open_webui.utils.auth import (
     create_api_key,
     create_token,
     get_admin_user,
@@ -498,8 +503,31 @@ async def signup(request: Request, response: Response, form_data: SignupForm):
 
 
 @router.get("/signout")
-async def signout(response: Response):
+async def signout(request: Request, response: Response):
     response.delete_cookie("token")
+
+    if ENABLE_OAUTH_SIGNUP.value:
+        oauth_id_token = request.cookies.get("oauth_id_token")
+        if oauth_id_token:
+            try:
+                async with ClientSession() as session:
+                    async with session.get(OPENID_PROVIDER_URL.value) as resp:
+                        if resp.status == 200:
+                            openid_data = await resp.json()
+                            logout_url = openid_data.get("end_session_endpoint")
+                            if logout_url:
+                                response.delete_cookie("oauth_id_token")
+                                return RedirectResponse(
+                                    url=f"{logout_url}?id_token_hint={oauth_id_token}"
+                                )
+                        else:
+                            raise HTTPException(
+                                status_code=resp.status,
+                                detail="Failed to fetch OpenID configuration",
+                            )
+            except Exception as e:
+                raise HTTPException(status_code=500, detail=str(e))
+
     return {"status": True}
 
 

+ 1 - 2
backend/open_webui/apps/webui/routers/chats.py

@@ -19,7 +19,7 @@ from fastapi import APIRouter, Depends, HTTPException, Request, status
 from pydantic import BaseModel
 
 
-from open_webui.utils.utils import get_admin_user, get_verified_user
+from open_webui.utils.auth import get_admin_user, get_verified_user
 from open_webui.utils.access_control import has_permission
 
 log = logging.getLogger(__name__)
@@ -607,7 +607,6 @@ async def add_tag_by_id_and_tag_name(
                 detail=ERROR_MESSAGES.DEFAULT("Tag name cannot be 'None'"),
             )
 
-        print(tags, tag_id)
         if tag_id not in tags:
             Chats.add_chat_tag_by_id_and_user_id_and_tag_name(
                 id, user.id, form_data.name

+ 1 - 1
backend/open_webui/apps/webui/routers/configs.py

@@ -3,7 +3,7 @@ from pydantic import BaseModel
 
 from typing import Optional
 
-from open_webui.utils.utils import get_admin_user, get_verified_user
+from open_webui.utils.auth import get_admin_user, get_verified_user
 from open_webui.config import get_config, save_config
 from open_webui.config import BannerModel
 

+ 1 - 1
backend/open_webui/apps/webui/routers/evaluations.py

@@ -11,7 +11,7 @@ from open_webui.apps.webui.models.feedbacks import (
 )
 
 from open_webui.constants import ERROR_MESSAGES
-from open_webui.utils.utils import get_admin_user, get_verified_user
+from open_webui.utils.auth import get_admin_user, get_verified_user
 
 router = APIRouter()
 

+ 1 - 1
backend/open_webui/apps/webui/routers/files.py

@@ -25,7 +25,7 @@ from fastapi import APIRouter, Depends, File, HTTPException, UploadFile, status
 from fastapi.responses import FileResponse, StreamingResponse
 
 
-from open_webui.utils.utils import get_admin_user, get_verified_user
+from open_webui.utils.auth import get_admin_user, get_verified_user
 
 log = logging.getLogger(__name__)
 log.setLevel(SRC_LOG_LEVELS["MODELS"])

+ 1 - 1
backend/open_webui/apps/webui/routers/folders.py

@@ -24,7 +24,7 @@ from fastapi import APIRouter, Depends, File, HTTPException, UploadFile, status
 from fastapi.responses import FileResponse, StreamingResponse
 
 
-from open_webui.utils.utils import get_admin_user, get_verified_user
+from open_webui.utils.auth import get_admin_user, get_verified_user
 
 log = logging.getLogger(__name__)
 log.setLevel(SRC_LOG_LEVELS["MODELS"])

+ 1 - 1
backend/open_webui/apps/webui/routers/functions.py

@@ -12,7 +12,7 @@ from open_webui.apps.webui.utils import load_function_module_by_id, replace_impo
 from open_webui.config import CACHE_DIR
 from open_webui.constants import ERROR_MESSAGES
 from fastapi import APIRouter, Depends, HTTPException, Request, status
-from open_webui.utils.utils import get_admin_user, get_verified_user
+from open_webui.utils.auth import get_admin_user, get_verified_user
 
 router = APIRouter()
 

+ 1 - 1
backend/open_webui/apps/webui/routers/groups.py

@@ -12,7 +12,7 @@ from open_webui.apps.webui.models.groups import (
 from open_webui.config import CACHE_DIR
 from open_webui.constants import ERROR_MESSAGES
 from fastapi import APIRouter, Depends, HTTPException, Request, status
-from open_webui.utils.utils import get_admin_user, get_verified_user
+from open_webui.utils.auth import get_admin_user, get_verified_user
 
 router = APIRouter()
 

+ 1 - 1
backend/open_webui/apps/webui/routers/knowledge.py

@@ -16,7 +16,7 @@ from open_webui.apps.retrieval.main import process_file, ProcessFileForm
 
 
 from open_webui.constants import ERROR_MESSAGES
-from open_webui.utils.utils import get_admin_user, get_verified_user
+from open_webui.utils.auth import get_admin_user, get_verified_user
 from open_webui.utils.access_control import has_access, has_permission
 
 

+ 1 - 1
backend/open_webui/apps/webui/routers/memories.py

@@ -5,7 +5,7 @@ from typing import Optional
 
 from open_webui.apps.webui.models.memories import Memories, MemoryModel
 from open_webui.apps.retrieval.vector.connector import VECTOR_DB_CLIENT
-from open_webui.utils.utils import get_verified_user
+from open_webui.utils.auth import get_verified_user
 from open_webui.env import SRC_LOG_LEVELS
 
 

+ 1 - 1
backend/open_webui/apps/webui/routers/models.py

@@ -11,7 +11,7 @@ from open_webui.constants import ERROR_MESSAGES
 from fastapi import APIRouter, Depends, HTTPException, Request, status
 
 
-from open_webui.utils.utils import get_admin_user, get_verified_user
+from open_webui.utils.auth import get_admin_user, get_verified_user
 from open_webui.utils.access_control import has_access, has_permission
 
 

+ 1 - 1
backend/open_webui/apps/webui/routers/prompts.py

@@ -8,7 +8,7 @@ from open_webui.apps.webui.models.prompts import (
 )
 from open_webui.constants import ERROR_MESSAGES
 from fastapi import APIRouter, Depends, HTTPException, status, Request
-from open_webui.utils.utils import get_admin_user, get_verified_user
+from open_webui.utils.auth import get_admin_user, get_verified_user
 from open_webui.utils.access_control import has_access, has_permission
 
 router = APIRouter()

+ 1 - 1
backend/open_webui/apps/webui/routers/tools.py

@@ -13,7 +13,7 @@ from open_webui.config import CACHE_DIR
 from open_webui.constants import ERROR_MESSAGES
 from fastapi import APIRouter, Depends, HTTPException, Request, status
 from open_webui.utils.tools import get_tools_specs
-from open_webui.utils.utils import get_admin_user, get_verified_user
+from open_webui.utils.auth import get_admin_user, get_verified_user
 from open_webui.utils.access_control import has_access, has_permission
 
 

+ 1 - 1
backend/open_webui/apps/webui/routers/users.py

@@ -14,7 +14,7 @@ from open_webui.constants import ERROR_MESSAGES
 from open_webui.env import SRC_LOG_LEVELS
 from fastapi import APIRouter, Depends, HTTPException, Request, status
 from pydantic import BaseModel
-from open_webui.utils.utils import get_admin_user, get_password_hash, get_verified_user
+from open_webui.utils.auth import get_admin_user, get_password_hash, get_verified_user
 
 log = logging.getLogger(__name__)
 log.setLevel(SRC_LOG_LEVELS["MODELS"])

+ 1 - 1
backend/open_webui/apps/webui/routers/utils.py

@@ -9,7 +9,7 @@ from pydantic import BaseModel
 from starlette.responses import FileResponse
 from open_webui.utils.misc import get_gravatar_url
 from open_webui.utils.pdf_generator import PDFGenerator
-from open_webui.utils.utils import get_admin_user
+from open_webui.utils.auth import get_admin_user
 
 router = APIRouter()
 

+ 85 - 1
backend/open_webui/config.py

@@ -429,6 +429,12 @@ OAUTH_ADMIN_ROLES = PersistentConfig(
     [role.strip() for role in os.environ.get("OAUTH_ADMIN_ROLES", "admin").split(",")],
 )
 
+OAUTH_ALLOWED_DOMAINS = PersistentConfig(
+    "OAUTH_ALLOWED_DOMAINS",
+    "oauth.allowed_domains",
+    [domain.strip() for domain in os.environ.get("OAUTH_ALLOWED_DOMAINS", "*").split(",")],
+)
+
 
 def load_oauth_providers():
     OAUTH_PROVIDERS.clear()
@@ -583,6 +589,12 @@ OLLAMA_API_BASE_URL = os.environ.get(
 )
 
 OLLAMA_BASE_URL = os.environ.get("OLLAMA_BASE_URL", "")
+if OLLAMA_BASE_URL:
+    # Remove trailing slash
+    OLLAMA_BASE_URL = (
+        OLLAMA_BASE_URL[:-1] if OLLAMA_BASE_URL.endswith("/") else OLLAMA_BASE_URL
+    )
+
 
 K8S_FLAG = os.environ.get("K8S_FLAG", "")
 USE_OLLAMA_DOCKER = os.environ.get("USE_OLLAMA_DOCKER", "false")
@@ -696,6 +708,7 @@ ENABLE_LOGIN_FORM = PersistentConfig(
     os.environ.get("ENABLE_LOGIN_FORM", "True").lower() == "true",
 )
 
+
 DEFAULT_LOCALE = PersistentConfig(
     "DEFAULT_LOCALE",
     "ui.default_locale",
@@ -752,7 +765,6 @@ DEFAULT_USER_ROLE = PersistentConfig(
     os.getenv("DEFAULT_USER_ROLE", "pending"),
 )
 
-
 USER_PERMISSIONS_WORKSPACE_MODELS_ACCESS = (
     os.environ.get("USER_PERMISSIONS_WORKSPACE_MODELS_ACCESS", "False").lower()
     == "true"
@@ -998,6 +1010,66 @@ Strictly return in JSON format:
 </chat_history>
 """
 
+ENABLE_AUTOCOMPLETE_GENERATION = PersistentConfig(
+    "ENABLE_AUTOCOMPLETE_GENERATION",
+    "task.autocomplete.enable",
+    os.environ.get("ENABLE_AUTOCOMPLETE_GENERATION", "True").lower() == "true",
+)
+
+AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH = PersistentConfig(
+    "AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH",
+    "task.autocomplete.input_max_length",
+    int(os.environ.get("AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH", "-1")),
+)
+
+AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE = PersistentConfig(
+    "AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE",
+    "task.autocomplete.prompt_template",
+    os.environ.get("AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE", ""),
+)
+
+
+DEFAULT_AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE = """### Task:
+You are an autocompletion system. Continue the text in `<text>` based on the **completion type** in `<type>` and the given language.  
+
+### **Instructions**:
+1. Analyze `<text>` for context and meaning.  
+2. Use `<type>` to guide your output:  
+   - **General**: Provide a natural, concise continuation.  
+   - **Search Query**: Complete as if generating a realistic search query.  
+3. Start as if you are directly continuing `<text>`. Do **not** repeat, paraphrase, or respond as a model. Simply complete the text.  
+4. Ensure the continuation:
+   - Flows naturally from `<text>`.  
+   - Avoids repetition, overexplaining, or unrelated ideas.  
+5. If unsure, return: `{ "text": "" }`.  
+
+### **Output Rules**:
+- Respond only in JSON format: `{ "text": "<your_completion>" }`.
+
+### **Examples**:
+#### Example 1:  
+Input:  
+<type>General</type>  
+<text>The sun was setting over the horizon, painting the sky</text>  
+Output:  
+{ "text": "with vibrant shades of orange and pink." }
+
+#### Example 2:  
+Input:  
+<type>Search Query</type>  
+<text>Top-rated restaurants in</text>  
+Output:  
+{ "text": "New York City for Italian cuisine." }  
+
+---
+### Context:
+<chat_history>
+{{MESSAGES:END:6}}
+</chat_history>
+<type>{{TYPE}}</type>  
+<text>{{PROMPT}}</text>  
+#### Output:
+"""
 
 TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = PersistentConfig(
     "TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE",
@@ -1259,6 +1331,12 @@ YOUTUBE_LOADER_LANGUAGE = PersistentConfig(
     os.getenv("YOUTUBE_LOADER_LANGUAGE", "en").split(","),
 )
 
+YOUTUBE_LOADER_PROXY_URL = PersistentConfig(
+    "YOUTUBE_LOADER_PROXY_URL",
+    "rag.youtube_loader_proxy_url",
+    os.getenv("YOUTUBE_LOADER_PROXY_URL", ""),
+)
+
 
 ENABLE_RAG_WEB_SEARCH = PersistentConfig(
     "ENABLE_RAG_WEB_SEARCH",
@@ -1308,6 +1386,12 @@ BRAVE_SEARCH_API_KEY = PersistentConfig(
     os.getenv("BRAVE_SEARCH_API_KEY", ""),
 )
 
+KAGI_SEARCH_API_KEY = PersistentConfig(
+    "KAGI_SEARCH_API_KEY",
+    "rag.web.search.kagi_search_api_key",
+    os.getenv("KAGI_SEARCH_API_KEY", ""),
+)
+
 MOJEEK_SEARCH_API_KEY = PersistentConfig(
     "MOJEEK_SEARCH_API_KEY",
     "rag.web.search.mojeek_search_api_key",

+ 1 - 0
backend/open_webui/constants.py

@@ -113,5 +113,6 @@ class TASKS(str, Enum):
     TAGS_GENERATION = "tags_generation"
     EMOJI_GENERATION = "emoji_generation"
     QUERY_GENERATION = "query_generation"
+    AUTOCOMPLETE_GENERATION = "autocomplete_generation"
     FUNCTION_CALLING = "function_calling"
     MOA_RESPONSE_GENERATION = "moa_response_generation"

+ 5 - 2
backend/open_webui/env.py

@@ -329,6 +329,9 @@ WEBUI_AUTH_TRUSTED_EMAIL_HEADER = os.environ.get(
 )
 WEBUI_AUTH_TRUSTED_NAME_HEADER = os.environ.get("WEBUI_AUTH_TRUSTED_NAME_HEADER", None)
 
+BYPASS_MODEL_ACCESS_CONTROL = (
+    os.environ.get("BYPASS_MODEL_ACCESS_CONTROL", "False").lower() == "true"
+)
 
 ####################################
 # WEBUI_SECRET_KEY
@@ -373,7 +376,7 @@ else:
         AIOHTTP_CLIENT_TIMEOUT = 300
 
 AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST = os.environ.get(
-    "AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST", "3"
+    "AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST", "5"
 )
 
 if AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST == "":
@@ -384,7 +387,7 @@ else:
             AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST
         )
     except Exception:
-        AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST = 3
+        AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST = 5
 
 ####################################
 # OFFLINE_MODE

+ 118 - 6
backend/open_webui/main.py

@@ -89,6 +89,10 @@ from open_webui.config import (
     DEFAULT_QUERY_GENERATION_PROMPT_TEMPLATE,
     TITLE_GENERATION_PROMPT_TEMPLATE,
     TAGS_GENERATION_PROMPT_TEMPLATE,
+    ENABLE_AUTOCOMPLETE_GENERATION,
+    AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH,
+    AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE,
+    DEFAULT_AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE,
     TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE,
     WEBHOOK_URL,
     WEBUI_AUTH,
@@ -108,6 +112,7 @@ from open_webui.env import (
     WEBUI_SESSION_COOKIE_SAME_SITE,
     WEBUI_SESSION_COOKIE_SECURE,
     WEBUI_URL,
+    BYPASS_MODEL_ACCESS_CONTROL,
     RESET_CONFIG_ON_START,
     OFFLINE_MODE,
 )
@@ -127,13 +132,14 @@ from open_webui.utils.task import (
     rag_template,
     title_generation_template,
     query_generation_template,
+    autocomplete_generation_template,
     tags_generation_template,
     emoji_generation_template,
     moa_response_generation_template,
     tools_function_calling_generation_template,
 )
 from open_webui.utils.tools import get_tools
-from open_webui.utils.utils import (
+from open_webui.utils.auth import (
     decode_token,
     get_admin_user,
     get_current_user,
@@ -207,6 +213,11 @@ app.state.config.TASK_MODEL_EXTERNAL = TASK_MODEL_EXTERNAL
 
 app.state.config.TITLE_GENERATION_PROMPT_TEMPLATE = TITLE_GENERATION_PROMPT_TEMPLATE
 
+app.state.config.ENABLE_AUTOCOMPLETE_GENERATION = ENABLE_AUTOCOMPLETE_GENERATION
+app.state.config.AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH = (
+    AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH
+)
+
 app.state.config.ENABLE_TAGS_GENERATION = ENABLE_TAGS_GENERATION
 app.state.config.TAGS_GENERATION_PROMPT_TEMPLATE = TAGS_GENERATION_PROMPT_TEMPLATE
 
@@ -215,6 +226,10 @@ app.state.config.ENABLE_SEARCH_QUERY_GENERATION = ENABLE_SEARCH_QUERY_GENERATION
 app.state.config.ENABLE_RETRIEVAL_QUERY_GENERATION = ENABLE_RETRIEVAL_QUERY_GENERATION
 app.state.config.QUERY_GENERATION_PROMPT_TEMPLATE = QUERY_GENERATION_PROMPT_TEMPLATE
 
+app.state.config.AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE = (
+    AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE
+)
+
 app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = (
     TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE
 )
@@ -465,8 +480,6 @@ async def chat_completion_tools_handler(
             except Exception as e:
                 tool_output = str(e)
 
-            print(tools[tool_function_name]["citation"])
-
             if isinstance(tool_output, str):
                 if tools[tool_function_name]["citation"]:
                     sources.append(
@@ -607,7 +620,7 @@ class ChatCompletionMiddleware(BaseHTTPMiddleware):
             )
 
         model_info = Models.get_model_by_id(model["id"])
-        if user.role == "user":
+        if user.role == "user" and not BYPASS_MODEL_ACCESS_CONTROL:
             if model.get("arena"):
                 if not has_access(
                     user.id,
@@ -1210,7 +1223,7 @@ async def get_models(user=Depends(get_verified_user)):
         )
 
     # Filter out models that the user does not have access to
-    if user.role == "user":
+    if user.role == "user" and not BYPASS_MODEL_ACCESS_CONTROL:
         filtered_models = []
         for model in models:
             if model.get("arena"):
@@ -1252,6 +1265,9 @@ async def get_base_models(user=Depends(get_admin_user)):
 async def generate_chat_completions(
     form_data: dict, user=Depends(get_verified_user), bypass_filter: bool = False
 ):
+    if BYPASS_MODEL_ACCESS_CONTROL:
+        bypass_filter = True
+
     model_list = await get_all_models()
     models = {model["id"]: model for model in model_list}
 
@@ -1665,6 +1681,8 @@ async def get_task_config(user=Depends(get_verified_user)):
         "TASK_MODEL": app.state.config.TASK_MODEL,
         "TASK_MODEL_EXTERNAL": app.state.config.TASK_MODEL_EXTERNAL,
         "TITLE_GENERATION_PROMPT_TEMPLATE": app.state.config.TITLE_GENERATION_PROMPT_TEMPLATE,
+        "ENABLE_AUTOCOMPLETE_GENERATION": app.state.config.ENABLE_AUTOCOMPLETE_GENERATION,
+        "AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH": app.state.config.AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH,
         "TAGS_GENERATION_PROMPT_TEMPLATE": app.state.config.TAGS_GENERATION_PROMPT_TEMPLATE,
         "ENABLE_TAGS_GENERATION": app.state.config.ENABLE_TAGS_GENERATION,
         "ENABLE_SEARCH_QUERY_GENERATION": app.state.config.ENABLE_SEARCH_QUERY_GENERATION,
@@ -1678,6 +1696,8 @@ class TaskConfigForm(BaseModel):
     TASK_MODEL: Optional[str]
     TASK_MODEL_EXTERNAL: Optional[str]
     TITLE_GENERATION_PROMPT_TEMPLATE: str
+    ENABLE_AUTOCOMPLETE_GENERATION: bool
+    AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH: int
     TAGS_GENERATION_PROMPT_TEMPLATE: str
     ENABLE_TAGS_GENERATION: bool
     ENABLE_SEARCH_QUERY_GENERATION: bool
@@ -1693,6 +1713,14 @@ async def update_task_config(form_data: TaskConfigForm, user=Depends(get_admin_u
     app.state.config.TITLE_GENERATION_PROMPT_TEMPLATE = (
         form_data.TITLE_GENERATION_PROMPT_TEMPLATE
     )
+
+    app.state.config.ENABLE_AUTOCOMPLETE_GENERATION = (
+        form_data.ENABLE_AUTOCOMPLETE_GENERATION
+    )
+    app.state.config.AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH = (
+        form_data.AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH
+    )
+
     app.state.config.TAGS_GENERATION_PROMPT_TEMPLATE = (
         form_data.TAGS_GENERATION_PROMPT_TEMPLATE
     )
@@ -1715,6 +1743,8 @@ async def update_task_config(form_data: TaskConfigForm, user=Depends(get_admin_u
         "TASK_MODEL": app.state.config.TASK_MODEL,
         "TASK_MODEL_EXTERNAL": app.state.config.TASK_MODEL_EXTERNAL,
         "TITLE_GENERATION_PROMPT_TEMPLATE": app.state.config.TITLE_GENERATION_PROMPT_TEMPLATE,
+        "ENABLE_AUTOCOMPLETE_GENERATION": app.state.config.ENABLE_AUTOCOMPLETE_GENERATION,
+        "AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH": app.state.config.AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH,
         "TAGS_GENERATION_PROMPT_TEMPLATE": app.state.config.TAGS_GENERATION_PROMPT_TEMPLATE,
         "ENABLE_TAGS_GENERATION": app.state.config.ENABLE_TAGS_GENERATION,
         "ENABLE_SEARCH_QUERY_GENERATION": app.state.config.ENABLE_SEARCH_QUERY_GENERATION,
@@ -1942,7 +1972,7 @@ async def generate_queries(form_data: dict, user=Depends(get_verified_user)):
         f"generating {type} queries using model {task_model_id} for user {user.email}"
     )
 
-    if app.state.config.QUERY_GENERATION_PROMPT_TEMPLATE != "":
+    if (app.state.config.QUERY_GENERATION_PROMPT_TEMPLATE).strip() != "":
         template = app.state.config.QUERY_GENERATION_PROMPT_TEMPLATE
     else:
         template = DEFAULT_QUERY_GENERATION_PROMPT_TEMPLATE
@@ -1982,6 +2012,88 @@ async def generate_queries(form_data: dict, user=Depends(get_verified_user)):
     return await generate_chat_completions(form_data=payload, user=user)
 
 
+@app.post("/api/task/auto/completions")
+async def generate_autocompletion(form_data: dict, user=Depends(get_verified_user)):
+    if not app.state.config.ENABLE_AUTOCOMPLETE_GENERATION:
+        raise HTTPException(
+            status_code=status.HTTP_400_BAD_REQUEST,
+            detail=f"Autocompletion generation is disabled",
+        )
+
+    type = form_data.get("type")
+    prompt = form_data.get("prompt")
+    messages = form_data.get("messages")
+
+    if app.state.config.AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH > 0:
+        if len(prompt) > app.state.config.AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH:
+            raise HTTPException(
+                status_code=status.HTTP_400_BAD_REQUEST,
+                detail=f"Input prompt exceeds maximum length of {app.state.config.AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH}",
+            )
+
+    model_list = await get_all_models()
+    models = {model["id"]: model for model in model_list}
+
+    model_id = form_data["model"]
+    if model_id not in models:
+        raise HTTPException(
+            status_code=status.HTTP_404_NOT_FOUND,
+            detail="Model not found",
+        )
+
+    # Check if the user has a custom task model
+    # If the user has a custom task model, use that model
+    task_model_id = get_task_model_id(
+        model_id,
+        app.state.config.TASK_MODEL,
+        app.state.config.TASK_MODEL_EXTERNAL,
+        models,
+    )
+
+    log.debug(
+        f"generating autocompletion using model {task_model_id} for user {user.email}"
+    )
+
+    if (app.state.config.AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE).strip() != "":
+        template = app.state.config.AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE
+    else:
+        template = DEFAULT_AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE
+
+    content = autocomplete_generation_template(
+        template, prompt, messages, type, {"name": user.name}
+    )
+
+    payload = {
+        "model": task_model_id,
+        "messages": [{"role": "user", "content": content}],
+        "stream": False,
+        "metadata": {
+            "task": str(TASKS.AUTOCOMPLETE_GENERATION),
+            "task_body": form_data,
+            "chat_id": form_data.get("chat_id", None),
+        },
+    }
+
+    # Handle pipeline filters
+    try:
+        payload = filter_pipeline(payload, user, models)
+    except Exception as e:
+        if len(e.args) > 1:
+            return JSONResponse(
+                status_code=e.args[0],
+                content={"detail": e.args[1]},
+            )
+        else:
+            return JSONResponse(
+                status_code=status.HTTP_400_BAD_REQUEST,
+                content={"detail": str(e)},
+            )
+    if "chat_id" in payload:
+        del payload["chat_id"]
+
+    return await generate_chat_completions(form_data=payload, user=user)
+
+
 @app.post("/api/task/emoji/completions")
 async def generate_emoji(form_data: dict, user=Depends(get_verified_user)):
 

+ 2 - 2
backend/open_webui/static/assets/pdf-style.css

@@ -26,7 +26,7 @@
 
 html {
 	font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'NotoSans', 'NotoSansJP', 'NotoSansKR',
-		'NotoSansSC', 'STSong-Light', 'MSung-Light', 'HeiseiMin-W3', 'HYSMyeongJo-Medium', Roboto,
+		'NotoSansSC', 'Twemoji', 'STSong-Light', 'MSung-Light', 'HeiseiMin-W3', 'HYSMyeongJo-Medium', Roboto,
 		'Helvetica Neue', Arial, sans-serif;
 	font-size: 14px; /* Default font size */
 	line-height: 1.5;
@@ -40,7 +40,7 @@ html {
 
 body {
 	margin: 0;
-	color: #212529;
+	padding: 0;
 	background-color: #fff;
 	width: auto;
 }

BIN
backend/open_webui/static/fonts/Twemoji.ttf


+ 3 - 3
backend/open_webui/test/apps/webui/routers/test_auths.py

@@ -26,7 +26,7 @@ class TestAuths(AbstractPostgresTest):
         }
 
     def test_update_profile(self):
-        from open_webui.utils.utils import get_password_hash
+        from open_webui.utils.auth import get_password_hash
 
         user = self.auths.insert_new_auth(
             email="john.doe@openwebui.com",
@@ -47,7 +47,7 @@ class TestAuths(AbstractPostgresTest):
         assert db_user.profile_image_url == "/user2.png"
 
     def test_update_password(self):
-        from open_webui.utils.utils import get_password_hash
+        from open_webui.utils.auth import get_password_hash
 
         user = self.auths.insert_new_auth(
             email="john.doe@openwebui.com",
@@ -74,7 +74,7 @@ class TestAuths(AbstractPostgresTest):
         assert new_auth is not None
 
     def test_signin(self):
-        from open_webui.utils.utils import get_password_hash
+        from open_webui.utils.auth import get_password_hash
 
         user = self.auths.insert_new_auth(
             email="john.doe@openwebui.com",

+ 1 - 1
backend/open_webui/test/util/mock_user.py

@@ -13,7 +13,7 @@ def mock_webui_user(**kwargs):
 
 @contextmanager
 def mock_user(app: FastAPI, **kwargs):
-    from open_webui.utils.utils import (
+    from open_webui.utils.auth import (
         get_current_user,
         get_verified_user,
         get_admin_user,

+ 0 - 0
backend/open_webui/utils/utils.py → backend/open_webui/utils/auth.py


+ 16 - 2
backend/open_webui/utils/oauth.py

@@ -26,6 +26,7 @@ from open_webui.config import (
     OAUTH_USERNAME_CLAIM,
     OAUTH_ALLOWED_ROLES,
     OAUTH_ADMIN_ROLES,
+    OAUTH_ALLOWED_DOMAINS,
     WEBHOOK_URL,
     JWT_EXPIRES_IN,
     AppConfig,
@@ -33,7 +34,7 @@ from open_webui.config import (
 from open_webui.constants import ERROR_MESSAGES
 from open_webui.env import WEBUI_SESSION_COOKIE_SAME_SITE, WEBUI_SESSION_COOKIE_SECURE
 from open_webui.utils.misc import parse_duration
-from open_webui.utils.utils import get_password_hash, create_token
+from open_webui.utils.auth import get_password_hash, create_token
 from open_webui.utils.webhook import post_webhook
 
 log = logging.getLogger(__name__)
@@ -49,6 +50,7 @@ auth_manager_config.OAUTH_PICTURE_CLAIM = OAUTH_PICTURE_CLAIM
 auth_manager_config.OAUTH_USERNAME_CLAIM = OAUTH_USERNAME_CLAIM
 auth_manager_config.OAUTH_ALLOWED_ROLES = OAUTH_ALLOWED_ROLES
 auth_manager_config.OAUTH_ADMIN_ROLES = OAUTH_ADMIN_ROLES
+auth_manager_config.OAUTH_ALLOWED_DOMAINS = OAUTH_ALLOWED_DOMAINS
 auth_manager_config.WEBHOOK_URL = WEBHOOK_URL
 auth_manager_config.JWT_EXPIRES_IN = JWT_EXPIRES_IN
 
@@ -156,6 +158,9 @@ class OAuthManager:
         if not email:
             log.warning(f"OAuth callback failed, email is missing: {user_data}")
             raise HTTPException(400, detail=ERROR_MESSAGES.INVALID_CRED)
+        if "*" not in auth_manager_config.OAUTH_ALLOWED_DOMAINS and email.split("@")[-1] not in auth_manager_config.OAUTH_ALLOWED_DOMAINS:
+            log.warning(f"OAuth callback failed, e-mail domain is not in the list of allowed domains: {user_data}")
+            raise HTTPException(400, detail=ERROR_MESSAGES.INVALID_CRED)
 
         # Check if the user exists
         user = Users.get_user_by_oauth_sub(provider_sub)
@@ -253,9 +258,18 @@ class OAuthManager:
             secure=WEBUI_SESSION_COOKIE_SECURE,
         )
 
+        if ENABLE_OAUTH_SIGNUP.value:
+            oauth_id_token = token.get("id_token")
+            response.set_cookie(
+                key="oauth_id_token",
+                value=oauth_id_token,
+                httponly=True,
+                samesite=WEBUI_SESSION_COOKIE_SAME_SITE,
+                secure=WEBUI_SESSION_COOKIE_SECURE,
+            )
         # Redirect back to the frontend with the JWT token
         redirect_url = f"{request.base_url}auth#token={jwt_token}"
-        return RedirectResponse(url=redirect_url)
+        return RedirectResponse(url=redirect_url, headers=response.headers)
 
 
 oauth_manager = OAuthManager()

+ 22 - 18
backend/open_webui/utils/pdf_generator.py

@@ -51,21 +51,25 @@ class PDFGenerator:
 
         # extends pymdownx extension to convert markdown to html.
         # - https://facelessuser.github.io/pymdown-extensions/usage_notes/
-        html_content = markdown(content, extensions=["pymdownx.extra"])
+        # html_content = markdown(content, extensions=["pymdownx.extra"])
 
         html_message = f"""
-            <div> {date_str} </div>
-            <div class="message">
+            <div>
                 <div>
-                    <h2>
+                    <h4>
                         <strong>{role.title()}</strong>
-                        <span style="font-size: 12px; color: #888;">{model}</span>
-                    </h2>
+                        <span style="font-size: 12px;">{model}</span>
+                    </h4>
+                    <div> {date_str} </div>
                 </div>
-                <pre class="markdown-section">
+                <br/>
+                <br/>
+
+                <div>
                     {content}
-                </pre>
+                </div>
             </div>
+            <br/>
           """
         return html_message
 
@@ -74,18 +78,15 @@ class PDFGenerator:
         return f"""
         <html>
             <head>
-                <meta charset="UTF-8">
-                <meta name="viewport" content="width=device-width, initial-scale=1.0">
+                <meta name="viewport" content="width=device-width, initial-scale=1.0" />
             </head>
             <body>
-                <div class="container"> 
-                    <div class="text-center">
-                        <h1>{self.form_data.title}</h1>
-                    </div>
-                    <div>
-                        {self.messages_html}
-                    </div>
+            <div>
+                <div>
+                    <h2>{self.form_data.title}</h2>
+                    {self.messages_html}
                 </div>
+            </div>
             </body>
         </html>
         """
@@ -114,9 +115,12 @@ class PDFGenerator:
             pdf.add_font("NotoSansKR", "", f"{FONTS_DIR}/NotoSansKR-Regular.ttf")
             pdf.add_font("NotoSansJP", "", f"{FONTS_DIR}/NotoSansJP-Regular.ttf")
             pdf.add_font("NotoSansSC", "", f"{FONTS_DIR}/NotoSansSC-Regular.ttf")
+            pdf.add_font("Twemoji", "", f"{FONTS_DIR}/Twemoji.ttf")
 
             pdf.set_font("NotoSans", size=12)
-            pdf.set_fallback_fonts(["NotoSansKR", "NotoSansJP", "NotoSansSC"])
+            pdf.set_fallback_fonts(
+                ["NotoSansKR", "NotoSansJP", "NotoSansSC", "Twemoji"]
+            )
 
             pdf.set_auto_page_break(auto=True, margin=15)
 

+ 7 - 0
backend/open_webui/utils/security_headers.py

@@ -27,6 +27,7 @@ def set_security_headers() -> Dict[str, str]:
     - x-download-options
     - x-frame-options
     - x-permitted-cross-domain-policies
+    - content-security-policy
 
     Each environment variable is associated with a specific setter function
     that constructs the header. If the environment variable is set, the
@@ -45,6 +46,7 @@ def set_security_headers() -> Dict[str, str]:
         "XDOWNLOAD_OPTIONS": set_xdownload_options,
         "XFRAME_OPTIONS": set_xframe,
         "XPERMITTED_CROSS_DOMAIN_POLICIES": set_xpermitted_cross_domain_policies,
+        "CONTENT_SECURITY_POLICY": set_content_security_policy,
     }
 
     for env_var, setter in header_setters.items():
@@ -124,3 +126,8 @@ def set_xpermitted_cross_domain_policies(value: str):
     if not match:
         value = "none"
     return {"X-Permitted-Cross-Domain-Policies": value}
+
+
+# Set Content-Security-Policy response header
+def set_content_security_policy(value: str):
+    return {"Content-Security-Policy": value}

+ 35 - 8
backend/open_webui/utils/task.py

@@ -53,7 +53,9 @@ def prompt_template(
 
 def replace_prompt_variable(template: str, prompt: str) -> str:
     def replacement_function(match):
-        full_match = match.group(0)
+        full_match = match.group(
+            0
+        ).lower()  # Normalize to lowercase for consistent handling
         start_length = match.group(1)
         end_length = match.group(2)
         middle_length = match.group(3)
@@ -73,20 +75,23 @@ def replace_prompt_variable(template: str, prompt: str) -> str:
             return f"{start}...{end}"
         return ""
 
-    template = re.sub(
-        r"{{prompt}}|{{prompt:start:(\d+)}}|{{prompt:end:(\d+)}}|{{prompt:middletruncate:(\d+)}}",
-        replacement_function,
-        template,
-    )
+    # Updated regex pattern to make it case-insensitive with the `(?i)` flag
+    pattern = r"(?i){{prompt}}|{{prompt:start:(\d+)}}|{{prompt:end:(\d+)}}|{{prompt:middletruncate:(\d+)}}"
+    template = re.sub(pattern, replacement_function, template)
     return template
 
 
-def replace_messages_variable(template: str, messages: list[str]) -> str:
+def replace_messages_variable(
+    template: str, messages: Optional[list[str]] = None
+) -> str:
     def replacement_function(match):
         full_match = match.group(0)
         start_length = match.group(1)
         end_length = match.group(2)
         middle_length = match.group(3)
+        # If messages is None, handle it as an empty list
+        if messages is None:
+            return ""
 
         # Process messages based on the number of messages required
         if full_match == "{{MESSAGES}}":
@@ -122,7 +127,7 @@ def replace_messages_variable(template: str, messages: list[str]) -> str:
 
 
 def rag_template(template: str, context: str, query: str):
-    if template == "":
+    if template.strip() == "":
         template = DEFAULT_RAG_TEMPLATE
 
     if "[context]" not in template and "{{CONTEXT}}" not in template:
@@ -212,6 +217,28 @@ def emoji_generation_template(
     return template
 
 
+def autocomplete_generation_template(
+    template: str,
+    prompt: str,
+    messages: Optional[list[dict]] = None,
+    type: Optional[str] = None,
+    user: Optional[dict] = None,
+) -> str:
+    template = template.replace("{{TYPE}}", type if type else "")
+    template = replace_prompt_variable(template, prompt)
+    template = replace_messages_variable(template, messages)
+
+    template = prompt_template(
+        template,
+        **(
+            {"user_name": user.get("name"), "user_location": user.get("location")}
+            if user
+            else {}
+        ),
+    )
+    return template
+
+
 def query_generation_template(
     template: str, messages: list[dict], user: Optional[dict] = None
 ) -> str:

+ 5 - 5
backend/requirements.txt

@@ -1,7 +1,7 @@
 fastapi==0.111.0
 uvicorn[standard]==0.30.6
 pydantic==2.9.2
-python-multipart==0.0.17
+python-multipart==0.0.18
 
 Flask==3.0.3
 Flask-Cors==5.0.0
@@ -11,13 +11,13 @@ python-jose==3.3.0
 passlib[bcrypt]==1.7.4
 
 requests==2.32.3
-aiohttp==3.10.8
+aiohttp==3.11.8
 async-timeout
 aiocache
 aiofiles
 
 sqlalchemy==2.0.32
-alembic==1.13.2
+alembic==1.14.0
 peewee==3.17.6
 peewee-migrate==1.12.2
 psycopg2-binary==2.9.9
@@ -44,11 +44,11 @@ langchain-chroma==0.1.4
 
 fake-useragent==1.5.1
 chromadb==0.5.15
-pymilvus==2.4.9
+pymilvus==2.5.0
 qdrant-client~=1.12.0
 opensearch-py==2.7.1
 
-sentence-transformers==3.2.0
+sentence-transformers==3.3.1
 colbert-ai==0.2.21
 einops==0.8.0
 

+ 34 - 26
package-lock.json

@@ -1,12 +1,12 @@
 {
 	"name": "open-webui",
-	"version": "0.4.6",
+	"version": "0.4.8",
 	"lockfileVersion": 3,
 	"requires": true,
 	"packages": {
 		"": {
 			"name": "open-webui",
-			"version": "0.4.6",
+			"version": "0.4.8",
 			"dependencies": {
 				"@codemirror/lang-javascript": "^6.2.2",
 				"@codemirror/lang-python": "^6.1.6",
@@ -1836,9 +1836,10 @@
 			}
 		},
 		"node_modules/@polka/url": {
-			"version": "1.0.0-next.25",
-			"resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz",
-			"integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ=="
+			"version": "1.0.0-next.28",
+			"resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz",
+			"integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==",
+			"license": "MIT"
 		},
 		"node_modules/@popperjs/core": {
 			"version": "2.11.8",
@@ -2248,31 +2249,33 @@
 			}
 		},
 		"node_modules/@sveltejs/adapter-static": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.2.tgz",
-			"integrity": "sha512-/EBFydZDwfwFfFEuF1vzUseBoRziwKP7AoHAwv+Ot3M084sE/HTVBHf9mCmXfdM9ijprY5YEugZjleflncX5fQ==",
+			"version": "3.0.6",
+			"resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.6.tgz",
+			"integrity": "sha512-MGJcesnJWj7FxDcB/GbrdYD3q24Uk0PIL4QIX149ku+hlJuj//nxUbb0HxUTpjkecWfHjVveSUnUaQWnPRXlpg==",
 			"dev": true,
+			"license": "MIT",
 			"peerDependencies": {
 				"@sveltejs/kit": "^2.0.0"
 			}
 		},
 		"node_modules/@sveltejs/kit": {
-			"version": "2.6.2",
-			"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.6.2.tgz",
-			"integrity": "sha512-ruogrSPXjckn5poUiZU8VYNCSPHq66SFR1AATvOikQxtP6LNI4niAZVX/AWZRe/EPDG3oY2DNJ9c5z7u0t2NAQ==",
+			"version": "2.9.0",
+			"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.9.0.tgz",
+			"integrity": "sha512-W3E7ed3ChB6kPqRs2H7tcHp+Z7oiTFC6m+lLyAQQuyXeqw6LdNuuwEUla+5VM0OGgqQD+cYD6+7Xq80vVm17Vg==",
 			"hasInstallScript": true,
+			"license": "MIT",
 			"dependencies": {
 				"@types/cookie": "^0.6.0",
-				"cookie": "^0.7.0",
+				"cookie": "^0.6.0",
 				"devalue": "^5.1.0",
-				"esm-env": "^1.0.0",
+				"esm-env": "^1.2.1",
 				"import-meta-resolve": "^4.1.0",
 				"kleur": "^4.1.5",
 				"magic-string": "^0.30.5",
 				"mrmime": "^2.0.0",
 				"sade": "^1.8.1",
 				"set-cookie-parser": "^2.6.0",
-				"sirv": "^2.0.4",
+				"sirv": "^3.0.0",
 				"tiny-glob": "^0.2.9"
 			},
 			"bin": {
@@ -2282,9 +2285,9 @@
 				"node": ">=18.13"
 			},
 			"peerDependencies": {
-				"@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1",
+				"@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0",
 				"svelte": "^4.0.0 || ^5.0.0-next.0",
-				"vite": "^5.0.3"
+				"vite": "^5.0.3 || ^6.0.0"
 			}
 		},
 		"node_modules/@sveltejs/vite-plugin-svelte": {
@@ -4391,9 +4394,10 @@
 			"dev": true
 		},
 		"node_modules/cookie": {
-			"version": "0.7.1",
-			"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
-			"integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
+			"version": "0.6.0",
+			"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
+			"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
+			"license": "MIT",
 			"engines": {
 				"node": ">= 0.6"
 			}
@@ -5690,9 +5694,10 @@
 			}
 		},
 		"node_modules/esm-env": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz",
-			"integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA=="
+			"version": "1.2.1",
+			"resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.1.tgz",
+			"integrity": "sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==",
+			"license": "MIT"
 		},
 		"node_modules/espree": {
 			"version": "9.6.1",
@@ -8228,6 +8233,7 @@
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz",
 			"integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==",
+			"license": "MIT",
 			"engines": {
 				"node": ">=10"
 			}
@@ -10359,16 +10365,17 @@
 			}
 		},
 		"node_modules/sirv": {
-			"version": "2.0.4",
-			"resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz",
-			"integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==",
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz",
+			"integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==",
+			"license": "MIT",
 			"dependencies": {
 				"@polka/url": "^1.0.0-next.24",
 				"mrmime": "^2.0.0",
 				"totalist": "^3.0.0"
 			},
 			"engines": {
-				"node": ">= 10"
+				"node": ">=18"
 			}
 		},
 		"node_modules/slash": {
@@ -11260,6 +11267,7 @@
 			"version": "3.0.1",
 			"resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
 			"integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
+			"license": "MIT",
 			"engines": {
 				"node": ">=6"
 			}

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
 	"name": "open-webui",
-	"version": "0.4.6",
+	"version": "0.4.8",
 	"private": true,
 	"scripts": {
 		"dev": "npm run pyodide:fetch && vite dev --host",

+ 5 - 5
pyproject.toml

@@ -9,7 +9,7 @@ dependencies = [
     "fastapi==0.111.0",
     "uvicorn[standard]==0.30.6",
     "pydantic==2.9.2",
-    "python-multipart==0.0.17",
+    "python-multipart==0.0.18",
 
     "Flask==3.0.3",
     "Flask-Cors==5.0.0",
@@ -19,13 +19,13 @@ dependencies = [
     "passlib[bcrypt]==1.7.4",
 
     "requests==2.32.3",
-    "aiohttp==3.10.8",
+    "aiohttp==3.11.8",
     "async-timeout",
     "aiocache",
     "aiofiles",
 
     "sqlalchemy==2.0.32",
-    "alembic==1.13.2",
+    "alembic==1.14.0",
     "peewee==3.17.6",
     "peewee-migrate==1.12.2",
     "psycopg2-binary==2.9.9",
@@ -51,11 +51,11 @@ dependencies = [
 
     "fake-useragent==1.5.1",
     "chromadb==0.5.15",
-    "pymilvus==2.4.9",
+    "pymilvus==2.5.0",
     "qdrant-client~=1.12.0",
     "opensearch-py==2.7.1",
 
-    "sentence-transformers==3.2.0",
+    "sentence-transformers==3.3.1",
     "colbert-ai==0.2.21",
     "einops==0.8.0",
 

+ 12 - 4
src/app.css

@@ -45,15 +45,15 @@ math {
 }
 
 .input-prose {
-	@apply prose dark:prose-invert prose-p:my-0 prose-img:my-1 prose-headings:my-1 prose-pre:my-0 prose-table:my-0 prose-blockquote:my-0 prose-ul:-my-0 prose-ol:-my-0 prose-li:-my-0 whitespace-pre-line;
+	@apply prose dark:prose-invert prose-headings:font-semibold prose-hr:my-4 prose-hr:border-gray-100 prose-hr:dark:border-gray-800 prose-p:my-0 prose-img:my-1 prose-headings:my-1 prose-pre:my-0 prose-table:my-0 prose-blockquote:my-0 prose-ul:-my-0 prose-ol:-my-0 prose-li:-my-0 whitespace-pre-line;
 }
 
 .input-prose-sm {
-	@apply prose dark:prose-invert prose-p:my-0 prose-img:my-1 prose-headings:my-1 prose-pre:my-0 prose-table:my-0 prose-blockquote:my-0 prose-ul:-my-0 prose-ol:-my-0 prose-li:-my-0 whitespace-pre-line text-sm;
+	@apply prose dark:prose-invert prose-headings:font-semibold prose-hr:my-4 prose-hr:border-gray-100 prose-hr:dark:border-gray-800 prose-p:my-0 prose-img:my-1 prose-headings:my-1 prose-pre:my-0 prose-table:my-0 prose-blockquote:my-0 prose-ul:-my-0 prose-ol:-my-0 prose-li:-my-0 whitespace-pre-line text-sm;
 }
 
 .markdown-prose {
-	@apply prose dark:prose-invert prose-p:my-0 prose-img:my-1 prose-headings:my-1 prose-pre:my-0 prose-table:my-0 prose-blockquote:my-0 prose-ul:-my-0 prose-ol:-my-0 prose-li:-my-0 whitespace-pre-line;
+	@apply prose dark:prose-invert prose-headings:font-semibold prose-hr:my-4 prose-p:my-0 prose-img:my-1 prose-headings:my-1 prose-pre:my-0 prose-table:my-0 prose-blockquote:my-0 prose-ul:-my-0 prose-ol:-my-0 prose-li:-my-0 whitespace-pre-line;
 }
 
 .markdown a {
@@ -211,7 +211,15 @@ input[type='number'] {
 	float: left;
 	color: #adb5bd;
 	pointer-events: none;
-	height: 0;
+
+	@apply line-clamp-1 absolute;
+}
+
+.ai-autocompletion::after {
+	color: #a0a0a0;
+
+	content: attr(data-suggestion);
+	pointer-events: none;
 }
 
 .tiptap > pre > code {

+ 6 - 3
src/app.html

@@ -2,9 +2,12 @@
 <html lang="en">
 	<head>
 		<meta charset="utf-8" />
-		<link rel="icon" href="%sveltekit.assets%/favicon.png" />
-		<link rel="apple-touch-icon" href="%sveltekit.assets%/favicon.png" />
-		<link rel="manifest" href="%sveltekit.assets%/manifest.json" crossorigin="use-credentials" />
+		<link rel="icon" type="image/png" href="/favicon/favicon-96x96.png" sizes="96x96" />
+		<link rel="icon" type="image/svg+xml" href="/favicon/favicon.svg" />
+		<link rel="shortcut icon" href="/favicon/favicon.ico" />
+		<link rel="apple-touch-icon" sizes="180x180" href="/favicon/apple-touch-icon.png" />
+		<meta name="apple-mobile-web-app-title" content="Open WebUI" />
+		<link rel="manifest" href="/favicon/site.webmanifest" />
 		<meta
 			name="viewport"
 			content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover"

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

@@ -397,6 +397,77 @@ export const generateQueries = async (
 	}
 };
 
+export const generateAutoCompletion = async (
+	token: string = '',
+	model: string,
+	prompt: string,
+	messages?: object[],
+	type: string = 'search query'
+) => {
+	const controller = new AbortController();
+	let error = null;
+
+	const res = await fetch(`${WEBUI_BASE_URL}/api/task/auto/completions`, {
+		signal: controller.signal,
+		method: 'POST',
+		headers: {
+			Accept: 'application/json',
+			'Content-Type': 'application/json',
+			Authorization: `Bearer ${token}`
+		},
+		body: JSON.stringify({
+			model: model,
+			prompt: prompt,
+			...(messages && { messages: messages }),
+			type: type,
+			stream: false
+		})
+	})
+		.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;
+			}
+			return null;
+		});
+
+	if (error) {
+		throw error;
+	}
+
+	const response = res?.choices[0]?.message?.content ?? '';
+
+	try {
+		const jsonStartIndex = response.indexOf('{');
+		const jsonEndIndex = response.lastIndexOf('}');
+
+		if (jsonStartIndex !== -1 && jsonEndIndex !== -1) {
+			const jsonResponse = response.substring(jsonStartIndex, jsonEndIndex + 1);
+
+			// Step 5: Parse the JSON block
+			const parsed = JSON.parse(jsonResponse);
+
+			// Step 6: If there's a "queries" key, return the queries array; otherwise, return an empty array
+			if (parsed && parsed.text) {
+				return parsed.text;
+			} else {
+				return '';
+			}
+		}
+
+		// If no valid JSON block found, return response as is
+		return response;
+	} catch (e) {
+		// Catch and safely return empty array on any parsing errors
+		console.error('Failed to parse response: ', e);
+		return response;
+	}
+};
+
 export const generateMoACompletion = async (
 	token: string = '',
 	model: string,

+ 1 - 0
src/lib/apis/retrieval/index.ts

@@ -40,6 +40,7 @@ type ContentExtractConfigForm = {
 type YoutubeConfigForm = {
 	language: string[];
 	translation?: string | null;
+	proxy_url: string;
 };
 
 type RAGConfigForm = {

+ 9 - 4
src/lib/components/admin/Settings/Images.svelte

@@ -105,10 +105,15 @@
 	};
 
 	const updateConfigHandler = async () => {
-		const res = await updateConfig(localStorage.token, config).catch((error) => {
-			toast.error(error);
-			return null;
-		});
+		const res = await updateConfig(localStorage.token, config)
+			.catch((error) => {
+				toast.error(error);
+				return null;
+			})
+			.catch((error) => {
+				toast.error(error);
+				return null;
+			});
 
 		if (res) {
 			config = res;

+ 39 - 6
src/lib/components/admin/Settings/Interface.svelte

@@ -24,6 +24,8 @@
 		TASK_MODEL: '',
 		TASK_MODEL_EXTERNAL: '',
 		TITLE_GENERATION_PROMPT_TEMPLATE: '',
+		ENABLE_AUTOCOMPLETE_GENERATION: true,
+		AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH: -1,
 		TAGS_GENERATION_PROMPT_TEMPLATE: '',
 		ENABLE_TAGS_GENERATION: true,
 		ENABLE_SEARCH_QUERY_GENERATION: true,
@@ -138,11 +140,42 @@
 					</Tooltip>
 				</div>
 
-				<hr class=" dark:border-gray-850 my-3" />
+				<hr class=" border-gray-50 dark:border-gray-850 my-3" />
 
 				<div class="my-3 flex w-full items-center justify-between">
 					<div class=" self-center text-xs font-medium">
-						{$i18n.t('Enable Tags Generation')}
+						{$i18n.t('Autocomplete Generation')}
+					</div>
+
+					<Tooltip content={$i18n.t('Enable autocomplete generation for chat messages')}>
+						<Switch bind:state={taskConfig.ENABLE_AUTOCOMPLETE_GENERATION} />
+					</Tooltip>
+				</div>
+
+				{#if taskConfig.ENABLE_AUTOCOMPLETE_GENERATION}
+					<div class="mt-3">
+						<div class=" mb-2.5 text-xs font-medium">
+							{$i18n.t('Autocomplete Generation Input Max Length')}
+						</div>
+
+						<Tooltip
+							content={$i18n.t('Character limit for autocomplete generation input')}
+							placement="top-start"
+						>
+							<input
+								class="w-full outline-none bg-transparent"
+								bind:value={taskConfig.AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH}
+								placeholder={$i18n.t('-1 for no limit, or a positive integer for a specific limit')}
+							/>
+						</Tooltip>
+					</div>
+				{/if}
+
+				<hr class=" border-gray-50 dark:border-gray-850 my-3" />
+
+				<div class="my-3 flex w-full items-center justify-between">
+					<div class=" self-center text-xs font-medium">
+						{$i18n.t('Tags Generation')}
 					</div>
 
 					<Switch bind:state={taskConfig.ENABLE_TAGS_GENERATION} />
@@ -166,11 +199,11 @@
 					</div>
 				{/if}
 
-				<hr class=" dark:border-gray-850 my-3" />
+				<hr class=" border-gray-50 dark:border-gray-850 my-3" />
 
 				<div class="my-3 flex w-full items-center justify-between">
 					<div class=" self-center text-xs font-medium">
-						{$i18n.t('Enable Retrieval Query Generation')}
+						{$i18n.t('Retrieval Query Generation')}
 					</div>
 
 					<Switch bind:state={taskConfig.ENABLE_RETRIEVAL_QUERY_GENERATION} />
@@ -178,7 +211,7 @@
 
 				<div class="my-3 flex w-full items-center justify-between">
 					<div class=" self-center text-xs font-medium">
-						{$i18n.t('Enable Web Search Query Generation')}
+						{$i18n.t('Web Search Query Generation')}
 					</div>
 
 					<Switch bind:state={taskConfig.ENABLE_SEARCH_QUERY_GENERATION} />
@@ -201,7 +234,7 @@
 				</div>
 			</div>
 
-			<hr class=" dark:border-gray-850 my-3" />
+			<hr class=" border-gray-50 dark:border-gray-850 my-3" />
 
 			<div class=" space-y-3 {banners.length > 0 ? ' mb-3' : ''}">
 				<div class="flex w-full justify-between">

+ 5 - 5
src/lib/components/admin/Settings/Models.svelte

@@ -44,10 +44,10 @@
 		filteredModels = models
 			.filter((m) => searchValue === '' || m.name.toLowerCase().includes(searchValue.toLowerCase()))
 			.sort((a, b) => {
-				// Check if either model is inactive and push them to the bottom
-				if ((a.is_active ?? true) !== (b.is_active ?? true)) {
-					return (b.is_active ?? true) - (a.is_active ?? true);
-				}
+				// // Check if either model is inactive and push them to the bottom
+				// if ((a.is_active ?? true) !== (b.is_active ?? true)) {
+				// 	return (b.is_active ?? true) - (a.is_active ?? true);
+				// }
 				// If both models' active states are the same, sort alphabetically
 				return a.name.localeCompare(b.name);
 			});
@@ -137,7 +137,7 @@
 	});
 </script>
 
-<ConfigureModelsModal bind:show={showConfigModal} {init} />
+<ConfigureModelsModal bind:show={showConfigModal} initHandler={init} />
 
 {#if models !== null}
 	{#if selectedModelId === null}

+ 29 - 21
src/lib/components/admin/Settings/Models/ConfigureModelsModal.svelte

@@ -18,7 +18,7 @@
 	import Plus from '$lib/components/icons/Plus.svelte';
 
 	export let show = false;
-	export let init = () => {};
+	export let initHandler = () => {};
 
 	let config = null;
 
@@ -29,26 +29,11 @@
 	let loading = false;
 	let showResetModal = false;
 
-	const submitHandler = async () => {
-		loading = true;
-
-		const res = await setModelsConfig(localStorage.token, {
-			DEFAULT_MODELS: defaultModelIds.join(','),
-			MODEL_ORDER_LIST: modelIds
-		});
+	$: if (show) {
+		init();
+	}
 
-		if (res) {
-			toast.success($i18n.t('Models configuration saved successfully'));
-			init();
-			show = false;
-		} else {
-			toast.error($i18n.t('Failed to save models configuration'));
-		}
-
-		loading = false;
-	};
-
-	onMount(async () => {
+	const init = async () => {
 		config = await getModelsConfig(localStorage.token);
 
 		if (config?.DEFAULT_MODELS) {
@@ -68,6 +53,28 @@
 			// Add remaining IDs not in MODEL_ORDER_LIST, sorted alphabetically
 			...allModelIds.filter((id) => !orderedSet.has(id)).sort((a, b) => a.localeCompare(b))
 		];
+	};
+	const submitHandler = async () => {
+		loading = true;
+
+		const res = await setModelsConfig(localStorage.token, {
+			DEFAULT_MODELS: defaultModelIds.join(','),
+			MODEL_ORDER_LIST: modelIds
+		});
+
+		if (res) {
+			toast.success($i18n.t('Models configuration saved successfully'));
+			initHandler();
+			show = false;
+		} else {
+			toast.error($i18n.t('Failed to save models configuration'));
+		}
+
+		loading = false;
+	};
+
+	onMount(async () => {
+		init();
 	});
 </script>
 
@@ -79,7 +86,7 @@
 		const res = deleteAllModels(localStorage.token);
 		if (res) {
 			toast.success($i18n.t('All models deleted successfully'));
-			init();
+			initHandler();
 		}
 	}}
 />
@@ -213,6 +220,7 @@
 										showResetModal = true;
 									}}
 								>
+									<!-- {$i18n.t('Delete All Models')} -->
 									{$i18n.t('Reset All Models')}
 								</button>
 							</Tooltip>

+ 31 - 1
src/lib/components/admin/Settings/WebSearch.svelte

@@ -16,6 +16,7 @@
 		'searxng',
 		'google_pse',
 		'brave',
+		'kagi',
 		'mojeek',
 		'serpstack',
 		'serper',
@@ -29,13 +30,15 @@
 
 	let youtubeLanguage = 'en';
 	let youtubeTranslation = null;
+	let youtubeProxyUrl = '';
 
 	const submitHandler = async () => {
 		const res = await updateRAGConfig(localStorage.token, {
 			web: webConfig,
 			youtube: {
 				language: youtubeLanguage.split(',').map((lang) => lang.trim()),
-				translation: youtubeTranslation
+				translation: youtubeTranslation,
+				proxy_url: youtubeProxyUrl
 			}
 		});
 	};
@@ -48,6 +51,7 @@
 
 			youtubeLanguage = res.youtube.language.join(',');
 			youtubeTranslation = res.youtube.translation;
+			youtubeProxyUrl = res.youtube.proxy_url;
 		}
 	});
 </script>
@@ -152,6 +156,17 @@
 									bind:value={webConfig.search.brave_search_api_key}
 								/>
 							</div>
+						{:else if webConfig.search.engine === 'kagi'}
+							<div>
+								<div class=" self-center text-xs font-medium mb-1">
+									{$i18n.t('Kagi Search API Key')}
+								</div>
+
+								<SensitiveInput
+									placeholder={$i18n.t('Enter Kagi Search API Key')}
+									bind:value={webConfig.search.kagi_search_api_key}
+								/>
+							</div>
 						{:else if webConfig.search.engine === 'mojeek'}
 							<div>
 								<div class=" self-center text-xs font-medium mb-1">
@@ -358,6 +373,21 @@
 						</div>
 					</div>
 				</div>
+
+				<div>
+					<div class=" py-0.5 flex w-full justify-between">
+						<div class=" w-20 text-xs font-medium self-center">{$i18n.t('Proxy URL')}</div>
+						<div class=" flex-1 self-center">
+							<input
+								class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
+								type="text"
+								placeholder={$i18n.t('Enter proxy URL (e.g. https://user:password@host:port)')}
+								bind:value={youtubeProxyUrl}
+								autocomplete="off"
+							/>
+						</div>
+					</div>
+				</div>
 			</div>
 		{/if}
 	</div>

+ 31 - 27
src/lib/components/admin/Users/UserList/UserChatsModal.svelte

@@ -9,13 +9,14 @@
 
 	import Modal from '$lib/components/common/Modal.svelte';
 	import Tooltip from '$lib/components/common/Tooltip.svelte';
+	import Spinner from '$lib/components/common/Spinner.svelte';
 
 	const i18n = getContext('i18n');
 
 	export let show = false;
 	export let user;
 
-	let chats = [];
+	let chats = null;
 
 	const deleteChatHandler = async (chatId) => {
 		const res = await deleteChatById(localStorage.token, chatId).catch((error) => {
@@ -31,6 +32,8 @@
 				chats = await getChatListByUserId(localStorage.token, user.id);
 			}
 		})();
+	} else {
+		chats = null;
 	}
 
 	let sortKey = 'updated_at'; // default sort key
@@ -46,33 +49,32 @@
 </script>
 
 <Modal size="lg" bind:show>
-	<div>
-		<div class=" flex justify-between dark:text-gray-300 px-5 py-4">
-			<div class=" text-lg font-medium self-center capitalize">
-				{$i18n.t("{{user}}'s Chats", { user: user.name })}
-			</div>
-			<button
-				class="self-center"
-				on:click={() => {
-					show = false;
-				}}
-			>
-				<svg
-					xmlns="http://www.w3.org/2000/svg"
-					viewBox="0 0 20 20"
-					fill="currentColor"
-					class="w-5 h-5"
-				>
-					<path
-						d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
-					/>
-				</svg>
-			</button>
+	<div class=" flex justify-between dark:text-gray-300 px-5 pt-4">
+		<div class=" text-lg font-medium self-center capitalize">
+			{$i18n.t("{{user}}'s Chats", { user: user.name })}
 		</div>
-		<hr class=" dark:border-gray-850" />
+		<button
+			class="self-center"
+			on:click={() => {
+				show = false;
+			}}
+		>
+			<svg
+				xmlns="http://www.w3.org/2000/svg"
+				viewBox="0 0 20 20"
+				fill="currentColor"
+				class="w-5 h-5"
+			>
+				<path
+					d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
+				/>
+			</svg>
+		</button>
+	</div>
 
-		<div class="flex flex-col md:flex-row w-full px-5 py-4 md:space-x-4 dark:text-gray-200">
-			<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
+	<div class="flex flex-col md:flex-row w-full px-5 pt-2 pb-4 md:space-x-4 dark:text-gray-200">
+		<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
+			{#if chats}
 				{#if chats.length > 0}
 					<div class="text-left text-sm w-full mb-4 max-h-[22rem] overflow-y-scroll">
 						<div class="relative overflow-x-auto">
@@ -176,7 +178,9 @@
 						{$i18n.t('has no conversations.')}
 					</div>
 				{/if}
-			</div>
+			{:else}
+				<Spinner />
+			{/if}
 		</div>
 	</div>
 </Modal>

+ 3 - 3
src/lib/components/chat/Chat.svelte

@@ -2284,7 +2284,7 @@
 							</div>
 						</div>
 
-						<div class=" pb-[1.6rem]">
+						<div class=" pb-[1rem]">
 							<MessageInput
 								{history}
 								{selectedModels}
@@ -2319,9 +2319,9 @@
 							/>
 
 							<div
-								class="absolute bottom-1.5 text-xs text-gray-500 text-center line-clamp-1 right-0 left-0"
+								class="absolute bottom-1 text-xs text-gray-500 text-center line-clamp-1 right-0 left-0"
 							>
-								{$i18n.t('LLMs can make mistakes. Verify important information.')}
+								<!-- {$i18n.t('LLMs can make mistakes. Verify important information.')} -->
 							</div>
 						</div>
 					{:else}

+ 144 - 116
src/lib/components/chat/MessageInput.svelte

@@ -18,7 +18,7 @@
 		showControls
 	} from '$lib/stores';
 
-	import { blobToFile, findWordIndices } from '$lib/utils';
+	import { blobToFile, createMessagesList, findWordIndices } from '$lib/utils';
 	import { transcribeAudio } from '$lib/apis/audio';
 	import { uploadFile } from '$lib/apis/files';
 	import { getTools } from '$lib/apis/tools';
@@ -34,6 +34,8 @@
 	import Commands from './MessageInput/Commands.svelte';
 	import XMark from '../icons/XMark.svelte';
 	import RichTextInput from '../common/RichTextInput.svelte';
+	import { generateAutoCompletion } from '$lib/apis';
+	import { error, text } from '@sveltejs/kit';
 
 	const i18n = getContext('i18n');
 
@@ -47,6 +49,9 @@
 	export let atSelectedModel: Model | undefined;
 	export let selectedModels: [''];
 
+	let selectedModelIds = [];
+	$: selectedModelIds = atSelectedModel !== undefined ? [atSelectedModel.id] : selectedModels;
+
 	export let history;
 
 	export let prompt = '';
@@ -266,8 +271,8 @@
 
 {#if loaded}
 	<div class="w-full font-primary">
-		<div class=" -mb-0.5 mx-auto inset-x-0 bg-transparent flex justify-center">
-			<div class="flex flex-col px-2.5 max-w-6xl w-full">
+		<div class=" mx-auto inset-x-0 bg-transparent flex justify-center">
+			<div class="flex flex-col px-3 max-w-6xl w-full">
 				<div class="relative">
 					{#if autoScroll === false && history?.currentId}
 						<div
@@ -300,7 +305,7 @@
 				<div class="w-full relative">
 					{#if atSelectedModel !== undefined || selectedToolIds.length > 0 || webSearchEnabled}
 						<div
-							class="px-4 pb-0.5 pt-1.5 text-left w-full flex flex-col absolute bottom-0 left-0 right-0 bg-gradient-to-t from-white dark:from-gray-900 z-10"
+							class="px-3 pb-0.5 pt-1.5 text-left w-full flex flex-col absolute bottom-0 left-0 right-0 bg-gradient-to-t from-white dark:from-gray-900 z-10"
 						>
 							{#if selectedToolIds.length > 0}
 								<div class="flex items-center justify-between w-full">
@@ -405,7 +410,7 @@
 		</div>
 
 		<div class="{transparentBackground ? 'bg-transparent' : 'bg-white dark:bg-gray-900'} ">
-			<div class="max-w-6xl px-4 mx-auto inset-x-0">
+			<div class="max-w-6xl px-2.5 mx-auto inset-x-0">
 				<div class="">
 					<input
 						bind:this={filesInputElement}
@@ -457,7 +462,7 @@
 							}}
 						>
 							<div
-								class="flex-1 flex flex-col relative w-full rounded-3xl px-1.5 bg-gray-50 dark:bg-gray-850 dark:text-gray-100"
+								class="flex-1 flex flex-col relative w-full rounded-3xl px-1 bg-gray-50 dark:bg-gray-400/5 dark:text-gray-100"
 								dir={$settings?.chatDirection ?? 'LTR'}
 							>
 								{#if files.length > 0}
@@ -542,7 +547,7 @@
 								{/if}
 
 								<div class=" flex">
-									<div class=" ml-0.5 self-end mb-1.5 flex space-x-1">
+									<div class="ml-1 self-end mb-1.5 flex space-x-1">
 										<InputMenu
 											bind:webSearchEnabled
 											bind:selectedToolIds
@@ -557,18 +562,18 @@
 											}}
 										>
 											<button
-												class="bg-gray-50 hover:bg-gray-100 text-gray-800 dark:bg-gray-850 dark:text-white dark:hover:bg-gray-800 transition rounded-full p-2 outline-none focus:outline-none"
+												class="bg-transparent hover:bg-white/80 text-gray-800 dark:text-white dark:hover:bg-gray-800 transition rounded-full p-2 outline-none focus:outline-none"
 												type="button"
 												aria-label="More"
 											>
 												<svg
 													xmlns="http://www.w3.org/2000/svg"
-													viewBox="0 0 16 16"
+													viewBox="0 0 20 20"
 													fill="currentColor"
 													class="size-5"
 												>
 													<path
-														d="M8.75 3.75a.75.75 0 0 0-1.5 0v3.5h-3.5a.75.75 0 0 0 0 1.5h3.5v3.5a.75.75 0 0 0 1.5 0v-3.5h3.5a.75.75 0 0 0 0-1.5h-3.5v-3.5Z"
+														d="M10.75 4.75a.75.75 0 0 0-1.5 0v4.5h-4.5a.75.75 0 0 0 0 1.5h4.5v4.5a.75.75 0 0 0 1.5 0v-4.5h4.5a.75.75 0 0 0 0-1.5h-4.5v-4.5Z"
 													/>
 												</svg>
 											</button>
@@ -577,10 +582,11 @@
 
 									{#if $settings?.richTextInput ?? true}
 										<div
-											class="scrollbar-hidden text-left bg-gray-50 dark:bg-gray-850 dark:text-gray-100 outline-none w-full py-2.5 px-1 rounded-xl resize-none h-fit max-h-60 overflow-auto"
+											class="scrollbar-hidden text-left bg-transparent dark:text-gray-100 outline-none w-full py-2.5 px-1 rounded-xl resize-none h-fit max-h-80 overflow-auto"
 										>
 											<RichTextInput
 												bind:this={chatInputElement}
+												bind:value={prompt}
 												id="chat-input"
 												messageInput={true}
 												shiftEnter={!$mobile ||
@@ -591,7 +597,28 @@
 													)}
 												placeholder={placeholder ? placeholder : $i18n.t('Send a Message')}
 												largeTextAsFile={$settings?.largeTextAsFile ?? false}
-												bind:value={prompt}
+												autocomplete={true}
+												generateAutoCompletion={async (text) => {
+													if (selectedModelIds.length === 0 || !selectedModelIds.at(0)) {
+														toast.error($i18n.t('Please select a model first.'));
+													}
+
+													const res = await generateAutoCompletion(
+														localStorage.token,
+														selectedModelIds.at(0),
+														text,
+														history?.currentId
+															? createMessagesList(history, history.currentId)
+															: null
+													).catch((error) => {
+														console.log(error);
+
+														return null;
+													});
+
+													console.log(res);
+													return res;
+												}}
 												on:keydown={async (e) => {
 													e = e.detail.event;
 
@@ -754,7 +781,7 @@
 										<textarea
 											id="chat-input"
 											bind:this={chatInputElement}
-											class="scrollbar-hidden bg-gray-50 dark:bg-gray-850 dark:text-gray-100 outline-none w-full py-3 px-1 rounded-xl resize-none h-[48px]"
+											class="scrollbar-hidden bg-transparent dark:text-gray-100 outline-none w-full py-3 px-1 rounded-xl resize-none h-[48px]"
 											placeholder={placeholder ? placeholder : $i18n.t('Send a Message')}
 											bind:value={prompt}
 											on:keypress={(e) => {
@@ -880,7 +907,7 @@
 													}
 
 													e.target.style.height = '';
-													e.target.style.height = Math.min(e.target.scrollHeight, 200) + 'px';
+													e.target.style.height = Math.min(e.target.scrollHeight, 320) + 'px';
 												}
 
 												if (e.key === 'Escape') {
@@ -893,11 +920,11 @@
 											rows="1"
 											on:input={async (e) => {
 												e.target.style.height = '';
-												e.target.style.height = Math.min(e.target.scrollHeight, 200) + 'px';
+												e.target.style.height = Math.min(e.target.scrollHeight, 320) + 'px';
 											}}
 											on:focus={async (e) => {
 												e.target.style.height = '';
-												e.target.style.height = Math.min(e.target.scrollHeight, 200) + 'px';
+												e.target.style.height = Math.min(e.target.scrollHeight, 320) + 'px';
 											}}
 											on:paste={async (e) => {
 												const clipboardData = e.clipboardData || window.clipboardData;
@@ -940,12 +967,12 @@
 										/>
 									{/if}
 
-									<div class="self-end mb-2 flex space-x-1 mr-1">
+									<div class="self-end mb-1.5 flex space-x-1 mr-1">
 										{#if !history?.currentId || history.messages[history.currentId]?.done == true}
 											<Tooltip content={$i18n.t('Record voice')}>
 												<button
 													id="voice-input-button"
-													class=" text-gray-600 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-850 transition rounded-full p-1.5 mr-0.5 self-center"
+													class=" text-gray-600 dark:text-gray-300 hover:text-gray-700 dark:hover:text-gray-200 transition rounded-full p-1.5 mr-0.5 self-center"
 													type="button"
 													on:click={async () => {
 														try {
@@ -989,112 +1016,113 @@
 												</button>
 											</Tooltip>
 										{/if}
-									</div>
-								</div>
-							</div>
-							<div class="flex items-end w-10">
-								{#if !history.currentId || history.messages[history.currentId]?.done == true}
-									{#if prompt === ''}
-										<div class=" flex items-center mb-1">
-											<Tooltip content={$i18n.t('Call')}>
-												<button
-													class=" text-gray-600 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-850 transition rounded-full p-2 self-center"
-													type="button"
-													on:click={async () => {
-														if (selectedModels.length > 1) {
-															toast.error($i18n.t('Select only one model to call'));
 
-															return;
-														}
+										{#if !history.currentId || history.messages[history.currentId]?.done == true}
+											{#if prompt === ''}
+												<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-2 self-center"
+															type="button"
+															on:click={async () => {
+																if (selectedModels.length > 1) {
+																	toast.error($i18n.t('Select only one model to call'));
 
-														if ($config.audio.stt.engine === 'web') {
-															toast.error(
-																$i18n.t('Call feature is not supported when using Web STT engine')
-															);
+																	return;
+																}
 
-															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 ($config.audio.stt.engine === 'web') {
+																	toast.error(
+																		$i18n.t(
+																			'Call feature is not supported when using Web STT engine'
+																		)
+																	);
 
-															if (stream) {
-																const tracks = stream.getTracks();
-																tracks.forEach((track) => track.stop());
-															}
+																	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
 
-															stream = null;
+																	if (stream) {
+																		const tracks = stream.getTracks();
+																		tracks.forEach((track) => track.stop());
+																	}
 
-															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-6" />
-												</button>
-											</Tooltip>
-										</div>
-									{:else}
-										<div class=" flex items-center mb-1">
-											<Tooltip content={$i18n.t('Send message')}>
-												<button
-													id="send-message-button"
-													class="{prompt !== ''
-														? '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 m-0.5 self-center"
-													type="submit"
-													disabled={prompt === ''}
-												>
-													<svg
-														xmlns="http://www.w3.org/2000/svg"
-														viewBox="0 0 16 16"
-														fill="currentColor"
-														class="size-6"
+																	stream = null;
+
+																	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 !== ''
+																? '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 === ''}
+														>
+															<svg
+																xmlns="http://www.w3.org/2000/svg"
+																viewBox="0 0 16 16"
+																fill="currentColor"
+																class="size-6"
+															>
+																<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}
+										{:else}
+											<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();
+														}}
 													>
-														<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}
-								{:else}
-									<div class=" flex items-center mb-1.5">
-										<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-6"
-												>
-													<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>
+														<svg
+															xmlns="http://www.w3.org/2000/svg"
+															viewBox="0 0 24 24"
+															fill="currentColor"
+															class="size-6"
+														>
+															<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>
+										{/if}
 									</div>
-								{/if}
+								</div>
 							</div>
 						</form>
 					{/if}

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

@@ -106,7 +106,7 @@
 	{:else}
 		<div
 			id="commands-container"
-			class="pl-3 pr-14 mb-3 text-left w-full absolute bottom-0 left-0 right-0 z-10"
+			class="px-2 mb-2 text-left w-full absolute bottom-0 left-0 right-0 z-10"
 		>
 			<div class="flex w-full rounded-xl border border-gray-50 dark:border-gray-850">
 				<div

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

@@ -159,7 +159,7 @@
 {#if filteredItems.length > 0 || prompt.split(' ')?.at(0)?.substring(1).startsWith('http')}
 	<div
 		id="commands-container"
-		class="pl-3 pr-14 mb-3 text-left w-full absolute bottom-0 left-0 right-0 z-10"
+		class="px-2 mb-2 text-left w-full absolute bottom-0 left-0 right-0 z-10"
 	>
 		<div class="flex w-full rounded-xl border border-gray-50 dark:border-gray-850">
 			<div

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

@@ -68,7 +68,7 @@
 {#if filteredItems.length > 0}
 	<div
 		id="commands-container"
-		class="pl-3 pr-14 mb-3 text-left w-full absolute bottom-0 left-0 right-0 z-10"
+		class="px-2 mb-2 text-left w-full absolute bottom-0 left-0 right-0 z-10"
 	>
 		<div class="flex w-full rounded-xl border border-gray-50 dark:border-gray-850">
 			<div

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

@@ -137,7 +137,7 @@
 {#if filteredPrompts.length > 0}
 	<div
 		id="commands-container"
-		class="pl-3 pr-14 mb-3 text-left w-full absolute bottom-0 left-0 right-0 z-10"
+		class="px-2 mb-2 text-left w-full absolute bottom-0 left-0 right-0 z-10"
 	>
 		<div class="flex w-full rounded-xl border border-gray-50 dark:border-gray-850">
 			<div

+ 1 - 0
src/lib/components/chat/Messages.svelte

@@ -248,6 +248,7 @@
 					id: responseMessageId,
 					parentId: parentId,
 					childrenIds: [],
+					files: undefined,
 					content: content,
 					timestamp: Math.floor(Date.now() / 1000) // Unix epoch
 				};

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

@@ -4,9 +4,9 @@
 	export let content = '';
 </script>
 
-<div class="flex my-2 gap-2.5 border px-4 py-3 border-red-800 bg-red-800/30 rounded-lg">
+<div class="flex my-2 gap-2.5 border px-4 py-3 border-red-600/10 bg-red-600/10 rounded-lg">
 	<div class=" self-start mt-0.5">
-		<Info className="size-5" />
+		<Info className="size-5 text-red-700 dark:text-red-400" />
 	</div>
 
 	<div class=" self-center text-sm">

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

@@ -60,7 +60,7 @@
 <!-- {JSON.stringify(tokens)} -->
 {#each tokens as token, tokenIdx (tokenIdx)}
 	{#if token.type === 'hr'}
-		<hr />
+		<hr class=" border-gray-50 dark:border-gray-850" />
 	{:else if token.type === 'heading'}
 		<svelte:element this={headerComponent(token.depth)}>
 			<MarkdownInlineTokens id={`${id}-${tokenIdx}-h`} tokens={token.tokens} {onSourceClick} />
@@ -89,11 +89,9 @@
 		{/if}
 	{:else if token.type === 'table'}
 		<div class="relative w-full group">
-			<div
-				class="scrollbar-hidden relative whitespace-nowrap overflow-x-auto max-w-full rounded-lg"
-			>
+			<div class="scrollbar-hidden relative overflow-x-auto max-w-full rounded-lg">
 				<table
-					class="table-auto w-full text-sm text-left text-gray-500 dark:text-gray-400 max-w-full rounded-xl"
+					class=" w-full text-sm text-left text-gray-500 dark:text-gray-400 max-w-full rounded-xl"
 				>
 					<thead
 						class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-850 dark:text-gray-400 border-none"
@@ -102,15 +100,17 @@
 							{#each token.header as header, headerIdx}
 								<th
 									scope="col"
-									class="!px-2 !py-1.5 cursor-pointer select-none border border-gray-50 dark:border-gray-850"
+									class="!px-3 !py-1.5 cursor-pointer select-none border border-gray-50 dark:border-gray-850"
 									style={token.align[headerIdx] ? '' : `text-align: ${token.align[headerIdx]}`}
 								>
-									<div class="flex gap-1.5 items-center">
-										<MarkdownInlineTokens
-											id={`${id}-${tokenIdx}-header-${headerIdx}`}
-											tokens={header.tokens}
-											{onSourceClick}
-										/>
+									<div class="flex flex-col gap-1.5 text-left">
+										<div class="flex-shrink-0 break-normal">
+											<MarkdownInlineTokens
+												id={`${id}-${tokenIdx}-header-${headerIdx}`}
+												tokens={header.tokens}
+												{onSourceClick}
+											/>
+										</div>
 									</div>
 								</th>
 							{/each}
@@ -121,10 +121,10 @@
 							<tr class="bg-white dark:bg-gray-900 dark:border-gray-850 text-xs">
 								{#each row ?? [] as cell, cellIdx}
 									<td
-										class="!px-2 !py-1.5 font-medium text-gray-900 dark:text-white w-max border border-gray-50 dark:border-gray-850"
+										class="!px-3 !py-1.5 text-gray-900 dark:text-white w-max border border-gray-50 dark:border-gray-850"
 										style={token.align[cellIdx] ? '' : `text-align: ${token.align[cellIdx]}`}
 									>
-										<div class="flex">
+										<div class="flex flex-col break-normal">
 											<MarkdownInlineTokens
 												id={`${id}-${tokenIdx}-row-${rowIdx}-${cellIdx}`}
 												tokens={cell.tokens}

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

@@ -658,7 +658,7 @@
 									/>
 								{/if}
 
-								{#if message.error}
+								{#if message?.error}
 									<Error content={message?.error?.content ?? message.content} />
 								{/if}
 

+ 3 - 1
src/lib/components/common/Banner.svelte

@@ -2,6 +2,8 @@
 	import type { Banner } from '$lib/types';
 	import { onMount, createEventDispatcher } from 'svelte';
 	import { fade } from 'svelte/transition';
+	import DOMPurify from 'dompurify';
+	import { marked } from 'marked';
 
 	const dispatch = createEventDispatcher();
 
@@ -81,7 +83,7 @@
 				</div>
 
 				<div class="flex-1 text-xs text-gray-700 dark:text-white">
-					{banner.content}
+					{@html marked.parse(DOMPurify.sanitize(banner.content))}
 				</div>
 			</div>
 

+ 62 - 40
src/lib/components/common/FileItem.svelte

@@ -5,6 +5,7 @@
 	import FileItemModal from './FileItemModal.svelte';
 	import GarbageBin from '../icons/GarbageBin.svelte';
 	import Spinner from './Spinner.svelte';
+	import Tooltip from './Tooltip.svelte';
 
 	const i18n = getContext('i18n');
 	const dispatch = createEventDispatcher();
@@ -18,6 +19,7 @@
 
 	export let item = null;
 	export let edit = false;
+	export let small = false;
 
 	export let name: string;
 	export let type: string;
@@ -31,7 +33,9 @@
 {/if}
 
 <button
-	class="relative group p-1.5 {className} flex items-center {colorClassName} rounded-2xl text-left"
+	class="relative group p-1.5 {className} flex items-center gap-1 {colorClassName} {small
+		? 'rounded-xl'
+		: 'rounded-2xl'} text-left"
 	type="button"
 	on:click={async () => {
 		if (item?.file?.data?.content) {
@@ -49,48 +53,66 @@
 		dispatch('click');
 	}}
 >
-	<div class="p-3 bg-black/20 dark:bg-white/10 text-white rounded-xl">
-		{#if !loading}
-			<svg
-				xmlns="http://www.w3.org/2000/svg"
-				viewBox="0 0 24 24"
-				fill="currentColor"
-				class=" size-5"
-			>
-				<path
-					fill-rule="evenodd"
-					d="M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625ZM7.5 15a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 7.5 15Zm.75 2.25a.75.75 0 0 0 0 1.5H12a.75.75 0 0 0 0-1.5H8.25Z"
-					clip-rule="evenodd"
-				/>
-				<path
-					d="M12.971 1.816A5.23 5.23 0 0 1 14.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 0 1 3.434 1.279 9.768 9.768 0 0 0-6.963-6.963Z"
-				/>
-			</svg>
-		{:else}
-			<Spinner />
-		{/if}
-	</div>
-
-	<div class="flex flex-col justify-center -space-y-0.5 ml-1 px-2.5 w-full">
-		<div class=" dark:text-gray-100 text-sm font-medium line-clamp-1 mb-1">
-			{name}
-		</div>
-
-		<div class=" flex justify-between text-gray-500 text-xs line-clamp-1">
-			{#if type === 'file'}
-				{$i18n.t('File')}
-			{:else if type === 'doc'}
-				{$i18n.t('Document')}
-			{:else if type === 'collection'}
-				{$i18n.t('Collection')}
+	{#if !small}
+		<div class="p-3 bg-black/20 dark:bg-white/10 text-white rounded-xl">
+			{#if !loading}
+				<svg
+					xmlns="http://www.w3.org/2000/svg"
+					viewBox="0 0 24 24"
+					fill="currentColor"
+					class=" size-5"
+				>
+					<path
+						fill-rule="evenodd"
+						d="M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625ZM7.5 15a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 7.5 15Zm.75 2.25a.75.75 0 0 0 0 1.5H12a.75.75 0 0 0 0-1.5H8.25Z"
+						clip-rule="evenodd"
+					/>
+					<path
+						d="M12.971 1.816A5.23 5.23 0 0 1 14.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 0 1 3.434 1.279 9.768 9.768 0 0 0-6.963-6.963Z"
+					/>
+				</svg>
 			{:else}
-				<span class=" capitalize line-clamp-1">{type}</span>
-			{/if}
-			{#if size}
-				<span class="capitalize">{formatFileSize(size)}</span>
+				<Spinner />
 			{/if}
 		</div>
-	</div>
+	{/if}
+
+	{#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">
+				{name}
+			</div>
+
+			<div class=" flex justify-between text-gray-500 text-xs line-clamp-1">
+				{#if type === 'file'}
+					{$i18n.t('File')}
+				{:else if type === 'doc'}
+					{$i18n.t('Document')}
+				{:else if type === 'collection'}
+					{$i18n.t('Collection')}
+				{:else}
+					<span class=" capitalize line-clamp-1">{type}</span>
+				{/if}
+				{#if size}
+					<span class="capitalize">{formatFileSize(size)}</span>
+				{/if}
+			</div>
+		</div>
+	{:else}
+		<Tooltip content={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}
+						<div class=" shrink-0 mr-2">
+							<Spinner className="size-4" />
+						</div>
+					{/if}
+					<div class="font-medium line-clamp-1 flex-1">{name}</div>
+					<div class="text-gray-500 text-xs capitalize shrink-0">{formatFileSize(size)}</div>
+				</div>
+			</div>
+		</Tooltip>
+	{/if}
 
 	{#if dismissible}
 		<div class=" absolute -top-1 -right-1">

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

@@ -6,6 +6,8 @@
 
 	export let show = true;
 	export let size = 'md';
+
+	export let containerClassName = 'p-3';
 	export let className = 'bg-gray-50 dark:bg-gray-900 rounded-2xl';
 
 	let modalElement = null;
@@ -65,7 +67,7 @@
 	<!-- svelte-ignore a11y-no-static-element-interactions -->
 	<div
 		bind:this={modalElement}
-		class="modal fixed top-0 right-0 left-0 bottom-0 bg-black/60 w-full h-screen max-h-[100dvh] p-3 flex justify-center z-[9999] overflow-y-auto overscroll-contain"
+		class="modal fixed top-0 right-0 left-0 bottom-0 bg-black/60 w-full h-screen max-h-[100dvh] {containerClassName} flex justify-center z-[9999] overflow-y-auto overscroll-contain"
 		in:fade={{ duration: 10 }}
 		on:mousedown={() => {
 			show = false;

+ 84 - 20
src/lib/components/common/RichTextInput.svelte

@@ -2,7 +2,8 @@
 	import { marked } from 'marked';
 	import TurndownService from 'turndown';
 	const turndownService = new TurndownService({
-		codeBlockStyle: 'fenced'
+		codeBlockStyle: 'fenced',
+		headingStyle: 'atx'
 	});
 	turndownService.escape = (string) => string;
 
@@ -10,16 +11,18 @@
 	import { createEventDispatcher } from 'svelte';
 	const eventDispatch = createEventDispatcher();
 
-	import { EditorState, Plugin, TextSelection } from 'prosemirror-state';
+	import { EditorState, Plugin, PluginKey, TextSelection } from 'prosemirror-state';
+	import { Decoration, DecorationSet } from 'prosemirror-view';
 
 	import { Editor } from '@tiptap/core';
 
+	import { AIAutocompletion } from './RichTextInput/AutoCompletion.js';
+
 	import CodeBlockLowlight from '@tiptap/extension-code-block-lowlight';
 	import Placeholder from '@tiptap/extension-placeholder';
 	import Highlight from '@tiptap/extension-highlight';
 	import Typography from '@tiptap/extension-typography';
 	import StarterKit from '@tiptap/starter-kit';
-
 	import { all, createLowlight } from 'lowlight';
 
 	import { PASTED_TEXT_CHARACTER_LIMIT } from '$lib/constants';
@@ -32,6 +35,9 @@
 	export let value = '';
 	export let id = '';
 
+	export let preserveBreaks = false;
+	export let generateAutoCompletion: Function = async () => null;
+	export let autocomplete = false;
 	export let messageInput = false;
 	export let shiftEnter = false;
 	export let largeTextAsFile = false;
@@ -120,10 +126,23 @@
 	};
 
 	onMount(async () => {
+		console.log(value);
+
+		if (preserveBreaks) {
+			turndownService.addRule('preserveBreaks', {
+				filter: 'br', // Target <br> elements
+				replacement: function (content) {
+					return '<br/>';
+				}
+			});
+		}
+
 		async function tryParse(value, attempts = 3, interval = 100) {
 			try {
 				// Try parsing the value
-				return marked.parse(value);
+				return marked.parse(value.replaceAll(`\n<br/>`, `<br/>`), {
+					breaks: false
+				});
 			} catch (error) {
 				// If no attempts remain, fallback to plain text
 				if (attempts <= 1) {
@@ -147,20 +166,48 @@
 				}),
 				Highlight,
 				Typography,
-				Placeholder.configure({ placeholder })
+				Placeholder.configure({ placeholder }),
+				...(autocomplete
+					? [
+							AIAutocompletion.configure({
+								generateCompletion: async (text) => {
+									if (text.trim().length === 0) {
+										return null;
+									}
+
+									const suggestion = await generateAutoCompletion(text).catch(() => null);
+									if (!suggestion || suggestion.trim().length === 0) {
+										return null;
+									}
+
+									return suggestion;
+								}
+							})
+						]
+					: [])
 			],
 			content: content,
-			autofocus: true,
+			autofocus: messageInput ? true : false,
 			onTransaction: () => {
 				// force re-render so `editor.isActive` works as expected
 				editor = editor;
+				const newValue = turndownService
+					.turndown(
+						(preserveBreaks
+							? editor.getHTML().replace(/<p><\/p>/g, '<br/>')
+							: editor.getHTML()
+						).replace(/ {2,}/g, (m) => m.replace(/ /g, '\u00a0'))
+					)
+					.replace(/\u00a0/g, ' ');
 
-				const newValue = turndownService.turndown(editor.getHTML());
 				if (value !== newValue) {
 					value = newValue;
 
-					if (value === '') {
-						editor.commands.clearContent();
+					// check if the node is paragraph as well
+					if (editor.isActive('paragraph')) {
+						if (value === '') {
+							editor.commands.clearContent();
+						}
 					}
 				}
 			},
@@ -176,16 +223,16 @@
 						return false;
 					},
 					keydown: (view, event) => {
-						// Handle Tab Key
-						if (event.key === 'Tab') {
-							const handled = selectNextTemplate(view.state, view.dispatch);
-							if (handled) {
-								event.preventDefault();
-								return true;
+						if (messageInput) {
+							// Handle Tab Key
+							if (event.key === 'Tab') {
+								const handled = selectNextTemplate(view.state, view.dispatch);
+								if (handled) {
+									event.preventDefault();
+									return true;
+								}
 							}
-						}
 
-						if (messageInput) {
 							if (event.key === 'Enter') {
 								// Check if the current selection is inside a structured block (like codeBlock or list)
 								const { state } = view;
@@ -275,7 +322,9 @@
 			}
 		});
 
-		selectTemplate();
+		if (messageInput) {
+			selectTemplate();
+		}
 	});
 
 	onDestroy(() => {
@@ -285,8 +334,23 @@
 	});
 
 	// Update the editor content if the external `value` changes
-	$: if (editor && value !== turndownService.turndown(editor.getHTML())) {
-		editor.commands.setContent(marked.parse(value)); // Update editor content
+	$: if (
+		editor &&
+		value !==
+			turndownService
+				.turndown(
+					(preserveBreaks
+						? editor.getHTML().replace(/<p><\/p>/g, '<br/>')
+						: editor.getHTML()
+					).replace(/ {2,}/g, (m) => m.replace(/ /g, '\u00a0'))
+				)
+				.replace(/\u00a0/g, ' ')
+	) {
+		editor.commands.setContent(
+			marked.parse(value.replaceAll(`\n<br/>`, `<br/>`), {
+				breaks: false
+			})
+		); // Update editor content
 		selectTemplate();
 	}
 </script>

+ 278 - 0
src/lib/components/common/RichTextInput/AutoCompletion.js

@@ -0,0 +1,278 @@
+/*
+Here we initialize the plugin with keyword mapping.
+Intended to handle user interactions seamlessly.
+
+Observe the keydown events for proactive suggestions.
+Provide a mechanism for accepting AI suggestions.
+Evaluate each input change with debounce logic.
+Next, we implement touch and mouse interactions.
+
+Anchor the user experience to intuitive behavior.
+Intelligently reset suggestions on new input.
+*/
+
+import { Extension } from '@tiptap/core';
+import { Plugin, PluginKey } from 'prosemirror-state';
+
+export const AIAutocompletion = Extension.create({
+	name: 'aiAutocompletion',
+
+	addOptions() {
+		return {
+			generateCompletion: () => Promise.resolve(''),
+			debounceTime: 1000
+		};
+	},
+
+	addGlobalAttributes() {
+		return [
+			{
+				types: ['paragraph'],
+				attributes: {
+					class: {
+						default: null,
+						parseHTML: (element) => element.getAttribute('class'),
+						renderHTML: (attributes) => {
+							if (!attributes.class) return {};
+							return { class: attributes.class };
+						}
+					},
+					'data-prompt': {
+						default: null,
+						parseHTML: (element) => element.getAttribute('data-prompt'),
+						renderHTML: (attributes) => {
+							if (!attributes['data-prompt']) return {};
+							return { 'data-prompt': attributes['data-prompt'] };
+						}
+					},
+					'data-suggestion': {
+						default: null,
+						parseHTML: (element) => element.getAttribute('data-suggestion'),
+						renderHTML: (attributes) => {
+							if (!attributes['data-suggestion']) return {};
+							return { 'data-suggestion': attributes['data-suggestion'] };
+						}
+					}
+				}
+			}
+		];
+	},
+
+	addProseMirrorPlugins() {
+		let debounceTimer = null;
+		let loading = false;
+
+		let touchStartX = 0;
+		let touchStartY = 0;
+
+		return [
+			new Plugin({
+				key: new PluginKey('aiAutocompletion'),
+				props: {
+					handleKeyDown: (view, event) => {
+						const { state, dispatch } = view;
+						const { selection } = state;
+						const { $head } = selection;
+
+						if ($head.parent.type.name !== 'paragraph') return false;
+
+						const node = $head.parent;
+
+						if (event.key === 'Tab') {
+							// if (!node.attrs['data-suggestion']) {
+							//   // Generate completion
+							//   if (loading) return true
+							//   loading = true
+							//   const prompt = node.textContent
+							//   this.options.generateCompletion(prompt).then(suggestion => {
+							//     if (suggestion && suggestion.trim() !== '') {
+							//       dispatch(state.tr.setNodeMarkup($head.before(), null, {
+							//         ...node.attrs,
+							//         class: 'ai-autocompletion',
+							//         'data-prompt': prompt,
+							//         'data-suggestion': suggestion,
+							//       }))
+							//     }
+							//     // If suggestion is empty or null, do nothing
+							//   }).finally(() => {
+							//     loading = false
+							//   })
+							// }
+
+							if (node.attrs['data-suggestion']) {
+								// Accept suggestion
+								const suggestion = node.attrs['data-suggestion'];
+								dispatch(
+									state.tr.insertText(suggestion, $head.pos).setNodeMarkup($head.before(), null, {
+										...node.attrs,
+										class: null,
+										'data-prompt': null,
+										'data-suggestion': null
+									})
+								);
+								return true;
+							}
+						} else {
+							if (node.attrs['data-suggestion']) {
+								// Reset suggestion on any other key press
+								dispatch(
+									state.tr.setNodeMarkup($head.before(), null, {
+										...node.attrs,
+										class: null,
+										'data-prompt': null,
+										'data-suggestion': null
+									})
+								);
+							}
+
+							// Start debounce logic for AI generation only if the cursor is at the end of the paragraph
+							if (selection.empty && $head.pos === $head.end()) {
+								// Set up debounce for AI generation
+								if (this.options.debounceTime !== null) {
+									clearTimeout(debounceTimer);
+
+									// Capture current position
+									const currentPos = $head.before();
+
+									debounceTimer = setTimeout(() => {
+										const newState = view.state;
+										const newSelection = newState.selection;
+										const newNode = newState.doc.nodeAt(currentPos);
+
+										// Check if the node still exists and is still a paragraph
+										if (
+											newNode &&
+											newNode.type.name === 'paragraph' &&
+											newSelection.$head.pos === newSelection.$head.end() &&
+											newSelection.$head.pos === currentPos + newNode.nodeSize - 1
+										) {
+											const prompt = newNode.textContent;
+
+											if (prompt.trim() !== '') {
+												if (loading) return true;
+												loading = true;
+												this.options
+													.generateCompletion(prompt)
+													.then((suggestion) => {
+														if (suggestion && suggestion.trim() !== '') {
+															if (
+																view.state.selection.$head.pos === view.state.selection.$head.end()
+															) {
+																view.dispatch(
+																	newState.tr.setNodeMarkup(currentPos, null, {
+																		...newNode.attrs,
+																		class: 'ai-autocompletion',
+																		'data-prompt': prompt,
+																		'data-suggestion': suggestion
+																	})
+																);
+															}
+														}
+													})
+													.finally(() => {
+														loading = false;
+													});
+											}
+										}
+									}, this.options.debounceTime);
+								}
+							}
+						}
+						return false;
+					},
+					handleDOMEvents: {
+						touchstart: (view, event) => {
+							touchStartX = event.touches[0].clientX;
+							touchStartY = event.touches[0].clientY;
+							return false;
+						},
+						touchend: (view, event) => {
+							const touchEndX = event.changedTouches[0].clientX;
+							const touchEndY = event.changedTouches[0].clientY;
+
+							const deltaX = touchEndX - touchStartX;
+							const deltaY = touchEndY - touchStartY;
+
+							// Check if the swipe was primarily horizontal and to the right
+							if (Math.abs(deltaX) > Math.abs(deltaY) && deltaX > 50) {
+								const { state, dispatch } = view;
+								const { selection } = state;
+								const { $head } = selection;
+								const node = $head.parent;
+
+								if (node.type.name === 'paragraph' && node.attrs['data-suggestion']) {
+									const suggestion = node.attrs['data-suggestion'];
+									dispatch(
+										state.tr.insertText(suggestion, $head.pos).setNodeMarkup($head.before(), null, {
+											...node.attrs,
+											class: null,
+											'data-prompt': null,
+											'data-suggestion': null
+										})
+									);
+									return true;
+								}
+							}
+							return false;
+						},
+						// Add mousedown behavior
+						// mouseup: (view, event) => {
+						// 	const { state, dispatch } = view;
+						// 	const { selection } = state;
+						// 	const { $head } = selection;
+						// 	const node = $head.parent;
+
+						// 	// Reset debounce timer on mouse click
+						// 	clearTimeout(debounceTimer);
+
+						// 	// If a suggestion exists and the cursor moves, remove the suggestion
+						// 	if (
+						// 		node.type.name === 'paragraph' &&
+						// 		node.attrs['data-suggestion'] &&
+						// 		view.state.selection.$head.pos !== view.state.selection.$head.end()
+						// 	) {
+						// 		dispatch(
+						// 			state.tr.setNodeMarkup($head.before(), null, {
+						// 				...node.attrs,
+						// 				class: null,
+						// 				'data-prompt': null,
+						// 				'data-suggestion': null
+						// 			})
+						// 		);
+						// 	}
+
+						// 	return false;
+						// }
+						mouseup: (view, event) => {
+							const { state, dispatch } = view;
+
+							// Reset debounce timer on mouse click
+							clearTimeout(debounceTimer);
+
+							// Iterate over all nodes in the document
+							const tr = state.tr;
+							state.doc.descendants((node, pos) => {
+								if (node.type.name === 'paragraph' && node.attrs['data-suggestion']) {
+									// Remove suggestion from this paragraph
+									tr.setNodeMarkup(pos, null, {
+										...node.attrs,
+										class: null,
+										'data-prompt': null,
+										'data-suggestion': null
+									});
+								}
+							});
+
+							// Apply the transaction if any changes were made
+							if (tr.docChanged) {
+								dispatch(tr);
+							}
+
+							return false;
+						}
+					}
+				}
+			})
+		];
+	}
+});

+ 49 - 9
src/lib/components/common/Textarea.svelte

@@ -3,25 +3,65 @@
 
 	export let value = '';
 	export let placeholder = '';
-	export let rows = 1;
-	export let required = false;
 	export let className =
 		'w-full rounded-lg px-3 py-2 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none resize-none h-full';
 
 	let textareaElement;
 
+	$: if (textareaElement) {
+		if (textareaElement.innerText !== value && value !== '') {
+			textareaElement.innerText = value ?? '';
+		}
+	}
+
 	// Adjust height on mount and after setting the element.
 	onMount(async () => {
 		await tick();
 	});
+
+	// Handle paste event to ensure only plaintext is pasted
+	function handlePaste(event: ClipboardEvent) {
+		event.preventDefault(); // Prevent the default paste action
+		const clipboardData = event.clipboardData?.getData('text/plain'); // Get plaintext from clipboard
+
+		// Insert plaintext into the textarea
+		document.execCommand('insertText', false, clipboardData);
+	}
 </script>
 
-<textarea
+<div
+	contenteditable="true"
 	bind:this={textareaElement}
-	bind:value
-	{placeholder}
-	class={className}
-	style="field-sizing: content;"
-	{rows}
-	{required}
+	class="{className} whitespace-pre-wrap relative {value
+		? !value.trim()
+			? 'placeholder'
+			: ''
+		: 'placeholder'}"
+	style="field-sizing: content; -moz-user-select: text !important;"
+	on:input={() => {
+		const text = textareaElement.innerText;
+		if (text === '\n') {
+			value = '';
+			return;
+		}
+
+		value = text;
+	}}
+	on:paste={handlePaste}
+	data-placeholder={placeholder}
 />
+
+<style>
+	.placeholder::before {
+		/* abolute */
+		position: absolute;
+		content: attr(data-placeholder);
+		color: #adb5bd;
+		overflow: hidden;
+		display: -webkit-box;
+		-webkit-box-orient: vertical;
+		-webkit-line-clamp: 1;
+		pointer-events: none;
+		touch-action: none;
+	}
+</style>

+ 198 - 213
src/lib/components/workspace/Knowledge/KnowledgeBase.svelte

@@ -446,7 +446,13 @@
 
 	const onDragOver = (e) => {
 		e.preventDefault();
-		dragged = true;
+
+		// Check if a file is being draggedOver.
+		if (e.dataTransfer?.types?.includes('Files')) {
+			dragged = true;
+		} else {
+			dragged = false;
+		}
 	};
 
 	const onDragLeave = () => {
@@ -457,15 +463,17 @@
 		e.preventDefault();
 		dragged = false;
 
-		if (e.dataTransfer?.files) {
-			const inputFiles = e.dataTransfer?.files;
+		if (e.dataTransfer?.types?.includes('Files')) {
+			if (e.dataTransfer?.files) {
+				const inputFiles = e.dataTransfer?.files;
 
-			if (inputFiles && inputFiles.length > 0) {
-				for (const file of inputFiles) {
-					await uploadFileHandler(file);
+				if (inputFiles && inputFiles.length > 0) {
+					for (const file of inputFiles) {
+						await uploadFileHandler(file);
+					}
+				} else {
+					toast.error($i18n.t(`File not found.`));
 				}
-			} else {
-				toast.error($i18n.t(`File not found.`));
 			}
 		}
 	};
@@ -600,7 +608,7 @@
 	}}
 />
 
-<div class="flex flex-col w-full h-full max-h-[100dvh] translate-y-1" id="collection-container">
+<div class="flex flex-col w-full translate-y-1" id="collection-container">
 	{#if id && knowledge}
 		<AccessControlModal
 			bind:show={showAccessControlModal}
@@ -657,228 +665,205 @@
 			</div>
 		</div>
 
-		<div class="flex flex-row flex-1 h-full max-h-full pb-2.5">
-			<PaneGroup direction="horizontal">
-				<Pane
-					bind:pane
-					defaultSize={minSize}
-					collapsible={true}
-					maxSize={50}
-					{minSize}
-					class="h-full"
-					onExpand={() => {
-						showSidepanel = true;
-					}}
-					onCollapse={() => {
-						showSidepanel = false;
-					}}
-				>
-					<div
-						class="{largeScreen ? 'flex-shrink-0' : 'flex-1'}
-						flex
-						py-2
-						rounded-2xl
-						border
-						border-gray-50
-						h-full
-						dark:border-gray-850"
-					>
-						<div class=" flex flex-col w-full space-x-2 rounded-lg h-full">
-							<div class="w-full h-full flex flex-col">
-								<div class=" px-3">
-									<div class="flex py-1">
-										<div class=" self-center ml-1 mr-3">
-											<svg
-												xmlns="http://www.w3.org/2000/svg"
-												viewBox="0 0 20 20"
-												fill="currentColor"
-												class="w-4 h-4"
-											>
-												<path
-													fill-rule="evenodd"
-													d="M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z"
-													clip-rule="evenodd"
-												/>
-											</svg>
-										</div>
-										<input
-											class=" w-full text-sm pr-4 py-1 rounded-r-xl outline-none bg-transparent"
-											bind:value={query}
-											placeholder={$i18n.t('Search Collection')}
-											on:focus={() => {
-												selectedFileId = null;
+		<div class="flex flex-row flex-1 h-full max-h-full pb-2.5 gap-3">
+			{#if largeScreen}
+				<div class="flex-1 flex justify-start w-full h-full max-h-full">
+					{#if selectedFile}
+						<div class=" flex flex-col w-full h-full max-h-full">
+							<div class="flex-shrink-0 mb-2 flex items-center">
+								{#if !showSidepanel}
+									<div class="-translate-x-2">
+										<button
+											class="w-full text-left text-sm p-1.5 rounded-lg dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-gray-850"
+											on:click={() => {
+												pane.expand();
 											}}
-										/>
-
-										<div>
-											<AddContentMenu
-												on:upload={(e) => {
-													if (e.detail.type === 'directory') {
-														uploadDirectoryHandler();
-													} else if (e.detail.type === 'text') {
-														showAddTextContentModal = true;
-													} else {
-														document.getElementById('files-input').click();
-													}
-												}}
-												on:sync={(e) => {
-													showSyncConfirmModal = true;
-												}}
-											/>
-										</div>
+										>
+											<ChevronLeft strokeWidth="2.5" />
+										</button>
 									</div>
-								</div>
+								{/if}
 
-								{#if filteredItems.length > 0}
-									<div class=" flex overflow-y-auto h-full w-full scrollbar-hidden text-xs">
-										<Files
-											files={filteredItems}
-											{selectedFileId}
-											on:click={(e) => {
-												selectedFileId = selectedFileId === e.detail ? null : e.detail;
-											}}
-											on:delete={(e) => {
-												console.log(e.detail);
+								<div class=" flex-1 text-xl font-medium">
+									<a
+										class="hover:text-gray-500 hover:dark:text-gray-100 hover:underline flex-grow line-clamp-1"
+										href={selectedFile.id ? `/api/v1/files/${selectedFile.id}/content` : '#'}
+										target="_blank"
+									>
+										{selectedFile?.meta?.name}
+									</a>
+								</div>
 
-												selectedFileId = null;
-												deleteFileHandler(e.detail);
-											}}
-										/>
-									</div>
-								{:else}
-									<div
-										class="m-auto flex flex-col justify-center text-center text-gray-500 text-xs"
+								<div>
+									<button
+										class="self-center w-fit text-sm py-1 px-2.5 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-lg"
+										on:click={() => {
+											updateFileContentHandler();
+										}}
 									>
-										<div>
-											{$i18n.t('No content found')}
-										</div>
+										{$i18n.t('Save')}
+									</button>
+								</div>
+							</div>
 
-										<div class="mx-12 mt-2 text-center text-gray-200 dark:text-gray-700">
-											{$i18n.t('Drag and drop a file to upload or select a file to view')}
-										</div>
-									</div>
-								{/if}
+							<div
+								class=" flex-1 w-full h-full max-h-full text-sm bg-transparent outline-none overflow-y-auto scrollbar-hidden"
+							>
+								{#key selectedFile.id}
+									<RichTextInput
+										className="input-prose-sm"
+										bind:value={selectedFile.data.content}
+										placeholder={$i18n.t('Add content here')}
+										preserveBreaks={true}
+									/>
+								{/key}
 							</div>
 						</div>
-					</div>
-				</Pane>
-
-				{#if largeScreen}
-					<PaneResizer class="relative flex w-2 items-center justify-center bg-background group">
-						<div class="z-10 flex h-7 w-5 items-center justify-center rounded-sm">
-							<EllipsisVertical className="size-4 invisible group-hover:visible" />
+					{:else}
+						<div class="h-full flex w-full">
+							<div class="m-auto text-xs text-center text-gray-200 dark:text-gray-700">
+								{$i18n.t('Drag and drop a file to upload or select a file to view')}
+							</div>
 						</div>
-					</PaneResizer>
-					<Pane>
-						<div class="flex-1 flex justify-start h-full max-h-full">
-							{#if selectedFile}
-								<div class=" flex flex-col w-full h-full max-h-full ml-2.5">
-									<div class="flex-shrink-0 mb-2 flex items-center">
-										{#if !showSidepanel}
-											<div class="-translate-x-2">
-												<button
-													class="w-full text-left text-sm p-1.5 rounded-lg dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-gray-850"
-													on:click={() => {
-														pane.expand();
-													}}
-												>
-													<ChevronLeft strokeWidth="2.5" />
-												</button>
-											</div>
-										{/if}
-
-										<div class=" flex-1 text-2xl font-medium">
-											<a
-												class="hover:text-gray-500 hover:dark:text-gray-100 hover:underline flex-grow line-clamp-1"
-												href={selectedFile.id ? `/api/v1/files/${selectedFile.id}/content` : '#'}
-												target="_blank"
-											>
-												{selectedFile?.meta?.name}
-											</a>
-										</div>
-
-										<div>
-											<button
-												class="self-center w-fit text-sm py-1 px-2.5 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-lg"
-												on:click={() => {
-													updateFileContentHandler();
-												}}
-											>
-												{$i18n.t('Save')}
-											</button>
-										</div>
-									</div>
-
-									<div
-										class=" flex-1 w-full h-full max-h-full text-sm bg-transparent outline-none overflow-y-auto scrollbar-hidden"
+					{/if}
+				</div>
+			{:else if !largeScreen && selectedFileId !== null}
+				<Drawer
+					className="h-full"
+					show={selectedFileId !== null}
+					on:close={() => {
+						selectedFileId = null;
+					}}
+				>
+					<div class="flex flex-col justify-start h-full max-h-full p-2">
+						<div class=" flex flex-col w-full h-full max-h-full">
+							<div class="flex-shrink-0 mt-1 mb-2 flex items-center">
+								<div class="mr-2">
+									<button
+										class="w-full text-left text-sm p-1.5 rounded-lg dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-gray-850"
+										on:click={() => {
+											selectedFileId = null;
+										}}
 									>
-										{#key selectedFile.id}
-											<RichTextInput
-												className="input-prose-sm"
-												bind:value={selectedFile.data.content}
-												placeholder={$i18n.t('Add content here')}
-											/>
-										{/key}
-									</div>
+										<ChevronLeft strokeWidth="2.5" />
+									</button>
+								</div>
+								<div class=" flex-1 text-xl line-clamp-1">
+									{selectedFile?.meta?.name}
 								</div>
-							{:else}
-								<div></div>
-							{/if}
-						</div>
-					</Pane>
-				{:else if !largeScreen && selectedFileId !== null}
-					<Drawer
-						className="h-full"
-						show={selectedFileId !== null}
-						on:close={() => {
-							selectedFileId = null;
-						}}
-					>
-						<div class="flex flex-col justify-start h-full max-h-full p-2">
-							<div class=" flex flex-col w-full h-full max-h-full">
-								<div class="flex-shrink-0 mt-1 mb-2 flex items-center">
-									<div class="mr-2">
-										<button
-											class="w-full text-left text-sm p-1.5 rounded-lg dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-gray-850"
-											on:click={() => {
-												selectedFileId = null;
-											}}
-										>
-											<ChevronLeft strokeWidth="2.5" />
-										</button>
-									</div>
-									<div class=" flex-1 text-xl line-clamp-1">
-										{selectedFile?.meta?.name}
-									</div>
 
-									<div>
-										<button
-											class="self-center w-fit text-sm py-1 px-2.5 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-lg"
-											on:click={() => {
-												updateFileContentHandler();
-											}}
-										>
-											{$i18n.t('Save')}
-										</button>
-									</div>
+								<div>
+									<button
+										class="self-center w-fit text-sm py-1 px-2.5 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-lg"
+										on:click={() => {
+											updateFileContentHandler();
+										}}
+									>
+										{$i18n.t('Save')}
+									</button>
 								</div>
+							</div>
 
-								<div
-									class=" flex-1 w-full h-full max-h-full py-2.5 px-3.5 rounded-lg text-sm bg-transparent overflow-y-auto scrollbar-hidden"
-								>
-									{#key selectedFile.id}
-										<RichTextInput
-											className="input-prose-sm"
-											bind:value={selectedFile.data.content}
-											placeholder={$i18n.t('Add content here')}
+							<div
+								class=" flex-1 w-full h-full max-h-full py-2.5 px-3.5 rounded-lg text-sm bg-transparent overflow-y-auto scrollbar-hidden"
+							>
+								{#key selectedFile.id}
+									<RichTextInput
+										className="input-prose-sm"
+										bind:value={selectedFile.data.content}
+										placeholder={$i18n.t('Add content here')}
+										preserveBreaks={true}
+									/>
+								{/key}
+							</div>
+						</div>
+					</div>
+				</Drawer>
+			{/if}
+
+			<div
+				class="{largeScreen ? 'flex-shrink-0 w-72 max-w-72' : 'flex-1'}
+			flex
+			py-2
+			rounded-2xl
+			border
+			border-gray-50
+			h-full
+			dark:border-gray-850"
+			>
+				<div class=" flex flex-col w-full space-x-2 rounded-lg h-full">
+					<div class="w-full h-full flex flex-col">
+						<div class=" px-3">
+							<div class="flex mb-0.5">
+								<div class=" self-center ml-1 mr-3">
+									<svg
+										xmlns="http://www.w3.org/2000/svg"
+										viewBox="0 0 20 20"
+										fill="currentColor"
+										class="w-4 h-4"
+									>
+										<path
+											fill-rule="evenodd"
+											d="M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z"
+											clip-rule="evenodd"
 										/>
-									{/key}
+									</svg>
+								</div>
+								<input
+									class=" w-full text-sm pr-4 py-1 rounded-r-xl outline-none bg-transparent"
+									bind:value={query}
+									placeholder={$i18n.t('Search Collection')}
+									on:focus={() => {
+										selectedFileId = null;
+									}}
+								/>
+
+								<div>
+									<AddContentMenu
+										on:upload={(e) => {
+											if (e.detail.type === 'directory') {
+												uploadDirectoryHandler();
+											} else if (e.detail.type === 'text') {
+												showAddTextContentModal = true;
+											} else {
+												document.getElementById('files-input').click();
+											}
+										}}
+										on:sync={(e) => {
+											showSyncConfirmModal = true;
+										}}
+									/>
 								</div>
 							</div>
 						</div>
-					</Drawer>
-				{/if}
-			</PaneGroup>
+
+						{#if filteredItems.length > 0}
+							<div class=" flex overflow-y-auto h-full w-full scrollbar-hidden text-xs">
+								<Files
+									small
+									files={filteredItems}
+									{selectedFileId}
+									on:click={(e) => {
+										selectedFileId = selectedFileId === e.detail ? null : e.detail;
+									}}
+									on:delete={(e) => {
+										console.log(e.detail);
+
+										selectedFileId = null;
+										deleteFileHandler(e.detail);
+									}}
+								/>
+							</div>
+						{:else}
+							<div class="my-3 flex flex-col justify-center text-center text-gray-500 text-xs">
+								<div>
+									{$i18n.t('No content found')}
+								</div>
+							</div>
+						{/if}
+					</div>
+				</div>
+			</div>
 		</div>
 	{:else}
 		<Spinner />

+ 7 - 3
src/lib/components/workspace/Knowledge/KnowledgeBase/AddTextContentModal.svelte

@@ -20,7 +20,7 @@
 	let voiceInput = false;
 </script>
 
-<Modal size="full" className="h-full bg-white dark:bg-gray-900" bind:show>
+<Modal size="full" containerClassName="" className="h-full bg-white dark:bg-gray-900" bind:show>
 	<div class="absolute top-0 right-0 p-5">
 		<button
 			class="self-center dark:text-white"
@@ -67,7 +67,11 @@
 					</div>
 
 					<div class=" flex-1 w-full h-full">
-						<RichTextInput bind:value={content} placeholder={$i18n.t('Write something...')} />
+						<RichTextInput
+							bind:value={content}
+							placeholder={$i18n.t('Write something...')}
+							preserveBreaks={true}
+						/>
 					</div>
 				</div>
 			</div>
@@ -77,7 +81,7 @@
 			>
 				<div class="">
 					{#if voiceInput}
-						<div class=" max-w-full w-64">
+						<div class=" max-w-full w-full">
 							<VoiceRecording
 								bind:recording={voiceInput}
 								className="p-1"

+ 3 - 0
src/lib/components/workspace/Knowledge/KnowledgeBase/Files.svelte

@@ -6,6 +6,8 @@
 
 	export let selectedFileId = null;
 	export let files = [];
+
+	export let small = false;
 </script>
 
 <div class=" max-h-full flex flex-col w-full">
@@ -16,6 +18,7 @@
 				colorClassName="{selectedFileId === file.id
 					? ' bg-gray-50 dark:bg-gray-850'
 					: 'bg-transparent'} hover:bg-gray-50 dark:hover:bg-gray-850 transition"
+				{small}
 				{file}
 				name={file?.name ?? file?.meta?.name}
 				type="file"

+ 13 - 3
src/lib/components/workspace/Models/ModelEditor.svelte

@@ -15,6 +15,7 @@
 	import { getKnowledgeBases } from '$lib/apis/knowledge';
 	import AccessControl from '../common/AccessControl.svelte';
 	import { stringify } from 'postcss';
+	import { toast } from 'svelte-sonner';
 
 	const i18n = getContext('i18n');
 
@@ -68,7 +69,9 @@
 		}
 	};
 
-	let params = {};
+	let params = {
+		system: ''
+	};
 	let capabilities = {
 		vision: true,
 		usage: undefined,
@@ -101,6 +104,14 @@
 		info.id = id;
 		info.name = name;
 
+		if (id === '') {
+			toast.error('Model ID is required.');
+		}
+
+		if (name === '') {
+			toast.error('Model Name is required.');
+		}
+
 		info.access_control = accessControl;
 		info.meta.capabilities = capabilities;
 
@@ -423,12 +434,11 @@
 						</div>
 
 						<div class="flex-1">
-							<!-- <div class=" text-sm font-semibold">{$i18n.t('Model ID')}*</div> -->
 							<div>
 								<input
 									class="text-xs w-full bg-transparent text-gray-500 outline-none"
 									placeholder={$i18n.t('Model ID')}
-									value={id}
+									bind:value={id}
 									disabled={edit}
 									required
 								/>

+ 11 - 3
src/lib/i18n/locales/ar-BH/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' أو '-1' لا توجد انتهاء",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "( `sh webui.sh --api`مثال)",
@@ -90,6 +91,8 @@
 	"Authenticate": "",
 	"Auto-Copy Response to Clipboard": "النسخ التلقائي للاستجابة إلى الحافظة",
 	"Auto-playback response": "استجابة التشغيل التلقائي",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "",
 	"AUTOMATIC1111 Api Auth String": "",
 	"AUTOMATIC1111 Base URL": "AUTOMATIC1111 الرابط الرئيسي",
@@ -119,6 +122,7 @@
 	"Certificate Path": "",
 	"Change Password": "تغير الباسورد",
 	"Character": "",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "المحادثة",
 	"Chat Background Image": "",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "تضمين محرك النموذج",
 	"Embedding model set to \"{{embedding_model}}\"": "تم تعيين نموذج التضمين على \"{{embedding_model}}\"",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "تمكين مشاركة المجتمع",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "تفعيل عمليات التسجيل الجديدة",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "تمكين بحث الويب",
-	"Enable Web Search Query Generation": "",
 	"Enabled": "",
 	"Engine": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "تأكد من أن ملف CSV الخاص بك يتضمن 4 أعمدة بهذا الترتيب: Name, Email, Password, Role.",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "(e.g. {{modelTag}}) أدخل الموديل تاق",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "(e.g. 50) أدخل عدد الخطوات",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "",
 	"Enter Scheduler (e.g. Karras)": "",
 	"Enter Score": "أدخل النتيجة",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "",
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
+	"Please select a model first.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "موقف ايجابي",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "",
 	"Prompts": "مطالبات",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Ollama.com \"{{searchValue}}\" أسحب من ",
 	"Pull a model from Ollama.com": "Ollama.com سحب الموديل من ",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "",
 	"RK": "",
 	"Role": "منصب",
@@ -842,6 +848,7 @@
 	"System": "النظام",
 	"System Instructions": "",
 	"System Prompt": "محادثة النظام",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "",
@@ -984,6 +991,7 @@
 	"Web Loader Settings": "Web تحميل اعدادات",
 	"Web Search": "بحث الويب",
 	"Web Search Engine": "محرك بحث الويب",
+	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook الرابط",
 	"WebUI Settings": "WebUI اعدادات",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",

+ 11 - 3
src/lib/i18n/locales/bg-BG/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' или '-1' за неограничен срок.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(например `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "",
 	"Auto-Copy Response to Clipboard": "Аувтоматично копиране на отговор в клипборда",
 	"Auto-playback response": "Аувтоматично възпроизвеждане на Отговора",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "",
 	"AUTOMATIC1111 Api Auth String": "",
 	"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Базов URL",
@@ -119,6 +122,7 @@
 	"Certificate Path": "",
 	"Change Password": "Промяна на Парола",
 	"Character": "",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "Чат",
 	"Chat Background Image": "",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "Модел за вграждане",
 	"Embedding model set to \"{{embedding_model}}\"": "Модел за вграждане е настроен на \"{{embedding_model}}\"",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "Разрешаване на споделяне в общност",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "Вклюване на Нови Потребители",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "Разрешаване на търсене в уеб",
-	"Enable Web Search Query Generation": "",
 	"Enabled": "",
 	"Engine": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Уверете се, че вашият CSV файл включва 4 колони в следния ред: Име, Имейл, Парола, Роля.",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "Въведете таг на модел (напр. {{modelTag}})",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Въведете брой стъпки (напр. 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "",
 	"Enter Scheduler (e.g. Karras)": "",
 	"Enter Score": "Въведете оценка",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "",
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
+	"Please select a model first.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "Позитивна ативност",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "",
 	"Prompts": "Промптове",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Извади \"{{searchValue}}\" от Ollama.com",
 	"Pull a model from Ollama.com": "Издърпайте модел от Ollama.com",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "",
 	"RK": "",
 	"Role": "Роля",
@@ -838,6 +844,7 @@
 	"System": "Система",
 	"System Instructions": "",
 	"System Prompt": "Системен Промпт",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "",
@@ -980,6 +987,7 @@
 	"Web Loader Settings": "Настройки за зареждане на уеб",
 	"Web Search": "Търсене в уеб",
 	"Web Search Engine": "Уеб търсачка",
+	"Web Search Query Generation": "",
 	"Webhook URL": "Уебхук URL",
 	"WebUI Settings": "WebUI Настройки",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",

+ 11 - 3
src/lib/i18n/locales/bn-BD/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' অথবা অনির্দিষ্টকাল মেয়াদের জন্য '-1' ",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(যেমন `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "",
 	"Auto-Copy Response to Clipboard": "রেসপন্সগুলো স্বয়ংক্রিভাবে ক্লিপবোর্ডে কপি হবে",
 	"Auto-playback response": "রেসপন্স অটো-প্লেব্যাক",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "",
 	"AUTOMATIC1111 Api Auth String": "",
 	"AUTOMATIC1111 Base URL": "AUTOMATIC1111 বেজ ইউআরএল",
@@ -119,6 +122,7 @@
 	"Certificate Path": "",
 	"Change Password": "পাসওয়ার্ড পরিবর্তন করুন",
 	"Character": "",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "চ্যাট",
 	"Chat Background Image": "",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "ইমেজ ইমেবডিং মডেল ইঞ্জিন",
 	"Embedding model set to \"{{embedding_model}}\"": "ইমেজ ইমেবডিং মডেল সেট করা হয়েছে - \"{{embedding_model}}\"",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "সম্প্রদায় শেয়ারকরণ সক্ষম করুন",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "নতুন সাইনআপ চালু করুন",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "ওয়েব অনুসন্ধান সক্ষম করুন",
-	"Enable Web Search Query Generation": "",
 	"Enabled": "",
 	"Engine": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "আপনার সিএসভি ফাইলটিতে এই ক্রমে 4 টি কলাম অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন: নাম, ইমেল, পাসওয়ার্ড, ভূমিকা।.",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "মডেল ট্যাগ লিখুন (e.g. {{modelTag}})",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "ধাপের সংখ্যা দিন (যেমন: 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "",
 	"Enter Scheduler (e.g. Karras)": "",
 	"Enter Score": "স্কোর দিন",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "",
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
+	"Please select a model first.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "পজিটিভ আক্রমণ",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "",
 	"Prompts": "প্রম্পটসমূহ",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Ollama.com থেকে \"{{searchValue}}\" টানুন",
 	"Pull a model from Ollama.com": "Ollama.com থেকে একটি টেনে আনুন আনুন",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "",
 	"RK": "",
 	"Role": "পদবি",
@@ -838,6 +844,7 @@
 	"System": "সিস্টেম",
 	"System Instructions": "",
 	"System Prompt": "সিস্টেম প্রম্পট",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "",
@@ -980,6 +987,7 @@
 	"Web Loader Settings": "ওয়েব লোডার সেটিংস",
 	"Web Search": "ওয়েব অনুসন্ধান",
 	"Web Search Engine": "ওয়েব সার্চ ইঞ্জিন",
+	"Web Search Query Generation": "",
 	"Webhook URL": "ওয়েবহুক URL",
 	"WebUI Settings": "WebUI সেটিংসমূহ",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",

+ 18 - 10
src/lib/i18n/locales/ca-ES/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "-1 per a cap límit, o un nombre positiu per a un límit específic",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' o '-1' perquè no caduqui mai.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(p. ex. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(p. ex. `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "Autenticar",
 	"Auto-Copy Response to Clipboard": "Copiar la resposta automàticament al porta-retalls",
 	"Auto-playback response": "Reproduir la resposta automàticament",
+	"Autocomplete Generation": "Generació automàtica",
+	"Autocomplete Generation Input Max Length": "Entrada màxima de la generació automàtica",
 	"Automatic1111": "Automatic1111",
 	"AUTOMATIC1111 Api Auth String": "Cadena d'autenticació de l'API d'AUTOMATIC1111",
 	"AUTOMATIC1111 Base URL": "URL Base d'AUTOMATIC1111",
@@ -119,6 +122,7 @@
 	"Certificate Path": "Camí del certificat",
 	"Change Password": "Canviar la contrasenya",
 	"Character": "Personatge",
+	"Character limit for autocomplete generation input": "Límit de caràcters per a l'entrada de generació automàtica",
 	"Chart new frontiers": "Traça noves fronteres",
 	"Chat": "Xat",
 	"Chat Background Image": "Imatge de fons del xat",
@@ -167,7 +171,7 @@
 	"Completions": "Completaments",
 	"Concurrent Requests": "Peticions simultànies",
 	"Configure": "Configurar",
-	"Configure Models": "",
+	"Configure Models": "Configurar models",
 	"Confirm": "Confirmar",
 	"Confirm Password": "Confirmar la contrasenya",
 	"Confirm your action": "Confirma la teva acció",
@@ -216,7 +220,7 @@
 	"Default (SentenceTransformers)": "Per defecte (SentenceTransformers)",
 	"Default Model": "Model per defecte",
 	"Default model updated": "Model per defecte actualitzat",
-	"Default Models": "",
+	"Default Models": "Models per defecte",
 	"Default permissions": "Permisos per defecte",
 	"Default permissions updated successfully": "Permisos per defecte actualitzats correctament",
 	"Default Prompt Suggestions": "Suggeriments d'indicació per defecte",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "Motor de model d'incrustació",
 	"Embedding model set to \"{{embedding_model}}\"": "Model d'incrustació configurat a \"{{embedding_model}}\"",
 	"Enable API Key Auth": "Activar l'autenticació amb clau API",
+	"Enable autocomplete generation for chat messages": "Activar la generació automàtica per als missatges del xat",
 	"Enable Community Sharing": "Activar l'ús compartit amb la comunitat",
 	"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.": "Activar el bloqueig de memòria (mlock) per evitar que les dades del model s'intercanviïn fora de la memòria RAM. Aquesta opció bloqueja el conjunt de pàgines de treball del model a la memòria RAM, assegurant-se que no s'intercanviaran al disc. Això pot ajudar a mantenir el rendiment evitant errors de pàgina i garantint un accés ràpid a les dades.",
 	"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.": "Activar l'assignació de memòria (mmap) per carregar les dades del model. Aquesta opció permet que el sistema utilitzi l'emmagatzematge en disc com a extensió de la memòria RAM tractant els fitxers de disc com si estiguessin a la memòria RAM. Això pot millorar el rendiment del model permetent un accés més ràpid a les dades. Tanmateix, és possible que no funcioni correctament amb tots els sistemes i pot consumir una quantitat important d'espai en disc.",
 	"Enable Message Rating": "Permetre la qualificació de missatges",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "Activar el mostreig de Mirostat per controlar la perplexitat. (Per defecte: 0, 0 = Inhabilitat, 1 = Mirostat, 2 = Mirostat 2.0)",
 	"Enable New Sign Ups": "Permetre nous registres",
-	"Enable Retrieval Query Generation": "Activar la Retrieval Query Generation",
-	"Enable Tags Generation": "Activar la generació d'etiquetes",
 	"Enable Web Search": "Activar la cerca web",
-	"Enable Web Search Query Generation": "Activa la generació de consultes de cerca web",
 	"Enabled": "Habilitat",
 	"Engine": "Motor",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assegura't que els teus fitxers CSV inclouen 4 columnes en aquest ordre: Nom, Correu electrònic, Contrasenya, Rol.",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "Introdueix l'etiqueta del model (p. ex. {{modelTag}})",
 	"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 proxy URL (e.g. https://user:password@host:port)": "Entra l'URL (p. ex. https://user:password@host:port)",
 	"Enter Sampler (e.g. Euler a)": "Introdueix el mostrejador (p.ex. Euler a)",
 	"Enter Scheduler (e.g. Karras)": "Entra el programador (p.ex. Karras)",
 	"Enter Score": "Introdueix la puntuació",
@@ -385,7 +388,7 @@
 	"Failed to add file.": "No s'ha pogut afegir l'arxiu.",
 	"Failed to create API Key.": "No s'ha pogut crear la clau API.",
 	"Failed to read clipboard contents": "No s'ha pogut llegir el contingut del porta-retalls",
-	"Failed to save models configuration": "",
+	"Failed to save models configuration": "No s'ha pogut desar la configuració dels models",
 	"Failed to update settings": "No s'han pogut actualitzar les preferències",
 	"Failed to upload file.": "No s'ha pogut pujar l'arxiu.",
 	"February": "Febrer",
@@ -573,7 +576,7 @@
 	"Modelfile Content": "Contingut del Modelfile",
 	"Models": "Models",
 	"Models Access": "Accés als models",
-	"Models configuration saved successfully": "",
+	"Models configuration saved successfully": "La configuració dels models s'ha desat correctament",
 	"Mojeek Search API Key": "Clau API de Mojeek Search",
 	"more": "més",
 	"More": "Més",
@@ -593,7 +596,7 @@
 	"No knowledge found": "No s'ha trobat Coneixement",
 	"No model IDs": "No hi ha IDs de model",
 	"No models found": "No s'han trobat models",
-	"No models selected": "",
+	"No models selected": "No s'ha seleccionat cap model",
 	"No results found": "No s'han trobat resultats",
 	"No search query generated": "No s'ha generat cap consulta",
 	"No source available": "Sense font disponible",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "Si us plau, revisa els següents avisos amb cura:",
 	"Please enter a prompt": "Si us plau, entra una indicació",
 	"Please fill in all fields.": "Emplena tots els camps, si us plau.",
+	"Please select a model first.": "Si us plau, selecciona un model primer",
 	"Please select a reason": "Si us plau, selecciona una raó",
 	"Port": "Port",
 	"Positive attitude": "Actitud positiva",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "Indicació actualitzada correctament",
 	"Prompts": "Indicacions",
 	"Prompts Access": "Accés a les indicacions",
+	"Proxy URL": "URL del proxy",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Obtenir \"{{searchValue}}\" de Ollama.com",
 	"Pull a model from Ollama.com": "Obtenir un model d'Ollama.com",
 	"Query Generation Prompt": "Indicació per a generació de consulta",
@@ -704,19 +709,20 @@
 	"Remove": "Eliminar",
 	"Remove Model": "Eliminar el model",
 	"Rename": "Canviar el nom",
-	"Reorder Models": "",
+	"Reorder Models": "Reordenar els models",
 	"Repeat Last N": "Repeteix els darrers N",
 	"Request Mode": "Mode de sol·licitud",
 	"Reranking Model": "Model de reavaluació",
 	"Reranking model disabled": "Model de reavaluació desactivat",
 	"Reranking model set to \"{{reranking_model}}\"": "Model de reavaluació establert a \"{{reranking_model}}\"",
 	"Reset": "Restableix",
-	"Reset All Models": "",
+	"Reset All Models": "Restablir tots els models",
 	"Reset Upload Directory": "Restableix el directori de pujades",
 	"Reset Vector Storage/Knowledge": "Restableix el Repositori de vectors/Coneixement",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Les notifications de resposta no es poden activar perquè els permisos del lloc web han estat rebutjats. Comprova les preferències del navegador per donar l'accés necessari.",
 	"Response splitting": "Divisió de la resposta",
 	"Result": "Resultat",
+	"Retrieval Query Generation": "Generació de consultes Retrieval",
 	"Rich Text Input for Chat": "Entrada de text ric per al xat",
 	"RK": "RK",
 	"Role": "Rol",
@@ -839,6 +845,7 @@
 	"System": "Sistema",
 	"System Instructions": "Instruccions de sistema",
 	"System Prompt": "Indicació del Sistema",
+	"Tags Generation": "Generació d'etiquetes",
 	"Tags Generation Prompt": "Indicació per a la generació d'etiquetes",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "El mostreig sense cua s'utilitza per reduir l'impacte de tokens menys probables de la sortida. Un valor més alt (p. ex., 2,0) reduirà més l'impacte, mentre que un valor d'1,0 desactiva aquesta configuració. (per defecte: 1)",
 	"Tap to interrupt": "Prem per interrompre",
@@ -981,6 +988,7 @@
 	"Web Loader Settings": "Preferències del carregador web",
 	"Web Search": "Cerca la web",
 	"Web Search Engine": "Motor de cerca de la web",
+	"Web Search Query Generation": "Generació de consultes per a la cerca de la web",
 	"Webhook URL": "URL del webhook",
 	"WebUI Settings": "Preferències de WebUI",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "WebUI farà peticions a \"{{url}}/api/chat\"",

+ 11 - 3
src/lib/i18n/locales/ceb-PH/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' o '-1' para walay expiration.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(pananglitan `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "",
 	"Auto-Copy Response to Clipboard": "Awtomatikong kopya sa tubag sa clipboard",
 	"Auto-playback response": "Autoplay nga tubag",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "",
 	"AUTOMATIC1111 Api Auth String": "",
 	"AUTOMATIC1111 Base URL": "Base URL AUTOMATIC1111",
@@ -119,6 +122,7 @@
 	"Certificate Path": "",
 	"Change Password": "Usba ang password",
 	"Character": "",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "Panaghisgot",
 	"Chat Background Image": "",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "",
 	"Embedding model set to \"{{embedding_model}}\"": "",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "I-enable ang bag-ong mga rehistro",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "",
-	"Enable Web Search Query Generation": "",
 	"Enabled": "",
 	"Engine": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "Pagsulod sa template tag (e.g. {{modelTag}})",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Pagsulod sa gidaghanon sa mga lakang (e.g. 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "",
 	"Enter Scheduler (e.g. Karras)": "",
 	"Enter Score": "",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "",
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
+	"Please select a model first.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "",
 	"Prompts": "Mga aghat",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "",
 	"Pull a model from Ollama.com": "Pagkuha ug template gikan sa Ollama.com",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "",
 	"RK": "",
 	"Role": "Papel",
@@ -838,6 +844,7 @@
 	"System": "Sistema",
 	"System Instructions": "",
 	"System Prompt": "Madasig nga Sistema",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "",
@@ -980,6 +987,7 @@
 	"Web Loader Settings": "",
 	"Web Search": "",
 	"Web Search Engine": "",
+	"Web Search Query Generation": "",
 	"Webhook URL": "",
 	"WebUI Settings": "Mga Setting sa WebUI",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",

+ 94 - 86
src/lib/i18n/locales/cs-CZ/translation.json

@@ -1,58 +1,59 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' nebo '-1' pro žádné vypršení platnosti.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(např. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(např. `sh webui.sh --api`)",
 	"(latest)": "Nejnovější",
 	"{{ models }}": "{{ models }}",
 	"{{user}}'s Chats": "{{user}}'s konverzace",
-	"{{webUIName}} Backend Required": "Požadováno {{webUIName}} Backend",
-	"*Prompt node ID(s) are required for image generation": "*ID (ID) uzlu pro generování obrázků jsou vyžadována.",
+	"{{webUIName}} Backend Required": "Požadován {{webUIName}} Backend",
+	"*Prompt node ID(s) are required for image generation": "*Jsou vyžadovány IDs pro prompt node pro generování obrázků",
 	"A new version (v{{LATEST_VERSION}}) is now available.": "Nová verze (v{{LATEST_VERSION}}) je nyní k dispozici.",
 	"A task model is used when performing tasks such as generating titles for chats and web search queries": "Model úloh se používá při provádění úloh, jako je generování názvů pro chaty a vyhledávací dotazy na webu.",
 	"a user": "uživatel",
 	"About": "O programu",
-	"Access": "",
+	"Access": "Přístup",
 	"Access Control": "",
-	"Accessible to all users": "",
+	"Accessible to all users": "Přístupné pro všecny uživatele",
 	"Account": "Účet",
 	"Account Activation Pending": "Čeká na aktivaci účtu",
 	"Accurate information": "Přesné informace",
 	"Actions": "Akce",
-	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "",
+	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Aktivujte tenhle příkaz napsáním \"/{{COMMAND}}\" do chat inputu",
 	"Active Users": "Aktivní uživatelé",
 	"Add": "Přidat",
-	"Add a model ID": "",
+	"Add a model ID": "Přidat ID modelu",
 	"Add a short description about what this model does": "Přidejte krátký popis toho, co tento model dělá.",
 	"Add a tag": "Přidat štítek",
-	"Add Arena Model": "Přidat model Arena",
-	"Add Connection": "",
+	"Add Arena Model": "Přidat Arena model",
+	"Add Connection": "Přidat připojení",
 	"Add Content": "Přidat obsah",
 	"Add content here": "Přidat obsah zde",
-	"Add custom prompt": "Přidání vlastního výzvy",
+	"Add custom prompt": "Přidání vlastního promptu",
 	"Add Files": "Přidat soubory",
-	"Add Group": "",
-	"Add Memory": "Přidání paměti",
+	"Add Group": "Přidat skupinu",
+	"Add Memory": "Přidat paměť",
 	"Add Model": "Přidat model",
 	"Add Tag": "Přidat štítek",
-	"Add Tags": "Přidat značky",
+	"Add Tags": "Přidat štítky",
 	"Add text content": "Přidejte textový obsah",
 	"Add User": "Přidat uživatele",
-	"Add User Group": "",
+	"Add User Group": "Přidatg skupinu uživatelů",
 	"Adjusting these settings will apply changes universally to all users.": "Úprava těchto nastavení se projeví univerzálně u všech uživatelů.",
-	"admin": "Správce",
-	"Admin": "Ahoj! Jak ti mohu pomoci?",
-	"Admin Panel": "Administrační panel",
-	"Admin Settings": "Nastavení administrátora",
+	"admin": "amin",
+	"Admin": "Admin",
+	"Admin Panel": "Adminis panel",
+	"Admin Settings": "Nastavení admina",
 	"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Administrátoři mají přístup ke všem nástrojům kdykoliv; uživatelé potřebují mít nástroje přiřazené podle modelu ve workspace.",
 	"Advanced Parameters": "Pokročilé parametry",
 	"Advanced Params": "Pokročilé parametry",
 	"All chats": "Všechny chaty",
 	"All Documents": "Všechny dokumenty",
-	"All models deleted successfully": "",
-	"Allow Chat Delete": "",
+	"All models deleted successfully": "Všechny modely úspěšně odstráněny",
+	"Allow Chat Delete": "Povolit odstranění chatu",
 	"Allow Chat Deletion": "Povolit odstranění chatu",
-	"Allow Chat Edit": "",
-	"Allow File Upload": "",
+	"Allow Chat Edit": "Povolit úpravu chatu",
+	"Allow File Upload": "Povolit nahrávat soubory",
 	"Allow non-local voices": "Povolit ne-místní hlasy",
 	"Allow Temporary Chat": "Povolit dočasný chat",
 	"Allow User Location": "Povolit uživatelskou polohu",
@@ -62,7 +63,7 @@
 	"Amazing": "",
 	"an assistant": "asistent",
 	"and": "a",
-	"and {{COUNT}} more": "a {{COUNT}} dalších",
+	"and {{COUNT}} more": "a {{COUNT}} další/ch",
 	"and create a new shared link.": "a vytvořit nový sdílený odkaz.",
 	"API Base URL": "Základní URL adresa API",
 	"API Key": "Klíč API",
@@ -77,8 +78,8 @@
 	"Archived Chats": "Archivované chaty",
 	"archived-chat-export": "",
 	"Are you sure you want to unarchive all archived chats?": "",
-	"Are you sure?": "Ano, jsem si jistý.",
-	"Arena Models": "Modely Arena",
+	"Are you sure?": "Jste si jistý?",
+	"Arena Models": "Arena modely",
 	"Artifacts": "Artefakty",
 	"Ask a question": "Zeptejte se na otázku",
 	"Assistant": "Ano, jak vám mohu pomoci?",
@@ -87,9 +88,11 @@
 	"Attribute for Username": "",
 	"Audio": "Zvuk",
 	"August": "Srpen",
-	"Authenticate": "",
+	"Authenticate": "Autentikace",
 	"Auto-Copy Response to Clipboard": "Automatické kopírování odpovědi do schránky",
 	"Auto-playback response": "Automatická odpověď při přehrávání",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "Automatic1111",
 	"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api Auth String",
 	"AUTOMATIC1111 Base URL": "Výchozí URL pro AUTOMATIC1111",
@@ -102,10 +105,10 @@
 	"Back": "Zpět",
 	"Bad Response": "Špatná odezva",
 	"Banners": "Bannery",
-	"Base Model (From)": "Základní model (Z)",
-	"Batch Size (num_batch)": "Velikost dávky (num_batch)",
+	"Base Model (From)": "Základní model (z)",
+	"Batch Size (num_batch)": "Batch size (num_batch)",
 	"before": "před",
-	"Being lazy": "Být líný",
+	"Being lazy": "",
 	"Bing Search V7 Endpoint": "",
 	"Bing Search V7 Subscription Key": "",
 	"Brave Search API Key": "Klíč API pro Brave Search",
@@ -114,11 +117,12 @@
 	"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.",
 	"Camera": "Kamera",
-	"Cancel": "Zrušit.",
+	"Cancel": "Zrušit",
 	"Capabilities": "Schopnosti",
 	"Certificate Path": "",
-	"Change Password": "Změna hesla",
+	"Change Password": "Změnit heslo",
 	"Character": "Znak",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "Chat",
 	"Chat Background Image": "Obrázek pozadí chatu",
@@ -133,9 +137,9 @@
 	"Check for updates": "Zkontrolovat aktualizace",
 	"Checking for updates...": "Kontrola aktualizací...",
 	"Choose a model before saving...": "Vyberte model před uložením...",
-	"Chunk Overlap": "Překrytí bloků",
-	"Chunk Params": "Parametry chunků",
-	"Chunk Size": "Velikost bloku",
+	"Chunk Overlap": "",
+	"Chunk Params": "",
+	"Chunk Size": "",
 	"Ciphers": "",
 	"Citation": "Odkaz",
 	"Clear memory": "Vymazat paměť",
@@ -156,8 +160,8 @@
 	"Close": "Zavřít",
 	"Code execution": "Provádění kódu",
 	"Code formatted successfully": "Kód byl úspěšně naformátován.",
-	"Collection": "Sbírka",
-	"Color": "",
+	"Collection": "",
+	"Color": "Barva",
 	"ComfyUI": "ComfyUI.",
 	"ComfyUI Base URL": "Základní URL ComfyUI",
 	"ComfyUI Base URL is required.": "Je vyžadována základní URL pro ComfyUI.",
@@ -166,8 +170,8 @@
 	"Command": "Příkaz",
 	"Completions": "Doplnění",
 	"Concurrent Requests": "Současné požadavky",
-	"Configure": "",
-	"Configure Models": "",
+	"Configure": "Konfigurovat",
+	"Configure Models": "Konfigurovat modely",
 	"Confirm": "Potvrdit",
 	"Confirm Password": "Potvrzení hesla",
 	"Confirm your action": "Potvrďte svoji akci",
@@ -192,13 +196,13 @@
 	"Copy Link": "Kopírovat odkaz",
 	"Copy to clipboard": "Kopírovat do schránky",
 	"Copying to clipboard was successful!": "Kopírování do schránky bylo úspěšné!",
-	"Create": "",
-	"Create a knowledge base": "",
+	"Create": "Vytvořit",
+	"Create a knowledge base": "Vytvořit knowledge base",
 	"Create a model": "Vytvořte model",
 	"Create Account": "Vytvořit účet",
-	"Create Admin Account": "",
-	"Create Group": "",
-	"Create Knowledge": "Vytvořit znalosti",
+	"Create Admin Account": "Vytvořit admin účet",
+	"Create Group": "Vytvořit skupinu",
+	"Create Knowledge": "Vytvořit knowledge",
 	"Create new key": "Vytvořit nový klíč",
 	"Create new secret key": "Vytvořte nový tajný klíč",
 	"Created at": "Vytvořeno dne",
@@ -216,9 +220,9 @@
 	"Default (SentenceTransformers)": "Výchozí (SentenceTransformers)",
 	"Default Model": "Výchozí model",
 	"Default model updated": "Výchozí model aktualizován.",
-	"Default Models": "",
-	"Default permissions": "",
-	"Default permissions updated successfully": "",
+	"Default Models": "Výchozí modely",
+	"Default permissions": "Výchozí povolení",
+	"Default permissions updated successfully": "Výchozí povolení úspěšne aktualizovány",
 	"Default Prompt Suggestions": "Výchozí návrhy promptů",
 	"Default to 389 or 636 if TLS is enabled": "",
 	"Default to ALL": "",
@@ -232,7 +236,7 @@
 	"Delete chat?": "Smazat konverzaci?",
 	"Delete folder?": "Smazat složku?",
 	"Delete function?": "Funkce pro odstranění?",
-	"Delete prompt?": "Smazat výzvu?",
+	"Delete prompt?": "Smazat prompt?",
 	"delete this link": "smazat tento odkaz",
 	"Delete tool?": "Odstranit nástroj?",
 	"Delete User": "Smazat uživatele",
@@ -245,11 +249,11 @@
 	"Disabled": "Zakázáno",
 	"Discover a function": "Objevit funkci",
 	"Discover a model": "Objevte model",
-	"Discover a prompt": "Objevte výzvu",
+	"Discover a prompt": "Objevte prompt",
 	"Discover a tool": "Objevte nástroj",
 	"Discover wonders": "",
 	"Discover, download, and explore custom functions": "Objevujte, stahujte a zkoumejte vlastní funkce",
-	"Discover, download, and explore custom prompts": "Objevte, stáhněte a prozkoumejte vlastní výzvy.",
+	"Discover, download, and explore custom prompts": "Objevte, stáhněte a prozkoumejte vlastní prompty.",
 	"Discover, download, and explore custom tools": "Objevujte, stahujte a prozkoumávejte vlastní nástroje",
 	"Discover, download, and explore model presets": "Objevte, stáhněte a prozkoumejte přednastavení modelů",
 	"Dismissible": "Odstranitelné",
@@ -292,21 +296,19 @@
 	"ElevenLabs": "ElevenLabs",
 	"Email": "E-mail",
 	"Embark on adventures": "",
-	"Embedding Batch Size": "Velikost dávky pro vkládání",
+	"Embedding Batch Size": "",
 	"Embedding Model": "Vkládací model (Embedding Model)",
-	"Embedding Model Engine": "Model zabudovaný motor",
+	"Embedding Model Engine": "",
 	"Embedding model set to \"{{embedding_model}}\"": "Model vkládání nastaven na \"{{embedding_model}}\"",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "Povolit sdílení komunity",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "Povolit hodnocení zpráv",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "Povolit nové registrace",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "Povolit webové vyhledávání",
-	"Enable Web Search Query Generation": "Povolit generování dotazů pro webové vyhledávání",
 	"Enabled": "Povoleno",
 	"Engine": "Engine",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Ujistěte se, že váš CSV soubor obsahuje 4 sloupce v tomto pořadí: Name, Email, Password, Role.",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "Zadejte označení modelu (např. {{modelTag}})",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Zadejte počet kroků (např. 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "Zadejte vzorkovač (např. Euler a)",
 	"Enter Scheduler (e.g. Karras)": "Zadejte plánovač (např. Karras)",
 	"Enter Score": "Zadejte skóre",
@@ -347,7 +350,7 @@
 	"Enter server label": "",
 	"Enter server port": "",
 	"Enter stop sequence": "Zadejte ukončovací sekvenci",
-	"Enter system prompt": "Vložte systémovou výzvu",
+	"Enter system prompt": "Vložte systémový prompt",
 	"Enter Tavily API Key": "Zadejte API klíč Tavily",
 	"Enter Tika Server URL": "Zadejte URL serveru Tika",
 	"Enter Top K": "Zadejte horní K",
@@ -378,7 +381,7 @@
 	"Export Functions": "Exportovat funkce",
 	"Export Models": "Export modelů",
 	"Export Presets": "",
-	"Export Prompts": "Exportovat výzvy",
+	"Export Prompts": "Exportovat prompty",
 	"Export to CSV": "",
 	"Export Tools": "Exportní nástroje",
 	"External Models": "Externí modely",
@@ -529,7 +532,7 @@
 	"Manage Ollama": "",
 	"Manage Ollama API Connections": "",
 	"Manage OpenAI API Connections": "",
-	"Manage Pipelines": "Správa potrubí",
+	"Manage Pipelines": "Správa pipelines",
 	"March": "Březen",
 	"Max Tokens (num_predict)": "Maximální počet tokenů (num_predict)",
 	"Max Upload Count": "Maximální počet nahrání",
@@ -659,16 +662,17 @@
 	"Pin": "Kolík",
 	"Pinned": "Připnuto",
 	"Pioneer insights": "",
-	"Pipeline deleted successfully": "Potrubí bylo úspěšně odstraněno.",
+	"Pipeline deleted successfully": "Pipeline byla úspěšně odstraněna",
 	"Pipeline downloaded successfully": "Kanál byl úspěšně stažen",
-	"Pipelines": "Potrubí (Pipelines)",
+	"Pipelines": "",
 	"Pipelines Not Detected": "Přenosové kanály nebyly detekovány",
-	"Pipelines Valves": "Potrubní ventily",
+	"Pipelines Valves": "",
 	"Plain text (.txt)": "Čistý text (.txt)",
-	"Playground": "Hřiště",
+	"Playground": "",
 	"Please carefully review the following warnings:": "Prosím, pečlivě si přečtěte následující upozornění:",
 	"Please enter a prompt": "Prosím, zadejte zadání.",
 	"Please fill in all fields.": "Prosím, vyplňte všechna pole.",
+	"Please select a model first.": "",
 	"Please select a reason": "Prosím vyberte důvod",
 	"Port": "",
 	"Positive attitude": "Pozitivní přístup",
@@ -677,13 +681,14 @@
 	"Previous 30 days": "Předchozích 30 dnů",
 	"Previous 7 days": "Předchozích 7 dní",
 	"Profile Image": "Profilový obrázek",
-	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Výzva (např. Řekni mi zábavný fakt o Římské říši)",
-	"Prompt Content": "Obsah výzvy",
+	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (např. Řekni mi zábavný fakt o Římské říši)",
+	"Prompt Content": "Obsah promptu",
 	"Prompt created successfully": "",
 	"Prompt suggestions": "Návrhy výzev",
 	"Prompt updated successfully": "",
-	"Prompts": "Výzvy",
+	"Prompts": "Prompty",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Stáhněte \"{{searchValue}}\" z Ollama.com",
 	"Pull a model from Ollama.com": "Stáhněte model z Ollama.com",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Oznámení o odpovědích nelze aktivovat, protože oprávnění webu byla zamítnuta. Navštivte nastavení svého prohlížeče a udělte potřebný přístup.",
 	"Response splitting": "Rozdělení odpovědi",
 	"Result": "Výsledek",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "Vstup pro chat ve formátu Rich Text",
 	"RK": "RK",
 	"Role": "Funkci",
@@ -761,14 +767,14 @@
 	"See what's new": "Podívejte se, co je nového",
 	"Seed": "Semínko",
 	"Select a base model": "Vyberte základní model",
-	"Select a engine": "Vyberte motor",
+	"Select a engine": "Vyberte engine",
 	"Select a function": "Vyberte funkci",
 	"Select a group": "",
 	"Select a model": "Vyberte model",
-	"Select a pipeline": "Vyberte si potrubí (pipeline)",
+	"Select a pipeline": "Vyberte pipeline",
 	"Select a pipeline url": "Vyberte URL adresu kanálu",
 	"Select a tool": "Vyberte nástroj",
-	"Select Engine": "Vyberte motor",
+	"Select Engine": "Vyberte engine",
 	"Select Knowledge": "Vybrat znalosti",
 	"Select model": "Vyberte model",
 	"Select only one model to call": "Vyberte pouze jeden model, který chcete použít",
@@ -838,20 +844,21 @@
 	"Support this plugin:": "Podpořte tento plugin:",
 	"Sync directory": "Synchronizovat adresář",
 	"System": "System",
-	"System Instructions": "Pokyny systému",
-	"System Prompt": "Systémová výzva",
-	"Tags Generation Prompt": "Výzva pro generování značek",
+	"System Instructions": "",
+	"System Prompt": "Systémový prompt",
+	"Tags Generation": "",
+	"Tags Generation Prompt": "Prompt pro generování značek",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "Klepněte pro přerušení",
 	"Tavily API Key": "Klíč API pro Tavily",
 	"Tell us more:": "Řekněte nám více.",
-	"Temperature": "Teplota",
+	"Temperature": "",
 	"Template": "Šablona",
 	"Temporary Chat": "Dočasný chat",
 	"Text Splitter": "Rozdělovač textu",
 	"Text-to-Speech Engine": "Stroj pro převod textu na řeč",
 	"Tfs Z": "Tfs Z",
-	"Thanks for your feedback!": "Děkuji za vaši zpětnou vazbu!",
+	"Thanks for your feedback!": "Děkujeme za vaši zpětnou vazbu!",
 	"The Application Account DN you bind with for search": "",
 	"The base to search for users": "",
 	"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.  (Default: 512)": "",
@@ -872,7 +879,7 @@
 	"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.  (Default: 128)": "",
 	"This option will delete all existing files in the collection and replace them with newly uploaded files.": "Tato volba odstraní všechny existující soubory ve sbírce a nahradí je nově nahranými soubory.",
 	"This response was generated by \"{{model}}\"": "Tato odpověď byla vygenerována pomocí \"{{model}}\"",
-	"This will delete": "Tím se odstraní",
+	"This will delete": "Tohle odstraní",
 	"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "Tímto dojde k odstranění <strong>{{NAME}}</strong> a <strong>všech jeho obsahů</strong>.",
 	"This will delete all models including custom models": "",
 	"This will delete all models including custom models and cannot be undone.": "",
@@ -886,16 +893,16 @@
 	"Title (e.g. Tell me a fun fact)": "Název (např. Řekni mi zajímavost)",
 	"Title Auto-Generation": "Automatické generování názvu",
 	"Title cannot be an empty string.": "Název nemůže být prázdným řetězcem.",
-	"Title Generation Prompt": "Generování názvu výzvy",
+	"Title Generation Prompt": "Generování názvu promptu",
 	"TLS": "",
 	"To access the available model names for downloading,": "Pro získání dostupných názvů modelů ke stažení,",
 	"To access the GGUF models available for downloading,": "Pro přístup k modelům GGUF dostupným pro stažení,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Pro přístup k WebUI se prosím obraťte na administrátora. Administrátoři mohou spravovat stavy uživatelů z Admin Panelu.",
-	"To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Chcete-li zde připojit znalostní databázi, nejprve ji přidejte do pracovního prostoru \"Knowledge\".",
+	"To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Chcete-li zde připojit znalostní databázi, nejprve ji přidejte do workspace \"Knowledge\".",
 	"To protect your privacy, only ratings, model IDs, tags, and metadata are shared from your feedback—your chat logs remain private and are not included.": "Aby byla chráněna vaše soukromí, z vaší zpětné vazby jsou sdílena pouze hodnocení, ID modelů, značky a metadata – vaše chatové záznamy zůstávají soukromé a nejsou zahrnuty.",
 	"To select actions here, add them to the \"Functions\" workspace first.": "Chcete-li zde vybrat akce, nejprve je přidejte do pracovní plochy \"Functions\".",
-	"To select filters here, add them to the \"Functions\" workspace first.": "Chcete-li zde vybrat filtry, nejprve je přidejte do pracovního prostoru „Functions“.",
-	"To select toolkits here, add them to the \"Tools\" workspace first.": "Chcete-li zde vybrat nástroje, přidejte je nejprve do pracovního prostoru \"Tools\".",
+	"To select filters here, add them to the \"Functions\" workspace first.": "Chcete-li zde vybrat filtry, nejprve je přidejte do workspace „Functions“.",
+	"To select toolkits here, add them to the \"Tools\" workspace first.": "Chcete-li zde vybrat nástroje, přidejte je nejprve do workspace \"Tools\".",
 	"Toast notifications for new updates": "Oznámení ve formě toastů pro nové aktualizace",
 	"Today": "Dnes",
 	"Toggle settings": "Přepnout nastavení",
@@ -906,7 +913,7 @@
 	"Tool created successfully": "Nástroj byl úspěšně vytvořen.",
 	"Tool deleted successfully": "Nástroj byl úspěšně smazán.",
 	"Tool Description": "",
-	"Tool ID": "",
+	"Tool ID": "ID nástroje",
 	"Tool imported successfully": "Nástroj byl úspěšně importován",
 	"Tool Name": "",
 	"Tool updated successfully": "Nástroj byl úspěšně aktualizován.",
@@ -926,7 +933,7 @@
 	"Type Hugging Face Resolve (Download) URL": "Zadejte URL pro úspěšné stažení z Hugging Face.",
 	"Uh-oh! There was an issue connecting to {{provider}}.": "Jejda! Došlo k problému s připojením k poskytovateli {{provider}}.",
 	"UI": "UI",
-	"Unarchive All": "",
+	"Unarchive All": "Odarchivovat všechny",
 	"Unarchive All Archived Chats": "",
 	"Unarchive Chat": "",
 	"Unlock mysteries": "",
@@ -945,7 +952,7 @@
 	"Upload directory": "Nahrát adresář",
 	"Upload files": "Nahrát soubory",
 	"Upload Files": "Nahrát soubory",
-	"Upload Pipeline": "Nahrát potrubí",
+	"Upload Pipeline": "Nahrát pipeline",
 	"Upload Progress": "Průběh nahrávání",
 	"URL": "",
 	"URL Mode": "Režim URL",
@@ -958,7 +965,7 @@
 	"user": "uživatel",
 	"User": "Uživatel",
 	"User location successfully retrieved.": "Umístění uživatele bylo úspěšně získáno.",
-	"Username": "",
+	"Username": "Uživatelské jméno",
 	"Users": "Uživatelé",
 	"Using the default arena model with all models. Click the plus button to add custom models.": "Použití výchozího modelu arény se všemi modely. Kliknutím na tlačítko plus přidejte vlastní modely.",
 	"Utilize": "Využít",
@@ -970,7 +977,7 @@
 	"variable to have them replaced with clipboard content.": "proměnnou, aby byl jejich obsah nahrazen obsahem schránky.",
 	"Version": "Verze",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Verze {{selectedVersion}} z {{totalVersions}}",
-	"Visibility": "",
+	"Visibility": "Viditelnost",
 	"Voice": "Hlas",
 	"Voice Input": "Hlasový vstup",
 	"Warning": "Varování",
@@ -982,6 +989,7 @@
 	"Web Loader Settings": "Nastavení Web Loaderu",
 	"Web Search": "Vyhledávání na webu",
 	"Web Search Engine": "Webový vyhledávač",
+	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "Nastavení WebUI",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",
@@ -990,17 +998,17 @@
 	"What are you working on?": "",
 	"What’s New in": "Co je nového v",
 	"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
-	"wherever you are": "",
+	"wherever you are": "kdekoliv jste",
 	"Whisper (Local)": "Whisper (Lokálně)",
-	"Why?": "",
+	"Why?": "Proč?",
 	"Widescreen Mode": "Režim širokoúhlého zobrazení",
 	"Won": "Vyhrál",
 	"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
-	"Workspace": "Pracovní prostor",
+	"Workspace": "",
 	"Workspace Permissions": "",
 	"Write a prompt suggestion (e.g. Who are you?)": "Navrhněte dotaz (např. Kdo jsi?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Napište shrnutí na 50 slov, které shrnuje [téma nebo klíčové slovo].",
-	"Write something...": "Napiš něco...",
+	"Write something...": "Napište něco...",
 	"Write your model template content here": "",
 	"Yesterday": "Včera",
 	"You": "Vy",
@@ -1015,5 +1023,5 @@
 	"Your account status is currently pending activation.": "Stav vašeho účtu je nyní čekající na aktivaci.",
 	"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "Váš celý příspěvek půjde přímo vývojáři pluginu; Open WebUI si nebere žádné procento. Vybraná platforma pro financování však může mít vlastní poplatky.",
 	"Youtube": "YouTube",
-	"Youtube Loader Settings": "Nastavení Stahovače YouTube"
+	"Youtube Loader Settings": "Nastavení YouTube loaderu"
 }

+ 11 - 3
src/lib/i18n/locales/da-DK/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' eller '-1' for ingen udløb",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(f.eks. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(f.eks. `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "",
 	"Auto-Copy Response to Clipboard": "Automatisk kopiering af svar til udklipsholder",
 	"Auto-playback response": "Automatisk afspil svar",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "Automatic1111",
 	"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api Auth String",
 	"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Base URL",
@@ -119,6 +122,7 @@
 	"Certificate Path": "",
 	"Change Password": "Skift password",
 	"Character": "",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "Chat",
 	"Chat Background Image": "Chat baggrundsbillede",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "Embedding Model engine",
 	"Embedding model set to \"{{embedding_model}}\"": "Embedding model sat til \"{{embedding_model}}\"",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "Aktiver deling til Community",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "Aktiver rating af besked",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "Aktiver nye signups",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "Aktiver websøgning",
-	"Enable Web Search Query Generation": "Aktiver query generation med websøgning",
 	"Enabled": "Aktiveret",
 	"Engine": "engine",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Sørg for at din CSV-fil indeholder 4 kolonner in denne rækkefølge: Name, Email, Password, Role.",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "Indtast modelmærke (f.eks. {{modelTag}})",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Indtast antal trin (f.eks. 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "Indtast sampler (f.eks. Euler a)",
 	"Enter Scheduler (e.g. Karras)": "Indtast scheduler (f.eks. Karras)",
 	"Enter Score": "Indtast score",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "Gennemgå omhyggeligt følgende advarsler:",
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "Udfyld alle felter.",
+	"Please select a model first.": "",
 	"Please select a reason": "Vælg en årsag",
 	"Port": "",
 	"Positive attitude": "Positiv holdning",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "",
 	"Prompts": "Prompts",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Hent \"{{searchValue}}\" fra Ollama.com",
 	"Pull a model from Ollama.com": "Hent en model fra Ollama.com",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Svarnotifikationer kan ikke aktiveres, da webstedets tilladelser er blevet nægtet. Besøg dine browserindstillinger for at give den nødvendige adgang.",
 	"Response splitting": "Svaropdeling",
 	"Result": "",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "",
 	"RK": "",
 	"Role": "Rolle",
@@ -838,6 +844,7 @@
 	"System": "System",
 	"System Instructions": "",
 	"System Prompt": "Systemprompt",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "Tryk for at afbryde",
@@ -980,6 +987,7 @@
 	"Web Loader Settings": "Web Loader-indstillinger",
 	"Web Search": "Websøgning",
 	"Web Search Engine": "Websøgemaskine",
+	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook-URL",
 	"WebUI Settings": "WebUI-indstillinger",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",

+ 11 - 3
src/lib/i18n/locales/de-DE/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' oder '-1' für keine Ablaufzeit.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(z. B. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(z. B. `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "Authentifizieren",
 	"Auto-Copy Response to Clipboard": "Antwort automatisch in die Zwischenablage kopieren",
 	"Auto-playback response": "Antwort automatisch abspielen",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "Automatic1111",
 	"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111-API-Authentifizierungszeichenfolge",
 	"AUTOMATIC1111 Base URL": "AUTOMATIC1111-Basis-URL",
@@ -119,6 +122,7 @@
 	"Certificate Path": "Zertifikatpfad",
 	"Change Password": "Passwort ändern",
 	"Character": "Zeichen",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "Neue Wege beschreiten",
 	"Chat": "Gespräch",
 	"Chat Background Image": "Hintergrundbild des Unterhaltungsfensters",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "Embedding-Modell-Engine",
 	"Embedding model set to \"{{embedding_model}}\"": "Embedding-Modell auf \"{{embedding_model}}\" gesetzt",
 	"Enable API Key Auth": "API-Schlüssel-Authentifizierung aktivieren",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "Community-Freigabe aktivieren",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Aktiviere Memory Locking (mlock), um zu verhindern, dass Modelldaten aus dem RAM ausgelagert werden. Diese Option sperrt die Arbeitsseiten des Modells im RAM, um sicherzustellen, dass sie nicht auf die Festplatte ausgelagert werden. Dies kann die Leistung verbessern, indem Page Faults vermieden und ein schneller Datenzugriff sichergestellt werden.",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "Aktiviere Memory Mapping (mmap), um Modelldaten zu laden. Diese Option ermöglicht es dem System, den Festplattenspeicher als Erweiterung des RAM zu verwenden, indem Festplattendateien so behandelt werden, als ob sie im RAM wären. Dies kann die Modellleistung verbessern, indem ein schnellerer Datenzugriff ermöglicht wird. Es kann jedoch nicht auf allen Systemen korrekt funktionieren und einen erheblichen Teil des Festplattenspeichers beanspruchen.",
 	"Enable Message Rating": "Nachrichtenbewertung aktivieren",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "Mirostat Sampling zur Steuerung der Perplexität aktivieren. (Standard: 0, 0 = Deaktiviert, 1 = Mirostat, 2 = Mirostat 2.0)",
 	"Enable New Sign Ups": "Registrierung erlauben",
-	"Enable Retrieval Query Generation": "Abfragegenerierung aktivieren",
-	"Enable Tags Generation": "Tag-Generierung aktivieren",
 	"Enable Web Search": "Websuche aktivieren",
-	"Enable Web Search Query Generation": "Websuchanfragen-Generierung aktivieren",
 	"Enabled": "Aktiviert",
 	"Engine": "Engine",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Stellen Sie sicher, dass Ihre CSV-Datei 4 Spalten in dieser Reihenfolge enthält: Name, E-Mail, Passwort, Rolle.",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "Geben Sie den Model-Tag ein",
 	"Enter Mojeek Search API Key": "Geben Sie den Mojeek Search API-Schlüssel ein",
 	"Enter Number of Steps (e.g. 50)": "Geben Sie die Anzahl an Schritten ein (z. B. 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "Geben Sie den Sampler ein (z. B. Euler a)",
 	"Enter Scheduler (e.g. Karras)": "Geben Sie den Scheduler ein (z. B. Karras)",
 	"Enter Score": "Punktzahl eingeben",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "Bitte überprüfen Sie die folgenden Warnungen sorgfältig:",
 	"Please enter a prompt": "Bitte geben Sie einen Prompt ein",
 	"Please fill in all fields.": "Bitte füllen Sie alle Felder aus.",
+	"Please select a model first.": "",
 	"Please select a reason": "Bitte wählen Sie einen Grund aus",
 	"Port": "Port",
 	"Positive attitude": "Positive Einstellung",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "Prompt erfolgreich aktualisiert",
 	"Prompts": "Prompts",
 	"Prompts Access": "Prompt-Zugriff",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "\"{{searchValue}}\" von Ollama.com beziehen",
 	"Pull a model from Ollama.com": "Modell von Ollama.com beziehen",
 	"Query Generation Prompt": "Abfragegenerierungsprompt",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Benachrichtigungen können nicht aktiviert werden, da die Website-Berechtigungen abgelehnt wurden. Bitte besuchen Sie Ihre Browser-Einstellungen, um den erforderlichen Zugriff zu gewähren.",
 	"Response splitting": "Antwortaufteilung",
 	"Result": "Ergebnis",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "Rich-Text-Eingabe für Unterhaltungen",
 	"RK": "RK",
 	"Role": "Rolle",
@@ -838,6 +844,7 @@
 	"System": "System",
 	"System Instructions": "Systemanweisungen",
 	"System Prompt": "System-Prompt",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "Prompt für Tag-Generierung",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "Tail-Free Sampling wird verwendet, um den Einfluss weniger wahrscheinlicher Tokens auf die Ausgabe zu reduzieren. Ein höherer Wert (z.B. 2.0) reduziert den Einfluss stärker, während ein Wert von 1.0 diese Einstellung deaktiviert. (Standard: 1)",
 	"Tap to interrupt": "Zum Unterbrechen tippen",
@@ -980,6 +987,7 @@
 	"Web Loader Settings": "Web Loader Einstellungen",
 	"Web Search": "Websuche",
 	"Web Search Engine": "Suchmaschine",
+	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "WebUI-Einstellungen",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "WebUI wird Anfragen an \"{{url}}/api/chat\" senden",

+ 11 - 3
src/lib/i18n/locales/dg-DG/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' or '-1' for no expire. Much permanent, very wow.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(such e.g. `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "",
 	"Auto-Copy Response to Clipboard": "Copy Bark Auto Bark",
 	"Auto-playback response": "Auto-playback response",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "",
 	"AUTOMATIC1111 Api Auth String": "",
 	"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Base URL",
@@ -119,6 +122,7 @@
 	"Certificate Path": "",
 	"Change Password": "Change Password",
 	"Character": "",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "Chat",
 	"Chat Background Image": "",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "",
 	"Embedding model set to \"{{embedding_model}}\"": "",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "Enable New Bark Ups",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "",
-	"Enable Web Search Query Generation": "",
 	"Enabled": "",
 	"Engine": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "Enter model doge tag (e.g. {{modelTag}})",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Enter Number of Steps (e.g. 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "",
 	"Enter Scheduler (e.g. Karras)": "",
 	"Enter Score": "",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "",
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
+	"Please select a model first.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "",
 	"Prompts": "Promptos",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "",
 	"Pull a model from Ollama.com": "Pull a wowdel from Ollama.com",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "",
 	"RK": "",
 	"Role": "Role",
@@ -840,6 +846,7 @@
 	"System": "System very system",
 	"System Instructions": "",
 	"System Prompt": "System Prompt much prompt",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "",
@@ -982,6 +989,7 @@
 	"Web Loader Settings": "",
 	"Web Search": "",
 	"Web Search Engine": "",
+	"Web Search Query Generation": "",
 	"Webhook URL": "",
 	"WebUI Settings": "WebUI Settings much settings",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",

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

@@ -0,0 +1,1025 @@
+{
+	"-1 for no limit, or a positive integer for a specific limit": "",
+	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "",
+	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(π.χ. `sh webui.sh --api --api-auth username_password`)",
+	"(e.g. `sh webui.sh --api`)": "(π.χ. `sh webui.sh --api`)",
+	"(latest)": "(τελευταίο)",
+	"{{ models }}": "{{ models }}",
+	"{{user}}'s Chats": "Συνομιλίες του {{user}}",
+	"{{webUIName}} Backend Required": "{{webUIName}} Απαιτείται Backend",
+	"*Prompt node ID(s) are required for image generation": "*Τα αναγνωριστικά κόμβου Prompt απαιτούνται για τη δημιουργία εικόνων",
+	"A new version (v{{LATEST_VERSION}}) is now available.": "Μια νέα έκδοση (v{{LATEST_VERSION}}) είναι τώρα διαθέσιμη.",
+	"A task model is used when performing tasks such as generating titles for chats and web search queries": "Ένα μοντέλο εργασίας χρησιμοποιείται κατά την εκτέλεση εργασιών όπως η δημιουργία τίτλων για συνομιλίες και αναζητήσεις στο διαδίκτυο",
+	"a user": "ένας χρήστης",
+	"About": "Σχετικά",
+	"Access": "Πρόσβαση",
+	"Access Control": "Έλεγχος Πρόσβασης",
+	"Accessible to all users": "Προσβάσιμο σε όλους τους χρήστες",
+	"Account": "Λογαριασμός",
+	"Account Activation Pending": "Ενεργοποίηση Λογαριασμού Εκκρεμεί",
+	"Accurate information": "Ακριβείς πληροφορίες",
+	"Actions": "Ενέργειες",
+	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Ενεργοποιήστε αυτή την εντολή πληκτρολογώντας \"/{{COMMAND}}\" στο πεδίο συνομιλίας.",
+	"Active Users": "Ενεργοί Χρήστες",
+	"Add": "Προσθήκη",
+	"Add a model ID": "Προσθήκη αναγνωριστικού μοντέλου",
+	"Add a short description about what this model does": "Προσθήκη σύντομης περιγραφής για το τι κάνει αυτό το μοντέλο",
+	"Add a tag": "Προσθήκη ετικέτας",
+	"Add Arena Model": "Προσθήκη Μοντέλου Arena",
+	"Add Connection": "Προσθήκη Σύνδεσης",
+	"Add Content": "Προσθήκη Περιεχομένου",
+	"Add content here": "Προσθέστε περιεχόμενο εδώ",
+	"Add custom prompt": "Προσθήκη προσαρμοσμένης προτροπής",
+	"Add Files": "Προσθήκη Αρχείων",
+	"Add Group": "Προσθήκη Ομάδας",
+	"Add Memory": "Προσθήκη Μνήμης",
+	"Add Model": "Προσθήκη Μοντέλου",
+	"Add Tag": "Προσθήκη Ετικέτας",
+	"Add Tags": "Προσθήκη Ετικετών",
+	"Add text content": "Προσθήκη κειμένου",
+	"Add User": "Προσθήκη Χρήστη",
+	"Add User Group": "Προσθήκη Ομάδας Χρηστών",
+	"Adjusting these settings will apply changes universally to all users.": "Η ρύθμιση αυτών των παραμέτρων θα εφαρμόσει τις αλλαγές καθολικά σε όλους τους χρήστες.",
+	"admin": "διαχειριστής",
+	"Admin": "Διαχειριστής",
+	"Admin Panel": "Πίνακας Διαχειριστή",
+	"Admin Settings": "Ρυθμίσεις Διαχειριστή",
+	"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Οι διαχειριστές έχουν πρόσβαση σε όλα τα εργαλεία ανά πάσα στιγμή· οι χρήστες χρειάζονται εργαλεία ανά μοντέλο στον χώρο εργασίας.",
+	"Advanced Parameters": "Προηγμένοι Παράμετροι",
+	"Advanced Params": "Προηγμένα Παράμετροι",
+	"All chats": "Όλες οι συνομιλίες",
+	"All Documents": "Όλα τα Έγγραφα",
+	"All models deleted successfully": "Όλα τα μοντέλα διαγράφηκαν με επιτυχία",
+	"Allow Chat Delete": "Επιτρέπεται η διαγραφή συνομιλίας",
+	"Allow Chat Deletion": "Επιτρέπεται η Διαγραφή Συνομιλίας",
+	"Allow Chat Edit": "Επιτρέπεται η Επεξεργασία Συνομιλίας",
+	"Allow File Upload": "Επιτρέπεται η Αποστολή Αρχείων",
+	"Allow non-local voices": "Επιτρέπονται μη τοπικές φωνές",
+	"Allow Temporary Chat": "Επιτρέπεται η Προσωρινή Συνομιλία",
+	"Allow User Location": "Επιτρέπεται η Τοποθεσία Χρήστη",
+	"Allow Voice Interruption in Call": "Επιτρέπεται η Παύση Φωνής στην Κλήση",
+	"Already have an account?": "Έχετε ήδη λογαριασμό;",
+	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Εναλλακτικό στο top_p, και στοχεύει στη διασφάλιση μιας ισορροπίας μεταξύ ποιότητας και ποικιλίας. Η παράμετρος p αντιπροσωπεύει την ελάχιστη πιθανότητα για ένα token να θεωρηθεί, σε σχέση με την πιθανότητα του πιο πιθανού token. Για παράδειγμα, με p=0.05 και το πιο πιθανό token να έχει πιθανότητα 0.9, τα logits με τιμή μικρότερη από 0.045 φιλτράρονται. (Προεπιλογή: 0.0)",
+	"Amazing": "Καταπληκτικό",
+	"an assistant": "ένας βοηθός",
+	"and": "και",
+	"and {{COUNT}} more": "και {{COUNT}} ακόμα",
+	"and create a new shared link.": "και δημιουργήστε έναν νέο κοινόχρηστο σύνδεσμο.",
+	"API Base URL": "API Βασικό URL",
+	"API Key": "Κλειδί API",
+	"API Key created.": "Το κλειδί API δημιουργήθηκε.",
+	"API keys": "κλειδιά API",
+	"Application DN": "DN Εφαρμογής",
+	"Application DN Password": "Κωδικός DN Εφαρμογής",
+	"applies to all users with the \"user\" role": "εφαρμόζεται σε όλους τους χρήστες με το ρόλο \"user\"",
+	"April": "Απρίλιος",
+	"Archive": "Αρχείο",
+	"Archive All Chats": "Αρχειοθέτηση Όλων των Συνομιλιών",
+	"Archived Chats": "Αρχειοθετημένες Συνομιλίες",
+	"archived-chat-export": "εξαγωγή-αρχείου-συνομιλίας",
+	"Are you sure you want to unarchive all archived chats?": "Είστε σίγουροι ότι θέλετε να απο-αρχειοθετήσετε όλες τις αρχειοθετημένες συνομιλίες;",
+	"Are you sure?": "Είστε σίγουροι;",
+	"Arena Models": "Μοντέλα Arena",
+	"Artifacts": "Αρχεία",
+	"Ask a question": "Ρωτήστε μια ερώτηση",
+	"Assistant": "Βοηθός",
+	"Attach file": "Συνημμένο αρχείο",
+	"Attention to detail": "Προσοχή στη λεπτομέρεια",
+	"Attribute for Username": "Ιδιότητα για Όνομα Χρήστη",
+	"Audio": "Ήχος",
+	"August": "Αύγουστος",
+	"Authenticate": "Επαλήθευση",
+	"Auto-Copy Response to Clipboard": "Αυτόματη Αντιγραφή Απάντησης στο Πρόχειρο",
+	"Auto-playback response": "Αυτόματη αναπαραγωγή της απάντησης",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
+	"Automatic1111": "Automatic1111",
+	"AUTOMATIC1111 Api Auth String": "Σειρά Επαλήθευσης API AUTOMATIC1111",
+	"AUTOMATIC1111 Base URL": "Βασικό URL AUTOMATIC1111",
+	"AUTOMATIC1111 Base URL is required.": "Απαιτείται το Βασικό URL AUTOMATIC1111.",
+	"Available list": "Διαθέσιμη λίστα",
+	"available!": "διαθέσιμο!",
+	"Awful": "Ασχημο",
+	"Azure AI Speech": "Ομιλία Azure AI",
+	"Azure Region": "Περιοχή Azure",
+	"Back": "Πίσω",
+	"Bad Response": "Κακή Απάντηση",
+	"Banners": "Προβολές",
+	"Base Model (From)": "Βασικό Μοντέλο (Από)",
+	"Batch Size (num_batch)": "Μέγεθος Παρτίδας (num_batch)",
+	"before": "πριν",
+	"Being lazy": "Τρώλακας",
+	"Bing Search V7 Endpoint": "Τέλος Bing Search V7",
+	"Bing Search V7 Subscription Key": "Κλειδί Συνδρομής Bing Search V7",
+	"Brave Search API Key": "Κλειδί API Brave Search",
+	"By {{name}}": "Από {{name}}",
+	"Bypass SSL verification for Websites": "Παράκαμψη επαλήθευσης SSL για Ιστότοπους",
+	"Call": "Κλήση",
+	"Call feature is not supported when using Web STT engine": "Η λειτουργία κλήσης δεν υποστηρίζεται όταν χρησιμοποιείται η μηχανή Web STT",
+	"Camera": "Κάμερα",
+	"Cancel": "Ακύρωση",
+	"Capabilities": "Δυνατότητες",
+	"Certificate Path": "Διαδρομή Πιστοποιητικού",
+	"Change Password": "Αλλαγή Κωδικού",
+	"Character": "Χαρακτήρας",
+	"Character limit for autocomplete generation input": "",
+	"Chart new frontiers": "Σχεδιάστε νέους ορίζοντες",
+	"Chat": "Συνομιλία",
+	"Chat Background Image": "Εικόνα Φόντου Συνομιλίας",
+	"Chat Bubble UI": "Διεπαφή Φούσκας Συνομιλίας",
+	"Chat Controls": "Έλεγχοι Συνομιλίας",
+	"Chat direction": "Κατεύθυνση Συνομιλίας",
+	"Chat Overview": "Επισκόπηση Συνομιλίας",
+	"Chat Permissions": "Δικαιώματα Συνομιλίας",
+	"Chat Tags Auto-Generation": "Αυτόματη Γενιά Ετικετών Συνομιλίας",
+	"Chats": "Συνομιλίες",
+	"Check Again": "Ελέγξτε ξανά",
+	"Check for updates": "Έλεγχος για ενημερώσεις",
+	"Checking for updates...": "Ελέγχεται για ενημερώσεις...",
+	"Choose a model before saving...": "Επιλέξτε ένα μοντέλο πριν αποθηκεύσετε...",
+	"Chunk Overlap": "Επικάλυψη Τμημάτων",
+	"Chunk Params": "Παράμετροι Τμημάτων",
+	"Chunk Size": "Μέγεθος Τμημάτων",
+	"Ciphers": "Κρυπτογραφήσεις",
+	"Citation": "Παράθεση",
+	"Clear memory": "Καθαρισμός μνήμης",
+	"click here": "κλικ εδώ",
+	"Click here for filter guides.": "Κάντε κλικ εδώ για οδηγούς φίλτρων.",
+	"Click here for help.": "Κάντε κλικ εδώ για βοήθεια.",
+	"Click here to": "Κάντε κλικ εδώ για να",
+	"Click here to download user import template file.": "Κάντε κλικ εδώ για να κατεβάσετε το αρχείο προτύπου εισαγωγής χρήστη.",
+	"Click here to learn more about faster-whisper and see the available models.": "Κάντε κλικ εδώ για να μάθετε περισσότερα σχετικά με το faster-whisper και να δείτε τα διαθέσιμα μοντέλα.",
+	"Click here to select": "Κάντε κλικ εδώ για επιλογή",
+	"Click here to select a csv file.": "Κάντε κλικ εδώ για να επιλέξετε ένα αρχείο csv.",
+	"Click here to select a py file.": "Κάντε κλικ εδώ για να επιλέξετε ένα αρχείο py.",
+	"Click here to upload a workflow.json file.": "Κάντε κλικ εδώ για να ανεβάσετε ένα αρχείο workflow.json.",
+	"click here.": "κλικ εδώ.",
+	"Click on the user role button to change a user's role.": "Κάντε κλικ στο κουμπί ρόλου χρήστη για να αλλάξετε το ρόλο ενός χρήστη.",
+	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Άρνηση δικαιώματος εγγραφής στο πρόχειρο. Παρακαλώ ελέγξτε τις ρυθμίσεις του περιηγητή σας για να δώσετε την απαραίτητη πρόσβαση.",
+	"Clone": "Κλώνος",
+	"Close": "Κλείσιμο",
+	"Code execution": "Εκτέλεση κώδικα",
+	"Code formatted successfully": "Ο κώδικας μορφοποιήθηκε επιτυχώς",
+	"Collection": "Συλλογή",
+	"Color": "Χρώμα",
+	"ComfyUI": "ComfyUI",
+	"ComfyUI Base URL": "Βασικό URL ComfyUI",
+	"ComfyUI Base URL is required.": "Απαιτείται το Βασικό URL ComfyUI.",
+	"ComfyUI Workflow": "Ροές Εργασίας ComfyUI",
+	"ComfyUI Workflow Nodes": "Κόμβοι Ροής Εργασίας ComfyUI",
+	"Command": "Εντολή",
+	"Completions": "Ολοκληρώσεις",
+	"Concurrent Requests": "Ταυτόχρονες Αιτήσεις",
+	"Configure": "Διαμόρφωση",
+	"Configure Models": "Διαμόρφωση Μοντέλων",
+	"Confirm": "Επιβεβαίωση",
+	"Confirm Password": "Επιβεβαίωση Κωδικού",
+	"Confirm your action": "Επιβεβαιώστε την ενέργειά σας",
+	"Connections": "Συνδέσεις",
+	"Contact Admin for WebUI Access": "Επικοινωνήστε με τον Διαχειριστή για Πρόσβαση στο WebUI",
+	"Content": "Περιεχόμενο",
+	"Content Extraction": "Εξαγωγή Περιεχομένου",
+	"Context Length": "Μήκος Πλαισίου",
+	"Continue Response": "Συνέχεια Απάντησης",
+	"Continue with {{provider}}": "Συνέχεια με {{provider}}",
+	"Continue with Email": "Συνέχεια με Email",
+	"Continue with LDAP": "Συνέχεια με LDAP",
+	"Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "Έλεγχος πώς διαχωρίζεται το κείμενο του μηνύματος για αιτήματα TTS. Το 'Στίξη' διαχωρίζει σε προτάσεις, οι 'παραγράφοι' σε παραγράφους, και το 'κανένα' κρατά το μήνυμα ως μια αλυσίδα.",
+	"Controls": "Έλεγχοι",
+	"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "Διαχειρίζεται την ισορροπία μεταξύ συνεκτικότητας και ποικιλίας της εξόδου. Μια χαμηλότερη τιμή θα έχει ως αποτέλεσμα πιο εστιασμένο και συνεκτικό κείμενο. (Προεπιλογή: 5.0)",
+	"Copied": "Αντιγράφηκε",
+	"Copied shared chat URL to clipboard!": "Αντιγράφηκε το URL της κοινόχρηστης συνομιλίας στο πρόχειρο!",
+	"Copied to clipboard": "Αντιγράφηκε στο πρόχειρο",
+	"Copy": "Αντιγραφή",
+	"Copy last code block": "Αντιγραφή τελευταίου μπλοκ κώδικα",
+	"Copy last response": "Αντιγραφή τελευταίας απάντησης",
+	"Copy Link": "Αντιγραφή Συνδέσμου",
+	"Copy to clipboard": "Αντιγραφή στο πρόχειρο",
+	"Copying to clipboard was successful!": "Η αντιγραφή στο πρόχειρο ήταν επιτυχής!",
+	"Create": "Δημιουργία",
+	"Create a knowledge base": "Δημιουργία βάσης γνώσης",
+	"Create a model": "Δημιουργία μοντέλου",
+	"Create Account": "Δημιουργία Λογαριασμού",
+	"Create Admin Account": "Δημιουργία Λογαριασμού Διαχειριστή",
+	"Create Group": "Δημιουργία Ομάδας",
+	"Create Knowledge": "Δημιουργία Γνώσης",
+	"Create new key": "Δημιουργία νέου κλειδιού",
+	"Create new secret key": "Δημιουργία νέου μυστικού κλειδιού",
+	"Created at": "Δημιουργήθηκε στις",
+	"Created At": "Δημιουργήθηκε στις",
+	"Created by": "Δημιουργήθηκε από",
+	"CSV Import": "Εισαγωγή CSV",
+	"Current Model": "Τρέχον Μοντέλο",
+	"Current Password": "Τρέχων Κωδικός",
+	"Custom": "Προσαρμοσμένο",
+	"Dark": "Σκούρο",
+	"Database": "Βάση Δεδομένων",
+	"December": "Δεκέμβριος",
+	"Default": "Προεπιλογή",
+	"Default (Open AI)": "Προεπιλογή (Open AI)",
+	"Default (SentenceTransformers)": "Προεπιλογή (SentenceTransformers)",
+	"Default Model": "Προεπιλεγμένο Μοντέλο",
+	"Default model updated": "Το προεπιλεγμένο μοντέλο ενημερώθηκε",
+	"Default Models": "Προεπιλεγμένα Μοντέλα",
+	"Default permissions": "Προεπιλεγμένα δικαιώματα",
+	"Default permissions updated successfully": "Τα προεπιλεγμένα δικαιώματα ενημερώθηκαν με επιτυχία",
+	"Default Prompt Suggestions": "Προεπιλεγμένες Προτάσεις Προτροπής",
+	"Default to 389 or 636 if TLS is enabled": "Προεπιλογή στο 389 ή 636 εάν είναι ενεργοποιημένο το TLS",
+	"Default to ALL": "Προεπιλογή σε ΟΛΑ",
+	"Default User Role": "Προεπιλεγμένος Ρόλος Χρήστη",
+	"Delete": "Διαγραφή",
+	"Delete a model": "Διαγραφή ενός μοντέλου",
+	"Delete All Chats": "Διαγραφή Όλων των Συνομιλιών",
+	"Delete All Models": "Διαγραφή Όλων των Μοντέλων",
+	"Delete chat": "Διαγραφή συνομιλίας",
+	"Delete Chat": "Διαγραφή Συνομιλίας",
+	"Delete chat?": "Διαγραφή συνομιλίας;",
+	"Delete folder?": "Διαγραφή φακέλου;",
+	"Delete function?": "Διαγραφή λειτουργίας;",
+	"Delete prompt?": "Διαγραφή προτροπής;",
+	"delete this link": "διαγραφή αυτού του συνδέσμου",
+	"Delete tool?": "Διαγραφή εργαλείου;",
+	"Delete User": "Διαγραφή Χρήστη",
+	"Deleted {{deleteModelTag}}": "Διαγράφηκε το {{deleteModelTag}}",
+	"Deleted {{name}}": "Διαγράφηκε το {{name}}",
+	"Deleted User": "Διαγράφηκε ο Χρήστης",
+	"Describe your knowledge base and objectives": "Περιγράψτε τη βάση γνώσης και τους στόχους σας",
+	"Description": "Περιγραφή",
+	"Didn't fully follow instructions": "Δεν ακολούθησε πλήρως τις οδηγίες",
+	"Disabled": "Απενεργοποιημένο",
+	"Discover a function": "Ανακάλυψη λειτουργίας",
+	"Discover a model": "Ανακάλυψη μοντέλου",
+	"Discover a prompt": "Ανακάλυψη προτροπής",
+	"Discover a tool": "Ανακάλυψη εργαλείου",
+	"Discover wonders": "Ανακάλυψη θαυμάτων",
+	"Discover, download, and explore custom functions": "Ανακαλύψτε, κατεβάστε και εξερευνήστε προσαρμοσμένες λειτουργίες",
+	"Discover, download, and explore custom prompts": "Ανακαλύψτε, κατεβάστε και εξερευνήστε προσαρμοσμένες προτροπές",
+	"Discover, download, and explore custom tools": "Ανακαλύψτε, κατεβάστε και εξερευνήστε προσαρμοσμένα εργαλεία",
+	"Discover, download, and explore model presets": "Ανακαλύψτε, κατεβάστε και εξερευνήστε προκαθορισμένα μοντέλα",
+	"Dismissible": "Αποκλειστέο",
+	"Display": "Εμφάνιση",
+	"Display Emoji in Call": "Εμφάνιση Emoji στην Κλήση",
+	"Display the username instead of You in the Chat": "Εμφάνιση του ονόματος χρήστη αντί του Εσάς στη Συνομιλία",
+	"Displays citations in the response": "Εμφανίζει αναφορές στην απάντηση",
+	"Dive into knowledge": "Βυθιστείτε στη γνώση",
+	"Do not install functions from sources you do not fully trust.": "Μην εγκαθιστάτε λειτουργίες από πηγές που δεν εμπιστεύεστε πλήρως.",
+	"Do not install tools from sources you do not fully trust.": "Μην εγκαθιστάτε εργαλεία από πηγές που δεν εμπιστεύεστε πλήρως.",
+	"Document": "Έγγραφο",
+	"Documentation": "Τεκμηρίωση",
+	"Documents": "Έγγραφα",
+	"does not make any external connections, and your data stays securely on your locally hosted server.": "δεν κάνει καμία εξωτερική σύνδεση, και τα δεδομένα σας παραμένουν ασφαλή στον τοπικά φιλοξενούμενο διακομιστή σας.",
+	"Don't have an account?": "Δεν έχετε λογαριασμό;",
+	"don't install random functions from sources you don't trust.": "μην εγκαθιστάτε τυχαίες λειτουργίες από πηγές που δεν εμπιστεύεστε.",
+	"don't install random tools from sources you don't trust.": "μην εγκαθιστάτε τυχαία εργαλεία από πηγές που δεν εμπιστεύεστε.",
+	"Don't like the style": "Δεν σας αρέσει το στυλ",
+	"Done": "Έτοιμο",
+	"Download": "Λήψη",
+	"Download canceled": "Η λήψη ακυρώθηκε",
+	"Download Database": "Λήψη Βάσης Δεδομένων",
+	"Drag and drop a file to upload or select a file to view": "Σύρετε και αφήστε ένα αρχείο για να το ανεβάσετε ή επιλέξτε ένα αρχείο για να το δείτε",
+	"Draw": "Σχεδίαση",
+	"Drop any files here to add to the conversation": "Αφήστε οποιαδήποτε αρχεία εδώ για να προστεθούν στη συνομιλία",
+	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "π.χ. '30s','10m'. Οι έγκυρες μονάδες χρόνου είναι 's', 'm', 'h'.",
+	"e.g. A filter to remove profanity from text": "π.χ. Ένα φίλτρο για να αφαιρέσετε βρισιές από το κείμενο",
+	"e.g. My Filter": "π.χ. Το Φίλτρου Μου",
+	"e.g. My Tools": "π.χ. Τα Εργαλεία Μου",
+	"e.g. my_filter": "π.χ. my_filter",
+	"e.g. my_tools": "π.χ. my_tools",
+	"e.g. Tools for performing various operations": "π.χ. Εργαλεία για την εκτέλεση διάφορων λειτουργιών",
+	"Edit": "Επεξεργασία",
+	"Edit Arena Model": "Επεξεργασία Μοντέλου Arena",
+	"Edit Connection": "Επεξεργασία Σύνδεσης",
+	"Edit Default Permissions": "Επεξεργασία Προεπιλεγμένων Δικαιωμάτων",
+	"Edit Memory": "Επεξεργασία Μνήμης",
+	"Edit User": "Επεξεργασία Χρήστη",
+	"Edit User Group": "Επεξεργασία Ομάδας Χρηστών",
+	"ElevenLabs": "ElevenLabs",
+	"Email": "Email",
+	"Embark on adventures": "Ξεκινήστε περιπέτειες",
+	"Embedding Batch Size": "Μέγεθος Παρτίδας Ενσωμάτωσης",
+	"Embedding Model": "Μοντέλο Ενσωμάτωσης",
+	"Embedding Model Engine": "Μηχανή Μοντέλου Ενσωμάτωσης",
+	"Embedding model set to \"{{embedding_model}}\"": "Το μοντέλο ενσωμάτωσης έχει οριστεί σε \"{{embedding_model}}\"",
+	"Enable API Key Auth": "Ενεργοποίηση Επαλήθευσης Κλειδιού API",
+	"Enable autocomplete generation for chat messages": "",
+	"Enable Community Sharing": "Ενεργοποίηση Κοινοτικής Κοινής Χρήσης",
+	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Ενεργοποίηση Κλείδωσης Μνήμης (mlock) για την αποτροπή της ανταλλαγής δεδομένων του μοντέλου από τη μνήμη RAM. Αυτή η επιλογή κλειδώνει το σύνολο εργασίας των σελίδων του μοντέλου στη μνήμη RAM, διασφαλίζοντας ότι δεν θα ανταλλαχθούν στο δίσκο. Αυτό μπορεί να βοηθήσει στη διατήρηση της απόδοσης αποφεύγοντας σφάλματα σελίδων και διασφαλίζοντας γρήγορη πρόσβαση στα δεδομένα.",
+	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "Ενεργοποίηση Χαρτογράφησης Μνήμης (mmap) για φόρτωση δεδομένων μοντέλου. Αυτή η επιλογή επιτρέπει στο σύστημα να χρησιμοποιεί αποθήκευση δίσκου ως επέκταση της μνήμης RAM, αντιμετωπίζοντας αρχεία δίσκου σαν να ήταν στη μνήμη RAM. Αυτό μπορεί να βελτιώσει την απόδοση του μοντέλου επιτρέποντας γρηγορότερη πρόσβαση στα δεδομένα. Ωστόσο, μπορεί να μην λειτουργεί σωστά με όλα τα συστήματα και να καταναλώνει σημαντικό χώρο στο δίσκο.",
+	"Enable Message Rating": "Ενεργοποίηση Αξιολόγησης Μηνυμάτων",
+	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "Ενεργοποίηση δειγματοληψίας Mirostat για έλεγχο της περιπλοκότητας. (Προεπιλογή: 0, 0 = Απενεργοποιημένο, 1 = Mirostat, 2 = Mirostat 2.0)",
+	"Enable New Sign Ups": "Ενεργοποίηση Νέων Εγγραφών",
+	"Enable Web Search": "Ενεργοποίηση Αναζήτησης στο Διαδίκτυο",
+	"Enabled": "Ενεργοποιημένο",
+	"Engine": "Μηχανή",
+	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Βεβαιωθείτε ότι το αρχείο CSV σας περιλαμβάνει 4 στήλες με αυτή τη σειρά: Όνομα, Email, Κωδικός, Ρόλος.",
+	"Enter {{role}} message here": "Εισάγετε το μήνυμα {{role}} εδώ",
+	"Enter a detail about yourself for your LLMs to recall": "Εισάγετε μια λεπτομέρεια για τον εαυτό σας ώστε τα LLMs να την ανακαλούν",
+	"Enter api auth string (e.g. username:password)": "Εισάγετε τη σειρά επαλήθευσης api (π.χ. username:password)",
+	"Enter Application DN": "Εισάγετε DN Εφαρμογής",
+	"Enter Application DN Password": "Εισάγετε Κωδικό DN Εφαρμογής",
+	"Enter Bing Search V7 Endpoint": "Εισάγετε το Τέλος Bing Search V7",
+	"Enter Bing Search V7 Subscription Key": "Εισάγετε το Κλειδί Συνδρομής Bing Search V7",
+	"Enter Brave Search API Key": "Εισάγετε το Κλειδί API Brave Search",
+	"Enter certificate path": "Εισάγετε τη διαδρομή πιστοποιητικού",
+	"Enter CFG Scale (e.g. 7.0)": "Εισάγετε το CFG Scale (π.χ. 7.0)",
+	"Enter Chunk Overlap": "Εισάγετε την Επικάλυψη Τμημάτων",
+	"Enter Chunk Size": "Εισάγετε το Μέγεθος Τμημάτων",
+	"Enter description": "Εισάγετε την περιγραφή",
+	"Enter Github Raw URL": "Εισάγετε το Github Raw URL",
+	"Enter Google PSE API Key": "Εισάγετε το Κλειδί API Google PSE",
+	"Enter Google PSE Engine Id": "Εισάγετε το Αναγνωριστικό Μηχανής Google PSE",
+	"Enter Image Size (e.g. 512x512)": "Εισάγετε το Μέγεθος Εικόνας (π.χ. 512x512)",
+	"Enter Jina API Key": "Εισάγετε το Κλειδί API Jina",
+	"Enter language codes": "Εισάγετε κωδικούς γλώσσας",
+	"Enter Model ID": "Εισάγετε το ID Μοντέλου",
+	"Enter model tag (e.g. {{modelTag}})": "Εισάγετε την ετικέτα μοντέλου (π.χ. {{modelTag}})",
+	"Enter Mojeek Search API Key": "Εισάγετε το Κλειδί API Mojeek Search",
+	"Enter Number of Steps (e.g. 50)": "Εισάγετε τον Αριθμό Βημάτων (π.χ. 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
+	"Enter Sampler (e.g. Euler a)": "Εισάγετε τον Sampler (π.χ. Euler a)",
+	"Enter Scheduler (e.g. Karras)": "Εισάγετε τον Scheduler (π.χ. Karras)",
+	"Enter Score": "Εισάγετε το Score",
+	"Enter SearchApi API Key": "Εισάγετε το Κλειδί API SearchApi",
+	"Enter SearchApi Engine": "Εισάγετε τη Μηχανή SearchApi",
+	"Enter Searxng Query URL": "Εισάγετε το URL Ερώτησης Searxng",
+	"Enter Seed": "Εισάγετε το Seed",
+	"Enter Serper API Key": "Εισάγετε το Κλειδί API Serper",
+	"Enter Serply API Key": "Εισάγετε το Κλειδί API Serply",
+	"Enter Serpstack API Key": "Εισάγετε το Κλειδί API Serpstack",
+	"Enter server host": "Εισάγετε τον διακομιστή host",
+	"Enter server label": "Εισάγετε την ετικέτα διακομιστή",
+	"Enter server port": "Εισάγετε την θύρα διακομιστή",
+	"Enter stop sequence": "Εισάγετε τη σειρά παύσης",
+	"Enter system prompt": "Εισάγετε την προτροπή συστήματος",
+	"Enter Tavily API Key": "Εισάγετε το Κλειδί API Tavily",
+	"Enter Tika Server URL": "Εισάγετε το URL διακομιστή Tika",
+	"Enter Top K": "Εισάγετε το Top K",
+	"Enter URL (e.g. http://127.0.0.1:7860/)": "Εισάγετε το URL (π.χ. http://127.0.0.1:7860/)",
+	"Enter URL (e.g. http://localhost:11434)": "Εισάγετε το URL (π.χ. http://localhost:11434)",
+	"Enter Your Email": "Εισάγετε το Email σας",
+	"Enter Your Full Name": "Εισάγετε το Πλήρες Όνομά σας",
+	"Enter your message": "Εισάγετε το μήνυμά σας",
+	"Enter Your Password": "Εισάγετε τον Κωδικό σας",
+	"Enter Your Role": "Εισάγετε τον Ρόλο σας",
+	"Enter Your Username": "Εισάγετε το Όνομα Χρήστη σας",
+	"Error": "Σφάλμα",
+	"ERROR": "ΣΦΑΛΜΑ",
+	"Evaluations": "Αξιολογήσεις",
+	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Παράδειγμα: (&(objectClass=inetOrgPerson)(uid=%s))",
+	"Example: ALL": "Παράδειγμα: ALL",
+	"Example: ou=users,dc=foo,dc=example": "Παράδειγμα: ou=users,dc=foo,dc=example",
+	"Example: sAMAccountName or uid or userPrincipalName": "Παράδειγμα: sAMAccountName ή uid ή userPrincipalName",
+	"Exclude": "Εξαίρεση",
+	"Experimental": "Πειραματικό",
+	"Explore the cosmos": "Εξερευνήστε το σύμπαν",
+	"Export": "Εξαγωγή",
+	"Export All Archived Chats": "Εξαγωγή Όλων των Αρχειοθετημένων Συνομιλιών",
+	"Export All Chats (All Users)": "Εξαγωγή Όλων των Συνομιλιών (Όλοι οι Χρήστες)",
+	"Export chat (.json)": "Εξαγωγή συνομιλίας (.json)",
+	"Export Chats": "Εξαγωγή Συνομιλιών",
+	"Export Config to JSON File": "Εξαγωγή Διαμόρφωσης σε Αρχείο JSON",
+	"Export Functions": "Εξαγωγή Λειτουργιών",
+	"Export Models": "Εξαγωγή Μοντέλων",
+	"Export Presets": "Εξαγωγή Προκαθορισμένων",
+	"Export Prompts": "Εξαγωγή Προτροπών",
+	"Export to CSV": "Εξαγωγή σε CSV",
+	"Export Tools": "Εξαγωγή Εργαλείων",
+	"External Models": "Εξωτερικά Μοντέλα",
+	"Failed to add file.": "Αποτυχία προσθήκης αρχείου.",
+	"Failed to create API Key.": "Αποτυχία δημιουργίας Κλειδιού API.",
+	"Failed to read clipboard contents": "Αποτυχία ανάγνωσης περιεχομένων πρόχειρου",
+	"Failed to save models configuration": "Αποτυχία αποθήκευσης ρυθμίσεων μοντέλων",
+	"Failed to update settings": "Αποτυχία ενημέρωσης ρυθμίσεων",
+	"Failed to upload file.": "Αποτυχία ανεβάσματος αρχείου.",
+	"February": "Φεβρουάριος",
+	"Feedback History": "Ιστορικό Ανατροφοδότησης",
+	"Feedbacks": "Ανατροφοδοτήσεις",
+	"Feel free to add specific details": "Νιώστε ελεύθεροι να προσθέσετε συγκεκριμένες λεπτομέρειες",
+	"File": "Αρχείο",
+	"File added successfully.": "Το αρχείο προστέθηκε με επιτυχία.",
+	"File content updated successfully.": "Το περιεχόμενο του αρχείου ενημερώθηκε με επιτυχία.",
+	"File Mode": "Λειτουργία Αρχείου",
+	"File not found.": "Αρχείο δεν βρέθηκε.",
+	"File removed successfully.": "Το αρχείο αφαιρέθηκε με επιτυχία.",
+	"File size should not exceed {{maxSize}} MB.": "Το μέγεθος του αρχείου δεν πρέπει να υπερβαίνει τα {{maxSize}} MB.",
+	"Files": "Αρχεία",
+	"Filter is now globally disabled": "Το φίλτρο είναι τώρα καθολικά απενεργοποιημένο",
+	"Filter is now globally enabled": "Το φίλτρο είναι τώρα καθολικά ενεργοποιημένο",
+	"Filters": "Φίλτρα",
+	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Εντοπίστηκε spoofing δακτυλικού αποτυπώματος: Αδυναμία χρήσης αρχικών ως avatar. Χρήση της προεπιλεγμένης εικόνας προφίλ.",
+	"Fluidly stream large external response chunks": "Ροή μεγάλων εξωτερικών τμημάτων απάντησης ομαλά",
+	"Focus chat input": "Εστίαση στο πεδίο συνομιλίας",
+	"Folder deleted successfully": "Ο φάκελος διαγράφηκε με επιτυχία",
+	"Folder name cannot be empty": "Το όνομα του φακέλου δεν μπορεί να είναι κενό",
+	"Folder name cannot be empty.": "Το όνομα του φακέλου δεν μπορεί να είναι κενό.",
+	"Folder name updated successfully": "Το όνομα του φακέλου ενημερώθηκε με επιτυχία",
+	"Followed instructions perfectly": "Ακολούθησε τις οδηγίες τέλεια",
+	"Forge new paths": "Δημιουργήστε νέες διαδρομές",
+	"Form": "Φόρμα",
+	"Format your variables using brackets like this:": "Μορφοποιήστε τις μεταβλητές σας χρησιμοποιώντας αγκύλες όπως αυτό:",
+	"Frequency Penalty": "Ποινή Συχνότητας",
+	"Function": "Λειτουργία",
+	"Function created successfully": "Η λειτουργία δημιουργήθηκε με επιτυχία",
+	"Function deleted successfully": "Η λειτουργία διαγράφηκε με επιτυχία",
+	"Function Description": "Περιγραφή Λειτουργίας",
+	"Function ID": "ID Λειτουργίας",
+	"Function is now globally disabled": "Η λειτουργία είναι τώρα καθολικά απενεργοποιημένη",
+	"Function is now globally enabled": "Η λειτουργία είναι τώρα καθολικά ενεργοποιημένη",
+	"Function Name": "Όνομα Λειτουργίας",
+	"Function updated successfully": "Η λειτουργία ενημερώθηκε με επιτυχία",
+	"Functions": "Λειτουργίες",
+	"Functions allow arbitrary code execution": "Οι λειτουργίες επιτρέπουν την εκτέλεση αυθαίρετου κώδικα",
+	"Functions allow arbitrary code execution.": "Οι λειτουργίες επιτρέπουν την εκτέλεση αυθαίρετου κώδικα.",
+	"Functions imported successfully": "Οι λειτουργίες εισήχθησαν με επιτυχία",
+	"General": "Γενικά",
+	"General Settings": "Γενικές Ρυθμίσεις",
+	"Generate Image": "Δημιουργία Εικόνας",
+	"Generating search query": "Γενιά αναζήτησης ερώτησης",
+	"Generation Info": "Πληροφορίες Γενιάς",
+	"Get started": "Ξεκινήστε",
+	"Get started with {{WEBUI_NAME}}": "Ξεκινήστε με {{WEBUI_NAME}}",
+	"Global": "Καθολικό",
+	"Good Response": "Καλή Απάντηση",
+	"Google PSE API Key": "Κλειδί API Google PSE",
+	"Google PSE Engine Id": "Αναγνωριστικό Μηχανής Google PSE",
+	"Group created successfully": "Η ομάδα δημιουργήθηκε με επιτυχία",
+	"Group deleted successfully": "Η ομάδα διαγράφηκε με επιτυχία",
+	"Group Description": "Περιγραφή Ομάδας",
+	"Group Name": "Όνομα Ομάδας",
+	"Group updated successfully": "Η ομάδα ενημερώθηκε με επιτυχία",
+	"Groups": "Ομάδες",
+	"h:mm a": "h:mm π.μ./μ.μ.",
+	"Haptic Feedback": "Ανατροφοδότηση Haptic",
+	"has no conversations.": "δεν έχει συνομιλίες.",
+	"Hello, {{name}}": "Γειά σου, {{name}}",
+	"Help": "Βοήθεια",
+	"Help us create the best community leaderboard by sharing your feedback history!": "Βοηθήστε μας να δημιουργήσουμε την καλύτερη κατάταξη κοινότητας μοιράζοντας το ιστορικό ανατροφοδότησής σας!",
+	"Hex Color": "Χρώμα Hex",
+	"Hex Color - Leave empty for default color": "Χρώμα Hex - Αφήστε κενό για προεπιλεγμένο χρώμα",
+	"Hide": "Απόκρυψη",
+	"Host": "Διακομιστής",
+	"How can I help you today?": "Πώς μπορώ να σας βοηθήσω σήμερα;",
+	"How would you rate this response?": "Πώς θα βαθμολογούσατε αυτή την απάντηση;",
+	"Hybrid Search": "Υβριδική Αναζήτηση",
+	"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Αναγνωρίζω ότι έχω διαβάσει και κατανοώ τις συνέπειες της ενέργειάς μου. Γνωρίζω τους κινδύνους που σχετίζονται με την εκτέλεση αυθαίρετου κώδικα και έχω επαληθεύσει την αξιοπιστία της πηγής.",
+	"ID": "ID",
+	"Ignite curiosity": "Ξύπνημα της περιέργειας",
+	"Image Generation (Experimental)": "Δημιουργία Εικόνας (Πειραματικό)",
+	"Image Generation Engine": "Μηχανή Δημιουργίας Εικόνας",
+	"Image Settings": "Ρυθμίσεις Εικόνας",
+	"Images": "Εικόνες",
+	"Import Chats": "Εισαγωγή Συνομιλιών",
+	"Import Config from JSON File": "Εισαγωγή Διαμόρφωσης από Αρχείο JSON",
+	"Import Functions": "Εισαγωγή Λειτουργιών",
+	"Import Models": "Εισαγωγή Μοντέλων",
+	"Import Presets": "Εισαγωγή Προκαθορισμένων",
+	"Import Prompts": "Εισαγωγή Προτροπών",
+	"Import Tools": "Εισαγωγή Εργαλείων",
+	"Include": "Συμπερίληψη",
+	"Include `--api-auth` flag when running stable-diffusion-webui": "Συμπεριλάβετε το flag `--api-auth` όταν τρέχετε το stable-diffusion-webui",
+	"Include `--api` flag when running stable-diffusion-webui": "Συμπεριλάβετε το flag `--api` όταν τρέχετε το stable-diffusion-webui",
+	"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive. (Default: 0.1)": "Επηρεάζει πόσο γρήγορα ανταποκρίνεται ο αλγόριθμος στην ανατροφοδότηση από το παραγόμενο κείμενο. Μια χαμηλότερη ταχύτητα μάθησης θα έχει ως αποτέλεσμα πιο αργές προσαρμογές, ενώ μια υψηλότερη ταχύτητα μάθησης θα κάνει τον αλγόριθμο πιο ανταποκρινόμενο. (Προεπιλογή: 0.1)",
+	"Info": "Πληροφορίες",
+	"Input commands": "Εισαγωγή εντολών",
+	"Install from Github URL": "Εγκατάσταση από URL Github",
+	"Instant Auto-Send After Voice Transcription": "Άμεση Αυτόματη Αποστολή μετά τη μεταγραφή φωνής",
+	"Interface": "Διεπαφή",
+	"Invalid file format.": "Μη έγκυρη μορφή αρχείου.",
+	"Invalid Tag": "Μη έγκυρη Ετικέτα",
+	"January": "Ιανουάριος",
+	"Jina API Key": "Κλειδί API Jina",
+	"join our Discord for help.": "συμμετέχετε στο Discord μας για βοήθεια.",
+	"JSON": "JSON",
+	"JSON Preview": "Προεπισκόπηση JSON",
+	"July": "Ιούλιος",
+	"June": "Ιούνιος",
+	"JWT Expiration": "Λήξη JWT",
+	"JWT Token": "Token JWT",
+	"Keep Alive": "Διατήρηση Ζωντανής Σύνδεσης",
+	"Key": "Κλειδί",
+	"Keyboard shortcuts": "Συντομεύσεις Πληκτρολογίου",
+	"Knowledge": "Γνώση",
+	"Knowledge Access": "Πρόσβαση στη Γνώση",
+	"Knowledge created successfully.": "Η γνώση δημιουργήθηκε με επιτυχία.",
+	"Knowledge deleted successfully.": "Η γνώση διαγράφηκε με επιτυχία.",
+	"Knowledge reset successfully.": "Η γνώση επαναφέρθηκε με επιτυχία.",
+	"Knowledge updated successfully": "Η γνώση ενημερώθηκε με επιτυχία",
+	"Label": "Ετικέτα",
+	"Landing Page Mode": "Λειτουργία Σελίδας Άφιξης",
+	"Language": "Γλώσσα",
+	"Last Active": "Τελευταία Ενεργή",
+	"Last Modified": "Τελευταία Τροποποίηση",
+	"LDAP": "LDAP",
+	"LDAP server updated": "Ο διακομιστής LDAP ενημερώθηκε",
+	"Leaderboard": "Κατάταξη",
+	"Leave empty for unlimited": "Αφήστε κενό για απεριόριστο",
+	"Leave empty to include all models from \"{{URL}}/api/tags\" endpoint": "Αφήστε κενό για να συμπεριλάβετε όλα τα μοντέλα από το endpoint \"{{URL}}/api/tags\"",
+	"Leave empty to include all models from \"{{URL}}/models\" endpoint": "Αφήστε κενό για να συμπεριλάβετε όλα τα μοντέλα από το endpoint \"{{URL}}/models\"",
+	"Leave empty to include all models or select specific models": "Αφήστε κενό για να χρησιμοποιήσετε όλα τα μοντέλα ή επιλέξτε συγκεκριμένα μοντέλα",
+	"Leave empty to use the default prompt, or enter a custom prompt": "Αφήστε κενό για να χρησιμοποιήσετε την προεπιλεγμένη προτροπή, ή εισάγετε μια προσαρμοσμένη προτροπή",
+	"Light": "Φως",
+	"Listening...": "Ακούγεται...",
+	"LLMs can make mistakes. Verify important information.": "Τα LLM μπορούν να κάνουν λάθη. Επαληθεύστε σημαντικές πληροφορίες.",
+	"Local": "Τοπικό",
+	"Local Models": "Τοπικά Μοντέλα",
+	"Lost": "Χαμένος",
+	"LTR": "LTR",
+	"Made by OpenWebUI Community": "Δημιουργήθηκε από την Κοινότητα OpenWebUI",
+	"Make sure to enclose them with": "Βεβαιωθείτε ότι τα περικλείετε με",
+	"Make sure to export a workflow.json file as API format from ComfyUI.": "Βεβαιωθείτε ότι εξάγετε ένα αρχείο workflow.json ως μορφή API από το ComfyUI.",
+	"Manage": "Διαχείριση",
+	"Manage Arena Models": "Διαχείριση Μοντέλων Arena",
+	"Manage Ollama": "Διαχείριση Ollama",
+	"Manage Ollama API Connections": "Διαχείριση Συνδέσεων API Ollama",
+	"Manage OpenAI API Connections": "Διαχείριση Συνδέσεων API OpenAI",
+	"Manage Pipelines": "Διαχείριση Καναλιών",
+	"March": "Μάρτιος",
+	"Max Tokens (num_predict)": "Μέγιστος Αριθμός Tokens (num_predict)",
+	"Max Upload Count": "Μέγιστος Αριθμός Ανεβάσματος",
+	"Max Upload Size": "Μέγιστο Μέγεθος Αρχείου",
+	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Μέγιστο των 3 μοντέλων μπορούν να κατεβούν ταυτόχρονα. Παρακαλώ δοκιμάστε ξανά αργότερα.",
+	"May": "Μάιος",
+	"Memories accessible by LLMs will be shown here.": "Οι αναμνήσεις προσβάσιμες από τα LLMs θα εμφανιστούν εδώ.",
+	"Memory": "Μνήμη",
+	"Memory added successfully": "Η μνήμη προστέθηκε με επιτυχία",
+	"Memory cleared successfully": "Η μνήμη καθαρίστηκε με επιτυχία",
+	"Memory deleted successfully": "Η μνήμη διαγράφηκε με επιτυχία",
+	"Memory updated successfully": "Η μνήμη ενημερώθηκε με επιτυχία",
+	"Merge Responses": "Συγχώνευση Απαντήσεων",
+	"Message rating should be enabled to use this feature": "Η αξιολόγηση μηνυμάτων πρέπει να είναι ενεργοποιημένη για να χρησιμοποιήσετε αυτή τη λειτουργία",
+	"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",
+	"MMMM DD, YYYY": "MMMM DD, YYYY",
+	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
+	"MMMM DD, YYYY hh:mm:ss A": "MMMM DD, YYYY hh:mm:ss A",
+	"Model": "Μοντέλο",
+	"Model '{{modelName}}' has been successfully downloaded.": "Το μοντέλο '{{modelName}}' κατεβάστηκε με επιτυχία.",
+	"Model '{{modelTag}}' is already in queue for downloading.": "Το μοντέλο '{{modelTag}}' βρίσκεται ήδη στην ουρά για λήψη.",
+	"Model {{modelId}} not found": "Το μοντέλο {{modelId}} δεν βρέθηκε",
+	"Model {{modelName}} is not vision capable": "Το μοντέλο {{modelName}} δεν έχει δυνατότητα όρασης",
+	"Model {{name}} is now {{status}}": "Το μοντέλο {{name}} είναι τώρα {{status}}",
+	"Model accepts image inputs": "Το μοντέλο δέχεται είσοδο εικόνας",
+	"Model created successfully!": "Το μοντέλο δημιουργήθηκε με επιτυχία!",
+	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Ανιχνεύθηκε διαδρομή αρχείου μοντέλου. Το σύντομο όνομα μοντέλου απαιτείται για ενημέρωση, δεν μπορεί να συνεχιστεί.",
+	"Model Filtering": "Φιλτράρισμα Μοντέλων",
+	"Model ID": "ID Μοντέλου",
+	"Model IDs": "IDs Μοντέλων",
+	"Model Name": "Όνομα Μοντέλου",
+	"Model not selected": "Το μοντέλο δεν έχει επιλεγεί",
+	"Model Params": "Παράμετροι Μοντέλου",
+	"Model Permissions": "Δικαιώματα Μοντέλου",
+	"Model updated successfully": "Το μοντέλο ενημερώθηκε με επιτυχία",
+	"Modelfile Content": "Περιεχόμενο Αρχείου Μοντέλου",
+	"Models": "Μοντέλα",
+	"Models Access": "Πρόσβαση Μοντέλων",
+	"Models configuration saved successfully": "Η διαμόρφωση των μοντέλων αποθηκεύτηκε με επιτυχία",
+	"Mojeek Search API Key": "Κλειδί API Mojeek Search",
+	"more": "περισσότερα",
+	"More": "Περισσότερα",
+	"Name": "Όνομα",
+	"Name your knowledge base": "Ονομάστε τη βάση γνώσης σας",
+	"New Chat": "Νέα Συνομιλία",
+	"New folder": "Νέος φάκελος",
+	"New Password": "Νέος Κωδικός",
+	"No content found": "Δεν βρέθηκε περιεχόμενο",
+	"No content to speak": "Δεν υπάρχει περιεχόμενο για ανάγνωση",
+	"No distance available": "Δεν υπάρχει διαθέσιμη απόσταση",
+	"No feedbacks found": "Δεν βρέθηκαν ανατροφοδοτήσεις",
+	"No file selected": "Δεν έχει επιλεγεί αρχείο",
+	"No files found.": "Δεν βρέθηκαν αρχεία.",
+	"No groups with access, add a group to grant access": "Δεν υπάρχουν ομάδες με πρόσβαση, προσθέστε μια ομάδα για να χορηγήσετε πρόσβαση",
+	"No HTML, CSS, or JavaScript content found.": "Δεν βρέθηκε περιεχόμενο HTML, CSS ή JavaScript.",
+	"No knowledge found": "Δεν βρέθηκε γνώση",
+	"No model IDs": "Δεν υπάρχουν IDs μοντέλων",
+	"No models found": "Δεν βρέθηκαν μοντέλα",
+	"No models selected": "Δεν έχουν επιλεγεί μοντέλα",
+	"No results found": "Δεν βρέθηκαν αποτελέσματα",
+	"No search query generated": "Δεν δημιουργήθηκε ερώτηση αναζήτησης",
+	"No source available": "Δεν υπάρχει διαθέσιμη πηγή",
+	"No users were found.": "Δεν βρέθηκαν χρήστες.",
+	"No valves to update": "Δεν υπάρχουν βαλβίδες για ενημέρωση",
+	"None": "Κανένα",
+	"Not factually correct": "Δεν είναι γεγονότα",
+	"Not helpful": "Δεν είναι χρήσιμο",
+	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Σημείωση: Αν ορίσετε ένα ελάχιστο score, η αναζήτηση θα επιστρέψει μόνο έγγραφα με score μεγαλύτερο ή ίσο με το ελάχιστο score.",
+	"Notes": "Σημειώσεις",
+	"Notifications": "Ειδοποιήσεις",
+	"November": "Νοέμβριος",
+	"num_gpu (Ollama)": "num_gpu (Ollama)",
+	"num_thread (Ollama)": "num_thread (Ollama)",
+	"OAuth ID": "OAuth ID",
+	"October": "Οκτώβριος",
+	"Off": "Off",
+	"Okay, Let's Go!": "Εντάξει, Πάμε!",
+	"OLED Dark": "Σκούρο OLED",
+	"Ollama": "Ollama",
+	"Ollama API": "API Ollama",
+	"Ollama API disabled": "API Ollama απενεργοποιημένο",
+	"Ollama API settings updated": "Οι ρυθμίσεις API Ollama ενημερώθηκαν",
+	"Ollama Version": "Έκδοση Ollama",
+	"On": "On",
+	"Only alphanumeric characters and hyphens are allowed": "Επιτρέπονται μόνο αλφαριθμητικοί χαρακτήρες και παύλες",
+	"Only alphanumeric characters and hyphens are allowed in the command string.": "Επιτρέπονται μόνο αλφαριθμητικοί χαρακτήρες και παύλες στο string της εντολής.",
+	"Only collections can be edited, create a new knowledge base to edit/add documents.": "Μόνο συλλογές μπορούν να επεξεργαστούν, δημιουργήστε μια νέα βάση γνώσης για επεξεργασία/προσθήκη εγγράφων.",
+	"Only select users and groups with permission can access": "Μόνο επιλεγμένοι χρήστες και ομάδες με άδεια μπορούν να έχουν πρόσβαση",
+	"Oops! Looks like the URL is invalid. Please double-check and try again.": "Ωχ! Φαίνεται ότι το URL είναι μη έγκυρο. Παρακαλώ ελέγξτε ξανά και δοκιμάστε.",
+	"Oops! There are files still uploading. Please wait for the upload to complete.": "Ωχ! Υπάρχουν αρχεία που εξακολουθούν να ανεβαίνουν. Παρακαλώ περιμένετε να ολοκληρωθεί η μεταφόρτωση.",
+	"Oops! There was an error in the previous response.": "Ωχ! Υπήρξε σφάλμα στην προηγούμενη απάντηση.",
+	"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ωχ! Χρησιμοποιείτε μια μη υποστηριζόμενη μέθοδο (μόνο frontend). Παρακαλώ σερβίρετε το WebUI από το backend.",
+	"Open file": "Άνοιγμα αρχείου",
+	"Open in full screen": "Άνοιγμα σε πλήρη οθόνη",
+	"Open new chat": "Άνοιγμα νέας συνομιλίας",
+	"Open WebUI uses faster-whisper internally.": "Το Open WebUI χρησιμοποιεί το faster-whisper εσωτερικά.",
+	"Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Το Open WebUI χρησιμοποιεί τα SpeechT5 και CMU Arctic embeddings ομιλητών.",
+	"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Η έκδοση Open WebUI (v{{OPEN_WEBUI_VERSION}}) είναι χαμηλότερη από την απαιτούμενη έκδοση (v{{REQUIRED_VERSION}})",
+	"OpenAI": "OpenAI",
+	"OpenAI API": "API OpenAI",
+	"OpenAI API Config": "Διαμόρφωση API OpenAI",
+	"OpenAI API Key is required.": "Απαιτείται το Κλειδί API OpenAI.",
+	"OpenAI API settings updated": "Οι ρυθμίσεις API OpenAI ενημερώθηκαν",
+	"OpenAI URL/Key required.": "Απαιτείται URL/Kλειδί OpenAI.",
+	"or": "ή",
+	"Organize your users": "Οργανώστε τους χρήστες σας",
+	"Other": "Άλλο",
+	"OUTPUT": "ΕΞΟΔΟΣ",
+	"Output format": "Μορφή εξόδου",
+	"Overview": "Επισκόπηση",
+	"page": "σελίδα",
+	"Password": "Κωδικός",
+	"Paste Large Text as File": "Επικόλληση Μεγάλου Κειμένου ως Αρχείο",
+	"PDF document (.pdf)": "Έγγραφο PDF (.pdf)",
+	"PDF Extract Images (OCR)": "Εξαγωγή Εικόνων PDF (OCR)",
+	"pending": "εκκρεμεί",
+	"Permission denied when accessing media devices": "Άρνηση δικαιώματος κατά την πρόσβαση σε μέσα συσκευές",
+	"Permission denied when accessing microphone": "Άρνηση δικαιώματος κατά την πρόσβαση σε μικρόφωνο",
+	"Permission denied when accessing microphone: {{error}}": "Άρνηση δικαιώματος κατά την πρόσβαση σε μικρόφωνο: {{error}}",
+	"Permissions": "Δικαιώματα",
+	"Personalization": "Προσωποποίηση",
+	"Pin": "Καρφίτσωμα",
+	"Pinned": "Καρφιτσωμένο",
+	"Pioneer insights": "Συμβουλές πρωτοπόρων",
+	"Pipeline deleted successfully": "Η συνάρτηση διαγράφηκε με επιτυχία",
+	"Pipeline downloaded successfully": "Η συνάρτηση κατεβλήθηκε με επιτυχία",
+	"Pipelines": "Συναρτήσεις",
+	"Pipelines Not Detected": "Συναρτήσεις Δεν Εντοπίστηκαν",
+	"Pipelines Valves": "Βαλβίδες Συναρτήσεων",
+	"Plain text (.txt)": "Απλό κείμενο (.txt)",
+	"Playground": "Γήπεδο παιχνιδιών",
+	"Please carefully review the following warnings:": "Παρακαλώ αναθεωρήστε προσεκτικά τις ακόλουθες προειδοποιήσεις:",
+	"Please enter a prompt": "Παρακαλώ εισάγετε μια προτροπή",
+	"Please fill in all fields.": "Παρακαλώ συμπληρώστε όλα τα πεδία.",
+	"Please select a model first.": "",
+	"Please select a reason": "Παρακαλώ επιλέξτε έναν λόγο",
+	"Port": "Θύρα",
+	"Positive attitude": "Θετική στάση",
+	"Prefix ID": "ID Προθέματος",
+	"Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "Το ID Προθέματος χρησιμοποιείται για να αποφεύγονται συγκρούσεις με άλλες συνδέσεις προσθέτοντας ένα πρόθεμα στα IDs των μοντέλων - αφήστε κενό για απενεργοποίηση",
+	"Previous 30 days": "Προηγούμενες 30 ημέρες",
+	"Previous 7 days": "Προηγούμενες 7 ημέρες",
+	"Profile Image": "Εικόνα Προφίλ",
+	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Προτροπή (π.χ. Πες μου ένα διασκεδαστικό γεγονός για την Ρωμαϊκή Αυτοκρατορία)",
+	"Prompt Content": "Περιεχόμενο Προτροπής",
+	"Prompt created successfully": "Η προτροπή δημιουργήθηκε με επιτυχία",
+	"Prompt suggestions": "Προτάσεις Προτροπής",
+	"Prompt updated successfully": "Η προτροπή ενημερώθηκε με επιτυχία",
+	"Prompts": "Προτροπές",
+	"Prompts Access": "Πρόσβαση Προτροπών",
+	"Proxy URL": "",
+	"Pull \"{{searchValue}}\" from Ollama.com": "Τραβήξτε \"{{searchValue}}\" από το Ollama.com",
+	"Pull a model from Ollama.com": "Τραβήξτε ένα μοντέλο από το Ollama.com",
+	"Query Generation Prompt": "Προτροπή Δημιουργίας Ερωτήσεων",
+	"Query Params": "Παράμετροι Ερωτήσεων",
+	"RAG Template": "Πρότυπο RAG",
+	"Rating": "Βαθμολογία",
+	"Re-rank models by topic similarity": "Επανατάξη μοντέλων κατά ομοιότητα θέματος",
+	"Read Aloud": "Ανάγνωση Φωναχτά",
+	"Record voice": "Εγγραφή φωνής",
+	"Redirecting you to OpenWebUI Community": "Μετακατεύθυνση στην Κοινότητα OpenWebUI",
+	"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)": "Μειώνει την πιθανότητα δημιουργίας ανοησιών. Μια υψηλότερη τιμή (π.χ. 100) θα δώσει πιο ποικίλες απαντήσεις, ενώ μια χαμηλότερη τιμή (π.χ. 10) θα δημιουργήσει πιο συντηρητικές απαντήσεις. (Προεπιλογή: 40)",
+	"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Αναφέρεστε στον εαυτό σας ως \"User\" (π.χ., \"User μαθαίνει Ισπανικά\")",
+	"References from": "Αναφορές από",
+	"Refused when it shouldn't have": "Αρνήθηκε όταν δεν έπρεπε",
+	"Regenerate": "Αναγεννήστε",
+	"Release Notes": "Σημειώσεις Έκδοσης",
+	"Relevance": "Σχετικότητα",
+	"Remove": "Αφαίρεση",
+	"Remove Model": "Αφαίρεση Μοντέλου",
+	"Rename": "Μετονομασία",
+	"Reorder Models": "Επαναταξινόμηση Μοντέλων",
+	"Repeat Last N": "Επανάληψη Τελευταίων N",
+	"Request Mode": "Λειτουργία Αιτήματος",
+	"Reranking Model": "Μοντέλο Επαναταξινόμησης",
+	"Reranking model disabled": "Το μοντέλο επαναταξινόμησης απενεργοποιήθηκε",
+	"Reranking model set to \"{{reranking_model}}\"": "Το μοντέλο επαναταξινόμησης ορίστηκε σε \"{{reranking_model}}\"",
+	"Reset": "Επαναφορά",
+	"Reset All Models": "Επαναφορά Όλων των Μοντέλων",
+	"Reset Upload Directory": "Επαναφορά Καταλόγου Ανεβάσματος",
+	"Reset Vector Storage/Knowledge": "Επαναφορά Αποθήκευσης Διανυσμάτων/Γνώσης",
+	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Οι ειδοποιήσεις απάντησης δεν μπορούν να ενεργοποιηθούν καθώς οι άδειες του ιστότοπου έχουν αρνηθεί. Παρακαλώ επισκεφτείτε τις ρυθμίσεις του περιηγητή σας για να δώσετε την απαραίτητη πρόσβαση.",
+	"Response splitting": "Διαχωρισμός απάντησης",
+	"Result": "Αποτέλεσμα",
+	"Retrieval Query Generation": "",
+	"Rich Text Input for Chat": "Πλούσιο Εισαγωγή Κειμένου για Συνομιλία",
+	"RK": "RK",
+	"Role": "Ρόλος",
+	"Rosé Pine": "Rosé Pine",
+	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "RTL",
+	"Run": "Εκτέλεση",
+	"Running": "Εκτέλεση",
+	"Save": "Αποθήκευση",
+	"Save & Create": "Αποθήκευση & Δημιουργία",
+	"Save & Update": "Αποθήκευση & Ενημέρωση",
+	"Save As Copy": "Αποθήκευση ως Αντιγραφή",
+	"Save Tag": "Αποθήκευση Ετικέτας",
+	"Saved": "Αποθηκευμένο",
+	"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Η αποθήκευση των αρχείων συνομιλίας απευθείας στη μνήμη αποθήκευσης του προγράμματος περιήγησής σας δεν υποστηρίζεται πλέον. Παρακαλώ αφιερώστε λίγο χρόνο να κατεβάσετε και να διαγράψετε τα αρχεία συνομιλίας σας κάνοντας κλικ στο κουμπί παρακάτω. Μην ανησυχείτε, μπορείτε εύκολα να επαναφέρετε τα αρχεία συνομιλιών σας στο backend μέσω",
+	"Scroll to bottom when switching between branches": "Κύλιση προς τα κάτω όταν αλλάζετε μεταξύ κλάδων",
+	"Search": "Αναζήτηση",
+	"Search a model": "Αναζήτηση μοντέλου",
+	"Search Base": "Βάση Αναζήτησης",
+	"Search Chats": "Αναζήτηση Συνομιλιών",
+	"Search Collection": "Αναζήτηση Συλλογής",
+	"Search Filters": "Φίλτρα Αναζήτησης",
+	"search for tags": "αναζήτηση για ετικέτες",
+	"Search Functions": "Αναζήτηση Λειτουργιών",
+	"Search Knowledge": "Αναζήτηση Γνώσης",
+	"Search Models": "Αναζήτηση Μοντέλων",
+	"Search options": "Επιλογές Αναζήτησης",
+	"Search Prompts": "Αναζήτηση Προτροπών",
+	"Search Result Count": "Αριθμός Αποτελεσμάτων Αναζήτησης",
+	"Search the web": "Αναζήτηση στο διαδίκτυο",
+	"Search Tools": "Αναζήτηση Εργαλείων",
+	"SearchApi API Key": "Κλειδί API SearchApi",
+	"SearchApi Engine": "Μηχανή SearchApi",
+	"Searched {{count}} sites_one": "Αναζήτησε {{count}} site",
+	"Searched {{count}} sites_other": "Αναζήτησε {{count}} sites",
+	"Searching \"{{searchQuery}}\"": "Αναζήτηση \"{{searchQuery}}\"",
+	"Searching Knowledge for \"{{searchQuery}}\"": "Αναζήτηση Γνώσης για \"{{searchQuery}}\"",
+	"Searxng Query URL": "URL Ερώτησης Searxng",
+	"See readme.md for instructions": "Δείτε readme.md για οδηγίες",
+	"See what's new": "Δείτε τι νέο υπάρχει",
+	"Seed": "Seed",
+	"Select a base model": "Επιλέξτε ένα βασικό μοντέλο",
+	"Select a engine": "Επιλέξτε μια μηχανή",
+	"Select a function": "Επιλέξτε μια λειτουργία",
+	"Select a group": "Επιλέξτε μια ομάδα",
+	"Select a model": "Επιλέξτε ένα μοντέλο",
+	"Select a pipeline": "Επιλέξτε ένα pipeline",
+	"Select a pipeline url": "Επιλέξτε ένα pipeline url",
+	"Select a tool": "Επιλέξτε ένα εργαλείο",
+	"Select Engine": "Επιλέξτε Μηχανή",
+	"Select Knowledge": "Επιλέξτε Γνώση",
+	"Select model": "Επιλέξτε μοντέλο",
+	"Select only one model to call": "Επιλέξτε μόνο ένα μοντέλο για κλήση",
+	"Selected model(s) do not support image inputs": "Τα επιλεγμένα μοντέλα δεν υποστηρίζουν είσοδο εικόνων",
+	"Semantic distance to query": "Σημαντική απόσταση προς την ερώτηση",
+	"Send": "Αποστολή",
+	"Send a Message": "Αποστολή Μηνύματος",
+	"Send message": "Αποστολή μηνύματος",
+	"Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "Στέλνει `stream_options: { include_usage: true }` στο αίτημα.\nΟι υποστηριζόμενοι πάροχοι θα επιστρέψουν πληροφορίες χρήσης token στην απάντηση όταν ρυθμιστεί.",
+	"September": "Σεπτέμβριος",
+	"Serper API Key": "Κλειδί API Serper",
+	"Serply API Key": "Κλειδί API Serply",
+	"Serpstack API Key": "Κλειδί API Serpstack",
+	"Server connection verified": "Η σύνδεση διακομιστή επαληθεύθηκε",
+	"Set as default": "Ορισμός ως προεπιλογή",
+	"Set CFG Scale": "Ορισμός CFG Scale",
+	"Set Default Model": "Ορισμός Προεπιλεγμένου Μοντέλου",
+	"Set embedding model": "Ορισμός μοντέλου ενσωμάτωσης",
+	"Set embedding model (e.g. {{model}})": "Ορισμός μοντέλου ενσωμάτωσης (π.χ. {{model}})",
+	"Set Image Size": "Ορισμός Μεγέθους Εικόνας",
+	"Set reranking model (e.g. {{model}})": "Ορισμός μοντέλου επαναταξινόμησης (π.χ. {{model}})",
+	"Set Sampler": "Ορισμός Sampler",
+	"Set Scheduler": "Ορισμός Scheduler",
+	"Set Steps": "Ορισμός Βημάτων",
+	"Set Task Model": "Ορισμός Μοντέλου Εργασίας",
+	"Set the number of GPU devices used for computation. This option controls how many GPU devices (if available) are used to process incoming requests. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "Ορισμός του αριθμού των συσκευών GPU που χρησιμοποιούνται για υπολογισμούς. Αυτή η επιλογή ελέγχει πόσες συσκευές GPU (αν υπάρχουν) χρησιμοποιούνται για την επεξεργασία των εισερχόμενων αιτημάτων. Η αύξηση αυτής της τιμής μπορεί να βελτιώσει σημαντικά την απόδοση για μοντέλα που είναι βελτιστοποιημένα για επιτάχυνση GPU αλλά μπορεί επίσης να καταναλώσει περισσότερη ενέργεια και πόρους GPU.",
+	"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "Ορισμός του αριθμού των νημάτων εργασίας που χρησιμοποιούνται για υπολογισμούς. Αυτή η επιλογή ελέγχει πόσα νήματα χρησιμοποιούνται για την επεξεργασία των εισερχόμενων αιτημάτων ταυτόχρονα. Η αύξηση αυτής της τιμής μπορεί να βελτιώσει την απόδοση σε εργασίες υψηλής συγχρονισμένης φόρτωσης αλλά μπορεί επίσης να καταναλώσει περισσότερους πόρους CPU.",
+	"Set Voice": "Ορισμός Φωνής",
+	"Set whisper model": "Ορισμός μοντέλου whisper",
+	"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "Ορίζει πόσο πίσω θα κοιτάξει το μοντέλο για να αποτρέψει την επανάληψη. (Προεπιλογή: 64, 0 = απενεργοποιημένο, -1 = num_ctx)",
+	"Sets how strongly to penalize repetitions. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. (Default: 1.1)": "Ορίζει πόσο δυνατά θα τιμωρηθούν οι επαναλήψεις. Μια υψηλότερη τιμή (π.χ., 1.5) θα τιμωρήσει τις επαναλήψεις πιο έντονα, ενώ μια χαμηλότερη τιμή (π.χ., 0.9) θα είναι πιο ευέλικτη. (Προεπιλογή: 1.1)",
+	"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)": "Ορίζει τον τυχαίο σπόρο αριθμού που θα χρησιμοποιηθεί για τη δημιουργία. Ορισμός αυτού σε έναν συγκεκριμένο αριθμό θα κάνει το μοντέλο να δημιουργεί το ίδιο κείμενο για την ίδια προτροπή. (Προεπιλογή: τυχαίο)",
+	"Sets the size of the context window used to generate the next token. (Default: 2048)": "Ορίζει το μέγεθος του παραθύρου πλαισίου που χρησιμοποιείται για τη δημιουργία του επόμενου token. (Προεπιλογή: 2048)",
+	"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Ορίζει τις σειρές παύσης που θα χρησιμοποιηθούν. Όταν εντοπιστεί αυτό το μοτίβο, το LLM θα σταματήσει να δημιουργεί κείμενο και θα επιστρέψει. Πολλαπλά μοτίβα παύσης μπορούν να οριστούν καθορίζοντας πολλαπλές ξεχωριστές παραμέτρους παύσης σε ένα αρχείο μοντέλου.",
+	"Settings": "Ρυθμίσεις",
+	"Settings saved successfully!": "Οι Ρυθμίσεις αποθηκεύτηκαν με επιτυχία!",
+	"Share": "Κοινή Χρήση",
+	"Share Chat": "Κοινή Χρήση Συνομιλίας",
+	"Share to OpenWebUI Community": "Κοινή Χρήση στην Κοινότητα OpenWebUI",
+	"Show": "Εμφάνιση",
+	"Show \"What's New\" modal on login": "Εμφάνιση του παράθυρου \"Τι νέο υπάρχει\" κατά την είσοδο",
+	"Show Admin Details in Account Pending Overlay": "Εμφάνιση Λεπτομερειών Διαχειριστή στο Υπέρθεση Εκκρεμής Λογαριασμού",
+	"Show shortcuts": "Εμφάνιση συντομεύσεων",
+	"Show your support!": "Δείξτε την υποστήριξή σας!",
+	"Showcased creativity": "Εμφανιζόμενη δημιουργικότητα",
+	"Sign in": "Σύνδεση",
+	"Sign in to {{WEBUI_NAME}}": "Σύνδεση στο {{WEBUI_NAME}}",
+	"Sign in to {{WEBUI_NAME}} with LDAP": "Σύνδεση στο {{WEBUI_NAME}} με LDAP",
+	"Sign Out": "Αποσύνδεση",
+	"Sign up": "Εγγραφή",
+	"Sign up to {{WEBUI_NAME}}": "Εγγραφή στο {{WEBUI_NAME}}",
+	"Signing in to {{WEBUI_NAME}}": "Σύνδεση στο {{WEBUI_NAME}}",
+	"Source": "Πηγή",
+	"Speech Playback Speed": "Ταχύτητα Αναπαραγωγής Ομιλίας",
+	"Speech recognition error: {{error}}": "Σφάλμα αναγνώρισης ομιλίας: {{error}}",
+	"Speech-to-Text Engine": "Μηχανή Speech-to-Text",
+	"Stop": "Σταμάτημα",
+	"Stop Sequence": "Σειρά Παύσης",
+	"Stream Chat Response": "Συνομιλία Ροής Απάντησης",
+	"STT Model": "Μοντέλο STT",
+	"STT Settings": "Ρυθμίσεις STT",
+	"Subtitle (e.g. about the Roman Empire)": "Υπότιτλος (π.χ. για την Ρωμαϊκή Αυτοκρατορία)",
+	"Success": "Επιτυχία",
+	"Successfully updated.": "Επιτυχώς ενημερώθηκε.",
+	"Suggested": "Προτεινόμενο",
+	"Support": "Υποστήριξη",
+	"Support this plugin:": "Υποστήριξη αυτού του plugin:",
+	"Sync directory": "Συγχρονισμός καταλόγου",
+	"System": "Σύστημα",
+	"System Instructions": "Οδηγίες Συστήματος",
+	"System Prompt": "Προτροπή Συστήματος",
+	"Tags Generation": "",
+	"Tags Generation Prompt": "Προτροπή Γενιάς Ετικετών",
+	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "Η δειγματοληψία Tail free χρησιμοποιείται για να μειώσει την επίδραση των λιγότερο πιθανών tokens από την έξοδο. Μια υψηλότερη τιμή (π.χ., 2.0) θα μειώσει την επίδραση περισσότερο, ενώ μια τιμή 1.0 απενεργοποιεί αυτή τη ρύθμιση. (προεπιλογή: 1)",
+	"Tap to interrupt": "Πατήστε για παύση",
+	"Tavily API Key": "Κλειδί API Tavily",
+	"Tell us more:": "Πείτε μας περισσότερα:",
+	"Temperature": "Temperature",
+	"Template": "Πρότυπο",
+	"Temporary Chat": "Προσωρινή Συνομιλία",
+	"Text Splitter": "Διαχωριστής Κειμένου",
+	"Text-to-Speech Engine": "Μηχανή Text-to-Speech",
+	"Tfs Z": "Tfs Z",
+	"Thanks for your feedback!": "Ευχαριστούμε για την ανατροφοδότησή σας!",
+	"The Application Account DN you bind with for search": "Το DN του Λογαριασμού Εφαρμογής που συνδέετε για αναζήτηση",
+	"The base to search for users": "Η βάση για αναζήτηση χρηστών",
+	"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.  (Default: 512)": "Το μέγεθος παρτίδας καθορίζει πόσες αιτήσεις κειμένου επεξεργάζονται μαζί ταυτόχρονα. Ένα μεγαλύτερο μέγεθος παρτίδας μπορεί να αυξήσει την απόδοση και την ταχύτητα του μοντέλου, αλλά απαιτεί επίσης περισσότερη μνήμη. (Προεπιλογή: 512)",
+	"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Οι προγραμματιστές πίσω από αυτό το plugin είναι παθιασμένοι εθελοντές από την κοινότητα. Αν βρείτε αυτό το plugin χρήσιμο, παρακαλώ σκεφτείτε να συνεισφέρετε στην ανάπτυξή του.",
+	"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Η κατάταξη αξιολόγησης βασίζεται στο σύστημα βαθμολόγησης Elo και ενημερώνεται σε πραγματικό χρόνο.",
+	"The LDAP attribute that maps to the username that users use to sign in.": "Το χαρακτηριστικό LDAP που αντιστοιχεί στο όνομα χρήστη που χρησιμοποιούν οι χρήστες για να συνδεθούν.",
+	"The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Η κατάταξη είναι αυτή τη στιγμή σε beta, και ενδέχεται να προσαρμόσουμε τους υπολογισμούς βαθμολογίας καθώς βελτιώνουμε τον αλγόριθμο.",
+	"The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "Το μέγιστο μέγεθος αρχείου σε MB. Αν το μέγεθος του αρχείου υπερβαίνει αυτό το όριο, το αρχείο δεν θα ανεβεί.",
+	"The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "Ο μέγιστος αριθμός αρχείων που μπορούν να χρησιμοποιηθούν ταυτόχρονα στη συνομιλία. Αν ο αριθμός των αρχείων υπερβαίνει αυτό το όριο, τα αρχεία δεν θα ανεβούν.",
+	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Η βαθμολογία θα πρέπει να είναι μια τιμή μεταξύ 0.0 (0%) και 1.0 (100%).",
+	"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "Η θερμοκρασία του μοντέλου. Η αύξηση της θερμοκρασίας θα κάνει το μοντέλο να απαντά πιο δημιουργικά. (Προεπιλογή: 0.8)",
+	"Theme": "Θέμα",
+	"Thinking...": "Σκέφτομαι...",
+	"This action cannot be undone. Do you wish to continue?": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Θέλετε να συνεχίσετε;",
+	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Αυτό διασφαλίζει ότι οι πολύτιμες συνομιλίες σας αποθηκεύονται με ασφάλεια στη βάση δεδομένων backend σας. Ευχαριστούμε!",
+	"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Αυτή είναι μια πειραματική λειτουργία, μπορεί να μην λειτουργεί όπως αναμένεται και υπόκειται σε αλλαγές οποιαδήποτε στιγμή.",
+	"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics. (Default: 24)": "Αυτή η επιλογή ελέγχει πόσα tokens διατηρούνται κατά την ανανέωση του πλαισίου. Για παράδειγμα, αν οριστεί σε 2, τα τελευταία 2 tokens του πλαισίου συνομιλίας θα διατηρηθούν. Η διατήρηση του πλαισίου μπορεί να βοηθήσει στη διατήρηση της συνέχειας μιας συνομιλίας, αλλά μπορεί να μειώσει την ικανότητα ανταπόκρισης σε νέα θέματα. (Προεπιλογή: 24)",
+	"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.  (Default: 128)": "Αυτή η επιλογή ορίζει τον μέγιστο αριθμό tokens που μπορεί να δημιουργήσει το μοντέλο στην απάντησή του. Η αύξηση αυτού του ορίου επιτρέπει στο μοντέλο να παρέχει μεγαλύτερες απαντήσεις, αλλά μπορεί επίσης να αυξήσει την πιθανότητα δημιουργίας αχρήσιμου ή άσχετου περιεχομένου. (Προεπιλογή: 128)",
+	"This option will delete all existing files in the collection and replace them with newly uploaded files.": "Αυτή η επιλογή θα διαγράψει όλα τα υπάρχοντα αρχεία στη συλλογή και θα τα αντικαταστήσει με νέα ανεβασμένα αρχεία.",
+	"This response was generated by \"{{model}}\"": "Αυτή η απάντηση δημιουργήθηκε από \"{{model}}\"",
+	"This will delete": "Αυτό θα διαγράψει",
+	"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "Αυτό θα διαγράψει το <strong>{{NAME}}</strong> και <strong>όλο το περιεχόμενό του</strong>.",
+	"This will delete all models including custom models": "Αυτό θα διαγράψει όλα τα μοντέλα, συμπεριλαμβανομένων των προσαρμοσμένων μοντέλων",
+	"This will delete all models including custom models and cannot be undone.": "Αυτό θα διαγράψει όλα τα μοντέλα, συμπεριλαμβανομένων των προσαρμοσμένων μοντέλων και δεν μπορεί να αναιρεθεί.",
+	"This will reset the knowledge base and sync all files. Do you wish to continue?": "Αυτό θα επαναφέρει τη βάση γνώσης και θα συγχρονίσει όλα τα αρχεία. Θέλετε να συνεχίσετε;",
+	"Thorough explanation": "Λεπτομερής εξήγηση",
+	"Tika": "Tika",
+	"Tika Server URL required.": "Απαιτείται το URL διακομιστή Tika.",
+	"Tiktoken": "Tiktoken",
+	"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Συμβουλή: Ενημερώστε πολλαπλές θέσεις μεταβλητών διαδοχικά πατώντας το πλήκτρο tab στο πεδίο συνομιλίας μετά από κάθε αντικατάσταση.",
+	"Title": "Τίτλος",
+	"Title (e.g. Tell me a fun fact)": "Τίτλος (π.χ. Πες μου ένα διασκεδαστικό γεγονός)",
+	"Title Auto-Generation": "Αυτόματη Γενιά Τίτλων",
+	"Title cannot be an empty string.": "Ο τίτλος δεν μπορεί να είναι κενή συμβολοσειρά.",
+	"Title Generation Prompt": "Προτροπή Δημιουργίας Τίτλου",
+	"TLS": "TLS",
+	"To access the available model names for downloading,": "Για να αποκτήσετε πρόσβαση στα διαθέσιμα ονόματα μοντέλων για λήψη,",
+	"To access the GGUF models available for downloading,": "Για να αποκτήσετε πρόσβαση στα μοντέλα GGUF διαθέσιμα για λήψη,",
+	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Για να αποκτήσετε πρόσβαση στο WebUI, παρακαλώ επικοινωνήστε με τον διαχειριστή. Οι διαχειριστές μπορούν να διαχειριστούν τις καταστάσεις των χρηστών από τον Πίνακα Διαχειριστή.",
+	"To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Για να επισυνάψετε τη βάση γνώσης εδώ, προσθέστε τα πρώτα στο χώρο εργασίας \"Knowledge\".",
+	"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.": "Για να προστατεύσετε την ιδιωτικότητά σας, μόνο οι βαθμολογίες, τα IDs μοντέλων, οι ετικέτες και τα μεταδεδομένα μοιράζονται από την ανατροφοδότησή σας—τα αρχεία συνομιλιών σας παραμένουν ιδιωτικά και δεν περιλαμβάνονται.",
+	"To select actions here, add them to the \"Functions\" workspace first.": "Για να επιλέξετε ενέργειες εδώ, προσθέστε τις πρώτα στο χώρο εργασίας \"Functions\".",
+	"To select filters here, add them to the \"Functions\" workspace first.": "Για να επιλέξετε φίλτρα εδώ, προσθέστε τα πρώτα στο χώρο εργασίας \"Functions\".",
+	"To select toolkits here, add them to the \"Tools\" workspace first.": "Για να επιλέξετε toolkits εδώ, προσθέστε τα πρώτα στο χώρο εργασίας \"Tools\".",
+	"Toast notifications for new updates": "Ειδοποιήσεις Toast για νέες ενημερώσεις",
+	"Today": "Σήμερα",
+	"Toggle settings": "Εναλλαγή ρυθμίσεων",
+	"Toggle sidebar": "Εναλλαγή πλαϊνού μενού",
+	"Token": "Token",
+	"Tokens To Keep On Context Refresh (num_keep)": "Tokens To Keep On Context Refresh (num_keep)",
+	"Too verbose": "Πολύ λεπτομερές",
+	"Tool created successfully": "Το εργαλείο δημιουργήθηκε με επιτυχία",
+	"Tool deleted successfully": "Το εργαλείο διαγράφηκε με επιτυχία",
+	"Tool Description": "Περιγραφή Εργαλείου",
+	"Tool ID": "ID Εργαλείου",
+	"Tool imported successfully": "Το εργαλείο εισήχθη με επιτυχία",
+	"Tool Name": "Όνομα Εργαλείου",
+	"Tool updated successfully": "Το εργαλείο ενημερώθηκε με επιτυχία",
+	"Tools": "Εργαλεία",
+	"Tools Access": "Πρόσβαση Εργαλείων",
+	"Tools are a function calling system with arbitrary code execution": "Τα εργαλεία είναι ένα σύστημα κλήσης λειτουργιών με αυθαίρετη εκτέλεση κώδικα",
+	"Tools have a function calling system that allows arbitrary code execution": "Τα εργαλεία διαθέτουν ένα σύστημα κλήσης λειτουργιών που επιτρέπει την αυθαίρετη εκτέλεση κώδικα",
+	"Tools have a function calling system that allows arbitrary code execution.": "Τα εργαλεία διαθέτουν ένα σύστημα κλήσης λειτουργιών που επιτρέπει την αυθαίρετη εκτέλεση κώδικα.",
+	"Top K": "Top K",
+	"Top P": "Top P",
+	"Transformers": "Transformers",
+	"Trouble accessing Ollama?": "Προβλήματα πρόσβασης στο Ollama?",
+	"TTS Model": "Μοντέλο TTS",
+	"TTS Settings": "Ρυθμίσεις TTS",
+	"TTS Voice": "Φωνή TTS",
+	"Type": "Τύπος",
+	"Type Hugging Face Resolve (Download) URL": "Τύπος URL Ανάλυσης Hugging Face Resolve (Λήψη)",
+	"Uh-oh! There was an issue connecting to {{provider}}.": "Ωχ! Υπήρξε πρόβλημα στη σύνδεση με το {{provider}}.",
+	"UI": "Διεπαφή Χρήστη (UI)",
+	"Unarchive All": "Απο-αρχειοθέτηση Όλων",
+	"Unarchive All Archived Chats": "Απο-αρχειοθέτηση Όλων των Αρχειοθετημένων Συνομιλιών",
+	"Unarchive Chat": "Απο-αρχειοθέτηση Συνομιλίας",
+	"Unlock mysteries": "Ξεκλείδωμα μυστηρίων",
+	"Unpin": "Αφαίρεση καρφίτσματος",
+	"Unravel secrets": "Ξετυλίξτε μυστικά",
+	"Untagged": "Χωρίς Ετικέτες",
+	"Update": "Ενημέρωση",
+	"Update and Copy Link": "Ενημέρωση και Αντιγραφή Συνδέσμου",
+	"Update for the latest features and improvements.": "Ενημέρωση για τις τελευταίες λειτουργίες και βελτιώσεις.",
+	"Update password": "Ενημέρωση κωδικού",
+	"Updated": "Ενημερώθηκε",
+	"Updated at": "Ενημερώθηκε στις",
+	"Updated At": "Ενημερώθηκε στις",
+	"Upload": "Ανέβασμα",
+	"Upload a GGUF model": "Ανέβασμα μοντέλου GGUF",
+	"Upload directory": "Κατάλογος ανεβάσματος",
+	"Upload files": "Ανέβασμα αρχείων",
+	"Upload Files": "Ανέβασμα Αρχείων",
+	"Upload Pipeline": "Ανέβασμα Pipeline",
+	"Upload Progress": "Πρόοδος Ανεβάσματος",
+	"URL": "URL",
+	"URL Mode": "Λειτουργία URL",
+	"Use '#' in the prompt input to load and include your knowledge.": "Χρησιμοποιήστε '#' στην είσοδο προτροπής για φόρτωση και συμπερίληψη της γνώσης σας.",
+	"Use Gravatar": "Χρησιμοποιήστε Gravatar",
+	"Use groups to group your users and assign permissions.": "Χρησιμοποιήστε ομάδες για να ομαδοποιήσετε τους χρήστες σας και να αναθέσετε δικαιώματα.",
+	"Use Initials": "Χρησιμοποιήστε Αρχικά",
+	"use_mlock (Ollama)": "use_mlock (Ollama)",
+	"use_mmap (Ollama)": "use_mmap (Ollama)",
+	"user": "user",
+	"User": "Χρήστης",
+	"User location successfully retrieved.": "Η τοποθεσία του χρήστη ανακτήθηκε με επιτυχία.",
+	"Username": "Όνομα Χρήστη",
+	"Users": "Χρήστες",
+	"Using the default arena model with all models. Click the plus button to add custom models.": "Χρησιμοποιώντας το προεπιλεγμένο μοντέλο arena με όλα τα μοντέλα. Κάντε κλικ στο κουμπί συν για να προσθέσετε προσαρμοσμένα μοντέλα.",
+	"Utilize": "Αξιοποίηση",
+	"Valid time units:": "Έγκυρες μονάδες χρόνου:",
+	"Valves": "Βαλβίδες",
+	"Valves updated": "Οι βαλβίδες ενημερώθηκαν",
+	"Valves updated successfully": "Οι βαλβίδες ενημερώθηκαν με επιτυχία",
+	"variable": "μεταβλητή",
+	"variable to have them replaced with clipboard content.": "μεταβλητή να αντικατασταθούν με το περιεχόμενο του πρόχειρου.",
+	"Version": "Έκδοση",
+	"Version {{selectedVersion}} of {{totalVersions}}": "Έκδοση {{selectedVersion}} από {{totalVersions}}",
+	"Visibility": "Ορατότητα",
+	"Voice": "Φωνή",
+	"Voice Input": "Εισαγωγή Φωνής",
+	"Warning": "Προειδοποίηση",
+	"Warning:": "Προειδοποίηση:",
+	"Warning: Enabling this will allow users to upload arbitrary code on the server.": "Προειδοποίηση: Η ενεργοποίηση αυτού θα επιτρέψει στους χρήστες να ανεβάσουν αυθαίρετο κώδικα στον διακομιστή.",
+	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Προειδοποίηση: Αν ενημερώσετε ή αλλάξετε το μοντέλο ενσωμάτωσής σας, θα χρειαστεί να επαναφέρετε όλα τα έγγραφα.",
+	"Web": "Διαδίκτυο",
+	"Web API": "Web API",
+	"Web Loader Settings": "Ρυθμίσεις Φόρτωσης Web",
+	"Web Search": "Αναζήτηση στο Διαδίκτυο",
+	"Web Search Engine": "Μηχανή Αναζήτησης στο Διαδίκτυο",
+	"Web Search Query Generation": "",
+	"Webhook URL": "URL Webhook",
+	"WebUI Settings": "Ρυθμίσεις WebUI",
+	"WebUI will make requests to \"{{url}}/api/chat\"": "Το WebUI θα κάνει αιτήματα στο \"{{url}}/api/chat\"",
+	"WebUI will make requests to \"{{url}}/chat/completions\"": "Το WebUI θα κάνει αιτήματα στο \"{{url}}/chat/completions\"",
+	"What are you trying to achieve?": "Τι προσπαθείτε να πετύχετε?",
+	"What are you working on?": "Τι εργάζεστε;",
+	"What’s New in": "Τι νέο υπάρχει στο",
+	"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "Όταν ενεργοποιηθεί, το μοντέλο θα ανταποκρίνεται σε κάθε μήνυμα συνομιλίας σε πραγματικό χρόνο, δημιουργώντας μια απάντηση μόλις ο χρήστης στείλει ένα μήνυμα. Αυτή η λειτουργία είναι χρήσιμη για εφαρμογές ζωντανής συνομιλίας, αλλά μπορεί να επηρεάσει την απόδοση σε πιο αργό υλικό.",
+	"wherever you are": "οπουδήποτε βρίσκεστε",
+	"Whisper (Local)": "Whisper (Τοπικό)",
+	"Why?": "Γιατί?",
+	"Widescreen Mode": "Λειτουργία Οθόνης Ευρείας",
+	"Won": "Κέρδισε",
+	"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "Συνεργάζεται μαζί με top-k. Μια υψηλότερη τιμή (π.χ., 0.95) θα οδηγήσει σε πιο ποικίλο κείμενο, ενώ μια χαμηλότερη τιμή (π.χ., 0.5) θα δημιουργήσει πιο εστιασμένο και συντηρητικό κείμενο. (Προεπιλογή: 0.9)",
+	"Workspace": "Χώρος Εργασίας",
+	"Workspace Permissions": "Δικαιώματα Χώρου Εργασίας",
+	"Write a prompt suggestion (e.g. Who are you?)": "Γράψτε μια πρόταση προτροπής (π.χ. Ποιος είσαι;)",
+	"Write a summary in 50 words that summarizes [topic or keyword].": "Γράψτε μια περίληψη σε 50 λέξεις που συνοψίζει [θέμα ή λέξη-κλειδί].",
+	"Write something...": "Γράψτε κάτι...",
+	"Write your model template content here": "Γράψτε το περιεχόμενο του προτύπου μοντέλου σας εδώ",
+	"Yesterday": "Εχθές",
+	"You": "Εσείς",
+	"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Μπορείτε να συνομιλήσετε μόνο με μέγιστο αριθμό {{maxCount}} αρχείου(-ων) ταυτόχρονα.",
+	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Μπορείτε να προσωποποιήσετε τις αλληλεπιδράσεις σας με τα LLMs προσθέτοντας αναμνήσεις μέσω του κουμπιού 'Διαχείριση' παρακάτω, κάνοντάς τα πιο χρήσιμα και προσαρμοσμένα σε εσάς.",
+	"You cannot upload an empty file.": "Δεν μπορείτε να ανεβάσετε ένα κενό αρχείο.",
+	"You do not have permission to upload files.": "Δεν έχετε άδεια να ανεβάσετε αρχεία.",
+	"You have no archived conversations.": "Δεν έχετε αρχειοθετημένες συνομιλίες.",
+	"You have shared this chat": "Έχετε μοιραστεί αυτή τη συνομιλία",
+	"You're a helpful assistant.": "Είστε ένας βοηθητικός βοηθός.",
+	"You're now logged in.": "Τώρα είστε συνδεδεμένοι.",
+	"Your account status is currently pending activation.": "Η κατάσταση του λογαριασμού σας είναι αυτή τη στιγμή σε εκκρεμότητα ενεργοποίησης.",
+	"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "Η ολόκληρη η συνεισφορά σας θα πάει απευθείας στον προγραμματιστή του plugin· το Open WebUI δεν παίρνει κανένα ποσοστό. Ωστόσο, η επιλεγμένη πλατφόρμα χρηματοδότησης μπορεί να έχει τα δικά της τέλη.",
+	"Youtube": "Youtube",
+	"Youtube Loader Settings": "Ρυθμίσεις Φόρτωσης Youtube"
+}

+ 11 - 3
src/lib/i18n/locales/en-GB/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "",
@@ -90,6 +91,8 @@
 	"Authenticate": "",
 	"Auto-Copy Response to Clipboard": "",
 	"Auto-playback response": "",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "",
 	"AUTOMATIC1111 Api Auth String": "",
 	"AUTOMATIC1111 Base URL": "",
@@ -119,6 +122,7 @@
 	"Certificate Path": "",
 	"Change Password": "",
 	"Character": "",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "",
 	"Chat Background Image": "",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "",
 	"Embedding model set to \"{{embedding_model}}\"": "",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "",
-	"Enable Web Search Query Generation": "",
 	"Enabled": "",
 	"Engine": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "",
 	"Enter Scheduler (e.g. Karras)": "",
 	"Enter Score": "",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "",
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
+	"Please select a model first.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "",
 	"Prompts": "",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "",
 	"Pull a model from Ollama.com": "",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "",
 	"RK": "",
 	"Role": "",
@@ -838,6 +844,7 @@
 	"System": "",
 	"System Instructions": "",
 	"System Prompt": "",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "",
@@ -980,6 +987,7 @@
 	"Web Loader Settings": "",
 	"Web Search": "",
 	"Web Search Engine": "",
+	"Web Search Query Generation": "",
 	"Webhook URL": "",
 	"WebUI Settings": "",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",

+ 11 - 3
src/lib/i18n/locales/en-US/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "",
@@ -90,6 +91,8 @@
 	"Authenticate": "",
 	"Auto-Copy Response to Clipboard": "",
 	"Auto-playback response": "",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "",
 	"AUTOMATIC1111 Api Auth String": "",
 	"AUTOMATIC1111 Base URL": "",
@@ -119,6 +122,7 @@
 	"Certificate Path": "",
 	"Change Password": "",
 	"Character": "",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "",
 	"Chat Background Image": "",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "",
 	"Embedding model set to \"{{embedding_model}}\"": "",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "",
-	"Enable Web Search Query Generation": "",
 	"Enabled": "",
 	"Engine": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "",
 	"Enter Scheduler (e.g. Karras)": "",
 	"Enter Score": "",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "",
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
+	"Please select a model first.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "",
 	"Prompts": "",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "",
 	"Pull a model from Ollama.com": "",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "",
 	"RK": "",
 	"Role": "",
@@ -838,6 +844,7 @@
 	"System": "",
 	"System Instructions": "",
 	"System Prompt": "",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "",
@@ -980,6 +987,7 @@
 	"Web Loader Settings": "",
 	"Web Search": "",
 	"Web Search Engine": "",
+	"Web Search Query Generation": "",
 	"Webhook URL": "",
 	"WebUI Settings": "",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",

+ 11 - 3
src/lib/i18n/locales/es-ES/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' o '-1' para evitar expiración.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(p.ej. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(p.ej. `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "",
 	"Auto-Copy Response to Clipboard": "Copiar respuesta automáticamente al portapapeles",
 	"Auto-playback response": "Respuesta de reproducción automática",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "",
 	"AUTOMATIC1111 Api Auth String": "Cadena de autenticación de API",
 	"AUTOMATIC1111 Base URL": "Dirección URL de AUTOMATIC1111",
@@ -119,6 +122,7 @@
 	"Certificate Path": "",
 	"Change Password": "Cambia la Contraseña",
 	"Character": "",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "Chat",
 	"Chat Background Image": "Imágen de fondo del Chat",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "Motor de Modelo de Embedding",
 	"Embedding model set to \"{{embedding_model}}\"": "Modelo de Embedding configurado a \"{{embedding_model}}\"",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "Habilitar el uso compartido de 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.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "Habilitar la calificación de los mensajes",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "Habilitar Nuevos Registros",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "Habilitar la búsqueda web",
-	"Enable Web Search Query Generation": "Habilitar generación de consultas web",
 	"Enabled": "Activado",
 	"Engine": "Motor",
 	"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.",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "Ingrese la etiqueta del modelo (p.ej. {{modelTag}})",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Ingrese el número de pasos (p.ej., 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "Ingrese el sampler (p.ej., Euler a)",
 	"Enter Scheduler (e.g. Karras)": "Ingrese el planificador (p.ej., Karras)",
 	"Enter Score": "Ingrese la puntuación",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "Por favor revise con cuidado los siguientes avisos:",
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "Por favor llene todos los campos.",
+	"Please select a model first.": "",
 	"Please select a reason": "Por favor seleccione una razón",
 	"Port": "",
 	"Positive attitude": "Actitud positiva",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "",
 	"Prompts": "Prompts",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Extraer \"{{searchValue}}\" de Ollama.com",
 	"Pull a model from Ollama.com": "Obtener un modelo de Ollama.com",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Las notificaciones de respuesta no pueden activarse debido a que los permisos del sitio web han sido denegados. Por favor, visite las configuraciones de su navegador para otorgar el acceso necesario.",
 	"Response splitting": "División de respuestas",
 	"Result": "",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "",
 	"RK": "",
 	"Role": "Rol",
@@ -839,6 +845,7 @@
 	"System": "Sistema",
 	"System Instructions": "",
 	"System Prompt": "Prompt del sistema",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "Toca para interrumpir",
@@ -981,6 +988,7 @@
 	"Web Loader Settings": "Web Loader Settings",
 	"Web Search": "Búsqueda en la Web",
 	"Web Search Engine": "Motor de búsqueda web",
+	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "Configuración del WebUI",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",

+ 11 - 3
src/lib/i18n/locales/eu-ES/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' edo '-1' iraungitzerik ez izateko.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(adib. `sh webui.sh --api --api-auth erabiltzaile_pasahitza`)",
 	"(e.g. `sh webui.sh --api`)": "(adib. `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "Autentifikatu",
 	"Auto-Copy Response to Clipboard": "Automatikoki Kopiatu Erantzuna Arbelera",
 	"Auto-playback response": "Automatikoki erreproduzitu erantzuna",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "Automatic1111",
 	"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api Autentifikazio Katea",
 	"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Oinarri URLa",
@@ -119,6 +122,7 @@
 	"Certificate Path": "Ziurtagiriaren Bidea",
 	"Change Password": "Aldatu Pasahitza",
 	"Character": "Karakterea",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "Esploratu muga berriak",
 	"Chat": "Txata",
 	"Chat Background Image": "Txataren Atzeko Irudia",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "Embedding Eredu Motorea",
 	"Embedding model set to \"{{embedding_model}}\"": "Embedding eredua \"{{embedding_model}}\"-ra ezarri da",
 	"Enable API Key Auth": "Gaitu API Gako Autentikazioa",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "Gaitu Komunitatearen Partekatzea",
 	"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.": "Gaitu Memoria Blokeatzea (mlock) ereduaren datuak RAM memoriatik kanpo ez trukatzeko. Aukera honek ereduaren lan-orri multzoa RAMean blokatzen du, diskora ez direla trukatuko ziurtatuz. Honek errendimendua mantentzen lagun dezake, orri-hutsegiteak saihestuz eta datuen sarbide azkarra bermatuz.",
 	"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.": "Gaitu Memoria Mapaketa (mmap) ereduaren datuak kargatzeko. Aukera honek sistemari disko-biltegiratzea RAM memoriaren luzapen gisa erabiltzea ahalbidetzen dio, diskoko fitxategiak RAMean baleude bezala tratatuz. Honek ereduaren errendimendua hobe dezake, datuen sarbide azkarragoa ahalbidetuz. Hala ere, baliteke sistema guztietan behar bezala ez funtzionatzea eta disko-espazio handia kontsumitu dezake.",
 	"Enable Message Rating": "Gaitu Mezuen Balorazioa",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "Gaitu Mirostat laginketa nahasmena kontrolatzeko. (Lehenetsia: 0, 0 = Desgaituta, 1 = Mirostat, 2 = Mirostat 2.0)",
 	"Enable New Sign Ups": "Gaitu Izena Emate Berriak",
-	"Enable Retrieval Query Generation": "Gaitu Berreskuratze Kontsulten Sorkuntza",
-	"Enable Tags Generation": "Gaitu Etiketen Sorkuntza",
 	"Enable Web Search": "Gaitu Web Bilaketa",
-	"Enable Web Search Query Generation": "Gaitu Web Bilaketa Kontsulten Sorkuntza",
 	"Enabled": "Gaituta",
 	"Engine": "Motorea",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Ziurtatu zure CSV fitxategiak 4 zutabe dituela ordena honetan: Izena, Posta elektronikoa, Pasahitza, Rola.",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "Sartu eredu etiketa (adib. {{modelTag}})",
 	"Enter Mojeek Search API Key": "Sartu Mojeek Bilaketa API Gakoa",
 	"Enter Number of Steps (e.g. 50)": "Sartu Urrats Kopurua (adib. 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "Sartu Sampler-a (adib. Euler a)",
 	"Enter Scheduler (e.g. Karras)": "Sartu Planifikatzailea (adib. Karras)",
 	"Enter Score": "Sartu Puntuazioa",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "Mesedez, berrikusi arretaz hurrengo oharrak:",
 	"Please enter a prompt": "Mesedez, sartu prompt bat",
 	"Please fill in all fields.": "Mesedez, bete eremu guztiak.",
+	"Please select a model first.": "",
 	"Please select a reason": "Mesedez, hautatu arrazoi bat",
 	"Port": "Ataka",
 	"Positive attitude": "Jarrera positiboa",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "Prompt-a ongi eguneratu da",
 	"Prompts": "Prompt-ak",
 	"Prompts Access": "Prompt sarbidea",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Ekarri \"{{searchValue}}\" Ollama.com-etik",
 	"Pull a model from Ollama.com": "Ekarri modelo bat Ollama.com-etik",
 	"Query Generation Prompt": "Kontsulta sortzeko prompt-a",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Erantzunen jakinarazpenak ezin dira aktibatu webgunearen baimenak ukatu direlako. Mesedez, bisitatu zure nabigatzailearen ezarpenak beharrezko sarbidea emateko.",
 	"Response splitting": "Erantzun banaketa",
 	"Result": "Emaitza",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "Testu aberastuko sarrera txaterako",
 	"RK": "RK",
 	"Role": "Rola",
@@ -838,6 +844,7 @@
 	"System": "Sistema",
 	"System Instructions": "Sistema jarraibideak",
 	"System Prompt": "Sistema prompta",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "Etiketa sortzeko prompta",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "Isats-libre laginketa erabiltzen da irteran probabilitate txikiagoko tokenen eragina murrizteko. Balio altuago batek (adib., 2.0) eragina gehiago murriztuko du, 1.0 balioak ezarpen hau desgaitzen duen bitartean. (lehenetsia: 1)",
 	"Tap to interrupt": "Ukitu eteteko",
@@ -980,6 +987,7 @@
 	"Web Loader Settings": "Web kargatzailearen ezarpenak",
 	"Web Search": "Web bilaketa",
 	"Web Search Engine": "Web bilaketa motorra",
+	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook URLa",
 	"WebUI Settings": "WebUI ezarpenak",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "WebUI-k eskaerak egingo ditu \"{{url}}/api/chat\"-era",

+ 11 - 3
src/lib/i18n/locales/fa-IR/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' یا '-1' برای غیر فعال کردن انقضا.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(e.g. `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "",
 	"Auto-Copy Response to Clipboard": "کپی خودکار پاسخ به کلیپ بورد",
 	"Auto-playback response": "پخش خودکار پاسخ",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "",
 	"AUTOMATIC1111 Api Auth String": "",
 	"AUTOMATIC1111 Base URL": "پایه URL AUTOMATIC1111 ",
@@ -119,6 +122,7 @@
 	"Certificate Path": "",
 	"Change Password": "تغییر رمز عبور",
 	"Character": "",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "گفتگو",
 	"Chat Background Image": "تصویر پس\u200cزمینهٔ گفتگو",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "محرک مدل پیدائش",
 	"Embedding model set to \"{{embedding_model}}\"": "مدل پیدائش را به \"{{embedding_model}}\" تنظیم کنید",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "فعالسازی اشتراک انجمن",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "فعال کردن ثبت نام\u200cهای جدید",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "فعالسازی جستجوی وب",
-	"Enable Web Search Query Generation": "",
 	"Enabled": "",
 	"Engine": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "اطمینان حاصل کنید که فایل CSV شما شامل چهار ستون در این ترتیب است: نام، ایمیل، رمز عبور، نقش.",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "تگ مدل را وارد کنید (مثلا {{modelTag}})",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "تعداد گام ها را وارد کنید (مثال: 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "",
 	"Enter Scheduler (e.g. Karras)": "",
 	"Enter Score": "امتیاز را وارد کنید",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "",
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
+	"Please select a model first.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "نظرات مثبت",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "",
 	"Prompts": "پرامپت\u200cها",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "بازگرداندن \"{{searchValue}}\" از Ollama.com",
 	"Pull a model from Ollama.com": "دریافت یک مدل از Ollama.com",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "نتیجه",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "",
 	"RK": "",
 	"Role": "نقش",
@@ -838,6 +844,7 @@
 	"System": "سیستم",
 	"System Instructions": "",
 	"System Prompt": "پرامپت سیستم",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "",
@@ -980,6 +987,7 @@
 	"Web Loader Settings": "تنظیمات لودر وب",
 	"Web Search": "جستجوی وب",
 	"Web Search Engine": "موتور جستجوی وب",
+	"Web Search Query Generation": "",
 	"Webhook URL": "نشانی وب\u200cهوک",
 	"WebUI Settings": "تنظیمات WebUI",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",

+ 670 - 663
src/lib/i18n/locales/fi-FI/translation.json

@@ -1,210 +1,213 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "-1 rajoituksetta tai positiivinen kokonaisluku enimmäismääräksi",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' tai '-1' jottei vanhene.",
-	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
+	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(esim. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(esim. `sh webui.sh --api`)",
 	"(latest)": "(uusin)",
 	"{{ models }}": "{{ mallit }}",
 	"{{user}}'s Chats": "{{user}}:n keskustelut",
-	"{{webUIName}} Backend Required": "{{webUIName}} backend vaaditaan",
-	"*Prompt node ID(s) are required for image generation": "",
-	"A new version (v{{LATEST_VERSION}}) is now available.": "",
+	"{{webUIName}} Backend Required": "{{webUIName}}-backend vaaditaan",
+	"*Prompt node ID(s) are required for image generation": "Kuvan luomiseen vaaditaan kehote-solmun ID(t)",
+	"A new version (v{{LATEST_VERSION}}) is now available.": "Uusi versio (v{{LATEST_VERSION}}) on nyt saatavilla.",
 	"A task model is used when performing tasks such as generating titles for chats and web search queries": "Tehtävämallia käytetään tehtävien suorittamiseen, kuten otsikoiden luomiseen keskusteluille ja verkkohakukyselyille",
 	"a user": "käyttäjä",
 	"About": "Tietoja",
-	"Access": "",
-	"Access Control": "",
-	"Accessible to all users": "",
+	"Access": "Pääsy",
+	"Access Control": "Käyttöoikeuksien hallinta",
+	"Accessible to all users": "Käytettävissä kaikille käyttäjille",
 	"Account": "Tili",
-	"Account Activation Pending": "",
-	"Accurate information": "Tarkkaa tietoa",
-	"Actions": "",
-	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "",
-	"Active Users": "",
+	"Account Activation Pending": "Tilin aktivointi odottaa",
+	"Accurate information": "Tarkkaa tietoa", 
+	"Actions": "Toiminnot",
+	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Aktivoi tämä komento kirjoittamalla \"/{{COMMAND}}\" chat-syötteeseen.",
+	"Active Users": "Aktiiviset käyttäjät",
 	"Add": "Lisää",
-	"Add a model ID": "",
+	"Add a model ID": "Lisää mallitunnus",
 	"Add a short description about what this model does": "Lisää lyhyt kuvaus siitä, mitä tämä malli tekee",
 	"Add a tag": "Lisää tagi",
-	"Add Arena Model": "",
-	"Add Connection": "",
-	"Add Content": "",
-	"Add content here": "",
+	"Add Arena Model": "Lisää Arena-malli",
+	"Add Connection": "Lisää yhteys",
+	"Add Content": "Lisää sisältöä",
 	"Add custom prompt": "Lisää mukautettu kehote",
 	"Add Files": "Lisää tiedostoja",
-	"Add Group": "",
+	"Add Group": "Lisää ryhmä",
 	"Add Memory": "Lisää muistia",
-	"Add Model": "Lisää malli",
-	"Add Tag": "",
+	"Add Model": "Lisää malli",
+	"Add Tag": "Lisää tagi",
 	"Add Tags": "Lisää tageja",
-	"Add text content": "",
+	"Add text content": "Lisää tekstisisältöä",
 	"Add User": "Lisää käyttäjä",
-	"Add User Group": "",
+	"Add User Group": "Lisää käyttäjäryhmä",
 	"Adjusting these settings will apply changes universally to all users.": "Näiden asetusten säätäminen vaikuttaa kaikkiin käyttäjiin.",
 	"admin": "hallinta",
-	"Admin": "",
-	"Admin Panel": "Hallintapaneeli",
-	"Admin Settings": "Hallinta-asetukset",
-	"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
+	"Admin": "Ylläpito",
+	"Admin Panel": "Ylläpitopaneeli",
+	"Admin Settings": "Ylläpitoasetukset",
+	"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Ylläpitäjillä on pääsy kaikkiin työkaluihin koko ajan; käyttäjät tarvitsevat työkaluja mallille määritettynä työtilassa.",
 	"Advanced Parameters": "Edistyneet parametrit",
 	"Advanced Params": "Edistyneet parametrit",
-	"All chats": "",
+	"All chats": "Kaikki keskustelut",
 	"All Documents": "Kaikki asiakirjat",
-	"All models deleted successfully": "",
-	"Allow Chat Delete": "",
+	"All models deleted successfully": "Kaikki mallit poistettu onnistuneesti",
+	"Allow Chat Delete": "Salli keskustelujen poisto",
 	"Allow Chat Deletion": "Salli keskustelujen poisto",
-	"Allow Chat Edit": "",
-	"Allow File Upload": "",
-	"Allow non-local voices": "",
-	"Allow Temporary Chat": "",
-	"Allow User Location": "",
-	"Allow Voice Interruption in Call": "",
+	"Allow Chat Edit": "Salli keskustelujen muokkaus",
+	"Allow File Upload": "Salli tiedostojen lataus",
+	"Allow non-local voices": "Salli ei-paikalliset äänet",
+	"Allow Temporary Chat": "Salli väliaikaiset keskustelut",
+	"Allow User Location": "Salli käyttäjän sijainti",
+	"Allow Voice Interruption in Call": "Salli äänen keskeytys puhelussa",
 	"Already have an account?": "Onko sinulla jo tili?",
-	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
-	"Amazing": "",
+	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Vaihtoehto top_p:lle, jolla pyritään varmistamaan laadun ja monipuolisuuden tasapaino. Parametri p edustaa pienintä todennäköisyyttä, jolla token otetaan huomioon suhteessa todennäköisimpään tokeniin. Esimerkiksi p=0.05 ja todennäköisin token todennäköisyydellä 0.9, arvoltaan alle 0.045 olevat logit suodatetaan pois. (Oletus: 0.0)",
+	"Amazing": "Hämmästyttävä",
 	"an assistant": "avustaja",
 	"and": "ja",
-	"and {{COUNT}} more": "",
+	"and {{COUNT}} more": "ja {{COUNT}} muuta",
 	"and create a new shared link.": "ja luo uusi jaettu linkki.",
 	"API Base URL": "APIn perus-URL",
 	"API Key": "API-avain",
 	"API Key created.": "API-avain luotu.",
 	"API keys": "API-avaimet",
-	"Application DN": "",
-	"Application DN Password": "",
-	"applies to all users with the \"user\" role": "",
+	"Application DN": "Sovelluksen DN",
+	"Application DN Password": "Sovelluksen DN-salasana",
+	"applies to all users with the \"user\" role": "koskee kaikkia käyttäjiä, joilla on \"käyttäjä\"-rooli",
 	"April": "huhtikuu",
 	"Archive": "Arkisto",
 	"Archive All Chats": "Arkistoi kaikki keskustelut",
 	"Archived Chats": "Arkistoidut keskustelut",
-	"archived-chat-export": "",
-	"Are you sure you want to unarchive all archived chats?": "",
+	"archived-chat-export": "arkistoitu-keskustelu-vienti",
+	"Are you sure you want to unarchive all archived chats?": "Haluatko varmasti purkaa kaikkien arkistoitujen keskustelujen arkistoinnin?",
 	"Are you sure?": "Oletko varma?",
-	"Arena Models": "",
-	"Artifacts": "",
-	"Ask a question": "",
-	"Assistant": "",
+	"Arena Models": "Arena-mallit",
+	"Artifacts": "Artefaktit",
+	"Ask a question": "Kysyä kysymys",
+	"Assistant": "Avustaja",
 	"Attach file": "Liitä tiedosto",
 	"Attention to detail": "Huomio yksityiskohtiin",
-	"Attribute for Username": "",
+	"Attribute for Username": "Käyttäjänimi-määritämä",
 	"Audio": "Ääni",
 	"August": "elokuu",
-	"Authenticate": "",
-	"Auto-Copy Response to Clipboard": "Vastauksen automaattikopiointi leikepöydälle",
+	"Authenticate": "Todentaa",
+	"Auto-Copy Response to Clipboard": "Kopioi vastaus automaattisesti leikepöydälle",
 	"Auto-playback response": "Soita vastaus automaattisesti",
-	"Automatic1111": "",
-	"AUTOMATIC1111 Api Auth String": "",
+	"Autocomplete Generation": "Automaattisen täydennyksen luonti",
+	"Autocomplete Generation Input Max Length": "Automaattisen täydennyksen syötteen enimmäispituus",
+	"Automatic1111": "Automatic1111",
+	"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 API:n todennusmerkkijono",
 	"AUTOMATIC1111 Base URL": "AUTOMATIC1111-perus-URL",
 	"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111-perus-URL vaaditaan.",
-	"Available list": "",
+	"Available list": "Käytettävissä oleva luettelo",
 	"available!": "saatavilla!",
-	"Awful": "",
-	"Azure AI Speech": "",
-	"Azure Region": "",
+	"Awful": "Kauhea",
+	"Azure AI Speech": "Azure AI Speech",
+	"Azure Region": "Azure-alue",
 	"Back": "Takaisin",
-	"Bad Response": "Epäkelpo vastaus",
+	"Bad Response": "Huono vastaus",
 	"Banners": "Bannerit",
 	"Base Model (From)": "Perusmalli (alkaen)",
-	"Batch Size (num_batch)": "",
+	"Batch Size (num_batch)": "Erän koko (num_batch)",
 	"before": "ennen",
 	"Being lazy": "Oli laiska",
-	"Bing Search V7 Endpoint": "",
-	"Bing Search V7 Subscription Key": "",
+	"Bing Search V7 Endpoint": "Bing Search V7 -päätepisteen osoite",
+	"Bing Search V7 Subscription Key": "Bing Search V7 -tilauskäyttäjäavain",
 	"Brave Search API Key": "Brave Search API -avain",
-	"By {{name}}": "",
+	"By {{name}}": "Tekijä {{name}}",
 	"Bypass SSL verification for Websites": "Ohita SSL-varmennus verkkosivustoille",
-	"Call": "",
-	"Call feature is not supported when using Web STT engine": "",
-	"Camera": "",
+	"Call": "Soitto",
+	"Call feature is not supported when using Web STT engine": "Soittotoimintoa ei tueta käytettäessä web-puheentunnistusmoottoria",
+	"Camera": "Kamera",
 	"Cancel": "Peruuta",
 	"Capabilities": "Ominaisuuksia",
-	"Certificate Path": "",
+	"Certificate Path": "Varmennepolku",
 	"Change Password": "Vaihda salasana",
-	"Character": "",
-	"Chart new frontiers": "",
+	"Character": "Hahmo",
+	"Character limit for autocomplete generation input": "Automaattisen täydennyksen syötteen merkkiraja",
+	"Chart new frontiers": "Kartoita uusia rajapintoja",
 	"Chat": "Keskustelu",
-	"Chat Background Image": "",
+	"Chat Background Image": "Keskustelun taustakuva",
 	"Chat Bubble UI": "Keskustelu-pallojen käyttöliittymä",
-	"Chat Controls": "",
+	"Chat Controls": "Keskustelun hallinta",
 	"Chat direction": "Keskustelun suunta",
-	"Chat Overview": "",
-	"Chat Permissions": "",
-	"Chat Tags Auto-Generation": "",
+	"Chat Overview": "Keskustelun yleiskatsaus",
+	"Chat Permissions": "Keskustelun käyttöoikeudet",
+	"Chat Tags Auto-Generation": "Keskustelutunnisteiden automaattinen luonti",
 	"Chats": "Keskustelut",
 	"Check Again": "Tarkista uudelleen",
 	"Check for updates": "Tarkista päivitykset",
 	"Checking for updates...": "Tarkistetaan päivityksiä...",
 	"Choose a model before saving...": "Valitse malli ennen tallentamista...",
-	"Chunk Overlap": "Osien päällekkäisyys",
+	"Chunk Overlap": "Päällekkäisten osien määrä",
 	"Chunk Params": "Osien parametrit",
 	"Chunk Size": "Osien koko",
-	"Ciphers": "",
-	"Citation": "Sitaatti",
-	"Clear memory": "",
-	"click here": "",
-	"Click here for filter guides.": "",
+	"Ciphers": "Salausalgoritmi",
+	"Citation": "Lähdeviite",
+	"Clear memory": "Tyhjennä muisti",
+	"click here": "klikkaa tästä",
+	"Click here for filter guides.": "Katso suodatinohjeita klikkaamalla tästä.",
 	"Click here for help.": "Klikkaa tästä saadaksesi apua.",
 	"Click here to": "Klikkaa tästä",
-	"Click here to download user import template file.": "",
-	"Click here to learn more about faster-whisper and see the available models.": "",
+	"Click here to download user import template file.": "Lataa käyttäjien tuontipohjatiedosto klikkaamalla tästä.",
+	"Click here to learn more about faster-whisper and see the available models.": "Klikkaa tästä oppiaksesi lisää faster-whisperista ja nähdäksesi saatavilla olevat mallit.",
 	"Click here to select": "Klikkaa tästä valitaksesi",
 	"Click here to select a csv file.": "Klikkaa tästä valitaksesi CSV-tiedosto.",
-	"Click here to select a py file.": "",
-	"Click here to upload a workflow.json file.": "",
+	"Click here to select a py file.": "Klikkaa tästä valitaksesi py-tiedosto.",
+	"Click here to upload a workflow.json file.": "Klikkaa tästä ladataksesi workflow.json-tiedosto.",
 	"click here.": "klikkaa tästä.",
 	"Click on the user role button to change a user's role.": "Klikkaa käyttäjän roolipainiketta vaihtaaksesi käyttäjän roolia.",
-	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
-	"Clone": "Klooni",
+	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Leikepöydälle kirjoitusoikeus evätty. Tarkista selaimesi asetukset ja myönnä tarvittavat käyttöoikeudet.",
+	"Clone": "Kloonaa",
 	"Close": "Sulje",
-	"Code execution": "",
-	"Code formatted successfully": "",
+	"Code execution": "Koodin suorittaminen",
+	"Code formatted successfully": "Koodin muotoilu onnistui",
 	"Collection": "Kokoelma",
-	"Color": "",
+	"Color": "Väri",
 	"ComfyUI": "ComfyUI",
 	"ComfyUI Base URL": "ComfyUI-perus-URL",
 	"ComfyUI Base URL is required.": "ComfyUI-perus-URL vaaditaan.",
-	"ComfyUI Workflow": "",
-	"ComfyUI Workflow Nodes": "",
+	"ComfyUI Workflow": "ComfyUI-työnkulku",
+	"ComfyUI Workflow Nodes": "ComfyUI-työnkulun solmut",
 	"Command": "Komento",
-	"Completions": "",
+	"Completions": "Täydennykset",
 	"Concurrent Requests": "Samanaikaiset pyynnöt",
-	"Configure": "",
-	"Configure Models": "",
-	"Confirm": "",
+	"Configure": "Määritä",
+	"Configure Models": "Määritä malleja",
+	"Confirm": "Vahvista",
 	"Confirm Password": "Vahvista salasana",
-	"Confirm your action": "",
+	"Confirm your action": "Vahvista toimintasi",
 	"Connections": "Yhteydet",
-	"Contact Admin for WebUI Access": "",
+	"Contact Admin for WebUI Access": "Ota yhteyttä ylläpitäjään WebUI-käyttöä varten",
 	"Content": "Sisältö",
-	"Content Extraction": "",
+	"Content Extraction": "Sisällön erottelu",
 	"Context Length": "Kontekstin pituus",
 	"Continue Response": "Jatka vastausta",
-	"Continue with {{provider}}": "",
-	"Continue with Email": "",
-	"Continue with LDAP": "",
-	"Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "",
-	"Controls": "",
-	"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "",
-	"Copied": "",
+	"Continue with {{provider}}": "Jatka palvelulla {{provider}}",
+	"Continue with Email": "Jatka sähköpostilla",
+	"Continue with LDAP": "Jatka LDAP:illa",
+	"Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "Säädä, miten viestin teksti jaetaan puhesynteesipyyntöjä varten. 'Välimerkit' jakaa lauseisiin, 'kappaleet' jakaa kappaleisiin ja 'ei mitään' pitää viestin yhtenä merkkijonona.",
+	"Controls": "Ohjaimet",
+	"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "Säätelee tulosteen yhtenäisyyden ja monimuotoisuuden välistä tasapainoa. Alhaisempi arvo tuottaa keskittyneempää ja yhtenäisempää tekstiä. (Oletus: 5.0)",
+	"Copied": "Kopioitu",
 	"Copied shared chat URL to clipboard!": "Jaettu keskustelulinkki kopioitu leikepöydälle!",
-	"Copied to clipboard": "",
+	"Copied to clipboard": "Kopioitu leikepöydälle",
 	"Copy": "Kopioi",
 	"Copy last code block": "Kopioi viimeisin koodilohko",
 	"Copy last response": "Kopioi viimeisin vastaus",
 	"Copy Link": "Kopioi linkki",
-	"Copy to clipboard": "",
+	"Copy to clipboard": "Kopioi leikepöydälle",
 	"Copying to clipboard was successful!": "Kopioiminen leikepöydälle onnistui!",
-	"Create": "",
-	"Create a knowledge base": "",
-	"Create a model": "Mallin luominen",
+	"Create": "Luo",
+	"Create a knowledge base": "Luo tietokanta",
+	"Create a model": "Luo malli",
 	"Create Account": "Luo tili",
-	"Create Admin Account": "",
-	"Create Group": "",
-	"Create Knowledge": "",
+	"Create Admin Account": "Luo ylläpitäjätili",
+	"Create Group": "Luo ryhmä",
+	"Create Knowledge": "Luo tietoa",
 	"Create new key": "Luo uusi avain",
 	"Create new secret key": "Luo uusi salainen avain",
 	"Created at": "Luotu",
 	"Created At": "Luotu",
-	"Created by": "",
-	"CSV Import": "",
+	"Created by": "Luonut",
+	"CSV Import": "CSV-tuonti",
 	"Current Model": "Nykyinen malli",
 	"Current Password": "Nykyinen salasana",
 	"Custom": "Mukautettu",
@@ -212,806 +215,810 @@
 	"Database": "Tietokanta",
 	"December": "joulukuu",
 	"Default": "Oletus",
-	"Default (Open AI)": "",
+	"Default (Open AI)": "Oletus (Open AI)",
 	"Default (SentenceTransformers)": "Oletus (SentenceTransformers)",
 	"Default Model": "Oletusmalli",
 	"Default model updated": "Oletusmalli päivitetty",
-	"Default Models": "",
-	"Default permissions": "",
-	"Default permissions updated successfully": "",
+	"Default Models": "Oletusmallit",
+	"Default permissions": "Oletuskäyttöoikeudet",
+	"Default permissions updated successfully": "Oletuskäyttöoikeudet päivitetty onnistuneesti",
 	"Default Prompt Suggestions": "Oletuskehotteiden ehdotukset",
-	"Default to 389 or 636 if TLS is enabled": "",
-	"Default to ALL": "",
+	"Default to 389 or 636 if TLS is enabled": "Oletus 389 tai 636, jos TLS on käytössä",
+	"Default to ALL": "Oletus KAIKKI",
 	"Default User Role": "Oletuskäyttäjärooli",
 	"Delete": "Poista",
 	"Delete a model": "Poista malli",
 	"Delete All Chats": "Poista kaikki keskustelut",
-	"Delete All Models": "",
+	"Delete All Models": "Poista kaikki mallit",
 	"Delete chat": "Poista keskustelu",
 	"Delete Chat": "Poista keskustelu",
-	"Delete chat?": "",
-	"Delete folder?": "",
-	"Delete function?": "",
-	"Delete prompt?": "",
+	"Delete chat?": "Haluatko varmasti poistaa tämän keskustelun?",
+	"Delete folder?": "Haluatko varmasti poistaa tämän kansion?",
+	"Delete function?": "Haluatko varmasti poistaa tämän toiminnon?",
+	"Delete prompt?": "Haluatko varmasti poistaa tämän kehotteen?",
 	"delete this link": "poista tämä linkki",
-	"Delete tool?": "",
+	"Delete tool?": "Haluatko varmasti poistaa tämän työkalun?",
 	"Delete User": "Poista käyttäjä",
 	"Deleted {{deleteModelTag}}": "Poistettu {{deleteModelTag}}",
 	"Deleted {{name}}": "Poistettu {{nimi}}",
-	"Deleted User": "",
-	"Describe your knowledge base and objectives": "",
+	"Deleted User": "Käyttäjä poistettu",
+	"Describe your knowledge base and objectives": "Kuvaa tietokantasi ja tavoitteesi",
 	"Description": "Kuvaus",
 	"Didn't fully follow instructions": "Ei noudattanut ohjeita täysin",
-	"Disabled": "",
-	"Discover a function": "",
+	"Disabled": "Ei käytössä",
+	"Discover a function": "Löydä toiminto",
 	"Discover a model": "Tutustu malliin",
 	"Discover a prompt": "Löydä kehote",
-	"Discover a tool": "",
-	"Discover wonders": "",
-	"Discover, download, and explore custom functions": "",
+	"Discover a tool": "Löydä työkalu",
+	"Discover wonders": "Löydä ihmeellisiä asioita",
+	"Discover, download, and explore custom functions": "Etsi, lataa ja tutki mukautettuja toimintoja",
 	"Discover, download, and explore custom prompts": "Löydä ja lataa mukautettuja kehotteita",
-	"Discover, download, and explore custom tools": "",
+	"Discover, download, and explore custom tools": "Etsi, lataa ja tutki mukautettuja työkaluja",
 	"Discover, download, and explore model presets": "Löydä ja lataa mallien esiasetuksia",
-	"Dismissible": "",
-	"Display": "",
-	"Display Emoji in Call": "",
-	"Display the username instead of You in the Chat": "Näytä käyttäjänimi keskustelussa",
-	"Displays citations in the response": "",
-	"Dive into knowledge": "",
-	"Do not install functions from sources you do not fully trust.": "",
-	"Do not install tools from sources you do not fully trust.": "",
+	"Dismissible": "Ohitettavissa",
+	"Display": "Näytä",
+	"Display Emoji in Call": "Näytä hymiöitä puhelussa",
+	"Display the username instead of You in the Chat": "Näytä käyttäjänimi keskustelussa \"Sinä\" -tekstin sijaan",
+	"Displays citations in the response": "Näyttää lähdeviitteet vastauksessa",
+	"Dive into knowledge": "Uppoudu tietoon",
+	"Do not install functions from sources you do not fully trust.": "Älä asenna toimintoja lähteistä, joihin et luota täysin.",
+	"Do not install tools from sources you do not fully trust.": "Älä asenna työkaluja lähteistä, joihin et luota täysin.",
 	"Document": "Asiakirja",
-	"Documentation": "",
+	"Documentation": "Dokumentaatio",
 	"Documents": "Asiakirjat",
 	"does not make any external connections, and your data stays securely on your locally hosted server.": "ei tee ulkoisia yhteyksiä, ja tietosi pysyvät turvallisesti paikallisesti isännöidyllä palvelimellasi.",
 	"Don't have an account?": "Eikö sinulla ole tiliä?",
-	"don't install random functions from sources you don't trust.": "",
-	"don't install random tools from sources you don't trust.": "",
+	"don't install random functions from sources you don't trust.": "älä asenna satunnaisia toimintoja lähteistä, joihin et luota.",
+	"don't install random tools from sources you don't trust.": "älä asenna satunnaisia työkaluja lähteistä, joihin et luota.",
 	"Don't like the style": "En pidä tyylistä",
-	"Done": "",
+	"Done": "Valmis",
 	"Download": "Lataa",
 	"Download canceled": "Lataus peruutettu",
 	"Download Database": "Lataa tietokanta",
-	"Drag and drop a file to upload or select a file to view": "",
-	"Draw": "",
+	"Drag and drop a file to upload or select a file to view": "Raahaa ja pudota tiedosto ladattavaksi tai valitse tiedosto katseltavaksi",
+	"Draw": "Piirros",
 	"Drop any files here to add to the conversation": "Pudota tiedostoja tähän lisätäksesi ne keskusteluun",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "esim. '30s', '10m'. Kelpoiset aikayksiköt ovat 's', 'm', 'h'.",
-	"e.g. A filter to remove profanity from text": "",
-	"e.g. My Filter": "",
-	"e.g. My Tools": "",
-	"e.g. my_filter": "",
-	"e.g. my_tools": "",
-	"e.g. Tools for performing various operations": "",
+	"e.g. A filter to remove profanity from text": "esim. suodatin, joka poistaa kirosanoja tekstistä",
+	"e.g. My Filter": "esim. Oma suodatin",
+	"e.g. My Tools": "esim. Omat työkalut",
+	"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",
 	"Edit": "Muokkaa",
-	"Edit Arena Model": "",
-	"Edit Connection": "",
-	"Edit Default Permissions": "",
-	"Edit Memory": "",
+	"Edit Arena Model": "Muokkaa Arena-mallia",
+	"Edit Connection": "Muokkaa yhteyttä",
+	"Edit Default Permissions": "Muokkaa oletuskäyttöoikeuksia",
+	"Edit Memory": "Muokkaa muistia",
 	"Edit User": "Muokkaa käyttäjää",
-	"Edit User Group": "",
-	"ElevenLabs": "",
+	"Edit User Group": "Muokkaa käyttäjäryhmää",
+	"ElevenLabs": "ElevenLabs",
 	"Email": "Sähköposti",
-	"Embark on adventures": "",
-	"Embedding Batch Size": "",
+	"Embark on adventures": "Lähde seikkailuille",
+	"Embedding Batch Size": "Upotuksen eräkoko",
 	"Embedding Model": "Upotusmalli",
 	"Embedding Model Engine": "Upotusmallin moottori",
 	"Embedding model set to \"{{embedding_model}}\"": "\"{{embedding_model}}\" valittu upotusmalliksi",
-	"Enable API Key Auth": "",
+	"Enable API Key Auth": "Ota API-avaimen todentaminen käyttöön",
+	"Enable autocomplete generation for chat messages": "Ota automaattinen täydennys käyttöön keskusteluviesteissä",
 	"Enable Community Sharing": "Ota yhteisön jakaminen käyttöön",
-	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
-	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
-	"Enable Message Rating": "",
-	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
+	"Enable 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.": "Ota Memory Locking (mlock) käyttöön estääksesi mallidatan vaihtamisen pois RAM-muistista. Tämä lukitsee mallin työsivut RAM-muistiin, varmistaen että niitä ei vaihdeta levylle. Tämä voi parantaa suorituskykyä välttämällä sivuvikoja ja varmistamalla nopean tietojen käytön.",
+	"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.": "Ota Memory Mapping (mmap) käyttöön ladataksesi mallidataa. Tämä vaihtoehto sallii järjestelmän käyttää levytilaa RAM-laajennuksena käsittelemällä levytiedostoja kuin ne olisivat RAM-muistissa. Tämä voi parantaa mallin suorituskykyä sallimalla nopeamman tietojen käytön. Kuitenkin se ei välttämättä toimi oikein kaikissa järjestelmissä ja voi kuluttaa huomattavasti levytilaa.",
+	"Enable Message Rating": "Ota viestiarviointi käyttöön",
+	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "Ota Mirostat-näytteenotto käyttöön hallinnan monimerkityksellisyydelle. (Oletus: 0, 0 = Ei käytössä, 1 = Mirostat, 2 = Mirostat 2.0)",
 	"Enable New Sign Ups": "Salli uudet rekisteröitymiset",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "Ota verkkohaku käyttöön",
-	"Enable Web Search Query Generation": "",
-	"Enabled": "",
-	"Engine": "",
-	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Varmista, että CSV-tiedostossasi on 4 saraketta seuraavassa järjestyksessä: Nimi, Sähköposti, Salasana, Rooli.",
-	"Enter {{role}} message here": "Kirjoita {{role}} viesti tähän",
-	"Enter a detail about yourself for your LLMs to recall": "Kirjoita tieto itseestäsi LLM:ien muistamiseksi",
-	"Enter api auth string (e.g. username:password)": "",
-	"Enter Application DN": "",
-	"Enter Application DN Password": "",
-	"Enter Bing Search V7 Endpoint": "",
-	"Enter Bing Search V7 Subscription Key": "",
-	"Enter Brave Search API Key": "Anna Brave Search API -avain",
-	"Enter certificate path": "",
-	"Enter CFG Scale (e.g. 7.0)": "",
+	"Enabled": "Käytössä",
+	"Engine": "Moottori",
+	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Varmista, että CSV-tiedostossasi on 4 saraketta tässä järjestyksessä: Nimi, Sähköposti, Salasana, Rooli.",
+	"Enter {{role}} message here": "Kirjoita {{role}}-viesti tähän",
+	"Enter a detail about yourself for your LLMs to recall": "Kirjoita yksityiskohta itsestäsi, jonka LLM-ohjelmat voivat muistaa",
+	"Enter api auth string (e.g. username:password)": "Kirjoita API-todennusmerkkijono (esim. käyttäjätunnus:salasana)",
+	"Enter Application DN": "Kirjoita sovelluksen DN",
+	"Enter Application DN Password": "Kirjoita sovelluksen DN-salasana",
+	"Enter Bing Search V7 Endpoint": "Kirjoita Bing Search V7 -päätepisteen osoite",
+	"Enter Bing Search V7 Subscription Key": "Kirjoita Bing Search V7 -tilauskäyttäjäavain",
+	"Enter Brave Search API Key": "Kirjoita Brave Search API -avain",
+	"Enter certificate path": "Kirjoita varmennepolku",
+	"Enter CFG Scale (e.g. 7.0)": "Kirjoita CFG-mitta (esim. 7.0)",
 	"Enter Chunk Overlap": "Syötä osien päällekkäisyys",
 	"Enter Chunk Size": "Syötä osien koko",
-	"Enter description": "",
-	"Enter Github Raw URL": "Kirjoita Github Raw URL-osoite",
-	"Enter Google PSE API Key": "Anna Google PSE API -avain",
-	"Enter Google PSE Engine Id": "Anna Google PSE -moottorin tunnus",
-	"Enter Image Size (e.g. 512x512)": "Syötä kuvan koko (esim. 512x512)",
-	"Enter Jina API Key": "",
-	"Enter language codes": "Syötä kielikoodit",
-	"Enter Model ID": "",
-	"Enter model tag (e.g. {{modelTag}})": "Syötä mallitagi (esim. {{modelTag}})",
-	"Enter Mojeek Search API Key": "",
-	"Enter Number of Steps (e.g. 50)": "Syötä askelien määrä (esim. 50)",
-	"Enter Sampler (e.g. Euler a)": "",
-	"Enter Scheduler (e.g. Karras)": "",
-	"Enter Score": "Syötä pisteet",
-	"Enter SearchApi API Key": "",
-	"Enter SearchApi Engine": "",
+	"Enter description": "Kirjoita kuvaus",
+	"Enter Github Raw URL": "Kirjoita Github Raw -URL-osoite",
+	"Enter Google PSE API Key": "Kirjoita Google PSE API -avain",
+	"Enter Google PSE Engine Id": "Kirjoita Google PSE -moottorin tunnus",
+	"Enter Image Size (e.g. 512x512)": "Kirjoita kuvan koko (esim. 512x512)",
+	"Enter Jina API Key": "Kirjoita Jina API -avain",
+	"Enter language codes": "Kirjoita kielikoodit",
+	"Enter Model ID": "Kirjoita mallitunnus",
+	"Enter model tag (e.g. {{modelTag}})": "Kirjoita mallitagi (esim. {{modelTag}})",
+	"Enter Mojeek Search API Key": "Kirjoita Mojeek Search API -avain",
+	"Enter Number of Steps (e.g. 50)": "Kirjoita askelten määrä (esim. 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "Kirjoita välityspalvelimen URL-osoite (esim. https://käyttäjä:salasana@host:portti)",
+	"Enter Sampler (e.g. Euler a)": "Kirjoita näytteistäjä (esim. Euler a)",
+	"Enter Scheduler (e.g. Karras)": "Kirjoita ajoitin (esim. Karras)",
+	"Enter Score": "Kirjoita pistemäärä",
+	"Enter SearchApi API Key": "Kirjoita SearchApi API -avain",
+	"Enter SearchApi Engine": "Kirjoita SearchApi-moottori",
 	"Enter Searxng Query URL": "Kirjoita Searxng-kyselyn URL-osoite",
-	"Enter Seed": "",
-	"Enter Serper API Key": "Anna Serper API -avain",
-	"Enter Serply API Key": "",
-	"Enter Serpstack API Key": "Anna Serpstack API -avain",
-	"Enter server host": "",
-	"Enter server label": "",
-	"Enter server port": "",
-	"Enter stop sequence": "Syötä lopetussekvenssi",
-	"Enter system prompt": "",
-	"Enter Tavily API Key": "",
-	"Enter Tika Server URL": "",
-	"Enter Top K": "Syötä Top K",
-	"Enter URL (e.g. http://127.0.0.1:7860/)": "Syötä URL (esim. http://127.0.0.1:7860/)",
-	"Enter URL (e.g. http://localhost:11434)": "Syötä URL (esim. http://localhost:11434)",
-	"Enter Your Email": "Syötä sähköpostiosoitteesi",
-	"Enter Your Full Name": "Syötä koko nimesi",
-	"Enter your message": "",
-	"Enter Your Password": "Syötä salasanasi",
-	"Enter Your Role": "Syötä roolisi",
-	"Enter Your Username": "",
+	"Enter Seed": "Kirjoita siemenluku",
+	"Enter Serper API Key": "Kirjoita Serper API -avain",
+	"Enter Serply API Key": "Kirjoita Serply API -avain",
+	"Enter Serpstack API Key": "Kirjoita Serpstack API -avain",
+	"Enter server host": "Kirjoita palvelimen isäntänimi",
+	"Enter server label": "Kirjoita palvelimen tunniste",
+	"Enter server port": "Kirjoita palvelimen portti",
+	"Enter stop sequence": "Kirjoita lopetussekvenssi",
+	"Enter system prompt": "Kirjoita järjestelmäkehote",
+	"Enter Tavily API Key": "Kirjoita Tavily API -avain",
+	"Enter Tika Server URL": "Kirjoita Tika Server URL",
+	"Enter Top K": "Kirjoita Top K",
+	"Enter URL (e.g. http://127.0.0.1:7860/)": "Kirjoita URL-osoite (esim. http://127.0.0.1:7860/)",
+	"Enter URL (e.g. http://localhost:11434)": "Kirjoita URL-osoite (esim. http://localhost:11434)",
+	"Enter Your Email": "Kirjoita sähköpostiosoitteesi",
+	"Enter Your Full Name": "Kirjoita koko nimesi",
+	"Enter your message": "Kirjoita viestisi",
+	"Enter Your Password": "Kirjoita salasanasi",
+	"Enter Your Role": "Kirjoita roolisi",
+	"Enter Your Username": "Kirjoita käyttäjätunnuksesi",
 	"Error": "Virhe",
-	"ERROR": "",
-	"Evaluations": "",
-	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
-	"Example: ALL": "",
-	"Example: ou=users,dc=foo,dc=example": "",
-	"Example: sAMAccountName or uid or userPrincipalName": "",
-	"Exclude": "",
+	"ERROR": "VIRHE",
+	"Evaluations": "Arvioinnit",
+	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Esimerkki: (&(objectClass=inetOrgPerson)(uid=%s))",
+	"Example: ALL": "Esimerkki: KAIKKI",
+	"Example: ou=users,dc=foo,dc=example": "Esimerkki: ou=käyttäjät,dc=foo,dc=example",
+	"Example: sAMAccountName or uid or userPrincipalName": "Esimerkki: sAMAccountName tai uid tai userPrincipalName",
+	"Exclude": "Jätä pois",
 	"Experimental": "Kokeellinen",
-	"Explore the cosmos": "",
-	"Export": "Vienti",
-	"Export All Archived Chats": "",
+	"Explore the cosmos": "Tutki avaruutta",
+	"Export": "Vie",
+	"Export All Archived Chats": "Vie kaikki arkistoidut keskustelut",
 	"Export All Chats (All Users)": "Vie kaikki keskustelut (kaikki käyttäjät)",
-	"Export chat (.json)": "",
+	"Export chat (.json)": "Vie keskustelu (.json)",
 	"Export Chats": "Vie keskustelut",
-	"Export Config to JSON File": "",
-	"Export Functions": "",
+	"Export Config to JSON File": "Vie asetukset JSON-tiedostoon",
+	"Export Functions": "Vie toiminnot",
 	"Export Models": "Vie malleja",
-	"Export Presets": "",
+	"Export Presets": "Vie esiasetukset",
 	"Export Prompts": "Vie kehotteet",
-	"Export to CSV": "",
-	"Export Tools": "",
-	"External Models": "",
-	"Failed to add file.": "",
+	"Export to CSV": "Vie CSV-tiedostoon",
+	"Export Tools": "Vie työkalut",
+	"External Models": "Ulkoiset mallit",
+	"Failed to add file.": "Tiedoston lisääminen epäonnistui.",
 	"Failed to create API Key.": "API-avaimen luonti epäonnistui.",
 	"Failed to read clipboard contents": "Leikepöydän sisällön lukeminen epäonnistui",
-	"Failed to save models configuration": "",
-	"Failed to update settings": "",
-	"Failed to upload file.": "",
+	"Failed to save models configuration": "Mallien määrityksen tallentaminen epäonnistui",
+	"Failed to update settings": "Asetusten päivittäminen epäonnistui",
+	"Failed to upload file.": "Tiedoston lataaminen epäonnistui.",
 	"February": "helmikuu",
-	"Feedback History": "",
-	"Feedbacks": "",
+	"Feedback History": "Palautehistoria",
+	"Feedbacks": "Palautteet",
 	"Feel free to add specific details": "Voit lisätä tarkempia tietoja",
-	"File": "",
-	"File added successfully.": "",
-	"File content updated successfully.": "",
+	"File": "Tiedosto",
+	"File added successfully.": "Tiedosto lisätty onnistuneesti.",
+	"File content updated successfully.": "Tiedoston sisältö päivitetty onnistuneesti.",
 	"File Mode": "Tiedostotila",
 	"File not found.": "Tiedostoa ei löytynyt.",
-	"File removed successfully.": "",
-	"File size should not exceed {{maxSize}} MB.": "",
-	"Files": "",
-	"Filter is now globally disabled": "",
-	"Filter is now globally enabled": "",
-	"Filters": "",
-	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Sormenjäljen väärentäminen havaittu: Ei voi käyttää alkukirjaimia avatarina. Käytetään oletusprofiilikuvaa.",
+	"File removed successfully.": "Tiedosto poistettu onnistuneesti.",
+	"File size should not exceed {{maxSize}} MB.": "Tiedoston koko ei saa ylittää {{maxSize}} MB.",
+	"Files": "Tiedostot",
+	"Filter is now globally disabled": "Suodatin on nyt poistettu käytöstä globaalisti",
+	"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.",
 	"Fluidly stream large external response chunks": "Virtaa suuria ulkoisia vastausosia joustavasti",
 	"Focus chat input": "Fokusoi syöttökenttään",
-	"Folder deleted successfully": "",
-	"Folder name cannot be empty": "",
-	"Folder name cannot be empty.": "",
-	"Folder name updated successfully": "",
+	"Folder deleted successfully": "Kansio poistettu onnistuneesti",
+	"Folder name cannot be empty": "Kansion nimi ei voi olla tyhjä",
+	"Folder name cannot be empty.": "Kansion nimi ei voi olla tyhjä.",
+	"Folder name updated successfully": "Kansion nimi päivitetty onnistuneesti",
 	"Followed instructions perfectly": "Noudatti ohjeita täydellisesti",
-	"Forge new paths": "",
-	"Form": "",
-	"Format your variables using brackets like this:": "",
+	"Forge new paths": "Luo uusia polkuja",
+	"Form": "Lomake",
+	"Format your variables using brackets like this:": "Muotoile muuttujasi hakasulkeilla tällä tavalla:",
 	"Frequency Penalty": "Taajuussakko",
-	"Function": "",
-	"Function created successfully": "",
-	"Function deleted successfully": "",
-	"Function Description": "",
-	"Function ID": "",
-	"Function is now globally disabled": "",
-	"Function is now globally enabled": "",
-	"Function Name": "",
-	"Function updated successfully": "",
-	"Functions": "",
-	"Functions allow arbitrary code execution": "",
-	"Functions allow arbitrary code execution.": "",
-	"Functions imported successfully": "",
+	"Function": "Toiminto",
+	"Function created successfully": "Toiminto luotu onnistuneesti",
+	"Function deleted successfully": "Toiminto poistettu onnistuneesti",
+	"Function Description": "Toiminnon kuvaus",
+	"Function ID": "Toiminnon tunnus",
+	"Function is now globally disabled": "Toiminto on nyt poistettu käytöstä globaalisti",
+	"Function is now globally enabled": "Toiminto on nyt otettu käyttöön globaalisti",
+	"Function Name": "Toiminnon nimi",
+	"Function updated successfully": "Toiminto päivitetty onnistuneesti",
+	"Functions": "Toiminnot",
+	"Functions allow arbitrary code execution": "Toiminnot sallivat mielivaltaisen koodin suorittamisen",
+	"Functions allow arbitrary code execution.": "Toiminnot sallivat mielivaltaisen koodin suorittamisen.",
+	"Functions imported successfully": "Toiminnot tuotu onnistuneesti",
 	"General": "Yleinen",
-	"General Settings": "Yleisasetukset",
-	"Generate Image": "",
-	"Generating search query": "Hakukyselyn luominen",
+	"General Settings": "Yleiset asetukset",
+	"Generate Image": "Luo kuva",
+	"Generating search query": "Luodaan hakukyselyä",
 	"Generation Info": "Generointitiedot",
-	"Get started": "",
-	"Get started with {{WEBUI_NAME}}": "",
-	"Global": "",
+	"Get started": "Aloita",
+	"Get started with {{WEBUI_NAME}}": "Aloita käyttämään {{WEBUI_NAME}}:iä",
+	"Global": "Yleinen",
 	"Good Response": "Hyvä vastaus",
 	"Google PSE API Key": "Google PSE API -avain",
-	"Google PSE Engine Id": "Google PSE -moduulin tunnus",
-	"Group created successfully": "",
-	"Group deleted successfully": "",
-	"Group Description": "",
-	"Group Name": "",
-	"Group updated successfully": "",
-	"Groups": "",
+	"Google PSE Engine Id": "Google PSE -moottorin tunnus",
+	"Group created successfully": "Ryhmä luotu onnistuneesti",
+	"Group deleted successfully": "Ryhmä poistettu onnistuneesti",
+	"Group Description": "Ryhmän kuvaus",
+	"Group Name": "Ryhmän nimi",
+	"Group updated successfully": "Ryhmä päivitetty onnistuneesti",
+	"Groups": "Ryhmät",
 	"h:mm a": "h:mm a",
-	"Haptic Feedback": "",
+	"Haptic Feedback": "Haptinen palaute",
 	"has no conversations.": "ei ole keskusteluja.",
-	"Hello, {{name}}": "Terve, {{name}}",
-	"Help": "Apua",
-	"Help us create the best community leaderboard by sharing your feedback history!": "",
-	"Hex Color": "",
-	"Hex Color - Leave empty for default color": "",
+	"Hello, {{name}}": "Hei, {{name}}",
+	"Help": "Ohje",
+	"Help us create the best community leaderboard by sharing your feedback history!": "Auta meitä luomaan paras yhteisön tulosluettelo jakamalla palautehistoriasi!",
+	"Hex Color": "Heksadesimaaliväri",
+	"Hex Color - Leave empty for default color": "Heksadesimaaliväri - Jätä tyhjäksi, jos haluat oletusvärin",
 	"Hide": "Piilota",
-	"Host": "",
-	"How can I help you today?": "Kuinka voin auttaa tänään?",
-	"How would you rate this response?": "",
+	"Host": "Palvelin",
+	"How can I help you today?": "Miten voin auttaa sinua tänään?",
+	"How would you rate this response?": "Kuinka arvioisit tätä vastausta?",
 	"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.": "",
-	"ID": "",
-	"Ignite curiosity": "",
+	"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",
+	"Ignite curiosity": "Sytytä uteliaisuus",
 	"Image Generation (Experimental)": "Kuvagenerointi (kokeellinen)",
 	"Image Generation Engine": "Kuvagenerointimoottori",
 	"Image Settings": "Kuva-asetukset",
 	"Images": "Kuvat",
 	"Import Chats": "Tuo keskustelut",
-	"Import Config from JSON File": "",
-	"Import Functions": "",
-	"Import Models": "Mallien tuominen",
-	"Import Presets": "",
-	"Import Prompts": "Tuo kehotteita",
-	"Import Tools": "",
-	"Include": "",
-	"Include `--api-auth` flag when running stable-diffusion-webui": "",
-	"Include `--api` flag when running stable-diffusion-webui": "Sisällytä `--api`-parametri suorittaessasi stable-diffusion-webui",
-	"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive. (Default: 0.1)": "",
-	"Info": "Info",
-	"Input commands": "Syötä komennot",
-	"Install from Github URL": "Asenna Githubin URL-osoitteesta",
-	"Instant Auto-Send After Voice Transcription": "",
+	"Import Config from JSON File": "Tuo asetukset JSON-tiedostosta",
+	"Import Functions": "Tuo toiminnot",
+	"Import Models": "Tuo malleja",
+	"Import Presets": "Tuo esiasetuksia",
+	"Import Prompts": "Tuo kehotteet",
+	"Import Tools": "Tuo työkalut",
+	"Include": "Sisällytä",
+	"Include `--api-auth` flag when running stable-diffusion-webui": "Sisällytä `--api-auth`-lippu ajettaessa stable-diffusion-webui",
+	"Include `--api` flag when running stable-diffusion-webui": "Sisällytä `--api`-lippu ajettaessa stable-diffusion-webui",
+	"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive. (Default: 0.1)": "Vaikuttaa siihen, kuinka nopeasti algoritmi reagoi tuotetusta tekstistä saatuun palautteeseen. Alhaisempi oppimisaste johtaa hitaampiin säätöihin, kun taas korkeampi oppimisaste tekee algoritmista reaktiivisemman. (Oletus: 0.1)",
+	"Info": "Tiedot",
+	"Input commands": "Syötekäskyt",
+	"Install from Github URL": "Asenna Github-URL:stä",
+	"Instant Auto-Send After Voice Transcription": "Heti automaattinen lähetys äänitunnistuksen jälkeen",
 	"Interface": "Käyttöliittymä",
-	"Invalid file format.": "",
+	"Invalid file format.": "Virheellinen tiedostomuoto.",
 	"Invalid Tag": "Virheellinen tagi",
 	"January": "tammikuu",
-	"Jina API Key": "",
+	"Jina API Key": "Jina API -avain",
 	"join our Discord for help.": "liity Discordiimme saadaksesi apua.",
 	"JSON": "JSON",
 	"JSON Preview": "JSON-esikatselu",
 	"July": "heinäkuu",
 	"June": "kesäkuu",
-	"JWT Expiration": "JWT:n vanheneminen",
+	"JWT Expiration": "JWT-vanheneminen",
 	"JWT Token": "JWT-token",
 	"Keep Alive": "Pysy aktiivisena",
-	"Key": "",
+	"Key": "Avain",
 	"Keyboard shortcuts": "Pikanäppäimet",
-	"Knowledge": "",
-	"Knowledge Access": "",
-	"Knowledge created successfully.": "",
-	"Knowledge deleted successfully.": "",
-	"Knowledge reset successfully.": "",
-	"Knowledge updated successfully": "",
-	"Label": "",
-	"Landing Page Mode": "",
+	"Knowledge": "Tietämys",
+	"Knowledge Access": "Tiedon käyttöoikeus",
+	"Knowledge created successfully.": "Tietokanta luotu onnistuneesti.",
+	"Knowledge deleted successfully.": "Tietokanta poistettu onnistuneesti.",
+	"Knowledge reset successfully.": "Tietokanta nollattu onnistuneesti.",
+	"Knowledge updated successfully": "Tietokanta päivitetty onnistuneesti",
+	"Label": "Tunniste",
+	"Landing Page Mode": "Etusivun tila",
 	"Language": "Kieli",
 	"Last Active": "Viimeksi aktiivinen",
-	"Last Modified": "",
-	"LDAP": "",
-	"LDAP server updated": "",
-	"Leaderboard": "",
-	"Leave empty for unlimited": "",
-	"Leave empty to include all models from \"{{URL}}/api/tags\" endpoint": "",
-	"Leave empty to include all models from \"{{URL}}/models\" endpoint": "",
-	"Leave empty to include all models or select specific models": "",
-	"Leave empty to use the default prompt, or enter a custom prompt": "",
+	"Last Modified": "Viimeksi muokattu",
+	"LDAP": "LDAP",
+	"LDAP server updated": "LDAP-palvelin päivitetty",
+	"Leaderboard": "Tulosluettelo",
+	"Leave empty for unlimited": "Jätä tyhjäksi rajattomaksi",
+	"Leave empty to include all models from \"{{URL}}/api/tags\" endpoint": "Jätä tyhjäksi, jos haluat sisällyttää kaikki mallit \"{{URL}}/api/tags\" -päätepistestä",
+	"Leave empty to include all models from \"{{URL}}/models\" endpoint": "Jätä tyhjäksi, jos haluat sisällyttää kaikki mallit \"{{URL}}/models\" -päätepistestä",
+	"Leave empty to include all models or select specific models": "Jätä tyhjäksi, jos haluat sisällyttää kaikki mallit tai valitse tietyt mallit",
+	"Leave empty to use the default prompt, or enter a custom prompt": "Jätä tyhjäksi käyttääksesi oletuskehotetta tai kirjoita mukautettu kehote",
 	"Light": "Vaalea",
-	"Listening...": "",
-	"LLMs can make mistakes. Verify important information.": "Kielimallit voivat tehdä virheitä. Varmista tärkeät tiedot.",
-	"Local": "",
-	"Local Models": "",
-	"Lost": "",
+	"Listening...": "Kuuntelee...",
+	"LLMs can make mistakes. Verify important information.": "Kielimallit voivat tehdä virheitä. Tarkista tärkeät tiedot.",
+	"Local": "Paikallinen",
+	"Local Models": "Paikalliset mallit",
+	"Lost": "Mennyt", 
 	"LTR": "LTR",
 	"Made by OpenWebUI Community": "Tehnyt OpenWebUI-yhteisö",
 	"Make sure to enclose them with": "Varmista, että suljet ne",
-	"Make sure to export a workflow.json file as API format from ComfyUI.": "",
-	"Manage": "",
-	"Manage Arena Models": "",
-	"Manage Ollama": "",
-	"Manage Ollama API Connections": "",
-	"Manage OpenAI API Connections": "",
+	"Make sure to export a workflow.json file as API format from ComfyUI.": "Muista viedä workflow.json-tiedosto API-muodossa ComfyUI:sta.",
+	"Manage": "Hallitse",
+	"Manage Arena Models": "Hallitse Arena-malleja",
+	"Manage Ollama": "Hallitse Ollamaa",
+	"Manage Ollama API Connections": "Hallitse Ollama API -yhteyksiä",
+	"Manage OpenAI API Connections": "Hallitse OpenAI API -yhteyksiä",
 	"Manage Pipelines": "Hallitse putkia",
 	"March": "maaliskuu",
 	"Max Tokens (num_predict)": "Tokenien enimmäismäärä (num_predict)",
-	"Max Upload Count": "",
-	"Max Upload Size": "",
+	"Max Upload Count": "Latausten enimmäismäärä",
+	"Max Upload Size": "Latausten enimmäiskoko",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Enintään 3 mallia voidaan ladata samanaikaisesti. Yritä myöhemmin uudelleen.",
 	"May": "toukokuu",
 	"Memories accessible by LLMs will be shown here.": "Muistitiedostot, joita LLM-ohjelmat käyttävät, näkyvät tässä.",
 	"Memory": "Muisti",
-	"Memory added successfully": "",
-	"Memory cleared successfully": "",
-	"Memory deleted successfully": "",
-	"Memory updated successfully": "",
-	"Merge Responses": "",
-	"Message rating should be enabled to use this feature": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Linkin luomisen jälkeen lähettämiäsi viestejä ei jaeta. Käyttäjät, joilla on URL-osoite, voivat tarkastella jaettua keskustelua.",
-	"Min P": "",
+	"Memory added successfully": "Muisti lisätty onnistuneesti",
+	"Memory cleared successfully": "Muisti tyhjennetty onnistuneesti",
+	"Memory deleted successfully": "Muisti poistettu onnistuneesti",
+	"Memory updated successfully": "Muisti päivitetty onnistuneesti",
+	"Merge Responses": "Yhdistä vastaukset",
+	"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 URL-osoite, voivat tarkastella jaettua keskustelua.",
+	"Min P": "Min P",
 	"Minimum Score": "Vähimmäispisteet",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "DD MMMM YYYY",
-	"MMMM DD, YYYY HH:mm": "DD MMMM YYYY, HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "",
-	"Model": "",
+	"MMMM DD, YYYY": "D. MMMM YYYY",
+	"MMMM DD, YYYY HH:mm": "D. MMMM YYYY, HH:mm",
+	"MMMM DD, YYYY hh:mm:ss A": "D. MMMM YYYY, hh:mm:ss a",
+	"Model": "Malli",
 	"Model '{{modelName}}' has been successfully downloaded.": "Malli '{{modelName}}' ladattiin onnistuneesti.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Malli '{{modelTag}}' on jo jonossa ladattavaksi.",
 	"Model {{modelId}} not found": "Mallia {{modelId}} ei löytynyt",
 	"Model {{modelName}} is not vision capable": "Malli {{modelName}} ei kykene näkökykyyn",
 	"Model {{name}} is now {{status}}": "Malli {{name}} on nyt {{status}}",
-	"Model accepts image inputs": "",
-	"Model created successfully!": "",
-	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Mallin tiedostojärjestelmäpolku havaittu. Mallin lyhytnimi vaaditaan päivitykseen, ei voi jatkaa.",
-	"Model Filtering": "",
+	"Model accepts image inputs": "Malli hyväksyy kuvasyötteitä",
+	"Model created successfully!": "Malli luotu onnistuneesti!",
+	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Mallin tiedostojärjestelmäpolku havaittu. Mallin lyhytnimi vaaditaan päivitykseen, ei voida jatkaa.",
+	"Model Filtering": "Mallin suodatus",
 	"Model ID": "Mallin tunnus",
-	"Model IDs": "",
-	"Model Name": "",
-	"Model not selected": "Mallia ei valittu",
+	"Model IDs": "Mallitunnukset",
+	"Model Name": "Mallin nimi",
+	"Model not selected": "Mallia ei ole valittu",
 	"Model Params": "Mallin parametrit",
-	"Model Permissions": "",
-	"Model updated successfully": "",
+	"Model Permissions": "Mallin käyttöoikeudet",
+	"Model updated successfully": "Malli päivitetty onnistuneesti",
 	"Modelfile Content": "Mallitiedoston sisältö",
 	"Models": "Mallit",
-	"Models Access": "",
-	"Models configuration saved successfully": "",
-	"Mojeek Search API Key": "",
-	"more": "",
+	"Models Access": "Mallien käyttöoikeudet",
+	"Models configuration saved successfully": "Mallien määritykset tallennettu onnistuneesti",
+	"Mojeek Search API Key": "Mojeek Search API -avain",
+	"more": "lisää",
 	"More": "Lisää",
 	"Name": "Nimi",
-	"Name your knowledge base": "",
+	"Name your knowledge base": "Anna tietokannalle nimi",
 	"New Chat": "Uusi keskustelu",
-	"New folder": "",
+	"New folder": "Uusi kansio",
 	"New Password": "Uusi salasana",
-	"No content found": "",
-	"No content to speak": "",
-	"No distance available": "",
-	"No feedbacks found": "",
-	"No file selected": "",
-	"No files found.": "",
-	"No groups with access, add a group to grant access": "",
-	"No HTML, CSS, or JavaScript content found.": "",
-	"No knowledge found": "",
-	"No model IDs": "",
-	"No models found": "",
-	"No models selected": "",
+	"No content found": "Sisältöä ei löytynyt",
+	"No content to speak": "Ei puhuttavaa sisältöä",
+	"No distance available": "Etäisyyttä ei saatavilla",
+	"No feedbacks found": "Palautteita ei löytynyt",
+	"No file selected": "Tiedostoa ei ole valittu",
+	"No files found.": "Tiedostoja ei löytynyt.",
+	"No groups with access, add a group to grant access": "Ei ryhmiä, joilla on pääsy, lisää ryhmä antaaksesi pääsyn",
+	"No HTML, CSS, or JavaScript content found.": "HTML-, CSS- tai JavaScript-sisältöä ei löytynyt.",
+	"No knowledge found": "Tietoa ei löytynyt",
+	"No model IDs": "Ei mallitunnuksia",
+	"No models found": "Malleja ei löytynyt",
+	"No models selected": "Malleja ei ole valittu",
 	"No results found": "Ei tuloksia",
 	"No search query generated": "Hakukyselyä ei luotu",
-	"No source available": "Ei lähdettä saatavilla",
-	"No users were found.": "",
-	"No valves to update": "",
-	"None": "Ei lainkaan",
-	"Not factually correct": "Ei faktisesti oikein",
-	"Not helpful": "",
-	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Huom: Jos asetat vähimmäispisteet, haku palauttaa vain asiakirjat, joiden pisteet ovat suurempia tai yhtä suuria kuin vähimmäispistemäärä.",
-	"Notes": "",
+	"No source available": "Lähdettä ei saatavilla",
+	"No users were found.": "Käyttäjiä ei löytynyt.",
+	"No valves to update": "Ei venttiileitä päivitettäväksi",
+	"None": "Ei mikään",
+	"Not factually correct": "Ei faktuaalisesti oikein",
+	"Not helpful": "Ei hyödyllinen",
+	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Huomautus: Jos asetat vähimmäispistemäärän, haku palauttaa vain sellaiset asiakirjat, joiden pistemäärä on vähintään vähimmäismäärä.",
+	"Notes": "Muistiinpanot",
 	"Notifications": "Ilmoitukset",
 	"November": "marraskuu",
-	"num_gpu (Ollama)": "",
+	"num_gpu (Ollama)": "num_gpu (Ollama)",
 	"num_thread (Ollama)": "num_thread (Ollama)",
-	"OAuth ID": "",
+	"OAuth ID": "OAuth-tunnus",
 	"October": "lokakuu",
-	"Off": "Pois",
-	"Okay, Let's Go!": "Eikun menoksi!",
+	"Off": "Pois päältä",
+	"Okay, Let's Go!": "Okei, mennään!",
 	"OLED Dark": "OLED-tumma",
 	"Ollama": "Ollama",
 	"Ollama API": "Ollama API",
 	"Ollama API disabled": "Ollama API poistettu käytöstä",
-	"Ollama API settings updated": "",
+	"Ollama API settings updated": "Ollama API -asetukset päivitetty",
 	"Ollama Version": "Ollama-versio",
 	"On": "Päällä",
-	"Only alphanumeric characters and hyphens are allowed": "",
+	"Only alphanumeric characters and hyphens are allowed": "Vain kirjaimet, numerot ja väliviivat ovat sallittuja",
 	"Only alphanumeric characters and hyphens are allowed in the command string.": "Vain kirjaimet, numerot ja väliviivat ovat sallittuja komentosarjassa.",
-	"Only collections can be edited, create a new knowledge base to edit/add documents.": "",
-	"Only select users and groups with permission can access": "",
-	"Oops! Looks like the URL is invalid. Please double-check and try again.": "Hups! Näyttää siltä, että URL on virheellinen. Tarkista se ja yritä uudelleen.",
-	"Oops! There are files still uploading. Please wait for the upload to complete.": "",
-	"Oops! There was an error in the previous response.": "",
-	"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Hupsista! Käytät ei-tuettua menetelmää. WebUI pitää palvella backendista.",
-	"Open file": "",
-	"Open in full screen": "",
+	"Only collections can be edited, create a new knowledge base to edit/add documents.": "Vain kokoelmia voi muokata, luo uusi tietokanta muokataksesi/lisätäksesi asiakirjoja.",
+	"Only select users and groups with permission can access": "Vain valitut käyttäjät ja ryhmät, joilla on käyttöoikeus, pääsevät käyttämään",
+	"Oops! Looks like the URL is invalid. Please double-check and try again.": "Hups! Näyttää siltä, että URL-osoite on virheellinen. Tarkista se ja yritä uudelleen.",
+	"Oops! There are files still uploading. Please wait for the upload to complete.": "Hups! Tiedostoja on vielä ladattavana. Odota, että lataus on valmis.",
+	"Oops! There was an error in the previous response.": "Hups! Edellisessä vastauksessa oli virhe.",
+	"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Hups! Käytät ei-tuettua menetelmää (vain frontend). Palvele WebUI:ta backendistä.",
+	"Open file": "Avaa tiedosto",
+	"Open in full screen": "Avaa koko näytön tilaan",
 	"Open new chat": "Avaa uusi keskustelu",
-	"Open WebUI uses faster-whisper internally.": "",
-	"Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "",
-	"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
+	"Open WebUI uses faster-whisper internally.": "Open WebUI käyttää faster-whisperia sisäisesti.",
+	"Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Open WebUI käyttää SpeechT5:tä ja CMU Arctic -kaiuttimen upotuksia.",
+	"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open WebUI -versio (v{{OPEN_WEBUI_VERSION}}) on alempi kuin vaadittu versio (v{{REQUIRED_VERSION}})",
 	"OpenAI": "OpenAI",
 	"OpenAI API": "OpenAI API",
 	"OpenAI API Config": "OpenAI API -asetukset",
 	"OpenAI API Key is required.": "OpenAI API -avain vaaditaan.",
-	"OpenAI API settings updated": "",
-	"OpenAI URL/Key required.": "OpenAI URL/ -avain vaaditaan.",
+	"OpenAI API settings updated": "OpenAI API -asetukset päivitetty",
+	"OpenAI URL/Key required.": "OpenAI URL/avain vaaditaan.",
 	"or": "tai",
-	"Organize your users": "",
+	"Organize your users": "Järjestä käyttäjäsi",
 	"Other": "Muu",
-	"OUTPUT": "",
-	"Output format": "",
-	"Overview": "",
-	"page": "",
+	"OUTPUT": "TULOSTE",
+	"Output format": "Tulosteen muoto",
+	"Overview": "Yleiskatsaus",
+	"page": "sivu",
 	"Password": "Salasana",
-	"Paste Large Text as File": "",
-	"PDF document (.pdf)": "PDF-tiedosto (.pdf)",
-	"PDF Extract Images (OCR)": "PDF-tiedoston kuvien erottelu (OCR)",
+	"Paste Large Text as File": "Liitä suuri teksti tiedostona",
+	"PDF document (.pdf)": "PDF-asiakirja (.pdf)",
+	"PDF Extract Images (OCR)": "Poimi kuvat PDF:stä (OCR)",
 	"pending": "odottaa",
-	"Permission denied when accessing media devices": "",
-	"Permission denied when accessing microphone": "",
-	"Permission denied when accessing microphone: {{error}}": "Mikrofonin käyttöoikeus evätty: {{error}}",
-	"Permissions": "",
-	"Personalization": "Henkilökohtaisuus",
-	"Pin": "",
-	"Pinned": "",
-	"Pioneer insights": "",
-	"Pipeline deleted successfully": "",
-	"Pipeline downloaded successfully": "",
+	"Permission denied when accessing media devices": "Käyttöoikeus epäitty media-laitteille",
+	"Permission denied when accessing microphone": "Käyttöoikeus epäitty mikrofonille",
+	"Permission denied when accessing microphone: {{error}}": "Käyttöoikeus epäitty mikrofonille: {{error}}",
+	"Permissions": "Käyttöoikeudet",
+	"Personalization": "Personointi",
+	"Pin": "Kiinnitä",
+	"Pinned": "Kiinnitetty",
+	"Pioneer insights": "Pioneerin oivalluksia",
+	"Pipeline deleted successfully": "Putki poistettu onnistuneesti",
+	"Pipeline downloaded successfully": "Putki ladattu onnistuneesti",
 	"Pipelines": "Putkistot",
-	"Pipelines Not Detected": "",
-	"Pipelines Valves": "Putkistot Venttiilit",
+	"Pipelines Not Detected": "Putkistoja ei havaittu",
+	"Pipelines Valves": "Putkistojen venttiilit",
 	"Plain text (.txt)": "Pelkkä teksti (.txt)",
 	"Playground": "Leikkipaikka",
-	"Please carefully review the following warnings:": "",
-	"Please enter a prompt": "",
-	"Please fill in all fields.": "",
-	"Please select a reason": "",
-	"Port": "",
+	"Please carefully review the following warnings:": "Tarkista huolellisesti seuraavat varoitukset:",
+	"Please enter a prompt": "Kirjoita kehote",
+	"Please fill in all fields.": "Täytä kaikki kentät.",
+	"Please select a model first.": "Valitse ensin malli.",
+	"Please select a reason": "Valitse syy",
+	"Port": "Portti",
 	"Positive attitude": "Positiivinen asenne",
-	"Prefix ID": "",
-	"Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "",
+	"Prefix ID": "Etuliite-ID",
+	"Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "Etuliite-ID:tä käytetään välttämään ristiriidat muiden yhteyksien kanssa lisäämällä etuliite mallitunnuksiin - jätä tyhjäksi, jos haluat ottaa sen pois käytöstä",
 	"Previous 30 days": "Edelliset 30 päivää",
 	"Previous 7 days": "Edelliset 7 päivää",
 	"Profile Image": "Profiilikuva",
-	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Kehote (esim. Kerro hauska fakta Turusta)",
+	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Kehote (esim. Kerro hauska fakta Rooman valtakunnasta)",
 	"Prompt Content": "Kehotteen sisältö",
-	"Prompt created successfully": "",
+	"Prompt created successfully": "Kehote luotu onnistuneesti",
 	"Prompt suggestions": "Kehotteen ehdotukset",
-	"Prompt updated successfully": "",
+	"Prompt updated successfully": "Kehote päivitetty onnistuneesti",
 	"Prompts": "Kehotteet",
-	"Prompts Access": "",
+	"Prompts Access": "Kehoitteiden käyttöoikeudet",
+	"Proxy URL": "Välityspalvelimen URL-osoite",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Lataa \"{{searchValue}}\" Ollama.comista",
 	"Pull a model from Ollama.com": "Lataa malli Ollama.comista",
-	"Query Generation Prompt": "",
+	"Query Generation Prompt": "Kyselytulosten luontikehote",
 	"Query Params": "Kyselyparametrit",
 	"RAG Template": "RAG-malline",
-	"Rating": "",
-	"Re-rank models by topic similarity": "",
+	"Rating": "Arviointi",
+	"Re-rank models by topic similarity": "Uudelleenjärjestä mallit aiheyhteyden mukaan",
 	"Read Aloud": "Lue ääneen",
 	"Record voice": "Nauhoita ääni",
 	"Redirecting you to OpenWebUI Community": "Ohjataan sinut OpenWebUI-yhteisöön",
-	"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)": "",
-	"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
-	"References from": "",
+	"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)": "Vähentää merkityksetöntä sisältöä tuottavan todennäköisyyttä. Korkeampi arvo (esim. 100) antaa monipuolisempia vastauksia, kun taas alhaisempi arvo (esim. 10) on konservatiivisempi. (Oletus: 40)",
+	"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Viittaa itseen \"Käyttäjänä\" (esim. \"Käyttäjä opiskelee espanjaa\")",
+	"References from": "Viitteet lähteistä",
 	"Refused when it shouldn't have": "Kieltäytyi, vaikka ei olisi pitänyt",
-	"Regenerate": "Uudelleenluo",
+	"Regenerate": "Uudelleentuota",
 	"Release Notes": "Julkaisutiedot",
-	"Relevance": "",
+	"Relevance": "Relevanssi",
 	"Remove": "Poista",
 	"Remove Model": "Poista malli",
 	"Rename": "Nimeä uudelleen",
-	"Reorder Models": "",
-	"Repeat Last N": "Viimeinen N -toisto",
+	"Reorder Models": "Uudelleenjärjestä malleja",
+	"Repeat Last N": "Toista viimeiset N",
 	"Request Mode": "Pyyntötila",
-	"Reranking Model": "Uudelleenpisteytysmalli",
-	"Reranking model disabled": "Uudelleenpisteytysmalli poistettu käytöstä",
+	"Reranking Model": "Uudelleenpisteytymismalli",
+	"Reranking model disabled": "Uudelleenpisteytymismalli poistettu käytöstä",
 	"Reranking model set to \"{{reranking_model}}\"": "\"{{reranking_model}}\" valittu uudelleenpisteytysmalliksi",
-	"Reset": "",
-	"Reset All Models": "",
-	"Reset Upload Directory": "",
-	"Reset Vector Storage/Knowledge": "",
-	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
-	"Response splitting": "",
-	"Result": "",
-	"Rich Text Input for Chat": "",
-	"RK": "",
+	"Reset": "Palauta",
+	"Reset All Models": "Palauta kaikki mallit",
+	"Reset Upload Directory": "Palauta latauspolku",
+	"Reset Vector Storage/Knowledge": "Tyhjennä vektoritallennukset/tietämys",
+	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Vastausilmoituksia ei voida ottaa käyttöön, koska verkkosivuston käyttöoikeudet on evätty. Myönnä tarvittavat käyttöoikeudet selaimesi asetuksista.",
+	"Response splitting": "Vastauksen jakaminen",
+	"Result": "Tulos",
+	"Retrieval Query Generation": "Hakukyselyn luominen",
+	"Rich Text Input for Chat": "Rikasteksti-syöte chattiin",
+	"RK": "RK",
 	"Role": "Rooli",
-	"Rosé Pine": "Rosee-mänty",
-	"Rosé Pine Dawn": "Aamuinen Rosee-mänty",
+	"Rosé Pine": "Rosépuu",
+	"Rosé Pine Dawn": "Rosépuu aamunkoitto",
 	"RTL": "RTL",
-	"Run": "",
-	"Running": "",
+	"Run": "Suorita",
+	"Running": "Käynnissä",
 	"Save": "Tallenna",
 	"Save & Create": "Tallenna ja luo",
 	"Save & Update": "Tallenna ja päivitä",
-	"Save As Copy": "",
-	"Save Tag": "",
-	"Saved": "",
-	"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Keskustelulokien tallentaminen suoraan selaimen tallennustilaan ei ole enää tuettua. Lataa ja poista keskustelulokit napsauttamalla alla olevaa painiketta. Älä huoli, voit helposti tuoda keskustelulokit takaisin backendiin",
-	"Scroll to bottom when switching between branches": "",
+	"Save As Copy": "Tallenna kopiona",
+	"Save Tag": "Tallenna tagi",
+	"Saved": "Tallennettu",
+	"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Keskustelulokien tallentaminen suoraan selaimen tallennustilaan ei ole enää tuettu. Lataa ja poista keskustelulokit napsauttamalla alla olevaa painiketta. Älä huoli, voit helposti tuoda keskustelulokit takaisin backendiin",
+	"Scroll to bottom when switching between branches": "Vierittää alaspäin vaihdettaessa haarojen välillä",
 	"Search": "Haku",
 	"Search a model": "Hae mallia",
-	"Search Base": "",
-	"Search Chats": "Etsi chatteja",
-	"Search Collection": "",
-	"Search Filters": "",
-	"search for tags": "",
-	"Search Functions": "",
-	"Search Knowledge": "",
+	"Search Base": "Hakupohja",
+	"Search Chats": "Hae keskusteluja",
+	"Search Collection": "Hae kokoelmaa",
+	"Search Filters": "Hakusuodattimet",
+	"search for tags": "hae tageja",
+	"Search Functions": "Hae toimintoja",
+	"Search Knowledge": "Hae tietämystä",
 	"Search Models": "Hae malleja",
-	"Search options": "",
-	"Search Prompts": "Hae kehotteita",
+	"Search options": "Hakuvaihtoehdot",
+	"Search Prompts": "Hae kehotteia",
 	"Search Result Count": "Hakutulosten määrä",
-	"Search the web": "",
-	"Search Tools": "",
-	"SearchApi API Key": "",
-	"SearchApi Engine": "",
-	"Searched {{count}} sites_one": "Haettu {{count}} sites_one",
-	"Searched {{count}} sites_other": "Haku {{count}} sites_other",
-	"Searching \"{{searchQuery}}\"": "",
-	"Searching Knowledge for \"{{searchQuery}}\"": "",
+	"Search the web": "Etsi verkosta",
+	"Search Tools": "Hae työkaluja",
+	"SearchApi API Key": "SearchApi API -avain",
+	"SearchApi Engine": "SearchApi-moottori",
+	"Searched {{count}} sites_one": "Haettu {{count}} sivusto",
+	"Searched {{count}} sites_other": "Haettu {{count}} sivustoa",
+	"Searching \"{{searchQuery}}\"": "Haetaan \"{{searchQuery}}\"",
+	"Searching Knowledge for \"{{searchQuery}}\"": "Haetaan tietämystä \"{{searchQuery}}\"",
 	"Searxng Query URL": "Searxng-kyselyn URL-osoite",
-	"See readme.md for instructions": "Katso lisää ohjeita readme.md:stä",
+	"See readme.md for instructions": "Katso ohjeet readme.md-tiedostosta",
 	"See what's new": "Katso, mitä uutta",
-	"Seed": "Siemen",
+	"Seed": "Siemenluku",
 	"Select a base model": "Valitse perusmalli",
-	"Select a engine": "",
-	"Select a function": "",
-	"Select a group": "",
+	"Select a engine": "Valitse moottori",
+	"Select a function": "Valitse toiminto",
+	"Select a group": "Valitse ryhmä",
 	"Select a model": "Valitse malli",
 	"Select a pipeline": "Valitse putki",
 	"Select a pipeline url": "Valitse putken URL-osoite",
-	"Select a tool": "",
-	"Select Engine": "",
-	"Select Knowledge": "",
+	"Select a tool": "Valitse työkalu",
+	"Select Engine": "Valitse moottori",
+	"Select Knowledge": "Valitse tietämys",
 	"Select model": "Valitse malli",
-	"Select only one model to call": "",
-	"Selected model(s) do not support image inputs": "Valitut mallit eivät tue kuvasyötteitä",
-	"Semantic distance to query": "",
+	"Select only one model to call": "Valitse vain yksi malli kutsuttavaksi",
+	"Selected model(s) do not support image inputs": "Valitut mallit eivät tue kuvasöytteitä",
+	"Semantic distance to query": "Semanttinen etäisyys kyselyyn",
 	"Send": "Lähetä",
 	"Send a Message": "Lähetä viesti",
 	"Send message": "Lähetä viesti",
-	"Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "",
+	"Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "Lähettää `stream_options: { include_usage: true }` pyynnössä.\nTuetut tarjoajat palauttavat tokenkäyttötiedot vastauksessa, kun se on asetettu.",
 	"September": "syyskuu",
 	"Serper API Key": "Serper API -avain",
-	"Serply API Key": "",
+	"Serply API Key": "Serply API -avain",
 	"Serpstack API Key": "Serpstack API -avain",
-	"Server connection verified": "Palvelinyhteys varmennettu",
+	"Server connection verified": "Palvelinyhteys vahvistettu",
 	"Set as default": "Aseta oletukseksi",
-	"Set CFG Scale": "",
+	"Set CFG Scale": "Aseta CFG-mitta",
 	"Set Default Model": "Aseta oletusmalli",
-	"Set embedding model": "",
-	"Set embedding model (e.g. {{model}})": "Aseta upotusmalli (esim. {{model}})",
+	"Set embedding model": "Aseta upotelmamalli",
+	"Set embedding model (e.g. {{model}})": "Aseta upotelmamalli (esim. {{model}})",
 	"Set Image Size": "Aseta kuvan koko",
-	"Set reranking model (e.g. {{model}})": "Aseta uudelleenpisteytysmalli (esim. {{model}})",
-	"Set Sampler": "",
-	"Set Scheduler": "",
-	"Set Steps": "Aseta askelmäärä",
+	"Set reranking model (e.g. {{model}})": "Aseta uudelleenpisteytymismalli (esim. {{model}})",
+	"Set Sampler": "Aseta näytteistäjä",
+	"Set Scheduler": "Aseta ajoitin",
+	"Set Steps": "Aseta askeleet",
 	"Set Task Model": "Aseta tehtävämalli",
-	"Set the number of GPU devices used for computation. This option controls how many GPU devices (if available) are used to process incoming requests. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "",
-	"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "",
+	"Set the number of GPU devices used for computation. This option controls how many GPU devices (if available) are used to process incoming requests. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "Aseta käytettyjen GPU-laitteiden määrä laskentaa varten. Tämä asetus kontrolloi, kuinka monta GPU-laitetta (jos saatavilla) käytetään saapuvien pyyntöjen käsittelyyn. Arvon kasvattaminen voi parantaa suorituskykyä merkittävästi malleissa, jotka on optimoitu GPU-kiihdytykseen, mutta voi myös kuluttaa enemmän virtaa ja GPU-resursseja.",
+	"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "Aseta työntekijäsäikeiden määrä laskentaa varten. Tämä asetus kontrolloi, kuinka monta säiettä käytetään saapuvien pyyntöjen rinnakkaiseen käsittelyyn. Arvon kasvattaminen voi parantaa suorituskykyä suurissa samanaikaisissa työkuormissa, mutta voi myös kuluttaa enemmän keskussuorittimen resursseja.",
 	"Set Voice": "Aseta puheääni",
-	"Set whisper model": "",
-	"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "",
-	"Sets how strongly to penalize repetitions. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. (Default: 1.1)": "",
-	"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)": "",
-	"Sets the size of the context window used to generate the next token. (Default: 2048)": "",
-	"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "",
+	"Set whisper model": "Aseta whisper-malli",
+	"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "Määrittää, kuinka kauas taaksepäin malli katsoo välttääkseen toistoa. (Oletus: 64, 0 = pois käytöstä, -1 = num_ctx)",
+	"Sets how strongly to penalize repetitions. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. (Default: 1.1)": "Määrittää, kuinka voimakkaasti toistoihin määrätään sanktioita. Korkeampi arvo (esim. 1,5) rankaisee toistoja voimakkaammin, kun taas alhaisempi arvo (esim. 0,9) on lempeämpi. (Oletus: 1,1)",
+	"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)": "Määrittää satunnaislukujen siemenen käytettäväksi generoinnissa. Tämän asettaminen tiettyyn numeroon saa mallin tuottamaan saman tekstin samalle kehoteelle. (Oletus: satunnainen)",
+	"Sets the size of the context window used to generate the next token. (Default: 2048)": "Määrittää kontekstiikkunan koon, jota käytetään seuraavan tokenin tuottamiseen. (Oletus: 2048)",
+	"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Määrittää käytettävät lopetussekvenssit. Kun tämä kuvio havaitaan, LLM lopettaa tekstin tuottamisen ja palauttaa. Useita lopetuskuvioita voidaan asettaa määrittämällä useita erillisiä lopetusparametreja mallitiedostoon.",
 	"Settings": "Asetukset",
 	"Settings saved successfully!": "Asetukset tallennettu onnistuneesti!",
 	"Share": "Jaa",
 	"Share Chat": "Jaa keskustelu",
 	"Share to OpenWebUI Community": "Jaa OpenWebUI-yhteisöön",
 	"Show": "Näytä",
-	"Show \"What's New\" modal on login": "",
-	"Show Admin Details in Account Pending Overlay": "",
+	"Show \"What's New\" modal on login": "Näytä \"Mitä uutta\" -modaali kirjautumisen yhteydessä",
+	"Show Admin Details in Account Pending Overlay": "Näytä ylläpitäjän tiedot odottavan tilin päällä",
 	"Show shortcuts": "Näytä pikanäppäimet",
-	"Show your support!": "",
-	"Showcased creativity": "Näytti luovuutta",
+	"Show your support!": "Osoita tukesi!",
+	"Showcased creativity": "Osoitti luovuutta",
 	"Sign in": "Kirjaudu sisään",
-	"Sign in to {{WEBUI_NAME}}": "",
-	"Sign in to {{WEBUI_NAME}} with LDAP": "",
+	"Sign in to {{WEBUI_NAME}}": "Kirjaudu sisään palveluun {{WEBUI_NAME}}",
+	"Sign in to {{WEBUI_NAME}} with LDAP": "Kirjaudu sisään palveluun {{WEBUI_NAME}} LDAP:lla",
 	"Sign Out": "Kirjaudu ulos",
 	"Sign up": "Rekisteröidy",
-	"Sign up to {{WEBUI_NAME}}": "",
-	"Signing in to {{WEBUI_NAME}}": "",
+	"Sign up to {{WEBUI_NAME}}": "Rekisteröidy palveluun {{WEBUI_NAME}}",
+	"Signing in to {{WEBUI_NAME}}": "Kirjaudutaan sisään palveluun {{WEBUI_NAME}}",
 	"Source": "Lähde",
-	"Speech Playback Speed": "",
+	"Speech Playback Speed": "Puhetoiston nopeus",
 	"Speech recognition error: {{error}}": "Puheentunnistusvirhe: {{error}}",
 	"Speech-to-Text Engine": "Puheentunnistusmoottori",
-	"Stop": "",
+	"Stop": "Pysäytä",
 	"Stop Sequence": "Lopetussekvenssi",
-	"Stream Chat Response": "",
-	"STT Model": "",
-	"STT Settings": "Puheentunnistusasetukset",
-	"Subtitle (e.g. about the Roman Empire)": "Alaotsikko (esim. Rooman valtakunnasta)",
+	"Stream Chat Response": "Streamaa keskusteluvastaus",
+	"STT Model": "Puheentunnistusmalli",
+	"STT Settings": "Puheentunnistuksen asetukset",
+	"Subtitle (e.g. about the Roman Empire)": "Alaotsikko (esim. Rooman valtakunta)",
 	"Success": "Onnistui",
 	"Successfully updated.": "Päivitetty onnistuneesti.",
-	"Suggested": "Suositeltu",
-	"Support": "",
-	"Support this plugin:": "",
-	"Sync directory": "",
+	"Suggested": "Ehdotettu",
+	"Support": "Tuki",
+	"Support this plugin:": "Tue tätä lisäosaa:",
+	"Sync directory": "Synkronoitu hakemisto",
 	"System": "Järjestelmä",
-	"System Instructions": "",
+	"System Instructions": "Järjestelmäohjeet",
 	"System Prompt": "Järjestelmäkehote",
-	"Tags Generation Prompt": "",
-	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
-	"Tap to interrupt": "",
-	"Tavily API Key": "",
+	"Tags Generation": "Tagien luonti",
+	"Tags Generation Prompt": "Tagien luontikehote",
+	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "Tail-free-otanta käytetään vähentämään vähemmän todennäköisten tokenien vaikutusta tulokseen. Korkeampi arvo (esim. 2,0) vähentää vaikutusta enemmän, kun taas arvo 1,0 poistaa tämän asetuksen käytöstä. (oletus: 1)",
+	"Tap to interrupt": "Napauta keskeyttääksesi",
+	"Tavily API Key": "Tavily API -avain",
 	"Tell us more:": "Kerro lisää:",
 	"Temperature": "Lämpötila",
-	"Template": "Malline",
-	"Temporary Chat": "",
-	"Text Splitter": "",
-	"Text-to-Speech Engine": "Puhemoottori",
-	"Tfs Z": "TFS Z",
+	"Template": "Malli",
+	"Temporary Chat": "Väliaikainen keskustelu",
+	"Text Splitter": "Tekstin jakaja",
+	"Text-to-Speech Engine": "Puhesynteesimoottori",
+	"Tfs Z": "Tfs Z",
 	"Thanks for your feedback!": "Kiitos palautteestasi!",
-	"The Application Account DN you bind with for search": "",
-	"The base to search for users": "",
-	"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.  (Default: 512)": "",
-	"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
-	"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "",
-	"The LDAP attribute that maps to the username that users use to sign in.": "",
-	"The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "",
-	"The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "",
-	"The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "",
-	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Pisteytyksen tulee olla arvo välillä 0.0 (0%) ja 1.0 (100%).",
-	"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "",
+	"The Application Account DN you bind with for search": "Hakua varten sidottu sovelluksen käyttäjätilin DN",
+	"The base to search for users": "Käyttäjien haun perusta",
+	"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.  (Default: 512)": "Erän koko määrittää, kuinka monta tekstipyyntöä käsitellään yhdessä kerralla. Suurempi erän koko voi parantaa mallin suorituskykyä ja nopeutta, mutta se vaatii myös enemmän muistia. (Oletus: 512)",
+	"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Tämän lisäosan takana olevat kehittäjät ovat intohimoisia vapaaehtoisyhteisöstä. Jos koet tämän lisäosan hyödylliseksi, harkitse sen kehittämisen tukemista.",
+	"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Arviointitulosluettelo perustuu Elo-luokitusjärjestelmään ja päivittyy reaaliajassa.",
+	"The LDAP attribute that maps to the username that users use to sign in.": "LDAP-määrite, joka vastaa käyttäjien kirjautumiskäyttäjänimeä.",
+	"The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Tulosluettelo on tällä hetkellä beta-vaiheessa, ja voimme säätää pisteytyksen laskentaa hienostaessamme algoritmia.",
+	"The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "Enimmäistiedostokoko megatavuissa. Jos tiedoston koko ylittää tämän rajan, tiedostoa ei ladata.",
+	"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.": "Suurin sallittu tiedostojen määrä käytettäväksi kerralla chatissa. Jos tiedostojen määrä ylittää tämän rajan, niitä ei ladata.",
+	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Pisteytyksen tulee olla arvo välillä 0,0 (0 %) ja 1,0 (100 %).",
+	"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "Mallin lämpötila. Lämpötilan nostaminen saa mallin vastaamaan luovemmin. (Oletus: 0,8)",
 	"Theme": "Teema",
-	"Thinking...": "",
-	"This action cannot be undone. Do you wish to continue?": "",
+	"Thinking...": "Ajattelee...",
+	"This action cannot be undone. Do you wish to continue?": "Tätä toimintoa ei voi peruuttaa. Haluatko jatkaa?",
 	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Tämä varmistaa, että arvokkaat keskustelusi tallennetaan turvallisesti backend-tietokantaasi. Kiitos!",
-	"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
-	"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics. (Default: 24)": "",
-	"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.  (Default: 128)": "",
-	"This option will delete all existing files in the collection and replace them with newly uploaded files.": "",
-	"This response was generated by \"{{model}}\"": "",
-	"This will delete": "",
-	"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
-	"This will delete all models including custom models": "",
-	"This will delete all models including custom models and cannot be undone.": "",
-	"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
+	"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Tämä on kokeellinen ominaisuus, se ei välttämättä toimi odotetulla tavalla ja se voi muuttua milloin tahansa.",
+	"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics. (Default: 24)": "Tämä asetus kontrolloi, kuinka monta tokenia säilytetään päivittäessä kontekstia. Esimerkiksi, jos asetetaan arvoksi 2, säilytetään viimeiset 2 keskustelukon-tekstin tokenia. Kontekstin säilyttäminen voi auttaa ylläpitämään keskustelun jatkuvuutta, mutta se voi vähentää kykyä vastata uusiin aiheisiin. (Oletus: 24)",
+	"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.  (Default: 128)": "Tämä asetus määrittää mallin vastauksen enimmäistokenmäärän. Tämän rajan nostaminen mahdollistaa mallin antavan pidempiä vastauksia, mutta se voi myös lisätä epähyödyllisen tai epärelevantin sisällön todennäköisyyttä. (Oletus: 128)",
+	"This option will delete all existing files in the collection and replace them with newly uploaded files.": "Tämä vaihtoehto poistaa kaikki kokoelman nykyiset tiedostot ja korvaa ne uusilla ladatuilla tiedostoilla.",
+	"This response was generated by \"{{model}}\"": "Tämän vastauksen tuotti \"{{model}}\"",
+	"This will delete": "Tämä poistaa",
+	"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "Tämä poistaa <strong>{{NAME}}</strong> ja <strong>kaikki sen sisällöt</strong>.",
+	"This will delete all models including custom models": "Tämä poistaa kaikki mallit mukaan lukien mukautetut mallit",
+	"This will delete all models including custom models and cannot be undone.": "Tämä poistaa kaikki mallit, mukaan lukien mukautetut mallit, eikä sitä voi peruuttaa.",
+	"This will reset the knowledge base and sync all files. Do you wish to continue?": "Tämä nollaa tietokannan ja synkronoi kaikki tiedostot. Haluatko jatkaa?",
 	"Thorough explanation": "Perusteellinen selitys",
-	"Tika": "",
-	"Tika Server URL required.": "",
-	"Tiktoken": "",
+	"Tika": "Tika",
+	"Tika Server URL required.": "Tika Server URL vaaditaan.",
+	"Tiktoken": "Tiktoken",
 	"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Vinkki: Päivitä useita muuttujapaikkoja peräkkäin painamalla tabulaattoria keskustelusyötteessä jokaisen korvauksen jälkeen.",
 	"Title": "Otsikko",
 	"Title (e.g. Tell me a fun fact)": "Otsikko (esim. Kerro hauska fakta)",
 	"Title Auto-Generation": "Otsikon automaattinen luonti",
-	"Title cannot be an empty string.": "Otsikko ei voi olla tyhjä.",
+	"Title cannot be an empty string.": "Otsikko ei voi olla tyhjä merkkijono.",
 	"Title Generation Prompt": "Otsikon luontikehote",
-	"TLS": "",
+	"TLS": "TLS",
 	"To access the available model names for downloading,": "Päästäksesi käsiksi ladattavissa oleviin mallinimiin,",
 	"To access the GGUF models available for downloading,": "Päästäksesi käsiksi ladattavissa oleviin GGUF-malleihin,",
-	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
-	"To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "",
-	"To protect your privacy, only ratings, model IDs, tags, and metadata are shared from your feedback—your chat logs remain private and are not included.": "",
-	"To select actions here, add them to the \"Functions\" workspace first.": "",
-	"To select filters here, add them to the \"Functions\" workspace first.": "",
-	"To select toolkits here, add them to the \"Tools\" workspace first.": "",
-	"Toast notifications for new updates": "",
+	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Päästäksesi käyttämään WebUI:ta, ota yhteyttä ylläpitäjään. Ylläpitäjät voivat hallita käyttäjien tiloja Ylläpitopaneelista.",
+	"To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Liittääksesi tietokantasi tähän, lisää ne ensin \"Tietämys\"-työtilaan.",
+	"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.": "Yksityisyydensuojasi vuoksi palautteestasi jaetaan vain arvostelut, mallitunnukset, tagit ja metadata - keskustelulokisi pysyvät yksityisinä eikä niitä sisällytetä.",
+	"To select actions here, add them to the \"Functions\" workspace first.": "Valitaksesi toimintoja tässä, lisää ne ensin \"Toiminnot\"-työtilaan.",
+	"To select filters here, add them to the \"Functions\" workspace first.": "Valitaksesi suodattimia tässä, lisää ne ensin \"Toiminnot\"-työtilaan.",
+	"To select toolkits here, add them to the \"Tools\" workspace first.": "Valitaksesi työkalusettejä tässä, lisää ne ensin \"Työkalut\"-työtilaan.",
+	"Toast notifications for new updates": "Ilmoituspopuppien näyttäminen uusista päivityksistä",
 	"Today": "Tänään",
 	"Toggle settings": "Kytke asetukset",
 	"Toggle sidebar": "Kytke sivupalkki",
-	"Token": "",
-	"Tokens To Keep On Context Refresh (num_keep)": "",
-	"Too verbose": "",
-	"Tool created successfully": "",
-	"Tool deleted successfully": "",
-	"Tool Description": "",
-	"Tool ID": "",
-	"Tool imported successfully": "",
-	"Tool Name": "",
-	"Tool updated successfully": "",
-	"Tools": "",
-	"Tools Access": "",
-	"Tools are a function calling system with arbitrary code execution": "",
-	"Tools have a function calling system that allows arbitrary code execution": "",
-	"Tools have a function calling system that allows arbitrary code execution.": "",
+	"Token": "Token",
+	"Tokens To Keep On Context Refresh (num_keep)": "Säilytettävät tokenit kontekstin päivityksessä (num_keep)",
+	"Too verbose": "Liian puhelias",
+	"Tool created successfully": "Työkalu luotu onnistuneesti",
+	"Tool deleted successfully": "Työkalu poistettu onnistuneesti",
+	"Tool Description": "Työkalun kuvaus",
+	"Tool ID": "Työkalun tunnus",
+	"Tool imported successfully": "Työkalu tuotu onnistuneesti",
+	"Tool Name": "Työkalun nimi",
+	"Tool updated successfully": "Työkalu päivitetty onnistuneesti",
+	"Tools": "Työkalut",
+	"Tools Access": "Työkalujen käyttöoikeudet",
+	"Tools are a function calling system with arbitrary code execution": "Työkalut ovat toimintokutsuihin perustuva järjestelmä, joka sallii mielivaltaisen koodin suorittamisen",
+	"Tools have a function calling system that allows arbitrary code execution": "Työkaluilla on toimintokutsuihin perustuva järjestelmä, joka sallii mielivaltaisen koodin suorittamisen",
+	"Tools have a function calling system that allows arbitrary code execution.": "Työkalut sallivat mielivaltaisen koodin suorittamisen toimintokutsuilla.",
 	"Top K": "Top K",
 	"Top P": "Top P",
-	"Transformers": "",
+	"Transformers": "Muunnokset",
 	"Trouble accessing Ollama?": "Ongelmia Ollama-yhteydessä?",
-	"TTS Model": "",
-	"TTS Settings": "Puheentuottamisasetukset",
-	"TTS Voice": "",
+	"TTS Model": "Puhesynteesimalli",
+	"TTS Settings": "Puhesynteesiasetukset",
+	"TTS Voice": "Puhesynteesiääni",
 	"Type": "Tyyppi",
-	"Type Hugging Face Resolve (Download) URL": "Kirjoita Hugging Face -resolve-osoite",
+	"Type Hugging Face Resolve (Download) URL": "Kirjoita Hugging Face -resolve-latausosoite",
 	"Uh-oh! There was an issue connecting to {{provider}}.": "Voi ei! Yhteysongelma {{provider}}:n kanssa.",
-	"UI": "",
-	"Unarchive All": "",
-	"Unarchive All Archived Chats": "",
-	"Unarchive Chat": "",
-	"Unlock mysteries": "",
-	"Unpin": "",
-	"Unravel secrets": "",
-	"Untagged": "",
-	"Update": "",
+	"UI": "Käyttöliittymä",
+	"Unarchive All": "Pura kaikkien arkistointi",
+	"Unarchive All Archived Chats": "Pura kaikkien arkistoitujen keskustelujen arkistointi",
+	"Unarchive Chat": "Pura keskustelun arkistointi",
+	"Unlock mysteries": "Selvitä arvoituksia",
+	"Unpin": "Irrota kiinnitys",
+	"Unravel secrets": "Avaa salaisuuksia",
+	"Untagged": "Ei tageja",
+	"Update": "Päivitä",
 	"Update and Copy Link": "Päivitä ja kopioi linkki",
-	"Update for the latest features and improvements.": "",
+	"Update for the latest features and improvements.": "Päivitä uusimpiin ominaisuuksiin ja parannuksiin.",
 	"Update password": "Päivitä salasana",
-	"Updated": "",
-	"Updated at": "",
-	"Updated At": "",
-	"Upload": "",
+	"Updated": "Päivitetty",
+	"Updated at": "Päivitetty",
+	"Updated At": "Päivitetty",
+	"Upload": "Lataa",
 	"Upload a GGUF model": "Lataa GGUF-malli",
-	"Upload directory": "",
-	"Upload files": "",
+	"Upload directory": "Latauksen hakemisto",
+	"Upload files": "Lataa tiedostoja",
 	"Upload Files": "Lataa tiedostoja",
-	"Upload Pipeline": "",
-	"Upload Progress": "Latauksen eteneminen",
-	"URL": "",
+	"Upload Pipeline": "Lataa putki",
+	"Upload Progress": "Latauksen edistyminen",
+	"URL": "URL",
 	"URL Mode": "URL-tila",
-	"Use '#' in the prompt input to load and include your knowledge.": "",
+	"Use '#' in the prompt input to load and include your knowledge.": "Käytä '#' -merkkiä kehotekenttään ladataksesi ja sisällyttääksesi tietämystäsi.",
 	"Use Gravatar": "Käytä Gravataria",
-	"Use groups to group your users and assign permissions.": "",
+	"Use groups to group your users and assign permissions.": "Käytä ryhmiä jäsentääksesi käyttäjiä ja antaaksesi käyttöoikeuksia.",
 	"Use Initials": "Käytä alkukirjaimia",
 	"use_mlock (Ollama)": "use_mlock (Ollama)",
 	"use_mmap (Ollama)": "use_mmap (Ollama)",
 	"user": "käyttäjä",
-	"User": "",
-	"User location successfully retrieved.": "",
-	"Username": "",
+	"User": "Käyttäjä",
+	"User location successfully retrieved.": "Käyttäjän sijainti haettu onnistuneesti.",
+	"Username": "Käyttäjätunnus",
 	"Users": "Käyttäjät",
-	"Using the default arena model with all models. Click the plus button to add custom models.": "",
-	"Utilize": "Käytä",
+	"Using the default arena model with all models. Click the plus button to add custom models.": "Käytetään oletusarena-mallia kaikkien mallien kanssa. Napsauta plus-painiketta lisätäksesi mukautettuja malleja.",
+	"Utilize": "Hyödynnä",
 	"Valid time units:": "Kelvolliset aikayksiköt:",
-	"Valves": "",
-	"Valves updated": "",
-	"Valves updated successfully": "",
+	"Valves": "Venttiilit",
+	"Valves updated": "Venttiilit päivitetty",
+	"Valves updated successfully": "Venttiilit päivitetty onnistuneesti",
 	"variable": "muuttuja",
 	"variable to have them replaced with clipboard content.": "muuttuja korvataan leikepöydän sisällöllä.",
 	"Version": "Versio",
-	"Version {{selectedVersion}} of {{totalVersions}}": "",
-	"Visibility": "",
-	"Voice": "",
-	"Voice Input": "",
+	"Version {{selectedVersion}} of {{totalVersions}}": "Versio {{selectedVersion}} / {{totalVersions}}",
+	"Visibility": "Näkyvyys",
+	"Voice": "Ääni",
+	"Voice Input": "Äänitulolaitteen käyttö",
 	"Warning": "Varoitus",
-	"Warning:": "",
-	"Warning: Enabling this will allow users to upload arbitrary code on the server.": "",
+	"Warning:": "Varoitus:",
+	"Warning: Enabling this will allow users to upload arbitrary code on the server.": "Varoitus: Tämän käyttöönotto sallii käyttäjien ladata mielivaltaista koodia palvelimelle.",
 	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Varoitus: Jos päivität tai vaihdat upotusmallia, sinun on tuotava kaikki asiakirjat uudelleen.",
 	"Web": "Web",
-	"Web API": "",
-	"Web Loader Settings": "Web Loader asetukset",
+	"Web API": "Web-API",
+	"Web Loader Settings": "Web Loader -asetukset",
 	"Web Search": "Web-haku",
 	"Web Search Engine": "Web-hakukone",
+	"Web Search Query Generation": "Web-haun kyselytulosten luonti",
 	"Webhook URL": "Webhook-URL",
 	"WebUI Settings": "WebUI-asetukset",
-	"WebUI will make requests to \"{{url}}/api/chat\"": "",
-	"WebUI will make requests to \"{{url}}/chat/completions\"": "",
-	"What are you trying to achieve?": "",
-	"What are you working on?": "",
-	"Whats New in": "Mitä uutta",
-	"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
-	"wherever you are": "",
-	"Whisper (Local)": "",
-	"Why?": "",
-	"Widescreen Mode": "",
-	"Won": "",
-	"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
-	"Workspace": "Työtilat",
-	"Workspace Permissions": "",
-	"Write a prompt suggestion (e.g. Who are you?)": "Kirjoita ehdotettu kehote (esim. Kuka olet?)",
+	"WebUI will make requests to \"{{url}}/api/chat\"": "WebUI lähettää pyyntöjä osoitteeseen \"{{url}}/api/chat\"",
+	"WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI lähettää pyyntöjä osoitteeseen \"{{url}}/chat/completions\"",
+	"What are you trying to achieve?": "Mitä yrität saavuttaa?",
+	"What are you working on?": "Mihin olet työskentelemässä?",
+	"What's New in": "Mitä uutta",
+	"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "Kun käytössä, malli vastaa jokaiseen chatviestiin reaaliajassa, tuottaen vastauksen heti kun käyttäjä lähettää viestin. Tämä tila on hyödyllinen reaaliaikaisissa chat-sovelluksissa, mutta voi vaikuttaa suorituskykyyn hitaammilla laitteistoilla.",
+	"wherever you are": "missä tahansa oletkin",
+	"Whisper (Local)": "Whisper (paikallinen)",
+	"Why?": "Miksi?",
+	"Widescreen Mode": "Laajakuvatila",
+	"Won": "Voitti",
+	"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "Toimii yhdessä top-k:n kanssa. Korkeampi arvo (esim. 0,95) tuottaa monipuolisempaa tekstiä, kun taas alhaisempi arvo (esim. 0,5) tuottaa keskittyneempää ja konservatiivisempaa tekstiä. (Oletus: 0,9)",
+	"Workspace": "Työtila",
+	"Workspace Permissions": "Työtilan käyttöoikeudet",
+	"Write a prompt suggestion (e.g. Who are you?)": "Kirjoita kehotteen ehdotus (esim. Kuka olet?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Kirjoita 50 sanan yhteenveto, joka tiivistää [aihe tai avainsana].",
-	"Write something...": "",
-	"Write your model template content here": "",
+	"Write something...": "Kirjoita jotain...",
+	"Write your model template content here": "Kirjoita mallisi mallinnesisältö tähän",
 	"Yesterday": "Eilen",
 	"You": "Sinä",
-	"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "",
-	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
-	"You cannot upload an empty file.": "",
-	"You do not have permission to upload files.": "",
+	"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Voit keskustella enintään {{maxCount}} tiedoston kanssa kerralla.",
+	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Voit personoida vuorovaikutustasi LLM-ohjelmien kanssa lisäämällä muistoja 'Hallitse'-painikkeen kautta, jolloin ne ovat hyödyllisempiä ja räätälöityjä sinua varten.",
+	"You cannot upload an empty file.": "Et voi ladata tyhjää tiedostoa.",
+	"You do not have permission to upload files.": "Sinulla ei ole lupaa ladata tiedostoja.",
 	"You have no archived conversations.": "Sinulla ei ole arkistoituja keskusteluja.",
 	"You have shared this chat": "Olet jakanut tämän keskustelun",
-	"You're a helpful assistant.": "Olet avulias apulainen.",
+	"You're a helpful assistant.": "Olet avulias avustaja.",
 	"You're now logged in.": "Olet nyt kirjautunut sisään.",
-	"Your account status is currently pending activation.": "",
-	"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
-	"Youtube": "Youtube",
-	"Youtube Loader Settings": "Youtube Loader-asetukset"
+	"Your account status is currently pending activation.": "Tilisi tila on tällä hetkellä odottaa aktivointia.",
+	"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "Koko panoksesi menee suoraan lisäosan kehittäjälle; Open WebUI ei pidätä prosenttiosuutta. Valittu rahoitusalusta voi kuitenkin periä omia maksujaan.",
+	"Youtube": "YouTube",
+	"Youtube Loader Settings": "YouTube Loader -asetukset"
 }

+ 11 - 3
src/lib/i18n/locales/fr-CA/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": " 's', 'm', 'h', 'd', 'w' ou '-1' pour une durée illimitée.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(par ex. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(par exemple `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "",
 	"Auto-Copy Response to Clipboard": "Copie automatique de la réponse vers le presse-papiers",
 	"Auto-playback response": "Réponse de lecture automatique",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "",
 	"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Chaîne d'authentification de l'API",
 	"AUTOMATIC1111 Base URL": "URL de base AUTOMATIC1111",
@@ -119,6 +122,7 @@
 	"Certificate Path": "",
 	"Change Password": "Changer le mot de passe",
 	"Character": "",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "Chat",
 	"Chat Background Image": "Image d'arrière-plan de la fenêtre de chat",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "Moteur de modèle d'encodage",
 	"Embedding model set to \"{{embedding_model}}\"": "Modèle d'encodage défini sur « {{embedding_model}} »",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "Activer le partage communautaire",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "Activer les nouvelles inscriptions",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "Activer la recherche sur le Web",
-	"Enable Web Search Query Generation": "",
 	"Enabled": "",
 	"Engine": "Moteur",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Vérifiez que votre fichier CSV comprenne les 4 colonnes dans cet ordre : Name, Email, Password, Role.",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "Entrez l'étiquette du modèle (par ex. {{modelTag}})",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Entrez le nombre de pas (par ex. 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "",
 	"Enter Scheduler (e.g. Karras)": "",
 	"Enter Score": "Entrez votre score",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "",
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
+	"Please select a model first.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "Attitude positive",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "",
 	"Prompts": "Prompts",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Récupérer « {{searchValue}} » depuis Ollama.com",
 	"Pull a model from Ollama.com": "Télécharger un modèle depuis Ollama.com",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Les notifications de réponse ne peuvent pas être activées car les autorisations du site web ont été refusées. Veuillez visiter les paramètres de votre navigateur pour accorder l'accès nécessaire.",
 	"Response splitting": "Fractionnement de la réponse",
 	"Result": "",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "",
 	"RK": "",
 	"Role": "Rôle",
@@ -839,6 +845,7 @@
 	"System": "Système",
 	"System Instructions": "",
 	"System Prompt": "Prompt du système",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "Appuyez pour interrompre",
@@ -981,6 +988,7 @@
 	"Web Loader Settings": "Paramètres du chargeur web",
 	"Web Search": "Recherche Web",
 	"Web Search Engine": "Moteur de recherche Web",
+	"Web Search Query Generation": "",
 	"Webhook URL": "URL du webhook",
 	"WebUI Settings": "Paramètres de WebUI",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",

+ 214 - 206
src/lib/i18n/locales/fr-FR/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": " 's', 'm', 'h', 'd', 'w' ou '-1' pour une durée illimitée.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(par ex. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(par exemple `sh webui.sh --api`)",
@@ -11,33 +12,33 @@
 	"A task model is used when performing tasks such as generating titles for chats and web search queries": "Un modèle de tâche est utilisé lors de l’exécution de tâches telles que la génération de titres pour les conversations et les requêtes de recherche sur le web.",
 	"a user": "un utilisateur",
 	"About": "À propos",
-	"Access": "",
-	"Access Control": "",
-	"Accessible to all users": "",
+	"Access": "Accès",
+	"Access Control": "Contrôle d'accès",
+	"Accessible to all users": "Accessible à tous les utilisateurs",
 	"Account": "Compte",
 	"Account Activation Pending": "Activation du compte en attente",
 	"Accurate information": "Information exacte",
 	"Actions": "Actions",
-	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "",
+	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Activez cette commande en tapant \"/{{COMMAND}}\" dans l'entrée de chat.",
 	"Active Users": "Utilisateurs actifs",
 	"Add": "Ajouter",
-	"Add a model ID": "",
+	"Add a model ID": "Ajouter un identifiant de modèle",
 	"Add a short description about what this model does": "Ajoutez une brève description de ce que fait ce modèle.",
 	"Add a tag": "Ajouter un tag",
 	"Add Arena Model": "Ajouter un modèle d'arène",
-	"Add Connection": "",
+	"Add Connection": "Ajouter une connexion",
 	"Add Content": "Ajouter du contenu",
 	"Add content here": "Ajoutez du contenu ici",
 	"Add custom prompt": "Ajouter un prompt personnalisé",
 	"Add Files": "Ajouter des fichiers",
-	"Add Group": "",
+	"Add Group": "Ajouter un groupe",
 	"Add Memory": "Ajouter de la mémoire",
 	"Add Model": "Ajouter un modèle",
 	"Add Tag": "Ajouter un tag",
 	"Add Tags": "Ajouter des tags",
 	"Add text content": "Ajouter du contenu textuel",
 	"Add User": "Ajouter un utilisateur",
-	"Add User Group": "",
+	"Add User Group": "Ajouter un groupe d'utilisateurs",
 	"Adjusting these settings will apply changes universally to all users.": "L'ajustement de ces paramètres appliquera universellement les changements à tous les utilisateurs.",
 	"admin": "administrateur",
 	"Admin": "Administrateur",
@@ -48,18 +49,18 @@
 	"Advanced Params": "Paramètres avancés",
 	"All chats": "Toutes les conversations",
 	"All Documents": "Tous les documents",
-	"All models deleted successfully": "",
-	"Allow Chat Delete": "",
+	"All models deleted successfully": "Tous les modèles ont été supprimés avec succès",
+	"Allow Chat Delete": "Autoriser la suppression de la conversation",
 	"Allow Chat Deletion": "Autoriser la suppression de l'historique de chat",
-	"Allow Chat Edit": "",
-	"Allow File Upload": "",
+	"Allow Chat Edit": "Autoriser la modification de la conversation",
+	"Allow File Upload": "Autoriser le téléchargement de fichiers",
 	"Allow non-local voices": "Autoriser les voix non locales",
 	"Allow Temporary Chat": "Autoriser le chat éphémère",
 	"Allow User Location": "Autoriser l'emplacement de l'utilisateur",
 	"Allow Voice Interruption in Call": "Autoriser l'interruption vocale pendant un appel",
 	"Already have an account?": "Avez-vous déjà un compte ?",
-	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
-	"Amazing": "",
+	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Alternative au top_p, visant à assurer un équilibre entre qualité et variété. Le paramètre p représente la probabilité minimale pour qu'un token soit pris en compte, par rapport à la probabilité du token le plus probable. Par exemple, avec p=0.05 et le token le plus probable ayant une probabilité de 0.9, les logits ayant une valeur inférieure à 0.045 sont filtrés. (Par défaut : 0.0)",
+	"Amazing": "Incroyable",
 	"an assistant": "un assistant",
 	"and": "et",
 	"and {{COUNT}} more": "et {{COUNT}} autres",
@@ -68,15 +69,15 @@
 	"API Key": "Clé d'API",
 	"API Key created.": "Clé d'API générée.",
 	"API keys": "Clés d'API",
-	"Application DN": "",
-	"Application DN Password": "",
-	"applies to all users with the \"user\" role": "",
+	"Application DN": "DN de l'application",
+	"Application DN Password": "Mot de passe DN de l'application",
+	"applies to all users with the \"user\" role": "s'applique à tous les utilisateurs ayant le rôle « utilisateur »",
 	"April": "Avril",
 	"Archive": "Archiver",
 	"Archive All Chats": "Archiver toutes les conversations",
 	"Archived Chats": "Conversations archivées",
-	"archived-chat-export": "",
-	"Are you sure you want to unarchive all archived chats?": "",
+	"archived-chat-export": "exportation de conversation archivée",
+	"Are you sure you want to unarchive all archived chats?": "Êtes-vous sûr de vouloir désarchiver toutes les conversations archivées?",
 	"Are you sure?": "Êtes-vous certain ?",
 	"Arena Models": "Modèles d'arène",
 	"Artifacts": "Artéfacts",
@@ -84,19 +85,21 @@
 	"Assistant": "Assistant",
 	"Attach file": "Joindre un document",
 	"Attention to detail": "Attention aux détails",
-	"Attribute for Username": "",
+	"Attribute for Username": "Attribut pour le nom d'utilisateur",
 	"Audio": "Audio",
 	"August": "Août",
-	"Authenticate": "",
+	"Authenticate": "Authentifier",
 	"Auto-Copy Response to Clipboard": "Copie automatique de la réponse vers le presse-papiers",
 	"Auto-playback response": "Lire automatiquement la réponse",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "Automatic1111",
 	"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Chaîne d'authentification de l'API",
 	"AUTOMATIC1111 Base URL": "URL de base AUTOMATIC1111",
 	"AUTOMATIC1111 Base URL is required.": "L'URL de base {AUTOMATIC1111} est requise.",
 	"Available list": "Liste disponible",
 	"available!": "disponible !",
-	"Awful": "",
+	"Awful": "Horrible",
 	"Azure AI Speech": "Azure AI Speech",
 	"Azure Region": "Région Azure",
 	"Back": "Retour en arrière",
@@ -106,27 +109,28 @@
 	"Batch Size (num_batch)": "Batch Size (num_batch)",
 	"before": "avant",
 	"Being lazy": "Être fainéant",
-	"Bing Search V7 Endpoint": "",
-	"Bing Search V7 Subscription Key": "",
+	"Bing Search V7 Endpoint": "Point de terminaison Bing Search V7",
+	"Bing Search V7 Subscription Key": "Clé d'abonnement Bing Search V7",
 	"Brave Search API Key": "Clé API Brave Search",
-	"By {{name}}": "",
+	"By {{name}}": "Par {{name}}",
 	"Bypass SSL verification for Websites": "Bypasser la vérification SSL pour les sites web",
 	"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",
 	"Camera": "Appareil photo",
 	"Cancel": "Annuler",
 	"Capabilities": "Capacités",
-	"Certificate Path": "",
+	"Certificate Path": "Chemin du certificat",
 	"Change Password": "Changer le mot de passe",
 	"Character": "Caractère",
-	"Chart new frontiers": "",
+	"Character limit for autocomplete generation input": "",
+	"Chart new frontiers": "Tracer de nouvelles frontières",
 	"Chat": "Chat",
 	"Chat Background Image": "Image d'arrière-plan de la fenêtre de chat",
 	"Chat Bubble UI": "Bulles de chat",
 	"Chat Controls": "Contrôles du chat",
 	"Chat direction": "Direction du chat",
 	"Chat Overview": "Aperçu du chat",
-	"Chat Permissions": "",
+	"Chat Permissions": "Autorisations de chat",
 	"Chat Tags Auto-Generation": "Génération automatique des tags",
 	"Chats": "Conversations",
 	"Check Again": "Vérifiez à nouveau.",
@@ -136,11 +140,11 @@
 	"Chunk Overlap": "Chevauchement des chunks",
 	"Chunk Params": "Paramètres des chunks",
 	"Chunk Size": "Taille des chunks",
-	"Ciphers": "",
+	"Ciphers": "Chiffres",
 	"Citation": "Citation",
 	"Clear memory": "Effacer la mémoire",
-	"click here": "",
-	"Click here for filter guides.": "",
+	"click here": "cliquez ici",
+	"Click here for filter guides.": "Cliquez ici pour les guides de filtrage.",
 	"Click here for help.": "Cliquez ici pour obtenir de l'aide.",
 	"Click here to": "Cliquez ici pour",
 	"Click here to download user import template file.": "Cliquez ici pour télécharger le fichier modèle d'importation des utilisateurs.",
@@ -157,7 +161,7 @@
 	"Code execution": "Exécution de code",
 	"Code formatted successfully": "Le code a été formaté avec succès",
 	"Collection": "Collection",
-	"Color": "",
+	"Color": "Couleur",
 	"ComfyUI": "ComfyUI",
 	"ComfyUI Base URL": "URL de base ComfyUI",
 	"ComfyUI Base URL is required.": "L'URL de base ComfyUI est requise.",
@@ -166,8 +170,8 @@
 	"Command": "Commande",
 	"Completions": "Complétions",
 	"Concurrent Requests": "Demandes concurrentes",
-	"Configure": "",
-	"Configure Models": "",
+	"Configure": "Configurer",
+	"Configure Models": "Configurer les modèles",
 	"Confirm": "Confirmer",
 	"Confirm Password": "Confirmer le mot de passe",
 	"Confirm your action": "Confirmer votre action",
@@ -178,11 +182,11 @@
 	"Context Length": "Longueur du contexte",
 	"Continue Response": "Continuer la réponse",
 	"Continue with {{provider}}": "Continuer avec {{provider}}",
-	"Continue with Email": "",
-	"Continue with LDAP": "",
+	"Continue with Email": "Continuer avec l'email",
+	"Continue with LDAP": "Continuer avec LDAP",
 	"Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "Contrôle la façon dont le texte des messages est divisé pour les demandes de Text-to-Speech. « ponctuation » divise en phrases, « paragraphes » divise en paragraphes et « aucun » garde le message en tant que chaîne de texte unique.",
 	"Controls": "Contrôles",
-	"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "",
+	"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "Contrôle l'équilibre entre la cohérence et la diversité de la sortie. Une valeur plus basse produira un texte plus focalisé et cohérent. (Par défaut : 5.0)",
 	"Copied": "Copié",
 	"Copied shared chat URL to clipboard!": "URL du chat copié dans le presse-papiers !",
 	"Copied to clipboard": "Copié dans le presse-papiers",
@@ -192,12 +196,12 @@
 	"Copy Link": "Copier le lien",
 	"Copy to clipboard": "Copier dans le presse-papiers",
 	"Copying to clipboard was successful!": "La copie dans le presse-papiers a réussi !",
-	"Create": "",
-	"Create a knowledge base": "",
+	"Create": "Créer",
+	"Create a knowledge base": "Créer une base de connaissances",
 	"Create a model": "Créer un modèle",
 	"Create Account": "Créer un compte",
-	"Create Admin Account": "",
-	"Create Group": "",
+	"Create Admin Account": "Créer un compte administrateur",
+	"Create Group": "Créer un groupe",
 	"Create Knowledge": "Créer une connaissance",
 	"Create new key": "Créer une nouvelle clé",
 	"Create new secret key": "Créer une nouvelle clé secrète",
@@ -216,17 +220,17 @@
 	"Default (SentenceTransformers)": "Par défaut (Sentence Transformers)",
 	"Default Model": "Modèle standard",
 	"Default model updated": "Modèle par défaut mis à jour",
-	"Default Models": "",
-	"Default permissions": "",
-	"Default permissions updated successfully": "",
+	"Default Models": "Modèles par défaut",
+	"Default permissions": "Autorisations par défaut",
+	"Default permissions updated successfully": "Autorisations par défaut mises à jour avec succès",
 	"Default Prompt Suggestions": "Suggestions de prompts par défaut",
-	"Default to 389 or 636 if TLS is enabled": "",
-	"Default to ALL": "",
+	"Default to 389 or 636 if TLS is enabled": "Par défaut à 389 ou 636 si TLS est activé",
+	"Default to ALL": "Par défaut à TOUS",
 	"Default User Role": "Rôle utilisateur par défaut",
 	"Delete": "Supprimer",
 	"Delete a model": "Supprimer un modèle",
 	"Delete All Chats": "Supprimer toutes les conversations",
-	"Delete All Models": "",
+	"Delete All Models": "Supprimer tous les modèles",
 	"Delete chat": "Supprimer la conversation",
 	"Delete Chat": "Supprimer la Conversation",
 	"Delete chat?": "Supprimer la conversation ?",
@@ -238,8 +242,8 @@
 	"Delete User": "Supprimer le compte d'utilisateur",
 	"Deleted {{deleteModelTag}}": "Supprimé {{deleteModelTag}}",
 	"Deleted {{name}}": "Supprimé {{name}}",
-	"Deleted User": "",
-	"Describe your knowledge base and objectives": "",
+	"Deleted User": "Utilisateur supprimé",
+	"Describe your knowledge base and objectives": "Décrivez votre base de connaissances et vos objectifs",
 	"Description": "Description",
 	"Didn't fully follow instructions": "N'a pas entièrement respecté les instructions",
 	"Disabled": "Désactivé",
@@ -247,17 +251,17 @@
 	"Discover a model": "Trouvez un modèle",
 	"Discover a prompt": "Trouvez un prompt",
 	"Discover a tool": "Trouvez un outil",
-	"Discover wonders": "",
+	"Discover wonders": "Découvrir des merveilles",
 	"Discover, download, and explore custom functions": "Découvrez, téléchargez et explorez des fonctions personnalisées",
 	"Discover, download, and explore custom prompts": "Découvrez, téléchargez et explorez des prompts personnalisés",
 	"Discover, download, and explore custom tools": "Découvrez, téléchargez et explorez des outils personnalisés",
 	"Discover, download, and explore model presets": "Découvrir, télécharger et explorer des préréglages de modèles",
 	"Dismissible": "Fermeture",
-	"Display": "",
+	"Display": "Afficher",
 	"Display Emoji in Call": "Afficher les emojis pendant l'appel",
 	"Display the username instead of You in the Chat": "Afficher le nom d'utilisateur à la place de \"Vous\" dans le chat",
-	"Displays citations in the response": "",
-	"Dive into knowledge": "",
+	"Displays citations in the response": "Affiche les citations dans la réponse",
+	"Dive into knowledge": "Plonger dans les connaissances",
 	"Do not install functions from sources you do not fully trust.": "N'installez pas de fonctions provenant de sources auxquelles vous ne faites pas entièrement confiance.",
 	"Do not install tools from sources you do not fully trust.": "N'installez pas d'outils provenant de sources auxquelles vous ne faites pas entièrement confiance.",
 	"Document": "Document",
@@ -272,53 +276,51 @@
 	"Download": "Télécharger",
 	"Download canceled": "Téléchargement annulé",
 	"Download Database": "Télécharger la base de données",
-	"Drag and drop a file to upload or select a file to view": "",
+	"Drag and drop a file to upload or select a file to view": "Glissez et déposez un fichier pour le télécharger ou sélectionnez un fichier à visualiser",
 	"Draw": "Match nul",
 	"Drop any files here to add to the conversation": "Déposez des fichiers ici pour les ajouter à la conversation",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "par ex. '30s', '10 min'. Les unités de temps valides sont 's', 'm', 'h'.",
-	"e.g. A filter to remove profanity from text": "",
-	"e.g. My Filter": "",
-	"e.g. My Tools": "",
-	"e.g. my_filter": "",
-	"e.g. my_tools": "",
-	"e.g. Tools for performing various operations": "",
+	"e.g. A filter to remove profanity from text": "par ex. un filtre pour retirer les vulgarités du texte",
+	"e.g. My Filter": "par ex. Mon Filtre",
+	"e.g. My Tools": "par ex. Mes Outils",
+	"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",
 	"Edit": "Modifier",
 	"Edit Arena Model": "Modifier le modèle d'arène",
-	"Edit Connection": "",
-	"Edit Default Permissions": "",
+	"Edit Connection": "Modifier la connexion",
+	"Edit Default Permissions": "Modifier les autorisations par défaut",
 	"Edit Memory": "Modifier la mémoire",
 	"Edit User": "Modifier l'utilisateur",
-	"Edit User Group": "",
+	"Edit User Group": "Modifier le groupe d'utilisateurs",
 	"ElevenLabs": "ElevenLabs",
 	"Email": "E-mail",
-	"Embark on adventures": "",
+	"Embark on adventures": "Embarquez pour des aventures",
 	"Embedding Batch Size": "Taille du lot d'embedding",
 	"Embedding Model": "Modèle d'embedding",
 	"Embedding Model Engine": "Moteur de modèle d'embedding",
 	"Embedding model set to \"{{embedding_model}}\"": "Modèle d'embedding défini sur « {{embedding_model}} »",
-	"Enable API Key Auth": "",
+	"Enable API Key Auth": "Activer l'authentification par clé API",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "Activer le partage communautaire",
-	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
-	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
+	"Enable 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.": "Activer le verrouillage de la mémoire (mlock) pour empêcher les données du modèle d'être échangées de la RAM. Cette option verrouille l'ensemble de pages de travail du modèle en RAM, garantissant qu'elles ne seront pas échangées vers le disque. Cela peut aider à maintenir les performances en évitant les défauts de page et en assurant un accès rapide aux données.",
+	"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.": "Activer le mappage de la mémoire (mmap) pour charger les données du modèle. Cette option permet au système d'utiliser le stockage disque comme une extension de la RAM en traitant les fichiers disque comme s'ils étaient en RAM. Cela peut améliorer les performances du modèle en permettant un accès plus rapide aux données. Cependant, cela peut ne pas fonctionner correctement avec tous les systèmes et peut consommer une quantité significative d'espace disque.",
 	"Enable Message Rating": "Activer l'évaluation des messages",
-	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
+	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "Activer l'échantillonnage Mirostat pour contrôler la perplexité. (Par défaut : 0, 0 = Désactivé, 1 = Mirostat, 2 = Mirostat 2.0)",
 	"Enable New Sign Ups": "Activer les nouvelles inscriptions",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "Activer la recherche Web",
-	"Enable Web Search Query Generation": "Activer la génération de requêtes de recherche Web",
 	"Enabled": "Activé",
 	"Engine": "Moteur",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Vérifiez que votre fichier CSV comprenne les 4 colonnes dans cet ordre : Name, Email, Password, Role.",
 	"Enter {{role}} message here": "Entrez le message {{role}} ici",
 	"Enter a detail about yourself for your LLMs to recall": "Saisissez un détail sur vous-même que vos LLMs pourront se rappeler",
 	"Enter api auth string (e.g. username:password)": "Entrez la chaîne d'authentification de l'API (par ex. nom d'utilisateur:mot de passe)",
-	"Enter Application DN": "",
-	"Enter Application DN Password": "",
-	"Enter Bing Search V7 Endpoint": "",
-	"Enter Bing Search V7 Subscription Key": "",
+	"Enter Application DN": "Entrez le DN de l'application",
+	"Enter Application DN Password": "Entrez le mot de passe DN de l'application",
+	"Enter Bing Search V7 Endpoint": "Entrez le point de terminaison Bing Search V7",
+	"Enter Bing Search V7 Subscription Key": "Entrez la clé d'abonnement Bing Search V7",
 	"Enter Brave Search API Key": "Entrez la clé API Brave Search",
-	"Enter certificate path": "",
+	"Enter certificate path": "Entrez le chemin du certificat",
 	"Enter CFG Scale (e.g. 7.0)": "Entrez l'échelle CFG (par ex. 7.0)",
 	"Enter Chunk Overlap": "Entrez le chevauchement des chunks",
 	"Enter Chunk Size": "Entrez la taille des chunks",
@@ -327,25 +329,26 @@
 	"Enter Google PSE API Key": "Entrez la clé API Google PSE",
 	"Enter Google PSE Engine Id": "Entrez l'identifiant du moteur Google PSE",
 	"Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (par ex. 512x512)",
-	"Enter Jina API Key": "",
+	"Enter Jina API Key": "Entrez la clé API Jina",
 	"Enter language codes": "Entrez les codes de langue",
 	"Enter Model ID": "Entrez l'ID du modèle",
 	"Enter model tag (e.g. {{modelTag}})": "Entrez le tag du modèle (par ex. {{modelTag}})",
-	"Enter Mojeek Search API Key": "",
+	"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 proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "Entrez le sampler (par ex. Euler a)",
 	"Enter Scheduler (e.g. Karras)": "Entrez le planificateur (par ex. Karras)",
 	"Enter Score": "Entrez votre score",
 	"Enter SearchApi API Key": "Entrez la clé API SearchApi",
 	"Enter SearchApi Engine": "Entrez le moteur de recherche SearchApi",
 	"Enter Searxng Query URL": "Entrez l'URL de la requête Searxng",
-	"Enter Seed": "",
+	"Enter Seed": "Entrez Seed",
 	"Enter Serper API Key": "Entrez la clé API Serper",
 	"Enter Serply API Key": "Entrez la clé API Serply",
 	"Enter Serpstack API Key": "Entrez la clé API Serpstack",
-	"Enter server host": "",
-	"Enter server label": "",
-	"Enter server port": "",
+	"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 stop sequence": "Entrez la séquence d'arrêt",
 	"Enter system prompt": "Entrez le prompt système",
 	"Enter Tavily API Key": "Entrez la clé API Tavily",
@@ -358,39 +361,39 @@
 	"Enter your message": "Entrez votre message",
 	"Enter Your Password": "Entrez votre mot de passe",
 	"Enter Your Role": "Entrez votre rôle",
-	"Enter Your Username": "",
+	"Enter Your Username": "Entrez votre nom d'utilisateur",
 	"Error": "Erreur",
 	"ERROR": "ERREUR",
 	"Evaluations": "Évaluations",
-	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
-	"Example: ALL": "",
-	"Example: ou=users,dc=foo,dc=example": "",
-	"Example: sAMAccountName or uid or userPrincipalName": "",
+	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Exemple: (&(objectClass=inetOrgPerson)(uid=%s))",
+	"Example: ALL": "Exemple: TOUS",
+	"Example: ou=users,dc=foo,dc=example": "Exemple: ou=utilisateurs,dc=foo,dc=exemple",
+	"Example: sAMAccountName or uid or userPrincipalName": "Exemple: sAMAccountName ou uid ou userPrincipalName",
 	"Exclude": "Exclure",
 	"Experimental": "Expérimental",
-	"Explore the cosmos": "",
+	"Explore the cosmos": "Explorer le cosmos",
 	"Export": "Exportation",
-	"Export All Archived Chats": "",
+	"Export All Archived Chats": "Exporter toutes les conversations archivées",
 	"Export All Chats (All Users)": "Exporter toutes les conversations (de tous les utilisateurs)",
 	"Export chat (.json)": "Exporter la conversation (.json)",
 	"Export Chats": "Exporter les conversations",
 	"Export Config to JSON File": "Exporter la configuration vers un fichier JSON",
 	"Export Functions": "Exporter des fonctions",
 	"Export Models": "Exporter des modèles",
-	"Export Presets": "",
+	"Export Presets": "Exporter les préréglages",
 	"Export Prompts": "Exporter des prompts",
-	"Export to CSV": "",
+	"Export to CSV": "Exporter en CSV",
 	"Export Tools": "Exporter des outils",
 	"External Models": "Modèles externes",
 	"Failed to add file.": "Échec de l'ajout du fichier.",
 	"Failed to create API Key.": "Échec de la création de la clé API.",
 	"Failed to read clipboard contents": "Échec de la lecture du contenu du presse-papiers",
-	"Failed to save models configuration": "",
+	"Failed to save models configuration": "Échec de la sauvegarde de la configuration des modèles",
 	"Failed to update settings": "Échec de la mise à jour des paramètres",
 	"Failed to upload file.": "Échec du téléchargement du fichier.",
 	"February": "Février",
 	"Feedback History": "Historique des avis",
-	"Feedbacks": "",
+	"Feedbacks": "Avis",
 	"Feel free to add specific details": "N'hésitez pas à ajouter des détails spécifiques",
 	"File": "Fichier",
 	"File added successfully.": "Fichier ajouté avec succès.",
@@ -411,18 +414,18 @@
 	"Folder name cannot be empty.": "Le nom du dossier ne peut pas être vide.",
 	"Folder name updated successfully": "Le nom du dossier a été mis à jour avec succès",
 	"Followed instructions perfectly": "A parfaitement suivi les instructions",
-	"Forge new paths": "",
+	"Forge new paths": "Créer de nouveaux chemins",
 	"Form": "Formulaire",
 	"Format your variables using brackets like this:": "Formatez vos variables en utilisant des parenthèses comme ceci :",
 	"Frequency Penalty": "Pénalité de fréquence",
 	"Function": "Fonction",
 	"Function created successfully": "La fonction a été créée avec succès",
 	"Function deleted successfully": "Fonction supprimée avec succès",
-	"Function Description": "",
-	"Function ID": "",
+	"Function Description": "Description de la fonction",
+	"Function ID": "ID de la fonction",
 	"Function is now globally disabled": "La fonction est désormais désactivée globalement",
 	"Function is now globally enabled": "La fonction est désormais activée globalement",
-	"Function Name": "",
+	"Function Name": "Nom de la fonction",
 	"Function updated successfully": "La fonction a été mise à jour avec succès",
 	"Functions": "Fonctions",
 	"Functions allow arbitrary code execution": "Les fonctions permettent l'exécution de code arbitraire",
@@ -433,34 +436,34 @@
 	"Generate Image": "Générer une image",
 	"Generating search query": "Génération d'une requête de recherche",
 	"Generation Info": "Informations sur la génération",
-	"Get started": "",
-	"Get started with {{WEBUI_NAME}}": "",
+	"Get started": "Commencer",
+	"Get started with {{WEBUI_NAME}}": "Commencez avec {{WEBUI_NAME}}",
 	"Global": "Mondial",
 	"Good Response": "Bonne réponse",
 	"Google PSE API Key": "Clé API Google PSE",
 	"Google PSE Engine Id": "ID du moteur de recherche PSE de Google",
-	"Group created successfully": "",
-	"Group deleted successfully": "",
-	"Group Description": "",
-	"Group Name": "",
-	"Group updated successfully": "",
-	"Groups": "",
+	"Group created successfully": "Groupe créé avec succès",
+	"Group deleted successfully": "Groupe supprimé avec succès",
+	"Group Description": "Description du groupe",
+	"Group Name": "Nom du groupe",
+	"Group updated successfully": "Groupe mis à jour avec succès",
+	"Groups": "Groupes",
 	"h:mm a": "h:mm a",
 	"Haptic Feedback": "Retour haptique",
 	"has no conversations.": "n'a aucune conversation.",
 	"Hello, {{name}}": "Bonjour, {{name}}.",
 	"Help": "Aide",
 	"Help us create the best community leaderboard by sharing your feedback history!": "Aidez-nous à créer le meilleur classement communautaire en partageant votre historique des avis !",
-	"Hex Color": "",
-	"Hex Color - Leave empty for default color": "",
+	"Hex Color": "Couleur Hex",
+	"Hex Color - Leave empty for default color": "Couleur Hex - Laissez vide pour la couleur par défaut",
 	"Hide": "Cacher",
-	"Host": "",
+	"Host": "Hôte",
 	"How can I help you today?": "Comment puis-je vous aider aujourd'hui ?",
-	"How would you rate this response?": "",
+	"How would you rate this response?": "Comment évalueriez-vous cette réponse ?",
 	"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",
-	"Ignite curiosity": "",
+	"Ignite curiosity": "Éveiller la curiosité",
 	"Image Generation (Experimental)": "Génération d'images (expérimental)",
 	"Image Generation Engine": "Moteur de génération d'images",
 	"Image Settings": "Paramètres de génération d'images",
@@ -469,13 +472,13 @@
 	"Import Config from JSON File": "Importer la configuration depuis un fichier JSON",
 	"Import Functions": "Importer des fonctions",
 	"Import Models": "Importer des modèles",
-	"Import Presets": "",
+	"Import Presets": "Importer les préréglages",
 	"Import Prompts": "Importer des prompts",
 	"Import Tools": "Importer des outils",
 	"Include": "Inclure",
 	"Include `--api-auth` flag when running stable-diffusion-webui": "Inclure le drapeau `--api-auth` lors de l'exécution de stable-diffusion-webui",
 	"Include `--api` flag when running stable-diffusion-webui": "Inclure le drapeau `--api` lorsque vous exécutez stable-diffusion-webui",
-	"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive. (Default: 0.1)": "",
+	"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive. (Default: 0.1)": "Influence la rapidité avec laquelle l'algorithme répond aux retours du texte généré. Un taux d'apprentissage plus bas entraînera des ajustements plus lents, tandis qu'un taux d'apprentissage plus élevé rendra l'algorithme plus réactif. (Par défaut : 0.1)",
 	"Info": "Info",
 	"Input commands": "Commandes d'entrée",
 	"Install from Github URL": "Installer depuis une URL GitHub",
@@ -484,7 +487,7 @@
 	"Invalid file format.": "Format de fichier non valide.",
 	"Invalid Tag": "Tag non valide",
 	"January": "Janvier",
-	"Jina API Key": "",
+	"Jina API Key": "Clé API Jina",
 	"join our Discord for help.": "Rejoignez notre Discord pour obtenir de l'aide.",
 	"JSON": "JSON",
 	"JSON Preview": "Aperçu JSON",
@@ -493,31 +496,31 @@
 	"JWT Expiration": "Expiration du token JWT",
 	"JWT Token": "Token JWT",
 	"Keep Alive": "Temps de maintien connecté",
-	"Key": "",
+	"Key": "Clé",
 	"Keyboard shortcuts": "Raccourcis clavier",
 	"Knowledge": "Connaissances",
-	"Knowledge Access": "",
+	"Knowledge Access": "Accès aux connaissances",
 	"Knowledge created successfully.": "Connaissance créée avec succès.",
 	"Knowledge deleted successfully.": "Connaissance supprimée avec succès.",
 	"Knowledge reset successfully.": "Connaissance réinitialisée avec succès.",
 	"Knowledge updated successfully": "Connaissance mise à jour avec succès",
-	"Label": "",
+	"Label": "Étiquette",
 	"Landing Page Mode": "Mode de la page d'accueil",
 	"Language": "Langue",
 	"Last Active": "Dernière activité",
 	"Last Modified": "Dernière modification",
-	"LDAP": "",
-	"LDAP server updated": "",
+	"LDAP": "LDAP",
+	"LDAP server updated": "Serveur LDAP mis à jour",
 	"Leaderboard": "Classement",
 	"Leave empty for unlimited": "Laissez vide pour illimité",
-	"Leave empty to include all models from \"{{URL}}/api/tags\" endpoint": "",
-	"Leave empty to include all models from \"{{URL}}/models\" endpoint": "",
+	"Leave empty to include all models from \"{{URL}}/api/tags\" endpoint": "Laissez vide pour inclure tous les modèles depuis le point de terminaison \"{{URL}}/api/tags\"",
+	"Leave empty to include all models from \"{{URL}}/models\" endpoint": "Laissez vide pour inclure tous les modèles depuis le point de terminaison \"{{URL}}/models\"",
 	"Leave empty to include all models or select specific models": "Laissez vide pour inclure tous les modèles ou sélectionnez des modèles spécifiques",
 	"Leave empty to use the default prompt, or enter a custom prompt": "Laissez vide pour utiliser le prompt par défaut, ou entrez un prompt personnalisé",
 	"Light": "Clair",
 	"Listening...": "Écoute en cours...",
 	"LLMs can make mistakes. Verify important information.": "Les LLM peuvent faire des erreurs. Vérifiez les informations importantes.",
-	"Local": "",
+	"Local": "Local",
 	"Local Models": "Modèles locaux",
 	"Lost": "Perdu",
 	"LTR": "LTR",
@@ -526,9 +529,9 @@
 	"Make sure to export a workflow.json file as API format from ComfyUI.": "Veillez à exporter un fichier workflow.json au format API depuis ComfyUI.",
 	"Manage": "Gérer",
 	"Manage Arena Models": "Gérer les modèles d'arène",
-	"Manage Ollama": "",
-	"Manage Ollama API Connections": "",
-	"Manage OpenAI API Connections": "",
+	"Manage Ollama": "Gérer Ollama",
+	"Manage Ollama API Connections": "Gérer les connexions API Ollama",
+	"Manage OpenAI API Connections": "Gérer les connexions API OpenAI",
 	"Manage Pipelines": "Gérer les pipelines",
 	"March": "Mars",
 	"Max Tokens (num_predict)": "Nb max de tokens (num_predict)",
@@ -562,23 +565,23 @@
 	"Model accepts image inputs": "Le modèle accepte les images en entrée",
 	"Model created successfully!": "Le modèle a été créé avec succès !",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Chemin du système de fichiers de modèle détecté. Le nom court du modèle est requis pour la mise à jour, l'opération ne peut pas être poursuivie.",
-	"Model Filtering": "",
+	"Model Filtering": "Filtrage de modèle",
 	"Model ID": "ID du modèle",
-	"Model IDs": "",
+	"Model IDs": "ID des modèles",
 	"Model Name": "Nom du modèle",
 	"Model not selected": "Modèle non sélectionné",
 	"Model Params": "Paramètres du modèle",
-	"Model Permissions": "",
+	"Model Permissions": "Autorisations du modèle",
 	"Model updated successfully": "Le modèle a été mis à jour avec succès",
 	"Modelfile Content": "Contenu du Fichier de Modèle",
 	"Models": "Modèles",
-	"Models Access": "",
-	"Models configuration saved successfully": "",
-	"Mojeek Search API Key": "",
+	"Models Access": "Accès aux modèles",
+	"Models configuration saved successfully": "Configuration des modèles enregistrée avec succès",
+	"Mojeek Search API Key": "Clé API Mojeek",
 	"more": "plus",
 	"More": "Plus",
 	"Name": "Nom d'utilisateur",
-	"Name your knowledge base": "",
+	"Name your knowledge base": "Nommez votre base de connaissances",
 	"New Chat": "Nouvelle conversation",
 	"New folder": "Nouveau dossier",
 	"New Password": "Nouveau mot de passe",
@@ -588,16 +591,16 @@
 	"No feedbacks found": "Aucun avis trouvé",
 	"No file selected": "Aucun fichier sélectionné",
 	"No files found.": "Aucun fichier trouvé.",
-	"No groups with access, add a group to grant access": "",
+	"No groups with access, add a group to grant access": "Aucun groupe n'a accès, ajoutez un groupe pour accorder l'accès",
 	"No HTML, CSS, or JavaScript content found.": "Aucun contenu HTML, CSS ou JavaScript trouvé.",
 	"No knowledge found": "Aucune connaissance trouvée",
-	"No model IDs": "",
+	"No model IDs": "Aucun ID de modèle",
 	"No models found": "Aucun modèle trouvé",
-	"No models selected": "",
+	"No models selected": "Aucun modèle sélectionné",
 	"No results found": "Aucun résultat trouvé",
 	"No search query generated": "Aucune requête de recherche générée",
 	"No source available": "Aucune source n'est disponible",
-	"No users were found.": "",
+	"No users were found.": "Aucun utilisateur trouvé.",
 	"No valves to update": "Aucune vanne à mettre à jour",
 	"None": "Aucun",
 	"Not factually correct": "Non factuellement correct",
@@ -616,13 +619,13 @@
 	"Ollama": "Ollama",
 	"Ollama API": "API Ollama",
 	"Ollama API disabled": "API Ollama désactivée",
-	"Ollama API settings updated": "",
+	"Ollama API settings updated": "Paramètres de l'API Ollama mis à jour",
 	"Ollama Version": "Version Ollama",
 	"On": "Activé",
-	"Only alphanumeric characters and hyphens are allowed": "",
+	"Only alphanumeric characters and hyphens are allowed": "Seuls les caractères alphanumériques et les tirets sont autorisés",
 	"Only alphanumeric characters and hyphens are allowed in the command string.": "Seuls les caractères alphanumériques et les tirets sont autorisés dans la chaîne de commande.",
 	"Only collections can be edited, create a new knowledge base to edit/add documents.": "Seules les collections peuvent être modifiées, créez une nouvelle base de connaissance pour modifier/ajouter des documents.",
-	"Only select users and groups with permission can access": "",
+	"Only select users and groups with permission can access": "Seuls les utilisateurs et groupes autorisés peuvent accéder",
 	"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oups ! Il semble que l'URL soit invalide. Veuillez vérifier à nouveau et réessayer.",
 	"Oops! There are files still uploading. Please wait for the upload to complete.": "Oups ! Des fichiers sont encore en cours de téléversement. Veuillez patienter jusqu'à la fin du téléversement.",
 	"Oops! There was an error in the previous response.": "Oups ! Il y a eu une erreur dans la réponse précédente.",
@@ -631,34 +634,34 @@
 	"Open in full screen": "Ouvrir en plein écran",
 	"Open new chat": "Ouvrir une nouvelle conversation",
 	"Open WebUI uses faster-whisper internally.": "Open WebUI utilise faster-whisper en interne.",
-	"Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "",
+	"Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Open WebUI utilise SpeechT5 et les embeddings de locuteur CMU Arctic.",
 	"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "La version Open WebUI (v{{OPEN_WEBUI_VERSION}}) est inférieure à la version requise (v{{REQUIRED_VERSION}})",
 	"OpenAI": "OpenAI",
 	"OpenAI API": "API compatibles OpenAI",
 	"OpenAI API Config": "Configuration de l'API OpenAI",
 	"OpenAI API Key is required.": "Une clé API OpenAI est requise.",
-	"OpenAI API settings updated": "",
+	"OpenAI API settings updated": "Paramètres de l'API OpenAI mis à jour",
 	"OpenAI URL/Key required.": "URL/Clé OpenAI requise.",
 	"or": "ou",
-	"Organize your users": "",
+	"Organize your users": "Organisez vos utilisateurs",
 	"Other": "Autre",
 	"OUTPUT": "SORTIE",
 	"Output format": "Format de sortie",
 	"Overview": "Aperçu",
 	"page": "page",
 	"Password": "Mot de passe",
-	"Paste Large Text as File": "",
+	"Paste Large Text as File": "Coller un texte volumineux comme fichier",
 	"PDF document (.pdf)": "Document au format PDF (.pdf)",
 	"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
 	"pending": "en attente",
 	"Permission denied when accessing media devices": "Accès aux appareils multimédias refusé",
 	"Permission denied when accessing microphone": "Autorisation refusée lors de l'accès au micro",
 	"Permission denied when accessing microphone: {{error}}": "Permission refusée lors de l'accès au microphone : {{error}}",
-	"Permissions": "",
+	"Permissions": "Permissions",
 	"Personalization": "Personnalisation",
 	"Pin": "Épingler",
 	"Pinned": "Épinglé",
-	"Pioneer insights": "",
+	"Pioneer insights": "Explorer de nouvelles perspectives",
 	"Pipeline deleted successfully": "Le pipeline a été supprimé avec succès",
 	"Pipeline downloaded successfully": "Le pipeline a été téléchargé avec succès",
 	"Pipelines": "Pipelines",
@@ -669,24 +672,26 @@
 	"Please carefully review the following warnings:": "Veuillez lire attentivement les avertissements suivants :",
 	"Please enter a prompt": "Veuillez saisir un prompt",
 	"Please fill in all fields.": "Veuillez remplir tous les champs.",
+	"Please select a model first.": "",
 	"Please select a reason": "Veuillez sélectionner une raison",
-	"Port": "",
+	"Port": "Port",
 	"Positive attitude": "Attitude positive",
-	"Prefix ID": "",
-	"Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "",
+	"Prefix ID": "ID de préfixe",
+	"Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "Le préfixe ID est utilisé pour éviter les conflits avec d'autres connexions en ajoutant un préfixe aux ID de modèle - laissez vide pour désactiver",
 	"Previous 30 days": "30 derniers jours",
 	"Previous 7 days": "7 derniers jours",
 	"Profile Image": "Image de profil",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (par ex. Dites-moi un fait amusant à propos de l'Empire romain)",
 	"Prompt Content": "Contenu du prompt",
-	"Prompt created successfully": "",
+	"Prompt created successfully": "Prompt créé avec succès",
 	"Prompt suggestions": "Suggestions pour le prompt",
-	"Prompt updated successfully": "",
+	"Prompt updated successfully": "Prompt mis à jour avec succès",
 	"Prompts": "Prompts",
-	"Prompts Access": "",
+	"Prompts Access": "Accès aux prompts",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Récupérer « {{searchValue}} » depuis Ollama.com",
 	"Pull a model from Ollama.com": "Télécharger un modèle depuis Ollama.com",
-	"Query Generation Prompt": "",
+	"Query Generation Prompt": "Prompt de génération de requête",
 	"Query Params": "Paramètres de requête",
 	"RAG Template": "Modèle RAG",
 	"Rating": "Note",
@@ -694,7 +699,7 @@
 	"Read Aloud": "Lire à haute voix",
 	"Record voice": "Enregistrer la voix",
 	"Redirecting you to OpenWebUI Community": "Redirection vers la communauté OpenWebUI",
-	"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)": "",
+	"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)": "Réduit la probabilité de générer des non-sens. Une valeur plus élevée (par exemple 100) donnera des réponses plus diversifiées, tandis qu'une valeur plus basse (par exemple 10) sera plus conservatrice. (Par défaut : 40)",
 	"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Désignez-vous comme « Utilisateur » (par ex. « L'utilisateur apprend l'espagnol »)",
 	"References from": "Références de",
 	"Refused when it shouldn't have": "Refusé alors qu'il n'aurait pas dû l'être",
@@ -704,19 +709,20 @@
 	"Remove": "Retirer",
 	"Remove Model": "Retirer le modèle",
 	"Rename": "Renommer",
-	"Reorder Models": "",
+	"Reorder Models": "Réorganiser les modèles",
 	"Repeat Last N": "Répéter les N derniers",
 	"Request Mode": "Mode de requête",
 	"Reranking Model": "Modèle de ré-ranking",
 	"Reranking model disabled": "Modèle de ré-ranking désactivé",
 	"Reranking model set to \"{{reranking_model}}\"": "Modèle de ré-ranking défini sur « {{reranking_model}} »",
 	"Reset": "Réinitialiser",
-	"Reset All Models": "",
+	"Reset All Models": "Réinitialiser tous les modèles",
 	"Reset Upload Directory": "Réinitialiser le répertoire de téléchargement",
 	"Reset Vector Storage/Knowledge": "Réinitialiser le stockage vectoriel/connaissances",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Les notifications de réponse ne peuvent pas être activées car les autorisations du site web ont été refusées. Veuillez vérifier les paramètres de votre navigateur pour accorder l'accès nécessaire.",
 	"Response splitting": "Fractionnement de la réponse",
 	"Result": "Résultat",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "Saisie de texte enrichi pour le chat",
 	"RK": "Rang",
 	"Role": "Rôle",
@@ -735,18 +741,18 @@
 	"Scroll to bottom when switching between branches": "Défiler vers le bas lors du passage d'une branche à l'autre",
 	"Search": "Recherche",
 	"Search a model": "Rechercher un modèle",
-	"Search Base": "",
+	"Search Base": "Base de recherche",
 	"Search Chats": "Rechercher des conversations",
 	"Search Collection": "Rechercher une collection",
-	"Search Filters": "",
+	"Search Filters": "Filtres de recherche",
 	"search for tags": "Rechercher des tags",
 	"Search Functions": "Rechercher des fonctions",
 	"Search Knowledge": "Rechercher des connaissances",
 	"Search Models": "Rechercher des modèles",
-	"Search options": "",
+	"Search options": "Options de recherche",
 	"Search Prompts": "Rechercher des prompts",
 	"Search Result Count": "Nombre de résultats de recherche",
-	"Search the web": "",
+	"Search the web": "Rechercher sur le web",
 	"Search Tools": "Rechercher des outils",
 	"SearchApi API Key": "Clé API SearchApi",
 	"SearchApi Engine": "Moteur de recherche SearchApi",
@@ -762,7 +768,7 @@
 	"Select a base model": "Sélectionnez un modèle de base",
 	"Select a engine": "Sélectionnez un moteur",
 	"Select a function": "Sélectionnez une fonction",
-	"Select a group": "",
+	"Select a group": "Sélectionner un groupe",
 	"Select a model": "Sélectionnez un modèle",
 	"Select a pipeline": "Sélectionnez un pipeline",
 	"Select a pipeline url": "Sélectionnez l'URL du pipeline",
@@ -785,7 +791,7 @@
 	"Set as default": "Définir comme valeur par défaut",
 	"Set CFG Scale": "Définir la CFG",
 	"Set Default Model": "Définir le modèle par défaut",
-	"Set embedding model": "",
+	"Set embedding model": "Définir le modèle d'embedding",
 	"Set embedding model (e.g. {{model}})": "Définir le modèle d'embedding (par ex. {{model}})",
 	"Set Image Size": "Définir la taille de l'image",
 	"Set reranking model (e.g. {{model}})": "Définir le modèle de ré-ranking (par ex. {{model}})",
@@ -793,29 +799,29 @@
 	"Set Scheduler": "Définir le planificateur",
 	"Set Steps": "Définir le nombre d'étapes",
 	"Set Task Model": "Définir le modèle de tâche",
-	"Set the number of GPU devices used for computation. This option controls how many GPU devices (if available) are used to process incoming requests. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "",
-	"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "",
+	"Set the number of GPU devices used for computation. This option controls how many GPU devices (if available) are used to process incoming requests. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "Définir le nombre de dispositifs GPU utilisés pour le calcul. Cette option contrôle combien de dispositifs GPU (si disponibles) sont utilisés pour traiter les demandes entrantes. L'augmentation de cette valeur peut améliorer de manière significative les performances des modèles optimisés pour l'accélération GPU mais peut également consommer plus d'énergie et de ressources GPU.",
+	"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "Définir le nombre de threads de travail utilisés pour le calcul. Cette option contrôle combien de threads sont utilisés pour traiter les demandes entrantes simultanément. L'augmentation de cette valeur peut améliorer les performances sous de fortes charges de travail concurrentes mais peut également consommer plus de ressources CPU.",
 	"Set Voice": "Choisir la voix",
 	"Set whisper model": "Choisir le modèle Whisper",
-	"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "",
-	"Sets how strongly to penalize repetitions. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. (Default: 1.1)": "",
-	"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)": "",
-	"Sets the size of the context window used to generate the next token. (Default: 2048)": "",
-	"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "",
+	"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "Définit la profondeur de recherche du modèle pour prévenir les répétitions. (Par défaut : 64, 0 = désactivé, -1 = num_ctx)",
+	"Sets how strongly to penalize repetitions. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. (Default: 1.1)": "Définit la force avec laquelle les répétitions sont pénalisées. Une valeur plus élevée (par exemple 1.5) pénalisera plus fortement les répétitions, tandis qu'une valeur plus basse (par exemple 0.9) sera plus indulgente. (Par défaut : 1.1)",
+	"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)": "Définit la graine de nombre aléatoire à utiliser pour la génération. La définition de cette valeur à un nombre spécifique fera que le modèle générera le même texte pour le même prompt. (Par défaut : aléatoire)",
+	"Sets the size of the context window used to generate the next token. (Default: 2048)": "Définit la taille de la fenêtre contextuelle utilisée pour générer le prochain token. (Par défaut : 2048)",
+	"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Définit les séquences d'arrêt à utiliser. Lorsque ce motif est rencontré, le LLM cessera de générer du texte et retournera. Plusieurs motifs d'arrêt peuvent être définis en spécifiant plusieurs paramètres d'arrêt distincts dans un fichier modèle.",
 	"Settings": "Paramètres",
 	"Settings saved successfully!": "Paramètres enregistrés avec succès !",
 	"Share": "Partager",
 	"Share Chat": "Partage de conversation",
 	"Share to OpenWebUI Community": "Partager avec la communauté OpenWebUI",
 	"Show": "Afficher",
-	"Show \"What's New\" modal on login": "",
+	"Show \"What's New\" modal on login": "Afficher la fenêtre modale \"Quoi de neuf\" lors de la connexion",
 	"Show Admin Details in Account Pending Overlay": "Afficher les coordonnées de l'administrateur aux comptes en attente",
 	"Show shortcuts": "Afficher les raccourcis",
 	"Show your support!": "Montrez votre soutien !",
 	"Showcased creativity": "Créativité mise en avant",
 	"Sign in": "Connexion",
 	"Sign in to {{WEBUI_NAME}}": "Connectez-vous à {{WEBUI_NAME}}",
-	"Sign in to {{WEBUI_NAME}} with LDAP": "",
+	"Sign in to {{WEBUI_NAME}} with LDAP": "Connectez-vous à {{WEBUI_NAME}} avec LDAP",
 	"Sign Out": "Déconnexion",
 	"Sign up": "Inscrivez-vous",
 	"Sign up to {{WEBUI_NAME}}": "Inscrivez-vous à {{WEBUI_NAME}}",
@@ -839,8 +845,9 @@
 	"System": "Système",
 	"System Instructions": "Instructions système",
 	"System Prompt": "Prompt système",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "Prompt de génération de tags",
-	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
+	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "L'échantillonnage sans queue est utilisé pour réduire l'impact des tokens moins probables dans la sortie. Une valeur plus élevée (par exemple 2.0) réduira davantage l'impact, tandis qu'une valeur de 1.0 désactive ce paramètre. (par défaut : 1)",
 	"Tap to interrupt": "Appuyez pour interrompre",
 	"Tavily API Key": "Clé API Tavily",
 	"Tell us more:": "Dites-nous en plus à ce sujet : ",
@@ -851,30 +858,30 @@
 	"Text-to-Speech Engine": "Moteur de Text-to-Speech",
 	"Tfs Z": "Tfs Z",
 	"Thanks for your feedback!": "Merci pour vos commentaires !",
-	"The Application Account DN you bind with for search": "",
-	"The base to search for users": "",
-	"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.  (Default: 512)": "",
+	"The Application Account DN you bind with for search": "Le DN du compte de l'application avec lequel vous vous liez pour la recherche",
+	"The base to search for users": "La base pour rechercher des utilisateurs",
+	"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.  (Default: 512)": "La taille de lot détermine combien de demandes de texte sont traitées ensemble en une fois. Une taille de lot plus grande peut augmenter les performances et la vitesse du modèle, mais elle nécessite également plus de mémoire. (Par défaut : 512)",
 	"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Les développeurs de ce plugin sont des bénévoles passionnés issus de la communauté. Si vous trouvez ce plugin utile, merci de contribuer à son développement.",
 	"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Le classement d'évaluation est basé sur le système de notation Elo et est mis à jour en temps réel.",
-	"The LDAP attribute that maps to the username that users use to sign in.": "",
+	"The LDAP attribute that maps to the username that users use to sign in.": "L'attribut LDAP qui correspond au nom d'utilisateur que les utilisateurs utilisent pour se connecter.",
 	"The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Le classement est actuellement en version bêta et nous pouvons ajuster les calculs de notation à mesure que nous peaufinons l'algorithme.",
 	"The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "La taille maximale du fichier en Mo. Si la taille du fichier dépasse cette limite, le fichier ne sera pas téléchargé.",
 	"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.": "Le nombre maximal de fichiers pouvant être utilisés en même temps dans la conversation. Si le nombre de fichiers dépasse cette limite, les fichiers ne seront pas téléchargés.",
 	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Le score doit être une valeur comprise entre 0,0 (0\u00a0%) et 1,0 (100\u00a0%).",
-	"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "",
+	"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "La température du modèle. Augmenter la température rendra le modèle plus créatif dans ses réponses. (Par défaut : 0.8)",
 	"Theme": "Thème",
 	"Thinking...": "En train de réfléchir...",
 	"This action cannot be undone. Do you wish to continue?": "Cette action ne peut pas être annulée. Souhaitez-vous continuer ?",
 	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Cela garantit que vos conversations précieuses soient sauvegardées en toute sécurité dans votre base de données backend. Merci !",
 	"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Il s'agit d'une fonctionnalité expérimentale, elle peut ne pas fonctionner comme prévu et est sujette à modification à tout moment.",
-	"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics. (Default: 24)": "",
-	"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.  (Default: 128)": "",
+	"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics. (Default: 24)": "Cette option contrôle combien de tokens sont conservés lors du rafraîchissement du contexte. Par exemple, si ce paramètre est défini à 2, les 2 derniers tokens du contexte de conversation seront conservés. Préserver le contexte peut aider à maintenir la continuité d'une conversation, mais cela peut réduire la capacité à répondre à de nouveaux sujets. (Par défaut : 24)",
+	"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.  (Default: 128)": "Cette option définit le nombre maximum de tokens que le modèle peut générer dans sa réponse. Augmenter cette limite permet au modèle de fournir des réponses plus longues, mais cela peut également augmenter la probabilité de générer du contenu inutile ou non pertinent. (Par défaut : 128)",
 	"This option will delete all existing files in the collection and replace them with newly uploaded files.": "Cette option supprimera tous les fichiers existants dans la collection et les remplacera par les fichiers nouvellement téléchargés.",
 	"This response was generated by \"{{model}}\"": "Cette réponse a été générée par \"{{model}}\"",
 	"This will delete": "Cela supprimera",
 	"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "Cela supprimera <strong>{{NAME}}</strong> et <strong>tout son contenu</strong>.",
-	"This will delete all models including custom models": "",
-	"This will delete all models including custom models and cannot be undone.": "",
+	"This will delete all models including custom models": "Cela supprimera tous les modèles, y compris les modèles personnalisés",
+	"This will delete all models including custom models and cannot be undone.": "Cela supprimera tous les modèles, y compris les modèles personnalisés, et ne peut pas être annulé.",
 	"This will reset the knowledge base and sync all files. Do you wish to continue?": "Cela réinitialisera la base de connaissances et synchronisera tous les fichiers. Souhaitez-vous continuer ?",
 	"Thorough explanation": "Explication approfondie",
 	"Tika": "Tika",
@@ -886,7 +893,7 @@
 	"Title Auto-Generation": "Génération automatique des titres",
 	"Title cannot be an empty string.": "Le titre ne peut pas être une chaîne de caractères vide.",
 	"Title Generation Prompt": "Prompt de génération de titre",
-	"TLS": "",
+	"TLS": "TLS",
 	"To access the available model names for downloading,": "Pour accéder aux noms des modèles disponibles,",
 	"To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Pour accéder à l'interface Web, veuillez contacter l'administrateur. Les administrateurs peuvent gérer les statuts des utilisateurs depuis le panneau d'administration.",
@@ -904,19 +911,19 @@
 	"Too verbose": "Trop détaillé",
 	"Tool created successfully": "L'outil a été créé avec succès",
 	"Tool deleted successfully": "Outil supprimé avec succès",
-	"Tool Description": "",
-	"Tool ID": "",
+	"Tool Description": "Description de l'outil",
+	"Tool ID": "ID de l'outil",
 	"Tool imported successfully": "Outil importé avec succès",
-	"Tool Name": "",
+	"Tool Name": "Nom de l'outil",
 	"Tool updated successfully": "L'outil a été mis à jour avec succès",
 	"Tools": "Outils",
-	"Tools Access": "",
+	"Tools Access": "Accès aux outils",
 	"Tools are a function calling system with arbitrary code execution": "Les outils sont un système d'appel de fonction avec exécution de code arbitraire",
 	"Tools have a function calling system that allows arbitrary code execution": "Les outils ont un système d'appel de fonction qui permet l'exécution de code arbitraire",
 	"Tools have a function calling system that allows arbitrary code execution.": "Les outils ont un système d'appel de fonction qui permet l'exécution de code arbitraire.",
 	"Top K": "Top K",
 	"Top P": "Top P",
-	"Transformers": "",
+	"Transformers": "Transformers",
 	"Trouble accessing Ollama?": "Problèmes d'accès à Ollama ?",
 	"TTS Model": "Modèle de Text-to-Speech",
 	"TTS Settings": "Paramètres de Text-to-Speech",
@@ -925,12 +932,12 @@
 	"Type Hugging Face Resolve (Download) URL": "Entrez l'URL de Téléchargement Hugging Face Resolve",
 	"Uh-oh! There was an issue connecting to {{provider}}.": "Oh non ! Un problème est survenu lors de la connexion à {{provider}}.",
 	"UI": "UI",
-	"Unarchive All": "",
-	"Unarchive All Archived Chats": "",
-	"Unarchive Chat": "",
-	"Unlock mysteries": "",
+	"Unarchive All": "Désarchiver tout",
+	"Unarchive All Archived Chats": "Désarchiver toutes les conversations archivées",
+	"Unarchive Chat": "Désarchiver la conversation",
+	"Unlock mysteries": "Déverrouiller les mystères",
 	"Unpin": "Désépingler",
-	"Unravel secrets": "",
+	"Unravel secrets": "Dévoiler les secrets",
 	"Untagged": "Pas de tag",
 	"Update": "Mise à jour",
 	"Update and Copy Link": "Mettre à jour et copier le lien",
@@ -946,18 +953,18 @@
 	"Upload Files": "Téléverser des fichiers",
 	"Upload Pipeline": "Pipeline de téléchargement",
 	"Upload Progress": "Progression de l'envoi",
-	"URL": "",
+	"URL": "URL",
 	"URL Mode": "Mode d'URL",
 	"Use '#' in the prompt input to load and include your knowledge.": "Utilisez '#' dans la zone de saisie du prompt pour charger et inclure vos connaissances.",
 	"Use Gravatar": "Utiliser Gravatar",
-	"Use groups to group your users and assign permissions.": "",
+	"Use groups to group your users and assign permissions.": "Utilisez des groupes pour regrouper vos utilisateurs et attribuer des permissions.",
 	"Use Initials": "Utiliser les initiales",
 	"use_mlock (Ollama)": "Utiliser mlock (Ollama)",
 	"use_mmap (Ollama)": "Utiliser mmap (Ollama)",
 	"user": "utilisateur",
 	"User": "Utilisateur",
 	"User location successfully retrieved.": "L'emplacement de l'utilisateur a été récupéré avec succès.",
-	"Username": "",
+	"Username": "Nom d'utilisateur",
 	"Users": "Utilisateurs",
 	"Using the default arena model with all models. Click the plus button to add custom models.": "Utilisation du modèle d'arène par défaut avec tous les modèles. Cliquez sur le bouton plus pour ajouter des modèles personnalisés.",
 	"Utilize": "Utilisez",
@@ -969,44 +976,45 @@
 	"variable to have them replaced with clipboard content.": "variable pour qu'elles soient remplacées par le contenu du presse-papiers.",
 	"Version": "version:",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Version {{selectedVersion}} de {{totalVersions}}",
-	"Visibility": "",
+	"Visibility": "Visibilité",
 	"Voice": "Voix",
 	"Voice Input": "Saisie vocale",
 	"Warning": "Avertissement",
 	"Warning:": "Avertissement :",
-	"Warning: Enabling this will allow users to upload arbitrary code on the server.": "",
+	"Warning: Enabling this will allow users to upload arbitrary code on the server.": "Avertissement : Activer cette option permettra aux utilisateurs de télécharger du code arbitraire sur le serveur.",
 	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avertissement : Si vous mettez à jour ou modifiez votre modèle d'embedding, vous devrez réimporter tous les documents.",
 	"Web": "Web",
 	"Web API": "API Web",
 	"Web Loader Settings": "Paramètres du Web Loader",
 	"Web Search": "Recherche Web",
 	"Web Search Engine": "Moteur de recherche Web",
+	"Web Search Query Generation": "",
 	"Webhook URL": "URL du webhook",
 	"WebUI Settings": "Paramètres de WebUI",
-	"WebUI will make requests to \"{{url}}/api/chat\"": "",
-	"WebUI will make requests to \"{{url}}/chat/completions\"": "",
-	"What are you trying to achieve?": "",
-	"What are you working on?": "",
+	"WebUI will make requests to \"{{url}}/api/chat\"": "WebUI fera des requêtes à \"{{url}}/api/chat\"",
+	"WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI fera des requêtes à \"{{url}}/chat/completions\"",
+	"What are you trying to achieve?": "Que cherchez-vous à accomplir ?",
+	"What are you working on?": "Sur quoi travaillez-vous ?",
 	"What’s New in": "Quoi de neuf dans",
-	"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
-	"wherever you are": "",
+	"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.": "Lorsqu'il est activé, le modèle répondra à chaque message de chat en temps réel, générant une réponse dès que l'utilisateur envoie un message. Ce mode est utile pour les applications de chat en direct, mais peut affecter les performances sur un matériel plus lent.",
+	"wherever you are": "où que vous soyez",
 	"Whisper (Local)": "Whisper (local)",
-	"Why?": "",
+	"Why?": "Pourquoi ?",
 	"Widescreen Mode": "Mode grand écran",
 	"Won": "Gagné",
-	"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
+	"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "Fonctionne avec le top-k. Une valeur plus élevée (par ex. 0.95) donnera un texte plus diversifié, tandis qu'une valeur plus basse (par ex. 0.5) générera un texte plus concentré et conservateur. (Par défaut : 0.9)",
 	"Workspace": "Espace de travail",
-	"Workspace Permissions": "",
+	"Workspace Permissions": "Autorisations de l'espace de travail",
 	"Write a prompt suggestion (e.g. Who are you?)": "Écrivez une suggestion de prompt (par exemple : Qui êtes-vous ?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Rédigez un résumé de 50 mots qui résume [sujet ou mot-clé].",
 	"Write something...": "Écrivez quelque chose...",
-	"Write your model template content here": "",
+	"Write your model template content here": "Écrivez ici le contenu de votre modèle",
 	"Yesterday": "Hier",
 	"You": "Vous",
 	"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Vous ne pouvez discuter qu'avec un maximum de {{maxCount}} fichier(s) à la fois.",
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Vous pouvez personnaliser vos interactions avec les LLM en ajoutant des mémoires à l'aide du bouton « Gérer » ci-dessous, ce qui les rendra plus utiles et mieux adaptées à vos besoins.",
 	"You cannot upload an empty file.": "Vous ne pouvez pas envoyer un fichier vide.",
-	"You do not have permission to upload files.": "",
+	"You do not have permission to upload files.": "Vous n'avez pas la permission de télécharger des fichiers.",
 	"You have no archived conversations.": "Vous n'avez aucune conversation archivée.",
 	"You have shared this chat": "Vous avez partagé cette conversation.",
 	"You're a helpful assistant.": "Vous êtes un assistant efficace.",

+ 11 - 3
src/lib/i18n/locales/he-IL/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' או '-1' ללא תפוגה.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(למשל `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "",
 	"Auto-Copy Response to Clipboard": "העתקה אוטומטית של תגובה ללוח",
 	"Auto-playback response": "תגובת השמעה אוטומטית",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "",
 	"AUTOMATIC1111 Api Auth String": "",
 	"AUTOMATIC1111 Base URL": "כתובת URL בסיסית של AUTOMATIC1111",
@@ -119,6 +122,7 @@
 	"Certificate Path": "",
 	"Change Password": "שנה סיסמה",
 	"Character": "",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "צ'אט",
 	"Chat Background Image": "",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "מנוע מודל הטמעה",
 	"Embedding model set to \"{{embedding_model}}\"": "מודל ההטמעה הוגדר ל-\"{{embedding_model}}\"",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "הפיכת שיתוף קהילה לזמין",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "אפשר הרשמות חדשות",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "הפיכת חיפוש באינטרנט לזמין",
-	"Enable Web Search Query Generation": "",
 	"Enabled": "",
 	"Engine": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "ודא שקובץ ה-CSV שלך כולל 4 עמודות בסדר הבא: שם, דוא\"ל, סיסמה, תפקיד.",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "הזן תג מודל (למשל {{modelTag}})",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "הזן מספר שלבים (למשל 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "",
 	"Enter Scheduler (e.g. Karras)": "",
 	"Enter Score": "הזן ציון",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "",
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
+	"Please select a model first.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "גישה חיובית",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "",
 	"Prompts": "פקודות",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "משוך \"{{searchValue}}\" מ-Ollama.com",
 	"Pull a model from Ollama.com": "משוך מודל מ-Ollama.com",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "",
 	"RK": "",
 	"Role": "תפקיד",
@@ -839,6 +845,7 @@
 	"System": "מערכת",
 	"System Instructions": "",
 	"System Prompt": "תגובת מערכת",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "",
@@ -981,6 +988,7 @@
 	"Web Loader Settings": "הגדרות טעינת אתר",
 	"Web Search": "חיפוש באינטרנט",
 	"Web Search Engine": "מנוע חיפוש באינטרנט",
+	"Web Search Query Generation": "",
 	"Webhook URL": "URL Webhook",
 	"WebUI Settings": "הגדרות WebUI",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",

+ 11 - 3
src/lib/i18n/locales/hi-IN/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' or '-1' बिना किसी समाप्ति के",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(e.g. `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "",
 	"Auto-Copy Response to Clipboard": "क्लिपबोर्ड पर प्रतिक्रिया ऑटोकॉपी",
 	"Auto-playback response": "ऑटो-प्लेबैक प्रतिक्रिया",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "",
 	"AUTOMATIC1111 Api Auth String": "",
 	"AUTOMATIC1111 Base URL": "AUTOMATIC1111 बेस यूआरएल",
@@ -119,6 +122,7 @@
 	"Certificate Path": "",
 	"Change Password": "पासवर्ड बदलें",
 	"Character": "",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "चैट करें",
 	"Chat Background Image": "",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "एंबेडिंग मॉडल इंजन",
 	"Embedding model set to \"{{embedding_model}}\"": "एम्बेडिंग मॉडल को \"{{embedding_model}}\" पर सेट किया गया",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "समुदाय साझाकरण सक्षम करें",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "नए साइन अप सक्रिय करें",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "वेब खोज सक्षम करें",
-	"Enable Web Search Query Generation": "",
 	"Enabled": "",
 	"Engine": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "सुनिश्चित करें कि आपकी CSV फ़ाइल में इस क्रम में 4 कॉलम शामिल हैं: नाम, ईमेल, पासवर्ड, भूमिका।",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "Model tag दर्ज करें (उदा. {{modelTag}})",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "चरणों की संख्या दर्ज करें (उदा. 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "",
 	"Enter Scheduler (e.g. Karras)": "",
 	"Enter Score": "स्कोर दर्ज करें",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "",
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
+	"Please select a model first.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "सकारात्मक रवैया",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "",
 	"Prompts": "प्रॉम्प्ट",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "\"{{searchValue}}\" को Ollama.com से खींचें",
 	"Pull a model from Ollama.com": "Ollama.com से एक मॉडल खींचें",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "",
 	"RK": "",
 	"Role": "भूमिका",
@@ -838,6 +844,7 @@
 	"System": "सिस्टम",
 	"System Instructions": "",
 	"System Prompt": "सिस्टम प्रॉम्प्ट",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "",
@@ -980,6 +987,7 @@
 	"Web Loader Settings": "वेब लोडर सेटिंग्स",
 	"Web Search": "वेब खोज",
 	"Web Search Engine": "वेब खोज इंजन",
+	"Web Search Query Generation": "",
 	"Webhook URL": "वेबहुक URL",
 	"WebUI Settings": "WebUI सेटिंग्स",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",

+ 11 - 3
src/lib/i18n/locales/hr-HR/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' ili '-1' za bez isteka.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(npr. `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "",
 	"Auto-Copy Response to Clipboard": "Automatsko kopiranje odgovora u međuspremnik",
 	"Auto-playback response": "Automatska reprodukcija odgovora",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "",
 	"AUTOMATIC1111 Api Auth String": "",
 	"AUTOMATIC1111 Base URL": "AUTOMATIC1111 osnovni URL",
@@ -119,6 +122,7 @@
 	"Certificate Path": "",
 	"Change Password": "Promijeni lozinku",
 	"Character": "",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "Razgovor",
 	"Chat Background Image": "",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "Embedding model pogon",
 	"Embedding model set to \"{{embedding_model}}\"": "Embedding model postavljen na \"{{embedding_model}}\"",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "Omogući zajedničko korištenje zajednice",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "Omogući nove prijave",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "Omogući pretraživanje weba",
-	"Enable Web Search Query Generation": "",
 	"Enabled": "",
 	"Engine": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Provjerite da vaša CSV datoteka uključuje 4 stupca u ovom redoslijedu: Name, Email, Password, Role.",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "Unesite oznaku modela (npr. {{modelTag}})",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Unesite broj koraka (npr. 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "",
 	"Enter Scheduler (e.g. Karras)": "",
 	"Enter Score": "Unesite ocjenu",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "",
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
+	"Please select a model first.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "Pozitivan stav",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "",
 	"Prompts": "Prompti",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Povucite \"{{searchValue}}\" s Ollama.com",
 	"Pull a model from Ollama.com": "Povucite model s Ollama.com",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "",
 	"RK": "",
 	"Role": "Uloga",
@@ -839,6 +845,7 @@
 	"System": "Sustav",
 	"System Instructions": "",
 	"System Prompt": "Sistemski prompt",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "",
@@ -981,6 +988,7 @@
 	"Web Loader Settings": "Postavke web učitavanja",
 	"Web Search": "Internet pretraga",
 	"Web Search Engine": "Web tražilica",
+	"Web Search Query Generation": "",
 	"Webhook URL": "URL webkuke",
 	"WebUI Settings": "WebUI postavke",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",

+ 11 - 3
src/lib/i18n/locales/hu-HU/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' vagy '-1' ha nincs lejárat.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(pl. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(pl. `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "",
 	"Auto-Copy Response to Clipboard": "Válasz automatikus másolása a vágólapra",
 	"Auto-playback response": "Automatikus válasz lejátszás",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "Automatic1111",
 	"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api hitelesítési karakterlánc",
 	"AUTOMATIC1111 Base URL": "AUTOMATIC1111 alap URL",
@@ -119,6 +122,7 @@
 	"Certificate Path": "",
 	"Change Password": "Jelszó módosítása",
 	"Character": "Karakter",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "Beszélgetés",
 	"Chat Background Image": "Beszélgetés háttérkép",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "Beágyazási modell motor",
 	"Embedding model set to \"{{embedding_model}}\"": "Beágyazási modell beállítva: \"{{embedding_model}}\"",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "Közösségi megosztás engedélyezése",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "Üzenet értékelés engedélyezése",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "Új regisztrációk engedélyezése",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "Webes keresés engedélyezése",
-	"Enable Web Search Query Generation": "Webes keresési lekérdezés generálás engedélyezése",
 	"Enabled": "Engedélyezve",
 	"Engine": "Motor",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Győződj meg róla, hogy a CSV fájl tartalmazza ezt a 4 oszlopot ebben a sorrendben: Név, Email, Jelszó, Szerep.",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "Add meg a modell címkét (pl. {{modelTag}})",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Add meg a lépések számát (pl. 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "Add meg a mintavételezőt (pl. Euler a)",
 	"Enter Scheduler (e.g. Karras)": "Add meg az ütemezőt (pl. Karras)",
 	"Enter Score": "Add meg a pontszámot",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "Kérjük, gondosan tekintse át a következő figyelmeztetéseket:",
 	"Please enter a prompt": "Kérjük, adjon meg egy promptot",
 	"Please fill in all fields.": "Kérjük, töltse ki az összes mezőt.",
+	"Please select a model first.": "",
 	"Please select a reason": "Kérjük, válasszon egy okot",
 	"Port": "",
 	"Positive attitude": "Pozitív hozzáállás",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "",
 	"Prompts": "Promptok",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "\"{{searchValue}}\" letöltése az Ollama.com-ról",
 	"Pull a model from Ollama.com": "Modell letöltése az Ollama.com-ról",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "A válasz értesítések nem aktiválhatók, mert a weboldal engedélyei meg lettek tagadva. Kérjük, látogasson el a böngésző beállításaihoz a szükséges hozzáférés megadásához.",
 	"Response splitting": "Válasz felosztás",
 	"Result": "Eredmény",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "Formázott szövegbevitel a chathez",
 	"RK": "RK",
 	"Role": "Szerep",
@@ -838,6 +844,7 @@
 	"System": "Rendszer",
 	"System Instructions": "Rendszer utasítások",
 	"System Prompt": "Rendszer prompt",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "Címke generálási prompt",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "Koppintson a megszakításhoz",
@@ -980,6 +987,7 @@
 	"Web Loader Settings": "Web betöltő beállítások",
 	"Web Search": "Webes keresés",
 	"Web Search Engine": "Webes keresőmotor",
+	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "WebUI beállítások",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",

+ 11 - 3
src/lib/i18n/locales/id-ID/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' atau '-1' untuk tidak ada kedaluwarsa.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(contoh: `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(contoh: `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "",
 	"Auto-Copy Response to Clipboard": "Tanggapan Salin Otomatis ke Papan Klip",
 	"Auto-playback response": "Respons pemutaran otomatis",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "",
 	"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api Auth String",
 	"AUTOMATIC1111 Base URL": "URL Dasar AUTOMATIC1111",
@@ -119,6 +122,7 @@
 	"Certificate Path": "",
 	"Change Password": "Ubah Kata Sandi",
 	"Character": "",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "Obrolan",
 	"Chat Background Image": "Gambar Latar Belakang Obrolan",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "Mesin Model Penyematan",
 	"Embedding model set to \"{{embedding_model}}\"": "Model penyematan diatur ke \"{{embedding_model}}\"",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "Aktifkan Berbagi Komunitas",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "Aktifkan Pendaftaran Baru",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "Aktifkan Pencarian Web",
-	"Enable Web Search Query Generation": "",
 	"Enabled": "",
 	"Engine": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Pastikan file CSV Anda menyertakan 4 kolom dengan urutan sebagai berikut: Nama, Email, Kata Sandi, Peran.",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "Masukkan tag model (misalnya {{modelTag}})",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Masukkan Jumlah Langkah (mis. 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "",
 	"Enter Scheduler (e.g. Karras)": "",
 	"Enter Score": "Masukkan Skor",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "",
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
+	"Please select a model first.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "Sikap positif",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "",
 	"Prompts": "Prompt",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Tarik \"{{searchValue}}\" dari Ollama.com",
 	"Pull a model from Ollama.com": "Tarik model dari Ollama.com",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Notifikasi respons tidak dapat diaktifkan karena izin situs web telah ditolak. Silakan kunjungi pengaturan browser Anda untuk memberikan akses yang diperlukan.",
 	"Response splitting": "",
 	"Result": "",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "",
 	"RK": "",
 	"Role": "Peran",
@@ -838,6 +844,7 @@
 	"System": "Sistem",
 	"System Instructions": "",
 	"System Prompt": "Permintaan Sistem",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "Ketuk untuk menyela",
@@ -980,6 +987,7 @@
 	"Web Loader Settings": "Pengaturan Pemuat Web",
 	"Web Search": "Pencarian Web",
 	"Web Search Engine": "Mesin Pencari Web",
+	"Web Search Query Generation": "",
 	"Webhook URL": "URL pengait web",
 	"WebUI Settings": "Pengaturan WebUI",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",

+ 11 - 3
src/lib/i18n/locales/ie-GA/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' nó '-1' gan aon éag.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(m.sh. `sh webui.sh --api --api-auth username_password `)",
 	"(e.g. `sh webui.sh --api`)": "(m.sh. `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "Fíordheimhnigh",
 	"Auto-Copy Response to Clipboard": "Freagra AutoCopy go Gearrthaisce",
 	"Auto-playback response": "Freagra uathsheinm",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "Uathoibríoch1111",
 	"AUTOMATIC1111 Api Auth String": "UATHOMATIC1111 Api Auth Teaghrán",
 	"AUTOMATIC1111 Base URL": "UATHOMATIC1111 BunURL",
@@ -119,6 +122,7 @@
 	"Certificate Path": "Cosán Teastais",
 	"Change Password": "Athraigh Pasfhocal",
 	"Character": "Carachtar",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "Cairt teorainneacha nua",
 	"Chat": "Comhrá",
 	"Chat Background Image": "Íomhá Cúlra Comhrá",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "Inneall Múnla Ionchorprú",
 	"Embedding model set to \"{{embedding_model}}\"": "Samhail leabaithe atá socraithe go \"{{embedding_model}}\"",
 	"Enable API Key Auth": "Cumasaigh Fíordheimhniú Eochracha API",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "Cumasaigh Comhroinnt Pobail",
 	"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.": "Cumasaigh Glasáil Cuimhne (mlock) chun sonraí samhaltaithe a chosc ó RAM. Glasálann an rogha seo sraith oibre leathanaigh an mhúnla isteach i RAM, ag cinntiú nach ndéanfar iad a mhalartú go diosca. Is féidir leis seo cabhrú le feidhmíocht a choinneáil trí lochtanna leathanaigh a sheachaint agus rochtain tapa ar shonraí a chinntiú.",
 	"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.": "Cumasaigh Mapáil Cuimhne (mmap) chun sonraí samhla a lódáil. Ligeann an rogha seo don chóras stóráil diosca a úsáid mar leathnú ar RAM trí chomhaid diosca a chóireáil amhail is dá mba i RAM iad. Is féidir leis seo feidhmíocht na samhla a fheabhsú trí rochtain níos tapúla ar shonraí a cheadú. Mar sin féin, d'fhéadfadh sé nach n-oibreoidh sé i gceart le gach córas agus féadfaidh sé méid suntasach spáis diosca a ithe.",
 	"Enable Message Rating": "Cumasaigh Rátáil Teachtai",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "Cumasaigh sampláil Mirostat chun seachrán a rialú. (Réamhshocrú: 0, 0 = Díchumasaithe, 1 = Mirostat, 2 = Mirostat 2.0)",
 	"Enable New Sign Ups": "Cumasaigh Clárúcháin Nua",
-	"Enable Retrieval Query Generation": "Cumasaigh Giniúint Iarratas Aisghabhála",
-	"Enable Tags Generation": "Cumasaigh Giniúint Clibeanna",
 	"Enable Web Search": "Cumasaigh Cuardach Gréasáin",
-	"Enable Web Search Query Generation": "Cumasaigh Giniúint Ceist Cuardaigh Gréasáin",
 	"Enabled": "Cumasaithe",
 	"Engine": "Inneall",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Déan cinnte go bhfuil 4 cholún san ord seo i do chomhad CSV: Ainm, Ríomhphost, Pasfhocal, Ról.",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "Cuir isteach chlib samhail (m.sh. {{modelTag}})",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Iontráil Líon na gCéimeanna (m.sh. 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "Cuir isteach Sampler (m.sh. Euler a)",
 	"Enter Scheduler (e.g. Karras)": "Cuir isteach Sceidealóir (m.sh. Karras)",
 	"Enter Score": "Iontráil Scór",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "Déan athbhreithniú cúramach ar na rabhaidh seo a leanas le do thoil:",
 	"Please enter a prompt": "Cuir isteach leid",
 	"Please fill in all fields.": "Líon isteach gach réimse le do thoil.",
+	"Please select a model first.": "",
 	"Please select a reason": "Roghnaigh cúis le do thoil",
 	"Port": "Port",
 	"Positive attitude": "Dearcadh dearfach",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "D'éirigh leis an leid a nuashonrú",
 	"Prompts": "Leabhair",
 	"Prompts Access": "Rochtain ar Chuirí",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Tarraing \"{{searchValue}}\" ó Ollama.com",
 	"Pull a model from Ollama.com": "Tarraing múnla ó Ollama.com",
 	"Query Generation Prompt": "Cuirí Ginearáil Ceisteanna",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Ní féidir fógraí freagartha a ghníomhachtú toisc gur diúltaíodh ceadanna an tsuímh Ghréasáin. Tabhair cuairt ar do shocruithe brabhsálaí chun an rochtain riachtanach a dheonú.",
 	"Response splitting": "Scoilt freagartha",
 	"Result": "Toradh",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "Ionchur Saibhir Téacs don Chomhrá",
 	"RK": "RK",
 	"Role": "Ról",
@@ -838,6 +844,7 @@
 	"System": "Córas",
 	"System Instructions": "Treoracha Córas",
 	"System Prompt": "Córas Pras",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "Clibeanna Giniúint Pras",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "Úsáidtear sampláil saor ó eireabaill chun tionchar na n-chomharthaí ón aschur nach bhfuil chomh dóchúil céanna a laghdú. Laghdóidh luach níos airde (m.sh., 2.0) an tionchar níos mó, agus díchumasaíonn luach 1.0 an socrú seo. (réamhshocraithe: 1)",
 	"Tap to interrupt": "Tapáil chun cur isteach",
@@ -980,6 +987,7 @@
 	"Web Loader Settings": "Socruithe Luchtaire Gréasáin",
 	"Web Search": "Cuardach Gréasáin",
 	"Web Search Engine": "Inneall Cuardaigh Gréasáin",
+	"Web Search Query Generation": "",
 	"Webhook URL": "URL Webhook",
 	"WebUI Settings": "Socruithe WebUI",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "Déanfaidh WebUI iarratais ar \"{{url}}/api/chat\"",

+ 11 - 3
src/lib/i18n/locales/it-IT/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' o '-1' per nessuna scadenza.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(p.e. `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "",
 	"Auto-Copy Response to Clipboard": "Copia automatica della risposta negli appunti",
 	"Auto-playback response": "Riproduzione automatica della risposta",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "",
 	"AUTOMATIC1111 Api Auth String": "",
 	"AUTOMATIC1111 Base URL": "URL base AUTOMATIC1111",
@@ -119,6 +122,7 @@
 	"Certificate Path": "",
 	"Change Password": "Cambia password",
 	"Character": "",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "Chat",
 	"Chat Background Image": "",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "Motore del modello di embedding",
 	"Embedding model set to \"{{embedding_model}}\"": "Modello di embedding impostato su \"{{embedding_model}}\"",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "Abilita la condivisione della community",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "Abilita nuove iscrizioni",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "Abilita ricerca Web",
-	"Enable Web Search Query Generation": "",
 	"Enabled": "",
 	"Engine": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assicurati che il tuo file CSV includa 4 colonne in questo ordine: Nome, Email, Password, Ruolo.",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "Inserisci il tag del modello (ad esempio {{modelTag}})",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "Inserisci il numero di passaggi (ad esempio 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "",
 	"Enter Scheduler (e.g. Karras)": "",
 	"Enter Score": "Inserisci il punteggio",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "",
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
+	"Please select a model first.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "Attitudine positiva",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "",
 	"Prompts": "Prompt",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Estrai \"{{searchValue}}\" da Ollama.com",
 	"Pull a model from Ollama.com": "Estrai un modello da Ollama.com",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "",
 	"RK": "",
 	"Role": "Ruolo",
@@ -839,6 +845,7 @@
 	"System": "Sistema",
 	"System Instructions": "",
 	"System Prompt": "Prompt di sistema",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "",
@@ -981,6 +988,7 @@
 	"Web Loader Settings": "Impostazioni del caricatore Web",
 	"Web Search": "Ricerca sul Web",
 	"Web Search Engine": "Motore di ricerca Web",
+	"Web Search Query Generation": "",
 	"Webhook URL": "URL webhook",
 	"WebUI Settings": "Impostazioni WebUI",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",

+ 11 - 3
src/lib/i18n/locales/ja-JP/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' または '-1' で無期限。",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(例: `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(例: `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "",
 	"Auto-Copy Response to Clipboard": "クリップボードへの応答の自動コピー",
 	"Auto-playback response": "応答の自動再生",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "",
 	"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111のAuthを入力",
 	"AUTOMATIC1111 Base URL": "AUTOMATIC1111 ベース URL",
@@ -119,6 +122,7 @@
 	"Certificate Path": "",
 	"Change Password": "パスワードを変更",
 	"Character": "",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "チャット",
 	"Chat Background Image": "チャットの背景画像",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "埋め込みモデルエンジン",
 	"Embedding model set to \"{{embedding_model}}\"": "埋め込みモデルを\"{{embedding_model}}\"に設定しました",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "コミュニティ共有を有効にする",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "メッセージ評価を有効にする",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "新規登録を有効にする",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "ウェブ検索を有効にする",
-	"Enable Web Search Query Generation": "ウェブ検索クエリ生成を有効にする",
 	"Enabled": "有効",
 	"Engine": "エンジン",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "CSVファイルに4つの列が含まれていることを確認してください: Name, Email, Password, Role.",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "モデルタグを入力してください (例: {{modelTag}})",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "ステップ数を入力してください (例: 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "サンプラーを入力してください(e.g. Euler a)。",
 	"Enter Scheduler (e.g. Karras)": "スケジューラーを入力してください。(e.g. Karras)",
 	"Enter Score": "スコアを入力してください",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "",
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
+	"Please select a model first.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "前向きな態度",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "",
 	"Prompts": "プロンプト",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Ollama.com から \"{{searchValue}}\" をプル",
 	"Pull a model from Ollama.com": "Ollama.com からモデルをプル",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "応答の分割",
 	"Result": "",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "",
 	"RK": "",
 	"Role": "役割",
@@ -837,6 +843,7 @@
 	"System": "システム",
 	"System Instructions": "",
 	"System Prompt": "システムプロンプト",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "",
@@ -979,6 +986,7 @@
 	"Web Loader Settings": "Web 読み込み設定",
 	"Web Search": "ウェブ検索",
 	"Web Search Engine": "ウェブ検索エンジン",
+	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "WebUI 設定",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",

+ 11 - 3
src/lib/i18n/locales/ka-GE/translation.json

@@ -1,4 +1,5 @@
 {
+	"-1 for no limit, or a positive integer for a specific limit": "",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' ან '-1' ვადის გასვლისთვის.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
 	"(e.g. `sh webui.sh --api`)": "(მაგ. `sh webui.sh --api`)",
@@ -90,6 +91,8 @@
 	"Authenticate": "",
 	"Auto-Copy Response to Clipboard": "პასუხის ავტომატური კოპირება ბუფერში",
 	"Auto-playback response": "ავტომატური დაკვრის პასუხი",
+	"Autocomplete Generation": "",
+	"Autocomplete Generation Input Max Length": "",
 	"Automatic1111": "",
 	"AUTOMATIC1111 Api Auth String": "",
 	"AUTOMATIC1111 Base URL": "AUTOMATIC1111 საბაზისო მისამართი",
@@ -119,6 +122,7 @@
 	"Certificate Path": "",
 	"Change Password": "პაროლის შეცვლა",
 	"Character": "",
+	"Character limit for autocomplete generation input": "",
 	"Chart new frontiers": "",
 	"Chat": "მიმოწერა",
 	"Chat Background Image": "",
@@ -297,16 +301,14 @@
 	"Embedding Model Engine": "ჩასმის ძირითადი პროგრამა",
 	"Embedding model set to \"{{embedding_model}}\"": "ჩასმის ძირითადი პროგრამა ჩართულია \"{{embedding_model}}\"",
 	"Enable API Key Auth": "",
+	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "საზოგადოების გაზიარების ჩართვა",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "",
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "ახალი რეგისტრაციების ჩართვა",
-	"Enable Retrieval Query Generation": "",
-	"Enable Tags Generation": "",
 	"Enable Web Search": "ვებ ძიების ჩართვა",
-	"Enable Web Search Query Generation": "",
 	"Enabled": "",
 	"Engine": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "გთხოვთ, უზრუნველყოთ, რომთქვევის CSV-ფაილი შეიცავს 4 ველი, ჩაწერილი ორივე ველი უდრის პირველი ველით.",
@@ -333,6 +335,7 @@
 	"Enter model tag (e.g. {{modelTag}})": "შეიყვანეთ მოდელის ტეგი (მაგ. {{modelTag}})",
 	"Enter Mojeek Search API Key": "",
 	"Enter Number of Steps (e.g. 50)": "შეიყვანეთ ნაბიჯების რაოდენობა (მაგ. 50)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "",
 	"Enter Sampler (e.g. Euler a)": "",
 	"Enter Scheduler (e.g. Karras)": "",
 	"Enter Score": "შეიყვანეთ ქულა",
@@ -669,6 +672,7 @@
 	"Please carefully review the following warnings:": "",
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
+	"Please select a model first.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "პოზიტიური ანგარიში",
@@ -684,6 +688,7 @@
 	"Prompt updated successfully": "",
 	"Prompts": "მოთხოვნები",
 	"Prompts Access": "",
+	"Proxy URL": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "ჩაიამოვეთ \"{{searchValue}}\" Ollama.com-იდან",
 	"Pull a model from Ollama.com": "Ollama.com იდან მოდელის გადაწერა ",
 	"Query Generation Prompt": "",
@@ -717,6 +722,7 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
+	"Retrieval Query Generation": "",
 	"Rich Text Input for Chat": "",
 	"RK": "",
 	"Role": "როლი",
@@ -838,6 +844,7 @@
 	"System": "სისტემა",
 	"System Instructions": "",
 	"System Prompt": "სისტემური მოთხოვნა",
+	"Tags Generation": "",
 	"Tags Generation Prompt": "",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "",
@@ -980,6 +987,7 @@
 	"Web Loader Settings": "ვების ჩატარების პარამეტრები",
 	"Web Search": "ვებ ძებნა",
 	"Web Search Engine": "ვებ საძიებო სისტემა",
+	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "WebUI პარამეტრები",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff