瀏覽代碼

Merge branch 'dev' of https://github.com/open-webui/open-webui into tools-refac-2.1

Michael Poluektov 8 月之前
父節點
當前提交
bcbcd5fde9
共有 73 個文件被更改,包括 760 次插入359 次删除
  1. 2 1
      backend/apps/audio/main.py
  2. 2 7
      backend/apps/images/main.py
  3. 2 1
      backend/apps/ollama/main.py
  4. 2 1
      backend/apps/openai/main.py
  5. 2 4
      backend/apps/rag/main.py
  6. 4 3
      backend/apps/webui/main.py
  7. 4 0
      backend/apps/webui/routers/auths.py
  8. 2 1
      backend/apps/webui/routers/utils.py
  9. 62 6
      backend/config.py
  10. 46 25
      backend/main.py
  11. 5 5
      backend/requirements.txt
  12. 二進制
      backend/static/fonts/NotoSansSC-Regular.ttf
  13. 2 0
      src/lib/apis/index.ts
  14. 1 1
      src/lib/apis/ollama/index.ts
  15. 4 1
      src/lib/components/admin/Settings.svelte
  16. 12 19
      src/lib/components/admin/Settings/General.svelte
  17. 1 1
      src/lib/components/admin/Settings/Models.svelte
  18. 85 1
      src/lib/components/admin/Settings/Users.svelte
  19. 34 25
      src/lib/components/chat/Messages.svelte
  20. 28 19
      src/lib/components/chat/Messages/CodeBlock.svelte
  21. 7 5
      src/lib/components/chat/Messages/MultiResponseMessages.svelte
  22. 2 1
      src/lib/components/chat/Messages/Placeholder.svelte
  23. 118 114
      src/lib/components/chat/Messages/ResponseMessage.svelte
  24. 36 22
      src/lib/components/chat/Messages/UserMessage.svelte
  25. 4 2
      src/lib/components/chat/ModelSelector.svelte
  26. 2 1
      src/lib/components/chat/ModelSelector/Selector.svelte
  27. 6 4
      src/lib/components/chat/Settings/General.svelte
  28. 1 1
      src/lib/components/chat/Settings/Models.svelte
  29. 140 45
      src/lib/components/workspace/Models.svelte
  30. 3 1
      src/lib/i18n/locales/ar-BH/translation.json
  31. 3 1
      src/lib/i18n/locales/bg-BG/translation.json
  32. 3 1
      src/lib/i18n/locales/bn-BD/translation.json
  33. 3 1
      src/lib/i18n/locales/ca-ES/translation.json
  34. 3 1
      src/lib/i18n/locales/ceb-PH/translation.json
  35. 3 1
      src/lib/i18n/locales/de-DE/translation.json
  36. 3 1
      src/lib/i18n/locales/dg-DG/translation.json
  37. 3 1
      src/lib/i18n/locales/en-GB/translation.json
  38. 3 1
      src/lib/i18n/locales/en-US/translation.json
  39. 3 1
      src/lib/i18n/locales/es-ES/translation.json
  40. 3 1
      src/lib/i18n/locales/fa-IR/translation.json
  41. 3 1
      src/lib/i18n/locales/fi-FI/translation.json
  42. 3 1
      src/lib/i18n/locales/fr-CA/translation.json
  43. 3 1
      src/lib/i18n/locales/fr-FR/translation.json
  44. 3 1
      src/lib/i18n/locales/he-IL/translation.json
  45. 3 1
      src/lib/i18n/locales/hi-IN/translation.json
  46. 3 1
      src/lib/i18n/locales/hr-HR/translation.json
  47. 3 1
      src/lib/i18n/locales/id-ID/translation.json
  48. 3 1
      src/lib/i18n/locales/it-IT/translation.json
  49. 3 1
      src/lib/i18n/locales/ja-JP/translation.json
  50. 3 1
      src/lib/i18n/locales/ka-GE/translation.json
  51. 3 1
      src/lib/i18n/locales/ko-KR/translation.json
  52. 3 1
      src/lib/i18n/locales/lt-LT/translation.json
  53. 3 1
      src/lib/i18n/locales/ms-MY/translation.json
  54. 3 1
      src/lib/i18n/locales/nb-NO/translation.json
  55. 3 1
      src/lib/i18n/locales/nl-NL/translation.json
  56. 3 1
      src/lib/i18n/locales/pa-IN/translation.json
  57. 3 1
      src/lib/i18n/locales/pl-PL/translation.json
  58. 3 1
      src/lib/i18n/locales/pt-BR/translation.json
  59. 3 1
      src/lib/i18n/locales/pt-PT/translation.json
  60. 3 1
      src/lib/i18n/locales/ro-RO/translation.json
  61. 4 2
      src/lib/i18n/locales/ru-RU/translation.json
  62. 3 1
      src/lib/i18n/locales/sr-RS/translation.json
  63. 3 1
      src/lib/i18n/locales/sv-SE/translation.json
  64. 3 1
      src/lib/i18n/locales/th-TH/translation.json
  65. 3 1
      src/lib/i18n/locales/tk-TW/translation.json
  66. 3 1
      src/lib/i18n/locales/tr-TR/translation.json
  67. 3 1
      src/lib/i18n/locales/uk-UA/translation.json
  68. 3 1
      src/lib/i18n/locales/vi-VN/translation.json
  69. 3 1
      src/lib/i18n/locales/zh-CN/translation.json
  70. 3 1
      src/lib/i18n/locales/zh-TW/translation.json
  71. 19 0
      src/lib/stores/index.ts
  72. 0 1
      src/routes/(app)/+layout.svelte
  73. 1 0
      src/routes/+layout.svelte

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

