diff --git a/.env.example b/.env.example index 2d782fce10..c38bf88bfb 100644 --- a/.env.example +++ b/.env.example @@ -10,8 +10,4 @@ OPENAI_API_KEY='' # DO NOT TRACK SCARF_NO_ANALYTICS=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" \ No newline at end of file +ANONYMIZED_TELEMETRY=false \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index c2c42aa17f..52987b5a6f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -59,11 +59,6 @@ ENV OPENAI_API_KEY="" \ DO_NOT_TRACK=true \ 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 ######################################################### ## whisper TTS model settings ## ENV WHISPER_MODEL="base" \ @@ -83,10 +78,10 @@ WORKDIR /app/backend ENV HOME /root # Create user and group if not root 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 RUN mkdir -p $HOME/.cache/chroma diff --git a/backend/apps/litellm/main.py b/backend/apps/litellm/main.py deleted file mode 100644 index 2b771d5c6e..0000000000 --- a/backend/apps/litellm/main.py +++ /dev/null @@ -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 - ) diff --git a/backend/apps/ollama/main.py b/backend/apps/ollama/main.py index 7288f34676..01e127074b 100644 --- a/backend/apps/ollama/main.py +++ b/backend/apps/ollama/main.py @@ -29,8 +29,8 @@ import time from urllib.parse import urlparse 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 utils.utils import ( decode_token, @@ -306,6 +306,9 @@ async def pull_model( 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(): nonlocal url nonlocal r @@ -333,7 +336,7 @@ async def pull_model( r = requests.request( method="POST", url=f"{url}/api/pull", - data=form_data.model_dump_json(exclude_none=True).encode(), + data=json.dumps(payload), stream=True, ) diff --git a/backend/apps/openai/main.py b/backend/apps/openai/main.py index ded7e66266..74ac18a12f 100644 --- a/backend/apps/openai/main.py +++ b/backend/apps/openai/main.py @@ -10,8 +10,8 @@ import logging 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 utils.utils import ( decode_token, diff --git a/backend/apps/rag/main.py b/backend/apps/rag/main.py index 6837d96357..fd2ebd25c9 100644 --- a/backend/apps/rag/main.py +++ b/backend/apps/rag/main.py @@ -46,7 +46,7 @@ import json import sentence_transformers -from apps.web.models.documents import ( +from apps.webui.models.documents import ( Documents, DocumentForm, DocumentResponse, diff --git a/backend/apps/web/models/modelfiles.py b/backend/apps/web/models/modelfiles.py deleted file mode 100644 index fe278ed5f9..0000000000 --- a/backend/apps/web/models/modelfiles.py +++ /dev/null @@ -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) diff --git a/backend/apps/web/internal/db.py b/backend/apps/webui/internal/db.py similarity index 89% rename from backend/apps/web/internal/db.py rename to backend/apps/webui/internal/db.py index c8011460c1..0e7b1f95d1 100644 --- a/backend/apps/web/internal/db.py +++ b/backend/apps/webui/internal/db.py @@ -31,7 +31,9 @@ else: DB = connect(DATABASE_URL) log.info(f"Connected to a {DB.__class__.__name__} database.") 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() DB.connect(reuse_if_open=True) diff --git a/backend/apps/web/internal/migrations/001_initial_schema.py b/backend/apps/webui/internal/migrations/001_initial_schema.py similarity index 100% rename from backend/apps/web/internal/migrations/001_initial_schema.py rename to backend/apps/webui/internal/migrations/001_initial_schema.py diff --git a/backend/apps/web/internal/migrations/002_add_local_sharing.py b/backend/apps/webui/internal/migrations/002_add_local_sharing.py similarity index 100% rename from backend/apps/web/internal/migrations/002_add_local_sharing.py rename to backend/apps/webui/internal/migrations/002_add_local_sharing.py diff --git a/backend/apps/web/internal/migrations/003_add_auth_api_key.py b/backend/apps/webui/internal/migrations/003_add_auth_api_key.py similarity index 100% rename from backend/apps/web/internal/migrations/003_add_auth_api_key.py rename to backend/apps/webui/internal/migrations/003_add_auth_api_key.py diff --git a/backend/apps/web/internal/migrations/004_add_archived.py b/backend/apps/webui/internal/migrations/004_add_archived.py similarity index 100% rename from backend/apps/web/internal/migrations/004_add_archived.py rename to backend/apps/webui/internal/migrations/004_add_archived.py diff --git a/backend/apps/web/internal/migrations/005_add_updated_at.py b/backend/apps/webui/internal/migrations/005_add_updated_at.py similarity index 100% rename from backend/apps/web/internal/migrations/005_add_updated_at.py rename to backend/apps/webui/internal/migrations/005_add_updated_at.py diff --git a/backend/apps/web/internal/migrations/006_migrate_timestamps_and_charfields.py b/backend/apps/webui/internal/migrations/006_migrate_timestamps_and_charfields.py similarity index 100% rename from backend/apps/web/internal/migrations/006_migrate_timestamps_and_charfields.py rename to backend/apps/webui/internal/migrations/006_migrate_timestamps_and_charfields.py diff --git a/backend/apps/web/internal/migrations/007_add_user_last_active_at.py b/backend/apps/webui/internal/migrations/007_add_user_last_active_at.py similarity index 100% rename from backend/apps/web/internal/migrations/007_add_user_last_active_at.py rename to backend/apps/webui/internal/migrations/007_add_user_last_active_at.py diff --git a/backend/apps/web/internal/migrations/008_add_memory.py b/backend/apps/webui/internal/migrations/008_add_memory.py similarity index 100% rename from backend/apps/web/internal/migrations/008_add_memory.py rename to backend/apps/webui/internal/migrations/008_add_memory.py diff --git a/backend/apps/web/internal/migrations/009_add_models.py b/backend/apps/webui/internal/migrations/009_add_models.py similarity index 100% rename from backend/apps/web/internal/migrations/009_add_models.py rename to backend/apps/webui/internal/migrations/009_add_models.py diff --git a/backend/apps/web/internal/migrations/010_migrate_modelfiles_to_models.py b/backend/apps/webui/internal/migrations/010_migrate_modelfiles_to_models.py similarity index 100% rename from backend/apps/web/internal/migrations/010_migrate_modelfiles_to_models.py rename to backend/apps/webui/internal/migrations/010_migrate_modelfiles_to_models.py diff --git a/backend/apps/web/internal/migrations/README.md b/backend/apps/webui/internal/migrations/README.md similarity index 84% rename from backend/apps/web/internal/migrations/README.md rename to backend/apps/webui/internal/migrations/README.md index 63d92e802e..2602141137 100644 --- a/backend/apps/web/internal/migrations/README.md +++ b/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. 3. From the `backend` directory, run the following command: ```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. - `$MIGRATION_NAME` should be a descriptive name for the migration. diff --git a/backend/apps/web/main.py b/backend/apps/webui/main.py similarity index 98% rename from backend/apps/web/main.py rename to backend/apps/webui/main.py index 9704cde776..d736cef9ae 100644 --- a/backend/apps/web/main.py +++ b/backend/apps/webui/main.py @@ -1,7 +1,7 @@ from fastapi import FastAPI, Depends from fastapi.routing import APIRoute from fastapi.middleware.cors import CORSMiddleware -from apps.web.routers import ( +from apps.webui.routers import ( auths, users, chats, diff --git a/backend/apps/web/models/auths.py b/backend/apps/webui/models/auths.py similarity index 98% rename from backend/apps/web/models/auths.py rename to backend/apps/webui/models/auths.py index dfa0c43953..e3b659e43b 100644 --- a/backend/apps/web/models/auths.py +++ b/backend/apps/webui/models/auths.py @@ -5,10 +5,10 @@ import uuid import logging 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 apps.web.internal.db import DB +from apps.webui.internal.db import DB from config import SRC_LOG_LEVELS diff --git a/backend/apps/web/models/chats.py b/backend/apps/webui/models/chats.py similarity index 88% rename from backend/apps/web/models/chats.py rename to backend/apps/webui/models/chats.py index 891151b94e..d4597f16db 100644 --- a/backend/apps/web/models/chats.py +++ b/backend/apps/webui/models/chats.py @@ -7,7 +7,7 @@ import json import uuid import time -from apps.web.internal.db import DB +from apps.webui.internal.db import DB #################### # Chat DB Schema @@ -191,6 +191,20 @@ class ChatTable: except: 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( self, user_id: str, skip: int = 0, limit: int = 50 ) -> List[ChatModel]: @@ -205,17 +219,31 @@ class ChatTable: ] 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]: - 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( self, chat_ids: List[str], skip: int = 0, limit: int = 50 diff --git a/backend/apps/web/models/documents.py b/backend/apps/webui/models/documents.py similarity index 99% rename from backend/apps/web/models/documents.py rename to backend/apps/webui/models/documents.py index 42b99596cc..3b730535fb 100644 --- a/backend/apps/web/models/documents.py +++ b/backend/apps/webui/models/documents.py @@ -8,7 +8,7 @@ import logging from utils.utils import decode_token from utils.misc import get_gravatar_url -from apps.web.internal.db import DB +from apps.webui.internal.db import DB import json diff --git a/backend/apps/web/models/memories.py b/backend/apps/webui/models/memories.py similarity index 97% rename from backend/apps/web/models/memories.py rename to backend/apps/webui/models/memories.py index 8382b3e525..70e5577e94 100644 --- a/backend/apps/web/models/memories.py +++ b/backend/apps/webui/models/memories.py @@ -3,8 +3,8 @@ from peewee import * from playhouse.shortcuts import model_to_dict 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 uuid diff --git a/backend/apps/web/models/models.py b/backend/apps/webui/models/models.py similarity index 98% rename from backend/apps/web/models/models.py rename to backend/apps/webui/models/models.py index bf835c8fdb..8513523989 100644 --- a/backend/apps/web/models/models.py +++ b/backend/apps/webui/models/models.py @@ -8,7 +8,7 @@ from peewee import * from playhouse.shortcuts import model_to_dict 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 config import SRC_LOG_LEVELS diff --git a/backend/apps/web/models/prompts.py b/backend/apps/webui/models/prompts.py similarity index 98% rename from backend/apps/web/models/prompts.py rename to backend/apps/webui/models/prompts.py index bc4e3e58bf..c4ac6be149 100644 --- a/backend/apps/web/models/prompts.py +++ b/backend/apps/webui/models/prompts.py @@ -7,7 +7,7 @@ import time from utils.utils import decode_token from utils.misc import get_gravatar_url -from apps.web.internal.db import DB +from apps.webui.internal.db import DB import json diff --git a/backend/apps/web/models/tags.py b/backend/apps/webui/models/tags.py similarity index 99% rename from backend/apps/web/models/tags.py rename to backend/apps/webui/models/tags.py index d9a967ff77..4c4fa82e68 100644 --- a/backend/apps/web/models/tags.py +++ b/backend/apps/webui/models/tags.py @@ -8,7 +8,7 @@ import uuid import time import logging -from apps.web.internal.db import DB +from apps.webui.internal.db import DB from config import SRC_LOG_LEVELS diff --git a/backend/apps/web/models/users.py b/backend/apps/webui/models/users.py similarity index 98% rename from backend/apps/web/models/users.py rename to backend/apps/webui/models/users.py index 450dd91870..8f600c6d52 100644 --- a/backend/apps/web/models/users.py +++ b/backend/apps/webui/models/users.py @@ -5,8 +5,8 @@ from typing import List, Union, Optional import time 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 diff --git a/backend/apps/web/routers/auths.py b/backend/apps/webui/routers/auths.py similarity index 99% rename from backend/apps/web/routers/auths.py rename to backend/apps/webui/routers/auths.py index 998e746598..ce9b92061a 100644 --- a/backend/apps/web/routers/auths.py +++ b/backend/apps/webui/routers/auths.py @@ -10,7 +10,7 @@ import uuid import csv -from apps.web.models.auths import ( +from apps.webui.models.auths import ( SigninForm, SignupForm, AddUserForm, @@ -21,7 +21,7 @@ from apps.web.models.auths import ( Auths, ApiKey, ) -from apps.web.models.users import Users +from apps.webui.models.users import Users from utils.utils import ( get_password_hash, diff --git a/backend/apps/web/routers/chats.py b/backend/apps/webui/routers/chats.py similarity index 95% rename from backend/apps/web/routers/chats.py rename to backend/apps/webui/routers/chats.py index aaf1735210..5d52f40c96 100644 --- a/backend/apps/web/routers/chats.py +++ b/backend/apps/webui/routers/chats.py @@ -7,8 +7,8 @@ from pydantic import BaseModel import json 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, ChatResponse, ChatTitleForm, @@ -18,7 +18,7 @@ from apps.web.models.chats import ( ) -from apps.web.models.tags import ( +from apps.webui.models.tags import ( TagModel, ChatIdTagModel, 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( 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) + return Chats.get_chat_list_by_user_id( + user_id, include_archived=True, skip=skip, limit=limit + ) ############################ -# GetArchivedChats +# CreateNewChat ############################ -@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) - - -############################ -# 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: +@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)}) - else: + except Exception as e: + log.exception(e) 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) - return ChatResponse(**{**chat.model_dump(), "chat": json.loads(chat.chat)}) - except Exception as e: - log.exception(e) +@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_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT() + 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)}) + else: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND ) diff --git a/backend/apps/web/routers/configs.py b/backend/apps/webui/routers/configs.py similarity index 97% rename from backend/apps/web/routers/configs.py rename to backend/apps/webui/routers/configs.py index 143ed5e0ae..00feafb18b 100644 --- a/backend/apps/web/routers/configs.py +++ b/backend/apps/webui/routers/configs.py @@ -8,7 +8,7 @@ from pydantic import BaseModel import time import uuid -from apps.web.models.users import Users +from apps.webui.models.users import Users from utils.utils import ( get_password_hash, diff --git a/backend/apps/web/routers/documents.py b/backend/apps/webui/routers/documents.py similarity index 98% rename from backend/apps/web/routers/documents.py rename to backend/apps/webui/routers/documents.py index 7c69514fe9..c5447a3fe6 100644 --- a/backend/apps/web/routers/documents.py +++ b/backend/apps/webui/routers/documents.py @@ -6,7 +6,7 @@ from fastapi import APIRouter from pydantic import BaseModel import json -from apps.web.models.documents import ( +from apps.webui.models.documents import ( Documents, DocumentForm, DocumentUpdateForm, diff --git a/backend/apps/web/routers/memories.py b/backend/apps/webui/routers/memories.py similarity index 98% rename from backend/apps/web/routers/memories.py rename to backend/apps/webui/routers/memories.py index f20e026014..6448ebe1ee 100644 --- a/backend/apps/web/routers/memories.py +++ b/backend/apps/webui/routers/memories.py @@ -7,7 +7,7 @@ from fastapi import APIRouter from pydantic import BaseModel 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 constants import ERROR_MESSAGES diff --git a/backend/apps/web/routers/models.py b/backend/apps/webui/routers/models.py similarity index 91% rename from backend/apps/web/routers/models.py rename to backend/apps/webui/routers/models.py index 654d0d2fb7..363737e259 100644 --- a/backend/apps/web/routers/models.py +++ b/backend/apps/webui/routers/models.py @@ -5,7 +5,7 @@ from typing import List, Union, Optional from fastapi import APIRouter from pydantic import BaseModel 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 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)): 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( 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)): result = Models.delete_model_by_id(id) return result diff --git a/backend/apps/web/routers/prompts.py b/backend/apps/webui/routers/prompts.py similarity index 97% rename from backend/apps/web/routers/prompts.py rename to backend/apps/webui/routers/prompts.py index db76196765..47d8c7012e 100644 --- a/backend/apps/web/routers/prompts.py +++ b/backend/apps/webui/routers/prompts.py @@ -6,7 +6,7 @@ from fastapi import APIRouter from pydantic import BaseModel 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 constants import ERROR_MESSAGES diff --git a/backend/apps/web/routers/users.py b/backend/apps/webui/routers/users.py similarity index 96% rename from backend/apps/web/routers/users.py rename to backend/apps/webui/routers/users.py index d77475d8df..bb9c557dbb 100644 --- a/backend/apps/web/routers/users.py +++ b/backend/apps/webui/routers/users.py @@ -9,9 +9,9 @@ import time import uuid 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 constants import ERROR_MESSAGES diff --git a/backend/apps/web/routers/utils.py b/backend/apps/webui/routers/utils.py similarity index 98% rename from backend/apps/web/routers/utils.py rename to backend/apps/webui/routers/utils.py index 12805873d4..b95fe88347 100644 --- a/backend/apps/web/routers/utils.py +++ b/backend/apps/webui/routers/utils.py @@ -8,7 +8,7 @@ from pydantic import BaseModel from fpdf import FPDF 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.misc import calculate_sha256, get_gravatar_url diff --git a/backend/config.py b/backend/config.py index 10a8625be3..6d603bab99 100644 --- a/backend/config.py +++ b/backend/config.py @@ -27,6 +27,8 @@ from constants import ERROR_MESSAGES BACKEND_DIR = Path(__file__).parent # the path containing this file BASE_DIR = BACKEND_DIR.parent # the path containing the backend/ +print(BASE_DIR) + try: from dotenv import load_dotenv, find_dotenv @@ -56,7 +58,6 @@ log_sources = [ "CONFIG", "DB", "IMAGES", - "LITELLM", "MAIN", "MODELS", "OLLAMA", @@ -122,7 +123,10 @@ def parse_section(section): 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: 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" -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"), ) -#################################### -# 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 diff --git a/backend/main.py b/backend/main.py index f412db131c..0362cd5793 100644 --- a/backend/main.py +++ b/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.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.images.main import app as images_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 from pydantic import BaseModel 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 apps.rag.utils import rag_messages @@ -55,7 +48,6 @@ from config import ( STATIC_DIR, ENABLE_OPENAI_API, ENABLE_OLLAMA_API, - ENABLE_LITELLM, ENABLE_MODEL_FILTER, MODEL_FILTER_LIST, GLOBAL_LOG_LEVEL, @@ -101,11 +93,7 @@ https://github.com/open-webui/open-webui @asynccontextmanager async def lifespan(app: FastAPI): - if ENABLE_LITELLM: - asyncio.create_task(start_litellm_background()) yield - if ENABLE_LITELLM: - await shutdown_litellm_background() app = FastAPI( @@ -263,9 +251,6 @@ async def update_embedding_function(request: Request, call_next): return response -# TODO: Deprecate LiteLLM -app.mount("/litellm/api", litellm_app) - app.mount("/ollama", ollama_app) app.mount("/openai", openai_app) @@ -373,13 +358,14 @@ async def get_app_config(): "name": WEBUI_NAME, "version": VERSION, "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, - "images": images_app.state.config.ENABLED, "default_models": webui_app.state.config.DEFAULT_MODELS, "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.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 { "enabled": app.state.config.ENABLE_MODEL_FILTER, "models": app.state.config.MODEL_FILTER_LIST, @@ -432,7 +409,6 @@ class UrlForm(BaseModel): @app.post("/api/webhook") async def update_webhook_url(form_data: UrlForm, user=Depends(get_admin_user)): app.state.config.WEBHOOK_URL = form_data.url - webui_app.state.WEBHOOK_URL = app.state.config.WEBHOOK_URL return { diff --git a/backend/requirements.txt b/backend/requirements.txt index 29e37f8b8b..7a3668428f 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -18,8 +18,6 @@ psycopg2-binary==2.9.9 PyMySQL==1.1.1 bcrypt==4.1.3 -litellm[proxy]==1.37.20 - boto3==1.34.110 argon2-cffi==23.1.0 diff --git a/backend/space/litellm_config.yaml b/backend/space/litellm_config.yaml deleted file mode 100644 index af4f880b9f..0000000000 --- a/backend/space/litellm_config.yaml +++ /dev/null @@ -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 diff --git a/backend/start.sh b/backend/start.sh index ba7741e1df..15fc568d3c 100755 --- a/backend/start.sh +++ b/backend/start.sh @@ -34,11 +34,6 @@ fi # Check if SPACE_ID is set, if so, configure for space if [ -n "$SPACE_ID" ]; then 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 echo "Admin user configured, creating" WEBUI_SECRET_KEY="$WEBUI_SECRET_KEY" uvicorn main:app --host "$HOST" --port "$PORT" --forwarded-allow-ips '*' & diff --git a/backend/utils/models.py b/backend/utils/models.py index 7a57b4fdb5..c4d675d295 100644 --- a/backend/utils/models.py +++ b/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): diff --git a/backend/utils/utils.py b/backend/utils/utils.py index af4fd85c09..cc6bb06b86 100644 --- a/backend/utils/utils.py +++ b/backend/utils/utils.py @@ -1,7 +1,7 @@ from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials 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 typing import Union, Optional diff --git a/requirements-dev.lock b/requirements-dev.lock index 93c126eb48..39b1d0ef02 100644 --- a/requirements-dev.lock +++ b/requirements-dev.lock @@ -273,7 +273,6 @@ langsmith==0.1.57 # via langchain-community # via langchain-core litellm==1.37.20 - # via litellm # via open-webui lxml==5.2.2 # via unstructured @@ -396,7 +395,6 @@ pandas==2.2.2 # via open-webui passlib==1.7.4 # via open-webui - # via passlib pathspec==0.12.1 # via black peewee==3.17.5 @@ -454,7 +452,6 @@ pygments==2.18.0 pyjwt==2.8.0 # via litellm # via open-webui - # via pyjwt pymysql==1.1.0 # via open-webui pypandoc==1.13 @@ -559,6 +556,9 @@ scipy==1.13.0 # via sentence-transformers sentence-transformers==2.7.0 # via open-webui +setuptools==69.5.1 + # via ctranslate2 + # via opentelemetry-instrumentation shapely==2.0.4 # via rapidocr-onnxruntime shellingham==1.5.4 @@ -659,7 +659,6 @@ uvicorn==0.22.0 # via fastapi # via litellm # via open-webui - # via uvicorn uvloop==0.19.0 # via uvicorn validators==0.28.1 @@ -687,6 +686,3 @@ youtube-transcript-api==0.6.2 # via open-webui zipp==3.18.1 # via importlib-metadata -setuptools==69.5.1 - # via ctranslate2 - # via opentelemetry-instrumentation diff --git a/requirements.lock b/requirements.lock index 93c126eb48..39b1d0ef02 100644 --- a/requirements.lock +++ b/requirements.lock @@ -273,7 +273,6 @@ langsmith==0.1.57 # via langchain-community # via langchain-core litellm==1.37.20 - # via litellm # via open-webui lxml==5.2.2 # via unstructured @@ -396,7 +395,6 @@ pandas==2.2.2 # via open-webui passlib==1.7.4 # via open-webui - # via passlib pathspec==0.12.1 # via black peewee==3.17.5 @@ -454,7 +452,6 @@ pygments==2.18.0 pyjwt==2.8.0 # via litellm # via open-webui - # via pyjwt pymysql==1.1.0 # via open-webui pypandoc==1.13 @@ -559,6 +556,9 @@ scipy==1.13.0 # via sentence-transformers sentence-transformers==2.7.0 # via open-webui +setuptools==69.5.1 + # via ctranslate2 + # via opentelemetry-instrumentation shapely==2.0.4 # via rapidocr-onnxruntime shellingham==1.5.4 @@ -659,7 +659,6 @@ uvicorn==0.22.0 # via fastapi # via litellm # via open-webui - # via uvicorn uvloop==0.19.0 # via uvicorn validators==0.28.1 @@ -687,6 +686,3 @@ youtube-transcript-api==0.6.2 # via open-webui zipp==3.18.1 # via importlib-metadata -setuptools==69.5.1 - # via ctranslate2 - # via opentelemetry-instrumentation diff --git a/src/lib/apis/chats/index.ts b/src/lib/apis/chats/index.ts index a72b519397..834e29d296 100644 --- a/src/lib/apis/chats/index.ts +++ b/src/lib/apis/chats/index.ts @@ -654,3 +654,35 @@ export const deleteAllChats = async (token: string) => { 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; +}; diff --git a/src/lib/apis/litellm/index.ts b/src/lib/apis/litellm/index.ts deleted file mode 100644 index b1c24c5bde..0000000000 --- a/src/lib/apis/litellm/index.ts +++ /dev/null @@ -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; -}; diff --git a/src/lib/apis/models/index.ts b/src/lib/apis/models/index.ts index 0929265830..9faa358d33 100644 --- a/src/lib/apis/models/index.ts +++ b/src/lib/apis/models/index.ts @@ -32,7 +32,7 @@ export const addNewModel = async (token: string, model: object) => { export const getModelInfos = async (token: string = '') => { let error = null; - const res = await fetch(`${WEBUI_API_BASE_URL}/models/`, { + const res = await fetch(`${WEBUI_API_BASE_URL}/models`, { method: 'GET', headers: { Accept: 'application/json', @@ -63,7 +63,10 @@ export const getModelInfos = async (token: string = '') => { export const getModelById = async (token: string, id: string) => { 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', headers: { 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) => { 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', headers: { 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) => { 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', headers: { Accept: 'application/json', diff --git a/src/lib/apis/ollama/index.ts b/src/lib/apis/ollama/index.ts index b7f8421771..efc3f0d0f0 100644 --- a/src/lib/apis/ollama/index.ts +++ b/src/lib/apis/ollama/index.ts @@ -164,7 +164,7 @@ export const getOllamaVersion = async (token: string = '') => { throw error; } - return res?.version ?? ''; + return res?.version ?? false; }; export const getOllamaModels = async (token: string = '') => { diff --git a/src/lib/components/admin/Settings/Database.svelte b/src/lib/components/admin/Settings/Database.svelte index cde6bcaa46..711c1254fc 100644 --- a/src/lib/components/admin/Settings/Database.svelte +++ b/src/lib/components/admin/Settings/Database.svelte @@ -1,13 +1,24 @@ -
- +
-
+
+
+
+
+ + + +
+ +
+
+
{#if chats.length > 0} -
-
- - - - - - - - - {#each chats as chat, idx} - - - - - - +
+
+
+
{$i18n.t('Name')} -
- -
- {chat.title} -
-
-
-
- - - - - - - -
-
+ + + + + - {/each} - -
{$i18n.t('Name')}
-
- +
+ +
+ +
{:else}
diff --git a/src/lib/components/workspace/Models.svelte b/src/lib/components/workspace/Models.svelte index 963ab70830..3bc96b5418 100644 --- a/src/lib/components/workspace/Models.svelte +++ b/src/lib/components/workspace/Models.svelte @@ -20,6 +20,8 @@ let importFiles; let modelsImportInputElement: HTMLInputElement; + let searchValue = ''; + const deleteModelHandler = async (model) => { console.log(model.info); if (!model?.info) { @@ -97,6 +99,49 @@
{$i18n.t('Models')}
+
+
+
+ + + +
+ +
+ +
+ + + + + +
+
+
+
- {#each $models as model} + {#each $models.filter((m) => searchValue === '' || m.name + .toLowerCase() + .includes(searchValue.toLowerCase())) as model}
diff --git a/src/lib/components/workspace/Playground.svelte b/src/lib/components/workspace/Playground.svelte index 2142b15d6f..476ce774dc 100644 --- a/src/lib/components/workspace/Playground.svelte +++ b/src/lib/components/workspace/Playground.svelte @@ -5,12 +5,7 @@ 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 { 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) { @@ -150,11 +141,7 @@ ...messages ].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; diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 3ae4244403..9f6070beeb 100644 --- a/src/lib/constants.ts +++ b/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 LITELLM_API_BASE_URL = `${WEBUI_BASE_URL}/litellm/api`; export const OLLAMA_API_BASE_URL = `${WEBUI_BASE_URL}/ollama`; export const OPENAI_API_BASE_URL = `${WEBUI_BASE_URL}/openai`; export const AUDIO_API_BASE_URL = `${WEBUI_BASE_URL}/audio/api/v1`; diff --git a/src/lib/i18n/locales/ar-BH/translation.json b/src/lib/i18n/locales/ar-BH/translation.json index 6067661da5..47ed7a80ae 100644 --- a/src/lib/i18n/locales/ar-BH/translation.json +++ b/src/lib/i18n/locales/ar-BH/translation.json @@ -48,6 +48,7 @@ "API keys": "مفاتيح واجهة برمجة التطبيقات", "April": "أبريل", "Archive": "الأرشيف", + "Archive All Chats": "", "Archived Chats": "الأرشيف المحادثات", "are allowed - Activate this command by typing": "مسموح - قم بتنشيط هذا الأمر عن طريق الكتابة", "Are you sure?": "هل أنت متأكد ؟", @@ -120,7 +121,6 @@ "Custom": "مخصص", "Customize models for a specific purpose": "", "Dark": "مظلم", - "Dashboard": "لوحة التحكم", "Database": "قاعدة البيانات", "December": "ديسمبر", "Default": "الإفتراضي", @@ -133,9 +133,9 @@ "delete": "حذف", "Delete": "حذف", "Delete a model": "حذف الموديل", + "Delete All Chats": "", "Delete chat": "حذف المحادثه", "Delete Chat": "حذف المحادثه.", - "Delete Chats": "حذف المحادثات", "delete this link": "أحذف هذا الرابط", "Delete User": "حذف المستخدم", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} حذف", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "URL/مفتاح OpenAI.مطلوب عنوان ", "or": "أو", "Other": "آخر", - "Overview": "عرض", "Password": "الباسورد", "PDF document (.pdf)": "PDF ملف (.pdf)", "PDF Extract Images (OCR)": "PDF أستخرج الصور (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "{{path}} مسح على الملفات من", "Search": "البحث", "Search a model": "البحث عن موديل", + "Search Chats": "", "Search Documents": "البحث المستندات", + "Search Models": "", "Search Prompts": "أبحث حث", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/bg-BG/translation.json b/src/lib/i18n/locales/bg-BG/translation.json index ba6cf84d91..0093079ee2 100644 --- a/src/lib/i18n/locales/bg-BG/translation.json +++ b/src/lib/i18n/locales/bg-BG/translation.json @@ -48,6 +48,7 @@ "API keys": "API Ключове", "April": "Април", "Archive": "Архивирани Чатове", + "Archive All Chats": "", "Archived Chats": "Архивирани Чатове", "are allowed - Activate this command by typing": "са разрешени - Активирайте тази команда чрез въвеждане", "Are you sure?": "Сигурни ли сте?", @@ -120,7 +121,6 @@ "Custom": "Персонализиран", "Customize models for a specific purpose": "", "Dark": "Тъмен", - "Dashboard": "Панел", "Database": "База данни", "December": "Декември", "Default": "По подразбиране", @@ -133,9 +133,9 @@ "delete": "изтриване", "Delete": "Изтриване", "Delete a model": "Изтриване на модел", + "Delete All Chats": "", "Delete chat": "Изтриване на чат", "Delete Chat": "Изтриване на Чат", - "Delete Chats": "Изтриване на Чатове", "delete this link": "Изтриване на този линк", "Delete User": "Изтриване на потребител", "Deleted {{deleteModelTag}}": "Изтрито {{deleteModelTag}}", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "OpenAI URL/Key е задължителен.", "or": "или", "Other": "Other", - "Overview": "Обзор", "Password": "Парола", "PDF document (.pdf)": "PDF документ (.pdf)", "PDF Extract Images (OCR)": "PDF Extract Images (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "Сканиране за документи в {{path}}", "Search": "Търси", "Search a model": "Търси модел", + "Search Chats": "", "Search Documents": "Търси Документи", + "Search Models": "", "Search Prompts": "Търси Промптове", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/bn-BD/translation.json b/src/lib/i18n/locales/bn-BD/translation.json index d4186f1eb2..d50c460415 100644 --- a/src/lib/i18n/locales/bn-BD/translation.json +++ b/src/lib/i18n/locales/bn-BD/translation.json @@ -48,6 +48,7 @@ "API keys": "এপিআই কোডস", "April": "আপ্রিল", "Archive": "আর্কাইভ", + "Archive All Chats": "", "Archived Chats": "চ্যাট ইতিহাস সংরক্ষণাগার", "are allowed - Activate this command by typing": "অনুমোদিত - কমান্ডটি চালু করার জন্য লিখুন", "Are you sure?": "আপনি নিশ্চিত?", @@ -120,7 +121,6 @@ "Custom": "কাস্টম", "Customize models for a specific purpose": "", "Dark": "ডার্ক", - "Dashboard": "ড্যাশবোর্ড", "Database": "ডেটাবেজ", "December": "ডেসেম্বর", "Default": "ডিফল্ট", @@ -133,9 +133,9 @@ "delete": "মুছে ফেলুন", "Delete": "মুছে ফেলুন", "Delete a model": "একটি মডেল মুছে ফেলুন", + "Delete All Chats": "", "Delete chat": "চ্যাট মুছে ফেলুন", "Delete Chat": "চ্যাট মুছে ফেলুন", - "Delete Chats": "চ্যাটগুলো মুছে ফেলুন", "delete this link": "এই লিংক মুছে ফেলুন", "Delete User": "ইউজার মুছে ফেলুন", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} মুছে ফেলা হয়েছে", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "OpenAI URL/Key আবশ্যক", "or": "অথবা", "Other": "অন্যান্য", - "Overview": "বিবরণ", "Password": "পাসওয়ার্ড", "PDF document (.pdf)": "PDF ডকুমেন্ট (.pdf)", "PDF Extract Images (OCR)": "পিডিএফ এর ছবি থেকে লেখা বের করুন (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "ডকুমেন্টসমূহের জন্য {{path}} স্ক্যান করুন", "Search": "অনুসন্ধান", "Search a model": "মডেল অনুসন্ধান করুন", + "Search Chats": "", "Search Documents": "ডকুমেন্টসমূহ অনুসন্ধান করুন", + "Search Models": "", "Search Prompts": "প্রম্পটসমূহ অনুসন্ধান করুন", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/ca-ES/translation.json b/src/lib/i18n/locales/ca-ES/translation.json index 4b1c9f9117..a0e81950ac 100644 --- a/src/lib/i18n/locales/ca-ES/translation.json +++ b/src/lib/i18n/locales/ca-ES/translation.json @@ -48,6 +48,7 @@ "API keys": "Claus de l'API", "April": "Abril", "Archive": "Arxiu", + "Archive All Chats": "", "Archived Chats": "Arxiu d'historial de xat", "are allowed - Activate this command by typing": "estan permesos - Activa aquesta comanda escrivint", "Are you sure?": "Estàs segur?", @@ -120,7 +121,6 @@ "Custom": "Personalitzat", "Customize models for a specific purpose": "", "Dark": "Fosc", - "Dashboard": "Tauler", "Database": "Base de Dades", "December": "Desembre", "Default": "Per defecte", @@ -133,9 +133,9 @@ "delete": "esborra", "Delete": "Esborra", "Delete a model": "Esborra un model", + "Delete All Chats": "", "Delete chat": "Esborra xat", "Delete Chat": "Esborra Xat", - "Delete Chats": "Esborra Xats", "delete this link": "Esborra aquest enllaç", "Delete User": "Esborra Usuari", "Deleted {{deleteModelTag}}": "Esborrat {{deleteModelTag}}", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "URL/Clau d'OpenAI requerides.", "or": "o", "Other": "Altres", - "Overview": "Visió general", "Password": "Contrasenya", "PDF document (.pdf)": "Document PDF (.pdf)", "PDF Extract Images (OCR)": "Extreu Imatges de PDF (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "Escaneja documents des de {{path}}", "Search": "Cerca", "Search a model": "Cerca un model", + "Search Chats": "", "Search Documents": "Cerca Documents", + "Search Models": "", "Search Prompts": "Cerca Prompts", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/ceb-PH/translation.json b/src/lib/i18n/locales/ceb-PH/translation.json index 3473ed27f8..b557230ed8 100644 --- a/src/lib/i18n/locales/ceb-PH/translation.json +++ b/src/lib/i18n/locales/ceb-PH/translation.json @@ -48,6 +48,7 @@ "API keys": "", "April": "", "Archive": "", + "Archive All Chats": "", "Archived Chats": "pagrekord sa chat", "are allowed - Activate this command by typing": "gitugotan - I-enable kini nga sugo pinaagi sa pag-type", "Are you sure?": "Sigurado ka ?", @@ -120,7 +121,6 @@ "Custom": "Custom", "Customize models for a specific purpose": "", "Dark": "Ngitngit", - "Dashboard": "", "Database": "Database", "December": "", "Default": "Pinaagi sa default", @@ -133,9 +133,9 @@ "delete": "DELETE", "Delete": "", "Delete a model": "Pagtangtang sa usa ka template", + "Delete All Chats": "", "Delete chat": "Pagtangtang sa panaghisgot", "Delete Chat": "", - "Delete Chats": "Pagtangtang sa mga chat", "delete this link": "", "Delete User": "", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} gipapas", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "", "or": "O", "Other": "", - "Overview": "", "Password": "Password", "PDF document (.pdf)": "", "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}}", "Search": "Pagpanukiduki", "Search a model": "", + "Search Chats": "", "Search Documents": "Pangitaa ang mga dokumento", + "Search Models": "", "Search Prompts": "Pangitaa ang mga prompt", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index b0bdc3b29f..d98adfd9c4 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -48,6 +48,7 @@ "API keys": "API Schlüssel", "April": "April", "Archive": "Archivieren", + "Archive All Chats": "", "Archived Chats": "Archivierte Chats", "are allowed - Activate this command by typing": "sind erlaubt - Aktiviere diesen Befehl, indem du", "Are you sure?": "Bist du sicher?", @@ -120,7 +121,6 @@ "Custom": "Benutzerdefiniert", "Customize models for a specific purpose": "", "Dark": "Dunkel", - "Dashboard": "Dashboard", "Database": "Datenbank", "December": "Dezember", "Default": "Standard", @@ -133,9 +133,9 @@ "delete": "löschen", "Delete": "Löschen", "Delete a model": "Ein Modell löschen", + "Delete All Chats": "", "Delete chat": "Chat löschen", "Delete Chat": "Chat löschen", - "Delete Chats": "Chats löschen", "delete this link": "diesen Link zu löschen", "Delete User": "Benutzer löschen", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} gelöscht", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "OpenAI URL/Key erforderlich.", "or": "oder", "Other": "Andere", - "Overview": "Übersicht", "Password": "Passwort", "PDF document (.pdf)": "PDF-Dokument (.pdf)", "PDF Extract Images (OCR)": "Text von Bildern aus PDFs extrahieren (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "Dokumente von {{path}} scannen", "Search": "Suchen", "Search a model": "Nach einem Modell suchen", + "Search Chats": "", "Search Documents": "Dokumente suchen", + "Search Models": "", "Search Prompts": "Prompts suchen", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/dg-DG/translation.json b/src/lib/i18n/locales/dg-DG/translation.json index dbf3d7827c..5338aa403a 100644 --- a/src/lib/i18n/locales/dg-DG/translation.json +++ b/src/lib/i18n/locales/dg-DG/translation.json @@ -48,6 +48,7 @@ "API keys": "", "April": "", "Archive": "", + "Archive All Chats": "", "Archived Chats": "", "are allowed - Activate this command by typing": "are allowed. Activate typing", "Are you sure?": "Such certainty?", @@ -120,7 +121,6 @@ "Custom": "Custom", "Customize models for a specific purpose": "", "Dark": "Dark", - "Dashboard": "", "Database": "Database", "December": "", "Default": "Default", @@ -133,9 +133,9 @@ "delete": "delete", "Delete": "", "Delete a model": "Delete a model", + "Delete All Chats": "", "Delete chat": "Delete chat", "Delete Chat": "", - "Delete Chats": "Delete Chats", "delete this link": "", "Delete User": "", "Deleted {{deleteModelTag}}": "Deleted {{deleteModelTag}}", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "", "or": "or", "Other": "", - "Overview": "", "Password": "Barkword", "PDF document (.pdf)": "", "PDF Extract Images (OCR)": "PDF Extract Wowmages (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "Scan for documents from {{path}} wow", "Search": "Search very search", "Search a model": "", + "Search Chats": "", "Search Documents": "Search Documents much find", + "Search Models": "", "Search Prompts": "Search Prompts much wow", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/en-GB/translation.json b/src/lib/i18n/locales/en-GB/translation.json index 30905a7efb..663b16a402 100644 --- a/src/lib/i18n/locales/en-GB/translation.json +++ b/src/lib/i18n/locales/en-GB/translation.json @@ -48,6 +48,7 @@ "API keys": "", "April": "", "Archive": "", + "Archive All Chats": "", "Archived Chats": "", "are allowed - Activate this command by typing": "", "Are you sure?": "", @@ -120,7 +121,6 @@ "Custom": "", "Customize models for a specific purpose": "", "Dark": "", - "Dashboard": "", "Database": "", "December": "", "Default": "", @@ -133,9 +133,9 @@ "delete": "", "Delete": "", "Delete a model": "", + "Delete All Chats": "", "Delete chat": "", "Delete Chat": "", - "Delete Chats": "", "delete this link": "", "Delete User": "", "Deleted {{deleteModelTag}}": "", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "", "or": "", "Other": "", - "Overview": "", "Password": "", "PDF document (.pdf)": "", "PDF Extract Images (OCR)": "", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "", "Search": "", "Search a model": "", + "Search Chats": "", "Search Documents": "", + "Search Models": "", "Search Prompts": "", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index 30905a7efb..663b16a402 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -48,6 +48,7 @@ "API keys": "", "April": "", "Archive": "", + "Archive All Chats": "", "Archived Chats": "", "are allowed - Activate this command by typing": "", "Are you sure?": "", @@ -120,7 +121,6 @@ "Custom": "", "Customize models for a specific purpose": "", "Dark": "", - "Dashboard": "", "Database": "", "December": "", "Default": "", @@ -133,9 +133,9 @@ "delete": "", "Delete": "", "Delete a model": "", + "Delete All Chats": "", "Delete chat": "", "Delete Chat": "", - "Delete Chats": "", "delete this link": "", "Delete User": "", "Deleted {{deleteModelTag}}": "", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "", "or": "", "Other": "", - "Overview": "", "Password": "", "PDF document (.pdf)": "", "PDF Extract Images (OCR)": "", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "", "Search": "", "Search a model": "", + "Search Chats": "", "Search Documents": "", + "Search Models": "", "Search Prompts": "", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/es-ES/translation.json b/src/lib/i18n/locales/es-ES/translation.json index 881839e554..30ba4a97e2 100644 --- a/src/lib/i18n/locales/es-ES/translation.json +++ b/src/lib/i18n/locales/es-ES/translation.json @@ -48,6 +48,7 @@ "API keys": "Claves de la API", "April": "Abril", "Archive": "Archivar", + "Archive All Chats": "", "Archived Chats": "Chats archivados", "are allowed - Activate this command by typing": "están permitidos - Active este comando escribiendo", "Are you sure?": "¿Está seguro?", @@ -120,7 +121,6 @@ "Custom": "Personalizado", "Customize models for a specific purpose": "", "Dark": "Oscuro", - "Dashboard": "Tablero", "Database": "Base de datos", "December": "Diciembre", "Default": "Por defecto", @@ -133,9 +133,9 @@ "delete": "borrar", "Delete": "Borrar", "Delete a model": "Borra un modelo", + "Delete All Chats": "", "Delete chat": "Borrar chat", "Delete Chat": "Borrar Chat", - "Delete Chats": "Borrar Chats", "delete this link": "Borrar este enlace", "Delete User": "Borrar Usuario", "Deleted {{deleteModelTag}}": "Se borró {{deleteModelTag}}", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "URL/Clave de OpenAI es requerida.", "or": "o", "Other": "Otro", - "Overview": "Resumen", "Password": "Contraseña", "PDF document (.pdf)": "PDF document (.pdf)", "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}}", "Search": "Buscar", "Search a model": "Buscar un modelo", + "Search Chats": "", "Search Documents": "Buscar Documentos", + "Search Models": "", "Search Prompts": "Buscar Prompts", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/fa-IR/translation.json b/src/lib/i18n/locales/fa-IR/translation.json index 34e0aba22e..f28e0ac622 100644 --- a/src/lib/i18n/locales/fa-IR/translation.json +++ b/src/lib/i18n/locales/fa-IR/translation.json @@ -48,6 +48,7 @@ "API keys": "API keys", "April": "ژوئن", "Archive": "آرشیو", + "Archive All Chats": "", "Archived Chats": "آرشیو تاریخچه چت", "are allowed - Activate this command by typing": "مجاز هستند - این دستور را با تایپ کردن این فعال کنید:", "Are you sure?": "آیا مطمئن هستید؟", @@ -120,7 +121,6 @@ "Custom": "دلخواه", "Customize models for a specific purpose": "", "Dark": "تیره", - "Dashboard": "داشبورد", "Database": "پایگاه داده", "December": "دسامبر", "Default": "پیشفرض", @@ -133,9 +133,9 @@ "delete": "حذف", "Delete": "حذف", "Delete a model": "حذف یک مدل", + "Delete All Chats": "", "Delete chat": "حذف گپ", "Delete Chat": "حذف گپ", - "Delete Chats": "حذف گپ\u200cها", "delete this link": "حذف این لینک", "Delete User": "حذف کاربر", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} پاک شد", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "URL/Key OpenAI مورد نیاز است.", "or": "روشن", "Other": "دیگر", - "Overview": "نمای کلی", "Password": "رمز عبور", "PDF document (.pdf)": "PDF سند (.pdf)", "PDF Extract Images (OCR)": "استخراج تصاویر از PDF (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "اسکن اسناد از {{path}}", "Search": "جستجو", "Search a model": "جستجوی مدل", + "Search Chats": "", "Search Documents": "جستجوی اسناد", + "Search Models": "", "Search Prompts": "جستجوی پرامپت\u200cها", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/fi-FI/translation.json b/src/lib/i18n/locales/fi-FI/translation.json index 034c960239..32d9d58b28 100644 --- a/src/lib/i18n/locales/fi-FI/translation.json +++ b/src/lib/i18n/locales/fi-FI/translation.json @@ -48,6 +48,7 @@ "API keys": "API-avaimet", "April": "huhtikuu", "Archive": "Arkisto", + "Archive All Chats": "", "Archived Chats": "Arkistoidut keskustelut", "are allowed - Activate this command by typing": "ovat sallittuja - Aktivoi tämä komento kirjoittamalla", "Are you sure?": "Oletko varma?", @@ -120,7 +121,6 @@ "Custom": "Mukautettu", "Customize models for a specific purpose": "", "Dark": "Tumma", - "Dashboard": "Kojelauta", "Database": "Tietokanta", "December": "joulukuu", "Default": "Oletus", @@ -133,9 +133,9 @@ "delete": "poista", "Delete": "Poista", "Delete a model": "Poista malli", + "Delete All Chats": "", "Delete chat": "Poista keskustelu", "Delete Chat": "Poista keskustelu", - "Delete Chats": "Poista keskustelut", "delete this link": "poista tämä linkki", "Delete User": "Poista käyttäjä", "Deleted {{deleteModelTag}}": "Poistettu {{deleteModelTag}}", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "OpenAI URL/ -avain vaaditaan.", "or": "tai", "Other": "Muu", - "Overview": "Yleiskatsaus", "Password": "Salasana", "PDF document (.pdf)": "PDF-tiedosto (.pdf)", "PDF Extract Images (OCR)": "PDF-tiedoston kuvien erottelu (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "Skannaa asiakirjoja polusta {{path}}", "Search": "Haku", "Search a model": "Hae mallia", + "Search Chats": "", "Search Documents": "Hae asiakirjoja", + "Search Models": "", "Search Prompts": "Hae kehotteita", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/fr-CA/translation.json b/src/lib/i18n/locales/fr-CA/translation.json index ac4cf61022..41736894e4 100644 --- a/src/lib/i18n/locales/fr-CA/translation.json +++ b/src/lib/i18n/locales/fr-CA/translation.json @@ -48,6 +48,7 @@ "API keys": "Clés API", "April": "Avril", "Archive": "Archiver", + "Archive All Chats": "", "Archived Chats": "enregistrement du chat", "are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant", "Are you sure?": "Êtes-vous sûr ?", @@ -120,7 +121,6 @@ "Custom": "Personnalisé", "Customize models for a specific purpose": "", "Dark": "Sombre", - "Dashboard": "Tableau de bord", "Database": "Base de données", "December": "Décembre", "Default": "Par défaut", @@ -133,9 +133,9 @@ "delete": "supprimer", "Delete": "Supprimer", "Delete a model": "Supprimer un modèle", + "Delete All Chats": "", "Delete chat": "Supprimer la discussion", "Delete Chat": "Supprimer la discussion", - "Delete Chats": "Supprimer les discussions", "delete this link": "supprimer ce lien", "Delete User": "Supprimer l'utilisateur", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} supprimé", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "L'URL/Clé OpenAI est requise.", "or": "ou", "Other": "Autre", - "Overview": "Aperçu", "Password": "Mot de passe", "PDF document (.pdf)": "Document PDF (.pdf)", "PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "Scanner des documents depuis {{path}}", "Search": "Recherche", "Search a model": "Rechercher un modèle", + "Search Chats": "", "Search Documents": "Rechercher des documents", + "Search Models": "", "Search Prompts": "Rechercher des prompts", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/fr-FR/translation.json b/src/lib/i18n/locales/fr-FR/translation.json index f786c1619b..ddbc2a4356 100644 --- a/src/lib/i18n/locales/fr-FR/translation.json +++ b/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.", "(Beta)": "(Bêta)", "(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...", - "{{user}}'s Chats": "{{user}}'s Chats", + "{{user}}'s Chats": "Chats de {{user}}", "{{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 user": "un utilisateur", - "About": "À propos", + "About": "À Propos", "Account": "Compte", "Accurate information": "Information précise", "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 tag": "Ajouter un tag", "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 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.", - "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 Documents": "Tous les documents", - "All Users": "Tous les utilisateurs", + "All Documents": "Tous les Documents", + "All Users": "Tous les Utilisateurs", "Allow": "Autoriser", "Allow Chat Deletion": "Autoriser la suppression du chat", "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é.", "API Base URL": "URL de base de l'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", "April": "Avril", "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 you sure?": "Êtes-vous sûr ?", "Attach file": "Joindre un fichier", @@ -61,16 +62,16 @@ "AUTOMATIC1111 Base URL is required.": "L'URL de base AUTOMATIC1111 est requise.", "available!": "disponible !", "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", - "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", - "Capabilities": "", + "Capabilities": "Capacités", "Change Password": "Changer le mot de passe", "Chat": "Chat", - "Chat Bubble UI": "Chat Bubble UI", + "Chat Bubble UI": "UI Bulles de Chat", "Chat direction": "Direction du chat", "Chat History": "Historique du chat", "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 Params": "Paramètres de bloc", "Chunk Size": "Taille de bloc", - "Citation": "Citations", + "Citation": "Citation", "Click here for help.": "Cliquez ici pour de l'aide.", "Click here to": "Cliquez ici pour", "Click here to select": "Cliquez ici pour sélectionner", @@ -93,34 +94,33 @@ "Close": "Fermer", "Collection": "Collection", "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", "Confirm Password": "Confirmer le mot de passe", "Connections": "Connexions", "Content": "Contenu", "Context Length": "Longueur du contexte", - "Continue Response": "Continuer la réponse", + "Continue Response": "Continuer la Réponse", "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 last code block": "Copier le dernier bloc de code", "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 !", "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 new key": "Créer une nouvelle clé", "Create new secret key": "Créer une nouvelle clé secrète", "Created at": "Créé le", - "Created At": "Créé le", + "Created At": "Crée Le", "Current Model": "Modèle actuel", "Current Password": "Mot de passe actuel", "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", - "Dashboard": "Tableau de bord", "Database": "Base de données", "December": "Décembre", "Default": "Par défaut", @@ -133,17 +133,17 @@ "delete": "supprimer", "Delete": "Supprimer", "Delete a model": "Supprimer un modèle", + "Delete All Chats": "", "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 User": "Supprimer l'utilisateur", + "Delete User": "Supprimer l'Utilisateur", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} supprimé", - "Deleted {{name}}": "", + "Deleted {{name}}": "{{name}} supprimé", "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é", - "Discover a model": "", + "Discover a model": "Découvrir un modèle", "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 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.", "Don't Allow": "Ne pas autoriser", "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 canceled": "Téléchargement annulé", "Download Database": "Télécharger la base de données", @@ -164,85 +164,85 @@ "Edit Doc": "Éditer le document", "Edit User": "Éditer l'utilisateur", "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}}\"", "Enable Chat History": "Activer l'historique du chat", "Enable New Sign Ups": "Activer les nouvelles inscriptions", "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 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 Size": "Entrez la taille du bloc", "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 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 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://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", - "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", "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é.", - "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", "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 :", - "Frequencey Penalty": "", + "Frequencey Penalty": "Pénalité de Fréquence", "Full Screen Mode": "Mode plein écran", "General": "Général", - "General Settings": "Paramètres généraux", + "General Settings": "Paramètres Généraux", "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", "has no conversations.": "n'a pas de conversations.", "Hello, {{name}}": "Bonjour, {{name}}", "Help": "Aide", "Hide": "Cacher", "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", - "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", "Input commands": "Entrez les commandes d'entrée", "Interface": "Interface", - "Invalid Tag": "Tag invalide", + "Invalid Tag": "Tag Invalide", "January": "Janvier", "join our Discord for help.": "rejoignez notre Discord pour obtenir de l'aide.", "JSON": "JSON", - "JSON Preview": "", + "JSON Preview": "Aperçu JSON", "July": "Juillet", "June": "Juin", "JWT Expiration": "Expiration JWT", "JWT Token": "Jeton JWT", - "Keep Alive": "Garder en vie", + "Keep Alive": "Rester en vie", "Keyboard shortcuts": "Raccourcis clavier", "Language": "Langue", - "Last Active": "Dernière activité", + "Last Active": "Dernier Activité", "Light": "Clair", "Listening...": "Écoute...", "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 Ollama Models": "Gérer les modèles Ollama", "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.", "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", - "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 Eta": "Mirostat Eta", "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 '{{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 {{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 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", "More": "Plus", "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 Password": "Nouveau mot de passe", - "No results found": "Aucun résultat trouvé", + "No results found": "Aucun résultat", "No search query generated": "", "No search results found": "", "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", "November": "Novembre", "October": "Octobre", "Off": "Désactivé", "Okay, Let's Go!": "D'accord, allons-y !", - "OLED Dark": "OLED Sombre", + "OLED Dark": "Sombre OLED", "Ollama": "Ollama", - "Ollama API": "", + "Ollama API": "API Ollama", "Ollama Version": "Version Ollama", "On": "Activé", "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.", "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 AI": "Open AI", "Open AI (Dall-E)": "Open AI (Dall-E)", "Open new chat": "Ouvrir un nouveau chat", "OpenAI": "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", "Other": "Autre", - "Overview": "Aperçu", "Password": "Mot de passe", "PDF document (.pdf)": "Document PDF (.pdf)", "PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)", "pending": "en attente", "Permission denied when accessing microphone: {{error}}": "Permission refusée lors de l'accès au microphone : {{error}}", "Personalization": "Personnalisation", - "Plain text (.txt)": "Texte brut (.txt)", + "Plain text (.txt)": "Texte Brute (.txt)", "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 (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 suggestions": "Suggestions de prompt", "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", - "Read Aloud": "Lire à l'oreille", + "Read Aloud": "Lire à Voix Haute", "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", - "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", "Rosé Pine": "Pin Rosé", "Rosé Pine Dawn": "Aube Pin Rosé", @@ -365,37 +364,39 @@ "Scan for documents from {{path}}": "Scanner des documents depuis {{path}}", "Search": "Recherche", "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": "", "Searching the web for '{{searchQuery}}'": "", "See readme.md for instructions": "Voir readme.md pour les instructions", "See what's new": "Voir les nouveautés", "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 an Ollama instance": "Sélectionner une instance Ollama", "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 a Message": "Envoyer un message", "Send message": "Envoyer un message", "September": "Septembre", "Server connection verified": "Connexion au serveur vérifiée", "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 Voice": "Définir la voix", + "Set Voice": "Définir la Voix", "Settings": "Paramètres", "Settings saved successfully!": "Paramètres enregistrés avec succès !", "Share": "Partager", - "Share Chat": "Partager le chat", + "Share Chat": "Partager le Chat", "Share to OpenWebUI Community": "Partager avec la communauté OpenWebUI", "short-summary": "résumé court", "Show": "Montrer", @@ -408,36 +409,36 @@ "Signing in": "Connexion en cours", "Source": "Source", "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.", - "Stop Sequence": "Séquence d'arrêt", + "Stop Sequence": "Séquence d'Arrêt", "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", "Successfully updated.": "Mis à jour avec succès.", "Suggested": "Suggéré", "System": "Système", - "System Prompt": "Invite de système", + "System Prompt": "Prompt du Système", "Tags": "Tags", - "Tell us more:": "Donnez-nous plus:", + "Tell us more:": "Dites-nous en plus :", "Temperature": "Température", "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", - "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", "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.", - "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 (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 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,", @@ -449,11 +450,11 @@ "Top P": "Top P", "Trouble accessing Ollama?": "Problèmes d'accès à Ollama ?", "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}}.", - "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 files": "Téléverser des fichiers", "Upload Progress": "Progression du Téléversement", @@ -469,29 +470,29 @@ "variable": "variable", "variable to have them replaced with clipboard content.": "variable pour les remplacer par le contenu du presse-papiers.", "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 Loader Settings": "Paramètres du chargeur Web", + "Web Loader Settings": "Paramètres du Chargeur Web", "Web Params": "Paramètres Web", "Web Search Disabled": "", "Web Search Enabled": "", - "Webhook URL": "URL Webhook", + "Webhook URL": "URL du Webhook", "WebUI Add-ons": "Add-ons WebUI", "WebUI Settings": "Paramètres WebUI", "WebUI will make requests to": "WebUI effectuera des demandes à", "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.", "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 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é.", "Youtube": "Youtube", - "Youtube Loader Settings": "Paramètres du chargeur de Youtube" + "Youtube Loader Settings": "Paramètres du Chargeur YouTube" } diff --git a/src/lib/i18n/locales/he-IL/translation.json b/src/lib/i18n/locales/he-IL/translation.json index 4999f59265..162c5e9ba8 100644 --- a/src/lib/i18n/locales/he-IL/translation.json +++ b/src/lib/i18n/locales/he-IL/translation.json @@ -48,6 +48,7 @@ "API keys": "מפתחות API", "April": "אפריל", "Archive": "ארכיון", + "Archive All Chats": "", "Archived Chats": "צ'אטים מאורכבים", "are allowed - Activate this command by typing": "מותרים - הפעל פקודה זו על ידי הקלדה", "Are you sure?": "האם אתה בטוח?", @@ -120,7 +121,6 @@ "Custom": "מותאם אישית", "Customize models for a specific purpose": "", "Dark": "כהה", - "Dashboard": "לוח בקרה", "Database": "מסד נתונים", "December": "דצמבר", "Default": "ברירת מחדל", @@ -133,9 +133,9 @@ "delete": "מחק", "Delete": "מחק", "Delete a model": "מחק מודל", + "Delete All Chats": "", "Delete chat": "מחק צ'אט", "Delete Chat": "מחק צ'אט", - "Delete Chats": "מחק צ'אטים", "delete this link": "מחק את הקישור הזה", "Delete User": "מחק משתמש", "Deleted {{deleteModelTag}}": "נמחק {{deleteModelTag}}", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "נדרשת כתובת URL/מפתח של OpenAI.", "or": "או", "Other": "אחר", - "Overview": "סקירה כללית", "Password": "סיסמה", "PDF document (.pdf)": "מסמך PDF (.pdf)", "PDF Extract Images (OCR)": "חילוץ תמונות מ-PDF (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "סרוק מסמכים מ-{{path}}", "Search": "חפש", "Search a model": "חפש מודל", + "Search Chats": "", "Search Documents": "חפש מסמכים", + "Search Models": "", "Search Prompts": "חפש פקודות", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/hi-IN/translation.json b/src/lib/i18n/locales/hi-IN/translation.json index 2bd9757ea4..88c44d3737 100644 --- a/src/lib/i18n/locales/hi-IN/translation.json +++ b/src/lib/i18n/locales/hi-IN/translation.json @@ -48,6 +48,7 @@ "API keys": "एपीआई कुंजियाँ", "April": "अप्रैल", "Archive": "पुरालेख", + "Archive All Chats": "", "Archived Chats": "संग्रहीत चैट", "are allowed - Activate this command by typing": "अनुमति है - टाइप करके इस कमांड को सक्रिय करें", "Are you sure?": "क्या आपको यकीन है?", @@ -120,7 +121,6 @@ "Custom": "कस्टम संस्करण", "Customize models for a specific purpose": "", "Dark": "डार्क", - "Dashboard": "डैशबोर्ड", "Database": "डेटाबेस", "December": "डिसेंबर", "Default": "डिफ़ॉल्ट", @@ -133,9 +133,9 @@ "delete": "डिलीट", "Delete": "डिलीट", "Delete a model": "एक मॉडल हटाएँ", + "Delete All Chats": "", "Delete chat": "चैट हटाएं", "Delete Chat": "चैट हटाएं", - "Delete Chats": "चैट हटाएं", "delete this link": "इस लिंक को हटाएं", "Delete User": "उपभोक्ता मिटायें", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} हटा दिया गया", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "OpenAI URL/Key आवश्यक है।", "or": "या", "Other": "अन्य", - "Overview": "अवलोकन", "Password": "पासवर्ड", "PDF document (.pdf)": "PDF दस्तावेज़ (.pdf)", "PDF Extract Images (OCR)": "PDF छवियाँ निकालें (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "{{path}} से दस्तावेज़ों को स्कैन करें", "Search": "खोजें", "Search a model": "एक मॉडल खोजें", + "Search Chats": "", "Search Documents": "दस्तावेज़ खोजें", + "Search Models": "", "Search Prompts": "प्रॉम्प्ट खोजें", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/hr-HR/translation.json b/src/lib/i18n/locales/hr-HR/translation.json index 7df2e7a050..4a6e433126 100644 --- a/src/lib/i18n/locales/hr-HR/translation.json +++ b/src/lib/i18n/locales/hr-HR/translation.json @@ -48,6 +48,7 @@ "API keys": "API ključevi", "April": "Travanj", "Archive": "Arhiva", + "Archive All Chats": "", "Archived Chats": "Arhivirani razgovori", "are allowed - Activate this command by typing": "su dopušteni - Aktivirajte ovu naredbu upisivanjem", "Are you sure?": "Jeste li sigurni?", @@ -120,7 +121,6 @@ "Custom": "Prilagođeno", "Customize models for a specific purpose": "", "Dark": "Tamno", - "Dashboard": "Nadzorna ploča", "Database": "Baza podataka", "December": "Prosinac", "Default": "Zadano", @@ -133,9 +133,9 @@ "delete": "izbriši", "Delete": "Izbriši", "Delete a model": "Izbriši model", + "Delete All Chats": "", "Delete chat": "Izbriši razgovor", "Delete Chat": "Izbriši razgovor", - "Delete Chats": "Izbriši razgovore", "delete this link": "izbriši ovu vezu", "Delete User": "Izbriši korisnika", "Deleted {{deleteModelTag}}": "Izbrisan {{deleteModelTag}}", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "Potreban je OpenAI URL/ključ.", "or": "ili", "Other": "Ostalo", - "Overview": "Pregled", "Password": "Lozinka", "PDF document (.pdf)": "PDF dokument (.pdf)", "PDF Extract Images (OCR)": "PDF izdvajanje slika (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "Skeniraj dokumente s {{path}}", "Search": "Pretraga", "Search a model": "Pretraži model", + "Search Chats": "", "Search Documents": "Pretraga dokumenata", + "Search Models": "", "Search Prompts": "Pretraga prompta", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/it-IT/translation.json b/src/lib/i18n/locales/it-IT/translation.json index 292991c63b..c8409d3643 100644 --- a/src/lib/i18n/locales/it-IT/translation.json +++ b/src/lib/i18n/locales/it-IT/translation.json @@ -48,6 +48,7 @@ "API keys": "Chiavi API", "April": "Aprile", "Archive": "Archivio", + "Archive All Chats": "", "Archived Chats": "Chat archiviate", "are allowed - Activate this command by typing": "sono consentiti - Attiva questo comando digitando", "Are you sure?": "Sei sicuro?", @@ -120,7 +121,6 @@ "Custom": "Personalizzato", "Customize models for a specific purpose": "", "Dark": "Scuro", - "Dashboard": "Pannello di controllo", "Database": "Database", "December": "Dicembre", "Default": "Predefinito", @@ -133,9 +133,9 @@ "delete": "elimina", "Delete": "Elimina", "Delete a model": "Elimina un modello", + "Delete All Chats": "", "Delete chat": "Elimina chat", "Delete Chat": "Elimina chat", - "Delete Chats": "Elimina le chat", "delete this link": "elimina questo link", "Delete User": "Elimina utente", "Deleted {{deleteModelTag}}": "Eliminato {{deleteModelTag}}", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "URL/Chiave OpenAI obbligatori.", "or": "o", "Other": "Altro", - "Overview": "Panoramica", "Password": "Password", "PDF document (.pdf)": "Documento PDF (.pdf)", "PDF Extract Images (OCR)": "Estrazione immagini PDF (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "Cerca documenti da {{path}}", "Search": "Cerca", "Search a model": "Cerca un modello", + "Search Chats": "", "Search Documents": "Cerca documenti", + "Search Models": "", "Search Prompts": "Cerca prompt", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/ja-JP/translation.json b/src/lib/i18n/locales/ja-JP/translation.json index e6993cec6a..1afe630300 100644 --- a/src/lib/i18n/locales/ja-JP/translation.json +++ b/src/lib/i18n/locales/ja-JP/translation.json @@ -48,6 +48,7 @@ "API keys": "API キー", "April": "4月", "Archive": "アーカイブ", + "Archive All Chats": "", "Archived Chats": "チャット記録", "are allowed - Activate this command by typing": "が許可されています - 次のように入力してこのコマンドをアクティブ化します", "Are you sure?": "よろしいですか?", @@ -120,7 +121,6 @@ "Custom": "カスタム", "Customize models for a specific purpose": "", "Dark": "ダーク", - "Dashboard": "ダッシュボード", "Database": "データベース", "December": "12月", "Default": "デフォルト", @@ -133,9 +133,9 @@ "delete": "削除", "Delete": "削除", "Delete a model": "モデルを削除", + "Delete All Chats": "", "Delete chat": "チャットを削除", "Delete Chat": "チャットを削除", - "Delete Chats": "チャットを削除", "delete this link": "このリンクを削除します", "Delete User": "ユーザーを削除", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} を削除しました", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "OpenAI URL/Key が必要です。", "or": "または", "Other": "その他", - "Overview": "概要", "Password": "パスワード", "PDF document (.pdf)": "PDF ドキュメント (.pdf)", "PDF Extract Images (OCR)": "PDF 画像抽出 (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "{{path}} からドキュメントをスキャン", "Search": "検索", "Search a model": "モデルを検索", + "Search Chats": "", "Search Documents": "ドキュメントを検索", + "Search Models": "", "Search Prompts": "プロンプトを検索", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/ka-GE/translation.json b/src/lib/i18n/locales/ka-GE/translation.json index 0e4b72d8da..a3984feac1 100644 --- a/src/lib/i18n/locales/ka-GE/translation.json +++ b/src/lib/i18n/locales/ka-GE/translation.json @@ -48,6 +48,7 @@ "API keys": "API გასაღები", "April": "აპრილი", "Archive": "არქივი", + "Archive All Chats": "", "Archived Chats": "ჩატის ისტორიის არქივი", "are allowed - Activate this command by typing": "დაშვებულია - ბრძანების გასააქტიურებლად აკრიფეთ:", "Are you sure?": "დარწმუნებული ხარ?", @@ -120,7 +121,6 @@ "Custom": "საკუთარი", "Customize models for a specific purpose": "", "Dark": "მუქი", - "Dashboard": "პანელი", "Database": "მონაცემთა ბაზა", "December": "დეკემბერი", "Default": "დეფოლტი", @@ -133,9 +133,9 @@ "delete": "წაშლა", "Delete": "წაშლა", "Delete a model": "მოდელის წაშლა", + "Delete All Chats": "", "Delete chat": "შეტყობინების წაშლა", "Delete Chat": "შეტყობინების წაშლა", - "Delete Chats": "შეტყობინებების წაშლა", "delete this link": "ბმულის წაშლა", "Delete User": "მომხმარებლის წაშლა", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} წაშლილია", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "OpenAI URL/Key აუცილებელია", "or": "ან", "Other": "სხვა", - "Overview": "ოვერვიუ", "Password": "პაროლი", "PDF document (.pdf)": "PDF დოკუმენტი (.pdf)", "PDF Extract Images (OCR)": "PDF იდან ამოღებული სურათები (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "დოკუმენტების სკანირება {{ path}}-დან", "Search": "ძიება", "Search a model": "მოდელის ძიება", + "Search Chats": "", "Search Documents": "დოკუმენტების ძიება", + "Search Models": "", "Search Prompts": "მოთხოვნების ძიება", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/ko-KR/translation.json b/src/lib/i18n/locales/ko-KR/translation.json index 9f325091ab..cee383d5dd 100644 --- a/src/lib/i18n/locales/ko-KR/translation.json +++ b/src/lib/i18n/locales/ko-KR/translation.json @@ -48,6 +48,7 @@ "API keys": "API 키", "April": "4월", "Archive": "아카이브", + "Archive All Chats": "", "Archived Chats": "채팅 기록 아카이브", "are allowed - Activate this command by typing": "허용됩니다 - 이 명령을 활성화하려면 입력하세요.", "Are you sure?": "확실합니까?", @@ -120,7 +121,6 @@ "Custom": "사용자 정의", "Customize models for a specific purpose": "", "Dark": "어두운", - "Dashboard": "대시보드", "Database": "데이터베이스", "December": "12월", "Default": "기본값", @@ -133,9 +133,9 @@ "delete": "삭제", "Delete": "삭제", "Delete a model": "모델 삭제", + "Delete All Chats": "", "Delete chat": "채팅 삭제", "Delete Chat": "채팅 삭제", - "Delete Chats": "채팅들 삭제", "delete this link": "이 링크를 삭제합니다.", "Delete User": "사용자 삭제", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} 삭제됨", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "OpenAI URL/Key가 필요합니다.", "or": "또는", "Other": "기타", - "Overview": "개요", "Password": "비밀번호", "PDF document (.pdf)": "PDF 문서 (.pdf)", "PDF Extract Images (OCR)": "PDF에서 이미지 추출 (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "{{path}}에서 문서 스캔", "Search": "검색", "Search a model": "모델 검색", + "Search Chats": "", "Search Documents": "문서 검색", + "Search Models": "", "Search Prompts": "프롬프트 검색", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/nl-NL/translation.json b/src/lib/i18n/locales/nl-NL/translation.json index 465e0b2f2f..b5c4b12aa4 100644 --- a/src/lib/i18n/locales/nl-NL/translation.json +++ b/src/lib/i18n/locales/nl-NL/translation.json @@ -48,6 +48,7 @@ "API keys": "API keys", "April": "April", "Archive": "Archief", + "Archive All Chats": "", "Archived Chats": "chatrecord", "are allowed - Activate this command by typing": "zijn toegestaan - Activeer deze commando door te typen", "Are you sure?": "Zeker weten?", @@ -120,7 +121,6 @@ "Custom": "Aangepast", "Customize models for a specific purpose": "", "Dark": "Donker", - "Dashboard": "Dashboard", "Database": "Database", "December": "December", "Default": "Standaard", @@ -133,9 +133,9 @@ "delete": "verwijderen", "Delete": "Verwijderen", "Delete a model": "Verwijder een model", + "Delete All Chats": "", "Delete chat": "Verwijder chat", "Delete Chat": "Verwijder Chat", - "Delete Chats": "Verwijder Chats", "delete this link": "verwijder deze link", "Delete User": "Verwijder Gebruiker", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} is verwijderd", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "OpenAI URL/Sleutel vereist.", "or": "of", "Other": "Andere", - "Overview": "Overzicht", "Password": "Wachtwoord", "PDF document (.pdf)": "PDF document (.pdf)", "PDF Extract Images (OCR)": "PDF Extract Afbeeldingen (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "Scan voor documenten van {{path}}", "Search": "Zoeken", "Search a model": "Zoek een model", + "Search Chats": "", "Search Documents": "Zoek Documenten", + "Search Models": "", "Search Prompts": "Zoek Prompts", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/pa-IN/translation.json b/src/lib/i18n/locales/pa-IN/translation.json index b1da9cb116..30738ad74d 100644 --- a/src/lib/i18n/locales/pa-IN/translation.json +++ b/src/lib/i18n/locales/pa-IN/translation.json @@ -48,6 +48,7 @@ "API keys": "API ਕੁੰਜੀਆਂ", "April": "ਅਪ੍ਰੈਲ", "Archive": "ਆਰਕਾਈਵ", + "Archive All Chats": "", "Archived Chats": "ਆਰਕਾਈਵ ਕੀਤੀਆਂ ਗੱਲਾਂ", "are allowed - Activate this command by typing": "ਅਨੁਮਤ ਹਨ - ਇਸ ਕਮਾਂਡ ਨੂੰ ਟਾਈਪ ਕਰਕੇ ਸਰਗਰਮ ਕਰੋ", "Are you sure?": "ਕੀ ਤੁਸੀਂ ਯਕੀਨਨ ਹੋ?", @@ -120,7 +121,6 @@ "Custom": "ਕਸਟਮ", "Customize models for a specific purpose": "", "Dark": "ਗੂੜ੍ਹਾ", - "Dashboard": "ਡੈਸ਼ਬੋਰਡ", "Database": "ਡਾਟਾਬੇਸ", "December": "ਦਸੰਬਰ", "Default": "ਮੂਲ", @@ -133,9 +133,9 @@ "delete": "ਮਿਟਾਓ", "Delete": "ਮਿਟਾਓ", "Delete a model": "ਇੱਕ ਮਾਡਲ ਮਿਟਾਓ", + "Delete All Chats": "", "Delete chat": "ਗੱਲਬਾਤ ਮਿਟਾਓ", "Delete Chat": "ਗੱਲਬਾਤ ਮਿਟਾਓ", - "Delete Chats": "ਗੱਲਾਂ ਮਿਟਾਓ", "delete this link": "ਇਸ ਲਿੰਕ ਨੂੰ ਮਿਟਾਓ", "Delete User": "ਉਪਭੋਗਤਾ ਮਿਟਾਓ", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} ਮਿਟਾਇਆ ਗਿਆ", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "ਓਪਨਏਆਈ URL/ਕੁੰਜੀ ਦੀ ਲੋੜ ਹੈ।", "or": "ਜਾਂ", "Other": "ਹੋਰ", - "Overview": "ਸੰਖੇਪ", "Password": "ਪਾਸਵਰਡ", "PDF document (.pdf)": "PDF ਡਾਕੂਮੈਂਟ (.pdf)", "PDF Extract Images (OCR)": "PDF ਚਿੱਤਰ ਕੱਢੋ (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "{{path}} ਤੋਂ ਡਾਕੂਮੈਂਟਾਂ ਲਈ ਸਕੈਨ ਕਰੋ", "Search": "ਖੋਜ", "Search a model": "ਇੱਕ ਮਾਡਲ ਖੋਜੋ", + "Search Chats": "", "Search Documents": "ਡਾਕੂਮੈਂਟ ਖੋਜੋ", + "Search Models": "", "Search Prompts": "ਪ੍ਰੰਪਟ ਖੋਜੋ", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/pl-PL/translation.json b/src/lib/i18n/locales/pl-PL/translation.json index 58ed395c7e..d643bc9f69 100644 --- a/src/lib/i18n/locales/pl-PL/translation.json +++ b/src/lib/i18n/locales/pl-PL/translation.json @@ -48,6 +48,7 @@ "API keys": "Klucze API", "April": "Kwiecień", "Archive": "Archiwum", + "Archive All Chats": "", "Archived Chats": "Zarchiwizowane czaty", "are allowed - Activate this command by typing": "są dozwolone - Aktywuj to polecenie, wpisując", "Are you sure?": "Jesteś pewien?", @@ -120,7 +121,6 @@ "Custom": "Niestandardowy", "Customize models for a specific purpose": "", "Dark": "Ciemny", - "Dashboard": "Dashboard", "Database": "Baza danych", "December": "Grudzień", "Default": "Domyślny", @@ -133,9 +133,9 @@ "delete": "usuń", "Delete": "Usuń", "Delete a model": "Usuń model", + "Delete All Chats": "", "Delete chat": "Usuń czat", "Delete Chat": "Usuń czat", - "Delete Chats": "Usuń czaty", "delete this link": "usuń ten link", "Delete User": "Usuń użytkownika", "Deleted {{deleteModelTag}}": "Usunięto {{deleteModelTag}}", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "URL/Klucz OpenAI jest wymagany.", "or": "lub", "Other": "Inne", - "Overview": "Przegląd", "Password": "Hasło", "PDF document (.pdf)": "Dokument PDF (.pdf)", "PDF Extract Images (OCR)": "PDF Wyodrębnij obrazy (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "Skanuj dokumenty z {{path}}", "Search": "Szukaj", "Search a model": "Szukaj modelu", + "Search Chats": "", "Search Documents": "Szukaj dokumentów", + "Search Models": "", "Search Prompts": "Szukaj promptów", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index d21e2b6a19..c55c8a38a9 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -48,6 +48,7 @@ "API keys": "Chaves da API", "April": "Abril", "Archive": "Arquivo", + "Archive All Chats": "", "Archived Chats": "Bate-papos arquivados", "are allowed - Activate this command by typing": "são permitidos - Ative este comando digitando", "Are you sure?": "Tem certeza?", @@ -120,7 +121,6 @@ "Custom": "Personalizado", "Customize models for a specific purpose": "", "Dark": "Escuro", - "Dashboard": "Painel", "Database": "Banco de dados", "December": "Dezembro", "Default": "Padrão", @@ -133,9 +133,9 @@ "delete": "excluir", "Delete": "Excluir", "Delete a model": "Excluir um modelo", + "Delete All Chats": "", "Delete chat": "Excluir bate-papo", "Delete Chat": "Excluir Bate-papo", - "Delete Chats": "Excluir Bate-papos", "delete this link": "excluir este link", "Delete User": "Excluir Usuário", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} excluído", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "URL/Chave da API OpenAI é necessária.", "or": "ou", "Other": "Outro", - "Overview": "Visão Geral", "Password": "Senha", "PDF document (.pdf)": "Documento PDF (.pdf)", "PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "Digitalizar documentos de {{path}}", "Search": "Pesquisar", "Search a model": "Pesquisar um modelo", + "Search Chats": "", "Search Documents": "Pesquisar Documentos", + "Search Models": "", "Search Prompts": "Pesquisar Prompts", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/pt-PT/translation.json b/src/lib/i18n/locales/pt-PT/translation.json index 8f674f2550..3c2b72b723 100644 --- a/src/lib/i18n/locales/pt-PT/translation.json +++ b/src/lib/i18n/locales/pt-PT/translation.json @@ -48,6 +48,7 @@ "API keys": "Chaves da API", "April": "Abril", "Archive": "Arquivo", + "Archive All Chats": "", "Archived Chats": "Bate-papos arquivados", "are allowed - Activate this command by typing": "são permitidos - Ative este comando digitando", "Are you sure?": "Tem certeza?", @@ -120,7 +121,6 @@ "Custom": "Personalizado", "Customize models for a specific purpose": "", "Dark": "Escuro", - "Dashboard": "Painel", "Database": "Banco de dados", "December": "Dezembro", "Default": "Padrão", @@ -133,9 +133,9 @@ "delete": "excluir", "Delete": "Excluir", "Delete a model": "Excluir um modelo", + "Delete All Chats": "", "Delete chat": "Excluir bate-papo", "Delete Chat": "Excluir Bate-papo", - "Delete Chats": "Excluir Bate-papos", "delete this link": "excluir este link", "Delete User": "Excluir Usuário", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} excluído", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "URL/Chave da API OpenAI é necessária.", "or": "ou", "Other": "Outro", - "Overview": "Visão Geral", "Password": "Senha", "PDF document (.pdf)": "Documento PDF (.pdf)", "PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "Digitalizar documentos de {{path}}", "Search": "Pesquisar", "Search a model": "Pesquisar um modelo", + "Search Chats": "", "Search Documents": "Pesquisar Documentos", + "Search Models": "", "Search Prompts": "Pesquisar Prompts", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/ru-RU/translation.json b/src/lib/i18n/locales/ru-RU/translation.json index 6c2c2098bb..4bd94cadcc 100644 --- a/src/lib/i18n/locales/ru-RU/translation.json +++ b/src/lib/i18n/locales/ru-RU/translation.json @@ -48,6 +48,7 @@ "API keys": "Ключи API", "April": "Апрель", "Archive": "Архив", + "Archive All Chats": "", "Archived Chats": "запис на чат", "are allowed - Activate this command by typing": "разрешено - активируйте эту команду вводом", "Are you sure?": "Вы уверены?", @@ -120,7 +121,6 @@ "Custom": "Пользовательский", "Customize models for a specific purpose": "", "Dark": "Тёмный", - "Dashboard": "Панель управления", "Database": "База данных", "December": "Декабрь", "Default": "По умолчанию", @@ -133,9 +133,9 @@ "delete": "удалить", "Delete": "Удалить", "Delete a model": "Удалить модель", + "Delete All Chats": "", "Delete chat": "Удалить чат", "Delete Chat": "Удалить чат", - "Delete Chats": "Удалить чаты", "delete this link": "удалить эту ссылку", "Delete User": "Удалить пользователя", "Deleted {{deleteModelTag}}": "Удалено {{deleteModelTag}}", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "Требуется URL-адрес API OpenAI или ключ API.", "or": "или", "Other": "Прочее", - "Overview": "Обзор", "Password": "Пароль", "PDF document (.pdf)": "PDF-документ (.pdf)", "PDF Extract Images (OCR)": "Извлечение изображений из PDF (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "Сканирование документов из {{path}}", "Search": "Поиск", "Search a model": "Поиск модели", + "Search Chats": "", "Search Documents": "Поиск документов", + "Search Models": "", "Search Prompts": "Поиск промтов", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/sr-RS/translation.json b/src/lib/i18n/locales/sr-RS/translation.json index 1c7834da6d..448ec039af 100644 --- a/src/lib/i18n/locales/sr-RS/translation.json +++ b/src/lib/i18n/locales/sr-RS/translation.json @@ -48,6 +48,7 @@ "API keys": "API кључеви", "April": "Април", "Archive": "Архива", + "Archive All Chats": "", "Archived Chats": "Архивирана ћаскања", "are allowed - Activate this command by typing": "су дозвољени - Покрените ову наредбу уношењем", "Are you sure?": "Да ли сте сигурни?", @@ -120,7 +121,6 @@ "Custom": "Прилагођено", "Customize models for a specific purpose": "", "Dark": "Тамна", - "Dashboard": "Контролна табла", "Database": "База података", "December": "Децембар", "Default": "Подразумевано", @@ -133,9 +133,9 @@ "delete": "обриши", "Delete": "Обриши", "Delete a model": "Обриши модел", + "Delete All Chats": "", "Delete chat": "Обриши ћаскање", "Delete Chat": "Обриши ћаскање", - "Delete Chats": "Обриши ћаскања", "delete this link": "обриши ову везу", "Delete User": "Обриши корисника", "Deleted {{deleteModelTag}}": "Обрисано {{deleteModelTag}}", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "Потребан је OpenAI URL/кључ.", "or": "или", "Other": "Остало", - "Overview": "Преглед", "Password": "Лозинка", "PDF document (.pdf)": "PDF документ (.pdf)", "PDF Extract Images (OCR)": "Извлачење PDF слика (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "Скенирај документе из {{path}}", "Search": "Претражи", "Search a model": "Претражи модел", + "Search Chats": "", "Search Documents": "Претражи документе", + "Search Models": "", "Search Prompts": "Претражи упите", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/sv-SE/translation.json b/src/lib/i18n/locales/sv-SE/translation.json index 9e3cc09896..0b746a94a4 100644 --- a/src/lib/i18n/locales/sv-SE/translation.json +++ b/src/lib/i18n/locales/sv-SE/translation.json @@ -48,6 +48,7 @@ "API keys": "API-nycklar", "April": "April", "Archive": "Arkiv", + "Archive All Chats": "", "Archived Chats": "Arkiverade chattar", "are allowed - Activate this command by typing": "är tillåtna - Aktivera detta kommando genom att skriva", "Are you sure?": "Är du säker?", @@ -120,7 +121,6 @@ "Custom": "Anpassad", "Customize models for a specific purpose": "", "Dark": "Mörk", - "Dashboard": "Instrumentbräda", "Database": "Databas", "December": "December", "Default": "Standard", @@ -133,9 +133,9 @@ "delete": "radera", "Delete": "Radera", "Delete a model": "Ta bort en modell", + "Delete All Chats": "", "Delete chat": "Radera chatt", "Delete Chat": "Radera chatt", - "Delete Chats": "Radera chattar", "delete this link": "radera denna länk", "Delete User": "Radera användare", "Deleted {{deleteModelTag}}": "Raderad {{deleteModelTag}}", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "OpenAI-URL/nyckel krävs.", "or": "eller", "Other": "Andra", - "Overview": "Översikt", "Password": "Lösenord", "PDF document (.pdf)": "PDF-dokument (.pdf)", "PDF Extract Images (OCR)": "PDF Extrahera bilder (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "Skanna efter dokument från {{path}}", "Search": "Sök", "Search a model": "Sök efter en modell", + "Search Chats": "", "Search Documents": "Sök dokument", + "Search Models": "", "Search Prompts": "Sök promptar", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/tr-TR/translation.json b/src/lib/i18n/locales/tr-TR/translation.json index c27c19d252..d6d49c38b7 100644 --- a/src/lib/i18n/locales/tr-TR/translation.json +++ b/src/lib/i18n/locales/tr-TR/translation.json @@ -48,6 +48,7 @@ "API keys": "API anahtarları", "April": "Nisan", "Archive": "Arşiv", + "Archive All Chats": "", "Archived Chats": "Arşivlenmiş Sohbetler", "are allowed - Activate this command by typing": "izin verilir - Bu komutu yazarak etkinleştirin", "Are you sure?": "Emin misiniz?", @@ -120,7 +121,6 @@ "Custom": "Özel", "Customize models for a specific purpose": "", "Dark": "Koyu", - "Dashboard": "Panel", "Database": "Veritabanı", "December": "Aralık", "Default": "Varsayılan", @@ -133,9 +133,9 @@ "delete": "sil", "Delete": "Sil", "Delete a model": "Bir modeli sil", + "Delete All Chats": "", "Delete chat": "Sohbeti sil", "Delete Chat": "Sohbeti Sil", - "Delete Chats": "Sohbetleri Sil", "delete this link": "bu bağlantıyı sil", "Delete User": "Kullanıcıyı Sil", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} silindi", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "OpenAI URL/Anahtar gereklidir.", "or": "veya", "Other": "Diğer", - "Overview": "Genel Bakış", "Password": "Parola", "PDF document (.pdf)": "PDF belgesi (.pdf)", "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", "Search": "Ara", "Search a model": "Bir model ara", + "Search Chats": "", "Search Documents": "Belgeleri Ara", + "Search Models": "", "Search Prompts": "Prompt Ara", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/uk-UA/translation.json b/src/lib/i18n/locales/uk-UA/translation.json index e3f1ae6945..5f9c6f6933 100644 --- a/src/lib/i18n/locales/uk-UA/translation.json +++ b/src/lib/i18n/locales/uk-UA/translation.json @@ -48,6 +48,7 @@ "API keys": "Ключі API", "April": "Квітень", "Archive": "Архів", + "Archive All Chats": "", "Archived Chats": "Архівовані чати", "are allowed - Activate this command by typing": "дозволено - активізуйте цю команду набором", "Are you sure?": "Ви впевнені?", @@ -120,7 +121,6 @@ "Custom": "Налаштувати", "Customize models for a specific purpose": "", "Dark": "Темна", - "Dashboard": "Панель управління", "Database": "База даних", "December": "Грудень", "Default": "За замовчуванням", @@ -133,9 +133,9 @@ "delete": "видалити", "Delete": "Видалити", "Delete a model": "Видалити модель", + "Delete All Chats": "", "Delete chat": "Видалити чат", "Delete Chat": "Видалити чат", - "Delete Chats": "Видалити чати", "delete this link": "видалити це посилання", "Delete User": "Видалити користувача", "Deleted {{deleteModelTag}}": "Видалено {{deleteModelTag}}", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "Потрібен OpenAI URL/ключ.", "or": "або", "Other": "Інше", - "Overview": "Огляд", "Password": "Пароль", "PDF document (.pdf)": "PDF документ (.pdf)", "PDF Extract Images (OCR)": "Розпізнавання зображень з PDF (OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "Сканування документів з {{path}}", "Search": "Пошук", "Search a model": "Шукати модель", + "Search Chats": "", "Search Documents": "Пошук документів", + "Search Models": "", "Search Prompts": "Пошук промтів", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/vi-VN/translation.json b/src/lib/i18n/locales/vi-VN/translation.json index 61043d140f..ecad1761fa 100644 --- a/src/lib/i18n/locales/vi-VN/translation.json +++ b/src/lib/i18n/locales/vi-VN/translation.json @@ -48,6 +48,7 @@ "API keys": "API Keys", "April": "Tháng 4", "Archive": "Lưu trữ", + "Archive All Chats": "", "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 you sure?": "Bạn có chắc chắn không?", @@ -120,7 +121,6 @@ "Custom": "Tùy chỉnh", "Customize models for a specific purpose": "", "Dark": "Tối", - "Dashboard": "Trang tổng quan", "Database": "Cơ sở dữ liệu", "December": "Tháng 12", "Default": "Mặc định", @@ -133,9 +133,9 @@ "delete": "xóa", "Delete": "Xóa", "Delete a model": "Xóa mô hình", + "Delete All Chats": "", "Delete chat": "Xóa nội dung chat", "Delete Chat": "Xóa chat", - "Delete Chats": "Xóa nội dung chat", "delete this link": "Xóa link này", "Delete User": "Xóa người dùng", "Deleted {{deleteModelTag}}": "Đã xóa {{deleteModelTag}}", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "Yêu cầu URL/Key API OpenAI.", "or": "hoặc", "Other": "Khác", - "Overview": "Tổng quan", "Password": "Mật khẩu", "PDF document (.pdf)": "Tập tin PDF (.pdf)", "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}}", "Search": "Tìm kiếm", "Search a model": "Tìm model", + "Search Chats": "", "Search Documents": "Tìm tài liệu", + "Search Models": "", "Search Prompts": "Tìm prompt", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index 9fe0da01cf..4f55ed1001 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -48,6 +48,7 @@ "API keys": "API 密钥", "April": "四月", "Archive": "存档", + "Archive All Chats": "", "Archived Chats": "聊天记录存档", "are allowed - Activate this command by typing": "允许 - 通过输入来激活这个命令", "Are you sure?": "你确定吗?", @@ -120,7 +121,6 @@ "Custom": "自定义", "Customize models for a specific purpose": "", "Dark": "暗色", - "Dashboard": "仪表盘", "Database": "数据库", "December": "十二月", "Default": "默认", @@ -133,9 +133,9 @@ "delete": "删除", "Delete": "删除", "Delete a model": "删除一个模型", + "Delete All Chats": "", "Delete chat": "删除聊天", "Delete Chat": "删除聊天", - "Delete Chats": "删除聊天记录", "delete this link": "删除这个链接", "Delete User": "删除用户", "Deleted {{deleteModelTag}}": "已删除{{deleteModelTag}}", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "需要 OpenAI URL/Key", "or": "或", "Other": "其他", - "Overview": "概述", "Password": "密码", "PDF document (.pdf)": "PDF 文档 (.pdf)", "PDF Extract Images (OCR)": "PDF 图像处理 (使用 OCR)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "从 {{path}} 扫描文档", "Search": "搜索", "Search a model": "搜索模型", + "Search Chats": "", "Search Documents": "搜索文档", + "Search Models": "", "Search Prompts": "搜索提示词", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index 377a2cdcef..94bdae311c 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -48,6 +48,7 @@ "API keys": "API Keys", "April": "4月", "Archive": "存檔", + "Archive All Chats": "", "Archived Chats": "聊天記錄存檔", "are allowed - Activate this command by typing": "是允許的 - 透過輸入", "Are you sure?": "你確定嗎?", @@ -120,7 +121,6 @@ "Custom": "自訂", "Customize models for a specific purpose": "", "Dark": "暗色", - "Dashboard": "儀表板", "Database": "資料庫", "December": "12月", "Default": "預設", @@ -133,9 +133,9 @@ "delete": "刪除", "Delete": "刪除", "Delete a model": "刪除一個模型", + "Delete All Chats": "", "Delete chat": "刪除聊天紀錄", "Delete Chat": "刪除聊天紀錄", - "Delete Chats": "刪除聊天紀錄", "delete this link": "刪除此連結", "Delete User": "刪除用戶", "Deleted {{deleteModelTag}}": "已刪除 {{deleteModelTag}}", @@ -314,7 +314,6 @@ "OpenAI URL/Key required.": "需要 OpenAI URL/金鑰。", "or": "或", "Other": "其他", - "Overview": "總覽", "Password": "密碼", "PDF document (.pdf)": "PDF 文件 (.pdf)", "PDF Extract Images (OCR)": "PDF 圖像擷取(OCR 光學文字辨識)", @@ -365,7 +364,9 @@ "Scan for documents from {{path}}": "從 {{path}} 掃描文件", "Search": "搜尋", "Search a model": "搜尋模型", + "Search Chats": "", "Search Documents": "搜尋文件", + "Search Models": "", "Search Prompts": "搜尋提示詞", "Search Results": "", "Searching the web for '{{searchQuery}}'": "", diff --git a/src/lib/stores/index.ts b/src/lib/stores/index.ts index b9cb7ad866..15e9617795 100644 --- a/src/lib/stores/index.ts +++ b/src/lib/stores/index.ts @@ -133,9 +133,9 @@ type Config = { images?: boolean; default_models?: string[]; default_prompt_suggestions?: PromptSuggestion[]; - trusted_header_auth?: boolean; + auth_trusted_header?: boolean; model_config?: GlobalModelConfig; - websearch?: boolean; + enable_websearch?: boolean; }; type PromptSuggestion = { diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index a258b35b0b..8594ff8c9d 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -12,11 +12,12 @@ export const sanitizeResponseContent = (content: string) => { .replace(/<$/, '') .replaceAll(/<\|[a-z]+\|>/g, ' ') .replaceAll('<', '<') + .replaceAll('>', '>') .trim(); }; export const revertSanitizedResponseContent = (content: string) => { - return content.replaceAll('<', '<'); + return content.replaceAll('<', '<').replaceAll('>', '>'); }; export const capitalizeFirstLetter = (string) => { diff --git a/src/routes/(app)/admin/+layout.svelte b/src/routes/(app)/admin/+layout.svelte new file mode 100644 index 0000000000..5957b5054a --- /dev/null +++ b/src/routes/(app)/admin/+layout.svelte @@ -0,0 +1,78 @@ + + + + + {$i18n.t('Admin Panel')} | {$WEBUI_NAME} + + + +
+
+
+
+ +
+
{$i18n.t('Workspace')}
+
+
+ + + +
+ +
+ +
+
diff --git a/src/routes/(app)/admin/+page.svelte b/src/routes/(app)/admin/+page.svelte index 449b69eb25..f0ff3fc843 100644 --- a/src/routes/(app)/admin/+page.svelte +++ b/src/routes/(app)/admin/+page.svelte @@ -82,10 +82,6 @@ }); - - {$i18n.t('Admin Panel')} | {$WEBUI_NAME} - - {#key selectedUser} -
- {#if loaded} -
-
-
+{#if loaded} +
+
+ {$i18n.t('All Users')} +
+ {users.length} +
+ +
+ + +
+ -
-
{$i18n.t('Dashboard')}
-
-
+ - - -
- -
-
-
- {$i18n.t('All Users')} -
- {users.length} -
- -
- - -
- - - - - - - -
-
-
- -
- - + - - - - - - - - - - - {#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} - - - - - - - - - - - - {/each} - -
{$i18n.t('Role')} {$i18n.t('Name')} {$i18n.t('Email')} {$i18n.t('Last Active')} {$i18n.t('Created at')} -
- - -
- user - -
{user.name}
-
-
{user.email} - {dayjs(user.last_active_at * 1000).fromNow()} - - {dayjs(user.created_at * 1000).format($i18n.t('MMMM DD, YYYY'))} - -
- {#if user.role !== 'admin'} - - - - - - - - - - - - {/if} -
-
+ + + + +
- -
- ⓘ {$i18n.t("Click on the user role button to change a user's role.")} -
- -
- {/if} -
+
+ +
+ + + + + + + + + + + + + + {#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} + + + + + + + + + + + + {/each} + +
{$i18n.t('Role')} {$i18n.t('Name')} {$i18n.t('Email')} {$i18n.t('Last Active')} {$i18n.t('Created at')} +
+ + +
+ user + +
{user.name}
+
+
{user.email} + {dayjs(user.last_active_at * 1000).fromNow()} + + {dayjs(user.created_at * 1000).format($i18n.t('MMMM DD, YYYY'))} + +
+ {#if user.role !== 'admin'} + + + + + + + + + + + + {/if} +
+
+
+ +
+ ⓘ {$i18n.t("Click on the user role button to change a user's role.")} +
+ + +{/if}