Przeglądaj źródła

Merge remote-tracking branch 'upstream/dev' into feat/backend-web-search

Jun Siang Cheah 11 miesięcy temu
rodzic
commit
276b7b90b8
100 zmienionych plików z 1229 dodań i 1666 usunięć
  1. 1 5
      .env.example
  2. 4 9
      Dockerfile
  3. 0 388
      backend/apps/litellm/main.py
  4. 6 3
      backend/apps/ollama/main.py
  5. 2 2
      backend/apps/openai/main.py
  6. 1 1
      backend/apps/rag/main.py
  7. 0 144
      backend/apps/web/models/modelfiles.py
  8. 3 1
      backend/apps/webui/internal/db.py
  9. 0 0
      backend/apps/webui/internal/migrations/001_initial_schema.py
  10. 0 0
      backend/apps/webui/internal/migrations/002_add_local_sharing.py
  11. 0 0
      backend/apps/webui/internal/migrations/003_add_auth_api_key.py
  12. 0 0
      backend/apps/webui/internal/migrations/004_add_archived.py
  13. 0 0
      backend/apps/webui/internal/migrations/005_add_updated_at.py
  14. 0 0
      backend/apps/webui/internal/migrations/006_migrate_timestamps_and_charfields.py
  15. 0 0
      backend/apps/webui/internal/migrations/007_add_user_last_active_at.py
  16. 0 0
      backend/apps/webui/internal/migrations/008_add_memory.py
  17. 0 0
      backend/apps/webui/internal/migrations/009_add_models.py
  18. 0 0
      backend/apps/webui/internal/migrations/010_migrate_modelfiles_to_models.py
  19. 1 1
      backend/apps/webui/internal/migrations/README.md
  20. 1 1
      backend/apps/webui/main.py
  21. 2 2
      backend/apps/webui/models/auths.py
  22. 39 11
      backend/apps/webui/models/chats.py
  23. 1 1
      backend/apps/webui/models/documents.py
  24. 2 2
      backend/apps/webui/models/memories.py
  25. 1 1
      backend/apps/webui/models/models.py
  26. 1 1
      backend/apps/webui/models/prompts.py
  27. 1 1
      backend/apps/webui/models/tags.py
  28. 2 2
      backend/apps/webui/models/users.py
  29. 2 2
      backend/apps/webui/routers/auths.py
  30. 52 40
      backend/apps/webui/routers/chats.py
  31. 1 1
      backend/apps/webui/routers/configs.py
  32. 1 1
      backend/apps/webui/routers/documents.py
  33. 1 1
      backend/apps/webui/routers/memories.py
  34. 4 4
      backend/apps/webui/routers/models.py
  35. 1 1
      backend/apps/webui/routers/prompts.py
  36. 3 3
      backend/apps/webui/routers/users.py
  37. 1 1
      backend/apps/webui/routers/utils.py
  38. 10 18
      backend/config.py
  39. 7 31
      backend/main.py
  40. 0 2
      backend/requirements.txt
  41. 0 43
      backend/space/litellm_config.yaml
  42. 0 5
      backend/start.sh
  43. 1 1
      backend/utils/models.py
  44. 1 1
      backend/utils/utils.py
  45. 3 7
      requirements-dev.lock
  46. 3 7
      requirements.lock
  47. 32 0
      src/lib/apis/chats/index.ts
  48. 0 151
      src/lib/apis/litellm/index.ts
  49. 13 4
      src/lib/apis/models/index.ts
  50. 1 1
      src/lib/apis/ollama/index.ts
  51. 45 6
      src/lib/components/admin/Settings/Database.svelte
  52. 3 10
      src/lib/components/chat/Chat.svelte
  53. 8 1
      src/lib/components/chat/Messages/ResponseMessage.svelte
  54. 162 98
      src/lib/components/chat/Settings/Chats.svelte
  55. 1 1
      src/lib/components/chat/Settings/General.svelte
  56. 21 7
      src/lib/components/chat/Settings/Models.svelte
  57. 3 3
      src/lib/components/common/Spinner.svelte
  58. 135 90
      src/lib/components/layout/Sidebar/ArchivedChatsModal.svelte
  59. 48 1
      src/lib/components/workspace/Models.svelte
  60. 3 16
      src/lib/components/workspace/Playground.svelte
  61. 0 1
      src/lib/constants.ts
  62. 4 3
      src/lib/i18n/locales/ar-BH/translation.json
  63. 4 3
      src/lib/i18n/locales/bg-BG/translation.json
  64. 4 3
      src/lib/i18n/locales/bn-BD/translation.json
  65. 4 3
      src/lib/i18n/locales/ca-ES/translation.json
  66. 4 3
      src/lib/i18n/locales/ceb-PH/translation.json
  67. 4 3
      src/lib/i18n/locales/de-DE/translation.json
  68. 4 3
      src/lib/i18n/locales/dg-DG/translation.json
  69. 4 3
      src/lib/i18n/locales/en-GB/translation.json
  70. 4 3
      src/lib/i18n/locales/en-US/translation.json
  71. 4 3
      src/lib/i18n/locales/es-ES/translation.json
  72. 4 3
      src/lib/i18n/locales/fa-IR/translation.json
  73. 4 3
      src/lib/i18n/locales/fi-FI/translation.json
  74. 4 3
      src/lib/i18n/locales/fr-CA/translation.json
  75. 174 173
      src/lib/i18n/locales/fr-FR/translation.json
  76. 4 3
      src/lib/i18n/locales/he-IL/translation.json
  77. 4 3
      src/lib/i18n/locales/hi-IN/translation.json
  78. 4 3
      src/lib/i18n/locales/hr-HR/translation.json
  79. 4 3
      src/lib/i18n/locales/it-IT/translation.json
  80. 4 3
      src/lib/i18n/locales/ja-JP/translation.json
  81. 4 3
      src/lib/i18n/locales/ka-GE/translation.json
  82. 4 3
      src/lib/i18n/locales/ko-KR/translation.json
  83. 4 3
      src/lib/i18n/locales/nl-NL/translation.json
  84. 4 3
      src/lib/i18n/locales/pa-IN/translation.json
  85. 4 3
      src/lib/i18n/locales/pl-PL/translation.json
  86. 4 3
      src/lib/i18n/locales/pt-BR/translation.json
  87. 4 3
      src/lib/i18n/locales/pt-PT/translation.json
  88. 4 3
      src/lib/i18n/locales/ru-RU/translation.json
  89. 4 3
      src/lib/i18n/locales/sr-RS/translation.json
  90. 4 3
      src/lib/i18n/locales/sv-SE/translation.json
  91. 4 3
      src/lib/i18n/locales/tr-TR/translation.json
  92. 4 3
      src/lib/i18n/locales/uk-UA/translation.json
  93. 4 3
      src/lib/i18n/locales/vi-VN/translation.json
  94. 4 3
      src/lib/i18n/locales/zh-CN/translation.json
  95. 4 3
      src/lib/i18n/locales/zh-TW/translation.json
  96. 2 2
      src/lib/stores/index.ts
  97. 2 1
      src/lib/utils/index.ts
  98. 78 0
      src/routes/(app)/admin/+layout.svelte
  99. 204 251
      src/routes/(app)/admin/+page.svelte
  100. 3 5
      src/routes/(app)/workspace/models/create/+page.svelte

+ 1 - 5
.env.example

@@ -10,8 +10,4 @@ OPENAI_API_KEY=''
 # DO NOT TRACK
 # DO NOT TRACK
 SCARF_NO_ANALYTICS=true
 SCARF_NO_ANALYTICS=true
 DO_NOT_TRACK=true
 DO_NOT_TRACK=true
-ANONYMIZED_TELEMETRY=false
-
-# Use locally bundled version of the LiteLLM cost map json
-# to avoid repetitive startup connections
-LITELLM_LOCAL_MODEL_COST_MAP="True"
+ANONYMIZED_TELEMETRY=false

+ 4 - 9
Dockerfile

@@ -59,11 +59,6 @@ ENV OPENAI_API_KEY="" \
     DO_NOT_TRACK=true \
     DO_NOT_TRACK=true \
     ANONYMIZED_TELEMETRY=false
     ANONYMIZED_TELEMETRY=false
 
 
-# Use locally bundled version of the LiteLLM cost map json
-# to avoid repetitive startup connections
-ENV LITELLM_LOCAL_MODEL_COST_MAP="True"
-
-
 #### Other models #########################################################
 #### Other models #########################################################
 ## whisper TTS model settings ##
 ## whisper TTS model settings ##
 ENV WHISPER_MODEL="base" \
 ENV WHISPER_MODEL="base" \
@@ -83,10 +78,10 @@ WORKDIR /app/backend
 ENV HOME /root
 ENV HOME /root
 # Create user and group if not root
 # Create user and group if not root
 RUN if [ $UID -ne 0 ]; then \
 RUN if [ $UID -ne 0 ]; then \
-      if [ $GID -ne 0 ]; then \
-        addgroup --gid $GID app; \
-      fi; \
-      adduser --uid $UID --gid $GID --home $HOME --disabled-password --no-create-home app; \
+    if [ $GID -ne 0 ]; then \
+    addgroup --gid $GID app; \
+    fi; \
+    adduser --uid $UID --gid $GID --home $HOME --disabled-password --no-create-home app; \
     fi
     fi
 
 
 RUN mkdir -p $HOME/.cache/chroma
 RUN mkdir -p $HOME/.cache/chroma

+ 0 - 388
backend/apps/litellm/main.py

@@ -1,388 +0,0 @@
-import sys
-from contextlib import asynccontextmanager
-
-from fastapi import FastAPI, Depends, HTTPException
-from fastapi.routing import APIRoute
-from fastapi.middleware.cors import CORSMiddleware
-
-import logging
-from fastapi import FastAPI, Request, Depends, status, Response
-from fastapi.responses import JSONResponse
-
-from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint
-from starlette.responses import StreamingResponse
-import json
-import time
-import requests
-
-from pydantic import BaseModel, ConfigDict
-from typing import Optional, List
-
-from apps.web.models.models import Models
-from utils.utils import get_verified_user, get_current_user, get_admin_user
-from config import SRC_LOG_LEVELS
-from constants import MESSAGES
-
-import os
-
-log = logging.getLogger(__name__)
-log.setLevel(SRC_LOG_LEVELS["LITELLM"])
-
-
-from config import (
-    ENABLE_LITELLM,
-    ENABLE_MODEL_FILTER,
-    MODEL_FILTER_LIST,
-    DATA_DIR,
-    LITELLM_PROXY_PORT,
-    LITELLM_PROXY_HOST,
-)
-
-import warnings
-
-warnings.simplefilter("ignore")
-
-from litellm.utils import get_llm_provider
-
-import asyncio
-import subprocess
-import yaml
-
-
-@asynccontextmanager
-async def lifespan(app: FastAPI):
-    log.info("startup_event")
-    # TODO: Check config.yaml file and create one
-    asyncio.create_task(start_litellm_background())
-    yield
-
-
-app = FastAPI(lifespan=lifespan)
-
-origins = ["*"]
-
-app.add_middleware(
-    CORSMiddleware,
-    allow_origins=origins,
-    allow_credentials=True,
-    allow_methods=["*"],
-    allow_headers=["*"],
-)
-
-
-LITELLM_CONFIG_DIR = f"{DATA_DIR}/litellm/config.yaml"
-
-with open(LITELLM_CONFIG_DIR, "r") as file:
-    litellm_config = yaml.safe_load(file)
-
-
-app.state.ENABLE_MODEL_FILTER = ENABLE_MODEL_FILTER.value
-app.state.MODEL_FILTER_LIST = MODEL_FILTER_LIST.value
-app.state.MODEL_CONFIG = Models.get_all_models()
-
-app.state.ENABLE = ENABLE_LITELLM
-app.state.CONFIG = litellm_config
-
-# Global variable to store the subprocess reference
-background_process = None
-
-CONFLICT_ENV_VARS = [
-    # Uvicorn uses PORT, so LiteLLM might use it as well
-    "PORT",
-    # LiteLLM uses DATABASE_URL for Prisma connections
-    "DATABASE_URL",
-]
-
-
-async def run_background_process(command):
-    global background_process
-    log.info("run_background_process")
-
-    try:
-        # Log the command to be executed
-        log.info(f"Executing command: {command}")
-        # Filter environment variables known to conflict with litellm
-        env = {k: v for k, v in os.environ.items() if k not in CONFLICT_ENV_VARS}
-        # Execute the command and create a subprocess
-        process = await asyncio.create_subprocess_exec(
-            *command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env
-        )
-        background_process = process
-        log.info("Subprocess started successfully.")
-
-        # Capture STDERR for debugging purposes
-        stderr_output = await process.stderr.read()
-        stderr_text = stderr_output.decode().strip()
-        if stderr_text:
-            log.info(f"Subprocess STDERR: {stderr_text}")
-
-        # log.info output line by line
-        async for line in process.stdout:
-            log.info(line.decode().strip())
-
-        # Wait for the process to finish
-        returncode = await process.wait()
-        log.info(f"Subprocess exited with return code {returncode}")
-    except Exception as e:
-        log.error(f"Failed to start subprocess: {e}")
-        raise  # Optionally re-raise the exception if you want it to propagate
-
-
-async def start_litellm_background():
-    log.info("start_litellm_background")
-    # Command to run in the background
-    command = [
-        "litellm",
-        "--port",
-        str(LITELLM_PROXY_PORT),
-        "--host",
-        LITELLM_PROXY_HOST,
-        "--telemetry",
-        "False",
-        "--config",
-        LITELLM_CONFIG_DIR,
-    ]
-
-    await run_background_process(command)
-
-
-async def shutdown_litellm_background():
-    log.info("shutdown_litellm_background")
-    global background_process
-    if background_process:
-        background_process.terminate()
-        await background_process.wait()  # Ensure the process has terminated
-        log.info("Subprocess terminated")
-        background_process = None
-
-
-@app.get("/")
-async def get_status():
-    return {"status": True}
-
-
-async def restart_litellm():
-    """
-    Endpoint to restart the litellm background service.
-    """
-    log.info("Requested restart of litellm service.")
-    try:
-        # Shut down the existing process if it is running
-        await shutdown_litellm_background()
-        log.info("litellm service shutdown complete.")
-
-        # Restart the background service
-
-        asyncio.create_task(start_litellm_background())
-        log.info("litellm service restart complete.")
-
-        return {
-            "status": "success",
-            "message": "litellm service restarted successfully.",
-        }
-    except Exception as e:
-        log.info(f"Error restarting litellm service: {e}")
-        raise HTTPException(
-            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)
-        )
-
-
-@app.get("/restart")
-async def restart_litellm_handler(user=Depends(get_admin_user)):
-    return await restart_litellm()
-
-
-@app.get("/config")
-async def get_config(user=Depends(get_admin_user)):
-    return app.state.CONFIG
-
-
-class LiteLLMConfigForm(BaseModel):
-    general_settings: Optional[dict] = None
-    litellm_settings: Optional[dict] = None
-    model_list: Optional[List[dict]] = None
-    router_settings: Optional[dict] = None
-
-    model_config = ConfigDict(protected_namespaces=())
-
-
-@app.post("/config/update")
-async def update_config(form_data: LiteLLMConfigForm, user=Depends(get_admin_user)):
-    app.state.CONFIG = form_data.model_dump(exclude_none=True)
-
-    with open(LITELLM_CONFIG_DIR, "w") as file:
-        yaml.dump(app.state.CONFIG, file)
-
-    await restart_litellm()
-    return app.state.CONFIG
-
-
-@app.get("/models")
-@app.get("/v1/models")
-async def get_models(user=Depends(get_current_user)):
-
-    if app.state.ENABLE:
-        while not background_process:
-            await asyncio.sleep(0.1)
-
-        url = f"http://localhost:{LITELLM_PROXY_PORT}/v1"
-        r = None
-        try:
-            r = requests.request(method="GET", url=f"{url}/models")
-            r.raise_for_status()
-
-            data = r.json()
-
-            if app.state.ENABLE_MODEL_FILTER:
-                if user and user.role == "user":
-                    data["data"] = list(
-                        filter(
-                            lambda model: model["id"] in app.state.MODEL_FILTER_LIST,
-                            data["data"],
-                        )
-                    )
-
-            return data
-        except Exception as e:
-
-            log.exception(e)
-            error_detail = "Open WebUI: Server Connection Error"
-            if r is not None:
-                try:
-                    res = r.json()
-                    if "error" in res:
-                        error_detail = f"External: {res['error']}"
-                except:
-                    error_detail = f"External: {e}"
-
-            return {
-                "data": [
-                    {
-                        "id": model["model_name"],
-                        "object": "model",
-                        "created": int(time.time()),
-                        "owned_by": "openai",
-                        "custom_info": next(
-                            (
-                                item
-                                for item in app.state.MODEL_CONFIG
-                                if item.id == model["model_name"]
-                            ),
-                            None,
-                        ),
-                    }
-                    for model in app.state.CONFIG["model_list"]
-                ],
-                "object": "list",
-            }
-    else:
-        return {
-            "data": [],
-            "object": "list",
-        }
-
-
-@app.get("/model/info")
-async def get_model_list(user=Depends(get_admin_user)):
-    return {"data": app.state.CONFIG["model_list"]}
-
-
-class AddLiteLLMModelForm(BaseModel):
-    model_name: str
-    litellm_params: dict
-
-    model_config = ConfigDict(protected_namespaces=())
-
-
-@app.post("/model/new")
-async def add_model_to_config(
-    form_data: AddLiteLLMModelForm, user=Depends(get_admin_user)
-):
-    try:
-        get_llm_provider(model=form_data.model_name)
-        app.state.CONFIG["model_list"].append(form_data.model_dump())
-
-        with open(LITELLM_CONFIG_DIR, "w") as file:
-            yaml.dump(app.state.CONFIG, file)
-
-        await restart_litellm()
-
-        return {"message": MESSAGES.MODEL_ADDED(form_data.model_name)}
-    except Exception as e:
-        print(e)
-        raise HTTPException(
-            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)
-        )
-
-
-class DeleteLiteLLMModelForm(BaseModel):
-    id: str
-
-
-@app.post("/model/delete")
-async def delete_model_from_config(
-    form_data: DeleteLiteLLMModelForm, user=Depends(get_admin_user)
-):
-    app.state.CONFIG["model_list"] = [
-        model
-        for model in app.state.CONFIG["model_list"]
-        if model["model_name"] != form_data.id
-    ]
-
-    with open(LITELLM_CONFIG_DIR, "w") as file:
-        yaml.dump(app.state.CONFIG, file)
-
-    await restart_litellm()
-
-    return {"message": MESSAGES.MODEL_DELETED(form_data.id)}
-
-
-@app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE"])
-async def proxy(path: str, request: Request, user=Depends(get_verified_user)):
-    body = await request.body()
-
-    url = f"http://localhost:{LITELLM_PROXY_PORT}"
-
-    target_url = f"{url}/{path}"
-
-    headers = {}
-    # headers["Authorization"] = f"Bearer {key}"
-    headers["Content-Type"] = "application/json"
-
-    r = None
-
-    try:
-        r = requests.request(
-            method=request.method,
-            url=target_url,
-            data=body,
-            headers=headers,
-            stream=True,
-        )
-
-        r.raise_for_status()
-
-        # Check if response is SSE
-        if "text/event-stream" in r.headers.get("Content-Type", ""):
-            return StreamingResponse(
-                r.iter_content(chunk_size=8192),
-                status_code=r.status_code,
-                headers=dict(r.headers),
-            )
-        else:
-            response_data = r.json()
-            return response_data
-    except Exception as e:
-        log.exception(e)
-        error_detail = "Open WebUI: Server Connection Error"
-        if r is not None:
-            try:
-                res = r.json()
-                if "error" in res:
-                    error_detail = f"External: {res['error']['message'] if 'message' in res['error'] else res['error']}"
-            except:
-                error_detail = f"External: {e}"
-
-        raise HTTPException(
-            status_code=r.status_code if r else 500, detail=error_detail
-        )

+ 6 - 3
backend/apps/ollama/main.py

@@ -29,8 +29,8 @@ import time
 from urllib.parse import urlparse
 from urllib.parse import urlparse
 from typing import Optional, List, Union
 from typing import Optional, List, Union
 
 