@@ -38,6 +38,7 @@ from config import (
     AUDIO_TTS_MODEL,
     AUDIO_TTS_VOICE,
     AppConfig,
+    CORS_ALLOW_ORIGIN,
 )
 from constants import ERROR_MESSAGES
 from utils.utils import (
@@ -52,7 +53,7 @@ log.setLevel(SRC_LOG_LEVELS["AUDIO"])
 app = FastAPI()
 app.add_middleware(
     CORSMiddleware,
-    allow_origins=["*"],
+    allow_origins=CORS_ALLOW_ORIGIN,
     allow_credentials=True,
     allow_methods=["*"],
     allow_headers=["*"],

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

@@ -1,15 +1,10 @@
 import re
 import requests
-import base64
 from fastapi import (
     FastAPI,
     Request,
     Depends,
     HTTPException,
-    status,
-    UploadFile,
-    File,
-    Form,
 )
 from fastapi.middleware.cors import CORSMiddleware
 
@@ -20,7 +15,6 @@ from utils.utils import (
 )
 
 from apps.images.utils.comfyui import ImageGenerationPayload, comfyui_generate_image
-from utils.misc import calculate_sha256
 from typing import Optional
 from pydantic import BaseModel
 from pathlib import Path
@@ -51,6 +45,7 @@ from config import (
     IMAGE_SIZE,
     IMAGE_STEPS,
     AppConfig,
+    CORS_ALLOW_ORIGIN,
 )
 
 log = logging.getLogger(__name__)
@@ -62,7 +57,7 @@ IMAGE_CACHE_DIR.mkdir(parents=True, exist_ok=True)
 app = FastAPI()
 app.add_middleware(
     CORSMiddleware,
-    allow_origins=["*"],
+    allow_origins=CORS_ALLOW_ORIGIN,
     allow_credentials=True,
     allow_methods=["*"],
     allow_headers=["*"],

+ 2 - 1
backend/apps/ollama/main.py

@@ -41,6 +41,7 @@ from config import (
     MODEL_FILTER_LIST,
     UPLOAD_DIR,
     AppConfig,
+    CORS_ALLOW_ORIGIN,
 )
 from utils.misc import (
     calculate_sha256,
@@ -55,7 +56,7 @@ log.setLevel(SRC_LOG_LEVELS["OLLAMA"])
 app = FastAPI()
 app.add_middleware(
     CORSMiddleware,
-    allow_origins=["*"],
+    allow_origins=CORS_ALLOW_ORIGIN,
     allow_credentials=True,
     allow_methods=["*"],
     allow_headers=["*"],

+ 2 - 1
backend/apps/openai/main.py

@@ -32,6 +32,7 @@ from config import (
     ENABLE_MODEL_FILTER,
     MODEL_FILTER_LIST,
     AppConfig,
+    CORS_ALLOW_ORIGIN,
 )
 from typing import Optional, Literal, overload
 
@@ -45,7 +46,7 @@ log.setLevel(SRC_LOG_LEVELS["OPENAI"])
 app = FastAPI()
 app.add_middleware(
     CORSMiddleware,
-    allow_origins=["*"],
+    allow_origins=CORS_ALLOW_ORIGIN,
     allow_credentials=True,
     allow_methods=["*"],
     allow_headers=["*"],

+ 2 - 4
backend/apps/rag/main.py

@@ -129,6 +129,7 @@ from config import (
     RAG_WEB_SEARCH_RESULT_COUNT,
     RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
     RAG_EMBEDDING_OPENAI_BATCH_SIZE,
+    CORS_ALLOW_ORIGIN,
 )
 
 from constants import ERROR_MESSAGES
@@ -240,12 +241,9 @@ app.state.EMBEDDING_FUNCTION = get_embedding_function(
     app.state.config.RAG_EMBEDDING_OPENAI_BATCH_SIZE,
 )
 
-origins = ["*"]
-
-
 app.add_middleware(
     CORSMiddleware,
-    allow_origins=origins,
+    allow_origins=CORS_ALLOW_ORIGIN,
     allow_credentials=True,
     allow_methods=["*"],
     allow_headers=["*"],

+ 4 - 3
backend/apps/webui/main.py

@@ -44,10 +44,12 @@ from config import (
     JWT_EXPIRES_IN,
     WEBUI_BANNERS,
     ENABLE_COMMUNITY_SHARING,
+    ENABLE_MESSAGE_RATING,
     AppConfig,
     OAUTH_USERNAME_CLAIM,
     OAUTH_PICTURE_CLAIM,
     OAUTH_EMAIL_CLAIM,
+    CORS_ALLOW_ORIGIN,
 )
 
 from apps.socket.main import get_event_call, get_event_emitter
@@ -60,8 +62,6 @@ from pydantic import BaseModel
 
 app = FastAPI()
 
-origins = ["*"]
-
 app.state.config = AppConfig()
 
 app.state.config.ENABLE_SIGNUP = ENABLE_SIGNUP
@@ -83,6 +83,7 @@ app.state.config.WEBHOOK_URL = WEBHOOK_URL
 app.state.config.BANNERS = WEBUI_BANNERS
 
 app.state.config.ENABLE_COMMUNITY_SHARING = ENABLE_COMMUNITY_SHARING
+app.state.config.ENABLE_MESSAGE_RATING = ENABLE_MESSAGE_RATING
 
 app.state.config.OAUTH_USERNAME_CLAIM = OAUTH_USERNAME_CLAIM
 app.state.config.OAUTH_PICTURE_CLAIM = OAUTH_PICTURE_CLAIM
@@ -94,7 +95,7 @@ app.state.FUNCTIONS = {}
 
 app.add_middleware(
     CORSMiddleware,
-    allow_origins=origins,
+    allow_origins=CORS_ALLOW_ORIGIN,
     allow_credentials=True,
     allow_methods=["*"],
     allow_headers=["*"],

+ 4 - 0
backend/apps/webui/routers/auths.py

@@ -352,6 +352,7 @@ async def get_admin_config(request: Request, user=Depends(get_admin_user)):
         "DEFAULT_USER_ROLE": request.app.state.config.DEFAULT_USER_ROLE,
         "JWT_EXPIRES_IN": request.app.state.config.JWT_EXPIRES_IN,
         "ENABLE_COMMUNITY_SHARING": request.app.state.config.ENABLE_COMMUNITY_SHARING,
+        "ENABLE_MESSAGE_RATING": request.app.state.config.ENABLE_MESSAGE_RATING,
     }
 
 
@@ -361,6 +362,7 @@ class AdminConfig(BaseModel):
     DEFAULT_USER_ROLE: str
     JWT_EXPIRES_IN: str
     ENABLE_COMMUNITY_SHARING: bool
+    ENABLE_MESSAGE_RATING: bool
 
 
 @router.post("/admin/config")
@@ -382,6 +384,7 @@ async def update_admin_config(
     request.app.state.config.ENABLE_COMMUNITY_SHARING = (
         form_data.ENABLE_COMMUNITY_SHARING
     )
+    request.app.state.config.ENABLE_MESSAGE_RATING = form_data.ENABLE_MESSAGE_RATING
 
     return {
         "SHOW_ADMIN_DETAILS": request.app.state.config.SHOW_ADMIN_DETAILS,
@@ -389,6 +392,7 @@ async def update_admin_config(
         "DEFAULT_USER_ROLE": request.app.state.config.DEFAULT_USER_ROLE,
         "JWT_EXPIRES_IN": request.app.state.config.JWT_EXPIRES_IN,
         "ENABLE_COMMUNITY_SHARING": request.app.state.config.ENABLE_COMMUNITY_SHARING,
+        "ENABLE_MESSAGE_RATING": request.app.state.config.ENABLE_MESSAGE_RATING,
     }
 
 

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

@@ -85,9 +85,10 @@ async def download_chat_as_pdf(
     pdf.add_font("NotoSans", "i", f"{FONTS_DIR}/NotoSans-Italic.ttf")
     pdf.add_font("NotoSansKR", "", f"{FONTS_DIR}/NotoSansKR-Regular.ttf")
     pdf.add_font("NotoSansJP", "", f"{FONTS_DIR}/NotoSansJP-Regular.ttf")
+    pdf.add_font("NotoSansSC", "", f"{FONTS_DIR}/NotoSansSC-Regular.ttf")
 
     pdf.set_font("NotoSans", size=12)
-    pdf.set_fallback_fonts(["NotoSansKR", "NotoSansJP"])
+    pdf.set_fallback_fonts(["NotoSansKR", "NotoSansJP", "NotoSansSC"])
 
     pdf.set_auto_page_break(auto=True, margin=15)
 

+ 62 - 6
backend/config.py

@@ -3,6 +3,8 @@ import sys
 import logging
 import importlib.metadata
 import pkgutil
+from urllib.parse import urlparse
+
 import chromadb
 from chromadb import Settings
 from bs4 import BeautifulSoup
@@ -805,10 +807,24 @@ USER_PERMISSIONS_CHAT_DELETION = (
     os.environ.get("USER_PERMISSIONS_CHAT_DELETION", "True").lower() == "true"
 )
 
+USER_PERMISSIONS_CHAT_EDITING = (
+    os.environ.get("USER_PERMISSIONS_CHAT_EDITING", "True").lower() == "true"
+)
+
+USER_PERMISSIONS_CHAT_TEMPORARY = (
+    os.environ.get("USER_PERMISSIONS_CHAT_TEMPORARY", "True").lower() == "true"
+)
+
 USER_PERMISSIONS = PersistentConfig(
     "USER_PERMISSIONS",
     "ui.user_permissions",
-    {"chat": {"deletion": USER_PERMISSIONS_CHAT_DELETION}},
+    {
+        "chat": {
+            "deletion": USER_PERMISSIONS_CHAT_DELETION,
+            "editing": USER_PERMISSIONS_CHAT_EDITING,
+            "temporary": USER_PERMISSIONS_CHAT_TEMPORARY,
+        }
+    },
 )
 
 ENABLE_MODEL_FILTER = PersistentConfig(
@@ -839,6 +855,47 @@ ENABLE_COMMUNITY_SHARING = PersistentConfig(
     os.environ.get("ENABLE_COMMUNITY_SHARING", "True").lower() == "true",
 )
 
+ENABLE_MESSAGE_RATING = PersistentConfig(
+    "ENABLE_MESSAGE_RATING",
+    "ui.enable_message_rating",
+    os.environ.get("ENABLE_MESSAGE_RATING", "True").lower() == "true",
+)
+
+
+def validate_cors_origins(origins):
+    for origin in origins:
+        if origin != "*":
+            validate_cors_origin(origin)
+
+
+def validate_cors_origin(origin):
+    parsed_url = urlparse(origin)
+
+    # Check if the scheme is either http or https
+    if parsed_url.scheme not in ["http", "https"]:
+        raise ValueError(
+            f"Invalid scheme in CORS_ALLOW_ORIGIN: '{origin}'. Only 'http' and 'https' are allowed."
+        )
+
+    # Ensure that the netloc (domain + port) is present, indicating it's a valid URL
+    if not parsed_url.netloc:
+        raise ValueError(f"Invalid URL structure in CORS_ALLOW_ORIGIN: '{origin}'.")
+
+
+# For production, you should only need one host as
+# fastapi serves the svelte-kit built frontend and backend from the same host and port.
+# To test CORS_ALLOW_ORIGIN locally, you can set something like
+# CORS_ALLOW_ORIGIN=http://localhost:5173;http://localhost:8080
+# in your .env file depending on your frontend port, 5173 in this case.
+CORS_ALLOW_ORIGIN = os.environ.get("CORS_ALLOW_ORIGIN", "*").split(";")
+
+if "*" in CORS_ALLOW_ORIGIN:
+    log.warning(
+        "\n\nWARNING: CORS_ALLOW_ORIGIN IS SET TO '*' - NOT RECOMMENDED FOR PRODUCTION DEPLOYMENTS.\n"
+    )
+
+validate_cors_origins(CORS_ALLOW_ORIGIN)
+
 
 class BannerModel(BaseModel):
     id: str
@@ -894,10 +951,7 @@ TITLE_GENERATION_PROMPT_TEMPLATE = PersistentConfig(
     "task.title.prompt_template",
     os.environ.get(
         "TITLE_GENERATION_PROMPT_TEMPLATE",
-        """Here is the query:
-{{prompt:middletruncate:8000}}
-
-Create a concise, 3-5 word phrase with an emoji as a title for the previous query. Suitable Emojis for the summary can be used to enhance understanding but avoid quotation marks or special formatting. RESPOND ONLY WITH THE TITLE TEXT.
+        """Create a concise, 3-5 word title with an emoji as a title for the prompt in the given language. Suitable Emojis for the summary can be used to enhance understanding but avoid quotation marks or special formatting. RESPOND ONLY WITH THE TITLE TEXT.
 
 Examples of titles:
 📉 Stock Market Trends
@@ -905,7 +959,9 @@ Examples of titles:
 Evolution of Music Streaming
 Remote Work Productivity Tips
 Artificial Intelligence in Healthcare
-🎮 Video Game Development Insights""",
+🎮 Video Game Development Insights
+
+Prompt: {{prompt:middletruncate:8000}}""",
     ),
 )
 

+ 46 - 25
backend/main.py

@@ -67,6 +67,7 @@ from utils.utils import (
     get_http_authorization_cred,
     get_password_hash,
     create_token,
+    decode_token,
 )
 from utils.task import (
     title_generation_template,
@@ -120,6 +121,7 @@ from config import (
     WEBUI_SESSION_COOKIE_SECURE,
     ENABLE_ADMIN_CHAT_ACCESS,
     AppConfig,
+    CORS_ALLOW_ORIGIN,
 )
 
 from constants import ERROR_MESSAGES, WEBHOOK_MESSAGES, TASKS
@@ -210,8 +212,6 @@ app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = (
 
 app.state.MODELS = {}
 
-origins = ["*"]
-
 
 ##################################
 #
@@ -754,7 +754,7 @@ app.add_middleware(PipelineMiddleware)
 
 app.add_middleware(
     CORSMiddleware,
-    allow_origins=origins,
+    allow_origins=CORS_ALLOW_ORIGIN,
     allow_credentials=True,
     allow_methods=["*"],
     allow_headers=["*"],
@@ -1881,40 +1881,61 @@ async def update_pipeline_valves(
 
 
 @app.get("/api/config")
-async def get_app_config():
+async def get_app_config(request: Request):
+    user = None
+    if "token" in request.cookies:
+        token = request.cookies.get("token")
+        data = decode_token(token)
+        if data is not None and "id" in data:
+            user = Users.get_user_by_id(data["id"])
+
     return {
         "status": True,
         "name": WEBUI_NAME,
         "version": VERSION,
         "default_locale": str(DEFAULT_LOCALE),
-        "default_models": webui_app.state.config.DEFAULT_MODELS,
-        "default_prompt_suggestions": webui_app.state.config.DEFAULT_PROMPT_SUGGESTIONS,
+        "oauth": {
+            "providers": {
+                name: config.get("name", name)
+                for name, config in OAUTH_PROVIDERS.items()
+            }
+        },
         "features": {
             "auth": WEBUI_AUTH,
             "auth_trusted_header": bool(webui_app.state.AUTH_TRUSTED_EMAIL_HEADER),
             "enable_signup": webui_app.state.config.ENABLE_SIGNUP,
             "enable_login_form": webui_app.state.config.ENABLE_LOGIN_FORM,
-            "enable_web_search": rag_app.state.config.ENABLE_RAG_WEB_SEARCH,
-            "enable_image_generation": images_app.state.config.ENABLED,
-            "enable_community_sharing": webui_app.state.config.ENABLE_COMMUNITY_SHARING,
-            "enable_admin_export": ENABLE_ADMIN_EXPORT,
-            "enable_admin_chat_access": ENABLE_ADMIN_CHAT_ACCESS,
-        },
-        "audio": {
-            "tts": {
-                "engine": audio_app.state.config.TTS_ENGINE,
-                "voice": audio_app.state.config.TTS_VOICE,
-            },
-            "stt": {
-                "engine": audio_app.state.config.STT_ENGINE,
-            },
+            **(
+                {
+                    "enable_web_search": rag_app.state.config.ENABLE_RAG_WEB_SEARCH,
+                    "enable_image_generation": images_app.state.config.ENABLED,
+                    "enable_community_sharing": webui_app.state.config.ENABLE_COMMUNITY_SHARING,
+                    "enable_message_rating": webui_app.state.config.ENABLE_MESSAGE_RATING,
+                    "enable_admin_export": ENABLE_ADMIN_EXPORT,
+                    "enable_admin_chat_access": ENABLE_ADMIN_CHAT_ACCESS,
+                }
+                if user is not None
+                else {}
+            ),
         },
-        "oauth": {
-            "providers": {
-                name: config.get("name", name)
-                for name, config in OAUTH_PROVIDERS.items()
+        **(
+            {
+                "default_models": webui_app.state.config.DEFAULT_MODELS,
+                "default_prompt_suggestions": webui_app.state.config.DEFAULT_PROMPT_SUGGESTIONS,
+                "audio": {
+                    "tts": {
+                        "engine": audio_app.state.config.TTS_ENGINE,
+                        "voice": audio_app.state.config.TTS_VOICE,
+                    },
+                    "stt": {
+                        "engine": audio_app.state.config.STT_ENGINE,
+                    },
+                },
+                "permissions": {**webui_app.state.config.USER_PERMISSIONS},
             }
-        },
+            if user is not None
+            else {}
+        ),
     }
 
 

+ 5 - 5
backend/requirements.txt

@@ -1,5 +1,5 @@
 fastapi==0.111.0
-uvicorn[standard]==0.22.0
+uvicorn[standard]==0.30.6
 pydantic==2.8.2
 python-multipart==0.0.9
 
@@ -13,17 +13,17 @@ passlib[bcrypt]==1.7.4
 requests==2.32.3
 aiohttp==3.10.2
 
-sqlalchemy==2.0.31
+sqlalchemy==2.0.32
 alembic==1.13.2
 peewee==3.17.6
 peewee-migrate==1.12.2
 psycopg2-binary==2.9.9
 PyMySQL==1.1.1
-bcrypt==4.1.3
+bcrypt==4.2.0
 
 pymongo
 redis
-boto3==1.34.153
+boto3==1.35.0
 
 argon2-cffi==23.1.0
 APScheduler==3.10.4
@@ -60,7 +60,7 @@ rapidocr-onnxruntime==1.3.24
 fpdf2==2.7.9
 rank-bm25==0.2.2
 
-faster-whisper==1.0.2
+faster-whisper==1.0.3
 
 PyJWT[crypto]==2.9.0
 authlib==1.3.1

二進制
backend/static/fonts/NotoSansSC-Regular.ttf


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

@@ -665,6 +665,7 @@ export const getBackendConfig = async () => {
 
 	const res = await fetch(`${WEBUI_BASE_URL}/api/config`, {
 		method: 'GET',
+		credentials: 'include',
 		headers: {
 			'Content-Type': 'application/json'
 		}
@@ -949,6 +950,7 @@ export interface ModelConfig {
 export interface ModelMeta {
 	description?: string;
 	capabilities?: object;
+	profile_image_url?: string;
 }
 
 export interface ModelParams {}

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

@@ -396,7 +396,7 @@ export const deleteModel = async (token: string, tagName: string, urlIdx: string
 	return res;
 };
 
-export const pullModel = async (token: string, tagName: string, urlIdx: string | null = null) => {
+export const pullModel = async (token: string, tagName: string, urlIdx: number | null = null) => {
 	let error = null;
 	const controller = new AbortController();
 

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

@@ -336,8 +336,11 @@
 	<div class="flex-1 mt-3 lg:mt-0 overflow-y-scroll">
 		{#if selectedTab === 'general'}
 			<General
-				saveHandler={() => {
+				saveHandler={async () => {
 					toast.success($i18n.t('Settings saved successfully!'));
+
+					await tick();
+					await config.set(await getBackendConfig());
 				}}
 			/>
 		{:else if selectedTab === 'users'}

+ 12 - 19
src/lib/components/admin/Settings/General.svelte

@@ -1,22 +1,10 @@
 <script lang="ts">
-	import {
-		getCommunitySharingEnabledStatus,
-		getWebhookUrl,
-		toggleCommunitySharingEnabledStatus,
-		updateWebhookUrl
-	} from '$lib/apis';
-	import {
-		getAdminConfig,
-		getDefaultUserRole,
-		getJWTExpiresDuration,
-		getSignUpEnabledStatus,
-		toggleSignUpEnabledStatus,
-		updateAdminConfig,
-		updateDefaultUserRole,
-		updateJWTExpiresDuration
-	} from '$lib/apis/auths';
+	import { getBackendConfig, getWebhookUrl, updateWebhookUrl } from '$lib/apis';
+	import { getAdminConfig, updateAdminConfig } from '$lib/apis/auths';
 	import Switch from '$lib/components/common/Switch.svelte';
+	import { config } from '$lib/stores';
 	import { onMount, getContext } from 'svelte';
+	import { toast } from 'svelte-sonner';
 
 	const i18n = getContext('i18n');
 
@@ -30,7 +18,7 @@
 		const res = await updateAdminConfig(localStorage.token, adminConfig);
 
 		if (res) {
-			toast.success(i18n.t('Settings updated successfully'));
+			saveHandler();
 		} else {
 			toast.error(i18n.t('Failed to update settings'));
 		}
@@ -51,9 +39,8 @@
 
 <form
 	class="flex flex-col h-full justify-between space-y-3 text-sm"
-	on:submit|preventDefault={() => {
+	on:submit|preventDefault={async () => {
 		updateHandler();
-		saveHandler();
 	}}
 >
 	<div class=" space-y-3 overflow-y-scroll scrollbar-hidden h-full">
@@ -98,6 +85,12 @@
 					<Switch bind:state={adminConfig.ENABLE_COMMUNITY_SHARING} />
 				</div>
 
+				<div class="my-3 flex w-full items-center justify-between pr-2">
+					<div class=" self-center text-xs font-medium">{$i18n.t('Enable Message Rating')}</div>
+
+					<Switch bind:state={adminConfig.ENABLE_MESSAGE_RATING} />
+				</div>
+
 				<hr class=" dark:border-gray-850 my-2" />
 
 				<div class=" w-full justify-between">

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

@@ -37,7 +37,7 @@
 	let ollamaEnabled = null;
 
 	let OLLAMA_URLS = [];
-	let selectedOllamaUrlIdx: string | null = null;
+	let selectedOllamaUrlIdx: number | null = null;
 
 	let updateModelId = null;
 	let updateProgress = null;

+ 85 - 1
src/lib/components/admin/Settings/Users.svelte

@@ -18,7 +18,9 @@
 	let whitelistModels = [''];
 	let permissions = {
 		chat: {
-			deletion: true
+			deletion: true,
+			edit: true,
+			temporary: true
 		}
 	};
 
@@ -92,6 +94,88 @@
 					{/if}
 				</button>
 			</div>
+
+			<div class="  flex w-full justify-between">
+				<div class=" self-center text-xs font-medium">{$i18n.t('Allow Chat Editing')}</div>
+
+				<button
+					class="p-1 px-3 text-xs flex rounded transition"
+					on:click={() => {
+						permissions.chat.editing = !(permissions?.chat?.editing ?? true);
+					}}
+					type="button"
+				>
+					{#if permissions?.chat?.editing ?? true}
+						<svg
+							xmlns="http://www.w3.org/2000/svg"
+							viewBox="0 0 16 16"
+							fill="currentColor"
+							class="w-4 h-4"
+						>
+							<path
+								d="M11.5 1A3.5 3.5 0 0 0 8 4.5V7H2.5A1.5 1.5 0 0 0 1 8.5v5A1.5 1.5 0 0 0 2.5 15h7a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 9.5 7V4.5a2 2 0 1 1 4 0v1.75a.75.75 0 0 0 1.5 0V4.5A3.5 3.5 0 0 0 11.5 1Z"
+							/>
+						</svg>
+						<span class="ml-2 self-center">{$i18n.t('Allow')}</span>
+					{:else}
+						<svg
+							xmlns="http://www.w3.org/2000/svg"
+							viewBox="0 0 16 16"
+							fill="currentColor"
+							class="w-4 h-4"
+						>
+							<path
+								fill-rule="evenodd"
+								d="M8 1a3.5 3.5 0 0 0-3.5 3.5V7A1.5 1.5 0 0 0 3 8.5v5A1.5 1.5 0 0 0 4.5 15h7a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 11.5 7V4.5A3.5 3.5 0 0 0 8 1Zm2 6V4.5a2 2 0 1 0-4 0V7h4Z"
+								clip-rule="evenodd"
+							/>
+						</svg>
+
+						<span class="ml-2 self-center">{$i18n.t("Don't Allow")}</span>
+					{/if}
+				</button>
+			</div>
+
+			<div class="  flex w-full justify-between">
+				<div class=" self-center text-xs font-medium">{$i18n.t('Allow Temporary Chat')}</div>
+
+				<button
+					class="p-1 px-3 text-xs flex rounded transition"
+					on:click={() => {
+						permissions.chat.temporary = !(permissions?.chat?.temporary ?? true);
+					}}
+					type="button"
+				>
+					{#if permissions?.chat?.temporary ?? true}
+						<svg
+							xmlns="http://www.w3.org/2000/svg"
+							viewBox="0 0 16 16"
+							fill="currentColor"
+							class="w-4 h-4"
+						>
+							<path
+								d="M11.5 1A3.5 3.5 0 0 0 8 4.5V7H2.5A1.5 1.5 0 0 0 1 8.5v5A1.5 1.5 0 0 0 2.5 15h7a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 9.5 7V4.5a2 2 0 1 1 4 0v1.75a.75.75 0 0 0 1.5 0V4.5A3.5 3.5 0 0 0 11.5 1Z"
+							/>
+						</svg>
+						<span class="ml-2 self-center">{$i18n.t('Allow')}</span>
+					{:else}
+						<svg
+							xmlns="http://www.w3.org/2000/svg"
+							viewBox="0 0 16 16"
+							fill="currentColor"
+							class="w-4 h-4"
+						>
+							<path
+								fill-rule="evenodd"
+								d="M8 1a3.5 3.5 0 0 0-3.5 3.5V7A1.5 1.5 0 0 0 3 8.5v5A1.5 1.5 0 0 0 4.5 15h7a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 11.5 7V4.5A3.5 3.5 0 0 0 8 1Zm2 6V4.5a2 2 0 1 0-4 0V7h4Z"
+								clip-rule="evenodd"
+							/>
+						</svg>
+
+						<span class="ml-2 self-center">{$i18n.t("Don't Allow")}</span>
+					{/if}
+				</button>
+			</div>
 		</div>
 
 		<hr class=" dark:border-gray-850 my-2" />

+ 34 - 25
src/lib/components/chat/Messages.svelte

@@ -51,34 +51,43 @@
 		}
 	};
 
-	const confirmEditMessage = async (messageId, content) => {
-		let userPrompt = content;
-		let userMessageId = uuidv4();
-
-		let userMessage = {
-			id: userMessageId,
-			parentId: history.messages[messageId].parentId,
-			childrenIds: [],
-			role: 'user',
-			content: userPrompt,
-			...(history.messages[messageId].files && { files: history.messages[messageId].files }),
-			models: selectedModels
-		};
+	const confirmEditMessage = async (messageId, content, submit = true) => {
+		if (submit) {
+			let userPrompt = content;
+			let userMessageId = uuidv4();
+
+			let userMessage = {
+				id: userMessageId,
+				parentId: history.messages[messageId].parentId,
+				childrenIds: [],
+				role: 'user',
+				content: userPrompt,
+				...(history.messages[messageId].files && { files: history.messages[messageId].files }),
+				models: selectedModels
+			};
+
+			let messageParentId = history.messages[messageId].parentId;
+
+			if (messageParentId !== null) {
+				history.messages[messageParentId].childrenIds = [
+					...history.messages[messageParentId].childrenIds,
+					userMessageId
+				];
+			}
 
-		let messageParentId = history.messages[messageId].parentId;
+			history.messages[userMessageId] = userMessage;
+			history.currentId = userMessageId;
 
-		if (messageParentId !== null) {
-			history.messages[messageParentId].childrenIds = [
-				...history.messages[messageParentId].childrenIds,
-				userMessageId
-			];
+			await tick();
+			await sendPrompt(userPrompt, userMessageId);
+		} else {
+			history.messages[messageId].content = content;
+			await tick();
+			await updateChatById(localStorage.token, chatId, {
+				messages: messages,
+				history: history
+			});
 		}
-
-		history.messages[userMessageId] = userMessage;
-		history.currentId = userMessageId;
-
-		await tick();
-		await sendPrompt(userPrompt, userMessageId);
 	};
 
 	const updateChatMessages = async () => {

+ 28 - 19
src/lib/components/chat/Messages/CodeBlock.svelte

@@ -3,6 +3,8 @@
 	import { loadPyodide } from 'pyodide';
 	import mermaid from 'mermaid';
 
+	import { v4 as uuidv4 } from 'uuid';
+
 	import { getContext, getAllContexts, onMount } from 'svelte';
 	import { copyToClipboard } from '$lib/utils';
 
@@ -213,15 +215,19 @@ __builtins__.input = input`);
 
 	let debounceTimeout;
 
-	$: if (code) {
-		if (lang === 'mermaid' && (token?.raw ?? '').endsWith('```')) {
+	const drawMermaidDiagram = async () => {
+		try {
+			const { svg } = await mermaid.render(`mermaid-${uuidv4()}`, code);
+			mermaidHtml = svg;
+		} catch (error) {
+			console.log('Error:', error);
+		}
+	};
+
+	$: if (token.raw) {
+		if (lang === 'mermaid' && (token?.raw ?? '').slice(-4).includes('```')) {
 			(async () => {
-				try {
-					const { svg } = await mermaid.render(`mermaid-${id}`, code);
-					mermaidHtml = svg;
-				} catch (error) {
-					console.error('Error:', error);
-				}
+				await drawMermaidDiagram();
 			})();
 		} else {
 			// Function to perform the code highlighting
@@ -237,15 +243,18 @@ __builtins__.input = input`);
 	}
 
 	onMount(async () => {
-		await mermaid.initialize({ startOnLoad: true });
-
-		if (lang === 'mermaid' && (token?.raw ?? '').endsWith('```')) {
-			try {
-				const { svg } = await mermaid.render(`mermaid-${id}`, code);
-				mermaidHtml = svg;
-			} catch (error) {
-				console.error('Error:', error);
-			}
+		if (document.documentElement.classList.contains('dark')) {
+			mermaid.initialize({
+				startOnLoad: true,
+				theme: 'dark',
+				securityLevel: 'loose'
+			});
+		} else {
+			mermaid.initialize({
+				startOnLoad: true,
+				theme: 'default',
+				securityLevel: 'loose'
+			});
 		}
 	});
 </script>
@@ -253,9 +262,9 @@ __builtins__.input = input`);
 <div class="my-2" dir="ltr">
 	{#if lang === 'mermaid'}
 		{#if mermaidHtml}
-			{@html mermaidHtml}
+			{@html `${mermaidHtml}`}
 		{:else}
-			<pre class=" mermaid-{id}">{code}</pre>
+			<pre class="mermaid">{code}</pre>
 		{/if}
 	{:else}
 		<div

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

@@ -143,12 +143,14 @@
 					{@const message = groupedMessages[modelIdx].messages[groupedMessagesIdx[modelIdx]]}
 
 					<div
-						class=" snap-center {$mobile
-							? 'min-w-full'
-							: 'min-w-80'} w-full max-w-full m-1 border {history.messages[currentMessageId]
+						class=" snap-center w-full max-w-full m-1 border {history.messages[currentMessageId]
 							?.modelIdx == modelIdx
-							? 'border-gray-100 dark:border-gray-800 border-[1.5px]'
-							: 'border-gray-50 dark:border-gray-850 border-dashed '} transition p-5 rounded-2xl"
+							? `border-gray-100 dark:border-gray-800 border-[1.5px] ${
+									$mobile ? 'min-w-full' : 'min-w-[32rem]'
+								}`
+							: `border-gray-50 dark:border-gray-850 border-dashed ${
+									$mobile ? 'min-w-full' : 'min-w-80'
+								}`} transition-all p-5 rounded-2xl"
 						on:click={() => {
 							if (currentMessageId != message.id) {
 								currentMessageId = message.id;

+ 2 - 1
src/lib/components/chat/Messages/Placeholder.svelte

@@ -126,7 +126,8 @@
 		<div class=" w-full font-primary" in:fade={{ duration: 200, delay: 300 }}>
 			<Suggestions
 				suggestionPrompts={models[selectedModelIdx]?.info?.meta?.suggestion_prompts ??
-					$config.default_prompt_suggestions}
+					$config?.default_prompt_suggestions ??
+					[]}
 				{submitPrompt}
 			/>
 		</div>

+ 118 - 114
src/lib/components/chat/Messages/ResponseMessage.svelte

@@ -458,31 +458,33 @@
 
 							{#if message.done}
 								{#if !readOnly}
-									<Tooltip content={$i18n.t('Edit')} placement="bottom">
-										<button
-											class="{isLastMessage
-												? 'visible'
-												: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition"
-											on:click={() => {
-												editMessageHandler();
-											}}
-										>
-											<svg
-												xmlns="http://www.w3.org/2000/svg"
-												fill="none"
-												viewBox="0 0 24 24"
-												stroke-width="2.3"
-												stroke="currentColor"
-												class="w-4 h-4"
+									{#if $user.role === 'user' ? ($config?.permissions?.chat?.editing ?? true) : true}
+										<Tooltip content={$i18n.t('Edit')} placement="bottom">
+											<button
+												class="{isLastMessage
+													? 'visible'
+													: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition"
+												on:click={() => {
+													editMessageHandler();
+												}}
 											>
-												<path
-													stroke-linecap="round"
-													stroke-linejoin="round"
-													d="M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487zm0 0L19.5 7.125"
-												/>
-											</svg>
-										</button>
-									</Tooltip>
+												<svg
+													xmlns="http://www.w3.org/2000/svg"
+													fill="none"
+													viewBox="0 0 24 24"
+													stroke-width="2.3"
+													stroke="currentColor"
+													class="w-4 h-4"
+												>
+													<path
+														stroke-linecap="round"
+														stroke-linejoin="round"
+														d="M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487zm0 0L19.5 7.125"
+													/>
+												</svg>
+											</button>
+										</Tooltip>
+									{/if}
 								{/if}
 
 								<Tooltip content={$i18n.t('Copy')} placement="bottom">
@@ -719,103 +721,105 @@
 								{/if}
 
 								{#if !readOnly}
-									<Tooltip content={$i18n.t('Good Response')} placement="bottom">
-										<button
-											class="{isLastMessage
-												? 'visible'
-												: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {(message
-												?.annotation?.rating ?? null) === 1
-												? 'bg-gray-100 dark:bg-gray-800'
-												: ''} dark:hover:text-white hover:text-black transition"
-											on:click={async () => {
-												await rateMessage(message.id, 1);
-
-												(model?.actions ?? [])
-													.filter((action) => action?.__webui__ ?? false)
-													.forEach((action) => {
-														dispatch('action', {
-															id: action.id,
-															event: {
-																id: 'good-response',
-																data: {
-																	messageId: message.id
+									{#if $config?.features.enable_message_rating ?? true}
+										<Tooltip content={$i18n.t('Good Response')} placement="bottom">
+											<button
+												class="{isLastMessage
+													? 'visible'
+													: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {(message
+													?.annotation?.rating ?? null) === 1
+													? 'bg-gray-100 dark:bg-gray-800'
+													: ''} dark:hover:text-white hover:text-black transition"
+												on:click={async () => {
+													await rateMessage(message.id, 1);
+
+													(model?.actions ?? [])
+														.filter((action) => action?.__webui__ ?? false)
+														.forEach((action) => {
+															dispatch('action', {
+																id: action.id,
+																event: {
+																	id: 'good-response',
+																	data: {
+																		messageId: message.id
+																	}
 																}
-															}
+															});
 														});
-													});
-
-												showRateComment = true;
-												window.setTimeout(() => {
-													document
-														.getElementById(`message-feedback-${message.id}`)
-														?.scrollIntoView();
-												}, 0);
-											}}
-										>
-											<svg
-												stroke="currentColor"
-												fill="none"
-												stroke-width="2.3"
-												viewBox="0 0 24 24"
-												stroke-linecap="round"
-												stroke-linejoin="round"
-												class="w-4 h-4"
-												xmlns="http://www.w3.org/2000/svg"
-												><path
-													d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"
-												/></svg
+
+													showRateComment = true;
+													window.setTimeout(() => {
+														document
+															.getElementById(`message-feedback-${message.id}`)
+															?.scrollIntoView();
+													}, 0);
+												}}
 											>
-										</button>
-									</Tooltip>
+												<svg
+													stroke="currentColor"
+													fill="none"
+													stroke-width="2.3"
+													viewBox="0 0 24 24"
+													stroke-linecap="round"
+													stroke-linejoin="round"
+													class="w-4 h-4"
+													xmlns="http://www.w3.org/2000/svg"
+													><path
+														d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"
+													/></svg
+												>
+											</button>
+										</Tooltip>
 
-									<Tooltip content={$i18n.t('Bad Response')} placement="bottom">
-										<button
-											class="{isLastMessage
-												? 'visible'
-												: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {(message
-												?.annotation?.rating ?? null) === -1
-												? 'bg-gray-100 dark:bg-gray-800'
-												: ''} dark:hover:text-white hover:text-black transition"
-											on:click={async () => {
-												await rateMessage(message.id, -1);
-
-												(model?.actions ?? [])
-													.filter((action) => action?.__webui__ ?? false)
-													.forEach((action) => {
-														dispatch('action', {
-															id: action.id,
-															event: {
-																id: 'bad-response',
-																data: {
-																	messageId: message.id
+										<Tooltip content={$i18n.t('Bad Response')} placement="bottom">
+											<button
+												class="{isLastMessage
+													? 'visible'
+													: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {(message
+													?.annotation?.rating ?? null) === -1
+													? 'bg-gray-100 dark:bg-gray-800'
+													: ''} dark:hover:text-white hover:text-black transition"
+												on:click={async () => {
+													await rateMessage(message.id, -1);
+
+													(model?.actions ?? [])
+														.filter((action) => action?.__webui__ ?? false)
+														.forEach((action) => {
+															dispatch('action', {
+																id: action.id,
+																event: {
+																	id: 'bad-response',
+																	data: {
+																		messageId: message.id
+																	}
 																}
-															}
+															});
 														});
-													});
-
-												showRateComment = true;
-												window.setTimeout(() => {
-													document
-														.getElementById(`message-feedback-${message.id}`)
-														?.scrollIntoView();
-												}, 0);
-											}}
-										>
-											<svg
-												stroke="currentColor"
-												fill="none"
-												stroke-width="2.3"
-												viewBox="0 0 24 24"
-												stroke-linecap="round"
-												stroke-linejoin="round"
-												class="w-4 h-4"
-												xmlns="http://www.w3.org/2000/svg"
-												><path
-													d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"
-												/></svg
+
+													showRateComment = true;
+													window.setTimeout(() => {
+														document
+															.getElementById(`message-feedback-${message.id}`)
+															?.scrollIntoView();
+													}, 0);
+												}}
 											>
-										</button>
-									</Tooltip>
+												<svg
+													stroke="currentColor"
+													fill="none"
+													stroke-width="2.3"
+													viewBox="0 0 24 24"
+													stroke-linecap="round"
+													stroke-linejoin="round"
+													class="w-4 h-4"
+													xmlns="http://www.w3.org/2000/svg"
+													><path
+														d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"
+													/></svg
+												>
+											</button>
+										</Tooltip>
+									{/if}
 
 									{#if isLastMessage}
 										<Tooltip content={$i18n.t('Continue Response')} placement="bottom">

+ 36 - 22
src/lib/components/chat/Messages/UserMessage.svelte

@@ -45,8 +45,8 @@
 		messageEditTextAreaElement?.focus();
 	};
 
-	const editMessageConfirmHandler = async () => {
-		confirmEditMessage(message.id, editedContent);
+	const editMessageConfirmHandler = async (submit = true) => {
+		confirmEditMessage(message.id, editedContent, submit);
 
 		edit = false;
 		editedContent = '';
@@ -135,31 +135,45 @@
 							const isEnterPressed = e.key === 'Enter';
 
 							if (isCmdOrCtrlPressed && isEnterPressed) {
-								document.getElementById('save-edit-message-button')?.click();
+								document.getElementById('confirm-edit-message-button')?.click();
 							}
 						}}
 					/>
 
-					<div class=" mt-2 mb-1 flex justify-end space-x-1.5 text-sm font-medium">
-						<button
-							id="close-edit-message-button"
-							class="px-4 py-2 bg-white dark:bg-gray-900 hover:bg-gray-100 text-gray-800 dark:text-gray-100 transition rounded-3xl"
-							on:click={() => {
-								cancelEditMessage();
-							}}
-						>
-							{$i18n.t('Cancel')}
-						</button>
+					<div class=" mt-2 mb-1 flex justify-between text-sm font-medium">
+						<div>
+							<button
+								id="save-edit-message-button"
+								class=" px-4 py-2 bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 border dark:border-gray-700 text-gray-700 dark:text-gray-200 transition rounded-3xl"
+								on:click={() => {
+									editMessageConfirmHandler(false);
+								}}
+							>
+								{$i18n.t('Save')}
+							</button>
+						</div>
 
-						<button
-							id="save-edit-message-button"
-							class=" px-4 py-2 bg-gray-900 dark:bg-white hover:bg-gray-850 text-gray-100 dark:text-gray-800 transition rounded-3xl"
-							on:click={() => {
-								editMessageConfirmHandler();
-							}}
-						>
-							{$i18n.t('Send')}
-						</button>
+						<div class="flex space-x-1.5">
+							<button
+								id="close-edit-message-button"
+								class="px-4 py-2 bg-white dark:bg-gray-900 hover:bg-gray-100 text-gray-800 dark:text-gray-100 transition rounded-3xl"
+								on:click={() => {
+									cancelEditMessage();
+								}}
+							>
+								{$i18n.t('Cancel')}
+							</button>
+
+							<button
+								id="confirm-edit-message-button"
+								class=" px-4 py-2 bg-gray-900 dark:bg-white hover:bg-gray-850 text-gray-100 dark:text-gray-800 transition rounded-3xl"
+								on:click={() => {
+									editMessageConfirmHandler();
+								}}
+							>
+								{$i18n.t('Send')}
+							</button>
+						</div>
 					</div>
 				</div>
 			{:else}

+ 4 - 2
src/lib/components/chat/ModelSelector.svelte

@@ -1,5 +1,5 @@
 <script lang="ts">
-	import { models, showSettings, settings, user, mobile } from '$lib/stores';
+	import { models, showSettings, settings, user, mobile, config } from '$lib/stores';
 	import { onMount, tick, getContext } from 'svelte';
 	import { toast } from 'svelte-sonner';
 	import Selector from './ModelSelector/Selector.svelte';
@@ -46,7 +46,9 @@
 							label: model.name,
 							model: model
 						}))}
-						showTemporaryChatControl={true}
+						showTemporaryChatControl={$user.role === 'user'
+							? ($config?.permissions?.chat?.temporary ?? true)
+							: true}
 						bind:value={selectedModel}
 					/>
 				</div>

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

@@ -35,9 +35,10 @@
 	export let items: {
 		label: string;
 		value: string;
+		model: Model;
 		// eslint-disable-next-line @typescript-eslint/no-explicit-any
 		[key: string]: any;
-	} = [];
+	}[] = [];
 
 	export let className = 'w-[32rem]';
 

+ 6 - 4
src/lib/components/chat/Settings/General.svelte

@@ -17,7 +17,7 @@
 	let themes = ['dark', 'light', 'rose-pine dark', 'rose-pine-dawn light', 'oled-dark'];
 	let selectedTheme = 'system';
 
-	let languages = [];
+	let languages: Awaited<ReturnType<typeof getLanguages>> = [];
 	let lang = $i18n.language;
 	let notificationEnabled = false;
 	let system = '';
@@ -41,7 +41,7 @@
 
 	// Advanced
 	let requestFormat = '';
-	let keepAlive = null;
+	let keepAlive: string | null = null;
 
 	let params = {
 		// Advanced
@@ -59,7 +59,8 @@
 		num_ctx: null,
 		num_batch: null,
 		num_keep: null,
-		max_tokens: null
+		max_tokens: null,
+		num_gpu: null
 	};
 
 	const toggleRequestFormat = async () => {
@@ -321,7 +322,8 @@
 						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
+						num_thread: params.num_thread !== null ? params.num_thread : undefined,
+						num_gpu: params.num_gpu !== null ? params.num_gpu : undefined
 					},
 					keepAlive: keepAlive ? (isNaN(keepAlive) ? keepAlive : parseInt(keepAlive)) : undefined
 				});

+ 1 - 1
src/lib/components/chat/Settings/Models.svelte

@@ -31,7 +31,7 @@
 	let ollamaEnabled = null;
 
 	let OLLAMA_URLS = [];
-	let selectedOllamaUrlIdx: string | null = null;
+	let selectedOllamaUrlIdx: number | null = null;
 
 	let updateModelId = null;
 	let updateProgress = null;

+ 140 - 45
src/lib/components/workspace/Models.svelte

@@ -18,9 +18,13 @@
 	import EllipsisHorizontal from '../icons/EllipsisHorizontal.svelte';
 	import ModelMenu from './Models/ModelMenu.svelte';
 	import ModelDeleteConfirmDialog from '../common/ConfirmDialog.svelte';
+	import Tooltip from '../common/Tooltip.svelte';
+	import GarbageBin from '../icons/GarbageBin.svelte';
 
 	const i18n = getContext('i18n');
 
+	let shiftKey = false;
+
 	let showModelDeleteConfirm = false;
 
 	let localModelfiles = [];
@@ -194,6 +198,32 @@
 				}
 			});
 		}
+
+		const onKeyDown = (event) => {
+			if (event.key === 'Shift') {
+				shiftKey = true;
+			}
+		};
+
+		const onKeyUp = (event) => {
+			if (event.key === 'Shift') {
+				shiftKey = false;
+			}
+		};
+
+		const onBlur = () => {
+			shiftKey = false;
+		};
+
+		window.addEventListener('keydown', onKeyDown);
+		window.addEventListener('keyup', onKeyUp);
+		window.addEventListener('blur', onBlur);
+
+		return () => {
+			window.removeEventListener('keydown', onKeyDown);
+			window.removeEventListener('keyup', onKeyUp);
+			window.removeEventListener('blur', onBlur);
+		};
 	});
 </script>
 
@@ -314,54 +344,119 @@
 				</div>
 			</a>
 			<div class="flex flex-row gap-0.5 self-center">
-				<a
-					class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
-					type="button"
-					href={`/workspace/models/edit?id=${encodeURIComponent(model.id)}`}
-				>
-					<svg
-						xmlns="http://www.w3.org/2000/svg"
-						fill="none"
-						viewBox="0 0 24 24"
-						stroke-width="1.5"
-						stroke="currentColor"
-						class="w-4 h-4"
+				{#if shiftKey}
+					<Tooltip
+						content={(model?.info?.meta?.hidden ?? false)
+							? $i18n.t('Show Model')
+							: $i18n.t('Hide Model')}
 					>
-						<path
-							stroke-linecap="round"
-							stroke-linejoin="round"
-							d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125"
-						/>
-					</svg>
-				</a>
-
-				<ModelMenu
-					{model}
-					shareHandler={() => {
-						shareModelHandler(model);
-					}}
-					cloneHandler={() => {
-						cloneModelHandler(model);
-					}}
-					exportHandler={() => {
-						exportModelHandler(model);
-					}}
-					hideHandler={() => {
-						hideModelHandler(model);
-					}}
-					deleteHandler={() => {
-						selectedModel = model;
-						showModelDeleteConfirm = true;
-					}}
-					onClose={() => {}}
-				>
-					<button
-						class="self-center w-fit text-sm p-1.5 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
+						<button
+							class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
+							type="button"
+							on:click={() => {
+								hideModelHandler(model);
+							}}
+						>
+							{#if model?.info?.meta?.hidden ?? false}
+								<svg
+									xmlns="http://www.w3.org/2000/svg"
+									fill="none"
+									viewBox="0 0 24 24"
+									stroke-width="1.5"
+									stroke="currentColor"
+									class="size-4"
+								>
+									<path
+										stroke-linecap="round"
+										stroke-linejoin="round"
+										d="M3.98 8.223A10.477 10.477 0 0 0 1.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.451 10.451 0 0 1 12 4.5c4.756 0 8.773 3.162 10.065 7.498a10.522 10.522 0 0 1-4.293 5.774M6.228 6.228 3 3m3.228 3.228 3.65 3.65m7.894 7.894L21 21m-3.228-3.228-3.65-3.65m0 0a3 3 0 1 0-4.243-4.243m4.242 4.242L9.88 9.88"
+									/>
+								</svg>
+							{:else}
+								<svg
+									xmlns="http://www.w3.org/2000/svg"
+									fill="none"
+									viewBox="0 0 24 24"
+									stroke-width="1.5"
+									stroke="currentColor"
+									class="size-4"
+								>
+									<path
+										stroke-linecap="round"
+										stroke-linejoin="round"
+										d="M2.036 12.322a1.012 1.012 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178Z"
+									/>
+									<path
+										stroke-linecap="round"
+										stroke-linejoin="round"
+										d="M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z"
+									/>
+								</svg>
+							{/if}
+						</button>
+					</Tooltip>
+
+					<Tooltip content={$i18n.t('Delete')}>
+						<button
+							class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
+							type="button"
+							on:click={() => {
+								deleteModelHandler(model);
+							}}
+						>
+							<GarbageBin />
+						</button>
+					</Tooltip>
+				{:else}
+					<a
+						class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
 						type="button"
+						href={`/workspace/models/edit?id=${encodeURIComponent(model.id)}`}
 					>
-						<EllipsisHorizontal className="size-5" />
-					</button>
-				</ModelMenu>
+						<svg
+							xmlns="http://www.w3.org/2000/svg"
+							fill="none"
+							viewBox="0 0 24 24"
+							stroke-width="1.5"
+							stroke="currentColor"
+							class="w-4 h-4"
+						>
+							<path
+								stroke-linecap="round"
+								stroke-linejoin="round"
+								d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125"
+							/>
+						</svg>
+					</a>
+
+					<ModelMenu
+						{model}
+						shareHandler={() => {
+							shareModelHandler(model);
+						}}
+						cloneHandler={() => {
+							cloneModelHandler(model);
+						}}
+						exportHandler={() => {
+							exportModelHandler(model);
+						}}
+						hideHandler={() => {
+							hideModelHandler(model);
+						}}
+						deleteHandler={() => {
+							selectedModel = model;
+							showModelDeleteConfirm = true;
+						}}
+						onClose={() => {}}
+					>
+						<button
+							class="self-center w-fit text-sm p-1.5 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
+							type="button"
+						>
+							<EllipsisHorizontal className="size-5" />
+						</button>
+					</ModelMenu>
+				{/if}
 			</div>
 		</div>
 	{/each}

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

@@ -44,7 +44,9 @@
 	"All Users": "جميع المستخدمين",
 	"Allow": "يسمح",
 	"Allow Chat Deletion": "يستطيع حذف المحادثات",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "الأحرف الأبجدية الرقمية والواصلات",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "تضمين محرك النموذج",
 	"Embedding model set to \"{{embedding_model}}\"": "تم تعيين نموذج التضمين على \"{{embedding_model}}\"",
 	"Enable Community Sharing": "تمكين مشاركة المجتمع",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "تفعيل عمليات التسجيل الجديدة",
 	"Enable Web Search": "تمكين بحث الويب",
 	"Enabled": "",
@@ -565,7 +568,6 @@
 	"Set Voice": "ضبط الصوت",
 	"Settings": "الاعدادات",
 	"Settings saved successfully!": "تم حفظ الاعدادات بنجاح",
-	"Settings updated successfully": "",
 	"Share": "كشاركة",
 	"Share Chat": "مشاركة الدردشة",
 	"Share to OpenWebUI Community": "OpenWebUI شارك في مجتمع",

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

@@ -44,7 +44,9 @@
 	"All Users": "Всички Потребители",
 	"Allow": "Позволи",
 	"Allow Chat Deletion": "Позволи Изтриване на Чат",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "алфанумерични знаци и тире",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Модел за вграждане",
 	"Embedding model set to \"{{embedding_model}}\"": "Модел за вграждане е настроен на \"{{embedding_model}}\"",
 	"Enable Community Sharing": "Разрешаване на споделяне в общност",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Вклюване на Нови Потребители",
 	"Enable Web Search": "Разрешаване на търсене в уеб",
 	"Enabled": "",
@@ -561,7 +564,6 @@
 	"Set Voice": "Задай Глас",
 	"Settings": "Настройки",
 	"Settings saved successfully!": "Настройките са запазени успешно!",
-	"Settings updated successfully": "",
 	"Share": "Подели",
 	"Share Chat": "Подели Чат",
 	"Share to OpenWebUI Community": "Споделите с OpenWebUI Общността",

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

@@ -44,7 +44,9 @@
 	"All Users": "সব ইউজার",
 	"Allow": "অনুমোদন",
 	"Allow Chat Deletion": "চ্যাট ডিলিট করতে দিন",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "ইংরেজি অক্ষর, সংখ্যা এবং হাইফেন",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "ইমেজ ইমেবডিং মডেল ইঞ্জিন",
 	"Embedding model set to \"{{embedding_model}}\"": "ইমেজ ইমেবডিং মডেল সেট করা হয়েছে - \"{{embedding_model}}\"",
 	"Enable Community Sharing": "সম্প্রদায় শেয়ারকরণ সক্ষম করুন",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "নতুন সাইনআপ চালু করুন",
 	"Enable Web Search": "ওয়েব অনুসন্ধান সক্ষম করুন",
 	"Enabled": "",
@@ -561,7 +564,6 @@
 	"Set Voice": "কন্ঠস্বর নির্ধারণ করুন",
 	"Settings": "সেটিংসমূহ",
 	"Settings saved successfully!": "সেটিংগুলো সফলভাবে সংরক্ষিত হয়েছে",
-	"Settings updated successfully": "",
 	"Share": "শেয়ার করুন",
 	"Share Chat": "চ্যাট শেয়ার করুন",
 	"Share to OpenWebUI Community": "OpenWebUI কমিউনিটিতে শেয়ার করুন",

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

@@ -44,7 +44,9 @@
 	"All Users": "Tots els usuaris",
 	"Allow": "Permetre",
 	"Allow Chat Deletion": "Permetre la supressió del xat",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "Permetre veus no locals",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "Permetre la ubicació de l'usuari",
 	"Allow Voice Interruption in Call": "Permetre la interrupció de la veu en una trucada",
 	"alphanumeric characters and hyphens": "caràcters alfanumèrics i guions",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Motor de model d'incrustació",
 	"Embedding model set to \"{{embedding_model}}\"": "Model d'incrustació configurat a \"{{embedding_model}}\"",
 	"Enable Community Sharing": "Activar l'ús compartit amb la comunitat",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Permetre nous registres",
 	"Enable Web Search": "Activar la cerca web",
 	"Enabled": "Habilitat",
@@ -562,7 +565,6 @@
 	"Set Voice": "Establir la veu",
 	"Settings": "Preferències",
 	"Settings saved successfully!": "Les preferències s'han desat correctament",
-	"Settings updated successfully": "Les preferències s'han actualitzat correctament",
 	"Share": "Compartir",
 	"Share Chat": "Compartir el xat",
 	"Share to OpenWebUI Community": "Compartir amb la comunitat OpenWebUI",

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

@@ -44,7 +44,9 @@
 	"All Users": "Ang tanan nga mga tiggamit",
 	"Allow": "Sa pagtugot",
 	"Allow Chat Deletion": "Tugoti nga mapapas ang mga chat",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "alphanumeric nga mga karakter ug hyphen",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "",
 	"Embedding model set to \"{{embedding_model}}\"": "",
 	"Enable Community Sharing": "",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "I-enable ang bag-ong mga rehistro",
 	"Enable Web Search": "",
 	"Enabled": "",
@@ -561,7 +564,6 @@
 	"Set Voice": "Ibutang ang tingog",
 	"Settings": "Mga setting",
 	"Settings saved successfully!": "Malampuson nga na-save ang mga setting!",
-	"Settings updated successfully": "",
 	"Share": "",
 	"Share Chat": "",
 	"Share to OpenWebUI Community": "Ipakigbahin sa komunidad sa OpenWebUI",

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

@@ -44,7 +44,9 @@
 	"All Users": "Alle Benutzer",
 	"Allow": "Erlauben",
 	"Allow Chat Deletion": "Unterhaltungen löschen erlauben",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "Nicht-lokale Stimmen erlauben",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "Standort freigeben",
 	"Allow Voice Interruption in Call": "Unterbrechung durch Stimme im Anruf zulassen",
 	"alphanumeric characters and hyphens": "alphanumerische Zeichen und Bindestriche",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Embedding-Modell-Engine",
 	"Embedding model set to \"{{embedding_model}}\"": "Embedding-Modell auf \"{{embedding_model}}\" gesetzt",
 	"Enable Community Sharing": "Community-Freigabe aktivieren",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Registrierung erlauben",
 	"Enable Web Search": "Websuche aktivieren",
 	"Enabled": "",
@@ -561,7 +564,6 @@
 	"Set Voice": "Stimme festlegen",
 	"Settings": "Einstellungen",
 	"Settings saved successfully!": "Einstellungen erfolgreich gespeichert!",
-	"Settings updated successfully": "Einstellungen erfolgreich aktualisiert",
 	"Share": "Teilen",
 	"Share Chat": "Unterhaltung teilen",
 	"Share to OpenWebUI Community": "Mit OpenWebUI Community teilen",

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

@@ -44,7 +44,9 @@
 	"All Users": "All Users",
 	"Allow": "Allow",
 	"Allow Chat Deletion": "Allow Delete Chats",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "so alpha, many hyphen",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "",
 	"Embedding model set to \"{{embedding_model}}\"": "",
 	"Enable Community Sharing": "",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Enable New Bark Ups",
 	"Enable Web Search": "",
 	"Enabled": "",
@@ -563,7 +566,6 @@
 	"Set Voice": "Set Voice so speak",
 	"Settings": "Settings much settings",
 	"Settings saved successfully!": "Settings saved successfully! Very success!",
-	"Settings updated successfully": "",
 	"Share": "",
 	"Share Chat": "",
 	"Share to OpenWebUI Community": "Share to OpenWebUI Community much community",

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

@@ -44,7 +44,9 @@
 	"All Users": "",
 	"Allow": "",
 	"Allow Chat Deletion": "",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "",
 	"Embedding model set to \"{{embedding_model}}\"": "",
 	"Enable Community Sharing": "",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "",
 	"Enable Web Search": "",
 	"Enabled": "",
@@ -561,7 +564,6 @@
 	"Set Voice": "",
 	"Settings": "",
 	"Settings saved successfully!": "",
-	"Settings updated successfully": "",
 	"Share": "",
 	"Share Chat": "",
 	"Share to OpenWebUI Community": "",

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

@@ -44,7 +44,9 @@
 	"All Users": "",
 	"Allow": "",
 	"Allow Chat Deletion": "",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "",
 	"Embedding model set to \"{{embedding_model}}\"": "",
 	"Enable Community Sharing": "",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "",
 	"Enable Web Search": "",
 	"Enabled": "",
@@ -561,7 +564,6 @@
 	"Set Voice": "",
 	"Settings": "",
 	"Settings saved successfully!": "",
-	"Settings updated successfully": "",
 	"Share": "",
 	"Share Chat": "",
 	"Share to OpenWebUI Community": "",

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

@@ -44,7 +44,9 @@
 	"All Users": "Todos los Usuarios",
 	"Allow": "Permitir",
 	"Allow Chat Deletion": "Permitir Borrar Chats",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "Permitir voces no locales",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "Permitir Ubicación del Usuario",
 	"Allow Voice Interruption in Call": "Permitir interrupción de voz en llamada",
 	"alphanumeric characters and hyphens": "caracteres alfanuméricos y guiones",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Motor de Modelo de Embedding",
 	"Embedding model set to \"{{embedding_model}}\"": "Modelo de Embedding configurado a \"{{embedding_model}}\"",
 	"Enable Community Sharing": "Habilitar el uso compartido de la comunidad",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Habilitar Nuevos Registros",
 	"Enable Web Search": "Habilitar la búsqueda web",
 	"Enabled": "",
@@ -562,7 +565,6 @@
 	"Set Voice": "Establecer la voz",
 	"Settings": "Configuración",
 	"Settings saved successfully!": "¡Configuración guardada con éxito!",
-	"Settings updated successfully": "¡Configuración actualizada con éxito!",
 	"Share": "Compartir",
 	"Share Chat": "Compartir Chat",
 	"Share to OpenWebUI Community": "Compartir con la comunidad OpenWebUI",

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

@@ -44,7 +44,9 @@
 	"All Users": "همه کاربران",
 	"Allow": "اجازه دادن",
 	"Allow Chat Deletion": "اجازه حذف گپ",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "حروف الفبایی و خط فاصله",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "محرک مدل پیدائش",
 	"Embedding model set to \"{{embedding_model}}\"": "مدل پیدائش را به \"{{embedding_model}}\" تنظیم کنید",
 	"Enable Community Sharing": "فعالسازی اشتراک انجمن",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "فعال کردن ثبت نام\u200cهای جدید",
 	"Enable Web Search": "فعالسازی جستجوی وب",
 	"Enabled": "",
@@ -561,7 +564,6 @@
 	"Set Voice": "تنظیم صدا",
 	"Settings": "تنظیمات",
 	"Settings saved successfully!": "تنظیمات با موفقیت ذخیره شد!",
-	"Settings updated successfully": "",
 	"Share": "اشتراک\u200cگذاری",
 	"Share Chat": "اشتراک\u200cگذاری چت",
 	"Share to OpenWebUI Community": "اشتراک گذاری با OpenWebUI Community",

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

@@ -44,7 +44,9 @@
 	"All Users": "Kaikki käyttäjät",
 	"Allow": "Salli",
 	"Allow Chat Deletion": "Salli keskustelujen poisto",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "kirjaimia, numeroita ja väliviivoja",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Upotusmallin moottori",
 	"Embedding model set to \"{{embedding_model}}\"": "\"{{embedding_model}}\" valittu upotusmalliksi",
 	"Enable Community Sharing": "Ota yhteisön jakaminen käyttöön",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Salli uudet rekisteröitymiset",
 	"Enable Web Search": "Ota verkkohaku käyttöön",
 	"Enabled": "",
@@ -561,7 +564,6 @@
 	"Set Voice": "Aseta puheääni",
 	"Settings": "Asetukset",
 	"Settings saved successfully!": "Asetukset tallennettu onnistuneesti!",
-	"Settings updated successfully": "",
 	"Share": "Jaa",
 	"Share Chat": "Jaa keskustelu",
 	"Share to OpenWebUI Community": "Jaa OpenWebUI-yhteisöön",

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

@@ -44,7 +44,9 @@
 	"All Users": "Tous les Utilisateurs",
 	"Allow": "Autoriser",
 	"Allow Chat Deletion": "Autoriser la suppression de l'historique de chat",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "Autoriser les voix non locales",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "Autoriser l'emplacement de l'utilisateur",
 	"Allow Voice Interruption in Call": "Autoriser l'interruption vocale pendant un appel",
 	"alphanumeric characters and hyphens": "caractères alphanumériques et tirets",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Moteur de modèle d'encodage",
 	"Embedding model set to \"{{embedding_model}}\"": "Modèle d'encodage défini sur « {{embedding_model}} »",
 	"Enable Community Sharing": "Activer le partage communautaire",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Activer les nouvelles inscriptions",
 	"Enable Web Search": "Activer la recherche sur le Web",
 	"Enabled": "",
@@ -562,7 +565,6 @@
 	"Set Voice": "Définir la voix",
 	"Settings": "Paramètres",
 	"Settings saved successfully!": "Paramètres enregistrés avec succès !",
-	"Settings updated successfully": "Les paramètres ont été mis à jour avec succès",
 	"Share": "Partager",
 	"Share Chat": "Partage de conversation",
 	"Share to OpenWebUI Community": "Partager avec la communauté OpenWebUI",

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

@@ -44,7 +44,9 @@
 	"All Users": "Tous les Utilisateurs",
 	"Allow": "Autoriser",
 	"Allow Chat Deletion": "Autoriser la suppression de l'historique de chat",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "Autoriser les voix non locales",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "Autoriser l'emplacement de l'utilisateur",
 	"Allow Voice Interruption in Call": "Autoriser l'interruption vocale pendant un appel",
 	"alphanumeric characters and hyphens": "caractères alphanumériques et tirets",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Moteur de modèle d'encodage",
 	"Embedding model set to \"{{embedding_model}}\"": "Modèle d'encodage défini sur « {{embedding_model}} »",
 	"Enable Community Sharing": "Activer le partage communautaire",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Activer les nouvelles inscriptions",
 	"Enable Web Search": "Activer la recherche web",
 	"Enabled": "",
@@ -562,7 +565,6 @@
 	"Set Voice": "Définir la voix",
 	"Settings": "Paramètres",
 	"Settings saved successfully!": "Paramètres enregistrés avec succès !",
-	"Settings updated successfully": "Les paramètres ont été mis à jour avec succès",
 	"Share": "Partager",
 	"Share Chat": "Partage de conversation",
 	"Share to OpenWebUI Community": "Partager avec la communauté OpenWebUI",

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

@@ -44,7 +44,9 @@
 	"All Users": "כל המשתמשים",
 	"Allow": "אפשר",
 	"Allow Chat Deletion": "אפשר מחיקת צ'אט",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "תווים אלפאנומריים ומקפים",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "מנוע מודל הטמעה",
 	"Embedding model set to \"{{embedding_model}}\"": "מודל ההטמעה הוגדר ל-\"{{embedding_model}}\"",
 	"Enable Community Sharing": "הפיכת שיתוף קהילה לזמין",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "אפשר הרשמות חדשות",
 	"Enable Web Search": "הפיכת חיפוש באינטרנט לזמין",
 	"Enabled": "",
@@ -562,7 +565,6 @@
 	"Set Voice": "הגדר קול",
 	"Settings": "הגדרות",
 	"Settings saved successfully!": "ההגדרות נשמרו בהצלחה!",
-	"Settings updated successfully": "",
 	"Share": "שתף",
 	"Share Chat": "שתף צ'אט",
 	"Share to OpenWebUI Community": "שתף לקהילת OpenWebUI",

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

@@ -44,7 +44,9 @@
 	"All Users": "सभी उपयोगकर्ता",
 	"Allow": "अनुमति दें",
 	"Allow Chat Deletion": "चैट हटाने की अनुमति दें",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "अल्फ़ान्यूमेरिक वर्ण और हाइफ़न",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "एंबेडिंग मॉडल इंजन",
 	"Embedding model set to \"{{embedding_model}}\"": "एम्बेडिंग मॉडल को \"{{embedding_model}}\" पर सेट किया गया",
 	"Enable Community Sharing": "समुदाय साझाकरण सक्षम करें",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "नए साइन अप सक्रिय करें",
 	"Enable Web Search": "वेब खोज सक्षम करें",
 	"Enabled": "",
@@ -561,7 +564,6 @@
 	"Set Voice": "आवाज सेट करें",
 	"Settings": "सेटिंग्स",
 	"Settings saved successfully!": "सेटिंग्स सफलतापूर्वक सहेजी गईं!",
-	"Settings updated successfully": "",
 	"Share": "साझा करें",
 	"Share Chat": "चैट साझा करें",
 	"Share to OpenWebUI Community": "OpenWebUI समुदाय में साझा करें",

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

@@ -44,7 +44,9 @@
 	"All Users": "Svi korisnici",
 	"Allow": "Dopusti",
 	"Allow Chat Deletion": "Dopusti brisanje razgovora",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "Dopusti nelokalne glasove",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "alfanumerički znakovi i crtice",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Embedding model pogon",
 	"Embedding model set to \"{{embedding_model}}\"": "Embedding model postavljen na \"{{embedding_model}}\"",
 	"Enable Community Sharing": "Omogući zajedničko korištenje zajednice",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Omogući nove prijave",
 	"Enable Web Search": "Omogući pretraživanje weba",
 	"Enabled": "",
@@ -562,7 +565,6 @@
 	"Set Voice": "Postavi glas",
 	"Settings": "Postavke",
 	"Settings saved successfully!": "Postavke su uspješno spremljene!",
-	"Settings updated successfully": "Postavke uspješno ažurirane",
 	"Share": "Podijeli",
 	"Share Chat": "Podijeli razgovor",
 	"Share to OpenWebUI Community": "Podijeli u OpenWebUI zajednici",

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

@@ -44,7 +44,9 @@
 	"All Users": "Semua Pengguna",
 	"Allow": "Mengizinkan",
 	"Allow Chat Deletion": "Izinkan Penghapusan Obrolan",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "Izinkan suara non-lokal",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "Izinkan Lokasi Pengguna",
 	"Allow Voice Interruption in Call": "Izinkan Gangguan Suara dalam Panggilan",
 	"alphanumeric characters and hyphens": "karakter alfanumerik dan tanda hubung",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Mesin Model Penyematan",
 	"Embedding model set to \"{{embedding_model}}\"": "Model penyematan diatur ke \"{{embedding_model}}\"",
 	"Enable Community Sharing": "Aktifkan Berbagi Komunitas",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Aktifkan Pendaftaran Baru",
 	"Enable Web Search": "Aktifkan Pencarian Web",
 	"Enabled": "",
@@ -561,7 +564,6 @@
 	"Set Voice": "Mengatur Suara",
 	"Settings": "Pengaturan",
 	"Settings saved successfully!": "Pengaturan berhasil disimpan!",
-	"Settings updated successfully": "Pengaturan berhasil diperbarui",
 	"Share": "Berbagi",
 	"Share Chat": "Bagikan Obrolan",
 	"Share to OpenWebUI Community": "Bagikan ke Komunitas OpenWebUI",

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

@@ -44,7 +44,9 @@
 	"All Users": "Tutti gli utenti",
 	"Allow": "Consenti",
 	"Allow Chat Deletion": "Consenti l'eliminazione della chat",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "caratteri alfanumerici e trattini",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Motore del modello di embedding",
 	"Embedding model set to \"{{embedding_model}}\"": "Modello di embedding impostato su \"{{embedding_model}}\"",
 	"Enable Community Sharing": "Abilita la condivisione della community",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Abilita nuove iscrizioni",
 	"Enable Web Search": "Abilita ricerca Web",
 	"Enabled": "",
@@ -562,7 +565,6 @@
 	"Set Voice": "Imposta voce",
 	"Settings": "Impostazioni",
 	"Settings saved successfully!": "Impostazioni salvate con successo!",
-	"Settings updated successfully": "",
 	"Share": "Condividi",
 	"Share Chat": "Condividi chat",
 	"Share to OpenWebUI Community": "Condividi con la comunità OpenWebUI",

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

@@ -44,7 +44,9 @@
 	"All Users": "すべてのユーザー",
 	"Allow": "許可",
 	"Allow Chat Deletion": "チャットの削除を許可",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "英数字とハイフン",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "埋め込みモデルエンジン",
 	"Embedding model set to \"{{embedding_model}}\"": "埋め込みモデルを\"{{embedding_model}}\"に設定しました",
 	"Enable Community Sharing": "コミュニティ共有の有効化",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "新規登録を有効化",
 	"Enable Web Search": "Web 検索を有効にする",
 	"Enabled": "",
@@ -560,7 +563,6 @@
 	"Set Voice": "音声を設定",
 	"Settings": "設定",
 	"Settings saved successfully!": "設定が正常に保存されました!",
-	"Settings updated successfully": "",
 	"Share": "共有",
 	"Share Chat": "チャットを共有",
 	"Share to OpenWebUI Community": "OpenWebUI コミュニティに共有",

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

@@ -44,7 +44,9 @@
 	"All Users": "ყველა მომხმარებელი",
 	"Allow": "ნების დართვა",
 	"Allow Chat Deletion": "მიმოწერის წაშლის დაშვება",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "ალფანუმერული სიმბოლოები და დეფისები",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "ჩასმის ძირითადი პროგრამა",
 	"Embedding model set to \"{{embedding_model}}\"": "ჩასმის ძირითადი პროგრამა ჩართულია \"{{embedding_model}}\"",
 	"Enable Community Sharing": "საზოგადოების გაზიარების ჩართვა",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "ახალი რეგისტრაციების ჩართვა",
 	"Enable Web Search": "ვებ ძიების ჩართვა",
 	"Enabled": "",
@@ -561,7 +564,6 @@
 	"Set Voice": "ხმის დაყენება",
 	"Settings": "ხელსაწყოები",
 	"Settings saved successfully!": "პარამეტრები წარმატებით განახლდა!",
-	"Settings updated successfully": "",
 	"Share": "გაზიარება",
 	"Share Chat": "გაზიარება",
 	"Share to OpenWebUI Community": "გააზიარე OpenWebUI საზოგადოებაში ",

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

@@ -44,7 +44,9 @@
 	"All Users": "모든 사용자",
 	"Allow": "허용",
 	"Allow Chat Deletion": "채팅 삭제 허용",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "외부 음성 허용",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "사용자 위치 활용 허용",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "영문자, 숫자, 하이픈",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "임베딩 모델 엔진",
 	"Embedding model set to \"{{embedding_model}}\"": "임베딩 모델을 \"{{embedding_model}}\"로 설정함",
 	"Enable Community Sharing": "커뮤니티 공유 활성화",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "새 회원가입 활성화",
 	"Enable Web Search": "웹 검색 활성화",
 	"Enabled": "",
@@ -561,7 +564,6 @@
 	"Set Voice": "음성 설정",
 	"Settings": "설정",
 	"Settings saved successfully!": "설정이 성공적으로 저장되었습니다!",
-	"Settings updated successfully": "설정이 성공적으로 업데이트되었습니다.",
 	"Share": "공유",
 	"Share Chat": "채팅 공유",
 	"Share to OpenWebUI Community": "OpenWebUI 커뮤니티에 공유",

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

@@ -44,7 +44,9 @@
 	"All Users": "Visi naudotojai",
 	"Allow": "Leisti",
 	"Allow Chat Deletion": "Leisti pokalbių ištrynimą",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "Leisti nelokalius balsus",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "Leisti naudotojo vietos matymą",
 	"Allow Voice Interruption in Call": "Leisti pertraukimą skambučio metu",
 	"alphanumeric characters and hyphens": "skaičiai, raidės ir brūkšneliai",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Embedding modelio variklis",
 	"Embedding model set to \"{{embedding_model}}\"": "Embedding modelis nustatytas kaip\"{{embedding_model}}\"",
 	"Enable Community Sharing": "Leisti dalinimąsi su bendruomene",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Aktyvuoti naujas registracijas",
 	"Enable Web Search": "Leisti paiešką internete",
 	"Enabled": "Leisti",
@@ -563,7 +566,6 @@
 	"Set Voice": "Numatyti balsą",
 	"Settings": "Nustatymai",
 	"Settings saved successfully!": "Parametrai sėkmingai išsaugoti!",
-	"Settings updated successfully": "Nustatymai atnaujinti sėkmingai",
 	"Share": "Dalintis",
 	"Share Chat": "Dalintis pokalbiu",
 	"Share to OpenWebUI Community": "Dalintis su OpenWebUI bendruomene",

+ 3 - 1
src/lib/i18n/locales/ms-MY/translation.json

@@ -44,7 +44,9 @@
 	"All Users": "Semua Pengguna",
 	"Allow": "Benarkan",
 	"Allow Chat Deletion": "Benarkan Penghapusan Perbualan",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "Benarkan suara bukan tempatan ",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "Benarkan Lokasi Pengguna",
 	"Allow Voice Interruption in Call": "Benarkan gangguan suara dalam panggilan",
 	"alphanumeric characters and hyphens": "aksara alfanumerik dan tanda sempang",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Enjin Model Benamkan",
 	"Embedding model set to \"{{embedding_model}}\"": "Model Benamkan ditetapkan kepada \"{{embedding_model}}\"",
 	"Enable Community Sharing": "Benarkan Perkongsian Komuniti",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Benarkan Pendaftaran Baharu",
 	"Enable Web Search": "Benarkan Carian Web",
 	"Enabled": "Dibenarkan",
@@ -561,7 +564,6 @@
 	"Set Voice": "Tetapan Suara",
 	"Settings": "Tetapan",
 	"Settings saved successfully!": "Tetapan berjaya disimpan!",
-	"Settings updated successfully": "Tetapan berjaya dikemas kini",
 	"Share": "Kongsi",
 	"Share Chat": "Kongsi Perbualan",
 	"Share to OpenWebUI Community": "Kongsi kepada Komuniti OpenWebUI",

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

@@ -44,7 +44,9 @@
 	"All Users": "Alle brukere",
 	"Allow": "Tillat",
 	"Allow Chat Deletion": "Tillat sletting av chatter",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "Tillat ikke-lokale stemmer",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "Aktiver stedstjenester",
 	"Allow Voice Interruption in Call": "Muliggjør stemmeavbrytelse i samtale",
 	"alphanumeric characters and hyphens": "alfanumeriske tegn og bindestreker",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Embedding-modellmotor",
 	"Embedding model set to \"{{embedding_model}}\"": "Embedding-modell satt til \"{{embedding_model}}\"",
 	"Enable Community Sharing": "Aktiver deling i fellesskap",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Aktiver nye registreringer",
 	"Enable Web Search": "Aktiver websøk",
 	"Enabled": "Aktivert",
@@ -561,7 +564,6 @@
 	"Set Voice": "Sett stemme",
 	"Settings": "Innstillinger",
 	"Settings saved successfully!": "Innstillinger lagret!",
-	"Settings updated successfully": "Innstillinger oppdatert",
 	"Share": "Del",
 	"Share Chat": "Del chat",
 	"Share to OpenWebUI Community": "Del med OpenWebUI-fellesskapet",

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

@@ -44,7 +44,9 @@
 	"All Users": "Alle Gebruikers",
 	"Allow": "Toestaan",
 	"Allow Chat Deletion": "Sta Chat Verwijdering toe",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "alfanumerieke karakters en streepjes",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Embedding Model Engine",
 	"Embedding model set to \"{{embedding_model}}\"": "Embedding model ingesteld op \"{{embedding_model}}\"",
 	"Enable Community Sharing": "Delen via de community inschakelen",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Schakel Nieuwe Registraties in",
 	"Enable Web Search": "Zoeken op het web inschakelen",
 	"Enabled": "",
@@ -561,7 +564,6 @@
 	"Set Voice": "Stel Stem in",
 	"Settings": "Instellingen",
 	"Settings saved successfully!": "Instellingen succesvol opgeslagen!",
-	"Settings updated successfully": "",
 	"Share": "Deel Chat",
 	"Share Chat": "Deel Chat",
 	"Share to OpenWebUI Community": "Deel naar OpenWebUI Community",

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

@@ -44,7 +44,9 @@
 	"All Users": "ਸਾਰੇ ਉਪਭੋਗਤਾ",
 	"Allow": "ਅਨੁਮਤੀ",
 	"Allow Chat Deletion": "ਗੱਲਬਾਤ ਮਿਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "ਅਲਫ਼ਾਨਯੂਮੈਰਿਕ ਅੱਖਰ ਅਤੇ ਹਾਈਫਨ",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "ਐਮਬੈੱਡਿੰਗ ਮਾਡਲ ਇੰਜਣ",
 	"Embedding model set to \"{{embedding_model}}\"": "ਐਮਬੈੱਡਿੰਗ ਮਾਡਲ ਨੂੰ \"{{embedding_model}}\" 'ਤੇ ਸੈੱਟ ਕੀਤਾ ਗਿਆ",
 	"Enable Community Sharing": "ਕਮਿਊਨਿਟੀ ਸ਼ੇਅਰਿੰਗ ਨੂੰ ਸਮਰੱਥ ਕਰੋ",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "ਨਵੇਂ ਸਾਈਨ ਅਪ ਯੋਗ ਕਰੋ",
 	"Enable Web Search": "ਵੈੱਬ ਖੋਜ ਨੂੰ ਸਮਰੱਥ ਕਰੋ",
 	"Enabled": "",
@@ -561,7 +564,6 @@
 	"Set Voice": "ਆਵਾਜ਼ ਸੈੱਟ ਕਰੋ",
 	"Settings": "ਸੈਟਿੰਗਾਂ",
 	"Settings saved successfully!": "ਸੈਟਿੰਗਾਂ ਸਫਲਤਾਪੂਰਵਕ ਸੰਭਾਲੀਆਂ ਗਈਆਂ!",
-	"Settings updated successfully": "",
 	"Share": "ਸਾਂਝਾ ਕਰੋ",
 	"Share Chat": "ਗੱਲਬਾਤ ਸਾਂਝੀ ਕਰੋ",
 	"Share to OpenWebUI Community": "ਓਪਨਵੈਬਯੂਆਈ ਕਮਿਊਨਿਟੀ ਨਾਲ ਸਾਂਝਾ ਕਰੋ",

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

@@ -44,7 +44,9 @@
 	"All Users": "Wszyscy użytkownicy",
 	"Allow": "Pozwól",
 	"Allow Chat Deletion": "Pozwól na usuwanie czatu",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "znaki alfanumeryczne i myślniki",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Silnik modelu osadzania",
 	"Embedding model set to \"{{embedding_model}}\"": "Model osadzania ustawiono na \"{{embedding_model}}\"",
 	"Enable Community Sharing": "Włączanie udostępniania społecznościowego",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Włącz nowe rejestracje",
 	"Enable Web Search": "Włączanie wyszukiwania w Internecie",
 	"Enabled": "",
@@ -563,7 +566,6 @@
 	"Set Voice": "Ustaw głos",
 	"Settings": "Ustawienia",
 	"Settings saved successfully!": "Ustawienia zapisane pomyślnie!",
-	"Settings updated successfully": "",
 	"Share": "Udostępnij",
 	"Share Chat": "Udostępnij czat",
 	"Share to OpenWebUI Community": "Dziel się z społecznością OpenWebUI",

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

@@ -44,7 +44,9 @@
 	"All Users": "Todos os Usuários",
 	"Allow": "Permitir",
 	"Allow Chat Deletion": "Permitir Exclusão de Chats",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "Permitir vozes não locais",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "Permitir Localização do Usuário",
 	"Allow Voice Interruption in Call": "Permitir Interrupção de Voz na Chamada",
 	"alphanumeric characters and hyphens": "caracteres alfanuméricos e hífens",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Motor do Modelo de Embedding",
 	"Embedding model set to \"{{embedding_model}}\"": "Modelo de embedding definido para \"{{embedding_model}}\"",
 	"Enable Community Sharing": "Ativar Compartilhamento Comunitário",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Ativar Novos Cadastros",
 	"Enable Web Search": "Ativar Pesquisa na Web",
 	"Enabled": "Ativado",
@@ -562,7 +565,6 @@
 	"Set Voice": "Definir Voz",
 	"Settings": "Configurações",
 	"Settings saved successfully!": "Configurações salvas com sucesso!",
-	"Settings updated successfully": "Configurações atualizadas com sucesso",
 	"Share": "Compartilhar",
 	"Share Chat": "Compartilhar Chat",
 	"Share to OpenWebUI Community": "Compartilhar com a Comunidade OpenWebUI",

+ 3 - 1
src/lib/i18n/locales/pt-PT/translation.json

@@ -44,7 +44,9 @@
 	"All Users": "Todos os utilizadores",
 	"Allow": "Permitir",
 	"Allow Chat Deletion": "Permitir Exclusão de Conversa",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "Permitir vozes não locais",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "caracteres alfanuméricos e hífens",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Motor de Modelo de Embedding",
 	"Embedding model set to \"{{embedding_model}}\"": "Modelo de Embedding definido como \"{{embedding_model}}\"",
 	"Enable Community Sharing": "Active a Partilha da Comunidade",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Ativar Novas Inscrições",
 	"Enable Web Search": "Ativar pesquisa na Web",
 	"Enabled": "",
@@ -562,7 +565,6 @@
 	"Set Voice": "Definir Voz",
 	"Settings": "Configurações",
 	"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",

+ 3 - 1
src/lib/i18n/locales/ro-RO/translation.json

@@ -44,7 +44,9 @@
 	"All Users": "Toți Utilizatorii",
 	"Allow": "Permite",
 	"Allow Chat Deletion": "Permite Ștergerea Conversațiilor",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "Permite voci non-locale",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "Permite Localizarea Utilizatorului",
 	"Allow Voice Interruption in Call": "Permite Întreruperea Vocii în Apel",
 	"alphanumeric characters and hyphens": "caractere alfanumerice și cratime",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Motor de Model de Încapsulare",
 	"Embedding model set to \"{{embedding_model}}\"": "Modelul de încapsulare setat la \"{{embedding_model}}\"",
 	"Enable Community Sharing": "Activează Partajarea Comunitară",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Activează Înscrierile Noi",
 	"Enable Web Search": "Activează Căutarea pe Web",
 	"Enabled": "Activat",
@@ -562,7 +565,6 @@
 	"Set Voice": "Setează Voce",
 	"Settings": "Setări",
 	"Settings saved successfully!": "Setările au fost salvate cu succes!",
-	"Settings updated successfully": "Setările au fost actualizate cu succes",
 	"Share": "Partajează",
 	"Share Chat": "Partajează Conversația",
 	"Share to OpenWebUI Community": "Partajează cu Comunitatea OpenWebUI",

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

@@ -44,7 +44,9 @@
 	"All Users": "Все пользователи",
 	"Allow": "Разрешить",
 	"Allow Chat Deletion": "Разрешить удаление чата",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "Разрешить не локальные голоса",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "Разрешить доступ к местоположению пользователя",
 	"Allow Voice Interruption in Call": "Разрешить прерывание голоса во время вызова",
 	"alphanumeric characters and hyphens": "буквенно цифровые символы и дефисы",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Движок модели встраивания",
 	"Embedding model set to \"{{embedding_model}}\"": "Модель встраивания установлена в \"{{embedding_model}}\"",
 	"Enable Community Sharing": "Включить совместное использование",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Разрешить новые регистрации",
 	"Enable Web Search": "Включить поиск в Интернете",
 	"Enabled": "Включено",
@@ -500,7 +503,7 @@
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"RTL": "RTL",
-    "Run": "Запустить",
+	"Run": "Запустить",
 	"Run Llama 2, Code Llama, and other models. Customize and create your own.": "Запустите Llama 2, Code Llama и другие модели. Настройте и создайте свою собственную.",
 	"Running": "Выполняется",
 	"Save": "Сохранить",
@@ -563,7 +566,6 @@
 	"Set Voice": "Установить голос",
 	"Settings": "Настройки",
 	"Settings saved successfully!": "Настройки успешно сохранены!",
-	"Settings updated successfully": "Настройки успешно обновлены",
 	"Share": "Поделиться",
 	"Share Chat": "Поделиться чатом",
 	"Share to OpenWebUI Community": "Поделиться с сообществом OpenWebUI",

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

@@ -44,7 +44,9 @@
 	"All Users": "Сви корисници",
 	"Allow": "Дозволи",
 	"Allow Chat Deletion": "Дозволи брисање ћаскања",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "алфанумерички знакови и цртице",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Мотор модела уградње",
 	"Embedding model set to \"{{embedding_model}}\"": "Модел уградње подешен на \"{{embedding_model}}\"",
 	"Enable Community Sharing": "Омогући дељење заједнице",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Омогући нове пријаве",
 	"Enable Web Search": "Омогући Wеб претрагу",
 	"Enabled": "",
@@ -562,7 +565,6 @@
 	"Set Voice": "Подеси глас",
 	"Settings": "Подешавања",
 	"Settings saved successfully!": "Подешавања успешно сачувана!",
-	"Settings updated successfully": "",
 	"Share": "Подели",
 	"Share Chat": "Подели ћаскање",
 	"Share to OpenWebUI Community": "Подели са OpenWebUI заједницом",

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

@@ -44,7 +44,9 @@
 	"All Users": "Alla användare",
 	"Allow": "Tillåt",
 	"Allow Chat Deletion": "Tillåt chattborttagning",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "Tillåt icke-lokala röster",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "alfanumeriska tecken och bindestreck",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Motor för inbäddningsmodell",
 	"Embedding model set to \"{{embedding_model}}\"": "Inbäddningsmodell inställd på \"{{embedding_model}}\"",
 	"Enable Community Sharing": "Aktivera community-delning",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Aktivera nya registreringar",
 	"Enable Web Search": "Aktivera webbsökning",
 	"Enabled": "",
@@ -561,7 +564,6 @@
 	"Set Voice": "Ange röst",
 	"Settings": "Inställningar",
 	"Settings saved successfully!": "Inställningar sparades framgångsrikt!",
-	"Settings updated successfully": "Inställningar uppdaterades framgångsrikt",
 	"Share": "Dela",
 	"Share Chat": "Dela chatt",
 	"Share to OpenWebUI Community": "Dela till OpenWebUI Community",

+ 3 - 1
src/lib/i18n/locales/th-TH/translation.json

@@ -44,7 +44,9 @@
 	"All Users": "ผู้ใช้ทั้งหมด",
 	"Allow": "อนุญาต",
 	"Allow Chat Deletion": "อนุญาตการลบการสนทนา",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "อนุญาตเสียงที่ไม่ใช่ท้องถิ่น",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "อนุญาตตำแหน่งผู้ใช้",
 	"Allow Voice Interruption in Call": "อนุญาตการแทรกเสียงในสาย",
 	"alphanumeric characters and hyphens": "อักขระตัวเลขและขีดกลาง",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "เครื่องยนต์โมเดลการฝัง",
 	"Embedding model set to \"{{embedding_model}}\"": "ตั้งค่าโมเดลการฝังเป็น \"{{embedding_model}}\"",
 	"Enable Community Sharing": "เปิดใช้งานการแชร์ในชุมชน",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "เปิดใช้งานการสมัครใหม่",
 	"Enable Web Search": "เปิดใช้งานการค้นหาเว็บ",
 	"Enabled": "เปิดใช้งาน",
@@ -561,7 +564,6 @@
 	"Set Voice": "ตั้งค่าเสียง",
 	"Settings": "การตั้งค่า",
 	"Settings saved successfully!": "บันทึกการตั้งค่าเรียบร้อยแล้ว!",
-	"Settings updated successfully": "อัปเดตการตั้งค่าเรียบร้อยแล้ว",
 	"Share": "แชร์",
 	"Share Chat": "แชร์แชท",
 	"Share to OpenWebUI Community": "แชร์ไปยังชุมชน OpenWebUI",

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

@@ -44,7 +44,9 @@
 	"All Users": "",
 	"Allow": "",
 	"Allow Chat Deletion": "",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "",
 	"Allow Voice Interruption in Call": "",
 	"alphanumeric characters and hyphens": "",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "",
 	"Embedding model set to \"{{embedding_model}}\"": "",
 	"Enable Community Sharing": "",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "",
 	"Enable Web Search": "",
 	"Enabled": "",
@@ -561,7 +564,6 @@
 	"Set Voice": "",
 	"Settings": "",
 	"Settings saved successfully!": "",
-	"Settings updated successfully": "",
 	"Share": "",
 	"Share Chat": "",
 	"Share to OpenWebUI Community": "",

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

@@ -44,7 +44,9 @@
 	"All Users": "Tüm Kullanıcılar",
 	"Allow": "İzin ver",
 	"Allow Chat Deletion": "Sohbet Silmeye İzin Ver",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "Yerel olmayan seslere izin verin",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "Kullanıcı Konumuna İzin Ver",
 	"Allow Voice Interruption in Call": "Aramada Ses Kesintisine İzin Ver",
 	"alphanumeric characters and hyphens": "alfanumerik karakterler ve tireler",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Gömme Modeli Motoru",
 	"Embedding model set to \"{{embedding_model}}\"": "Gömme modeli \"{{embedding_model}}\" olarak ayarlandı",
 	"Enable Community Sharing": "Topluluk Paylaşımını Etkinleştir",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Yeni Kayıtları Etkinleştir",
 	"Enable Web Search": "Web Aramasını Etkinleştir",
 	"Enabled": "",
@@ -561,7 +564,6 @@
 	"Set Voice": "Ses Ayarla",
 	"Settings": "Ayarlar",
 	"Settings saved successfully!": "Ayarlar başarıyla kaydedildi!",
-	"Settings updated successfully": "Ayarlar başarıyla güncellendi",
 	"Share": "Paylaş",
 	"Share Chat": "Sohbeti Paylaş",
 	"Share to OpenWebUI Community": "OpenWebUI Topluluğu ile Paylaş",

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

@@ -44,7 +44,9 @@
 	"All Users": "Всі користувачі",
 	"Allow": "Дозволити",
 	"Allow Chat Deletion": "Дозволити видалення чату",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "Дозволити не локальні голоси",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "Доступ до місцезнаходження",
 	"Allow Voice Interruption in Call": "Дозволити переривання голосу під час виклику",
 	"alphanumeric characters and hyphens": "алфавітно-цифрові символи та дефіси",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Рушій моделі вбудовування ",
 	"Embedding model set to \"{{embedding_model}}\"": "Встановлена модель вбудовування \"{{embedding_model}}\"",
 	"Enable Community Sharing": "Увімкнути спільний доступ",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Дозволити нові реєстрації",
 	"Enable Web Search": "Увімкнути веб-пошук",
 	"Enabled": "Увімкнено",
@@ -563,7 +566,6 @@
 	"Set Voice": "Встановити голос",
 	"Settings": "Налаштування",
 	"Settings saved successfully!": "Налаштування успішно збережено!",
-	"Settings updated successfully": "Налаштування успішно оновлені",
 	"Share": "Поділитися",
 	"Share Chat": "Поділитися чатом",
 	"Share to OpenWebUI Community": "Поділитися зі спільнотою OpenWebUI",

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

@@ -44,7 +44,9 @@
 	"All Users": "Danh sách người sử dụng",
 	"Allow": "Cho phép",
 	"Allow Chat Deletion": "Cho phép Xóa nội dung chat",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "Cho phép giọng nói không bản xứ",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "Cho phép sử dụng vị trí người dùng",
 	"Allow Voice Interruption in Call": "Cho phép gián đoạn giọng nói trong cuộc gọi",
 	"alphanumeric characters and hyphens": "ký tự số và gạch nối",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "Trình xử lý embedding",
 	"Embedding model set to \"{{embedding_model}}\"": "Mô hình embedding đã được thiết lập thành \"{{embedding_model}}\"",
 	"Enable Community Sharing": "Kích hoạt Chia sẻ Cộng đồng",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "Cho phép đăng ký mới",
 	"Enable Web Search": "Kích hoạt tìm kiếm Web",
 	"Enabled": "Đã bật",
@@ -560,7 +563,6 @@
 	"Set Voice": "Đặt Giọng nói",
 	"Settings": "Cài đặt",
 	"Settings saved successfully!": "Cài đặt đã được lưu thành công!",
-	"Settings updated successfully": "Các cài đặt đã được cập nhật thành công",
 	"Share": "Chia sẻ",
 	"Share Chat": "Chia sẻ Chat",
 	"Share to OpenWebUI Community": "Chia sẻ đến Cộng đồng OpenWebUI",

+ 3 - 1
src/lib/i18n/locales/zh-CN/translation.json

@@ -44,7 +44,9 @@
 	"All Users": "所有用户",
 	"Allow": "允许",
 	"Allow Chat Deletion": "允许删除聊天记录",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "允许调用非本地音色",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "允许获取您的位置",
 	"Allow Voice Interruption in Call": "允许通话中的打断语音",
 	"alphanumeric characters and hyphens": "字母数字字符和连字符",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "语义向量模型引擎",
 	"Embedding model set to \"{{embedding_model}}\"": "语义向量模型设置为 \"{{embedding_model}}\"",
 	"Enable Community Sharing": "启用分享至社区",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "允许新用户注册",
 	"Enable Web Search": "启用网络搜索",
 	"Enabled": "启用",
@@ -560,7 +563,6 @@
 	"Set Voice": "设置音色",
 	"Settings": "设置",
 	"Settings saved successfully!": "设置已保存",
-	"Settings updated successfully": "设置成功更新",
 	"Share": "分享",
 	"Share Chat": "分享对话",
 	"Share to OpenWebUI Community": "分享到 OpenWebUI 社区",

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

@@ -44,7 +44,9 @@
 	"All Users": "所有使用者",
 	"Allow": "允許",
 	"Allow Chat Deletion": "允許刪除對話紀錄",
+	"Allow Chat Editing": "",
 	"Allow non-local voices": "允許非本機語音",
+	"Allow Temporary Chat": "",
 	"Allow User Location": "允許使用者位置",
 	"Allow Voice Interruption in Call": "允許在通話中打斷語音",
 	"alphanumeric characters and hyphens": "英文字母、數字和連字號",
@@ -220,6 +222,7 @@
 	"Embedding Model Engine": "嵌入模型引擎",
 	"Embedding model set to \"{{embedding_model}}\"": "嵌入模型已設定為 \"{{embedding_model}}\"",
 	"Enable Community Sharing": "啟用社群分享",
+	"Enable Message Rating": "",
 	"Enable New Sign Ups": "允許新使用者註冊",
 	"Enable Web Search": "啟用網頁搜尋",
 	"Enabled": "已啟用",
@@ -561,7 +564,6 @@
 	"Set Voice": "設定語音",
 	"Settings": "設定",
 	"Settings saved successfully!": "設定已成功儲存",
-	"Settings updated successfully": "設定已成功更新",
 	"Share": "分享",
 	"Share Chat": "分享對話",
 	"Share to OpenWebUI Community": "分享到 OpenWebUI 社群",

+ 19 - 0
src/lib/stores/index.ts

@@ -52,20 +52,39 @@ type BaseModel = {
 	id: string;
 	name: string;
 	info?: ModelConfig;
+	owned_by: 'ollama' | 'openai';
 };
 
 export interface OpenAIModel extends BaseModel {
+	owned_by: 'openai';
 	external: boolean;
 	source?: string;
 }
 
 export interface OllamaModel extends BaseModel {
+	owned_by: 'ollama';
 	details: OllamaModelDetails;
 	size: number;
 	description: string;
 	model: string;
 	modified_at: string;
 	digest: string;
+	ollama?: {
+		name?: string;
+		model?: string;
+		modified_at: string;
+		size?: number;
+		digest?: string;
+		details?: {
+			parent_model?: string;
+			format?: string;
+			family?: string;
+			families?: string[];
+			parameter_size?: string;
+			quantization_level?: string;
+		};
+		urls?: number[];
+	};
 }
 
 type OllamaModelDetails = {

+ 0 - 1
src/routes/(app)/+layout.svelte

@@ -180,7 +180,6 @@
 			await tick();
 		}
 
-		await mermaid.initialize({ startOnLoad: false });
 		loaded = true;
 	});
 </script>

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

@@ -160,6 +160,7 @@
 					if (sessionUser) {
 						// Save Session User to Store
 						await user.set(sessionUser);
+						await config.set(await getBackendConfig());
 					} else {
 						// Redirect Invalid Session User to /auth Page
 						localStorage.removeItem('token');