Преглед изворни кода

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

Rory пре 2 месеци
родитељ
комит
ec6fe9939b
95 измењених фајлова са 2173 додато и 800 уклоњено
  1. 43 0
      CHANGELOG.md
  2. 16 0
      backend/open_webui/config.py
  3. 1 1
      backend/open_webui/functions.py
  4. 17 1
      backend/open_webui/main.py
  5. 55 16
      backend/open_webui/retrieval/utils.py
  6. 76 0
      backend/open_webui/retrieval/web/exa.py
  7. 2 0
      backend/open_webui/retrieval/web/utils.py
  8. 4 2
      backend/open_webui/routers/files.py
  9. 6 2
      backend/open_webui/routers/knowledge.py
  10. 6 4
      backend/open_webui/routers/memories.py
  11. 6 2
      backend/open_webui/routers/ollama.py
  12. 1 1
      backend/open_webui/routers/openai.py
  13. 42 9
      backend/open_webui/routers/retrieval.py
  14. 1 0
      backend/open_webui/routers/users.py
  15. 444 101
      backend/open_webui/utils/middleware.py
  16. 27 5
      backend/open_webui/utils/misc.py
  17. 19 4
      backend/open_webui/utils/payload.py
  18. 19 1
      backend/open_webui/utils/response.py
  19. 13 0
      backend/open_webui/utils/tools.py
  20. 13 2
      package-lock.json
  21. 2 1
      package.json
  22. 4 1
      scripts/prepare-pyodide.js
  23. 1 1
      src/lib/apis/openai/index.ts
  24. 13 1
      src/lib/components/admin/Settings/WebSearch.svelte
  25. 2 1
      src/lib/components/admin/Users/Groups.svelte
  26. 2 1
      src/lib/components/admin/Users/Groups/EditGroupModal.svelte
  27. 10 1
      src/lib/components/admin/Users/Groups/Permissions.svelte
  28. 3 3
      src/lib/components/channel/MessageInput.svelte
  29. 1 1
      src/lib/components/channel/Messages/Message.svelte
  30. 40 34
      src/lib/components/chat/Chat.svelte
  31. 87 65
      src/lib/components/chat/MessageInput.svelte
  32. 45 84
      src/lib/components/chat/Messages/CodeBlock.svelte
  33. 1 0
      src/lib/components/chat/Messages/Message.svelte
  34. 3 0
      src/lib/components/chat/Messages/MultiResponseMessages.svelte
  35. 6 9
      src/lib/components/chat/Placeholder.svelte
  36. 30 0
      src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte
  37. 1 0
      src/lib/components/chat/Settings/General.svelte
  38. 28 0
      src/lib/components/chat/Settings/Interface.svelte
  39. 2 1
      src/lib/components/chat/SettingsModal.svelte
  40. 114 36
      src/lib/components/chat/Suggestions.svelte
  41. 10 4
      src/lib/i18n/locales/ar-BH/translation.json
  42. 10 4
      src/lib/i18n/locales/bg-BG/translation.json
  43. 10 4
      src/lib/i18n/locales/bn-BD/translation.json
  44. 10 4
      src/lib/i18n/locales/ca-ES/translation.json
  45. 10 4
      src/lib/i18n/locales/ceb-PH/translation.json
  46. 10 4
      src/lib/i18n/locales/cs-CZ/translation.json
  47. 10 4
      src/lib/i18n/locales/da-DK/translation.json
  48. 10 4
      src/lib/i18n/locales/de-DE/translation.json
  49. 10 4
      src/lib/i18n/locales/dg-DG/translation.json
  50. 10 4
      src/lib/i18n/locales/el-GR/translation.json
  51. 10 4
      src/lib/i18n/locales/en-GB/translation.json
  52. 10 4
      src/lib/i18n/locales/en-US/translation.json
  53. 10 4
      src/lib/i18n/locales/es-ES/translation.json
  54. 10 4
      src/lib/i18n/locales/eu-ES/translation.json
  55. 10 4
      src/lib/i18n/locales/fa-IR/translation.json
  56. 10 4
      src/lib/i18n/locales/fi-FI/translation.json
  57. 11 5
      src/lib/i18n/locales/fr-CA/translation.json
  58. 10 4
      src/lib/i18n/locales/fr-FR/translation.json
  59. 10 4
      src/lib/i18n/locales/he-IL/translation.json
  60. 10 4
      src/lib/i18n/locales/hi-IN/translation.json
  61. 10 4
      src/lib/i18n/locales/hr-HR/translation.json
  62. 10 4
      src/lib/i18n/locales/hu-HU/translation.json
  63. 10 4
      src/lib/i18n/locales/id-ID/translation.json
  64. 41 35
      src/lib/i18n/locales/ie-GA/translation.json
  65. 10 4
      src/lib/i18n/locales/it-IT/translation.json
  66. 10 4
      src/lib/i18n/locales/ja-JP/translation.json
  67. 10 4
      src/lib/i18n/locales/ka-GE/translation.json
  68. 10 4
      src/lib/i18n/locales/ko-KR/translation.json
  69. 10 4
      src/lib/i18n/locales/lt-LT/translation.json
  70. 10 4
      src/lib/i18n/locales/ms-MY/translation.json
  71. 10 4
      src/lib/i18n/locales/nb-NO/translation.json
  72. 10 4
      src/lib/i18n/locales/nl-NL/translation.json
  73. 10 4
      src/lib/i18n/locales/pa-IN/translation.json
  74. 10 4
      src/lib/i18n/locales/pl-PL/translation.json
  75. 10 4
      src/lib/i18n/locales/pt-BR/translation.json
  76. 10 4
      src/lib/i18n/locales/pt-PT/translation.json
  77. 10 4
      src/lib/i18n/locales/ro-RO/translation.json
  78. 10 4
      src/lib/i18n/locales/ru-RU/translation.json
  79. 10 4
      src/lib/i18n/locales/sk-SK/translation.json
  80. 10 4
      src/lib/i18n/locales/sr-RS/translation.json
  81. 10 4
      src/lib/i18n/locales/sv-SE/translation.json
  82. 10 4
      src/lib/i18n/locales/th-TH/translation.json
  83. 10 4
      src/lib/i18n/locales/tk-TW/translation.json
  84. 10 4
      src/lib/i18n/locales/tr-TR/translation.json
  85. 19 13
      src/lib/i18n/locales/uk-UA/translation.json
  86. 10 4
      src/lib/i18n/locales/ur-PK/translation.json
  87. 10 4
      src/lib/i18n/locales/vi-VN/translation.json
  88. 19 13
      src/lib/i18n/locales/zh-CN/translation.json
  89. 10 4
      src/lib/i18n/locales/zh-TW/translation.json
  90. 81 0
      src/lib/pyodide/pyodideKernel.ts
  91. 123 0
      src/lib/pyodide/pyodideKernel.worker.ts
  92. 59 0
      src/lib/workers/pyodide.worker.ts
  93. 4 1
      src/routes/+layout.svelte
  94. 2 1
      tailwind.config.js
  95. 158 161
      uv.lock

+ 43 - 0
CHANGELOG.md

@@ -5,6 +5,49 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
+## [0.5.10] - 2025-02-05
+
+### Fixed
+
+- **⚙️ System Prompts Now Properly Templated via API**: Resolved an issue where system prompts were not being correctly processed when used through the API, ensuring template variables now function as expected.
+- **📝 '<thinking>' Tag Display Issue Fixed**: Fixed a bug where the 'thinking' tag was disrupting content rendering, ensuring clean and accurate text display.
+- **💻 Code Interpreter Stability with Custom Functions**: Addressed failures when using the Code Interpreter with certain custom functions like Anthropic, ensuring smoother execution and better compatibility.
+
+## [0.5.9] - 2025-02-05
+
+### Fixed
+
+- **💡 "Think" Tag Display Issue**: Resolved a bug where the "Think" tag was not functioning correctly, ensuring proper visualization of the model's reasoning process before delivering responses.
+
+## [0.5.8] - 2025-02-05
+
+### Added
+
+- **🖥️ Code Interpreter**: Models can now execute code in real time to refine their answers dynamically, running securely within a sandboxed browser environment using Pyodide. Perfect for calculations, data analysis, and AI-assisted coding tasks!
+- **💬 Redesigned Chat Input UI**: Enjoy a sleeker and more intuitive message input with improved feature selection, making it easier than ever to toggle tools, enable search, and interact with AI seamlessly.
+- **🛠️ Native Tool Calling Support (Experimental)**: Supported models can now call tools natively, reducing query latency and improving contextual responses. More enhancements coming soon!
+- **🔗 Exa Search Engine Integration**: A new search provider has been added, allowing users to retrieve up-to-date and relevant information without leaving the chat interface.
+- **🌍 Localized Dates & Times**: Date and time formats now match your system locale, ensuring a more natural, region-specific experience.
+- **📎 User Headers for External Embedding APIs**: API calls to external embedding services now include user-related headers.
+- **🌍 "Always On" Web Search Toggle**: A new option under Settings > Interface allows users to enable Web Search by default—transform Open WebUI into your go-to search engine, ensuring AI-powered results with every query.
+- **🚀 General Performance & Stability**: Significant improvements across the platform for a faster, more reliable experience.
+- **🖼️ UI/UX Enhancements**: Numerous design refinements improving readability, responsiveness, and accessibility.
+- **🌍 Improved Translations**: Chinese, Korean, French, Ukrainian and Serbian translations have been updated with refined terminologies for better clarity.
+
+### Fixed
+
+- **🔄 OAuth Name Field Fallback**: Resolves OAuth login failures by using the email field as a fallback when a name is missing.
+- **🔑 Google Drive Credentials Restriction**: Ensures only authenticated users can access Google Drive credentials for enhanced security.
+- **🌐 DuckDuckGo Search Rate Limit Handling**: Fixes issues where users would encounter 202 errors due to rate limits when using DuckDuckGo for web search.
+- **📁 File Upload Permission Indicator**: Users are now notified when they lack permission to upload files, improving clarity on system restrictions.
+- **🔧 Max Tokens Issue**: Fixes cases where 'max_tokens' were not applied correctly, ensuring proper model behavior.
+- **🔍 Validation for RAG Web Search URLs**: Filters out invalid or unsupported URLs when using web-based retrieval augmentation.
+- **🖋️ Title Generation Bug**: Fixes inconsistencies in title generation, ensuring proper chat organization.
+
+### Removed
+
+- **⚡ Deprecated Non-Web Worker Pyodide Execution**: Moves entirely to browser sandboxing for better performance and security.
+
 ## [0.5.7] - 2025-01-23
 
 ### Added

+ 16 - 0
backend/open_webui/config.py

@@ -927,6 +927,12 @@ USER_PERMISSIONS_FEATURES_IMAGE_GENERATION = (
     == "true"
 )
 
+USER_PERMISSIONS_FEATURES_CODE_INTERPRETER = (
+    os.environ.get("USER_PERMISSIONS_FEATURES_CODE_INTERPRETER", "True").lower()
+    == "true"
+)
+
+
 DEFAULT_USER_PERMISSIONS = {
     "workspace": {
         "models": USER_PERMISSIONS_WORKSPACE_MODELS_ACCESS,
@@ -944,6 +950,7 @@ DEFAULT_USER_PERMISSIONS = {
     "features": {
         "web_search": USER_PERMISSIONS_FEATURES_WEB_SEARCH,
         "image_generation": USER_PERMISSIONS_FEATURES_IMAGE_GENERATION,
+        "code_interpreter": USER_PERMISSIONS_FEATURES_CODE_INTERPRETER,
     },
 }
 
@@ -1328,9 +1335,13 @@ DEFAULT_CODE_INTERPRETER_PROMPT = """
    - When coding, **always aim to print meaningful outputs** (e.g., results, tables, summaries, or visuals) to better interpret and verify the findings. Avoid relying on implicit outputs; prioritize explicit and clear print statements so the results are effectively communicated to the user.  
    - After obtaining the printed output, **always provide a concise analysis, interpretation, or next steps to help the user understand the findings or refine the outcome further.**  
    - If the results are unclear, unexpected, or require validation, refine the code and execute it again as needed. Always aim to deliver meaningful insights from the results, iterating if necessary.  
+   - If a link is provided for an image, audio, or any file, include it in the response exactly as given to ensure the user has access to the original resource.  
+   - All responses should be communicated in the chat's primary language, ensuring seamless understanding. If the chat is multilingual, default to English for clarity.
+   - **If a link to an image, audio, or any file is provided in markdown format, ALWAYS regurgitate explicitly display it as part of the response to ensure the user can access it easily, do NOT change the link.**
 
 Ensure that the tools are effectively utilized to achieve the highest-quality analysis for the user."""
 
+
 ####################################
 # Vector Database
 ####################################
@@ -1741,6 +1752,11 @@ BING_SEARCH_V7_SUBSCRIPTION_KEY = PersistentConfig(
     os.environ.get("BING_SEARCH_V7_SUBSCRIPTION_KEY", ""),
 )
 
+EXA_API_KEY = PersistentConfig(
+    "EXA_API_KEY",
+    "rag.web.search.exa_api_key",
+    os.getenv("EXA_API_KEY", ""),
+)
 
 RAG_WEB_SEARCH_RESULT_COUNT = PersistentConfig(
     "RAG_WEB_SEARCH_RESULT_COUNT",

+ 1 - 1
backend/open_webui/functions.py

@@ -250,7 +250,7 @@ async def generate_function_chat_completion(
 
         params = model_info.params.model_dump()
         form_data = apply_model_params_to_body_openai(params, form_data)
-        form_data = apply_model_system_prompt_to_body(params, form_data, user)
+        form_data = apply_model_system_prompt_to_body(params, form_data, metadata, user)
 
     pipe_id = get_pipe_id(form_data)
     function_module = get_function_module_by_id(request, pipe_id)

+ 17 - 1
backend/open_webui/main.py

@@ -179,6 +179,7 @@ from open_webui.config import (
     BING_SEARCH_V7_ENDPOINT,
     BING_SEARCH_V7_SUBSCRIPTION_KEY,
     BRAVE_SEARCH_API_KEY,
+    EXA_API_KEY,
     KAGI_SEARCH_API_KEY,
     MOJEEK_SEARCH_API_KEY,
     GOOGLE_PSE_API_KEY,
@@ -525,6 +526,7 @@ app.state.config.SEARCHAPI_ENGINE = SEARCHAPI_ENGINE
 app.state.config.JINA_API_KEY = JINA_API_KEY
 app.state.config.BING_SEARCH_V7_ENDPOINT = BING_SEARCH_V7_ENDPOINT
 app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY = BING_SEARCH_V7_SUBSCRIPTION_KEY
+app.state.config.EXA_API_KEY = EXA_API_KEY
 
 app.state.config.RAG_WEB_SEARCH_RESULT_COUNT = RAG_WEB_SEARCH_RESULT_COUNT
 app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS = RAG_WEB_SEARCH_CONCURRENT_REQUESTS
@@ -863,6 +865,7 @@ async def chat_completion(
         if model_id not in request.app.state.MODELS:
             raise Exception("Model not found")
         model = request.app.state.MODELS[model_id]
+        model_info = Models.get_model_by_id(model_id)
 
         # Check if user has access to the model
         if not BYPASS_MODEL_ACCESS_CONTROL and user.role == "user":
@@ -880,12 +883,24 @@ async def chat_completion(
             "files": form_data.get("files", None),
             "features": form_data.get("features", None),
             "variables": form_data.get("variables", None),
+            "model": model_info,
+            **(
+                {"function_calling": "native"}
+                if form_data.get("params", {}).get("function_calling") == "native"
+                or (
+                    model_info
+                    and model_info.params.model_dump().get("function_calling")
+                    == "native"
+                )
+                else {}
+            ),
         }
         form_data["metadata"] = metadata
 
-        form_data, events = await process_chat_payload(
+        form_data, metadata, events = await process_chat_payload(
             request, form_data, metadata, user, model
         )
+
     except Exception as e:
         raise HTTPException(
             status_code=status.HTTP_400_BAD_REQUEST,
@@ -894,6 +909,7 @@ async def chat_completion(
 
     try:
         response = await chat_completion_handler(request, form_data, user)
+
         return await process_chat_response(
             request, response, form_data, user, events, metadata, tasks
         )

+ 55 - 16
backend/open_webui/retrieval/utils.py

@@ -15,8 +15,13 @@ from langchain_core.documents import Document
 from open_webui.config import VECTOR_DB
 from open_webui.retrieval.vector.connector import VECTOR_DB_CLIENT
 from open_webui.utils.misc import get_last_user_message
+from open_webui.models.users import UserModel
 
-from open_webui.env import SRC_LOG_LEVELS, OFFLINE_MODE
+from open_webui.env import (
+    SRC_LOG_LEVELS,
+    OFFLINE_MODE,
+    ENABLE_FORWARD_USER_INFO_HEADERS,
+)
 
 log = logging.getLogger(__name__)
 log.setLevel(SRC_LOG_LEVELS["RAG"])
@@ -61,9 +66,7 @@ class VectorSearchRetriever(BaseRetriever):
 
 
 def query_doc(
-    collection_name: str,
-    query_embedding: list[float],
-    k: int,
+    collection_name: str, query_embedding: list[float], k: int, user: UserModel = None
 ):
     try:
         result = VECTOR_DB_CLIENT.search(
@@ -259,26 +262,31 @@ def get_embedding_function(
     embedding_batch_size,
 ):
     if embedding_engine == "":
-        return lambda query: embedding_function.encode(query).tolist()
+        return lambda query, user=None: embedding_function.encode(query).tolist()
     elif embedding_engine in ["ollama", "openai"]:
-        func = lambda query: generate_embeddings(
+        func = lambda query, user=None: generate_embeddings(
             engine=embedding_engine,
             model=embedding_model,
             text=query,
             url=url,
             key=key,
+            user=user,
         )
 
-        def generate_multiple(query, func):
+        def generate_multiple(query, user, func):
             if isinstance(query, list):
                 embeddings = []
                 for i in range(0, len(query), embedding_batch_size):
-                    embeddings.extend(func(query[i : i + embedding_batch_size]))
+                    embeddings.extend(
+                        func(query[i : i + embedding_batch_size], user=user)
+                    )
                 return embeddings
             else:
-                return func(query)
+                return func(query, user)
 
-        return lambda query: generate_multiple(query, func)
+        return lambda query, user=None: generate_multiple(query, user, func)
+    else:
+        raise ValueError(f"Unknown embedding engine: {embedding_engine}")
 
 
 def get_sources_from_files(
@@ -423,7 +431,11 @@ def get_model_path(model: str, update_model: bool = False):
 
 
 def generate_openai_batch_embeddings(
-    model: str, texts: list[str], url: str = "https://api.openai.com/v1", key: str = ""
+    model: str,
+    texts: list[str],
+    url: str = "https://api.openai.com/v1",
+    key: str = "",
+    user: UserModel = None,
 ) -> Optional[list[list[float]]]:
     try:
         r = requests.post(
@@ -431,6 +443,16 @@ def generate_openai_batch_embeddings(
             headers={
                 "Content-Type": "application/json",
                 "Authorization": f"Bearer {key}",
+                **(
+                    {
+                        "X-OpenWebUI-User-Name": user.name,
+                        "X-OpenWebUI-User-Id": user.id,
+                        "X-OpenWebUI-User-Email": user.email,
+                        "X-OpenWebUI-User-Role": user.role,
+                    }
+                    if ENABLE_FORWARD_USER_INFO_HEADERS and user
+                    else {}
+                ),
             },
             json={"input": texts, "model": model},
         )
@@ -446,7 +468,7 @@ def generate_openai_batch_embeddings(
 
 
 def generate_ollama_batch_embeddings(
-    model: str, texts: list[str], url: str, key: str = ""
+    model: str, texts: list[str], url: str, key: str = "", user: UserModel = None
 ) -> Optional[list[list[float]]]:
     try:
         r = requests.post(
@@ -454,6 +476,16 @@ def generate_ollama_batch_embeddings(
             headers={
                 "Content-Type": "application/json",
                 "Authorization": f"Bearer {key}",
+                **(
+                    {
+                        "X-OpenWebUI-User-Name": user.name,
+                        "X-OpenWebUI-User-Id": user.id,
+                        "X-OpenWebUI-User-Email": user.email,
+                        "X-OpenWebUI-User-Role": user.role,
+                    }
+                    if ENABLE_FORWARD_USER_INFO_HEADERS
+                    else {}
+                ),
             },
             json={"input": texts, "model": model},
         )
@@ -472,22 +504,29 @@ def generate_ollama_batch_embeddings(
 def generate_embeddings(engine: str, model: str, text: Union[str, list[str]], **kwargs):
     url = kwargs.get("url", "")
     key = kwargs.get("key", "")
+    user = kwargs.get("user")
 
     if engine == "ollama":
         if isinstance(text, list):
             embeddings = generate_ollama_batch_embeddings(
-                **{"model": model, "texts": text, "url": url, "key": key}
+                **{"model": model, "texts": text, "url": url, "key": key, "user": user}
             )
         else:
             embeddings = generate_ollama_batch_embeddings(
-                **{"model": model, "texts": [text], "url": url, "key": key}
+                **{
+                    "model": model,
+                    "texts": [text],
+                    "url": url,
+                    "key": key,
+                    "user": user,
+                }
             )
         return embeddings[0] if isinstance(text, str) else embeddings
     elif engine == "openai":
         if isinstance(text, list):
-            embeddings = generate_openai_batch_embeddings(model, text, url, key)
+            embeddings = generate_openai_batch_embeddings(model, text, url, key, user)
         else:
-            embeddings = generate_openai_batch_embeddings(model, [text], url, key)
+            embeddings = generate_openai_batch_embeddings(model, [text], url, key, user)
 
         return embeddings[0] if isinstance(text, str) else embeddings
 

+ 76 - 0
backend/open_webui/retrieval/web/exa.py

@@ -0,0 +1,76 @@
+import logging
+from dataclasses import dataclass
+from typing import Optional
+
+import requests
+from open_webui.env import SRC_LOG_LEVELS
+from open_webui.retrieval.web.main import SearchResult
+
+log = logging.getLogger(__name__)
+log.setLevel(SRC_LOG_LEVELS["RAG"])
+
+EXA_API_BASE = "https://api.exa.ai"
+
+
+@dataclass
+class ExaResult:
+    url: str
+    title: str
+    text: str
+
+
+def search_exa(
+    api_key: str,
+    query: str,
+    count: int,
+    filter_list: Optional[list[str]] = None,
+) -> list[SearchResult]:
+    """Search using Exa Search API and return the results as a list of SearchResult objects.
+
+    Args:
+        api_key (str): A Exa Search API key
+        query (str): The query to search for
+        count (int): Number of results to return
+        filter_list (Optional[list[str]]): List of domains to filter results by
+    """
+    log.info(f"Searching with Exa for query: {query}")
+
+    headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
+
+    payload = {
+        "query": query,
+        "numResults": count or 5,
+        "includeDomains": filter_list,
+        "contents": {"text": True, "highlights": True},
+        "type": "auto",  # Use the auto search type (keyword or neural)
+    }
+
+    try:
+        response = requests.post(
+            f"{EXA_API_BASE}/search", headers=headers, json=payload
+        )
+        response.raise_for_status()
+        data = response.json()
+
+        results = []
+        for result in data["results"]:
+            results.append(
+                ExaResult(
+                    url=result["url"],
+                    title=result["title"],
+                    text=result["text"],
+                )
+            )
+
+        log.info(f"Found {len(results)} results")
+        return [
+            SearchResult(
+                link=result.url,
+                title=result.title,
+                snippet=result.text,
+            )
+            for result in results
+        ]
+    except Exception as e:
+        log.error(f"Error searching Exa: {e}")
+        return []

+ 2 - 0
backend/open_webui/retrieval/web/utils.py

@@ -48,6 +48,7 @@ def validate_url(url: Union[str, Sequence[str]]):
     else:
         return False
 
+
 def safe_validate_urls(url: Sequence[str]) -> Sequence[str]:
     valid_urls = []
     for u in url:
@@ -57,6 +58,7 @@ def safe_validate_urls(url: Sequence[str]) -> Sequence[str]:
         except ValueError:
             continue
     return valid_urls
+
 def resolve_hostname(hostname):
     # Get address information
     addr_info = socket.getaddrinfo(hostname, None)

+ 4 - 2
backend/open_webui/routers/files.py

@@ -71,7 +71,7 @@ def upload_file(
         )
 
         try:
-            process_file(request, ProcessFileForm(file_id=id))
+            process_file(request, ProcessFileForm(file_id=id), user=user)
             file_item = Files.get_file_by_id(id=id)
         except Exception as e:
             log.exception(e)
@@ -193,7 +193,9 @@ async def update_file_data_content_by_id(
     if file and (file.user_id == user.id or user.role == "admin"):
         try:
             process_file(
-                request, ProcessFileForm(file_id=id, content=form_data.content)
+                request,
+                ProcessFileForm(file_id=id, content=form_data.content),
+                user=user,
             )
             file = Files.get_file_by_id(id=id)
         except Exception as e:

+ 6 - 2
backend/open_webui/routers/knowledge.py

@@ -289,7 +289,9 @@ def add_file_to_knowledge_by_id(
     # Add content to the vector database
     try:
         process_file(
-            request, ProcessFileForm(file_id=form_data.file_id, collection_name=id)
+            request,
+            ProcessFileForm(file_id=form_data.file_id, collection_name=id),
+            user=user,
         )
     except Exception as e:
         log.debug(e)
@@ -372,7 +374,9 @@ def update_file_from_knowledge_by_id(
     # Add content to the vector database
     try:
         process_file(
-            request, ProcessFileForm(file_id=form_data.file_id, collection_name=id)
+            request,
+            ProcessFileForm(file_id=form_data.file_id, collection_name=id),
+            user=user,
         )
     except Exception as e:
         raise HTTPException(

+ 6 - 4
backend/open_webui/routers/memories.py

@@ -57,7 +57,7 @@ async def add_memory(
             {
                 "id": memory.id,
                 "text": memory.content,
-                "vector": request.app.state.EMBEDDING_FUNCTION(memory.content),
+                "vector": request.app.state.EMBEDDING_FUNCTION(memory.content, user),
                 "metadata": {"created_at": memory.created_at},
             }
         ],
@@ -82,7 +82,7 @@ async def query_memory(
 ):
     results = VECTOR_DB_CLIENT.search(
         collection_name=f"user-memory-{user.id}",
-        vectors=[request.app.state.EMBEDDING_FUNCTION(form_data.content)],
+        vectors=[request.app.state.EMBEDDING_FUNCTION(form_data.content, user)],
         limit=form_data.k,
     )
 
@@ -105,7 +105,7 @@ async def reset_memory_from_vector_db(
             {
                 "id": memory.id,
                 "text": memory.content,
-                "vector": request.app.state.EMBEDDING_FUNCTION(memory.content),
+                "vector": request.app.state.EMBEDDING_FUNCTION(memory.content, user),
                 "metadata": {
                     "created_at": memory.created_at,
                     "updated_at": memory.updated_at,
@@ -160,7 +160,9 @@ async def update_memory_by_id(
                 {
                     "id": memory.id,
                     "text": memory.content,
-                    "vector": request.app.state.EMBEDDING_FUNCTION(memory.content),
+                    "vector": request.app.state.EMBEDDING_FUNCTION(
+                        memory.content, user
+                    ),
                     "metadata": {
                         "created_at": memory.created_at,
                         "updated_at": memory.updated_at,

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

@@ -939,6 +939,7 @@ async def generate_completion(
 class ChatMessage(BaseModel):
     role: str
     content: str
+    tool_calls: Optional[list[dict]] = None
     images: Optional[list[str]] = None
 
 
@@ -950,6 +951,7 @@ class GenerateChatCompletionForm(BaseModel):
     template: Optional[str] = None
     stream: Optional[bool] = True
     keep_alive: Optional[Union[int, str]] = None
+    tools: Optional[list[dict]] = None
 
 
 async def get_ollama_url(request: Request, model: str, url_idx: Optional[int] = None):
@@ -1005,7 +1007,7 @@ async def generate_chat_completion(
             payload["options"] = apply_model_params_to_body_ollama(
                 params, payload["options"]
             )
-            payload = apply_model_system_prompt_to_body(params, payload, metadata)
+            payload = apply_model_system_prompt_to_body(params, payload, metadata, user)
 
         # Check if user has access to the model
         if not bypass_filter and user.role == "user":
@@ -1158,6 +1160,8 @@ async def generate_openai_chat_completion(
     url_idx: Optional[int] = None,
     user=Depends(get_verified_user),
 ):
+    metadata = form_data.pop("metadata", None)
+
     try:
         completion_form = OpenAIChatCompletionForm(**form_data)
     except Exception as e:
@@ -1184,7 +1188,7 @@ async def generate_openai_chat_completion(
 
         if params:
             payload = apply_model_params_to_body_openai(params, payload)
-            payload = apply_model_system_prompt_to_body(params, payload, user)
+            payload = apply_model_system_prompt_to_body(params, payload, metadata, user)
 
         # Check if user has access to the model
         if user.role == "user":

+ 1 - 1
backend/open_webui/routers/openai.py

@@ -566,7 +566,7 @@ async def generate_chat_completion(
 
         params = model_info.params.model_dump()
         payload = apply_model_params_to_body_openai(params, payload)
-        payload = apply_model_system_prompt_to_body(params, payload, metadata)
+        payload = apply_model_system_prompt_to_body(params, payload, metadata, user)
 
         # Check if user has access to the model
         if not bypass_filter and user.role == "user":

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

@@ -55,6 +55,7 @@ from open_webui.retrieval.web.serply import search_serply
 from open_webui.retrieval.web.serpstack import search_serpstack
 from open_webui.retrieval.web.tavily import search_tavily
 from open_webui.retrieval.web.bing import search_bing
+from open_webui.retrieval.web.exa import search_exa
 
 
 from open_webui.retrieval.utils import (
@@ -388,6 +389,7 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)):
                 "jina_api_key": request.app.state.config.JINA_API_KEY,
                 "bing_search_v7_endpoint": request.app.state.config.BING_SEARCH_V7_ENDPOINT,
                 "bing_search_v7_subscription_key": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY,
+                "exa_api_key": request.app.state.config.EXA_API_KEY,
                 "result_count": request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
                 "concurrent_requests": request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
             },
@@ -436,6 +438,7 @@ class WebSearchConfig(BaseModel):
     jina_api_key: Optional[str] = None
     bing_search_v7_endpoint: Optional[str] = None
     bing_search_v7_subscription_key: Optional[str] = None
+    exa_api_key: Optional[str] = None
     result_count: Optional[int] = None
     concurrent_requests: Optional[int] = None
 
@@ -542,6 +545,8 @@ async def update_rag_config(
             form_data.web.search.bing_search_v7_subscription_key
         )
 
+        request.app.state.config.EXA_API_KEY = form_data.web.search.exa_api_key
+
         request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT = (
             form_data.web.search.result_count
         )
@@ -591,6 +596,7 @@ async def update_rag_config(
                 "jina_api_key": request.app.state.config.JINA_API_KEY,
                 "bing_search_v7_endpoint": request.app.state.config.BING_SEARCH_V7_ENDPOINT,
                 "bing_search_v7_subscription_key": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY,
+                "exa_api_key": request.app.state.config.EXA_API_KEY,
                 "result_count": request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
                 "concurrent_requests": request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
             },
@@ -660,6 +666,7 @@ def save_docs_to_vector_db(
     overwrite: bool = False,
     split: bool = True,
     add: bool = False,
+    user=None,
 ) -> bool:
     def _get_docs_info(docs: list[Document]) -> str:
         docs_info = set()
@@ -775,7 +782,7 @@ def save_docs_to_vector_db(
         )
 
         embeddings = embedding_function(
-            list(map(lambda x: x.replace("\n", " "), texts))
+            list(map(lambda x: x.replace("\n", " "), texts)), user=user
         )
 
         items = [
@@ -933,6 +940,7 @@ def process_file(
                     "hash": hash,
                 },
                 add=(True if form_data.collection_name else False),
+                user=user,
             )
 
             if result:
@@ -990,7 +998,7 @@ def process_text(
     text_content = form_data.content
     log.debug(f"text_content: {text_content}")
 
-    result = save_docs_to_vector_db(request, docs, collection_name)
+    result = save_docs_to_vector_db(request, docs, collection_name, user=user)
     if result:
         return {
             "status": True,
@@ -1023,7 +1031,9 @@ def process_youtube_video(
         content = " ".join([doc.page_content for doc in docs])
         log.debug(f"text_content: {content}")
 
-        save_docs_to_vector_db(request, docs, collection_name, overwrite=True)
+        save_docs_to_vector_db(
+            request, docs, collection_name, overwrite=True, user=user
+        )
 
         return {
             "status": True,
@@ -1064,7 +1074,9 @@ def process_web(
         content = " ".join([doc.page_content for doc in docs])
 
         log.debug(f"text_content: {content}")
-        save_docs_to_vector_db(request, docs, collection_name, overwrite=True)
+        save_docs_to_vector_db(
+            request, docs, collection_name, overwrite=True, user=user
+        )
 
         return {
             "status": True,
@@ -1099,6 +1111,7 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]:
     - SERPER_API_KEY
     - SERPLY_API_KEY
     - TAVILY_API_KEY
+    - EXA_API_KEY
     - SEARCHAPI_API_KEY + SEARCHAPI_ENGINE (by default `google`)
     Args:
         query (str): The query to search for
@@ -1233,6 +1246,13 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]:
             request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
             request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST,
         )
+    elif engine == "exa":
+        return search_exa(
+            request.app.state.config.EXA_API_KEY,
+            query,
+            request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
+            request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST,
+        )
     else:
         raise Exception("No search engine API key found in environment variables")
 
@@ -1273,7 +1293,9 @@ async def process_web_search(
         )
         docs = [doc async for doc in loader.alazy_load()]
         # docs = loader.load()
-        save_docs_to_vector_db(request, docs, collection_name, overwrite=True)
+        save_docs_to_vector_db(
+            request, docs, collection_name, overwrite=True, user=user
+        )
 
         return {
             "status": True,
@@ -1307,7 +1329,9 @@ def query_doc_handler(
             return query_doc_with_hybrid_search(
                 collection_name=form_data.collection_name,
                 query=form_data.query,
-                embedding_function=request.app.state.EMBEDDING_FUNCTION,
+                embedding_function=lambda query: request.app.state.EMBEDDING_FUNCTION(
+                    query, user=user
+                ),
                 k=form_data.k if form_data.k else request.app.state.config.TOP_K,
                 reranking_function=request.app.state.rf,
                 r=(
@@ -1315,12 +1339,16 @@ def query_doc_handler(
                     if form_data.r
                     else request.app.state.config.RELEVANCE_THRESHOLD
                 ),
+                user=user,
             )
         else:
             return query_doc(
                 collection_name=form_data.collection_name,
-                query_embedding=request.app.state.EMBEDDING_FUNCTION(form_data.query),
+                query_embedding=request.app.state.EMBEDDING_FUNCTION(
+                    form_data.query, user=user
+                ),
                 k=form_data.k if form_data.k else request.app.state.config.TOP_K,
+                user=user,
             )
     except Exception as e:
         log.exception(e)
@@ -1349,7 +1377,9 @@ def query_collection_handler(
             return query_collection_with_hybrid_search(
                 collection_names=form_data.collection_names,
                 queries=[form_data.query],
-                embedding_function=request.app.state.EMBEDDING_FUNCTION,
+                embedding_function=lambda query: request.app.state.EMBEDDING_FUNCTION(
+                    query, user=user
+                ),
                 k=form_data.k if form_data.k else request.app.state.config.TOP_K,
                 reranking_function=request.app.state.rf,
                 r=(
@@ -1362,7 +1392,9 @@ def query_collection_handler(
             return query_collection(
                 collection_names=form_data.collection_names,
                 queries=[form_data.query],
-                embedding_function=request.app.state.EMBEDDING_FUNCTION,
+                embedding_function=lambda query: request.app.state.EMBEDDING_FUNCTION(
+                    query, user=user
+                ),
                 k=form_data.k if form_data.k else request.app.state.config.TOP_K,
             )
 
@@ -1510,6 +1542,7 @@ def process_files_batch(
                 docs=all_docs,
                 collection_name=collection_name,
                 add=True,
+                user=user,
             )
 
             # Update all files with collection name

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

@@ -79,6 +79,7 @@ class ChatPermissions(BaseModel):
 class FeaturesPermissions(BaseModel):
     web_search: bool = True
     image_generation: bool = True
+    code_interpreter: bool = True
 
 
 class UserPermissions(BaseModel):

+ 444 - 101
backend/open_webui/utils/middleware.py

@@ -1,6 +1,8 @@
 import time
 import logging
 import sys
+import os
+import base64
 
 import asyncio
 from aiocache import cached
@@ -10,6 +12,7 @@ import json
 import html
 import inspect
 import re
+import ast
 
 from uuid import uuid4
 from concurrent.futures import ThreadPoolExecutor
@@ -55,6 +58,7 @@ from open_webui.utils.task import (
     tools_function_calling_generation_template,
 )
 from open_webui.utils.misc import (
+    deep_update,
     get_message_list,
     add_or_update_system_message,
     add_or_update_user_message,
@@ -69,6 +73,7 @@ from open_webui.utils.plugin import load_function_module_by_id
 from open_webui.tasks import create_task
 
 from open_webui.config import (
+    CACHE_DIR,
     DEFAULT_TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE,
     DEFAULT_CODE_INTERPRETER_PROMPT,
 )
@@ -180,7 +185,7 @@ async def chat_completion_filter_functions_handler(request, body, model, extra_p
 
 
 async def chat_completion_tools_handler(
-    request: Request, body: dict, user: UserModel, models, extra_params: dict
+    request: Request, body: dict, user: UserModel, models, tools
 ) -> tuple[dict, dict]:
     async def get_content_from_response(response) -> Optional[str]:
         content = None
@@ -215,35 +220,15 @@ async def chat_completion_tools_handler(
             "metadata": {"task": str(TASKS.FUNCTION_CALLING)},
         }
 
-    # If tool_ids field is present, call the functions
-    metadata = body.get("metadata", {})
-
-    tool_ids = metadata.get("tool_ids", None)
-    log.debug(f"{tool_ids=}")
-    if not tool_ids:
-        return body, {}
-
-    skip_files = False
-    sources = []
-
     task_model_id = get_task_model_id(
         body["model"],
         request.app.state.config.TASK_MODEL,
         request.app.state.config.TASK_MODEL_EXTERNAL,
         models,
     )
-    tools = get_tools(
-        request,
-        tool_ids,
-        user,
-        {
-            **extra_params,
-            "__model__": models[task_model_id],
-            "__messages__": body["messages"],
-            "__files__": metadata.get("files", []),
-        },
-    )
-    log.info(f"{tools=}")
+
+    skip_files = False
+    sources = []
 
     specs = [tool["spec"] for tool in tools.values()]
     tools_specs = json.dumps(specs)
@@ -278,6 +263,8 @@ async def chat_completion_tools_handler(
             result = json.loads(content)
 
             async def tool_call_handler(tool_call):
+                nonlocal skip_files
+
                 log.debug(f"{tool_call=}")
 
                 tool_function_name = tool_call.get("name", None)
@@ -418,7 +405,7 @@ async def chat_web_search_handler(
                 },
             }
         )
-        return
+        return form_data
 
     searchQuery = queries[0]
 
@@ -641,7 +628,9 @@ async def chat_completion_files_handler(
                     lambda: get_sources_from_files(
                         files=files,
                         queries=queries,
-                        embedding_function=request.app.state.EMBEDDING_FUNCTION,
+                        embedding_function=lambda query: request.app.state.EMBEDDING_FUNCTION(
+                            query, user=user
+                        ),
                         k=request.app.state.config.TOP_K,
                         reranking_function=request.app.state.rf,
                         r=request.app.state.config.RELEVANCE_THRESHOLD,
@@ -693,6 +682,7 @@ def apply_params_to_form_data(form_data, model):
 
 
 async def process_chat_payload(request, form_data, metadata, user, model):
+
     form_data = apply_params_to_form_data(form_data, model)
     log.debug(f"form_data: {form_data}")
 
@@ -715,6 +705,12 @@ async def process_chat_payload(request, form_data, metadata, user, model):
     # Initialize events to store additional event to be sent to the client
     # Initialize contexts and citation
     models = request.app.state.MODELS
+    task_model_id = get_task_model_id(
+        form_data["model"],
+        request.app.state.config.TASK_MODEL,
+        request.app.state.config.TASK_MODEL_EXTERNAL,
+        models,
+    )
 
     events = []
     sources = []
@@ -799,13 +795,41 @@ async def process_chat_payload(request, form_data, metadata, user, model):
     }
     form_data["metadata"] = metadata
 
-    try:
-        form_data, flags = await chat_completion_tools_handler(
-            request, form_data, user, models, extra_params
+    tool_ids = metadata.get("tool_ids", None)
+    log.debug(f"{tool_ids=}")
+
+    if tool_ids:
+        # If tool_ids field is present, then get the tools
+        tools = get_tools(
+            request,
+            tool_ids,
+            user,
+            {
+                **extra_params,
+                "__model__": models[task_model_id],
+                "__messages__": form_data["messages"],
+                "__files__": metadata.get("files", []),
+            },
         )
-        sources.extend(flags.get("sources", []))
-    except Exception as e:
-        log.exception(e)
+        log.info(f"{tools=}")
+
+        if metadata.get("function_calling") == "native":
+            # If the function calling is native, then call the tools function calling handler
+            metadata["tools"] = tools
+            form_data["tools"] = [
+                {"type": "function", "function": tool.get("spec", {})}
+                for tool in tools.values()
+            ]
+        else:
+            # If the function calling is not native, then call the tools function calling handler
+            try:
+                form_data, flags = await chat_completion_tools_handler(
+                    request, form_data, user, models, tools
+                )
+                sources.extend(flags.get("sources", []))
+
+            except Exception as e:
+                log.exception(e)
 
     try:
         form_data, flags = await chat_completion_files_handler(request, form_data, user)
@@ -821,11 +845,11 @@ async def process_chat_payload(request, form_data, metadata, user, model):
 
             if "document" in source:
                 for doc_idx, doc_context in enumerate(source["document"]):
-                    metadata = source.get("metadata")
+                    doc_metadata = source.get("metadata")
                     doc_source_id = None
 
-                    if metadata:
-                        doc_source_id = metadata[doc_idx].get("source", source_id)
+                    if doc_metadata:
+                        doc_source_id = doc_metadata[doc_idx].get("source", source_id)
 
                     if source_id:
                         context_string += f"<source><source_id>{doc_source_id if doc_source_id is not None else source_id}</source_id><source_context>{doc_context}</source_context></source>\n"
@@ -882,7 +906,7 @@ async def process_chat_payload(request, form_data, metadata, user, model):
             }
         )
 
-    return form_data, events
+    return form_data, metadata, events
 
 
 async def process_chat_response(
@@ -1100,6 +1124,40 @@ async def process_chat_response(
                 for block in content_blocks:
                     if block["type"] == "text":
                         content = f"{content}{block['content'].strip()}\n"
+                    elif block["type"] == "tool_calls":
+                        attributes = block.get("attributes", {})
+
+                        block_content = block.get("content", [])
+                        results = block.get("results", [])
+
+                        if results:
+
+                            result_display_content = ""
+
+                            for result in results:
+                                tool_call_id = result.get("tool_call_id", "")
+                                tool_name = ""
+
+                                for tool_call in block_content:
+                                    if tool_call.get("id", "") == tool_call_id:
+                                        tool_name = tool_call.get("function", {}).get(
+                                            "name", ""
+                                        )
+                                        break
+
+                                result_display_content = f"{result_display_content}\n> {tool_name}: {result.get('content', '')}"
+
+                            if not raw:
+                                content = f'{content}\n<details type="tool_calls" done="true" content="{html.escape(json.dumps(block_content))}" results="{html.escape(json.dumps(results))}">\n<summary>Tool Executed</summary>\n{result_display_content}\n</details>\n'
+                        else:
+                            tool_calls_display_content = ""
+
+                            for tool_call in block_content:
+                                tool_calls_display_content = f"{tool_calls_display_content}\n> Executing {tool_call.get('function', {}).get('name', '')}"
+
+                            if not raw:
+                                content = f'{content}\n<details type="tool_calls" done="false" content="{html.escape(json.dumps(block_content))}">\n<summary>Tool Executing...</summary>\n{tool_calls_display_content}\n</details>\n'
+
                     elif block["type"] == "reasoning":
                         reasoning_display_content = "\n".join(
                             (f"> {line}" if not line.startswith(">") else line)
@@ -1108,16 +1166,16 @@ async def process_chat_response(
 
                         reasoning_duration = block.get("duration", None)
 
-                        if reasoning_duration:
+                        if reasoning_duration is not None:
                             if raw:
-                                content = f'{content}<{block["tag"]}>{block["content"]}</{block["tag"]}>\n'
+                                content = f'{content}\n<{block["tag"]}>{block["content"]}</{block["tag"]}>\n'
                             else:
-                                content = f'{content}<details type="reasoning" done="true" duration="{reasoning_duration}">\n<summary>Thought for {reasoning_duration} seconds</summary>\n{reasoning_display_content}\n</details>\n'
+                                content = f'{content}\n<details type="reasoning" done="true" duration="{reasoning_duration}">\n<summary>Thought for {reasoning_duration} seconds</summary>\n{reasoning_display_content}\n</details>\n'
                         else:
                             if raw:
-                                content = f'{content}<{block["tag"]}>{block["content"]}</{block["tag"]}>\n'
+                                content = f'{content}\n<{block["tag"]}>{block["content"]}</{block["tag"]}>\n'
                             else:
-                                content = f'{content}<details type="reasoning" done="false">\n<summary>Thinking…</summary>\n{reasoning_display_content}\n</details>\n'
+                                content = f'{content}\n<details type="reasoning" done="false">\n<summary>Thinking…</summary>\n{reasoning_display_content}\n</details>\n'
 
                     elif block["type"] == "code_interpreter":
                         attributes = block.get("attributes", {})
@@ -1128,20 +1186,20 @@ async def process_chat_response(
                             output = html.escape(json.dumps(output))
 
                             if raw:
-                                content = f'{content}<code_interpreter type="code" lang="{lang}">\n{block["content"]}\n</code_interpreter>\n```output\n{output}\n```\n'
+                                content = f'{content}\n<code_interpreter type="code" lang="{lang}">\n{block["content"]}\n</code_interpreter>\n```output\n{output}\n```\n'
                             else:
-                                content = f'{content}<details type="code_interpreter" done="true" output="{output}">\n<summary>Analyzed</summary>\n```{lang}\n{block["content"]}\n```\n</details>\n'
+                                content = f'{content}\n<details type="code_interpreter" done="true" output="{output}">\n<summary>Analyzed</summary>\n```{lang}\n{block["content"]}\n```\n</details>\n'
                         else:
                             if raw:
-                                content = f'{content}<code_interpreter type="code" lang="{lang}">\n{block["content"]}\n</code_interpreter>\n'
+                                content = f'{content}\n<code_interpreter type="code" lang="{lang}">\n{block["content"]}\n</code_interpreter>\n'
                             else:
-                                content = f'{content}<details type="code_interpreter" done="false">\n<summary>Analyzing...</summary>\n```{lang}\n{block["content"]}\n```\n</details>\n'
+                                content = f'{content}\n<details type="code_interpreter" done="false">\n<summary>Analyzing...</summary>\n```{lang}\n{block["content"]}\n```\n</details>\n'
 
                     else:
                         block_content = str(block["content"]).strip()
                         content = f"{content}{block['type']}: {block_content}\n"
 
-                return content
+                return content.strip()
 
             def tag_content_handler(content_type, tags, content, content_blocks):
                 end_flag = False
@@ -1149,6 +1207,8 @@ async def process_chat_response(
                 def extract_attributes(tag_content):
                     """Extract attributes from a tag if they exist."""
                     attributes = {}
+                    if not tag_content:  # Ensure tag_content is not None
+                        return attributes
                     # Match attributes in the format: key="value" (ignores single quotes for simplicity)
                     matches = re.findall(r'(\w+)\s*=\s*"([^"]+)"', tag_content)
                     for key, value in matches:
@@ -1158,17 +1218,35 @@ async def process_chat_response(
                 if content_blocks[-1]["type"] == "text":
                     for tag in tags:
                         # Match start tag e.g., <tag> or <tag attr="value">
-                        start_tag_pattern = rf"<{tag}(.*?)>"
+                        start_tag_pattern = rf"<{tag}(\s.*?)?>"
                         match = re.search(start_tag_pattern, content)
                         if match:
-                            # Extract attributes in the tag (if present)
-                            attributes = extract_attributes(match.group(1))
+                            attr_content = (
+                                match.group(1) if match.group(1) else ""
+                            )  # Ensure it's not None
+                            attributes = extract_attributes(
+                                attr_content
+                            )  # Extract attributes safely
+
+                            # Capture everything before and after the matched tag
+                            before_tag = content[
+                                : match.start()
+                            ]  # Content before opening tag
+                            after_tag = content[
+                                match.end() :
+                            ]  # Content after opening tag
+
                             # Remove the start tag from the currently handling text block
                             content_blocks[-1]["content"] = content_blocks[-1][
                                 "content"
                             ].replace(match.group(0), "")
+
+                            if before_tag:
+                                content_blocks[-1]["content"] = before_tag
+
                             if not content_blocks[-1]["content"]:
                                 content_blocks.pop()
+
                             # Append the new block
                             content_blocks.append(
                                 {
@@ -1179,52 +1257,100 @@ async def process_chat_response(
                                     "started_at": time.time(),
                                 }
                             )
+
+                            if after_tag:
+                                content_blocks[-1]["content"] = after_tag
+
                             break
                 elif content_blocks[-1]["type"] == content_type:
                     tag = content_blocks[-1]["tag"]
                     # Match end tag e.g., </tag>
                     end_tag_pattern = rf"</{tag}>"
+
+                    # Check if the content has the end tag
                     if re.search(end_tag_pattern, content):
+                        end_flag = True
+
                         block_content = content_blocks[-1]["content"]
                         # Strip start and end tags from the content
                         start_tag_pattern = rf"<{tag}(.*?)>"
                         block_content = re.sub(
                             start_tag_pattern, "", block_content
                         ).strip()
-                        block_content = re.sub(
-                            end_tag_pattern, "", block_content
-                        ).strip()
+
+                        end_tag_regex = re.compile(end_tag_pattern, re.DOTALL)
+                        split_content = end_tag_regex.split(block_content, maxsplit=1)
+
+                        # Content inside the tag
+                        block_content = (
+                            split_content[0].strip() if split_content else ""
+                        )
+
+                        # Leftover content (everything after `</tag>`)
+                        leftover_content = (
+                            split_content[1].strip() if len(split_content) > 1 else ""
+                        )
+
                         if block_content:
-                            end_flag = True
                             content_blocks[-1]["content"] = block_content
                             content_blocks[-1]["ended_at"] = time.time()
                             content_blocks[-1]["duration"] = int(
                                 content_blocks[-1]["ended_at"]
                                 - content_blocks[-1]["started_at"]
                             )
+
                             # Reset the content_blocks by appending a new text block
-                            content_blocks.append(
-                                {
-                                    "type": "text",
-                                    "content": "",
-                                }
-                            )
-                            # Clean processed content
-                            content = re.sub(
-                                rf"<{tag}(.*?)>(.|\n)*?</{tag}>",
-                                "",
-                                content,
-                                flags=re.DOTALL,
-                            )
+                            if content_type != "code_interpreter":
+                                if leftover_content:
+
+                                    content_blocks.append(
+                                        {
+                                            "type": "text",
+                                            "content": leftover_content,
+                                        }
+                                    )
+                                else:
+                                    content_blocks.append(
+                                        {
+                                            "type": "text",
+                                            "content": "",
+                                        }
+                                    )
+
                         else:
                             # Remove the block if content is empty
                             content_blocks.pop()
+
+                            if leftover_content:
+                                content_blocks.append(
+                                    {
+                                        "type": "text",
+                                        "content": leftover_content,
+                                    }
+                                )
+                            else:
+                                content_blocks.append(
+                                    {
+                                        "type": "text",
+                                        "content": "",
+                                    }
+                                )
+
+                        # Clean processed content
+                        content = re.sub(
+                            rf"<{tag}(.*?)>(.|\n)*?</{tag}>",
+                            "",
+                            content,
+                            flags=re.DOTALL,
+                        )
+
                 return content, content_blocks, end_flag
 
             message = Chats.get_message_by_id_and_message_id(
                 metadata["chat_id"], metadata["message_id"]
             )
 
+            tool_calls = []
             content = message.get("content", "") if message else ""
             content_blocks = [
                 {
@@ -1235,9 +1361,18 @@ async def process_chat_response(
 
             # We might want to disable this by default
             DETECT_REASONING = True
-            DETECT_CODE_INTERPRETER = True
+            DETECT_CODE_INTERPRETER = metadata.get("features", {}).get(
+                "code_interpreter", False
+            )
 
-            reasoning_tags = ["think", "reason", "reasoning", "thought", "Thought"]
+            reasoning_tags = [
+                "think",
+                "thinking",
+                "reason",
+                "reasoning",
+                "thought",
+                "Thought",
+            ]
             code_interpreter_tags = ["code_interpreter"]
 
             try:
@@ -1262,6 +1397,8 @@ async def process_chat_response(
                     nonlocal content
                     nonlocal content_blocks
 
+                    response_tool_calls = []
+
                     async for line in response.body_iterator:
                         line = line.decode("utf-8") if isinstance(line, bytes) else line
                         data = line
@@ -1294,10 +1431,54 @@ async def process_chat_response(
                                 if not choices:
                                     continue
 
-                                value = choices[0].get("delta", {}).get("content")
+                                delta = choices[0].get("delta", {})
+                                delta_tool_calls = delta.get("tool_calls", None)
+
+                                if delta_tool_calls:
+                                    for delta_tool_call in delta_tool_calls:
+                                        tool_call_index = delta_tool_call.get("index")
+
+                                        if tool_call_index is not None:
+                                            if (
+                                                len(response_tool_calls)
+                                                <= tool_call_index
+                                            ):
+                                                response_tool_calls.append(
+                                                    delta_tool_call
+                                                )
+                                            else:
+                                                delta_name = delta_tool_call.get(
+                                                    "function", {}
+                                                ).get("name")
+                                                delta_arguments = delta_tool_call.get(
+                                                    "function", {}
+                                                ).get("arguments")
+
+                                                if delta_name:
+                                                    response_tool_calls[
+                                                        tool_call_index
+                                                    ]["function"]["name"] += delta_name
+
+                                                if delta_arguments:
+                                                    response_tool_calls[
+                                                        tool_call_index
+                                                    ]["function"][
+                                                        "arguments"
+                                                    ] += delta_arguments
+
+                                value = delta.get("content")
 
                                 if value:
                                     content = f"{content}{value}"
+
+                                    if not content_blocks:
+                                        content_blocks.append(
+                                            {
+                                                "type": "text",
+                                                "content": "",
+                                            }
+                                        )
+
                                     content_blocks[-1]["content"] = (
                                         content_blocks[-1]["content"] + value
                                     )
@@ -1357,14 +1538,46 @@ async def process_chat_response(
                                 log.debug("Error: ", e)
                                 continue
 
-                    # Clean up the last text block
-                    if content_blocks[-1]["type"] == "text":
-                        content_blocks[-1]["content"] = content_blocks[-1][
-                            "content"
-                        ].strip()
+                    if content_blocks:
+                        # Clean up the last text block
+                        if content_blocks[-1]["type"] == "text":
+                            content_blocks[-1]["content"] = content_blocks[-1][
+                                "content"
+                            ].strip()
 
-                        if not content_blocks[-1]["content"]:
-                            content_blocks.pop()
+                            if not content_blocks[-1]["content"]:
+                                content_blocks.pop()
+
+                                if not content_blocks:
+                                    content_blocks.append(
+                                        {
+                                            "type": "text",
+                                            "content": "",
+                                        }
+                                    )
+
+                    if response_tool_calls:
+                        tool_calls.append(response_tool_calls)
+
+                    if response.background:
+                        await response.background()
+
+                await stream_body_handler(response)
+
+                MAX_TOOL_CALL_RETRIES = 5
+                tool_call_retries = 0
+
+                while len(tool_calls) > 0 and tool_call_retries < MAX_TOOL_CALL_RETRIES:
+                    tool_call_retries += 1
+
+                    response_tool_calls = tool_calls.pop(0)
+
+                    content_blocks.append(
+                        {
+                            "type": "tool_calls",
+                            "content": response_tool_calls,
+                        }
+                    )
 
                     await event_emitter(
                         {
@@ -1375,37 +1588,54 @@ async def process_chat_response(
                         }
                     )
 
-                    if response.background:
-                        await response.background()
+                    tools = metadata.get("tools", {})
 
-                await stream_body_handler(response)
+                    results = []
+                    for tool_call in response_tool_calls:
+                        print("\n\n" + str(tool_call) + "\n\n")
+                        tool_call_id = tool_call.get("id", "")
+                        tool_name = tool_call.get("function", {}).get("name", "")
+
+                        tool_function_params = {}
+                        try:
+                            # json.loads cannot be used because some models do not produce valid JSON
+                            tool_function_params = ast.literal_eval(
+                                tool_call.get("function", {}).get("arguments", "{}")
+                            )
+                        except Exception as e:
+                            log.debug(e)
 
-                MAX_RETRIES = 5
-                retries = 0
+                        tool_result = None
 
-                while (
-                    content_blocks[-1]["type"] == "code_interpreter"
-                    and retries < MAX_RETRIES
-                ):
-                    retries += 1
-                    log.debug(f"Attempt count: {retries}")
+                        if tool_name in tools:
+                            tool = tools[tool_name]
+                            spec = tool.get("spec", {})
 
-                    output = ""
-                    try:
-                        if content_blocks[-1]["attributes"].get("type") == "code":
-                            output = await event_caller(
-                                {
-                                    "type": "execute:python",
-                                    "data": {
-                                        "id": str(uuid4()),
-                                        "code": content_blocks[-1]["content"],
-                                    },
+                            try:
+                                required_params = spec.get("parameters", {}).get(
+                                    "required", []
+                                )
+                                tool_function = tool["callable"]
+                                tool_function_params = {
+                                    k: v
+                                    for k, v in tool_function_params.items()
+                                    if k in required_params
                                 }
-                            )
-                    except Exception as e:
-                        output = str(e)
+                                tool_result = await tool_function(
+                                    **tool_function_params
+                                )
+                            except Exception as e:
+                                tool_result = str(e)
+
+                        results.append(
+                            {
+                                "tool_call_id": tool_call_id,
+                                "content": tool_result,
+                            }
+                        )
+
+                    content_blocks[-1]["results"] = results
 
-                    content_blocks[-1]["output"] = output
                     content_blocks.append(
                         {
                             "type": "text",
@@ -1435,7 +1665,16 @@ async def process_chat_response(
                                         "content": serialize_content_blocks(
                                             content_blocks, raw=True
                                         ),
+                                        "tool_calls": response_tool_calls,
                                     },
+                                    *[
+                                        {
+                                            "role": "tool",
+                                            "tool_call_id": result["tool_call_id"],
+                                            "content": result["content"],
+                                        }
+                                        for result in results
+                                    ],
                                 ],
                             },
                             user,
@@ -1449,6 +1688,110 @@ async def process_chat_response(
                         log.debug(e)
                         break
 
+                if DETECT_CODE_INTERPRETER:
+                    MAX_RETRIES = 5
+                    retries = 0
+
+                    while (
+                        content_blocks[-1]["type"] == "code_interpreter"
+                        and retries < MAX_RETRIES
+                    ):
+                        retries += 1
+                        log.debug(f"Attempt count: {retries}")
+
+                        output = ""
+                        try:
+                            if content_blocks[-1]["attributes"].get("type") == "code":
+                                output = await event_caller(
+                                    {
+                                        "type": "execute:python",
+                                        "data": {
+                                            "id": str(uuid4()),
+                                            "code": content_blocks[-1]["content"],
+                                        },
+                                    }
+                                )
+
+                                if isinstance(output, dict):
+                                    stdout = output.get("stdout", "")
+
+                                    if stdout:
+                                        stdoutLines = stdout.split("\n")
+                                        for idx, line in enumerate(stdoutLines):
+                                            if "data:image/png;base64" in line:
+                                                id = str(uuid4())
+
+                                                # ensure the path exists
+                                                os.makedirs(
+                                                    os.path.join(CACHE_DIR, "images"),
+                                                    exist_ok=True,
+                                                )
+
+                                                image_path = os.path.join(
+                                                    CACHE_DIR,
+                                                    f"images/{id}.png",
+                                                )
+
+                                                with open(image_path, "wb") as f:
+                                                    f.write(
+                                                        base64.b64decode(
+                                                            line.split(",")[1]
+                                                        )
+                                                    )
+
+                                                stdoutLines[idx] = (
+                                                    f"![Output Image {idx}](/cache/images/{id}.png)"
+                                                )
+
+                                        output["stdout"] = "\n".join(stdoutLines)
+                        except Exception as e:
+                            output = str(e)
+
+                        content_blocks[-1]["output"] = output
+
+                        content_blocks.append(
+                            {
+                                "type": "text",
+                                "content": "",
+                            }
+                        )
+
+                        await event_emitter(
+                            {
+                                "type": "chat:completion",
+                                "data": {
+                                    "content": serialize_content_blocks(content_blocks),
+                                },
+                            }
+                        )
+
+                        try:
+                            res = await generate_chat_completion(
+                                request,
+                                {
+                                    "model": model_id,
+                                    "stream": True,
+                                    "messages": [
+                                        *form_data["messages"],
+                                        {
+                                            "role": "assistant",
+                                            "content": serialize_content_blocks(
+                                                content_blocks, raw=True
+                                            ),
+                                        },
+                                    ],
+                                },
+                                user,
+                            )
+
+                            if isinstance(res, StreamingResponse):
+                                await stream_body_handler(res)
+                            else:
+                                break
+                        except Exception as e:
+                            log.debug(e)
+                            break
+
                 title = Chats.get_chat_title_by_id(metadata["chat_id"])
                 data = {
                     "done": True,

+ 27 - 5
backend/open_webui/utils/misc.py

@@ -7,6 +7,18 @@ from pathlib import Path
 from typing import Callable, Optional
 
 
+import collections.abc
+
+
+def deep_update(d, u):
+    for k, v in u.items():
+        if isinstance(v, collections.abc.Mapping):
+            d[k] = deep_update(d.get(k, {}), v)
+        else:
+            d[k] = v
+    return d
+
+
 def get_message_list(messages, message_id):
     """
     Reconstructs a list of messages in order up to the specified message_id.
@@ -179,15 +191,25 @@ def openai_chat_message_template(model: str):
 
 
 def openai_chat_chunk_message_template(
-    model: str, message: Optional[str] = None, usage: Optional[dict] = None
+    model: str,
+    content: Optional[str] = None,
+    tool_calls: Optional[list[dict]] = None,
+    usage: Optional[dict] = None,
 ) -> dict:
     template = openai_chat_message_template(model)
     template["object"] = "chat.completion.chunk"
-    if message:
-        template["choices"][0]["delta"] = {"content": message}
-    else:
+
+    template["choices"][0]["index"] = 0
+    template["choices"][0]["delta"] = {}
+
+    if content:
+        template["choices"][0]["delta"]["content"] = content
+
+    if tool_calls:
+        template["choices"][0]["delta"]["tool_calls"] = tool_calls
+
+    if not content and not tool_calls:
         template["choices"][0]["finish_reason"] = "stop"
-        template["choices"][0]["delta"] = {}
 
     if usage:
         template["usage"] = usage

+ 19 - 4
backend/open_webui/utils/payload.py

@@ -1,4 +1,4 @@
-from open_webui.utils.task import prompt_variables_template
+from open_webui.utils.task import prompt_template, prompt_variables_template
 from open_webui.utils.misc import (
     add_or_update_system_message,
 )
@@ -8,16 +8,28 @@ from typing import Callable, Optional
 
 # inplace function: form_data is modified
 def apply_model_system_prompt_to_body(
-    params: dict, form_data: dict, metadata: Optional[dict] = None
+    params: dict, form_data: dict, metadata: Optional[dict] = None, user=None
 ) -> dict:
     system = params.get("system", None)
     if not system:
         return form_data
 
+    # Legacy (API Usage)
+    if user:
+        template_params = {
+            "user_name": user.name,
+            "user_location": user.info.get("location") if user.info else None,
+        }
+    else:
+        template_params = {}
+
+    system = prompt_template(system, **template_params)
+
+    # Metadata (WebUI Usage)
     if metadata:
-        print("apply_model_system_prompt_to_body: metadata", metadata)
         variables = metadata.get("variables", {})
-        system = prompt_variables_template(system, variables)
+        if variables:
+            system = prompt_variables_template(system, variables)
 
     form_data["messages"] = add_or_update_system_message(
         system, form_data.get("messages", [])
@@ -154,6 +166,9 @@ def convert_payload_openai_to_ollama(openai_payload: dict) -> dict:
     )
     ollama_payload["stream"] = openai_payload.get("stream", False)
 
+    if "tools" in openai_payload:
+        ollama_payload["tools"] = openai_payload["tools"]
+
     if "format" in openai_payload:
         ollama_payload["format"] = openai_payload["format"]
 

+ 19 - 1
backend/open_webui/utils/response.py

@@ -1,4 +1,5 @@
 import json
+from uuid import uuid4
 from open_webui.utils.misc import (
     openai_chat_chunk_message_template,
     openai_chat_completion_message_template,
@@ -60,6 +61,23 @@ async def convert_streaming_response_ollama_to_openai(ollama_streaming_response)
 
         model = data.get("model", "ollama")
         message_content = data.get("message", {}).get("content", "")
+        tool_calls = data.get("message", {}).get("tool_calls", None)
+        openai_tool_calls = None
+
+        if tool_calls:
+            openai_tool_calls = []
+            for tool_call in tool_calls:
+                openai_tool_call = {
+                    "index": tool_call.get("index", 0),
+                    "id": tool_call.get("id", f"call_{str(uuid4())}"),
+                    "type": "function",
+                    "function": {
+                        "name": tool_call.get("function", {}).get("name", ""),
+                        "arguments": f"{tool_call.get('function', {}).get('arguments', {})}",
+                    },
+                }
+                openai_tool_calls.append(openai_tool_call)
+
         done = data.get("done", False)
 
         usage = None
@@ -105,7 +123,7 @@ async def convert_streaming_response_ollama_to_openai(ollama_streaming_response)
             }
 
         data = openai_chat_chunk_message_template(
-            model, message_content if not done else None, usage
+            model, message_content if not done else None, openai_tool_calls, usage
         )
 
         line = f"data: {json.dumps(data)}\n\n"

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

@@ -61,6 +61,12 @@ def get_tools(
             )
 
         for spec in tools.specs:
+            # TODO: Fix hack for OpenAI API
+            # Some times breaks OpenAI but others don't. Leaving the comment
+            for val in spec.get("parameters", {}).get("properties", {}).values():
+                if val["type"] == "str":
+                    val["type"] = "string"
+
             # Remove internal parameters
             spec["parameters"]["properties"] = {
                 key: val
@@ -73,6 +79,13 @@ def get_tools(
             # convert to function that takes only model params and inserts custom params
             original_func = getattr(module, function_name)
             callable = apply_extra_params_to_tool_function(original_func, extra_params)
+
+            if callable.__doc__ and callable.__doc__.strip() != "":
+                s = re.split(":(param|return)", callable.__doc__, 1)
+                spec["description"] = s[0]
+            else:
+                spec["description"] = function_name
+
             # TODO: This needs to be a pydantic model
             tool_dict = {
                 "toolkit_id": tool_id,

+ 13 - 2
package-lock.json

@@ -1,12 +1,12 @@
 {
 	"name": "open-webui",
-	"version": "0.5.7",
+	"version": "0.5.10",
 	"lockfileVersion": 3,
 	"requires": true,
 	"packages": {
 		"": {
 			"name": "open-webui",
-			"version": "0.5.7",
+			"version": "0.5.10",
 			"dependencies": {
 				"@codemirror/lang-javascript": "^6.2.2",
 				"@codemirror/lang-python": "^6.1.6",
@@ -69,6 +69,7 @@
 				"@sveltejs/adapter-static": "^3.0.2",
 				"@sveltejs/kit": "^2.5.20",
 				"@sveltejs/vite-plugin-svelte": "^3.1.1",
+				"@tailwindcss/container-queries": "^0.1.1",
 				"@tailwindcss/typography": "^0.5.13",
 				"@typescript-eslint/eslint-plugin": "^6.17.0",
 				"@typescript-eslint/parser": "^6.17.0",
@@ -2343,6 +2344,16 @@
 				"tslib": "^2.4.0"
 			}
 		},
+		"node_modules/@tailwindcss/container-queries": {
+			"version": "0.1.1",
+			"resolved": "https://registry.npmjs.org/@tailwindcss/container-queries/-/container-queries-0.1.1.tgz",
+			"integrity": "sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==",
+			"dev": true,
+			"license": "MIT",
+			"peerDependencies": {
+				"tailwindcss": ">=3.2.0"
+			}
+		},
 		"node_modules/@tailwindcss/typography": {
 			"version": "0.5.13",
 			"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.13.tgz",

+ 2 - 1
package.json

@@ -1,6 +1,6 @@
 {
 	"name": "open-webui",
-	"version": "0.5.7",
+	"version": "0.5.10",
 	"private": true,
 	"scripts": {
 		"dev": "npm run pyodide:fetch && vite dev --host",
@@ -25,6 +25,7 @@
 		"@sveltejs/adapter-static": "^3.0.2",
 		"@sveltejs/kit": "^2.5.20",
 		"@sveltejs/vite-plugin-svelte": "^3.1.1",
+		"@tailwindcss/container-queries": "^0.1.1",
 		"@tailwindcss/typography": "^0.5.13",
 		"@typescript-eslint/eslint-plugin": "^6.17.0",
 		"@typescript-eslint/parser": "^6.17.0",

+ 4 - 1
scripts/prepare-pyodide.js

@@ -9,7 +9,10 @@ const packages = [
 	'scikit-learn',
 	'scipy',
 	'regex',
-	'seaborn'
+	'sympy',
+	'tiktoken',
+	'seaborn',
+	'pytz'
 ];
 
 import { loadPyodide } from 'pyodide';

+ 1 - 1
src/lib/apis/openai/index.ts

@@ -322,7 +322,7 @@ export const generateOpenAIChatCompletion = async (
 			return res.json();
 		})
 		.catch((err) => {
-			error = `${err?.detail ?? 'Network Problem'}`;
+			error = `${err?.detail ?? err}`;
 			return null;
 		});
 

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

@@ -25,7 +25,8 @@
 		'duckduckgo',
 		'tavily',
 		'jina',
-		'bing'
+		'bing',
+		'exa'
 	];
 
 	let youtubeLanguage = 'en';
@@ -261,6 +262,17 @@
 									bind:value={webConfig.search.jina_api_key}
 								/>
 							</div>
+						{:else if webConfig.search.engine === 'exa'}
+							<div>
+								<div class=" self-center text-xs font-medium mb-1">
+									{$i18n.t('Exa API Key')}
+								</div>
+
+								<SensitiveInput
+									placeholder={$i18n.t('Enter Exa API Key')}
+									bind:value={webConfig.search.exa_api_key}
+								/>
+							</div>
 						{:else if webConfig.search.engine === 'bing'}
 							<div>
 								<div class=" self-center text-xs font-medium mb-1">

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

@@ -61,7 +61,8 @@
 		},
 		features: {
 			web_search: true,
-			image_generation: true
+			image_generation: true,
+			code_interpreter: true
 		}
 	};
 

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

@@ -45,7 +45,8 @@
 		},
 		features: {
 			web_search: true,
-			image_generation: true
+			image_generation: true,
+			code_interpreter: true
 		}
 	};
 	export let userIds = [];

+ 10 - 1
src/lib/components/admin/Users/Groups/Permissions.svelte

@@ -22,7 +22,8 @@
 		},
 		features: {
 			web_search: true,
-			image_generation: true
+			image_generation: true,
+			code_interpreter: true
 		}
 	};
 
@@ -257,5 +258,13 @@
 
 			<Switch bind:state={permissions.features.image_generation} />
 		</div>
+
+		<div class="  flex w-full justify-between my-2 pr-2">
+			<div class=" self-center text-xs font-medium">
+				{$i18n.t('Code Interpreter')}
+			</div>
+
+			<Switch bind:state={permissions.features.code_interpreter} />
+		</div>
 	</div>
 </div>

+ 3 - 3
src/lib/components/channel/MessageInput.svelte

@@ -398,7 +398,7 @@
 						dir={$settings?.chatDirection ?? 'LTR'}
 					>
 						{#if files.length > 0}
-							<div class="mx-2 mt-2.5 flex flex-wrap gap-2">
+							<div class="mx-2 mt-2.5 -mb-1 flex flex-wrap gap-2">
 								{#each files as file, fileIdx}
 									{#if file.type === 'image'}
 										<div class=" relative group">
@@ -455,7 +455,7 @@
 
 						<div class="px-2.5">
 							<div
-								class="scrollbar-hidden font-primary text-left bg-transparent dark:text-gray-100 outline-none w-full pt-2.5 pb-1 px-1 rounded-xl resize-none h-fit max-h-80 overflow-auto"
+								class="scrollbar-hidden font-primary text-left bg-transparent dark:text-gray-100 outline-none w-full pt-3 px-1 rounded-xl resize-none h-fit max-h-80 overflow-auto"
 							>
 								<RichTextInput
 									bind:value={content}
@@ -504,7 +504,7 @@
 							</div>
 						</div>
 
-						<div class=" flex justify-between mb-2">
+						<div class=" flex justify-between mb-2.5 mt-1.5 mx-0.5">
 							<div class="ml-1 self-end flex space-x-1">
 								<InputMenu
 									{screenCaptureHandler}

+ 1 - 1
src/lib/components/channel/Messages/Message.svelte

@@ -156,7 +156,7 @@
 							class="mt-1.5 flex flex-shrink-0 items-center text-xs self-center invisible group-hover:visible text-gray-500 font-medium first-letter:capitalize"
 						>
 							<Tooltip content={dayjs(message.created_at / 1000000).format('LLLL')}>
-								{dayjs(message.created_at / 1000000).format('LT')}
+								{dayjs(message.created_at / 1000000).format('HH:mm')}
 							</Tooltip>
 						</div>
 					{/if}

+ 40 - 34
src/lib/components/chat/Chat.svelte

@@ -117,9 +117,8 @@
 
 	let selectedToolIds = [];
 	let imageGenerationEnabled = false;
-	let codeInterpreterEnabled = false;
 	let webSearchEnabled = false;
-
+	let codeInterpreterEnabled = false;
 	let chat = null;
 	let tags = [];
 
@@ -719,6 +718,7 @@
 		if ($page.url.searchParams.get('web-search') === 'true') {
 			webSearchEnabled = true;
 		}
+
 		if ($page.url.searchParams.get('image-generation') === 'true') {
 			imageGenerationEnabled = true;
 		}
@@ -1266,7 +1266,6 @@
 		}
 
 		prompt = '';
-		await tick();
 
 		// Reset chat input textarea
 		const chatInputElement = document.getElementById('chat-input');
@@ -1308,9 +1307,6 @@
 			history.messages[messages.at(-1).id].childrenIds.push(userMessageId);
 		}
 
-		// Wait until history/message have been updated
-		await tick();
-
 		// focus on chat input
 		const chatInput = document.getElementById('chat-input');
 		chatInput?.focus();
@@ -1321,26 +1317,15 @@
 	};
 
 	const sendPrompt = async (
-		history,
+		_history,
 		prompt: string,
 		parentId: string,
 		{ modelId = null, modelIdx = null, newChat = false } = {}
 	) => {
 		let _chatId = JSON.parse(JSON.stringify($chatId));
+		_history = JSON.parse(JSON.stringify(_history));
 
-		// Create new chat if newChat is true and first user message
-		if (
-			newChat &&
-			history.messages[history.currentId].parentId === null &&
-			history.messages[history.currentId].role === 'user'
-		) {
-			_chatId = await initChatHandler(history);
-		} else {
-			await saveChatHandler(_chatId, history);
-		}
-
-		await tick();
-
+		const responseMessageIds: Record<PropertyKey, string> = {};
 		// If modelId is provided, use it, else use selected model
 		let selectedModelIds = modelId
 			? [modelId]
@@ -1349,7 +1334,6 @@
 				: selectedModels;
 
 		// Create response messages for each selected model
-		const responseMessageIds: Record<PropertyKey, string> = {};
 		for (const [_modelIdx, modelId] of selectedModelIds.entries()) {
 			const model = $models.filter((m) => m.id === modelId).at(0);
 
@@ -1384,10 +1368,18 @@
 				responseMessageIds[`${modelId}-${modelIdx ? modelIdx : _modelIdx}`] = responseMessageId;
 			}
 		}
+		history = history;
+
+		// Create new chat if newChat is true and first user message
+		if (newChat && _history.messages[_history.currentId].parentId === null) {
+			_chatId = await initChatHandler(_history);
+		}
+
 		await tick();
 
+		_history = JSON.parse(JSON.stringify(history));
 		// Save chat after all messages have been created
-		await saveChatHandler(_chatId, history);
+		await saveChatHandler(_chatId, _history);
 
 		await Promise.all(
 			selectedModelIds.map(async (modelId, _modelIdx) => {
@@ -1395,7 +1387,7 @@
 				const model = $models.filter((m) => m.id === modelId).at(0);
 
 				if (model) {
-					const messages = createMessagesList(history, parentId);
+					const messages = createMessagesList(_history, parentId);
 					// If there are image files, check if model is vision capable
 					const hasImages = messages.some((message) =>
 						message.files?.some((file) => file.type === 'image')
@@ -1411,7 +1403,7 @@
 
 					let responseMessageId =
 						responseMessageIds[`${modelId}-${modelIdx ? modelIdx : _modelIdx}`];
-					let responseMessage = history.messages[responseMessageId];
+					let responseMessage = _history.messages[responseMessageId];
 
 					let userContext = null;
 					if ($settings?.memory ?? false) {
@@ -1440,7 +1432,7 @@
 					const chatEventEmitter = await getChatEventEmitter(model.id, _chatId);
 
 					scrollToBottom();
-					await sendPromptSocket(history, model, responseMessageId, _chatId);
+					await sendPromptSocket(_history, model, responseMessageId, _chatId);
 
 					if (chatEventEmitter) clearInterval(chatEventEmitter);
 				} else {
@@ -1453,9 +1445,9 @@
 		chats.set(await getChatList(localStorage.token, $currentChatPage));
 	};
 
-	const sendPromptSocket = async (history, model, responseMessageId, _chatId) => {
-		const responseMessage = history.messages[responseMessageId];
-		const userMessage = history.messages[responseMessage.parentId];
+	const sendPromptSocket = async (_history, model, responseMessageId, _chatId) => {
+		const responseMessage = _history.messages[responseMessageId];
+		const userMessage = _history.messages[responseMessage.parentId];
 
 		let files = JSON.parse(JSON.stringify(chatFiles));
 		files.push(
@@ -1503,7 +1495,7 @@
 						}`
 					}
 				: undefined,
-			...createMessagesList(history, responseMessageId).map((message) => ({
+			...createMessagesList(_history, responseMessageId).map((message) => ({
 				...message,
 				content: removeDetails(message.content, ['reasoning', 'code_interpreter'])
 			}))
@@ -1558,9 +1550,20 @@
 				tool_ids: selectedToolIds.length > 0 ? selectedToolIds : undefined,
 
 				features: {
-					image_generation: imageGenerationEnabled,
-					code_interpreter: codeInterpreterEnabled,
-					web_search: webSearchEnabled
+					image_generation:
+						$config?.features?.enable_image_generation &&
+						($user.role === 'admin' || $user?.permissions?.features?.image_generation)
+							? imageGenerationEnabled
+							: false,
+					code_interpreter:
+						$user.role === 'admin' || $user?.permissions?.features?.code_interpreter
+							? codeInterpreterEnabled
+							: false,
+					web_search:
+						$config?.features?.enable_web_search &&
+						($user.role === 'admin' || $user?.permissions?.features?.web_search)
+							? webSearchEnabled || ($settings?.webSearch ?? false) === 'always'
+							: false
 				},
 				variables: {
 					...getPromptVariables(
@@ -1597,12 +1600,15 @@
 			},
 			`${WEBUI_BASE_URL}/api`
 		).catch((error) => {
-			console.log(error);
+			toast.error(`${error}`);
+
 			responseMessage.error = {
 				content: error
 			};
 			responseMessage.done = true;
+
 			history.messages[responseMessageId] = responseMessage;
+			history.currentId = responseMessageId;
 			return null;
 		});
 
@@ -1934,7 +1940,7 @@
 					</div>
 				{/if}
 
-				<div class="flex flex-col flex-auto z-10 w-full">
+				<div class="flex flex-col flex-auto z-10 w-full @container">
 					{#if $settings?.landingPageMode === 'chat' || createMessagesList(history, history.currentId).length > 0}
 						<div
 							class=" pb-2.5 flex flex-col justify-between w-full flex-auto overflow-auto h-0 max-w-full z-10 scrollbar-hidden"

+ 87 - 65
src/lib/components/chat/MessageInput.svelte

@@ -390,7 +390,7 @@
 				</div>
 
 				<div class="w-full relative">
-					{#if atSelectedModel !== undefined || selectedToolIds.length > 0 || imageGenerationEnabled || codeInterpreterEnabled}
+					{#if atSelectedModel !== undefined || selectedToolIds.length > 0 || webSearchEnabled || ($settings?.webSearch ?? false) === 'always' || imageGenerationEnabled || codeInterpreterEnabled}
 						<div
 							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"
 						>
@@ -426,6 +426,22 @@
 								</div>
 							{/if}
 
+							{#if webSearchEnabled || ($settings?.webSearch ?? false) === 'always'}
+								<div class="flex items-center justify-between w-full">
+									<div class="flex items-center gap-2.5 text-sm dark:text-gray-500">
+										<div class="pl-1">
+											<span class="relative flex size-2">
+												<span
+													class="animate-ping absolute inline-flex h-full w-full rounded-full bg-blue-400 opacity-75"
+												/>
+												<span class="relative inline-flex rounded-full size-2 bg-blue-500" />
+											</span>
+										</div>
+										<div class=" translate-y-[0.5px]">{$i18n.t('Search the internet')}</div>
+									</div>
+								</div>
+							{/if}
+
 							{#if imageGenerationEnabled}
 								<div class="flex items-center justify-between w-full">
 									<div class="flex items-center gap-2.5 text-sm dark:text-gray-500">
@@ -437,7 +453,7 @@
 												<span class="relative inline-flex rounded-full size-2 bg-teal-500" />
 											</span>
 										</div>
-										<div class=" translate-y-[0.5px]">{$i18n.t('Image generation')}</div>
+										<div class=" translate-y-[0.5px]">{$i18n.t('Generate an image')}</div>
 									</div>
 								</div>
 							{/if}
@@ -448,12 +464,12 @@
 										<div class="pl-1">
 											<span class="relative flex size-2">
 												<span
-													class="animate-ping absolute inline-flex h-full w-full rounded-full bg-blue-400 opacity-75"
+													class="animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75"
 												/>
-												<span class="relative inline-flex rounded-full size-2 bg-blue-500" />
+												<span class="relative inline-flex rounded-full size-2 bg-green-500" />
 											</span>
 										</div>
-										<div class=" translate-y-[0.5px]">{$i18n.t('Code interpreter')}</div>
+										<div class=" translate-y-[0.5px]">{$i18n.t('Execute code for analysis')}</div>
 									</div>
 								</div>
 							{/if}
@@ -573,7 +589,7 @@
 								dir={$settings?.chatDirection ?? 'LTR'}
 							>
 								{#if files.length > 0}
-									<div class="mx-2 mt-2.5 flex items-center flex-wrap gap-2">
+									<div class="mx-2 mt-2.5 -mb-1 flex items-center flex-wrap gap-2">
 										{#each files as file, fileIdx}
 											{#if file.type === 'image'}
 												<div class=" relative group">
@@ -664,7 +680,7 @@
 								<div class="px-2.5">
 									{#if $settings?.richTextInput ?? true}
 										<div
-											class="scrollbar-hidden text-left bg-transparent dark:text-gray-100 outline-none w-full pt-2.5 pb-1 px-1 rounded-xl resize-none h-fit max-h-80 overflow-auto"
+											class="scrollbar-hidden text-left bg-transparent dark:text-gray-100 outline-none w-full pt-3 px-1 resize-none h-fit max-h-80 overflow-auto"
 										>
 											<RichTextInput
 												bind:this={chatInputElement}
@@ -868,7 +884,7 @@
 										<textarea
 											id="chat-input"
 											bind:this={chatInputElement}
-											class="scrollbar-hidden bg-transparent dark:text-gray-100 outline-none w-full pt-3 pb-1 px-1 rounded-xl resize-none"
+											class="scrollbar-hidden bg-transparent dark:text-gray-100 outline-none w-full pt-3 px-1 resize-none"
 											placeholder={placeholder ? placeholder : $i18n.t('Send a Message')}
 											bind:value={prompt}
 											on:keypress={(e) => {
@@ -1059,8 +1075,8 @@
 									{/if}
 								</div>
 
-								<div class=" flex justify-between mb-2">
-									<div class="ml-1 self-end gap-0.5 flex items-center">
+								<div class=" flex justify-between mt-1.5 mb-2.5 mx-0.5 max-w-full">
+									<div class="ml-1 self-end gap-0.5 flex items-center flex-1 max-w-[80%]">
 										<InputMenu
 											bind:selectedToolIds
 											{screenCaptureHandler}
@@ -1113,64 +1129,69 @@
 											</button>
 										</InputMenu>
 
-										{#if $_user}
-											{#if $config?.features?.enable_web_search && ($_user.role === 'admin' || $_user?.permissions?.features?.web_search)}
-												<Tooltip content={$i18n.t('Search the internet')} placement="top">
-													<button
-														on:click|preventDefault={() => (webSearchEnabled = !webSearchEnabled)}
-														type="button"
-														class="px-1.5 sm:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-none max-w-full overflow-hidden {webSearchEnabled
-															? 'bg-blue-100 dark:bg-blue-500/20 text-blue-500 dark:text-blue-400'
-															: 'bg-transparent text-gray-600 dark:text-gray-400 border-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800'}"
-													>
-														<GlobeAlt className="size-5" strokeWidth="1.75" />
-														<span
-															class="hidden sm:block whitespace-nowrap overflow-hidden text-ellipsis translate-y-[0.5px] mr-0.5"
-															>{$i18n.t('Web Search')}</span
+										<div class="flex gap-0.5 items-center overflow-x-auto scrollbar-none flex-1">
+											{#if $_user}
+												{#if $config?.features?.enable_web_search && ($_user.role === 'admin' || $_user?.permissions?.features?.web_search)}
+													<Tooltip content={$i18n.t('Search the internet')} placement="top">
+														<button
+															on:click|preventDefault={() => (webSearchEnabled = !webSearchEnabled)}
+															type="button"
+															class="px-1.5 @sm:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-none max-w-full overflow-hidden {webSearchEnabled ||
+															($settings?.webSearch ?? false) === 'always'
+																? 'bg-blue-100 dark:bg-blue-500/20 text-blue-500 dark:text-blue-400'
+																: 'bg-transparent text-gray-600 dark:text-gray-400 border-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800'}"
 														>
-													</button>
-												</Tooltip>
-											{/if}
+															<GlobeAlt className="size-5" strokeWidth="1.75" />
+															<span
+																class="hidden @sm:block whitespace-nowrap overflow-hidden text-ellipsis translate-y-[0.5px] mr-0.5"
+																>{$i18n.t('Web Search')}</span
+															>
+														</button>
+													</Tooltip>
+												{/if}
 
-											{#if $config?.features?.enable_image_generation && ($_user.role === 'admin' || $_user?.permissions?.features?.image_generation)}
-												<Tooltip content={$i18n.t('Generate an image')} placement="top">
-													<button
-														on:click|preventDefault={() =>
-															(imageGenerationEnabled = !imageGenerationEnabled)}
-														type="button"
-														class="px-1.5 sm:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-none max-w-full overflow-hidden {imageGenerationEnabled
-															? 'bg-gray-100 dark:bg-gray-500/20 text-gray-600 dark:text-gray-400'
-															: 'bg-transparent text-gray-600 dark:text-gray-300 border-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 '}"
-													>
-														<Photo className="size-5" strokeWidth="1.75" />
-														<span
-															class="hidden sm:block whitespace-nowrap overflow-hidden text-ellipsis translate-y-[0.5px] mr-0.5"
-															>{$i18n.t('Image')}</span
+												{#if $config?.features?.enable_image_generation && ($_user.role === 'admin' || $_user?.permissions?.features?.image_generation)}
+													<Tooltip content={$i18n.t('Generate an image')} placement="top">
+														<button
+															on:click|preventDefault={() =>
+																(imageGenerationEnabled = !imageGenerationEnabled)}
+															type="button"
+															class="px-1.5 @sm:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-none max-w-full overflow-hidden {imageGenerationEnabled
+																? 'bg-gray-100 dark:bg-gray-500/20 text-gray-600 dark:text-gray-400'
+																: 'bg-transparent text-gray-600 dark:text-gray-300 border-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 '}"
 														>
-													</button>
-												</Tooltip>
-											{/if}
+															<Photo className="size-5" strokeWidth="1.75" />
+															<span
+																class="hidden @sm:block whitespace-nowrap overflow-hidden text-ellipsis translate-y-[0.5px] mr-0.5"
+																>{$i18n.t('Image')}</span
+															>
+														</button>
+													</Tooltip>
+												{/if}
 
-											<Tooltip content={$i18n.t('Executes code for analysis')} placement="top">
-												<button
-													on:click|preventDefault={() =>
-														(codeInterpreterEnabled = !codeInterpreterEnabled)}
-													type="button"
-													class="px-1.5 sm:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-none max-w-full overflow-hidden {codeInterpreterEnabled
-														? 'bg-gray-100 dark:bg-gray-500/20 text-gray-600 dark:text-gray-400'
-														: 'bg-transparent text-gray-600 dark:text-gray-300 border-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 '}"
-												>
-													<CommandLine className="size-5" strokeWidth="1.75" />
-													<span
-														class="hidden sm:block whitespace-nowrap overflow-hidden text-ellipsis translate-y-[0.5px] mr-0.5"
-														>{$i18n.t('Code Intepreter')}</span
-													>
-												</button>
-											</Tooltip>
-										{/if}
+												{#if $_user.role === 'admin' || $_user?.permissions?.features?.code_interpreter}
+													<Tooltip content={$i18n.t('Execute code for analysis')} placement="top">
+														<button
+															on:click|preventDefault={() =>
+																(codeInterpreterEnabled = !codeInterpreterEnabled)}
+															type="button"
+															class="px-1.5 @sm:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-none max-w-full overflow-hidden {codeInterpreterEnabled
+																? 'bg-gray-100 dark:bg-gray-500/20 text-gray-600 dark:text-gray-400'
+																: 'bg-transparent text-gray-600 dark:text-gray-300 border-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 '}"
+														>
+															<CommandLine className="size-5" strokeWidth="1.75" />
+															<span
+																class="hidden @sm:block whitespace-nowrap overflow-hidden text-ellipsis translate-y-[0.5px] mr-0.5"
+																>{$i18n.t('Code Interpreter')}</span
+															>
+														</button>
+													</Tooltip>
+												{/if}
+											{/if}
+										</div>
 									</div>
 
-									<div class="self-end flex space-x-1 mr-1">
+									<div class="self-end flex space-x-1 mr-1 flex-shrink-0">
 										{#if !history?.currentId || history.messages[history.currentId]?.done == true}
 											<Tooltip content={$i18n.t('Record voice')}>
 												<button
@@ -1225,7 +1246,8 @@
 												<div class=" flex items-center">
 													<Tooltip content={$i18n.t('Call')}>
 														<button
-															class=" {webSearchEnabled
+															class=" {webSearchEnabled ||
+															($settings?.webSearch ?? false) === 'always'
 																? 'bg-blue-500 text-white hover:bg-blue-400 '
 																: 'bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-100'} transition rounded-full p-1.5 self-center"
 															type="button"
@@ -1280,7 +1302,7 @@
 														<button
 															id="send-message-button"
 															class="{prompt !== ''
-																? webSearchEnabled
+																? webSearchEnabled || ($settings?.webSearch ?? false) === 'always'
 																	? 'bg-blue-500 text-white hover:bg-blue-400 '
 																	: '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"
@@ -1316,7 +1338,7 @@
 															xmlns="http://www.w3.org/2000/svg"
 															viewBox="0 0 24 24"
 															fill="currentColor"
-															class="size-6"
+															class="size-5"
 														>
 															<path
 																fill-rule="evenodd"

+ 45 - 84
src/lib/components/chat/Messages/CodeBlock.svelte

@@ -50,6 +50,7 @@
 	let stdout = null;
 	let stderr = null;
 	let result = null;
+	let files = null;
 
 	let copied = false;
 	let saved = false;
@@ -110,86 +111,7 @@
 	};
 
 	const executePython = async (code) => {
-		if (!code.includes('input') && !code.includes('matplotlib')) {
-			executePythonAsWorker(code);
-		} else {
-			result = null;
-			stdout = null;
-			stderr = null;
-
-			executing = true;
-
-			document.pyodideMplTarget = document.getElementById(`plt-canvas-${id}`);
-
-			let pyodide = await loadPyodide({
-				indexURL: '/pyodide/',
-				stdout: (text) => {
-					console.log('Python output:', text);
-
-					if (stdout) {
-						stdout += `${text}\n`;
-					} else {
-						stdout = `${text}\n`;
-					}
-				},
-				stderr: (text) => {
-					console.log('An error occurred:', text);
-					if (stderr) {
-						stderr += `${text}\n`;
-					} else {
-						stderr = `${text}\n`;
-					}
-				},
-				packages: ['micropip']
-			});
-
-			try {
-				const micropip = pyodide.pyimport('micropip');
-
-				// await micropip.set_index_urls('https://pypi.org/pypi/{package_name}/json');
-
-				let packages = [
-					code.includes('requests') ? 'requests' : null,
-					code.includes('bs4') ? 'beautifulsoup4' : null,
-					code.includes('numpy') ? 'numpy' : null,
-					code.includes('pandas') ? 'pandas' : null,
-					code.includes('matplotlib') ? 'matplotlib' : null,
-					code.includes('sklearn') ? 'scikit-learn' : null,
-					code.includes('scipy') ? 'scipy' : null,
-					code.includes('re') ? 'regex' : null,
-					code.includes('seaborn') ? 'seaborn' : null
-				].filter(Boolean);
-
-				console.log(packages);
-				await micropip.install(packages);
-
-				result = await pyodide.runPythonAsync(`from js import prompt
-def input(p):
-    return prompt(p)
-__builtins__.input = input`);
-
-				result = await pyodide.runPython(code);
-
-				if (!result) {
-					result = '[NO OUTPUT]';
-				}
-
-				console.log(result);
-				console.log(stdout);
-				console.log(stderr);
-
-				const pltCanvasElement = document.getElementById(`plt-canvas-${id}`);
-
-				if (pltCanvasElement?.innerHTML !== '') {
-					pltCanvasElement.classList.add('pt-4');
-				}
-			} catch (error) {
-				console.error('Error:', error);
-				stderr = error;
-			}
-
-			executing = false;
-		}
+		executePythonAsWorker(code);
 	};
 
 	const executePythonAsWorker = async (code) => {
@@ -207,7 +129,11 @@ __builtins__.input = input`);
 			code.includes('sklearn') ? 'scikit-learn' : null,
 			code.includes('scipy') ? 'scipy' : null,
 			code.includes('re') ? 'regex' : null,
-			code.includes('seaborn') ? 'seaborn' : null
+			code.includes('seaborn') ? 'seaborn' : null,
+			code.includes('sympy') ? 'sympy' : null,
+			code.includes('tiktoken') ? 'tiktoken' : null,
+			code.includes('matplotlib') ? 'matplotlib' : null,
+			code.includes('pytz') ? 'pytz' : null
 		].filter(Boolean);
 
 		console.log(packages);
@@ -234,7 +160,31 @@ __builtins__.input = input`);
 
 			console.log(id, data);
 
-			data['stdout'] && (stdout = data['stdout']);
+			if (data['stdout']) {
+				stdout = data['stdout'];
+				const stdoutLines = stdout.split('\n');
+
+				for (const [idx, line] of stdoutLines.entries()) {
+					if (line.startsWith('data:image/png;base64')) {
+						if (files) {
+							files.push({
+								type: 'image/png',
+								data: line
+							});
+						} else {
+							files = [
+								{
+									type: 'image/png',
+									data: line
+								}
+							];
+						}
+
+						stdout = stdout.replace(`${line}\n`, ``);
+					}
+				}
+			}
+
 			data['stderr'] && (stderr = data['stderr']);
 			data['result'] && (result = data['result']);
 
@@ -426,10 +376,21 @@ __builtins__.input = input`);
 								<div class="text-sm">{stdout || stderr}</div>
 							</div>
 						{/if}
-						{#if result}
+						{#if result || files}
 							<div class=" ">
 								<div class=" text-gray-500 text-xs mb-1">RESULT</div>
-								<div class="text-sm">{`${JSON.stringify(result)}`}</div>
+								{#if result}
+									<div class="text-sm">{`${JSON.stringify(result)}`}</div>
+								{/if}
+								{#if files}
+									<div class="flex flex-col gap-2">
+										{#each files as file}
+											{#if file.type.startsWith('image')}
+												<img src={file.data} alt="Output" />
+											{/if}
+										{/each}
+									</div>
+								{/if}
 							</div>
 						{/if}
 					{/if}

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

@@ -96,6 +96,7 @@
 				{rateMessage}
 				{actionMessage}
 				{submitMessage}
+				{deleteMessage}
 				{continueResponse}
 				{regenerateResponse}
 				{mergeResponses}

+ 3 - 0
src/lib/components/chat/Messages/MultiResponseMessages.svelte

@@ -34,6 +34,8 @@
 	export let actionMessage: Function;
 
 	export let submitMessage: Function;
+	export let deleteMessage: Function;
+
 	export let continueResponse: Function;
 	export let regenerateResponse: Function;
 	export let mergeResponses: Function;
@@ -228,6 +230,7 @@
 									{editMessage}
 									{saveMessage}
 									{rateMessage}
+									{deleteMessage}
 									{actionMessage}
 									{submitMessage}
 									{continueResponse}

+ 6 - 9
src/lib/components/chat/Placeholder.svelte

@@ -88,7 +88,7 @@
 	onMount(() => {});
 </script>
 
-<div class="m-auto w-full max-w-6xl px-2 xl:px-20 translate-y-6 py-24 text-center">
+<div class="m-auto w-full max-w-6xl px-2 @2xl:px-20 translate-y-6 py-24 text-center">
 	{#if $temporaryChatEnabled}
 		<Tooltip
 			content="This chat won't appear in history and your messages will not be saved."
@@ -105,7 +105,7 @@
 		class="w-full text-3xl text-gray-800 dark:text-gray-100 font-medium text-center flex items-center gap-4 font-primary"
 	>
 		<div class="w-full flex flex-col justify-center items-center">
-			<div class="flex flex-row justify-center gap-3 sm:gap-3.5 w-fit px-5">
+			<div class="flex flex-row justify-center gap-3 @sm:gap-3.5 w-fit px-5">
 				<div class="flex flex-shrink-0 justify-center">
 					<div class="flex -space-x-4 mb-0.5" in:fade={{ duration: 100 }}>
 						{#each models as model, modelIdx}
@@ -126,7 +126,7 @@
 											($i18n.language === 'dg-DG'
 												? `/doge.png`
 												: `${WEBUI_BASE_URL}/static/favicon.png`)}
-										class=" size-9 sm:size-10 rounded-full border-[1px] border-gray-200 dark:border-none"
+										class=" size-9 @sm:size-10 rounded-full border-[1px] border-gray-200 dark:border-none"
 										alt="logo"
 										draggable="false"
 									/>
@@ -136,7 +136,7 @@
 					</div>
 				</div>
 
-				<div class=" text-3xl sm:text-4xl line-clamp-1" in:fade={{ duration: 100 }}>
+				<div class=" text-3xl @sm:text-4xl line-clamp-1" in:fade={{ duration: 100 }}>
 					{#if models[selectedModelIdx]?.name}
 						{models[selectedModelIdx]?.name}
 					{:else}
@@ -184,11 +184,7 @@
 				</div>
 			</div>
 
-			<div
-				class="text-base font-normal xl:translate-x-6 md:max-w-3xl w-full py-3 {atSelectedModel
-					? 'mt-2'
-					: ''}"
-			>
+			<div class="text-base font-normal @md:max-w-3xl w-full py-3 {atSelectedModel ? 'mt-2' : ''}">
 				<MessageInput
 					{history}
 					{selectedModels}
@@ -220,6 +216,7 @@
 				suggestionPrompts={models[selectedModelIdx]?.info?.meta?.suggestion_prompts ??
 					$config?.default_prompt_suggestions ??
 					[]}
+				inputValue={prompt}
 				on:select={(e) => {
 					selectSuggestionPrompt(e.detail);
 				}}

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

@@ -12,6 +12,7 @@
 	export let params = {
 		// Advanced
 		stream_response: null, // Set stream responses for this model individually
+		function_calling: null,
 		seed: null,
 		stop: null,
 		temperature: null,
@@ -81,6 +82,35 @@
 		</Tooltip>
 	</div>
 
+	<div>
+		<Tooltip
+			content={$i18n.t(
+				'Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.'
+			)}
+			placement="top-start"
+			className="inline-tooltip"
+		>
+			<div class=" py-0.5 flex w-full justify-between">
+				<div class=" self-center text-xs font-medium">
+					{$i18n.t('Function Calling')}
+				</div>
+				<button
+					class="p-1 px-3 text-xs flex rounded transition"
+					on:click={() => {
+						params.function_calling = (params?.function_calling ?? null) === null ? 'native' : null;
+					}}
+					type="button"
+				>
+					{#if params.function_calling === 'native'}
+						<span class="ml-2 self-center">{$i18n.t('Native')}</span>
+					{:else}
+						<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+					{/if}
+				</button>
+			</div>
+		</Tooltip>
+	</div>
+
 	<div class=" py-0.5 w-full justify-between">
 		<Tooltip
 			content={$i18n.t(

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

@@ -46,6 +46,7 @@
 	let params = {
 		// Advanced
 		stream_response: null,
+		function_calling: null,
 		seed: null,
 		temperature: null,
 		frequency_penalty: null,

+ 28 - 0
src/lib/components/chat/Settings/Interface.svelte

@@ -52,6 +52,8 @@
 	let voiceInterruption = false;
 	let hapticFeedback = false;
 
+	let webSearch = null;
+
 	const toggleSplitLargeChunks = async () => {
 		splitLargeChunks = !splitLargeChunks;
 		saveSettings({ splitLargeChunks: splitLargeChunks });
@@ -198,6 +200,11 @@
 		});
 	};
 
+	const toggleWebSearch = async () => {
+		webSearch = webSearch === null ? 'always' : null;
+		saveSettings({ webSearch: webSearch });
+	};
+
 	onMount(async () => {
 		titleAutoGenerate = $settings?.title?.auto ?? true;
 		autoTags = $settings.autoTags ?? true;
@@ -235,6 +242,7 @@
 		}
 
 		backgroundImageUrl = $settings.backgroundImageUrl ?? null;
+		webSearch = $settings.webSearch ?? null;
 	});
 </script>
 
@@ -666,6 +674,26 @@
 				</div>
 			</div>
 
+			<div>
+				<div class=" py-0.5 flex w-full justify-between">
+					<div class=" self-center text-xs">{$i18n.t('Web Search in Chat')}</div>
+
+					<button
+						class="p-1 px-3 text-xs flex rounded transition"
+						on:click={() => {
+							toggleWebSearch();
+						}}
+						type="button"
+					>
+						{#if webSearch === 'always'}
+							<span class="ml-2 self-center">{$i18n.t('Always')}</span>
+						{:else}
+							<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+						{/if}
+					</button>
+				</div>
+			</div>
+
 			<div class=" my-1.5 text-sm font-medium">{$i18n.t('Voice')}</div>
 
 			<div>

+ 2 - 1
src/lib/components/chat/SettingsModal.svelte

@@ -118,7 +118,8 @@
 				'displayemoji',
 				'save',
 				'interfaceoptions',
-				'interfacecustomization'
+				'interfacecustomization',
+				'alwaysonwebsearch'
 			]
 		},
 		{

+ 114 - 36
src/lib/components/chat/Suggestions.svelte

@@ -1,53 +1,131 @@
 <script lang="ts">
+	import Fuse from 'fuse.js';
 	import Bolt from '$lib/components/icons/Bolt.svelte';
 	import { onMount, getContext, createEventDispatcher } from 'svelte';
+	import { WEBUI_NAME } from '$lib/stores';
+	import { WEBUI_VERSION } from '$lib/constants';
 
 	const i18n = getContext('i18n');
 	const dispatch = createEventDispatcher();
 
 	export let suggestionPrompts = [];
 	export let className = '';
+	export let inputValue = '';
 
-	let prompts = [];
+	let sortedPrompts = [];
 
-	$: prompts = (suggestionPrompts ?? [])
-		.reduce((acc, current) => [...acc, ...[current]], [])
-		.sort(() => Math.random() - 0.5);
+	const fuseOptions = {
+		keys: ['content', 'title'],
+		threshold: 0.5
+	};
+
+	let fuse;
+	let filteredPrompts = [];
+
+	// Initialize Fuse
+	$: fuse = new Fuse(sortedPrompts, fuseOptions);
+
+	// Update the filteredPrompts if inputValue changes
+	// Only increase version if something wirklich geändert hat
+	$: getFilteredPrompts(inputValue);
+
+	// Helper function to check if arrays are the same
+	// (based on unique IDs oder content)
+	function arraysEqual(a, b) {
+		if (a.length !== b.length) return false;
+		for (let i = 0; i < a.length; i++) {
+			if ((a[i].id ?? a[i].content) !== (b[i].id ?? b[i].content)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	const getFilteredPrompts = (inputValue) => {
+		const newFilteredPrompts = inputValue.trim()
+			? fuse.search(inputValue.trim()).map((result) => result.item)
+			: sortedPrompts;
+
+		// Compare with the oldFilteredPrompts
+		// If there's a difference, update array + version
+		if (!arraysEqual(filteredPrompts, newFilteredPrompts)) {
+			filteredPrompts = newFilteredPrompts;
+		}
+	};
+
+	$: if (suggestionPrompts) {
+		sortedPrompts = [...(suggestionPrompts ?? [])].sort(() => Math.random() - 0.5);
+		getFilteredPrompts(inputValue);
+	}
 </script>
 
-{#if prompts.length > 0}
-	<div class="mb-1 flex gap-1 text-sm font-medium items-center text-gray-400 dark:text-gray-600">
+<div class="mb-1 flex gap-1 text-xs font-medium items-center text-gray-400 dark:text-gray-600">
+	{#if filteredPrompts.length > 0}
 		<Bolt />
 		{$i18n.t('Suggested')}
-	</div>
-{/if}
-
-<div class=" h-40 max-h-full overflow-auto scrollbar-none {className}">
-	{#each prompts as prompt, promptIdx}
-		<button
-			class="flex flex-col flex-1 shrink-0 w-full justify-between px-3 py-2 rounded-xl bg-transparent hover:bg-black/5 dark:hover:bg-white/5 transition group"
-			on:click={() => {
-				dispatch('select', prompt.content);
-			}}
+	{:else}
+		<!-- Keine Vorschläge -->
+
+		<div
+			class="flex w-full text-center items-center justify-center self-start text-gray-400 dark:text-gray-600"
 		>
-			<div class="flex flex-col text-left">
-				{#if prompt.title && prompt.title[0] !== ''}
-					<div
-						class="  font-medium dark:text-gray-300 dark:group-hover:text-gray-200 transition line-clamp-1"
-					>
-						{prompt.title[0]}
-					</div>
-					<div class="text-xs text-gray-500 font-normal line-clamp-1">{prompt.title[1]}</div>
-				{:else}
-					<div
-						class="  font-medium dark:text-gray-300 dark:group-hover:text-gray-200 transition line-clamp-1"
-					>
-						{prompt.content}
-					</div>
-
-					<div class="text-xs text-gray-500 font-normal line-clamp-1">Prompt</div>
-				{/if}
-			</div>
-		</button>
-	{/each}
+			{$WEBUI_NAME} ‧ v{WEBUI_VERSION}
+		</div>
+	{/if}
+</div>
+
+<div class="h-40 overflow-auto scrollbar-none {className} items-start">
+	{#if filteredPrompts.length > 0}
+		{#each filteredPrompts as prompt, idx (prompt.id || prompt.content)}
+			<button
+				class="waterfall flex flex-col flex-1 shrink-0 w-full justify-between
+				       px-3 py-2 rounded-xl bg-transparent hover:bg-black/5
+				       dark:hover:bg-white/5 transition group"
+				style="animation-delay: {idx * 60}ms"
+				on:click={() => dispatch('select', prompt.content)}
+			>
+				<div class="flex flex-col text-left">
+					{#if prompt.title && prompt.title[0] !== ''}
+						<div
+							class="font-medium dark:text-gray-300 dark:group-hover:text-gray-200 transition line-clamp-1"
+						>
+							{prompt.title[0]}
+						</div>
+						<div class="text-xs text-gray-500 font-normal line-clamp-1">
+							{prompt.title[1]}
+						</div>
+					{:else}
+						<div
+							class="font-medium dark:text-gray-300 dark:group-hover:text-gray-200 transition line-clamp-1"
+						>
+							{prompt.content}
+						</div>
+						<div class="text-xs text-gray-500 font-normal line-clamp-1">{$i18n.t('Prompt')}</div>
+					{/if}
+				</div>
+			</button>
+		{/each}
+	{/if}
 </div>
+
+<style>
+	/* Waterfall animation for the suggestions */
+	@keyframes fadeInUp {
+		0% {
+			opacity: 0;
+			transform: translateY(20px);
+		}
+		100% {
+			opacity: 1;
+			transform: translateY(0);
+		}
+	}
+
+	.waterfall {
+		opacity: 0;
+		animation-name: fadeInUp;
+		animation-duration: 200ms;
+		animation-fill-mode: forwards;
+		animation-timing-function: ease;
+	}
+</style>

+ 10 - 4
src/lib/i18n/locales/ar-BH/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "هل تملك حساب ؟",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "مساعد",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "أغلق",
 	"Code execution": "",
 	"Code formatted successfully": "",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "مجموعة",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "الإفتراضي",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "(SentenceTransformers) الإفتراضي",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "النموذج الافتراضي",
 	"Default model updated": "الإفتراضي تحديث الموديل",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "أدخل الChunk Overlap",
 	"Enter Chunk Size": "أدخل Chunk الحجم",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "أدخل عنوان URL ل Github Raw",
 	"Enter Google PSE API Key": "أدخل مفتاح واجهة برمجة تطبيقات PSE من Google",
 	"Enter Google PSE Engine Id": "أدخل معرف محرك PSE من Google",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "تجريبي",
 	"Explore the cosmos": "",
 	"Export": "تصدير",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "عقوبة التردد",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "",
 	"Function deleted successfully": "",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "توليد الصور (تجريبي)",
 	"Image Generation Engine": "محرك توليد الصور",
@@ -627,6 +630,7 @@
 	"More": "المزيد",
 	"Name": "الأسم",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "دردشة جديدة",
 	"New Folder": "",
 	"New Password": "كلمة المرور الجديدة",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "أخر 30 يوم",
 	"Previous 7 days": "أخر 7 أيام",
 	"Profile Image": "صورة الملف الشخصي",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "موجه (على سبيل المثال: أخبرني بحقيقة ممتعة عن الإمبراطورية الرومانية)",
 	"Prompt Content": "محتوى عاجل",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Web تحميل اعدادات",
 	"Web Search": "بحث الويب",
 	"Web Search Engine": "محرك بحث الويب",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook الرابط",
 	"WebUI Settings": "WebUI اعدادات",

+ 10 - 4
src/lib/i18n/locales/bg-BG/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Вече имате акаунт? ",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "асистент",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Затвори",
 	"Code execution": "",
 	"Code formatted successfully": "",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Колекция",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "По подразбиране",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "По подразбиране (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Модел по подразбиране",
 	"Default model updated": "Моделът по подразбиране е обновен",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Въведете Chunk Overlap",
 	"Enter Chunk Size": "Въведете Chunk Size",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Въведете URL адреса на Github Raw",
 	"Enter Google PSE API Key": "Въведете Google PSE API ключ",
 	"Enter Google PSE Engine Id": "Въведете идентификатор на двигателя на Google PSE",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Експериментално",
 	"Explore the cosmos": "",
 	"Export": "Износ",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "Наказание за честота",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "",
 	"Function deleted successfully": "",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Генерация на изображения (Експериментално)",
 	"Image Generation Engine": "Двигател за генериране на изображения",
@@ -627,6 +630,7 @@
 	"More": "Повече",
 	"Name": "Име",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Нов чат",
 	"New Folder": "",
 	"New Password": "Нова парола",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Предыдущите 30 дни",
 	"Previous 7 days": "Предыдущите 7 дни",
 	"Profile Image": "Профилна снимка",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Промпт (напр. Обмисли ме забавна факт за Римската империя)",
 	"Prompt Content": "Съдържание на промпта",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Настройки за зареждане на уеб",
 	"Web Search": "Търсене в уеб",
 	"Web Search Engine": "Уеб търсачка",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "Уебхук URL",
 	"WebUI Settings": "WebUI Настройки",

+ 10 - 4
src/lib/i18n/locales/bn-BD/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "আগে থেকেই একাউন্ট আছে?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "একটা এসিস্ট্যান্ট",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "বন্ধ",
 	"Code execution": "",
 	"Code formatted successfully": "",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "সংগ্রহ",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "ডিফল্ট",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "ডিফল্ট (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "ডিফল্ট মডেল",
 	"Default model updated": "ডিফল্ট মডেল আপডেট হয়েছে",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "চাঙ্ক ওভারল্যাপ লিখুন",
 	"Enter Chunk Size": "চাংক সাইজ লিখুন",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "গিটহাব কাঁচা URL লিখুন",
 	"Enter Google PSE API Key": "গুগল পিএসই এপিআই কী লিখুন",
 	"Enter Google PSE Engine Id": "গুগল পিএসই ইঞ্জিন আইডি লিখুন",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "পরিক্ষামূলক",
 	"Explore the cosmos": "",
 	"Export": "রপ্তানি",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "ফ্রিকোয়েন্সি পেনাল্টি",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "",
 	"Function deleted successfully": "",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "ইমেজ জেনারেশন (পরিক্ষামূলক)",
 	"Image Generation Engine": "ইমেজ জেনারেশন ইঞ্জিন",
@@ -627,6 +630,7 @@
 	"More": "আরো",
 	"Name": "নাম",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "নতুন চ্যাট",
 	"New Folder": "",
 	"New Password": "নতুন পাসওয়ার্ড",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "পূর্ব ৩০ দিন",
 	"Previous 7 days": "পূর্ব ৭ দিন",
 	"Profile Image": "প্রোফাইল ইমেজ",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "প্রম্প্ট (উদাহরণস্বরূপ, আমি রোমান ইমপার্টের সম্পর্কে একটি উপস্থিতি জানতে বল)",
 	"Prompt Content": "প্রম্পট কন্টেন্ট",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "ওয়েব লোডার সেটিংস",
 	"Web Search": "ওয়েব অনুসন্ধান",
 	"Web Search Engine": "ওয়েব সার্চ ইঞ্জিন",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "ওয়েবহুক URL",
 	"WebUI Settings": "WebUI সেটিংসমূহ",

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

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "Punts d'accés permesos",
 	"Already have an account?": "Ja tens 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)": "Alternativa al top_p, i pretén garantir un equilibri de qualitat i varietat. El paràmetre p representa la probabilitat mínima que es consideri un token, en relació amb la probabilitat del token més probable. Per exemple, amb p=0,05 i el token més probable amb una probabilitat de 0,9, es filtren els logits amb un valor inferior a 0,045. (Per defecte: 0.0)",
+	"Always": "",
 	"Amazing": "Al·lucinant",
 	"an assistant": "un assistent",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Tancar",
 	"Code execution": "Execució de codi",
 	"Code formatted successfully": "Codi formatat correctament",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Col·lecció",
 	"Color": "Color",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Per defecte",
 	"Default (Open AI)": "Per defecte (Open AI)",
 	"Default (SentenceTransformers)": "Per defecte (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Model per defecte",
 	"Default model updated": "Model per defecte actualitzat",
 	"Default Models": "Models per defecte",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Introdueix la mida de solapament de blocs",
 	"Enter Chunk Size": "Introdueix la mida del bloc",
 	"Enter description": "Introdueix la descripció",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Introdueix l'URL en brut de Github",
 	"Enter Google PSE API Key": "Introdueix la clau API de Google PSE",
 	"Enter Google PSE Engine Id": "Introdueix l'identificador del motor PSE de Google",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "Error en accedir a Google Drive: {{error}}",
 	"Error uploading file: {{error}}": "Error en pujar l'arxiu: {{error}}",
 	"Evaluations": "Avaluacions",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Exemple: (&(objectClass=inetOrgPerson)(uid=%s))",
 	"Example: ALL": "Exemple: TOTS",
 	"Example: mail": "Exemple: mail",
 	"Example: ou=users,dc=foo,dc=example": "Exemple: ou=users,dc=foo,dc=example",
 	"Example: sAMAccountName or uid or userPrincipalName": "Exemple: sAMAccountName o uid o userPrincipalName",
 	"Exclude": "Excloure",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Experimental",
 	"Explore the cosmos": "Explorar el cosmos",
 	"Export": "Exportar",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "Formata les teves variables utilitzant claudàtors així:",
 	"Frequency Penalty": "Penalització per freqüència",
 	"Function": "Funció",
+	"Function Calling": "",
 	"Function created successfully": "La funció s'ha creat correctament",
 	"Function deleted successfully": "La funció s'ha eliminat correctament",
 	"Function Description": "Descripció de la funció",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "Despertar la curiositat",
 	"Image": "Imatge",
 	"Image Compression": "Compressió d'imatges",
-	"Image generation": "Generació d'imatges",
 	"Image Generation": "Generació d'imatges",
 	"Image Generation (Experimental)": "Generació d'imatges (Experimental)",
 	"Image Generation Engine": "Motor de generació d'imatges",
@@ -627,6 +630,7 @@
 	"More": "Més",
 	"Name": "Nom",
 	"Name your knowledge base": "Anomena la teva base de coneixement",
+	"Native": "",
 	"New Chat": "Nou xat",
 	"New Folder": "Nova carpeta",
 	"New Password": "Nova contrasenya",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "30 dies anteriors",
 	"Previous 7 days": "7 dies anteriors",
 	"Profile Image": "Imatge de perfil",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Indicació (p.ex. Digues-me quelcom divertit sobre l'Imperi Romà)",
 	"Prompt Content": "Contingut de la indicació",
 	"Prompt created successfully": "Indicació creada correctament",
@@ -1046,6 +1051,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 in Chat": "",
 	"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",

+ 10 - 4
src/lib/i18n/locales/ceb-PH/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Naa na kay account ?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "usa ka katabang",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Suod nga",
 	"Code execution": "",
 	"Code formatted successfully": "",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Koleksyon",
 	"Color": "",
 	"ComfyUI": "",
@@ -238,6 +238,7 @@
 	"Default": "Pinaagi sa default",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "",
 	"Default model updated": "Gi-update nga default template",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Pagsulod sa block overlap",
 	"Enter Chunk Size": "Isulod ang block size",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "",
 	"Enter Google PSE API Key": "",
 	"Enter Google PSE Engine Id": "",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Eksperimento",
 	"Explore the cosmos": "",
 	"Export": "",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "",
 	"Function deleted successfully": "",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Pagmugna og hulagway (Eksperimento)",
 	"Image Generation Engine": "Makina sa paghimo og imahe",
@@ -627,6 +630,7 @@
 	"More": "",
 	"Name": "Ngalan",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Bag-ong diskusyon",
 	"New Folder": "",
 	"New Password": "Bag-ong Password",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "",
 	"Previous 7 days": "",
 	"Profile Image": "",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "",
 	"Prompt Content": "Ang sulod sa prompt",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "",
 	"Web Search": "",
 	"Web Search Engine": "",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "",
 	"WebUI Settings": "Mga Setting sa WebUI",

+ 10 - 4
src/lib/i18n/locales/cs-CZ/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Už máte účet?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "asistent",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Zavřít",
 	"Code execution": "Provádění kódu",
 	"Code formatted successfully": "Kód byl úspěšně naformátován.",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "",
 	"Color": "Barva",
 	"ComfyUI": "ComfyUI.",
@@ -238,6 +238,7 @@
 	"Default": "Výchozí hodnoty nebo nastavení.",
 	"Default (Open AI)": "Výchozí (Open AI)",
 	"Default (SentenceTransformers)": "Výchozí (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Výchozí model",
 	"Default model updated": "Výchozí model aktualizován.",
 	"Default Models": "Výchozí modely",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Zadejte překryv části",
 	"Enter Chunk Size": "Zadejte velikost bloku",
 	"Enter description": "Zadejte popis",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Zadejte URL adresu Github Raw",
 	"Enter Google PSE API Key": "Zadejte klíč rozhraní API Google PSE",
 	"Enter Google PSE Engine Id": "Zadejte ID vyhledávacího mechanismu Google PSE",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "Hodnocení",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "Vyloučit",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Experimentální",
 	"Explore the cosmos": "",
 	"Export": "Exportovat",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "Formátujte své proměnné pomocí závorek takto:",
 	"Frequency Penalty": "Penalizace frekvence",
 	"Function": "Funkce",
+	"Function Calling": "",
 	"Function created successfully": "Funkce byla úspěšně vytvořena.",
 	"Function deleted successfully": "Funkce byla úspěšně odstraněna",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Generování obrázků (experimentální)",
 	"Image Generation Engine": "Engine pro generování obrázků",
@@ -627,6 +630,7 @@
 	"More": "Více",
 	"Name": "Jméno",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Nový chat",
 	"New Folder": "",
 	"New Password": "Nové heslo",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Předchozích 30 dnů",
 	"Previous 7 days": "Předchozích 7 dní",
 	"Profile Image": "Profilový obrázek",
+	"Prompt": "",
 	"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": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Nastavení Web Loaderu",
 	"Web Search": "Vyhledávání na webu",
 	"Web Search Engine": "Webový vyhledávač",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "Nastavení WebUI",

+ 10 - 4
src/lib/i18n/locales/da-DK/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Har du allerede en profil?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "en assistent",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Luk",
 	"Code execution": "",
 	"Code formatted successfully": "Kode formateret korrekt",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Samling",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Standard",
 	"Default (Open AI)": "Standard (Open AI)",
 	"Default (SentenceTransformers)": "Standard (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Standard model",
 	"Default model updated": "Standard model opdateret",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Indtast overlapning af tekststykker",
 	"Enter Chunk Size": "Indtast størrelse af tekststykker",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Indtast Github Raw URL",
 	"Enter Google PSE API Key": "Indtast Google PSE API-nøgle",
 	"Enter Google PSE Engine Id": "Indtast Google PSE Engine ID",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Eksperimentel",
 	"Explore the cosmos": "",
 	"Export": "Eksportér",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "Hyppighedsstraf",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "Funktion oprettet.",
 	"Function deleted successfully": "Funktion slettet.",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Billedgenerering (eksperimentel)",
 	"Image Generation Engine": "Billedgenereringsengine",
@@ -627,6 +630,7 @@
 	"More": "Mere",
 	"Name": "Navn",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Ny chat",
 	"New Folder": "",
 	"New Password": "Ny adgangskode",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Seneste 30 dage",
 	"Previous 7 days": "Seneste 7 dage",
 	"Profile Image": "Profilbillede",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (f.eks. Fortæl mig en sjov kendsgerning om Romerriget)",
 	"Prompt Content": "Promptindhold",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Web Loader-indstillinger",
 	"Web Search": "Websøgning",
 	"Web Search Engine": "Websøgemaskine",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook-URL",
 	"WebUI Settings": "WebUI-indstillinger",

+ 10 - 4
src/lib/i18n/locales/de-DE/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Haben Sie bereits einen Account?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Alternative zu top_p und zielt darauf ab, ein Gleichgewicht zwischen Qualität und Vielfalt zu gewährleisten. Der Parameter p repräsentiert die Mindestwahrscheinlichkeit für ein Token, um berücksichtigt zu werden, relativ zur Wahrscheinlichkeit des wahrscheinlichsten Tokens. Zum Beispiel, bei p=0.05 und das wahrscheinlichste Token hat eine Wahrscheinlichkeit von 0.9, werden Logits mit einem Wert von weniger als 0.045 herausgefiltert. (Standard: 0.0)",
+	"Always": "",
 	"Amazing": "Fantastisch",
 	"an assistant": "ein Assistent",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Schließen",
 	"Code execution": "Codeausführung",
 	"Code formatted successfully": "Code erfolgreich formatiert",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Kollektion",
 	"Color": "Farbe",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Standard",
 	"Default (Open AI)": "Standard (Open AI)",
 	"Default (SentenceTransformers)": "Standard (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Standardmodell",
 	"Default model updated": "Standardmodell aktualisiert",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Geben Sie die Blocküberlappung ein",
 	"Enter Chunk Size": "Geben Sie die Blockgröße ein",
 	"Enter description": "Geben Sie eine Beschreibung ein",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Geben Sie die Github Raw-URL ein",
 	"Enter Google PSE API Key": "Geben Sie den Google PSE-API-Schlüssel ein",
 	"Enter Google PSE Engine Id": "Geben Sie die Google PSE-Engine-ID ein",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "Evaluationen",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Beispiel: (&(objectClass=inetOrgPerson)(uid=%s))",
 	"Example: ALL": "Beispiel: ALL",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "Beispiel: ou=users,dc=foo,dc=example",
 	"Example: sAMAccountName or uid or userPrincipalName": "Beispiel: sAMAccountName or uid or userPrincipalName",
 	"Exclude": "Ausschließen",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Experimentell",
 	"Explore the cosmos": "Erforschen Sie das Universum",
 	"Export": "Exportieren",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "Formatieren Sie Ihre Variablen mit Klammern, wie hier:",
 	"Frequency Penalty": "Frequenzstrafe",
 	"Function": "Funktion",
+	"Function Calling": "",
 	"Function created successfully": "Funktion erfolgreich erstellt",
 	"Function deleted successfully": "Funktion erfolgreich gelöscht",
 	"Function Description": "Funktionsbeschreibung",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "Neugier entfachen",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Bildgenerierung (experimentell)",
 	"Image Generation Engine": "Bildgenerierungs-Engine",
@@ -627,6 +630,7 @@
 	"More": "Mehr",
 	"Name": "Name",
 	"Name your knowledge base": "Benennen Sie Ihren Wissensspeicher",
+	"Native": "",
 	"New Chat": "Neue Unterhaltung",
 	"New Folder": "",
 	"New Password": "Neues Passwort",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Vorherige 30 Tage",
 	"Previous 7 days": "Vorherige 7 Tage",
 	"Profile Image": "Profilbild",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (z. B. \"Erzähle mir eine interessante Tatsache über das Römische Reich\")",
 	"Prompt Content": "Prompt-Inhalt",
 	"Prompt created successfully": "Prompt erfolgreich erstellt",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Web Loader Einstellungen",
 	"Web Search": "Websuche",
 	"Web Search Engine": "Suchmaschine",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "WebUI-Einstellungen",

+ 10 - 4
src/lib/i18n/locales/dg-DG/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Such account exists?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "such assistant",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Close",
 	"Code execution": "",
 	"Code formatted successfully": "",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Collection",
 	"Color": "",
 	"ComfyUI": "",
@@ -238,6 +238,7 @@
 	"Default": "Default",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "",
 	"Default model updated": "Default model much updated",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Enter Overlap of Chunks",
 	"Enter Chunk Size": "Enter Size of Chunk",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "",
 	"Enter Google PSE API Key": "",
 	"Enter Google PSE Engine Id": "",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Much Experiment",
 	"Explore the cosmos": "",
 	"Export": "",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "",
 	"Function deleted successfully": "",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Image Wow (Much Experiment)",
 	"Image Generation Engine": "Image Engine",
@@ -627,6 +630,7 @@
 	"More": "",
 	"Name": "Name",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "New Bark",
 	"New Folder": "",
 	"New Password": "New Barkword",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "",
 	"Previous 7 days": "",
 	"Profile Image": "",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "",
 	"Prompt Content": "Prompt Content",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "",
 	"Web Search": "",
 	"Web Search Engine": "",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "",
 	"WebUI Settings": "WebUI Settings much settings",

+ 10 - 4
src/lib/i18n/locales/el-GR/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Έχετε ήδη λογαριασμό;",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Εναλλακτικό στο top_p, και στοχεύει στη διασφάλιση μιας ισορροπίας μεταξύ ποιότητας και ποικιλίας. Η παράμετρος p αντιπροσωπεύει την ελάχιστη πιθανότητα για ένα token να θεωρηθεί, σε σχέση με την πιθανότητα του πιο πιθανού token. Για παράδειγμα, με p=0.05 και το πιο πιθανό token να έχει πιθανότητα 0.9, τα logits με τιμή μικρότερη από 0.045 φιλτράρονται. (Προεπιλογή: 0.0)",
+	"Always": "",
 	"Amazing": "Καταπληκτικό",
 	"an assistant": "ένας βοηθός",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Κλείσιμο",
 	"Code execution": "Εκτέλεση κώδικα",
 	"Code formatted successfully": "Ο κώδικας μορφοποιήθηκε επιτυχώς",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Συλλογή",
 	"Color": "Χρώμα",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Προεπιλογή",
 	"Default (Open AI)": "Προεπιλογή (Open AI)",
 	"Default (SentenceTransformers)": "Προεπιλογή (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Προεπιλεγμένο Μοντέλο",
 	"Default model updated": "Το προεπιλεγμένο μοντέλο ενημερώθηκε",
 	"Default Models": "Προεπιλεγμένα Μοντέλα",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Εισάγετε την Επικάλυψη Τμημάτων",
 	"Enter Chunk Size": "Εισάγετε το Μέγεθος Τμημάτων",
 	"Enter description": "Εισάγετε την περιγραφή",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Εισάγετε το Github Raw URL",
 	"Enter Google PSE API Key": "Εισάγετε το Κλειδί API Google PSE",
 	"Enter Google PSE Engine Id": "Εισάγετε το Αναγνωριστικό Μηχανής Google PSE",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "Αξιολογήσεις",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Παράδειγμα: (&(objectClass=inetOrgPerson)(uid=%s))",
 	"Example: ALL": "Παράδειγμα: ALL",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "Παράδειγμα: ou=users,dc=foo,dc=example",
 	"Example: sAMAccountName or uid or userPrincipalName": "Παράδειγμα: sAMAccountName ή uid ή userPrincipalName",
 	"Exclude": "Εξαίρεση",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Πειραματικό",
 	"Explore the cosmos": "Εξερευνήστε το σύμπαν",
 	"Export": "Εξαγωγή",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "Μορφοποιήστε τις μεταβλητές σας χρησιμοποιώντας αγκύλες όπως αυτό:",
 	"Frequency Penalty": "Ποινή Συχνότητας",
 	"Function": "Λειτουργία",
+	"Function Calling": "",
 	"Function created successfully": "Η λειτουργία δημιουργήθηκε με επιτυχία",
 	"Function deleted successfully": "Η λειτουργία διαγράφηκε με επιτυχία",
 	"Function Description": "Περιγραφή Λειτουργίας",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "Ξύπνημα της περιέργειας",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Δημιουργία Εικόνας (Πειραματικό)",
 	"Image Generation Engine": "Μηχανή Δημιουργίας Εικόνας",
@@ -627,6 +630,7 @@
 	"More": "Περισσότερα",
 	"Name": "Όνομα",
 	"Name your knowledge base": "Ονομάστε τη βάση γνώσης σας",
+	"Native": "",
 	"New Chat": "Νέα Συνομιλία",
 	"New Folder": "",
 	"New Password": "Νέος Κωδικός",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Προηγούμενες 30 ημέρες",
 	"Previous 7 days": "Προηγούμενες 7 ημέρες",
 	"Profile Image": "Εικόνα Προφίλ",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Προτροπή (π.χ. Πες μου ένα διασκεδαστικό γεγονός για την Ρωμαϊκή Αυτοκρατορία)",
 	"Prompt Content": "Περιεχόμενο Προτροπής",
 	"Prompt created successfully": "Η προτροπή δημιουργήθηκε με επιτυχία",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Ρυθμίσεις Φόρτωσης Web",
 	"Web Search": "Αναζήτηση στο Διαδίκτυο",
 	"Web Search Engine": "Μηχανή Αναζήτησης στο Διαδίκτυο",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "URL Webhook",
 	"WebUI Settings": "Ρυθμίσεις WebUI",

+ 10 - 4
src/lib/i18n/locales/en-GB/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "",
 	"Code execution": "",
 	"Code formatted successfully": "",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "",
 	"Color": "",
 	"ComfyUI": "",
@@ -238,6 +238,7 @@
 	"Default": "",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "",
 	"Default model updated": "",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "",
 	"Enter Chunk Size": "",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "",
 	"Enter Google PSE API Key": "",
 	"Enter Google PSE Engine Id": "",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "",
 	"Explore the cosmos": "",
 	"Export": "",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "",
 	"Function deleted successfully": "",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "",
 	"Image Generation Engine": "",
@@ -627,6 +630,7 @@
 	"More": "",
 	"Name": "",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "",
 	"New Folder": "",
 	"New Password": "",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "",
 	"Previous 7 days": "",
 	"Profile Image": "",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "",
 	"Prompt Content": "",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "",
 	"Web Search": "",
 	"Web Search Engine": "",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "",
 	"WebUI Settings": "",

+ 10 - 4
src/lib/i18n/locales/en-US/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "",
 	"Code execution": "",
 	"Code formatted successfully": "",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "",
 	"Color": "",
 	"ComfyUI": "",
@@ -238,6 +238,7 @@
 	"Default": "",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "",
 	"Default model updated": "",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "",
 	"Enter Chunk Size": "",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "",
 	"Enter Google PSE API Key": "",
 	"Enter Google PSE Engine Id": "",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "",
 	"Explore the cosmos": "",
 	"Export": "",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "",
 	"Function deleted successfully": "",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "",
 	"Image Generation Engine": "",
@@ -627,6 +630,7 @@
 	"More": "",
 	"Name": "",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "",
 	"New Folder": "",
 	"New Password": "",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "",
 	"Previous 7 days": "",
 	"Profile Image": "",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "",
 	"Prompt Content": "",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "",
 	"Web Search": "",
 	"Web Search Engine": "",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "",
 	"WebUI Settings": "",

+ 10 - 4
src/lib/i18n/locales/es-ES/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "¿Ya tienes una cuenta?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "un asistente",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Cerrar",
 	"Code execution": "",
 	"Code formatted successfully": "Se ha formateado correctamente el código.",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Colección",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Por defecto",
 	"Default (Open AI)": "Predeterminado (Open AI)",
 	"Default (SentenceTransformers)": "Predeterminado (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Modelo predeterminado",
 	"Default model updated": "El modelo por defecto ha sido actualizado",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Ingresar superposición de fragmentos",
 	"Enter Chunk Size": "Ingrese el tamaño del fragmento",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Ingresa la URL sin procesar de Github",
 	"Enter Google PSE API Key": "Ingrese la clave API de Google PSE",
 	"Enter Google PSE Engine Id": "Introduzca el ID del motor PSE de Google",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Experimental",
 	"Explore the cosmos": "",
 	"Export": "Exportar",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "Penalización de frecuencia",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "Función creada exitosamente",
 	"Function deleted successfully": "Función borrada exitosamente",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Generación de imágenes (experimental)",
 	"Image Generation Engine": "Motor de generación de imágenes",
@@ -627,6 +630,7 @@
 	"More": "Más",
 	"Name": "Nombre",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Nuevo Chat",
 	"New Folder": "",
 	"New Password": "Nueva Contraseña",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Últimos 30 días",
 	"Previous 7 days": "Últimos 7 días",
 	"Profile Image": "Imagen de perfil",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (por ejemplo, cuéntame una cosa divertida sobre el Imperio Romano)",
 	"Prompt Content": "Contenido del Prompt",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Web Loader Settings",
 	"Web Search": "Búsqueda en la Web",
 	"Web Search Engine": "Motor de búsqueda web",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "Configuración del WebUI",

+ 10 - 4
src/lib/i18n/locales/eu-ES/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Baduzu kontu bat?",
 	"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-ren alternatiba, kalitate eta aniztasunaren arteko oreka bermatzea du helburu. p parametroak token bat kontuan hartzeko gutxieneko probabilitatea adierazten du, token probableenaren probabilitatearen arabera. Adibidez, p=0.05 balioarekin eta token probableenaren probabilitatea 0.9 denean, 0.045 baino balio txikiagoko logit-ak baztertzen dira. (Lehenetsia: 0.0)",
+	"Always": "",
 	"Amazing": "Harrigarria",
 	"an assistant": "laguntzaile bat",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Itxi",
 	"Code execution": "Kodearen exekuzioa",
 	"Code formatted successfully": "Kodea ongi formateatu da",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Bilduma",
 	"Color": "Kolorea",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Lehenetsia",
 	"Default (Open AI)": "Lehenetsia (Open AI)",
 	"Default (SentenceTransformers)": "Lehenetsia (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Eredu Lehenetsia",
 	"Default model updated": "Eredu lehenetsia eguneratu da",
 	"Default Models": "Eredu Lehenetsiak",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Sartu Zatien Gainjartzea (chunk overlap)",
 	"Enter Chunk Size": "Sartu Zati Tamaina",
 	"Enter description": "Sartu deskribapena",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Sartu Github Raw URLa",
 	"Enter Google PSE API Key": "Sartu Google PSE API Gakoa",
 	"Enter Google PSE Engine Id": "Sartu Google PSE Motor IDa",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "Ebaluazioak",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Adibidea: (&(objectClass=inetOrgPerson)(uid=%s))",
 	"Example: ALL": "Adibidea: GUZTIAK",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "Adibidea: ou=users,dc=foo,dc=example",
 	"Example: sAMAccountName or uid or userPrincipalName": "Adibidea: sAMAccountName edo uid edo userPrincipalName",
 	"Exclude": "Baztertu",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Esperimentala",
 	"Explore the cosmos": "Esploratu kosmosa",
 	"Export": "Esportatu",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "Formateatu zure aldagaiak kortxeteak erabiliz honela:",
 	"Frequency Penalty": "Maiztasun Zigorra",
 	"Function": "Funtzioa",
+	"Function Calling": "",
 	"Function created successfully": "Funtzioa ongi sortu da",
 	"Function deleted successfully": "Funtzioa ongi ezabatu da",
 	"Function Description": "Funtzioaren Deskribapena",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "Piztu jakin-mina",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Irudi Sorkuntza (Esperimentala)",
 	"Image Generation Engine": "Irudi Sorkuntza Motorea",
@@ -627,6 +630,7 @@
 	"More": "Gehiago",
 	"Name": "Izena",
 	"Name your knowledge base": "Izendatu zure ezagutza-basea",
+	"Native": "",
 	"New Chat": "Txat berria",
 	"New Folder": "",
 	"New Password": "Pasahitz berria",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Aurreko 30 egunak",
 	"Previous 7 days": "Aurreko 7 egunak",
 	"Profile Image": "Profil irudia",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt-a (adib. Kontatu datu dibertigarri bat Erromatar Inperioari buruz)",
 	"Prompt Content": "Prompt edukia",
 	"Prompt created successfully": "Prompt-a ongi sortu da",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Web kargatzailearen ezarpenak",
 	"Web Search": "Web bilaketa",
 	"Web Search Engine": "Web bilaketa motorra",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook URLa",
 	"WebUI Settings": "WebUI ezarpenak",

+ 10 - 4
src/lib/i18n/locales/fa-IR/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "از قبل حساب کاربری دارید؟",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "یک دستیار",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "بسته",
 	"Code execution": "",
 	"Code formatted successfully": "",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "مجموعه",
 	"Color": "",
 	"ComfyUI": "کومیوآی",
@@ -238,6 +238,7 @@
 	"Default": "پیشفرض",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "پیشفرض (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "مدل پیشفرض",
 	"Default model updated": "مدل پیشفرض به\u200cروزرسانی شد",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "مقدار Chunk Overlap را وارد کنید",
 	"Enter Chunk Size": "مقدار Chunk Size را وارد کنید",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "ادرس Github Raw را وارد کنید",
 	"Enter Google PSE API Key": "کلید API گوگل PSE را وارد کنید",
 	"Enter Google PSE Engine Id": "شناسه موتور PSE گوگل را وارد کنید",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "آزمایشی",
 	"Explore the cosmos": "",
 	"Export": "برون\u200cریزی",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "مجازات فرکانس",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "",
 	"Function deleted successfully": "",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "تولید تصویر (آزمایشی)",
 	"Image Generation Engine": "موتور تولید تصویر",
@@ -627,6 +630,7 @@
 	"More": "بیشتر",
 	"Name": "نام",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "گپ جدید",
 	"New Folder": "",
 	"New Password": "رمز عبور جدید",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "30 روز قبل",
 	"Previous 7 days": "7 روز قبل",
 	"Profile Image": "تصویر پروفایل",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "پیشنهاد (برای مثال: به من بگوید چیزی که برای من یک کاربرد داره درباره ایران)",
 	"Prompt Content": "محتویات پرامپت",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "تنظیمات لودر وب",
 	"Web Search": "جستجوی وب",
 	"Web Search Engine": "موتور جستجوی وب",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "نشانی وب\u200cهوک",
 	"WebUI Settings": "تنظیمات WebUI",

+ 10 - 4
src/lib/i18n/locales/fi-FI/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"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)": "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)",
+	"Always": "",
 	"Amazing": "Hämmästyttävä",
 	"an assistant": "avustaja",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Sulje",
 	"Code execution": "Koodin suorittaminen",
 	"Code formatted successfully": "Koodin muotoilu onnistui",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Kokoelma",
 	"Color": "Väri",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Oletus",
 	"Default (Open AI)": "Oletus (Open AI)",
 	"Default (SentenceTransformers)": "Oletus (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Oletusmalli",
 	"Default model updated": "Oletusmalli päivitetty",
 	"Default Models": "Oletusmallit",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Syötä osien päällekkäisyys",
 	"Enter Chunk Size": "Syötä osien koko",
 	"Enter description": "Kirjoita kuvaus",
+	"Enter Exa API Key": "",
 	"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",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "Arvioinnit",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Esimerkki: (&(objectClass=inetOrgPerson)(uid=%s))",
 	"Example: ALL": "Esimerkki: KAIKKI",
 	"Example: mail": "",
 	"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",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Kokeellinen",
 	"Explore the cosmos": "Tutki avaruutta",
 	"Export": "Vie",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "Muotoile muuttujasi hakasulkeilla tällä tavalla:",
 	"Frequency Penalty": "Taajuussakko",
 	"Function": "Toiminto",
+	"Function Calling": "",
 	"Function created successfully": "Toiminto luotu onnistuneesti",
 	"Function deleted successfully": "Toiminto poistettu onnistuneesti",
 	"Function Description": "Toiminnon kuvaus",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "Sytytä uteliaisuus",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Kuvagenerointi (kokeellinen)",
 	"Image Generation Engine": "Kuvagenerointimoottori",
@@ -627,6 +630,7 @@
 	"More": "Lisää",
 	"Name": "Nimi",
 	"Name your knowledge base": "Anna tietokannalle nimi",
+	"Native": "",
 	"New Chat": "Uusi keskustelu",
 	"New Folder": "",
 	"New Password": "Uusi salasana",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Edelliset 30 päivää",
 	"Previous 7 days": "Edelliset 7 päivää",
 	"Profile Image": "Profiilikuva",
+	"Prompt": "",
 	"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": "Kehote luotu onnistuneesti",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Web Loader -asetukset",
 	"Web Search": "Web-haku",
 	"Web Search Engine": "Web-hakukone",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "Web-haun kyselytulosten luonti",
 	"Webhook URL": "Webhook-URL",
 	"WebUI Settings": "WebUI-asetukset",

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

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"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)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "un assistant",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Fermer",
 	"Code execution": "",
 	"Code formatted successfully": "Le code a été formaté avec succès",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Collection",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Par défaut",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "Par défaut (Sentence Transformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Modèle standard",
 	"Default model updated": "Modèle par défaut mis à jour",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Entrez le chevauchement de chunk",
 	"Enter Chunk Size": "Entrez la taille de bloc",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Entrez l'URL brute de GitHub",
 	"Enter Google PSE API Key": "Entrez la clé API Google PSE",
 	"Enter Google PSE Engine Id": "Entrez l'identifiant du moteur Google PSE",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Expérimental",
 	"Explore the cosmos": "",
 	"Export": "Exportation",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "Pénalité de fréquence",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "La fonction a été créée avec succès",
 	"Function deleted successfully": "Fonction supprimée avec succès",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Génération d'images (expérimental)",
 	"Image Generation Engine": "Moteur de génération d'images",
@@ -627,6 +630,7 @@
 	"More": "Plus de",
 	"Name": "Nom",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Nouvelle conversation",
 	"New Folder": "",
 	"New Password": "Nouveau mot de passe",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "30 derniers jours",
 	"Previous 7 days": "7 derniers jours",
 	"Profile Image": "Image de profil",
+	"Prompt": "",
 	"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": "",
@@ -891,7 +896,7 @@
 	"Subtitle (e.g. about the Roman Empire)": "Sous-titres (par ex. sur l'Empire romain)",
 	"Success": "Réussite",
 	"Successfully updated.": "Mise à jour réussie.",
-	"Suggested": "Sugéré",
+	"Suggested": "Suggéré",
 	"Support": "",
 	"Support this plugin:": "",
 	"Sync directory": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Paramètres du chargeur web",
 	"Web Search": "Recherche Web",
 	"Web Search Engine": "Moteur de recherche Web",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "URL du webhook",
 	"WebUI Settings": "Paramètres de WebUI",

+ 10 - 4
src/lib/i18n/locales/fr-FR/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "Points de terminaison autorisés",
 	"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)": "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)",
+	"Always": "",
 	"Amazing": "Incroyable",
 	"an assistant": "un assistant",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Fermer",
 	"Code execution": "Exécution de code",
 	"Code formatted successfully": "Le code a été formaté avec succès",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Collection",
 	"Color": "Couleur",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Par défaut",
 	"Default (Open AI)": "Par défaut (OpenAI)",
 	"Default (SentenceTransformers)": "Par défaut (Sentence Transformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Modèle standard",
 	"Default model updated": "Modèle par défaut mis à jour",
 	"Default Models": "Modèles par défaut",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Entrez le chevauchement des chunks",
 	"Enter Chunk Size": "Entrez la taille des chunks",
 	"Enter description": "Entrez la description",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Entrez l'URL brute de GitHub",
 	"Enter Google PSE API Key": "Entrez la clé API Google PSE",
 	"Enter Google PSE Engine Id": "Entrez l'identifiant du moteur Google PSE",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "Erreur d'accès à Google Drive : {{error}}",
 	"Error uploading file: {{error}}": "Erreur de téléversement du fichier : {{error}}",
 	"Evaluations": "Évaluations",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Exemple: (&(objectClass=inetOrgPerson)(uid=%s))",
 	"Example: ALL": "Exemple: TOUS",
 	"Example: mail": "Exemple: mail",
 	"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",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Expérimental",
 	"Explore the cosmos": "Explorer le cosmos",
 	"Export": "Exportation",
@@ -455,6 +458,7 @@
 	"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 Calling": "",
 	"Function created successfully": "La fonction a été créée avec succès",
 	"Function deleted successfully": "Fonction supprimée avec succès",
 	"Function Description": "Description de la fonction",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "Éveiller la curiosité",
 	"Image": "Image",
 	"Image Compression": "Compression d'image",
-	"Image generation": "Génération d'images",
 	"Image Generation": "Génération d'images",
 	"Image Generation (Experimental)": "Génération d'images (expérimental)",
 	"Image Generation Engine": "Moteur de génération d'images",
@@ -627,6 +630,7 @@
 	"More": "Plus",
 	"Name": "Nom d'utilisateur",
 	"Name your knowledge base": "Nommez votre base de connaissances",
+	"Native": "",
 	"New Chat": "Nouvelle conversation",
 	"New Folder": "Nouveau dossier",
 	"New Password": "Nouveau mot de passe",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "30 derniers jours",
 	"Previous 7 days": "7 derniers jours",
 	"Profile Image": "Image de profil",
+	"Prompt": "",
 	"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 créé avec succès",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Paramètres du Web Loader",
 	"Web Search": "Recherche Web",
 	"Web Search Engine": "Moteur de recherche Web",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "Génération de requête de recherche Web",
 	"Webhook URL": "URL du webhook",
 	"WebUI Settings": "Paramètres de WebUI",

+ 10 - 4
src/lib/i18n/locales/he-IL/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "כבר יש לך חשבון?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "עוזר",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "סגור",
 	"Code execution": "",
 	"Code formatted successfully": "",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "אוסף",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "ברירת מחדל",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "ברירת מחדל (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "מודל ברירת מחדל",
 	"Default model updated": "המודל המוגדר כברירת מחדל עודכן",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "הזן חפיפת נתונים",
 	"Enter Chunk Size": "הזן גודל נתונים",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "הזן כתובת URL של Github Raw",
 	"Enter Google PSE API Key": "הזן מפתח API של Google PSE",
 	"Enter Google PSE Engine Id": "הזן את מזהה מנוע PSE של Google",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "ניסיוני",
 	"Explore the cosmos": "",
 	"Export": "ייצא",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "עונש תדירות",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "",
 	"Function deleted successfully": "",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "יצירת תמונות (ניסיוני)",
 	"Image Generation Engine": "מנוע יצירת תמונות",
@@ -627,6 +630,7 @@
 	"More": "עוד",
 	"Name": "שם",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "צ'אט חדש",
 	"New Folder": "",
 	"New Password": "סיסמה חדשה",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "30 הימים הקודמים",
 	"Previous 7 days": "7 הימים הקודמים",
 	"Profile Image": "תמונת פרופיל",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "פקודה (למשל, ספר לי עובדה מעניינת על האימפריה הרומית)",
 	"Prompt Content": "תוכן הפקודה",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "הגדרות טעינת אתר",
 	"Web Search": "חיפוש באינטרנט",
 	"Web Search Engine": "מנוע חיפוש באינטרנט",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "URL Webhook",
 	"WebUI Settings": "הגדרות WebUI",

+ 10 - 4
src/lib/i18n/locales/hi-IN/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "क्या आपके पास पहले से एक खाता मौजूद है?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "एक सहायक",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "बंद करना",
 	"Code execution": "",
 	"Code formatted successfully": "",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "संग्रह",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "डिफ़ॉल्ट",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "डिफ़ॉल्ट (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "डिफ़ॉल्ट मॉडल",
 	"Default model updated": "डिफ़ॉल्ट मॉडल अपडेट किया गया",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "चंक ओवरलैप दर्ज करें",
 	"Enter Chunk Size": "खंड आकार दर्ज करें",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Github Raw URL दर्ज करें",
 	"Enter Google PSE API Key": "Google PSE API कुंजी दर्ज करें",
 	"Enter Google PSE Engine Id": "Google PSE इंजन आईडी दर्ज करें",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "प्रयोगात्मक",
 	"Explore the cosmos": "",
 	"Export": "निर्यातित माल",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "फ्रीक्वेंसी पेनल्टी",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "",
 	"Function deleted successfully": "",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "छवि निर्माण (प्रायोगिक)",
 	"Image Generation Engine": "छवि निर्माण इंजन",
@@ -627,6 +630,7 @@
 	"More": "और..",
 	"Name": "नाम",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "नई चैट",
 	"New Folder": "",
 	"New Password": "नया पासवर्ड",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "पिछले 30 दिन",
 	"Previous 7 days": "पिछले 7 दिन",
 	"Profile Image": "प्रोफ़ाइल छवि",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "प्रॉम्प्ट (उदाहरण के लिए मुझे रोमन साम्राज्य के बारे में एक मजेदार तथ्य बताएं)",
 	"Prompt Content": "प्रॉम्प्ट सामग्री",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "वेब लोडर सेटिंग्स",
 	"Web Search": "वेब खोज",
 	"Web Search Engine": "वेब खोज इंजन",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "वेबहुक URL",
 	"WebUI Settings": "WebUI सेटिंग्स",

+ 10 - 4
src/lib/i18n/locales/hr-HR/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Već imate račun?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "asistent",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Zatvori",
 	"Code execution": "",
 	"Code formatted successfully": "",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Kolekcija",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Zadano",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "Zadano (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Zadani model",
 	"Default model updated": "Zadani model ažuriran",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Unesite preklapanje dijelova",
 	"Enter Chunk Size": "Unesite veličinu dijela",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Unesite Github sirovi URL",
 	"Enter Google PSE API Key": "Unesite Google PSE API ključ",
 	"Enter Google PSE Engine Id": "Unesite ID Google PSE motora",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Eksperimentalno",
 	"Explore the cosmos": "",
 	"Export": "Izvoz",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "Kazna za učestalost",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "",
 	"Function deleted successfully": "",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Generiranje slika (eksperimentalno)",
 	"Image Generation Engine": "Stroj za generiranje slika",
@@ -627,6 +630,7 @@
 	"More": "Više",
 	"Name": "Ime",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Novi razgovor",
 	"New Folder": "",
 	"New Password": "Nova lozinka",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Prethodnih 30 dana",
 	"Previous 7 days": "Prethodnih 7 dana",
 	"Profile Image": "Profilna slika",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (npr. Reci mi zanimljivost o Rimskom carstvu)",
 	"Prompt Content": "Sadržaj prompta",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Postavke web učitavanja",
 	"Web Search": "Internet pretraga",
 	"Web Search Engine": "Web tražilica",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "URL webkuke",
 	"WebUI Settings": "WebUI postavke",

+ 10 - 4
src/lib/i18n/locales/hu-HU/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Már van fiókod?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "egy asszisztens",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Bezárás",
 	"Code execution": "Kód végrehajtás",
 	"Code formatted successfully": "Kód sikeresen formázva",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Gyűjtemény",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Alapértelmezett",
 	"Default (Open AI)": "Alapértelmezett (Open AI)",
 	"Default (SentenceTransformers)": "Alapértelmezett (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Alapértelmezett modell",
 	"Default model updated": "Alapértelmezett modell frissítve",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Add meg a darab átfedést",
 	"Enter Chunk Size": "Add meg a darab méretet",
 	"Enter description": "Add meg a leírást",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Add meg a Github Raw URL-t",
 	"Enter Google PSE API Key": "Add meg a Google PSE API kulcsot",
 	"Enter Google PSE Engine Id": "Add meg a Google PSE motor azonosítót",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "Értékelések",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "Kizárás",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Kísérleti",
 	"Explore the cosmos": "",
 	"Export": "Exportálás",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "Formázd a változóidat zárójelekkel így:",
 	"Frequency Penalty": "Gyakorisági büntetés",
 	"Function": "Funkció",
+	"Function Calling": "",
 	"Function created successfully": "Funkció sikeresen létrehozva",
 	"Function deleted successfully": "Funkció sikeresen törölve",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Képgenerálás (kísérleti)",
 	"Image Generation Engine": "Képgenerálási motor",
@@ -627,6 +630,7 @@
 	"More": "Több",
 	"Name": "Név",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Új beszélgetés",
 	"New Folder": "",
 	"New Password": "Új jelszó",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Előző 30 nap",
 	"Previous 7 days": "Előző 7 nap",
 	"Profile Image": "Profilkép",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (pl. Mondj egy érdekes tényt a Római Birodalomról)",
 	"Prompt Content": "Prompt tartalom",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Web betöltő beállítások",
 	"Web Search": "Webes keresés",
 	"Web Search Engine": "Webes keresőmotor",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "WebUI beállítások",

+ 10 - 4
src/lib/i18n/locales/id-ID/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Sudah memiliki akun?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "asisten",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Tutup",
 	"Code execution": "",
 	"Code formatted successfully": "Kode berhasil diformat",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Koleksi",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Default",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "Default (Pengubah Kalimat)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Model Default",
 	"Default model updated": "Model default diperbarui",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Masukkan Tumpang Tindih Chunk",
 	"Enter Chunk Size": "Masukkan Ukuran Potongan",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Masukkan URL Mentah Github",
 	"Enter Google PSE API Key": "Masukkan Kunci API Google PSE",
 	"Enter Google PSE Engine Id": "Masukkan Id Mesin Google PSE",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Percobaan",
 	"Explore the cosmos": "",
 	"Export": "Ekspor",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "Penalti Frekuensi",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "Fungsi berhasil dibuat",
 	"Function deleted successfully": "Fungsi berhasil dihapus",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Pembuatan Gambar (Eksperimental)",
 	"Image Generation Engine": "Mesin Pembuat Gambar",
@@ -627,6 +630,7 @@
 	"More": "Lainnya",
 	"Name": "Nama",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Obrolan Baru",
 	"New Folder": "",
 	"New Password": "Kata Sandi Baru",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "30 hari sebelumnya",
 	"Previous 7 days": "7 hari sebelumnya",
 	"Profile Image": "Gambar Profil",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Permintaan (mis. Ceritakan sebuah fakta menarik tentang Kekaisaran Romawi)",
 	"Prompt Content": "Konten yang Diminta",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Pengaturan Pemuat Web",
 	"Web Search": "Pencarian Web",
 	"Web Search Engine": "Mesin Pencari Web",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "URL pengait web",
 	"WebUI Settings": "Pengaturan WebUI",

+ 41 - 35
src/lib/i18n/locales/ie-GA/translation.json

@@ -51,7 +51,7 @@
 	"Advanced Params": "Paraiméid Casta",
 	"All Documents": "Gach Doiciméad",
 	"All models deleted successfully": "Scriosadh na múnlaí go léir go rathúil",
-	"Allow Chat Controls": "",
+	"Allow Chat Controls": "Ceadaigh Rialuithe Comhrá",
 	"Allow Chat Delete": "Ceadaigh Comhrá a Scriosadh",
 	"Allow Chat Deletion": "Cead Scriosadh Comhrá",
 	"Allow Chat Edit": "Ceadaigh Eagarthóireacht Comhrá",
@@ -63,10 +63,11 @@
 	"Allowed Endpoints": "Críochphointí Ceadaithe",
 	"Already have an account?": "Tá cuntas agat cheana féin?",
 	"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)": "Rogha eile seachas an top_p, agus tá sé mar aidhm aige cothromaíocht cáilíochta agus éagsúlachta a chinntiú. Léiríonn an paraiméadar p an dóchúlacht íosta go mbreithneofar comhartha, i gcoibhneas le dóchúlacht an chomhartha is dóichí. Mar shampla, le p=0.05 agus dóchúlacht 0.9 ag an comhartha is dóichí, déantar logits le luach níos lú ná 0.045 a scagadh amach. (Réamhshocrú: 0.0)",
+	"Always": "I gcónaí",
 	"Amazing": "Iontach",
 	"an assistant": "cúntóir",
-	"Analyzed": "",
-	"Analyzing...": "",
+	"Analyzed": "Anailísithe",
+	"Analyzing...": "Ag déanamh anailíse...",
 	"and": "agus",
 	"and {{COUNT}} more": "agus {{COUNT}} eile",
 	"and create a new shared link.": "agus cruthaigh nasc nua roinnte.",
@@ -93,7 +94,7 @@
 	"Assistant": "Cúntóir",
 	"Attach file": "Ceangail comhad",
 	"Attention to detail": "Aird ar mhionsonraí",
-	"Attribute for Mail": "",
+	"Attribute for Mail": "Tréith don Phost",
 	"Attribute for Username": "Tréith don Ainm Úsáideora",
 	"Audio": "Fuaim",
 	"August": "Lúnasa",
@@ -171,12 +172,11 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Diúltaíodh cead scríofa an ghearrthaisce. Seiceáil socruithe do bhrabhsálaí chun an rochtain riachtanach a dheonú.",
 	"Clone": "Clón",
 	"Clone Chat": "Comhrá Clón",
-	"Clone of {{TITLE}}": "",
+	"Clone of {{TITLE}}": "Clón de {{TITLE}}",
 	"Close": "Dún",
 	"Code execution": "Cód a fhorghníomhú",
 	"Code formatted successfully": "Cód formáidithe go rathúil",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "Ateangaire Cód",
 	"Collection": "Bailiúchán",
 	"Color": "Dath",
 	"ComfyUI": "ComfyUI",
@@ -194,7 +194,7 @@
 	"Confirm your action": "Deimhnigh do ghníomh",
 	"Confirm your new password": "Deimhnigh do phasfhocal nua",
 	"Connections": "Naisc",
-	"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "",
+	"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "Srianann iarracht ar réasúnaíocht a dhéanamh ar shamhlacha réasúnaíochta. Ní bhaineann ach le samhlacha réasúnaíochta ó sholáthraithe sonracha a thacaíonn le hiarracht réasúnaíochta. (Réamhshocrú: meánach)",
 	"Contact Admin for WebUI Access": "Déan teagmháil le Riarachán le haghaidh Rochtana WebUI",
 	"Content": "Ábhar",
 	"Content Extraction": "Straibhadh Ábhar",
@@ -238,6 +238,7 @@
 	"Default": "Réamhshocraithe",
 	"Default (Open AI)": "Réamhshocraithe (Oscail AI)",
 	"Default (SentenceTransformers)": "Réamhshocraithe (SentenceTransFormers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "Oibríonn mód réamhshocraithe le raon níos leithne samhlacha trí ghlaoch a chur ar uirlisí uair amháin roimh fhorghníomhú. Déanann mód dúchasach cumas glaoite uirlisí ionsuite an mhúnla a ghiaráil, ach éilíonn sé go dtacaíonn an tsamhail leis an ngné seo go bunúsach.",
 	"Default Model": "Múnla Réamhshocraithe",
 	"Default model updated": "Nuashonraíodh an múnla réamhshocraithe",
 	"Default Models": "Múnlaí Réamhshocraithe",
@@ -347,7 +348,8 @@
 	"Enter CFG Scale (e.g. 7.0)": "Cuir isteach Scála CFG (m.sh. 7.0)",
 	"Enter Chunk Overlap": "Cuir isteach Chunk Forluí",
 	"Enter Chunk Size": "Cuir isteach Méid an Chunc",
-	"Enter description": "Tarraing",
+	"Enter description": "Iontráil cur síos",
+	"Enter Exa API Key": "Cuir isteach Eochair Exa API",
 	"Enter Github Raw URL": "Cuir isteach URL Github Raw",
 	"Enter Google PSE API Key": "Cuir isteach Eochair API Google PSE",
 	"Enter Google PSE Engine Id": "Cuir isteach ID Inneall Google PSE",
@@ -360,7 +362,7 @@
 	"Enter Mojeek Search API Key": "Cuir isteach Eochair API Cuardach Mojeek",
 	"Enter Number of Steps (e.g. 50)": "Iontráil Líon na gCéimeanna (m.sh. 50)",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "Cuir isteach URL seachfhreastalaí (m.sh. https://user:password@host:port)",
-	"Enter reasoning effort": "",
+	"Enter reasoning effort": "Cuir isteach iarracht réasúnaíochta",
 	"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",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "Earráid agus tú ag rochtain Google Drive: {{error}}",
 	"Error uploading file: {{error}}": "Earráid agus comhad á uaslódáil: {{error}}",
 	"Evaluations": "Meastóireachtaí",
+	"Exa API Key": "Eochair Exa API",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Sampla: (&(objectClass=inetOrgPerson)(uid=%s))",
 	"Example: ALL": "Sampla: GACH",
-	"Example: mail": "",
+	"Example: mail": "Sampla: ríomhphost",
 	"Example: ou=users,dc=foo,dc=example": "Sampla: ou=úsáideoirí,dc=foo,dc=sampla",
 	"Example: sAMAccountName or uid or userPrincipalName": "Sampla: sAMAaccountName nó uid nó userPrincipalName",
 	"Exclude": "Eisigh",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "Íosluchtaigh cód le haghaidh anailíse",
 	"Experimental": "Turgnamhach",
 	"Explore the cosmos": "Déan iniúchadh ar an cosmos",
 	"Export": "Easpórtáil",
@@ -420,12 +423,12 @@
 	"External Models": "Múnlaí Seachtracha",
 	"Failed to add file.": "Theip ar an gcomhad a chur leis.",
 	"Failed to create API Key.": "Theip ar an eochair API a chruthú.",
-	"Failed to fetch models": "",
+	"Failed to fetch models": "Theip ar shamhlacha a fháil",
 	"Failed to read clipboard contents": "Theip ar ábhar gearrthaisce a lé",
 	"Failed to save models configuration": "Theip ar chumraíocht na múnlaí a shábháil",
 	"Failed to update settings": "Theip ar shocruithe a nuashonrú",
 	"Failed to upload file.": "Theip ar uaslódáil an chomhaid.",
-	"Features Permissions": "",
+	"Features Permissions": "Ceadanna Gnéithe",
 	"February": "Feabhra",
 	"Feedback History": "Stair Aiseolais",
 	"Feedbacks": "Aiseolas",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "Formáidigh na hathróga ag baint úsáide as lúibíní mar seo:",
 	"Frequency Penalty": "Pionós Minicíochta",
 	"Function": "Feidhm",
+	"Function Calling": "Glaonna Feidhme",
 	"Function created successfully": "Cruthaíodh feidhm go rathúil",
 	"Function deleted successfully": "Feidhm scriosta go rathúil",
 	"Function Description": "Cur síos ar Fheidhm",
@@ -469,7 +473,7 @@
 	"Functions imported successfully": "Feidhmeanna allmhairi",
 	"General": "Ginearálta",
 	"General Settings": "Socruithe Ginearálta",
-	"Generate an image": "",
+	"Generate an image": "Gin íomhá",
 	"Generate Image": "Ginigh Íomhá",
 	"Generating search query": "Giniúint ceist cuardaigh",
 	"Get started": "Cuir tús leis",
@@ -500,15 +504,14 @@
 	"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Admhaím gur léigh mé agus tuigim impleachtaí mo ghníomhaíochta. Táim ar an eolas faoi na rioscaí a bhaineann le cód treallach a fhorghníomhú agus tá iontaofacht na foinse fíoraithe agam.",
 	"ID": "ID",
 	"Ignite curiosity": "Las fiosracht",
-	"Image": "",
+	"Image": "Íomhá",
 	"Image Compression": "Comhbhrú Íomhá",
-	"Image generation": "",
-	"Image Generation": "",
+	"Image Generation": "Giniúint Íomhá",
 	"Image Generation (Experimental)": "Giniúint Íomhá (Turgnaimh)",
 	"Image Generation Engine": "Inneall Giniúna Íomh",
 	"Image Max Compression Size": "Íomhá Méid Comhbhrú Max",
-	"Image Prompt Generation": "",
-	"Image Prompt Generation Prompt": "",
+	"Image Prompt Generation": "Giniúint Leid Íomhá",
+	"Image Prompt Generation Prompt": "Leid Giniúint Leide Íomhá",
 	"Image Settings": "Socruithe Íomhá",
 	"Images": "Íomhánna",
 	"Import Chats": "Comhráite iompórtá",
@@ -565,7 +568,7 @@
 	"Leave empty to use the default prompt, or enter a custom prompt": "Fág folamh chun an leid réamhshocraithe a úsáid, nó cuir isteach leid saincheaptha",
 	"Light": "Solas",
 	"Listening...": "Éisteacht...",
-	"Llama.cpp": "",
+	"Llama.cpp": "Llama.cpp",
 	"LLMs can make mistakes. Verify important information.": "Is féidir le LLManna botúin a dhéanamh. Fíoraigh faisnéis thábhachtach.",
 	"Local": "Áitiúil",
 	"Local Models": "Múnlaí Áitiúla",
@@ -576,7 +579,7 @@
 	"Make sure to export a workflow.json file as API format from ComfyUI.": "Déan cinnte comhad workflow.json a onnmhairiú mar fhormáid API ó ComfyUI.",
 	"Manage": "Bainistiú",
 	"Manage Arena Models": "Bainistigh Múnlaí Airéine",
-	"Manage Models": "",
+	"Manage Models": "Samhlacha a bhainistiú",
 	"Manage Ollama": "Bainistigh Ollama",
 	"Manage Ollama API Connections": "Bainistigh Naisc API Ollama",
 	"Manage OpenAI API Connections": "Bainistigh Naisc API OpenAI",
@@ -627,6 +630,7 @@
 	"More": "Tuilleadh",
 	"Name": "Ainm",
 	"Name your knowledge base": "Cuir ainm ar do bhunachar eolais",
+	"Native": "Dúchasach",
 	"New Chat": "Comhrá Nua",
 	"New Folder": "Fillteán Nua",
 	"New Password": "Pasfhocal Nua",
@@ -639,7 +643,7 @@
 	"No files found.": "Níor aimsíodh aon chomhaid.",
 	"No groups with access, add a group to grant access": "Gan aon ghrúpa a bhfuil rochtain acu, cuir grúpa leis chun rochtain a dheonú",
 	"No HTML, CSS, or JavaScript content found.": "Níor aimsíodh aon ábhar HTML, CSS nó JavaScript.",
-	"No inference engine with management support found": "",
+	"No inference engine with management support found": "Níor aimsíodh aon inneall tátail le tacaíocht bhainistíochta",
 	"No knowledge found": "Níor aimsíodh aon eolas",
 	"No model IDs": "Gan IDanna múnla",
 	"No models found": "Níor aimsíodh aon mhúnlaí",
@@ -721,7 +725,7 @@
 	"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.": "Roghnaigh munla ar dtús le do thoil.",
-	"Please select a model.": "",
+	"Please select a model.": "Roghnaigh múnla le do thoil.",
 	"Please select a reason": "Roghnaigh cúis le do thoil",
 	"Port": "Port",
 	"Positive attitude": "Dearcadh dearfach",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "30 lá roimhe seo",
 	"Previous 7 days": "7 lá roimhe seo",
 	"Profile Image": "Íomhá Próifíl",
+	"Prompt": "Leid",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Leid (m.sh. inis dom fíric spraíúil faoin Impireacht Rómhánach)",
 	"Prompt Content": "Ábhar Leid",
 	"Prompt created successfully": "Leid cruthaithe go rathúil",
@@ -745,9 +750,9 @@
 	"RAG Template": "Teimpléad RAG",
 	"Rating": "Rátáil",
 	"Re-rank models by topic similarity": "Athrangaigh múnlaí de réir cosúlachta topaicí",
-	"Read": "",
+	"Read": "Léigh",
 	"Read Aloud": "Léigh Ard",
-	"Reasoning Effort": "",
+	"Reasoning Effort": "Iarracht Réasúnúcháin",
 	"Record voice": "Taifead guth",
 	"Redirecting you to OpenWebUI Community": "Tú a atreorú chuig OpenWebUI Community",
 	"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)": "Laghdaíonn sé an dóchúlacht go giniúint nonsense. Tabharfaidh luach níos airde (m.sh. 100) freagraí níos éagsúla, agus beidh luach níos ísle (m.sh. 10) níos coimeádaí. (Réamhshocrú: 40)",
@@ -805,7 +810,7 @@
 	"Search options": "Roghanna cuardaigh",
 	"Search Prompts": "Leideanna Cuardaigh",
 	"Search Result Count": "Líon Torthaí Cuardaigh",
-	"Search the internet": "",
+	"Search the internet": "Cuardaigh an tIdirlíon",
 	"Search Tools": "Uirlisí Cuardaigh",
 	"SearchApi API Key": "Eochair API SearchAPI",
 	"SearchApi Engine": "Inneall SearchAPI",
@@ -824,7 +829,7 @@
 	"Select a pipeline": "Roghnaigh píblíne",
 	"Select a pipeline url": "Roghnaigh url píblíne",
 	"Select a tool": "Roghnaigh uirlis",
-	"Select an Ollama instance": "",
+	"Select an Ollama instance": "Roghnaigh sampla Olama",
 	"Select Engine": "Roghnaigh Inneall",
 	"Select Knowledge": "Roghnaigh Eolais",
 	"Select model": "Roghnaigh múnla",
@@ -851,7 +856,7 @@
 	"Set Scheduler": "Socraigh Sceidealóir",
 	"Set Steps": "Socraigh Céimeanna",
 	"Set Task Model": "Socraigh Samhail Tasc",
-	"Set the number of layers, which will be off-loaded to GPU. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "",
+	"Set the number of layers, which will be off-loaded to GPU. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "Socraigh líon na sraitheanna, a dhíluchtófar chuig GPU. Is féidir leis an luach seo a mhéadú feabhas suntasach a chur ar fheidhmíocht do mhúnlaí atá optamaithe le haghaidh luasghéarú GPU ach d’fhéadfadh go n-ídíonn siad níos mó cumhachta agus acmhainní GPU freisin.",
 	"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.": "Socraigh líon na snáitheanna oibrithe a úsáidtear le haghaidh ríomh. Rialaíonn an rogha seo cé mhéad snáithe a úsáidtear chun iarratais a thagann isteach a phróiseáil i gcomhthráth. D'fhéadfadh méadú ar an luach seo feidhmíocht a fheabhsú faoi ualaí oibre comhairgeadra ard ach féadfaidh sé níos mó acmhainní LAP a úsáid freisin.",
 	"Set Voice": "Socraigh Guth",
 	"Set whisper model": "Socraigh múnla cogar",
@@ -916,7 +921,7 @@
 	"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)": "Cinneann méid an bhaisc cé mhéad iarratas téacs a phróiseáiltear le chéile ag an am céanna. Is féidir le méid baisc níos airde feidhmíocht agus luas an mhúnla a mhéadú, ach éilíonn sé níos mó cuimhne freisin. (Réamhshocrú: 512)",
 	"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Is deonacha paiseanta ón bpobal iad na forbróirí taobh thiar den bhreiseán seo. Má aimsíonn an breiseán seo cabhrach leat, smaoinigh ar rannchuidiú lena fhorbairt.",
 	"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Tá an clár ceannairí meastóireachta bunaithe ar chóras rátála Elo agus déantar é a nuashonrú i bhfíor-am.",
-	"The LDAP attribute that maps to the mail that users use to sign in.": "",
+	"The LDAP attribute that maps to the mail that users use to sign in.": "An tréith LDAP a mhapálann don ríomhphost a úsáideann úsáideoirí chun síniú isteach.",
 	"The LDAP attribute that maps to the username that users use to sign in.": "An tréith LDAP a mhapálann don ainm úsáideora a úsáideann úsáideoirí chun síniú isteach.",
 	"The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Tá an clár ceannairí i béite faoi láthair, agus d'fhéadfaimis na ríomhanna rátála a choigeartú de réir mar a dhéanfaimid an t-algartam a bheachtú.",
 	"The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "Uasmhéid an chomhaid i MB. Má sháraíonn méid an chomhaid an teorainn seo, ní uaslódófar an comhad.",
@@ -938,7 +943,7 @@
 	"This will delete all models including custom models and cannot be undone.": "Scriosfaidh sé seo gach samhail lena n-áirítear múnlaí saincheaptha agus ní féidir é a chealú.",
 	"This will reset the knowledge base and sync all files. Do you wish to continue?": "Déanfaidh sé seo an bonn eolais a athshocrú agus gach comhad a shioncronú. Ar mhaith leat leanúint ar aghaidh?",
 	"Thorough explanation": "Míniú críochnúil",
-	"Thought for {{DURATION}}": "",
+	"Thought for {{DURATION}}": "Smaoineamh ar {{DURATION}}",
 	"Tika": "Tika",
 	"Tika Server URL required.": "Teastaíonn URL Freastalaí Tika.",
 	"Tiktoken": "Tictoken",
@@ -975,7 +980,7 @@
 	"Tools": "Uirlisí",
 	"Tools Access": "Rochtain Uirlisí",
 	"Tools are a function calling system with arbitrary code execution": "Is córas glaonna feidhme iad uirlisí le forghníomhú cód treallach",
-	"Tools Function Calling Prompt": "",
+	"Tools Function Calling Prompt": "Leid Glaonna Feidhm Uirlisí",
 	"Tools have a function calling system that allows arbitrary code execution": "Tá córas glaonna feidhme ag uirlisí a cheadaíonn forghníomhú cód treallach",
 	"Tools have a function calling system that allows arbitrary code execution.": "Tá córas glaonna feidhme ag uirlisí a cheadaíonn forghníomhú cód treallach.",
 	"Top K": "Barr K",
@@ -1046,6 +1051,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 in Chat": "Cuardach Gréasáin i gComhrá",
 	"Web Search Query Generation": "Giniúint Iarratas Cuardach Gréasáin",
 	"Webhook URL": "URL Webhook",
 	"WebUI Settings": "Socruithe WebUI",
@@ -1064,7 +1070,7 @@
 	"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)": "Oibríonn sé le barr-k. Beidh téacs níos éagsúla mar thoradh ar luach níos airde (m.sh., 0.95), agus ginfidh luach níos ísle (m.sh., 0.5) téacs níos dírithe agus níos coimeádaí. (Réamhshocrú: 0.9)",
 	"Workspace": "Spás oibre",
 	"Workspace Permissions": "Ceadanna Spás Oibre",
-	"Write": "",
+	"Write": "Scríobh",
 	"Write a prompt suggestion (e.g. Who are you?)": "Scríobh moladh leid (m.sh. Cé hé tú?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Scríobh achoimre i 50 focal a dhéanann achoimre ar [ábhar nó eochairfhocal].",
 	"Write something...": "Scríobh rud...",
@@ -1074,8 +1080,8 @@
 	"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Ní féidir leat comhrá a dhéanamh ach le comhad {{maxCount}} ar a mhéad ag an am.",
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Is féidir leat do chuid idirghníomhaíochtaí le LLManna a phearsantú ach cuimhní cinn a chur leis tríd an gcnaipe 'Bainistigh' thíos, rud a fhágann go mbeidh siad níos cabhrach agus níos oiriúnaí duit.",
 	"You cannot upload an empty file.": "Ní féidir leat comhad folamh a uaslódáil.",
-	"You do not have permission to access this feature.": "",
-	"You do not have permission to upload files": "",
+	"You do not have permission to access this feature.": "Níl cead agat rochtain a fháil ar an ngné seo.",
+	"You do not have permission to upload files": "Níl cead agat comhaid a uaslódáil",
 	"You do not have permission to upload files.": "Níl cead agat comhaid a uaslódáil.",
 	"You have no archived conversations.": "Níl aon chomhráite cartlainne agat.",
 	"You have shared this chat": "Tá an comhrá seo roinnte agat",

+ 10 - 4
src/lib/i18n/locales/it-IT/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Hai già un account?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "un assistente",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Chiudi",
 	"Code execution": "",
 	"Code formatted successfully": "",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Collezione",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Predefinito",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "Predefinito (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Modello di default",
 	"Default model updated": "Modello predefinito aggiornato",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Inserisci la sovrapposizione chunk",
 	"Enter Chunk Size": "Inserisci la dimensione chunk",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Immettere l'URL grezzo di Github",
 	"Enter Google PSE API Key": "Inserisci la chiave API PSE di Google",
 	"Enter Google PSE Engine Id": "Inserisci l'ID motore PSE di Google",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Sperimentale",
 	"Explore the cosmos": "",
 	"Export": "Esportazione",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "Penalità di frequenza",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "",
 	"Function deleted successfully": "",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Generazione di immagini (sperimentale)",
 	"Image Generation Engine": "Motore di generazione immagini",
@@ -627,6 +630,7 @@
 	"More": "Altro",
 	"Name": "Nome",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Nuova chat",
 	"New Folder": "",
 	"New Password": "Nuova password",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Ultimi 30 giorni",
 	"Previous 7 days": "Ultimi 7 giorni",
 	"Profile Image": "Immagine del profilo",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (ad esempio Dimmi un fatto divertente sull'Impero Romano)",
 	"Prompt Content": "Contenuto del prompt",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Impostazioni del caricatore Web",
 	"Web Search": "Ricerca sul Web",
 	"Web Search Engine": "Motore di ricerca Web",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "URL webhook",
 	"WebUI Settings": "Impostazioni WebUI",

+ 10 - 4
src/lib/i18n/locales/ja-JP/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "すでにアカウントをお持ちですか?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "アシスタント",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "閉じる",
 	"Code execution": "",
 	"Code formatted successfully": "コードフォーマットに成功しました",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "コレクション",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "デフォルト",
 	"Default (Open AI)": "デフォルト(OpenAI)",
 	"Default (SentenceTransformers)": "デフォルト (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "デフォルトモデル",
 	"Default model updated": "デフォルトモデルが更新されました",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "チャンクオーバーラップを入力してください",
 	"Enter Chunk Size": "チャンクサイズを入力してください",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Github Raw URLを入力",
 	"Enter Google PSE API Key": "Google PSE APIキーの入力",
 	"Enter Google PSE Engine Id": "Google PSE エンジン ID を入力します。",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "実験的",
 	"Explore the cosmos": "",
 	"Export": "エクスポート",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "頻度ペナルティ",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "Functionの作成が成功しました。",
 	"Function deleted successfully": "Functionの削除が成功しました。",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "画像生成 (実験的)",
 	"Image Generation Engine": "画像生成エンジン",
@@ -627,6 +630,7 @@
 	"More": "もっと見る",
 	"Name": "名前",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "新しいチャット",
 	"New Folder": "",
 	"New Password": "新しいパスワード",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "前の30日間",
 	"Previous 7 days": "前の7日間",
 	"Profile Image": "プロフィール画像",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "プロンプト(例:ローマ帝国についての楽しい事を教えてください)",
 	"Prompt Content": "プロンプトの内容",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Web 読み込み設定",
 	"Web Search": "ウェブ検索",
 	"Web Search Engine": "ウェブ検索エンジン",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "WebUI 設定",

+ 10 - 4
src/lib/i18n/locales/ka-GE/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "უკვე გაქვს ანგარიში?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "ასისტენტი",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "დახურვა",
 	"Code execution": "",
 	"Code formatted successfully": "",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "ნაკრები",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "დეფოლტი",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "დეფოლტ (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "ნაგულისხმები მოდელი",
 	"Default model updated": "დეფოლტ მოდელი განახლებულია",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "შეიყვანეთ ნაწილის გადახურვა",
 	"Enter Chunk Size": "შეიყვანე ბლოკის ზომა",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "შეიყვანეთ Github Raw URL",
 	"Enter Google PSE API Key": "შეიყვანეთ Google PSE API გასაღები",
 	"Enter Google PSE Engine Id": "შეიყვანეთ Google PSE ძრავის ID",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "ექსპერიმენტალური",
 	"Explore the cosmos": "",
 	"Export": "ექსპორტი",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "სიხშირის ჯარიმა",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "",
 	"Function deleted successfully": "",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "სურათების გენერაცია (ექსპერიმენტული)",
 	"Image Generation Engine": "სურათის გენერაციის ძრავა",
@@ -627,6 +630,7 @@
 	"More": "ვრცლად",
 	"Name": "სახელი",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "ახალი მიმოწერა",
 	"New Folder": "",
 	"New Password": "ახალი პაროლი",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "უკან 30 დღე",
 	"Previous 7 days": "უკან 7 დღე",
 	"Profile Image": "პროფილის სურათი",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (მაგ. მითხარი სახალისო ფაქტი რომის იმპერიის შესახებ)",
 	"Prompt Content": "მოთხოვნის შინაარსი",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "ვების ჩატარების პარამეტრები",
 	"Web Search": "ვებ ძებნა",
 	"Web Search Engine": "ვებ საძიებო სისტემა",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "WebUI პარამეტრები",

+ 10 - 4
src/lib/i18n/locales/ko-KR/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "이미 계정이 있으신가요?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "놀라움",
 	"an assistant": "어시스턴트",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "닫기",
 	"Code execution": "코드 실행",
 	"Code formatted successfully": "성공적으로 코드가 생성되었습니다",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "컬렉션",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "기본값",
 	"Default (Open AI)": "기본값 (Open AI)",
 	"Default (SentenceTransformers)": "기본값 (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "기본 모델",
 	"Default model updated": "기본 모델이 업데이트되었습니다.",
 	"Default Models": "기본 모델",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "청크 오버랩 입력",
 	"Enter Chunk Size": "청크 크기 입력",
 	"Enter description": "설명 입력",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Github Raw URL 입력",
 	"Enter Google PSE API Key": "Google PSE API 키 입력",
 	"Enter Google PSE Engine Id": "Google PSE 엔진 ID 입력",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "평가",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "미포함",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "실험적",
 	"Explore the cosmos": "",
 	"Export": "내보내기",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "변수를 다음과 같이 괄호를 사용하여 생성하세요",
 	"Frequency Penalty": "빈도 페널티",
 	"Function": "함수",
+	"Function Calling": "",
 	"Function created successfully": "성공적으로 함수가 생성되었습니다",
 	"Function deleted successfully": "성공적으로 함수가 삭제되었습니다",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "이미지",
 	"Image Compression": "이미지 압축",
-	"Image generation": "이미지 생성",
 	"Image Generation": "이미지 생성",
 	"Image Generation (Experimental)": "이미지 생성(실험적)",
 	"Image Generation Engine": "이미지 생성 엔진",
@@ -627,6 +630,7 @@
 	"More": "더보기",
 	"Name": "이름",
 	"Name your knowledge base": "지식 기반 이름을 지정하세요",
+	"Native": "",
 	"New Chat": "새 채팅",
 	"New Folder": "",
 	"New Password": "새 비밀번호",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "이전 30일",
 	"Previous 7 days": "이전 7일",
 	"Profile Image": "프로필 이미지",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "프롬프트 (예: 로마 황제에 대해 재미있는 사실을 알려주세요)",
 	"Prompt Content": "프롬프트 내용",
 	"Prompt created successfully": "성공적으로 프롬프트를 생성했습니다",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "웹 로더 설정",
 	"Web Search": "웹 검색",
 	"Web Search Engine": "웹 검색 엔진",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "웹훅 URL",
 	"WebUI Settings": "WebUI 설정",

+ 10 - 4
src/lib/i18n/locales/lt-LT/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Ar jau turite paskyrą?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "assistentas",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Uždaryti",
 	"Code execution": "",
 	"Code formatted successfully": "Kodas suformatuotas sėkmingai",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Kolekcija",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Numatytasis",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "Numatytasis (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Numatytasis modelis",
 	"Default model updated": "Numatytasis modelis atnaujintas",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Įveskite blokų persidengimą",
 	"Enter Chunk Size": "Įveskite blokų dydį",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Įveskite GitHub Raw nuorodą",
 	"Enter Google PSE API Key": "Įveskite Google PSE API raktą",
 	"Enter Google PSE Engine Id": "Įveskite Google PSE variklio ID",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Eksperimentinis",
 	"Explore the cosmos": "",
 	"Export": "Eksportuoti",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "Dažnumo bauda",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "Funkcija sukurta sėkmingai",
 	"Function deleted successfully": "Funkcija ištrinta sėkmingai",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Vaizdų generavimas (eksperimentinis)",
 	"Image Generation Engine": "Vaizdų generavimo variklis",
@@ -627,6 +630,7 @@
 	"More": "Daugiau",
 	"Name": "Pavadinimas",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Naujas pokalbis",
 	"New Folder": "",
 	"New Password": "Naujas slaptažodis",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Paskutinės 30 dienų",
 	"Previous 7 days": "Paskutinės 7 dienos",
 	"Profile Image": "Profilio nuotrauka",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Užklausa (pvz. supaprastink šį laišką)",
 	"Prompt Content": "Užklausos turinys",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Web krovimo nustatymai",
 	"Web Search": "Web paieška",
 	"Web Search Engine": "Web paieškos variklis",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook nuoroda",
 	"WebUI Settings": "WebUI parametrai",

+ 10 - 4
src/lib/i18n/locales/ms-MY/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Telah mempunyai akaun?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "seorang pembantu",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Tutup",
 	"Code execution": "",
 	"Code formatted successfully": "Kod berjaya diformatkan",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Koleksi",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Lalai",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "Lalai (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Model Lalai",
 	"Default model updated": "Model lalai dikemas kini",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Masukkan Tindihan 'Chunk'",
 	"Enter Chunk Size": "Masukkan Saiz 'Chunk'",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Masukkan URL 'Github Raw'",
 	"Enter Google PSE API Key": "Masukkan kunci API Google PSE",
 	"Enter Google PSE Engine Id": "Masukkan Id Enjin Google PSE",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Percubaan",
 	"Explore the cosmos": "",
 	"Export": "Eksport",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "Penalti Kekerapan",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "Fungsi berjaya dibuat",
 	"Function deleted successfully": "Fungsi berjaya dipadamkan",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Penjanaan Imej (Percubaan)",
 	"Image Generation Engine": "Enjin Penjanaan Imej",
@@ -627,6 +630,7 @@
 	"More": "Lagi",
 	"Name": "Nama",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Perbualan Baru",
 	"New Folder": "",
 	"New Password": "Kata Laluan Baru",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "30 hari sebelumnya",
 	"Previous 7 days": "7 hari sebelumnya",
 	"Profile Image": "Imej Profail",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Gesaan (cth Beritahu saya fakta yang menyeronokkan tentang Kesultanan Melaka)",
 	"Prompt Content": "Kandungan Gesaan",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Tetapan Pemuat Web",
 	"Web Search": "Carian Web",
 	"Web Search Engine": "Enjin Carian Web",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "URL 'Webhook'",
 	"WebUI Settings": "Tetapan WebUI",

+ 10 - 4
src/lib/i18n/locales/nb-NO/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Har du allerede en konto?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Alternativ til top_p, og har som mål å sikre en balanse mellom kvalitet og variasjon. Parameteren p representerer minimumssannsynligheten for at et token skal vurderes, i forhold til sannsynligheten for det mest sannsynlige tokenet. Hvis p for eksempel er 0,05 og det mest sannsynlige tokenet har en sannsynlighet på 0,9, filtreres logits med en verdi på mindre enn 0,045 bort. (Standard: 0,0)",
+	"Always": "",
 	"Amazing": "Flott",
 	"an assistant": "en assistent",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Lukk",
 	"Code execution": "Kodekjøring",
 	"Code formatted successfully": "Koden er formatert",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Samling",
 	"Color": "Farge",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Standard",
 	"Default (Open AI)": "Standard (Open AI)",
 	"Default (SentenceTransformers)": "Standard (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Standard modell",
 	"Default model updated": "Standard modell oppdatert",
 	"Default Models": "Standard modeller",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Angi Chunk-overlapp",
 	"Enter Chunk Size": "Angi Chunk-størrelse",
 	"Enter description": "Angi beskrivelse",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Angi Github Raw-URL",
 	"Enter Google PSE API Key": "Angi API-nøkkel for Google PSE",
 	"Enter Google PSE Engine Id": "Angi motor-ID for Google PSE",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "Vurderinger",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Eksempel: (&(objectClass=inetOrgPerson)(uid=%s))",
 	"Example: ALL": "Eksempel: ALL",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "Eksempel: ou=users,dc=foo,dc=example",
 	"Example: sAMAccountName or uid or userPrincipalName": "Eksempel: sAMAccountName eller uid eller userPrincipalName",
 	"Exclude": "Utelukk",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Eksperimentell",
 	"Explore the cosmos": "Utforsk verdensrommet",
 	"Export": "Eksporter",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "Formatér variablene dine med klammer som disse:",
 	"Frequency Penalty": "Frekvensstraff",
 	"Function": "Funksjon",
+	"Function Calling": "",
 	"Function created successfully": "Funksjonen er opprettet",
 	"Function deleted successfully": "Funksjonen er slettet",
 	"Function Description": "Beskrivelse av funksjon",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "Vekk nysgjerrigheten",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Bildegenerering (eksperimentell)",
 	"Image Generation Engine": "Bildegenereringsmotor",
@@ -627,6 +630,7 @@
 	"More": "Mer",
 	"Name": "Navn",
 	"Name your knowledge base": "Gi kunnskapsbasen et navn",
+	"Native": "",
 	"New Chat": "Ny chat",
 	"New Folder": "",
 	"New Password": "Nytt passord",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Siste 30 dager",
 	"Previous 7 days": "Siste 7 dager",
 	"Profile Image": "Profilbilde",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Ledetekst (f.eks. Fortell meg noe morsomt om romerriket)",
 	"Prompt Content": "Ledetekstinnhold",
 	"Prompt created successfully": "Ledetekst opprettet",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Web-lasterinnstillinger",
 	"Web Search": "Nettsøk",
 	"Web Search Engine": "Nettsøkmotor",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "Innstillinger for WebUI",

+ 10 - 4
src/lib/i18n/locales/nl-NL/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Heb je al een 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)": "Alternatief voor de top_p, en streeft naar een evenwicht tussen kwaliteit en variatie. De parameter p vertegenwoordigt de minimumwaarschijnlijkheid dat een token in aanmerking wordt genomen, in verhouding tot de waarschijnlijkheid van het meest waarschijnlijke token. Bijvoorbeeld, met p=0.05 en de meest waarschijnlijke token met een waarschijnlijkheid van 0.9, worden logits met een waarde kleiner dan 0.045 uitgefilterd. (Standaard: 0,0)",
+	"Always": "",
 	"Amazing": "Geweldig",
 	"an assistant": "een assistent",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Sluiten",
 	"Code execution": "Code uitvoeren",
 	"Code formatted successfully": "Code succesvol geformateerd",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Verzameling",
 	"Color": "Kleur",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Standaard",
 	"Default (Open AI)": "Standaard (Open AI)",
 	"Default (SentenceTransformers)": "Standaard (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Standaardmodel",
 	"Default model updated": "Standaardmodel bijgewerkt",
 	"Default Models": "Standaardmodellen",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Voeg Chunk Overlap toe",
 	"Enter Chunk Size": "Voeg Chunk Size toe",
 	"Enter description": "Voer beschrijving in",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Voer de Github Raw-URL in",
 	"Enter Google PSE API Key": "Voer de Google PSE API-sleutel in",
 	"Enter Google PSE Engine Id": "Voer Google PSE Engine-ID in",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "Beoordelingen",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Voorbeeld: (&(objectClass=inetOrgPerson)(uid=%s))",
 	"Example: ALL": "Voorbeeld: ALL",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "Voorbeeld: ou=users,dc=foo,dc=example",
 	"Example: sAMAccountName or uid or userPrincipalName": "Voorbeeld: sAMAccountName or uid or userPrincipalName",
 	"Exclude": "Sluit uit",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Experimenteel",
 	"Explore the cosmos": "Ontdek de kosmos",
 	"Export": "Exporteren",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "Formateer je variabelen met haken zoals dit:",
 	"Frequency Penalty": "Frequentiestraf",
 	"Function": "Functie",
+	"Function Calling": "",
 	"Function created successfully": "Functie succesvol aangemaakt",
 	"Function deleted successfully": "Functie succesvol verwijderd",
 	"Function Description": "Functiebeschrijving",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "Wakker nieuwsgierigheid aan",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Afbeeldingsgeneratie (Experimenteel)",
 	"Image Generation Engine": "Afbeeldingsgeneratie Engine",
@@ -627,6 +630,7 @@
 	"More": "Meer",
 	"Name": "Naam",
 	"Name your knowledge base": "Geef je kennisbasis een naam",
+	"Native": "",
 	"New Chat": "Nieuwe Chat",
 	"New Folder": "",
 	"New Password": "Nieuw Wachtwoord",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Afgelopen 30 dagen",
 	"Previous 7 days": "Afgelopen 7 dagen",
 	"Profile Image": "Profielafbeelding",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (bv. Vertel me een leuke gebeurtenis over het Romeinse Rijk)",
 	"Prompt Content": "Promptinhoud",
 	"Prompt created successfully": "Prompt succesvol aangemaakt",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Web Loader instellingen",
 	"Web Search": "Zoeken op het web",
 	"Web Search Engine": "Zoekmachine op het web",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "WebUI Instellingen",

+ 10 - 4
src/lib/i18n/locales/pa-IN/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "ਪਹਿਲਾਂ ਹੀ ਖਾਤਾ ਹੈ?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "ਇੱਕ ਸਹਾਇਕ",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "ਬੰਦ ਕਰੋ",
 	"Code execution": "",
 	"Code formatted successfully": "",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "ਸੰਗ੍ਰਹਿ",
 	"Color": "",
 	"ComfyUI": "ਕੰਫੀਯੂਆਈ",
@@ -238,6 +238,7 @@
 	"Default": "ਮੂਲ",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "ਮੂਲ (ਸੈਂਟੈਂਸਟ੍ਰਾਂਸਫਾਰਮਰਸ)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "ਡਿਫਾਲਟ ਮਾਡਲ",
 	"Default model updated": "ਮੂਲ ਮਾਡਲ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "ਚੰਕ ਓਵਰਲੈਪ ਦਰਜ ਕਰੋ",
 	"Enter Chunk Size": "ਚੰਕ ਆਕਾਰ ਦਰਜ ਕਰੋ",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Github ਕੱਚਾ URL ਦਾਖਲ ਕਰੋ",
 	"Enter Google PSE API Key": "Google PSE API ਕੁੰਜੀ ਦਾਖਲ ਕਰੋ",
 	"Enter Google PSE Engine Id": "Google PSE ਇੰਜਣ ID ਦਾਖਲ ਕਰੋ",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "ਪਰਮਾਣੂਕ੍ਰਿਤ",
 	"Explore the cosmos": "",
 	"Export": "ਨਿਰਯਾਤ",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "ਬਾਰੰਬਾਰਤਾ ਜੁਰਮਾਨਾ",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "",
 	"Function deleted successfully": "",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "ਚਿੱਤਰ ਜਨਰੇਸ਼ਨ (ਪਰਮਾਣੂਕ੍ਰਿਤ)",
 	"Image Generation Engine": "ਚਿੱਤਰ ਜਨਰੇਸ਼ਨ ਇੰਜਣ",
@@ -627,6 +630,7 @@
 	"More": "ਹੋਰ",
 	"Name": "ਨਾਮ",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "ਨਵੀਂ ਗੱਲਬਾਤ",
 	"New Folder": "",
 	"New Password": "ਨਵਾਂ ਪਾਸਵਰਡ",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "ਪਿਛਲੇ 30 ਦਿਨ",
 	"Previous 7 days": "ਪਿਛਲੇ 7 ਦਿਨ",
 	"Profile Image": "ਪ੍ਰੋਫਾਈਲ ਚਿੱਤਰ",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "ਪ੍ਰੰਪਟ (ਉਦਾਹਰਣ ਲਈ ਮੈਨੂੰ ਰੋਮਨ ਸਾਮਰਾਜ ਬਾਰੇ ਇੱਕ ਮਜ਼ੇਦਾਰ ਤੱਥ ਦੱਸੋ)",
 	"Prompt Content": "ਪ੍ਰੰਪਟ ਸਮੱਗਰੀ",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "ਵੈਬ ਲੋਡਰ ਸੈਟਿੰਗਾਂ",
 	"Web Search": "ਵੈੱਬ ਖੋਜ",
 	"Web Search Engine": "ਵੈੱਬ ਖੋਜ ਇੰਜਣ",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "ਵੈਬਹੁੱਕ URL",
 	"WebUI Settings": "ਵੈਬਯੂਆਈ ਸੈਟਿੰਗਾਂ",

+ 10 - 4
src/lib/i18n/locales/pl-PL/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Masz już konto?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "asystent",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Zamknij",
 	"Code execution": "",
 	"Code formatted successfully": "",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Kolekcja",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Domyślny",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "Domyślny (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Model domyślny",
 	"Default model updated": "Domyślny model zaktualizowany",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Wprowadź zakchodzenie bloku",
 	"Enter Chunk Size": "Wprowadź rozmiar bloku",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Wprowadź nieprzetworzony adres URL usługi Github",
 	"Enter Google PSE API Key": "Wprowadź klucz API Google PSE",
 	"Enter Google PSE Engine Id": "Wprowadź identyfikator aparatu Google PSE",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Eksperymentalne",
 	"Explore the cosmos": "",
 	"Export": "Eksport",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "Kara za częstotliwość",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "",
 	"Function deleted successfully": "",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Generowanie obrazu (eksperymentalne)",
 	"Image Generation Engine": "Silnik generowania obrazu",
@@ -627,6 +630,7 @@
 	"More": "Więcej",
 	"Name": "Nazwa",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Nowy czat",
 	"New Folder": "",
 	"New Password": "Nowe hasło",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Poprzednie 30 dni",
 	"Previous 7 days": "Poprzednie 7 dni",
 	"Profile Image": "Obrazek profilowy",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (np. powiedz mi zabawny fakt o Imperium Rzymskim",
 	"Prompt Content": "Zawartość prompta",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Ustawienia pobierania z sieci",
 	"Web Search": "Wyszukiwarka w Internecie",
 	"Web Search Engine": "Wyszukiwarka internetowa",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "URL webhook",
 	"WebUI Settings": "Ustawienia interfejsu WebUI",

+ 10 - 4
src/lib/i18n/locales/pt-BR/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Já tem uma conta?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Alternativa ao 'top_p', e visa garantir um equilíbrio entre qualidade e variedade. O parâmetro 'p' representa a probabilidade mínima para que um token seja considerado, em relação à probabilidade do token mais provável. Por exemplo, com 'p=0.05' e o token mais provável com probabilidade de '0.9', as predições com valor inferior a '0.045' são filtrados. (Default: 0.0)",
+	"Always": "",
 	"Amazing": "Incrível",
 	"an assistant": "um assistente",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Fechar",
 	"Code execution": "Execução de código",
 	"Code formatted successfully": "Código formatado com sucesso",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Coleção",
 	"Color": "Cor",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Padrão",
 	"Default (Open AI)": "Padrão (Open AI)",
 	"Default (SentenceTransformers)": "Padrão (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Modelo Padrão",
 	"Default model updated": "Modelo padrão atualizado",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Digite a Sobreposição de Chunk",
 	"Enter Chunk Size": "Digite o Tamanho do Chunk",
 	"Enter description": "Digite a descrição",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Digite a URL bruta do Github",
 	"Enter Google PSE API Key": "Digite a Chave API do Google PSE",
 	"Enter Google PSE Engine Id": "Digite o ID do Motor do Google PSE",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "Avaliações",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Exemplo: (&(objectClass=inetOrgPerson)(uid=%s))",
 	"Example: ALL": "Exemplo: ALL",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "Exemplo: ou=users,dc=foo,dc=example",
 	"Example: sAMAccountName or uid or userPrincipalName": "Exemplo: sAMAccountName ou uid ou userPrincipalName",
 	"Exclude": "Excluir",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Experimental",
 	"Explore the cosmos": "Explorar o cosmos",
 	"Export": "Exportar",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "Formate suas variáveis usando colchetes como este:",
 	"Frequency Penalty": "Penalização por Frequência",
 	"Function": "Função",
+	"Function Calling": "",
 	"Function created successfully": "Função criada com sucesso",
 	"Function deleted successfully": "Função excluída com sucesso",
 	"Function Description": "Descrição da Função",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "Desperte a curiosidade",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Geração de Imagem (Experimental)",
 	"Image Generation Engine": "Motor de Geração de Imagem",
@@ -627,6 +630,7 @@
 	"More": "Mais",
 	"Name": "Nome",
 	"Name your knowledge base": "Nome da sua base de conhecimento",
+	"Native": "",
 	"New Chat": "Novo Chat",
 	"New Folder": "",
 	"New Password": "Nova Senha",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Últimos 30 dias",
 	"Previous 7 days": "Últimos 7 dias",
 	"Profile Image": "Imagem de Perfil",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (por exemplo, Diga-me um fato divertido sobre o Império Romano)",
 	"Prompt Content": "Conteúdo do Prompt",
 	"Prompt created successfully": "Prompt criado com sucesso",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Configurações do Carregador Web",
 	"Web Search": "Pesquisa na Web",
 	"Web Search Engine": "Mecanismo de Busca na Web",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "URL do Webhook",
 	"WebUI Settings": "Configurações da WebUI",

+ 10 - 4
src/lib/i18n/locales/pt-PT/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Já tem uma conta?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "um assistente",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Fechar",
 	"Code execution": "",
 	"Code formatted successfully": "",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Coleção",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Padrão",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "Padrão (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Modelo padrão",
 	"Default model updated": "Modelo padrão atualizado",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Escreva a Sobreposição de Fragmento",
 	"Enter Chunk Size": "Escreva o Tamanho do Fragmento",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Escreva o URL cru do Github",
 	"Enter Google PSE API Key": "Escreva a chave da API PSE do Google",
 	"Enter Google PSE Engine Id": "Escreva o ID do mecanismo PSE do Google",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Experimental",
 	"Explore the cosmos": "",
 	"Export": "Exportar",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "Penalidade de Frequência",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "",
 	"Function deleted successfully": "",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Geração de Imagens (Experimental)",
 	"Image Generation Engine": "Mecanismo de Geração de Imagens",
@@ -627,6 +630,7 @@
 	"More": "Mais",
 	"Name": "Nome",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Nova Conversa",
 	"New Folder": "",
 	"New Password": "Nova Senha",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Últimos 30 dias",
 	"Previous 7 days": "Últimos 7 dias",
 	"Profile Image": "Imagem de Perfil",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (ex.: Dê-me um facto divertido sobre o Império Romano)",
 	"Prompt Content": "Conteúdo do Prompt",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Configurações do Carregador da Web",
 	"Web Search": "Pesquisa na Web",
 	"Web Search Engine": "Motor de Pesquisa Web",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "URL do Webhook",
 	"WebUI Settings": "Configurações WebUI",

+ 10 - 4
src/lib/i18n/locales/ro-RO/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Deja ai un cont?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "un asistent",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Închide",
 	"Code execution": "Executarea codului",
 	"Code formatted successfully": "Cod formatat cu succes",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Colecție",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Implicit",
 	"Default (Open AI)": "Implicit (Open AI)",
 	"Default (SentenceTransformers)": "Implicit (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Model Implicit",
 	"Default model updated": "Modelul implicit a fost actualizat",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Introduceți Suprapunerea Blocului",
 	"Enter Chunk Size": "Introduceți Dimensiunea Blocului",
 	"Enter description": "Introduceți descrierea",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Introduceți URL-ul Raw de pe Github",
 	"Enter Google PSE API Key": "Introduceți Cheia API Google PSE",
 	"Enter Google PSE Engine Id": "Introduceți ID-ul Motorului Google PSE",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "Evaluări",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "Exclude",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Experimental",
 	"Explore the cosmos": "",
 	"Export": "Exportă",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "Formatează variabilele folosind acolade așa:",
 	"Frequency Penalty": "Penalizare de Frecvență",
 	"Function": "Funcție",
+	"Function Calling": "",
 	"Function created successfully": "Funcția a fost creată cu succes",
 	"Function deleted successfully": "Funcția a fost ștearsă cu succes",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Generare Imagine (Experimental)",
 	"Image Generation Engine": "Motor de Generare a Imaginilor",
@@ -627,6 +630,7 @@
 	"More": "Mai multe",
 	"Name": "Nume",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Conversație Nouă",
 	"New Folder": "",
 	"New Password": "Parolă Nouă",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Ultimele 30 de zile",
 	"Previous 7 days": "Ultimele 7 zile",
 	"Profile Image": "Imagine de Profil",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (de ex. Spune-mi un fapt amuzant despre Imperiul Roman)",
 	"Prompt Content": "Conținut Prompt",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Setări Încărcător Web",
 	"Web Search": "Căutare Web",
 	"Web Search Engine": "Motor de Căutare Web",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "URL Webhook",
 	"WebUI Settings": "Setări WebUI",

+ 10 - 4
src/lib/i18n/locales/ru-RU/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "У вас уже есть учетная запись?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "Удивительный",
 	"an assistant": "ассистент",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Закрыть",
 	"Code execution": "Выполнение кода",
 	"Code formatted successfully": "Код успешно отформатирован",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Коллекция",
 	"Color": "Цвет",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "По умолчанию",
 	"Default (Open AI)": "По умолчанию (Open AI)",
 	"Default (SentenceTransformers)": "По умолчанию (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Модель по умолчанию",
 	"Default model updated": "Модель по умолчанию обновлена",
 	"Default Models": "Модели по умолчанию",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Введите перекрытие фрагмента",
 	"Enter Chunk Size": "Введите размер фрагмента",
 	"Enter description": "Введите описание",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Введите необработанный URL-адрес Github",
 	"Enter Google PSE API Key": "Введите ключ API Google PSE",
 	"Enter Google PSE Engine Id": "Введите Id движка Google PSE",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "Оценки",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "Исключать",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Экспериментальное",
 	"Explore the cosmos": "Исследуйте космос",
 	"Export": "Экспорт",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "Отформатируйте переменные, используя такие : скобки",
 	"Frequency Penalty": "Штраф за частоту",
 	"Function": "Функция",
+	"Function Calling": "",
 	"Function created successfully": "Функция успешно создана",
 	"Function deleted successfully": "Функция успешно удалена",
 	"Function Description": "Описание Функции",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "Разожгите любопытство",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Генерация изображений (Экспериментально)",
 	"Image Generation Engine": "Механизм генерации изображений",
@@ -627,6 +630,7 @@
 	"More": "Больше",
 	"Name": "Имя",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Новый чат",
 	"New Folder": "",
 	"New Password": "Новый пароль",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Предыдущие 30 дней",
 	"Previous 7 days": "Предыдущие 7 дней",
 	"Profile Image": "Изображение профиля",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Промпт (например, Расскажи мне интересный факт о Римской империи)",
 	"Prompt Content": "Содержание промпта",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Настройки веб-загрузчика",
 	"Web Search": "Веб-поиск",
 	"Web Search Engine": "Поисковая система",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "Генерация запросов веб-поиска",
 	"Webhook URL": "URL-адрес веб-хука",
 	"WebUI Settings": "Настройки WebUI",

+ 10 - 4
src/lib/i18n/locales/sk-SK/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Už máte účet?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "asistent",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Zavrieť",
 	"Code execution": "Vykonávanie kódu",
 	"Code formatted successfully": "Kód bol úspešne naformátovaný.",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "",
 	"Color": "Farba",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Predvolené hodnoty alebo nastavenia.",
 	"Default (Open AI)": "Predvolené (Open AI)",
 	"Default (SentenceTransformers)": "Predvolené (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Predvolený model",
 	"Default model updated": "Predvolený model aktualizovaný.",
 	"Default Models": "Predvolené modely",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Zadajte prekryv časti",
 	"Enter Chunk Size": "Zadajte veľkosť časti",
 	"Enter description": "Zadajte popis",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Zadajte URL adresu Github Raw",
 	"Enter Google PSE API Key": "Zadajte kľúč rozhrania API Google PSE",
 	"Enter Google PSE Engine Id": "Zadajte ID vyhľadávacieho mechanizmu Google PSE",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "Hodnotenia",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "Vylúčiť",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Experimentálne",
 	"Explore the cosmos": "",
 	"Export": "Exportovať",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "Formátujte svoje premenné pomocou zátvoriek takto:",
 	"Frequency Penalty": "Penalizácia frekvencie",
 	"Function": "Funkcia",
+	"Function Calling": "",
 	"Function created successfully": "Funkcia bola úspešne vytvorená.",
 	"Function deleted successfully": "Funkcia bola úspešne odstránená",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Generovanie obrázkov (experimentálne)",
 	"Image Generation Engine": "Engine na generovanie obrázkov",
@@ -627,6 +630,7 @@
 	"More": "Viac",
 	"Name": "Meno",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Nový chat",
 	"New Folder": "",
 	"New Password": "Nové heslo",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Predchádzajúcich 30 dní",
 	"Previous 7 days": "Predchádzajúcich 7 dní",
 	"Profile Image": "Profilový obrázok",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (napr. Povedz mi zábavnú skutočnosť o Rímskej ríši)",
 	"Prompt Content": "Obsah promptu",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Nastavenia Web Loaderu",
 	"Web Search": "Vyhľadávanie na webe",
 	"Web Search Engine": "Webový vyhľadávač",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "Nastavenia WebUI",

+ 10 - 4
src/lib/i18n/locales/sr-RS/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Већ имате налог?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "Невероватно",
 	"an assistant": "помоћник",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Затвори",
 	"Code execution": "Извршавање кода",
 	"Code formatted successfully": "Код форматиран успешно",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Колекција",
 	"Color": "Боја",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Подразумевано",
 	"Default (Open AI)": "Подразумевано (Open AI)",
 	"Default (SentenceTransformers)": "Подразумевано (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Подразумевани модел",
 	"Default model updated": "Подразумевани модел ажуриран",
 	"Default Models": "Подразумевани модели",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Унесите преклапање делова",
 	"Enter Chunk Size": "Унесите величину дела",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Унесите Гитхуб Раw УРЛ адресу",
 	"Enter Google PSE API Key": "Унесите Гоогле ПСЕ АПИ кључ",
 	"Enter Google PSE Engine Id": "Унесите Гоогле ПСЕ ИД машине",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "Процењивања",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Експериментално",
 	"Explore the cosmos": "",
 	"Export": "Извоз",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "Фреквентна казна",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "",
 	"Function deleted successfully": "",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "Покрени знатижељу",
 	"Image": "Слика",
 	"Image Compression": "Компресија слике",
-	"Image generation": "Стварање слике",
 	"Image Generation": "Стварање слике",
 	"Image Generation (Experimental)": "Стварање слика (експериментално)",
 	"Image Generation Engine": "Мотор за стварање слика",
@@ -627,6 +630,7 @@
 	"More": "Више",
 	"Name": "Име",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Ново ћаскање",
 	"New Folder": "",
 	"New Password": "Нова лозинка",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Претходних 30 дана",
 	"Previous 7 days": "Претходних 7 дана",
 	"Profile Image": "Слика профила",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Упит (нпр. „подели занимљивост о Римском царству“)",
 	"Prompt Content": "Садржај упита",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Подешавања веб учитавача",
 	"Web Search": "Веб претрага",
 	"Web Search Engine": "Веб претраживач",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "Адреса веб-куке",
 	"WebUI Settings": "Подешавања веб интерфејса",

+ 10 - 4
src/lib/i18n/locales/sv-SE/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Har du redan ett konto?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "en assistent",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Stäng",
 	"Code execution": "",
 	"Code formatted successfully": "",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Samling",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Standard",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "Standard (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Standardmodell",
 	"Default model updated": "Standardmodell uppdaterad",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Ange chunköverlappning",
 	"Enter Chunk Size": "Ange chunkstorlek",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Ange Github Raw URL",
 	"Enter Google PSE API Key": "Ange Google PSE API-nyckel",
 	"Enter Google PSE Engine Id": "Ange Google PSE Engine Id",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Experimentell",
 	"Explore the cosmos": "",
 	"Export": "Export",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "Straff för frekvens",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "",
 	"Function deleted successfully": "",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Bildgenerering (experimentell)",
 	"Image Generation Engine": "Bildgenereringsmotor",
@@ -627,6 +630,7 @@
 	"More": "Mer",
 	"Name": "Namn",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Ny chatt",
 	"New Folder": "",
 	"New Password": "Nytt lösenord",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Föregående 30 dagar",
 	"Previous 7 days": "Föregående 7 dagar",
 	"Profile Image": "Profilbild",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Instruktion (t.ex. Berätta en kuriosa om Romerska Imperiet)",
 	"Prompt Content": "Instruktionens innehåll",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Web Loader-inställningar",
 	"Web Search": "Webbsökning",
 	"Web Search Engine": "Webbsökmotor",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook-URL",
 	"WebUI Settings": "WebUI-inställningar",

+ 10 - 4
src/lib/i18n/locales/th-TH/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "มีบัญชีอยู่แล้ว?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "ผู้ช่วย",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "ปิด",
 	"Code execution": "",
 	"Code formatted successfully": "จัดรูปแบบโค้ดสำเร็จแล้ว",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "คอลเลคชัน",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "ค่าเริ่มต้น",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "ค่าเริ่มต้น (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "โมเดลค่าเริ่มต้น",
 	"Default model updated": "อัปเดตโมเดลค่าเริ่มต้นแล้ว",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "ใส่การทับซ้อนส่วนข้อมูล",
 	"Enter Chunk Size": "ใส่ขนาดส่วนข้อมูล",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "ใส่ URL ดิบของ Github",
 	"Enter Google PSE API Key": "ใส่คีย์ API ของ Google PSE",
 	"Enter Google PSE Engine Id": "ใส่รหัสเครื่องยนต์ของ Google PSE",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "การทดลอง",
 	"Explore the cosmos": "",
 	"Export": "ส่งออก",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "การลงโทษความถี่",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "สร้างฟังก์ชันสำเร็จ",
 	"Function deleted successfully": "ลบฟังก์ชันสำเร็จ",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "การสร้างภาพ (การทดลอง)",
 	"Image Generation Engine": "เครื่องยนต์การสร้างภาพ",
@@ -627,6 +630,7 @@
 	"More": "เพิ่มเติม",
 	"Name": "ชื่อ",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "แชทใหม่",
 	"New Folder": "",
 	"New Password": "รหัสผ่านใหม่",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "30 วันที่ผ่านมา",
 	"Previous 7 days": "7 วันที่ผ่านมา",
 	"Profile Image": "รูปโปรไฟล์",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "พรอมต์ (เช่น บอกข้อเท็จจริงที่น่าสนุกเกี่ยวกับจักรวรรดิโรมัน)",
 	"Prompt Content": "เนื้อหาพรอมต์",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "การตั้งค่าเว็บโหลดเดอร์",
 	"Web Search": "การค้นหาเว็บ",
 	"Web Search Engine": "เครื่องมือค้นหาเว็บ",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "URL ของ Webhook",
 	"WebUI Settings": "การตั้งค่า WebUI",

+ 10 - 4
src/lib/i18n/locales/tk-TW/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "",
 	"Code execution": "",
 	"Code formatted successfully": "",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "",
 	"Color": "",
 	"ComfyUI": "",
@@ -238,6 +238,7 @@
 	"Default": "",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "",
 	"Default model updated": "",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "",
 	"Enter Chunk Size": "",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "",
 	"Enter Google PSE API Key": "",
 	"Enter Google PSE Engine Id": "",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "",
 	"Explore the cosmos": "",
 	"Export": "",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "",
 	"Function deleted successfully": "",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "",
 	"Image Generation Engine": "",
@@ -627,6 +630,7 @@
 	"More": "",
 	"Name": "",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "",
 	"New Folder": "",
 	"New Password": "",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "",
 	"Previous 7 days": "",
 	"Profile Image": "",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "",
 	"Prompt Content": "",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "",
 	"Web Search": "",
 	"Web Search Engine": "",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "",
 	"WebUI Settings": "",

+ 10 - 4
src/lib/i18n/locales/tr-TR/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "İzin Verilen Uç Noktalar",
 	"Already have an account?": "Zaten bir hesabınız mı var?",
 	"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'ye bir alternatif ve kalite ile çeşitlilik arasında bir denge sağlamayı amaçlar. p parametresi, en olası tokenin olasılığına göre, bir tokenin dikkate alınması için minimum olasılığı temsil eder. Örneğin, p=0.05 ve en olası tokenin 0.9 olasılığı ile 0.045'ten küçük bir değere sahip logitler filtrelenir. (Varsayılan: 0.0)",
+	"Always": "",
 	"Amazing": "Harika",
 	"an assistant": "bir asistan",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Kapat",
 	"Code execution": "Kod yürütme",
 	"Code formatted successfully": "Kod başarıyla biçimlendirildi",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Koleksiyon",
 	"Color": "Renk",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Varsayılan",
 	"Default (Open AI)": "Varsayılan (Open AI)",
 	"Default (SentenceTransformers)": "Varsayılan (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Varsayılan Model",
 	"Default model updated": "Varsayılan model güncellendi",
 	"Default Models": "Varsayılan Modeller",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Chunk Örtüşmesini Girin",
 	"Enter Chunk Size": "Chunk Boyutunu Girin",
 	"Enter description": "Açıklama girin",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Github Raw URL'sini girin",
 	"Enter Google PSE API Key": "Google PSE API Anahtarını Girin",
 	"Enter Google PSE Engine Id": "Google PSE Engine Id'sini Girin",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "Google Drive'a erişim hatası: {{error}}",
 	"Error uploading file: {{error}}": "Dosya yüklenirken hata oluştu: {{error}}",
 	"Evaluations": "Değerlendirmeler",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Örnek: (&(objectClass=inetOrgPerson)(uid=%s))",
 	"Example: ALL": "Örnek: ALL",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "Örnek: ou=users,dc=foo,dc=example",
 	"Example: sAMAccountName or uid or userPrincipalName": "Örnek: sAMAccountName or uid or userPrincipalName",
 	"Exclude": "Hariç tut",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Deneysel",
 	"Explore the cosmos": "Evreni keşfet",
 	"Export": "Dışa Aktar",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "Değişkenlerinizi şu şekilde parantez kullanarak biçimlendirin:",
 	"Frequency Penalty": "Frekans Cezası",
 	"Function": "Fonksiyon",
+	"Function Calling": "",
 	"Function created successfully": "Fonksiyon başarıyla oluşturuldu",
 	"Function deleted successfully": "Fonksiyon başarıyla silindi",
 	"Function Description": "Fonksiyon Açıklaması",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "Merak uyandırın",
 	"Image": "",
 	"Image Compression": "Görüntü Sıkıştırma",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Görüntü Oluşturma (Deneysel)",
 	"Image Generation Engine": "Görüntü Oluşturma Motoru",
@@ -627,6 +630,7 @@
 	"More": "Daha Fazla",
 	"Name": "Ad",
 	"Name your knowledge base": "Bilgi tabanınıza bir ad verin",
+	"Native": "",
 	"New Chat": "Yeni Sohbet",
 	"New Folder": "Yeni Klasör",
 	"New Password": "Yeni Parola",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Önceki 30 gün",
 	"Previous 7 days": "Önceki 7 gün",
 	"Profile Image": "Profil Fotoğrafı",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (örn. Roma İmparatorluğu hakkında ilginç bir bilgi verin)",
 	"Prompt Content": "Prompt İçeriği",
 	"Prompt created successfully": "Prompt başarıyla oluşturuldu",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Web Yükleyici Ayarları",
 	"Web Search": "Web Araması",
 	"Web Search Engine": "Web Arama Motoru",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "Web Arama Sorgusu Oluşturma",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "WebUI Ayarları",

+ 19 - 13
src/lib/i18n/locales/uk-UA/translation.json

@@ -63,10 +63,11 @@
 	"Allowed Endpoints": "Дозволені кінцеві точки",
 	"Already have an account?": "Вже є обліковий запис?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Альтернатива параметру top_p, яка має на меті забезпечити баланс якості та різноманітності. Параметр p представляє мінімальну ймовірність для того, щоб токен був врахований, відносно ймовірності найбільш ймовірного токена. Наприклад, при p=0.05 і найбільш імовірному токені з ймовірністю 0.9, логіти зі значенням менше 0.045 будуть відфільтровані. (За замовчуванням: 0.0)",
+	"Always": "Завжди",
 	"Amazing": "Чудово",
 	"an assistant": "асистента",
-	"Analyzed": "",
-	"Analyzing...": "",
+	"Analyzed": "Проаналізовано",
+	"Analyzing...": "Аналізую...",
 	"and": "та",
 	"and {{COUNT}} more": "та ще {{COUNT}}",
 	"and create a new shared link.": "і створіть нове спільне посилання.",
@@ -171,12 +172,11 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Відмовлено в дозволі на запис до буфера обміну. Будь ласка, перевірте налаштування вашого браузера, щоб надати необхідний доступ.",
 	"Clone": "Клонувати",
 	"Clone Chat": "Клонувати чат",
-	"Clone of {{TITLE}}": "",
+	"Clone of {{TITLE}}": "Клон {{TITLE}}",
 	"Close": "Закрити",
 	"Code execution": "Виконання коду",
 	"Code formatted successfully": "Код успішно відформатовано",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "Інтерпретатор коду",
 	"Collection": "Колекція",
 	"Color": "Колір",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "За замовчуванням",
 	"Default (Open AI)": "За замовчуванням (Open AI)",
 	"Default (SentenceTransformers)": "За замовчуванням (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "Режим за замовчуванням працює з ширшим діапазоном моделей, викликаючи інструменти один раз перед виконанням. Рідний режим використовує вбудовані можливості виклику інструментів моделі, але вимагає, щоб модель спочатку підтримувала цю функцію.",
 	"Default Model": "Модель за замовчуванням",
 	"Default model updated": "Модель за замовчуванням оновлено",
 	"Default Models": "Моделі за замовчуванням",
@@ -348,11 +349,12 @@
 	"Enter Chunk Overlap": "Введіть перекриття фрагменту",
 	"Enter Chunk Size": "Введіть розмір фрагменту",
 	"Enter description": "Введіть опис",
+	"Enter Exa API Key": "Введіть ключ API Exa",
 	"Enter Github Raw URL": "Введіть Raw URL-адресу Github",
 	"Enter Google PSE API Key": "Введіть ключ API Google PSE",
 	"Enter Google PSE Engine Id": "Введіть Google PSE Engine Id",
 	"Enter Image Size (e.g. 512x512)": "Введіть розмір зображення (напр., 512x512)",
-	"Enter Jina API Key": "Введіть ключ API для Jina",
+	"Enter Jina API Key": "Введіть ключ API Jina",
 	"Enter Kagi Search API Key": "Введіть ключ API Kagi Search",
 	"Enter language codes": "Введіть мовні коди",
 	"Enter Model ID": "Введіть ID моделі",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "Помилка доступу до Google Drive: {{error}}",
 	"Error uploading file: {{error}}": "Помилка завантаження файлу: {{error}}",
 	"Evaluations": "Оцінювання",
+	"Exa API Key": "Exa API ключ",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Приклад: (&(objectClass=inetOrgPerson)(uid=%s))",
 	"Example: ALL": "Приклад: ВСІ",
 	"Example: mail": "Приклад: пошта",
 	"Example: ou=users,dc=foo,dc=example": "Приклад: ou=users,dc=foo,dc=example",
 	"Example: sAMAccountName or uid or userPrincipalName": "Приклад: sAMAccountName або uid або userPrincipalName",
 	"Exclude": "Виключити",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "Виконати код для аналізу",
 	"Experimental": "Експериментальне",
 	"Explore the cosmos": "Досліджуйте космос",
 	"Export": "Експорт",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "Форматуйте свої змінні, використовуючи фігурні дужки таким чином:",
 	"Frequency Penalty": "Штраф за частоту",
 	"Function": "Функція",
+	"Function Calling": "Виклик функцій",
 	"Function created successfully": "Функцію успішно створено",
 	"Function deleted successfully": "Функцію успішно видалено",
 	"Function Description": "Опис функції",
@@ -469,7 +473,7 @@
 	"Functions imported successfully": "Функції успішно імпортовано",
 	"General": "Загальні",
 	"General Settings": "Загальні налаштування",
-	"Generate an image": "",
+	"Generate an image": "Згенерувати зображення",
 	"Generate Image": "Створити зображення",
 	"Generating search query": "Сформувати пошуковий запит",
 	"Get started": "Почати",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "Запаліть цікавість",
 	"Image": "Зображення",
 	"Image Compression": "Стиснення зображень",
-	"Image generation": "Генерація зображень",
 	"Image Generation": "Генерація зображень",
 	"Image Generation (Experimental)": "Генерування зображень (експериментально)",
 	"Image Generation Engine": "Механізм генерації зображень",
@@ -627,6 +630,7 @@
 	"More": "Більше",
 	"Name": "Ім'я",
 	"Name your knowledge base": "Назвіть вашу базу знань",
+	"Native": "Рідний",
 	"New Chat": "Новий чат",
 	"New Folder": "Нова папка",
 	"New Password": "Новий пароль",
@@ -721,7 +725,7 @@
 	"Please enter a prompt": "Будь ласка, введіть підказку",
 	"Please fill in all fields.": "Будь ласка, заповніть всі поля.",
 	"Please select a model first.": "Будь ласка, спочатку виберіть модель.",
-	"Please select a model.": "",
+	"Please select a model.": "Будь ласка, виберіть модель.",
 	"Please select a reason": "Будь ласка, виберіть причину",
 	"Port": "Порт",
 	"Positive attitude": "Позитивне ставлення",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "Попередні 30 днів",
 	"Previous 7 days": "Попередні 7 днів",
 	"Profile Image": "Зображення профілю",
+	"Prompt": "Підказка",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Підказка (напр., розкажіть мені цікавий факт про Римську імперію)",
 	"Prompt Content": "Зміст промту",
 	"Prompt created successfully": "Підказку успішно створено",
@@ -805,7 +810,7 @@
 	"Search options": "Опції пошуку",
 	"Search Prompts": "Пошук промтів",
 	"Search Result Count": "Кількість результатів пошуку",
-	"Search the internet": "",
+	"Search the internet": "Шукати в інтернеті",
 	"Search Tools": "Пошуку інструментів",
 	"SearchApi API Key": "Ключ API для SearchApi",
 	"SearchApi Engine": "Рушій SearchApi",
@@ -975,7 +980,7 @@
 	"Tools": "Інструменти",
 	"Tools Access": "Доступ до інструментів",
 	"Tools are a function calling system with arbitrary code execution": "Інструменти - це система виклику функцій з довільним виконанням коду",
-	"Tools Function Calling Prompt": "",
+	"Tools Function Calling Prompt": "Підказка для виклику функцій інструментів",
 	"Tools have a function calling system that allows arbitrary code execution": "Інструменти мають систему виклику функцій, яка дозволяє виконання довільного коду",
 	"Tools have a function calling system that allows arbitrary code execution.": "Інструменти мають систему виклику функцій, яка дозволяє виконання довільного коду.",
 	"Top K": "Top K",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Налаштування веб-завантажувача",
 	"Web Search": "Веб-пошук",
 	"Web Search Engine": "Веб-пошукова система",
+	"Web Search in Chat": "Пошук в інтернеті в чаті",
 	"Web Search Query Generation": "Генерація запиту для пошуку в мережі",
 	"Webhook URL": "URL веб-запиту",
 	"WebUI Settings": "Налаштування WebUI",
@@ -1075,7 +1081,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Ви можете налаштувати ваші взаємодії з мовними моделями, додавши спогади через кнопку 'Керувати' внизу, що зробить їх більш корисними та персоналізованими для вас.",
 	"You cannot upload an empty file.": "Ви не можете завантажити порожній файл.",
 	"You do not have permission to access this feature.": "У вас немає дозволу на доступ до цієї функції.",
-	"You do not have permission to upload files": "",
+	"You do not have permission to upload files": "У вас немає дозволу на завантаження файлів",
 	"You do not have permission to upload files.": "У вас немає дозволу завантажувати файли.",
 	"You have no archived conversations.": "У вас немає архівованих розмов.",
 	"You have shared this chat": "Ви поділилися цим чатом",

+ 10 - 4
src/lib/i18n/locales/ur-PK/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "کیا پہلے سے اکاؤنٹ موجود ہے؟",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "معاون",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "بند کریں",
 	"Code execution": "کوڈ کا نفاذ",
 	"Code formatted successfully": "کوڈ کامیابی سے فارمیٹ ہو گیا",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "کلیکشن",
 	"Color": "",
 	"ComfyUI": "کومفی یو آئی",
@@ -238,6 +238,7 @@
 	"Default": "پہلے سے طے شدہ",
 	"Default (Open AI)": "ڈیفالٹ (اوپن اے آئی)",
 	"Default (SentenceTransformers)": "ڈیفالٹ (سینٹینس ٹرانسفارمرز)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "ڈیفالٹ ماڈل",
 	"Default model updated": "ڈیفالٹ ماڈل اپ ڈیٹ ہو گیا",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "چنک اوورلیپ درج کریں",
 	"Enter Chunk Size": "چنک سائز درج کریں",
 	"Enter description": "تفصیل درج کریں",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "گیٹ ہب را یو آر ایل درج کریں",
 	"Enter Google PSE API Key": "گوگل PSE API کلید درج کریں",
 	"Enter Google PSE Engine Id": "گوگل پی ایس ای انجن آئی ڈی درج کریں",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "تشخیصات",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "خارج کریں",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "تجرباتی",
 	"Explore the cosmos": "",
 	"Export": "برآمد کریں",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "اپنے متغیرات کو اس طرح بریکٹس میں فارمیٹ کریں:",
 	"Frequency Penalty": "کثرت کی پابندی",
 	"Function": "فنکشن",
+	"Function Calling": "",
 	"Function created successfully": "فنکشن کامیابی سے تخلیق ہو گیا",
 	"Function deleted successfully": "فنکشن کامیابی کے ساتھ حذف ہو گیا",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "تصویر کی تخلیق (تجرباتی)",
 	"Image Generation Engine": "امیج جنریشن انجن",
@@ -627,6 +630,7 @@
 	"More": "مزید",
 	"Name": "نام",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "نئی بات چیت",
 	"New Folder": "",
 	"New Password": "نیا پاس ورڈ",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "پچھلے 30 دن",
 	"Previous 7 days": "پچھلے 7 دن",
 	"Profile Image": "پروفائل تصویر",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "سوال کریں (مثلاً: مجھے رومن سلطنت کے بارے میں کوئی دلچسپ حقیقت بتائیں)",
 	"Prompt Content": "مواد کا آغاز کریں",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "ویب لوڈر کی ترتیبات",
 	"Web Search": "ویب تلاش کریں",
 	"Web Search Engine": "ویب تلاش انجن",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "ویب ہُک یو آر ایل",
 	"WebUI Settings": "ویب UI ترتیبات",

+ 10 - 4
src/lib/i18n/locales/vi-VN/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "",
 	"Already have an account?": "Bạn đã có tài khoản?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
+	"Always": "",
 	"Amazing": "",
 	"an assistant": "trợ lý",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "Đóng",
 	"Code execution": "",
 	"Code formatted successfully": "Mã được định dạng thành công",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "Tổng hợp mọi tài liệu",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "Mặc định",
 	"Default (Open AI)": "",
 	"Default (SentenceTransformers)": "Mặc định (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "Model mặc định",
 	"Default model updated": "Mô hình mặc định đã được cập nhật",
 	"Default Models": "",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "Nhập Chunk chồng lấn (overlap)",
 	"Enter Chunk Size": "Nhập Kích thước Chunk",
 	"Enter description": "",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Nhập URL cho Github Raw",
 	"Enter Google PSE API Key": "Nhập Google PSE API Key",
 	"Enter Google PSE Engine Id": "Nhập Google PSE Engine Id",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "",
 	"Error uploading file: {{error}}": "",
 	"Evaluations": "",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "",
 	"Example: ALL": "",
 	"Example: mail": "",
 	"Example: ou=users,dc=foo,dc=example": "",
 	"Example: sAMAccountName or uid or userPrincipalName": "",
 	"Exclude": "",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "Thử nghiệm",
 	"Explore the cosmos": "",
 	"Export": "Xuất khẩu",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "",
 	"Frequency Penalty": "Hình phạt tần số",
 	"Function": "",
+	"Function Calling": "",
 	"Function created successfully": "Function được tạo thành công",
 	"Function deleted successfully": "Function đã bị xóa",
 	"Function Description": "",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "",
 	"Image": "",
 	"Image Compression": "",
-	"Image generation": "",
 	"Image Generation": "",
 	"Image Generation (Experimental)": "Tạo ảnh (thử nghiệm)",
 	"Image Generation Engine": "Công cụ tạo ảnh",
@@ -627,6 +630,7 @@
 	"More": "Thêm",
 	"Name": "Tên",
 	"Name your knowledge base": "",
+	"Native": "",
 	"New Chat": "Tạo chat mới",
 	"New Folder": "",
 	"New Password": "Mật khẩu mới",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "30 ngày trước",
 	"Previous 7 days": "7 ngày trước",
 	"Profile Image": "Ảnh đại diện",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (ví dụ: Hãy kể cho tôi một sự thật thú vị về Đế chế La Mã)",
 	"Prompt Content": "Nội dung prompt",
 	"Prompt created successfully": "",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "Cài đặt Web Loader",
 	"Web Search": "Tìm kiếm Web",
 	"Web Search Engine": "Chức năng Tìm kiếm Web",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "Cài đặt WebUI",

+ 19 - 13
src/lib/i18n/locales/zh-CN/translation.json

@@ -63,10 +63,11 @@
 	"Allowed Endpoints": "允许的端点",
 	"Already have an account?": "已经拥有账号了?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "top_p的替代方法,目标是在质量和多样性之间取得平衡。参数p表示一个token相对于最有可能的token所需的最低概率。比如,当p=0.05且最有可能的token概率为0.9时,概率低于0.045的logits会被排除。(默认值:0.0)",
+	"Always": "",
 	"Amazing": "很棒",
 	"an assistant": "AI模型",
-	"Analyzed": "",
-	"Analyzing...": "",
+	"Analyzed": "已分析",
+	"Analyzing...": "正在分析...",
 	"and": "和",
 	"and {{COUNT}} more": "还有 {{COUNT}} 个",
 	"and create a new shared link.": "并创建一个新的分享链接。",
@@ -171,12 +172,11 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "写入剪贴板时被拒绝。请检查浏览器设置,授予必要权限。",
 	"Clone": "复制",
 	"Clone Chat": "克隆聊天",
-	"Clone of {{TITLE}}": "",
+	"Clone of {{TITLE}}": "{{TITLE}} 的副本",
 	"Close": "关闭",
 	"Code execution": "代码执行",
 	"Code formatted successfully": "代码格式化成功",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "代码解释器",
 	"Collection": "文件集",
 	"Color": "颜色",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "默认",
 	"Default (Open AI)": "默认 (OpenAI)",
 	"Default (SentenceTransformers)": "默认(SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "默认模式通过在执行前调用一次工具,能够兼容更广泛的模型。原生模式利用模型内置的工具调用能力,但需要模型本身具备该功能的原生支持。",
 	"Default Model": "默认模型",
 	"Default model updated": "默认模型已更新",
 	"Default Models": "默认模型",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "输入块重叠 (Chunk Overlap)",
 	"Enter Chunk Size": "输入块大小 (Chunk Size)",
 	"Enter description": "输入简介描述",
+	"Enter Exa API Key": "输入 Exa API 密钥",
 	"Enter Github Raw URL": "输入 Github Raw 地址",
 	"Enter Google PSE API Key": "输入 Google PSE API 密钥",
 	"Enter Google PSE Engine Id": "输入 Google PSE 引擎 ID",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "访问 Google 云端硬盘 出错: {{error}}",
 	"Error uploading file: {{error}}": "上传文件时出错: {{error}}",
 	"Evaluations": "竞技场评估",
+	"Exa API Key": "Exa API 密钥",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "例如:(&(objectClass=inetOrgPerson)(uid=%s))",
 	"Example: ALL": "例如:ALL",
 	"Example: mail": "例如:mail",
 	"Example: ou=users,dc=foo,dc=example": "例如:ou=users,dc=foo,dc=example",
 	"Example: sAMAccountName or uid or userPrincipalName": "例如:sAMAccountName 或 uid 或 userPrincipalName",
 	"Exclude": "排除",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "执行代码进行分析",
 	"Experimental": "实验性",
 	"Explore the cosmos": "探索宇宙",
 	"Export": "导出",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "使用括号格式化你的变量,如下所示:",
 	"Frequency Penalty": "频率惩罚",
 	"Function": "函数",
+	"Function Calling": "函数调用 (Function Calling)",
 	"Function created successfully": "函数创建成功",
 	"Function deleted successfully": "函数删除成功",
 	"Function Description": "函数描述",
@@ -469,7 +473,7 @@
 	"Functions imported successfully": "函数导入成功",
 	"General": "通用",
 	"General Settings": "通用设置",
-	"Generate an image": "",
+	"Generate an image": "生成图像",
 	"Generate Image": "生成图像",
 	"Generating search query": "生成搜索查询",
 	"Get started": "开始使用",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "点燃好奇心",
 	"Image": "图像生成",
 	"Image Compression": "图像压缩",
-	"Image generation": "图像生成",
 	"Image Generation": "图像生成",
 	"Image Generation (Experimental)": "图像生成(实验性)",
 	"Image Generation Engine": "图像生成引擎",
@@ -627,6 +630,7 @@
 	"More": "更多",
 	"Name": "名称",
 	"Name your knowledge base": "为您的知识库命名",
+	"Native": "原生",
 	"New Chat": "新对话",
 	"New Folder": "新文件夹",
 	"New Password": "新密码",
@@ -721,7 +725,7 @@
 	"Please enter a prompt": "请输出一个 prompt",
 	"Please fill in all fields.": "请填写所有字段。",
 	"Please select a model first.": "请先选择一个模型。",
-	"Please select a model.": "",
+	"Please select a model.": "请选择一个模型。",
 	"Please select a reason": "请选择原因",
 	"Port": "端口",
 	"Positive attitude": "积极的态度",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "过去 30 天",
 	"Previous 7 days": "过去 7 天",
 	"Profile Image": "用户头像",
+	"Prompt": "提示词 (Prompt)",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "提示(例如:给我讲一个关于罗马帝国的趣事。)",
 	"Prompt Content": "提示词内容",
 	"Prompt created successfully": "提示词创建成功",
@@ -805,7 +810,7 @@
 	"Search options": "搜索选项",
 	"Search Prompts": "搜索提示词",
 	"Search Result Count": "搜索结果数量",
-	"Search the internet": "",
+	"Search the internet": "联网搜索",
 	"Search Tools": "搜索工具",
 	"SearchApi API Key": "SearchApi API 密钥",
 	"SearchApi Engine": "SearchApi 引擎",
@@ -834,7 +839,7 @@
 	"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设置后支持的接口将在返回响应中包含令牌使用信息。",
+	"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 }`。设置后,支持的供应商会在响应中返回 Token 使用信息。",
 	"September": "九月",
 	"Serper API Key": "Serper API 密钥",
 	"Serply API Key": "Serply API 密钥",
@@ -975,7 +980,7 @@
 	"Tools": "工具",
 	"Tools Access": "访问工具",
 	"Tools are a function calling system with arbitrary code execution": "工具是一个具有任意代码执行能力的函数调用系统",
-	"Tools Function Calling Prompt": "",
+	"Tools Function Calling Prompt": "工具函数调用提示词",
 	"Tools have a function calling system that allows arbitrary code execution": "注意:工具有权执行任意代码",
 	"Tools have a function calling system that allows arbitrary code execution.": "注意:工具有权执行任意代码。",
 	"Top K": "Top K",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "网页爬取设置",
 	"Web Search": "联网搜索",
 	"Web Search Engine": "联网搜索引擎",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "网页搜索关键词生成",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "WebUI 设置",
@@ -1075,7 +1081,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "通过点击下方的“管理”按钮,你可以添加记忆,以个性化大语言模型的互动,使其更有用,更符合你的需求。",
 	"You cannot upload an empty file.": "请勿上传空文件。",
 	"You do not have permission to access this feature.": "你没有访问此功能的权限。",
-	"You do not have permission to upload files": "",
+	"You do not have permission to upload files": "你没有上传文件的权限",
 	"You do not have permission to upload files.": "你没有上传文件的权限。",
 	"You have no archived conversations.": "没有已归档的对话。",
 	"You have shared this chat": "此对话已经分享过",

+ 10 - 4
src/lib/i18n/locales/zh-TW/translation.json

@@ -63,6 +63,7 @@
 	"Allowed Endpoints": "允許的端點",
 	"Already have an account?": "已經有帳號了嗎?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "作為 top_p 的替代方案,旨在確保質量和多樣性的平衡。相對於最可能的 token 機率而言,參數 p 代表一個 token 被考慮在内的最低機率。例如,當 p=0.05 且最可能的 token 機率為 0.9 時,數值低於 0.045 的對數機率會被過濾掉。(預設值:0.0)",
+	"Always": "",
 	"Amazing": "很棒",
 	"an assistant": "一位助手",
 	"Analyzed": "",
@@ -175,8 +176,7 @@
 	"Close": "關閉",
 	"Code execution": "程式碼執行",
 	"Code formatted successfully": "程式碼格式化成功",
-	"Code Intepreter": "",
-	"Code interpreter": "",
+	"Code Interpreter": "",
 	"Collection": "收藏",
 	"Color": "顏色",
 	"ComfyUI": "ComfyUI",
@@ -238,6 +238,7 @@
 	"Default": "預設",
 	"Default (Open AI)": "預設 (OpenAI)",
 	"Default (SentenceTransformers)": "預設 (SentenceTransformers)",
+	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "",
 	"Default Model": "預設模型",
 	"Default model updated": "預設模型已更新",
 	"Default Models": "預設模型",
@@ -348,6 +349,7 @@
 	"Enter Chunk Overlap": "輸入區塊重疊",
 	"Enter Chunk Size": "輸入區塊大小",
 	"Enter description": "輸入描述",
+	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "輸入 GitHub Raw URL",
 	"Enter Google PSE API Key": "輸入 Google PSE API 金鑰",
 	"Enter Google PSE Engine Id": "輸入 Google PSE 引擎 ID",
@@ -396,13 +398,14 @@
 	"Error accessing Google Drive: {{error}}": "存取 Google Drive 時發生錯誤:{{error}}",
 	"Error uploading file: {{error}}": "上傳檔案時發生錯誤:{{error}}",
 	"Evaluations": "評估",
+	"Exa API Key": "",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "範例:(&(objectClass=inetOrgPerson)(uid=%s))",
 	"Example: ALL": "範例:ALL",
 	"Example: mail": "範例:mail",
 	"Example: ou=users,dc=foo,dc=example": "範例:ou=users,dc=foo,dc=example",
 	"Example: sAMAccountName or uid or userPrincipalName": "範例:sAMAccountName 或 uid 或 userPrincipalName",
 	"Exclude": "排除",
-	"Executes code for analysis": "",
+	"Execute code for analysis": "",
 	"Experimental": "實驗性功能",
 	"Explore the cosmos": "探索宇宙",
 	"Export": "匯出",
@@ -455,6 +458,7 @@
 	"Format your variables using brackets like this:": "使用方括號格式化您的變數,如下所示:",
 	"Frequency Penalty": "頻率懲罰",
 	"Function": "函式",
+	"Function Calling": "",
 	"Function created successfully": "成功建立函式",
 	"Function deleted successfully": "成功刪除函式",
 	"Function Description": "函式描述",
@@ -502,7 +506,6 @@
 	"Ignite curiosity": "點燃好奇心",
 	"Image": "圖片",
 	"Image Compression": "圖片壓縮",
-	"Image generation": "圖片生成",
 	"Image Generation": "圖片生成",
 	"Image Generation (Experimental)": "圖片生成(實驗性功能)",
 	"Image Generation Engine": "圖片生成引擎",
@@ -627,6 +630,7 @@
 	"More": "更多",
 	"Name": "名稱",
 	"Name your knowledge base": "命名您的知識庫",
+	"Native": "",
 	"New Chat": "新增對話",
 	"New Folder": "新增資料夾",
 	"New Password": "新密碼",
@@ -730,6 +734,7 @@
 	"Previous 30 days": "過去 30 天",
 	"Previous 7 days": "過去 7 天",
 	"Profile Image": "個人檔案圖片",
+	"Prompt": "",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "提示詞(例如:告訴我關於羅馬帝國的一些趣事)",
 	"Prompt Content": "提示詞內容",
 	"Prompt created successfully": "提示詞建立成功",
@@ -1046,6 +1051,7 @@
 	"Web Loader Settings": "網頁載入器設定",
 	"Web Search": "網頁搜尋",
 	"Web Search Engine": "網頁搜尋引擎",
+	"Web Search in Chat": "",
 	"Web Search Query Generation": "網頁搜尋查詢生成",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "WebUI 設定",

+ 81 - 0
src/lib/pyodide/pyodideKernel.ts

@@ -0,0 +1,81 @@
+import PyodideWorker from '$lib/pyodide/pyodideKernel.worker?worker';
+
+export type CellState = {
+	id: string;
+	status: 'idle' | 'running' | 'completed' | 'error';
+	result: any;
+	stdout: string;
+	stderr: string;
+};
+
+export class PyodideKernel {
+	private worker: Worker;
+	private listeners: Map<string, (data: any) => void>;
+
+	constructor() {
+		this.worker = new PyodideWorker();
+		this.listeners = new Map();
+
+		// Listen to messages from the worker
+		this.worker.onmessage = (event) => {
+			const { type, id, ...data } = event.data;
+
+			if ((type === 'stdout' || type === 'stderr') && this.listeners.has(id)) {
+				this.listeners.get(id)?.({ type, id, ...data });
+			} else if (type === 'result' && this.listeners.has(id)) {
+				this.listeners.get(id)?.({ type, id, ...data });
+				// Remove the listener once the result is delivered
+				this.listeners.delete(id);
+			} else if (type === 'kernelState') {
+				this.listeners.forEach((listener) => listener({ type, ...data }));
+			}
+		};
+
+		// Initialize the worker
+		this.worker.postMessage({ type: 'initialize' });
+	}
+
+	async execute(id: string, code: string): Promise<CellState> {
+		return new Promise((resolve, reject) => {
+			// Set up the listener for streaming and execution result
+			const state: CellState = {
+				id,
+				status: 'running',
+				result: null,
+				stdout: '',
+				stderr: ''
+			};
+
+			this.listeners.set(id, (data) => {
+				if (data.type === 'stdout') {
+					state.stdout += data.message;
+				} else if (data.type === 'stderr') {
+					state.stderr += data.message;
+				} else if (data.type === 'result') {
+					// Final result
+					const { state: finalState } = data;
+					resolve(finalState);
+				}
+			});
+
+			// Send execute request to the worker
+			this.worker.postMessage({ type: 'execute', id, code });
+		});
+	}
+
+	async getState() {
+		return new Promise<Record<string, CellState>>((resolve) => {
+			this.worker.postMessage({ type: 'getState' });
+			this.listeners.set('kernelState', (data) => {
+				if (data.type === 'kernelState') {
+					resolve(data.state);
+				}
+			});
+		});
+	}
+
+	terminate() {
+		this.worker.postMessage({ type: 'terminate' });
+		this.worker.terminate();
+	}
+}

+ 123 - 0
src/lib/pyodide/pyodideKernel.worker.ts

@@ -0,0 +1,123 @@
+import { loadPyodide, type PyodideInterface } from 'pyodide';
+
+declare global {
+	interface Window {
+		stdout: string | null;
+		stderr: string | null;
+		pyodide: PyodideInterface;
+		cells: Record<string, CellState>;
+		indexURL: string;
+	}
+}
+
+type CellState = {
+	id: string;
+	status: 'idle' | 'running' | 'completed' | 'error';
+	result: any;
+	stdout: string;
+	stderr: string;
+};
+
+const initializePyodide = async () => {
+	// Ensure Pyodide is loaded once and cached in the worker's global scope
+	if (!self.pyodide) {
+		self.indexURL = '/pyodide/';
+		self.stdout = '';
+		self.stderr = '';
+		self.cells = {};
+
+		self.pyodide = await loadPyodide({
+			indexURL: self.indexURL
+		});
+	}
+};
+
+const executeCode = async (id: string, code: string) => {
+	if (!self.pyodide) {
+		await initializePyodide();
+	}
+
+	// Update the cell state to "running"
+	self.cells[id] = {
+		id,
+		status: 'running',
+		result: null,
+		stdout: '',
+		stderr: ''
+	};
+
+	// Redirect stdout/stderr to stream updates
+	self.pyodide.setStdout({
+		batched: (msg: string) => {
+			self.cells[id].stdout += msg;
+			self.postMessage({ type: 'stdout', id, message: msg });
+		}
+	});
+	self.pyodide.setStderr({
+		batched: (msg: string) => {
+			self.cells[id].stderr += msg;
+			self.postMessage({ type: 'stderr', id, message: msg });
+		}
+	});
+
+	try {
+		// Dynamically load required packages based on imports in the Python code
+		await self.pyodide.loadPackagesFromImports(code, {
+			messageCallback: (msg: string) => {
+				self.postMessage({ type: 'stdout', id, package: true, message: `[package] ${msg}` });
+			},
+			errorCallback: (msg: string) => {
+				self.postMessage({ type: 'stderr', id, package: true, message: `[package] ${msg}` });
+			}
+		});
+
+		// Execute the Python code
+		const result = await self.pyodide.runPythonAsync(code);
+		self.cells[id].result = result;
+		self.cells[id].status = 'completed';
+	} catch (error) {
+		self.cells[id].status = 'error';
+		self.cells[id].stderr += `\n${error.toString()}`;
+	} finally {
+		// Notify parent thread when execution completes
+		self.postMessage({
+			type: 'result',
+			id,
+			state: self.cells[id]
+		});
+	}
+};
+
+// Handle messages from the main thread
+self.onmessage = async (event) => {
+	const { type, id, code, ...args } = event.data;
+
+	switch (type) {
+		case 'initialize':
+			await initializePyodide();
+			self.postMessage({ type: 'initialized' });
+			break;
+
+		case 'execute':
+			if (id && code) {
+				await executeCode(id, code);
+			}
+			break;
+
+		case 'getState':
+			self.postMessage({
+				type: 'kernelState',
+				state: self.cells
+			});
+			break;
+
+		case 'terminate':
+			// Explicitly clear the worker for cleanup
+			for (const key in self.cells) delete self.cells[key];
+			self.close();
+			break;
+
+		default:
+			console.error(`Unknown message type: ${type}`);
+	}
+};

+ 59 - 0
src/lib/workers/pyodide.worker.ts

@@ -40,6 +40,23 @@ async function loadPyodideAndPackages(packages: string[] = []) {
 		packages: ['micropip']
 	});
 
+	let mountDir = '/mnt';
+	self.pyodide.FS.mkdirTree(mountDir);
+	// self.pyodide.FS.mount(self.pyodide.FS.filesystems.IDBFS, {}, mountDir);
+
+	// // Load persisted files from IndexedDB (Initial Sync)
+	// await new Promise<void>((resolve, reject) => {
+	// 	self.pyodide.FS.syncfs(true, (err) => {
+	// 		if (err) {
+	// 			console.error('Error syncing from IndexedDB:', err);
+	// 			reject(err);
+	// 		} else {
+	// 			console.log('Successfully loaded from IndexedDB.');
+	// 			resolve();
+	// 		}
+	// 	});
+	// });
+
 	const micropip = self.pyodide.pyimport('micropip');
 
 	// await micropip.set_index_urls('https://pypi.org/pypi/{package_name}/json');
@@ -60,12 +77,54 @@ self.onmessage = async (event) => {
 	await loadPyodideAndPackages(self.packages);
 
 	try {
+		// check if matplotlib is imported in the code
+		if (code.includes('matplotlib')) {
+			// Override plt.show() to return base64 image
+			await self.pyodide.runPythonAsync(`import base64
+import os
+from io import BytesIO
+
+# before importing matplotlib
+# to avoid the wasm backend (which needs js.document', not available in worker)
+os.environ["MPLBACKEND"] = "AGG"
+
+import matplotlib.pyplot
+
+_old_show = matplotlib.pyplot.show
+assert _old_show, "matplotlib.pyplot.show"
+
+def show(*, block=None):
+	buf = BytesIO()
+	matplotlib.pyplot.savefig(buf, format="png")
+	buf.seek(0)
+	# encode to a base64 str
+	img_str = base64.b64encode(buf.read()).decode('utf-8')
+	matplotlib.pyplot.clf()
+	buf.close()
+	print(f"data:image/png;base64,{img_str}")
+
+matplotlib.pyplot.show = show`);
+		}
+
 		self.result = await self.pyodide.runPythonAsync(code);
 
 		// Safely process and recursively serialize the result
 		self.result = processResult(self.result);
 
 		console.log('Python result:', self.result);
+
+		// Persist any changes to IndexedDB
+		// await new Promise<void>((resolve, reject) => {
+		// 	self.pyodide.FS.syncfs(false, (err) => {
+		// 		if (err) {
+		// 			console.error('Error syncing to IndexedDB:', err);
+		// 			reject(err);
+		// 		} else {
+		// 			console.log('Successfully synced to IndexedDB.');
+		// 			resolve();
+		// 		}
+		// 	});
+		// });
 	} catch (error) {
 		self.stderr = error.toString();
 	}

+ 4 - 1
src/routes/+layout.svelte

@@ -116,7 +116,10 @@
 			code.includes('sklearn') ? 'scikit-learn' : null,
 			code.includes('scipy') ? 'scipy' : null,
 			code.includes('re') ? 'regex' : null,
-			code.includes('seaborn') ? 'seaborn' : null
+			code.includes('seaborn') ? 'seaborn' : null,
+			code.includes('sympy') ? 'sympy' : null,
+			code.includes('tiktoken') ? 'tiktoken' : null,
+			code.includes('pytz') ? 'pytz' : null
 		].filter(Boolean);
 
 		const pyodideWorker = new PyodideWorker();

+ 2 - 1
tailwind.config.js

@@ -1,4 +1,5 @@
 import typography from '@tailwindcss/typography';
+import containerQuries from '@tailwindcss/container-queries';
 
 /** @type {import('tailwindcss').Config} */
 export default {
@@ -38,5 +39,5 @@ export default {
 			}
 		}
 	},
-	plugins: [typography]
+	plugins: [typography, containerQuries]
 };

+ 158 - 161
uv.lock

@@ -28,6 +28,9 @@ resolution-markers = [
     "python_full_version < '3.12' and platform_system == 'Darwin'",
     "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_system == 'Darwin'",
     "python_full_version < '3.12' and platform_system == 'Darwin'",
+    "python_full_version < '3.12' and platform_system == 'Darwin'",
+    "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_system == 'Darwin'",
+    "python_full_version < '3.12' and platform_system == 'Darwin'",
     "python_full_version < '3.12.4' and platform_system == 'Darwin'",
     "python_full_version >= '3.12.4' and platform_system == 'Darwin'",
     "python_full_version >= '3.13' and platform_system == 'Darwin'",
@@ -38,6 +41,10 @@ resolution-markers = [
     "python_full_version >= '3.13' and platform_system == 'Darwin'",
     "python_full_version >= '3.13' and platform_system == 'Darwin'",
     "python_full_version >= '3.13' and platform_system == 'Darwin'",
+    "python_full_version >= '3.13' and platform_system == 'Darwin'",
+    "python_full_version < '3.12' and platform_machine == 'aarch64' and platform_system == 'Linux'",
+    "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_machine == 'aarch64' and platform_system == 'Linux'",
+    "python_full_version < '3.12' and platform_machine == 'aarch64' and platform_system == 'Linux'",
     "python_full_version < '3.12' and platform_machine == 'aarch64' and platform_system == 'Linux'",
     "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_machine == 'aarch64' and platform_system == 'Linux'",
     "python_full_version < '3.12' and platform_machine == 'aarch64' and platform_system == 'Linux'",
@@ -72,6 +79,10 @@ resolution-markers = [
     "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_system == 'Linux'",
     "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_system == 'Linux'",
     "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_system == 'Linux'",
+    "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_system == 'Linux'",
+    "(python_full_version < '3.12' and platform_machine != 'aarch64' and platform_system != 'Darwin') or (python_full_version < '3.12' and platform_system != 'Darwin' and platform_system != 'Linux')",
+    "(python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_machine != 'aarch64' and platform_system != 'Darwin') or (python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_system != 'Darwin' and platform_system != 'Linux')",
+    "(python_full_version < '3.12' and platform_machine != 'aarch64' and platform_system != 'Darwin') or (python_full_version < '3.12' and platform_system != 'Darwin' and platform_system != 'Linux')",
     "(python_full_version < '3.12' and platform_machine != 'aarch64' and platform_system != 'Darwin') or (python_full_version < '3.12' and platform_system != 'Darwin' and platform_system != 'Linux')",
     "(python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_machine != 'aarch64' and platform_system != 'Darwin') or (python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_system != 'Darwin' and platform_system != 'Linux')",
     "(python_full_version < '3.12' and platform_machine != 'aarch64' and platform_system != 'Darwin') or (python_full_version < '3.12' and platform_system != 'Darwin' and platform_system != 'Linux')",
@@ -106,6 +117,7 @@ resolution-markers = [
     "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_system != 'Darwin') or (python_full_version >= '3.13' and platform_system != 'Darwin' and platform_system != 'Linux')",
     "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_system != 'Darwin') or (python_full_version >= '3.13' and platform_system != 'Darwin' and platform_system != 'Linux')",
     "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_system != 'Darwin') or (python_full_version >= '3.13' and platform_system != 'Darwin' and platform_system != 'Linux')",
+    "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_system != 'Darwin') or (python_full_version >= '3.13' and platform_system != 'Darwin' and platform_system != 'Linux')",
 ]
 
 [[package]]
@@ -137,7 +149,7 @@ wheels = [
 
 [[package]]
 name = "aiohttp"
-version = "3.11.8"
+version = "3.11.11"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
     { name = "aiohappyeyeballs" },
@@ -148,53 +160,53 @@ dependencies = [
     { name = "propcache" },
     { name = "yarl" },
 ]
-sdist = { url = "https://files.pythonhosted.org/packages/2c/e5/c7ad0689e8ab74c3ec9bf20e0f667e1278b3738ae19ae3fed21e6a0543ca/aiohttp-3.11.8.tar.gz", hash = "sha256:7bc9d64a2350cbb29a9732334e1a0743cbb6844de1731cbdf5949b235653f3fd", size = 7667904 }
-wheels = [
-    { url = "https://files.pythonhosted.org/packages/22/95/af92cedf27707a77b4827e45922f87fde9eed1aee9817c2d93fa6f8b54b9/aiohttp-3.11.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f8dd02b44555893adfe7cc4b3b454fee04f9dcec45cf66ef5bb53ebf393f0505", size = 707895 },
-    { url = "https://files.pythonhosted.org/packages/d0/a5/8f28d1b1e37810bf9957dfbbc376da5f8cc377b029dec0e20d5ddacc2253/aiohttp-3.11.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:658052941324edea3dee1f681375e70779f55e437e07bdfc4b5bbe65ad53cefb", size = 467535 },
-    { url = "https://files.pythonhosted.org/packages/c9/eb/65c5a4163f79a8dcf8ceb69ca012bf5d14c599819ffa4b52b52aaef0c878/aiohttp-3.11.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6c829471a9e2266da4a0666f8a9e215f19320f79778af379c1c7db324ac24ed2", size = 454817 },
-    { url = "https://files.pythonhosted.org/packages/58/f5/7939dbf646708ecc90a8c56d3c4b6602628d9cc2ec0df6a99d9b6004ad4a/aiohttp-3.11.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d21951756690f5d86d0215da38eb0fd65def03b5e2a1c08a4a39718a6d0d48f2", size = 1685395 },
-    { url = "https://files.pythonhosted.org/packages/ee/00/619262f2f8d0966c55753bbe65020594462072c0dc485b24de0e7f0229b1/aiohttp-3.11.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2fa50ddc6b21cc1ae23e13524d6f75b27e279fdf5cf905b2df6fd171891ac4e2", size = 1742815 },
-    { url = "https://files.pythonhosted.org/packages/55/d0/9be70ee6125a4be06aec54157ed47720426c0d3319bcf816c42ef64487be/aiohttp-3.11.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a5afbd805e449048ecebb1a256176e953d4ca9e48bab387d4d1c8524f1c7a95", size = 1783689 },
-    { url = "https://files.pythonhosted.org/packages/56/6a/f5f2edab5d5a5ebc00447d906d12822cdc4e80ce8d9aa10b66bbec38caf4/aiohttp-3.11.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea68db69f2a4ddc24b28b8e754fc0b963ed7f9b9a76137f06fe44643d6821fbd", size = 1675581 },
-    { url = "https://files.pythonhosted.org/packages/b0/17/9937026e4e152cd475d88e01fe95e0f792165503115d7d12d9a6cd817173/aiohttp-3.11.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80b3ac163145660ce660aed2f1005e6d4de840d39728990b7250525eeec4e4a8", size = 1621760 },
-    { url = "https://files.pythonhosted.org/packages/d3/ee/eb9037cd040a27b234d07d714b9e167e6ea56b8a41cdaa365d17a7bcb4a4/aiohttp-3.11.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e9ac0cce897904b77e109e5403ed713187dbdf96832bfd061ac07164264be16c", size = 1652785 },
-    { url = "https://files.pythonhosted.org/packages/b7/34/1c0422065285b272c0ddb63cf61dfb42bdbc0d6c3cc51e59ac1023226c31/aiohttp-3.11.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3260c77cff4e35245bc517658bd54d7a64787f71f3c4f723877c82f22835b032", size = 1649670 },
-    { url = "https://files.pythonhosted.org/packages/e0/d2/fc45946781450f2cde010b757c609e1189985961d590300a8637ee4c0b87/aiohttp-3.11.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f7fd9c11ffad6b022bf02a41a70418cb2ab3b33f2c27842a5999e3ab78daf280", size = 1732519 },
-    { url = "https://files.pythonhosted.org/packages/c3/b1/56f72200edf9eaae46f9dbbda6434bd970afe48ec8ee494e1cf65c04a8fd/aiohttp-3.11.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:16bda233a7b159ab08107e8858fedca90a9de287057fab54cafde51bd83f9819", size = 1753866 },
-    { url = "https://files.pythonhosted.org/packages/9f/29/907e42c94e534a94d4b281ace2ae66d339ab84d8976cdb7dc429d098eb0d/aiohttp-3.11.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4867008617bbf86e9fb5b00f72dd0e3a00a579b32233caff834320867f9b7cac", size = 1692152 },
-    { url = "https://files.pythonhosted.org/packages/d7/83/f03968fcbedd92db3131d927b2aedc221003e1d1ce188b39ec4da49a6a5b/aiohttp-3.11.8-cp311-cp311-win32.whl", hash = "sha256:17e6b9d8e29e3bfc7f893f327e92c9769d3582cee2fb1652c1431ac3f60115a0", size = 415560 },
-    { url = "https://files.pythonhosted.org/packages/5f/c2/44848c66e0538b8cbd708346754efc7928be5071b0ed0bbbe0db21608306/aiohttp-3.11.8-cp311-cp311-win_amd64.whl", hash = "sha256:7f3be4961a5c2c670f31caab7641a37ea2a97031f0d8ae15bcfd36b6bf273200", size = 441670 },
-    { url = "https://files.pythonhosted.org/packages/74/bb/975dcefc5d2238f24815ef1df7358643108ae8efe7371d1c700efd1d813a/aiohttp-3.11.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0e3b5bfef913d6be270c81976fbc0cbf66625cd92663bbb7e03b3adbd6aa4ac6", size = 703595 },
-    { url = "https://files.pythonhosted.org/packages/f4/f4/4480ffeca247026a89a828ff701f726a39029d63c20d0c3575c05cc21045/aiohttp-3.11.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cb51a81cb637b9a072c9cfae1839e35c6579638861eb3479eb5d6e6ce8bc6782", size = 462675 },
-    { url = "https://files.pythonhosted.org/packages/9d/3a/34fb0a91f667eea7050c299c3d84993db953385b1d5c287173a5bdd7a2c0/aiohttp-3.11.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd2ca84e5f7a35f313a62eb7d6a50bac6760b60bafce34586750712731c0aeff", size = 455270 },
-    { url = "https://files.pythonhosted.org/packages/80/b2/6b7b7728552700b8af03ce1370a4da65d8b7d769d6303c5d453968c7e335/aiohttp-3.11.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47c6663df9446aa848b478413219600da4b54bc0409e1ac4bc80fb1a81501363", size = 1679484 },
-    { url = "https://files.pythonhosted.org/packages/86/ae/92cd1a78ab4a962dc57482006b770c436d0ddb30b20cea954279577baec0/aiohttp-3.11.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c665ed4b52256614858b20711bbbd2755b0e19ec86870f8ff1645acf9ae9e760", size = 1736045 },
-    { url = "https://files.pythonhosted.org/packages/17/9d/37ebdcb0f7da1b8e902accc239592e2824d13d0f723acb36dd4a4201ecc4/aiohttp-3.11.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35d4545e7684da7a954ffc2dce495462cb16a902dffdebe98572408f6aaaee83", size = 1790952 },
-    { url = "https://files.pythonhosted.org/packages/02/9e/d572035320752770c00e6b821f4641493a611976f4dec85012b86b49be8e/aiohttp-3.11.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85be3899e6860dd2cd3f4370ded6708e939d00d5ec922a8eb328d114db605a47", size = 1689079 },
-    { url = "https://files.pythonhosted.org/packages/b3/f2/faff5fa14c51161a6f074ed56295562bc80b1c54f9933186c4cccabf6ded/aiohttp-3.11.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0ed9f1f2697713c48efc9ec483ad5d062e4aa91854f090a3eba0b19c002851d", size = 1616554 },
-    { url = "https://files.pythonhosted.org/packages/b3/ea/00412278060ea50c2d5c8a48e7f7f94e95e2170079b67c6772475d153927/aiohttp-3.11.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c0dbae99737badf3f5e862088a118e28d3b36f03eb608a6382eddfd68178e05b", size = 1643126 },
-    { url = "https://files.pythonhosted.org/packages/1f/93/9cb3e20cb8f73f00b94f92864f7e1937fd2b33059b2536f6532a2afabe6a/aiohttp-3.11.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:beae08f900b2980af4353a0200eb162b39f276fd8a6e43079a540f83964671f4", size = 1649517 },
-    { url = "https://files.pythonhosted.org/packages/e3/27/24e8dc49f4f524d728dcb757f74d9b3f5a652ecb5d20158e175b73186280/aiohttp-3.11.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d6f9e5fd1b3ecbaca3e04a15a02d1fa213248608caee99fd5bdddd4759959cf7", size = 1697243 },
-    { url = "https://files.pythonhosted.org/packages/16/bf/480de7d40affc95a046c8580e54ff4875a73ac5e7b8cafca9877f0cf089a/aiohttp-3.11.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7def89a41fe32120d89cd4577f5efbab3c52234c5890066ced8a2f7202dff88", size = 1730902 },
-    { url = "https://files.pythonhosted.org/packages/24/ce/74ed004d72a3d41933ac729765cd58aea8b61fd287fc870abc42f2d6b978/aiohttp-3.11.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:98f596cf59292e779bc387f22378a3d2c5e052c9fe2bf822ac4f547c6fe57758", size = 1696230 },
-    { url = "https://files.pythonhosted.org/packages/a5/22/fdba63fc388ec880e99868609761671598b01bb402e063d69c338eaf8a27/aiohttp-3.11.8-cp312-cp312-win32.whl", hash = "sha256:b64fa6b76b35b695cd3e5c42a4e568cbea8d41c9e59165e2a43da00976e2027e", size = 410669 },
-    { url = "https://files.pythonhosted.org/packages/7e/b8/37683614a4db2763b56376d4a532cceb0496b7984e1596e2da4b7c953166/aiohttp-3.11.8-cp312-cp312-win_amd64.whl", hash = "sha256:afba47981ff73b1794c00dce774334dcfe62664b3b4f78f278b77d21ce9daf43", size = 437086 },
-    { url = "https://files.pythonhosted.org/packages/56/12/97a55a4fe36a68e6e51749c2edd546b4792bc47039d78b766273d91178af/aiohttp-3.11.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a81525430da5ca356fae6e889daeb6f5cc0d5f0cef88e59cdde48e2394ea1365", size = 696879 },
-    { url = "https://files.pythonhosted.org/packages/da/4c/e84542b25315be8e4ec2fd06cfb31713d940fd94d378d7737f357ec7254c/aiohttp-3.11.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7565689e86a88c1d258351ebd14e343337b76a56ca5c0a2c1db96ec28149386f", size = 459325 },
-    { url = "https://files.pythonhosted.org/packages/6b/b5/db278214e5f915c7b203ff66735d1a1e9bfc4e8f331ebe72e74e92cfab7c/aiohttp-3.11.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0f9dbe9763c014c408ad51a027dc9582518e992dc63e2ffe359ac1b4840a560", size = 452061 },
-    { url = "https://files.pythonhosted.org/packages/4a/64/00f313ef75b1ac3d3c0bc408da78ffa0e7698cfd9cd55ab1af3693af74ed/aiohttp-3.11.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca580edc3ccd7f6ea76ad9cf59f5a8756d338e770b5eda7be26bcda8fa7ef53", size = 1662840 },
-    { url = "https://files.pythonhosted.org/packages/3b/9d/eaea2168b1bbe13c31c378e887d92802f352cf28ea09acbbffed84eb908e/aiohttp-3.11.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d141631a7348038fc7b5d1a81b3c9afa9aa056188ded7902fe754028fdea5c5", size = 1716479 },
-    { url = "https://files.pythonhosted.org/packages/f1/51/37f8e30e2053e472febe091006b0c763d02538acb1f52d6af2e5d0d7e656/aiohttp-3.11.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64e6b14608a56a4c76c60daac730b0c0eeaf9d10dfc3231f7fc26521a0d628fd", size = 1772536 },
-    { url = "https://files.pythonhosted.org/packages/6e/de/70b3caf16eb51cc92ba560800d52c2ce0bd71f0cb94eaa22ba0ba93dfe6a/aiohttp-3.11.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0983d0ce329f2f9dbeb355c3744bd6333f34e0dc56025b6b7d4f285b90acb51e", size = 1673785 },
-    { url = "https://files.pythonhosted.org/packages/90/40/d9d6164452f05a5019394b0e76ff2068d5b0d85b0213f369c7435264fde0/aiohttp-3.11.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d96b93a46a3742880fa21bcb35c6c40cf27714ec0fb8ec85fe444d73b95131b9", size = 1601468 },
-    { url = "https://files.pythonhosted.org/packages/7c/b0/e2b1964aed11246b4bdc35c0f04b4d353fd9826e33b86e382f05f338e51c/aiohttp-3.11.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f4f1779c3142d913c509c2ed1de8b8f920e07a5cd65ac1f57c61cfb6bfded5a4", size = 1614807 },
-    { url = "https://files.pythonhosted.org/packages/22/74/f1bd4c746c74520af3fac8efc34f7191a2b07c32f595009e54049e8b3746/aiohttp-3.11.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:48be7cff468c9c0d86a02e6a826e1fe159094b16d5aa2c17703e7317f791b0f9", size = 1616589 },
-    { url = "https://files.pythonhosted.org/packages/35/25/283d0da0573a0c32ae00b0d407e4219308c13b338b8f86e0b77339090349/aiohttp-3.11.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:daea456b79ca2bacc7f062845bbb1139c3b3231fc83169da5a682cf385416dd1", size = 1684232 },
-    { url = "https://files.pythonhosted.org/packages/51/31/b7dd54d33dd604adb988e4fe4cd35b311f03efc4701743f307041b97e749/aiohttp-3.11.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c92e763cf641e10ad9342597d20060ba23de5e411aada96660e679e3f9371189", size = 1714593 },
-    { url = "https://files.pythonhosted.org/packages/bd/8e/76f7919864c755c90696df132686b2a9fd9725e7ad9073db4ac9b52e872f/aiohttp-3.11.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a750ee5a177e0f873d6b2d7d0fa6e1e7c658fc0ca8ea56438dcba2ac94bedb09", size = 1669610 },
-    { url = "https://files.pythonhosted.org/packages/ec/93/bde417393de7545c194f0aefc9b4062a2b7d0e8ae8e7c85f5fa74971b433/aiohttp-3.11.8-cp313-cp313-win32.whl", hash = "sha256:4448c9c7f77bad48a6569062c0c16deb77fbb7363de1dc71ed087f66fb3b3c96", size = 409458 },
-    { url = "https://files.pythonhosted.org/packages/da/e7/45d57621d9caba3c7d2687618c0e12025e477bd035834cf9ec3334e82810/aiohttp-3.11.8-cp313-cp313-win_amd64.whl", hash = "sha256:481075a1949de79a8a6841e0086f2f5f464785c592cf527ed0db2c0cbd0e1ba2", size = 435403 },
+sdist = { url = "https://files.pythonhosted.org/packages/fe/ed/f26db39d29cd3cb2f5a3374304c713fe5ab5a0e4c8ee25a0c45cc6adf844/aiohttp-3.11.11.tar.gz", hash = "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e", size = 7669618 }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/34/ae/e8806a9f054e15f1d18b04db75c23ec38ec954a10c0a68d3bd275d7e8be3/aiohttp-3.11.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76", size = 708624 },
+    { url = "https://files.pythonhosted.org/packages/c7/e0/313ef1a333fb4d58d0c55a6acb3cd772f5d7756604b455181049e222c020/aiohttp-3.11.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538", size = 468507 },
+    { url = "https://files.pythonhosted.org/packages/a9/60/03455476bf1f467e5b4a32a465c450548b2ce724eec39d69f737191f936a/aiohttp-3.11.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204", size = 455571 },
+    { url = "https://files.pythonhosted.org/packages/be/f9/469588603bd75bf02c8ffb8c8a0d4b217eed446b49d4a767684685aa33fd/aiohttp-3.11.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9", size = 1685694 },
+    { url = "https://files.pythonhosted.org/packages/88/b9/1b7fa43faf6c8616fa94c568dc1309ffee2b6b68b04ac268e5d64b738688/aiohttp-3.11.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03", size = 1743660 },
+    { url = "https://files.pythonhosted.org/packages/2a/8b/0248d19dbb16b67222e75f6aecedd014656225733157e5afaf6a6a07e2e8/aiohttp-3.11.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287", size = 1785421 },
+    { url = "https://files.pythonhosted.org/packages/c4/11/f478e071815a46ca0a5ae974651ff0c7a35898c55063305a896e58aa1247/aiohttp-3.11.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e", size = 1675145 },
+    { url = "https://files.pythonhosted.org/packages/26/5d/284d182fecbb5075ae10153ff7374f57314c93a8681666600e3a9e09c505/aiohttp-3.11.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665", size = 1619804 },
+    { url = "https://files.pythonhosted.org/packages/1b/78/980064c2ad685c64ce0e8aeeb7ef1e53f43c5b005edcd7d32e60809c4992/aiohttp-3.11.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b", size = 1654007 },
+    { url = "https://files.pythonhosted.org/packages/21/8d/9e658d63b1438ad42b96f94da227f2e2c1d5c6001c9e8ffcc0bfb22e9105/aiohttp-3.11.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34", size = 1650022 },
+    { url = "https://files.pythonhosted.org/packages/85/fd/a032bf7f2755c2df4f87f9effa34ccc1ef5cea465377dbaeef93bb56bbd6/aiohttp-3.11.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d", size = 1732899 },
+    { url = "https://files.pythonhosted.org/packages/c5/0c/c2b85fde167dd440c7ba50af2aac20b5a5666392b174df54c00f888c5a75/aiohttp-3.11.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2", size = 1755142 },
+    { url = "https://files.pythonhosted.org/packages/bc/78/91ae1a3b3b3bed8b893c5d69c07023e151b1c95d79544ad04cf68f596c2f/aiohttp-3.11.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773", size = 1692736 },
+    { url = "https://files.pythonhosted.org/packages/77/89/a7ef9c4b4cdb546fcc650ca7f7395aaffbd267f0e1f648a436bec33c9b95/aiohttp-3.11.11-cp311-cp311-win32.whl", hash = "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62", size = 416418 },
+    { url = "https://files.pythonhosted.org/packages/fc/db/2192489a8a51b52e06627506f8ac8df69ee221de88ab9bdea77aa793aa6a/aiohttp-3.11.11-cp311-cp311-win_amd64.whl", hash = "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac", size = 442509 },
+    { url = "https://files.pythonhosted.org/packages/69/cf/4bda538c502f9738d6b95ada11603c05ec260807246e15e869fc3ec5de97/aiohttp-3.11.11-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886", size = 704666 },
+    { url = "https://files.pythonhosted.org/packages/46/7b/87fcef2cad2fad420ca77bef981e815df6904047d0a1bd6aeded1b0d1d66/aiohttp-3.11.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2", size = 464057 },
+    { url = "https://files.pythonhosted.org/packages/5a/a6/789e1f17a1b6f4a38939fbc39d29e1d960d5f89f73d0629a939410171bc0/aiohttp-3.11.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c", size = 455996 },
+    { url = "https://files.pythonhosted.org/packages/b7/dd/485061fbfef33165ce7320db36e530cd7116ee1098e9c3774d15a732b3fd/aiohttp-3.11.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a", size = 1682367 },
+    { url = "https://files.pythonhosted.org/packages/e9/d7/9ec5b3ea9ae215c311d88b2093e8da17e67b8856673e4166c994e117ee3e/aiohttp-3.11.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231", size = 1736989 },
+    { url = "https://files.pythonhosted.org/packages/d6/fb/ea94927f7bfe1d86178c9d3e0a8c54f651a0a655214cce930b3c679b8f64/aiohttp-3.11.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e", size = 1793265 },
+    { url = "https://files.pythonhosted.org/packages/40/7f/6de218084f9b653026bd7063cd8045123a7ba90c25176465f266976d8c82/aiohttp-3.11.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8", size = 1691841 },
+    { url = "https://files.pythonhosted.org/packages/77/e2/992f43d87831cbddb6b09c57ab55499332f60ad6fdbf438ff4419c2925fc/aiohttp-3.11.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8", size = 1619317 },
+    { url = "https://files.pythonhosted.org/packages/96/74/879b23cdd816db4133325a201287c95bef4ce669acde37f8f1b8669e1755/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c", size = 1641416 },
+    { url = "https://files.pythonhosted.org/packages/30/98/b123f6b15d87c54e58fd7ae3558ff594f898d7f30a90899718f3215ad328/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab", size = 1646514 },
+    { url = "https://files.pythonhosted.org/packages/d7/38/257fda3dc99d6978ab943141d5165ec74fd4b4164baa15e9c66fa21da86b/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da", size = 1702095 },
+    { url = "https://files.pythonhosted.org/packages/0c/f4/ddab089053f9fb96654df5505c0a69bde093214b3c3454f6bfdb1845f558/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853", size = 1734611 },
+    { url = "https://files.pythonhosted.org/packages/c3/d6/f30b2bc520c38c8aa4657ed953186e535ae84abe55c08d0f70acd72ff577/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e", size = 1694576 },
+    { url = "https://files.pythonhosted.org/packages/bc/97/b0a88c3f4c6d0020b34045ee6d954058abc870814f6e310c4c9b74254116/aiohttp-3.11.11-cp312-cp312-win32.whl", hash = "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600", size = 411363 },
+    { url = "https://files.pythonhosted.org/packages/7f/23/cc36d9c398980acaeeb443100f0216f50a7cfe20c67a9fd0a2f1a5a846de/aiohttp-3.11.11-cp312-cp312-win_amd64.whl", hash = "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d", size = 437666 },
+    { url = "https://files.pythonhosted.org/packages/49/d1/d8af164f400bad432b63e1ac857d74a09311a8334b0481f2f64b158b50eb/aiohttp-3.11.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9", size = 697982 },
+    { url = "https://files.pythonhosted.org/packages/92/d1/faad3bf9fa4bfd26b95c69fc2e98937d52b1ff44f7e28131855a98d23a17/aiohttp-3.11.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194", size = 460662 },
+    { url = "https://files.pythonhosted.org/packages/db/61/0d71cc66d63909dabc4590f74eba71f91873a77ea52424401c2498d47536/aiohttp-3.11.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f", size = 452950 },
+    { url = "https://files.pythonhosted.org/packages/07/db/6d04bc7fd92784900704e16b745484ef45b77bd04e25f58f6febaadf7983/aiohttp-3.11.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104", size = 1665178 },
+    { url = "https://files.pythonhosted.org/packages/54/5c/e95ade9ae29f375411884d9fd98e50535bf9fe316c9feb0f30cd2ac8f508/aiohttp-3.11.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff", size = 1717939 },
+    { url = "https://files.pythonhosted.org/packages/6f/1c/1e7d5c5daea9e409ed70f7986001b8c9e3a49a50b28404498d30860edab6/aiohttp-3.11.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3", size = 1775125 },
+    { url = "https://files.pythonhosted.org/packages/5d/66/890987e44f7d2f33a130e37e01a164168e6aff06fce15217b6eaf14df4f6/aiohttp-3.11.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1", size = 1677176 },
+    { url = "https://files.pythonhosted.org/packages/8f/dc/e2ba57d7a52df6cdf1072fd5fa9c6301a68e1cd67415f189805d3eeb031d/aiohttp-3.11.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4", size = 1603192 },
+    { url = "https://files.pythonhosted.org/packages/6c/9e/8d08a57de79ca3a358da449405555e668f2c8871a7777ecd2f0e3912c272/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d", size = 1618296 },
+    { url = "https://files.pythonhosted.org/packages/56/51/89822e3ec72db352c32e7fc1c690370e24e231837d9abd056490f3a49886/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87", size = 1616524 },
+    { url = "https://files.pythonhosted.org/packages/2c/fa/e2e6d9398f462ffaa095e84717c1732916a57f1814502929ed67dd7568ef/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2", size = 1685471 },
+    { url = "https://files.pythonhosted.org/packages/ae/5f/6bb976e619ca28a052e2c0ca7b0251ccd893f93d7c24a96abea38e332bf6/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12", size = 1715312 },
+    { url = "https://files.pythonhosted.org/packages/79/c1/756a7e65aa087c7fac724d6c4c038f2faaa2a42fe56dbc1dd62a33ca7213/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5", size = 1672783 },
+    { url = "https://files.pythonhosted.org/packages/73/ba/a6190ebb02176c7f75e6308da31f5d49f6477b651a3dcfaaaca865a298e2/aiohttp-3.11.11-cp313-cp313-win32.whl", hash = "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d", size = 410229 },
+    { url = "https://files.pythonhosted.org/packages/b8/62/c9fa5bafe03186a0e4699150a7fed9b1e73240996d0d2f0e5f70f3fdf471/aiohttp-3.11.11-cp313-cp313-win_amd64.whl", hash = "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99", size = 436081 },
 ]
 
 [[package]]
@@ -349,14 +361,14 @@ wheels = [
 
 [[package]]
 name = "authlib"
-version = "1.3.2"
+version = "1.4.1"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
     { name = "cryptography" },
 ]
-sdist = { url = "https://files.pythonhosted.org/packages/f3/75/47dbab150ef6f9298e227a40c93c7fed5f3ffb67c9fb62cd49f66285e46e/authlib-1.3.2.tar.gz", hash = "sha256:4b16130117f9eb82aa6eec97f6dd4673c3f960ac0283ccdae2897ee4bc030ba2", size = 147313 }
+sdist = { url = "https://files.pythonhosted.org/packages/58/73/0aa3d68b1c3caeac01ae0bad7a3d2a23029c4a3b42c7ccb89d752ed67eb2/authlib-1.4.1.tar.gz", hash = "sha256:30ead9ea4993cdbab821dc6e01e818362f92da290c04c7f6a1940f86507a790d", size = 147376 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/df/4c/9aa0416a403d5cc80292cb030bcd2c918cce2755e314d8c1aa18656e1e12/Authlib-1.3.2-py2.py3-none-any.whl", hash = "sha256:ede026a95e9f5cdc2d4364a52103f5405e75aa156357e831ef2bfd0bc5094dfc", size = 225111 },
+    { url = "https://files.pythonhosted.org/packages/e8/6a/e83a6c04f8c6014c33d97c135782a55370cf60513f8d9f99f1279c7f9c13/Authlib-1.4.1-py2.py3-none-any.whl", hash = "sha256:edc29c3f6a3e72cd9e9f45fff67fc663a2c364022eb0371c003f22d5405915c1", size = 225610 },
 ]
 
 [[package]]
@@ -974,15 +986,16 @@ sdist = { url = "https://files.pythonhosted.org/packages/7d/7d/60ee3f2b16d9bfdfa
 
 [[package]]
 name = "duckduckgo-search"
-version = "6.3.7"
+version = "7.3.0"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
     { name = "click" },
+    { name = "lxml" },
     { name = "primp" },
 ]
-sdist = { url = "https://files.pythonhosted.org/packages/6d/b7/e6fb81f7629ce690286179dc3690e6c098ce5ef2157735de43d17485ca64/duckduckgo_search-6.3.7.tar.gz", hash = "sha256:53d84966429a6377647e2a1ea7224b657575c7a4d506729bdb837e4ee12915ed", size = 33430 }
+sdist = { url = "https://files.pythonhosted.org/packages/41/9e/6fe558d76a018618dd0f62cf8f082b463d31849867b35fb95fbad97a6cd7/duckduckgo_search-7.3.0.tar.gz", hash = "sha256:52fc6a63055d8fbcadaddd292b11067affb87f9768a311f6f7d157a2bb5c40f6", size = 24052 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/9f/e6/fef4e3d72be75553268d034ff74433746ced67e4f9731f123979d3503d6c/duckduckgo_search-6.3.7-py3-none-any.whl", hash = "sha256:6a831a27977751e8928222f04c99a5d069ff80e2a7c78b699c9b9ac6cb48c41b", size = 27762 },
+    { url = "https://files.pythonhosted.org/packages/ba/c1/dbeb844d303d73acd154f934e21d653a592290643f5e6733b55c566ed905/duckduckgo_search-7.3.0-py3-none-any.whl", hash = "sha256:3a9c696ed98148dbc6af3497ca9062fa6dc480266a33d53779cadd1ae1d90b8a", size = 19825 },
 ]
 
 [[package]]
@@ -1032,19 +1045,6 @@ wheels = [
     { url = "https://files.pythonhosted.org/packages/44/5a/f0b9ad6c0a9017e62d4735daaeb11ba3b6c009d69a26141b258cd37b5588/einops-0.8.0-py3-none-any.whl", hash = "sha256:9572fb63046264a862693b0a87088af3bdc8c068fde03de63453cbbde245465f", size = 43223 },
 ]
 
-[[package]]
-name = "email-validator"
-version = "2.2.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
-    { name = "dnspython" },
-    { name = "idna" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967 }
-wheels = [
-    { url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521 },
-]
-
 [[package]]
 name = "emoji"
 version = "2.14.1"
@@ -1109,38 +1109,16 @@ wheels = [
 
 [[package]]
 name = "fastapi"
-version = "0.111.0"
+version = "0.115.7"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
-    { name = "email-validator" },
-    { name = "fastapi-cli" },
-    { name = "httpx" },
-    { name = "jinja2" },
-    { name = "orjson" },
     { name = "pydantic" },
-    { name = "python-multipart" },
     { name = "starlette" },
     { name = "typing-extensions" },
-    { name = "ujson" },
-    { name = "uvicorn", extra = ["standard"] },
 ]
-sdist = { url = "https://files.pythonhosted.org/packages/0e/1f/f4a99e92c583780787e04b05aa9d8a8db9ec76d091d81545948a006f5b44/fastapi-0.111.0.tar.gz", hash = "sha256:b9db9dd147c91cb8b769f7183535773d8741dd46f9dc6676cd82eab510228cd7", size = 288414 }
+sdist = { url = "https://files.pythonhosted.org/packages/a2/f5/3f921e59f189e513adb9aef826e2841672d50a399fead4e69afdeb808ff4/fastapi-0.115.7.tar.gz", hash = "sha256:0f106da6c01d88a6786b3248fb4d7a940d071f6f488488898ad5d354b25ed015", size = 293177 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/e6/33/de41e554e5a187d583906e10d53bfae5fd6c07e98cbf4fe5262bd37e739a/fastapi-0.111.0-py3-none-any.whl", hash = "sha256:97ecbf994be0bcbdadedf88c3150252bed7b2087075ac99735403b1b76cc8fc0", size = 91993 },
-]
-
-[[package]]
-name = "fastapi-cli"
-version = "0.0.7"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
-    { name = "rich-toolkit" },
-    { name = "typer" },
-    { name = "uvicorn", extra = ["standard"] },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/fe/73/82a5831fbbf8ed75905bacf5b2d9d3dfd6f04d6968b29fe6f72a5ae9ceb1/fastapi_cli-0.0.7.tar.gz", hash = "sha256:02b3b65956f526412515907a0793c9094abd4bfb5457b389f645b0ea6ba3605e", size = 16753 }
-wheels = [
-    { url = "https://files.pythonhosted.org/packages/a1/e6/5daefc851b514ce2287d8f5d358ae4341089185f78f3217a69d0ce3a390c/fastapi_cli-0.0.7-py3-none-any.whl", hash = "sha256:d549368ff584b2804336c61f192d86ddea080c11255f375959627911944804f4", size = 10705 },
+    { url = "https://files.pythonhosted.org/packages/e6/7f/bbd4dcf0faf61bc68a01939256e2ed02d681e9334c1a3cef24d5f77aba9f/fastapi-0.115.7-py3-none-any.whl", hash = "sha256:eb6a8c8bf7f26009e8147111ff15b5177a0e19bb4a45bc3486ab14804539d21e", size = 94777 },
 ]
 
 [[package]]
@@ -1484,6 +1462,19 @@ wheels = [
     { url = "https://files.pythonhosted.org/packages/be/8a/fe34d2f3f9470a27b01c9e76226965863f153d5fbe276f83608562e49c04/google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d", size = 9253 },
 ]
 
+[[package]]
+name = "google-auth-oauthlib"
+version = "1.2.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "google-auth" },
+    { name = "requests-oauthlib" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/cc/0f/1772edb8d75ecf6280f1c7f51cbcebe274e8b17878b382f63738fd96cee5/google_auth_oauthlib-1.2.1.tar.gz", hash = "sha256:afd0cad092a2eaa53cd8e8298557d6de1034c6cb4a740500b5357b648af97263", size = 24970 }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/1a/8e/22a28dfbd218033e4eeaf3a0533b2b54852b6530da0c0fe934f0cc494b29/google_auth_oauthlib-1.2.1-py2.py3-none-any.whl", hash = "sha256:2d58a27262d55aa1b87678c3ba7142a080098cbc2024f903c62355deb235d91f", size = 24930 },
+]
+
 [[package]]
 name = "google-cloud-core"
 version = "2.4.1"
@@ -1725,6 +1716,19 @@ wheels = [
     { url = "https://files.pythonhosted.org/packages/d5/34/e8b383f35b77c402d28563d2b8f83159319b509bc5f760b15d60b0abf165/hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c", size = 32611 },
 ]
 
+[[package]]
+name = "html5lib"
+version = "1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "six" },
+    { name = "webencodings" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ac/b6/b55c3f49042f1df3dcd422b7f224f939892ee94f22abcf503a9b7339eaf2/html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f", size = 272215 }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d", size = 112173 },
+]
+
 [[package]]
 name = "httpcore"
 version = "1.0.7"
@@ -2806,7 +2810,7 @@ wheels = [
 
 [[package]]
 name = "open-webui"
-version = "0.5.5"
+version = "0.5.7"
 source = { editable = "." }
 dependencies = [
     { name = "aiocache" },
@@ -2836,6 +2840,9 @@ dependencies = [
     { name = "fpdf2" },
     { name = "ftfy" },
     { name = "gcp-storage-emulator" },
+    { name = "google-api-python-client" },
+    { name = "google-auth-httplib2" },
+    { name = "google-auth-oauthlib" },
     { name = "google-cloud-storage" },
     { name = "google-generativeai" },
     { name = "googleapis-common-protos" },
@@ -2896,13 +2903,13 @@ dependencies = [
 requires-dist = [
     { name = "aiocache" },
     { name = "aiofiles" },
-    { name = "aiohttp", specifier = "==3.11.8" },
+    { name = "aiohttp", specifier = "==3.11.11" },
     { name = "alembic", specifier = "==1.14.0" },
     { name = "anthropic" },
     { name = "apscheduler", specifier = "==3.10.4" },
     { name = "argon2-cffi", specifier = "==23.1.0" },
     { name = "async-timeout" },
-    { name = "authlib", specifier = "==1.3.2" },
+    { name = "authlib", specifier = "==1.4.1" },
     { name = "bcrypt", specifier = "==4.2.0" },
     { name = "black", specifier = "==24.8.0" },
     { name = "boto3", specifier = "==1.35.53" },
@@ -2910,17 +2917,20 @@ requires-dist = [
     { name = "colbert-ai", specifier = "==0.2.21" },
     { name = "docker", specifier = "~=7.1.0" },
     { name = "docx2txt", specifier = "==0.8" },
-    { name = "duckduckgo-search", specifier = "~=6.3.5" },
+    { name = "duckduckgo-search", specifier = "~=7.3.0" },
     { name = "einops", specifier = "==0.8.0" },
     { name = "extract-msg" },
     { name = "fake-useragent", specifier = "==1.5.1" },
-    { name = "fastapi", specifier = "==0.111.0" },
+    { name = "fastapi", specifier = "==0.115.7" },
     { name = "faster-whisper", specifier = "==1.0.3" },
     { name = "flask", specifier = "==3.1.0" },
     { name = "flask-cors", specifier = "==5.0.0" },
     { name = "fpdf2", specifier = "==2.8.2" },
     { name = "ftfy", specifier = "==6.2.3" },
     { name = "gcp-storage-emulator", specifier = ">=2024.8.3" },
+    { name = "google-api-python-client" },
+    { name = "google-auth-httplib2" },
+    { name = "google-auth-oauthlib" },
     { name = "google-cloud-storage", specifier = "==2.19.0" },
     { name = "google-generativeai", specifier = "==0.7.2" },
     { name = "googleapis-common-protos", specifier = "==1.63.2" },
@@ -2932,7 +2942,7 @@ requires-dist = [
     { name = "moto", extras = ["s3"], specifier = ">=5.0.26" },
     { name = "nltk", specifier = "==3.9.1" },
     { name = "openai" },
-    { name = "opencv-python-headless", specifier = "==4.10.0.84" },
+    { name = "opencv-python-headless", specifier = "==4.11.0.86" },
     { name = "openpyxl", specifier = "==3.1.5" },
     { name = "opensearch-py", specifier = "==2.7.1" },
     { name = "pandas", specifier = "==2.2.3" },
@@ -2945,7 +2955,7 @@ requires-dist = [
     { name = "pydantic", specifier = "==2.9.2" },
     { name = "pydub" },
     { name = "pyjwt", extras = ["crypto"], specifier = "==2.10.1" },
-    { name = "pymdown-extensions", specifier = "==10.11.2" },
+    { name = "pymdown-extensions", specifier = "==10.14.2" },
     { name = "pymilvus", specifier = "==2.5.0" },
     { name = "pymongo" },
     { name = "pymysql", specifier = "==1.1.1" },
@@ -2966,11 +2976,11 @@ requires-dist = [
     { name = "requests", specifier = "==2.32.3" },
     { name = "sentence-transformers", specifier = "==3.3.1" },
     { name = "sentencepiece" },
-    { name = "soundfile", specifier = "==0.12.1" },
+    { name = "soundfile", specifier = "==0.13.1" },
     { name = "sqlalchemy", specifier = "==2.0.32" },
     { name = "tiktoken" },
     { name = "transformers" },
-    { name = "unstructured", specifier = "==0.15.9" },
+    { name = "unstructured", specifier = "==0.16.11" },
     { name = "uvicorn", extras = ["standard"], specifier = "==0.30.6" },
     { name = "validators", specifier = "==0.34.0" },
     { name = "xlrd", specifier = "==2.0.1" },
@@ -3015,19 +3025,19 @@ wheels = [
 
 [[package]]
 name = "opencv-python-headless"
-version = "4.10.0.84"
+version = "4.11.0.86"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
     { name = "numpy" },
 ]
-sdist = { url = "https://files.pythonhosted.org/packages/2f/7e/d20f68a5f1487adf19d74378d349932a386b1ece3be9be9915e5986db468/opencv-python-headless-4.10.0.84.tar.gz", hash = "sha256:f2017c6101d7c2ef8d7bc3b414c37ff7f54d64413a1847d89970b6b7069b4e1a", size = 95117755 }
+sdist = { url = "https://files.pythonhosted.org/packages/36/2f/5b2b3ba52c864848885ba988f24b7f105052f68da9ab0e693cc7c25b0b30/opencv-python-headless-4.11.0.86.tar.gz", hash = "sha256:996eb282ca4b43ec6a3972414de0e2331f5d9cda2b41091a49739c19fb843798", size = 95177929 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/1c/9b/583c8d9259f6fc19413f83fd18dd8e6cbc8eefb0b4dc6da52dd151fe3272/opencv_python_headless-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:a4f4bcb07d8f8a7704d9c8564c224c8b064c63f430e95b61ac0bffaa374d330e", size = 54835657 },
-    { url = "https://files.pythonhosted.org/packages/c0/7b/b4c67f5dad7a9a61c47f7a39e4050e8a4628bd64b3c3daaeb755d759f928/opencv_python_headless-4.10.0.84-cp37-abi3-macosx_12_0_x86_64.whl", hash = "sha256:5ae454ebac0eb0a0b932e3406370aaf4212e6a3fdb5038cc86c7aea15a6851da", size = 56475470 },
-    { url = "https://files.pythonhosted.org/packages/91/61/f838ce2046f3ec3591ea59ea3549085e399525d3b4558c4ed60b55ed88c0/opencv_python_headless-4.10.0.84-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46071015ff9ab40fccd8a163da0ee14ce9846349f06c6c8c0f2870856ffa45db", size = 29329705 },
-    { url = "https://files.pythonhosted.org/packages/d1/09/248f86a404567303cdf120e4a301f389b68e3b18e5c0cc428de327da609c/opencv_python_headless-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:377d08a7e48a1405b5e84afcbe4798464ce7ee17081c1c23619c8b398ff18295", size = 49858781 },
-    { url = "https://files.pythonhosted.org/packages/30/c0/66f88d58500e990a9a0a5c06f98862edf1d0a3a430781218a8c193948438/opencv_python_headless-4.10.0.84-cp37-abi3-win32.whl", hash = "sha256:9092404b65458ed87ce932f613ffbb1106ed2c843577501e5768912360fc50ec", size = 28675298 },
-    { url = "https://files.pythonhosted.org/packages/26/d0/22f68eb23eea053a31655960f133c0be9726c6a881547e6e9e7e2a946c4f/opencv_python_headless-4.10.0.84-cp37-abi3-win_amd64.whl", hash = "sha256:afcf28bd1209dd58810d33defb622b325d3cbe49dcd7a43a902982c33e5fad05", size = 38754031 },
+    { url = "https://files.pythonhosted.org/packages/dc/53/2c50afa0b1e05ecdb4603818e85f7d174e683d874ef63a6abe3ac92220c8/opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:48128188ade4a7e517237c8e1e11a9cdf5c282761473383e77beb875bb1e61ca", size = 37326460 },
+    { url = "https://files.pythonhosted.org/packages/3b/43/68555327df94bb9b59a1fd645f63fafb0762515344d2046698762fc19d58/opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_x86_64.whl", hash = "sha256:a66c1b286a9de872c343ee7c3553b084244299714ebb50fbdcd76f07ebbe6c81", size = 56723330 },
+    { url = "https://files.pythonhosted.org/packages/45/be/1438ce43ebe65317344a87e4b150865c5585f4c0db880a34cdae5ac46881/opencv_python_headless-4.11.0.86-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6efabcaa9df731f29e5ea9051776715b1bdd1845d7c9530065c7951d2a2899eb", size = 29487060 },
+    { url = "https://files.pythonhosted.org/packages/dd/5c/c139a7876099916879609372bfa513b7f1257f7f1a908b0bdc1c2328241b/opencv_python_headless-4.11.0.86-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e0a27c19dd1f40ddff94976cfe43066fbbe9dfbb2ec1907d66c19caef42a57b", size = 49969856 },
+    { url = "https://files.pythonhosted.org/packages/95/dd/ed1191c9dc91abcc9f752b499b7928aacabf10567bb2c2535944d848af18/opencv_python_headless-4.11.0.86-cp37-abi3-win32.whl", hash = "sha256:f447d8acbb0b6f2808da71fddd29c1cdd448d2bc98f72d9bb78a7a898fc9621b", size = 29324425 },
+    { url = "https://files.pythonhosted.org/packages/86/8a/69176a64335aed183529207ba8bc3d329c2999d852b4f3818027203f50e6/opencv_python_headless-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:6c304df9caa7a6a5710b91709dd4786bf20a74d57672b3c31f7033cc638174ca", size = 39402386 },
 ]
 
 [[package]]
@@ -3449,18 +3459,18 @@ wheels = [
 
 [[package]]
 name = "primp"
-version = "0.10.0"
+version = "0.11.0"
 source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/bb/89/53593df582f3bb35ad5e1a96cb00246c8b6f8b7f116253b9542c8d8c44b9/primp-0.10.0.tar.gz", hash = "sha256:93142590a5a1958240ee5b74faaf2f55185ed499ccaabc622d71cb0cc8a47a0b", size = 84282 }
+sdist = { url = "https://files.pythonhosted.org/packages/2f/9a/d15ffe51d91fb2702f0bf1a9538ca3b08d61bd43753ba139c7da4d977928/primp-0.11.0.tar.gz", hash = "sha256:8e3f05f1c4990f1340541be5bd81f3b3bd5abd83d7beb1512e6ca1c0b322faeb", size = 90020 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/70/ef/ecfbcea6a136ef758ba3f5644dc4d06df506f669e9381d52fa09b0952de7/primp-0.10.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:7a91a089bf2962b5b56c8d83d09535eb81cf55b53c09d83208b9e5a715cf2c17", size = 3164015 },
-    { url = "https://files.pythonhosted.org/packages/84/15/7fedf1280f04c17fb06095694403d27134758b70bf508948a796ed668f06/primp-0.10.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:0128453cce81552f7aa6ac2bf9b8741b7816cdb2d10536e62c77daaf6483b9af", size = 2929848 },
-    { url = "https://files.pythonhosted.org/packages/26/56/dae7ba34f6f41402b1e0a8c17640fa5b44c06012d5d07d69399da2db5cea/primp-0.10.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a959e9a83cff0ae7a85a02cc183e4db636f69ff41dddb7c4e32f997924923417", size = 3251850 },
-    { url = "https://files.pythonhosted.org/packages/76/39/20c100140827f0e82e8c3c68284be3292b8345dd5bb7dd5886cd08a2f984/primp-0.10.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:8e711cfa019fa9bdc0cba4d5d596f319c884a4329e505bd73e92eee0b024061a", size = 3214061 },
-    { url = "https://files.pythonhosted.org/packages/4b/bc/2ce42b5024931c2178999f526a0d6654285e95c178ed5f1c35e3e16ef9bb/primp-0.10.0-cp38-abi3-manylinux_2_34_armv7l.whl", hash = "sha256:b859336d9a35669b68a29c5d8f050e0dca380452dabf6c9667bb8599f010d164", size = 2978905 },
-    { url = "https://files.pythonhosted.org/packages/9b/07/c42bc5772e5f1655139d7a2b72f141f8a1fa9686684af50c7aab3d944840/primp-0.10.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:dc875cc9a733fe3e6344a37f2b5888e0a9605bb37807fc3009f3b03786408f34", size = 3386043 },
-    { url = "https://files.pythonhosted.org/packages/f5/9f/2b6c0322e33b8ee88489e5eac8f5e7dfe4a53cf75cc43cd6e712e76597e0/primp-0.10.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a27c5d997c37bf8237963c11e376eaa66e7eccee39164e3e259a1c3767c304d6", size = 3577429 },
-    { url = "https://files.pythonhosted.org/packages/70/cc/8dd693b9e2577690e86fb589478e8788df2920859e04743800eb7d02213c/primp-0.10.0-cp38-abi3-win_amd64.whl", hash = "sha256:7fe94c3164c2efffff08f7f54c018ac445112961b3ce4f4f499315ba0a9d1ef3", size = 3116121 },
+    { url = "https://files.pythonhosted.org/packages/c7/0f/7c1b7cc81144ddeadd19bf7aaf49858baa2587cdb72c57073ccddc94ca06/primp-0.11.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:59f65758dc2b46e5f3512ae1567687fed79c228d4a2b20959671bd1096ba3b49", size = 3176020 },
+    { url = "https://files.pythonhosted.org/packages/18/ae/53ce3e10e06fc2a031e18d4bd0e2597e9c33bc7a36bc3211eb0bf4479f5a/primp-0.11.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:37c8507dbacb3db162e62af88a81552b8333fc96957a88d1af39c39180b1221d", size = 2947624 },
+    { url = "https://files.pythonhosted.org/packages/c5/a3/5671608fe361de866b54a180a2a5f0c3166f5dfe58e928888ece54690ca3/primp-0.11.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19cfa9cd6ae933d5580ca25403a27f8000c6a8a394a68365ec7264c264135b4d", size = 3271847 },
+    { url = "https://files.pythonhosted.org/packages/ae/f8/ed6f63c236dd3054f8b67e39ea50f3c83abe74a3fde0ece7cac4db6e3507/primp-0.11.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ae9325d25dc549fb9e2a32fff44e946eafa6980953b98207df36d2141655f274", size = 3247462 },
+    { url = "https://files.pythonhosted.org/packages/f8/fe/78012539e98407f1d97732868704b043b21d7b213a29c67a4cb0bbb9ec2c/primp-0.11.0-cp38-abi3-manylinux_2_34_armv7l.whl", hash = "sha256:9aa35c8f1b84fac1f65b5d22067dea4c85976252e37c2feb9eee3bbc4a1a72ed", size = 3001606 },
+    { url = "https://files.pythonhosted.org/packages/31/fb/68420d637713dbd184e59f3a8e30f405f1e1e5f4e8f7340af47677258031/primp-0.11.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2124d403849fc06de36fddc5c483659503fed6b27b73bc7d3671e9a07ecd3713", size = 3406570 },
+    { url = "https://files.pythonhosted.org/packages/03/97/acea5b8aff4adc56da6207c38fa0e8b5a87ddca57611c5696e40d24ac3ed/primp-0.11.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:73f52af05fd8ef7fec16e6a824167fc96645d61ae97e5df576d2fd7e2998a67f", size = 3597805 },
+    { url = "https://files.pythonhosted.org/packages/0a/17/9adffa9b7802a5c960398ada038440e320e85dfbe1b648df26c8a62919d2/primp-0.11.0-cp38-abi3-win_amd64.whl", hash = "sha256:7281c343f8235438295864b347c09f918aca9616c509e5b9fdb3b01201cda1dc", size = 3135289 },
 ]
 
 [[package]]
@@ -3803,15 +3813,15 @@ crypto = [
 
 [[package]]
 name = "pymdown-extensions"
-version = "10.11.2"
+version = "10.14.2"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
     { name = "markdown" },
     { name = "pyyaml" },
 ]
-sdist = { url = "https://files.pythonhosted.org/packages/f4/71/2730a20e9e3752393d78998347f8b1085ef9c417646ea9befbeef221e3c4/pymdown_extensions-10.11.2.tar.gz", hash = "sha256:bc8847ecc9e784a098efd35e20cba772bc5a1b529dfcef9dc1972db9021a1049", size = 830241 }
+sdist = { url = "https://files.pythonhosted.org/packages/aa/7b/de388047c577e43dc45ce35c23b9b349ec3df8c7023c3e3c4d413a850982/pymdown_extensions-10.14.2.tar.gz", hash = "sha256:7a77b8116dc04193f2c01143760a43387bd9dc4aa05efacb7d838885a7791253", size = 846777 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/c2/35/c0edf199257ef0a7d407d29cd51c4e70d1dad4370a5f44deb65a7a5475e2/pymdown_extensions-10.11.2-py3-none-any.whl", hash = "sha256:41cdde0a77290e480cf53892f5c5e50921a7ee3e5cd60ba91bf19837b33badcf", size = 259044 },
+    { url = "https://files.pythonhosted.org/packages/e7/a3/61527d80d84e9fd4d97649322e83bd7efde8200fc07fe34469c8c2bd0d91/pymdown_extensions-10.14.2-py3-none-any.whl", hash = "sha256:f45bc5892410e54fd738ab8ccd736098b7ff0cb27fdb4bf24d0a0c6584bc90e1", size = 264459 },
 ]
 
 [[package]]
@@ -4391,20 +4401,6 @@ wheels = [
     { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 },
 ]
 
-[[package]]
-name = "rich-toolkit"
-version = "0.13.2"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
-    { name = "click" },
-    { name = "rich" },
-    { name = "typing-extensions" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/5b/8a/71cfbf6bf6257ea785d1f030c22468f763eea1b3e5417620f2ba9abd6dca/rich_toolkit-0.13.2.tar.gz", hash = "sha256:fea92557530de7c28f121cbed572ad93d9e0ddc60c3ca643f1b831f2f56b95d3", size = 72288 }
-wheels = [
-    { url = "https://files.pythonhosted.org/packages/7e/1b/1c2f43af46456050b27810a7a013af8a7e12bc545a0cdc00eb0df55eb769/rich_toolkit-0.13.2-py3-none-any.whl", hash = "sha256:f3f6c583e5283298a2f7dbd3c65aca18b7f818ad96174113ab5bec0b0e35ed61", size = 13566 },
-]
-
 [[package]]
 name = "rsa"
 version = "4.9"
@@ -4668,20 +4664,21 @@ wheels = [
 
 [[package]]
 name = "soundfile"
-version = "0.12.1"
+version = "0.13.1"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
     { name = "cffi" },
+    { name = "numpy" },
 ]
-sdist = { url = "https://files.pythonhosted.org/packages/6f/96/5ff33900998bad58d5381fd1acfcdac11cbea4f08fc72ac1dc25ffb13f6a/soundfile-0.12.1.tar.gz", hash = "sha256:e8e1017b2cf1dda767aef19d2fd9ee5ebe07e050d430f77a0a7c66ba08b8cdae", size = 43184 }
+sdist = { url = "https://files.pythonhosted.org/packages/e1/41/9b873a8c055582859b239be17902a85339bec6a30ad162f98c9b0288a2cc/soundfile-0.13.1.tar.gz", hash = "sha256:b2c68dab1e30297317080a5b43df57e302584c49e2942defdde0acccc53f0e5b", size = 46156 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/04/bc/cd845c2dbb4d257c744cd58a5bcdd9f6d235ca317e7e22e49564ec88dcd9/soundfile-0.12.1-py2.py3-none-any.whl", hash = "sha256:828a79c2e75abab5359f780c81dccd4953c45a2c4cd4f05ba3e233ddf984b882", size = 24030 },
-    { url = "https://files.pythonhosted.org/packages/c8/73/059c84343be6509b480013bf1eeb11b96c5f9eb48deff8f83638011f6b2c/soundfile-0.12.1-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:d922be1563ce17a69582a352a86f28ed8c9f6a8bc951df63476ffc310c064bfa", size = 1213305 },
-    { url = "https://files.pythonhosted.org/packages/71/87/31d2b9ed58975cec081858c01afaa3c43718eb0f62b5698a876d94739ad0/soundfile-0.12.1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:bceaab5c4febb11ea0554566784bcf4bc2e3977b53946dda2b12804b4fe524a8", size = 1075977 },
-    { url = "https://files.pythonhosted.org/packages/ad/bd/0602167a213d9184fc688b1086dc6d374b7ae8c33eccf169f9b50ce6568c/soundfile-0.12.1-py2.py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:2dc3685bed7187c072a46ab4ffddd38cef7de9ae5eb05c03df2ad569cf4dacbc", size = 1257765 },
-    { url = "https://files.pythonhosted.org/packages/c1/07/7591f4efd29e65071c3a61b53725036ea8f73366a4920a481ebddaf8d0ca/soundfile-0.12.1-py2.py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:074247b771a181859d2bc1f98b5ebf6d5153d2c397b86ee9e29ba602a8dfe2a6", size = 1174746 },
-    { url = "https://files.pythonhosted.org/packages/03/0f/49941ed8a2d94e5b36ea94346fb1d2b22e847fede902e05be4c96f26be7d/soundfile-0.12.1-py2.py3-none-win32.whl", hash = "sha256:59dfd88c79b48f441bbf6994142a19ab1de3b9bb7c12863402c2bc621e49091a", size = 888234 },
-    { url = "https://files.pythonhosted.org/packages/50/ff/26a4ee48d0b66625a4e4028a055b9f25bc9d7c7b2d17d21a45137621a50d/soundfile-0.12.1-py2.py3-none-win_amd64.whl", hash = "sha256:0d86924c00b62552b650ddd28af426e3ff2d4dc2e9047dae5b3d8452e0a49a77", size = 1009109 },
+    { url = "https://files.pythonhosted.org/packages/64/28/e2a36573ccbcf3d57c00626a21fe51989380636e821b341d36ccca0c1c3a/soundfile-0.13.1-py2.py3-none-any.whl", hash = "sha256:a23c717560da2cf4c7b5ae1142514e0fd82d6bbd9dfc93a50423447142f2c445", size = 25751 },
+    { url = "https://files.pythonhosted.org/packages/ea/ab/73e97a5b3cc46bba7ff8650a1504348fa1863a6f9d57d7001c6b67c5f20e/soundfile-0.13.1-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:82dc664d19831933fe59adad199bf3945ad06d84bc111a5b4c0d3089a5b9ec33", size = 1142250 },
+    { url = "https://files.pythonhosted.org/packages/a0/e5/58fd1a8d7b26fc113af244f966ee3aecf03cb9293cb935daaddc1e455e18/soundfile-0.13.1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:743f12c12c4054921e15736c6be09ac26b3b3d603aef6fd69f9dde68748f2593", size = 1101406 },
+    { url = "https://files.pythonhosted.org/packages/58/ae/c0e4a53d77cf6e9a04179535766b3321b0b9ced5f70522e4caf9329f0046/soundfile-0.13.1-py2.py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:9c9e855f5a4d06ce4213f31918653ab7de0c5a8d8107cd2427e44b42df547deb", size = 1235729 },
+    { url = "https://files.pythonhosted.org/packages/57/5e/70bdd9579b35003a489fc850b5047beeda26328053ebadc1fb60f320f7db/soundfile-0.13.1-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:03267c4e493315294834a0870f31dbb3b28a95561b80b134f0bd3cf2d5f0e618", size = 1313646 },
+    { url = "https://files.pythonhosted.org/packages/fe/df/8c11dc4dfceda14e3003bb81a0d0edcaaf0796dd7b4f826ea3e532146bba/soundfile-0.13.1-py2.py3-none-win32.whl", hash = "sha256:c734564fab7c5ddf8e9be5bf70bab68042cd17e9c214c06e365e20d64f9a69d5", size = 899881 },
+    { url = "https://files.pythonhosted.org/packages/14/e9/6b761de83277f2f02ded7e7ea6f07828ec78e4b229b80e4ca55dd205b9dc/soundfile-0.13.1-py2.py3-none-win_amd64.whl", hash = "sha256:1e70a05a0626524a69e9f0f4dd2ec174b4e9567f4d8b6c11d38b5c289be36ee9", size = 1019162 },
 ]
 
 [[package]]
@@ -4724,14 +4721,14 @@ wheels = [
 
 [[package]]
 name = "starlette"
-version = "0.37.2"
+version = "0.45.3"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
     { name = "anyio" },
 ]
-sdist = { url = "https://files.pythonhosted.org/packages/61/b5/6bceb93ff20bd7ca36e6f7c540581abb18f53130fabb30ba526e26fd819b/starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823", size = 2843736 }
+sdist = { url = "https://files.pythonhosted.org/packages/ff/fb/2984a686808b89a6781526129a4b51266f678b2d2b97ab2d325e56116df8/starlette-0.45.3.tar.gz", hash = "sha256:2cbcba2a75806f8a41c722141486f37c28e30a0921c5f6fe4346cb0dcee1302f", size = 2574076 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/fd/18/31fa32ed6c68ba66220204ef0be798c349d0a20c1901f9d4a794e08c76d8/starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee", size = 71908 },
+    { url = "https://files.pythonhosted.org/packages/d9/61/f2b52e107b1fc8944b33ef56bf6ac4ebbe16d91b94d2b87ce013bf63fb84/starlette-0.45.3-py3-none-any.whl", hash = "sha256:dfb6d332576f136ec740296c7e8bb8c8a7125044e7c6da30744718880cdd059d", size = 71507 },
 ]
 
 [[package]]
@@ -4746,15 +4743,6 @@ wheels = [
     { url = "https://files.pythonhosted.org/packages/b2/fe/81695a1aa331a842b582453b605175f419fe8540355886031328089d840a/sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8", size = 6189177 },
 ]
 
-[[package]]
-name = "tabulate"
-version = "0.9.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090 }
-wheels = [
-    { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252 },
-]
-
 [[package]]
 name = "tenacity"
 version = "9.0.0"
@@ -5009,7 +4997,7 @@ wheels = [
 
 [[package]]
 name = "unstructured"
-version = "0.15.9"
+version = "0.16.11"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
     { name = "backoff" },
@@ -5018,6 +5006,7 @@ dependencies = [
     { name = "dataclasses-json" },
     { name = "emoji" },
     { name = "filetype" },
+    { name = "html5lib" },
     { name = "langdetect" },
     { name = "lxml" },
     { name = "nltk" },
@@ -5028,15 +5017,14 @@ dependencies = [
     { name = "python-oxmsg" },
     { name = "rapidfuzz" },
     { name = "requests" },
-    { name = "tabulate" },
     { name = "tqdm" },
     { name = "typing-extensions" },
     { name = "unstructured-client" },
     { name = "wrapt" },
 ]
-sdist = { url = "https://files.pythonhosted.org/packages/74/db/be587e728e2edf684a6c2ead46d05e02951f78b2949c571fed78266941eb/unstructured-0.15.9.tar.gz", hash = "sha256:de26d0e38bac4aa3ae2950f175d0c53a5ccae5c45806b67f55a4af8dea4c407a", size = 1858477 }
+sdist = { url = "https://files.pythonhosted.org/packages/08/c3/5bd80074a63c972f0f9adac5276955f6cbcceb71ac05ae72cc524ad93813/unstructured-0.16.11.tar.gz", hash = "sha256:33ebf68aae11ce33c8a96335296557b5abd8ba96eaba3e5a1554c0b9eee40bb5", size = 1664314 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/58/7b/93126eed91753d65d0c07e9f4c80bd715b6b6003f139483024ae00749aa2/unstructured-0.15.9-py3-none-any.whl", hash = "sha256:ddbb043461cfb9efa1d48a18e62e3b43ff4e0cec25fbf0f28bf345589c1af4d2", size = 2120717 },
+    { url = "https://files.pythonhosted.org/packages/59/67/71d1e61e8127dd9ab66117d3c5ebfc6f87c1d00bf13ff3bcc837feed6e09/unstructured-0.16.11-py3-none-any.whl", hash = "sha256:a92d5bc2c2b7bb23369641fb7a7f0daba1775639199306ce4cd83ca564a03763", size = 1748042 },
 ]
 
 [[package]]
@@ -5196,6 +5184,15 @@ wheels = [
     { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 },
 ]
 
+[[package]]
+name = "webencodings"
+version = "0.5.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721 }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774 },
+]
+
 [[package]]
 name = "websocket-client"
 version = "1.8.0"