-from apps.web.models.models import Models
-from apps.web.models.users import Users
+from apps.webui.models.models import Models
+from apps.webui.models.users import Users
 from constants import ERROR_MESSAGES
 from constants import ERROR_MESSAGES
 from utils.utils import (
 from utils.utils import (
     decode_token,
     decode_token,
@@ -306,6 +306,9 @@ async def pull_model(
 
 
     r = None
     r = None
 
 
+    # Admin should be able to pull models from any source
+    payload = {**form_data.model_dump(exclude_none=True), "insecure": True}
+
     def get_request():
     def get_request():
         nonlocal url
         nonlocal url
         nonlocal r
         nonlocal r
@@ -333,7 +336,7 @@ async def pull_model(
             r = requests.request(
             r = requests.request(
                 method="POST",
                 method="POST",
                 url=f"{url}/api/pull",
                 url=f"{url}/api/pull",
-                data=form_data.model_dump_json(exclude_none=True).encode(),
+                data=json.dumps(payload),
                 stream=True,
                 stream=True,
             )
             )
 
 

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

@@ -10,8 +10,8 @@ import logging
 
 
 from pydantic import BaseModel
 from pydantic import BaseModel
 
 
-from apps.web.models.models import Models
-from apps.web.models.users import Users
+from apps.webui.models.models import Models
+from apps.webui.models.users import Users
 from constants import ERROR_MESSAGES
 from constants import ERROR_MESSAGES
 from utils.utils import (
 from utils.utils import (
     decode_token,
     decode_token,

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

@@ -46,7 +46,7 @@ import json
 
 
 import sentence_transformers
 import sentence_transformers
 
 
-from apps.web.models.documents import (
+from apps.webui.models.documents import (
     Documents,
     Documents,
     DocumentForm,
     DocumentForm,
     DocumentResponse,
     DocumentResponse,

+ 0 - 144
backend/apps/web/models/modelfiles.py

@@ -1,144 +0,0 @@
-################################################################################
-#                              DEPRECATION NOTICE                              #
-#                                                                              #
-# This file has been deprecated since version 0.2.0.                           #
-#                                                                              #
-################################################################################
-
-
-from pydantic import BaseModel
-from peewee import *
-from playhouse.shortcuts import model_to_dict
-from typing import List, Union, Optional
-import time
-
-from utils.utils import decode_token
-from utils.misc import get_gravatar_url
-
-from apps.web.internal.db import DB
-
-import json
-
-####################
-# Modelfile DB Schema
-####################
-
-
-class Modelfile(Model):
-    tag_name = CharField(unique=True)
-    user_id = CharField()
-    modelfile = TextField()
-    timestamp = BigIntegerField()
-
-    class Meta:
-        database = DB
-
-
-class ModelfileModel(BaseModel):
-    tag_name: str
-    user_id: str
-    modelfile: str
-    timestamp: int  # timestamp in epoch
-
-
-####################
-# Forms
-####################
-
-
-class ModelfileForm(BaseModel):
-    modelfile: dict
-
-
-class ModelfileTagNameForm(BaseModel):
-    tag_name: str
-
-
-class ModelfileUpdateForm(ModelfileForm, ModelfileTagNameForm):
-    pass
-
-
-class ModelfileResponse(BaseModel):
-    tag_name: str
-    user_id: str
-    modelfile: dict
-    timestamp: int  # timestamp in epoch
-
-
-class ModelfilesTable:
-
-    def __init__(self, db):
-        self.db = db
-        self.db.create_tables([Modelfile])
-
-    def insert_new_modelfile(
-        self, user_id: str, form_data: ModelfileForm
-    ) -> Optional[ModelfileModel]:
-        if "tagName" in form_data.modelfile:
-            modelfile = ModelfileModel(
-                **{
-                    "user_id": user_id,
-                    "tag_name": form_data.modelfile["tagName"],
-                    "modelfile": json.dumps(form_data.modelfile),
-                    "timestamp": int(time.time()),
-                }
-            )
-
-            try:
-                result = Modelfile.create(**modelfile.model_dump())
-                if result:
-                    return modelfile
-                else:
-                    return None
-            except:
-                return None
-
-        else:
-            return None
-
-    def get_modelfile_by_tag_name(self, tag_name: str) -> Optional[ModelfileModel]:
-        try:
-            modelfile = Modelfile.get(Modelfile.tag_name == tag_name)
-            return ModelfileModel(**model_to_dict(modelfile))
-        except:
-            return None
-
-    def get_modelfiles(self, skip: int = 0, limit: int = 50) -> List[ModelfileResponse]:
-        return [
-            ModelfileResponse(
-                **{
-                    **model_to_dict(modelfile),
-                    "modelfile": json.loads(modelfile.modelfile),
-                }
-            )
-            for modelfile in Modelfile.select()
-            # .limit(limit).offset(skip)
-        ]
-
-    def update_modelfile_by_tag_name(
-        self, tag_name: str, modelfile: dict
-    ) -> Optional[ModelfileModel]:
-        try:
-            query = Modelfile.update(
-                modelfile=json.dumps(modelfile),
-                timestamp=int(time.time()),
-            ).where(Modelfile.tag_name == tag_name)
-
-            query.execute()
-
-            modelfile = Modelfile.get(Modelfile.tag_name == tag_name)
-            return ModelfileModel(**model_to_dict(modelfile))
-        except:
-            return None
-
-    def delete_modelfile_by_tag_name(self, tag_name: str) -> bool:
-        try:
-            query = Modelfile.delete().where((Modelfile.tag_name == tag_name))
-            query.execute()  # Remove the rows, return number of rows removed.
-
-            return True
-        except:
-            return False
-
-
-Modelfiles = ModelfilesTable(DB)

+ 3 - 1
backend/apps/web/internal/db.py → backend/apps/webui/internal/db.py

@@ -31,7 +31,9 @@ else:
 DB = connect(DATABASE_URL)
 DB = connect(DATABASE_URL)
 log.info(f"Connected to a {DB.__class__.__name__} database.")
 log.info(f"Connected to a {DB.__class__.__name__} database.")
 router = Router(
 router = Router(
-    DB, migrate_dir=BACKEND_DIR / "apps" / "web" / "internal" / "migrations", logger=log
+    DB,
+    migrate_dir=BACKEND_DIR / "apps" / "webui" / "internal" / "migrations",
+    logger=log,
 )
 )
 router.run()
 router.run()
 DB.connect(reuse_if_open=True)
 DB.connect(reuse_if_open=True)

+ 0 - 0
backend/apps/web/internal/migrations/001_initial_schema.py → backend/apps/webui/internal/migrations/001_initial_schema.py


+ 0 - 0
backend/apps/web/internal/migrations/002_add_local_sharing.py → backend/apps/webui/internal/migrations/002_add_local_sharing.py


+ 0 - 0
backend/apps/web/internal/migrations/003_add_auth_api_key.py → backend/apps/webui/internal/migrations/003_add_auth_api_key.py


+ 0 - 0
backend/apps/web/internal/migrations/004_add_archived.py → backend/apps/webui/internal/migrations/004_add_archived.py


+ 0 - 0
backend/apps/web/internal/migrations/005_add_updated_at.py → backend/apps/webui/internal/migrations/005_add_updated_at.py


+ 0 - 0
backend/apps/web/internal/migrations/006_migrate_timestamps_and_charfields.py → backend/apps/webui/internal/migrations/006_migrate_timestamps_and_charfields.py


+ 0 - 0
backend/apps/web/internal/migrations/007_add_user_last_active_at.py → backend/apps/webui/internal/migrations/007_add_user_last_active_at.py


+ 0 - 0
backend/apps/web/internal/migrations/008_add_memory.py → backend/apps/webui/internal/migrations/008_add_memory.py


+ 0 - 0
backend/apps/web/internal/migrations/009_add_models.py → backend/apps/webui/internal/migrations/009_add_models.py


+ 0 - 0
backend/apps/web/internal/migrations/010_migrate_modelfiles_to_models.py → backend/apps/webui/internal/migrations/010_migrate_modelfiles_to_models.py


+ 1 - 1
backend/apps/web/internal/migrations/README.md → backend/apps/webui/internal/migrations/README.md

@@ -14,7 +14,7 @@ You will need to create a migration file to ensure that existing databases are u
 2. Make your changes to the models.
 2. Make your changes to the models.
 3. From the `backend` directory, run the following command:
 3. From the `backend` directory, run the following command:
    ```bash
    ```bash
-   pw_migrate create --auto --auto-source apps.web.models --database sqlite:///${SQLITE_DB} --directory apps/web/internal/migrations ${MIGRATION_NAME}
+   pw_migrate create --auto --auto-source apps.webui.models --database sqlite:///${SQLITE_DB} --directory apps/web/internal/migrations ${MIGRATION_NAME}
    ```
    ```
    - `$SQLITE_DB` should be the path to the database file.
    - `$SQLITE_DB` should be the path to the database file.
    - `$MIGRATION_NAME` should be a descriptive name for the migration.
    - `$MIGRATION_NAME` should be a descriptive name for the migration.

+ 1 - 1
backend/apps/web/main.py → backend/apps/webui/main.py

@@ -1,7 +1,7 @@
 from fastapi import FastAPI, Depends
 from fastapi import FastAPI, Depends
 from fastapi.routing import APIRoute
 from fastapi.routing import APIRoute
 from fastapi.middleware.cors import CORSMiddleware
 from fastapi.middleware.cors import CORSMiddleware
-from apps.web.routers import (
+from apps.webui.routers import (
     auths,
     auths,
     users,
     users,
     chats,
     chats,

+ 2 - 2
backend/apps/web/models/auths.py → backend/apps/webui/models/auths.py

@@ -5,10 +5,10 @@ import uuid
 import logging
 import logging
 from peewee import *
 from peewee import *
 
 
-from apps.web.models.users import UserModel, Users
+from apps.webui.models.users import UserModel, Users
 from utils.utils import verify_password
 from utils.utils import verify_password
 
 
-from apps.web.internal.db import DB
+from apps.webui.internal.db import DB
 
 
 from config import SRC_LOG_LEVELS
 from config import SRC_LOG_LEVELS
 
 

+ 39 - 11
backend/apps/web/models/chats.py → backend/apps/webui/models/chats.py

@@ -7,7 +7,7 @@ import json
 import uuid
 import uuid
 import time
 import time
 
 
-from apps.web.internal.db import DB
+from apps.webui.internal.db import DB
 
 
 ####################
 ####################
 # Chat DB Schema
 # Chat DB Schema
@@ -191,6 +191,20 @@ class ChatTable:
         except:
         except:
             return None
             return None
 
 
+    def archive_all_chats_by_user_id(self, user_id: str) -> bool:
+        try:
+            chats = self.get_chats_by_user_id(user_id)
+            for chat in chats:
+                query = Chat.update(
+                    archived=True,
+                ).where(Chat.id == chat.id)
+
+                query.execute()
+
+            return True
+        except:
+            return False
+
     def get_archived_chat_list_by_user_id(
     def get_archived_chat_list_by_user_id(
         self, user_id: str, skip: int = 0, limit: int = 50
         self, user_id: str, skip: int = 0, limit: int = 50
     ) -> List[ChatModel]:
     ) -> List[ChatModel]:
@@ -205,17 +219,31 @@ class ChatTable:
         ]
         ]
 
 
     def get_chat_list_by_user_id(
     def get_chat_list_by_user_id(
-        self, user_id: str, skip: int = 0, limit: int = 50
+        self,
+        user_id: str,
+        include_archived: bool = False,
+        skip: int = 0,
+        limit: int = 50,
     ) -> List[ChatModel]:
     ) -> List[ChatModel]:
-        return [
-            ChatModel(**model_to_dict(chat))
-            for chat in Chat.select()
-            .where(Chat.archived == False)
-            .where(Chat.user_id == user_id)
-            .order_by(Chat.updated_at.desc())
-            # .limit(limit)
-            # .offset(skip)
-        ]
+        if include_archived:
+            return [
+                ChatModel(**model_to_dict(chat))
+                for chat in Chat.select()
+                .where(Chat.user_id == user_id)
+                .order_by(Chat.updated_at.desc())
+                # .limit(limit)
+                # .offset(skip)
+            ]
+        else:
+            return [
+                ChatModel(**model_to_dict(chat))
+                for chat in Chat.select()
+                .where(Chat.archived == False)
+                .where(Chat.user_id == user_id)
+                .order_by(Chat.updated_at.desc())
+                # .limit(limit)
+                # .offset(skip)
+            ]
 
 
     def get_chat_list_by_chat_ids(
     def get_chat_list_by_chat_ids(
         self, chat_ids: List[str], skip: int = 0, limit: int = 50
         self, chat_ids: List[str], skip: int = 0, limit: int = 50

+ 1 - 1
backend/apps/web/models/documents.py → backend/apps/webui/models/documents.py

@@ -8,7 +8,7 @@ import logging
 from utils.utils import decode_token
 from utils.utils import decode_token
 from utils.misc import get_gravatar_url
 from utils.misc import get_gravatar_url
 
 
-from apps.web.internal.db import DB
+from apps.webui.internal.db import DB
 
 
 import json
 import json
 
 

+ 2 - 2
backend/apps/web/models/memories.py → backend/apps/webui/models/memories.py

@@ -3,8 +3,8 @@ from peewee import *
 from playhouse.shortcuts import model_to_dict
 from playhouse.shortcuts import model_to_dict
 from typing import List, Union, Optional
 from typing import List, Union, Optional
 
 
-from apps.web.internal.db import DB
-from apps.web.models.chats import Chats
+from apps.webui.internal.db import DB
+from apps.webui.models.chats import Chats
 
 
 import time
 import time
 import uuid
 import uuid

+ 1 - 1
backend/apps/web/models/models.py → backend/apps/webui/models/models.py

@@ -8,7 +8,7 @@ from peewee import *
 from playhouse.shortcuts import model_to_dict
 from playhouse.shortcuts import model_to_dict
 from pydantic import BaseModel, ConfigDict
 from pydantic import BaseModel, ConfigDict
 
 
-from apps.web.internal.db import DB, JSONField
+from apps.webui.internal.db import DB, JSONField
 
 
 from typing import List, Union, Optional
 from typing import List, Union, Optional
 from config import SRC_LOG_LEVELS
 from config import SRC_LOG_LEVELS

+ 1 - 1
backend/apps/web/models/prompts.py → backend/apps/webui/models/prompts.py

@@ -7,7 +7,7 @@ import time
 from utils.utils import decode_token
 from utils.utils import decode_token
 from utils.misc import get_gravatar_url
 from utils.misc import get_gravatar_url
 
 
-from apps.web.internal.db import DB
+from apps.webui.internal.db import DB
 
 
 import json
 import json
 
 

+ 1 - 1
backend/apps/web/models/tags.py → backend/apps/webui/models/tags.py

@@ -8,7 +8,7 @@ import uuid
 import time
 import time
 import logging
 import logging
 
 
-from apps.web.internal.db import DB
+from apps.webui.internal.db import DB
 
 
 from config import SRC_LOG_LEVELS
 from config import SRC_LOG_LEVELS
 
 

+ 2 - 2
backend/apps/web/models/users.py → backend/apps/webui/models/users.py

@@ -5,8 +5,8 @@ from typing import List, Union, Optional
 import time
 import time
 from utils.misc import get_gravatar_url
 from utils.misc import get_gravatar_url
 
 
-from apps.web.internal.db import DB
-from apps.web.models.chats import Chats
+from apps.webui.internal.db import DB
+from apps.webui.models.chats import Chats
 
 
 ####################
 ####################
 # User DB Schema
 # User DB Schema

+ 2 - 2
backend/apps/web/routers/auths.py → backend/apps/webui/routers/auths.py

@@ -10,7 +10,7 @@ import uuid
 import csv
 import csv
 
 
 
 
-from apps.web.models.auths import (
+from apps.webui.models.auths import (
     SigninForm,
     SigninForm,
     SignupForm,
     SignupForm,
     AddUserForm,
     AddUserForm,
@@ -21,7 +21,7 @@ from apps.web.models.auths import (
     Auths,
     Auths,
     ApiKey,
     ApiKey,
 )
 )
-from apps.web.models.users import Users
+from apps.webui.models.users import Users
 
 
 from utils.utils import (
 from utils.utils import (
     get_password_hash,
     get_password_hash,

+ 52 - 40
backend/apps/web/routers/chats.py → backend/apps/webui/routers/chats.py

@@ -7,8 +7,8 @@ from pydantic import BaseModel
 import json
 import json
 import logging
 import logging
 
 
-from apps.web.models.users import Users
-from apps.web.models.chats import (
+from apps.webui.models.users import Users
+from apps.webui.models.chats import (
     ChatModel,
     ChatModel,
     ChatResponse,
     ChatResponse,
     ChatTitleForm,
     ChatTitleForm,
@@ -18,7 +18,7 @@ from apps.web.models.chats import (
 )
 )
 
 
 
 
-from apps.web.models.tags import (
+from apps.webui.models.tags import (
     TagModel,
     TagModel,
     ChatIdTagModel,
     ChatIdTagModel,
     ChatIdTagForm,
     ChatIdTagForm,
@@ -78,43 +78,25 @@ async def delete_all_user_chats(request: Request, user=Depends(get_current_user)
 async def get_user_chat_list_by_user_id(
 async def get_user_chat_list_by_user_id(
     user_id: str, user=Depends(get_admin_user), skip: int = 0, limit: int = 50
     user_id: str, user=Depends(get_admin_user), skip: int = 0, limit: int = 50
 ):
 ):
-    return Chats.get_chat_list_by_user_id(user_id, skip, limit)
-
-
-############################
-# GetArchivedChats
-############################
-
-
-@router.get("/archived", response_model=List[ChatTitleIdResponse])
-async def get_archived_session_user_chat_list(
-    user=Depends(get_current_user), skip: int = 0, limit: int = 50
-):
-    return Chats.get_archived_chat_list_by_user_id(user.id, skip, limit)
+    return Chats.get_chat_list_by_user_id(
+        user_id, include_archived=True, skip=skip, limit=limit
+    )
 
 
 
 
 ############################
 ############################
-# GetSharedChatById
+# CreateNewChat
 ############################
 ############################
 
 
 
 
-@router.get("/share/{share_id}", response_model=Optional[ChatResponse])
-async def get_shared_chat_by_id(share_id: str, user=Depends(get_current_user)):
-    if user.role == "pending":
-        raise HTTPException(
-            status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND
-        )
-
-    if user.role == "user":
-        chat = Chats.get_chat_by_share_id(share_id)
-    elif user.role == "admin":
-        chat = Chats.get_chat_by_id(share_id)
-
-    if chat:
+@router.post("/new", response_model=Optional[ChatResponse])
+async def create_new_chat(form_data: ChatForm, user=Depends(get_current_user)):
+    try:
+        chat = Chats.insert_new_chat(user.id, form_data)
         return ChatResponse(**{**chat.model_dump(), "chat": json.loads(chat.chat)})
         return ChatResponse(**{**chat.model_dump(), "chat": json.loads(chat.chat)})
-    else:
+    except Exception as e:
+        log.exception(e)
         raise HTTPException(
         raise HTTPException(
-            status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND
+            status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT()
         )
         )
 
 
 
 
@@ -150,19 +132,49 @@ async def get_all_user_chats_in_db(user=Depends(get_admin_user)):
 
 
 
 
 ############################
 ############################
-# CreateNewChat
+# GetArchivedChats
 ############################
 ############################
 
 
 
 
-@router.post("/new", response_model=Optional[ChatResponse])
-async def create_new_chat(form_data: ChatForm, user=Depends(get_current_user)):
-    try:
-        chat = Chats.insert_new_chat(user.id, form_data)
+@router.get("/archived", response_model=List[ChatTitleIdResponse])
+async def get_archived_session_user_chat_list(
+    user=Depends(get_current_user), skip: int = 0, limit: int = 50
+):
+    return Chats.get_archived_chat_list_by_user_id(user.id, skip, limit)
+
+
+############################
+# ArchiveAllChats
+############################
+
+
+@router.post("/archive/all", response_model=List[ChatTitleIdResponse])
+async def archive_all_chats(user=Depends(get_current_user)):
+    return Chats.archive_all_chats_by_user_id(user.id)
+
+
+############################
+# GetSharedChatById
+############################
+
+
+@router.get("/share/{share_id}", response_model=Optional[ChatResponse])
+async def get_shared_chat_by_id(share_id: str, user=Depends(get_current_user)):
+    if user.role == "pending":
+        raise HTTPException(
+            status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND
+        )
+
+    if user.role == "user":
+        chat = Chats.get_chat_by_share_id(share_id)
+    elif user.role == "admin":
+        chat = Chats.get_chat_by_id(share_id)
+
+    if chat:
         return ChatResponse(**{**chat.model_dump(), "chat": json.loads(chat.chat)})
         return ChatResponse(**{**chat.model_dump(), "chat": json.loads(chat.chat)})
-    except Exception as e:
-        log.exception(e)
+    else:
         raise HTTPException(
         raise HTTPException(
-            status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT()
+            status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND
         )
         )
 
 
 
 

+ 1 - 1
backend/apps/web/routers/configs.py → backend/apps/webui/routers/configs.py

@@ -8,7 +8,7 @@ from pydantic import BaseModel
 import time
 import time
 import uuid
 import uuid
 
 
-from apps.web.models.users import Users
+from apps.webui.models.users import Users
 
 
 from utils.utils import (
 from utils.utils import (
     get_password_hash,
     get_password_hash,

+ 1 - 1
backend/apps/web/routers/documents.py → backend/apps/webui/routers/documents.py

@@ -6,7 +6,7 @@ from fastapi import APIRouter
 from pydantic import BaseModel
 from pydantic import BaseModel
 import json
 import json
 
 
-from apps.web.models.documents import (
+from apps.webui.models.documents import (
     Documents,
     Documents,
     DocumentForm,
     DocumentForm,
     DocumentUpdateForm,
     DocumentUpdateForm,

+ 1 - 1
backend/apps/web/routers/memories.py → backend/apps/webui/routers/memories.py

@@ -7,7 +7,7 @@ from fastapi import APIRouter
 from pydantic import BaseModel
 from pydantic import BaseModel
 import logging
 import logging
 
 
-from apps.web.models.memories import Memories, MemoryModel
+from apps.webui.models.memories import Memories, MemoryModel
 
 
 from utils.utils import get_verified_user
 from utils.utils import get_verified_user
 from constants import ERROR_MESSAGES
 from constants import ERROR_MESSAGES

+ 4 - 4
backend/apps/web/routers/models.py → backend/apps/webui/routers/models.py

@@ -5,7 +5,7 @@ from typing import List, Union, Optional
 from fastapi import APIRouter
 from fastapi import APIRouter
 from pydantic import BaseModel
 from pydantic import BaseModel
 import json
 import json
-from apps.web.models.models import Models, ModelModel, ModelForm, ModelResponse
+from apps.webui.models.models import Models, ModelModel, ModelForm, ModelResponse
 
 
 from utils.utils import get_verified_user, get_admin_user
 from utils.utils import get_verified_user, get_admin_user
 from constants import ERROR_MESSAGES
 from constants import ERROR_MESSAGES
@@ -53,7 +53,7 @@ async def add_new_model(
 ############################
 ############################
 
 
 
 
-@router.get("/{id}", response_model=Optional[ModelModel])
+@router.get("/", response_model=Optional[ModelModel])
 async def get_model_by_id(id: str, user=Depends(get_verified_user)):
 async def get_model_by_id(id: str, user=Depends(get_verified_user)):
     model = Models.get_model_by_id(id)
     model = Models.get_model_by_id(id)
 
 
@@ -71,7 +71,7 @@ async def get_model_by_id(id: str, user=Depends(get_verified_user)):
 ############################
 ############################
 
 
 
 
-@router.post("/{id}/update", response_model=Optional[ModelModel])
+@router.post("/update", response_model=Optional[ModelModel])
 async def update_model_by_id(
 async def update_model_by_id(
     request: Request, id: str, form_data: ModelForm, user=Depends(get_admin_user)
     request: Request, id: str, form_data: ModelForm, user=Depends(get_admin_user)
 ):
 ):
@@ -102,7 +102,7 @@ async def update_model_by_id(
 ############################
 ############################
 
 
 
 
-@router.delete("/{id}/delete", response_model=bool)
+@router.delete("/delete", response_model=bool)
 async def delete_model_by_id(id: str, user=Depends(get_admin_user)):
 async def delete_model_by_id(id: str, user=Depends(get_admin_user)):
     result = Models.delete_model_by_id(id)
     result = Models.delete_model_by_id(id)
     return result
     return result

+ 1 - 1
backend/apps/web/routers/prompts.py → backend/apps/webui/routers/prompts.py

@@ -6,7 +6,7 @@ from fastapi import APIRouter
 from pydantic import BaseModel
 from pydantic import BaseModel
 import json
 import json
 
 
-from apps.web.models.prompts import Prompts, PromptForm, PromptModel
+from apps.webui.models.prompts import Prompts, PromptForm, PromptModel
 
 
 from utils.utils import get_current_user, get_admin_user
 from utils.utils import get_current_user, get_admin_user
 from constants import ERROR_MESSAGES
 from constants import ERROR_MESSAGES

+ 3 - 3
backend/apps/web/routers/users.py → backend/apps/webui/routers/users.py

@@ -9,9 +9,9 @@ import time
 import uuid
 import uuid
 import logging
 import logging
 
 
-from apps.web.models.users import UserModel, UserUpdateForm, UserRoleUpdateForm, Users
-from apps.web.models.auths import Auths
-from apps.web.models.chats import Chats
+from apps.webui.models.users import UserModel, UserUpdateForm, UserRoleUpdateForm, Users
+from apps.webui.models.auths import Auths
+from apps.webui.models.chats import Chats
 
 
 from utils.utils import get_verified_user, get_password_hash, get_admin_user
 from utils.utils import get_verified_user, get_password_hash, get_admin_user
 from constants import ERROR_MESSAGES
 from constants import ERROR_MESSAGES

+ 1 - 1
backend/apps/web/routers/utils.py → backend/apps/webui/routers/utils.py

@@ -8,7 +8,7 @@ from pydantic import BaseModel
 from fpdf import FPDF
 from fpdf import FPDF
 import markdown
 import markdown
 
 
-from apps.web.internal.db import DB
+from apps.webui.internal.db import DB
 from utils.utils import get_admin_user
 from utils.utils import get_admin_user
 from utils.misc import calculate_sha256, get_gravatar_url
 from utils.misc import calculate_sha256, get_gravatar_url
 
 

+ 10 - 18
backend/config.py

@@ -27,6 +27,8 @@ from constants import ERROR_MESSAGES
 BACKEND_DIR = Path(__file__).parent  # the path containing this file
 BACKEND_DIR = Path(__file__).parent  # the path containing this file
 BASE_DIR = BACKEND_DIR.parent  # the path containing the backend/
 BASE_DIR = BACKEND_DIR.parent  # the path containing the backend/
 
 
+print(BASE_DIR)
+
 try:
 try:
     from dotenv import load_dotenv, find_dotenv
     from dotenv import load_dotenv, find_dotenv
 
 
@@ -56,7 +58,6 @@ log_sources = [
     "CONFIG",
     "CONFIG",
     "DB",
     "DB",
     "IMAGES",
     "IMAGES",
-    "LITELLM",
     "MAIN",
     "MAIN",
     "MODELS",
     "MODELS",
     "OLLAMA",
     "OLLAMA",
@@ -122,7 +123,10 @@ def parse_section(section):
 
 
 
 
 try:
 try:
-    changelog_content = (BASE_DIR / "CHANGELOG.md").read_text()
+    changelog_path = BASE_DIR / "CHANGELOG.md"
+    with open(str(changelog_path.absolute()), "r", encoding="utf8") as file:
+        changelog_content = file.read()
+
 except:
 except:
     changelog_content = (pkgutil.get_data("open_webui", "CHANGELOG.md") or b"").decode()
     changelog_content = (pkgutil.get_data("open_webui", "CHANGELOG.md") or b"").decode()
 
 
@@ -374,10 +378,10 @@ def create_config_file(file_path):
 
 
 LITELLM_CONFIG_PATH = f"{DATA_DIR}/litellm/config.yaml"
 LITELLM_CONFIG_PATH = f"{DATA_DIR}/litellm/config.yaml"
 
 
-if not os.path.exists(LITELLM_CONFIG_PATH):
-    log.info("Config file doesn't exist. Creating...")
-    create_config_file(LITELLM_CONFIG_PATH)
-    log.info("Config file created successfully.")
+# if not os.path.exists(LITELLM_CONFIG_PATH):
+#     log.info("Config file doesn't exist. Creating...")
+#     create_config_file(LITELLM_CONFIG_PATH)
+#     log.info("Config file created successfully.")
 
 
 
 
 ####################################
 ####################################
@@ -845,18 +849,6 @@ AUDIO_OPENAI_API_VOICE = PersistentConfig(
     os.getenv("AUDIO_OPENAI_API_VOICE", "alloy"),
     os.getenv("AUDIO_OPENAI_API_VOICE", "alloy"),
 )
 )
 
 
-####################################
-# LiteLLM
-####################################
-
-
-ENABLE_LITELLM = os.environ.get("ENABLE_LITELLM", "True").lower() == "true"
-
-LITELLM_PROXY_PORT = int(os.getenv("LITELLM_PROXY_PORT", "14365"))
-if LITELLM_PROXY_PORT < 0 or LITELLM_PROXY_PORT > 65535:
-    raise ValueError("Invalid port number for LITELLM_PROXY_PORT")
-LITELLM_PROXY_HOST = os.getenv("LITELLM_PROXY_HOST", "127.0.0.1")
-
 
 
 ####################################
 ####################################
 # Database
 # Database

+ 7 - 31
backend/main.py

@@ -22,23 +22,16 @@ from starlette.responses import StreamingResponse, Response
 from apps.ollama.main import app as ollama_app, get_all_models as get_ollama_models
 from apps.ollama.main import app as ollama_app, get_all_models as get_ollama_models
 from apps.openai.main import app as openai_app, get_all_models as get_openai_models
 from apps.openai.main import app as openai_app, get_all_models as get_openai_models
 
 
-from apps.litellm.main import (
-    app as litellm_app,
-    start_litellm_background,
-    shutdown_litellm_background,
-)
-
-
 from apps.audio.main import app as audio_app
 from apps.audio.main import app as audio_app
 from apps.images.main import app as images_app
 from apps.images.main import app as images_app
 from apps.rag.main import app as rag_app
 from apps.rag.main import app as rag_app
-from apps.web.main import app as webui_app
+from apps.webui.main import app as webui_app
 
 
 import asyncio
 import asyncio
 from pydantic import BaseModel
 from pydantic import BaseModel
 from typing import List, Optional
 from typing import List, Optional
 
 
-from apps.web.models.models import Models, ModelModel
+from apps.webui.models.models import Models, ModelModel
 from utils.utils import get_admin_user, get_verified_user
 from utils.utils import get_admin_user, get_verified_user
 from apps.rag.utils import rag_messages
 from apps.rag.utils import rag_messages
 
 
@@ -55,7 +48,6 @@ from config import (
     STATIC_DIR,
     STATIC_DIR,
     ENABLE_OPENAI_API,
     ENABLE_OPENAI_API,
     ENABLE_OLLAMA_API,
     ENABLE_OLLAMA_API,
-    ENABLE_LITELLM,
     ENABLE_MODEL_FILTER,
     ENABLE_MODEL_FILTER,
     MODEL_FILTER_LIST,
     MODEL_FILTER_LIST,
     GLOBAL_LOG_LEVEL,
     GLOBAL_LOG_LEVEL,
@@ -101,11 +93,7 @@ https://github.com/open-webui/open-webui
 
 
 @asynccontextmanager
 @asynccontextmanager
 async def lifespan(app: FastAPI):
 async def lifespan(app: FastAPI):
-    if ENABLE_LITELLM:
-        asyncio.create_task(start_litellm_background())
     yield
     yield
-    if ENABLE_LITELLM:
-        await shutdown_litellm_background()
 
 
 
 
 app = FastAPI(
 app = FastAPI(
@@ -263,9 +251,6 @@ async def update_embedding_function(request: Request, call_next):
     return response
     return response
 
 
 
 
-# TODO: Deprecate LiteLLM
-app.mount("/litellm/api", litellm_app)
-
 app.mount("/ollama", ollama_app)
 app.mount("/ollama", ollama_app)
 app.mount("/openai", openai_app)
 app.mount("/openai", openai_app)
 
 
@@ -373,13 +358,14 @@ async def get_app_config():
         "name": WEBUI_NAME,
         "name": WEBUI_NAME,
         "version": VERSION,
         "version": VERSION,
         "auth": WEBUI_AUTH,
         "auth": WEBUI_AUTH,
+        "auth_trusted_header": bool(webui_app.state.AUTH_TRUSTED_EMAIL_HEADER),
+        "enable_signup": webui_app.state.config.ENABLE_SIGNUP,
+        "enable_image_generation": images_app.state.config.ENABLED,
+        "enable_admin_export": ENABLE_ADMIN_EXPORT,
         "default_locale": default_locale,
         "default_locale": default_locale,
-        "images": images_app.state.config.ENABLED,
         "default_models": webui_app.state.config.DEFAULT_MODELS,
         "default_models": webui_app.state.config.DEFAULT_MODELS,
         "default_prompt_suggestions": webui_app.state.config.DEFAULT_PROMPT_SUGGESTIONS,
         "default_prompt_suggestions": webui_app.state.config.DEFAULT_PROMPT_SUGGESTIONS,
-        "trusted_header_auth": bool(webui_app.state.AUTH_TRUSTED_EMAIL_HEADER),
-        "admin_export_enabled": ENABLE_ADMIN_EXPORT,
-        "websearch": RAG_WEB_SEARCH_ENABLED,
+        "enable_websearch": RAG_WEB_SEARCH_ENABLED,
     }
     }
 
 
 
 
@@ -403,15 +389,6 @@ async def update_model_filter_config(
     app.state.config.ENABLE_MODEL_FILTER = form_data.enabled
     app.state.config.ENABLE_MODEL_FILTER = form_data.enabled
     app.state.config.MODEL_FILTER_LIST = form_data.models
     app.state.config.MODEL_FILTER_LIST = form_data.models
 
 
-    ollama_app.state.config.ENABLE_MODEL_FILTER = app.state.config.ENABLE_MODEL_FILTER
-    ollama_app.state.config.MODEL_FILTER_LIST = app.state.config.MODEL_FILTER_LIST
-
-    openai_app.state.config.ENABLE_MODEL_FILTER = app.state.config.ENABLE_MODEL_FILTER
-    openai_app.state.config.MODEL_FILTER_LIST = app.state.config.MODEL_FILTER_LIST
-
-    litellm_app.state.ENABLE_MODEL_FILTER = app.state.config.ENABLE_MODEL_FILTER
-    litellm_app.state.MODEL_FILTER_LIST = app.state.config.MODEL_FILTER_LIST
-
     return {
     return {
         "enabled": app.state.config.ENABLE_MODEL_FILTER,
         "enabled": app.state.config.ENABLE_MODEL_FILTER,
         "models": app.state.config.MODEL_FILTER_LIST,
         "models": app.state.config.MODEL_FILTER_LIST,
@@ -432,7 +409,6 @@ class UrlForm(BaseModel):
 @app.post("/api/webhook")
 @app.post("/api/webhook")
 async def update_webhook_url(form_data: UrlForm, user=Depends(get_admin_user)):
 async def update_webhook_url(form_data: UrlForm, user=Depends(get_admin_user)):
     app.state.config.WEBHOOK_URL = form_data.url
     app.state.config.WEBHOOK_URL = form_data.url
-
     webui_app.state.WEBHOOK_URL = app.state.config.WEBHOOK_URL
     webui_app.state.WEBHOOK_URL = app.state.config.WEBHOOK_URL
 
 
     return {
     return {

+ 0 - 2
backend/requirements.txt

@@ -18,8 +18,6 @@ psycopg2-binary==2.9.9
 PyMySQL==1.1.1
 PyMySQL==1.1.1
 bcrypt==4.1.3
 bcrypt==4.1.3
 
 
-litellm[proxy]==1.37.20
-
 boto3==1.34.110
 boto3==1.34.110
 
 
 argon2-cffi==23.1.0
 argon2-cffi==23.1.0

+ 0 - 43
backend/space/litellm_config.yaml

@@ -1,43 +0,0 @@
-litellm_settings:
-  drop_params: true
-model_list:
-  - model_name: 'HuggingFace: Mistral: Mistral 7B Instruct v0.1'
-    litellm_params:
-      model: huggingface/mistralai/Mistral-7B-Instruct-v0.1
-      api_key: os.environ/HF_TOKEN
-      max_tokens: 1024
-  - model_name: 'HuggingFace: Mistral: Mistral 7B Instruct v0.2'
-    litellm_params:
-      model: huggingface/mistralai/Mistral-7B-Instruct-v0.2
-      api_key: os.environ/HF_TOKEN
-      max_tokens: 1024
-  - model_name: 'HuggingFace: Meta: Llama 3 8B Instruct'
-    litellm_params:
-      model: huggingface/meta-llama/Meta-Llama-3-8B-Instruct
-      api_key: os.environ/HF_TOKEN
-      max_tokens: 2047
-  - model_name: 'HuggingFace: Mistral: Mixtral 8x7B Instruct v0.1'
-    litellm_params:
-      model: huggingface/mistralai/Mixtral-8x7B-Instruct-v0.1
-      api_key: os.environ/HF_TOKEN
-      max_tokens: 8192
-  - model_name: 'HuggingFace: Microsoft: Phi-3 Mini-4K-Instruct'
-    litellm_params:
-      model: huggingface/microsoft/Phi-3-mini-4k-instruct
-      api_key: os.environ/HF_TOKEN
-      max_tokens: 1024
-  - model_name: 'HuggingFace: Google: Gemma 7B 1.1'
-    litellm_params:
-      model: huggingface/google/gemma-1.1-7b-it
-      api_key: os.environ/HF_TOKEN
-      max_tokens: 1024
-  - model_name: 'HuggingFace: Yi-1.5 34B Chat'
-    litellm_params:
-      model: huggingface/01-ai/Yi-1.5-34B-Chat
-      api_key: os.environ/HF_TOKEN
-      max_tokens: 1024
-  - model_name: 'HuggingFace: Nous Research: Nous Hermes 2 Mixtral 8x7B DPO'
-    litellm_params:
-      model: huggingface/NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO
-      api_key: os.environ/HF_TOKEN
-      max_tokens: 2048

+ 0 - 5
backend/start.sh

@@ -34,11 +34,6 @@ fi
 # Check if SPACE_ID is set, if so, configure for space
 # Check if SPACE_ID is set, if so, configure for space
 if [ -n "$SPACE_ID" ]; then
 if [ -n "$SPACE_ID" ]; then
   echo "Configuring for HuggingFace Space deployment"
   echo "Configuring for HuggingFace Space deployment"
-  
-  # Copy litellm_config.yaml with specified ownership
-  echo "Copying litellm_config.yaml to the desired location with specified ownership..."
-  cp -f ./space/litellm_config.yaml ./data/litellm/config.yaml
-
   if [ -n "$ADMIN_USER_EMAIL" ] && [ -n "$ADMIN_USER_PASSWORD" ]; then
   if [ -n "$ADMIN_USER_EMAIL" ] && [ -n "$ADMIN_USER_PASSWORD" ]; then
     echo "Admin user configured, creating"
     echo "Admin user configured, creating"
     WEBUI_SECRET_KEY="$WEBUI_SECRET_KEY" uvicorn main:app --host "$HOST" --port "$PORT" --forwarded-allow-ips '*' &
     WEBUI_SECRET_KEY="$WEBUI_SECRET_KEY" uvicorn main:app --host "$HOST" --port "$PORT" --forwarded-allow-ips '*' &

+ 1 - 1
backend/utils/models.py

@@ -1,4 +1,4 @@
-from apps.web.models.models import Models, ModelModel, ModelForm, ModelResponse
+from apps.webui.models.models import Models, ModelModel, ModelForm, ModelResponse
 
 
 
 
 def get_model_id_from_custom_model_id(id: str):
 def get_model_id_from_custom_model_id(id: str):

+ 1 - 1
backend/utils/utils.py

@@ -1,7 +1,7 @@
 from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
 from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
 from fastapi import HTTPException, status, Depends
 from fastapi import HTTPException, status, Depends
 
 
-from apps.web.models.users import Users
+from apps.webui.models.users import Users
 
 
 from pydantic import BaseModel
 from pydantic import BaseModel
 from typing import Union, Optional
 from typing import Union, Optional

+ 3 - 7
requirements-dev.lock

@@ -273,7 +273,6 @@ langsmith==0.1.57
     # via langchain-community
     # via langchain-community
     # via langchain-core
     # via langchain-core
 litellm==1.37.20
 litellm==1.37.20
-    # via litellm
     # via open-webui
     # via open-webui
 lxml==5.2.2
 lxml==5.2.2
     # via unstructured
     # via unstructured
@@ -396,7 +395,6 @@ pandas==2.2.2
     # via open-webui
     # via open-webui
 passlib==1.7.4
 passlib==1.7.4
     # via open-webui
     # via open-webui
-    # via passlib
 pathspec==0.12.1
 pathspec==0.12.1
     # via black
     # via black
 peewee==3.17.5
 peewee==3.17.5
@@ -454,7 +452,6 @@ pygments==2.18.0
 pyjwt==2.8.0
 pyjwt==2.8.0
     # via litellm
     # via litellm
     # via open-webui
     # via open-webui
-    # via pyjwt
 pymysql==1.1.0
 pymysql==1.1.0
     # via open-webui
     # via open-webui
 pypandoc==1.13
 pypandoc==1.13
@@ -559,6 +556,9 @@ scipy==1.13.0
     # via sentence-transformers
     # via sentence-transformers
 sentence-transformers==2.7.0
 sentence-transformers==2.7.0
     # via open-webui
     # via open-webui
+setuptools==69.5.1
+    # via ctranslate2
+    # via opentelemetry-instrumentation
 shapely==2.0.4
 shapely==2.0.4
     # via rapidocr-onnxruntime
     # via rapidocr-onnxruntime
 shellingham==1.5.4
 shellingham==1.5.4
@@ -659,7 +659,6 @@ uvicorn==0.22.0
     # via fastapi
     # via fastapi
     # via litellm
     # via litellm
     # via open-webui
     # via open-webui
-    # via uvicorn
 uvloop==0.19.0
 uvloop==0.19.0
     # via uvicorn
     # via uvicorn
 validators==0.28.1
 validators==0.28.1
@@ -687,6 +686,3 @@ youtube-transcript-api==0.6.2
     # via open-webui
     # via open-webui
 zipp==3.18.1
 zipp==3.18.1
     # via importlib-metadata
     # via importlib-metadata
-setuptools==69.5.1
-    # via ctranslate2
-    # via opentelemetry-instrumentation

+ 3 - 7
requirements.lock

@@ -273,7 +273,6 @@ langsmith==0.1.57
     # via langchain-community
     # via langchain-community
     # via langchain-core
     # via langchain-core
 litellm==1.37.20
 litellm==1.37.20
-    # via litellm
     # via open-webui
     # via open-webui
 lxml==5.2.2
 lxml==5.2.2
     # via unstructured
     # via unstructured
@@ -396,7 +395,6 @@ pandas==2.2.2
     # via open-webui
     # via open-webui
 passlib==1.7.4
 passlib==1.7.4
     # via open-webui
     # via open-webui
-    # via passlib
 pathspec==0.12.1
 pathspec==0.12.1
     # via black
     # via black
 peewee==3.17.5
 peewee==3.17.5
@@ -454,7 +452,6 @@ pygments==2.18.0
 pyjwt==2.8.0
 pyjwt==2.8.0
     # via litellm
     # via litellm
     # via open-webui
     # via open-webui
-    # via pyjwt
 pymysql==1.1.0
 pymysql==1.1.0
     # via open-webui
     # via open-webui
 pypandoc==1.13
 pypandoc==1.13
@@ -559,6 +556,9 @@ scipy==1.13.0
     # via sentence-transformers
     # via sentence-transformers
 sentence-transformers==2.7.0
 sentence-transformers==2.7.0
     # via open-webui
     # via open-webui
+setuptools==69.5.1
+    # via ctranslate2
+    # via opentelemetry-instrumentation
 shapely==2.0.4
 shapely==2.0.4
     # via rapidocr-onnxruntime
     # via rapidocr-onnxruntime
 shellingham==1.5.4
 shellingham==1.5.4
@@ -659,7 +659,6 @@ uvicorn==0.22.0
     # via fastapi
     # via fastapi
     # via litellm
     # via litellm
     # via open-webui
     # via open-webui
-    # via uvicorn
 uvloop==0.19.0
 uvloop==0.19.0
     # via uvicorn
     # via uvicorn
 validators==0.28.1
 validators==0.28.1
@@ -687,6 +686,3 @@ youtube-transcript-api==0.6.2
     # via open-webui
     # via open-webui
 zipp==3.18.1
 zipp==3.18.1
     # via importlib-metadata
     # via importlib-metadata
-setuptools==69.5.1
-    # via ctranslate2
-    # via opentelemetry-instrumentation

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

@@ -654,3 +654,35 @@ export const deleteAllChats = async (token: string) => {
 
 
 	return res;
 	return res;
 };
 };
+
+export const archiveAllChats = async (token: string) => {
+	let error = null;
+
+	const res = await fetch(`${WEBUI_API_BASE_URL}/chats/archive/all`, {
+		method: 'POST',
+		headers: {
+			Accept: 'application/json',
+			'Content-Type': 'application/json',
+			...(token && { authorization: `Bearer ${token}` })
+		}
+	})
+		.then(async (res) => {
+			if (!res.ok) throw await res.json();
+			return res.json();
+		})
+		.then((json) => {
+			return json;
+		})
+		.catch((err) => {
+			error = err.detail;
+
+			console.log(err);
+			return null;
+		});
+
+	if (error) {
+		throw error;
+	}
+
+	return res;
+};

+ 0 - 151
src/lib/apis/litellm/index.ts

@@ -1,151 +0,0 @@
-import { LITELLM_API_BASE_URL } from '$lib/constants';
-
-export const getLiteLLMModels = async (token: string = '') => {
-	let error = null;
-
-	const res = await fetch(`${LITELLM_API_BASE_URL}/v1/models`, {
-		method: 'GET',
-		headers: {
-			Accept: 'application/json',
-			'Content-Type': 'application/json',
-			...(token && { authorization: `Bearer ${token}` })
-		}
-	})
-		.then(async (res) => {
-			if (!res.ok) throw await res.json();
-			return res.json();
-		})
-		.catch((err) => {
-			console.log(err);
-			error = `LiteLLM: ${err?.error?.message ?? 'Network Problem'}`;
-			return [];
-		});
-
-	if (error) {
-		throw error;
-	}
-
-	const models = Array.isArray(res) ? res : res?.data ?? null;
-
-	return models
-		? models
-				.map((model) => ({
-					id: model.id,
-					name: model.name ?? model.id,
-					external: true,
-					source: 'LiteLLM',
-					custom_info: model.custom_info
-				}))
-				.sort((a, b) => {
-					return a.name.localeCompare(b.name);
-				})
-		: models;
-};
-
-export const getLiteLLMModelInfo = async (token: string = '') => {
-	let error = null;
-
-	const res = await fetch(`${LITELLM_API_BASE_URL}/model/info`, {
-		method: 'GET',
-		headers: {
-			Accept: 'application/json',
-			'Content-Type': 'application/json',
-			...(token && { authorization: `Bearer ${token}` })
-		}
-	})
-		.then(async (res) => {
-			if (!res.ok) throw await res.json();
-			return res.json();
-		})
-		.catch((err) => {
-			console.log(err);
-			error = `LiteLLM: ${err?.error?.message ?? 'Network Problem'}`;
-			return [];
-		});
-
-	if (error) {
-		throw error;
-	}
-
-	const models = Array.isArray(res) ? res : res?.data ?? null;
-
-	return models;
-};
-
-type AddLiteLLMModelForm = {
-	name: string;
-	model: string;
-	api_base: string;
-	api_key: string;
-	rpm: string;
-	max_tokens: string;
-};
-
-export const addLiteLLMModel = async (token: string = '', payload: AddLiteLLMModelForm) => {
-	let error = null;
-
-	const res = await fetch(`${LITELLM_API_BASE_URL}/model/new`, {
-		method: 'POST',
-		headers: {
-			Accept: 'application/json',
-			'Content-Type': 'application/json',
-			...(token && { authorization: `Bearer ${token}` })
-		},
-		body: JSON.stringify({
-			model_name: payload.name,
-			litellm_params: {
-				model: payload.model,
-				...(payload.api_base === '' ? {} : { api_base: payload.api_base }),
-				...(payload.api_key === '' ? {} : { api_key: payload.api_key }),
-				...(isNaN(parseInt(payload.rpm)) ? {} : { rpm: parseInt(payload.rpm) }),
-				...(payload.max_tokens === '' ? {} : { max_tokens: payload.max_tokens })
-			}
-		})
-	})
-		.then(async (res) => {
-			if (!res.ok) throw await res.json();
-			return res.json();
-		})
-		.catch((err) => {
-			console.log(err);
-			error = `LiteLLM: ${err?.error?.message ?? 'Network Problem'}`;
-			return [];
-		});
-
-	if (error) {
-		throw error;
-	}
-
-	return res;
-};
-
-export const deleteLiteLLMModel = async (token: string = '', id: string) => {
-	let error = null;
-
-	const res = await fetch(`${LITELLM_API_BASE_URL}/model/delete`, {
-		method: 'POST',
-		headers: {
-			Accept: 'application/json',
-			'Content-Type': 'application/json',
-			...(token && { authorization: `Bearer ${token}` })
-		},
-		body: JSON.stringify({
-			id: id
-		})
-	})
-		.then(async (res) => {
-			if (!res.ok) throw await res.json();
-			return res.json();
-		})
-		.catch((err) => {
-			console.log(err);
-			error = `LiteLLM: ${err?.error?.message ?? 'Network Problem'}`;
-			return [];
-		});
-
-	if (error) {
-		throw error;
-	}
-
-	return res;
-};

+ 13 - 4
src/lib/apis/models/index.ts

@@ -32,7 +32,7 @@ export const addNewModel = async (token: string, model: object) => {
 export const getModelInfos = async (token: string = '') => {
 export const getModelInfos = async (token: string = '') => {
 	let error = null;
 	let error = null;
 
 
-	const res = await fetch(`${WEBUI_API_BASE_URL}/models/`, {
+	const res = await fetch(`${WEBUI_API_BASE_URL}/models`, {
 		method: 'GET',
 		method: 'GET',
 		headers: {
 		headers: {
 			Accept: 'application/json',
 			Accept: 'application/json',
@@ -63,7 +63,10 @@ export const getModelInfos = async (token: string = '') => {
 export const getModelById = async (token: string, id: string) => {
 export const getModelById = async (token: string, id: string) => {
 	let error = null;
 	let error = null;
 
 
-	const res = await fetch(`${WEBUI_API_BASE_URL}/models/${id}`, {
+	const searchParams = new URLSearchParams();
+	searchParams.append('id', id);
+
+	const res = await fetch(`${WEBUI_API_BASE_URL}/models?${searchParams.toString()}`, {
 		method: 'GET',
 		method: 'GET',
 		headers: {
 		headers: {
 			Accept: 'application/json',
 			Accept: 'application/json',
@@ -95,7 +98,10 @@ export const getModelById = async (token: string, id: string) => {
 export const updateModelById = async (token: string, id: string, model: object) => {
 export const updateModelById = async (token: string, id: string, model: object) => {
 	let error = null;
 	let error = null;
 
 
-	const res = await fetch(`${WEBUI_API_BASE_URL}/models/${id}/update`, {
+	const searchParams = new URLSearchParams();
+	searchParams.append('id', id);
+
+	const res = await fetch(`${WEBUI_API_BASE_URL}/models/update?${searchParams.toString()}`, {
 		method: 'POST',
 		method: 'POST',
 		headers: {
 		headers: {
 			Accept: 'application/json',
 			Accept: 'application/json',
@@ -128,7 +134,10 @@ export const updateModelById = async (token: string, id: string, model: object)
 export const deleteModelById = async (token: string, id: string) => {
 export const deleteModelById = async (token: string, id: string) => {
 	let error = null;
 	let error = null;
 
 
-	const res = await fetch(`${WEBUI_API_BASE_URL}/models/${id}/delete`, {
+	const searchParams = new URLSearchParams();
+	searchParams.append('id', id);
+
+	const res = await fetch(`${WEBUI_API_BASE_URL}/models/delete?${searchParams.toString()}`, {
 		method: 'DELETE',
 		method: 'DELETE',
 		headers: {
 		headers: {
 			Accept: 'application/json',
 			Accept: 'application/json',

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

@@ -164,7 +164,7 @@ export const getOllamaVersion = async (token: string = '') => {
 		throw error;
 		throw error;
 	}
 	}
 
 
-	return res?.version ?? '';
+	return res?.version ?? false;
 };
 };
 
 
 export const getOllamaModels = async (token: string = '') => {
 export const getOllamaModels = async (token: string = '') => {

+ 45 - 6
src/lib/components/admin/Settings/Database.svelte

@@ -1,13 +1,24 @@
 <script lang="ts">
 <script lang="ts">
+	import fileSaver from 'file-saver';
+	const { saveAs } = fileSaver;
+
 	import { downloadDatabase } from '$lib/apis/utils';
 	import { downloadDatabase } from '$lib/apis/utils';
 	import { onMount, getContext } from 'svelte';
 	import { onMount, getContext } from 'svelte';
-	import { config } from '$lib/stores';
+	import { config, user } from '$lib/stores';
 	import { toast } from 'svelte-sonner';
 	import { toast } from 'svelte-sonner';
+	import { getAllUserChats } from '$lib/apis/chats';
 
 
 	const i18n = getContext('i18n');
 	const i18n = getContext('i18n');
 
 
 	export let saveHandler: Function;
 	export let saveHandler: Function;
 
 
+	const exportAllUserChats = async () => {
+		let blob = new Blob([JSON.stringify(await getAllUserChats(localStorage.token))], {
+			type: 'application/json'
+		});
+		saveAs(blob, `all-chats-export-${Date.now()}.json`);
+	};
+
 	onMount(async () => {
 	onMount(async () => {
 		// permissions = await getUserPermissions(localStorage.token);
 		// permissions = await getUserPermissions(localStorage.token);
 	});
 	});
@@ -23,10 +34,10 @@
 		<div>
 		<div>
 			<div class=" mb-2 text-sm font-medium">{$i18n.t('Database')}</div>
 			<div class=" mb-2 text-sm font-medium">{$i18n.t('Database')}</div>
 
 
-			<div class="  flex w-full justify-between">
-				<!-- <div class=" self-center text-xs font-medium">{$i18n.t('Allow Chat Deletion')}</div> -->
+			{#if $config?.enable_admin_export ?? true}
+				<div class="  flex w-full justify-between">
+					<!-- <div class=" self-center text-xs font-medium">{$i18n.t('Allow Chat Deletion')}</div> -->
 
 
-				{#if $config?.admin_export_enabled ?? true}
 					<button
 					<button
 						class=" flex rounded-md py-1.5 px-3 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
 						class=" flex rounded-md py-1.5 px-3 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
 						type="button"
 						type="button"
@@ -55,8 +66,36 @@
 						</div>
 						</div>
 						<div class=" self-center text-sm font-medium">{$i18n.t('Download Database')}</div>
 						<div class=" self-center text-sm font-medium">{$i18n.t('Download Database')}</div>
 					</button>
 					</button>
-				{/if}
-			</div>
+				</div>
+
+				<hr class=" dark:border-gray-700 my-1" />
+
+				<button
+					class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
+					on:click={() => {
+						exportAllUserChats();
+					}}
+				>
+					<div class=" self-center mr-3">
+						<svg
+							xmlns="http://www.w3.org/2000/svg"
+							viewBox="0 0 16 16"
+							fill="currentColor"
+							class="w-4 h-4"
+						>
+							<path d="M2 3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3Z" />
+							<path
+								fill-rule="evenodd"
+								d="M13 6H3v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V6ZM8.75 7.75a.75.75 0 0 0-1.5 0v2.69L6.03 9.22a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l2.5-2.5a.75.75 0 1 0-1.06-1.06l-1.22 1.22V7.75Z"
+								clip-rule="evenodd"
+							/>
+						</svg>
+					</div>
+					<div class=" self-center text-sm font-medium">
+						{$i18n.t('Export All Chats (All Users)')}
+					</div>
+				</button>
+			{/if}
 		</div>
 		</div>
 	</div>
 	</div>
 
 

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

@@ -39,12 +39,7 @@
 	import MessageInput from '$lib/components/chat/MessageInput.svelte';
 	import MessageInput from '$lib/components/chat/MessageInput.svelte';
 	import Messages from '$lib/components/chat/Messages.svelte';
 	import Messages from '$lib/components/chat/Messages.svelte';
 	import Navbar from '$lib/components/layout/Navbar.svelte';
 	import Navbar from '$lib/components/layout/Navbar.svelte';
-	import {
-		LITELLM_API_BASE_URL,
-		OLLAMA_API_BASE_URL,
-		OPENAI_API_BASE_URL,
-		WEBUI_BASE_URL
-	} from '$lib/constants';
+	import { OLLAMA_API_BASE_URL, OPENAI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants';
 	import { createOpenAITextStream } from '$lib/apis/streaming';
 	import { createOpenAITextStream } from '$lib/apis/streaming';
 	import { queryMemory } from '$lib/apis/memories';
 	import { queryMemory } from '$lib/apis/memories';
 	import type { Writable } from 'svelte/store';
 	import type { Writable } from 'svelte/store';
@@ -779,9 +774,7 @@
 					docs: docs.length > 0 ? docs : undefined,
 					docs: docs.length > 0 ? docs : undefined,
 					citations: docs.length > 0
 					citations: docs.length > 0
 				},
 				},
-				model?.source?.toLowerCase() === 'litellm'
-					? `${LITELLM_API_BASE_URL}/v1`
-					: `${OPENAI_API_BASE_URL}`
+				`${OPENAI_API_BASE_URL}`
 			);
 			);
 
 
 			// Wait until history/message have been updated
 			// Wait until history/message have been updated
@@ -1120,6 +1113,6 @@
 		{messages}
 		{messages}
 		{submitPrompt}
 		{submitPrompt}
 		{stopResponse}
 		{stopResponse}
-		webSearchAvailable={$config.websearch ?? false}
+		webSearchAvailable={$config.enable_websearch ?? false}
 	/>
 	/>
 {/if}
 {/if}

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

@@ -80,6 +80,13 @@
 		return `<code>${code.replaceAll('&amp;', '&')}</code>`;
 		return `<code>${code.replaceAll('&amp;', '&')}</code>`;
 	};
 	};
 
 
+	// Open all links in a new tab/window (from https://github.com/markedjs/marked/issues/655#issuecomment-383226346)
+	const origLinkRenderer = renderer.link;
+	renderer.link = (href, title, text) => {
+		const html = origLinkRenderer.call(renderer, href, title, text);
+		return html.replace(/^<a /, '<a target="_blank" rel="nofollow" ');
+	};
+
 	const { extensions, ...defaults } = marked.getDefaults() as marked.MarkedOptions & {
 	const { extensions, ...defaults } = marked.getDefaults() as marked.MarkedOptions & {
 		// eslint-disable-next-line @typescript-eslint/no-explicit-any
 		// eslint-disable-next-line @typescript-eslint/no-explicit-any
 		extensions: any;
 		extensions: any;
@@ -790,7 +797,7 @@
 											</button>
 											</button>
 										</Tooltip>
 										</Tooltip>
 
 
-										{#if $config.images && !readOnly}
+										{#if $config.enable_image_generation && !readOnly}
 											<Tooltip content="Generate Image" placement="bottom">
 											<Tooltip content="Generate Image" placement="bottom">
 												<button
 												<button
 													class="{isLastMessage
 													class="{isLastMessage

+ 162 - 98
src/lib/components/chat/Settings/Chats.svelte

@@ -5,6 +5,7 @@
 	import { chats, user, config } from '$lib/stores';
 	import { chats, user, config } from '$lib/stores';
 
 
 	import {
 	import {
+		archiveAllChats,
 		createNewChat,
 		createNewChat,
 		deleteAllChats,
 		deleteAllChats,
 		getAllChats,
 		getAllChats,
@@ -22,7 +23,10 @@
 	// Chats
 	// Chats
 	let saveChatHistory = true;
 	let saveChatHistory = true;
 	let importFiles;
 	let importFiles;
+
+	let showArchiveConfirm = false;
 	let showDeleteConfirm = false;
 	let showDeleteConfirm = false;
+
 	let chatImportInputElement: HTMLInputElement;
 	let chatImportInputElement: HTMLInputElement;
 
 
 	$: if (importFiles) {
 	$: if (importFiles) {
@@ -68,14 +72,15 @@
 		saveAs(blob, `chat-export-${Date.now()}.json`);
 		saveAs(blob, `chat-export-${Date.now()}.json`);
 	};
 	};
 
 
-	const exportAllUserChats = async () => {
-		let blob = new Blob([JSON.stringify(await getAllUserChats(localStorage.token))], {
-			type: 'application/json'
+	const archiveAllChatsHandler = async () => {
+		await goto('/');
+		await archiveAllChats(localStorage.token).catch((error) => {
+			toast.error(error);
 		});
 		});
-		saveAs(blob, `all-chats-export-${Date.now()}.json`);
+		await chats.set(await getChatList(localStorage.token));
 	};
 	};
 
 
-	const deleteChats = async () => {
+	const deleteAllChatsHandler = async () => {
 		await goto('/');
 		await goto('/');
 		await deleteAllChats(localStorage.token).catch((error) => {
 		await deleteAllChats(localStorage.token).catch((error) => {
 			toast.error(error);
 			toast.error(error);
@@ -217,118 +222,177 @@
 
 
 		<hr class=" dark:border-gray-700" />
 		<hr class=" dark:border-gray-700" />
 
 
-		{#if showDeleteConfirm}
-			<div class="flex justify-between rounded-md items-center py-2 px-3.5 w-full transition">
-				<div class="flex items-center space-x-3">
-					<svg
-						xmlns="http://www.w3.org/2000/svg"
-						viewBox="0 0 16 16"
-						fill="currentColor"
-						class="w-4 h-4"
-					>
-						<path d="M2 3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3Z" />
-						<path
-							fill-rule="evenodd"
-							d="M13 6H3v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V6ZM5.72 7.47a.75.75 0 0 1 1.06 0L8 8.69l1.22-1.22a.75.75 0 1 1 1.06 1.06L9.06 9.75l1.22 1.22a.75.75 0 1 1-1.06 1.06L8 10.81l-1.22 1.22a.75.75 0 0 1-1.06-1.06l1.22-1.22-1.22-1.22a.75.75 0 0 1 0-1.06Z"
-							clip-rule="evenodd"
-						/>
-					</svg>
-					<span>{$i18n.t('Are you sure?')}</span>
-				</div>
-
-				<div class="flex space-x-1.5 items-center">
-					<button
-						class="hover:text-white transition"
-						on:click={() => {
-							deleteChats();
-							showDeleteConfirm = false;
-						}}
-					>
+		<div class="flex flex-col">
+			{#if showArchiveConfirm}
+				<div class="flex justify-between rounded-md items-center py-2 px-3.5 w-full transition">
+					<div class="flex items-center space-x-3">
 						<svg
 						<svg
 							xmlns="http://www.w3.org/2000/svg"
 							xmlns="http://www.w3.org/2000/svg"
-							viewBox="0 0 20 20"
+							viewBox="0 0 16 16"
 							fill="currentColor"
 							fill="currentColor"
 							class="w-4 h-4"
 							class="w-4 h-4"
 						>
 						>
+							<path d="M2 3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3Z" />
 							<path
 							<path
 								fill-rule="evenodd"
 								fill-rule="evenodd"
-								d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z"
+								d="M13 6H3v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V6ZM5.72 7.47a.75.75 0 0 1 1.06 0L8 8.69l1.22-1.22a.75.75 0 1 1 1.06 1.06L9.06 9.75l1.22 1.22a.75.75 0 1 1-1.06 1.06L8 10.81l-1.22 1.22a.75.75 0 0 1-1.06-1.06l1.22-1.22-1.22-1.22a.75.75 0 0 1 0-1.06Z"
 								clip-rule="evenodd"
 								clip-rule="evenodd"
 							/>
 							/>
 						</svg>
 						</svg>
-					</button>
-					<button
-						class="hover:text-white transition"
-						on:click={() => {
-							showDeleteConfirm = false;
-						}}
-					>
+						<span>{$i18n.t('Are you sure?')}</span>
+					</div>
+
+					<div class="flex space-x-1.5 items-center">
+						<button
+							class="hover:text-white transition"
+							on:click={() => {
+								archiveAllChatsHandler();
+								showArchiveConfirm = false;
+							}}
+						>
+							<svg
+								xmlns="http://www.w3.org/2000/svg"
+								viewBox="0 0 20 20"
+								fill="currentColor"
+								class="w-4 h-4"
+							>
+								<path
+									fill-rule="evenodd"
+									d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z"
+									clip-rule="evenodd"
+								/>
+							</svg>
+						</button>
+						<button
+							class="hover:text-white transition"
+							on:click={() => {
+								showArchiveConfirm = false;
+							}}
+						>
+							<svg
+								xmlns="http://www.w3.org/2000/svg"
+								viewBox="0 0 20 20"
+								fill="currentColor"
+								class="w-4 h-4"
+							>
+								<path
+									d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
+								/>
+							</svg>
+						</button>
+					</div>
+				</div>
+			{:else}
+				<button
+					class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
+					on:click={() => {
+						showArchiveConfirm = true;
+					}}
+				>
+					<div class=" self-center mr-3">
 						<svg
 						<svg
 							xmlns="http://www.w3.org/2000/svg"
 							xmlns="http://www.w3.org/2000/svg"
-							viewBox="0 0 20 20"
+							viewBox="0 0 24 24"
 							fill="currentColor"
 							fill="currentColor"
-							class="w-4 h-4"
+							class="size-4"
 						>
 						>
 							<path
 							<path
-								d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
+								d="M3.375 3C2.339 3 1.5 3.84 1.5 4.875v.75c0 1.036.84 1.875 1.875 1.875h17.25c1.035 0 1.875-.84 1.875-1.875v-.75C22.5 3.839 21.66 3 20.625 3H3.375Z"
+							/>
+							<path
+								fill-rule="evenodd"
+								d="m3.087 9 .54 9.176A3 3 0 0 0 6.62 21h10.757a3 3 0 0 0 2.995-2.824L20.913 9H3.087Zm6.163 3.75A.75.75 0 0 1 10 12h4a.75.75 0 0 1 0 1.5h-4a.75.75 0 0 1-.75-.75Z"
+								clip-rule="evenodd"
 							/>
 							/>
 						</svg>
 						</svg>
-					</button>
-				</div>
-			</div>
-		{:else}
-			<button
-				class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
-				on:click={() => {
-					showDeleteConfirm = true;
-				}}
-			>
-				<div class=" self-center mr-3">
-					<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="M4 2a1.5 1.5 0 0 0-1.5 1.5v9A1.5 1.5 0 0 0 4 14h8a1.5 1.5 0 0 0 1.5-1.5V6.621a1.5 1.5 0 0 0-.44-1.06L9.94 2.439A1.5 1.5 0 0 0 8.878 2H4Zm7 7a.75.75 0 0 1-.75.75h-4.5a.75.75 0 0 1 0-1.5h4.5A.75.75 0 0 1 11 9Z"
-							clip-rule="evenodd"
-						/>
-					</svg>
-				</div>
-				<div class=" self-center text-sm font-medium">{$i18n.t('Delete Chats')}</div>
-			</button>
-		{/if}
+					</div>
+					<div class=" self-center text-sm font-medium">{$i18n.t('Archive All Chats')}</div>
+				</button>
+			{/if}
 
 
-		{#if $user?.role === 'admin' && ($config?.admin_export_enabled ?? true)}
-			<hr class=" dark:border-gray-700" />
+			{#if showDeleteConfirm}
+				<div class="flex justify-between rounded-md items-center py-2 px-3.5 w-full transition">
+					<div class="flex items-center space-x-3">
+						<svg
+							xmlns="http://www.w3.org/2000/svg"
+							viewBox="0 0 16 16"
+							fill="currentColor"
+							class="w-4 h-4"
+						>
+							<path d="M2 3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3Z" />
+							<path
+								fill-rule="evenodd"
+								d="M13 6H3v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V6ZM5.72 7.47a.75.75 0 0 1 1.06 0L8 8.69l1.22-1.22a.75.75 0 1 1 1.06 1.06L9.06 9.75l1.22 1.22a.75.75 0 1 1-1.06 1.06L8 10.81l-1.22 1.22a.75.75 0 0 1-1.06-1.06l1.22-1.22-1.22-1.22a.75.75 0 0 1 0-1.06Z"
+								clip-rule="evenodd"
+							/>
+						</svg>
+						<span>{$i18n.t('Are you sure?')}</span>
+					</div>
 
 
-			<button
-				class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
-				on:click={() => {
-					exportAllUserChats();
-				}}
-			>
-				<div class=" self-center mr-3">
-					<svg
-						xmlns="http://www.w3.org/2000/svg"
-						viewBox="0 0 16 16"
-						fill="currentColor"
-						class="w-4 h-4"
-					>
-						<path d="M2 3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3Z" />
-						<path
-							fill-rule="evenodd"
-							d="M13 6H3v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V6ZM8.75 7.75a.75.75 0 0 0-1.5 0v2.69L6.03 9.22a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l2.5-2.5a.75.75 0 1 0-1.06-1.06l-1.22 1.22V7.75Z"
-							clip-rule="evenodd"
-						/>
-					</svg>
-				</div>
-				<div class=" self-center text-sm font-medium">
-					{$i18n.t('Export All Chats (All Users)')}
+					<div class="flex space-x-1.5 items-center">
+						<button
+							class="hover:text-white transition"
+							on:click={() => {
+								deleteAllChatsHandler();
+								showDeleteConfirm = false;
+							}}
+						>
+							<svg
+								xmlns="http://www.w3.org/2000/svg"
+								viewBox="0 0 20 20"
+								fill="currentColor"
+								class="w-4 h-4"
+							>
+								<path
+									fill-rule="evenodd"
+									d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z"
+									clip-rule="evenodd"
+								/>
+							</svg>
+						</button>
+						<button
+							class="hover:text-white transition"
+							on:click={() => {
+								showDeleteConfirm = false;
+							}}
+						>
+							<svg
+								xmlns="http://www.w3.org/2000/svg"
+								viewBox="0 0 20 20"
+								fill="currentColor"
+								class="w-4 h-4"
+							>
+								<path
+									d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
+								/>
+							</svg>
+						</button>
+					</div>
 				</div>
 				</div>
-			</button>
-		{/if}
+			{:else}
+				<button
+					class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
+					on:click={() => {
+						showDeleteConfirm = true;
+					}}
+				>
+					<div class=" self-center mr-3">
+						<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="M4 2a1.5 1.5 0 0 0-1.5 1.5v9A1.5 1.5 0 0 0 4 14h8a1.5 1.5 0 0 0 1.5-1.5V6.621a1.5 1.5 0 0 0-.44-1.06L9.94 2.439A1.5 1.5 0 0 0 8.878 2H4Zm7 7a.75.75 0 0 1-.75.75h-4.5a.75.75 0 0 1 0-1.5h4.5A.75.75 0 0 1 11 9Z"
+								clip-rule="evenodd"
+							/>
+						</svg>
+					</div>
+					<div class=" self-center text-sm font-medium">{$i18n.t('Delete All Chats')}</div>
+				</button>
+			{/if}
+		</div>
 	</div>
 	</div>
 </div>
 </div>

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

@@ -302,7 +302,7 @@
 					system: system !== '' ? system : undefined,
 					system: system !== '' ? system : undefined,
 					params: {
 					params: {
 						seed: (params.seed !== 0 ? params.seed : undefined) ?? undefined,
 						seed: (params.seed !== 0 ? params.seed : undefined) ?? undefined,
-						stop: params.stop !== null ? params.stop.split(',').filter((e) => e) : undefined,
+						stop: params.stop ? params.stop.split(',').filter((e) => e) : undefined,
 						temperature: params.temperature !== '' ? params.temperature : undefined,
 						temperature: params.temperature !== '' ? params.temperature : undefined,
 						frequency_penalty:
 						frequency_penalty:
 							params.frequency_penalty !== '' ? params.frequency_penalty : undefined,
 							params.frequency_penalty !== '' ? params.frequency_penalty : undefined,

+ 21 - 7
src/lib/components/chat/Settings/Models.svelte

@@ -18,6 +18,7 @@
 	import { onMount, getContext } from 'svelte';
 	import { onMount, getContext } from 'svelte';
 
 
 	import Tooltip from '$lib/components/common/Tooltip.svelte';
 	import Tooltip from '$lib/components/common/Tooltip.svelte';
+	import Spinner from '$lib/components/common/Spinner.svelte';
 
 
 	const i18n = getContext('i18n');
 	const i18n = getContext('i18n');
 
 
@@ -34,7 +35,8 @@
 	let updateProgress = null;
 	let updateProgress = null;
 
 
 	let showExperimentalOllama = false;
 	let showExperimentalOllama = false;
-	let ollamaVersion = '';
+
+	let ollamaVersion = null;
 	const MAX_PARALLEL_DOWNLOADS = 3;
 	const MAX_PARALLEL_DOWNLOADS = 3;
 
 
 	let modelTransferring = false;
 	let modelTransferring = false;
@@ -56,8 +58,11 @@
 	const updateModelsHandler = async () => {
 	const updateModelsHandler = async () => {
 		for (const model of $models.filter(
 		for (const model of $models.filter(
 			(m) =>
 			(m) =>
-				m.size != null &&
-				(selectedOllamaUrlIdx === null ? true : (m?.urls ?? []).includes(selectedOllamaUrlIdx))
+				!(m?.preset ?? false) &&
+				m.owned_by === 'ollama' &&
+				(selectedOllamaUrlIdx === null
+					? true
+					: (m?.ollama?.urls ?? []).includes(selectedOllamaUrlIdx))
 		)) {
 		)) {
 			console.log(model);
 			console.log(model);
 
 
@@ -446,7 +451,7 @@
 
 
 <div class="flex flex-col h-full justify-between text-sm">
 <div class="flex flex-col h-full justify-between text-sm">
 	<div class=" space-y-3 pr-1.5 overflow-y-scroll h-[24rem]">
 	<div class=" space-y-3 pr-1.5 overflow-y-scroll h-[24rem]">
-		{#if ollamaVersion}
+		{#if ollamaVersion !== null}
 			<div class="space-y-2 pr-1.5">
 			<div class="space-y-2 pr-1.5">
 				<div class="text-sm font-medium">{$i18n.t('Manage Ollama Models')}</div>
 				<div class="text-sm font-medium">{$i18n.t('Manage Ollama Models')}</div>
 
 
@@ -644,9 +649,12 @@
 									{#if !deleteModelTag}
 									{#if !deleteModelTag}
 										<option value="" disabled selected>{$i18n.t('Select a model')}</option>
 										<option value="" disabled selected>{$i18n.t('Select a model')}</option>
 									{/if}
 									{/if}
-									{#each $models.filter((m) => m.size != null && (selectedOllamaUrlIdx === null ? true : (m?.urls ?? []).includes(selectedOllamaUrlIdx))) as model}
+									{#each $models.filter((m) => !(m?.preset ?? false) && m.owned_by === 'ollama' && (selectedOllamaUrlIdx === null ? true : (m?.ollama?.urls ?? []).includes(selectedOllamaUrlIdx))) as model}
 										<option value={model.name} class="bg-gray-100 dark:bg-gray-700"
 										<option value={model.name} class="bg-gray-100 dark:bg-gray-700"
-											>{model.name + ' (' + (model.size / 1024 ** 3).toFixed(1) + ' GB)'}</option
+											>{model.name +
+												' (' +
+												(model.ollama.size / 1024 ** 3).toFixed(1) +
+												' GB)'}</option
 										>
 										>
 									{/each}
 									{/each}
 								</select>
 								</select>
@@ -874,8 +882,14 @@
 					{/if}
 					{/if}
 				</div>
 				</div>
 			</div>
 			</div>
-		{:else}
+		{:else if ollamaVersion === false}
 			<div>Ollama Not Detected</div>
 			<div>Ollama Not Detected</div>
+		{:else}
+			<div class="flex h-full justify-center">
+				<div class="my-auto">
+					<Spinner className="size-6" />
+				</div>
+			</div>
 		{/if}
 		{/if}
 	</div>
 	</div>
 </div>
 </div>

+ 3 - 3
src/lib/components/common/Spinner.svelte

@@ -1,9 +1,9 @@
 <script lang="ts">
 <script lang="ts">
-	export let className: string = '';
+	export let className: string = 'size-5';
 </script>
 </script>
 
 
-<div class="flex justify-center text-center {className}">
-	<svg class="size-5" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"
+<div class="flex justify-center text-center">
+	<svg class={className} viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"
 		><style>
 		><style>
 			.spinner_ajPY {
 			.spinner_ajPY {
 				transform-origin: center;
 				transform-origin: center;

+ 135 - 90
src/lib/components/layout/Sidebar/ArchivedChatsModal.svelte

@@ -1,4 +1,6 @@
 <script lang="ts">
 <script lang="ts">
+	import fileSaver from 'file-saver';
+	const { saveAs } = fileSaver;
 	import { toast } from 'svelte-sonner';
 	import { toast } from 'svelte-sonner';
 	import dayjs from 'dayjs';
 	import dayjs from 'dayjs';
 	import { getContext, createEventDispatcher } from 'svelte';
 	import { getContext, createEventDispatcher } from 'svelte';
@@ -13,6 +15,8 @@
 
 
 	export let show = false;
 	export let show = false;
 
 
+	let searchValue = '';
+
 	let chats = [];
 	let chats = [];
 
 
 	const unarchiveChatHandler = async (chatId) => {
 	const unarchiveChatHandler = async (chatId) => {
@@ -33,6 +37,13 @@
 		chats = await getArchivedChatList(localStorage.token);
 		chats = await getArchivedChatList(localStorage.token);
 	};
 	};
 
 
+	const exportChatsHandler = async () => {
+		let blob = new Blob([JSON.stringify(chats)], {
+			type: 'application/json'
+		});
+		saveAs(blob, `archived-chat-export-${Date.now()}.json`);
+	};
+
 	$: if (show) {
 	$: if (show) {
 		(async () => {
 		(async () => {
 			chats = await getArchivedChatList(localStorage.token);
 			chats = await getArchivedChatList(localStorage.token);
@@ -63,102 +74,136 @@
 			</button>
 			</button>
 		</div>
 		</div>
 
 
-		<div class="flex flex-col md:flex-row w-full px-5 pb-4 md:space-x-4 dark:text-gray-200">
+		<div class="flex flex-col w-full px-5 pb-4 dark:text-gray-200">
+			<div class=" flex w-full mt-2 space-x-2">
+				<div class="flex flex-1">
+					<div class=" self-center ml-1 mr-3">
+						<svg
+							xmlns="http://www.w3.org/2000/svg"
+							viewBox="0 0 20 20"
+							fill="currentColor"
+							class="w-4 h-4"
+						>
+							<path
+								fill-rule="evenodd"
+								d="M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z"
+								clip-rule="evenodd"
+							/>
+						</svg>
+					</div>
+					<input
+						class=" w-full text-sm pr-4 py-1 rounded-r-xl outline-none bg-transparent"
+						bind:value={searchValue}
+						placeholder={$i18n.t('Search Chats')}
+					/>
+				</div>
+			</div>
+			<hr class=" dark:border-gray-850 my-2" />
 			<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
 			<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
 				{#if chats.length > 0}
 				{#if chats.length > 0}
-					<div class="text-left text-sm w-full mb-4 max-h-[22rem] overflow-y-scroll">
-						<div class="relative overflow-x-auto">
-							<table class="w-full text-sm text-left text-gray-600 dark:text-gray-400 table-auto">
-								<thead
-									class="text-xs text-gray-700 uppercase bg-transparent dark:text-gray-200 border-b-2 dark:border-gray-800"
-								>
-									<tr>
-										<th scope="col" class="px-3 py-2"> {$i18n.t('Name')} </th>
-										<th scope="col" class="px-3 py-2 hidden md:flex"> {$i18n.t('Created At')} </th>
-										<th scope="col" class="px-3 py-2 text-right" />
-									</tr>
-								</thead>
-								<tbody>
-									{#each chats as chat, idx}
-										<tr
-											class="bg-transparent {idx !== chats.length - 1 &&
-												'border-b'} dark:bg-gray-900 dark:border-gray-850 text-xs"
-										>
-											<td class="px-3 py-1 w-2/3">
-												<a href="/c/{chat.id}" target="_blank">
-													<div class=" underline line-clamp-1">
-														{chat.title}
+					<div>
+						<div class="text-left text-sm w-full mb-3 max-h-[22rem] overflow-y-scroll">
+							<div class="relative overflow-x-auto">
+								<table class="w-full text-sm text-left text-gray-600 dark:text-gray-400 table-auto">
+									<thead
+										class="text-xs text-gray-700 uppercase bg-transparent dark:text-gray-200 border-b-2 dark:border-gray-800"
+									>
+										<tr>
+											<th scope="col" class="px-3 py-2"> {$i18n.t('Name')} </th>
+											<th scope="col" class="px-3 py-2 hidden md:flex">
+												{$i18n.t('Created At')}
+											</th>
+											<th scope="col" class="px-3 py-2 text-right" />
+										</tr>
+									</thead>
+									<tbody>
+										{#each chats.filter((c) => searchValue === '' || c.title
+													.toLowerCase()
+													.includes(searchValue.toLowerCase())) as chat, idx}
+											<tr
+												class="bg-transparent {idx !== chats.length - 1 &&
+													'border-b'} dark:bg-gray-900 dark:border-gray-850 text-xs"
+											>
+												<td class="px-3 py-1 w-2/3">
+													<a href="/c/{chat.id}" target="_blank">
+														<div class=" underline line-clamp-1">
+															{chat.title}
+														</div>
+													</a>
+												</td>
+
+												<td class=" px-3 py-1 hidden md:flex h-[2.5rem]">
+													<div class="my-auto">
+														{dayjs(chat.created_at * 1000).format($i18n.t('MMMM DD, YYYY HH:mm'))}
 													</div>
 													</div>
-												</a>
-											</td>
-
-											<td class=" px-3 py-1 hidden md:flex h-[2.5rem]">
-												<div class="my-auto">
-													{dayjs(chat.created_at * 1000).format($i18n.t('MMMM DD, YYYY HH:mm'))}
-												</div>
-											</td>
-
-											<td class="px-3 py-1 text-right">
-												<div class="flex justify-end w-full">
-													<Tooltip content="Unarchive Chat">
-														<button
-															class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
-															on:click={async () => {
-																unarchiveChatHandler(chat.id);
-															}}
-														>
-															<svg
-																xmlns="http://www.w3.org/2000/svg"
-																fill="none"
-																viewBox="0 0 24 24"
-																stroke-width="1.5"
-																stroke="currentColor"
-																class="size-4"
+												</td>
+
+												<td class="px-3 py-1 text-right">
+													<div class="flex justify-end w-full">
+														<Tooltip content="Unarchive Chat">
+															<button
+																class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
+																on:click={async () => {
+																	unarchiveChatHandler(chat.id);
+																}}
 															>
 															>
-																<path
-																	stroke-linecap="round"
-																	stroke-linejoin="round"
-																	d="M9 8.25H7.5a2.25 2.25 0 0 0-2.25 2.25v9a2.25 2.25 0 0 0 2.25 2.25h9a2.25 2.25 0 0 0 2.25-2.25v-9a2.25 2.25 0 0 0-2.25-2.25H15m0-3-3-3m0 0-3 3m3-3V15"
-																/>
-															</svg>
-														</button>
-													</Tooltip>
-
-													<Tooltip content="Delete Chat">
-														<button
-															class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
-															on:click={async () => {
-																deleteChatHandler(chat.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"
+																<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="M9 8.25H7.5a2.25 2.25 0 0 0-2.25 2.25v9a2.25 2.25 0 0 0 2.25 2.25h9a2.25 2.25 0 0 0 2.25-2.25v-9a2.25 2.25 0 0 0-2.25-2.25H15m0-3-3-3m0 0-3 3m3-3V15"
+																	/>
+																</svg>
+															</button>
+														</Tooltip>
+
+														<Tooltip content="Delete Chat">
+															<button
+																class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
+																on:click={async () => {
+																	deleteChatHandler(chat.id);
+																}}
 															>
 															>
-																<path
-																	stroke-linecap="round"
-																	stroke-linejoin="round"
-																	d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0"
-																/>
-															</svg>
-														</button>
-													</Tooltip>
-												</div>
-											</td>
-										</tr>
-									{/each}
-								</tbody>
-							</table>
-						</div>
-						<!-- {#each chats as chat}
-							<div>
-								{JSON.stringify(chat)}
+																<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="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0"
+																	/>
+																</svg>
+															</button>
+														</Tooltip>
+													</div>
+												</td>
+											</tr>
+										{/each}
+									</tbody>
+								</table>
 							</div>
 							</div>
-						{/each} -->
+						</div>
+
+						<div class="flex flex-wrap text-sm font-medium gap-1.5 mt-2 m-1">
+							<button
+								class=" px-3.5 py-1.5 font-medium hover:bg-black/5 dark:hover:bg-white/5 outline outline-1 outline-gray-300 dark:outline-gray-800 rounded-3xl"
+								on:click={() => {
+									exportChatsHandler();
+								}}>Export All Archived Chats</button
+							>
+						</div>
 					</div>
 					</div>
 				{:else}
 				{:else}
 					<div class="text-left text-sm w-full mb-8">
 					<div class="text-left text-sm w-full mb-8">

+ 48 - 1
src/lib/components/workspace/Models.svelte

@@ -20,6 +20,8 @@
 	let importFiles;
 	let importFiles;
 	let modelsImportInputElement: HTMLInputElement;
 	let modelsImportInputElement: HTMLInputElement;
 
 
+	let searchValue = '';
+
 	const deleteModelHandler = async (model) => {
 	const deleteModelHandler = async (model) => {
 		console.log(model.info);
 		console.log(model.info);
 		if (!model?.info) {
 		if (!model?.info) {
@@ -97,6 +99,49 @@
 
 
 <div class=" text-lg font-semibold mb-3">{$i18n.t('Models')}</div>
 <div class=" text-lg font-semibold mb-3">{$i18n.t('Models')}</div>
 
 
+<div class=" flex w-full space-x-2">
+	<div class="flex flex-1">
+		<div class=" self-center ml-1 mr-3">
+			<svg
+				xmlns="http://www.w3.org/2000/svg"
+				viewBox="0 0 20 20"
+				fill="currentColor"
+				class="w-4 h-4"
+			>
+				<path
+					fill-rule="evenodd"
+					d="M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z"
+					clip-rule="evenodd"
+				/>
+			</svg>
+		</div>
+		<input
+			class=" w-full text-sm pr-4 py-1 rounded-r-xl outline-none bg-transparent"
+			bind:value={searchValue}
+			placeholder={$i18n.t('Search Models')}
+		/>
+	</div>
+
+	<div>
+		<a
+			class=" px-2 py-2 rounded-xl border border-gray-200 dark:border-gray-600 dark:border-0 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 transition font-medium text-sm flex items-center space-x-1"
+			href="/workspace/models/create"
+		>
+			<svg
+				xmlns="http://www.w3.org/2000/svg"
+				viewBox="0 0 16 16"
+				fill="currentColor"
+				class="w-4 h-4"
+			>
+				<path
+					d="M8.75 3.75a.75.75 0 0 0-1.5 0v3.5h-3.5a.75.75 0 0 0 0 1.5h3.5v3.5a.75.75 0 0 0 1.5 0v-3.5h3.5a.75.75 0 0 0 0-1.5h-3.5v-3.5Z"
+				/>
+			</svg>
+		</a>
+	</div>
+</div>
+<hr class=" dark:border-gray-850 my-2.5" />
+
 <a class=" flex space-x-4 cursor-pointer w-full mb-2 px-3 py-2" href="/workspace/models/create">
 <a class=" flex space-x-4 cursor-pointer w-full mb-2 px-3 py-2" href="/workspace/models/create">
 	<div class=" self-center w-10">
 	<div class=" self-center w-10">
 		<div
 		<div
@@ -121,7 +166,9 @@
 <hr class=" dark:border-gray-850" />
 <hr class=" dark:border-gray-850" />
 
 
 <div class=" my-2 mb-5">
 <div class=" my-2 mb-5">
-	{#each $models as model}
+	{#each $models.filter((m) => searchValue === '' || m.name
+				.toLowerCase()
+				.includes(searchValue.toLowerCase())) as model}
 		<div
 		<div
 			class=" flex space-x-4 cursor-pointer w-full px-3 py-2 dark:hover:bg-white/5 hover:bg-black/5 rounded-xl"
 			class=" flex space-x-4 cursor-pointer w-full px-3 py-2 dark:hover:bg-white/5 hover:bg-black/5 rounded-xl"
 		>
 		>

+ 3 - 16
src/lib/components/workspace/Playground.svelte

@@ -5,12 +5,7 @@
 
 
 	import { toast } from 'svelte-sonner';
 	import { toast } from 'svelte-sonner';
 
 
-	import {
-		LITELLM_API_BASE_URL,
-		OLLAMA_API_BASE_URL,
-		OPENAI_API_BASE_URL,
-		WEBUI_API_BASE_URL
-	} from '$lib/constants';
+	import { OLLAMA_API_BASE_URL, OPENAI_API_BASE_URL, WEBUI_API_BASE_URL } from '$lib/constants';
 	import { WEBUI_NAME, config, user, models, settings } from '$lib/stores';
 	import { WEBUI_NAME, config, user, models, settings } from '$lib/stores';
 
 
 	import { cancelOllamaRequest, generateChatCompletion } from '$lib/apis/ollama';
 	import { cancelOllamaRequest, generateChatCompletion } from '$lib/apis/ollama';
@@ -79,11 +74,7 @@
 					}
 					}
 				]
 				]
 			},
 			},
-			model.external
-				? model.source === 'litellm'
-					? `${LITELLM_API_BASE_URL}/v1`
-					: `${OPENAI_API_BASE_URL}`
-				: `${OLLAMA_API_BASE_URL}/v1`
+			model?.owned_by === 'openai' ? `${OPENAI_API_BASE_URL}` : `${OLLAMA_API_BASE_URL}/v1`
 		);
 		);
 
 
 		if (res && res.ok) {
 		if (res && res.ok) {
@@ -150,11 +141,7 @@
 					...messages
 					...messages
 				].filter((message) => message)
 				].filter((message) => message)
 			},
 			},
-			model.external
-				? model.source === 'litellm'
-					? `${LITELLM_API_BASE_URL}/v1`
-					: `${OPENAI_API_BASE_URL}`
-				: `${OLLAMA_API_BASE_URL}/v1`
+			model?.owned_by === 'openai' ? `${OPENAI_API_BASE_URL}` : `${OLLAMA_API_BASE_URL}/v1`
 		);
 		);
 
 
 		let responseMessage;
 		let responseMessage;

+ 0 - 1
src/lib/constants.ts

@@ -6,7 +6,6 @@ export const WEBUI_BASE_URL = browser ? (dev ? `http://${location.hostname}:8080
 
 
 export const WEBUI_API_BASE_URL = `${WEBUI_BASE_URL}/api/v1`;
 export const WEBUI_API_BASE_URL = `${WEBUI_BASE_URL}/api/v1`;
 
 
-export const LITELLM_API_BASE_URL = `${WEBUI_BASE_URL}/litellm/api`;
 export const OLLAMA_API_BASE_URL = `${WEBUI_BASE_URL}/ollama`;
 export const OLLAMA_API_BASE_URL = `${WEBUI_BASE_URL}/ollama`;
 export const OPENAI_API_BASE_URL = `${WEBUI_BASE_URL}/openai`;
 export const OPENAI_API_BASE_URL = `${WEBUI_BASE_URL}/openai`;
 export const AUDIO_API_BASE_URL = `${WEBUI_BASE_URL}/audio/api/v1`;
 export const AUDIO_API_BASE_URL = `${WEBUI_BASE_URL}/audio/api/v1`;

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

@@ -48,6 +48,7 @@
 	"API keys": "مفاتيح واجهة برمجة التطبيقات",
 	"API keys": "مفاتيح واجهة برمجة التطبيقات",
 	"April": "أبريل",
 	"April": "أبريل",
 	"Archive": "الأرشيف",
 	"Archive": "الأرشيف",
+	"Archive All Chats": "",
 	"Archived Chats": "الأرشيف المحادثات",
 	"Archived Chats": "الأرشيف المحادثات",
 	"are allowed - Activate this command by typing": "مسموح - قم بتنشيط هذا الأمر عن طريق الكتابة",
 	"are allowed - Activate this command by typing": "مسموح - قم بتنشيط هذا الأمر عن طريق الكتابة",
 	"Are you sure?": "هل أنت متأكد ؟",
 	"Are you sure?": "هل أنت متأكد ؟",
@@ -120,7 +121,6 @@
 	"Custom": "مخصص",
 	"Custom": "مخصص",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "مظلم",
 	"Dark": "مظلم",
-	"Dashboard": "لوحة التحكم",
 	"Database": "قاعدة البيانات",
 	"Database": "قاعدة البيانات",
 	"December": "ديسمبر",
 	"December": "ديسمبر",
 	"Default": "الإفتراضي",
 	"Default": "الإفتراضي",
@@ -133,9 +133,9 @@
 	"delete": "حذف",
 	"delete": "حذف",
 	"Delete": "حذف",
 	"Delete": "حذف",
 	"Delete a model": "حذف الموديل",
 	"Delete a model": "حذف الموديل",
+	"Delete All Chats": "",
 	"Delete chat": "حذف المحادثه",
 	"Delete chat": "حذف المحادثه",
 	"Delete Chat": "حذف المحادثه.",
 	"Delete Chat": "حذف المحادثه.",
-	"Delete Chats": "حذف المحادثات",
 	"delete this link": "أحذف هذا الرابط",
 	"delete this link": "أحذف هذا الرابط",
 	"Delete User": "حذف المستخدم",
 	"Delete User": "حذف المستخدم",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} حذف",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} حذف",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "URL/مفتاح OpenAI.مطلوب عنوان ",
 	"OpenAI URL/Key required.": "URL/مفتاح OpenAI.مطلوب عنوان ",
 	"or": "أو",
 	"or": "أو",
 	"Other": "آخر",
 	"Other": "آخر",
-	"Overview": "عرض",
 	"Password": "الباسورد",
 	"Password": "الباسورد",
 	"PDF document (.pdf)": "PDF ملف (.pdf)",
 	"PDF document (.pdf)": "PDF ملف (.pdf)",
 	"PDF Extract Images (OCR)": "PDF أستخرج الصور (OCR)",
 	"PDF Extract Images (OCR)": "PDF أستخرج الصور (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "{{path}} مسح على الملفات من",
 	"Scan for documents from {{path}}": "{{path}} مسح على الملفات من",
 	"Search": "البحث",
 	"Search": "البحث",
 	"Search a model": "البحث عن موديل",
 	"Search a model": "البحث عن موديل",
+	"Search Chats": "",
 	"Search Documents": "البحث المستندات",
 	"Search Documents": "البحث المستندات",
+	"Search Models": "",
 	"Search Prompts": "أبحث حث",
 	"Search Prompts": "أبحث حث",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "API Ключове",
 	"API keys": "API Ключове",
 	"April": "Април",
 	"April": "Април",
 	"Archive": "Архивирани Чатове",
 	"Archive": "Архивирани Чатове",
+	"Archive All Chats": "",
 	"Archived Chats": "Архивирани Чатове",
 	"Archived Chats": "Архивирани Чатове",
 	"are allowed - Activate this command by typing": "са разрешени - Активирайте тази команда чрез въвеждане",
 	"are allowed - Activate this command by typing": "са разрешени - Активирайте тази команда чрез въвеждане",
 	"Are you sure?": "Сигурни ли сте?",
 	"Are you sure?": "Сигурни ли сте?",
@@ -120,7 +121,6 @@
 	"Custom": "Персонализиран",
 	"Custom": "Персонализиран",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Тъмен",
 	"Dark": "Тъмен",
-	"Dashboard": "Панел",
 	"Database": "База данни",
 	"Database": "База данни",
 	"December": "Декември",
 	"December": "Декември",
 	"Default": "По подразбиране",
 	"Default": "По подразбиране",
@@ -133,9 +133,9 @@
 	"delete": "изтриване",
 	"delete": "изтриване",
 	"Delete": "Изтриване",
 	"Delete": "Изтриване",
 	"Delete a model": "Изтриване на модел",
 	"Delete a model": "Изтриване на модел",
+	"Delete All Chats": "",
 	"Delete chat": "Изтриване на чат",
 	"Delete chat": "Изтриване на чат",
 	"Delete Chat": "Изтриване на Чат",
 	"Delete Chat": "Изтриване на Чат",
-	"Delete Chats": "Изтриване на Чатове",
 	"delete this link": "Изтриване на този линк",
 	"delete this link": "Изтриване на този линк",
 	"Delete User": "Изтриване на потребител",
 	"Delete User": "Изтриване на потребител",
 	"Deleted {{deleteModelTag}}": "Изтрито {{deleteModelTag}}",
 	"Deleted {{deleteModelTag}}": "Изтрито {{deleteModelTag}}",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "OpenAI URL/Key е задължителен.",
 	"OpenAI URL/Key required.": "OpenAI URL/Key е задължителен.",
 	"or": "или",
 	"or": "или",
 	"Other": "Other",
 	"Other": "Other",
-	"Overview": "Обзор",
 	"Password": "Парола",
 	"Password": "Парола",
 	"PDF document (.pdf)": "PDF документ (.pdf)",
 	"PDF document (.pdf)": "PDF документ (.pdf)",
 	"PDF Extract Images (OCR)": "PDF Extract Images (OCR)",
 	"PDF Extract Images (OCR)": "PDF Extract Images (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "Сканиране за документи в {{path}}",
 	"Scan for documents from {{path}}": "Сканиране за документи в {{path}}",
 	"Search": "Търси",
 	"Search": "Търси",
 	"Search a model": "Търси модел",
 	"Search a model": "Търси модел",
+	"Search Chats": "",
 	"Search Documents": "Търси Документи",
 	"Search Documents": "Търси Документи",
+	"Search Models": "",
 	"Search Prompts": "Търси Промптове",
 	"Search Prompts": "Търси Промптове",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "এপিআই কোডস",
 	"API keys": "এপিআই কোডস",
 	"April": "আপ্রিল",
 	"April": "আপ্রিল",
 	"Archive": "আর্কাইভ",
 	"Archive": "আর্কাইভ",
+	"Archive All Chats": "",
 	"Archived Chats": "চ্যাট ইতিহাস সংরক্ষণাগার",
 	"Archived Chats": "চ্যাট ইতিহাস সংরক্ষণাগার",
 	"are allowed - Activate this command by typing": "অনুমোদিত - কমান্ডটি চালু করার জন্য লিখুন",
 	"are allowed - Activate this command by typing": "অনুমোদিত - কমান্ডটি চালু করার জন্য লিখুন",
 	"Are you sure?": "আপনি নিশ্চিত?",
 	"Are you sure?": "আপনি নিশ্চিত?",
@@ -120,7 +121,6 @@
 	"Custom": "কাস্টম",
 	"Custom": "কাস্টম",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "ডার্ক",
 	"Dark": "ডার্ক",
-	"Dashboard": "ড্যাশবোর্ড",
 	"Database": "ডেটাবেজ",
 	"Database": "ডেটাবেজ",
 	"December": "ডেসেম্বর",
 	"December": "ডেসেম্বর",
 	"Default": "ডিফল্ট",
 	"Default": "ডিফল্ট",
@@ -133,9 +133,9 @@
 	"delete": "মুছে ফেলুন",
 	"delete": "মুছে ফেলুন",
 	"Delete": "মুছে ফেলুন",
 	"Delete": "মুছে ফেলুন",
 	"Delete a model": "একটি মডেল মুছে ফেলুন",
 	"Delete a model": "একটি মডেল মুছে ফেলুন",
+	"Delete All Chats": "",
 	"Delete chat": "চ্যাট মুছে ফেলুন",
 	"Delete chat": "চ্যাট মুছে ফেলুন",
 	"Delete Chat": "চ্যাট মুছে ফেলুন",
 	"Delete Chat": "চ্যাট মুছে ফেলুন",
-	"Delete Chats": "চ্যাটগুলো মুছে ফেলুন",
 	"delete this link": "এই লিংক মুছে ফেলুন",
 	"delete this link": "এই লিংক মুছে ফেলুন",
 	"Delete User": "ইউজার মুছে ফেলুন",
 	"Delete User": "ইউজার মুছে ফেলুন",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} মুছে ফেলা হয়েছে",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} মুছে ফেলা হয়েছে",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "OpenAI URL/Key আবশ্যক",
 	"OpenAI URL/Key required.": "OpenAI URL/Key আবশ্যক",
 	"or": "অথবা",
 	"or": "অথবা",
 	"Other": "অন্যান্য",
 	"Other": "অন্যান্য",
-	"Overview": "বিবরণ",
 	"Password": "পাসওয়ার্ড",
 	"Password": "পাসওয়ার্ড",
 	"PDF document (.pdf)": "PDF ডকুমেন্ট (.pdf)",
 	"PDF document (.pdf)": "PDF ডকুমেন্ট (.pdf)",
 	"PDF Extract Images (OCR)": "পিডিএফ এর ছবি থেকে লেখা বের করুন (OCR)",
 	"PDF Extract Images (OCR)": "পিডিএফ এর ছবি থেকে লেখা বের করুন (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "ডকুমেন্টসমূহের জন্য {{path}} স্ক্যান করুন",
 	"Scan for documents from {{path}}": "ডকুমেন্টসমূহের জন্য {{path}} স্ক্যান করুন",
 	"Search": "অনুসন্ধান",
 	"Search": "অনুসন্ধান",
 	"Search a model": "মডেল অনুসন্ধান করুন",
 	"Search a model": "মডেল অনুসন্ধান করুন",
+	"Search Chats": "",
 	"Search Documents": "ডকুমেন্টসমূহ অনুসন্ধান করুন",
 	"Search Documents": "ডকুমেন্টসমূহ অনুসন্ধান করুন",
+	"Search Models": "",
 	"Search Prompts": "প্রম্পটসমূহ অনুসন্ধান করুন",
 	"Search Prompts": "প্রম্পটসমূহ অনুসন্ধান করুন",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "Claus de l'API",
 	"API keys": "Claus de l'API",
 	"April": "Abril",
 	"April": "Abril",
 	"Archive": "Arxiu",
 	"Archive": "Arxiu",
+	"Archive All Chats": "",
 	"Archived Chats": "Arxiu d'historial de xat",
 	"Archived Chats": "Arxiu d'historial de xat",
 	"are allowed - Activate this command by typing": "estan permesos - Activa aquesta comanda escrivint",
 	"are allowed - Activate this command by typing": "estan permesos - Activa aquesta comanda escrivint",
 	"Are you sure?": "Estàs segur?",
 	"Are you sure?": "Estàs segur?",
@@ -120,7 +121,6 @@
 	"Custom": "Personalitzat",
 	"Custom": "Personalitzat",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Fosc",
 	"Dark": "Fosc",
-	"Dashboard": "Tauler",
 	"Database": "Base de Dades",
 	"Database": "Base de Dades",
 	"December": "Desembre",
 	"December": "Desembre",
 	"Default": "Per defecte",
 	"Default": "Per defecte",
@@ -133,9 +133,9 @@
 	"delete": "esborra",
 	"delete": "esborra",
 	"Delete": "Esborra",
 	"Delete": "Esborra",
 	"Delete a model": "Esborra un model",
 	"Delete a model": "Esborra un model",
+	"Delete All Chats": "",
 	"Delete chat": "Esborra xat",
 	"Delete chat": "Esborra xat",
 	"Delete Chat": "Esborra Xat",
 	"Delete Chat": "Esborra Xat",
-	"Delete Chats": "Esborra Xats",
 	"delete this link": "Esborra aquest enllaç",
 	"delete this link": "Esborra aquest enllaç",
 	"Delete User": "Esborra Usuari",
 	"Delete User": "Esborra Usuari",
 	"Deleted {{deleteModelTag}}": "Esborrat {{deleteModelTag}}",
 	"Deleted {{deleteModelTag}}": "Esborrat {{deleteModelTag}}",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "URL/Clau d'OpenAI requerides.",
 	"OpenAI URL/Key required.": "URL/Clau d'OpenAI requerides.",
 	"or": "o",
 	"or": "o",
 	"Other": "Altres",
 	"Other": "Altres",
-	"Overview": "Visió general",
 	"Password": "Contrasenya",
 	"Password": "Contrasenya",
 	"PDF document (.pdf)": "Document PDF (.pdf)",
 	"PDF document (.pdf)": "Document PDF (.pdf)",
 	"PDF Extract Images (OCR)": "Extreu Imatges de PDF (OCR)",
 	"PDF Extract Images (OCR)": "Extreu Imatges de PDF (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "Escaneja documents des de {{path}}",
 	"Scan for documents from {{path}}": "Escaneja documents des de {{path}}",
 	"Search": "Cerca",
 	"Search": "Cerca",
 	"Search a model": "Cerca un model",
 	"Search a model": "Cerca un model",
+	"Search Chats": "",
 	"Search Documents": "Cerca Documents",
 	"Search Documents": "Cerca Documents",
+	"Search Models": "",
 	"Search Prompts": "Cerca Prompts",
 	"Search Prompts": "Cerca Prompts",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "",
 	"API keys": "",
 	"April": "",
 	"April": "",
 	"Archive": "",
 	"Archive": "",
+	"Archive All Chats": "",
 	"Archived Chats": "pagrekord sa chat",
 	"Archived Chats": "pagrekord sa chat",
 	"are allowed - Activate this command by typing": "gitugotan - I-enable kini nga sugo pinaagi sa pag-type",
 	"are allowed - Activate this command by typing": "gitugotan - I-enable kini nga sugo pinaagi sa pag-type",
 	"Are you sure?": "Sigurado ka ?",
 	"Are you sure?": "Sigurado ka ?",
@@ -120,7 +121,6 @@
 	"Custom": "Custom",
 	"Custom": "Custom",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Ngitngit",
 	"Dark": "Ngitngit",
-	"Dashboard": "",
 	"Database": "Database",
 	"Database": "Database",
 	"December": "",
 	"December": "",
 	"Default": "Pinaagi sa default",
 	"Default": "Pinaagi sa default",
@@ -133,9 +133,9 @@
 	"delete": "DELETE",
 	"delete": "DELETE",
 	"Delete": "",
 	"Delete": "",
 	"Delete a model": "Pagtangtang sa usa ka template",
 	"Delete a model": "Pagtangtang sa usa ka template",
+	"Delete All Chats": "",
 	"Delete chat": "Pagtangtang sa panaghisgot",
 	"Delete chat": "Pagtangtang sa panaghisgot",
 	"Delete Chat": "",
 	"Delete Chat": "",
-	"Delete Chats": "Pagtangtang sa mga chat",
 	"delete this link": "",
 	"delete this link": "",
 	"Delete User": "",
 	"Delete User": "",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} gipapas",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} gipapas",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "",
 	"OpenAI URL/Key required.": "",
 	"or": "O",
 	"or": "O",
 	"Other": "",
 	"Other": "",
-	"Overview": "",
 	"Password": "Password",
 	"Password": "Password",
 	"PDF document (.pdf)": "",
 	"PDF document (.pdf)": "",
 	"PDF Extract Images (OCR)": "PDF Image Extraction (OCR)",
 	"PDF Extract Images (OCR)": "PDF Image Extraction (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "I-scan ang mga dokumento gikan sa {{path}}",
 	"Scan for documents from {{path}}": "I-scan ang mga dokumento gikan sa {{path}}",
 	"Search": "Pagpanukiduki",
 	"Search": "Pagpanukiduki",
 	"Search a model": "",
 	"Search a model": "",
+	"Search Chats": "",
 	"Search Documents": "Pangitaa ang mga dokumento",
 	"Search Documents": "Pangitaa ang mga dokumento",
+	"Search Models": "",
 	"Search Prompts": "Pangitaa ang mga prompt",
 	"Search Prompts": "Pangitaa ang mga prompt",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "API Schlüssel",
 	"API keys": "API Schlüssel",
 	"April": "April",
 	"April": "April",
 	"Archive": "Archivieren",
 	"Archive": "Archivieren",
+	"Archive All Chats": "",
 	"Archived Chats": "Archivierte Chats",
 	"Archived Chats": "Archivierte Chats",
 	"are allowed - Activate this command by typing": "sind erlaubt - Aktiviere diesen Befehl, indem du",
 	"are allowed - Activate this command by typing": "sind erlaubt - Aktiviere diesen Befehl, indem du",
 	"Are you sure?": "Bist du sicher?",
 	"Are you sure?": "Bist du sicher?",
@@ -120,7 +121,6 @@
 	"Custom": "Benutzerdefiniert",
 	"Custom": "Benutzerdefiniert",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Dunkel",
 	"Dark": "Dunkel",
-	"Dashboard": "Dashboard",
 	"Database": "Datenbank",
 	"Database": "Datenbank",
 	"December": "Dezember",
 	"December": "Dezember",
 	"Default": "Standard",
 	"Default": "Standard",
@@ -133,9 +133,9 @@
 	"delete": "löschen",
 	"delete": "löschen",
 	"Delete": "Löschen",
 	"Delete": "Löschen",
 	"Delete a model": "Ein Modell löschen",
 	"Delete a model": "Ein Modell löschen",
+	"Delete All Chats": "",
 	"Delete chat": "Chat löschen",
 	"Delete chat": "Chat löschen",
 	"Delete Chat": "Chat löschen",
 	"Delete Chat": "Chat löschen",
-	"Delete Chats": "Chats löschen",
 	"delete this link": "diesen Link zu löschen",
 	"delete this link": "diesen Link zu löschen",
 	"Delete User": "Benutzer löschen",
 	"Delete User": "Benutzer löschen",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} gelöscht",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} gelöscht",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "OpenAI URL/Key erforderlich.",
 	"OpenAI URL/Key required.": "OpenAI URL/Key erforderlich.",
 	"or": "oder",
 	"or": "oder",
 	"Other": "Andere",
 	"Other": "Andere",
-	"Overview": "Übersicht",
 	"Password": "Passwort",
 	"Password": "Passwort",
 	"PDF document (.pdf)": "PDF-Dokument (.pdf)",
 	"PDF document (.pdf)": "PDF-Dokument (.pdf)",
 	"PDF Extract Images (OCR)": "Text von Bildern aus PDFs extrahieren (OCR)",
 	"PDF Extract Images (OCR)": "Text von Bildern aus PDFs extrahieren (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "Dokumente von {{path}} scannen",
 	"Scan for documents from {{path}}": "Dokumente von {{path}} scannen",
 	"Search": "Suchen",
 	"Search": "Suchen",
 	"Search a model": "Nach einem Modell suchen",
 	"Search a model": "Nach einem Modell suchen",
+	"Search Chats": "",
 	"Search Documents": "Dokumente suchen",
 	"Search Documents": "Dokumente suchen",
+	"Search Models": "",
 	"Search Prompts": "Prompts suchen",
 	"Search Prompts": "Prompts suchen",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "",
 	"API keys": "",
 	"April": "",
 	"April": "",
 	"Archive": "",
 	"Archive": "",
+	"Archive All Chats": "",
 	"Archived Chats": "",
 	"Archived Chats": "",
 	"are allowed - Activate this command by typing": "are allowed. Activate typing",
 	"are allowed - Activate this command by typing": "are allowed. Activate typing",
 	"Are you sure?": "Such certainty?",
 	"Are you sure?": "Such certainty?",
@@ -120,7 +121,6 @@
 	"Custom": "Custom",
 	"Custom": "Custom",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Dark",
 	"Dark": "Dark",
-	"Dashboard": "",
 	"Database": "Database",
 	"Database": "Database",
 	"December": "",
 	"December": "",
 	"Default": "Default",
 	"Default": "Default",
@@ -133,9 +133,9 @@
 	"delete": "delete",
 	"delete": "delete",
 	"Delete": "",
 	"Delete": "",
 	"Delete a model": "Delete a model",
 	"Delete a model": "Delete a model",
+	"Delete All Chats": "",
 	"Delete chat": "Delete chat",
 	"Delete chat": "Delete chat",
 	"Delete Chat": "",
 	"Delete Chat": "",
-	"Delete Chats": "Delete Chats",
 	"delete this link": "",
 	"delete this link": "",
 	"Delete User": "",
 	"Delete User": "",
 	"Deleted {{deleteModelTag}}": "Deleted {{deleteModelTag}}",
 	"Deleted {{deleteModelTag}}": "Deleted {{deleteModelTag}}",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "",
 	"OpenAI URL/Key required.": "",
 	"or": "or",
 	"or": "or",
 	"Other": "",
 	"Other": "",
-	"Overview": "",
 	"Password": "Barkword",
 	"Password": "Barkword",
 	"PDF document (.pdf)": "",
 	"PDF document (.pdf)": "",
 	"PDF Extract Images (OCR)": "PDF Extract Wowmages (OCR)",
 	"PDF Extract Images (OCR)": "PDF Extract Wowmages (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "Scan for documents from {{path}} wow",
 	"Scan for documents from {{path}}": "Scan for documents from {{path}} wow",
 	"Search": "Search very search",
 	"Search": "Search very search",
 	"Search a model": "",
 	"Search a model": "",
+	"Search Chats": "",
 	"Search Documents": "Search Documents much find",
 	"Search Documents": "Search Documents much find",
+	"Search Models": "",
 	"Search Prompts": "Search Prompts much wow",
 	"Search Prompts": "Search Prompts much wow",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "",
 	"API keys": "",
 	"April": "",
 	"April": "",
 	"Archive": "",
 	"Archive": "",
+	"Archive All Chats": "",
 	"Archived Chats": "",
 	"Archived Chats": "",
 	"are allowed - Activate this command by typing": "",
 	"are allowed - Activate this command by typing": "",
 	"Are you sure?": "",
 	"Are you sure?": "",
@@ -120,7 +121,6 @@
 	"Custom": "",
 	"Custom": "",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "",
 	"Dark": "",
-	"Dashboard": "",
 	"Database": "",
 	"Database": "",
 	"December": "",
 	"December": "",
 	"Default": "",
 	"Default": "",
@@ -133,9 +133,9 @@
 	"delete": "",
 	"delete": "",
 	"Delete": "",
 	"Delete": "",
 	"Delete a model": "",
 	"Delete a model": "",
+	"Delete All Chats": "",
 	"Delete chat": "",
 	"Delete chat": "",
 	"Delete Chat": "",
 	"Delete Chat": "",
-	"Delete Chats": "",
 	"delete this link": "",
 	"delete this link": "",
 	"Delete User": "",
 	"Delete User": "",
 	"Deleted {{deleteModelTag}}": "",
 	"Deleted {{deleteModelTag}}": "",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "",
 	"OpenAI URL/Key required.": "",
 	"or": "",
 	"or": "",
 	"Other": "",
 	"Other": "",
-	"Overview": "",
 	"Password": "",
 	"Password": "",
 	"PDF document (.pdf)": "",
 	"PDF document (.pdf)": "",
 	"PDF Extract Images (OCR)": "",
 	"PDF Extract Images (OCR)": "",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "",
 	"Scan for documents from {{path}}": "",
 	"Search": "",
 	"Search": "",
 	"Search a model": "",
 	"Search a model": "",
+	"Search Chats": "",
 	"Search Documents": "",
 	"Search Documents": "",
+	"Search Models": "",
 	"Search Prompts": "",
 	"Search Prompts": "",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "",
 	"API keys": "",
 	"April": "",
 	"April": "",
 	"Archive": "",
 	"Archive": "",
+	"Archive All Chats": "",
 	"Archived Chats": "",
 	"Archived Chats": "",
 	"are allowed - Activate this command by typing": "",
 	"are allowed - Activate this command by typing": "",
 	"Are you sure?": "",
 	"Are you sure?": "",
@@ -120,7 +121,6 @@
 	"Custom": "",
 	"Custom": "",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "",
 	"Dark": "",
-	"Dashboard": "",
 	"Database": "",
 	"Database": "",
 	"December": "",
 	"December": "",
 	"Default": "",
 	"Default": "",
@@ -133,9 +133,9 @@
 	"delete": "",
 	"delete": "",
 	"Delete": "",
 	"Delete": "",
 	"Delete a model": "",
 	"Delete a model": "",
+	"Delete All Chats": "",
 	"Delete chat": "",
 	"Delete chat": "",
 	"Delete Chat": "",
 	"Delete Chat": "",
-	"Delete Chats": "",
 	"delete this link": "",
 	"delete this link": "",
 	"Delete User": "",
 	"Delete User": "",
 	"Deleted {{deleteModelTag}}": "",
 	"Deleted {{deleteModelTag}}": "",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "",
 	"OpenAI URL/Key required.": "",
 	"or": "",
 	"or": "",
 	"Other": "",
 	"Other": "",
-	"Overview": "",
 	"Password": "",
 	"Password": "",
 	"PDF document (.pdf)": "",
 	"PDF document (.pdf)": "",
 	"PDF Extract Images (OCR)": "",
 	"PDF Extract Images (OCR)": "",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "",
 	"Scan for documents from {{path}}": "",
 	"Search": "",
 	"Search": "",
 	"Search a model": "",
 	"Search a model": "",
+	"Search Chats": "",
 	"Search Documents": "",
 	"Search Documents": "",
+	"Search Models": "",
 	"Search Prompts": "",
 	"Search Prompts": "",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "Claves de la API",
 	"API keys": "Claves de la API",
 	"April": "Abril",
 	"April": "Abril",
 	"Archive": "Archivar",
 	"Archive": "Archivar",
+	"Archive All Chats": "",
 	"Archived Chats": "Chats archivados",
 	"Archived Chats": "Chats archivados",
 	"are allowed - Activate this command by typing": "están permitidos - Active este comando escribiendo",
 	"are allowed - Activate this command by typing": "están permitidos - Active este comando escribiendo",
 	"Are you sure?": "¿Está seguro?",
 	"Are you sure?": "¿Está seguro?",
@@ -120,7 +121,6 @@
 	"Custom": "Personalizado",
 	"Custom": "Personalizado",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Oscuro",
 	"Dark": "Oscuro",
-	"Dashboard": "Tablero",
 	"Database": "Base de datos",
 	"Database": "Base de datos",
 	"December": "Diciembre",
 	"December": "Diciembre",
 	"Default": "Por defecto",
 	"Default": "Por defecto",
@@ -133,9 +133,9 @@
 	"delete": "borrar",
 	"delete": "borrar",
 	"Delete": "Borrar",
 	"Delete": "Borrar",
 	"Delete a model": "Borra un modelo",
 	"Delete a model": "Borra un modelo",
+	"Delete All Chats": "",
 	"Delete chat": "Borrar chat",
 	"Delete chat": "Borrar chat",
 	"Delete Chat": "Borrar Chat",
 	"Delete Chat": "Borrar Chat",
-	"Delete Chats": "Borrar Chats",
 	"delete this link": "Borrar este enlace",
 	"delete this link": "Borrar este enlace",
 	"Delete User": "Borrar Usuario",
 	"Delete User": "Borrar Usuario",
 	"Deleted {{deleteModelTag}}": "Se borró {{deleteModelTag}}",
 	"Deleted {{deleteModelTag}}": "Se borró {{deleteModelTag}}",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "URL/Clave de OpenAI es requerida.",
 	"OpenAI URL/Key required.": "URL/Clave de OpenAI es requerida.",
 	"or": "o",
 	"or": "o",
 	"Other": "Otro",
 	"Other": "Otro",
-	"Overview": "Resumen",
 	"Password": "Contraseña",
 	"Password": "Contraseña",
 	"PDF document (.pdf)": "PDF document (.pdf)",
 	"PDF document (.pdf)": "PDF document (.pdf)",
 	"PDF Extract Images (OCR)": "Extraer imágenes de PDF (OCR)",
 	"PDF Extract Images (OCR)": "Extraer imágenes de PDF (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "Escanear en busca de documentos desde {{path}}",
 	"Scan for documents from {{path}}": "Escanear en busca de documentos desde {{path}}",
 	"Search": "Buscar",
 	"Search": "Buscar",
 	"Search a model": "Buscar un modelo",
 	"Search a model": "Buscar un modelo",
+	"Search Chats": "",
 	"Search Documents": "Buscar Documentos",
 	"Search Documents": "Buscar Documentos",
+	"Search Models": "",
 	"Search Prompts": "Buscar Prompts",
 	"Search Prompts": "Buscar Prompts",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "API keys",
 	"API keys": "API keys",
 	"April": "ژوئن",
 	"April": "ژوئن",
 	"Archive": "آرشیو",
 	"Archive": "آرشیو",
+	"Archive All Chats": "",
 	"Archived Chats": "آرشیو تاریخچه چت",
 	"Archived Chats": "آرشیو تاریخچه چت",
 	"are allowed - Activate this command by typing": "مجاز هستند - این دستور را با تایپ کردن این فعال کنید:",
 	"are allowed - Activate this command by typing": "مجاز هستند - این دستور را با تایپ کردن این فعال کنید:",
 	"Are you sure?": "آیا مطمئن هستید؟",
 	"Are you sure?": "آیا مطمئن هستید؟",
@@ -120,7 +121,6 @@
 	"Custom": "دلخواه",
 	"Custom": "دلخواه",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "تیره",
 	"Dark": "تیره",
-	"Dashboard": "داشبورد",
 	"Database": "پایگاه داده",
 	"Database": "پایگاه داده",
 	"December": "دسامبر",
 	"December": "دسامبر",
 	"Default": "پیشفرض",
 	"Default": "پیشفرض",
@@ -133,9 +133,9 @@
 	"delete": "حذف",
 	"delete": "حذف",
 	"Delete": "حذف",
 	"Delete": "حذف",
 	"Delete a model": "حذف یک مدل",
 	"Delete a model": "حذف یک مدل",
+	"Delete All Chats": "",
 	"Delete chat": "حذف گپ",
 	"Delete chat": "حذف گپ",
 	"Delete Chat": "حذف گپ",
 	"Delete Chat": "حذف گپ",
-	"Delete Chats": "حذف گپ\u200cها",
 	"delete this link": "حذف این لینک",
 	"delete this link": "حذف این لینک",
 	"Delete User": "حذف کاربر",
 	"Delete User": "حذف کاربر",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} پاک شد",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} پاک شد",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "URL/Key OpenAI مورد نیاز است.",
 	"OpenAI URL/Key required.": "URL/Key OpenAI مورد نیاز است.",
 	"or": "روشن",
 	"or": "روشن",
 	"Other": "دیگر",
 	"Other": "دیگر",
-	"Overview": "نمای کلی",
 	"Password": "رمز عبور",
 	"Password": "رمز عبور",
 	"PDF document (.pdf)": "PDF سند (.pdf)",
 	"PDF document (.pdf)": "PDF سند (.pdf)",
 	"PDF Extract Images (OCR)": "استخراج تصاویر از PDF (OCR)",
 	"PDF Extract Images (OCR)": "استخراج تصاویر از PDF (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "اسکن اسناد از {{path}}",
 	"Scan for documents from {{path}}": "اسکن اسناد از {{path}}",
 	"Search": "جستجو",
 	"Search": "جستجو",
 	"Search a model": "جستجوی مدل",
 	"Search a model": "جستجوی مدل",
+	"Search Chats": "",
 	"Search Documents": "جستجوی اسناد",
 	"Search Documents": "جستجوی اسناد",
+	"Search Models": "",
 	"Search Prompts": "جستجوی پرامپت\u200cها",
 	"Search Prompts": "جستجوی پرامپت\u200cها",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "API-avaimet",
 	"API keys": "API-avaimet",
 	"April": "huhtikuu",
 	"April": "huhtikuu",
 	"Archive": "Arkisto",
 	"Archive": "Arkisto",
+	"Archive All Chats": "",
 	"Archived Chats": "Arkistoidut keskustelut",
 	"Archived Chats": "Arkistoidut keskustelut",
 	"are allowed - Activate this command by typing": "ovat sallittuja - Aktivoi tämä komento kirjoittamalla",
 	"are allowed - Activate this command by typing": "ovat sallittuja - Aktivoi tämä komento kirjoittamalla",
 	"Are you sure?": "Oletko varma?",
 	"Are you sure?": "Oletko varma?",
@@ -120,7 +121,6 @@
 	"Custom": "Mukautettu",
 	"Custom": "Mukautettu",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Tumma",
 	"Dark": "Tumma",
-	"Dashboard": "Kojelauta",
 	"Database": "Tietokanta",
 	"Database": "Tietokanta",
 	"December": "joulukuu",
 	"December": "joulukuu",
 	"Default": "Oletus",
 	"Default": "Oletus",
@@ -133,9 +133,9 @@
 	"delete": "poista",
 	"delete": "poista",
 	"Delete": "Poista",
 	"Delete": "Poista",
 	"Delete a model": "Poista malli",
 	"Delete a model": "Poista malli",
+	"Delete All Chats": "",
 	"Delete chat": "Poista keskustelu",
 	"Delete chat": "Poista keskustelu",
 	"Delete Chat": "Poista keskustelu",
 	"Delete Chat": "Poista keskustelu",
-	"Delete Chats": "Poista keskustelut",
 	"delete this link": "poista tämä linkki",
 	"delete this link": "poista tämä linkki",
 	"Delete User": "Poista käyttäjä",
 	"Delete User": "Poista käyttäjä",
 	"Deleted {{deleteModelTag}}": "Poistettu {{deleteModelTag}}",
 	"Deleted {{deleteModelTag}}": "Poistettu {{deleteModelTag}}",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "OpenAI URL/ -avain vaaditaan.",
 	"OpenAI URL/Key required.": "OpenAI URL/ -avain vaaditaan.",
 	"or": "tai",
 	"or": "tai",
 	"Other": "Muu",
 	"Other": "Muu",
-	"Overview": "Yleiskatsaus",
 	"Password": "Salasana",
 	"Password": "Salasana",
 	"PDF document (.pdf)": "PDF-tiedosto (.pdf)",
 	"PDF document (.pdf)": "PDF-tiedosto (.pdf)",
 	"PDF Extract Images (OCR)": "PDF-tiedoston kuvien erottelu (OCR)",
 	"PDF Extract Images (OCR)": "PDF-tiedoston kuvien erottelu (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "Skannaa asiakirjoja polusta {{path}}",
 	"Scan for documents from {{path}}": "Skannaa asiakirjoja polusta {{path}}",
 	"Search": "Haku",
 	"Search": "Haku",
 	"Search a model": "Hae mallia",
 	"Search a model": "Hae mallia",
+	"Search Chats": "",
 	"Search Documents": "Hae asiakirjoja",
 	"Search Documents": "Hae asiakirjoja",
+	"Search Models": "",
 	"Search Prompts": "Hae kehotteita",
 	"Search Prompts": "Hae kehotteita",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "Clés API",
 	"API keys": "Clés API",
 	"April": "Avril",
 	"April": "Avril",
 	"Archive": "Archiver",
 	"Archive": "Archiver",
+	"Archive All Chats": "",
 	"Archived Chats": "enregistrement du chat",
 	"Archived Chats": "enregistrement du chat",
 	"are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant",
 	"are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant",
 	"Are you sure?": "Êtes-vous sûr ?",
 	"Are you sure?": "Êtes-vous sûr ?",
@@ -120,7 +121,6 @@
 	"Custom": "Personnalisé",
 	"Custom": "Personnalisé",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Sombre",
 	"Dark": "Sombre",
-	"Dashboard": "Tableau de bord",
 	"Database": "Base de données",
 	"Database": "Base de données",
 	"December": "Décembre",
 	"December": "Décembre",
 	"Default": "Par défaut",
 	"Default": "Par défaut",
@@ -133,9 +133,9 @@
 	"delete": "supprimer",
 	"delete": "supprimer",
 	"Delete": "Supprimer",
 	"Delete": "Supprimer",
 	"Delete a model": "Supprimer un modèle",
 	"Delete a model": "Supprimer un modèle",
+	"Delete All Chats": "",
 	"Delete chat": "Supprimer la discussion",
 	"Delete chat": "Supprimer la discussion",
 	"Delete Chat": "Supprimer la discussion",
 	"Delete Chat": "Supprimer la discussion",
-	"Delete Chats": "Supprimer les discussions",
 	"delete this link": "supprimer ce lien",
 	"delete this link": "supprimer ce lien",
 	"Delete User": "Supprimer l'utilisateur",
 	"Delete User": "Supprimer l'utilisateur",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} supprimé",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} supprimé",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "L'URL/Clé OpenAI est requise.",
 	"OpenAI URL/Key required.": "L'URL/Clé OpenAI est requise.",
 	"or": "ou",
 	"or": "ou",
 	"Other": "Autre",
 	"Other": "Autre",
-	"Overview": "Aperçu",
 	"Password": "Mot de passe",
 	"Password": "Mot de passe",
 	"PDF document (.pdf)": "Document PDF (.pdf)",
 	"PDF document (.pdf)": "Document PDF (.pdf)",
 	"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
 	"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "Scanner des documents depuis {{path}}",
 	"Scan for documents from {{path}}": "Scanner des documents depuis {{path}}",
 	"Search": "Recherche",
 	"Search": "Recherche",
 	"Search a model": "Rechercher un modèle",
 	"Search a model": "Rechercher un modèle",
+	"Search Chats": "",
 	"Search Documents": "Rechercher des documents",
 	"Search Documents": "Rechercher des documents",
+	"Search Models": "",
 	"Search Prompts": "Rechercher des prompts",
 	"Search Prompts": "Rechercher des prompts",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

+ 174 - 173
src/lib/i18n/locales/fr-FR/translation.json

@@ -2,39 +2,39 @@
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' ou '-1' pour aucune expiration.",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' ou '-1' pour aucune expiration.",
 	"(Beta)": "(Bêta)",
 	"(Beta)": "(Bêta)",
 	"(e.g. `sh webui.sh --api`)": "(par ex. `sh webui.sh --api`)",
 	"(e.g. `sh webui.sh --api`)": "(par ex. `sh webui.sh --api`)",
-	"(latest)": "(dernière)",
-	"{{ models }}": "",
-	"{{ owner }}: You cannot delete a base model": "",
+	"(latest)": "(plus récent)",
+	"{{ models }}": "{{ models }}",
+	"{{ owner }}: You cannot delete a base model": "{{ owner }}: Vous ne pouvez pas supprimer un modèle de base",
 	"{{modelName}} is thinking...": "{{modelName}} réfléchit...",
 	"{{modelName}} is thinking...": "{{modelName}} réfléchit...",
-	"{{user}}'s Chats": "{{user}}'s Chats",
+	"{{user}}'s Chats": "Chats de {{user}}",
 	"{{webUIName}} Backend Required": "Backend {{webUIName}} requis",
 	"{{webUIName}} Backend Required": "Backend {{webUIName}} requis",
 	"A task model is used when performing tasks such as generating titles for chats and web search queries": "",
 	"A task model is used when performing tasks such as generating titles for chats and web search queries": "",
 	"a user": "un utilisateur",
 	"a user": "un utilisateur",
-	"About": "À propos",
+	"About": "À Propos",
 	"Account": "Compte",
 	"Account": "Compte",
 	"Accurate information": "Information précise",
 	"Accurate information": "Information précise",
 	"Add": "Ajouter",
 	"Add": "Ajouter",
-	"Add a model id": "",
-	"Add a short description about what this model does": "",
+	"Add a model id": "Ajouter un identifiant modèle",
+	"Add a short description about what this model does": "Ajouter une courte description de ce que fait ce modèle",
 	"Add a short title for this prompt": "Ajouter un court titre pour ce prompt",
 	"Add a short title for this prompt": "Ajouter un court titre pour ce prompt",
 	"Add a tag": "Ajouter un tag",
 	"Add a tag": "Ajouter un tag",
 	"Add custom prompt": "Ajouter un prompt personnalisé",
 	"Add custom prompt": "Ajouter un prompt personnalisé",
-	"Add Docs": "Ajouter des documents",
-	"Add Files": "Ajouter des fichiers",
-	"Add Memory": "Ajouter une mémoire",
+	"Add Docs": "Ajouter des Documents",
+	"Add Files": "Ajouter des Fichiers",
+	"Add Memory": "Ajouter de la Mémoire",
 	"Add message": "Ajouter un message",
 	"Add message": "Ajouter un message",
-	"Add Model": "Ajouter un modèle",
-	"Add Tags": "ajouter des tags",
-	"Add User": "Ajouter un utilisateur",
+	"Add Model": "Ajouter un Modèle",
+	"Add Tags": "Ajouter des Tags",
+	"Add User": "Ajouter un Utilisateur",
 	"Adjusting these settings will apply changes universally to all users.": "L'ajustement de ces paramètres appliquera les changements à tous les utilisateurs.",
 	"Adjusting these settings will apply changes universally to all users.": "L'ajustement de ces paramètres appliquera les changements à tous les utilisateurs.",
-	"admin": "Administrateur",
-	"Admin Panel": "Panneau d'administration",
-	"Admin Settings": "Paramètres d'administration",
-	"Advanced Parameters": "Paramètres avancés",
-	"Advanced Params": "",
+	"admin": "admin",
+	"Admin Panel": "Panneau d'Administration",
+	"Admin Settings": "Paramètres d'Administration",
+	"Advanced Parameters": "Paramètres Avancés",
+	"Advanced Params": "Params Avancés",
 	"all": "tous",
 	"all": "tous",
-	"All Documents": "Tous les documents",
-	"All Users": "Tous les utilisateurs",
+	"All Documents": "Tous les Documents",
+	"All Users": "Tous les Utilisateurs",
 	"Allow": "Autoriser",
 	"Allow": "Autoriser",
 	"Allow Chat Deletion": "Autoriser la suppression du chat",
 	"Allow Chat Deletion": "Autoriser la suppression du chat",
 	"alphanumeric characters and hyphens": "caractères alphanumériques et tirets",
 	"alphanumeric characters and hyphens": "caractères alphanumériques et tirets",
@@ -44,11 +44,12 @@
 	"and create a new shared link.": "et créer un nouveau lien partagé.",
 	"and create a new shared link.": "et créer un nouveau lien partagé.",
 	"API Base URL": "URL de base de l'API",
 	"API Base URL": "URL de base de l'API",
 	"API Key": "Clé API",
 	"API Key": "Clé API",
-	"API Key created.": "Clé API créée.",
+	"API Key created.": "Clé d'API créée.",
 	"API keys": "Clés API",
 	"API keys": "Clés API",
 	"April": "Avril",
 	"April": "Avril",
 	"Archive": "Archiver",
 	"Archive": "Archiver",
-	"Archived Chats": "enregistrement du chat",
+	"Archive All Chats": "",
+	"Archived Chats": "Chats Archivés",
 	"are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant",
 	"are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant",
 	"Are you sure?": "Êtes-vous sûr ?",
 	"Are you sure?": "Êtes-vous sûr ?",
 	"Attach file": "Joindre un fichier",
 	"Attach file": "Joindre un fichier",
@@ -61,16 +62,16 @@
 	"AUTOMATIC1111 Base URL is required.": "L'URL de base AUTOMATIC1111 est requise.",
 	"AUTOMATIC1111 Base URL is required.": "L'URL de base AUTOMATIC1111 est requise.",
 	"available!": "disponible !",
 	"available!": "disponible !",
 	"Back": "Retour",
 	"Back": "Retour",
-	"Bad Response": "Mauvaise réponse",
-	"Base Model (From)": "",
+	"Bad Response": "Mauvaise Réponse",
+	"Base Model (From)": "Modèle de Base (De)",
 	"before": "avant",
 	"before": "avant",
-	"Being lazy": "En manque de temps",
-	"Bypass SSL verification for Websites": "Parcourir la vérification SSL pour les sites Web",
+	"Being lazy": "Est paresseux",
+	"Bypass SSL verification for Websites": "Contourner la vérification SSL pour les sites Web.",
 	"Cancel": "Annuler",
 	"Cancel": "Annuler",
-	"Capabilities": "",
+	"Capabilities": "Capacités",
 	"Change Password": "Changer le mot de passe",
 	"Change Password": "Changer le mot de passe",
 	"Chat": "Chat",
 	"Chat": "Chat",
-	"Chat Bubble UI": "Chat Bubble UI",
+	"Chat Bubble UI": "UI Bulles de Chat",
 	"Chat direction": "Direction du chat",
 	"Chat direction": "Direction du chat",
 	"Chat History": "Historique du chat",
 	"Chat History": "Historique du chat",
 	"Chat History is off for this browser.": "L'historique du chat est désactivé pour ce navigateur.",
 	"Chat History is off for this browser.": "L'historique du chat est désactivé pour ce navigateur.",
@@ -82,7 +83,7 @@
 	"Chunk Overlap": "Chevauchement de bloc",
 	"Chunk Overlap": "Chevauchement de bloc",
 	"Chunk Params": "Paramètres de bloc",
 	"Chunk Params": "Paramètres de bloc",
 	"Chunk Size": "Taille de bloc",
 	"Chunk Size": "Taille de bloc",
-	"Citation": "Citations",
+	"Citation": "Citation",
 	"Click here for help.": "Cliquez ici pour de l'aide.",
 	"Click here for help.": "Cliquez ici pour de l'aide.",
 	"Click here to": "Cliquez ici pour",
 	"Click here to": "Cliquez ici pour",
 	"Click here to select": "Cliquez ici pour sélectionner",
 	"Click here to select": "Cliquez ici pour sélectionner",
@@ -93,34 +94,33 @@
 	"Close": "Fermer",
 	"Close": "Fermer",
 	"Collection": "Collection",
 	"Collection": "Collection",
 	"ComfyUI": "ComfyUI",
 	"ComfyUI": "ComfyUI",
-	"ComfyUI Base URL": "ComfyUI Base URL",
-	"ComfyUI Base URL is required.": "ComfyUI Base URL est requis.",
+	"ComfyUI Base URL": "URL de base ComfyUI",
+	"ComfyUI Base URL is required.": "L'URL de base ComfyUI est requise.",
 	"Command": "Commande",
 	"Command": "Commande",
 	"Confirm Password": "Confirmer le mot de passe",
 	"Confirm Password": "Confirmer le mot de passe",
 	"Connections": "Connexions",
 	"Connections": "Connexions",
 	"Content": "Contenu",
 	"Content": "Contenu",
 	"Context Length": "Longueur du contexte",
 	"Context Length": "Longueur du contexte",
-	"Continue Response": "Continuer la réponse",
+	"Continue Response": "Continuer la Réponse",
 	"Conversation Mode": "Mode de conversation",
 	"Conversation Mode": "Mode de conversation",
-	"Copied shared chat URL to clipboard!": "URL de chat partagé copié dans le presse-papier !",
+	"Copied shared chat URL to clipboard!": "URL du chat copié dans le presse-papiers !",
 	"Copy": "Copier",
 	"Copy": "Copier",
 	"Copy last code block": "Copier le dernier bloc de code",
 	"Copy last code block": "Copier le dernier bloc de code",
 	"Copy last response": "Copier la dernière réponse",
 	"Copy last response": "Copier la dernière réponse",
-	"Copy Link": "Copier le lien",
+	"Copy Link": "Copier le Lien",
 	"Copying to clipboard was successful!": "La copie dans le presse-papiers a réussi !",
 	"Copying to clipboard was successful!": "La copie dans le presse-papiers a réussi !",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Créez une phrase concise de 3-5 mots comme en-tête pour la requête suivante, en respectant strictement la limite de 3-5 mots et en évitant l'utilisation du mot 'titre' :",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Créez une phrase concise de 3-5 mots comme en-tête pour la requête suivante, en respectant strictement la limite de 3-5 mots et en évitant l'utilisation du mot 'titre' :",
-	"Create a model": "",
+	"Create a model": "Créer un modèle",
 	"Create Account": "Créer un compte",
 	"Create Account": "Créer un compte",
 	"Create new key": "Créer une nouvelle clé",
 	"Create new key": "Créer une nouvelle clé",
 	"Create new secret key": "Créer une nouvelle clé secrète",
 	"Create new secret key": "Créer une nouvelle clé secrète",
 	"Created at": "Créé le",
 	"Created at": "Créé le",
-	"Created At": "Créé le",
+	"Created At": "Crée Le",
 	"Current Model": "Modèle actuel",
 	"Current Model": "Modèle actuel",
 	"Current Password": "Mot de passe actuel",
 	"Current Password": "Mot de passe actuel",
 	"Custom": "Personnalisé",
 	"Custom": "Personnalisé",
-	"Customize models for a specific purpose": "",
+	"Customize models for a specific purpose": "Personnaliser les modèles pour un objectif spécifique",
 	"Dark": "Sombre",
 	"Dark": "Sombre",
-	"Dashboard": "Tableau de bord",
 	"Database": "Base de données",
 	"Database": "Base de données",
 	"December": "Décembre",
 	"December": "Décembre",
 	"Default": "Par défaut",
 	"Default": "Par défaut",
@@ -133,17 +133,17 @@
 	"delete": "supprimer",
 	"delete": "supprimer",
 	"Delete": "Supprimer",
 	"Delete": "Supprimer",
 	"Delete a model": "Supprimer un modèle",
 	"Delete a model": "Supprimer un modèle",
+	"Delete All Chats": "",
 	"Delete chat": "Supprimer le chat",
 	"Delete chat": "Supprimer le chat",
-	"Delete Chat": "Supprimer le chat",
-	"Delete Chats": "Supprimer les chats",
+	"Delete Chat": "Supprimer le Chat",
 	"delete this link": "supprimer ce lien",
 	"delete this link": "supprimer ce lien",
-	"Delete User": "Supprimer l'utilisateur",
+	"Delete User": "Supprimer l'Utilisateur",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} supprimé",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} supprimé",
-	"Deleted {{name}}": "",
+	"Deleted {{name}}": "{{name}} supprimé",
 	"Description": "Description",
 	"Description": "Description",
-	"Didn't fully follow instructions": "Ne suit pas les instructions",
+	"Didn't fully follow instructions": "N'a pas suivi entièrement les instructions",
 	"Disabled": "Désactivé",
 	"Disabled": "Désactivé",
-	"Discover a model": "",
+	"Discover a model": "Découvrir un modèle",
 	"Discover a prompt": "Découvrir un prompt",
 	"Discover a prompt": "Découvrir un prompt",
 	"Discover, download, and explore custom prompts": "Découvrir, télécharger et explorer des prompts personnalisés",
 	"Discover, download, and explore custom prompts": "Découvrir, télécharger et explorer des prompts personnalisés",
 	"Discover, download, and explore model presets": "Découvrir, télécharger et explorer des préconfigurations de modèles",
 	"Discover, download, and explore model presets": "Découvrir, télécharger et explorer des préconfigurations de modèles",
@@ -154,7 +154,7 @@
 	"does not make any external connections, and your data stays securely on your locally hosted server.": "ne fait aucune connexion externe, et vos données restent en sécurité sur votre serveur hébergé localement.",
 	"does not make any external connections, and your data stays securely on your locally hosted server.": "ne fait aucune connexion externe, et vos données restent en sécurité sur votre serveur hébergé localement.",
 	"Don't Allow": "Ne pas autoriser",
 	"Don't Allow": "Ne pas autoriser",
 	"Don't have an account?": "Vous n'avez pas de compte ?",
 	"Don't have an account?": "Vous n'avez pas de compte ?",
-	"Don't like the style": "Vous n'aimez pas le style ?",
+	"Don't like the style": "N'aime pas le style",
 	"Download": "Télécharger",
 	"Download": "Télécharger",
 	"Download canceled": "Téléchargement annulé",
 	"Download canceled": "Téléchargement annulé",
 	"Download Database": "Télécharger la base de données",
 	"Download Database": "Télécharger la base de données",
@@ -164,85 +164,85 @@
 	"Edit Doc": "Éditer le document",
 	"Edit Doc": "Éditer le document",
 	"Edit User": "Éditer l'utilisateur",
 	"Edit User": "Éditer l'utilisateur",
 	"Email": "Email",
 	"Email": "Email",
-	"Embedding Model": "Modèle d'embedding",
-	"Embedding Model Engine": "Moteur du modèle d'embedding",
+	"Embedding Model": "Modèle pour l'Embedding",
+	"Embedding Model Engine": "Moteur du Modèle d'Embedding",
 	"Embedding model set to \"{{embedding_model}}\"": "Modèle d'embedding défini sur \"{{embedding_model}}\"",
 	"Embedding model set to \"{{embedding_model}}\"": "Modèle d'embedding défini sur \"{{embedding_model}}\"",
 	"Enable Chat History": "Activer l'historique du chat",
 	"Enable Chat History": "Activer l'historique du chat",
 	"Enable New Sign Ups": "Activer les nouvelles inscriptions",
 	"Enable New Sign Ups": "Activer les nouvelles inscriptions",
 	"Enabled": "Activé",
 	"Enabled": "Activé",
-	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assurez-vous que votre fichier CSV inclut 4 colonnes dans cet ordre : Nom, Email, Mot de passe, Rôle.",
+	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Vérifiez que le fichier CSV contienne 4 colonnes dans cet ordre : Name (Nom), Email, Password (Mot de passe), Role (Rôle).",
 	"Enter {{role}} message here": "Entrez le message {{role}} ici",
 	"Enter {{role}} message here": "Entrez le message {{role}} ici",
-	"Enter a detail about yourself for your LLMs to recall": "Entrez un détail sur vous pour que vos LLM puissent le rappeler",
+	"Enter a detail about yourself for your LLMs to recall": "Saisissez une donnée vous concernant pour que vos LLMs s'en souviennent",
 	"Enter Chunk Overlap": "Entrez le chevauchement de bloc",
 	"Enter Chunk Overlap": "Entrez le chevauchement de bloc",
 	"Enter Chunk Size": "Entrez la taille du bloc",
 	"Enter Chunk Size": "Entrez la taille du bloc",
 	"Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (p. ex. 512x512)",
 	"Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (p. ex. 512x512)",
-	"Enter language codes": "Entrez les codes de langue",
+	"Enter language codes": "Entrez les codes du language",
 	"Enter model tag (e.g. {{modelTag}})": "Entrez le tag du modèle (p. ex. {{modelTag}})",
 	"Enter model tag (e.g. {{modelTag}})": "Entrez le tag du modèle (p. ex. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Entrez le nombre d'étapes (p. ex. 50)",
 	"Enter Number of Steps (e.g. 50)": "Entrez le nombre d'étapes (p. ex. 50)",
-	"Enter Score": "Entrez le score",
+	"Enter Score": "Entrez le Score",
 	"Enter stop sequence": "Entrez la séquence de fin",
 	"Enter stop sequence": "Entrez la séquence de fin",
 	"Enter Top K": "Entrez Top K",
 	"Enter Top K": "Entrez Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Entrez l'URL (p. ex. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Entrez l'URL (p. ex. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Entrez l'URL (p. ex. http://localhost:11434)",
 	"Enter URL (e.g. http://localhost:11434)": "Entrez l'URL (p. ex. http://localhost:11434)",
-	"Enter Your Email": "Entrez votre email",
-	"Enter Your Full Name": "Entrez votre nom complet",
-	"Enter Your Password": "Entrez votre mot de passe",
-	"Enter Your Role": "Entrez votre rôle",
+	"Enter Your Email": "Entrez Votre Email",
+	"Enter Your Full Name": "Entrez Votre Nom Complet",
+	"Enter Your Password": "Entrez Votre Mot De Passe",
+	"Enter Your Role": "Entrez Votre Rôle",
 	"Experimental": "Expérimental",
 	"Experimental": "Expérimental",
-	"Export All Chats (All Users)": "Exporter tous les chats (tous les utilisateurs)",
-	"Export Chats": "Exporter les chats",
-	"Export Documents Mapping": "Exporter la correspondance des documents",
-	"Export Models": "",
-	"Export Prompts": "Exporter les prompts",
-	"Failed to create API Key.": "Impossible de créer la clé API.",
+	"Export All Chats (All Users)": "Exporter Tous les Chats (Tous les Utilisateurs)",
+	"Export Chats": "Exporter les Chats",
+	"Export Documents Mapping": "Exporter la Correspondance des Documents",
+	"Export Models": "Exporter les Modèles",
+	"Export Prompts": "Exporter les Prompts",
+	"Failed to create API Key.": "Échec de la création de la clé d'API.",
 	"Failed to read clipboard contents": "Échec de la lecture du contenu du presse-papiers",
 	"Failed to read clipboard contents": "Échec de la lecture du contenu du presse-papiers",
 	"February": "Février",
 	"February": "Février",
-	"Feel free to add specific details": "Vous pouvez ajouter des détails spécifiques",
-	"File Mode": "Mode fichier",
+	"Feel free to add specific details": "N'hésitez pas à ajouter des détails spécifiques",
+	"File Mode": "Mode Fichier",
 	"File not found.": "Fichier non trouvé.",
 	"File not found.": "Fichier non trouvé.",
-	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Détection de falsification de empreinte digitale\u00a0: impossible d'utiliser les initiales comme avatar. Par défaut, l'image de profil par défaut est utilisée.",
+	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Usurpation d'empreinte digitale détectée : Impossible d'utiliser les initiales comme avatar. L'image de profil par défaut sera utilisée.",
 	"Fluidly stream large external response chunks": "Diffusez de manière fluide de gros morceaux de réponses externes",
 	"Fluidly stream large external response chunks": "Diffusez de manière fluide de gros morceaux de réponses externes",
 	"Focus chat input": "Concentrer sur l'entrée du chat",
 	"Focus chat input": "Concentrer sur l'entrée du chat",
-	"Followed instructions perfectly": "Suivi des instructions parfaitement",
+	"Followed instructions perfectly": "A suivi les instructions parfaitement",
 	"Format your variables using square brackets like this:": "Formatez vos variables en utilisant des crochets comme ceci :",
 	"Format your variables using square brackets like this:": "Formatez vos variables en utilisant des crochets comme ceci :",
-	"Frequencey Penalty": "",
+	"Frequencey Penalty": "Pénalité de Fréquence",
 	"Full Screen Mode": "Mode plein écran",
 	"Full Screen Mode": "Mode plein écran",
 	"General": "Général",
 	"General": "Général",
-	"General Settings": "Paramètres généraux",
+	"General Settings": "Paramètres Généraux",
 	"Generating search query": "",
 	"Generating search query": "",
-	"Generation Info": "Informations de génération",
-	"Good Response": "Bonne réponse",
+	"Generation Info": "Informations de la Génération",
+	"Good Response": "Bonne Réponse",
 	"h:mm a": "h:mm a",
 	"h:mm a": "h:mm a",
 	"has no conversations.": "n'a pas de conversations.",
 	"has no conversations.": "n'a pas de conversations.",
 	"Hello, {{name}}": "Bonjour, {{name}}",
 	"Hello, {{name}}": "Bonjour, {{name}}",
 	"Help": "Aide",
 	"Help": "Aide",
 	"Hide": "Cacher",
 	"Hide": "Cacher",
 	"How can I help you today?": "Comment puis-je vous aider aujourd'hui ?",
 	"How can I help you today?": "Comment puis-je vous aider aujourd'hui ?",
-	"Hybrid Search": "Recherche hybride",
-	"Image Generation (Experimental)": "Génération d'image (Expérimental)",
-	"Image Generation Engine": "Moteur de génération d'image",
-	"Image Settings": "Paramètres d'image",
+	"Hybrid Search": "Recherche Hybride",
+	"Image Generation (Experimental)": "Génération d'Image (Expérimental)",
+	"Image Generation Engine": "Moteur de Génération d'Image",
+	"Image Settings": "Paramètres d'Image",
 	"Images": "Images",
 	"Images": "Images",
-	"Import Chats": "Importer les chats",
-	"Import Documents Mapping": "Importer la correspondance des documents",
-	"Import Models": "",
-	"Import Prompts": "Importer les prompts",
+	"Import Chats": "Importer les Chats",
+	"Import Documents Mapping": "Importer la Correspondance des Documents",
+	"Import Models": "Importer des Modèles",
+	"Import Prompts": "Importer des Prompts",
 	"Include `--api` flag when running stable-diffusion-webui": "Inclure le drapeau `--api` lors de l'exécution de stable-diffusion-webui",
 	"Include `--api` flag when running stable-diffusion-webui": "Inclure le drapeau `--api` lors de l'exécution de stable-diffusion-webui",
 	"Input commands": "Entrez les commandes d'entrée",
 	"Input commands": "Entrez les commandes d'entrée",
 	"Interface": "Interface",
 	"Interface": "Interface",
-	"Invalid Tag": "Tag invalide",
+	"Invalid Tag": "Tag Invalide",
 	"January": "Janvier",
 	"January": "Janvier",
 	"join our Discord for help.": "rejoignez notre Discord pour obtenir de l'aide.",
 	"join our Discord for help.": "rejoignez notre Discord pour obtenir de l'aide.",
 	"JSON": "JSON",
 	"JSON": "JSON",
-	"JSON Preview": "",
+	"JSON Preview": "Aperçu JSON",
 	"July": "Juillet",
 	"July": "Juillet",
 	"June": "Juin",
 	"June": "Juin",
 	"JWT Expiration": "Expiration JWT",
 	"JWT Expiration": "Expiration JWT",
 	"JWT Token": "Jeton JWT",
 	"JWT Token": "Jeton JWT",
-	"Keep Alive": "Garder en vie",
+	"Keep Alive": "Rester en vie",
 	"Keyboard shortcuts": "Raccourcis clavier",
 	"Keyboard shortcuts": "Raccourcis clavier",
 	"Language": "Langue",
 	"Language": "Langue",
-	"Last Active": "Dernière activité",
+	"Last Active": "Dernier Activité",
 	"Light": "Clair",
 	"Light": "Clair",
 	"Listening...": "Écoute...",
 	"Listening...": "Écoute...",
 	"LLMs can make mistakes. Verify important information.": "Les LLMs peuvent faire des erreurs. Vérifiez les informations importantes.",
 	"LLMs can make mistakes. Verify important information.": "Les LLMs peuvent faire des erreurs. Vérifiez les informations importantes.",
@@ -252,13 +252,13 @@
 	"Manage Models": "Gérer les modèles",
 	"Manage Models": "Gérer les modèles",
 	"Manage Ollama Models": "Gérer les modèles Ollama",
 	"Manage Ollama Models": "Gérer les modèles Ollama",
 	"March": "Mars",
 	"March": "Mars",
-	"Max Tokens (num_predict)": "",
+	"Max Tokens (num_predict)": "Tokens maximaux (num_predict)",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé simultanément. Veuillez réessayer plus tard.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé simultanément. Veuillez réessayer plus tard.",
 	"May": "Mai",
 	"May": "Mai",
-	"Memories accessible by LLMs will be shown here.": "Les mémoires accessibles par les LLM seront affichées ici.",
+	"Memories accessible by LLMs will be shown here.": "Les Mémoires des LLMs apparaîtront ici.",
 	"Memory": "Mémoire",
 	"Memory": "Mémoire",
-	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Les messages que vous envoyez après la création de votre lien ne seront pas partagés. Les utilisateurs avec l'URL pourront voir le chat partagé.",
-	"Minimum Score": "Score minimum",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Les messages que vous envoyéz après la création du lien ne seront pas partagés. Les utilisateurs disposant de l'URL pourront voir le chat partagé.",
+	"Minimum Score": "Score Minimum",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
 	"Mirostat Tau": "Mirostat Tau",
@@ -267,91 +267,90 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "Le modèle '{{modelName}}' a été téléchargé avec succès.",
 	"Model '{{modelName}}' has been successfully downloaded.": "Le modèle '{{modelName}}' a été téléchargé avec succès.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Le modèle '{{modelTag}}' est déjà dans la file d'attente pour le téléchargement.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Le modèle '{{modelTag}}' est déjà dans la file d'attente pour le téléchargement.",
 	"Model {{modelId}} not found": "Modèle {{modelId}} non trouvé",
 	"Model {{modelId}} not found": "Modèle {{modelId}} non trouvé",
-	"Model {{modelName}} is not vision capable": "",
-	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Le chemin du système de fichiers du modèle a été détecté. Le nom court du modèle est nécessaire pour la mise à jour, impossible de continuer.",
-	"Model ID": "",
+	"Model {{modelName}} is not vision capable": "Modèle {{modelName}} n'est pas capable de voir",
+	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Chemin du système de fichier du modèle détecté. Le nom court du modèle est requis pour la mise à jour, ne peut pas continuer.",
+	"Model ID": "ID du Modèle",
 	"Model not selected": "Modèle non sélectionné",
 	"Model not selected": "Modèle non sélectionné",
-	"Model Params": "",
-	"Model Whitelisting": "Liste blanche de modèle",
-	"Model(s) Whitelisted": "Modèle(s) sur liste blanche",
-	"Modelfile Content": "Contenu du fichier de modèle",
+	"Model Params": "Paramètres du Modèle",
+	"Model Whitelisting": "Liste Blanche de Modèle",
+	"Model(s) Whitelisted": "Modèle(s) sur Liste Blanche",
+	"Modelfile Content": "Contenu du Fichier de Modèle",
 	"Models": "Modèles",
 	"Models": "Modèles",
 	"More": "Plus",
 	"More": "Plus",
 	"Name": "Nom",
 	"Name": "Nom",
-	"Name Tag": "Tag de nom",
-	"Name your model": "",
+	"Name Tag": "Tag de Nom",
+	"Name your model": "Nommez votre modèle",
 	"New Chat": "Nouveau chat",
 	"New Chat": "Nouveau chat",
 	"New Password": "Nouveau mot de passe",
 	"New Password": "Nouveau mot de passe",
-	"No results found": "Aucun résultat trouvé",
+	"No results found": "Aucun résultat",
 	"No search query generated": "",
 	"No search query generated": "",
 	"No search results found": "",
 	"No search results found": "",
 	"No source available": "Aucune source disponible",
 	"No source available": "Aucune source disponible",
-	"Not factually correct": "Non, pas exactement correct",
-	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Note: Si vous définissez un score minimum, la recherche ne retournera que les documents avec un score supérieur ou égal au score minimum.",
+	"Not factually correct": "Faits incorrects",
+	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Note : Si vous définissez un score minimum, la recherche ne renverra que les documents ayant un score supérieur ou égal au score minimum.",
 	"Notifications": "Notifications de bureau",
 	"Notifications": "Notifications de bureau",
 	"November": "Novembre",
 	"November": "Novembre",
 	"October": "Octobre",
 	"October": "Octobre",
 	"Off": "Désactivé",
 	"Off": "Désactivé",
 	"Okay, Let's Go!": "D'accord, allons-y !",
 	"Okay, Let's Go!": "D'accord, allons-y !",
-	"OLED Dark": "OLED Sombre",
+	"OLED Dark": "Sombre OLED",
 	"Ollama": "Ollama",
 	"Ollama": "Ollama",
-	"Ollama API": "",
+	"Ollama API": "API Ollama",
 	"Ollama Version": "Version Ollama",
 	"Ollama Version": "Version Ollama",
 	"On": "Activé",
 	"On": "Activé",
 	"Only": "Seulement",
 	"Only": "Seulement",
 	"Only alphanumeric characters and hyphens are allowed in the command string.": "Seuls les caractères alphanumériques et les tirets sont autorisés dans la chaîne de commande.",
 	"Only alphanumeric characters and hyphens are allowed in the command string.": "Seuls les caractères alphanumériques et les tirets sont autorisés dans la chaîne de commande.",
 	"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Oups ! Tenez bon ! Vos fichiers sont encore dans le four. Nous les cuisinons à la perfection. Soyez patient et nous vous informerons dès qu'ils seront prêts.",
 	"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Oups ! Tenez bon ! Vos fichiers sont encore dans le four. Nous les cuisinons à la perfection. Soyez patient et nous vous informerons dès qu'ils seront prêts.",
-	"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! Looks like the URL is invalid. Please double-check and try again.",
-	"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.",
+	"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oups ! On dirait que l'URL est invalide. Vérifiez et réessayez.",
+	"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oups ! Vous utilisez une méthode non-supportée (frontend uniquement). Veuillez également servir WebUI depuis le backend.",
 	"Open": "Ouvrir",
 	"Open": "Ouvrir",
 	"Open AI": "Open AI",
 	"Open AI": "Open AI",
 	"Open AI (Dall-E)": "Open AI (Dall-E)",
 	"Open AI (Dall-E)": "Open AI (Dall-E)",
 	"Open new chat": "Ouvrir un nouveau chat",
 	"Open new chat": "Ouvrir un nouveau chat",
 	"OpenAI": "OpenAI",
 	"OpenAI": "OpenAI",
 	"OpenAI API": "API OpenAI",
 	"OpenAI API": "API OpenAI",
-	"OpenAI API Config": "Configuration API OpenAI",
-	"OpenAI API Key is required.": "La clé API OpenAI est requise.",
-	"OpenAI URL/Key required.": "L'URL/Clé OpenAI est requise.",
+	"OpenAI API Config": "Config API OpenAI",
+	"OpenAI API Key is required.": "La clé d'API OpenAI est requise.",
+	"OpenAI URL/Key required.": "URL/Clé OpenAI requise.",
 	"or": "ou",
 	"or": "ou",
 	"Other": "Autre",
 	"Other": "Autre",
-	"Overview": "Aperçu",
 	"Password": "Mot de passe",
 	"Password": "Mot de passe",
 	"PDF document (.pdf)": "Document PDF (.pdf)",
 	"PDF document (.pdf)": "Document PDF (.pdf)",
 	"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
 	"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
 	"pending": "en attente",
 	"pending": "en attente",
 	"Permission denied when accessing microphone: {{error}}": "Permission refusée lors de l'accès au microphone : {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "Permission refusée lors de l'accès au microphone : {{error}}",
 	"Personalization": "Personnalisation",
 	"Personalization": "Personnalisation",
-	"Plain text (.txt)": "Texte brut (.txt)",
+	"Plain text (.txt)": "Texte Brute (.txt)",
 	"Playground": "Aire de jeu",
 	"Playground": "Aire de jeu",
-	"Positive attitude": "Attitude positive",
-	"Previous 30 days": "30 derniers jours",
-	"Previous 7 days": "7 derniers jours",
-	"Profile Image": "Image de profil",
+	"Positive attitude": "Attitude Positive",
+	"Previous 30 days": "30 jours précédents",
+	"Previous 7 days": "7 jours précédents",
+	"Profile Image": "Image du Profil",
 	"Prompt": "Prompt",
 	"Prompt": "Prompt",
-	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (par exemple, Dites-moi un fait amusant sur l'Imperium romain)",
+	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (p. ex. Raconte moi un fait amusant sur l'Empire Romain)",
 	"Prompt Content": "Contenu du prompt",
 	"Prompt Content": "Contenu du prompt",
 	"Prompt suggestions": "Suggestions de prompt",
 	"Prompt suggestions": "Suggestions de prompt",
 	"Prompts": "Prompts",
 	"Prompts": "Prompts",
-	"Pull \"{{searchValue}}\" from Ollama.com": "Tirer \"{{searchValue}}\" de Ollama.com",
-	"Pull a model from Ollama.com": "Tirer un modèle de Ollama.com",
-	"Query Params": "Paramètres de requête",
+	"Pull \"{{searchValue}}\" from Ollama.com": "Récupérer \"{{searchValue}}\" de Ollama.com",
+	"Pull a model from Ollama.com": "Récupérer un modèle de Ollama.com",
+	"Query Params": "Paramètres de Requête",
 	"RAG Template": "Modèle RAG",
 	"RAG Template": "Modèle RAG",
-	"Read Aloud": "Lire à l'oreille",
+	"Read Aloud": "Lire à Voix Haute",
 	"Record voice": "Enregistrer la voix",
 	"Record voice": "Enregistrer la voix",
-	"Redirecting you to OpenWebUI Community": "Vous redirige vers la communauté OpenWebUI",
-	"Refused when it shouldn't have": "Refusé quand il ne devrait pas l'être",
-	"Regenerate": "Régénérer",
-	"Release Notes": "Notes de version",
-	"Remove": "Supprimer",
-	"Remove Model": "Supprimer le modèle",
+	"Redirecting you to OpenWebUI Community": "Redirection vers la communauté OpenWebUI",
+	"Refused when it shouldn't have": "Refuse quand il ne devrait pas",
+	"Regenerate": "Regénérer",
+	"Release Notes": "Notes de Version",
+	"Remove": "Retirer",
+	"Remove Model": "Retirer le Modèle",
 	"Rename": "Renommer",
 	"Rename": "Renommer",
-	"Repeat Last N": "Répéter les derniers N",
-	"Request Mode": "Mode de demande",
-	"Reranking Model": "Modèle de reranking",
-	"Reranking model disabled": "Modèle de reranking désactivé",
-	"Reranking model set to \"{{reranking_model}}\"": "Modèle de reranking défini sur \"{{reranking_model}}\"",
-	"Reset Vector Storage": "Réinitialiser le stockage de vecteur",
-	"Response AutoCopy to Clipboard": "Copie automatique de la réponse dans le presse-papiers",
+	"Repeat Last N": "Répéter les Derniers N",
+	"Request Mode": "Mode de Demande",
+	"Reranking Model": "Modèle de Reclassement",
+	"Reranking model disabled": "Modèle de Reclassement Désactivé",
+	"Reranking model set to \"{{reranking_model}}\"": "Modèle de reclassement défini sur \"{{reranking_model}}\"",
+	"Reset Vector Storage": "Réinitialiser le Stockage de Vecteur",
+	"Response AutoCopy to Clipboard": "Copie Automatique de la Réponse dans le Presse-papiers",
 	"Role": "Rôle",
 	"Role": "Rôle",
 	"Rosé Pine": "Pin Rosé",
 	"Rosé Pine": "Pin Rosé",
 	"Rosé Pine Dawn": "Aube Pin Rosé",
 	"Rosé Pine Dawn": "Aube Pin Rosé",
@@ -365,37 +364,39 @@
 	"Scan for documents from {{path}}": "Scanner des documents depuis {{path}}",
 	"Scan for documents from {{path}}": "Scanner des documents depuis {{path}}",
 	"Search": "Recherche",
 	"Search": "Recherche",
 	"Search a model": "Rechercher un modèle",
 	"Search a model": "Rechercher un modèle",
-	"Search Documents": "Rechercher des documents",
-	"Search Prompts": "Rechercher des prompts",
+	"Search Chats": "",
+	"Search Documents": "Rechercher des Documents",
+	"Search Models": "",
+	"Search Prompts": "Rechercher des Prompts",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"See readme.md for instructions": "Voir readme.md pour les instructions",
 	"See readme.md for instructions": "Voir readme.md pour les instructions",
 	"See what's new": "Voir les nouveautés",
 	"See what's new": "Voir les nouveautés",
 	"Seed": "Graine",
 	"Seed": "Graine",
-	"Select a base model": "",
-	"Select a mode": "Sélectionnez un mode",
+	"Select a base model": "Sélectionner un modèle de base",
+	"Select a mode": "Sélectionner un mode",
 	"Select a model": "Sélectionner un modèle",
 	"Select a model": "Sélectionner un modèle",
 	"Select an Ollama instance": "Sélectionner une instance Ollama",
 	"Select an Ollama instance": "Sélectionner une instance Ollama",
 	"Select model": "Sélectionner un modèle",
 	"Select model": "Sélectionner un modèle",
-	"Selected model(s) do not support image inputs": "",
+	"Selected model(s) do not support image inputs": "Modèle(s) séléctionés ne supportent pas les entrées images",
 	"Send": "Envoyer",
 	"Send": "Envoyer",
 	"Send a Message": "Envoyer un message",
 	"Send a Message": "Envoyer un message",
 	"Send message": "Envoyer un message",
 	"Send message": "Envoyer un message",
 	"September": "Septembre",
 	"September": "Septembre",
 	"Server connection verified": "Connexion au serveur vérifiée",
 	"Server connection verified": "Connexion au serveur vérifiée",
 	"Set as default": "Définir par défaut",
 	"Set as default": "Définir par défaut",
-	"Set Default Model": "Définir le modèle par défaut",
-	"Set embedding model (e.g. {{model}})": "Définir le modèle d'embedding (par exemple {{model}})",
-	"Set Image Size": "Définir la taille de l'image",
-	"Set Model": "Définir le modèle",
-	"Set reranking model (e.g. {{model}})": "Définir le modèle de reranking (par exemple {{model}})",
-	"Set Steps": "Définir les étapes",
+	"Set Default Model": "Définir le Modèle par Défaut",
+	"Set embedding model (e.g. {{model}})": "Définir le modèle d'embedding (p. ex. {{model}})",
+	"Set Image Size": "Définir la Taille de l'Image",
+	"Set Model": "Définir le Modèle",
+	"Set reranking model (e.g. {{model}})": "Définir le modèle de reclassement (p. ex. {{model}})",
+	"Set Steps": "Définir les Étapes",
 	"Set Task Model": "",
 	"Set Task Model": "",
-	"Set Voice": "Définir la voix",
+	"Set Voice": "Définir la Voix",
 	"Settings": "Paramètres",
 	"Settings": "Paramètres",
 	"Settings saved successfully!": "Paramètres enregistrés avec succès !",
 	"Settings saved successfully!": "Paramètres enregistrés avec succès !",
 	"Share": "Partager",
 	"Share": "Partager",
-	"Share Chat": "Partager le chat",
+	"Share Chat": "Partager le Chat",
 	"Share to OpenWebUI Community": "Partager avec la communauté OpenWebUI",
 	"Share to OpenWebUI Community": "Partager avec la communauté OpenWebUI",
 	"short-summary": "résumé court",
 	"short-summary": "résumé court",
 	"Show": "Montrer",
 	"Show": "Montrer",
@@ -408,36 +409,36 @@
 	"Signing in": "Connexion en cours",
 	"Signing in": "Connexion en cours",
 	"Source": "Source",
 	"Source": "Source",
 	"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}",
 	"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}",
-	"Speech-to-Text Engine": "Moteur de reconnaissance vocale",
+	"Speech-to-Text Engine": "Moteur de Reconnaissance Vocale",
 	"SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition n'est pas prise en charge dans ce navigateur.",
 	"SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition n'est pas prise en charge dans ce navigateur.",
-	"Stop Sequence": "Séquence d'arrêt",
+	"Stop Sequence": "Séquence d'Arrêt",
 	"STT Settings": "Paramètres STT",
 	"STT Settings": "Paramètres STT",
-	"Submit": "Soumettre",
-	"Subtitle (e.g. about the Roman Empire)": "Sous-titre (par exemple, sur l'empire romain)",
+	"Submit": "Envoyer",
+	"Subtitle (e.g. about the Roman Empire)": "Sous-Titres (p. ex. à propos de l'Empire Romain)",
 	"Success": "Succès",
 	"Success": "Succès",
 	"Successfully updated.": "Mis à jour avec succès.",
 	"Successfully updated.": "Mis à jour avec succès.",
 	"Suggested": "Suggéré",
 	"Suggested": "Suggéré",
 	"System": "Système",
 	"System": "Système",
-	"System Prompt": "Invite de système",
+	"System Prompt": "Prompt du Système",
 	"Tags": "Tags",
 	"Tags": "Tags",
-	"Tell us more:": "Donnez-nous plus:",
+	"Tell us more:": "Dites-nous en plus :",
 	"Temperature": "Température",
 	"Temperature": "Température",
 	"Template": "Modèle",
 	"Template": "Modèle",
-	"Text Completion": "Complétion de texte",
-	"Text-to-Speech Engine": "Moteur de synthèse vocale",
+	"Text Completion": "Complétion de Texte",
+	"Text-to-Speech Engine": "Moteur de Synthèse Vocale",
 	"Tfs Z": "Tfs Z",
 	"Tfs Z": "Tfs Z",
-	"Thanks for your feedback!": "Merci pour votre feedback!",
-	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Le score doit être une valeur comprise entre 0.0 (0%) et 1.0 (100%).",
+	"Thanks for your feedback!": "Merci pour votre avis !",
+	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Le score devrait avoir une valeur entre 0.0 (0%) et 1.0 (100%).",
 	"Theme": "Thème",
 	"Theme": "Thème",
 	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Cela garantit que vos précieuses conversations sont en sécurité dans votre base de données. Merci !",
 	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Cela garantit que vos précieuses conversations sont en sécurité dans votre base de données. Merci !",
 	"This setting does not sync across browsers or devices.": "Ce paramètre ne se synchronise pas entre les navigateurs ou les appareils.",
 	"This setting does not sync across browsers or devices.": "Ce paramètre ne se synchronise pas entre les navigateurs ou les appareils.",
-	"Thorough explanation": "Explication approfondie",
-	"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.",
+	"Thorough explanation": "Explication détaillée",
+	"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Conseil : Mettez à jour plusieurs emplacements de variables consécutivement en appuyant sur la touche tab dans l'entrée de chat après chaque remplacement",
 	"Title": "Titre",
 	"Title": "Titre",
-	"Title (e.g. Tell me a fun fact)": "Titre (par exemple, Dites-moi un fait amusant)",
-	"Title Auto-Generation": "Génération automatique de titre",
-	"Title cannot be an empty string.": "Le titre ne peut pas être une chaîne vide.",
-	"Title Generation Prompt": "Prompt de génération de titre",
+	"Title (e.g. Tell me a fun fact)": "Titre (p. ex. Donne moi un fait amusant)",
+	"Title Auto-Generation": "Génération Automatique du Titre",
+	"Title cannot be an empty string.": "Le Titre ne peut pas être vide.",
+	"Title Generation Prompt": "Prompt de Génération du Titre",
 	"to": "à",
 	"to": "à",
 	"To access the available model names for downloading,": "Pour accéder aux noms de modèles disponibles pour le téléchargement,",
 	"To access the available model names for downloading,": "Pour accéder aux noms de modèles disponibles pour le téléchargement,",
 	"To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles pour le téléchargement,",
 	"To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles pour le téléchargement,",
@@ -449,11 +450,11 @@
 	"Top P": "Top P",
 	"Top P": "Top P",
 	"Trouble accessing Ollama?": "Problèmes d'accès à Ollama ?",
 	"Trouble accessing Ollama?": "Problèmes d'accès à Ollama ?",
 	"TTS Settings": "Paramètres TTS",
 	"TTS Settings": "Paramètres TTS",
-	"Type Hugging Face Resolve (Download) URL": "Entrez l'URL de résolution (téléchargement) Hugging Face",
+	"Type Hugging Face Resolve (Download) URL": "Entrez l'URL de Résolution (Téléchargement) Hugging Face",
 	"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh ! Il y a eu un problème de connexion à {{provider}}.",
 	"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh ! Il y a eu un problème de connexion à {{provider}}.",
-	"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Type de fichier inconnu '{{file_type}}', mais accepté et traité comme du texte brut",
-	"Update and Copy Link": "Mettre à jour et copier le lien",
-	"Update password": "Mettre à jour le mot de passe",
+	"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Type de Fichier Inconnu '{{file_type}}', mais accepté et traité comme du texte brut",
+	"Update and Copy Link": "Mettre à Jour et Copier le Lien",
+	"Update password": "Mettre à Jour le Mot de Passe",
 	"Upload a GGUF model": "Téléverser un modèle GGUF",
 	"Upload a GGUF model": "Téléverser un modèle GGUF",
 	"Upload files": "Téléverser des fichiers",
 	"Upload files": "Téléverser des fichiers",
 	"Upload Progress": "Progression du Téléversement",
 	"Upload Progress": "Progression du Téléversement",
@@ -469,29 +470,29 @@
 	"variable": "variable",
 	"variable": "variable",
 	"variable to have them replaced with clipboard content.": "variable pour les remplacer par le contenu du presse-papiers.",
 	"variable to have them replaced with clipboard content.": "variable pour les remplacer par le contenu du presse-papiers.",
 	"Version": "Version",
 	"Version": "Version",
-	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Attention : Si vous mettez à jour ou changez votre modèle d'intégration, vous devrez réimporter tous les documents.",
+	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avertissement : Si vous mettez à jour ou modifier votre modèle d'embedding, vous devrez réimporter tous les documents.",
 	"Web": "Web",
 	"Web": "Web",
-	"Web Loader Settings": "Paramètres du chargeur Web",
+	"Web Loader Settings": "Paramètres du Chargeur Web",
 	"Web Params": "Paramètres Web",
 	"Web Params": "Paramètres Web",
 	"Web Search Disabled": "",
 	"Web Search Disabled": "",
 	"Web Search Enabled": "",
 	"Web Search Enabled": "",
-	"Webhook URL": "URL Webhook",
+	"Webhook URL": "URL du Webhook",
 	"WebUI Add-ons": "Add-ons WebUI",
 	"WebUI Add-ons": "Add-ons WebUI",
 	"WebUI Settings": "Paramètres WebUI",
 	"WebUI Settings": "Paramètres WebUI",
 	"WebUI will make requests to": "WebUI effectuera des demandes à",
 	"WebUI will make requests to": "WebUI effectuera des demandes à",
 	"What’s New in": "Quoi de neuf dans",
 	"What’s New in": "Quoi de neuf dans",
 	"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Lorsque l'historique est désactivé, les nouveaux chats sur ce navigateur n'apparaîtront pas dans votre historique sur aucun de vos appareils.",
 	"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Lorsque l'historique est désactivé, les nouveaux chats sur ce navigateur n'apparaîtront pas dans votre historique sur aucun de vos appareils.",
 	"Whisper (Local)": "Whisper (Local)",
 	"Whisper (Local)": "Whisper (Local)",
-	"Workspace": "Espace de travail",
-	"Write a prompt suggestion (e.g. Who are you?)": "Écrivez un prompt (e.x. Qui est-tu ?)",
-	"Write a summary in 50 words that summarizes [topic or keyword].": "Ecrivez un résumé en 50 mots [sujet ou mot-clé]",
-	"Yesterday": "hier",
+	"Workspace": "Espace de Travail",
+	"Write a prompt suggestion (e.g. Who are you?)": "Écrivez une suggestion de prompt (e.x. Qui est-tu ?)",
+	"Write a summary in 50 words that summarizes [topic or keyword].": "Ecrivez un résumé en 50 mots qui résume [sujet ou mot-clé]",
+	"Yesterday": "Hier",
 	"You": "Vous",
 	"You": "Vous",
-	"You cannot clone a base model": "",
-	"You have no archived conversations.": "Vous n'avez aucune conversation archivée.",
-	"You have shared this chat": "Vous avez partagé cette conversation.",
-	"You're a helpful assistant.": "Vous êtes un assistant utile",
+	"You cannot clone a base model": "Vous ne pouvez pas cloner un modèle de base",
+	"You have no archived conversations.": "Vous n'avez pas de conversations archivées",
+	"You have shared this chat": "Vous avez partagé ce chat",
+	"You're a helpful assistant.": "Vous êtes un assistant utile.",
 	"You're now logged in.": "Vous êtes maintenant connecté.",
 	"You're now logged in.": "Vous êtes maintenant connecté.",
 	"Youtube": "Youtube",
 	"Youtube": "Youtube",
-	"Youtube Loader Settings": "Paramètres du chargeur de Youtube"
+	"Youtube Loader Settings": "Paramètres du Chargeur YouTube"
 }
 }

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

@@ -48,6 +48,7 @@
 	"API keys": "מפתחות API",
 	"API keys": "מפתחות API",
 	"April": "אפריל",
 	"April": "אפריל",
 	"Archive": "ארכיון",
 	"Archive": "ארכיון",
+	"Archive All Chats": "",
 	"Archived Chats": "צ'אטים מאורכבים",
 	"Archived Chats": "צ'אטים מאורכבים",
 	"are allowed - Activate this command by typing": "מותרים - הפעל פקודה זו על ידי הקלדה",
 	"are allowed - Activate this command by typing": "מותרים - הפעל פקודה זו על ידי הקלדה",
 	"Are you sure?": "האם אתה בטוח?",
 	"Are you sure?": "האם אתה בטוח?",
@@ -120,7 +121,6 @@
 	"Custom": "מותאם אישית",
 	"Custom": "מותאם אישית",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "כהה",
 	"Dark": "כהה",
-	"Dashboard": "לוח בקרה",
 	"Database": "מסד נתונים",
 	"Database": "מסד נתונים",
 	"December": "דצמבר",
 	"December": "דצמבר",
 	"Default": "ברירת מחדל",
 	"Default": "ברירת מחדל",
@@ -133,9 +133,9 @@
 	"delete": "מחק",
 	"delete": "מחק",
 	"Delete": "מחק",
 	"Delete": "מחק",
 	"Delete a model": "מחק מודל",
 	"Delete a model": "מחק מודל",
+	"Delete All Chats": "",
 	"Delete chat": "מחק צ'אט",
 	"Delete chat": "מחק צ'אט",
 	"Delete Chat": "מחק צ'אט",
 	"Delete Chat": "מחק צ'אט",
-	"Delete Chats": "מחק צ'אטים",
 	"delete this link": "מחק את הקישור הזה",
 	"delete this link": "מחק את הקישור הזה",
 	"Delete User": "מחק משתמש",
 	"Delete User": "מחק משתמש",
 	"Deleted {{deleteModelTag}}": "נמחק {{deleteModelTag}}",
 	"Deleted {{deleteModelTag}}": "נמחק {{deleteModelTag}}",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "נדרשת כתובת URL/מפתח של OpenAI.",
 	"OpenAI URL/Key required.": "נדרשת כתובת URL/מפתח של OpenAI.",
 	"or": "או",
 	"or": "או",
 	"Other": "אחר",
 	"Other": "אחר",
-	"Overview": "סקירה כללית",
 	"Password": "סיסמה",
 	"Password": "סיסמה",
 	"PDF document (.pdf)": "מסמך PDF (.pdf)",
 	"PDF document (.pdf)": "מסמך PDF (.pdf)",
 	"PDF Extract Images (OCR)": "חילוץ תמונות מ-PDF (OCR)",
 	"PDF Extract Images (OCR)": "חילוץ תמונות מ-PDF (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "סרוק מסמכים מ-{{path}}",
 	"Scan for documents from {{path}}": "סרוק מסמכים מ-{{path}}",
 	"Search": "חפש",
 	"Search": "חפש",
 	"Search a model": "חפש מודל",
 	"Search a model": "חפש מודל",
+	"Search Chats": "",
 	"Search Documents": "חפש מסמכים",
 	"Search Documents": "חפש מסמכים",
+	"Search Models": "",
 	"Search Prompts": "חפש פקודות",
 	"Search Prompts": "חפש פקודות",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "एपीआई कुंजियाँ",
 	"API keys": "एपीआई कुंजियाँ",
 	"April": "अप्रैल",
 	"April": "अप्रैल",
 	"Archive": "पुरालेख",
 	"Archive": "पुरालेख",
+	"Archive All Chats": "",
 	"Archived Chats": "संग्रहीत चैट",
 	"Archived Chats": "संग्रहीत चैट",
 	"are allowed - Activate this command by typing": "अनुमति है - टाइप करके इस कमांड को सक्रिय करें",
 	"are allowed - Activate this command by typing": "अनुमति है - टाइप करके इस कमांड को सक्रिय करें",
 	"Are you sure?": "क्या आपको यकीन है?",
 	"Are you sure?": "क्या आपको यकीन है?",
@@ -120,7 +121,6 @@
 	"Custom": "कस्टम संस्करण",
 	"Custom": "कस्टम संस्करण",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "डार्क",
 	"Dark": "डार्क",
-	"Dashboard": "डैशबोर्ड",
 	"Database": "डेटाबेस",
 	"Database": "डेटाबेस",
 	"December": "डिसेंबर",
 	"December": "डिसेंबर",
 	"Default": "डिफ़ॉल्ट",
 	"Default": "डिफ़ॉल्ट",
@@ -133,9 +133,9 @@
 	"delete": "डिलीट",
 	"delete": "डिलीट",
 	"Delete": "डिलीट",
 	"Delete": "डिलीट",
 	"Delete a model": "एक मॉडल हटाएँ",
 	"Delete a model": "एक मॉडल हटाएँ",
+	"Delete All Chats": "",
 	"Delete chat": "चैट हटाएं",
 	"Delete chat": "चैट हटाएं",
 	"Delete Chat": "चैट हटाएं",
 	"Delete Chat": "चैट हटाएं",
-	"Delete Chats": "चैट हटाएं",
 	"delete this link": "इस लिंक को हटाएं",
 	"delete this link": "इस लिंक को हटाएं",
 	"Delete User": "उपभोक्ता मिटायें",
 	"Delete User": "उपभोक्ता मिटायें",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} हटा दिया गया",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} हटा दिया गया",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "OpenAI URL/Key आवश्यक है।",
 	"OpenAI URL/Key required.": "OpenAI URL/Key आवश्यक है।",
 	"or": "या",
 	"or": "या",
 	"Other": "अन्य",
 	"Other": "अन्य",
-	"Overview": "अवलोकन",
 	"Password": "पासवर्ड",
 	"Password": "पासवर्ड",
 	"PDF document (.pdf)": "PDF दस्तावेज़ (.pdf)",
 	"PDF document (.pdf)": "PDF दस्तावेज़ (.pdf)",
 	"PDF Extract Images (OCR)": "PDF छवियाँ निकालें (OCR)",
 	"PDF Extract Images (OCR)": "PDF छवियाँ निकालें (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "{{path}} से दस्तावेज़ों को स्कैन करें",
 	"Scan for documents from {{path}}": "{{path}} से दस्तावेज़ों को स्कैन करें",
 	"Search": "खोजें",
 	"Search": "खोजें",
 	"Search a model": "एक मॉडल खोजें",
 	"Search a model": "एक मॉडल खोजें",
+	"Search Chats": "",
 	"Search Documents": "दस्तावेज़ खोजें",
 	"Search Documents": "दस्तावेज़ खोजें",
+	"Search Models": "",
 	"Search Prompts": "प्रॉम्प्ट खोजें",
 	"Search Prompts": "प्रॉम्प्ट खोजें",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "API ključevi",
 	"API keys": "API ključevi",
 	"April": "Travanj",
 	"April": "Travanj",
 	"Archive": "Arhiva",
 	"Archive": "Arhiva",
+	"Archive All Chats": "",
 	"Archived Chats": "Arhivirani razgovori",
 	"Archived Chats": "Arhivirani razgovori",
 	"are allowed - Activate this command by typing": "su dopušteni - Aktivirajte ovu naredbu upisivanjem",
 	"are allowed - Activate this command by typing": "su dopušteni - Aktivirajte ovu naredbu upisivanjem",
 	"Are you sure?": "Jeste li sigurni?",
 	"Are you sure?": "Jeste li sigurni?",
@@ -120,7 +121,6 @@
 	"Custom": "Prilagođeno",
 	"Custom": "Prilagođeno",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Tamno",
 	"Dark": "Tamno",
-	"Dashboard": "Nadzorna ploča",
 	"Database": "Baza podataka",
 	"Database": "Baza podataka",
 	"December": "Prosinac",
 	"December": "Prosinac",
 	"Default": "Zadano",
 	"Default": "Zadano",
@@ -133,9 +133,9 @@
 	"delete": "izbriši",
 	"delete": "izbriši",
 	"Delete": "Izbriši",
 	"Delete": "Izbriši",
 	"Delete a model": "Izbriši model",
 	"Delete a model": "Izbriši model",
+	"Delete All Chats": "",
 	"Delete chat": "Izbriši razgovor",
 	"Delete chat": "Izbriši razgovor",
 	"Delete Chat": "Izbriši razgovor",
 	"Delete Chat": "Izbriši razgovor",
-	"Delete Chats": "Izbriši razgovore",
 	"delete this link": "izbriši ovu vezu",
 	"delete this link": "izbriši ovu vezu",
 	"Delete User": "Izbriši korisnika",
 	"Delete User": "Izbriši korisnika",
 	"Deleted {{deleteModelTag}}": "Izbrisan {{deleteModelTag}}",
 	"Deleted {{deleteModelTag}}": "Izbrisan {{deleteModelTag}}",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "Potreban je OpenAI URL/ključ.",
 	"OpenAI URL/Key required.": "Potreban je OpenAI URL/ključ.",
 	"or": "ili",
 	"or": "ili",
 	"Other": "Ostalo",
 	"Other": "Ostalo",
-	"Overview": "Pregled",
 	"Password": "Lozinka",
 	"Password": "Lozinka",
 	"PDF document (.pdf)": "PDF dokument (.pdf)",
 	"PDF document (.pdf)": "PDF dokument (.pdf)",
 	"PDF Extract Images (OCR)": "PDF izdvajanje slika (OCR)",
 	"PDF Extract Images (OCR)": "PDF izdvajanje slika (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "Skeniraj dokumente s {{path}}",
 	"Scan for documents from {{path}}": "Skeniraj dokumente s {{path}}",
 	"Search": "Pretraga",
 	"Search": "Pretraga",
 	"Search a model": "Pretraži model",
 	"Search a model": "Pretraži model",
+	"Search Chats": "",
 	"Search Documents": "Pretraga dokumenata",
 	"Search Documents": "Pretraga dokumenata",
+	"Search Models": "",
 	"Search Prompts": "Pretraga prompta",
 	"Search Prompts": "Pretraga prompta",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "Chiavi API",
 	"API keys": "Chiavi API",
 	"April": "Aprile",
 	"April": "Aprile",
 	"Archive": "Archivio",
 	"Archive": "Archivio",
+	"Archive All Chats": "",
 	"Archived Chats": "Chat archiviate",
 	"Archived Chats": "Chat archiviate",
 	"are allowed - Activate this command by typing": "sono consentiti - Attiva questo comando digitando",
 	"are allowed - Activate this command by typing": "sono consentiti - Attiva questo comando digitando",
 	"Are you sure?": "Sei sicuro?",
 	"Are you sure?": "Sei sicuro?",
@@ -120,7 +121,6 @@
 	"Custom": "Personalizzato",
 	"Custom": "Personalizzato",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Scuro",
 	"Dark": "Scuro",
-	"Dashboard": "Pannello di controllo",
 	"Database": "Database",
 	"Database": "Database",
 	"December": "Dicembre",
 	"December": "Dicembre",
 	"Default": "Predefinito",
 	"Default": "Predefinito",
@@ -133,9 +133,9 @@
 	"delete": "elimina",
 	"delete": "elimina",
 	"Delete": "Elimina",
 	"Delete": "Elimina",
 	"Delete a model": "Elimina un modello",
 	"Delete a model": "Elimina un modello",
+	"Delete All Chats": "",
 	"Delete chat": "Elimina chat",
 	"Delete chat": "Elimina chat",
 	"Delete Chat": "Elimina chat",
 	"Delete Chat": "Elimina chat",
-	"Delete Chats": "Elimina le chat",
 	"delete this link": "elimina questo link",
 	"delete this link": "elimina questo link",
 	"Delete User": "Elimina utente",
 	"Delete User": "Elimina utente",
 	"Deleted {{deleteModelTag}}": "Eliminato {{deleteModelTag}}",
 	"Deleted {{deleteModelTag}}": "Eliminato {{deleteModelTag}}",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "URL/Chiave OpenAI obbligatori.",
 	"OpenAI URL/Key required.": "URL/Chiave OpenAI obbligatori.",
 	"or": "o",
 	"or": "o",
 	"Other": "Altro",
 	"Other": "Altro",
-	"Overview": "Panoramica",
 	"Password": "Password",
 	"Password": "Password",
 	"PDF document (.pdf)": "Documento PDF (.pdf)",
 	"PDF document (.pdf)": "Documento PDF (.pdf)",
 	"PDF Extract Images (OCR)": "Estrazione immagini PDF (OCR)",
 	"PDF Extract Images (OCR)": "Estrazione immagini PDF (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "Cerca documenti da {{path}}",
 	"Scan for documents from {{path}}": "Cerca documenti da {{path}}",
 	"Search": "Cerca",
 	"Search": "Cerca",
 	"Search a model": "Cerca un modello",
 	"Search a model": "Cerca un modello",
+	"Search Chats": "",
 	"Search Documents": "Cerca documenti",
 	"Search Documents": "Cerca documenti",
+	"Search Models": "",
 	"Search Prompts": "Cerca prompt",
 	"Search Prompts": "Cerca prompt",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "API キー",
 	"API keys": "API キー",
 	"April": "4月",
 	"April": "4月",
 	"Archive": "アーカイブ",
 	"Archive": "アーカイブ",
+	"Archive All Chats": "",
 	"Archived Chats": "チャット記録",
 	"Archived Chats": "チャット記録",
 	"are allowed - Activate this command by typing": "が許可されています - 次のように入力してこのコマンドをアクティブ化します",
 	"are allowed - Activate this command by typing": "が許可されています - 次のように入力してこのコマンドをアクティブ化します",
 	"Are you sure?": "よろしいですか?",
 	"Are you sure?": "よろしいですか?",
@@ -120,7 +121,6 @@
 	"Custom": "カスタム",
 	"Custom": "カスタム",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "ダーク",
 	"Dark": "ダーク",
-	"Dashboard": "ダッシュボード",
 	"Database": "データベース",
 	"Database": "データベース",
 	"December": "12月",
 	"December": "12月",
 	"Default": "デフォルト",
 	"Default": "デフォルト",
@@ -133,9 +133,9 @@
 	"delete": "削除",
 	"delete": "削除",
 	"Delete": "削除",
 	"Delete": "削除",
 	"Delete a model": "モデルを削除",
 	"Delete a model": "モデルを削除",
+	"Delete All Chats": "",
 	"Delete chat": "チャットを削除",
 	"Delete chat": "チャットを削除",
 	"Delete Chat": "チャットを削除",
 	"Delete Chat": "チャットを削除",
-	"Delete Chats": "チャットを削除",
 	"delete this link": "このリンクを削除します",
 	"delete this link": "このリンクを削除します",
 	"Delete User": "ユーザーを削除",
 	"Delete User": "ユーザーを削除",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} を削除しました",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} を削除しました",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "OpenAI URL/Key が必要です。",
 	"OpenAI URL/Key required.": "OpenAI URL/Key が必要です。",
 	"or": "または",
 	"or": "または",
 	"Other": "その他",
 	"Other": "その他",
-	"Overview": "概要",
 	"Password": "パスワード",
 	"Password": "パスワード",
 	"PDF document (.pdf)": "PDF ドキュメント (.pdf)",
 	"PDF document (.pdf)": "PDF ドキュメント (.pdf)",
 	"PDF Extract Images (OCR)": "PDF 画像抽出 (OCR)",
 	"PDF Extract Images (OCR)": "PDF 画像抽出 (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "{{path}} からドキュメントをスキャン",
 	"Scan for documents from {{path}}": "{{path}} からドキュメントをスキャン",
 	"Search": "検索",
 	"Search": "検索",
 	"Search a model": "モデルを検索",
 	"Search a model": "モデルを検索",
+	"Search Chats": "",
 	"Search Documents": "ドキュメントを検索",
 	"Search Documents": "ドキュメントを検索",
+	"Search Models": "",
 	"Search Prompts": "プロンプトを検索",
 	"Search Prompts": "プロンプトを検索",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "API გასაღები",
 	"API keys": "API გასაღები",
 	"April": "აპრილი",
 	"April": "აპრილი",
 	"Archive": "არქივი",
 	"Archive": "არქივი",
+	"Archive All Chats": "",
 	"Archived Chats": "ჩატის ისტორიის არქივი",
 	"Archived Chats": "ჩატის ისტორიის არქივი",
 	"are allowed - Activate this command by typing": "დაშვებულია - ბრძანების გასააქტიურებლად აკრიფეთ:",
 	"are allowed - Activate this command by typing": "დაშვებულია - ბრძანების გასააქტიურებლად აკრიფეთ:",
 	"Are you sure?": "დარწმუნებული ხარ?",
 	"Are you sure?": "დარწმუნებული ხარ?",
@@ -120,7 +121,6 @@
 	"Custom": "საკუთარი",
 	"Custom": "საკუთარი",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "მუქი",
 	"Dark": "მუქი",
-	"Dashboard": "პანელი",
 	"Database": "მონაცემთა ბაზა",
 	"Database": "მონაცემთა ბაზა",
 	"December": "დეკემბერი",
 	"December": "დეკემბერი",
 	"Default": "დეფოლტი",
 	"Default": "დეფოლტი",
@@ -133,9 +133,9 @@
 	"delete": "წაშლა",
 	"delete": "წაშლა",
 	"Delete": "წაშლა",
 	"Delete": "წაშლა",
 	"Delete a model": "მოდელის წაშლა",
 	"Delete a model": "მოდელის წაშლა",
+	"Delete All Chats": "",
 	"Delete chat": "შეტყობინების წაშლა",
 	"Delete chat": "შეტყობინების წაშლა",
 	"Delete Chat": "შეტყობინების წაშლა",
 	"Delete Chat": "შეტყობინების წაშლა",
-	"Delete Chats": "შეტყობინებების წაშლა",
 	"delete this link": "ბმულის წაშლა",
 	"delete this link": "ბმულის წაშლა",
 	"Delete User": "მომხმარებლის წაშლა",
 	"Delete User": "მომხმარებლის წაშლა",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} წაშლილია",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} წაშლილია",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "OpenAI URL/Key აუცილებელია",
 	"OpenAI URL/Key required.": "OpenAI URL/Key აუცილებელია",
 	"or": "ან",
 	"or": "ან",
 	"Other": "სხვა",
 	"Other": "სხვა",
-	"Overview": "ოვერვიუ",
 	"Password": "პაროლი",
 	"Password": "პაროლი",
 	"PDF document (.pdf)": "PDF დოკუმენტი (.pdf)",
 	"PDF document (.pdf)": "PDF დოკუმენტი (.pdf)",
 	"PDF Extract Images (OCR)": "PDF იდან ამოღებული სურათები (OCR)",
 	"PDF Extract Images (OCR)": "PDF იდან ამოღებული სურათები (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "დოკუმენტების სკანირება {{ path}}-დან",
 	"Scan for documents from {{path}}": "დოკუმენტების სკანირება {{ path}}-დან",
 	"Search": "ძიება",
 	"Search": "ძიება",
 	"Search a model": "მოდელის ძიება",
 	"Search a model": "მოდელის ძიება",
+	"Search Chats": "",
 	"Search Documents": "დოკუმენტების ძიება",
 	"Search Documents": "დოკუმენტების ძიება",
+	"Search Models": "",
 	"Search Prompts": "მოთხოვნების ძიება",
 	"Search Prompts": "მოთხოვნების ძიება",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "API 키",
 	"API keys": "API 키",
 	"April": "4월",
 	"April": "4월",
 	"Archive": "아카이브",
 	"Archive": "아카이브",
+	"Archive All Chats": "",
 	"Archived Chats": "채팅 기록 아카이브",
 	"Archived Chats": "채팅 기록 아카이브",
 	"are allowed - Activate this command by typing": "허용됩니다 - 이 명령을 활성화하려면 입력하세요.",
 	"are allowed - Activate this command by typing": "허용됩니다 - 이 명령을 활성화하려면 입력하세요.",
 	"Are you sure?": "확실합니까?",
 	"Are you sure?": "확실합니까?",
@@ -120,7 +121,6 @@
 	"Custom": "사용자 정의",
 	"Custom": "사용자 정의",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "어두운",
 	"Dark": "어두운",
-	"Dashboard": "대시보드",
 	"Database": "데이터베이스",
 	"Database": "데이터베이스",
 	"December": "12월",
 	"December": "12월",
 	"Default": "기본값",
 	"Default": "기본값",
@@ -133,9 +133,9 @@
 	"delete": "삭제",
 	"delete": "삭제",
 	"Delete": "삭제",
 	"Delete": "삭제",
 	"Delete a model": "모델 삭제",
 	"Delete a model": "모델 삭제",
+	"Delete All Chats": "",
 	"Delete chat": "채팅 삭제",
 	"Delete chat": "채팅 삭제",
 	"Delete Chat": "채팅 삭제",
 	"Delete Chat": "채팅 삭제",
-	"Delete Chats": "채팅들 삭제",
 	"delete this link": "이 링크를 삭제합니다.",
 	"delete this link": "이 링크를 삭제합니다.",
 	"Delete User": "사용자 삭제",
 	"Delete User": "사용자 삭제",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} 삭제됨",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} 삭제됨",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "OpenAI URL/Key가 필요합니다.",
 	"OpenAI URL/Key required.": "OpenAI URL/Key가 필요합니다.",
 	"or": "또는",
 	"or": "또는",
 	"Other": "기타",
 	"Other": "기타",
-	"Overview": "개요",
 	"Password": "비밀번호",
 	"Password": "비밀번호",
 	"PDF document (.pdf)": "PDF 문서 (.pdf)",
 	"PDF document (.pdf)": "PDF 문서 (.pdf)",
 	"PDF Extract Images (OCR)": "PDF에서 이미지 추출 (OCR)",
 	"PDF Extract Images (OCR)": "PDF에서 이미지 추출 (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "{{path}}에서 문서 스캔",
 	"Scan for documents from {{path}}": "{{path}}에서 문서 스캔",
 	"Search": "검색",
 	"Search": "검색",
 	"Search a model": "모델 검색",
 	"Search a model": "모델 검색",
+	"Search Chats": "",
 	"Search Documents": "문서 검색",
 	"Search Documents": "문서 검색",
+	"Search Models": "",
 	"Search Prompts": "프롬프트 검색",
 	"Search Prompts": "프롬프트 검색",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "API keys",
 	"API keys": "API keys",
 	"April": "April",
 	"April": "April",
 	"Archive": "Archief",
 	"Archive": "Archief",
+	"Archive All Chats": "",
 	"Archived Chats": "chatrecord",
 	"Archived Chats": "chatrecord",
 	"are allowed - Activate this command by typing": "zijn toegestaan - Activeer deze commando door te typen",
 	"are allowed - Activate this command by typing": "zijn toegestaan - Activeer deze commando door te typen",
 	"Are you sure?": "Zeker weten?",
 	"Are you sure?": "Zeker weten?",
@@ -120,7 +121,6 @@
 	"Custom": "Aangepast",
 	"Custom": "Aangepast",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Donker",
 	"Dark": "Donker",
-	"Dashboard": "Dashboard",
 	"Database": "Database",
 	"Database": "Database",
 	"December": "December",
 	"December": "December",
 	"Default": "Standaard",
 	"Default": "Standaard",
@@ -133,9 +133,9 @@
 	"delete": "verwijderen",
 	"delete": "verwijderen",
 	"Delete": "Verwijderen",
 	"Delete": "Verwijderen",
 	"Delete a model": "Verwijder een model",
 	"Delete a model": "Verwijder een model",
+	"Delete All Chats": "",
 	"Delete chat": "Verwijder chat",
 	"Delete chat": "Verwijder chat",
 	"Delete Chat": "Verwijder Chat",
 	"Delete Chat": "Verwijder Chat",
-	"Delete Chats": "Verwijder Chats",
 	"delete this link": "verwijder deze link",
 	"delete this link": "verwijder deze link",
 	"Delete User": "Verwijder Gebruiker",
 	"Delete User": "Verwijder Gebruiker",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} is verwijderd",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} is verwijderd",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "OpenAI URL/Sleutel vereist.",
 	"OpenAI URL/Key required.": "OpenAI URL/Sleutel vereist.",
 	"or": "of",
 	"or": "of",
 	"Other": "Andere",
 	"Other": "Andere",
-	"Overview": "Overzicht",
 	"Password": "Wachtwoord",
 	"Password": "Wachtwoord",
 	"PDF document (.pdf)": "PDF document (.pdf)",
 	"PDF document (.pdf)": "PDF document (.pdf)",
 	"PDF Extract Images (OCR)": "PDF Extract Afbeeldingen (OCR)",
 	"PDF Extract Images (OCR)": "PDF Extract Afbeeldingen (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "Scan voor documenten van {{path}}",
 	"Scan for documents from {{path}}": "Scan voor documenten van {{path}}",
 	"Search": "Zoeken",
 	"Search": "Zoeken",
 	"Search a model": "Zoek een model",
 	"Search a model": "Zoek een model",
+	"Search Chats": "",
 	"Search Documents": "Zoek Documenten",
 	"Search Documents": "Zoek Documenten",
+	"Search Models": "",
 	"Search Prompts": "Zoek Prompts",
 	"Search Prompts": "Zoek Prompts",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "API ਕੁੰਜੀਆਂ",
 	"API keys": "API ਕੁੰਜੀਆਂ",
 	"April": "ਅਪ੍ਰੈਲ",
 	"April": "ਅਪ੍ਰੈਲ",
 	"Archive": "ਆਰਕਾਈਵ",
 	"Archive": "ਆਰਕਾਈਵ",
+	"Archive All Chats": "",
 	"Archived Chats": "ਆਰਕਾਈਵ ਕੀਤੀਆਂ ਗੱਲਾਂ",
 	"Archived Chats": "ਆਰਕਾਈਵ ਕੀਤੀਆਂ ਗੱਲਾਂ",
 	"are allowed - Activate this command by typing": "ਅਨੁਮਤ ਹਨ - ਇਸ ਕਮਾਂਡ ਨੂੰ ਟਾਈਪ ਕਰਕੇ ਸਰਗਰਮ ਕਰੋ",
 	"are allowed - Activate this command by typing": "ਅਨੁਮਤ ਹਨ - ਇਸ ਕਮਾਂਡ ਨੂੰ ਟਾਈਪ ਕਰਕੇ ਸਰਗਰਮ ਕਰੋ",
 	"Are you sure?": "ਕੀ ਤੁਸੀਂ ਯਕੀਨਨ ਹੋ?",
 	"Are you sure?": "ਕੀ ਤੁਸੀਂ ਯਕੀਨਨ ਹੋ?",
@@ -120,7 +121,6 @@
 	"Custom": "ਕਸਟਮ",
 	"Custom": "ਕਸਟਮ",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "ਗੂੜ੍ਹਾ",
 	"Dark": "ਗੂੜ੍ਹਾ",
-	"Dashboard": "ਡੈਸ਼ਬੋਰਡ",
 	"Database": "ਡਾਟਾਬੇਸ",
 	"Database": "ਡਾਟਾਬੇਸ",
 	"December": "ਦਸੰਬਰ",
 	"December": "ਦਸੰਬਰ",
 	"Default": "ਮੂਲ",
 	"Default": "ਮੂਲ",
@@ -133,9 +133,9 @@
 	"delete": "ਮਿਟਾਓ",
 	"delete": "ਮਿਟਾਓ",
 	"Delete": "ਮਿਟਾਓ",
 	"Delete": "ਮਿਟਾਓ",
 	"Delete a model": "ਇੱਕ ਮਾਡਲ ਮਿਟਾਓ",
 	"Delete a model": "ਇੱਕ ਮਾਡਲ ਮਿਟਾਓ",
+	"Delete All Chats": "",
 	"Delete chat": "ਗੱਲਬਾਤ ਮਿਟਾਓ",
 	"Delete chat": "ਗੱਲਬਾਤ ਮਿਟਾਓ",
 	"Delete Chat": "ਗੱਲਬਾਤ ਮਿਟਾਓ",
 	"Delete Chat": "ਗੱਲਬਾਤ ਮਿਟਾਓ",
-	"Delete Chats": "ਗੱਲਾਂ ਮਿਟਾਓ",
 	"delete this link": "ਇਸ ਲਿੰਕ ਨੂੰ ਮਿਟਾਓ",
 	"delete this link": "ਇਸ ਲਿੰਕ ਨੂੰ ਮਿਟਾਓ",
 	"Delete User": "ਉਪਭੋਗਤਾ ਮਿਟਾਓ",
 	"Delete User": "ਉਪਭੋਗਤਾ ਮਿਟਾਓ",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} ਮਿਟਾਇਆ ਗਿਆ",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} ਮਿਟਾਇਆ ਗਿਆ",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "ਓਪਨਏਆਈ URL/ਕੁੰਜੀ ਦੀ ਲੋੜ ਹੈ।",
 	"OpenAI URL/Key required.": "ਓਪਨਏਆਈ URL/ਕੁੰਜੀ ਦੀ ਲੋੜ ਹੈ।",
 	"or": "ਜਾਂ",
 	"or": "ਜਾਂ",
 	"Other": "ਹੋਰ",
 	"Other": "ਹੋਰ",
-	"Overview": "ਸੰਖੇਪ",
 	"Password": "ਪਾਸਵਰਡ",
 	"Password": "ਪਾਸਵਰਡ",
 	"PDF document (.pdf)": "PDF ਡਾਕੂਮੈਂਟ (.pdf)",
 	"PDF document (.pdf)": "PDF ਡਾਕੂਮੈਂਟ (.pdf)",
 	"PDF Extract Images (OCR)": "PDF ਚਿੱਤਰ ਕੱਢੋ (OCR)",
 	"PDF Extract Images (OCR)": "PDF ਚਿੱਤਰ ਕੱਢੋ (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "{{path}} ਤੋਂ ਡਾਕੂਮੈਂਟਾਂ ਲਈ ਸਕੈਨ ਕਰੋ",
 	"Scan for documents from {{path}}": "{{path}} ਤੋਂ ਡਾਕੂਮੈਂਟਾਂ ਲਈ ਸਕੈਨ ਕਰੋ",
 	"Search": "ਖੋਜ",
 	"Search": "ਖੋਜ",
 	"Search a model": "ਇੱਕ ਮਾਡਲ ਖੋਜੋ",
 	"Search a model": "ਇੱਕ ਮਾਡਲ ਖੋਜੋ",
+	"Search Chats": "",
 	"Search Documents": "ਡਾਕੂਮੈਂਟ ਖੋਜੋ",
 	"Search Documents": "ਡਾਕੂਮੈਂਟ ਖੋਜੋ",
+	"Search Models": "",
 	"Search Prompts": "ਪ੍ਰੰਪਟ ਖੋਜੋ",
 	"Search Prompts": "ਪ੍ਰੰਪਟ ਖੋਜੋ",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "Klucze API",
 	"API keys": "Klucze API",
 	"April": "Kwiecień",
 	"April": "Kwiecień",
 	"Archive": "Archiwum",
 	"Archive": "Archiwum",
+	"Archive All Chats": "",
 	"Archived Chats": "Zarchiwizowane czaty",
 	"Archived Chats": "Zarchiwizowane czaty",
 	"are allowed - Activate this command by typing": "są dozwolone - Aktywuj to polecenie, wpisując",
 	"are allowed - Activate this command by typing": "są dozwolone - Aktywuj to polecenie, wpisując",
 	"Are you sure?": "Jesteś pewien?",
 	"Are you sure?": "Jesteś pewien?",
@@ -120,7 +121,6 @@
 	"Custom": "Niestandardowy",
 	"Custom": "Niestandardowy",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Ciemny",
 	"Dark": "Ciemny",
-	"Dashboard": "Dashboard",
 	"Database": "Baza danych",
 	"Database": "Baza danych",
 	"December": "Grudzień",
 	"December": "Grudzień",
 	"Default": "Domyślny",
 	"Default": "Domyślny",
@@ -133,9 +133,9 @@
 	"delete": "usuń",
 	"delete": "usuń",
 	"Delete": "Usuń",
 	"Delete": "Usuń",
 	"Delete a model": "Usuń model",
 	"Delete a model": "Usuń model",
+	"Delete All Chats": "",
 	"Delete chat": "Usuń czat",
 	"Delete chat": "Usuń czat",
 	"Delete Chat": "Usuń czat",
 	"Delete Chat": "Usuń czat",
-	"Delete Chats": "Usuń czaty",
 	"delete this link": "usuń ten link",
 	"delete this link": "usuń ten link",
 	"Delete User": "Usuń użytkownika",
 	"Delete User": "Usuń użytkownika",
 	"Deleted {{deleteModelTag}}": "Usunięto {{deleteModelTag}}",
 	"Deleted {{deleteModelTag}}": "Usunięto {{deleteModelTag}}",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "URL/Klucz OpenAI jest wymagany.",
 	"OpenAI URL/Key required.": "URL/Klucz OpenAI jest wymagany.",
 	"or": "lub",
 	"or": "lub",
 	"Other": "Inne",
 	"Other": "Inne",
-	"Overview": "Przegląd",
 	"Password": "Hasło",
 	"Password": "Hasło",
 	"PDF document (.pdf)": "Dokument PDF (.pdf)",
 	"PDF document (.pdf)": "Dokument PDF (.pdf)",
 	"PDF Extract Images (OCR)": "PDF Wyodrębnij obrazy (OCR)",
 	"PDF Extract Images (OCR)": "PDF Wyodrębnij obrazy (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "Skanuj dokumenty z {{path}}",
 	"Scan for documents from {{path}}": "Skanuj dokumenty z {{path}}",
 	"Search": "Szukaj",
 	"Search": "Szukaj",
 	"Search a model": "Szukaj modelu",
 	"Search a model": "Szukaj modelu",
+	"Search Chats": "",
 	"Search Documents": "Szukaj dokumentów",
 	"Search Documents": "Szukaj dokumentów",
+	"Search Models": "",
 	"Search Prompts": "Szukaj promptów",
 	"Search Prompts": "Szukaj promptów",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "Chaves da API",
 	"API keys": "Chaves da API",
 	"April": "Abril",
 	"April": "Abril",
 	"Archive": "Arquivo",
 	"Archive": "Arquivo",
+	"Archive All Chats": "",
 	"Archived Chats": "Bate-papos arquivados",
 	"Archived Chats": "Bate-papos arquivados",
 	"are allowed - Activate this command by typing": "são permitidos - Ative este comando digitando",
 	"are allowed - Activate this command by typing": "são permitidos - Ative este comando digitando",
 	"Are you sure?": "Tem certeza?",
 	"Are you sure?": "Tem certeza?",
@@ -120,7 +121,6 @@
 	"Custom": "Personalizado",
 	"Custom": "Personalizado",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Escuro",
 	"Dark": "Escuro",
-	"Dashboard": "Painel",
 	"Database": "Banco de dados",
 	"Database": "Banco de dados",
 	"December": "Dezembro",
 	"December": "Dezembro",
 	"Default": "Padrão",
 	"Default": "Padrão",
@@ -133,9 +133,9 @@
 	"delete": "excluir",
 	"delete": "excluir",
 	"Delete": "Excluir",
 	"Delete": "Excluir",
 	"Delete a model": "Excluir um modelo",
 	"Delete a model": "Excluir um modelo",
+	"Delete All Chats": "",
 	"Delete chat": "Excluir bate-papo",
 	"Delete chat": "Excluir bate-papo",
 	"Delete Chat": "Excluir Bate-papo",
 	"Delete Chat": "Excluir Bate-papo",
-	"Delete Chats": "Excluir Bate-papos",
 	"delete this link": "excluir este link",
 	"delete this link": "excluir este link",
 	"Delete User": "Excluir Usuário",
 	"Delete User": "Excluir Usuário",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} excluído",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} excluído",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "URL/Chave da API OpenAI é necessária.",
 	"OpenAI URL/Key required.": "URL/Chave da API OpenAI é necessária.",
 	"or": "ou",
 	"or": "ou",
 	"Other": "Outro",
 	"Other": "Outro",
-	"Overview": "Visão Geral",
 	"Password": "Senha",
 	"Password": "Senha",
 	"PDF document (.pdf)": "Documento PDF (.pdf)",
 	"PDF document (.pdf)": "Documento PDF (.pdf)",
 	"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
 	"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "Digitalizar documentos de {{path}}",
 	"Scan for documents from {{path}}": "Digitalizar documentos de {{path}}",
 	"Search": "Pesquisar",
 	"Search": "Pesquisar",
 	"Search a model": "Pesquisar um modelo",
 	"Search a model": "Pesquisar um modelo",
+	"Search Chats": "",
 	"Search Documents": "Pesquisar Documentos",
 	"Search Documents": "Pesquisar Documentos",
+	"Search Models": "",
 	"Search Prompts": "Pesquisar Prompts",
 	"Search Prompts": "Pesquisar Prompts",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "Chaves da API",
 	"API keys": "Chaves da API",
 	"April": "Abril",
 	"April": "Abril",
 	"Archive": "Arquivo",
 	"Archive": "Arquivo",
+	"Archive All Chats": "",
 	"Archived Chats": "Bate-papos arquivados",
 	"Archived Chats": "Bate-papos arquivados",
 	"are allowed - Activate this command by typing": "são permitidos - Ative este comando digitando",
 	"are allowed - Activate this command by typing": "são permitidos - Ative este comando digitando",
 	"Are you sure?": "Tem certeza?",
 	"Are you sure?": "Tem certeza?",
@@ -120,7 +121,6 @@
 	"Custom": "Personalizado",
 	"Custom": "Personalizado",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Escuro",
 	"Dark": "Escuro",
-	"Dashboard": "Painel",
 	"Database": "Banco de dados",
 	"Database": "Banco de dados",
 	"December": "Dezembro",
 	"December": "Dezembro",
 	"Default": "Padrão",
 	"Default": "Padrão",
@@ -133,9 +133,9 @@
 	"delete": "excluir",
 	"delete": "excluir",
 	"Delete": "Excluir",
 	"Delete": "Excluir",
 	"Delete a model": "Excluir um modelo",
 	"Delete a model": "Excluir um modelo",
+	"Delete All Chats": "",
 	"Delete chat": "Excluir bate-papo",
 	"Delete chat": "Excluir bate-papo",
 	"Delete Chat": "Excluir Bate-papo",
 	"Delete Chat": "Excluir Bate-papo",
-	"Delete Chats": "Excluir Bate-papos",
 	"delete this link": "excluir este link",
 	"delete this link": "excluir este link",
 	"Delete User": "Excluir Usuário",
 	"Delete User": "Excluir Usuário",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} excluído",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} excluído",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "URL/Chave da API OpenAI é necessária.",
 	"OpenAI URL/Key required.": "URL/Chave da API OpenAI é necessária.",
 	"or": "ou",
 	"or": "ou",
 	"Other": "Outro",
 	"Other": "Outro",
-	"Overview": "Visão Geral",
 	"Password": "Senha",
 	"Password": "Senha",
 	"PDF document (.pdf)": "Documento PDF (.pdf)",
 	"PDF document (.pdf)": "Documento PDF (.pdf)",
 	"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
 	"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "Digitalizar documentos de {{path}}",
 	"Scan for documents from {{path}}": "Digitalizar documentos de {{path}}",
 	"Search": "Pesquisar",
 	"Search": "Pesquisar",
 	"Search a model": "Pesquisar um modelo",
 	"Search a model": "Pesquisar um modelo",
+	"Search Chats": "",
 	"Search Documents": "Pesquisar Documentos",
 	"Search Documents": "Pesquisar Documentos",
+	"Search Models": "",
 	"Search Prompts": "Pesquisar Prompts",
 	"Search Prompts": "Pesquisar Prompts",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "Ключи API",
 	"API keys": "Ключи API",
 	"April": "Апрель",
 	"April": "Апрель",
 	"Archive": "Архив",
 	"Archive": "Архив",
+	"Archive All Chats": "",
 	"Archived Chats": "запис на чат",
 	"Archived Chats": "запис на чат",
 	"are allowed - Activate this command by typing": "разрешено - активируйте эту команду вводом",
 	"are allowed - Activate this command by typing": "разрешено - активируйте эту команду вводом",
 	"Are you sure?": "Вы уверены?",
 	"Are you sure?": "Вы уверены?",
@@ -120,7 +121,6 @@
 	"Custom": "Пользовательский",
 	"Custom": "Пользовательский",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Тёмный",
 	"Dark": "Тёмный",
-	"Dashboard": "Панель управления",
 	"Database": "База данных",
 	"Database": "База данных",
 	"December": "Декабрь",
 	"December": "Декабрь",
 	"Default": "По умолчанию",
 	"Default": "По умолчанию",
@@ -133,9 +133,9 @@
 	"delete": "удалить",
 	"delete": "удалить",
 	"Delete": "Удалить",
 	"Delete": "Удалить",
 	"Delete a model": "Удалить модель",
 	"Delete a model": "Удалить модель",
+	"Delete All Chats": "",
 	"Delete chat": "Удалить чат",
 	"Delete chat": "Удалить чат",
 	"Delete Chat": "Удалить чат",
 	"Delete Chat": "Удалить чат",
-	"Delete Chats": "Удалить чаты",
 	"delete this link": "удалить эту ссылку",
 	"delete this link": "удалить эту ссылку",
 	"Delete User": "Удалить пользователя",
 	"Delete User": "Удалить пользователя",
 	"Deleted {{deleteModelTag}}": "Удалено {{deleteModelTag}}",
 	"Deleted {{deleteModelTag}}": "Удалено {{deleteModelTag}}",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "Требуется URL-адрес API OpenAI или ключ API.",
 	"OpenAI URL/Key required.": "Требуется URL-адрес API OpenAI или ключ API.",
 	"or": "или",
 	"or": "или",
 	"Other": "Прочее",
 	"Other": "Прочее",
-	"Overview": "Обзор",
 	"Password": "Пароль",
 	"Password": "Пароль",
 	"PDF document (.pdf)": "PDF-документ (.pdf)",
 	"PDF document (.pdf)": "PDF-документ (.pdf)",
 	"PDF Extract Images (OCR)": "Извлечение изображений из PDF (OCR)",
 	"PDF Extract Images (OCR)": "Извлечение изображений из PDF (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "Сканирование документов из {{path}}",
 	"Scan for documents from {{path}}": "Сканирование документов из {{path}}",
 	"Search": "Поиск",
 	"Search": "Поиск",
 	"Search a model": "Поиск модели",
 	"Search a model": "Поиск модели",
+	"Search Chats": "",
 	"Search Documents": "Поиск документов",
 	"Search Documents": "Поиск документов",
+	"Search Models": "",
 	"Search Prompts": "Поиск промтов",
 	"Search Prompts": "Поиск промтов",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "API кључеви",
 	"API keys": "API кључеви",
 	"April": "Април",
 	"April": "Април",
 	"Archive": "Архива",
 	"Archive": "Архива",
+	"Archive All Chats": "",
 	"Archived Chats": "Архивирана ћаскања",
 	"Archived Chats": "Архивирана ћаскања",
 	"are allowed - Activate this command by typing": "су дозвољени - Покрените ову наредбу уношењем",
 	"are allowed - Activate this command by typing": "су дозвољени - Покрените ову наредбу уношењем",
 	"Are you sure?": "Да ли сте сигурни?",
 	"Are you sure?": "Да ли сте сигурни?",
@@ -120,7 +121,6 @@
 	"Custom": "Прилагођено",
 	"Custom": "Прилагођено",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Тамна",
 	"Dark": "Тамна",
-	"Dashboard": "Контролна табла",
 	"Database": "База података",
 	"Database": "База података",
 	"December": "Децембар",
 	"December": "Децембар",
 	"Default": "Подразумевано",
 	"Default": "Подразумевано",
@@ -133,9 +133,9 @@
 	"delete": "обриши",
 	"delete": "обриши",
 	"Delete": "Обриши",
 	"Delete": "Обриши",
 	"Delete a model": "Обриши модел",
 	"Delete a model": "Обриши модел",
+	"Delete All Chats": "",
 	"Delete chat": "Обриши ћаскање",
 	"Delete chat": "Обриши ћаскање",
 	"Delete Chat": "Обриши ћаскање",
 	"Delete Chat": "Обриши ћаскање",
-	"Delete Chats": "Обриши ћаскања",
 	"delete this link": "обриши ову везу",
 	"delete this link": "обриши ову везу",
 	"Delete User": "Обриши корисника",
 	"Delete User": "Обриши корисника",
 	"Deleted {{deleteModelTag}}": "Обрисано {{deleteModelTag}}",
 	"Deleted {{deleteModelTag}}": "Обрисано {{deleteModelTag}}",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "Потребан је OpenAI URL/кључ.",
 	"OpenAI URL/Key required.": "Потребан је OpenAI URL/кључ.",
 	"or": "или",
 	"or": "или",
 	"Other": "Остало",
 	"Other": "Остало",
-	"Overview": "Преглед",
 	"Password": "Лозинка",
 	"Password": "Лозинка",
 	"PDF document (.pdf)": "PDF документ (.pdf)",
 	"PDF document (.pdf)": "PDF документ (.pdf)",
 	"PDF Extract Images (OCR)": "Извлачење PDF слика (OCR)",
 	"PDF Extract Images (OCR)": "Извлачење PDF слика (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "Скенирај документе из {{path}}",
 	"Scan for documents from {{path}}": "Скенирај документе из {{path}}",
 	"Search": "Претражи",
 	"Search": "Претражи",
 	"Search a model": "Претражи модел",
 	"Search a model": "Претражи модел",
+	"Search Chats": "",
 	"Search Documents": "Претражи документе",
 	"Search Documents": "Претражи документе",
+	"Search Models": "",
 	"Search Prompts": "Претражи упите",
 	"Search Prompts": "Претражи упите",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "API-nycklar",
 	"API keys": "API-nycklar",
 	"April": "April",
 	"April": "April",
 	"Archive": "Arkiv",
 	"Archive": "Arkiv",
+	"Archive All Chats": "",
 	"Archived Chats": "Arkiverade chattar",
 	"Archived Chats": "Arkiverade chattar",
 	"are allowed - Activate this command by typing": "är tillåtna - Aktivera detta kommando genom att skriva",
 	"are allowed - Activate this command by typing": "är tillåtna - Aktivera detta kommando genom att skriva",
 	"Are you sure?": "Är du säker?",
 	"Are you sure?": "Är du säker?",
@@ -120,7 +121,6 @@
 	"Custom": "Anpassad",
 	"Custom": "Anpassad",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Mörk",
 	"Dark": "Mörk",
-	"Dashboard": "Instrumentbräda",
 	"Database": "Databas",
 	"Database": "Databas",
 	"December": "December",
 	"December": "December",
 	"Default": "Standard",
 	"Default": "Standard",
@@ -133,9 +133,9 @@
 	"delete": "radera",
 	"delete": "radera",
 	"Delete": "Radera",
 	"Delete": "Radera",
 	"Delete a model": "Ta bort en modell",
 	"Delete a model": "Ta bort en modell",
+	"Delete All Chats": "",
 	"Delete chat": "Radera chatt",
 	"Delete chat": "Radera chatt",
 	"Delete Chat": "Radera chatt",
 	"Delete Chat": "Radera chatt",
-	"Delete Chats": "Radera chattar",
 	"delete this link": "radera denna länk",
 	"delete this link": "radera denna länk",
 	"Delete User": "Radera användare",
 	"Delete User": "Radera användare",
 	"Deleted {{deleteModelTag}}": "Raderad {{deleteModelTag}}",
 	"Deleted {{deleteModelTag}}": "Raderad {{deleteModelTag}}",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "OpenAI-URL/nyckel krävs.",
 	"OpenAI URL/Key required.": "OpenAI-URL/nyckel krävs.",
 	"or": "eller",
 	"or": "eller",
 	"Other": "Andra",
 	"Other": "Andra",
-	"Overview": "Översikt",
 	"Password": "Lösenord",
 	"Password": "Lösenord",
 	"PDF document (.pdf)": "PDF-dokument (.pdf)",
 	"PDF document (.pdf)": "PDF-dokument (.pdf)",
 	"PDF Extract Images (OCR)": "PDF Extrahera bilder (OCR)",
 	"PDF Extract Images (OCR)": "PDF Extrahera bilder (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "Skanna efter dokument från {{path}}",
 	"Scan for documents from {{path}}": "Skanna efter dokument från {{path}}",
 	"Search": "Sök",
 	"Search": "Sök",
 	"Search a model": "Sök efter en modell",
 	"Search a model": "Sök efter en modell",
+	"Search Chats": "",
 	"Search Documents": "Sök dokument",
 	"Search Documents": "Sök dokument",
+	"Search Models": "",
 	"Search Prompts": "Sök promptar",
 	"Search Prompts": "Sök promptar",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "API anahtarları",
 	"API keys": "API anahtarları",
 	"April": "Nisan",
 	"April": "Nisan",
 	"Archive": "Arşiv",
 	"Archive": "Arşiv",
+	"Archive All Chats": "",
 	"Archived Chats": "Arşivlenmiş Sohbetler",
 	"Archived Chats": "Arşivlenmiş Sohbetler",
 	"are allowed - Activate this command by typing": "izin verilir - Bu komutu yazarak etkinleştirin",
 	"are allowed - Activate this command by typing": "izin verilir - Bu komutu yazarak etkinleştirin",
 	"Are you sure?": "Emin misiniz?",
 	"Are you sure?": "Emin misiniz?",
@@ -120,7 +121,6 @@
 	"Custom": "Özel",
 	"Custom": "Özel",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Koyu",
 	"Dark": "Koyu",
-	"Dashboard": "Panel",
 	"Database": "Veritabanı",
 	"Database": "Veritabanı",
 	"December": "Aralık",
 	"December": "Aralık",
 	"Default": "Varsayılan",
 	"Default": "Varsayılan",
@@ -133,9 +133,9 @@
 	"delete": "sil",
 	"delete": "sil",
 	"Delete": "Sil",
 	"Delete": "Sil",
 	"Delete a model": "Bir modeli sil",
 	"Delete a model": "Bir modeli sil",
+	"Delete All Chats": "",
 	"Delete chat": "Sohbeti sil",
 	"Delete chat": "Sohbeti sil",
 	"Delete Chat": "Sohbeti Sil",
 	"Delete Chat": "Sohbeti Sil",
-	"Delete Chats": "Sohbetleri Sil",
 	"delete this link": "bu bağlantıyı sil",
 	"delete this link": "bu bağlantıyı sil",
 	"Delete User": "Kullanıcıyı Sil",
 	"Delete User": "Kullanıcıyı Sil",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} silindi",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} silindi",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "OpenAI URL/Anahtar gereklidir.",
 	"OpenAI URL/Key required.": "OpenAI URL/Anahtar gereklidir.",
 	"or": "veya",
 	"or": "veya",
 	"Other": "Diğer",
 	"Other": "Diğer",
-	"Overview": "Genel Bakış",
 	"Password": "Parola",
 	"Password": "Parola",
 	"PDF document (.pdf)": "PDF belgesi (.pdf)",
 	"PDF document (.pdf)": "PDF belgesi (.pdf)",
 	"PDF Extract Images (OCR)": "PDF Görüntülerini Çıkart (OCR)",
 	"PDF Extract Images (OCR)": "PDF Görüntülerini Çıkart (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "{{path}} dizininden belgeleri tarayın",
 	"Scan for documents from {{path}}": "{{path}} dizininden belgeleri tarayın",
 	"Search": "Ara",
 	"Search": "Ara",
 	"Search a model": "Bir model ara",
 	"Search a model": "Bir model ara",
+	"Search Chats": "",
 	"Search Documents": "Belgeleri Ara",
 	"Search Documents": "Belgeleri Ara",
+	"Search Models": "",
 	"Search Prompts": "Prompt Ara",
 	"Search Prompts": "Prompt Ara",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "Ключі API",
 	"API keys": "Ключі API",
 	"April": "Квітень",
 	"April": "Квітень",
 	"Archive": "Архів",
 	"Archive": "Архів",
+	"Archive All Chats": "",
 	"Archived Chats": "Архівовані чати",
 	"Archived Chats": "Архівовані чати",
 	"are allowed - Activate this command by typing": "дозволено - активізуйте цю команду набором",
 	"are allowed - Activate this command by typing": "дозволено - активізуйте цю команду набором",
 	"Are you sure?": "Ви впевнені?",
 	"Are you sure?": "Ви впевнені?",
@@ -120,7 +121,6 @@
 	"Custom": "Налаштувати",
 	"Custom": "Налаштувати",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Темна",
 	"Dark": "Темна",
-	"Dashboard": "Панель управління",
 	"Database": "База даних",
 	"Database": "База даних",
 	"December": "Грудень",
 	"December": "Грудень",
 	"Default": "За замовчуванням",
 	"Default": "За замовчуванням",
@@ -133,9 +133,9 @@
 	"delete": "видалити",
 	"delete": "видалити",
 	"Delete": "Видалити",
 	"Delete": "Видалити",
 	"Delete a model": "Видалити модель",
 	"Delete a model": "Видалити модель",
+	"Delete All Chats": "",
 	"Delete chat": "Видалити чат",
 	"Delete chat": "Видалити чат",
 	"Delete Chat": "Видалити чат",
 	"Delete Chat": "Видалити чат",
-	"Delete Chats": "Видалити чати",
 	"delete this link": "видалити це посилання",
 	"delete this link": "видалити це посилання",
 	"Delete User": "Видалити користувача",
 	"Delete User": "Видалити користувача",
 	"Deleted {{deleteModelTag}}": "Видалено {{deleteModelTag}}",
 	"Deleted {{deleteModelTag}}": "Видалено {{deleteModelTag}}",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "Потрібен OpenAI URL/ключ.",
 	"OpenAI URL/Key required.": "Потрібен OpenAI URL/ключ.",
 	"or": "або",
 	"or": "або",
 	"Other": "Інше",
 	"Other": "Інше",
-	"Overview": "Огляд",
 	"Password": "Пароль",
 	"Password": "Пароль",
 	"PDF document (.pdf)": "PDF документ (.pdf)",
 	"PDF document (.pdf)": "PDF документ (.pdf)",
 	"PDF Extract Images (OCR)": "Розпізнавання зображень з PDF (OCR)",
 	"PDF Extract Images (OCR)": "Розпізнавання зображень з PDF (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "Сканування документів з {{path}}",
 	"Scan for documents from {{path}}": "Сканування документів з {{path}}",
 	"Search": "Пошук",
 	"Search": "Пошук",
 	"Search a model": "Шукати модель",
 	"Search a model": "Шукати модель",
+	"Search Chats": "",
 	"Search Documents": "Пошук документів",
 	"Search Documents": "Пошук документів",
+	"Search Models": "",
 	"Search Prompts": "Пошук промтів",
 	"Search Prompts": "Пошук промтів",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "API Keys",
 	"API keys": "API Keys",
 	"April": "Tháng 4",
 	"April": "Tháng 4",
 	"Archive": "Lưu trữ",
 	"Archive": "Lưu trữ",
+	"Archive All Chats": "",
 	"Archived Chats": "bản ghi trò chuyện",
 	"Archived Chats": "bản ghi trò chuyện",
 	"are allowed - Activate this command by typing": "được phép - Kích hoạt lệnh này bằng cách gõ",
 	"are allowed - Activate this command by typing": "được phép - Kích hoạt lệnh này bằng cách gõ",
 	"Are you sure?": "Bạn có chắc chắn không?",
 	"Are you sure?": "Bạn có chắc chắn không?",
@@ -120,7 +121,6 @@
 	"Custom": "Tùy chỉnh",
 	"Custom": "Tùy chỉnh",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "Tối",
 	"Dark": "Tối",
-	"Dashboard": "Trang tổng quan",
 	"Database": "Cơ sở dữ liệu",
 	"Database": "Cơ sở dữ liệu",
 	"December": "Tháng 12",
 	"December": "Tháng 12",
 	"Default": "Mặc định",
 	"Default": "Mặc định",
@@ -133,9 +133,9 @@
 	"delete": "xóa",
 	"delete": "xóa",
 	"Delete": "Xóa",
 	"Delete": "Xóa",
 	"Delete a model": "Xóa mô hình",
 	"Delete a model": "Xóa mô hình",
+	"Delete All Chats": "",
 	"Delete chat": "Xóa nội dung chat",
 	"Delete chat": "Xóa nội dung chat",
 	"Delete Chat": "Xóa chat",
 	"Delete Chat": "Xóa chat",
-	"Delete Chats": "Xóa nội dung chat",
 	"delete this link": "Xóa link này",
 	"delete this link": "Xóa link này",
 	"Delete User": "Xóa người dùng",
 	"Delete User": "Xóa người dùng",
 	"Deleted {{deleteModelTag}}": "Đã xóa {{deleteModelTag}}",
 	"Deleted {{deleteModelTag}}": "Đã xóa {{deleteModelTag}}",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "Yêu cầu URL/Key API OpenAI.",
 	"OpenAI URL/Key required.": "Yêu cầu URL/Key API OpenAI.",
 	"or": "hoặc",
 	"or": "hoặc",
 	"Other": "Khác",
 	"Other": "Khác",
-	"Overview": "Tổng quan",
 	"Password": "Mật khẩu",
 	"Password": "Mật khẩu",
 	"PDF document (.pdf)": "Tập tin PDF (.pdf)",
 	"PDF document (.pdf)": "Tập tin PDF (.pdf)",
 	"PDF Extract Images (OCR)": "Trích xuất ảnh từ PDF (OCR)",
 	"PDF Extract Images (OCR)": "Trích xuất ảnh từ PDF (OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "Quét tài liệu từ đường dẫn: {{path}}",
 	"Scan for documents from {{path}}": "Quét tài liệu từ đường dẫn: {{path}}",
 	"Search": "Tìm kiếm",
 	"Search": "Tìm kiếm",
 	"Search a model": "Tìm model",
 	"Search a model": "Tìm model",
+	"Search Chats": "",
 	"Search Documents": "Tìm tài liệu",
 	"Search Documents": "Tìm tài liệu",
+	"Search Models": "",
 	"Search Prompts": "Tìm prompt",
 	"Search Prompts": "Tìm prompt",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "API 密钥",
 	"API keys": "API 密钥",
 	"April": "四月",
 	"April": "四月",
 	"Archive": "存档",
 	"Archive": "存档",
+	"Archive All Chats": "",
 	"Archived Chats": "聊天记录存档",
 	"Archived Chats": "聊天记录存档",
 	"are allowed - Activate this command by typing": "允许 - 通过输入来激活这个命令",
 	"are allowed - Activate this command by typing": "允许 - 通过输入来激活这个命令",
 	"Are you sure?": "你确定吗?",
 	"Are you sure?": "你确定吗?",
@@ -120,7 +121,6 @@
 	"Custom": "自定义",
 	"Custom": "自定义",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "暗色",
 	"Dark": "暗色",
-	"Dashboard": "仪表盘",
 	"Database": "数据库",
 	"Database": "数据库",
 	"December": "十二月",
 	"December": "十二月",
 	"Default": "默认",
 	"Default": "默认",
@@ -133,9 +133,9 @@
 	"delete": "删除",
 	"delete": "删除",
 	"Delete": "删除",
 	"Delete": "删除",
 	"Delete a model": "删除一个模型",
 	"Delete a model": "删除一个模型",
+	"Delete All Chats": "",
 	"Delete chat": "删除聊天",
 	"Delete chat": "删除聊天",
 	"Delete Chat": "删除聊天",
 	"Delete Chat": "删除聊天",
-	"Delete Chats": "删除聊天记录",
 	"delete this link": "删除这个链接",
 	"delete this link": "删除这个链接",
 	"Delete User": "删除用户",
 	"Delete User": "删除用户",
 	"Deleted {{deleteModelTag}}": "已删除{{deleteModelTag}}",
 	"Deleted {{deleteModelTag}}": "已删除{{deleteModelTag}}",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "需要 OpenAI URL/Key",
 	"OpenAI URL/Key required.": "需要 OpenAI URL/Key",
 	"or": "或",
 	"or": "或",
 	"Other": "其他",
 	"Other": "其他",
-	"Overview": "概述",
 	"Password": "密码",
 	"Password": "密码",
 	"PDF document (.pdf)": "PDF 文档 (.pdf)",
 	"PDF document (.pdf)": "PDF 文档 (.pdf)",
 	"PDF Extract Images (OCR)": "PDF 图像处理 (使用 OCR)",
 	"PDF Extract Images (OCR)": "PDF 图像处理 (使用 OCR)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "从 {{path}} 扫描文档",
 	"Scan for documents from {{path}}": "从 {{path}} 扫描文档",
 	"Search": "搜索",
 	"Search": "搜索",
 	"Search a model": "搜索模型",
 	"Search a model": "搜索模型",
+	"Search Chats": "",
 	"Search Documents": "搜索文档",
 	"Search Documents": "搜索文档",
+	"Search Models": "",
 	"Search Prompts": "搜索提示词",
 	"Search Prompts": "搜索提示词",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

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

@@ -48,6 +48,7 @@
 	"API keys": "API Keys",
 	"API keys": "API Keys",
 	"April": "4月",
 	"April": "4月",
 	"Archive": "存檔",
 	"Archive": "存檔",
+	"Archive All Chats": "",
 	"Archived Chats": "聊天記錄存檔",
 	"Archived Chats": "聊天記錄存檔",
 	"are allowed - Activate this command by typing": "是允許的 - 透過輸入",
 	"are allowed - Activate this command by typing": "是允許的 - 透過輸入",
 	"Are you sure?": "你確定嗎?",
 	"Are you sure?": "你確定嗎?",
@@ -120,7 +121,6 @@
 	"Custom": "自訂",
 	"Custom": "自訂",
 	"Customize models for a specific purpose": "",
 	"Customize models for a specific purpose": "",
 	"Dark": "暗色",
 	"Dark": "暗色",
-	"Dashboard": "儀表板",
 	"Database": "資料庫",
 	"Database": "資料庫",
 	"December": "12月",
 	"December": "12月",
 	"Default": "預設",
 	"Default": "預設",
@@ -133,9 +133,9 @@
 	"delete": "刪除",
 	"delete": "刪除",
 	"Delete": "刪除",
 	"Delete": "刪除",
 	"Delete a model": "刪除一個模型",
 	"Delete a model": "刪除一個模型",
+	"Delete All Chats": "",
 	"Delete chat": "刪除聊天紀錄",
 	"Delete chat": "刪除聊天紀錄",
 	"Delete Chat": "刪除聊天紀錄",
 	"Delete Chat": "刪除聊天紀錄",
-	"Delete Chats": "刪除聊天紀錄",
 	"delete this link": "刪除此連結",
 	"delete this link": "刪除此連結",
 	"Delete User": "刪除用戶",
 	"Delete User": "刪除用戶",
 	"Deleted {{deleteModelTag}}": "已刪除 {{deleteModelTag}}",
 	"Deleted {{deleteModelTag}}": "已刪除 {{deleteModelTag}}",
@@ -314,7 +314,6 @@
 	"OpenAI URL/Key required.": "需要 OpenAI URL/金鑰。",
 	"OpenAI URL/Key required.": "需要 OpenAI URL/金鑰。",
 	"or": "或",
 	"or": "或",
 	"Other": "其他",
 	"Other": "其他",
-	"Overview": "總覽",
 	"Password": "密碼",
 	"Password": "密碼",
 	"PDF document (.pdf)": "PDF 文件 (.pdf)",
 	"PDF document (.pdf)": "PDF 文件 (.pdf)",
 	"PDF Extract Images (OCR)": "PDF 圖像擷取(OCR 光學文字辨識)",
 	"PDF Extract Images (OCR)": "PDF 圖像擷取(OCR 光學文字辨識)",
@@ -365,7 +364,9 @@
 	"Scan for documents from {{path}}": "從 {{path}} 掃描文件",
 	"Scan for documents from {{path}}": "從 {{path}} 掃描文件",
 	"Search": "搜尋",
 	"Search": "搜尋",
 	"Search a model": "搜尋模型",
 	"Search a model": "搜尋模型",
+	"Search Chats": "",
 	"Search Documents": "搜尋文件",
 	"Search Documents": "搜尋文件",
+	"Search Models": "",
 	"Search Prompts": "搜尋提示詞",
 	"Search Prompts": "搜尋提示詞",
 	"Search Results": "",
 	"Search Results": "",
 	"Searching the web for '{{searchQuery}}'": "",
 	"Searching the web for '{{searchQuery}}'": "",

+ 2 - 2
src/lib/stores/index.ts

@@ -133,9 +133,9 @@ type Config = {
 	images?: boolean;
 	images?: boolean;
 	default_models?: string[];
 	default_models?: string[];
 	default_prompt_suggestions?: PromptSuggestion[];
 	default_prompt_suggestions?: PromptSuggestion[];
-	trusted_header_auth?: boolean;
+	auth_trusted_header?: boolean;
 	model_config?: GlobalModelConfig;
 	model_config?: GlobalModelConfig;
-	websearch?: boolean;
+	enable_websearch?: boolean;
 };
 };
 
 
 type PromptSuggestion = {
 type PromptSuggestion = {

+ 2 - 1
src/lib/utils/index.ts

@@ -12,11 +12,12 @@ export const sanitizeResponseContent = (content: string) => {
 		.replace(/<$/, '')
 		.replace(/<$/, '')
 		.replaceAll(/<\|[a-z]+\|>/g, ' ')
 		.replaceAll(/<\|[a-z]+\|>/g, ' ')
 		.replaceAll('<', '&lt;')
 		.replaceAll('<', '&lt;')
+		.replaceAll('>', '&gt;')
 		.trim();
 		.trim();
 };
 };
 
 
 export const revertSanitizedResponseContent = (content: string) => {
 export const revertSanitizedResponseContent = (content: string) => {
-	return content.replaceAll('&lt;', '<');
+	return content.replaceAll('&lt;', '<').replaceAll('&gt;', '>');
 };
 };
 
 
 export const capitalizeFirstLetter = (string) => {
 export const capitalizeFirstLetter = (string) => {

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

@@ -0,0 +1,78 @@
+<script lang="ts">
+	import { onMount, getContext } from 'svelte';
+
+	import { WEBUI_NAME, showSidebar } from '$lib/stores';
+	import MenuLines from '$lib/components/icons/MenuLines.svelte';
+	import { page } from '$app/stores';
+
+	const i18n = getContext('i18n');
+</script>
+
+<svelte:head>
+	<title>
+		{$i18n.t('Admin Panel')} | {$WEBUI_NAME}
+	</title>
+</svelte:head>
+
+<div class=" flex flex-col w-full min-h-screen max-h-screen">
+	<div class=" px-4 pt-3 mt-0.5 mb-1">
+		<div class=" flex items-center gap-1">
+			<div class="{$showSidebar ? 'md:hidden' : ''} mr-1 self-start flex flex-none items-center">
+				<button
+					id="sidebar-toggle-button"
+					class="cursor-pointer p-1 flex rounded-xl hover:bg-gray-100 dark:hover:bg-gray-850 transition"
+					on:click={() => {
+						showSidebar.set(!$showSidebar);
+					}}
+				>
+					<div class=" m-auto self-center">
+						<MenuLines />
+					</div>
+				</button>
+			</div>
+			<div class="flex items-center text-xl font-semibold">{$i18n.t('Workspace')}</div>
+		</div>
+	</div>
+
+	<!-- <div class="px-4 my-1">
+		<div
+			class="flex scrollbar-none overflow-x-auto w-fit text-center text-sm font-medium rounded-xl bg-transparent/10 p-1"
+		>
+			<a
+				class="min-w-fit rounded-lg p-1.5 px-3 {$page.url.pathname.includes('/workspace/models')
+					? 'bg-gray-50 dark:bg-gray-850'
+					: ''} transition"
+				href="/workspace/models">{$i18n.t('Models')}</a
+			>
+
+			<a
+				class="min-w-fit rounded-lg p-1.5 px-3 {$page.url.pathname.includes('/workspace/prompts')
+					? 'bg-gray-50 dark:bg-gray-850'
+					: ''} transition"
+				href="/workspace/prompts">{$i18n.t('Prompts')}</a
+			>
+
+			<a
+				class="min-w-fit rounded-lg p-1.5 px-3 {$page.url.pathname.includes('/workspace/documents')
+					? 'bg-gray-50 dark:bg-gray-850'
+					: ''} transition"
+				href="/workspace/documents"
+			>
+				{$i18n.t('Documents')}
+			</a>
+
+			<a
+				class="min-w-fit rounded-lg p-1.5 px-3 {$page.url.pathname.includes('/workspace/playground')
+					? 'bg-gray-50 dark:bg-gray-850'
+					: ''} transition"
+				href="/workspace/playground">{$i18n.t('Playground')}</a
+			>
+		</div>
+	</div> -->
+
+	<hr class=" my-2 dark:border-gray-850" />
+
+	<div class=" py-1 px-5 flex-1 max-h-full overflow-y-auto">
+		<slot />
+	</div>
+</div>

+ 204 - 251
src/routes/(app)/admin/+page.svelte

@@ -82,10 +82,6 @@
 	});
 	});
 </script>
 </script>
 
 
-<svelte:head>
-	<title>{$i18n.t('Admin Panel')} | {$WEBUI_NAME}</title>
-</svelte:head>
-
 {#key selectedUser}
 {#key selectedUser}
 	<EditUserModal
 	<EditUserModal
 		bind:show={showEditUserModal}
 		bind:show={showEditUserModal}
@@ -106,265 +102,222 @@
 <UserChatsModal bind:show={showUserChatsModal} user={selectedUser} />
 <UserChatsModal bind:show={showUserChatsModal} user={selectedUser} />
 <SettingsModal bind:show={showSettingsModal} />
 <SettingsModal bind:show={showSettingsModal} />
 
 
-<div class=" flex flex-col w-full min-h-screen">
-	{#if loaded}
-		<div class="px-4 pt-3 mt-0.5 mb-1">
-			<div class=" flex items-center gap-1">
-				<div class="{$showSidebar ? 'md:hidden' : ''} mr-1 self-start flex flex-none items-center">
+{#if loaded}
+	<div class="mt-0.5 mb-3 gap-1 flex flex-col md:flex-row justify-between">
+		<div class="flex md:self-center text-lg font-medium px-0.5">
+			{$i18n.t('All Users')}
+			<div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-200 dark:bg-gray-700" />
+			<span class="text-lg font-medium text-gray-500 dark:text-gray-300">{users.length}</span>
+		</div>
+
+		<div class="flex gap-1">
+			<input
+				class="w-full md:w-60 rounded-xl py-1.5 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
+				placeholder={$i18n.t('Search')}
+				bind:value={search}
+			/>
+
+			<div class="flex gap-0.5">
+				<Tooltip content="Add User">
 					<button
 					<button
-						id="sidebar-toggle-button"
-						class="cursor-pointer p-1 flex rounded-xl hover:bg-gray-100 dark:hover:bg-gray-850 transition"
+						class=" px-2 py-2 rounded-xl border border-gray-200 dark:border-gray-600 dark:border-0 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition font-medium text-sm flex items-center space-x-1"
 						on:click={() => {
 						on:click={() => {
-							showSidebar.set(!$showSidebar);
+							showAddUserModal = !showAddUserModal;
 						}}
 						}}
 					>
 					>
-						<div class=" m-auto self-center">
-							<MenuLines />
-						</div>
+						<svg
+							xmlns="http://www.w3.org/2000/svg"
+							viewBox="0 0 16 16"
+							fill="currentColor"
+							class="w-4 h-4"
+						>
+							<path
+								d="M8.75 3.75a.75.75 0 0 0-1.5 0v3.5h-3.5a.75.75 0 0 0 0 1.5h3.5v3.5a.75.75 0 0 0 1.5 0v-3.5h3.5a.75.75 0 0 0 0-1.5h-3.5v-3.5Z"
+							/>
+						</svg>
 					</button>
 					</button>
-				</div>
-				<div class="flex items-center text-xl font-semibold">{$i18n.t('Dashboard')}</div>
-			</div>
-		</div>
+				</Tooltip>
 
 
-		<!-- <div class="px-4 my-1">
-			<div
-				class="flex scrollbar-none overflow-x-auto w-fit text-center text-sm font-medium rounded-xl bg-transparent/10 p-1"
-			>
-				<button
-					class="min-w-fit rounded-lg p-1.5 px-3 {tab === ''
-						? 'bg-gray-50 dark:bg-gray-850'
-						: ''} transition"
-					type="button"
-					on:click={() => {
-						tab = '';
-					}}>{$i18n.t('Overview')}</button
-				>
+				<Tooltip content={$i18n.t('Admin Settings')}>
+					<button
+						class=" px-2 py-2 rounded-xl border border-gray-200 dark:border-gray-600 dark:border-0 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition font-medium text-sm flex items-center space-x-1"
+						on:click={() => {
+							showSettingsModal = !showSettingsModal;
+						}}
+					>
+						<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="M6.955 1.45A.5.5 0 0 1 7.452 1h1.096a.5.5 0 0 1 .497.45l.17 1.699c.484.12.94.312 1.356.562l1.321-1.081a.5.5 0 0 1 .67.033l.774.775a.5.5 0 0 1 .034.67l-1.08 1.32c.25.417.44.873.561 1.357l1.699.17a.5.5 0 0 1 .45.497v1.096a.5.5 0 0 1-.45.497l-1.699.17c-.12.484-.312.94-.562 1.356l1.082 1.322a.5.5 0 0 1-.034.67l-.774.774a.5.5 0 0 1-.67.033l-1.322-1.08c-.416.25-.872.44-1.356.561l-.17 1.699a.5.5 0 0 1-.497.45H7.452a.5.5 0 0 1-.497-.45l-.17-1.699a4.973 4.973 0 0 1-1.356-.562L4.108 13.37a.5.5 0 0 1-.67-.033l-.774-.775a.5.5 0 0 1-.034-.67l1.08-1.32a4.971 4.971 0 0 1-.561-1.357l-1.699-.17A.5.5 0 0 1 1 8.548V7.452a.5.5 0 0 1 .45-.497l1.699-.17c.12-.484.312-.94.562-1.356L2.629 4.107a.5.5 0 0 1 .034-.67l.774-.774a.5.5 0 0 1 .67-.033L5.43 3.71a4.97 4.97 0 0 1 1.356-.561l.17-1.699ZM6 8c0 .538.212 1.026.558 1.385l.057.057a2 2 0 0 0 2.828-2.828l-.058-.056A2 2 0 0 0 6 8Z"
+								clip-rule="evenodd"
+							/>
+						</svg>
+					</button>
+				</Tooltip>
 			</div>
 			</div>
-		</div> -->
-
-		<hr class=" my-2 dark:border-gray-850" />
-
-		<div class="px-6">
-			<div class="mt-0.5 mb-3 gap-1 flex flex-col md:flex-row justify-between">
-				<div class="flex md:self-center text-lg font-medium px-0.5">
-					{$i18n.t('All Users')}
-					<div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-200 dark:bg-gray-700" />
-					<span class="text-lg font-medium text-gray-500 dark:text-gray-300">{users.length}</span>
-				</div>
-
-				<div class="flex gap-1">
-					<input
-						class="w-full md:w-60 rounded-xl py-1.5 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
-						placeholder={$i18n.t('Search')}
-						bind:value={search}
-					/>
-
-					<div class="flex gap-0.5">
-						<Tooltip content="Add User">
+		</div>
+	</div>
+
+	<div class="scrollbar-hidden relative whitespace-nowrap overflow-x-auto max-w-full">
+		<table class="w-full text-sm text-left text-gray-500 dark:text-gray-400 table-auto max-w-full">
+			<thead class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-850 dark:text-gray-400">
+				<tr>
+					<th scope="col" class="px-3 py-2"> {$i18n.t('Role')} </th>
+					<th scope="col" class="px-3 py-2"> {$i18n.t('Name')} </th>
+					<th scope="col" class="px-3 py-2"> {$i18n.t('Email')} </th>
+					<th scope="col" class="px-3 py-2"> {$i18n.t('Last Active')} </th>
+
+					<th scope="col" class="px-3 py-2"> {$i18n.t('Created at')} </th>
+
+					<th scope="col" class="px-3 py-2 text-right" />
+				</tr>
+			</thead>
+			<tbody>
+				{#each users
+					.filter((user) => {
+						if (search === '') {
+							return true;
+						} else {
+							let name = user.name.toLowerCase();
+							const query = search.toLowerCase();
+							return name.includes(query);
+						}
+					})
+					.slice((page - 1) * 20, page * 20) as user}
+					<tr class="bg-white border-b dark:bg-gray-900 dark:border-gray-700 text-xs">
+						<td class="px-3 py-2 min-w-[7rem] w-28">
 							<button
 							<button
-								class=" px-2 py-2 rounded-xl border border-gray-200 dark:border-gray-600 dark:border-0 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition font-medium text-sm flex items-center space-x-1"
+								class=" flex items-center gap-2 text-xs px-3 py-0.5 rounded-lg {user.role ===
+									'admin' && 'text-sky-600 dark:text-sky-200 bg-sky-200/30'} {user.role ===
+									'user' && 'text-green-600 dark:text-green-200 bg-green-200/30'} {user.role ===
+									'pending' && 'text-gray-600 dark:text-gray-200 bg-gray-200/30'}"
 								on:click={() => {
 								on:click={() => {
-									showAddUserModal = !showAddUserModal;
+									if (user.role === 'user') {
+										updateRoleHandler(user.id, 'admin');
+									} else if (user.role === 'pending') {
+										updateRoleHandler(user.id, 'user');
+									} else {
+										updateRoleHandler(user.id, 'pending');
+									}
 								}}
 								}}
 							>
 							>
-								<svg
-									xmlns="http://www.w3.org/2000/svg"
-									viewBox="0 0 16 16"
-									fill="currentColor"
-									class="w-4 h-4"
-								>
-									<path
-										d="M8.75 3.75a.75.75 0 0 0-1.5 0v3.5h-3.5a.75.75 0 0 0 0 1.5h3.5v3.5a.75.75 0 0 0 1.5 0v-3.5h3.5a.75.75 0 0 0 0-1.5h-3.5v-3.5Z"
-									/>
-								</svg>
-							</button>
-						</Tooltip>
-
-						<Tooltip content={$i18n.t('Admin Settings')}>
-							<button
-								class=" px-2 py-2 rounded-xl border border-gray-200 dark:border-gray-600 dark:border-0 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition font-medium text-sm flex items-center space-x-1"
-								on:click={() => {
-									showSettingsModal = !showSettingsModal;
-								}}
+								<div
+									class="w-1 h-1 rounded-full {user.role === 'admin' &&
+										'bg-sky-600 dark:bg-sky-300'} {user.role === 'user' &&
+										'bg-green-600 dark:bg-green-300'} {user.role === 'pending' &&
+										'bg-gray-600 dark:bg-gray-300'}"
+								/>
+								{$i18n.t(user.role)}</button
 							>
 							>
-								<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="M6.955 1.45A.5.5 0 0 1 7.452 1h1.096a.5.5 0 0 1 .497.45l.17 1.699c.484.12.94.312 1.356.562l1.321-1.081a.5.5 0 0 1 .67.033l.774.775a.5.5 0 0 1 .034.67l-1.08 1.32c.25.417.44.873.561 1.357l1.699.17a.5.5 0 0 1 .45.497v1.096a.5.5 0 0 1-.45.497l-1.699.17c-.12.484-.312.94-.562 1.356l1.082 1.322a.5.5 0 0 1-.034.67l-.774.774a.5.5 0 0 1-.67.033l-1.322-1.08c-.416.25-.872.44-1.356.561l-.17 1.699a.5.5 0 0 1-.497.45H7.452a.5.5 0 0 1-.497-.45l-.17-1.699a4.973 4.973 0 0 1-1.356-.562L4.108 13.37a.5.5 0 0 1-.67-.033l-.774-.775a.5.5 0 0 1-.034-.67l1.08-1.32a4.971 4.971 0 0 1-.561-1.357l-1.699-.17A.5.5 0 0 1 1 8.548V7.452a.5.5 0 0 1 .45-.497l1.699-.17c.12-.484.312-.94.562-1.356L2.629 4.107a.5.5 0 0 1 .034-.67l.774-.774a.5.5 0 0 1 .67-.033L5.43 3.71a4.97 4.97 0 0 1 1.356-.561l.17-1.699ZM6 8c0 .538.212 1.026.558 1.385l.057.057a2 2 0 0 0 2.828-2.828l-.058-.056A2 2 0 0 0 6 8Z"
-										clip-rule="evenodd"
-									/>
-								</svg>
-							</button>
-						</Tooltip>
-					</div>
-				</div>
-			</div>
-
-			<div class="scrollbar-hidden relative overflow-x-auto whitespace-nowrap">
-				<table class="w-full text-sm text-left text-gray-500 dark:text-gray-400 table-auto">
-					<thead
-						class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-850 dark:text-gray-400"
-					>
-						<tr>
-							<th scope="col" class="px-3 py-2"> {$i18n.t('Role')} </th>
-							<th scope="col" class="px-3 py-2"> {$i18n.t('Name')} </th>
-							<th scope="col" class="px-3 py-2"> {$i18n.t('Email')} </th>
-							<th scope="col" class="px-3 py-2"> {$i18n.t('Last Active')} </th>
-
-							<th scope="col" class="px-3 py-2"> {$i18n.t('Created at')} </th>
-
-							<th scope="col" class="px-3 py-2 text-right" />
-						</tr>
-					</thead>
-					<tbody>
-						{#each users
-							.filter((user) => {
-								if (search === '') {
-									return true;
-								} else {
-									let name = user.name.toLowerCase();
-									const query = search.toLowerCase();
-									return name.includes(query);
-								}
-							})
-							.slice((page - 1) * 20, page * 20) as user}
-							<tr class="bg-white border-b dark:bg-gray-900 dark:border-gray-700 text-xs">
-								<td class="px-3 py-2 min-w-[7rem] w-28">
-									<button
-										class=" flex items-center gap-2 text-xs px-3 py-0.5 rounded-lg {user.role ===
-											'admin' && 'text-sky-600 dark:text-sky-200 bg-sky-200/30'} {user.role ===
-											'user' && 'text-green-600 dark:text-green-200 bg-green-200/30'} {user.role ===
-											'pending' && 'text-gray-600 dark:text-gray-200 bg-gray-200/30'}"
-										on:click={() => {
-											if (user.role === 'user') {
-												updateRoleHandler(user.id, 'admin');
-											} else if (user.role === 'pending') {
-												updateRoleHandler(user.id, 'user');
-											} else {
-												updateRoleHandler(user.id, 'pending');
-											}
-										}}
-									>
-										<div
-											class="w-1 h-1 rounded-full {user.role === 'admin' &&
-												'bg-sky-600 dark:bg-sky-300'} {user.role === 'user' &&
-												'bg-green-600 dark:bg-green-300'} {user.role === 'pending' &&
-												'bg-gray-600 dark:bg-gray-300'}"
-										/>
-										{$i18n.t(user.role)}</button
-									>
-								</td>
-								<td class="px-3 py-2 font-medium text-gray-900 dark:text-white w-max">
-									<div class="flex flex-row w-max">
-										<img
-											class=" rounded-full w-6 h-6 object-cover mr-2.5"
-											src={user.profile_image_url.startsWith(WEBUI_BASE_URL) ||
-											user.profile_image_url.startsWith('https://www.gravatar.com/avatar/') ||
-											user.profile_image_url.startsWith('data:')
-												? user.profile_image_url
-												: `/user.png`}
-											alt="user"
-										/>
-
-										<div class=" font-medium self-center">{user.name}</div>
-									</div>
-								</td>
-								<td class=" px-3 py-2"> {user.email} </td>
-
-								<td class=" px-3 py-2">
-									{dayjs(user.last_active_at * 1000).fromNow()}
-								</td>
-
-								<td class=" px-3 py-2">
-									{dayjs(user.created_at * 1000).format($i18n.t('MMMM DD, YYYY'))}
-								</td>
-
-								<td class="px-3 py-2 text-right">
-									<div class="flex justify-end w-full">
-										{#if user.role !== 'admin'}
-											<Tooltip content={$i18n.t('Chats')}>
-												<button
-													class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
-													on:click={async () => {
-														showUserChatsModal = !showUserChatsModal;
-														selectedUser = user;
-													}}
-												>
-													<ChatBubbles />
-												</button>
-											</Tooltip>
-
-											<Tooltip content={$i18n.t('Edit User')}>
-												<button
-													class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
-													on:click={async () => {
-														showEditUserModal = !showEditUserModal;
-														selectedUser = user;
-													}}
-												>
-													<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>
-												</button>
-											</Tooltip>
-
-											<Tooltip content={$i18n.t('Delete User')}>
-												<button
-													class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
-													on:click={async () => {
-														deleteUserHandler(user.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"
-													>
-														<path
-															stroke-linecap="round"
-															stroke-linejoin="round"
-															d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0"
-														/>
-													</svg>
-												</button>
-											</Tooltip>
-										{/if}
-									</div>
-								</td>
-							</tr>
-						{/each}
-					</tbody>
-				</table>
-			</div>
-
-			<div class=" text-gray-500 text-xs mt-2 text-right">
-				ⓘ {$i18n.t("Click on the user role button to change a user's role.")}
-			</div>
-
-			<Pagination bind:page count={users.length} />
-		</div>
-	{/if}
-</div>
+						</td>
+						<td class="px-3 py-2 font-medium text-gray-900 dark:text-white w-max">
+							<div class="flex flex-row w-max">
+								<img
+									class=" rounded-full w-6 h-6 object-cover mr-2.5"
+									src={user.profile_image_url.startsWith(WEBUI_BASE_URL) ||
+									user.profile_image_url.startsWith('https://www.gravatar.com/avatar/') ||
+									user.profile_image_url.startsWith('data:')
+										? user.profile_image_url
+										: `/user.png`}
+									alt="user"
+								/>
+
+								<div class=" font-medium self-center">{user.name}</div>
+							</div>
+						</td>
+						<td class=" px-3 py-2"> {user.email} </td>
+
+						<td class=" px-3 py-2">
+							{dayjs(user.last_active_at * 1000).fromNow()}
+						</td>
+
+						<td class=" px-3 py-2">
+							{dayjs(user.created_at * 1000).format($i18n.t('MMMM DD, YYYY'))}
+						</td>
+
+						<td class="px-3 py-2 text-right">
+							<div class="flex justify-end w-full">
+								{#if user.role !== 'admin'}
+									<Tooltip content={$i18n.t('Chats')}>
+										<button
+											class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
+											on:click={async () => {
+												showUserChatsModal = !showUserChatsModal;
+												selectedUser = user;
+											}}
+										>
+											<ChatBubbles />
+										</button>
+									</Tooltip>
+
+									<Tooltip content={$i18n.t('Edit User')}>
+										<button
+											class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
+											on:click={async () => {
+												showEditUserModal = !showEditUserModal;
+												selectedUser = user;
+											}}
+										>
+											<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>
+										</button>
+									</Tooltip>
+
+									<Tooltip content={$i18n.t('Delete User')}>
+										<button
+											class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
+											on:click={async () => {
+												deleteUserHandler(user.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"
+											>
+												<path
+													stroke-linecap="round"
+													stroke-linejoin="round"
+													d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0"
+												/>
+											</svg>
+										</button>
+									</Tooltip>
+								{/if}
+							</div>
+						</td>
+					</tr>
+				{/each}
+			</tbody>
+		</table>
+	</div>
+
+	<div class=" text-gray-500 text-xs mt-2 text-right">
+		ⓘ {$i18n.t("Click on the user role button to change a user's role.")}
+	</div>
+
+	<Pagination bind:page count={users.length} />
+{/if}
 
 
 <style>
 <style>
 	.font-mona {
 	.font-mona {

+ 3 - 5
src/routes/(app)/workspace/models/create/+page.svelte

@@ -62,7 +62,7 @@
 		info.id = id;
 		info.id = id;
 		info.name = name;
 		info.name = name;
 		info.meta.capabilities = capabilities;
 		info.meta.capabilities = capabilities;
-		info.params.stop = params.stop !== null ? params.stop.split(',').filter((s) => s.trim()) : null;
+		info.params.stop = params.stop ? params.stop.split(',').filter((s) => s.trim()) : null;
 
 
 		if ($models.find((m) => m.id === info.id)) {
 		if ($models.find((m) => m.id === info.id)) {
 			toast.error(
 			toast.error(
@@ -316,11 +316,9 @@
 					bind:value={info.base_model_id}
 					bind:value={info.base_model_id}
 					required
 					required
 				>
 				>
-					<option value={null} class=" placeholder:text-gray-500"
-						>{$i18n.t('Select a base model')}</option
-					>
+					<option value={null} class=" text-gray-900">{$i18n.t('Select a base model')}</option>
 					{#each $models.filter((m) => !m?.preset) as model}
 					{#each $models.filter((m) => !m?.preset) as model}
-						<option value={model.id}>{model.name}</option>
+						<option value={model.id} class=" text-gray-900">{model.name}</option>
 					{/each}
 					{/each}
 				</select>
 				</select>
 			</div>
 			</div>

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików