Browse Source

Merge pull request #2992 from open-webui/dev

0.3.2
Timothy Jaeryang Baek 11 months ago
parent
commit
3933db2c91
58 changed files with 1183 additions and 621 deletions
  1. 14 0
      CHANGELOG.md
  2. 1 1
      README.md
  3. 18 1
      backend/apps/rag/main.py
  4. 68 0
      backend/apps/rag/search/serply.py
  5. 206 0
      backend/apps/rag/search/testdata/serply.json
  6. 9 2
      backend/config.py
  7. 2 2
      package-lock.json
  8. 2 2
      package.json
  9. 19 1
      src/lib/components/admin/Settings/WebSearch.svelte
  10. 98 80
      src/lib/components/chat/Chat.svelte
  11. 1 0
      src/lib/components/chat/MessageInput.svelte
  12. 1 1
      src/lib/components/chat/MessageInput/CallOverlay.svelte
  13. 89 81
      src/lib/components/chat/Messages/ResponseMessage.svelte
  14. 38 3
      src/lib/components/chat/Messages/ResponseMessage/WebSearchResults.svelte
  15. 164 160
      src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte
  16. 29 32
      src/lib/components/chat/Settings/General.svelte
  17. 1 1
      src/lib/components/documents/Settings/WebParams.svelte
  18. 19 0
      src/lib/components/icons/MagnifyingGlass.svelte
  19. 2 2
      src/lib/components/workspace/Models/Knowledge.svelte
  20. 5 1
      src/lib/i18n/locales/ar-BH/translation.json
  21. 5 1
      src/lib/i18n/locales/bg-BG/translation.json
  22. 5 1
      src/lib/i18n/locales/bn-BD/translation.json
  23. 5 1
      src/lib/i18n/locales/ca-ES/translation.json
  24. 5 1
      src/lib/i18n/locales/ceb-PH/translation.json
  25. 5 1
      src/lib/i18n/locales/de-DE/translation.json
  26. 5 1
      src/lib/i18n/locales/dg-DG/translation.json
  27. 5 1
      src/lib/i18n/locales/en-GB/translation.json
  28. 5 1
      src/lib/i18n/locales/en-US/translation.json
  29. 5 1
      src/lib/i18n/locales/es-ES/translation.json
  30. 5 1
      src/lib/i18n/locales/fa-IR/translation.json
  31. 5 1
      src/lib/i18n/locales/fi-FI/translation.json
  32. 5 1
      src/lib/i18n/locales/fr-CA/translation.json
  33. 5 1
      src/lib/i18n/locales/fr-FR/translation.json
  34. 5 1
      src/lib/i18n/locales/he-IL/translation.json
  35. 5 1
      src/lib/i18n/locales/hi-IN/translation.json
  36. 5 1
      src/lib/i18n/locales/hr-HR/translation.json
  37. 5 1
      src/lib/i18n/locales/it-IT/translation.json
  38. 5 1
      src/lib/i18n/locales/ja-JP/translation.json
  39. 5 1
      src/lib/i18n/locales/ka-GE/translation.json
  40. 5 1
      src/lib/i18n/locales/ko-KR/translation.json
  41. 5 1
      src/lib/i18n/locales/lt-LT/translation.json
  42. 5 1
      src/lib/i18n/locales/nb-NO/translation.json
  43. 5 1
      src/lib/i18n/locales/nl-NL/translation.json
  44. 5 1
      src/lib/i18n/locales/pa-IN/translation.json
  45. 5 1
      src/lib/i18n/locales/pl-PL/translation.json
  46. 5 1
      src/lib/i18n/locales/pt-BR/translation.json
  47. 215 211
      src/lib/i18n/locales/pt-PT/translation.json
  48. 5 1
      src/lib/i18n/locales/ru-RU/translation.json
  49. 5 1
      src/lib/i18n/locales/sr-RS/translation.json
  50. 5 1
      src/lib/i18n/locales/sv-SE/translation.json
  51. 5 1
      src/lib/i18n/locales/tk-TW/translation.json
  52. 5 1
      src/lib/i18n/locales/tr-TR/translation.json
  53. 5 1
      src/lib/i18n/locales/uk-UA/translation.json
  54. 5 1
      src/lib/i18n/locales/vi-VN/translation.json
  55. 10 6
      src/lib/i18n/locales/zh-CN/translation.json
  56. 5 1
      src/lib/i18n/locales/zh-TW/translation.json
  57. 1 0
      src/routes/(app)/workspace/models/create/+page.svelte
  58. 1 0
      src/routes/(app)/workspace/models/edit/+page.svelte

+ 14 - 0
CHANGELOG.md

@@ -5,6 +5,20 @@ 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.3.2] - 2024-06-10
+
+### Added
+
+- **🔍 Web Search Query Status**: The web search query will now persist in the results section to aid in easier debugging and tracking of search queries.
+- **🌐 New Web Search Provider**: We have added Serply as a new option for web search providers, giving you more choices for your search needs.
+- **🌏 Improved Translations**: We've enhanced translations for Chinese and Portuguese.
+
+### Fixed
+
+- **🎤 Audio File Upload Issue**: The bug that prevented audio files from being uploaded in chat input has been fixed, ensuring smooth communication.
+- **💬 Message Input Handling**: Improved the handling of message inputs by instantly clearing images and text after sending, along with immediate visual indications when a response message is loading, enhancing user feedback.
+- **⚙️ Parameter Registration and Validation**: Fixed the issue where parameters were not registering in certain cases and addressed the problem where users were unable to save due to invalid input errors.
+
 ## [0.3.1] - 2024-06-09
 
 ### Fixed

+ 1 - 1
README.md

@@ -33,7 +33,7 @@ Open WebUI is an [extensible](https://github.com/open-webui/pipelines), feature-
 
 - 📚 **Local RAG Integration**: Dive into the future of chat interactions with groundbreaking Retrieval Augmented Generation (RAG) support. This feature seamlessly integrates document interactions into your chat experience. You can load documents directly into the chat or add files to your document library, effortlessly accessing them using the `#` command before a query.
 
-- 🔍 **Web Search for RAG**: Perform web searches using providers like `SearXNG`, `Google PSE`, `Brave Search`, `serpstack`, and `serper`, and inject the results directly into your chat experience.
+- 🔍 **Web Search for RAG**: Perform web searches using providers like `SearXNG`, `Google PSE`, `Brave Search`, `serpstack`, `serper`, and `Serply` and inject the results directly into your chat experience.
 
 - 🌐 **Web Browsing Capability**: Seamlessly integrate websites into your chat experience using the `#` command followed by a URL. This feature allows you to incorporate web content directly into your conversations, enhancing the richness and depth of your interactions.
 

+ 18 - 1
backend/apps/rag/main.py

@@ -69,7 +69,7 @@ from apps.rag.search.main import SearchResult
 from apps.rag.search.searxng import search_searxng
 from apps.rag.search.serper import search_serper
 from apps.rag.search.serpstack import search_serpstack
-
+from apps.rag.search.serply import search_serply
 
 from utils.misc import (
     calculate_sha256,
@@ -115,6 +115,7 @@ from config import (
     SERPSTACK_API_KEY,
     SERPSTACK_HTTPS,
     SERPER_API_KEY,
+    SERPLY_API_KEY,
     RAG_WEB_SEARCH_RESULT_COUNT,
     RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
     RAG_EMBEDDING_OPENAI_BATCH_SIZE,
@@ -167,6 +168,7 @@ app.state.config.BRAVE_SEARCH_API_KEY = BRAVE_SEARCH_API_KEY
 app.state.config.SERPSTACK_API_KEY = SERPSTACK_API_KEY
 app.state.config.SERPSTACK_HTTPS = SERPSTACK_HTTPS
 app.state.config.SERPER_API_KEY = SERPER_API_KEY
+app.state.config.SERPLY_API_KEY = SERPLY_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
 
@@ -394,6 +396,7 @@ async def get_rag_config(user=Depends(get_admin_user)):
                 "serpstack_api_key": app.state.config.SERPSTACK_API_KEY,
                 "serpstack_https": app.state.config.SERPSTACK_HTTPS,
                 "serper_api_key": app.state.config.SERPER_API_KEY,
+                "serply_api_key": app.state.config.SERPLY_API_KEY,
                 "result_count": app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
                 "concurrent_requests": app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
             },
@@ -421,6 +424,7 @@ class WebSearchConfig(BaseModel):
     serpstack_api_key: Optional[str] = None
     serpstack_https: Optional[bool] = None
     serper_api_key: Optional[str] = None
+    serply_api_key: Optional[str] = None
     result_count: Optional[int] = None
     concurrent_requests: Optional[int] = None
 
@@ -471,6 +475,7 @@ async def update_rag_config(form_data: ConfigUpdateForm, user=Depends(get_admin_
         app.state.config.SERPSTACK_API_KEY = form_data.web.search.serpstack_api_key
         app.state.config.SERPSTACK_HTTPS = form_data.web.search.serpstack_https
         app.state.config.SERPER_API_KEY = form_data.web.search.serper_api_key
+        app.state.config.SERPLY_API_KEY = form_data.web.search.serply_api_key
         app.state.config.RAG_WEB_SEARCH_RESULT_COUNT = form_data.web.search.result_count
         app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS = (
             form_data.web.search.concurrent_requests
@@ -499,6 +504,7 @@ async def update_rag_config(form_data: ConfigUpdateForm, user=Depends(get_admin_
                 "serpstack_api_key": app.state.config.SERPSTACK_API_KEY,
                 "serpstack_https": app.state.config.SERPSTACK_HTTPS,
                 "serper_api_key": app.state.config.SERPER_API_KEY,
+                "serply_api_key": app.state.config.SERPLY_API_KEY,
                 "result_count": app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
                 "concurrent_requests": app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
             },
@@ -746,6 +752,7 @@ def search_web(engine: str, query: str) -> list[SearchResult]:
     - BRAVE_SEARCH_API_KEY
     - SERPSTACK_API_KEY
     - SERPER_API_KEY
+    - SERPLY_API_KEY
 
     Args:
         query (str): The query to search for
@@ -804,6 +811,15 @@ def search_web(engine: str, query: str) -> list[SearchResult]:
             )
         else:
             raise Exception("No SERPER_API_KEY found in environment variables")
+    elif engine == "serply":
+        if app.state.config.SERPLY_API_KEY:
+            return search_serply(
+                app.state.config.SERPLY_API_KEY,
+                query,
+                app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
+            )
+        else:
+            raise Exception("No SERPLY_API_KEY found in environment variables")
     else:
         raise Exception("No search engine API key found in environment variables")
 
@@ -811,6 +827,7 @@ def search_web(engine: str, query: str) -> list[SearchResult]:
 @app.post("/web/search")
 def store_web_search(form_data: SearchForm, user=Depends(get_current_user)):
     try:
+        logging.info(f"trying to web search with {app.state.config.RAG_WEB_SEARCH_ENGINE, form_data.query}")
         web_results = search_web(
             app.state.config.RAG_WEB_SEARCH_ENGINE, form_data.query
         )

+ 68 - 0
backend/apps/rag/search/serply.py

@@ -0,0 +1,68 @@
+import json
+import logging
+
+import requests
+from urllib.parse import urlencode
+
+from apps.rag.search.main import SearchResult
+from config import SRC_LOG_LEVELS
+
+log = logging.getLogger(__name__)
+log.setLevel(SRC_LOG_LEVELS["RAG"])
+
+
+def search_serply(
+        api_key: str,
+        query: str,
+        count: int,
+        hl: str = "us",
+        limit: int = 10,
+        device_type: str = "desktop",
+        proxy_location: str = "US"
+    ) -> list[SearchResult]:
+    """Search using serper.dev's API and return the results as a list of SearchResult objects.
+
+    Args:
+        api_key (str): A serply.io API key
+        query (str): The query to search for
+        hl (str): Host Language code to display results in (reference https://developers.google.com/custom-search/docs/xml_results?hl=en#wsInterfaceLanguages)
+        limit (int): The maximum number of results to return [10-100, defaults to 10]
+    """
+    log.info("Searching with Serply")
+
+    url = "https://api.serply.io/v1/search/"
+
+    query_payload = {
+        "q": query,
+        "language": "en",
+        "num": limit,
+        "gl": proxy_location.upper(),
+        "hl": hl.lower()
+    }
+
+    url = f"{url}{urlencode(query_payload)}"
+    headers = {
+        "X-API-KEY": api_key,
+        "X-User-Agent": device_type,
+        "User-Agent": "open-webui",
+        "X-Proxy-Location": proxy_location
+    }
+
+    response = requests.request("GET", url, headers=headers)
+    response.raise_for_status()
+
+    json_response = response.json()
+    log.info(f"results from serply search: {json_response}")
+
+    results = sorted(
+        json_response.get("results", []), key=lambda x: x.get("realPosition", 0)
+    )
+
+    return [
+        SearchResult(
+            link=result["link"],
+            title=result.get("title"),
+            snippet=result.get("description"),
+        )
+        for result in results[:count]
+    ]

+ 206 - 0
backend/apps/rag/search/testdata/serply.json

@@ -0,0 +1,206 @@
+{
+	"ads": [],
+	"ads_count": 0,
+	"answers": [],
+	"results": [
+		{
+			"title": "Apple",
+			"link": "https://www.apple.com/",
+			"description": "Discover the innovative world of Apple and shop everything iPhone, iPad, Apple Watch, Mac, and Apple TV, plus explore accessories, entertainment, ...",
+			"additional_links": [
+				{
+					"text": "AppleApplehttps://www.apple.com",
+					"href": "https://www.apple.com/"
+				}
+			],
+			"cite": {},
+			"subdomains": [
+				{
+					"title": "Support",
+					"link": "https://support.apple.com/",
+					"description": "SupportContact - iPhone Support - Billing and Subscriptions - Apple Repair"
+				},
+				{
+					"title": "Store",
+					"link": "https://www.apple.com/store",
+					"description": "StoreShop iPhone - Shop iPad - App Store - Shop Mac - ..."
+				},
+				{
+					"title": "Mac",
+					"link": "https://www.apple.com/mac/",
+					"description": "MacMacBook Air - MacBook Pro - iMac - Compare Mac models - Mac mini"
+				},
+				{
+					"title": "iPad",
+					"link": "https://www.apple.com/ipad/",
+					"description": "iPadShop iPad - iPad Pro - iPad Air - Compare iPad models - ..."
+				},
+				{
+					"title": "Watch",
+					"link": "https://www.apple.com/watch/",
+					"description": "WatchShop Apple Watch - Series 9 - SE - Ultra 2 - Nike - Hermès - ..."
+				}
+			],
+			"realPosition": 1
+		},
+		{
+			"title": "Apple",
+			"link": "https://www.apple.com/",
+			"description": "Discover the innovative world of Apple and shop everything iPhone, iPad, Apple Watch, Mac, and Apple TV, plus explore accessories, entertainment, ...",
+			"additional_links": [
+				{
+					"text": "AppleApplehttps://www.apple.com",
+					"href": "https://www.apple.com/"
+				}
+			],
+			"cite": {},
+			"realPosition": 2
+		},
+		{
+			"title": "Apple Inc.",
+			"link": "https://en.wikipedia.org/wiki/Apple_Inc.",
+			"description": "Apple Inc. (formerly Apple Computer, Inc.) is an American multinational corporation and technology company headquartered in Cupertino, California, ...",
+			"additional_links": [
+				{
+					"text": "Apple Inc.Wikipediahttps://en.wikipedia.org › wiki › Apple_Inc",
+					"href": "https://en.wikipedia.org/wiki/Apple_Inc."
+				},
+				{
+					"text": "",
+					"href": "https://en.wikipedia.org/wiki/Apple_Inc."
+				},
+				{
+					"text": "History",
+					"href": "https://en.wikipedia.org/wiki/History_of_Apple_Inc."
+				},
+				{
+					"text": "List of Apple products",
+					"href": "https://en.wikipedia.org/wiki/List_of_Apple_products"
+				},
+				{
+					"text": "Litigation involving Apple Inc.",
+					"href": "https://en.wikipedia.org/wiki/Litigation_involving_Apple_Inc."
+				},
+				{
+					"text": "Apple Park",
+					"href": "https://en.wikipedia.org/wiki/Apple_Park"
+				}
+			],
+			"cite": {
+				"domain": "https://en.wikipedia.org › wiki › Apple_Inc",
+				"span": " › wiki › Apple_Inc"
+			},
+			"realPosition": 3
+		},
+		{
+			"title": "Apple Inc. (AAPL) Company Profile & Facts",
+			"link": "https://finance.yahoo.com/quote/AAPL/profile/",
+			"description": "Apple Inc. designs, manufactures, and markets smartphones, personal computers, tablets, wearables, and accessories worldwide. The company offers iPhone, a line ...",
+			"additional_links": [
+				{
+					"text": "Apple Inc. (AAPL) Company Profile & FactsYahoo Financehttps://finance.yahoo.com › quote › AAPL › profile",
+					"href": "https://finance.yahoo.com/quote/AAPL/profile/"
+				}
+			],
+			"cite": {
+				"domain": "https://finance.yahoo.com › quote › AAPL › profile",
+				"span": " › quote › AAPL › profile"
+			},
+			"realPosition": 4
+		},
+		{
+			"title": "Apple Inc - Company Profile and News",
+			"link": "https://www.bloomberg.com/profile/company/AAPL:US",
+			"description": "Apple Inc. Apple Inc. designs, manufactures, and markets smartphones, personal computers, tablets, wearables and accessories, and sells a variety of related ...",
+			"additional_links": [
+				{
+					"text": "Apple Inc - Company Profile and NewsBloomberghttps://www.bloomberg.com › company › AAPL:US",
+					"href": "https://www.bloomberg.com/profile/company/AAPL:US"
+				},
+				{
+					"text": "",
+					"href": "https://www.bloomberg.com/profile/company/AAPL:US"
+				}
+			],
+			"cite": {
+				"domain": "https://www.bloomberg.com › company › AAPL:US",
+				"span": " › company › AAPL:US"
+			},
+			"realPosition": 5
+		},
+		{
+			"title": "Apple Inc. | History, Products, Headquarters, & Facts",
+			"link": "https://www.britannica.com/money/Apple-Inc",
+			"description": "May 22, 2024 — Apple Inc. is an American multinational technology company that revolutionized the technology sector through its innovation of computer ...",
+			"additional_links": [
+				{
+					"text": "Apple Inc. | History, Products, Headquarters, & FactsBritannicahttps://www.britannica.com › money › Apple-Inc",
+					"href": "https://www.britannica.com/money/Apple-Inc"
+				},
+				{
+					"text": "",
+					"href": "https://www.britannica.com/money/Apple-Inc"
+				}
+			],
+			"cite": {
+				"domain": "https://www.britannica.com › money › Apple-Inc",
+				"span": " › money › Apple-Inc"
+			},
+			"realPosition": 6
+		}
+	],
+	"shopping_ads": [],
+	"places": [
+		{
+			"title": "Apple Inc."
+		},
+		{
+			"title": "Apple Inc"
+		},
+		{
+			"title": "Apple Inc"
+		}
+	],
+	"related_searches": {
+		"images": [],
+		"text": [
+			{
+				"title": "apple inc full form",
+				"link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+Inc+full+form&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhPEAE"
+			},
+			{
+				"title": "apple company history",
+				"link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+company+history&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhOEAE"
+			},
+			{
+				"title": "apple store",
+				"link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+Store&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhQEAE"
+			},
+			{
+				"title": "apple id",
+				"link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+id&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhSEAE"
+			},
+			{
+				"title": "apple inc industry",
+				"link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+Inc+industry&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhREAE"
+			},
+			{
+				"title": "apple login",
+				"link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+login&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhTEAE"
+			}
+		]
+	},
+	"image_results": [],
+	"carousel": [],
+	"total": 2450000000,
+	"knowledge_graph": "",
+	"related_questions": [
+		"What does the Apple Inc do?",
+		"Why did Apple change to Apple Inc?",
+		"Who owns Apple Inc.?",
+		"What is Apple Inc best known for?"
+	],
+	"carousel_count": 0,
+	"ts": 2.491065263748169,
+	"device_type": null
+}

+ 9 - 2
backend/config.py

@@ -308,8 +308,9 @@ frontend_favicon = FRONTEND_BUILD_DIR / "favicon.png"
 if frontend_favicon.exists():
     try:
         shutil.copyfile(frontend_favicon, STATIC_DIR / "favicon.png")
-    except PermissionError:
-        logging.error(f"No write permission to {STATIC_DIR / 'favicon.png'}")
+    except Exception as e:
+        logging.error(f"An error occurred: {e}")
+
 else:
     logging.warning(f"Frontend favicon not found at {frontend_favicon}")
 
@@ -915,6 +916,12 @@ SERPER_API_KEY = PersistentConfig(
     os.getenv("SERPER_API_KEY", ""),
 )
 
+SERPLY_API_KEY = PersistentConfig(
+    "SERPLY_API_KEY",
+    "rag.web.search.serply_api_key",
+    os.getenv("SERPLY_API_KEY", ""),
+)
+
 
 RAG_WEB_SEARCH_RESULT_COUNT = PersistentConfig(
     "RAG_WEB_SEARCH_RESULT_COUNT",

+ 2 - 2
package-lock.json

@@ -1,12 +1,12 @@
 {
 	"name": "open-webui",
-	"version": "0.3.1",
+	"version": "0.3.2",
 	"lockfileVersion": 3,
 	"requires": true,
 	"packages": {
 		"": {
 			"name": "open-webui",
-			"version": "0.3.1",
+			"version": "0.3.2",
 			"dependencies": {
 				"@pyscript/core": "^0.4.32",
 				"@sveltejs/adapter-node": "^1.3.1",

+ 2 - 2
package.json

@@ -1,6 +1,6 @@
 {
 	"name": "open-webui",
-	"version": "0.3.1",
+	"version": "0.3.2",
 	"private": true,
 	"scripts": {
 		"dev": "npm run pyodide:fetch && vite dev --host",
@@ -71,4 +71,4 @@
 		"tippy.js": "^6.3.7",
 		"uuid": "^9.0.1"
 	}
-}
+}

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

@@ -11,7 +11,7 @@
 	export let saveHandler: Function;
 
 	let webConfig = null;
-	let webSearchEngines = ['searxng', 'google_pse', 'brave', 'serpstack', 'serper'];
+	let webSearchEngines = ['searxng', 'google_pse', 'brave', 'serpstack', 'serper', 'serply'];
 
 	let youtubeLanguage = 'en';
 	let youtubeTranslation = null;
@@ -188,6 +188,24 @@
 									</div>
 								</div>
 							</div>
+						{:else if webConfig.search.engine === 'serply'}
+							<div>
+								<div class=" self-center text-xs font-medium mb-1">
+									{$i18n.t('Serply API Key')}
+								</div>
+
+								<div class="flex w-full">
+									<div class="flex-1">
+										<input
+											class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
+											type="text"
+											placeholder={$i18n.t('Enter Serply API Key')}
+											bind:value={webConfig.search.serply_api_key}
+											autocomplete="off"
+										/>
+									</div>
+								</div>
+							</div>
 						{/if}
 					</div>
 				{/if}

+ 98 - 80
src/lib/components/chat/Chat.svelte

@@ -327,6 +327,9 @@
 				chatTextAreaElement.style.height = '';
 			}
 
+			const _files = JSON.parse(JSON.stringify(files));
+			files = [];
+
 			prompt = '';
 
 			// Create user message
@@ -338,7 +341,7 @@
 				role: 'user',
 				user: _user ?? undefined,
 				content: userPrompt,
-				files: files.length > 0 ? files : undefined,
+				files: _files.length > 0 ? _files : undefined,
 				timestamp: Math.floor(Date.now() / 1000), // Unix epoch
 				models: selectedModels.filter((m, mIdx) => selectedModels.indexOf(m) === mIdx)
 			};
@@ -355,32 +358,6 @@
 			// Wait until history/message have been updated
 			await tick();
 
-			// Create new chat if only one message in messages
-			if (messages.length == 1) {
-				if ($settings.saveChatHistory ?? true) {
-					chat = await createNewChat(localStorage.token, {
-						id: $chatId,
-						title: $i18n.t('New Chat'),
-						models: selectedModels,
-						system: $settings.system ?? undefined,
-						options: {
-							...($settings.params ?? {})
-						},
-						messages: messages,
-						history: history,
-						tags: [],
-						timestamp: Date.now()
-					});
-					await chats.set(await getChatList(localStorage.token));
-					await chatId.set(chat.id);
-				} else {
-					await chatId.set('local');
-				}
-				await tick();
-			}
-
-			files = [];
-
 			// Send prompt
 			_responses = await sendPrompt(userPrompt, userMessageId);
 		}
@@ -390,15 +367,78 @@
 
 	const sendPrompt = async (prompt, parentId, modelId = null) => {
 		let _responses = [];
+
+		// If modelId is provided, use it, else use selected model
+		let selectedModelIds = modelId
+			? [modelId]
+			: atSelectedModel !== undefined
+			? [atSelectedModel.id]
+			: selectedModels;
+
+		// Create response messages for each selected model
+		const responseMessageIds = {};
+		for (const modelId of selectedModelIds) {
+			const model = $models.filter((m) => m.id === modelId).at(0);
+
+			if (model) {
+				let responseMessageId = uuidv4();
+				let responseMessage = {
+					parentId: parentId,
+					id: responseMessageId,
+					childrenIds: [],
+					role: 'assistant',
+					content: '',
+					model: model.id,
+					modelName: model.name ?? model.id,
+					userContext: null,
+					timestamp: Math.floor(Date.now() / 1000) // Unix epoch
+				};
+
+				// Add message to history and Set currentId to messageId
+				history.messages[responseMessageId] = responseMessage;
+				history.currentId = responseMessageId;
+
+				// Append messageId to childrenIds of parent message
+				if (parentId !== null) {
+					history.messages[parentId].childrenIds = [
+						...history.messages[parentId].childrenIds,
+						responseMessageId
+					];
+				}
+
+				responseMessageIds[modelId] = responseMessageId;
+			}
+		}
+		await tick();
+
+		// Create new chat if only one message in messages
+		if (messages.length == 2) {
+			if ($settings.saveChatHistory ?? true) {
+				chat = await createNewChat(localStorage.token, {
+					id: $chatId,
+					title: $i18n.t('New Chat'),
+					models: selectedModels,
+					system: $settings.system ?? undefined,
+					options: {
+						...($settings.params ?? {})
+					},
+					messages: messages,
+					history: history,
+					tags: [],
+					timestamp: Date.now()
+				});
+				await chats.set(await getChatList(localStorage.token));
+				await chatId.set(chat.id);
+			} else {
+				await chatId.set('local');
+			}
+			await tick();
+		}
+
 		const _chatId = JSON.parse(JSON.stringify($chatId));
 
 		await Promise.all(
-			(modelId
-				? [modelId]
-				: atSelectedModel !== undefined
-				? [atSelectedModel.id]
-				: selectedModels
-			).map(async (modelId) => {
+			selectedModelIds.map(async (modelId) => {
 				console.log('modelId', modelId);
 				const model = $models.filter((m) => m.id === modelId).at(0);
 
@@ -416,33 +456,8 @@
 						);
 					}
 
-					// Create response message
-					let responseMessageId = uuidv4();
-					let responseMessage = {
-						parentId: parentId,
-						id: responseMessageId,
-						childrenIds: [],
-						role: 'assistant',
-						content: '',
-						model: model.id,
-						modelName: model.name ?? model.id,
-						userContext: null,
-						timestamp: Math.floor(Date.now() / 1000) // Unix epoch
-					};
-
-					// Add message to history and Set currentId to messageId
-					history.messages[responseMessageId] = responseMessage;
-					history.currentId = responseMessageId;
-
-					// Append messageId to childrenIds of parent message
-					if (parentId !== null) {
-						history.messages[parentId].childrenIds = [
-							...history.messages[parentId].childrenIds,
-							responseMessageId
-						];
-					}
-
-					await tick();
+					let responseMessageId = responseMessageIds[modelId];
+					let responseMessage = history.messages[responseMessageId];
 
 					let userContext = null;
 					if ($settings?.memory ?? false) {
@@ -451,7 +466,6 @@
 								toast.error(error);
 								return null;
 							});
-
 							if (res) {
 								if (res.documents[0].length > 0) {
 									userContext = res.documents.reduce((acc, doc, index) => {
@@ -477,7 +491,6 @@
 					}
 
 					let _response = null;
-
 					if (model?.owned_by === 'openai') {
 						_response = await sendPromptOpenAI(model, prompt, responseMessageId, _chatId);
 					} else if (model) {
@@ -502,11 +515,13 @@
 	const getWebSearchResults = async (model: string, parentId: string, responseId: string) => {
 		const responseMessage = history.messages[responseId];
 
-		responseMessage.status = {
-			done: false,
-			action: 'web_search',
-			description: $i18n.t('Generating search query')
-		};
+		responseMessage.statusHistory = [
+			{
+				done: false,
+				action: 'web_search',
+				description: $i18n.t('Generating search query')
+			}
+		];
 		messages = messages;
 
 		const prompt = history.messages[parentId].content;
@@ -519,19 +534,21 @@
 
 		if (!searchQuery) {
 			toast.warning($i18n.t('No search query generated'));
-			responseMessage.status = {
-				...responseMessage.status,
+			responseMessage.statusHistory.push({
 				done: true,
 				error: true,
+				action: 'web_search',
 				description: 'No search query generated'
-			};
+			});
+
 			messages = messages;
 		}
 
-		responseMessage.status = {
-			...responseMessage.status,
-			description: $i18n.t("Searching the web for '{{searchQuery}}'", { searchQuery })
-		};
+		responseMessage.statusHistory.push({
+			done: false,
+			action: 'web_search',
+			description: $i18n.t(`Searching "{{searchQuery}}"`, { searchQuery })
+		});
 		messages = messages;
 
 		const results = await runWebSearch(localStorage.token, searchQuery).catch((error) => {
@@ -542,12 +559,13 @@
 		});
 
 		if (results) {
-			responseMessage.status = {
-				...responseMessage.status,
+			responseMessage.statusHistory.push({
 				done: true,
+				action: 'web_search',
 				description: $i18n.t('Searched {{count}} sites', { count: results.filenames.length }),
+				query: searchQuery,
 				urls: results.filenames
-			};
+			});
 
 			if (responseMessage?.files ?? undefined === undefined) {
 				responseMessage.files = [];
@@ -562,12 +580,12 @@
 
 			messages = messages;
 		} else {
-			responseMessage.status = {
-				...responseMessage.status,
+			responseMessage.statusHistory.push({
 				done: true,
 				error: true,
+				action: 'web_search',
 				description: 'No search results found'
-			};
+			});
 			messages = messages;
 		}
 	};

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

@@ -29,6 +29,7 @@
 	import InputMenu from './MessageInput/InputMenu.svelte';
 	import Headphone from '../icons/Headphone.svelte';
 	import VoiceRecording from './MessageInput/VoiceRecording.svelte';
+	import { transcribeAudio } from '$lib/apis/audio';
 
 	const i18n = getContext('i18n');
 

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

@@ -205,7 +205,7 @@
 
 				if (_responses.at(0)) {
 					const content = _responses[0];
-					if (content) {
+					if ((content ?? '').trim() !== '') {
 						assistantSpeakingHandler(content);
 					}
 				}

+ 89 - 81
src/lib/components/chat/Messages/ResponseMessage.svelte

@@ -211,93 +211,98 @@
 			speaking = null;
 			speakingIdx = null;
 		} else {
-			speaking = true;
-
-			if ($config.audio.tts.engine === 'openai') {
-				loadingSpeech = true;
-
-				const sentences = extractSentences(message.content).reduce((mergedTexts, currentText) => {
-					const lastIndex = mergedTexts.length - 1;
-					if (lastIndex >= 0) {
-						const previousText = mergedTexts[lastIndex];
-						const wordCount = previousText.split(/\s+/).length;
-						if (wordCount < 2) {
-							mergedTexts[lastIndex] = previousText + ' ' + currentText;
+			if ((message?.content ?? '').trim() !== '') {
+				speaking = true;
+
+				if ($config.audio.tts.engine === 'openai') {
+					loadingSpeech = true;
+
+					const sentences = extractSentences(message.content).reduce((mergedTexts, currentText) => {
+						const lastIndex = mergedTexts.length - 1;
+						if (lastIndex >= 0) {
+							const previousText = mergedTexts[lastIndex];
+							const wordCount = previousText.split(/\s+/).length;
+							if (wordCount < 2) {
+								mergedTexts[lastIndex] = previousText + ' ' + currentText;
+							} else {
+								mergedTexts.push(currentText);
+							}
 						} else {
 							mergedTexts.push(currentText);
 						}
-					} else {
-						mergedTexts.push(currentText);
-					}
-					return mergedTexts;
-				}, []);
-
-				console.log(sentences);
-
-				sentencesAudio = sentences.reduce((a, e, i, arr) => {
-					a[i] = null;
-					return a;
-				}, {});
-
-				let lastPlayedAudioPromise = Promise.resolve(); // Initialize a promise that resolves immediately
-
-				for (const [idx, sentence] of sentences.entries()) {
-					const res = await synthesizeOpenAISpeech(
-						localStorage.token,
-						$settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice,
-						sentence
-					).catch((error) => {
-						toast.error(error);
-
-						speaking = null;
-						loadingSpeech = false;
-
-						return null;
-					});
-
-					if (res) {
-						const blob = await res.blob();
-						const blobUrl = URL.createObjectURL(blob);
-						const audio = new Audio(blobUrl);
-						sentencesAudio[idx] = audio;
-						loadingSpeech = false;
-						lastPlayedAudioPromise = lastPlayedAudioPromise.then(() => playAudio(idx));
-					}
-				}
-			} else {
-				let voices = [];
-				const getVoicesLoop = setInterval(async () => {
-					voices = await speechSynthesis.getVoices();
-					if (voices.length > 0) {
-						clearInterval(getVoicesLoop);
+						return mergedTexts;
+					}, []);
 
-						const voice =
-							voices
-								?.filter(
-									(v) => v.voiceURI === ($settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice)
-								)
-								?.at(0) ?? undefined;
+					console.log(sentences);
 
-						console.log(voice);
+					sentencesAudio = sentences.reduce((a, e, i, arr) => {
+						a[i] = null;
+						return a;
+					}, {});
 
-						const speak = new SpeechSynthesisUtterance(message.content);
+					let lastPlayedAudioPromise = Promise.resolve(); // Initialize a promise that resolves immediately
 
-						console.log(speak);
+					for (const [idx, sentence] of sentences.entries()) {
+						const res = await synthesizeOpenAISpeech(
+							localStorage.token,
+							$settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice,
+							sentence
+						).catch((error) => {
+							toast.error(error);
 
-						speak.onend = () => {
 							speaking = null;
-							if ($settings.conversationMode) {
-								document.getElementById('voice-input-button')?.click();
+							loadingSpeech = false;
+
+							return null;
+						});
+
+						if (res) {
+							const blob = await res.blob();
+							const blobUrl = URL.createObjectURL(blob);
+							const audio = new Audio(blobUrl);
+							sentencesAudio[idx] = audio;
+							loadingSpeech = false;
+							lastPlayedAudioPromise = lastPlayedAudioPromise.then(() => playAudio(idx));
+						}
+					}
+				} else {
+					let voices = [];
+					const getVoicesLoop = setInterval(async () => {
+						voices = await speechSynthesis.getVoices();
+						if (voices.length > 0) {
+							clearInterval(getVoicesLoop);
+
+							const voice =
+								voices
+									?.filter(
+										(v) =>
+											v.voiceURI === ($settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice)
+									)
+									?.at(0) ?? undefined;
+
+							console.log(voice);
+
+							const speak = new SpeechSynthesisUtterance(message.content);
+
+							console.log(speak);
+
+							speak.onend = () => {
+								speaking = null;
+								if ($settings.conversationMode) {
+									document.getElementById('voice-input-button')?.click();
+								}
+							};
+
+							if (voice) {
+								speak.voice = voice;
 							}
-						};
 
-						if (voice) {
-							speak.voice = voice;
+							speechSynthesis.speak(speak);
 						}
-
-						speechSynthesis.speak(speak);
-					}
-				}, 100);
+					}, 100);
+				}
+			} else {
+				toast.error('No content to speak');
 			}
 		}
 	};
@@ -415,26 +420,29 @@
 				class="prose chat-{message.role} w-full max-w-full dark:prose-invert prose-headings:my-0 prose-headings:-mb-4 prose-p:m-0 prose-p:-mb-6 prose-pre:my-0 prose-table:my-0 prose-blockquote:my-0 prose-img:my-0 prose-ul:-my-4 prose-ol:-my-4 prose-li:-my-3 prose-ul:-mb-6 prose-ol:-mb-8 prose-ol:p-0 prose-li:-mb-4 whitespace-pre-line"
 			>
 				<div>
-					{#if message?.status}
+					{#if (message?.statusHistory ?? [...(message?.status ? [message?.status] : [])]).length > 0}
+						{@const status = (
+							message?.statusHistory ?? [...(message?.status ? [message?.status] : [])]
+						).at(-1)}
 						<div class="flex items-center gap-2 pt-1 pb-1">
-							{#if message?.status?.done === false}
+							{#if status.done === false}
 								<div class="">
 									<Spinner className="size-4" />
 								</div>
 							{/if}
 
-							{#if message?.status?.action === 'web_search' && message?.status?.urls}
-								<WebSearchResults urls={message?.status?.urls}>
+							{#if status?.action === 'web_search' && status?.urls}
+								<WebSearchResults {status}>
 									<div class="flex flex-col justify-center -space-y-0.5">
 										<div class="text-base line-clamp-1 text-wrap">
-											{message.status.description}
+											{status?.description}
 										</div>
 									</div>
 								</WebSearchResults>
 							{:else}
 								<div class="flex flex-col justify-center -space-y-0.5">
 									<div class=" text-gray-500 dark:text-gray-500 text-base line-clamp-1 text-wrap">
-										{message.status.description}
+										{status?.description}
 									</div>
 								</div>
 							{/if}

+ 38 - 3
src/lib/components/chat/Messages/ResponseMessage/WebSearchResults.svelte

@@ -1,10 +1,11 @@
 <script lang="ts">
 	import ChevronDown from '$lib/components/icons/ChevronDown.svelte';
 	import ChevronUp from '$lib/components/icons/ChevronUp.svelte';
+	import MagnifyingGlass from '$lib/components/icons/MagnifyingGlass.svelte';
 	import { Collapsible } from 'bits-ui';
 	import { slide } from 'svelte/transition';
 
-	export let urls = [];
+	export let status = { urls: [], query: '' };
 	let state = false;
 </script>
 
@@ -27,11 +28,45 @@
 		class=" text-sm border border-gray-300/30 dark:border-gray-700/50 rounded-xl"
 		transition={slide}
 	>
-		{#each urls as url, urlIdx}
+		{#if status?.query}
+			<a
+				href="https://www.google.com/search?q={status.query}"
+				target="_blank"
+				class="flex w-full items-center p-3 px-4 border-b border-gray-300/30 dark:border-gray-700/50 group/item justify-between font-normal text-gray-800 dark:text-gray-300 no-underline"
+			>
+				<div class="flex gap-2 items-center">
+					<MagnifyingGlass />
+
+					<div class=" line-clamp-1">
+						{status.query}
+					</div>
+				</div>
+
+				<div
+					class=" ml-1 text-white dark:text-gray-900 group-hover/item:text-gray-600 dark:group-hover/item:text-white transition"
+				>
+					<!--  -->
+					<svg
+						xmlns="http://www.w3.org/2000/svg"
+						viewBox="0 0 16 16"
+						fill="currentColor"
+						class="size-4"
+					>
+						<path
+							fill-rule="evenodd"
+							d="M4.22 11.78a.75.75 0 0 1 0-1.06L9.44 5.5H5.75a.75.75 0 0 1 0-1.5h5.5a.75.75 0 0 1 .75.75v5.5a.75.75 0 0 1-1.5 0V6.56l-5.22 5.22a.75.75 0 0 1-1.06 0Z"
+							clip-rule="evenodd"
+						/>
+					</svg>
+				</div>
+			</a>
+		{/if}
+
+		{#each status.urls as url, urlIdx}
 			<a
 				href={url}
 				target="_blank"
-				class="flex w-full items-center p-3 px-4 {urlIdx === urls.length - 1
+				class="flex w-full items-center p-3 px-4 {urlIdx === status.urls.length - 1
 					? ''
 					: 'border-b border-gray-300/30 dark:border-gray-700/50'} group/item justify-between font-normal text-gray-800 dark:text-gray-300"
 			>

+ 164 - 160
src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte

@@ -5,21 +5,23 @@
 
 	const i18n = getContext('i18n');
 
+	export let admin = false;
+
 	export let params = {
 		// Advanced
-		seed: 0,
+		seed: null,
 		stop: null,
-		temperature: '',
-		frequency_penalty: '',
-		repeat_last_n: '',
-		mirostat: '',
-		mirostat_eta: '',
-		mirostat_tau: '',
-		top_k: '',
-		top_p: '',
-		tfs_z: '',
-		num_ctx: '',
-		max_tokens: '',
+		temperature: null,
+		frequency_penalty: null,
+		repeat_last_n: null,
+		mirostat: null,
+		mirostat_eta: null,
+		mirostat_tau: null,
+		top_k: null,
+		top_p: null,
+		tfs_z: null,
+		num_ctx: null,
+		max_tokens: null,
 		use_mmap: null,
 		use_mlock: null,
 		num_thread: null,
@@ -112,10 +114,10 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					params.temperature = (params?.temperature ?? '') === '' ? 0.8 : '';
+					params.temperature = (params?.temperature ?? null) === null ? 0.8 : null;
 				}}
 			>
-				{#if (params?.temperature ?? '') === ''}
+				{#if (params?.temperature ?? null) === null}
 					<span class="ml-2 self-center"> {$i18n.t('Default')} </span>
 				{:else}
 					<span class="ml-2 self-center"> {$i18n.t('Custom')} </span>
@@ -123,7 +125,7 @@
 			</button>
 		</div>
 
-		{#if (params?.temperature ?? '') !== ''}
+		{#if (params?.temperature ?? null) !== null}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -143,7 +145,7 @@
 						class=" bg-transparent text-center w-14"
 						min="0"
 						max="1"
-						step="0.05"
+						step="any"
 					/>
 				</div>
 			</div>
@@ -158,10 +160,10 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					params.mirostat = (params?.mirostat ?? '') === '' ? 0 : '';
+					params.mirostat = (params?.mirostat ?? null) === null ? 0 : null;
 				}}
 			>
-				{#if (params?.mirostat ?? '') === ''}
+				{#if (params?.mirostat ?? null) === null}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
 					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -169,7 +171,7 @@
 			</button>
 		</div>
 
-		{#if (params?.mirostat ?? '') !== ''}
+		{#if (params?.mirostat ?? null) !== null}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -204,10 +206,10 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					params.mirostat_eta = (params?.mirostat_eta ?? '') === '' ? 0.1 : '';
+					params.mirostat_eta = (params?.mirostat_eta ?? null) === null ? 0.1 : null;
 				}}
 			>
-				{#if (params?.mirostat_eta ?? '') === ''}
+				{#if (params?.mirostat_eta ?? null) === null}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
 					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -215,7 +217,7 @@
 			</button>
 		</div>
 
-		{#if (params?.mirostat_eta ?? '') !== ''}
+		{#if (params?.mirostat_eta ?? null) !== null}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -235,7 +237,7 @@
 						class=" bg-transparent text-center w-14"
 						min="0"
 						max="1"
-						step="0.05"
+						step="any"
 					/>
 				</div>
 			</div>
@@ -250,10 +252,10 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					params.mirostat_tau = (params?.mirostat_tau ?? '') === '' ? 5.0 : '';
+					params.mirostat_tau = (params?.mirostat_tau ?? null) === null ? 5.0 : null;
 				}}
 			>
-				{#if (params?.mirostat_tau ?? '') === ''}
+				{#if (params?.mirostat_tau ?? null) === null}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
 					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -261,7 +263,7 @@
 			</button>
 		</div>
 
-		{#if (params?.mirostat_tau ?? '') !== ''}
+		{#if (params?.mirostat_tau ?? null) !== null}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -281,7 +283,7 @@
 						class=" bg-transparent text-center w-14"
 						min="0"
 						max="10"
-						step="0.5"
+						step="any"
 					/>
 				</div>
 			</div>
@@ -296,10 +298,10 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					params.top_k = (params?.top_k ?? '') === '' ? 40 : '';
+					params.top_k = (params?.top_k ?? null) === null ? 40 : null;
 				}}
 			>
-				{#if (params?.top_k ?? '') === ''}
+				{#if (params?.top_k ?? null) === null}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
 					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -307,7 +309,7 @@
 			</button>
 		</div>
 
-		{#if (params?.top_k ?? '') !== ''}
+		{#if (params?.top_k ?? null) !== null}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -327,7 +329,7 @@
 						class=" bg-transparent text-center w-14"
 						min="0"
 						max="100"
-						step="0.5"
+						step="any"
 					/>
 				</div>
 			</div>
@@ -342,10 +344,10 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					params.top_p = (params?.top_p ?? '') === '' ? 0.9 : '';
+					params.top_p = (params?.top_p ?? null) === null ? 0.9 : null;
 				}}
 			>
-				{#if (params?.top_p ?? '') === ''}
+				{#if (params?.top_p ?? null) === null}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
 					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -353,7 +355,7 @@
 			</button>
 		</div>
 
-		{#if (params?.top_p ?? '') !== ''}
+		{#if (params?.top_p ?? null) !== null}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -373,7 +375,7 @@
 						class=" bg-transparent text-center w-14"
 						min="0"
 						max="1"
-						step="0.05"
+						step="any"
 					/>
 				</div>
 			</div>
@@ -388,10 +390,10 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					params.frequency_penalty = (params?.frequency_penalty ?? '') === '' ? 1.1 : '';
+					params.frequency_penalty = (params?.frequency_penalty ?? null) === null ? 1.1 : null;
 				}}
 			>
-				{#if (params?.frequency_penalty ?? '') === ''}
+				{#if (params?.frequency_penalty ?? null) === null}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
 					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -399,7 +401,7 @@
 			</button>
 		</div>
 
-		{#if (params?.frequency_penalty ?? '') !== ''}
+		{#if (params?.frequency_penalty ?? null) !== null}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -419,7 +421,7 @@
 						class=" bg-transparent text-center w-14"
 						min="0"
 						max="2"
-						step="0.05"
+						step="any"
 					/>
 				</div>
 			</div>
@@ -434,10 +436,10 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					params.repeat_last_n = (params?.repeat_last_n ?? '') === '' ? 64 : '';
+					params.repeat_last_n = (params?.repeat_last_n ?? null) === null ? 64 : null;
 				}}
 			>
-				{#if (params?.repeat_last_n ?? '') === ''}
+				{#if (params?.repeat_last_n ?? null) === null}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
 					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -445,7 +447,7 @@
 			</button>
 		</div>
 
-		{#if (params?.repeat_last_n ?? '') !== ''}
+		{#if (params?.repeat_last_n ?? null) !== null}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -480,10 +482,10 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					params.tfs_z = (params?.tfs_z ?? '') === '' ? 1 : '';
+					params.tfs_z = (params?.tfs_z ?? null) === null ? 1 : null;
 				}}
 			>
-				{#if (params?.tfs_z ?? '') === ''}
+				{#if (params?.tfs_z ?? null) === null}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
 					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -491,7 +493,7 @@
 			</button>
 		</div>
 
-		{#if (params?.tfs_z ?? '') !== ''}
+		{#if (params?.tfs_z ?? null) !== null}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -511,7 +513,7 @@
 						class=" bg-transparent text-center w-14"
 						min="0"
 						max="2"
-						step="0.05"
+						step="any"
 					/>
 				</div>
 			</div>
@@ -526,10 +528,10 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					params.num_ctx = (params?.num_ctx ?? '') === '' ? 2048 : '';
+					params.num_ctx = (params?.num_ctx ?? null) === null ? 2048 : null;
 				}}
 			>
-				{#if (params?.num_ctx ?? '') === ''}
+				{#if (params?.num_ctx ?? null) === null}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
 					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -537,7 +539,7 @@
 			</button>
 		</div>
 
-		{#if (params?.num_ctx ?? '') !== ''}
+		{#if (params?.num_ctx ?? null) !== null}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -571,10 +573,10 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					params.max_tokens = (params?.max_tokens ?? '') === '' ? 128 : '';
+					params.max_tokens = (params?.max_tokens ?? null) === null ? 128 : null;
 				}}
 			>
-				{#if (params?.max_tokens ?? '') === ''}
+				{#if (params?.max_tokens ?? null) === null}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
 					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -582,7 +584,7 @@
 			</button>
 		</div>
 
-		{#if (params?.max_tokens ?? '') !== ''}
+		{#if (params?.max_tokens ?? null) !== null}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -609,122 +611,124 @@
 		{/if}
 	</div>
 
-	<div class=" py-0.5 w-full justify-between">
-		<div class="flex w-full justify-between">
-			<div class=" self-center text-xs font-medium">{$i18n.t('use_mmap (Ollama)')}</div>
-
-			<button
-				class="p-1 px-3 text-xs flex rounded transition"
-				type="button"
-				on:click={() => {
-					params.use_mmap = (params?.use_mmap ?? null) === null ? true : null;
-				}}
-			>
-				{#if (params?.use_mmap ?? null) === null}
-					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
-				{:else}
-					<span class="ml-2 self-center">{$i18n.t('On')}</span>
-				{/if}
-			</button>
+	{#if admin}
+		<div class=" py-0.5 w-full justify-between">
+			<div class="flex w-full justify-between">
+				<div class=" self-center text-xs font-medium">{$i18n.t('use_mmap (Ollama)')}</div>
+
+				<button
+					class="p-1 px-3 text-xs flex rounded transition"
+					type="button"
+					on:click={() => {
+						params.use_mmap = (params?.use_mmap ?? null) === null ? true : null;
+					}}
+				>
+					{#if (params?.use_mmap ?? null) === null}
+						<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+					{:else}
+						<span class="ml-2 self-center">{$i18n.t('On')}</span>
+					{/if}
+				</button>
+			</div>
 		</div>
-	</div>
 
-	<div class=" py-0.5 w-full justify-between">
-		<div class="flex w-full justify-between">
-			<div class=" self-center text-xs font-medium">{$i18n.t('use_mlock (Ollama)')}</div>
-
-			<button
-				class="p-1 px-3 text-xs flex rounded transition"
-				type="button"
-				on:click={() => {
-					params.use_mlock = (params?.use_mlock ?? null) === null ? true : null;
-				}}
-			>
-				{#if (params?.use_mlock ?? null) === null}
-					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
-				{:else}
-					<span class="ml-2 self-center">{$i18n.t('On')}</span>
-				{/if}
-			</button>
+		<div class=" py-0.5 w-full justify-between">
+			<div class="flex w-full justify-between">
+				<div class=" self-center text-xs font-medium">{$i18n.t('use_mlock (Ollama)')}</div>
+
+				<button
+					class="p-1 px-3 text-xs flex rounded transition"
+					type="button"
+					on:click={() => {
+						params.use_mlock = (params?.use_mlock ?? null) === null ? true : null;
+					}}
+				>
+					{#if (params?.use_mlock ?? null) === null}
+						<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+					{:else}
+						<span class="ml-2 self-center">{$i18n.t('On')}</span>
+					{/if}
+				</button>
+			</div>
 		</div>
-	</div>
 
-	<div class=" py-0.5 w-full justify-between">
-		<div class="flex w-full justify-between">
-			<div class=" self-center text-xs font-medium">{$i18n.t('num_thread (Ollama)')}</div>
+		<div class=" py-0.5 w-full justify-between">
+			<div class="flex w-full justify-between">
+				<div class=" self-center text-xs font-medium">{$i18n.t('num_thread (Ollama)')}</div>
+
+				<button
+					class="p-1 px-3 text-xs flex rounded transition"
+					type="button"
+					on:click={() => {
+						params.num_thread = (params?.num_thread ?? null) === null ? 2 : null;
+					}}
+				>
+					{#if (params?.num_thread ?? null) === null}
+						<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+					{:else}
+						<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
+					{/if}
+				</button>
+			</div>
 
-			<button
-				class="p-1 px-3 text-xs flex rounded transition"
-				type="button"
-				on:click={() => {
-					params.num_thread = (params?.num_thread ?? null) === null ? 2 : null;
-				}}
-			>
-				{#if (params?.num_thread ?? null) === null}
-					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
-				{:else}
-					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
-				{/if}
-			</button>
+			{#if (params?.num_thread ?? null) !== null}
+				<div class="flex mt-0.5 space-x-2">
+					<div class=" flex-1">
+						<input
+							id="steps-range"
+							type="range"
+							min="1"
+							max="256"
+							step="1"
+							bind:value={params.num_thread}
+							class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
+						/>
+					</div>
+					<div class="">
+						<input
+							bind:value={params.num_thread}
+							type="number"
+							class=" bg-transparent text-center w-14"
+							min="1"
+							max="256"
+							step="1"
+						/>
+					</div>
+				</div>
+			{/if}
 		</div>
 
-		{#if (params?.num_thread ?? null) !== null}
-			<div class="flex mt-0.5 space-x-2">
-				<div class=" flex-1">
-					<input
-						id="steps-range"
-						type="range"
-						min="1"
-						max="256"
-						step="1"
-						bind:value={params.num_thread}
-						class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
-					/>
-				</div>
-				<div class="">
-					<input
-						bind:value={params.num_thread}
-						type="number"
-						class=" bg-transparent text-center w-14"
-						min="1"
-						max="256"
-						step="1"
-					/>
-				</div>
+		<!-- <div class=" py-0.5 w-full justify-between">
+			<div class="flex w-full justify-between">
+				<div class=" self-center text-xs font-medium">{$i18n.t('Template')}</div>
+
+				<button
+					class="p-1 px-3 text-xs flex rounded transition"
+					type="button"
+					on:click={() => {
+						params.template = (params?.template ?? null) === null ? '' : null;
+					}}
+				>
+					{#if (params?.template ?? null) === null}
+						<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+					{:else}
+						<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
+					{/if}
+				</button>
 			</div>
-		{/if}
-	</div>
-
-	<div class=" py-0.5 w-full justify-between">
-		<div class="flex w-full justify-between">
-			<div class=" self-center text-xs font-medium">{$i18n.t('Template')}</div>
 
-			<button
-				class="p-1 px-3 text-xs flex rounded transition"
-				type="button"
-				on:click={() => {
-					params.template = (params?.template ?? null) === null ? '' : null;
-				}}
-			>
-				{#if (params?.template ?? null) === null}
-					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
-				{:else}
-					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
-				{/if}
-			</button>
-		</div>
-
-		{#if (params?.template ?? null) !== null}
-			<div class="flex mt-0.5 space-x-2">
-				<div class=" flex-1">
-					<textarea
-						class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg -mb-1"
-						placeholder="Write your model template content here"
-						rows="4"
-						bind:value={params.template}
-					/>
+			{#if (params?.template ?? null) !== null}
+				<div class="flex mt-0.5 space-x-2">
+					<div class=" flex-1">
+						<textarea
+							class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg -mb-1"
+							placeholder="Write your model template content here"
+							rows="4"
+							bind:value={params.template}
+						/>
+					</div>
 				</div>
-			</div>
-		{/if}
-	</div>
+			{/if}
+		</div> -->
+	{/if}
 </div>

+ 29 - 32
src/lib/components/chat/Settings/General.svelte

@@ -4,7 +4,7 @@
 	import { getLanguages } from '$lib/i18n';
 	const dispatch = createEventDispatcher();
 
-	import { models, settings, theme } from '$lib/stores';
+	import { models, settings, theme, user } from '$lib/stores';
 
 	const i18n = getContext('i18n');
 
@@ -43,19 +43,19 @@
 
 	let params = {
 		// Advanced
-		seed: 0,
-		temperature: '',
-		frequency_penalty: '',
-		repeat_last_n: '',
-		mirostat: '',
-		mirostat_eta: '',
-		mirostat_tau: '',
-		top_k: '',
-		top_p: '',
+		seed: null,
+		temperature: null,
+		frequency_penalty: null,
+		repeat_last_n: null,
+		mirostat: null,
+		mirostat_eta: null,
+		mirostat_tau: null,
+		top_k: null,
+		top_p: null,
 		stop: null,
-		tfs_z: '',
-		num_ctx: '',
-		max_tokens: ''
+		tfs_z: null,
+		num_ctx: null,
+		max_tokens: null
 	};
 
 	const toggleRequestFormat = async () => {
@@ -79,12 +79,6 @@
 		requestFormat = $settings.requestFormat ?? '';
 		keepAlive = $settings.keepAlive ?? null;
 
-		params.seed = $settings.seed ?? 0;
-		params.temperature = $settings.temperature ?? '';
-		params.frequency_penalty = $settings.frequency_penalty ?? '';
-		params.top_k = $settings.top_k ?? '';
-		params.top_p = $settings.top_p ?? '';
-		params.num_ctx = $settings.num_ctx ?? '';
 		params = { ...params, ...$settings.params };
 		params.stop = $settings?.params?.stop ? ($settings?.params?.stop ?? []).join(',') : null;
 	});
@@ -227,7 +221,7 @@
 			</div>
 
 			{#if showAdvanced}
-				<AdvancedParams bind:params />
+				<AdvancedParams admin={$user?.role === 'admin'} bind:params />
 				<hr class=" dark:border-gray-850" />
 
 				<div class=" py-1 w-full justify-between">
@@ -300,20 +294,23 @@
 				saveSettings({
 					system: system !== '' ? system : undefined,
 					params: {
-						seed: (params.seed !== 0 ? params.seed : undefined) ?? undefined,
+						seed: (params.seed !== null ? params.seed : undefined) ?? undefined,
 						stop: params.stop ? params.stop.split(',').filter((e) => e) : undefined,
-						temperature: params.temperature !== '' ? params.temperature : undefined,
+						temperature: params.temperature !== null ? params.temperature : undefined,
 						frequency_penalty:
-							params.frequency_penalty !== '' ? params.frequency_penalty : undefined,
-						repeat_last_n: params.repeat_last_n !== '' ? params.repeat_last_n : undefined,
-						mirostat: params.mirostat !== '' ? params.mirostat : undefined,
-						mirostat_eta: params.mirostat_eta !== '' ? params.mirostat_eta : undefined,
-						mirostat_tau: params.mirostat_tau !== '' ? params.mirostat_tau : undefined,
-						top_k: params.top_k !== '' ? params.top_k : undefined,
-						top_p: params.top_p !== '' ? params.top_p : undefined,
-						tfs_z: params.tfs_z !== '' ? params.tfs_z : undefined,
-						num_ctx: params.num_ctx !== '' ? params.num_ctx : undefined,
-						max_tokens: params.max_tokens !== '' ? params.max_tokens : undefined
+							params.frequency_penalty !== null ? params.frequency_penalty : undefined,
+						repeat_last_n: params.repeat_last_n !== null ? params.repeat_last_n : undefined,
+						mirostat: params.mirostat !== null ? params.mirostat : undefined,
+						mirostat_eta: params.mirostat_eta !== null ? params.mirostat_eta : undefined,
+						mirostat_tau: params.mirostat_tau !== null ? params.mirostat_tau : undefined,
+						top_k: params.top_k !== null ? params.top_k : undefined,
+						top_p: params.top_p !== null ? params.top_p : undefined,
+						tfs_z: params.tfs_z !== null ? params.tfs_z : undefined,
+						num_ctx: params.num_ctx !== null ? params.num_ctx : undefined,
+						max_tokens: params.max_tokens !== null ? params.max_tokens : undefined,
+						use_mmap: params.use_mmap !== null ? params.use_mmap : undefined,
+						use_mlock: params.use_mlock !== null ? params.use_mlock : undefined,
+						num_thread: params.num_thread !== null ? params.num_thread : undefined
 					},
 					keepAlive: keepAlive ? (isNaN(keepAlive) ? keepAlive : parseInt(keepAlive)) : undefined
 				});

+ 1 - 1
src/lib/components/documents/Settings/WebParams.svelte

@@ -11,7 +11,7 @@
 	export let saveHandler: Function;
 
 	let webConfig = null;
-	let webSearchEngines = ['searxng', 'google_pse', 'brave', 'serpstack', 'serper'];
+	let webSearchEngines = ['searxng', 'google_pse', 'brave', 'serpstack', 'serper', 'serply'];
 
 	let youtubeLanguage = 'en';
 	let youtubeTranslation = null;

+ 19 - 0
src/lib/components/icons/MagnifyingGlass.svelte

@@ -0,0 +1,19 @@
+<script lang="ts">
+	export let className = 'size-4';
+	export let strokeWidth = '2';
+</script>
+
+<svg
+	xmlns="http://www.w3.org/2000/svg"
+	fill="none"
+	viewBox="0 0 24 24"
+	stroke-width={strokeWidth}
+	stroke="currentColor"
+	class={className}
+>
+	<path
+		stroke-linecap="round"
+		stroke-linejoin="round"
+		d="m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z"
+	/>
+</svg>

+ 2 - 2
src/lib/components/workspace/Models/Knowledge.svelte

@@ -13,7 +13,7 @@
 	</div>
 
 	<div class=" text-xs dark:text-gray-500">
-		To add documents here, upload them to the "Documents" workspace first.
+		{$i18n.t('To add documents here, upload them to the "Documents" workspace first.')}
 	</div>
 
 	<div class="flex flex-col">
@@ -97,7 +97,7 @@
 			<Selector bind:knowledge>
 				<button
 					class=" px-3.5 py-1.5 font-medium hover:bg-black/5 dark:hover:bg-white/5 outline outline-1 outline-gray-300 dark:outline-gray-800 rounded-3xl"
-					type="button">Select Documents</button
+					type="button">{$i18n.t('Select Documents')}</button
 				>
 			</Selector>
 		</div>

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

@@ -201,6 +201,7 @@
 	"Enter Score": "أدخل النتيجة",
 	"Enter Searxng Query URL": "أدخل عنوان URL لاستعلام Searxng",
 	"Enter Serper API Key": "أدخل مفتاح واجهة برمجة تطبيقات Serper",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "أدخل مفتاح واجهة برمجة تطبيقات Serpstack",
 	"Enter stop sequence": "أدخل تسلسل التوقف",
 	"Enter Top K": "أدخل Top K",
@@ -425,7 +426,7 @@
 	"Searched {{count}} sites_few": "تم البحث في {{count}} sites_few",
 	"Searched {{count}} sites_many": "تم البحث في {{count}} sites_many",
 	"Searched {{count}} sites_other": "تم البحث في {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "البحث في الويب عن \"{{searchQuery}}\"",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "عنوان URL لاستعلام Searxng",
 	"See readme.md for instructions": "readme.md للحصول على التعليمات",
 	"See what's new": "ما الجديد",
@@ -437,6 +438,7 @@
 	"Select a pipeline": "حدد مسارا",
 	"Select a pipeline url": "حدد عنوان URL لخط الأنابيب",
 	"Select an Ollama instance": "أختار سيرفر ",
+	"Select Documents": "",
 	"Select model": " أختار موديل",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "النموذج (النماذج) المحددة لا تدعم مدخلات الصور",
@@ -445,6 +447,7 @@
 	"Send message": "يُرجى إدخال طلبك هنا.",
 	"September": "سبتمبر",
 	"Serper API Key": "مفتاح واجهة برمجة تطبيقات سيربر",
+	"Serply API Key": "",
 	"Serpstack API Key": "مفتاح واجهة برمجة تطبيقات Serpstack",
 	"Server connection verified": "تم التحقق من اتصال الخادم",
 	"Set as default": "الافتراضي",
@@ -509,6 +512,7 @@
 	"To access the available model names for downloading,": "للوصول إلى أسماء الموديلات المتاحة للتنزيل،",
 	"To access the GGUF models available for downloading,": "للوصول إلى الموديلات GGUF المتاحة للتنزيل،",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "الى كتابة المحادثه",
 	"Today": "اليوم",
 	"Toggle settings": "فتح وأغلاق الاعدادات",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "Въведете оценка",
 	"Enter Searxng Query URL": "Въведете URL адреса на заявката на Searxng",
 	"Enter Serper API Key": "Въведете Serper API ключ",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Въведете Serpstack API ключ",
 	"Enter stop sequence": "Въведете стоп последователност",
 	"Enter Top K": "Въведете Top K",
@@ -421,7 +422,7 @@
 	"Search Result Count": "Брой резултати от търсенето",
 	"Searched {{count}} sites_one": "Търси се в {{count}} sites_one",
 	"Searched {{count}} sites_other": "Търси се в {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "Търсене в уеб за '{{searchQuery}}'",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "URL адрес на заявка на Searxng",
 	"See readme.md for instructions": "Виж readme.md за инструкции",
 	"See what's new": "Виж какво е новото",
@@ -433,6 +434,7 @@
 	"Select a pipeline": "Изберете тръбопровод",
 	"Select a pipeline url": "Избор на URL адрес на канал",
 	"Select an Ollama instance": "Изберете Ollama инстанция",
+	"Select Documents": "",
 	"Select model": "Изберете модел",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "Избраният(те) модел(и) не поддържа въвеждане на изображения",
@@ -441,6 +443,7 @@
 	"Send message": "Изпращане на съобщение",
 	"September": "Септември",
 	"Serper API Key": "Serper API ключ",
+	"Serply API Key": "",
 	"Serpstack API Key": "Serpstack API ключ",
 	"Server connection verified": "Server connection verified",
 	"Set as default": "Задай по подразбиране",
@@ -505,6 +508,7 @@
 	"To access the available model names for downloading,": "За да получите достъп до наличните имена на модели за изтегляне,",
 	"To access the GGUF models available for downloading,": "За да получите достъп до GGUF моделите, налични за изтегляне,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "към чат входа.",
 	"Today": "днес",
 	"Toggle settings": "Toggle settings",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "স্কোর দিন",
 	"Enter Searxng Query URL": "Searxng ক্যোয়ারী URL লিখুন",
 	"Enter Serper API Key": "Serper API কী লিখুন",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Serpstack API কী লিখুন",
 	"Enter stop sequence": "স্টপ সিকোয়েন্স লিখুন",
 	"Enter Top K": "Top K লিখুন",
@@ -421,7 +422,7 @@
 	"Search Result Count": "অনুসন্ধানের ফলাফল গণনা",
 	"Searched {{count}} sites_one": "{{কাউন্ট}} অনুসন্ধান করা হয়েছে sites_one",
 	"Searched {{count}} sites_other": "{{কাউন্ট}} অনুসন্ধান করা হয়েছে sites_other",
-	"Searching the web for '{{searchQuery}}'": "'{{searchQuery}}' এর জন্য ওয়েবে অনুসন্ধান করা হচ্ছে",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "Searxng ক্যোয়ারী URL",
 	"See readme.md for instructions": "নির্দেশিকার জন্য readme.md দেখুন",
 	"See what's new": "নতুন কী আছে দেখুন",
@@ -433,6 +434,7 @@
 	"Select a pipeline": "একটি পাইপলাইন নির্বাচন করুন",
 	"Select a pipeline url": "একটি পাইপলাইন URL নির্বাচন করুন",
 	"Select an Ollama instance": "একটি Ollama ইন্সট্যান্স নির্বাচন করুন",
+	"Select Documents": "",
 	"Select model": "মডেল নির্বাচন করুন",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "নির্বাচিত মডেল(গুলি) চিত্র ইনপুট সমর্থন করে না",
@@ -441,6 +443,7 @@
 	"Send message": "মেসেজ পাঠান",
 	"September": "সেপ্টেম্বর",
 	"Serper API Key": "Serper API Key",
+	"Serply API Key": "",
 	"Serpstack API Key": "Serpstack API Key",
 	"Server connection verified": "সার্ভার কানেকশন যাচাই করা হয়েছে",
 	"Set as default": "ডিফল্ট হিসেবে নির্ধারণ করুন",
@@ -505,6 +508,7 @@
 	"To access the available model names for downloading,": "ডাউনলোডের জন্য এভেইলএবল মডেলের নামগুলো এক্সেস করতে,",
 	"To access the GGUF models available for downloading,": "ডাউলোডের জন্য এভেইলএবল GGUF মডেলগুলো এক্সেস করতে,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "চ্যাট ইনপুটে",
 	"Today": "আজ",
 	"Toggle settings": "সেটিংস টোগল",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "Introdueix el Puntuació",
 	"Enter Searxng Query URL": "Introduïu l'URL de consulta de Searxng",
 	"Enter Serper API Key": "Introduïu la clau de l'API Serper",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Introduïu la clau de l'API Serpstack",
 	"Enter stop sequence": "Introdueix la seqüència de parada",
 	"Enter Top K": "Introdueix Top K",
@@ -422,7 +423,7 @@
 	"Searched {{count}} sites_one": "Cercat {{count}} sites_one",
 	"Searched {{count}} sites_many": "Cercat {{recompte}} sites_many",
 	"Searched {{count}} sites_other": "Cercat {{recompte}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "Cerca a la web de '{{searchQuery}}'",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "Searxng URL de consulta",
 	"See readme.md for instructions": "Consulta el readme.md per a instruccions",
 	"See what's new": "Veure novetats",
@@ -434,6 +435,7 @@
 	"Select a pipeline": "Seleccioneu una canonada",
 	"Select a pipeline url": "Seleccionar un URL de canonada",
 	"Select an Ollama instance": "Selecciona una instància d'Ollama",
+	"Select Documents": "",
 	"Select model": "Selecciona un model",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "Els models seleccionats no admeten l'entrada d'imatges",
@@ -442,6 +444,7 @@
 	"Send message": "Envia missatge",
 	"September": "Setembre",
 	"Serper API Key": "Clau API Serper",
+	"Serply API Key": "",
 	"Serpstack API Key": "Serpstack API Key",
 	"Server connection verified": "Connexió al servidor verificada",
 	"Set as default": "Estableix com a predeterminat",
@@ -506,6 +509,7 @@
 	"To access the available model names for downloading,": "Per accedir als noms dels models disponibles per descarregar,",
 	"To access the GGUF models available for downloading,": "Per accedir als models GGUF disponibles per descarregar,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "a l'entrada del xat.",
 	"Today": "Avui",
 	"Toggle settings": "Commuta configuracions",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "",
 	"Enter Searxng Query URL": "",
 	"Enter Serper API Key": "",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "",
 	"Enter stop sequence": "Pagsulod sa katapusan nga han-ay",
 	"Enter Top K": "Pagsulod sa Top K",
@@ -421,7 +422,7 @@
 	"Search Result Count": "",
 	"Searched {{count}} sites_one": "",
 	"Searched {{count}} sites_other": "",
-	"Searching the web for '{{searchQuery}}'": "",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "",
 	"See readme.md for instructions": "Tan-awa ang readme.md alang sa mga panudlo",
 	"See what's new": "Tan-awa unsay bag-o",
@@ -433,6 +434,7 @@
 	"Select a pipeline": "",
 	"Select a pipeline url": "",
 	"Select an Ollama instance": "Pagpili usa ka pananglitan sa Ollama",
+	"Select Documents": "",
 	"Select model": "Pagpili og modelo",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "",
@@ -441,6 +443,7 @@
 	"Send message": "Magpadala ug mensahe",
 	"September": "",
 	"Serper API Key": "",
+	"Serply API Key": "",
 	"Serpstack API Key": "",
 	"Server connection verified": "Gipamatud-an nga koneksyon sa server",
 	"Set as default": "Define pinaagi sa default",
@@ -505,6 +508,7 @@
 	"To access the available model names for downloading,": "Aron ma-access ang mga ngalan sa modelo nga ma-download,",
 	"To access the GGUF models available for downloading,": "Aron ma-access ang mga modelo sa GGUF nga magamit alang sa pag-download,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "sa entrada sa iring.",
 	"Today": "",
 	"Toggle settings": "I-toggle ang mga setting",

+ 5 - 1
src/lib/i18n/locales/de-DE/translation.json

@@ -201,6 +201,7 @@
 	"Enter Score": "Score eingeben",
 	"Enter Searxng Query URL": "Geben Sie die Searxng-Abfrage-URL ein",
 	"Enter Serper API Key": "Serper-API-Schlüssel eingeben",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Geben Sie den Serpstack-API-Schlüssel ein",
 	"Enter stop sequence": "Stop-Sequenz eingeben",
 	"Enter Top K": "Gib Top K ein",
@@ -421,7 +422,7 @@
 	"Search Result Count": "Anzahl der Suchergebnisse",
 	"Searched {{count}} sites_one": "Gesucht {{count}} sites_one",
 	"Searched {{count}} sites_other": "Gesucht {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "Suche im Web nach '{{searchQuery}}'",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "Searxng-Abfrage-URL",
 	"See readme.md for instructions": "Anleitung in readme.md anzeigen",
 	"See what's new": "Was gibt's Neues",
@@ -433,6 +434,7 @@
 	"Select a pipeline": "Wählen Sie eine Pipeline aus",
 	"Select a pipeline url": "Auswählen einer Pipeline-URL",
 	"Select an Ollama instance": "Eine Ollama Instanz auswählen",
+	"Select Documents": "",
 	"Select model": "Modell auswählen",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "Ausgewählte Modelle unterstützen keine Bildeingaben",
@@ -441,6 +443,7 @@
 	"Send message": "Nachricht senden",
 	"September": "September",
 	"Serper API Key": "Serper-API-Schlüssel",
+	"Serply API Key": "",
 	"Serpstack API Key": "Serpstack-API-Schlüssel",
 	"Server connection verified": "Serververbindung überprüft",
 	"Set as default": "Als Standard festlegen",
@@ -505,6 +508,7 @@
 	"To access the available model names for downloading,": "Um auf die verfügbaren Modellnamen zum Herunterladen zuzugreifen,",
 	"To access the GGUF models available for downloading,": "Um auf die verfügbaren GGUF Modelle zum Herunterladen zuzugreifen",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "to chat input.",
 	"Today": "Heute",
 	"Toggle settings": "Einstellungen umschalten",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "",
 	"Enter Searxng Query URL": "",
 	"Enter Serper API Key": "",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "",
 	"Enter stop sequence": "Enter stop bark",
 	"Enter Top K": "Enter Top Wow",
@@ -421,7 +422,7 @@
 	"Search Result Count": "",
 	"Searched {{count}} sites_one": "",
 	"Searched {{count}} sites_other": "",
-	"Searching the web for '{{searchQuery}}'": "",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "",
 	"See readme.md for instructions": "See readme.md for instructions wow",
 	"See what's new": "See what's new so amaze",
@@ -433,6 +434,7 @@
 	"Select a pipeline": "",
 	"Select a pipeline url": "",
 	"Select an Ollama instance": "Select an Ollama instance very choose",
+	"Select Documents": "",
 	"Select model": "Select model much choice",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "",
@@ -441,6 +443,7 @@
 	"Send message": "Send message very send",
 	"September": "",
 	"Serper API Key": "",
+	"Serply API Key": "",
 	"Serpstack API Key": "",
 	"Server connection verified": "Server connection verified much secure",
 	"Set as default": "Set as default very default",
@@ -505,6 +508,7 @@
 	"To access the available model names for downloading,": "To access the available model names for downloading, much access",
 	"To access the GGUF models available for downloading,": "To access the GGUF models available for downloading, much access",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "to chat input. Very chat.",
 	"Today": "",
 	"Toggle settings": "Toggle settings much toggle",

+ 5 - 1
src/lib/i18n/locales/en-GB/translation.json

@@ -201,6 +201,7 @@
 	"Enter Score": "",
 	"Enter Searxng Query URL": "",
 	"Enter Serper API Key": "",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "",
 	"Enter stop sequence": "",
 	"Enter Top K": "",
@@ -421,7 +422,7 @@
 	"Search Result Count": "",
 	"Searched {{count}} sites_one": "",
 	"Searched {{count}} sites_other": "",
-	"Searching the web for '{{searchQuery}}'": "",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "",
 	"See readme.md for instructions": "",
 	"See what's new": "",
@@ -433,6 +434,7 @@
 	"Select a pipeline": "",
 	"Select a pipeline url": "",
 	"Select an Ollama instance": "",
+	"Select Documents": "",
 	"Select model": "",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "",
@@ -441,6 +443,7 @@
 	"Send message": "",
 	"September": "",
 	"Serper API Key": "",
+	"Serply API Key": "",
 	"Serpstack API Key": "",
 	"Server connection verified": "",
 	"Set as default": "",
@@ -505,6 +508,7 @@
 	"To access the available model names for downloading,": "",
 	"To access the GGUF models available for downloading,": "",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "",
 	"Today": "",
 	"Toggle settings": "",

+ 5 - 1
src/lib/i18n/locales/en-US/translation.json

@@ -201,6 +201,7 @@
 	"Enter Score": "",
 	"Enter Searxng Query URL": "",
 	"Enter Serper API Key": "",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "",
 	"Enter stop sequence": "",
 	"Enter Top K": "",
@@ -421,7 +422,7 @@
 	"Search Result Count": "",
 	"Searched {{count}} sites_one": "",
 	"Searched {{count}} sites_other": "",
-	"Searching the web for '{{searchQuery}}'": "",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "",
 	"See readme.md for instructions": "",
 	"See what's new": "",
@@ -433,6 +434,7 @@
 	"Select a pipeline": "",
 	"Select a pipeline url": "",
 	"Select an Ollama instance": "",
+	"Select Documents": "",
 	"Select model": "",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "",
@@ -441,6 +443,7 @@
 	"Send message": "",
 	"September": "",
 	"Serper API Key": "",
+	"Serply API Key": "",
 	"Serpstack API Key": "",
 	"Server connection verified": "",
 	"Set as default": "",
@@ -505,6 +508,7 @@
 	"To access the available model names for downloading,": "",
 	"To access the GGUF models available for downloading,": "",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "",
 	"Today": "",
 	"Toggle settings": "",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "Ingrese la puntuación",
 	"Enter Searxng Query URL": "Introduzca la URL de consulta de Searxng",
 	"Enter Serper API Key": "Ingrese la clave API de Serper",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Ingrese la clave API de Serpstack",
 	"Enter stop sequence": "Ingrese la secuencia de parada",
 	"Enter Top K": "Ingrese el Top K",
@@ -422,7 +423,7 @@
 	"Searched {{count}} sites_one": "Buscado {{count}} sites_one",
 	"Searched {{count}} sites_many": "Buscado {{count}} sites_many",
 	"Searched {{count}} sites_other": "Buscó {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "Buscando en la web '{{searchQuery}}'",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "Searxng URL de consulta",
 	"See readme.md for instructions": "Vea el readme.md para instrucciones",
 	"See what's new": "Ver las novedades",
@@ -434,6 +435,7 @@
 	"Select a pipeline": "Selección de una canalización",
 	"Select a pipeline url": "Selección de una dirección URL de canalización",
 	"Select an Ollama instance": "Seleccione una instancia de Ollama",
+	"Select Documents": "",
 	"Select model": "Selecciona un modelo",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "Los modelos seleccionados no admiten entradas de imagen",
@@ -442,6 +444,7 @@
 	"Send message": "Enviar Mensaje",
 	"September": "Septiembre",
 	"Serper API Key": "Clave API de Serper",
+	"Serply API Key": "",
 	"Serpstack API Key": "Clave API de Serpstack",
 	"Server connection verified": "Conexión del servidor verificada",
 	"Set as default": "Establecer por defecto",
@@ -506,6 +509,7 @@
 	"To access the available model names for downloading,": "Para acceder a los nombres de modelos disponibles para descargar,",
 	"To access the GGUF models available for downloading,": "Para acceder a los modelos GGUF disponibles para descargar,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "a la entrada del chat.",
 	"Today": "Hoy",
 	"Toggle settings": "Alternar configuración",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "امتیاز را وارد کنید",
 	"Enter Searxng Query URL": "نشانی وب پرسوجوی Searxng را وارد کنید",
 	"Enter Serper API Key": "کلید API Serper را وارد کنید",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "کلید API Serpstack را وارد کنید",
 	"Enter stop sequence": "توالی توقف را وارد کنید",
 	"Enter Top K": "مقدار Top K را وارد کنید",
@@ -421,7 +422,7 @@
 	"Search Result Count": "تعداد نتایج جستجو",
 	"Searched {{count}} sites_one": "جستجو {{count}} sites_one",
 	"Searched {{count}} sites_other": "جستجو {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "جستجو در وب برای '{searchQuery}}'",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "نشانی وب جستجوی Searxng",
 	"See readme.md for instructions": "برای مشاهده دستورالعمل\u200cها به readme.md مراجعه کنید",
 	"See what's new": "ببینید موارد جدید چه بوده",
@@ -433,6 +434,7 @@
 	"Select a pipeline": "انتخاب یک خط لوله",
 	"Select a pipeline url": "یک ادرس خط لوله را انتخاب کنید",
 	"Select an Ollama instance": "انتخاب یک نمونه از اولاما",
+	"Select Documents": "",
 	"Select model": "انتخاب یک مدل",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "مدل) های (انتخاب شده ورودیهای تصویر را پشتیبانی نمیکند",
@@ -441,6 +443,7 @@
 	"Send message": "ارسال پیام",
 	"September": "سپتامبر",
 	"Serper API Key": "کلید API Serper",
+	"Serply API Key": "",
 	"Serpstack API Key": "کلید API Serpstack",
 	"Server connection verified": "اتصال سرور تأیید شد",
 	"Set as default": "تنظیم به عنوان پیشفرض",
@@ -505,6 +508,7 @@
 	"To access the available model names for downloading,": "برای دسترسی به نام مدل های موجود برای دانلود،",
 	"To access the GGUF models available for downloading,": "برای دسترسی به مدل\u200cهای GGUF موجود برای دانلود،",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "در ورودی گپ.",
 	"Today": "امروز",
 	"Toggle settings": "نمایش/عدم نمایش تنظیمات",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "Syötä pisteet",
 	"Enter Searxng Query URL": "Kirjoita Searxng-kyselyn URL-osoite",
 	"Enter Serper API Key": "Anna Serper API -avain",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Anna Serpstack API -avain",
 	"Enter stop sequence": "Syötä lopetussekvenssi",
 	"Enter Top K": "Syötä Top K",
@@ -421,7 +422,7 @@
 	"Search Result Count": "Hakutulosten määrä",
 	"Searched {{count}} sites_one": "Haettu {{count}} sites_one",
 	"Searched {{count}} sites_other": "Haku {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "Haku verkosta hakusanalla {{searchQuery}}",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "Searxng-kyselyn URL-osoite",
 	"See readme.md for instructions": "Katso lisää ohjeita readme.md:stä",
 	"See what's new": "Katso, mitä uutta",
@@ -433,6 +434,7 @@
 	"Select a pipeline": "Valitse putki",
 	"Select a pipeline url": "Valitse putken URL-osoite",
 	"Select an Ollama instance": "Valitse Ollama-instanssi",
+	"Select Documents": "",
 	"Select model": "Valitse malli",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "Valitut mallit eivät tue kuvasyötteitä",
@@ -441,6 +443,7 @@
 	"Send message": "Lähetä viesti",
 	"September": "syyskuu",
 	"Serper API Key": "Serper API -avain",
+	"Serply API Key": "",
 	"Serpstack API Key": "Serpstack API -avain",
 	"Server connection verified": "Palvelinyhteys varmennettu",
 	"Set as default": "Aseta oletukseksi",
@@ -505,6 +508,7 @@
 	"To access the available model names for downloading,": "Päästäksesi käsiksi ladattavissa oleviin mallinimiin,",
 	"To access the GGUF models available for downloading,": "Päästäksesi käsiksi ladattavissa oleviin GGUF-malleihin,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "keskustelusyötteeseen.",
 	"Today": "Tänään",
 	"Toggle settings": "Kytke asetukset",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "Entrez le score",
 	"Enter Searxng Query URL": "Entrez l’URL de requête Searxng",
 	"Enter Serper API Key": "Entrez la clé API Serper",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Entrez dans la clé API Serpstack",
 	"Enter stop sequence": "Entrez la séquence de fin",
 	"Enter Top K": "Entrez Top K",
@@ -422,7 +423,7 @@
 	"Searched {{count}} sites_one": "Recherche dans {{count}} sites_one",
 	"Searched {{count}} sites_many": "Recherche dans {{count}} sites_many",
 	"Searched {{count}} sites_other": "Recherche dans {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "Recherche sur le Web pour '{{searchQuery}}'",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "URL de la requête Searxng",
 	"See readme.md for instructions": "Voir readme.md pour les instructions",
 	"See what's new": "Voir les nouveautés",
@@ -434,6 +435,7 @@
 	"Select a pipeline": "Sélectionner un pipeline",
 	"Select a pipeline url": "Sélectionnez une URL de pipeline",
 	"Select an Ollama instance": "Sélectionner une instance Ollama",
+	"Select Documents": "",
 	"Select model": "Sélectionnez un modèle",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "Les modèles sélectionnés ne prennent pas en charge les entrées d’image",
@@ -442,6 +444,7 @@
 	"Send message": "Envoyer un message",
 	"September": "Septembre",
 	"Serper API Key": "Clé API Serper",
+	"Serply API Key": "",
 	"Serpstack API Key": "Clé API Serpstack",
 	"Server connection verified": "Connexion au serveur vérifiée",
 	"Set as default": "Définir par défaut",
@@ -506,6 +509,7 @@
 	"To access the available model names for downloading,": "Pour accéder aux noms de modèles disponibles pour le téléchargement,",
 	"To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles pour le téléchargement,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "à l'entrée du chat.",
 	"Today": "Aujourd'hui",
 	"Toggle settings": "Basculer les paramètres",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "Entrez le Score",
 	"Enter Searxng Query URL": "Entrez l’URL de la requête Searxng",
 	"Enter Serper API Key": "Entrez la clé API Serper",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Entrez la clé API Serpstack",
 	"Enter stop sequence": "Entrez la séquence de fin",
 	"Enter Top K": "Entrez Top K",
@@ -422,7 +423,7 @@
 	"Searched {{count}} sites_one": "Recherché {{count}} sites_one",
 	"Searched {{count}} sites_many": "Recherché {{count}} sites_many",
 	"Searched {{count}} sites_other": "Recherché {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "Recherche sur le web pour '{{searchQuery}}'",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "URL de requête Searxng",
 	"See readme.md for instructions": "Voir readme.md pour les instructions",
 	"See what's new": "Voir les nouveautés",
@@ -434,6 +435,7 @@
 	"Select a pipeline": "Sélectionner un pipeline",
 	"Select a pipeline url": "Sélectionnez une URL de pipeline",
 	"Select an Ollama instance": "Sélectionner une instance Ollama",
+	"Select Documents": "",
 	"Select model": "Sélectionner un modèle",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "Modèle(s) séléctionés ne supportent pas les entrées images",
@@ -442,6 +444,7 @@
 	"Send message": "Envoyer un message",
 	"September": "Septembre",
 	"Serper API Key": "Clé API Serper",
+	"Serply API Key": "",
 	"Serpstack API Key": "Clé API Serpstack",
 	"Server connection verified": "Connexion au serveur vérifiée",
 	"Set as default": "Définir par défaut",
@@ -506,6 +509,7 @@
 	"To access the available model names for downloading,": "Pour accéder aux noms de modèles disponibles pour le téléchargement,",
 	"To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles pour le téléchargement,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "à l'entrée du chat.",
 	"Today": "Aujourd'hui",
 	"Toggle settings": "Basculer les paramètres",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "הזן ציון",
 	"Enter Searxng Query URL": "הזן כתובת URL של שאילתת Searxng",
 	"Enter Serper API Key": "הזן מפתח API של Serper",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "הזן מפתח API של Serpstack",
 	"Enter stop sequence": "הזן רצף עצירה",
 	"Enter Top K": "הזן Top K",
@@ -422,7 +423,7 @@
 	"Searched {{count}} sites_one": "חיפש {{count}} sites_one",
 	"Searched {{count}} sites_two": "חיפש {{count}} sites_two",
 	"Searched {{count}} sites_other": "חיפש {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "חיפוש באינטרנט אחר '{{searchQuery}}'",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "כתובת URL של שאילתת Searxng",
 	"See readme.md for instructions": "ראה את readme.md להוראות",
 	"See what's new": "ראה מה חדש",
@@ -434,6 +435,7 @@
 	"Select a pipeline": "בחר קו צינור",
 	"Select a pipeline url": "בחר כתובת URL של קו צינור",
 	"Select an Ollama instance": "בחר מופע של Ollama",
+	"Select Documents": "",
 	"Select model": "בחר מודל",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "דגמים נבחרים אינם תומכים בקלט תמונה",
@@ -442,6 +444,7 @@
 	"Send message": "שלח הודעה",
 	"September": "ספטמבר",
 	"Serper API Key": "מפתח Serper API",
+	"Serply API Key": "",
 	"Serpstack API Key": "מפתח API של Serpstack",
 	"Server connection verified": "החיבור לשרת אומת",
 	"Set as default": "הגדר כברירת מחדל",
@@ -506,6 +509,7 @@
 	"To access the available model names for downloading,": "כדי לגשת לשמות הדגמים הזמינים להורדה,",
 	"To access the GGUF models available for downloading,": "כדי לגשת לדגמי GGUF הזמינים להורדה,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "לקלטת שיחה.",
 	"Today": "היום",
 	"Toggle settings": "החלפת מצב של הגדרות",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "स्कोर दर्ज करें",
 	"Enter Searxng Query URL": "Searxng क्वेरी URL दर्ज करें",
 	"Enter Serper API Key": "Serper API कुंजी दर्ज करें",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "सर्पस्टैक एपीआई कुंजी दर्ज करें",
 	"Enter stop sequence": "स्टॉप अनुक्रम दर्ज करें",
 	"Enter Top K": "शीर्ष K दर्ज करें",
@@ -421,7 +422,7 @@
 	"Search Result Count": "खोज परिणामों की संख्या",
 	"Searched {{count}} sites_one": "{{count}} sites_one खोजा गया",
 	"Searched {{count}} sites_other": "{{count}} sites_other खोजा गया",
-	"Searching the web for '{{searchQuery}}'": "वेब पर '{{searchQuery}}' खोजना",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "Searxng क्वेरी URL",
 	"See readme.md for instructions": "निर्देशों के लिए readme.md देखें",
 	"See what's new": "देखें, क्या नया है",
@@ -433,6 +434,7 @@
 	"Select a pipeline": "एक पाइपलाइन का चयन करें",
 	"Select a pipeline url": "एक पाइपलाइन url चुनें",
 	"Select an Ollama instance": "एक Ollama Instance चुनें",
+	"Select Documents": "",
 	"Select model": "मॉडल चुनें",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "चयनित मॉडल छवि इनपुट का समर्थन नहीं करते हैं",
@@ -441,6 +443,7 @@
 	"Send message": "मेसेज भेजें",
 	"September": "सितंबर",
 	"Serper API Key": "Serper API कुंजी",
+	"Serply API Key": "",
 	"Serpstack API Key": "सर्पस्टैक एपीआई कुंजी",
 	"Server connection verified": "सर्वर कनेक्शन सत्यापित",
 	"Set as default": "डिफाल्ट के रूप में सेट",
@@ -505,6 +508,7 @@
 	"To access the available model names for downloading,": "डाउनलोड करने के लिए उपलब्ध मॉडल नामों तक पहुंचने के लिए,",
 	"To access the GGUF models available for downloading,": "डाउनलोडिंग के लिए उपलब्ध GGUF मॉडल तक पहुँचने के लिए,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "इनपुट चैट करने के लिए.",
 	"Today": "आज",
 	"Toggle settings": "सेटिंग्स टॉगल करें",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "Unesite ocjenu",
 	"Enter Searxng Query URL": "Unos URL-a upita Searxng",
 	"Enter Serper API Key": "Unesite API ključ serpera",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Unesite API ključ Serpstack",
 	"Enter stop sequence": "Unesite sekvencu zaustavljanja",
 	"Enter Top K": "Unesite Top K",
@@ -422,7 +423,7 @@
 	"Searched {{count}} sites_one": "Pretraženo {{count}} sites_one",
 	"Searched {{count}} sites_few": "Pretraženo {{count}} sites_few",
 	"Searched {{count}} sites_other": "Pretraženo {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "Traženje '{{searchQuery}}' na webu",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "URL upita Searxng",
 	"See readme.md for instructions": "Pogledajte readme.md za upute",
 	"See what's new": "Pogledajte što je novo",
@@ -434,6 +435,7 @@
 	"Select a pipeline": "Odabir kanala",
 	"Select a pipeline url": "Odabir URL-a kanala",
 	"Select an Ollama instance": "Odaberite Ollama instancu",
+	"Select Documents": "",
 	"Select model": "Odaberite model",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "Odabrani modeli ne podržavaju unose slika",
@@ -442,6 +444,7 @@
 	"Send message": "Pošalji poruku",
 	"September": "Rujan",
 	"Serper API Key": "Serper API ključ",
+	"Serply API Key": "",
 	"Serpstack API Key": "Tipka API za serpstack",
 	"Server connection verified": "Veza s poslužiteljem potvrđena",
 	"Set as default": "Postavi kao zadano",
@@ -506,6 +509,7 @@
 	"To access the available model names for downloading,": "Za pristup dostupnim nazivima modela za preuzimanje,",
 	"To access the GGUF models available for downloading,": "Za pristup GGUF modelima dostupnim za preuzimanje,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "u unos razgovora.",
 	"Today": "Danas",
 	"Toggle settings": "Prebaci postavke",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "Inserisci il punteggio",
 	"Enter Searxng Query URL": "Immettere l'URL della query Searxng",
 	"Enter Serper API Key": "Inserisci la chiave API Serper",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Inserisci la chiave API Serpstack",
 	"Enter stop sequence": "Inserisci la sequenza di arresto",
 	"Enter Top K": "Inserisci Top K",
@@ -422,7 +423,7 @@
 	"Searched {{count}} sites_one": "Ricercato {{count}} sites_one",
 	"Searched {{count}} sites_many": "Ricercato {{count}} sites_many",
 	"Searched {{count}} sites_other": "Ricercato {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "Ricerca sul web di '{{searchQuery}}'",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "Searxng Query URL",
 	"See readme.md for instructions": "Vedi readme.md per le istruzioni",
 	"See what's new": "Guarda le novità",
@@ -434,6 +435,7 @@
 	"Select a pipeline": "Selezionare una tubazione",
 	"Select a pipeline url": "Selezionare l'URL di una pipeline",
 	"Select an Ollama instance": "Seleziona un'istanza Ollama",
+	"Select Documents": "",
 	"Select model": "Seleziona modello",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "I modelli selezionati non supportano l'input di immagini",
@@ -442,6 +444,7 @@
 	"Send message": "Invia messaggio",
 	"September": "Settembre",
 	"Serper API Key": "Chiave API Serper",
+	"Serply API Key": "",
 	"Serpstack API Key": "Chiave API Serpstack",
 	"Server connection verified": "Connessione al server verificata",
 	"Set as default": "Imposta come predefinito",
@@ -506,6 +509,7 @@
 	"To access the available model names for downloading,": "Per accedere ai nomi dei modelli disponibili per il download,",
 	"To access the GGUF models available for downloading,": "Per accedere ai modelli GGUF disponibili per il download,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "all'input della chat.",
 	"Today": "Oggi",
 	"Toggle settings": "Attiva/disattiva impostazioni",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "スコアを入力してください",
 	"Enter Searxng Query URL": "SearxngクエリURLを入力",
 	"Enter Serper API Key": "Serper APIキーの入力",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Serpstack APIキーの入力",
 	"Enter stop sequence": "ストップシーケンスを入力してください",
 	"Enter Top K": "トップ K を入力してください",
@@ -420,7 +421,7 @@
 	"Search Query Generation Prompt Length Threshold": "",
 	"Search Result Count": "検索結果数",
 	"Searched {{count}} sites_other": "{{count}} sites_other検索",
-	"Searching the web for '{{searchQuery}}'": "ウェブで '{{searchQuery}}' を検索する",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "Searxng クエリ URL",
 	"See readme.md for instructions": "手順については readme.md を参照してください",
 	"See what's new": "新機能を見る",
@@ -432,6 +433,7 @@
 	"Select a pipeline": "パイプラインの選択",
 	"Select a pipeline url": "パイプラインの URL を選択する",
 	"Select an Ollama instance": "Ollama インスタンスを選択",
+	"Select Documents": "",
 	"Select model": "モデルを選択",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "一部のモデルは画像入力をサポートしていません",
@@ -440,6 +442,7 @@
 	"Send message": "メッセージを送信",
 	"September": "9月",
 	"Serper API Key": "Serper APIキー",
+	"Serply API Key": "",
 	"Serpstack API Key": "Serpstack APIキー",
 	"Server connection verified": "サーバー接続が確認されました",
 	"Set as default": "デフォルトに設定",
@@ -504,6 +507,7 @@
 	"To access the available model names for downloading,": "ダウンロード可能なモデル名にアクセスするには、",
 	"To access the GGUF models available for downloading,": "ダウンロード可能な GGUF モデルにアクセスするには、",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "チャット入力へ。",
 	"Today": "今日",
 	"Toggle settings": "設定を切り替え",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "შეიყვანეთ ქულა",
 	"Enter Searxng Query URL": "შეიყვანეთ Searxng Query URL",
 	"Enter Serper API Key": "შეიყვანეთ Serper API Key",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "შეიყვანეთ Serpstack API Key",
 	"Enter stop sequence": "შეიყვანეთ ტოპ თანმიმდევრობა",
 	"Enter Top K": "შეიყვანეთ Top K",
@@ -421,7 +422,7 @@
 	"Search Result Count": "ძიების შედეგების რაოდენობა",
 	"Searched {{count}} sites_one": "Searched {{count}} sites_one",
 	"Searched {{count}} sites_other": "Searched {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "ეძებს ვებ '{searchQuery}}'",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "Searxng Query URL",
 	"See readme.md for instructions": "იხილეთ readme.md ინსტრუქციებისთვის",
 	"See what's new": "სიახლეების ნახვა",
@@ -433,6 +434,7 @@
 	"Select a pipeline": "აირჩიეთ მილსადენი",
 	"Select a pipeline url": "აირჩიეთ მილსადენის url",
 	"Select an Ollama instance": "Ollama ინსტანსის არჩევა",
+	"Select Documents": "",
 	"Select model": "მოდელის არჩევა",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "შერჩეული მოდელი (ებ) ი არ უჭერს მხარს გამოსახულების შეყვანას",
@@ -441,6 +443,7 @@
 	"Send message": "შეტყობინების გაგზავნა",
 	"September": "სექტემბერი",
 	"Serper API Key": "Serper API Key",
+	"Serply API Key": "",
 	"Serpstack API Key": "Serpstack API Key",
 	"Server connection verified": "სერვერთან კავშირი დადასტურებულია",
 	"Set as default": "დეფოლტად დაყენება",
@@ -505,6 +508,7 @@
 	"To access the available model names for downloading,": "ჩამოტვირთვისთვის ხელმისაწვდომი მოდელების სახელებზე წვდომისთვის",
 	"To access the GGUF models available for downloading,": "ჩასატვირთად ხელმისაწვდომი GGUF მოდელებზე წვდომისთვის",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "ჩატში",
 	"Today": "დღეს",
 	"Toggle settings": "პარამეტრების გადართვა",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "점수 입력",
 	"Enter Searxng Query URL": "Searxng 쿼리 URL 입력",
 	"Enter Serper API Key": "Serper API Key 입력",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Serpstack API Key 입력",
 	"Enter stop sequence": "중지 시퀀스 입력",
 	"Enter Top K": "Top K 입력",
@@ -420,7 +421,7 @@
 	"Search Query Generation Prompt Length Threshold": "",
 	"Search Result Count": "검색 결과 개수",
 	"Searched {{count}} sites_other": "{{count}} sites_other 검색됨",
-	"Searching the web for '{{searchQuery}}'": "웹에서 '{{searchQuery}}' 검색",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "Searxng 쿼리 URL",
 	"See readme.md for instructions": "설명은 readme.md를 참조하세요.",
 	"See what's new": "새로운 기능 보기",
@@ -432,6 +433,7 @@
 	"Select a pipeline": "파이프라인 선택",
 	"Select a pipeline url": "파이프라인 URL 선택",
 	"Select an Ollama instance": "Ollama 인스턴스 선택",
+	"Select Documents": "",
 	"Select model": "모델 선택",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "선택한 모델은 이미지 입력을 지원하지 않습니다.",
@@ -440,6 +442,7 @@
 	"Send message": "메시지 보내기",
 	"September": "9월",
 	"Serper API Key": "Serper API 키",
+	"Serply API Key": "",
 	"Serpstack API Key": "Serpstack API 키",
 	"Server connection verified": "서버 연결 확인됨",
 	"Set as default": "기본값으로 설정",
@@ -504,6 +507,7 @@
 	"To access the available model names for downloading,": "다운로드 가능한 모델명을 확인하려면,",
 	"To access the GGUF models available for downloading,": "다운로드 가능한 GGUF 모델을 확인하려면,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "채팅 입력으로.",
 	"Today": "오늘",
 	"Toggle settings": "설정 전환",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "Įveskite rezultatą",
 	"Enter Searxng Query URL": "",
 	"Enter Serper API Key": "",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "",
 	"Enter stop sequence": "Įveskite pabaigos sekvenciją",
 	"Enter Top K": "Įveskite Top K",
@@ -423,7 +424,7 @@
 	"Searched {{count}} sites_few": "",
 	"Searched {{count}} sites_many": "",
 	"Searched {{count}} sites_other": "",
-	"Searching the web for '{{searchQuery}}'": "",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "",
 	"See readme.md for instructions": "Žiūrėti readme.md papildomoms instrukcijoms",
 	"See what's new": "Žiūrėti naujoves",
@@ -435,6 +436,7 @@
 	"Select a pipeline": "",
 	"Select a pipeline url": "",
 	"Select an Ollama instance": "Pasirinkti Ollama instanciją",
+	"Select Documents": "",
 	"Select model": "Pasirinkti modelį",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "",
@@ -443,6 +445,7 @@
 	"Send message": "Siųsti žinutę",
 	"September": "rugsėjis",
 	"Serper API Key": "",
+	"Serply API Key": "",
 	"Serpstack API Key": "",
 	"Server connection verified": "Serverio sujungimas patvirtintas",
 	"Set as default": "Nustatyti numatytąjį",
@@ -507,6 +510,7 @@
 	"To access the available model names for downloading,": "Tam, kad prieiti prie galimų parsisiųsti modelių",
 	"To access the GGUF models available for downloading,": "Tam, kad prieiti prie galimų parsisiųsti GGUF,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "į pokalbio įvestį",
 	"Today": "Šiandien",
 	"Toggle settings": "Atverti/užverti parametrus",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "Skriv inn poengsum",
 	"Enter Searxng Query URL": "Skriv inn Searxng forespørsels-URL",
 	"Enter Serper API Key": "Skriv inn Serper API-nøkkel",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Skriv inn Serpstack API-nøkkel",
 	"Enter stop sequence": "Skriv inn stoppsekvens",
 	"Enter Top K": "Skriv inn Top K",
@@ -421,7 +422,7 @@
 	"Search Result Count": "Antall søkeresultater",
 	"Searched {{count}} sites_one": "Søkte på {{count}} side",
 	"Searched {{count}} sites_other": "Søkte på {{count}} sider",
-	"Searching the web for '{{searchQuery}}'": "Søker på nettet etter '{{searchQuery}}'",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "Searxng forespørsels-URL",
 	"See readme.md for instructions": "Se readme.md for instruksjoner",
 	"See what's new": "Se hva som er nytt",
@@ -433,6 +434,7 @@
 	"Select a pipeline": "Velg en pipeline",
 	"Select a pipeline url": "Velg en pipeline-URL",
 	"Select an Ollama instance": "Velg en Ollama-instans",
+	"Select Documents": "",
 	"Select model": "Velg modell",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "Valgte modell(er) støtter ikke bildeforslag",
@@ -441,6 +443,7 @@
 	"Send message": "Send melding",
 	"September": "September",
 	"Serper API Key": "Serper API-nøkkel",
+	"Serply API Key": "",
 	"Serpstack API Key": "Serpstack API-nøkkel",
 	"Server connection verified": "Servertilkobling bekreftet",
 	"Set as default": "Sett som standard",
@@ -505,6 +508,7 @@
 	"To access the available model names for downloading,": "For å få tilgang til tilgjengelige modelnavn for nedlasting,",
 	"To access the GGUF models available for downloading,": "For å få tilgang til GGUF-modellene som er tilgjengelige for nedlasting,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "til chatinput.",
 	"Today": "I dag",
 	"Toggle settings": "Veksle innstillinger",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "Voeg score toe",
 	"Enter Searxng Query URL": "Voer de URL van de Searxng-query in",
 	"Enter Serper API Key": "Voer de Serper API-sleutel in",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Voer de Serpstack API-sleutel in",
 	"Enter stop sequence": "Zet stop sequentie",
 	"Enter Top K": "Voeg Top K toe",
@@ -421,7 +422,7 @@
 	"Search Result Count": "Aantal zoekresultaten",
 	"Searched {{count}} sites_one": "Gezocht op {{count}} sites_one",
 	"Searched {{count}} sites_other": "Gezocht op {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "Zoeken op internet naar '{{searchQuery}}'",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "Searxng Query URL",
 	"See readme.md for instructions": "Zie readme.md voor instructies",
 	"See what's new": "Zie wat er nieuw is",
@@ -433,6 +434,7 @@
 	"Select a pipeline": "Selecteer een pijplijn",
 	"Select a pipeline url": "Selecteer een pijplijn-URL",
 	"Select an Ollama instance": "Selecteer een Ollama instantie",
+	"Select Documents": "",
 	"Select model": "Selecteer een model",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "Geselecteerde modellen ondersteunen geen beeldinvoer",
@@ -441,6 +443,7 @@
 	"Send message": "Stuur bericht",
 	"September": "September",
 	"Serper API Key": "Serper API-sleutel",
+	"Serply API Key": "",
 	"Serpstack API Key": "Serpstack API-sleutel",
 	"Server connection verified": "Server verbinding geverifieerd",
 	"Set as default": "Stel in als standaard",
@@ -505,6 +508,7 @@
 	"To access the available model names for downloading,": "Om de beschikbare modelnamen voor downloaden te openen,",
 	"To access the GGUF models available for downloading,": "Om toegang te krijgen tot de GGUF modellen die beschikbaar zijn voor downloaden,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "naar chat input.",
 	"Today": "Vandaag",
 	"Toggle settings": "Wissel instellingen",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "ਸਕੋਰ ਦਰਜ ਕਰੋ",
 	"Enter Searxng Query URL": "Searxng Query URL ਦਾਖਲ ਕਰੋ",
 	"Enter Serper API Key": "Serper API ਕੁੰਜੀ ਦਾਖਲ ਕਰੋ",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Serpstack API ਕੁੰਜੀ ਦਾਖਲ ਕਰੋ",
 	"Enter stop sequence": "ਰੋਕਣ ਦਾ ਕ੍ਰਮ ਦਰਜ ਕਰੋ",
 	"Enter Top K": "ਸਿਖਰ K ਦਰਜ ਕਰੋ",
@@ -421,7 +422,7 @@
 	"Search Result Count": "ਖੋਜ ਨਤੀਜੇ ਦੀ ਗਿਣਤੀ",
 	"Searched {{count}} sites_one": "ਖੋਜਿਆ {{count}} sites_one",
 	"Searched {{count}} sites_other": "ਖੋਜਿਆ {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "'{{searchQuery}}' ਲਈ ਵੈੱਬ 'ਤੇ ਖੋਜ ਕਰਨਾ",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "Searxng Query URL",
 	"See readme.md for instructions": "ਹਦਾਇਤਾਂ ਲਈ readme.md ਵੇਖੋ",
 	"See what's new": "ਨਵਾਂ ਕੀ ਹੈ ਵੇਖੋ",
@@ -433,6 +434,7 @@
 	"Select a pipeline": "ਪਾਈਪਲਾਈਨ ਚੁਣੋ",
 	"Select a pipeline url": "ਪਾਈਪਲਾਈਨ URL ਚੁਣੋ",
 	"Select an Ollama instance": "ਇੱਕ ਓਲਾਮਾ ਇੰਸਟੈਂਸ ਚੁਣੋ",
+	"Select Documents": "",
 	"Select model": "ਮਾਡਲ ਚੁਣੋ",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "ਚੁਣੇ ਗਏ ਮਾਡਲ(ਆਂ) ਚਿੱਤਰ ਇਨਪੁੱਟਾਂ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੇ",
@@ -441,6 +443,7 @@
 	"Send message": "ਸੁਨੇਹਾ ਭੇਜੋ",
 	"September": "ਸਤੰਬਰ",
 	"Serper API Key": "Serper API ਕੁੰਜੀ",
+	"Serply API Key": "",
 	"Serpstack API Key": "Serpstack API ਕੁੰਜੀ",
 	"Server connection verified": "ਸਰਵਰ ਕਨੈਕਸ਼ਨ ਦੀ ਪੁਸ਼ਟੀ ਕੀਤੀ ਗਈ",
 	"Set as default": "ਮੂਲ ਵਜੋਂ ਸੈੱਟ ਕਰੋ",
@@ -505,6 +508,7 @@
 	"To access the available model names for downloading,": "ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਉਪਲਬਧ ਮਾਡਲ ਨਾਮਾਂ ਤੱਕ ਪਹੁੰਚਣ ਲਈ,",
 	"To access the GGUF models available for downloading,": "ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਉਪਲਬਧ GGUF ਮਾਡਲਾਂ ਤੱਕ ਪਹੁੰਚਣ ਲਈ,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "ਗੱਲਬਾਤ ਇਨਪੁਟ ਲਈ।",
 	"Today": "ਅੱਜ",
 	"Toggle settings": "ਸੈਟਿੰਗਾਂ ਟੌਗਲ ਕਰੋ",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "Wprowadź wynik",
 	"Enter Searxng Query URL": "Wprowadź adres URL zapytania Searxng",
 	"Enter Serper API Key": "Wprowadź klucz API Serper",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Wprowadź klucz API Serpstack",
 	"Enter stop sequence": "Wprowadź sekwencję zatrzymania",
 	"Enter Top K": "Wprowadź Top K",
@@ -423,7 +424,7 @@
 	"Searched {{count}} sites_few": "Wyszukiwano {{count}} sites_few",
 	"Searched {{count}} sites_many": "Wyszukiwano {{count}} sites_many",
 	"Searched {{count}} sites_other": "Wyszukiwano {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "Wyszukiwanie w Internecie \"{{searchQuery}}\"",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "Adres URL zapytania Searxng",
 	"See readme.md for instructions": "Zajrzyj do readme.md po instrukcje",
 	"See what's new": "Zobacz co nowego",
@@ -435,6 +436,7 @@
 	"Select a pipeline": "Wybieranie potoku",
 	"Select a pipeline url": "Wybieranie adresu URL potoku",
 	"Select an Ollama instance": "Wybierz instancję Ollama",
+	"Select Documents": "",
 	"Select model": "Wybierz model",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "Wybrane modele nie obsługują danych wejściowych obrazu",
@@ -443,6 +445,7 @@
 	"Send message": "Wyślij wiadomość",
 	"September": "Wrzesień",
 	"Serper API Key": "Klucz API Serper",
+	"Serply API Key": "",
 	"Serpstack API Key": "Klucz API Serpstack",
 	"Server connection verified": "Połączenie z serwerem zweryfikowane",
 	"Set as default": "Ustaw jako domyślne",
@@ -507,6 +510,7 @@
 	"To access the available model names for downloading,": "Aby uzyskać dostęp do dostępnych nazw modeli do pobrania,",
 	"To access the GGUF models available for downloading,": "Aby uzyskać dostęp do dostępnych modeli GGUF do pobrania,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "do pola wprowadzania czatu.",
 	"Today": "Dzisiaj",
 	"Toggle settings": "Przełącz ustawienia",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "Digite a Pontuação",
 	"Enter Searxng Query URL": "Insira a URL de consulta do Searxng",
 	"Enter Serper API Key": "Digite a chave da API do Serper",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Digite a chave da API Serpstack",
 	"Enter stop sequence": "Digite a sequência de parada",
 	"Enter Top K": "Digite o Top K",
@@ -422,7 +423,7 @@
 	"Searched {{count}} sites_one": "Pesquisado {{count}} sites_one",
 	"Searched {{count}} sites_many": "Pesquisado {{count}} sites_many",
 	"Searched {{count}} sites_other": "Pesquisado {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "Pesquisando na Web por '{{searchQuery}}'",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "URL de consulta Searxng",
 	"See readme.md for instructions": "Consulte readme.md para obter instruções",
 	"See what's new": "Veja o que há de novo",
@@ -434,6 +435,7 @@
 	"Select a pipeline": "Selecione um pipeline",
 	"Select a pipeline url": "Selecione uma URL de pipeline",
 	"Select an Ollama instance": "Selecione uma instância Ollama",
+	"Select Documents": "",
 	"Select model": "Selecione um modelo",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "O(s) modelo(s) selecionado(s) não suporta(m) entrada(s) de imagem",
@@ -442,6 +444,7 @@
 	"Send message": "Enviar mensagem",
 	"September": "Setembro",
 	"Serper API Key": "Chave de API Serper",
+	"Serply API Key": "",
 	"Serpstack API Key": "Chave de API Serpstack",
 	"Server connection verified": "Conexão com o servidor verificada",
 	"Set as default": "Definir como padrão",
@@ -506,6 +509,7 @@
 	"To access the available model names for downloading,": "Para acessar os nomes de modelo disponíveis para download,",
 	"To access the GGUF models available for downloading,": "Para acessar os modelos GGUF disponíveis para download,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "para a entrada de bate-papo.",
 	"Today": "Hoje",
 	"Toggle settings": "Alternar configurações",

+ 215 - 211
src/lib/i18n/locales/pt-PT/translation.json

@@ -5,16 +5,16 @@
 	"(latest)": "(mais recente)",
 	"{{ models }}": "{{ modelos }}",
 	"{{ owner }}: You cannot delete a base model": "{{ owner }}: Não é possível excluir um modelo base",
-	"{{modelName}} is thinking...": "{{modelName}} está pensando...",
+	"{{modelName}} is thinking...": "{{modelName}} está a pensar...",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend Necessário",
 	"A task model is used when performing tasks such as generating titles for chats and web search queries": "Um modelo de tarefa é usado ao executar tarefas como gerar títulos para bate-papos e consultas de pesquisa na Web",
-	"a user": "um usuário",
-	"About": "Sobre",
+	"a user": "um utilizador",
+	"About": "Acerca de",
 	"Account": "Conta",
-	"Account Activation Pending": "",
+	"Account Activation Pending": "Ativação da Conta Pendente",
 	"Accurate information": "Informações precisas",
-	"Active Users": "",
+	"Active Users": "Utilizadores Ativos",
 	"Add": "Adicionar",
 	"Add a model id": "Adicionar um ID de modelo",
 	"Add a short description about what this model does": "Adicione uma breve descrição sobre o que este modelo faz",
@@ -22,30 +22,30 @@
 	"Add a tag": "Adicionar uma tag",
 	"Add custom prompt": "Adicionar um prompt curto",
 	"Add Docs": "Adicionar Documentos",
-	"Add Files": "Adicionar Arquivos",
+	"Add Files": "Adicionar Ficheiros",
 	"Add Memory": "Adicionar memória",
 	"Add message": "Adicionar mensagem",
 	"Add Model": "Adicionar modelo",
 	"Add Tags": "adicionar tags",
-	"Add User": "Adicionar Usuário",
-	"Adjusting these settings will apply changes universally to all users.": "Ajustar essas configurações aplicará alterações universalmente a todos os usuários.",
+	"Add User": "Adicionar Utilizador",
+	"Adjusting these settings will apply changes universally to all users.": "Ajustar essas configurações aplicará alterações universalmente a todos os utilizadores.",
 	"admin": "administrador",
-	"Admin": "",
+	"Admin": "Admin",
 	"Admin Panel": "Painel do Administrador",
 	"Admin Settings": "Configurações do Administrador",
 	"Advanced Parameters": "Parâmetros Avançados",
 	"Advanced Params": "Params Avançados",
 	"all": "todos",
 	"All Documents": "Todos os Documentos",
-	"All Users": "Todos os Usuários",
+	"All Users": "Todos os utilizadores",
 	"Allow": "Permitir",
-	"Allow Chat Deletion": "Permitir Exclusão de Bate-papo",
-	"Allow non-local voices": "",
+	"Allow Chat Deletion": "Permitir Exclusão de Conversa",
+	"Allow non-local voices": "Permitir vozes não locais",
 	"alphanumeric characters and hyphens": "caracteres alfanuméricos e hífens",
 	"Already have an account?": "Já tem uma conta?",
 	"an assistant": "um assistente",
 	"and": "e",
-	"and create a new shared link.": "e criar um novo link compartilhado.",
+	"and create a new shared link.": "e criar um novo link partilhado.",
 	"API Base URL": "URL Base da API",
 	"API Key": "Chave da API",
 	"API Key created.": "Chave da API criada.",
@@ -53,69 +53,69 @@
 	"April": "Abril",
 	"Archive": "Arquivo",
 	"Archive All Chats": "Arquivar todos os chats",
-	"Archived Chats": "Bate-papos arquivados",
-	"are allowed - Activate this command by typing": "são permitidos - Ative este comando digitando",
-	"Are you sure?": "Tem certeza?",
-	"Attach file": "Anexar arquivo",
+	"Archived Chats": "Conversas arquivadas",
+	"are allowed - Activate this command by typing": "são permitidos - Ative este comando escrevendo",
+	"Are you sure?": "Tem a certeza?",
+	"Attach file": "Anexar ficheiro",
 	"Attention to detail": "Detalhado",
 	"Audio": "Áudio",
 	"August": "Agosto",
 	"Auto-playback response": "Reprodução automática da resposta",
 	"AUTOMATIC1111 Base URL": "URL Base do AUTOMATIC1111",
-	"AUTOMATIC1111 Base URL is required.": "A URL Base do AUTOMATIC1111 é obrigatória.",
+	"AUTOMATIC1111 Base URL is required.": "O URL Base do AUTOMATIC1111 é obrigatório.",
 	"available!": "disponível!",
 	"Back": "Voltar",
-	"Bad Response": "Resposta ruim",
+	"Bad Response": "Resposta má",
 	"Banners": "Estandartes",
 	"Base Model (From)": "Modelo Base (De)",
 	"before": "antes",
 	"Being lazy": "Ser preguiçoso",
-	"Brave Search API Key": "Chave da API de Pesquisa Admirável",
+	"Brave Search API Key": "Chave da API de Pesquisa Brave",
 	"Bypass SSL verification for Websites": "Ignorar verificação SSL para sites",
-	"Call": "",
-	"Call feature is not supported when using Web STT engine": "",
-	"Camera": "",
+	"Call": "Chamar",
+	"Call feature is not supported when using Web STT engine": "A funcionalide de Chamar não é suportada quando usa um motor Web STT",
+	"Camera": "Camera",
 	"Cancel": "Cancelar",
 	"Capabilities": "Capacidades",
 	"Change Password": "Alterar Senha",
-	"Chat": "Bate-papo",
-	"Chat Bubble UI": "UI de Bala de Bate-papo",
-	"Chat direction": "Direção do Bate-papo",
-	"Chat History": "Histórico de Bate-papo",
-	"Chat History is off for this browser.": "O histórico de bate-papo está desativado para este navegador.",
-	"Chats": "Bate-papos",
+	"Chat": "Conversa",
+	"Chat Bubble UI": "Bolha UI da Conversa",
+	"Chat direction": "Direção da Conversa",
+	"Chat History": "Histórico da Conversa",
+	"Chat History is off for this browser.": "O histórico da conversa está desativado para este navegador.",
+	"Chats": "Conversas",
 	"Check Again": "Verifique novamente",
 	"Check for updates": "Verificar atualizações",
 	"Checking for updates...": "Verificando atualizações...",
-	"Choose a model before saving...": "Escolha um modelo antes de salvar...",
+	"Choose a model before saving...": "Escolha um modelo antes de guardar...",
 	"Chunk Overlap": "Sobreposição de Fragmento",
 	"Chunk Params": "Parâmetros de Fragmento",
 	"Chunk Size": "Tamanho do Fragmento",
 	"Citation": "Citação",
-	"Clear memory": "",
+	"Clear memory": "Limpar memória",
 	"Click here for help.": "Clique aqui para obter ajuda.",
 	"Click here to": "Clique aqui para",
 	"Click here to select": "Clique aqui para selecionar",
-	"Click here to select a csv file.": "Clique aqui para selecionar um arquivo csv.",
-	"Click here to select a py file.": "",
+	"Click here to select a csv file.": "Clique aqui para selecionar um ficheiro csv.",
+	"Click here to select a py file.": "Clique aqui para selecionar um ficheiro py",
 	"Click here to select documents.": "Clique aqui para selecionar documentos.",
 	"click here.": "clique aqui.",
-	"Click on the user role button to change a user's role.": "Clique no botão de função do usuário para alterar a função de um usuário.",
-	"Clone": "Clone",
+	"Click on the user role button to change a user's role.": "Clique no botão de função do utilizador para alterar a função de um utilizador.",
+	"Clone": "Clonar",
 	"Close": "Fechar",
 	"Collection": "Coleção",
 	"ComfyUI": "ComfyUI",
 	"ComfyUI Base URL": "URL Base do ComfyUI",
-	"ComfyUI Base URL is required.": "A URL Base do ComfyUI é obrigatória.",
+	"ComfyUI Base URL is required.": "O URL Base do ComfyUI é obrigatório.",
 	"Command": "Comando",
 	"Concurrent Requests": "Solicitações simultâneas",
 	"Confirm Password": "Confirmar Senha",
 	"Connections": "Conexões",
-	"Contact Admin for WebUI Access": "",
+	"Contact Admin for WebUI Access": "Contatar Admin para acesso ao WebUI",
 	"Content": "Conteúdo",
 	"Context Length": "Comprimento do Contexto",
 	"Continue Response": "Continuar resposta",
-	"Copied shared chat URL to clipboard!": "URL de bate-papo compartilhado copiada com sucesso!",
+	"Copied shared chat URL to clipboard!": "URL de Conversa partilhado copiada com sucesso!",
 	"Copy": "Copiar",
 	"Copy last code block": "Copiar último bloco de código",
 	"Copy last response": "Copiar última resposta",
@@ -132,8 +132,8 @@
 	"Custom": "Personalizado",
 	"Customize models for a specific purpose": "Personalizar modelos para uma finalidade específica",
 	"Dark": "Escuro",
-	"Dashboard": "",
-	"Database": "Banco de dados",
+	"Dashboard": "Painel",
+	"Database": "Base de dados",
 	"December": "Dezembro",
 	"Default": "Padrão",
 	"Default (Automatic1111)": "Padrão (Automatic1111)",
@@ -141,118 +141,119 @@
 	"Default Model": "Modelo padrão",
 	"Default model updated": "Modelo padrão atualizado",
 	"Default Prompt Suggestions": "Sugestões de Prompt Padrão",
-	"Default User Role": "Função de Usuário Padrão",
-	"delete": "excluir",
-	"Delete": "Excluir",
-	"Delete a model": "Excluir um modelo",
-	"Delete All Chats": "Excluir todos os chats",
-	"Delete chat": "Excluir bate-papo",
-	"Delete Chat": "Excluir Bate-papo",
-	"delete this link": "excluir este link",
-	"Delete User": "Excluir Usuário",
-	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} excluído",
-	"Deleted {{name}}": "Suprimido {{name}}",
+	"Default User Role": "Função de Utilizador Padrão",
+	"delete": "apagar",
+	"Delete": "Apagar",
+	"Delete a model": "Apagar um modelo",
+	"Delete All Chats": "Apagar todas as conversas",
+	"Delete chat": "Apagar conversa",
+	"Delete Chat": "Apagar Conversa",
+	"delete this link": "apagar este link",
+	"Delete User": "Apagar Utilizador",
+	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} apagado",
+	"Deleted {{name}}": "Apagado {{name}}",
 	"Description": "Descrição",
 	"Didn't fully follow instructions": "Não seguiu instruções com precisão",
 	"Discover a model": "Descubra um modelo",
 	"Discover a prompt": "Descobrir um prompt",
-	"Discover, download, and explore custom prompts": "Descubra, baixe e explore prompts personalizados",
-	"Discover, download, and explore model presets": "Descubra, baixe e explore predefinições de modelo",
-	"Dismissible": "",
-	"Display the username instead of You in the Chat": "Exibir o nome de usuário em vez de Você no Bate-papo",
+	"Discover, download, and explore custom prompts": "Descubra, descarregue e explore prompts personalizados",
+	"Discover, download, and explore model presets": "Descubra, descarregue e explore predefinições de modelo",
+	"Dismissible": "Dispensável",
+	"Display the username instead of You in the Chat": "Exibir o nome de utilizador em vez de Você na Conversa",
 	"Document": "Documento",
 	"Document Settings": "Configurações de Documento",
-	"Documentation": "",
+	"Documentation": "Documentação",
 	"Documents": "Documentos",
-	"does not make any external connections, and your data stays securely on your locally hosted server.": "não faz conexões externas e seus dados permanecem seguros em seu servidor hospedado localmente.",
+	"does not make any external connections, and your data stays securely on your locally hosted server.": "não faz conexões externas e os seus dados permanecem seguros no seu servidor alojado localmente.",
 	"Don't Allow": "Não Permitir",
 	"Don't have an account?": "Não tem uma conta?",
 	"Don't like the style": "Não gosta do estilo",
-	"Download": "Baixar",
+	"Download": "Descarregar",
 	"Download canceled": "Download cancelado",
-	"Download Database": "Baixar Banco de Dados",
-	"Drop any files here to add to the conversation": "Solte os arquivos aqui para adicionar à conversa",
+	"Download Database": "Descarregar Base de Dados",
+	"Drop any files here to add to the conversation": "Largue os ficheiros aqui para adicionar à conversa",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "por exemplo, '30s', '10m'. Unidades de tempo válidas são 's', 'm', 'h'.",
 	"Edit": "Editar",
 	"Edit Doc": "Editar Documento",
-	"Edit User": "Editar Usuário",
+	"Edit User": "Editar Utilizador",
 	"Email": "E-mail",
-	"Embedding Batch Size": "",
+	"Embedding Batch Size": "Tamanho do Lote do Embedding",
 	"Embedding Model": "Modelo de Embedding",
 	"Embedding Model Engine": "Motor de Modelo de Embedding",
 	"Embedding model set to \"{{embedding_model}}\"": "Modelo de Embedding definido como \"{{embedding_model}}\"",
-	"Enable Chat History": "Ativar Histórico de Bate-papo",
-	"Enable Community Sharing": "Habilite o compartilhamento da comunidade",
+	"Enable Chat History": "Ativar Histórico de Conversas",
+	"Enable Community Sharing": "Active a Partilha da Comunidade",
 	"Enable New Sign Ups": "Ativar Novas Inscrições",
 	"Enable Web Search": "Ativar pesquisa na Web",
-	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Garanta que seu arquivo CSV inclua 4 colunas nesta ordem: Nome, E-mail, Senha, Função.",
-	"Enter {{role}} message here": "Digite a mensagem de {{role}} aqui",
-	"Enter a detail about yourself for your LLMs to recall": "Digite um detalhe sobre você para que seus LLMs possam lembrá-lo",
-	"Enter Brave Search API Key": "Insira a chave da API do Brave Search",
-	"Enter Chunk Overlap": "Digite a Sobreposição de Fragmento",
-	"Enter Chunk Size": "Digite o Tamanho do Fragmento",
-	"Enter Github Raw URL": "Insira o URL bruto do Github",
-	"Enter Google PSE API Key": "Insira a chave da API PSE do Google",
-	"Enter Google PSE Engine Id": "Insira o ID do mecanismo PSE do Google",
-	"Enter Image Size (e.g. 512x512)": "Digite o Tamanho da Imagem (por exemplo, 512x512)",
-	"Enter language codes": "Digite os códigos de idioma",
-	"Enter model tag (e.g. {{modelTag}})": "Digite a tag do modelo (por exemplo, {{modelTag}})",
-	"Enter Number of Steps (e.g. 50)": "Digite o Número de Etapas (por exemplo, 50)",
-	"Enter Score": "Digite a Pontuação",
-	"Enter Searxng Query URL": "Insira o URL da Consulta Searxng",
-	"Enter Serper API Key": "Insira a chave da API Serper",
-	"Enter Serpstack API Key": "Insira a chave da API Serpstack",
-	"Enter stop sequence": "Digite a sequência de parada",
-	"Enter Top K": "Digite o Top K",
-	"Enter URL (e.g. http://127.0.0.1:7860/)": "Digite a URL (por exemplo, http://127.0.0.1:7860/)",
-	"Enter URL (e.g. http://localhost:11434)": "Digite a URL (por exemplo, http://localhost:11434)",
-	"Enter Your Email": "Digite seu E-mail",
-	"Enter Your Full Name": "Digite seu Nome Completo",
-	"Enter Your Password": "Digite sua Senha",
-	"Enter Your Role": "Digite sua Função",
+	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Confirme que o seu ficheiro CSV inclui 4 colunas nesta ordem: Nome, E-mail, Senha, Função.",
+	"Enter {{role}} message here": "Escreva a mensagem de {{role}} aqui",
+	"Enter a detail about yourself for your LLMs to recall": "Escreva um detalhe sobre você para que os seus LLMs possam lembrar-se",
+	"Enter Brave Search API Key": "Escreva a chave da API do Brave Search",
+	"Enter Chunk Overlap": "Escreva a Sobreposição de Fragmento",
+	"Enter Chunk Size": "Escreva o Tamanho do Fragmento",
+	"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",
+	"Enter Image Size (e.g. 512x512)": "Escreva o Tamanho da Imagem (por exemplo, 512x512)",
+	"Enter language codes": "Escreva os códigos de idioma",
+	"Enter model tag (e.g. {{modelTag}})": "Escreva a tag do modelo (por exemplo, {{modelTag}})",
+	"Enter Number of Steps (e.g. 50)": "Escreva o Número de Etapas (por exemplo, 50)",
+	"Enter Score": "Escreva a Pontuação",
+	"Enter Searxng Query URL": "Escreva o URL da Pesquisa Searxng",
+	"Enter Serper API Key": "Escreva a chave da API Serper",
+	"Enter Serply API Key": "",
+	"Enter Serpstack API Key": "Escreva a chave da API Serpstack",
+	"Enter stop sequence": "Escreva a sequência de paragem",
+	"Enter Top K": "Escreva o Top K",
+	"Enter URL (e.g. http://127.0.0.1:7860/)": "Escreva o URL (por exemplo, http://127.0.0.1:7860/)",
+	"Enter URL (e.g. http://localhost:11434)": "Escreva o URL (por exemplo, http://localhost:11434)",
+	"Enter Your Email": "Escreva o seu E-mail",
+	"Enter Your Full Name": "Escreva o seu Nome Completo",
+	"Enter Your Password": "Escreva a sua Senha",
+	"Enter Your Role": "Escreva a sua Função",
 	"Error": "Erro",
 	"Experimental": "Experimental",
-	"Export": "Exportação",
-	"Export All Chats (All Users)": "Exportar Todos os Bate-papos (Todos os Usuários)",
-	"Export chat (.json)": "",
-	"Export Chats": "Exportar Bate-papos",
+	"Export": "Exportar",
+	"Export All Chats (All Users)": "Exportar Todas as Conversas (Todos os Utilizadores)",
+	"Export chat (.json)": "Exportar Conversa (.json)",
+	"Export Chats": "Exportar Conversas",
 	"Export Documents Mapping": "Exportar Mapeamento de Documentos",
 	"Export Models": "Modelos de Exportação",
 	"Export Prompts": "Exportar Prompts",
-	"External Models": "",
+	"External Models": "Modelos Externos",
 	"Failed to create API Key.": "Falha ao criar a Chave da API.",
 	"Failed to read clipboard contents": "Falha ao ler o conteúdo da área de transferência",
-	"Failed to update settings": "",
+	"Failed to update settings": "Falha ao atualizar as definições",
 	"February": "Fevereiro",
 	"Feel free to add specific details": "Sinta-se à vontade para adicionar detalhes específicos",
-	"File Mode": "Modo de Arquivo",
-	"File not found.": "Arquivo não encontrado.",
-	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Impostação de impressão digital detectada: Não é possível usar iniciais como avatar. Padronizando para imagem de perfil padrão.",
+	"File Mode": "Modo de Ficheiro",
+	"File not found.": "Ficheiro não encontrado.",
+	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Detectada falsificação da impressão digital: Não é possível usar iniciais como avatar. A usar a imagem de perfil padrão.",
 	"Fluidly stream large external response chunks": "Transmita com fluidez grandes blocos de resposta externa",
-	"Focus chat input": "Focar entrada de bate-papo",
+	"Focus chat input": "Focar na conversa",
 	"Followed instructions perfectly": "Seguiu instruções perfeitamente",
-	"Format your variables using square brackets like this:": "Formate suas variáveis usando colchetes como este:",
+	"Format your variables using square brackets like this:": "Formate as suas variáveis usando parenteses rectos como este:",
 	"Frequency Penalty": "Penalidade de Frequência",
 	"General": "Geral",
 	"General Settings": "Configurações Gerais",
-	"Generate Image": "",
-	"Generating search query": "Gerar consulta de pesquisa",
+	"Generate Image": "Gerar imagem",
+	"Generating search query": "A gerar a consulta da pesquisa",
 	"Generation Info": "Informações de Geração",
 	"Good Response": "Boa Resposta",
 	"Google PSE API Key": "Chave da API PSE do Google",
 	"Google PSE Engine Id": "ID do mecanismo PSE do Google",
 	"h:mm a": "h:mm a",
-	"has no conversations.": "não possui bate-papos.",
+	"has no conversations.": "não possui conversas.",
 	"Hello, {{name}}": "Olá, {{name}}",
-	"Help": "Help",
+	"Help": "Ajuda",
 	"Hide": "Ocultar",
 	"How can I help you today?": "Como posso ajudá-lo hoje?",
 	"Hybrid Search": "Pesquisa Híbrida",
 	"Image Generation (Experimental)": "Geração de Imagens (Experimental)",
 	"Image Generation Engine": "Mecanismo de Geração de Imagens",
-	"Image Settings": "Configurações de Imagem",
+	"Image Settings": "Configurações da Imagem",
 	"Images": "Imagens",
-	"Import Chats": "Importar Bate-papos",
+	"Import Chats": "Importar Conversas",
 	"Import Documents Mapping": "Importar Mapeamento de Documentos",
 	"Import Models": "Importar Modelos",
 	"Import Prompts": "Importar Prompts",
@@ -260,7 +261,7 @@
 	"Info": "Informação",
 	"Input commands": "Comandos de entrada",
 	"Install from Github URL": "Instalar a partir do URL do Github",
-	"Instant Auto-Send After Voice Transcription": "",
+	"Instant Auto-Send After Voice Transcription": "Enviar automaticamente depois da transcrição da voz",
 	"Interface": "Interface",
 	"Invalid Tag": "Etiqueta Inválida",
 	"January": "Janeiro",
@@ -273,55 +274,55 @@
 	"JWT Token": "Token JWT",
 	"Keep Alive": "Manter Vivo",
 	"Keyboard shortcuts": "Atalhos de teclado",
-	"Knowledge": "",
+	"Knowledge": "Conhecimento",
 	"Language": "Idioma",
 	"Last Active": "Último Ativo",
 	"Light": "Claro",
-	"Listening...": "",
+	"Listening...": "A escutar...",
 	"LLMs can make mistakes. Verify important information.": "LLMs podem cometer erros. Verifique informações importantes.",
-	"Local Models": "",
+	"Local Models": "Modelos Locais",
 	"LTR": "LTR",
 	"Made by OpenWebUI Community": "Feito pela Comunidade OpenWebUI",
 	"Make sure to enclose them with": "Certifique-se de colocá-los entre",
-	"Manage": "",
-	"Manage Models": "Gerenciar Modelos",
-	"Manage Ollama Models": "Gerenciar Modelos Ollama",
-	"Manage Pipelines": "Gerenciar pipelines",
+	"Manage": "Gerir",
+	"Manage Models": "Gerir Modelos",
+	"Manage Ollama Models": "Gerir Modelos Ollama",
+	"Manage Pipelines": "Gerir pipelines",
 	"March": "Março",
-	"Max Tokens (num_predict)": "Max Tokens (num_predict)",
-	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Máximo de 3 modelos podem ser baixados simultaneamente. Tente novamente mais tarde.",
+	"Max Tokens (num_predict)": "Máx Tokens (num_predict)",
+	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "O máximo de 3 modelos podem ser descarregados simultaneamente. Tente novamente mais tarde.",
 	"May": "Maio",
 	"Memories accessible by LLMs will be shown here.": "Memórias acessíveis por LLMs serão mostradas aqui.",
 	"Memory": "Memória",
-	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Mensagens que você enviar após criar seu link não serão compartilhadas. Os usuários com o URL poderão visualizar o bate-papo compartilhado.",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Mensagens que você enviar após criar o seu link não serão partilhadas. Os utilizadores com o URL poderão visualizar a conversa partilhada.",
 	"Minimum Score": "Mínimo de Pontuação",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
 	"MMMM DD, YYYY": "DD/MM/YYYY",
 	"MMMM DD, YYYY HH:mm": "DD/MM/YYYY HH:mm",
-	"Model '{{modelName}}' has been successfully downloaded.": "O modelo '{{modelName}}' foi baixado com sucesso.",
-	"Model '{{modelTag}}' is already in queue for downloading.": "O modelo '{{modelTag}}' já está na fila para download.",
-	"Model {{modelId}} not found": "Modelo {{modelId}} não encontrado",
+	"Model '{{modelName}}' has been successfully downloaded.": "O modelo '{{modelName}}' foi descarregado com sucesso.",
+	"Model '{{modelTag}}' is already in queue for downloading.": "O modelo '{{modelTag}}' já está na fila para descarregar.",
+	"Model {{modelId}} not found": "Modelo {{modelId}} não foi encontrado",
 	"Model {{modelName}} is not vision capable": "O modelo {{modelName}} não é capaz de visão",
 	"Model {{name}} is now {{status}}": "Modelo {{name}} agora é {{status}}",
-	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Caminho do sistema de arquivos do modelo detectado. É necessário o nome curto do modelo para atualização, não é possível continuar.",
+	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Dtectado caminho do sistema de ficheiros do modelo. É necessário o nome curto do modelo para atualização, não é possível continuar.",
 	"Model ID": "ID do modelo",
 	"Model not selected": "Modelo não selecionado",
 	"Model Params": "Params Modelo",
-	"Model Whitelisting": "Lista de Permissões de Modelo",
+	"Model Whitelisting": "Lista de Permissões do Modelo",
 	"Model(s) Whitelisted": "Modelo(s) na Lista de Permissões",
-	"Modelfile Content": "Conteúdo do Arquivo de Modelo",
+	"Modelfile Content": "Conteúdo do Ficheiro do Modelo",
 	"Models": "Modelos",
 	"More": "Mais",
 	"Name": "Nome",
-	"Name Tag": "Tag de Nome",
+	"Name Tag": "Etiqueta de Nome",
 	"Name your model": "Atribua um nome ao seu modelo",
-	"New Chat": "Novo Bate-papo",
+	"New Chat": "Nova Conversa",
 	"New Password": "Nova Senha",
-	"No documents found": "",
-	"No results found": "Nenhum resultado encontrado",
-	"No search query generated": "Nenhuma consulta de pesquisa gerada",
+	"No documents found": "Não foram encontrados documentos",
+	"No results found": "Não foram encontrados resultados",
+	"No search query generated": "Não foi gerada nenhuma consulta de pesquisa",
 	"No source available": "Nenhuma fonte disponível",
 	"None": "Nenhum",
 	"Not factually correct": "Não é correto em termos factuais",
@@ -336,18 +337,18 @@
 	"Ollama": "Ollama",
 	"Ollama API": "Ollama API",
 	"Ollama API disabled": "API do Ollama desativada",
-	"Ollama API is disabled": "",
+	"Ollama API is disabled": "A API do Ollama está desactivada",
 	"Ollama Version": "Versão do Ollama",
 	"On": "Ligado",
-	"Only": "Somente",
-	"Only alphanumeric characters and hyphens are allowed in the command string.": "Somente caracteres alfanuméricos e hífens são permitidos na string de comando.",
-	"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Opa! Aguente firme! Seus arquivos ainda estão no forno de processamento. Estamos cozinhando-os com perfeição. Por favor, seja paciente e avisaremos quando estiverem prontos.",
-	"Oops! Looks like the URL is invalid. Please double-check and try again.": "Opa! Parece que a URL é inválida. Verifique novamente e tente outra vez.",
-	"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Opa! Você está usando um método não suportado (somente frontend). Por favor, sirva o WebUI a partir do backend.",
+	"Only": "Apenas",
+	"Only alphanumeric characters and hyphens are allowed in the command string.": "Apenas caracteres alfanuméricos e hífens são permitidos na string de comando.",
+	"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Epá! Segura-te! Os teus ficheiros ainda estão no forno de processamento. Estamos a cozinhá-los com perfeição. Por favor, seja paciente e avisaremos quando estiverem prontos.",
+	"Oops! Looks like the URL is invalid. Please double-check and try again.": "Epá! Parece que o URL é inválido. Verifique novamente e tente outra vez.",
+	"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Epá! Você está a usar um método não suportado (somente frontend). Por favor, sirva o WebUI a partir do backend.",
 	"Open": "Abrir",
-	"Open AI": "OpenAI",
-	"Open AI (Dall-E)": "OpenAI (Dall-E)",
-	"Open new chat": "Abrir novo bate-papo",
+	"Open AI": "Open AI",
+	"Open AI (Dall-E)": "Open AI (Dall-E)",
+	"Open new chat": "Abrir nova conversa",
 	"OpenAI": "OpenAI",
 	"OpenAI API": "API OpenAI",
 	"OpenAI API Config": "Configuração da API OpenAI",
@@ -359,31 +360,31 @@
 	"PDF document (.pdf)": "Documento PDF (.pdf)",
 	"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
 	"pending": "pendente",
-	"Permission denied when accessing media devices": "",
-	"Permission denied when accessing microphone": "",
-	"Permission denied when accessing microphone: {{error}}": "Permissão negada ao acessar o microfone: {{error}}",
+	"Permission denied when accessing media devices": "A permissão foi negada ao aceder aos dispositivos de media",
+	"Permission denied when accessing microphone": "A permissão foi negada ao aceder ao microfone",
+	"Permission denied when accessing microphone: {{error}}": "A permissão foi negada ao aceder o microfone: {{error}}",
 	"Personalization": "Personalização",
 	"Pipelines": "Condutas",
 	"Pipelines Valves": "Válvulas de Condutas",
 	"Plain text (.txt)": "Texto sem formatação (.txt)",
-	"Playground": "Parque infantil",
+	"Playground": "Recreio",
 	"Positive attitude": "Atitude Positiva",
 	"Previous 30 days": "Últimos 30 dias",
 	"Previous 7 days": "Últimos 7 dias",
 	"Profile Image": "Imagem de Perfil",
 	"Prompt": "Prompt",
-	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (ex.: Dê-me um fatídico sobre o Império Romano)",
+	"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 suggestions": "Sugestões de Prompt",
 	"Prompts": "Prompts",
-	"Pull \"{{searchValue}}\" from Ollama.com": "Extrair \"{{searchValue}}\" do Ollama.com",
-	"Pull a model from Ollama.com": "Extrair um modelo do Ollama.com",
+	"Pull \"{{searchValue}}\" from Ollama.com": "Puxar \"{{searchValue}}\" do Ollama.com",
+	"Pull a model from Ollama.com": "Puxar um modelo do Ollama.com",
 	"Query Params": "Parâmetros de Consulta",
 	"RAG Template": "Modelo RAG",
 	"Read Aloud": "Ler em Voz Alta",
 	"Record voice": "Gravar voz",
-	"Redirecting you to OpenWebUI Community": "Redirecionando você para a Comunidade OpenWebUI",
-	"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
+	"Redirecting you to OpenWebUI Community": "Redirecionando-o para a Comunidade OpenWebUI",
+	"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Refera-se a si próprio como \"User\" (por exemplo, \"User está a aprender Espanhol\")",
 	"Refused when it shouldn't have": "Recusado quando não deveria",
 	"Regenerate": "Regenerar",
 	"Release Notes": "Notas de Lançamento",
@@ -391,57 +392,59 @@
 	"Remove Model": "Remover Modelo",
 	"Rename": "Renomear",
 	"Repeat Last N": "Repetir Últimos N",
-	"Request Mode": "Modo de Solicitação",
+	"Request Mode": "Modo de Pedido",
 	"Reranking Model": "Modelo de Reranking",
 	"Reranking model disabled": "Modelo de Reranking desativado",
 	"Reranking model set to \"{{reranking_model}}\"": "Modelo de Reranking definido como \"{{reranking_model}}\"",
-	"Reset Upload Directory": "",
+	"Reset Upload Directory": "Limpar Pasta de Carregamento",
 	"Reset Vector Storage": "Redefinir Armazenamento de Vetor",
 	"Response AutoCopy to Clipboard": "Cópia Automática da Resposta para a Área de Transferência",
 	"Role": "Função",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"RTL": "RTL",
-	"Running": "",
-	"Save": "Salvar",
-	"Save & Create": "Salvar e Criar",
-	"Save & Update": "Salvar e Atualizar",
-	"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Salvar logs de bate-papo diretamente no armazenamento do seu navegador não é mais suportado. Reserve um momento para baixar e excluir seus logs de bate-papo clicando no botão abaixo. Não se preocupe, você pode facilmente reimportar seus logs de bate-papo para o backend através de",
+	"Running": "A correr",
+	"Save": "Guardar",
+	"Save & Create": "Guardar e Criar",
+	"Save & Update": "Guardar e Atualizar",
+	"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Guardar o registo das conversas diretamente no armazenamento do seu navegador já não é suportado. Reserve um momento para descarregar e eliminar os seus registos de conversas clicando no botão abaixo. Não se preocupe, você pode facilmente reimportar os seus registos de conversas para o backend através de",
 	"Scan": "Digitalizar",
 	"Scan complete!": "Digitalização concluída!",
 	"Scan for documents from {{path}}": "Digitalizar documentos de {{path}}",
 	"Search": "Pesquisar",
 	"Search a model": "Pesquisar um modelo",
-	"Search Chats": "Pesquisar Chats",
+	"Search Chats": "Pesquisar Conversas",
 	"Search Documents": "Pesquisar Documentos",
 	"Search Models": "Modelos de pesquisa",
 	"Search Prompts": "Pesquisar Prompts",
-	"Search Query Generation Prompt": "",
-	"Search Query Generation Prompt Length Threshold": "",
+	"Search Query Generation Prompt": "Prompt de geração de consulta de pesquisa",
+	"Search Query Generation Prompt Length Threshold": "Limite de comprimento do prompt de geração de consulta de pesquisa",
 	"Search Result Count": "Contagem de resultados da pesquisa",
 	"Searched {{count}} sites_one": "Pesquisado {{count}} sites_one",
 	"Searched {{count}} sites_many": "Pesquisado {{count}} sites_many",
 	"Searched {{count}} sites_other": "Pesquisado {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "Pesquisando na Web por '{{searchQuery}}'",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "URL de consulta Searxng",
 	"See readme.md for instructions": "Consulte readme.md para obter instruções",
 	"See what's new": "Veja o que há de novo",
 	"Seed": "Semente",
 	"Select a base model": "Selecione um modelo base",
-	"Select a engine": "",
+	"Select a engine": "Selecione um motor",
 	"Select a mode": "Selecione um modo",
 	"Select a model": "Selecione um modelo",
 	"Select a pipeline": "Selecione um pipeline",
 	"Select a pipeline url": "Selecione um URL de pipeline",
 	"Select an Ollama instance": "Selecione uma instância Ollama",
-	"Select model": "Selecione um modelo",
-	"Select only one model to call": "",
+	"Select Documents": "",
+	"Select model": "Selecione o modelo",
+	"Select only one model to call": "Selecione apenas um modelo para a chamada",
 	"Selected model(s) do not support image inputs": "O(s) modelo(s) selecionado(s) não suporta(m) entradas de imagem",
 	"Send": "Enviar",
 	"Send a Message": "Enviar uma Mensagem",
 	"Send message": "Enviar mensagem",
 	"September": "Setembro",
 	"Serper API Key": "Chave API Serper",
+	"Serply API Key": "",
 	"Serpstack API Key": "Chave da API Serpstack",
 	"Server connection verified": "Conexão com o servidor verificada",
 	"Set as default": "Definir como padrão",
@@ -453,26 +456,26 @@
 	"Set Task Model": "Definir modelo de tarefa",
 	"Set Voice": "Definir Voz",
 	"Settings": "Configurações",
-	"Settings saved successfully!": "Configurações salvas com sucesso!",
-	"Settings updated successfully": "",
-	"Share": "Compartilhar",
-	"Share Chat": "Compartilhar Bate-papo",
-	"Share to OpenWebUI Community": "Compartilhar com a Comunidade OpenWebUI",
+	"Settings saved successfully!": "Configurações guardadas com sucesso!",
+	"Settings updated successfully": "Configurações atualizadas com sucesso",
+	"Share": "Partilhar",
+	"Share Chat": "Partilhar Conversa",
+	"Share to OpenWebUI Community": "Partilhar com a Comunidade OpenWebUI",
 	"short-summary": "resumo-curto",
 	"Show": "Mostrar",
-	"Show Admin Details in Account Pending Overlay": "",
-	"Show shortcuts": "Mostrar",
+	"Show Admin Details in Account Pending Overlay": "Mostrar Detalhes do Administrador na sobreposição de Conta Pendente",
+	"Show shortcuts": "Mostrar atalhos",
 	"Showcased creativity": "Criatividade Exibida",
 	"sidebar": "barra lateral",
 	"Sign in": "Entrar",
 	"Sign Out": "Sair",
 	"Sign up": "Inscrever-se",
-	"Signing in": "Entrando",
+	"Signing in": "A entrar",
 	"Source": "Fonte",
 	"Speech recognition error: {{error}}": "Erro de reconhecimento de fala: {{error}}",
-	"Speech-to-Text Engine": "Mecanismo de Fala para Texto",
-	"Stop Sequence": "Sequência de Parada",
-	"STT Model": "",
+	"Speech-to-Text Engine": "Motor de Fala para Texto",
+	"Stop Sequence": "Sequência de Paragem",
+	"STT Model": "Modelo STT",
 	"STT Settings": "Configurações STT",
 	"Submit": "Enviar",
 	"Subtitle (e.g. about the Roman Empire)": "Subtítulo (ex.: sobre o Império Romano)",
@@ -481,69 +484,70 @@
 	"Suggested": "Sugerido",
 	"System": "Sistema",
 	"System Prompt": "Prompt do Sistema",
-	"Tags": "Tags",
-	"Tell us more:": "Dê-nos mais:",
+	"Tags": "Etiquetas",
+	"Tell us more:": "Diga-nos mais:",
 	"Temperature": "Temperatura",
 	"Template": "Modelo",
-	"Text Completion": "Complemento de Texto",
-	"Text-to-Speech Engine": "Mecanismo de Texto para Fala",
+	"Text Completion": "Conclusão de Texto",
+	"Text-to-Speech Engine": "Motor de Texto para Fala",
 	"Tfs Z": "Tfs Z",
-	"Thanks for your feedback!": "Obrigado pelo feedback!",
-	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "O score deve ser um valor entre 0.0 (0%) e 1.0 (100%).",
+	"Thanks for your feedback!": "Obrigado pelo seu feedback!",
+	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "A pontuação deve ser um valor entre 0.0 (0%) e 1.0 (100%).",
 	"Theme": "Tema",
-	"Thinking...": "",
-	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Isso garante que suas conversas valiosas sejam salvas com segurança em seu banco de dados de backend. Obrigado!",
-	"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
+	"Thinking...": "A pensar...",
+	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Isto garante que suas conversas valiosas sejam guardadas com segurança na sua base de dados de backend. Obrigado!",
+	"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Isto é um recurso experimental, pode não funcionar conforme o esperado e está sujeito a alterações a qualquer momento.",
 	"This setting does not sync across browsers or devices.": "Esta configuração não sincroniza entre navegadores ou dispositivos.",
-	"Thorough explanation": "Explicação Completa",
-	"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Dica: Atualize vários slots de variáveis consecutivamente pressionando a tecla Tab na entrada de bate-papo após cada substituição.",
+	"Thorough explanation": "Explicação Minuciosa",
+	"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Dica: Atualize vários slots de variáveis consecutivamente pressionando a tecla Tab na entrada da conversa após cada substituição.",
 	"Title": "Título",
-	"Title (e.g. Tell me a fun fact)": "Título (ex.: Dê-me um fatídico fatídico)",
+	"Title (e.g. Tell me a fun fact)": "Título (ex.: Diz-me um facto divertido)",
 	"Title Auto-Generation": "Geração Automática de Título",
 	"Title cannot be an empty string.": "Título não pode ser uma string vazia.",
 	"Title Generation Prompt": "Prompt de Geração de Título",
 	"to": "para",
-	"To access the available model names for downloading,": "Para acessar os nomes de modelo disponíveis para download,",
-	"To access the GGUF models available for downloading,": "Para acessar os modelos GGUF disponíveis para download,",
-	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
-	"to chat input.": "para a entrada de bate-papo.",
+	"To access the available model names for downloading,": "Para aceder aos nomes de modelo disponíveis para descarregar,",
+	"To access the GGUF models available for downloading,": "Para aceder aos modelos GGUF disponíveis para descarregar,",
+	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Para aceder ao WebUI, entre em contato com o administrador. Os administradores podem gerir o status dos utilizadores no Painel de Administração.",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
+	"to chat input.": "para a entrada da conversa.",
 	"Today": "Hoje",
 	"Toggle settings": "Alternar configurações",
 	"Toggle sidebar": "Alternar barra lateral",
 	"Top K": "Top K",
 	"Top P": "Top P",
-	"Trouble accessing Ollama?": "Problemas para acessar o Ollama?",
-	"TTS Model": "",
+	"Trouble accessing Ollama?": "Problemas a aceder ao Ollama?",
+	"TTS Model": "Modelo TTS",
 	"TTS Settings": "Configurações TTS",
-	"TTS Voice": "",
+	"TTS Voice": "Voz TTS",
 	"Type": "Tipo",
-	"Type Hugging Face Resolve (Download) URL": "Digite a URL do Hugging Face Resolve (Download)",
-	"Uh-oh! There was an issue connecting to {{provider}}.": "Opa! Houve um problema ao conectar-se a {{provider}}.",
-	"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Tipo de arquivo desconhecido '{{file_type}}', mas aceitando e tratando como texto simples",
+	"Type Hugging Face Resolve (Download) URL": "Escreva o URL do Hugging Face Resolve (Descarregar)",
+	"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! Houve um problema ao conectar a {{provider}}.",
+	"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Tipo de ficheiro desconhecido '{{file_type}}', mas aceitando e tratando como texto simples",
 	"Update and Copy Link": "Atualizar e Copiar Link",
 	"Update password": "Atualizar senha",
 	"Upload a GGUF model": "Carregar um modelo GGUF",
 	"Upload Files": "Carregar ficheiros",
-	"Upload Pipeline": "",
+	"Upload Pipeline": "Carregar Pipeline",
 	"Upload Progress": "Progresso do Carregamento",
 	"URL Mode": "Modo de URL",
-	"Use '#' in the prompt input to load and select your documents.": "Use '#' na entrada do prompt para carregar e selecionar seus documentos.",
+	"Use '#' in the prompt input to load and select your documents.": "Use '#' na entrada do prompt para carregar e selecionar os seus documentos.",
 	"Use Gravatar": "Usar Gravatar",
 	"Use Initials": "Usar Iniciais",
 	"use_mlock (Ollama)": "use_mlock (Ollama)",
 	"use_mmap (Ollama)": "use_mmap (Ollama)",
-	"user": "usuário",
-	"User Permissions": "Permissões do Usuário",
-	"Users": "Usuários",
+	"user": "utilizador",
+	"User Permissions": "Permissões do Utilizador",
+	"Users": "Utilizadores",
 	"Utilize": "Utilizar",
 	"Valid time units:": "Unidades de tempo válidas:",
 	"variable": "variável",
 	"variable to have them replaced with clipboard content.": "variável para que sejam substituídos pelo conteúdo da área de transferência.",
 	"Version": "Versão",
-	"Warning": "Advertência",
-	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Aviso: Se você atualizar ou alterar seu modelo de vetorização, você precisará reimportar todos os documentos.",
+	"Warning": "Aviso",
+	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Aviso: Se você atualizar ou alterar o seu modelo de vetorização, você tem de reimportar todos os documentos.",
 	"Web": "Web",
-	"Web API": "",
+	"Web API": "Web API",
 	"Web Loader Settings": "Configurações do Carregador da Web",
 	"Web Params": "Parâmetros da Web",
 	"Web Search": "Pesquisa na Web",
@@ -551,23 +555,23 @@
 	"Webhook URL": "URL do Webhook",
 	"WebUI Add-ons": "Complementos WebUI",
 	"WebUI Settings": "Configurações WebUI",
-	"WebUI will make requests to": "WebUI fará solicitações para",
+	"WebUI will make requests to": "WebUI fará pedidos a",
 	"What’s New in": "O que há de novo em",
-	"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Quando o histórico está desativado, novos bate-papos neste navegador não aparecerão em seu histórico em nenhum dos seus dispositivos.",
-	"Whisper (Local)": "",
-	"Widescreen Mode": "",
+	"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Quando o histórico está desativado, novas conversas neste navegador não aparecerão em seu histórico em nenhum dos seus dispositivos.",
+	"Whisper (Local)": "Whisper (Local)",
+	"Widescreen Mode": "Modo Widescreen",
 	"Workspace": "Espaço de Trabalho",
-	"Write a prompt suggestion (e.g. Who are you?)": "Escreva uma sugestão de prompt (por exemplo, Quem é você?)",
+	"Write a prompt suggestion (e.g. Who are you?)": "Escreva uma sugestão de prompt (por exemplo, Quem és tu?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Escreva um resumo em 50 palavras que resuma [tópico ou palavra-chave].",
 	"Yesterday": "Ontem",
 	"You": "Você",
-	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
+	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Você pode personalizar as suas interações com LLMs adicionando memórias através do botão ‘Gerir’ abaixo, tornando-as mais úteis e personalizadas para você.",
 	"You cannot clone a base model": "Não é possível clonar um modelo base",
-	"You have no archived conversations.": "Você não tem bate-papos arquivados.",
-	"You have shared this chat": "Você compartilhou este bate-papo",
+	"You have no archived conversations.": "Você não tem conversas arquivadas.",
+	"You have shared this chat": "Você partilhou esta conversa",
 	"You're a helpful assistant.": "Você é um assistente útil.",
-	"You're now logged in.": "Você está conectado agora.",
-	"Your account status is currently pending activation.": "",
+	"You're now logged in.": "Você agora está conectado.",
+	"Your account status is currently pending activation.": "O status da sua conta está atualmente com a ativação pendente.",
 	"Youtube": "Youtube",
 	"Youtube Loader Settings": "Configurações do Carregador do Youtube"
 }

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

@@ -201,6 +201,7 @@
 	"Enter Score": "Введите оценку",
 	"Enter Searxng Query URL": "Введите URL-адрес запроса Searxng",
 	"Enter Serper API Key": "Введите ключ API Serper",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Введите ключ API Serpstack",
 	"Enter stop sequence": "Введите последовательность остановки",
 	"Enter Top K": "Введите Top K",
@@ -423,7 +424,7 @@
 	"Searched {{count}} sites_few": "Поиск {{count}} sites_few",
 	"Searched {{count}} sites_many": "Поиск {{count}} sites_many",
 	"Searched {{count}} sites_other": "Поиск {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "Поиск в Интернете по запросу '{{searchQuery}}'",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "URL-адрес запроса Searxng",
 	"See readme.md for instructions": "Смотрите readme.md для инструкций",
 	"See what's new": "Посмотреть, что нового",
@@ -435,6 +436,7 @@
 	"Select a pipeline": "Выбор конвейера",
 	"Select a pipeline url": "Выберите URL-адрес конвейера",
 	"Select an Ollama instance": "Выберите экземпляр Ollama",
+	"Select Documents": "",
 	"Select model": "Выберите модель",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "Выбранные модели не поддерживают ввод изображений",
@@ -443,6 +445,7 @@
 	"Send message": "Отправить сообщение",
 	"September": "Сентябрь",
 	"Serper API Key": "Ключ API Serper",
+	"Serply API Key": "",
 	"Serpstack API Key": "Ключ API Serpstack",
 	"Server connection verified": "Соединение с сервером проверено",
 	"Set as default": "Установить по умолчанию",
@@ -507,6 +510,7 @@
 	"To access the available model names for downloading,": "Чтобы получить доступ к доступным для загрузки именам моделей,",
 	"To access the GGUF models available for downloading,": "Чтобы получить доступ к моделям GGUF, доступным для загрузки,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "в чате.",
 	"Today": "Сегодня",
 	"Toggle settings": "Переключить настройки",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "Унесите резултат",
 	"Enter Searxng Query URL": "Унесите УРЛ адресу Сеарxнг упита",
 	"Enter Serper API Key": "Унесите Серпер АПИ кључ",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Унесите Серпстацк АПИ кључ",
 	"Enter stop sequence": "Унесите секвенцу заустављања",
 	"Enter Top K": "Унесите Топ К",
@@ -422,7 +423,7 @@
 	"Searched {{count}} sites_one": "Претражио {{цоунт}} ситес_оне",
 	"Searched {{count}} sites_few": "Претражио {{цоунт}} ситес_феw",
 	"Searched {{count}} sites_other": "Претражио {{цоунт}} ситес_отхер",
-	"Searching the web for '{{searchQuery}}'": "Претраживање Веба у потрази за \"{{сеарцхQуерy}}\"",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "УРЛ адреса Сеарxнг упита",
 	"See readme.md for instructions": "Погледај readme.md за упутства",
 	"See what's new": "Погледај шта је ново",
@@ -434,6 +435,7 @@
 	"Select a pipeline": "Избор цевовода",
 	"Select a pipeline url": "Избор урл адресе цевовода",
 	"Select an Ollama instance": "Изабери Ollama инстанцу",
+	"Select Documents": "",
 	"Select model": "Изабери модел",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "Изабрани модели не подржавају уносе слика",
@@ -442,6 +444,7 @@
 	"Send message": "Пошаљи поруку",
 	"September": "Септембар",
 	"Serper API Key": "Серпер АПИ кључ",
+	"Serply API Key": "",
 	"Serpstack API Key": "Серпстацк АПИ кључ",
 	"Server connection verified": "Веза са сервером потврђена",
 	"Set as default": "Подеси као подразумевано",
@@ -506,6 +509,7 @@
 	"To access the available model names for downloading,": "Да бисте приступили доступним именима модела за преузимање,",
 	"To access the GGUF models available for downloading,": "Да бисте приступили GGUF моделима доступним за преузимање,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "у унос ћаскања.",
 	"Today": "Данас",
 	"Toggle settings": "Пребаци подешавања",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "Ange poäng",
 	"Enter Searxng Query URL": "Ange Searxng Query URL",
 	"Enter Serper API Key": "Ange Serper API-nyckel",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Ange Serpstack API-nyckel",
 	"Enter stop sequence": "Ange stoppsekvens",
 	"Enter Top K": "Ange Top K",
@@ -421,7 +422,7 @@
 	"Search Result Count": "Antal sökresultat",
 	"Searched {{count}} sites_one": "Sökte på {{count}} sites_one",
 	"Searched {{count}} sites_other": "Sökte på {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "Söka på webben efter '{{searchQuery}}'",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "Searxng Query URL",
 	"See readme.md for instructions": "Se readme.md för instruktioner",
 	"See what's new": "Se vad som är nytt",
@@ -433,6 +434,7 @@
 	"Select a pipeline": "Välj en pipeline",
 	"Select a pipeline url": "Välj en pipeline-URL",
 	"Select an Ollama instance": "Välj en Ollama-instans",
+	"Select Documents": "",
 	"Select model": "Välj en modell",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "Valda modeller stöder inte bildinmatningar",
@@ -441,6 +443,7 @@
 	"Send message": "Skicka meddelande",
 	"September": "september",
 	"Serper API Key": "Serper API-nyckel",
+	"Serply API Key": "",
 	"Serpstack API Key": "Serpstack API-nyckel",
 	"Server connection verified": "Serveranslutning verifierad",
 	"Set as default": "Ange som standard",
@@ -505,6 +508,7 @@
 	"To access the available model names for downloading,": "För att komma åt de tillgängliga modellnamnen för nedladdning,",
 	"To access the GGUF models available for downloading,": "För att komma åt de GGUF-modeller som finns tillgängliga för nedladdning,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "till chattinmatning.",
 	"Today": "Idag",
 	"Toggle settings": "Växla inställningar",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "",
 	"Enter Searxng Query URL": "",
 	"Enter Serper API Key": "",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "",
 	"Enter stop sequence": "",
 	"Enter Top K": "",
@@ -421,7 +422,7 @@
 	"Search Result Count": "",
 	"Searched {{count}} sites_one": "",
 	"Searched {{count}} sites_other": "",
-	"Searching the web for '{{searchQuery}}'": "",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "",
 	"See readme.md for instructions": "",
 	"See what's new": "",
@@ -433,6 +434,7 @@
 	"Select a pipeline": "",
 	"Select a pipeline url": "",
 	"Select an Ollama instance": "",
+	"Select Documents": "",
 	"Select model": "",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "",
@@ -441,6 +443,7 @@
 	"Send message": "",
 	"September": "",
 	"Serper API Key": "",
+	"Serply API Key": "",
 	"Serpstack API Key": "",
 	"Server connection verified": "",
 	"Set as default": "",
@@ -505,6 +508,7 @@
 	"To access the available model names for downloading,": "",
 	"To access the GGUF models available for downloading,": "",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "",
 	"Today": "",
 	"Toggle settings": "",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "Skoru Girin",
 	"Enter Searxng Query URL": "Searxng Sorgu URL'sini girin",
 	"Enter Serper API Key": "Serper API Anahtarını Girin",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Serpstack API Anahtarını Girin",
 	"Enter stop sequence": "Durdurma dizisini girin",
 	"Enter Top K": "Top K'yı girin",
@@ -421,7 +422,7 @@
 	"Search Result Count": "Arama Sonucu Sayısı",
 	"Searched {{count}} sites_one": "Arandı {{count}} sites_one",
 	"Searched {{count}} sites_other": "Arandı {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "Web'de '{{searchQuery}}' aranıyor",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "Searxng Sorgu URL'si",
 	"See readme.md for instructions": "Yönergeler için readme.md dosyasına bakın",
 	"See what's new": "Yeniliklere göz atın",
@@ -433,6 +434,7 @@
 	"Select a pipeline": "Bir pipeline seç",
 	"Select a pipeline url": "Bir pipeline URL'si seç",
 	"Select an Ollama instance": "Bir Ollama örneği seçin",
+	"Select Documents": "",
 	"Select model": "Model seç",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "Seçilen model(ler) görüntü girişlerini desteklemiyor",
@@ -441,6 +443,7 @@
 	"Send message": "Mesaj gönder",
 	"September": "Eylül",
 	"Serper API Key": "Serper API Anahtarı",
+	"Serply API Key": "",
 	"Serpstack API Key": "Serpstack API Anahtarı",
 	"Server connection verified": "Sunucu bağlantısı doğrulandı",
 	"Set as default": "Varsayılan olarak ayarla",
@@ -505,6 +508,7 @@
 	"To access the available model names for downloading,": "İndirilebilir mevcut model adlarına erişmek için,",
 	"To access the GGUF models available for downloading,": "İndirilebilir mevcut GGUF modellerine erişmek için,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "sohbet girişine.",
 	"Today": "Bugün",
 	"Toggle settings": "Ayarları Aç/Kapat",

+ 5 - 1
src/lib/i18n/locales/uk-UA/translation.json

@@ -201,6 +201,7 @@
 	"Enter Score": "Введіть бал",
 	"Enter Searxng Query URL": "Введіть URL-адресу запиту Searxng",
 	"Enter Serper API Key": "Введіть ключ API Serper",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Введіть ключ API Serpstack",
 	"Enter stop sequence": "Введіть символ зупинки",
 	"Enter Top K": "Введіть Top K",
@@ -423,7 +424,7 @@
 	"Searched {{count}} sites_few": "Переглянуто {{count}} сайти",
 	"Searched {{count}} sites_many": "Переглянуто {{count}} сайтів",
 	"Searched {{count}} sites_other": "Переглянуто {{count}} сайтів",
-	"Searching the web for '{{searchQuery}}'": "Пошук в Інтернеті за запитом '{{searchQuery}}'",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "URL-адреса запиту Searxng",
 	"See readme.md for instructions": "Див. readme.md для інструкцій",
 	"See what's new": "Подивіться, що нового",
@@ -435,6 +436,7 @@
 	"Select a pipeline": "Виберіть pipeline",
 	"Select a pipeline url": "Виберіть адресу pipeline",
 	"Select an Ollama instance": "Виберіть екземпляр Ollama",
+	"Select Documents": "",
 	"Select model": "Вибрати модель",
 	"Select only one model to call": "Виберіть лише одну модель для виклику",
 	"Selected model(s) do not support image inputs": "Вибрані модель(і) не підтримують вхідні зображення",
@@ -443,6 +445,7 @@
 	"Send message": "Надіслати повідомлення",
 	"September": "Вересень",
 	"Serper API Key": "Ключ API Serper",
+	"Serply API Key": "",
 	"Serpstack API Key": "Ключ API Serpstack",
 	"Server connection verified": "З'єднання з сервером підтверджено",
 	"Set as default": "Встановити за замовчуванням",
@@ -507,6 +510,7 @@
 	"To access the available model names for downloading,": "Щоб отримати доступ до назв доступних для завантаження моделей,",
 	"To access the GGUF models available for downloading,": "Щоб отримати доступ до моделей GGUF, які можна завантажити,,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Щоб отримати доступ до веб-інтерфейсу, зверніться до адміністратора. Адміністратори можуть керувати статусами користувачів з Панелі адміністратора.",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "в чаті.",
 	"Today": "Сьогодні",
 	"Toggle settings": "Переключити налаштування",

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

@@ -201,6 +201,7 @@
 	"Enter Score": "Nhập Score",
 	"Enter Searxng Query URL": "Nhập Query URL cho Searxng",
 	"Enter Serper API Key": "Nhập Serper API Key",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "Nhập Serpstack API Key",
 	"Enter stop sequence": "Nhập stop sequence",
 	"Enter Top K": "Nhập Top K",
@@ -420,7 +421,7 @@
 	"Search Query Generation Prompt Length Threshold": "",
 	"Search Result Count": "Số kết quả tìm kiếm",
 	"Searched {{count}} sites_other": "Đã tìm {{count}} sites_other",
-	"Searching the web for '{{searchQuery}}'": "Tìm kiếm web cho '{{searchQuery}}'",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "URL truy vấn Searxng",
 	"See readme.md for instructions": "Xem readme.md để biết hướng dẫn",
 	"See what's new": "Xem những cập nhật mới",
@@ -432,6 +433,7 @@
 	"Select a pipeline": "Chọn một quy trình",
 	"Select a pipeline url": "Chọn url quy trình",
 	"Select an Ollama instance": "Chọn một thực thể Ollama",
+	"Select Documents": "",
 	"Select model": "Chọn model",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "Model được lựa chọn không hỗ trợ đầu vào là hình ảnh",
@@ -440,6 +442,7 @@
 	"Send message": "Gửi yêu cầu",
 	"September": "Tháng 9",
 	"Serper API Key": "Khóa API Serper",
+	"Serply API Key": "",
 	"Serpstack API Key": "Khóa API Serpstack",
 	"Server connection verified": "Kết nối máy chủ đã được xác minh",
 	"Set as default": "Đặt làm mặc định",
@@ -504,6 +507,7 @@
 	"To access the available model names for downloading,": "Để truy cập các tên mô hình có sẵn để tải xuống,",
 	"To access the GGUF models available for downloading,": "Để truy cập các mô hình GGUF có sẵn để tải xuống,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "đến đầu vào trò chuyện.",
 	"Today": "Hôm nay",
 	"Toggle settings": "Bật/tắt cài đặt",

+ 10 - 6
src/lib/i18n/locales/zh-CN/translation.json

@@ -74,7 +74,7 @@
 	"Bypass SSL verification for Websites": "绕过网站的 SSL 验证",
 	"Call": "呼叫",
 	"Call feature is not supported when using Web STT engine": "使用 Web 语音转文字引擎时不支持呼叫功能。",
-	"Camera": "",
+	"Camera": "摄像头",
 	"Cancel": "取消",
 	"Capabilities": "能力",
 	"Change Password": "更改密码",
@@ -201,6 +201,7 @@
 	"Enter Score": "输入评分",
 	"Enter Searxng Query URL": "输入 Searxng 查询地址",
 	"Enter Serper API Key": "输入 Serper API 密钥",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "输入 Serpstack API 密钥",
 	"Enter stop sequence": "输入停止序列 (Stop Sequence)",
 	"Enter Top K": "输入 Top K",
@@ -273,7 +274,7 @@
 	"JWT Token": "JWT 令牌",
 	"Keep Alive": "保持活动",
 	"Keyboard shortcuts": "键盘快捷键",
-	"Knowledge": "",
+	"Knowledge": "知识库",
 	"Language": "语言",
 	"Last Active": "最后在线时间",
 	"Light": "浅色",
@@ -319,7 +320,7 @@
 	"Name your model": "为您的模型命名",
 	"New Chat": "新对话",
 	"New Password": "新密码",
-	"No documents found": "",
+	"No documents found": "未找到文档",
 	"No results found": "未找到结果",
 	"No search query generated": "未生成搜索查询",
 	"No source available": "没有可用来源",
@@ -416,11 +417,11 @@
 	"Search Documents": "搜索文档",
 	"Search Models": "搜索模型",
 	"Search Prompts": "搜索提示词",
-	"Search Query Generation Prompt": "",
-	"Search Query Generation Prompt Length Threshold": "",
+	"Search Query Generation Prompt": "搜索查询生成提示",
+	"Search Query Generation Prompt Length Threshold": "搜索查询生成提示长度阈值",
 	"Search Result Count": "搜索结果数量",
 	"Searched {{count}} sites_other": "检索到 {{count}} 个网站",
-	"Searching the web for '{{searchQuery}}'": "在网络中搜索 '{{searchQuery}}' ",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "Searxng 查询 URL",
 	"See readme.md for instructions": "查看 readme.md 以获取说明",
 	"See what's new": "查阅最新更新内容",
@@ -432,6 +433,7 @@
 	"Select a pipeline": "选择一个管道",
 	"Select a pipeline url": "选择一个管道 URL",
 	"Select an Ollama instance": "选择一个 Ollama 实例",
+	"Select Documents": "选择文档",
 	"Select model": "选择模型",
 	"Select only one model to call": "请仅选择一个模型来呼叫",
 	"Selected model(s) do not support image inputs": "已选择的模型不支持发送图像",
@@ -440,6 +442,7 @@
 	"Send message": "发送消息",
 	"September": "九月",
 	"Serper API Key": "Serper API 密钥",
+	"Serply API Key": "",
 	"Serpstack API Key": "Serpstack API 密钥",
 	"Server connection verified": "已验证服务器连接",
 	"Set as default": "设为默认",
@@ -504,6 +507,7 @@
 	"To access the available model names for downloading,": "要访问可下载的模型名称,",
 	"To access the GGUF models available for downloading,": "要访问可下载的 GGUF 模型,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "请联系管理员以访问。管理员可以在后台管理面板中管理用户状态。",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "要在此处添加文档,请先将它们上传到工作空间中的“文档”内。",
 	"to chat input.": "到对话输入。",
 	"Today": "今天",
 	"Toggle settings": "切换设置",

+ 5 - 1
src/lib/i18n/locales/zh-TW/translation.json

@@ -201,6 +201,7 @@
 	"Enter Score": "輸入分數",
 	"Enter Searxng Query URL": "輸入 Searxng 查詢 URL",
 	"Enter Serper API Key": "輸入 Serper API Key",
+	"Enter Serply API Key": "",
 	"Enter Serpstack API Key": "輸入 Serpstack API Key",
 	"Enter stop sequence": "輸入停止序列",
 	"Enter Top K": "輸入 Top K",
@@ -420,7 +421,7 @@
 	"Search Query Generation Prompt Length Threshold": "",
 	"Search Result Count": "搜尋結果數量",
 	"Searched {{count}} sites_other": "掃描 {{count}} 個網站_其他",
-	"Searching the web for '{{searchQuery}}'": "搜尋網站 '{{searchQuery}}'",
+	"Searching \"{{searchQuery}}\"": "",
 	"Searxng Query URL": "Searxng 查詢 URL",
 	"See readme.md for instructions": "查看 readme.md 獲取指南",
 	"See what's new": "查看最新內容",
@@ -432,6 +433,7 @@
 	"Select a pipeline": "選擇管道",
 	"Select a pipeline url": "選擇管道 URL",
 	"Select an Ollama instance": "選擇 Ollama 實例",
+	"Select Documents": "",
 	"Select model": "選擇模型",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "已選擇模型不支持圖像輸入",
@@ -440,6 +442,7 @@
 	"Send message": "傳送訊息",
 	"September": "九月",
 	"Serper API Key": "Serper API Key",
+	"Serply API Key": "",
 	"Serpstack API Key": "Serpstack API Key",
 	"Server connection verified": "已驗證伺服器連線",
 	"Set as default": "設為預設",
@@ -504,6 +507,7 @@
 	"To access the available model names for downloading,": "若想查看可供下載的模型名稱,",
 	"To access the GGUF models available for downloading,": "若想查看可供下載的 GGUF 模型名稱,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
+	"To add documents here, upload them to the \"Documents\" workspace first.": "",
 	"to chat input.": "到聊天輸入框來啟動此命令。",
 	"Today": "今天",
 	"Toggle settings": "切換設定",

+ 1 - 0
src/routes/(app)/workspace/models/create/+page.svelte

@@ -445,6 +445,7 @@
 				{#if showAdvanced}
 					<div class="my-2">
 						<AdvancedParams
+							admin={true}
 							bind:params
 							on:change={(e) => {
 								info.params = { ...info.params, ...params };

+ 1 - 0
src/routes/(app)/workspace/models/edit/+page.svelte

@@ -408,6 +408,7 @@
 					{#if showAdvanced}
 						<div class="my-2">
 							<AdvancedParams
+								admin={true}
 								bind:params
 								on:change={(e) => {
 									info.params = { ...info.params, ...params };