mirror of
https://github.com/open-webui/open-webui.git
synced 2025-12-14 13:25:20 +00:00
Merge remote-tracking branch 'upstream/dev' into feat/backend-web-search
This commit is contained in:
commit
276b7b90b8
103 changed files with 1279 additions and 1709 deletions
|
|
@ -10,8 +10,4 @@ OPENAI_API_KEY=''
|
||||||
# DO NOT TRACK
|
# DO NOT TRACK
|
||||||
SCARF_NO_ANALYTICS=true
|
SCARF_NO_ANALYTICS=true
|
||||||
DO_NOT_TRACK=true
|
DO_NOT_TRACK=true
|
||||||
ANONYMIZED_TELEMETRY=false
|
ANONYMIZED_TELEMETRY=false
|
||||||
|
|
||||||
# Use locally bundled version of the LiteLLM cost map json
|
|
||||||
# to avoid repetitive startup connections
|
|
||||||
LITELLM_LOCAL_MODEL_COST_MAP="True"
|
|
||||||
13
Dockerfile
13
Dockerfile
|
|
@ -59,11 +59,6 @@ ENV OPENAI_API_KEY="" \
|
||||||
DO_NOT_TRACK=true \
|
DO_NOT_TRACK=true \
|
||||||
ANONYMIZED_TELEMETRY=false
|
ANONYMIZED_TELEMETRY=false
|
||||||
|
|
||||||
# Use locally bundled version of the LiteLLM cost map json
|
|
||||||
# to avoid repetitive startup connections
|
|
||||||
ENV LITELLM_LOCAL_MODEL_COST_MAP="True"
|
|
||||||
|
|
||||||
|
|
||||||
#### Other models #########################################################
|
#### Other models #########################################################
|
||||||
## whisper TTS model settings ##
|
## whisper TTS model settings ##
|
||||||
ENV WHISPER_MODEL="base" \
|
ENV WHISPER_MODEL="base" \
|
||||||
|
|
@ -83,10 +78,10 @@ WORKDIR /app/backend
|
||||||
ENV HOME /root
|
ENV HOME /root
|
||||||
# Create user and group if not root
|
# Create user and group if not root
|
||||||
RUN if [ $UID -ne 0 ]; then \
|
RUN if [ $UID -ne 0 ]; then \
|
||||||
if [ $GID -ne 0 ]; then \
|
if [ $GID -ne 0 ]; then \
|
||||||
addgroup --gid $GID app; \
|
addgroup --gid $GID app; \
|
||||||
fi; \
|
fi; \
|
||||||
adduser --uid $UID --gid $GID --home $HOME --disabled-password --no-create-home app; \
|
adduser --uid $UID --gid $GID --home $HOME --disabled-password --no-create-home app; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RUN mkdir -p $HOME/.cache/chroma
|
RUN mkdir -p $HOME/.cache/chroma
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
)
|
|
||||||
|
|
@ -29,8 +29,8 @@ import time
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
from typing import Optional, List, Union
|
from typing import Optional, List, Union
|
||||||
|
|
||||||
from apps.web.models.models import Models
|
from apps.webui.models.models import Models
|
||||||
from apps.web.models.users import Users
|
from apps.webui.models.users import Users
|
||||||
from constants import ERROR_MESSAGES
|
from constants import ERROR_MESSAGES
|
||||||
from utils.utils import (
|
from utils.utils import (
|
||||||
decode_token,
|
decode_token,
|
||||||
|
|
@ -306,6 +306,9 @@ async def pull_model(
|
||||||
|
|
||||||
r = None
|
r = None
|
||||||
|
|
||||||
|
# Admin should be able to pull models from any source
|
||||||
|
payload = {**form_data.model_dump(exclude_none=True), "insecure": True}
|
||||||
|
|
||||||
def get_request():
|
def get_request():
|
||||||
nonlocal url
|
nonlocal url
|
||||||
nonlocal r
|
nonlocal r
|
||||||
|
|
@ -333,7 +336,7 @@ async def pull_model(
|
||||||
r = requests.request(
|
r = requests.request(
|
||||||
method="POST",
|
method="POST",
|
||||||
url=f"{url}/api/pull",
|
url=f"{url}/api/pull",
|
||||||
data=form_data.model_dump_json(exclude_none=True).encode(),
|
data=json.dumps(payload),
|
||||||
stream=True,
|
stream=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,8 @@ import logging
|
||||||
|
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
from apps.web.models.models import Models
|
from apps.webui.models.models import Models
|
||||||
from apps.web.models.users import Users
|
from apps.webui.models.users import Users
|
||||||
from constants import ERROR_MESSAGES
|
from constants import ERROR_MESSAGES
|
||||||
from utils.utils import (
|
from utils.utils import (
|
||||||
decode_token,
|
decode_token,
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ import json
|
||||||
|
|
||||||
import sentence_transformers
|
import sentence_transformers
|
||||||
|
|
||||||
from apps.web.models.documents import (
|
from apps.webui.models.documents import (
|
||||||
Documents,
|
Documents,
|
||||||
DocumentForm,
|
DocumentForm,
|
||||||
DocumentResponse,
|
DocumentResponse,
|
||||||
|
|
|
||||||
|
|
@ -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)
|
|
||||||
|
|
@ -31,7 +31,9 @@ else:
|
||||||
DB = connect(DATABASE_URL)
|
DB = connect(DATABASE_URL)
|
||||||
log.info(f"Connected to a {DB.__class__.__name__} database.")
|
log.info(f"Connected to a {DB.__class__.__name__} database.")
|
||||||
router = Router(
|
router = Router(
|
||||||
DB, migrate_dir=BACKEND_DIR / "apps" / "web" / "internal" / "migrations", logger=log
|
DB,
|
||||||
|
migrate_dir=BACKEND_DIR / "apps" / "webui" / "internal" / "migrations",
|
||||||
|
logger=log,
|
||||||
)
|
)
|
||||||
router.run()
|
router.run()
|
||||||
DB.connect(reuse_if_open=True)
|
DB.connect(reuse_if_open=True)
|
||||||
|
|
@ -14,7 +14,7 @@ You will need to create a migration file to ensure that existing databases are u
|
||||||
2. Make your changes to the models.
|
2. Make your changes to the models.
|
||||||
3. From the `backend` directory, run the following command:
|
3. From the `backend` directory, run the following command:
|
||||||
```bash
|
```bash
|
||||||
pw_migrate create --auto --auto-source apps.web.models --database sqlite:///${SQLITE_DB} --directory apps/web/internal/migrations ${MIGRATION_NAME}
|
pw_migrate create --auto --auto-source apps.webui.models --database sqlite:///${SQLITE_DB} --directory apps/web/internal/migrations ${MIGRATION_NAME}
|
||||||
```
|
```
|
||||||
- `$SQLITE_DB` should be the path to the database file.
|
- `$SQLITE_DB` should be the path to the database file.
|
||||||
- `$MIGRATION_NAME` should be a descriptive name for the migration.
|
- `$MIGRATION_NAME` should be a descriptive name for the migration.
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
from fastapi import FastAPI, Depends
|
from fastapi import FastAPI, Depends
|
||||||
from fastapi.routing import APIRoute
|
from fastapi.routing import APIRoute
|
||||||
from fastapi.middleware.cors import CORSMiddleware
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
from apps.web.routers import (
|
from apps.webui.routers import (
|
||||||
auths,
|
auths,
|
||||||
users,
|
users,
|
||||||
chats,
|
chats,
|
||||||
|
|
@ -5,10 +5,10 @@ import uuid
|
||||||
import logging
|
import logging
|
||||||
from peewee import *
|
from peewee import *
|
||||||
|
|
||||||
from apps.web.models.users import UserModel, Users
|
from apps.webui.models.users import UserModel, Users
|
||||||
from utils.utils import verify_password
|
from utils.utils import verify_password
|
||||||
|
|
||||||
from apps.web.internal.db import DB
|
from apps.webui.internal.db import DB
|
||||||
|
|
||||||
from config import SRC_LOG_LEVELS
|
from config import SRC_LOG_LEVELS
|
||||||
|
|
||||||
|
|
@ -7,7 +7,7 @@ import json
|
||||||
import uuid
|
import uuid
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from apps.web.internal.db import DB
|
from apps.webui.internal.db import DB
|
||||||
|
|
||||||
####################
|
####################
|
||||||
# Chat DB Schema
|
# Chat DB Schema
|
||||||
|
|
@ -191,6 +191,20 @@ class ChatTable:
|
||||||
except:
|
except:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def archive_all_chats_by_user_id(self, user_id: str) -> bool:
|
||||||
|
try:
|
||||||
|
chats = self.get_chats_by_user_id(user_id)
|
||||||
|
for chat in chats:
|
||||||
|
query = Chat.update(
|
||||||
|
archived=True,
|
||||||
|
).where(Chat.id == chat.id)
|
||||||
|
|
||||||
|
query.execute()
|
||||||
|
|
||||||
|
return True
|
||||||
|
except:
|
||||||
|
return False
|
||||||
|
|
||||||
def get_archived_chat_list_by_user_id(
|
def get_archived_chat_list_by_user_id(
|
||||||
self, user_id: str, skip: int = 0, limit: int = 50
|
self, user_id: str, skip: int = 0, limit: int = 50
|
||||||
) -> List[ChatModel]:
|
) -> List[ChatModel]:
|
||||||
|
|
@ -205,17 +219,31 @@ class ChatTable:
|
||||||
]
|
]
|
||||||
|
|
||||||
def get_chat_list_by_user_id(
|
def get_chat_list_by_user_id(
|
||||||
self, user_id: str, skip: int = 0, limit: int = 50
|
self,
|
||||||
|
user_id: str,
|
||||||
|
include_archived: bool = False,
|
||||||
|
skip: int = 0,
|
||||||
|
limit: int = 50,
|
||||||
) -> List[ChatModel]:
|
) -> List[ChatModel]:
|
||||||
return [
|
if include_archived:
|
||||||
ChatModel(**model_to_dict(chat))
|
return [
|
||||||
for chat in Chat.select()
|
ChatModel(**model_to_dict(chat))
|
||||||
.where(Chat.archived == False)
|
for chat in Chat.select()
|
||||||
.where(Chat.user_id == user_id)
|
.where(Chat.user_id == user_id)
|
||||||
.order_by(Chat.updated_at.desc())
|
.order_by(Chat.updated_at.desc())
|
||||||
# .limit(limit)
|
# .limit(limit)
|
||||||
# .offset(skip)
|
# .offset(skip)
|
||||||
]
|
]
|
||||||
|
else:
|
||||||
|
return [
|
||||||
|
ChatModel(**model_to_dict(chat))
|
||||||
|
for chat in Chat.select()
|
||||||
|
.where(Chat.archived == False)
|
||||||
|
.where(Chat.user_id == user_id)
|
||||||
|
.order_by(Chat.updated_at.desc())
|
||||||
|
# .limit(limit)
|
||||||
|
# .offset(skip)
|
||||||
|
]
|
||||||
|
|
||||||
def get_chat_list_by_chat_ids(
|
def get_chat_list_by_chat_ids(
|
||||||
self, chat_ids: List[str], skip: int = 0, limit: int = 50
|
self, chat_ids: List[str], skip: int = 0, limit: int = 50
|
||||||
|
|
@ -8,7 +8,7 @@ import logging
|
||||||
from utils.utils import decode_token
|
from utils.utils import decode_token
|
||||||
from utils.misc import get_gravatar_url
|
from utils.misc import get_gravatar_url
|
||||||
|
|
||||||
from apps.web.internal.db import DB
|
from apps.webui.internal.db import DB
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
|
@ -3,8 +3,8 @@ from peewee import *
|
||||||
from playhouse.shortcuts import model_to_dict
|
from playhouse.shortcuts import model_to_dict
|
||||||
from typing import List, Union, Optional
|
from typing import List, Union, Optional
|
||||||
|
|
||||||
from apps.web.internal.db import DB
|
from apps.webui.internal.db import DB
|
||||||
from apps.web.models.chats import Chats
|
from apps.webui.models.chats import Chats
|
||||||
|
|
||||||
import time
|
import time
|
||||||
import uuid
|
import uuid
|
||||||
|
|
@ -8,7 +8,7 @@ from peewee import *
|
||||||
from playhouse.shortcuts import model_to_dict
|
from playhouse.shortcuts import model_to_dict
|
||||||
from pydantic import BaseModel, ConfigDict
|
from pydantic import BaseModel, ConfigDict
|
||||||
|
|
||||||
from apps.web.internal.db import DB, JSONField
|
from apps.webui.internal.db import DB, JSONField
|
||||||
|
|
||||||
from typing import List, Union, Optional
|
from typing import List, Union, Optional
|
||||||
from config import SRC_LOG_LEVELS
|
from config import SRC_LOG_LEVELS
|
||||||
|
|
@ -7,7 +7,7 @@ import time
|
||||||
from utils.utils import decode_token
|
from utils.utils import decode_token
|
||||||
from utils.misc import get_gravatar_url
|
from utils.misc import get_gravatar_url
|
||||||
|
|
||||||
from apps.web.internal.db import DB
|
from apps.webui.internal.db import DB
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
|
@ -8,7 +8,7 @@ import uuid
|
||||||
import time
|
import time
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from apps.web.internal.db import DB
|
from apps.webui.internal.db import DB
|
||||||
|
|
||||||
from config import SRC_LOG_LEVELS
|
from config import SRC_LOG_LEVELS
|
||||||
|
|
||||||
|
|
@ -5,8 +5,8 @@ from typing import List, Union, Optional
|
||||||
import time
|
import time
|
||||||
from utils.misc import get_gravatar_url
|
from utils.misc import get_gravatar_url
|
||||||
|
|
||||||
from apps.web.internal.db import DB
|
from apps.webui.internal.db import DB
|
||||||
from apps.web.models.chats import Chats
|
from apps.webui.models.chats import Chats
|
||||||
|
|
||||||
####################
|
####################
|
||||||
# User DB Schema
|
# User DB Schema
|
||||||
|
|
@ -10,7 +10,7 @@ import uuid
|
||||||
import csv
|
import csv
|
||||||
|
|
||||||
|
|
||||||
from apps.web.models.auths import (
|
from apps.webui.models.auths import (
|
||||||
SigninForm,
|
SigninForm,
|
||||||
SignupForm,
|
SignupForm,
|
||||||
AddUserForm,
|
AddUserForm,
|
||||||
|
|
@ -21,7 +21,7 @@ from apps.web.models.auths import (
|
||||||
Auths,
|
Auths,
|
||||||
ApiKey,
|
ApiKey,
|
||||||
)
|
)
|
||||||
from apps.web.models.users import Users
|
from apps.webui.models.users import Users
|
||||||
|
|
||||||
from utils.utils import (
|
from utils.utils import (
|
||||||
get_password_hash,
|
get_password_hash,
|
||||||
|
|
@ -7,8 +7,8 @@ from pydantic import BaseModel
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from apps.web.models.users import Users
|
from apps.webui.models.users import Users
|
||||||
from apps.web.models.chats import (
|
from apps.webui.models.chats import (
|
||||||
ChatModel,
|
ChatModel,
|
||||||
ChatResponse,
|
ChatResponse,
|
||||||
ChatTitleForm,
|
ChatTitleForm,
|
||||||
|
|
@ -18,7 +18,7 @@ from apps.web.models.chats import (
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
from apps.web.models.tags import (
|
from apps.webui.models.tags import (
|
||||||
TagModel,
|
TagModel,
|
||||||
ChatIdTagModel,
|
ChatIdTagModel,
|
||||||
ChatIdTagForm,
|
ChatIdTagForm,
|
||||||
|
|
@ -78,43 +78,25 @@ async def delete_all_user_chats(request: Request, user=Depends(get_current_user)
|
||||||
async def get_user_chat_list_by_user_id(
|
async def get_user_chat_list_by_user_id(
|
||||||
user_id: str, user=Depends(get_admin_user), skip: int = 0, limit: int = 50
|
user_id: str, user=Depends(get_admin_user), skip: int = 0, limit: int = 50
|
||||||
):
|
):
|
||||||
return Chats.get_chat_list_by_user_id(user_id, skip, limit)
|
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])
|
@router.post("/new", response_model=Optional[ChatResponse])
|
||||||
async def get_archived_session_user_chat_list(
|
async def create_new_chat(form_data: ChatForm, user=Depends(get_current_user)):
|
||||||
user=Depends(get_current_user), skip: int = 0, limit: int = 50
|
try:
|
||||||
):
|
chat = Chats.insert_new_chat(user.id, form_data)
|
||||||
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:
|
|
||||||
return ChatResponse(**{**chat.model_dump(), "chat": json.loads(chat.chat)})
|
return ChatResponse(**{**chat.model_dump(), "chat": json.loads(chat.chat)})
|
||||||
else:
|
except Exception as e:
|
||||||
|
log.exception(e)
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND
|
status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -150,19 +132,49 @@ async def get_all_user_chats_in_db(user=Depends(get_admin_user)):
|
||||||
|
|
||||||
|
|
||||||
############################
|
############################
|
||||||
# CreateNewChat
|
# GetArchivedChats
|
||||||
############################
|
############################
|
||||||
|
|
||||||
|
|
||||||
@router.post("/new", response_model=Optional[ChatResponse])
|
@router.get("/archived", response_model=List[ChatTitleIdResponse])
|
||||||
async def create_new_chat(form_data: ChatForm, user=Depends(get_current_user)):
|
async def get_archived_session_user_chat_list(
|
||||||
try:
|
user=Depends(get_current_user), skip: int = 0, limit: int = 50
|
||||||
chat = Chats.insert_new_chat(user.id, form_data)
|
):
|
||||||
return ChatResponse(**{**chat.model_dump(), "chat": json.loads(chat.chat)})
|
return Chats.get_archived_chat_list_by_user_id(user.id, skip, limit)
|
||||||
except Exception as e:
|
|
||||||
log.exception(e)
|
|
||||||
|
############################
|
||||||
|
# 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(
|
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
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -8,7 +8,7 @@ from pydantic import BaseModel
|
||||||
import time
|
import time
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from apps.web.models.users import Users
|
from apps.webui.models.users import Users
|
||||||
|
|
||||||
from utils.utils import (
|
from utils.utils import (
|
||||||
get_password_hash,
|
get_password_hash,
|
||||||
|
|
@ -6,7 +6,7 @@ from fastapi import APIRouter
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from apps.web.models.documents import (
|
from apps.webui.models.documents import (
|
||||||
Documents,
|
Documents,
|
||||||
DocumentForm,
|
DocumentForm,
|
||||||
DocumentUpdateForm,
|
DocumentUpdateForm,
|
||||||
|
|
@ -7,7 +7,7 @@ from fastapi import APIRouter
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from apps.web.models.memories import Memories, MemoryModel
|
from apps.webui.models.memories import Memories, MemoryModel
|
||||||
|
|
||||||
from utils.utils import get_verified_user
|
from utils.utils import get_verified_user
|
||||||
from constants import ERROR_MESSAGES
|
from constants import ERROR_MESSAGES
|
||||||
|
|
@ -5,7 +5,7 @@ from typing import List, Union, Optional
|
||||||
from fastapi import APIRouter
|
from fastapi import APIRouter
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
import json
|
import json
|
||||||
from apps.web.models.models import Models, ModelModel, ModelForm, ModelResponse
|
from apps.webui.models.models import Models, ModelModel, ModelForm, ModelResponse
|
||||||
|
|
||||||
from utils.utils import get_verified_user, get_admin_user
|
from utils.utils import get_verified_user, get_admin_user
|
||||||
from constants import ERROR_MESSAGES
|
from constants import ERROR_MESSAGES
|
||||||
|
|
@ -53,7 +53,7 @@ async def add_new_model(
|
||||||
############################
|
############################
|
||||||
|
|
||||||
|
|
||||||
@router.get("/{id}", response_model=Optional[ModelModel])
|
@router.get("/", response_model=Optional[ModelModel])
|
||||||
async def get_model_by_id(id: str, user=Depends(get_verified_user)):
|
async def get_model_by_id(id: str, user=Depends(get_verified_user)):
|
||||||
model = Models.get_model_by_id(id)
|
model = Models.get_model_by_id(id)
|
||||||
|
|
||||||
|
|
@ -71,7 +71,7 @@ async def get_model_by_id(id: str, user=Depends(get_verified_user)):
|
||||||
############################
|
############################
|
||||||
|
|
||||||
|
|
||||||
@router.post("/{id}/update", response_model=Optional[ModelModel])
|
@router.post("/update", response_model=Optional[ModelModel])
|
||||||
async def update_model_by_id(
|
async def update_model_by_id(
|
||||||
request: Request, id: str, form_data: ModelForm, user=Depends(get_admin_user)
|
request: Request, id: str, form_data: ModelForm, user=Depends(get_admin_user)
|
||||||
):
|
):
|
||||||
|
|
@ -102,7 +102,7 @@ async def update_model_by_id(
|
||||||
############################
|
############################
|
||||||
|
|
||||||
|
|
||||||
@router.delete("/{id}/delete", response_model=bool)
|
@router.delete("/delete", response_model=bool)
|
||||||
async def delete_model_by_id(id: str, user=Depends(get_admin_user)):
|
async def delete_model_by_id(id: str, user=Depends(get_admin_user)):
|
||||||
result = Models.delete_model_by_id(id)
|
result = Models.delete_model_by_id(id)
|
||||||
return result
|
return result
|
||||||
|
|
@ -6,7 +6,7 @@ from fastapi import APIRouter
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from apps.web.models.prompts import Prompts, PromptForm, PromptModel
|
from apps.webui.models.prompts import Prompts, PromptForm, PromptModel
|
||||||
|
|
||||||
from utils.utils import get_current_user, get_admin_user
|
from utils.utils import get_current_user, get_admin_user
|
||||||
from constants import ERROR_MESSAGES
|
from constants import ERROR_MESSAGES
|
||||||
|
|
@ -9,9 +9,9 @@ import time
|
||||||
import uuid
|
import uuid
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from apps.web.models.users import UserModel, UserUpdateForm, UserRoleUpdateForm, Users
|
from apps.webui.models.users import UserModel, UserUpdateForm, UserRoleUpdateForm, Users
|
||||||
from apps.web.models.auths import Auths
|
from apps.webui.models.auths import Auths
|
||||||
from apps.web.models.chats import Chats
|
from apps.webui.models.chats import Chats
|
||||||
|
|
||||||
from utils.utils import get_verified_user, get_password_hash, get_admin_user
|
from utils.utils import get_verified_user, get_password_hash, get_admin_user
|
||||||
from constants import ERROR_MESSAGES
|
from constants import ERROR_MESSAGES
|
||||||
|
|
@ -8,7 +8,7 @@ from pydantic import BaseModel
|
||||||
from fpdf import FPDF
|
from fpdf import FPDF
|
||||||
import markdown
|
import markdown
|
||||||
|
|
||||||
from apps.web.internal.db import DB
|
from apps.webui.internal.db import DB
|
||||||
from utils.utils import get_admin_user
|
from utils.utils import get_admin_user
|
||||||
from utils.misc import calculate_sha256, get_gravatar_url
|
from utils.misc import calculate_sha256, get_gravatar_url
|
||||||
|
|
||||||
|
|
@ -27,6 +27,8 @@ from constants import ERROR_MESSAGES
|
||||||
BACKEND_DIR = Path(__file__).parent # the path containing this file
|
BACKEND_DIR = Path(__file__).parent # the path containing this file
|
||||||
BASE_DIR = BACKEND_DIR.parent # the path containing the backend/
|
BASE_DIR = BACKEND_DIR.parent # the path containing the backend/
|
||||||
|
|
||||||
|
print(BASE_DIR)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from dotenv import load_dotenv, find_dotenv
|
from dotenv import load_dotenv, find_dotenv
|
||||||
|
|
||||||
|
|
@ -56,7 +58,6 @@ log_sources = [
|
||||||
"CONFIG",
|
"CONFIG",
|
||||||
"DB",
|
"DB",
|
||||||
"IMAGES",
|
"IMAGES",
|
||||||
"LITELLM",
|
|
||||||
"MAIN",
|
"MAIN",
|
||||||
"MODELS",
|
"MODELS",
|
||||||
"OLLAMA",
|
"OLLAMA",
|
||||||
|
|
@ -122,7 +123,10 @@ def parse_section(section):
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
changelog_content = (BASE_DIR / "CHANGELOG.md").read_text()
|
changelog_path = BASE_DIR / "CHANGELOG.md"
|
||||||
|
with open(str(changelog_path.absolute()), "r", encoding="utf8") as file:
|
||||||
|
changelog_content = file.read()
|
||||||
|
|
||||||
except:
|
except:
|
||||||
changelog_content = (pkgutil.get_data("open_webui", "CHANGELOG.md") or b"").decode()
|
changelog_content = (pkgutil.get_data("open_webui", "CHANGELOG.md") or b"").decode()
|
||||||
|
|
||||||
|
|
@ -374,10 +378,10 @@ def create_config_file(file_path):
|
||||||
|
|
||||||
LITELLM_CONFIG_PATH = f"{DATA_DIR}/litellm/config.yaml"
|
LITELLM_CONFIG_PATH = f"{DATA_DIR}/litellm/config.yaml"
|
||||||
|
|
||||||
if not os.path.exists(LITELLM_CONFIG_PATH):
|
# if not os.path.exists(LITELLM_CONFIG_PATH):
|
||||||
log.info("Config file doesn't exist. Creating...")
|
# log.info("Config file doesn't exist. Creating...")
|
||||||
create_config_file(LITELLM_CONFIG_PATH)
|
# create_config_file(LITELLM_CONFIG_PATH)
|
||||||
log.info("Config file created successfully.")
|
# log.info("Config file created successfully.")
|
||||||
|
|
||||||
|
|
||||||
####################################
|
####################################
|
||||||
|
|
@ -845,18 +849,6 @@ AUDIO_OPENAI_API_VOICE = PersistentConfig(
|
||||||
os.getenv("AUDIO_OPENAI_API_VOICE", "alloy"),
|
os.getenv("AUDIO_OPENAI_API_VOICE", "alloy"),
|
||||||
)
|
)
|
||||||
|
|
||||||
####################################
|
|
||||||
# LiteLLM
|
|
||||||
####################################
|
|
||||||
|
|
||||||
|
|
||||||
ENABLE_LITELLM = os.environ.get("ENABLE_LITELLM", "True").lower() == "true"
|
|
||||||
|
|
||||||
LITELLM_PROXY_PORT = int(os.getenv("LITELLM_PROXY_PORT", "14365"))
|
|
||||||
if LITELLM_PROXY_PORT < 0 or LITELLM_PROXY_PORT > 65535:
|
|
||||||
raise ValueError("Invalid port number for LITELLM_PROXY_PORT")
|
|
||||||
LITELLM_PROXY_HOST = os.getenv("LITELLM_PROXY_HOST", "127.0.0.1")
|
|
||||||
|
|
||||||
|
|
||||||
####################################
|
####################################
|
||||||
# Database
|
# Database
|
||||||
|
|
|
||||||
|
|
@ -22,23 +22,16 @@ from starlette.responses import StreamingResponse, Response
|
||||||
from apps.ollama.main import app as ollama_app, get_all_models as get_ollama_models
|
from apps.ollama.main import app as ollama_app, get_all_models as get_ollama_models
|
||||||
from apps.openai.main import app as openai_app, get_all_models as get_openai_models
|
from apps.openai.main import app as openai_app, get_all_models as get_openai_models
|
||||||
|
|
||||||
from apps.litellm.main import (
|
|
||||||
app as litellm_app,
|
|
||||||
start_litellm_background,
|
|
||||||
shutdown_litellm_background,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
from apps.audio.main import app as audio_app
|
from apps.audio.main import app as audio_app
|
||||||
from apps.images.main import app as images_app
|
from apps.images.main import app as images_app
|
||||||
from apps.rag.main import app as rag_app
|
from apps.rag.main import app as rag_app
|
||||||
from apps.web.main import app as webui_app
|
from apps.webui.main import app as webui_app
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from typing import List, Optional
|
from typing import List, Optional
|
||||||
|
|
||||||
from apps.web.models.models import Models, ModelModel
|
from apps.webui.models.models import Models, ModelModel
|
||||||
from utils.utils import get_admin_user, get_verified_user
|
from utils.utils import get_admin_user, get_verified_user
|
||||||
from apps.rag.utils import rag_messages
|
from apps.rag.utils import rag_messages
|
||||||
|
|
||||||
|
|
@ -55,7 +48,6 @@ from config import (
|
||||||
STATIC_DIR,
|
STATIC_DIR,
|
||||||
ENABLE_OPENAI_API,
|
ENABLE_OPENAI_API,
|
||||||
ENABLE_OLLAMA_API,
|
ENABLE_OLLAMA_API,
|
||||||
ENABLE_LITELLM,
|
|
||||||
ENABLE_MODEL_FILTER,
|
ENABLE_MODEL_FILTER,
|
||||||
MODEL_FILTER_LIST,
|
MODEL_FILTER_LIST,
|
||||||
GLOBAL_LOG_LEVEL,
|
GLOBAL_LOG_LEVEL,
|
||||||
|
|
@ -101,11 +93,7 @@ https://github.com/open-webui/open-webui
|
||||||
|
|
||||||
@asynccontextmanager
|
@asynccontextmanager
|
||||||
async def lifespan(app: FastAPI):
|
async def lifespan(app: FastAPI):
|
||||||
if ENABLE_LITELLM:
|
|
||||||
asyncio.create_task(start_litellm_background())
|
|
||||||
yield
|
yield
|
||||||
if ENABLE_LITELLM:
|
|
||||||
await shutdown_litellm_background()
|
|
||||||
|
|
||||||
|
|
||||||
app = FastAPI(
|
app = FastAPI(
|
||||||
|
|
@ -263,9 +251,6 @@ async def update_embedding_function(request: Request, call_next):
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
# TODO: Deprecate LiteLLM
|
|
||||||
app.mount("/litellm/api", litellm_app)
|
|
||||||
|
|
||||||
app.mount("/ollama", ollama_app)
|
app.mount("/ollama", ollama_app)
|
||||||
app.mount("/openai", openai_app)
|
app.mount("/openai", openai_app)
|
||||||
|
|
||||||
|
|
@ -373,13 +358,14 @@ async def get_app_config():
|
||||||
"name": WEBUI_NAME,
|
"name": WEBUI_NAME,
|
||||||
"version": VERSION,
|
"version": VERSION,
|
||||||
"auth": WEBUI_AUTH,
|
"auth": WEBUI_AUTH,
|
||||||
|
"auth_trusted_header": bool(webui_app.state.AUTH_TRUSTED_EMAIL_HEADER),
|
||||||
|
"enable_signup": webui_app.state.config.ENABLE_SIGNUP,
|
||||||
|
"enable_image_generation": images_app.state.config.ENABLED,
|
||||||
|
"enable_admin_export": ENABLE_ADMIN_EXPORT,
|
||||||
"default_locale": default_locale,
|
"default_locale": default_locale,
|
||||||
"images": images_app.state.config.ENABLED,
|
|
||||||
"default_models": webui_app.state.config.DEFAULT_MODELS,
|
"default_models": webui_app.state.config.DEFAULT_MODELS,
|
||||||
"default_prompt_suggestions": webui_app.state.config.DEFAULT_PROMPT_SUGGESTIONS,
|
"default_prompt_suggestions": webui_app.state.config.DEFAULT_PROMPT_SUGGESTIONS,
|
||||||
"trusted_header_auth": bool(webui_app.state.AUTH_TRUSTED_EMAIL_HEADER),
|
"enable_websearch": RAG_WEB_SEARCH_ENABLED,
|
||||||
"admin_export_enabled": ENABLE_ADMIN_EXPORT,
|
|
||||||
"websearch": RAG_WEB_SEARCH_ENABLED,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -403,15 +389,6 @@ async def update_model_filter_config(
|
||||||
app.state.config.ENABLE_MODEL_FILTER = form_data.enabled
|
app.state.config.ENABLE_MODEL_FILTER = form_data.enabled
|
||||||
app.state.config.MODEL_FILTER_LIST = form_data.models
|
app.state.config.MODEL_FILTER_LIST = form_data.models
|
||||||
|
|
||||||
ollama_app.state.config.ENABLE_MODEL_FILTER = app.state.config.ENABLE_MODEL_FILTER
|
|
||||||
ollama_app.state.config.MODEL_FILTER_LIST = app.state.config.MODEL_FILTER_LIST
|
|
||||||
|
|
||||||
openai_app.state.config.ENABLE_MODEL_FILTER = app.state.config.ENABLE_MODEL_FILTER
|
|
||||||
openai_app.state.config.MODEL_FILTER_LIST = app.state.config.MODEL_FILTER_LIST
|
|
||||||
|
|
||||||
litellm_app.state.ENABLE_MODEL_FILTER = app.state.config.ENABLE_MODEL_FILTER
|
|
||||||
litellm_app.state.MODEL_FILTER_LIST = app.state.config.MODEL_FILTER_LIST
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"enabled": app.state.config.ENABLE_MODEL_FILTER,
|
"enabled": app.state.config.ENABLE_MODEL_FILTER,
|
||||||
"models": app.state.config.MODEL_FILTER_LIST,
|
"models": app.state.config.MODEL_FILTER_LIST,
|
||||||
|
|
@ -432,7 +409,6 @@ class UrlForm(BaseModel):
|
||||||
@app.post("/api/webhook")
|
@app.post("/api/webhook")
|
||||||
async def update_webhook_url(form_data: UrlForm, user=Depends(get_admin_user)):
|
async def update_webhook_url(form_data: UrlForm, user=Depends(get_admin_user)):
|
||||||
app.state.config.WEBHOOK_URL = form_data.url
|
app.state.config.WEBHOOK_URL = form_data.url
|
||||||
|
|
||||||
webui_app.state.WEBHOOK_URL = app.state.config.WEBHOOK_URL
|
webui_app.state.WEBHOOK_URL = app.state.config.WEBHOOK_URL
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,6 @@ psycopg2-binary==2.9.9
|
||||||
PyMySQL==1.1.1
|
PyMySQL==1.1.1
|
||||||
bcrypt==4.1.3
|
bcrypt==4.1.3
|
||||||
|
|
||||||
litellm[proxy]==1.37.20
|
|
||||||
|
|
||||||
boto3==1.34.110
|
boto3==1.34.110
|
||||||
|
|
||||||
argon2-cffi==23.1.0
|
argon2-cffi==23.1.0
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -34,11 +34,6 @@ fi
|
||||||
# Check if SPACE_ID is set, if so, configure for space
|
# Check if SPACE_ID is set, if so, configure for space
|
||||||
if [ -n "$SPACE_ID" ]; then
|
if [ -n "$SPACE_ID" ]; then
|
||||||
echo "Configuring for HuggingFace Space deployment"
|
echo "Configuring for HuggingFace Space deployment"
|
||||||
|
|
||||||
# Copy litellm_config.yaml with specified ownership
|
|
||||||
echo "Copying litellm_config.yaml to the desired location with specified ownership..."
|
|
||||||
cp -f ./space/litellm_config.yaml ./data/litellm/config.yaml
|
|
||||||
|
|
||||||
if [ -n "$ADMIN_USER_EMAIL" ] && [ -n "$ADMIN_USER_PASSWORD" ]; then
|
if [ -n "$ADMIN_USER_EMAIL" ] && [ -n "$ADMIN_USER_PASSWORD" ]; then
|
||||||
echo "Admin user configured, creating"
|
echo "Admin user configured, creating"
|
||||||
WEBUI_SECRET_KEY="$WEBUI_SECRET_KEY" uvicorn main:app --host "$HOST" --port "$PORT" --forwarded-allow-ips '*' &
|
WEBUI_SECRET_KEY="$WEBUI_SECRET_KEY" uvicorn main:app --host "$HOST" --port "$PORT" --forwarded-allow-ips '*' &
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from apps.web.models.models import Models, ModelModel, ModelForm, ModelResponse
|
from apps.webui.models.models import Models, ModelModel, ModelForm, ModelResponse
|
||||||
|
|
||||||
|
|
||||||
def get_model_id_from_custom_model_id(id: str):
|
def get_model_id_from_custom_model_id(id: str):
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
|
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
|
||||||
from fastapi import HTTPException, status, Depends
|
from fastapi import HTTPException, status, Depends
|
||||||
|
|
||||||
from apps.web.models.users import Users
|
from apps.webui.models.users import Users
|
||||||
|
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from typing import Union, Optional
|
from typing import Union, Optional
|
||||||
|
|
|
||||||
|
|
@ -273,7 +273,6 @@ langsmith==0.1.57
|
||||||
# via langchain-community
|
# via langchain-community
|
||||||
# via langchain-core
|
# via langchain-core
|
||||||
litellm==1.37.20
|
litellm==1.37.20
|
||||||
# via litellm
|
|
||||||
# via open-webui
|
# via open-webui
|
||||||
lxml==5.2.2
|
lxml==5.2.2
|
||||||
# via unstructured
|
# via unstructured
|
||||||
|
|
@ -396,7 +395,6 @@ pandas==2.2.2
|
||||||
# via open-webui
|
# via open-webui
|
||||||
passlib==1.7.4
|
passlib==1.7.4
|
||||||
# via open-webui
|
# via open-webui
|
||||||
# via passlib
|
|
||||||
pathspec==0.12.1
|
pathspec==0.12.1
|
||||||
# via black
|
# via black
|
||||||
peewee==3.17.5
|
peewee==3.17.5
|
||||||
|
|
@ -454,7 +452,6 @@ pygments==2.18.0
|
||||||
pyjwt==2.8.0
|
pyjwt==2.8.0
|
||||||
# via litellm
|
# via litellm
|
||||||
# via open-webui
|
# via open-webui
|
||||||
# via pyjwt
|
|
||||||
pymysql==1.1.0
|
pymysql==1.1.0
|
||||||
# via open-webui
|
# via open-webui
|
||||||
pypandoc==1.13
|
pypandoc==1.13
|
||||||
|
|
@ -559,6 +556,9 @@ scipy==1.13.0
|
||||||
# via sentence-transformers
|
# via sentence-transformers
|
||||||
sentence-transformers==2.7.0
|
sentence-transformers==2.7.0
|
||||||
# via open-webui
|
# via open-webui
|
||||||
|
setuptools==69.5.1
|
||||||
|
# via ctranslate2
|
||||||
|
# via opentelemetry-instrumentation
|
||||||
shapely==2.0.4
|
shapely==2.0.4
|
||||||
# via rapidocr-onnxruntime
|
# via rapidocr-onnxruntime
|
||||||
shellingham==1.5.4
|
shellingham==1.5.4
|
||||||
|
|
@ -659,7 +659,6 @@ uvicorn==0.22.0
|
||||||
# via fastapi
|
# via fastapi
|
||||||
# via litellm
|
# via litellm
|
||||||
# via open-webui
|
# via open-webui
|
||||||
# via uvicorn
|
|
||||||
uvloop==0.19.0
|
uvloop==0.19.0
|
||||||
# via uvicorn
|
# via uvicorn
|
||||||
validators==0.28.1
|
validators==0.28.1
|
||||||
|
|
@ -687,6 +686,3 @@ youtube-transcript-api==0.6.2
|
||||||
# via open-webui
|
# via open-webui
|
||||||
zipp==3.18.1
|
zipp==3.18.1
|
||||||
# via importlib-metadata
|
# via importlib-metadata
|
||||||
setuptools==69.5.1
|
|
||||||
# via ctranslate2
|
|
||||||
# via opentelemetry-instrumentation
|
|
||||||
|
|
|
||||||
|
|
@ -273,7 +273,6 @@ langsmith==0.1.57
|
||||||
# via langchain-community
|
# via langchain-community
|
||||||
# via langchain-core
|
# via langchain-core
|
||||||
litellm==1.37.20
|
litellm==1.37.20
|
||||||
# via litellm
|
|
||||||
# via open-webui
|
# via open-webui
|
||||||
lxml==5.2.2
|
lxml==5.2.2
|
||||||
# via unstructured
|
# via unstructured
|
||||||
|
|
@ -396,7 +395,6 @@ pandas==2.2.2
|
||||||
# via open-webui
|
# via open-webui
|
||||||
passlib==1.7.4
|
passlib==1.7.4
|
||||||
# via open-webui
|
# via open-webui
|
||||||
# via passlib
|
|
||||||
pathspec==0.12.1
|
pathspec==0.12.1
|
||||||
# via black
|
# via black
|
||||||
peewee==3.17.5
|
peewee==3.17.5
|
||||||
|
|
@ -454,7 +452,6 @@ pygments==2.18.0
|
||||||
pyjwt==2.8.0
|
pyjwt==2.8.0
|
||||||
# via litellm
|
# via litellm
|
||||||
# via open-webui
|
# via open-webui
|
||||||
# via pyjwt
|
|
||||||
pymysql==1.1.0
|
pymysql==1.1.0
|
||||||
# via open-webui
|
# via open-webui
|
||||||
pypandoc==1.13
|
pypandoc==1.13
|
||||||
|
|
@ -559,6 +556,9 @@ scipy==1.13.0
|
||||||
# via sentence-transformers
|
# via sentence-transformers
|
||||||
sentence-transformers==2.7.0
|
sentence-transformers==2.7.0
|
||||||
# via open-webui
|
# via open-webui
|
||||||
|
setuptools==69.5.1
|
||||||
|
# via ctranslate2
|
||||||
|
# via opentelemetry-instrumentation
|
||||||
shapely==2.0.4
|
shapely==2.0.4
|
||||||
# via rapidocr-onnxruntime
|
# via rapidocr-onnxruntime
|
||||||
shellingham==1.5.4
|
shellingham==1.5.4
|
||||||
|
|
@ -659,7 +659,6 @@ uvicorn==0.22.0
|
||||||
# via fastapi
|
# via fastapi
|
||||||
# via litellm
|
# via litellm
|
||||||
# via open-webui
|
# via open-webui
|
||||||
# via uvicorn
|
|
||||||
uvloop==0.19.0
|
uvloop==0.19.0
|
||||||
# via uvicorn
|
# via uvicorn
|
||||||
validators==0.28.1
|
validators==0.28.1
|
||||||
|
|
@ -687,6 +686,3 @@ youtube-transcript-api==0.6.2
|
||||||
# via open-webui
|
# via open-webui
|
||||||
zipp==3.18.1
|
zipp==3.18.1
|
||||||
# via importlib-metadata
|
# via importlib-metadata
|
||||||
setuptools==69.5.1
|
|
||||||
# via ctranslate2
|
|
||||||
# via opentelemetry-instrumentation
|
|
||||||
|
|
|
||||||
|
|
@ -654,3 +654,35 @@ export const deleteAllChats = async (token: string) => {
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const archiveAllChats = async (token: string) => {
|
||||||
|
let error = null;
|
||||||
|
|
||||||
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/archive/all`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
Accept: 'application/json',
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
...(token && { authorization: `Bearer ${token}` })
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then(async (res) => {
|
||||||
|
if (!res.ok) throw await res.json();
|
||||||
|
return res.json();
|
||||||
|
})
|
||||||
|
.then((json) => {
|
||||||
|
return json;
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
error = err.detail;
|
||||||
|
|
||||||
|
console.log(err);
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
|
|
||||||
|
|
@ -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;
|
|
||||||
};
|
|
||||||
|
|
@ -32,7 +32,7 @@ export const addNewModel = async (token: string, model: object) => {
|
||||||
export const getModelInfos = async (token: string = '') => {
|
export const getModelInfos = async (token: string = '') => {
|
||||||
let error = null;
|
let error = null;
|
||||||
|
|
||||||
const res = await fetch(`${WEBUI_API_BASE_URL}/models/`, {
|
const res = await fetch(`${WEBUI_API_BASE_URL}/models`, {
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
headers: {
|
headers: {
|
||||||
Accept: 'application/json',
|
Accept: 'application/json',
|
||||||
|
|
@ -63,7 +63,10 @@ export const getModelInfos = async (token: string = '') => {
|
||||||
export const getModelById = async (token: string, id: string) => {
|
export const getModelById = async (token: string, id: string) => {
|
||||||
let error = null;
|
let error = null;
|
||||||
|
|
||||||
const res = await fetch(`${WEBUI_API_BASE_URL}/models/${id}`, {
|
const searchParams = new URLSearchParams();
|
||||||
|
searchParams.append('id', id);
|
||||||
|
|
||||||
|
const res = await fetch(`${WEBUI_API_BASE_URL}/models?${searchParams.toString()}`, {
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
headers: {
|
headers: {
|
||||||
Accept: 'application/json',
|
Accept: 'application/json',
|
||||||
|
|
@ -95,7 +98,10 @@ export const getModelById = async (token: string, id: string) => {
|
||||||
export const updateModelById = async (token: string, id: string, model: object) => {
|
export const updateModelById = async (token: string, id: string, model: object) => {
|
||||||
let error = null;
|
let error = null;
|
||||||
|
|
||||||
const res = await fetch(`${WEBUI_API_BASE_URL}/models/${id}/update`, {
|
const searchParams = new URLSearchParams();
|
||||||
|
searchParams.append('id', id);
|
||||||
|
|
||||||
|
const res = await fetch(`${WEBUI_API_BASE_URL}/models/update?${searchParams.toString()}`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {
|
headers: {
|
||||||
Accept: 'application/json',
|
Accept: 'application/json',
|
||||||
|
|
@ -128,7 +134,10 @@ export const updateModelById = async (token: string, id: string, model: object)
|
||||||
export const deleteModelById = async (token: string, id: string) => {
|
export const deleteModelById = async (token: string, id: string) => {
|
||||||
let error = null;
|
let error = null;
|
||||||
|
|
||||||
const res = await fetch(`${WEBUI_API_BASE_URL}/models/${id}/delete`, {
|
const searchParams = new URLSearchParams();
|
||||||
|
searchParams.append('id', id);
|
||||||
|
|
||||||
|
const res = await fetch(`${WEBUI_API_BASE_URL}/models/delete?${searchParams.toString()}`, {
|
||||||
method: 'DELETE',
|
method: 'DELETE',
|
||||||
headers: {
|
headers: {
|
||||||
Accept: 'application/json',
|
Accept: 'application/json',
|
||||||
|
|
|
||||||
|
|
@ -164,7 +164,7 @@ export const getOllamaVersion = async (token: string = '') => {
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
|
|
||||||
return res?.version ?? '';
|
return res?.version ?? false;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getOllamaModels = async (token: string = '') => {
|
export const getOllamaModels = async (token: string = '') => {
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,24 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
import fileSaver from 'file-saver';
|
||||||
|
const { saveAs } = fileSaver;
|
||||||
|
|
||||||
import { downloadDatabase } from '$lib/apis/utils';
|
import { downloadDatabase } from '$lib/apis/utils';
|
||||||
import { onMount, getContext } from 'svelte';
|
import { onMount, getContext } from 'svelte';
|
||||||
import { config } from '$lib/stores';
|
import { config, user } from '$lib/stores';
|
||||||
import { toast } from 'svelte-sonner';
|
import { toast } from 'svelte-sonner';
|
||||||
|
import { getAllUserChats } from '$lib/apis/chats';
|
||||||
|
|
||||||
const i18n = getContext('i18n');
|
const i18n = getContext('i18n');
|
||||||
|
|
||||||
export let saveHandler: Function;
|
export let saveHandler: Function;
|
||||||
|
|
||||||
|
const exportAllUserChats = async () => {
|
||||||
|
let blob = new Blob([JSON.stringify(await getAllUserChats(localStorage.token))], {
|
||||||
|
type: 'application/json'
|
||||||
|
});
|
||||||
|
saveAs(blob, `all-chats-export-${Date.now()}.json`);
|
||||||
|
};
|
||||||
|
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
// permissions = await getUserPermissions(localStorage.token);
|
// permissions = await getUserPermissions(localStorage.token);
|
||||||
});
|
});
|
||||||
|
|
@ -23,10 +34,10 @@
|
||||||
<div>
|
<div>
|
||||||
<div class=" mb-2 text-sm font-medium">{$i18n.t('Database')}</div>
|
<div class=" mb-2 text-sm font-medium">{$i18n.t('Database')}</div>
|
||||||
|
|
||||||
<div class=" flex w-full justify-between">
|
{#if $config?.enable_admin_export ?? true}
|
||||||
<!-- <div class=" self-center text-xs font-medium">{$i18n.t('Allow Chat Deletion')}</div> -->
|
<div class=" flex w-full justify-between">
|
||||||
|
<!-- <div class=" self-center text-xs font-medium">{$i18n.t('Allow Chat Deletion')}</div> -->
|
||||||
|
|
||||||
{#if $config?.admin_export_enabled ?? true}
|
|
||||||
<button
|
<button
|
||||||
class=" flex rounded-md py-1.5 px-3 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
|
class=" flex rounded-md py-1.5 px-3 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
|
||||||
type="button"
|
type="button"
|
||||||
|
|
@ -55,8 +66,36 @@
|
||||||
</div>
|
</div>
|
||||||
<div class=" self-center text-sm font-medium">{$i18n.t('Download Database')}</div>
|
<div class=" self-center text-sm font-medium">{$i18n.t('Download Database')}</div>
|
||||||
</button>
|
</button>
|
||||||
{/if}
|
</div>
|
||||||
</div>
|
|
||||||
|
<hr class=" dark:border-gray-700 my-1" />
|
||||||
|
|
||||||
|
<button
|
||||||
|
class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
|
||||||
|
on:click={() => {
|
||||||
|
exportAllUserChats();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div class=" self-center mr-3">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 16 16"
|
||||||
|
fill="currentColor"
|
||||||
|
class="w-4 h-4"
|
||||||
|
>
|
||||||
|
<path d="M2 3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3Z" />
|
||||||
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
d="M13 6H3v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V6ZM8.75 7.75a.75.75 0 0 0-1.5 0v2.69L6.03 9.22a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l2.5-2.5a.75.75 0 1 0-1.06-1.06l-1.22 1.22V7.75Z"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<div class=" self-center text-sm font-medium">
|
||||||
|
{$i18n.t('Export All Chats (All Users)')}
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,12 +39,7 @@
|
||||||
import MessageInput from '$lib/components/chat/MessageInput.svelte';
|
import MessageInput from '$lib/components/chat/MessageInput.svelte';
|
||||||
import Messages from '$lib/components/chat/Messages.svelte';
|
import Messages from '$lib/components/chat/Messages.svelte';
|
||||||
import Navbar from '$lib/components/layout/Navbar.svelte';
|
import Navbar from '$lib/components/layout/Navbar.svelte';
|
||||||
import {
|
import { OLLAMA_API_BASE_URL, OPENAI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants';
|
||||||
LITELLM_API_BASE_URL,
|
|
||||||
OLLAMA_API_BASE_URL,
|
|
||||||
OPENAI_API_BASE_URL,
|
|
||||||
WEBUI_BASE_URL
|
|
||||||
} from '$lib/constants';
|
|
||||||
import { createOpenAITextStream } from '$lib/apis/streaming';
|
import { createOpenAITextStream } from '$lib/apis/streaming';
|
||||||
import { queryMemory } from '$lib/apis/memories';
|
import { queryMemory } from '$lib/apis/memories';
|
||||||
import type { Writable } from 'svelte/store';
|
import type { Writable } from 'svelte/store';
|
||||||
|
|
@ -779,9 +774,7 @@
|
||||||
docs: docs.length > 0 ? docs : undefined,
|
docs: docs.length > 0 ? docs : undefined,
|
||||||
citations: docs.length > 0
|
citations: docs.length > 0
|
||||||
},
|
},
|
||||||
model?.source?.toLowerCase() === 'litellm'
|
`${OPENAI_API_BASE_URL}`
|
||||||
? `${LITELLM_API_BASE_URL}/v1`
|
|
||||||
: `${OPENAI_API_BASE_URL}`
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// Wait until history/message have been updated
|
// Wait until history/message have been updated
|
||||||
|
|
@ -1120,6 +1113,6 @@
|
||||||
{messages}
|
{messages}
|
||||||
{submitPrompt}
|
{submitPrompt}
|
||||||
{stopResponse}
|
{stopResponse}
|
||||||
webSearchAvailable={$config.websearch ?? false}
|
webSearchAvailable={$config.enable_websearch ?? false}
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,13 @@
|
||||||
return `<code>${code.replaceAll('&', '&')}</code>`;
|
return `<code>${code.replaceAll('&', '&')}</code>`;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Open all links in a new tab/window (from https://github.com/markedjs/marked/issues/655#issuecomment-383226346)
|
||||||
|
const origLinkRenderer = renderer.link;
|
||||||
|
renderer.link = (href, title, text) => {
|
||||||
|
const html = origLinkRenderer.call(renderer, href, title, text);
|
||||||
|
return html.replace(/^<a /, '<a target="_blank" rel="nofollow" ');
|
||||||
|
};
|
||||||
|
|
||||||
const { extensions, ...defaults } = marked.getDefaults() as marked.MarkedOptions & {
|
const { extensions, ...defaults } = marked.getDefaults() as marked.MarkedOptions & {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
extensions: any;
|
extensions: any;
|
||||||
|
|
@ -790,7 +797,7 @@
|
||||||
</button>
|
</button>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
|
|
||||||
{#if $config.images && !readOnly}
|
{#if $config.enable_image_generation && !readOnly}
|
||||||
<Tooltip content="Generate Image" placement="bottom">
|
<Tooltip content="Generate Image" placement="bottom">
|
||||||
<button
|
<button
|
||||||
class="{isLastMessage
|
class="{isLastMessage
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
import { chats, user, config } from '$lib/stores';
|
import { chats, user, config } from '$lib/stores';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
archiveAllChats,
|
||||||
createNewChat,
|
createNewChat,
|
||||||
deleteAllChats,
|
deleteAllChats,
|
||||||
getAllChats,
|
getAllChats,
|
||||||
|
|
@ -22,7 +23,10 @@
|
||||||
// Chats
|
// Chats
|
||||||
let saveChatHistory = true;
|
let saveChatHistory = true;
|
||||||
let importFiles;
|
let importFiles;
|
||||||
|
|
||||||
|
let showArchiveConfirm = false;
|
||||||
let showDeleteConfirm = false;
|
let showDeleteConfirm = false;
|
||||||
|
|
||||||
let chatImportInputElement: HTMLInputElement;
|
let chatImportInputElement: HTMLInputElement;
|
||||||
|
|
||||||
$: if (importFiles) {
|
$: if (importFiles) {
|
||||||
|
|
@ -68,14 +72,15 @@
|
||||||
saveAs(blob, `chat-export-${Date.now()}.json`);
|
saveAs(blob, `chat-export-${Date.now()}.json`);
|
||||||
};
|
};
|
||||||
|
|
||||||
const exportAllUserChats = async () => {
|
const archiveAllChatsHandler = async () => {
|
||||||
let blob = new Blob([JSON.stringify(await getAllUserChats(localStorage.token))], {
|
await goto('/');
|
||||||
type: 'application/json'
|
await archiveAllChats(localStorage.token).catch((error) => {
|
||||||
|
toast.error(error);
|
||||||
});
|
});
|
||||||
saveAs(blob, `all-chats-export-${Date.now()}.json`);
|
await chats.set(await getChatList(localStorage.token));
|
||||||
};
|
};
|
||||||
|
|
||||||
const deleteChats = async () => {
|
const deleteAllChatsHandler = async () => {
|
||||||
await goto('/');
|
await goto('/');
|
||||||
await deleteAllChats(localStorage.token).catch((error) => {
|
await deleteAllChats(localStorage.token).catch((error) => {
|
||||||
toast.error(error);
|
toast.error(error);
|
||||||
|
|
@ -217,118 +222,177 @@
|
||||||
|
|
||||||
<hr class=" dark:border-gray-700" />
|
<hr class=" dark:border-gray-700" />
|
||||||
|
|
||||||
{#if showDeleteConfirm}
|
<div class="flex flex-col">
|
||||||
<div class="flex justify-between rounded-md items-center py-2 px-3.5 w-full transition">
|
{#if showArchiveConfirm}
|
||||||
<div class="flex items-center space-x-3">
|
<div class="flex justify-between rounded-md items-center py-2 px-3.5 w-full transition">
|
||||||
<svg
|
<div class="flex items-center space-x-3">
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 16 16"
|
|
||||||
fill="currentColor"
|
|
||||||
class="w-4 h-4"
|
|
||||||
>
|
|
||||||
<path d="M2 3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3Z" />
|
|
||||||
<path
|
|
||||||
fill-rule="evenodd"
|
|
||||||
d="M13 6H3v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V6ZM5.72 7.47a.75.75 0 0 1 1.06 0L8 8.69l1.22-1.22a.75.75 0 1 1 1.06 1.06L9.06 9.75l1.22 1.22a.75.75 0 1 1-1.06 1.06L8 10.81l-1.22 1.22a.75.75 0 0 1-1.06-1.06l1.22-1.22-1.22-1.22a.75.75 0 0 1 0-1.06Z"
|
|
||||||
clip-rule="evenodd"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
<span>{$i18n.t('Are you sure?')}</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flex space-x-1.5 items-center">
|
|
||||||
<button
|
|
||||||
class="hover:text-white transition"
|
|
||||||
on:click={() => {
|
|
||||||
deleteChats();
|
|
||||||
showDeleteConfirm = false;
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 20 20"
|
viewBox="0 0 16 16"
|
||||||
|
fill="currentColor"
|
||||||
|
class="w-4 h-4"
|
||||||
|
>
|
||||||
|
<path d="M2 3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3Z" />
|
||||||
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
d="M13 6H3v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V6ZM5.72 7.47a.75.75 0 0 1 1.06 0L8 8.69l1.22-1.22a.75.75 0 1 1 1.06 1.06L9.06 9.75l1.22 1.22a.75.75 0 1 1-1.06 1.06L8 10.81l-1.22 1.22a.75.75 0 0 1-1.06-1.06l1.22-1.22-1.22-1.22a.75.75 0 0 1 0-1.06Z"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
<span>{$i18n.t('Are you sure?')}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex space-x-1.5 items-center">
|
||||||
|
<button
|
||||||
|
class="hover:text-white transition"
|
||||||
|
on:click={() => {
|
||||||
|
archiveAllChatsHandler();
|
||||||
|
showArchiveConfirm = false;
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
fill="currentColor"
|
||||||
|
class="w-4 h-4"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
class="hover:text-white transition"
|
||||||
|
on:click={() => {
|
||||||
|
showArchiveConfirm = false;
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
fill="currentColor"
|
||||||
|
class="w-4 h-4"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{:else}
|
||||||
|
<button
|
||||||
|
class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
|
||||||
|
on:click={() => {
|
||||||
|
showArchiveConfirm = true;
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div class=" self-center mr-3">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="currentColor"
|
||||||
|
class="size-4"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M3.375 3C2.339 3 1.5 3.84 1.5 4.875v.75c0 1.036.84 1.875 1.875 1.875h17.25c1.035 0 1.875-.84 1.875-1.875v-.75C22.5 3.839 21.66 3 20.625 3H3.375Z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
d="m3.087 9 .54 9.176A3 3 0 0 0 6.62 21h10.757a3 3 0 0 0 2.995-2.824L20.913 9H3.087Zm6.163 3.75A.75.75 0 0 1 10 12h4a.75.75 0 0 1 0 1.5h-4a.75.75 0 0 1-.75-.75Z"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<div class=" self-center text-sm font-medium">{$i18n.t('Archive All Chats')}</div>
|
||||||
|
</button>
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
{#if showDeleteConfirm}
|
||||||
|
<div class="flex justify-between rounded-md items-center py-2 px-3.5 w-full transition">
|
||||||
|
<div class="flex items-center space-x-3">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 16 16"
|
||||||
|
fill="currentColor"
|
||||||
|
class="w-4 h-4"
|
||||||
|
>
|
||||||
|
<path d="M2 3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3Z" />
|
||||||
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
d="M13 6H3v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V6ZM5.72 7.47a.75.75 0 0 1 1.06 0L8 8.69l1.22-1.22a.75.75 0 1 1 1.06 1.06L9.06 9.75l1.22 1.22a.75.75 0 1 1-1.06 1.06L8 10.81l-1.22 1.22a.75.75 0 0 1-1.06-1.06l1.22-1.22-1.22-1.22a.75.75 0 0 1 0-1.06Z"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
<span>{$i18n.t('Are you sure?')}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex space-x-1.5 items-center">
|
||||||
|
<button
|
||||||
|
class="hover:text-white transition"
|
||||||
|
on:click={() => {
|
||||||
|
deleteAllChatsHandler();
|
||||||
|
showDeleteConfirm = false;
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
fill="currentColor"
|
||||||
|
class="w-4 h-4"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
class="hover:text-white transition"
|
||||||
|
on:click={() => {
|
||||||
|
showDeleteConfirm = false;
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
fill="currentColor"
|
||||||
|
class="w-4 h-4"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{:else}
|
||||||
|
<button
|
||||||
|
class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
|
||||||
|
on:click={() => {
|
||||||
|
showDeleteConfirm = true;
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div class=" self-center mr-3">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 16 16"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
class="w-4 h-4"
|
class="w-4 h-4"
|
||||||
>
|
>
|
||||||
<path
|
<path
|
||||||
fill-rule="evenodd"
|
fill-rule="evenodd"
|
||||||
d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z"
|
d="M4 2a1.5 1.5 0 0 0-1.5 1.5v9A1.5 1.5 0 0 0 4 14h8a1.5 1.5 0 0 0 1.5-1.5V6.621a1.5 1.5 0 0 0-.44-1.06L9.94 2.439A1.5 1.5 0 0 0 8.878 2H4Zm7 7a.75.75 0 0 1-.75.75h-4.5a.75.75 0 0 1 0-1.5h4.5A.75.75 0 0 1 11 9Z"
|
||||||
clip-rule="evenodd"
|
clip-rule="evenodd"
|
||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</div>
|
||||||
<button
|
<div class=" self-center text-sm font-medium">{$i18n.t('Delete All Chats')}</div>
|
||||||
class="hover:text-white transition"
|
</button>
|
||||||
on:click={() => {
|
{/if}
|
||||||
showDeleteConfirm = false;
|
</div>
|
||||||
}}
|
|
||||||
>
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 20 20"
|
|
||||||
fill="currentColor"
|
|
||||||
class="w-4 h-4"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{:else}
|
|
||||||
<button
|
|
||||||
class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
|
|
||||||
on:click={() => {
|
|
||||||
showDeleteConfirm = true;
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div class=" self-center mr-3">
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 16 16"
|
|
||||||
fill="currentColor"
|
|
||||||
class="w-4 h-4"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
fill-rule="evenodd"
|
|
||||||
d="M4 2a1.5 1.5 0 0 0-1.5 1.5v9A1.5 1.5 0 0 0 4 14h8a1.5 1.5 0 0 0 1.5-1.5V6.621a1.5 1.5 0 0 0-.44-1.06L9.94 2.439A1.5 1.5 0 0 0 8.878 2H4Zm7 7a.75.75 0 0 1-.75.75h-4.5a.75.75 0 0 1 0-1.5h4.5A.75.75 0 0 1 11 9Z"
|
|
||||||
clip-rule="evenodd"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
<div class=" self-center text-sm font-medium">{$i18n.t('Delete Chats')}</div>
|
|
||||||
</button>
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
{#if $user?.role === 'admin' && ($config?.admin_export_enabled ?? true)}
|
|
||||||
<hr class=" dark:border-gray-700" />
|
|
||||||
|
|
||||||
<button
|
|
||||||
class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
|
|
||||||
on:click={() => {
|
|
||||||
exportAllUserChats();
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div class=" self-center mr-3">
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 16 16"
|
|
||||||
fill="currentColor"
|
|
||||||
class="w-4 h-4"
|
|
||||||
>
|
|
||||||
<path d="M2 3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3Z" />
|
|
||||||
<path
|
|
||||||
fill-rule="evenodd"
|
|
||||||
d="M13 6H3v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V6ZM8.75 7.75a.75.75 0 0 0-1.5 0v2.69L6.03 9.22a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l2.5-2.5a.75.75 0 1 0-1.06-1.06l-1.22 1.22V7.75Z"
|
|
||||||
clip-rule="evenodd"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
<div class=" self-center text-sm font-medium">
|
|
||||||
{$i18n.t('Export All Chats (All Users)')}
|
|
||||||
</div>
|
|
||||||
</button>
|
|
||||||
{/if}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -302,7 +302,7 @@
|
||||||
system: system !== '' ? system : undefined,
|
system: system !== '' ? system : undefined,
|
||||||
params: {
|
params: {
|
||||||
seed: (params.seed !== 0 ? params.seed : undefined) ?? undefined,
|
seed: (params.seed !== 0 ? params.seed : undefined) ?? undefined,
|
||||||
stop: params.stop !== null ? params.stop.split(',').filter((e) => e) : undefined,
|
stop: params.stop ? params.stop.split(',').filter((e) => e) : undefined,
|
||||||
temperature: params.temperature !== '' ? params.temperature : undefined,
|
temperature: params.temperature !== '' ? params.temperature : undefined,
|
||||||
frequency_penalty:
|
frequency_penalty:
|
||||||
params.frequency_penalty !== '' ? params.frequency_penalty : undefined,
|
params.frequency_penalty !== '' ? params.frequency_penalty : undefined,
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
import { onMount, getContext } from 'svelte';
|
import { onMount, getContext } from 'svelte';
|
||||||
|
|
||||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||||
|
import Spinner from '$lib/components/common/Spinner.svelte';
|
||||||
|
|
||||||
const i18n = getContext('i18n');
|
const i18n = getContext('i18n');
|
||||||
|
|
||||||
|
|
@ -34,7 +35,8 @@
|
||||||
let updateProgress = null;
|
let updateProgress = null;
|
||||||
|
|
||||||
let showExperimentalOllama = false;
|
let showExperimentalOllama = false;
|
||||||
let ollamaVersion = '';
|
|
||||||
|
let ollamaVersion = null;
|
||||||
const MAX_PARALLEL_DOWNLOADS = 3;
|
const MAX_PARALLEL_DOWNLOADS = 3;
|
||||||
|
|
||||||
let modelTransferring = false;
|
let modelTransferring = false;
|
||||||
|
|
@ -56,8 +58,11 @@
|
||||||
const updateModelsHandler = async () => {
|
const updateModelsHandler = async () => {
|
||||||
for (const model of $models.filter(
|
for (const model of $models.filter(
|
||||||
(m) =>
|
(m) =>
|
||||||
m.size != null &&
|
!(m?.preset ?? false) &&
|
||||||
(selectedOllamaUrlIdx === null ? true : (m?.urls ?? []).includes(selectedOllamaUrlIdx))
|
m.owned_by === 'ollama' &&
|
||||||
|
(selectedOllamaUrlIdx === null
|
||||||
|
? true
|
||||||
|
: (m?.ollama?.urls ?? []).includes(selectedOllamaUrlIdx))
|
||||||
)) {
|
)) {
|
||||||
console.log(model);
|
console.log(model);
|
||||||
|
|
||||||
|
|
@ -446,7 +451,7 @@
|
||||||
|
|
||||||
<div class="flex flex-col h-full justify-between text-sm">
|
<div class="flex flex-col h-full justify-between text-sm">
|
||||||
<div class=" space-y-3 pr-1.5 overflow-y-scroll h-[24rem]">
|
<div class=" space-y-3 pr-1.5 overflow-y-scroll h-[24rem]">
|
||||||
{#if ollamaVersion}
|
{#if ollamaVersion !== null}
|
||||||
<div class="space-y-2 pr-1.5">
|
<div class="space-y-2 pr-1.5">
|
||||||
<div class="text-sm font-medium">{$i18n.t('Manage Ollama Models')}</div>
|
<div class="text-sm font-medium">{$i18n.t('Manage Ollama Models')}</div>
|
||||||
|
|
||||||
|
|
@ -644,9 +649,12 @@
|
||||||
{#if !deleteModelTag}
|
{#if !deleteModelTag}
|
||||||
<option value="" disabled selected>{$i18n.t('Select a model')}</option>
|
<option value="" disabled selected>{$i18n.t('Select a model')}</option>
|
||||||
{/if}
|
{/if}
|
||||||
{#each $models.filter((m) => m.size != null && (selectedOllamaUrlIdx === null ? true : (m?.urls ?? []).includes(selectedOllamaUrlIdx))) as model}
|
{#each $models.filter((m) => !(m?.preset ?? false) && m.owned_by === 'ollama' && (selectedOllamaUrlIdx === null ? true : (m?.ollama?.urls ?? []).includes(selectedOllamaUrlIdx))) as model}
|
||||||
<option value={model.name} class="bg-gray-100 dark:bg-gray-700"
|
<option value={model.name} class="bg-gray-100 dark:bg-gray-700"
|
||||||
>{model.name + ' (' + (model.size / 1024 ** 3).toFixed(1) + ' GB)'}</option
|
>{model.name +
|
||||||
|
' (' +
|
||||||
|
(model.ollama.size / 1024 ** 3).toFixed(1) +
|
||||||
|
' GB)'}</option
|
||||||
>
|
>
|
||||||
{/each}
|
{/each}
|
||||||
</select>
|
</select>
|
||||||
|
|
@ -874,8 +882,14 @@
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{:else}
|
{:else if ollamaVersion === false}
|
||||||
<div>Ollama Not Detected</div>
|
<div>Ollama Not Detected</div>
|
||||||
|
{:else}
|
||||||
|
<div class="flex h-full justify-center">
|
||||||
|
<div class="my-auto">
|
||||||
|
<Spinner className="size-6" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
export let className: string = '';
|
export let className: string = 'size-5';
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="flex justify-center text-center {className}">
|
<div class="flex justify-center text-center">
|
||||||
<svg class="size-5" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"
|
<svg class={className} viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"
|
||||||
><style>
|
><style>
|
||||||
.spinner_ajPY {
|
.spinner_ajPY {
|
||||||
transform-origin: center;
|
transform-origin: center;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
import fileSaver from 'file-saver';
|
||||||
|
const { saveAs } = fileSaver;
|
||||||
import { toast } from 'svelte-sonner';
|
import { toast } from 'svelte-sonner';
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import { getContext, createEventDispatcher } from 'svelte';
|
import { getContext, createEventDispatcher } from 'svelte';
|
||||||
|
|
@ -13,6 +15,8 @@
|
||||||
|
|
||||||
export let show = false;
|
export let show = false;
|
||||||
|
|
||||||
|
let searchValue = '';
|
||||||
|
|
||||||
let chats = [];
|
let chats = [];
|
||||||
|
|
||||||
const unarchiveChatHandler = async (chatId) => {
|
const unarchiveChatHandler = async (chatId) => {
|
||||||
|
|
@ -33,6 +37,13 @@
|
||||||
chats = await getArchivedChatList(localStorage.token);
|
chats = await getArchivedChatList(localStorage.token);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const exportChatsHandler = async () => {
|
||||||
|
let blob = new Blob([JSON.stringify(chats)], {
|
||||||
|
type: 'application/json'
|
||||||
|
});
|
||||||
|
saveAs(blob, `archived-chat-export-${Date.now()}.json`);
|
||||||
|
};
|
||||||
|
|
||||||
$: if (show) {
|
$: if (show) {
|
||||||
(async () => {
|
(async () => {
|
||||||
chats = await getArchivedChatList(localStorage.token);
|
chats = await getArchivedChatList(localStorage.token);
|
||||||
|
|
@ -63,102 +74,136 @@
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex flex-col md:flex-row w-full px-5 pb-4 md:space-x-4 dark:text-gray-200">
|
<div class="flex flex-col w-full px-5 pb-4 dark:text-gray-200">
|
||||||
|
<div class=" flex w-full mt-2 space-x-2">
|
||||||
|
<div class="flex flex-1">
|
||||||
|
<div class=" self-center ml-1 mr-3">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
fill="currentColor"
|
||||||
|
class="w-4 h-4"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
d="M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<input
|
||||||
|
class=" w-full text-sm pr-4 py-1 rounded-r-xl outline-none bg-transparent"
|
||||||
|
bind:value={searchValue}
|
||||||
|
placeholder={$i18n.t('Search Chats')}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<hr class=" dark:border-gray-850 my-2" />
|
||||||
<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
|
<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
|
||||||
{#if chats.length > 0}
|
{#if chats.length > 0}
|
||||||
<div class="text-left text-sm w-full mb-4 max-h-[22rem] overflow-y-scroll">
|
<div>
|
||||||
<div class="relative overflow-x-auto">
|
<div class="text-left text-sm w-full mb-3 max-h-[22rem] overflow-y-scroll">
|
||||||
<table class="w-full text-sm text-left text-gray-600 dark:text-gray-400 table-auto">
|
<div class="relative overflow-x-auto">
|
||||||
<thead
|
<table class="w-full text-sm text-left text-gray-600 dark:text-gray-400 table-auto">
|
||||||
class="text-xs text-gray-700 uppercase bg-transparent dark:text-gray-200 border-b-2 dark:border-gray-800"
|
<thead
|
||||||
>
|
class="text-xs text-gray-700 uppercase bg-transparent dark:text-gray-200 border-b-2 dark:border-gray-800"
|
||||||
<tr>
|
>
|
||||||
<th scope="col" class="px-3 py-2"> {$i18n.t('Name')} </th>
|
<tr>
|
||||||
<th scope="col" class="px-3 py-2 hidden md:flex"> {$i18n.t('Created At')} </th>
|
<th scope="col" class="px-3 py-2"> {$i18n.t('Name')} </th>
|
||||||
<th scope="col" class="px-3 py-2 text-right" />
|
<th scope="col" class="px-3 py-2 hidden md:flex">
|
||||||
</tr>
|
{$i18n.t('Created At')}
|
||||||
</thead>
|
</th>
|
||||||
<tbody>
|
<th scope="col" class="px-3 py-2 text-right" />
|
||||||
{#each chats as chat, idx}
|
|
||||||
<tr
|
|
||||||
class="bg-transparent {idx !== chats.length - 1 &&
|
|
||||||
'border-b'} dark:bg-gray-900 dark:border-gray-850 text-xs"
|
|
||||||
>
|
|
||||||
<td class="px-3 py-1 w-2/3">
|
|
||||||
<a href="/c/{chat.id}" target="_blank">
|
|
||||||
<div class=" underline line-clamp-1">
|
|
||||||
{chat.title}
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
|
|
||||||
<td class=" px-3 py-1 hidden md:flex h-[2.5rem]">
|
|
||||||
<div class="my-auto">
|
|
||||||
{dayjs(chat.created_at * 1000).format($i18n.t('MMMM DD, YYYY HH:mm'))}
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
|
|
||||||
<td class="px-3 py-1 text-right">
|
|
||||||
<div class="flex justify-end w-full">
|
|
||||||
<Tooltip content="Unarchive Chat">
|
|
||||||
<button
|
|
||||||
class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
|
||||||
on:click={async () => {
|
|
||||||
unarchiveChatHandler(chat.id);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
fill="none"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
stroke-width="1.5"
|
|
||||||
stroke="currentColor"
|
|
||||||
class="size-4"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
d="M9 8.25H7.5a2.25 2.25 0 0 0-2.25 2.25v9a2.25 2.25 0 0 0 2.25 2.25h9a2.25 2.25 0 0 0 2.25-2.25v-9a2.25 2.25 0 0 0-2.25-2.25H15m0-3-3-3m0 0-3 3m3-3V15"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
</Tooltip>
|
|
||||||
|
|
||||||
<Tooltip content="Delete Chat">
|
|
||||||
<button
|
|
||||||
class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
|
||||||
on:click={async () => {
|
|
||||||
deleteChatHandler(chat.id);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
fill="none"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
stroke-width="1.5"
|
|
||||||
stroke="currentColor"
|
|
||||||
class="w-4 h-4"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
</Tooltip>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
{/each}
|
</thead>
|
||||||
</tbody>
|
<tbody>
|
||||||
</table>
|
{#each chats.filter((c) => searchValue === '' || c.title
|
||||||
</div>
|
.toLowerCase()
|
||||||
<!-- {#each chats as chat}
|
.includes(searchValue.toLowerCase())) as chat, idx}
|
||||||
<div>
|
<tr
|
||||||
{JSON.stringify(chat)}
|
class="bg-transparent {idx !== chats.length - 1 &&
|
||||||
|
'border-b'} dark:bg-gray-900 dark:border-gray-850 text-xs"
|
||||||
|
>
|
||||||
|
<td class="px-3 py-1 w-2/3">
|
||||||
|
<a href="/c/{chat.id}" target="_blank">
|
||||||
|
<div class=" underline line-clamp-1">
|
||||||
|
{chat.title}
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td class=" px-3 py-1 hidden md:flex h-[2.5rem]">
|
||||||
|
<div class="my-auto">
|
||||||
|
{dayjs(chat.created_at * 1000).format($i18n.t('MMMM DD, YYYY HH:mm'))}
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td class="px-3 py-1 text-right">
|
||||||
|
<div class="flex justify-end w-full">
|
||||||
|
<Tooltip content="Unarchive Chat">
|
||||||
|
<button
|
||||||
|
class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||||
|
on:click={async () => {
|
||||||
|
unarchiveChatHandler(chat.id);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke-width="1.5"
|
||||||
|
stroke="currentColor"
|
||||||
|
class="size-4"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
d="M9 8.25H7.5a2.25 2.25 0 0 0-2.25 2.25v9a2.25 2.25 0 0 0 2.25 2.25h9a2.25 2.25 0 0 0 2.25-2.25v-9a2.25 2.25 0 0 0-2.25-2.25H15m0-3-3-3m0 0-3 3m3-3V15"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</Tooltip>
|
||||||
|
|
||||||
|
<Tooltip content="Delete Chat">
|
||||||
|
<button
|
||||||
|
class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||||
|
on:click={async () => {
|
||||||
|
deleteChatHandler(chat.id);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke-width="1.5"
|
||||||
|
stroke="currentColor"
|
||||||
|
class="w-4 h-4"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</Tooltip>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{/each}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
</div>
|
</div>
|
||||||
{/each} -->
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap text-sm font-medium gap-1.5 mt-2 m-1">
|
||||||
|
<button
|
||||||
|
class=" px-3.5 py-1.5 font-medium hover:bg-black/5 dark:hover:bg-white/5 outline outline-1 outline-gray-300 dark:outline-gray-800 rounded-3xl"
|
||||||
|
on:click={() => {
|
||||||
|
exportChatsHandler();
|
||||||
|
}}>Export All Archived Chats</button
|
||||||
|
>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{:else}
|
{:else}
|
||||||
<div class="text-left text-sm w-full mb-8">
|
<div class="text-left text-sm w-full mb-8">
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,8 @@
|
||||||
let importFiles;
|
let importFiles;
|
||||||
let modelsImportInputElement: HTMLInputElement;
|
let modelsImportInputElement: HTMLInputElement;
|
||||||
|
|
||||||
|
let searchValue = '';
|
||||||
|
|
||||||
const deleteModelHandler = async (model) => {
|
const deleteModelHandler = async (model) => {
|
||||||
console.log(model.info);
|
console.log(model.info);
|
||||||
if (!model?.info) {
|
if (!model?.info) {
|
||||||
|
|
@ -97,6 +99,49 @@
|
||||||
|
|
||||||
<div class=" text-lg font-semibold mb-3">{$i18n.t('Models')}</div>
|
<div class=" text-lg font-semibold mb-3">{$i18n.t('Models')}</div>
|
||||||
|
|
||||||
|
<div class=" flex w-full space-x-2">
|
||||||
|
<div class="flex flex-1">
|
||||||
|
<div class=" self-center ml-1 mr-3">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
fill="currentColor"
|
||||||
|
class="w-4 h-4"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
d="M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<input
|
||||||
|
class=" w-full text-sm pr-4 py-1 rounded-r-xl outline-none bg-transparent"
|
||||||
|
bind:value={searchValue}
|
||||||
|
placeholder={$i18n.t('Search Models')}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<a
|
||||||
|
class=" px-2 py-2 rounded-xl border border-gray-200 dark:border-gray-600 dark:border-0 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 transition font-medium text-sm flex items-center space-x-1"
|
||||||
|
href="/workspace/models/create"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 16 16"
|
||||||
|
fill="currentColor"
|
||||||
|
class="w-4 h-4"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M8.75 3.75a.75.75 0 0 0-1.5 0v3.5h-3.5a.75.75 0 0 0 0 1.5h3.5v3.5a.75.75 0 0 0 1.5 0v-3.5h3.5a.75.75 0 0 0 0-1.5h-3.5v-3.5Z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<hr class=" dark:border-gray-850 my-2.5" />
|
||||||
|
|
||||||
<a class=" flex space-x-4 cursor-pointer w-full mb-2 px-3 py-2" href="/workspace/models/create">
|
<a class=" flex space-x-4 cursor-pointer w-full mb-2 px-3 py-2" href="/workspace/models/create">
|
||||||
<div class=" self-center w-10">
|
<div class=" self-center w-10">
|
||||||
<div
|
<div
|
||||||
|
|
@ -121,7 +166,9 @@
|
||||||
<hr class=" dark:border-gray-850" />
|
<hr class=" dark:border-gray-850" />
|
||||||
|
|
||||||
<div class=" my-2 mb-5">
|
<div class=" my-2 mb-5">
|
||||||
{#each $models as model}
|
{#each $models.filter((m) => searchValue === '' || m.name
|
||||||
|
.toLowerCase()
|
||||||
|
.includes(searchValue.toLowerCase())) as model}
|
||||||
<div
|
<div
|
||||||
class=" flex space-x-4 cursor-pointer w-full px-3 py-2 dark:hover:bg-white/5 hover:bg-black/5 rounded-xl"
|
class=" flex space-x-4 cursor-pointer w-full px-3 py-2 dark:hover:bg-white/5 hover:bg-black/5 rounded-xl"
|
||||||
>
|
>
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,7 @@
|
||||||
|
|
||||||
import { toast } from 'svelte-sonner';
|
import { toast } from 'svelte-sonner';
|
||||||
|
|
||||||
import {
|
import { OLLAMA_API_BASE_URL, OPENAI_API_BASE_URL, WEBUI_API_BASE_URL } from '$lib/constants';
|
||||||
LITELLM_API_BASE_URL,
|
|
||||||
OLLAMA_API_BASE_URL,
|
|
||||||
OPENAI_API_BASE_URL,
|
|
||||||
WEBUI_API_BASE_URL
|
|
||||||
} from '$lib/constants';
|
|
||||||
import { WEBUI_NAME, config, user, models, settings } from '$lib/stores';
|
import { WEBUI_NAME, config, user, models, settings } from '$lib/stores';
|
||||||
|
|
||||||
import { cancelOllamaRequest, generateChatCompletion } from '$lib/apis/ollama';
|
import { cancelOllamaRequest, generateChatCompletion } from '$lib/apis/ollama';
|
||||||
|
|
@ -79,11 +74,7 @@
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
model.external
|
model?.owned_by === 'openai' ? `${OPENAI_API_BASE_URL}` : `${OLLAMA_API_BASE_URL}/v1`
|
||||||
? model.source === 'litellm'
|
|
||||||
? `${LITELLM_API_BASE_URL}/v1`
|
|
||||||
: `${OPENAI_API_BASE_URL}`
|
|
||||||
: `${OLLAMA_API_BASE_URL}/v1`
|
|
||||||
);
|
);
|
||||||
|
|
||||||
if (res && res.ok) {
|
if (res && res.ok) {
|
||||||
|
|
@ -150,11 +141,7 @@
|
||||||
...messages
|
...messages
|
||||||
].filter((message) => message)
|
].filter((message) => message)
|
||||||
},
|
},
|
||||||
model.external
|
model?.owned_by === 'openai' ? `${OPENAI_API_BASE_URL}` : `${OLLAMA_API_BASE_URL}/v1`
|
||||||
? model.source === 'litellm'
|
|
||||||
? `${LITELLM_API_BASE_URL}/v1`
|
|
||||||
: `${OPENAI_API_BASE_URL}`
|
|
||||||
: `${OLLAMA_API_BASE_URL}/v1`
|
|
||||||
);
|
);
|
||||||
|
|
||||||
let responseMessage;
|
let responseMessage;
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ export const WEBUI_BASE_URL = browser ? (dev ? `http://${location.hostname}:8080
|
||||||
|
|
||||||
export const WEBUI_API_BASE_URL = `${WEBUI_BASE_URL}/api/v1`;
|
export const WEBUI_API_BASE_URL = `${WEBUI_BASE_URL}/api/v1`;
|
||||||
|
|
||||||
export const LITELLM_API_BASE_URL = `${WEBUI_BASE_URL}/litellm/api`;
|
|
||||||
export const OLLAMA_API_BASE_URL = `${WEBUI_BASE_URL}/ollama`;
|
export const OLLAMA_API_BASE_URL = `${WEBUI_BASE_URL}/ollama`;
|
||||||
export const OPENAI_API_BASE_URL = `${WEBUI_BASE_URL}/openai`;
|
export const OPENAI_API_BASE_URL = `${WEBUI_BASE_URL}/openai`;
|
||||||
export const AUDIO_API_BASE_URL = `${WEBUI_BASE_URL}/audio/api/v1`;
|
export const AUDIO_API_BASE_URL = `${WEBUI_BASE_URL}/audio/api/v1`;
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "مفاتيح واجهة برمجة التطبيقات",
|
"API keys": "مفاتيح واجهة برمجة التطبيقات",
|
||||||
"April": "أبريل",
|
"April": "أبريل",
|
||||||
"Archive": "الأرشيف",
|
"Archive": "الأرشيف",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "الأرشيف المحادثات",
|
"Archived Chats": "الأرشيف المحادثات",
|
||||||
"are allowed - Activate this command by typing": "مسموح - قم بتنشيط هذا الأمر عن طريق الكتابة",
|
"are allowed - Activate this command by typing": "مسموح - قم بتنشيط هذا الأمر عن طريق الكتابة",
|
||||||
"Are you sure?": "هل أنت متأكد ؟",
|
"Are you sure?": "هل أنت متأكد ؟",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "مخصص",
|
"Custom": "مخصص",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "مظلم",
|
"Dark": "مظلم",
|
||||||
"Dashboard": "لوحة التحكم",
|
|
||||||
"Database": "قاعدة البيانات",
|
"Database": "قاعدة البيانات",
|
||||||
"December": "ديسمبر",
|
"December": "ديسمبر",
|
||||||
"Default": "الإفتراضي",
|
"Default": "الإفتراضي",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "حذف",
|
"delete": "حذف",
|
||||||
"Delete": "حذف",
|
"Delete": "حذف",
|
||||||
"Delete a model": "حذف الموديل",
|
"Delete a model": "حذف الموديل",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "حذف المحادثه",
|
"Delete chat": "حذف المحادثه",
|
||||||
"Delete Chat": "حذف المحادثه.",
|
"Delete Chat": "حذف المحادثه.",
|
||||||
"Delete Chats": "حذف المحادثات",
|
|
||||||
"delete this link": "أحذف هذا الرابط",
|
"delete this link": "أحذف هذا الرابط",
|
||||||
"Delete User": "حذف المستخدم",
|
"Delete User": "حذف المستخدم",
|
||||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} حذف",
|
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} حذف",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "URL/مفتاح OpenAI.مطلوب عنوان ",
|
"OpenAI URL/Key required.": "URL/مفتاح OpenAI.مطلوب عنوان ",
|
||||||
"or": "أو",
|
"or": "أو",
|
||||||
"Other": "آخر",
|
"Other": "آخر",
|
||||||
"Overview": "عرض",
|
|
||||||
"Password": "الباسورد",
|
"Password": "الباسورد",
|
||||||
"PDF document (.pdf)": "PDF ملف (.pdf)",
|
"PDF document (.pdf)": "PDF ملف (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "PDF أستخرج الصور (OCR)",
|
"PDF Extract Images (OCR)": "PDF أستخرج الصور (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "{{path}} مسح على الملفات من",
|
"Scan for documents from {{path}}": "{{path}} مسح على الملفات من",
|
||||||
"Search": "البحث",
|
"Search": "البحث",
|
||||||
"Search a model": "البحث عن موديل",
|
"Search a model": "البحث عن موديل",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "البحث المستندات",
|
"Search Documents": "البحث المستندات",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "أبحث حث",
|
"Search Prompts": "أبحث حث",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "API Ключове",
|
"API keys": "API Ключове",
|
||||||
"April": "Април",
|
"April": "Април",
|
||||||
"Archive": "Архивирани Чатове",
|
"Archive": "Архивирани Чатове",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "Архивирани Чатове",
|
"Archived Chats": "Архивирани Чатове",
|
||||||
"are allowed - Activate this command by typing": "са разрешени - Активирайте тази команда чрез въвеждане",
|
"are allowed - Activate this command by typing": "са разрешени - Активирайте тази команда чрез въвеждане",
|
||||||
"Are you sure?": "Сигурни ли сте?",
|
"Are you sure?": "Сигурни ли сте?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Персонализиран",
|
"Custom": "Персонализиран",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Тъмен",
|
"Dark": "Тъмен",
|
||||||
"Dashboard": "Панел",
|
|
||||||
"Database": "База данни",
|
"Database": "База данни",
|
||||||
"December": "Декември",
|
"December": "Декември",
|
||||||
"Default": "По подразбиране",
|
"Default": "По подразбиране",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "изтриване",
|
"delete": "изтриване",
|
||||||
"Delete": "Изтриване",
|
"Delete": "Изтриване",
|
||||||
"Delete a model": "Изтриване на модел",
|
"Delete a model": "Изтриване на модел",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Изтриване на чат",
|
"Delete chat": "Изтриване на чат",
|
||||||
"Delete Chat": "Изтриване на Чат",
|
"Delete Chat": "Изтриване на Чат",
|
||||||
"Delete Chats": "Изтриване на Чатове",
|
|
||||||
"delete this link": "Изтриване на този линк",
|
"delete this link": "Изтриване на този линк",
|
||||||
"Delete User": "Изтриване на потребител",
|
"Delete User": "Изтриване на потребител",
|
||||||
"Deleted {{deleteModelTag}}": "Изтрито {{deleteModelTag}}",
|
"Deleted {{deleteModelTag}}": "Изтрито {{deleteModelTag}}",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "OpenAI URL/Key е задължителен.",
|
"OpenAI URL/Key required.": "OpenAI URL/Key е задължителен.",
|
||||||
"or": "или",
|
"or": "или",
|
||||||
"Other": "Other",
|
"Other": "Other",
|
||||||
"Overview": "Обзор",
|
|
||||||
"Password": "Парола",
|
"Password": "Парола",
|
||||||
"PDF document (.pdf)": "PDF документ (.pdf)",
|
"PDF document (.pdf)": "PDF документ (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "PDF Extract Images (OCR)",
|
"PDF Extract Images (OCR)": "PDF Extract Images (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "Сканиране за документи в {{path}}",
|
"Scan for documents from {{path}}": "Сканиране за документи в {{path}}",
|
||||||
"Search": "Търси",
|
"Search": "Търси",
|
||||||
"Search a model": "Търси модел",
|
"Search a model": "Търси модел",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Търси Документи",
|
"Search Documents": "Търси Документи",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Търси Промптове",
|
"Search Prompts": "Търси Промптове",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "এপিআই কোডস",
|
"API keys": "এপিআই কোডস",
|
||||||
"April": "আপ্রিল",
|
"April": "আপ্রিল",
|
||||||
"Archive": "আর্কাইভ",
|
"Archive": "আর্কাইভ",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "চ্যাট ইতিহাস সংরক্ষণাগার",
|
"Archived Chats": "চ্যাট ইতিহাস সংরক্ষণাগার",
|
||||||
"are allowed - Activate this command by typing": "অনুমোদিত - কমান্ডটি চালু করার জন্য লিখুন",
|
"are allowed - Activate this command by typing": "অনুমোদিত - কমান্ডটি চালু করার জন্য লিখুন",
|
||||||
"Are you sure?": "আপনি নিশ্চিত?",
|
"Are you sure?": "আপনি নিশ্চিত?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "কাস্টম",
|
"Custom": "কাস্টম",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "ডার্ক",
|
"Dark": "ডার্ক",
|
||||||
"Dashboard": "ড্যাশবোর্ড",
|
|
||||||
"Database": "ডেটাবেজ",
|
"Database": "ডেটাবেজ",
|
||||||
"December": "ডেসেম্বর",
|
"December": "ডেসেম্বর",
|
||||||
"Default": "ডিফল্ট",
|
"Default": "ডিফল্ট",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "মুছে ফেলুন",
|
"delete": "মুছে ফেলুন",
|
||||||
"Delete": "মুছে ফেলুন",
|
"Delete": "মুছে ফেলুন",
|
||||||
"Delete a model": "একটি মডেল মুছে ফেলুন",
|
"Delete a model": "একটি মডেল মুছে ফেলুন",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "চ্যাট মুছে ফেলুন",
|
"Delete chat": "চ্যাট মুছে ফেলুন",
|
||||||
"Delete Chat": "চ্যাট মুছে ফেলুন",
|
"Delete Chat": "চ্যাট মুছে ফেলুন",
|
||||||
"Delete Chats": "চ্যাটগুলো মুছে ফেলুন",
|
|
||||||
"delete this link": "এই লিংক মুছে ফেলুন",
|
"delete this link": "এই লিংক মুছে ফেলুন",
|
||||||
"Delete User": "ইউজার মুছে ফেলুন",
|
"Delete User": "ইউজার মুছে ফেলুন",
|
||||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} মুছে ফেলা হয়েছে",
|
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} মুছে ফেলা হয়েছে",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "OpenAI URL/Key আবশ্যক",
|
"OpenAI URL/Key required.": "OpenAI URL/Key আবশ্যক",
|
||||||
"or": "অথবা",
|
"or": "অথবা",
|
||||||
"Other": "অন্যান্য",
|
"Other": "অন্যান্য",
|
||||||
"Overview": "বিবরণ",
|
|
||||||
"Password": "পাসওয়ার্ড",
|
"Password": "পাসওয়ার্ড",
|
||||||
"PDF document (.pdf)": "PDF ডকুমেন্ট (.pdf)",
|
"PDF document (.pdf)": "PDF ডকুমেন্ট (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "পিডিএফ এর ছবি থেকে লেখা বের করুন (OCR)",
|
"PDF Extract Images (OCR)": "পিডিএফ এর ছবি থেকে লেখা বের করুন (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "ডকুমেন্টসমূহের জন্য {{path}} স্ক্যান করুন",
|
"Scan for documents from {{path}}": "ডকুমেন্টসমূহের জন্য {{path}} স্ক্যান করুন",
|
||||||
"Search": "অনুসন্ধান",
|
"Search": "অনুসন্ধান",
|
||||||
"Search a model": "মডেল অনুসন্ধান করুন",
|
"Search a model": "মডেল অনুসন্ধান করুন",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "ডকুমেন্টসমূহ অনুসন্ধান করুন",
|
"Search Documents": "ডকুমেন্টসমূহ অনুসন্ধান করুন",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "প্রম্পটসমূহ অনুসন্ধান করুন",
|
"Search Prompts": "প্রম্পটসমূহ অনুসন্ধান করুন",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "Claus de l'API",
|
"API keys": "Claus de l'API",
|
||||||
"April": "Abril",
|
"April": "Abril",
|
||||||
"Archive": "Arxiu",
|
"Archive": "Arxiu",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "Arxiu d'historial de xat",
|
"Archived Chats": "Arxiu d'historial de xat",
|
||||||
"are allowed - Activate this command by typing": "estan permesos - Activa aquesta comanda escrivint",
|
"are allowed - Activate this command by typing": "estan permesos - Activa aquesta comanda escrivint",
|
||||||
"Are you sure?": "Estàs segur?",
|
"Are you sure?": "Estàs segur?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Personalitzat",
|
"Custom": "Personalitzat",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Fosc",
|
"Dark": "Fosc",
|
||||||
"Dashboard": "Tauler",
|
|
||||||
"Database": "Base de Dades",
|
"Database": "Base de Dades",
|
||||||
"December": "Desembre",
|
"December": "Desembre",
|
||||||
"Default": "Per defecte",
|
"Default": "Per defecte",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "esborra",
|
"delete": "esborra",
|
||||||
"Delete": "Esborra",
|
"Delete": "Esborra",
|
||||||
"Delete a model": "Esborra un model",
|
"Delete a model": "Esborra un model",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Esborra xat",
|
"Delete chat": "Esborra xat",
|
||||||
"Delete Chat": "Esborra Xat",
|
"Delete Chat": "Esborra Xat",
|
||||||
"Delete Chats": "Esborra Xats",
|
|
||||||
"delete this link": "Esborra aquest enllaç",
|
"delete this link": "Esborra aquest enllaç",
|
||||||
"Delete User": "Esborra Usuari",
|
"Delete User": "Esborra Usuari",
|
||||||
"Deleted {{deleteModelTag}}": "Esborrat {{deleteModelTag}}",
|
"Deleted {{deleteModelTag}}": "Esborrat {{deleteModelTag}}",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "URL/Clau d'OpenAI requerides.",
|
"OpenAI URL/Key required.": "URL/Clau d'OpenAI requerides.",
|
||||||
"or": "o",
|
"or": "o",
|
||||||
"Other": "Altres",
|
"Other": "Altres",
|
||||||
"Overview": "Visió general",
|
|
||||||
"Password": "Contrasenya",
|
"Password": "Contrasenya",
|
||||||
"PDF document (.pdf)": "Document PDF (.pdf)",
|
"PDF document (.pdf)": "Document PDF (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "Extreu Imatges de PDF (OCR)",
|
"PDF Extract Images (OCR)": "Extreu Imatges de PDF (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "Escaneja documents des de {{path}}",
|
"Scan for documents from {{path}}": "Escaneja documents des de {{path}}",
|
||||||
"Search": "Cerca",
|
"Search": "Cerca",
|
||||||
"Search a model": "Cerca un model",
|
"Search a model": "Cerca un model",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Cerca Documents",
|
"Search Documents": "Cerca Documents",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Cerca Prompts",
|
"Search Prompts": "Cerca Prompts",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "",
|
"API keys": "",
|
||||||
"April": "",
|
"April": "",
|
||||||
"Archive": "",
|
"Archive": "",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "pagrekord sa chat",
|
"Archived Chats": "pagrekord sa chat",
|
||||||
"are allowed - Activate this command by typing": "gitugotan - I-enable kini nga sugo pinaagi sa pag-type",
|
"are allowed - Activate this command by typing": "gitugotan - I-enable kini nga sugo pinaagi sa pag-type",
|
||||||
"Are you sure?": "Sigurado ka ?",
|
"Are you sure?": "Sigurado ka ?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Custom",
|
"Custom": "Custom",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Ngitngit",
|
"Dark": "Ngitngit",
|
||||||
"Dashboard": "",
|
|
||||||
"Database": "Database",
|
"Database": "Database",
|
||||||
"December": "",
|
"December": "",
|
||||||
"Default": "Pinaagi sa default",
|
"Default": "Pinaagi sa default",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "DELETE",
|
"delete": "DELETE",
|
||||||
"Delete": "",
|
"Delete": "",
|
||||||
"Delete a model": "Pagtangtang sa usa ka template",
|
"Delete a model": "Pagtangtang sa usa ka template",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Pagtangtang sa panaghisgot",
|
"Delete chat": "Pagtangtang sa panaghisgot",
|
||||||
"Delete Chat": "",
|
"Delete Chat": "",
|
||||||
"Delete Chats": "Pagtangtang sa mga chat",
|
|
||||||
"delete this link": "",
|
"delete this link": "",
|
||||||
"Delete User": "",
|
"Delete User": "",
|
||||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} gipapas",
|
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} gipapas",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "",
|
"OpenAI URL/Key required.": "",
|
||||||
"or": "O",
|
"or": "O",
|
||||||
"Other": "",
|
"Other": "",
|
||||||
"Overview": "",
|
|
||||||
"Password": "Password",
|
"Password": "Password",
|
||||||
"PDF document (.pdf)": "",
|
"PDF document (.pdf)": "",
|
||||||
"PDF Extract Images (OCR)": "PDF Image Extraction (OCR)",
|
"PDF Extract Images (OCR)": "PDF Image Extraction (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "I-scan ang mga dokumento gikan sa {{path}}",
|
"Scan for documents from {{path}}": "I-scan ang mga dokumento gikan sa {{path}}",
|
||||||
"Search": "Pagpanukiduki",
|
"Search": "Pagpanukiduki",
|
||||||
"Search a model": "",
|
"Search a model": "",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Pangitaa ang mga dokumento",
|
"Search Documents": "Pangitaa ang mga dokumento",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Pangitaa ang mga prompt",
|
"Search Prompts": "Pangitaa ang mga prompt",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "API Schlüssel",
|
"API keys": "API Schlüssel",
|
||||||
"April": "April",
|
"April": "April",
|
||||||
"Archive": "Archivieren",
|
"Archive": "Archivieren",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "Archivierte Chats",
|
"Archived Chats": "Archivierte Chats",
|
||||||
"are allowed - Activate this command by typing": "sind erlaubt - Aktiviere diesen Befehl, indem du",
|
"are allowed - Activate this command by typing": "sind erlaubt - Aktiviere diesen Befehl, indem du",
|
||||||
"Are you sure?": "Bist du sicher?",
|
"Are you sure?": "Bist du sicher?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Benutzerdefiniert",
|
"Custom": "Benutzerdefiniert",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Dunkel",
|
"Dark": "Dunkel",
|
||||||
"Dashboard": "Dashboard",
|
|
||||||
"Database": "Datenbank",
|
"Database": "Datenbank",
|
||||||
"December": "Dezember",
|
"December": "Dezember",
|
||||||
"Default": "Standard",
|
"Default": "Standard",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "löschen",
|
"delete": "löschen",
|
||||||
"Delete": "Löschen",
|
"Delete": "Löschen",
|
||||||
"Delete a model": "Ein Modell löschen",
|
"Delete a model": "Ein Modell löschen",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Chat löschen",
|
"Delete chat": "Chat löschen",
|
||||||
"Delete Chat": "Chat löschen",
|
"Delete Chat": "Chat löschen",
|
||||||
"Delete Chats": "Chats löschen",
|
|
||||||
"delete this link": "diesen Link zu löschen",
|
"delete this link": "diesen Link zu löschen",
|
||||||
"Delete User": "Benutzer löschen",
|
"Delete User": "Benutzer löschen",
|
||||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} gelöscht",
|
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} gelöscht",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "OpenAI URL/Key erforderlich.",
|
"OpenAI URL/Key required.": "OpenAI URL/Key erforderlich.",
|
||||||
"or": "oder",
|
"or": "oder",
|
||||||
"Other": "Andere",
|
"Other": "Andere",
|
||||||
"Overview": "Übersicht",
|
|
||||||
"Password": "Passwort",
|
"Password": "Passwort",
|
||||||
"PDF document (.pdf)": "PDF-Dokument (.pdf)",
|
"PDF document (.pdf)": "PDF-Dokument (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "Text von Bildern aus PDFs extrahieren (OCR)",
|
"PDF Extract Images (OCR)": "Text von Bildern aus PDFs extrahieren (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "Dokumente von {{path}} scannen",
|
"Scan for documents from {{path}}": "Dokumente von {{path}} scannen",
|
||||||
"Search": "Suchen",
|
"Search": "Suchen",
|
||||||
"Search a model": "Nach einem Modell suchen",
|
"Search a model": "Nach einem Modell suchen",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Dokumente suchen",
|
"Search Documents": "Dokumente suchen",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Prompts suchen",
|
"Search Prompts": "Prompts suchen",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "",
|
"API keys": "",
|
||||||
"April": "",
|
"April": "",
|
||||||
"Archive": "",
|
"Archive": "",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "",
|
"Archived Chats": "",
|
||||||
"are allowed - Activate this command by typing": "are allowed. Activate typing",
|
"are allowed - Activate this command by typing": "are allowed. Activate typing",
|
||||||
"Are you sure?": "Such certainty?",
|
"Are you sure?": "Such certainty?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Custom",
|
"Custom": "Custom",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Dark",
|
"Dark": "Dark",
|
||||||
"Dashboard": "",
|
|
||||||
"Database": "Database",
|
"Database": "Database",
|
||||||
"December": "",
|
"December": "",
|
||||||
"Default": "Default",
|
"Default": "Default",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "delete",
|
"delete": "delete",
|
||||||
"Delete": "",
|
"Delete": "",
|
||||||
"Delete a model": "Delete a model",
|
"Delete a model": "Delete a model",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Delete chat",
|
"Delete chat": "Delete chat",
|
||||||
"Delete Chat": "",
|
"Delete Chat": "",
|
||||||
"Delete Chats": "Delete Chats",
|
|
||||||
"delete this link": "",
|
"delete this link": "",
|
||||||
"Delete User": "",
|
"Delete User": "",
|
||||||
"Deleted {{deleteModelTag}}": "Deleted {{deleteModelTag}}",
|
"Deleted {{deleteModelTag}}": "Deleted {{deleteModelTag}}",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "",
|
"OpenAI URL/Key required.": "",
|
||||||
"or": "or",
|
"or": "or",
|
||||||
"Other": "",
|
"Other": "",
|
||||||
"Overview": "",
|
|
||||||
"Password": "Barkword",
|
"Password": "Barkword",
|
||||||
"PDF document (.pdf)": "",
|
"PDF document (.pdf)": "",
|
||||||
"PDF Extract Images (OCR)": "PDF Extract Wowmages (OCR)",
|
"PDF Extract Images (OCR)": "PDF Extract Wowmages (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "Scan for documents from {{path}} wow",
|
"Scan for documents from {{path}}": "Scan for documents from {{path}} wow",
|
||||||
"Search": "Search very search",
|
"Search": "Search very search",
|
||||||
"Search a model": "",
|
"Search a model": "",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Search Documents much find",
|
"Search Documents": "Search Documents much find",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Search Prompts much wow",
|
"Search Prompts": "Search Prompts much wow",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "",
|
"API keys": "",
|
||||||
"April": "",
|
"April": "",
|
||||||
"Archive": "",
|
"Archive": "",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "",
|
"Archived Chats": "",
|
||||||
"are allowed - Activate this command by typing": "",
|
"are allowed - Activate this command by typing": "",
|
||||||
"Are you sure?": "",
|
"Are you sure?": "",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "",
|
"Custom": "",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "",
|
"Dark": "",
|
||||||
"Dashboard": "",
|
|
||||||
"Database": "",
|
"Database": "",
|
||||||
"December": "",
|
"December": "",
|
||||||
"Default": "",
|
"Default": "",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "",
|
"delete": "",
|
||||||
"Delete": "",
|
"Delete": "",
|
||||||
"Delete a model": "",
|
"Delete a model": "",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "",
|
"Delete chat": "",
|
||||||
"Delete Chat": "",
|
"Delete Chat": "",
|
||||||
"Delete Chats": "",
|
|
||||||
"delete this link": "",
|
"delete this link": "",
|
||||||
"Delete User": "",
|
"Delete User": "",
|
||||||
"Deleted {{deleteModelTag}}": "",
|
"Deleted {{deleteModelTag}}": "",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "",
|
"OpenAI URL/Key required.": "",
|
||||||
"or": "",
|
"or": "",
|
||||||
"Other": "",
|
"Other": "",
|
||||||
"Overview": "",
|
|
||||||
"Password": "",
|
"Password": "",
|
||||||
"PDF document (.pdf)": "",
|
"PDF document (.pdf)": "",
|
||||||
"PDF Extract Images (OCR)": "",
|
"PDF Extract Images (OCR)": "",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "",
|
"Scan for documents from {{path}}": "",
|
||||||
"Search": "",
|
"Search": "",
|
||||||
"Search a model": "",
|
"Search a model": "",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "",
|
"Search Documents": "",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "",
|
"Search Prompts": "",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "",
|
"API keys": "",
|
||||||
"April": "",
|
"April": "",
|
||||||
"Archive": "",
|
"Archive": "",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "",
|
"Archived Chats": "",
|
||||||
"are allowed - Activate this command by typing": "",
|
"are allowed - Activate this command by typing": "",
|
||||||
"Are you sure?": "",
|
"Are you sure?": "",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "",
|
"Custom": "",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "",
|
"Dark": "",
|
||||||
"Dashboard": "",
|
|
||||||
"Database": "",
|
"Database": "",
|
||||||
"December": "",
|
"December": "",
|
||||||
"Default": "",
|
"Default": "",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "",
|
"delete": "",
|
||||||
"Delete": "",
|
"Delete": "",
|
||||||
"Delete a model": "",
|
"Delete a model": "",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "",
|
"Delete chat": "",
|
||||||
"Delete Chat": "",
|
"Delete Chat": "",
|
||||||
"Delete Chats": "",
|
|
||||||
"delete this link": "",
|
"delete this link": "",
|
||||||
"Delete User": "",
|
"Delete User": "",
|
||||||
"Deleted {{deleteModelTag}}": "",
|
"Deleted {{deleteModelTag}}": "",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "",
|
"OpenAI URL/Key required.": "",
|
||||||
"or": "",
|
"or": "",
|
||||||
"Other": "",
|
"Other": "",
|
||||||
"Overview": "",
|
|
||||||
"Password": "",
|
"Password": "",
|
||||||
"PDF document (.pdf)": "",
|
"PDF document (.pdf)": "",
|
||||||
"PDF Extract Images (OCR)": "",
|
"PDF Extract Images (OCR)": "",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "",
|
"Scan for documents from {{path}}": "",
|
||||||
"Search": "",
|
"Search": "",
|
||||||
"Search a model": "",
|
"Search a model": "",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "",
|
"Search Documents": "",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "",
|
"Search Prompts": "",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "Claves de la API",
|
"API keys": "Claves de la API",
|
||||||
"April": "Abril",
|
"April": "Abril",
|
||||||
"Archive": "Archivar",
|
"Archive": "Archivar",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "Chats archivados",
|
"Archived Chats": "Chats archivados",
|
||||||
"are allowed - Activate this command by typing": "están permitidos - Active este comando escribiendo",
|
"are allowed - Activate this command by typing": "están permitidos - Active este comando escribiendo",
|
||||||
"Are you sure?": "¿Está seguro?",
|
"Are you sure?": "¿Está seguro?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Personalizado",
|
"Custom": "Personalizado",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Oscuro",
|
"Dark": "Oscuro",
|
||||||
"Dashboard": "Tablero",
|
|
||||||
"Database": "Base de datos",
|
"Database": "Base de datos",
|
||||||
"December": "Diciembre",
|
"December": "Diciembre",
|
||||||
"Default": "Por defecto",
|
"Default": "Por defecto",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "borrar",
|
"delete": "borrar",
|
||||||
"Delete": "Borrar",
|
"Delete": "Borrar",
|
||||||
"Delete a model": "Borra un modelo",
|
"Delete a model": "Borra un modelo",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Borrar chat",
|
"Delete chat": "Borrar chat",
|
||||||
"Delete Chat": "Borrar Chat",
|
"Delete Chat": "Borrar Chat",
|
||||||
"Delete Chats": "Borrar Chats",
|
|
||||||
"delete this link": "Borrar este enlace",
|
"delete this link": "Borrar este enlace",
|
||||||
"Delete User": "Borrar Usuario",
|
"Delete User": "Borrar Usuario",
|
||||||
"Deleted {{deleteModelTag}}": "Se borró {{deleteModelTag}}",
|
"Deleted {{deleteModelTag}}": "Se borró {{deleteModelTag}}",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "URL/Clave de OpenAI es requerida.",
|
"OpenAI URL/Key required.": "URL/Clave de OpenAI es requerida.",
|
||||||
"or": "o",
|
"or": "o",
|
||||||
"Other": "Otro",
|
"Other": "Otro",
|
||||||
"Overview": "Resumen",
|
|
||||||
"Password": "Contraseña",
|
"Password": "Contraseña",
|
||||||
"PDF document (.pdf)": "PDF document (.pdf)",
|
"PDF document (.pdf)": "PDF document (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "Extraer imágenes de PDF (OCR)",
|
"PDF Extract Images (OCR)": "Extraer imágenes de PDF (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "Escanear en busca de documentos desde {{path}}",
|
"Scan for documents from {{path}}": "Escanear en busca de documentos desde {{path}}",
|
||||||
"Search": "Buscar",
|
"Search": "Buscar",
|
||||||
"Search a model": "Buscar un modelo",
|
"Search a model": "Buscar un modelo",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Buscar Documentos",
|
"Search Documents": "Buscar Documentos",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Buscar Prompts",
|
"Search Prompts": "Buscar Prompts",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "API keys",
|
"API keys": "API keys",
|
||||||
"April": "ژوئن",
|
"April": "ژوئن",
|
||||||
"Archive": "آرشیو",
|
"Archive": "آرشیو",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "آرشیو تاریخچه چت",
|
"Archived Chats": "آرشیو تاریخچه چت",
|
||||||
"are allowed - Activate this command by typing": "مجاز هستند - این دستور را با تایپ کردن این فعال کنید:",
|
"are allowed - Activate this command by typing": "مجاز هستند - این دستور را با تایپ کردن این فعال کنید:",
|
||||||
"Are you sure?": "آیا مطمئن هستید؟",
|
"Are you sure?": "آیا مطمئن هستید؟",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "دلخواه",
|
"Custom": "دلخواه",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "تیره",
|
"Dark": "تیره",
|
||||||
"Dashboard": "داشبورد",
|
|
||||||
"Database": "پایگاه داده",
|
"Database": "پایگاه داده",
|
||||||
"December": "دسامبر",
|
"December": "دسامبر",
|
||||||
"Default": "پیشفرض",
|
"Default": "پیشفرض",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "حذف",
|
"delete": "حذف",
|
||||||
"Delete": "حذف",
|
"Delete": "حذف",
|
||||||
"Delete a model": "حذف یک مدل",
|
"Delete a model": "حذف یک مدل",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "حذف گپ",
|
"Delete chat": "حذف گپ",
|
||||||
"Delete Chat": "حذف گپ",
|
"Delete Chat": "حذف گپ",
|
||||||
"Delete Chats": "حذف گپ\u200cها",
|
|
||||||
"delete this link": "حذف این لینک",
|
"delete this link": "حذف این لینک",
|
||||||
"Delete User": "حذف کاربر",
|
"Delete User": "حذف کاربر",
|
||||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} پاک شد",
|
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} پاک شد",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "URL/Key OpenAI مورد نیاز است.",
|
"OpenAI URL/Key required.": "URL/Key OpenAI مورد نیاز است.",
|
||||||
"or": "روشن",
|
"or": "روشن",
|
||||||
"Other": "دیگر",
|
"Other": "دیگر",
|
||||||
"Overview": "نمای کلی",
|
|
||||||
"Password": "رمز عبور",
|
"Password": "رمز عبور",
|
||||||
"PDF document (.pdf)": "PDF سند (.pdf)",
|
"PDF document (.pdf)": "PDF سند (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "استخراج تصاویر از PDF (OCR)",
|
"PDF Extract Images (OCR)": "استخراج تصاویر از PDF (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "اسکن اسناد از {{path}}",
|
"Scan for documents from {{path}}": "اسکن اسناد از {{path}}",
|
||||||
"Search": "جستجو",
|
"Search": "جستجو",
|
||||||
"Search a model": "جستجوی مدل",
|
"Search a model": "جستجوی مدل",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "جستجوی اسناد",
|
"Search Documents": "جستجوی اسناد",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "جستجوی پرامپت\u200cها",
|
"Search Prompts": "جستجوی پرامپت\u200cها",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "API-avaimet",
|
"API keys": "API-avaimet",
|
||||||
"April": "huhtikuu",
|
"April": "huhtikuu",
|
||||||
"Archive": "Arkisto",
|
"Archive": "Arkisto",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "Arkistoidut keskustelut",
|
"Archived Chats": "Arkistoidut keskustelut",
|
||||||
"are allowed - Activate this command by typing": "ovat sallittuja - Aktivoi tämä komento kirjoittamalla",
|
"are allowed - Activate this command by typing": "ovat sallittuja - Aktivoi tämä komento kirjoittamalla",
|
||||||
"Are you sure?": "Oletko varma?",
|
"Are you sure?": "Oletko varma?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Mukautettu",
|
"Custom": "Mukautettu",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Tumma",
|
"Dark": "Tumma",
|
||||||
"Dashboard": "Kojelauta",
|
|
||||||
"Database": "Tietokanta",
|
"Database": "Tietokanta",
|
||||||
"December": "joulukuu",
|
"December": "joulukuu",
|
||||||
"Default": "Oletus",
|
"Default": "Oletus",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "poista",
|
"delete": "poista",
|
||||||
"Delete": "Poista",
|
"Delete": "Poista",
|
||||||
"Delete a model": "Poista malli",
|
"Delete a model": "Poista malli",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Poista keskustelu",
|
"Delete chat": "Poista keskustelu",
|
||||||
"Delete Chat": "Poista keskustelu",
|
"Delete Chat": "Poista keskustelu",
|
||||||
"Delete Chats": "Poista keskustelut",
|
|
||||||
"delete this link": "poista tämä linkki",
|
"delete this link": "poista tämä linkki",
|
||||||
"Delete User": "Poista käyttäjä",
|
"Delete User": "Poista käyttäjä",
|
||||||
"Deleted {{deleteModelTag}}": "Poistettu {{deleteModelTag}}",
|
"Deleted {{deleteModelTag}}": "Poistettu {{deleteModelTag}}",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "OpenAI URL/ -avain vaaditaan.",
|
"OpenAI URL/Key required.": "OpenAI URL/ -avain vaaditaan.",
|
||||||
"or": "tai",
|
"or": "tai",
|
||||||
"Other": "Muu",
|
"Other": "Muu",
|
||||||
"Overview": "Yleiskatsaus",
|
|
||||||
"Password": "Salasana",
|
"Password": "Salasana",
|
||||||
"PDF document (.pdf)": "PDF-tiedosto (.pdf)",
|
"PDF document (.pdf)": "PDF-tiedosto (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "PDF-tiedoston kuvien erottelu (OCR)",
|
"PDF Extract Images (OCR)": "PDF-tiedoston kuvien erottelu (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "Skannaa asiakirjoja polusta {{path}}",
|
"Scan for documents from {{path}}": "Skannaa asiakirjoja polusta {{path}}",
|
||||||
"Search": "Haku",
|
"Search": "Haku",
|
||||||
"Search a model": "Hae mallia",
|
"Search a model": "Hae mallia",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Hae asiakirjoja",
|
"Search Documents": "Hae asiakirjoja",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Hae kehotteita",
|
"Search Prompts": "Hae kehotteita",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "Clés API",
|
"API keys": "Clés API",
|
||||||
"April": "Avril",
|
"April": "Avril",
|
||||||
"Archive": "Archiver",
|
"Archive": "Archiver",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "enregistrement du chat",
|
"Archived Chats": "enregistrement du chat",
|
||||||
"are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant",
|
"are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant",
|
||||||
"Are you sure?": "Êtes-vous sûr ?",
|
"Are you sure?": "Êtes-vous sûr ?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Personnalisé",
|
"Custom": "Personnalisé",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Sombre",
|
"Dark": "Sombre",
|
||||||
"Dashboard": "Tableau de bord",
|
|
||||||
"Database": "Base de données",
|
"Database": "Base de données",
|
||||||
"December": "Décembre",
|
"December": "Décembre",
|
||||||
"Default": "Par défaut",
|
"Default": "Par défaut",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "supprimer",
|
"delete": "supprimer",
|
||||||
"Delete": "Supprimer",
|
"Delete": "Supprimer",
|
||||||
"Delete a model": "Supprimer un modèle",
|
"Delete a model": "Supprimer un modèle",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Supprimer la discussion",
|
"Delete chat": "Supprimer la discussion",
|
||||||
"Delete Chat": "Supprimer la discussion",
|
"Delete Chat": "Supprimer la discussion",
|
||||||
"Delete Chats": "Supprimer les discussions",
|
|
||||||
"delete this link": "supprimer ce lien",
|
"delete this link": "supprimer ce lien",
|
||||||
"Delete User": "Supprimer l'utilisateur",
|
"Delete User": "Supprimer l'utilisateur",
|
||||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} supprimé",
|
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} supprimé",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "L'URL/Clé OpenAI est requise.",
|
"OpenAI URL/Key required.": "L'URL/Clé OpenAI est requise.",
|
||||||
"or": "ou",
|
"or": "ou",
|
||||||
"Other": "Autre",
|
"Other": "Autre",
|
||||||
"Overview": "Aperçu",
|
|
||||||
"Password": "Mot de passe",
|
"Password": "Mot de passe",
|
||||||
"PDF document (.pdf)": "Document PDF (.pdf)",
|
"PDF document (.pdf)": "Document PDF (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
|
"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "Scanner des documents depuis {{path}}",
|
"Scan for documents from {{path}}": "Scanner des documents depuis {{path}}",
|
||||||
"Search": "Recherche",
|
"Search": "Recherche",
|
||||||
"Search a model": "Rechercher un modèle",
|
"Search a model": "Rechercher un modèle",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Rechercher des documents",
|
"Search Documents": "Rechercher des documents",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Rechercher des prompts",
|
"Search Prompts": "Rechercher des prompts",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -2,39 +2,39 @@
|
||||||
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' ou '-1' pour aucune expiration.",
|
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' ou '-1' pour aucune expiration.",
|
||||||
"(Beta)": "(Bêta)",
|
"(Beta)": "(Bêta)",
|
||||||
"(e.g. `sh webui.sh --api`)": "(par ex. `sh webui.sh --api`)",
|
"(e.g. `sh webui.sh --api`)": "(par ex. `sh webui.sh --api`)",
|
||||||
"(latest)": "(dernière)",
|
"(latest)": "(plus récent)",
|
||||||
"{{ models }}": "",
|
"{{ models }}": "{{ models }}",
|
||||||
"{{ owner }}: You cannot delete a base model": "",
|
"{{ owner }}: You cannot delete a base model": "{{ owner }}: Vous ne pouvez pas supprimer un modèle de base",
|
||||||
"{{modelName}} is thinking...": "{{modelName}} réfléchit...",
|
"{{modelName}} is thinking...": "{{modelName}} réfléchit...",
|
||||||
"{{user}}'s Chats": "{{user}}'s Chats",
|
"{{user}}'s Chats": "Chats de {{user}}",
|
||||||
"{{webUIName}} Backend Required": "Backend {{webUIName}} requis",
|
"{{webUIName}} Backend Required": "Backend {{webUIName}} requis",
|
||||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "",
|
"A task model is used when performing tasks such as generating titles for chats and web search queries": "",
|
||||||
"a user": "un utilisateur",
|
"a user": "un utilisateur",
|
||||||
"About": "À propos",
|
"About": "À Propos",
|
||||||
"Account": "Compte",
|
"Account": "Compte",
|
||||||
"Accurate information": "Information précise",
|
"Accurate information": "Information précise",
|
||||||
"Add": "Ajouter",
|
"Add": "Ajouter",
|
||||||
"Add a model id": "",
|
"Add a model id": "Ajouter un identifiant modèle",
|
||||||
"Add a short description about what this model does": "",
|
"Add a short description about what this model does": "Ajouter une courte description de ce que fait ce modèle",
|
||||||
"Add a short title for this prompt": "Ajouter un court titre pour ce prompt",
|
"Add a short title for this prompt": "Ajouter un court titre pour ce prompt",
|
||||||
"Add a tag": "Ajouter un tag",
|
"Add a tag": "Ajouter un tag",
|
||||||
"Add custom prompt": "Ajouter un prompt personnalisé",
|
"Add custom prompt": "Ajouter un prompt personnalisé",
|
||||||
"Add Docs": "Ajouter des documents",
|
"Add Docs": "Ajouter des Documents",
|
||||||
"Add Files": "Ajouter des fichiers",
|
"Add Files": "Ajouter des Fichiers",
|
||||||
"Add Memory": "Ajouter une mémoire",
|
"Add Memory": "Ajouter de la Mémoire",
|
||||||
"Add message": "Ajouter un message",
|
"Add message": "Ajouter un message",
|
||||||
"Add Model": "Ajouter un modèle",
|
"Add Model": "Ajouter un Modèle",
|
||||||
"Add Tags": "ajouter des tags",
|
"Add Tags": "Ajouter des Tags",
|
||||||
"Add User": "Ajouter un utilisateur",
|
"Add User": "Ajouter un Utilisateur",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "L'ajustement de ces paramètres appliquera les changements à tous les utilisateurs.",
|
"Adjusting these settings will apply changes universally to all users.": "L'ajustement de ces paramètres appliquera les changements à tous les utilisateurs.",
|
||||||
"admin": "Administrateur",
|
"admin": "admin",
|
||||||
"Admin Panel": "Panneau d'administration",
|
"Admin Panel": "Panneau d'Administration",
|
||||||
"Admin Settings": "Paramètres d'administration",
|
"Admin Settings": "Paramètres d'Administration",
|
||||||
"Advanced Parameters": "Paramètres avancés",
|
"Advanced Parameters": "Paramètres Avancés",
|
||||||
"Advanced Params": "",
|
"Advanced Params": "Params Avancés",
|
||||||
"all": "tous",
|
"all": "tous",
|
||||||
"All Documents": "Tous les documents",
|
"All Documents": "Tous les Documents",
|
||||||
"All Users": "Tous les utilisateurs",
|
"All Users": "Tous les Utilisateurs",
|
||||||
"Allow": "Autoriser",
|
"Allow": "Autoriser",
|
||||||
"Allow Chat Deletion": "Autoriser la suppression du chat",
|
"Allow Chat Deletion": "Autoriser la suppression du chat",
|
||||||
"alphanumeric characters and hyphens": "caractères alphanumériques et tirets",
|
"alphanumeric characters and hyphens": "caractères alphanumériques et tirets",
|
||||||
|
|
@ -44,11 +44,12 @@
|
||||||
"and create a new shared link.": "et créer un nouveau lien partagé.",
|
"and create a new shared link.": "et créer un nouveau lien partagé.",
|
||||||
"API Base URL": "URL de base de l'API",
|
"API Base URL": "URL de base de l'API",
|
||||||
"API Key": "Clé API",
|
"API Key": "Clé API",
|
||||||
"API Key created.": "Clé API créée.",
|
"API Key created.": "Clé d'API créée.",
|
||||||
"API keys": "Clés API",
|
"API keys": "Clés API",
|
||||||
"April": "Avril",
|
"April": "Avril",
|
||||||
"Archive": "Archiver",
|
"Archive": "Archiver",
|
||||||
"Archived Chats": "enregistrement du chat",
|
"Archive All Chats": "",
|
||||||
|
"Archived Chats": "Chats Archivés",
|
||||||
"are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant",
|
"are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant",
|
||||||
"Are you sure?": "Êtes-vous sûr ?",
|
"Are you sure?": "Êtes-vous sûr ?",
|
||||||
"Attach file": "Joindre un fichier",
|
"Attach file": "Joindre un fichier",
|
||||||
|
|
@ -61,16 +62,16 @@
|
||||||
"AUTOMATIC1111 Base URL is required.": "L'URL de base AUTOMATIC1111 est requise.",
|
"AUTOMATIC1111 Base URL is required.": "L'URL de base AUTOMATIC1111 est requise.",
|
||||||
"available!": "disponible !",
|
"available!": "disponible !",
|
||||||
"Back": "Retour",
|
"Back": "Retour",
|
||||||
"Bad Response": "Mauvaise réponse",
|
"Bad Response": "Mauvaise Réponse",
|
||||||
"Base Model (From)": "",
|
"Base Model (From)": "Modèle de Base (De)",
|
||||||
"before": "avant",
|
"before": "avant",
|
||||||
"Being lazy": "En manque de temps",
|
"Being lazy": "Est paresseux",
|
||||||
"Bypass SSL verification for Websites": "Parcourir la vérification SSL pour les sites Web",
|
"Bypass SSL verification for Websites": "Contourner la vérification SSL pour les sites Web.",
|
||||||
"Cancel": "Annuler",
|
"Cancel": "Annuler",
|
||||||
"Capabilities": "",
|
"Capabilities": "Capacités",
|
||||||
"Change Password": "Changer le mot de passe",
|
"Change Password": "Changer le mot de passe",
|
||||||
"Chat": "Chat",
|
"Chat": "Chat",
|
||||||
"Chat Bubble UI": "Chat Bubble UI",
|
"Chat Bubble UI": "UI Bulles de Chat",
|
||||||
"Chat direction": "Direction du chat",
|
"Chat direction": "Direction du chat",
|
||||||
"Chat History": "Historique du chat",
|
"Chat History": "Historique du chat",
|
||||||
"Chat History is off for this browser.": "L'historique du chat est désactivé pour ce navigateur.",
|
"Chat History is off for this browser.": "L'historique du chat est désactivé pour ce navigateur.",
|
||||||
|
|
@ -82,7 +83,7 @@
|
||||||
"Chunk Overlap": "Chevauchement de bloc",
|
"Chunk Overlap": "Chevauchement de bloc",
|
||||||
"Chunk Params": "Paramètres de bloc",
|
"Chunk Params": "Paramètres de bloc",
|
||||||
"Chunk Size": "Taille de bloc",
|
"Chunk Size": "Taille de bloc",
|
||||||
"Citation": "Citations",
|
"Citation": "Citation",
|
||||||
"Click here for help.": "Cliquez ici pour de l'aide.",
|
"Click here for help.": "Cliquez ici pour de l'aide.",
|
||||||
"Click here to": "Cliquez ici pour",
|
"Click here to": "Cliquez ici pour",
|
||||||
"Click here to select": "Cliquez ici pour sélectionner",
|
"Click here to select": "Cliquez ici pour sélectionner",
|
||||||
|
|
@ -93,34 +94,33 @@
|
||||||
"Close": "Fermer",
|
"Close": "Fermer",
|
||||||
"Collection": "Collection",
|
"Collection": "Collection",
|
||||||
"ComfyUI": "ComfyUI",
|
"ComfyUI": "ComfyUI",
|
||||||
"ComfyUI Base URL": "ComfyUI Base URL",
|
"ComfyUI Base URL": "URL de base ComfyUI",
|
||||||
"ComfyUI Base URL is required.": "ComfyUI Base URL est requis.",
|
"ComfyUI Base URL is required.": "L'URL de base ComfyUI est requise.",
|
||||||
"Command": "Commande",
|
"Command": "Commande",
|
||||||
"Confirm Password": "Confirmer le mot de passe",
|
"Confirm Password": "Confirmer le mot de passe",
|
||||||
"Connections": "Connexions",
|
"Connections": "Connexions",
|
||||||
"Content": "Contenu",
|
"Content": "Contenu",
|
||||||
"Context Length": "Longueur du contexte",
|
"Context Length": "Longueur du contexte",
|
||||||
"Continue Response": "Continuer la réponse",
|
"Continue Response": "Continuer la Réponse",
|
||||||
"Conversation Mode": "Mode de conversation",
|
"Conversation Mode": "Mode de conversation",
|
||||||
"Copied shared chat URL to clipboard!": "URL de chat partagé copié dans le presse-papier !",
|
"Copied shared chat URL to clipboard!": "URL du chat copié dans le presse-papiers !",
|
||||||
"Copy": "Copier",
|
"Copy": "Copier",
|
||||||
"Copy last code block": "Copier le dernier bloc de code",
|
"Copy last code block": "Copier le dernier bloc de code",
|
||||||
"Copy last response": "Copier la dernière réponse",
|
"Copy last response": "Copier la dernière réponse",
|
||||||
"Copy Link": "Copier le lien",
|
"Copy Link": "Copier le Lien",
|
||||||
"Copying to clipboard was successful!": "La copie dans le presse-papiers a réussi !",
|
"Copying to clipboard was successful!": "La copie dans le presse-papiers a réussi !",
|
||||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Créez une phrase concise de 3-5 mots comme en-tête pour la requête suivante, en respectant strictement la limite de 3-5 mots et en évitant l'utilisation du mot 'titre' :",
|
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Créez une phrase concise de 3-5 mots comme en-tête pour la requête suivante, en respectant strictement la limite de 3-5 mots et en évitant l'utilisation du mot 'titre' :",
|
||||||
"Create a model": "",
|
"Create a model": "Créer un modèle",
|
||||||
"Create Account": "Créer un compte",
|
"Create Account": "Créer un compte",
|
||||||
"Create new key": "Créer une nouvelle clé",
|
"Create new key": "Créer une nouvelle clé",
|
||||||
"Create new secret key": "Créer une nouvelle clé secrète",
|
"Create new secret key": "Créer une nouvelle clé secrète",
|
||||||
"Created at": "Créé le",
|
"Created at": "Créé le",
|
||||||
"Created At": "Créé le",
|
"Created At": "Crée Le",
|
||||||
"Current Model": "Modèle actuel",
|
"Current Model": "Modèle actuel",
|
||||||
"Current Password": "Mot de passe actuel",
|
"Current Password": "Mot de passe actuel",
|
||||||
"Custom": "Personnalisé",
|
"Custom": "Personnalisé",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "Personnaliser les modèles pour un objectif spécifique",
|
||||||
"Dark": "Sombre",
|
"Dark": "Sombre",
|
||||||
"Dashboard": "Tableau de bord",
|
|
||||||
"Database": "Base de données",
|
"Database": "Base de données",
|
||||||
"December": "Décembre",
|
"December": "Décembre",
|
||||||
"Default": "Par défaut",
|
"Default": "Par défaut",
|
||||||
|
|
@ -133,17 +133,17 @@
|
||||||
"delete": "supprimer",
|
"delete": "supprimer",
|
||||||
"Delete": "Supprimer",
|
"Delete": "Supprimer",
|
||||||
"Delete a model": "Supprimer un modèle",
|
"Delete a model": "Supprimer un modèle",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Supprimer le chat",
|
"Delete chat": "Supprimer le chat",
|
||||||
"Delete Chat": "Supprimer le chat",
|
"Delete Chat": "Supprimer le Chat",
|
||||||
"Delete Chats": "Supprimer les chats",
|
|
||||||
"delete this link": "supprimer ce lien",
|
"delete this link": "supprimer ce lien",
|
||||||
"Delete User": "Supprimer l'utilisateur",
|
"Delete User": "Supprimer l'Utilisateur",
|
||||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} supprimé",
|
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} supprimé",
|
||||||
"Deleted {{name}}": "",
|
"Deleted {{name}}": "{{name}} supprimé",
|
||||||
"Description": "Description",
|
"Description": "Description",
|
||||||
"Didn't fully follow instructions": "Ne suit pas les instructions",
|
"Didn't fully follow instructions": "N'a pas suivi entièrement les instructions",
|
||||||
"Disabled": "Désactivé",
|
"Disabled": "Désactivé",
|
||||||
"Discover a model": "",
|
"Discover a model": "Découvrir un modèle",
|
||||||
"Discover a prompt": "Découvrir un prompt",
|
"Discover a prompt": "Découvrir un prompt",
|
||||||
"Discover, download, and explore custom prompts": "Découvrir, télécharger et explorer des prompts personnalisés",
|
"Discover, download, and explore custom prompts": "Découvrir, télécharger et explorer des prompts personnalisés",
|
||||||
"Discover, download, and explore model presets": "Découvrir, télécharger et explorer des préconfigurations de modèles",
|
"Discover, download, and explore model presets": "Découvrir, télécharger et explorer des préconfigurations de modèles",
|
||||||
|
|
@ -154,7 +154,7 @@
|
||||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "ne fait aucune connexion externe, et vos données restent en sécurité sur votre serveur hébergé localement.",
|
"does not make any external connections, and your data stays securely on your locally hosted server.": "ne fait aucune connexion externe, et vos données restent en sécurité sur votre serveur hébergé localement.",
|
||||||
"Don't Allow": "Ne pas autoriser",
|
"Don't Allow": "Ne pas autoriser",
|
||||||
"Don't have an account?": "Vous n'avez pas de compte ?",
|
"Don't have an account?": "Vous n'avez pas de compte ?",
|
||||||
"Don't like the style": "Vous n'aimez pas le style ?",
|
"Don't like the style": "N'aime pas le style",
|
||||||
"Download": "Télécharger",
|
"Download": "Télécharger",
|
||||||
"Download canceled": "Téléchargement annulé",
|
"Download canceled": "Téléchargement annulé",
|
||||||
"Download Database": "Télécharger la base de données",
|
"Download Database": "Télécharger la base de données",
|
||||||
|
|
@ -164,85 +164,85 @@
|
||||||
"Edit Doc": "Éditer le document",
|
"Edit Doc": "Éditer le document",
|
||||||
"Edit User": "Éditer l'utilisateur",
|
"Edit User": "Éditer l'utilisateur",
|
||||||
"Email": "Email",
|
"Email": "Email",
|
||||||
"Embedding Model": "Modèle d'embedding",
|
"Embedding Model": "Modèle pour l'Embedding",
|
||||||
"Embedding Model Engine": "Moteur du modèle d'embedding",
|
"Embedding Model Engine": "Moteur du Modèle d'Embedding",
|
||||||
"Embedding model set to \"{{embedding_model}}\"": "Modèle d'embedding défini sur \"{{embedding_model}}\"",
|
"Embedding model set to \"{{embedding_model}}\"": "Modèle d'embedding défini sur \"{{embedding_model}}\"",
|
||||||
"Enable Chat History": "Activer l'historique du chat",
|
"Enable Chat History": "Activer l'historique du chat",
|
||||||
"Enable New Sign Ups": "Activer les nouvelles inscriptions",
|
"Enable New Sign Ups": "Activer les nouvelles inscriptions",
|
||||||
"Enabled": "Activé",
|
"Enabled": "Activé",
|
||||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assurez-vous que votre fichier CSV inclut 4 colonnes dans cet ordre : Nom, Email, Mot de passe, Rôle.",
|
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Vérifiez que le fichier CSV contienne 4 colonnes dans cet ordre : Name (Nom), Email, Password (Mot de passe), Role (Rôle).",
|
||||||
"Enter {{role}} message here": "Entrez le message {{role}} ici",
|
"Enter {{role}} message here": "Entrez le message {{role}} ici",
|
||||||
"Enter a detail about yourself for your LLMs to recall": "Entrez un détail sur vous pour que vos LLM puissent le rappeler",
|
"Enter a detail about yourself for your LLMs to recall": "Saisissez une donnée vous concernant pour que vos LLMs s'en souviennent",
|
||||||
"Enter Chunk Overlap": "Entrez le chevauchement de bloc",
|
"Enter Chunk Overlap": "Entrez le chevauchement de bloc",
|
||||||
"Enter Chunk Size": "Entrez la taille du bloc",
|
"Enter Chunk Size": "Entrez la taille du bloc",
|
||||||
"Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (p. ex. 512x512)",
|
"Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (p. ex. 512x512)",
|
||||||
"Enter language codes": "Entrez les codes de langue",
|
"Enter language codes": "Entrez les codes du language",
|
||||||
"Enter model tag (e.g. {{modelTag}})": "Entrez le tag du modèle (p. ex. {{modelTag}})",
|
"Enter model tag (e.g. {{modelTag}})": "Entrez le tag du modèle (p. ex. {{modelTag}})",
|
||||||
"Enter Number of Steps (e.g. 50)": "Entrez le nombre d'étapes (p. ex. 50)",
|
"Enter Number of Steps (e.g. 50)": "Entrez le nombre d'étapes (p. ex. 50)",
|
||||||
"Enter Score": "Entrez le score",
|
"Enter Score": "Entrez le Score",
|
||||||
"Enter stop sequence": "Entrez la séquence de fin",
|
"Enter stop sequence": "Entrez la séquence de fin",
|
||||||
"Enter Top K": "Entrez Top K",
|
"Enter Top K": "Entrez Top K",
|
||||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Entrez l'URL (p. ex. http://127.0.0.1:7860/)",
|
"Enter URL (e.g. http://127.0.0.1:7860/)": "Entrez l'URL (p. ex. http://127.0.0.1:7860/)",
|
||||||
"Enter URL (e.g. http://localhost:11434)": "Entrez l'URL (p. ex. http://localhost:11434)",
|
"Enter URL (e.g. http://localhost:11434)": "Entrez l'URL (p. ex. http://localhost:11434)",
|
||||||
"Enter Your Email": "Entrez votre email",
|
"Enter Your Email": "Entrez Votre Email",
|
||||||
"Enter Your Full Name": "Entrez votre nom complet",
|
"Enter Your Full Name": "Entrez Votre Nom Complet",
|
||||||
"Enter Your Password": "Entrez votre mot de passe",
|
"Enter Your Password": "Entrez Votre Mot De Passe",
|
||||||
"Enter Your Role": "Entrez votre rôle",
|
"Enter Your Role": "Entrez Votre Rôle",
|
||||||
"Experimental": "Expérimental",
|
"Experimental": "Expérimental",
|
||||||
"Export All Chats (All Users)": "Exporter tous les chats (tous les utilisateurs)",
|
"Export All Chats (All Users)": "Exporter Tous les Chats (Tous les Utilisateurs)",
|
||||||
"Export Chats": "Exporter les chats",
|
"Export Chats": "Exporter les Chats",
|
||||||
"Export Documents Mapping": "Exporter la correspondance des documents",
|
"Export Documents Mapping": "Exporter la Correspondance des Documents",
|
||||||
"Export Models": "",
|
"Export Models": "Exporter les Modèles",
|
||||||
"Export Prompts": "Exporter les prompts",
|
"Export Prompts": "Exporter les Prompts",
|
||||||
"Failed to create API Key.": "Impossible de créer la clé API.",
|
"Failed to create API Key.": "Échec de la création de la clé d'API.",
|
||||||
"Failed to read clipboard contents": "Échec de la lecture du contenu du presse-papiers",
|
"Failed to read clipboard contents": "Échec de la lecture du contenu du presse-papiers",
|
||||||
"February": "Février",
|
"February": "Février",
|
||||||
"Feel free to add specific details": "Vous pouvez ajouter des détails spécifiques",
|
"Feel free to add specific details": "N'hésitez pas à ajouter des détails spécifiques",
|
||||||
"File Mode": "Mode fichier",
|
"File Mode": "Mode Fichier",
|
||||||
"File not found.": "Fichier non trouvé.",
|
"File not found.": "Fichier non trouvé.",
|
||||||
"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Détection de falsification de empreinte digitale\u00a0: impossible d'utiliser les initiales comme avatar. Par défaut, l'image de profil par défaut est utilisée.",
|
"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Usurpation d'empreinte digitale détectée : Impossible d'utiliser les initiales comme avatar. L'image de profil par défaut sera utilisée.",
|
||||||
"Fluidly stream large external response chunks": "Diffusez de manière fluide de gros morceaux de réponses externes",
|
"Fluidly stream large external response chunks": "Diffusez de manière fluide de gros morceaux de réponses externes",
|
||||||
"Focus chat input": "Concentrer sur l'entrée du chat",
|
"Focus chat input": "Concentrer sur l'entrée du chat",
|
||||||
"Followed instructions perfectly": "Suivi des instructions parfaitement",
|
"Followed instructions perfectly": "A suivi les instructions parfaitement",
|
||||||
"Format your variables using square brackets like this:": "Formatez vos variables en utilisant des crochets comme ceci :",
|
"Format your variables using square brackets like this:": "Formatez vos variables en utilisant des crochets comme ceci :",
|
||||||
"Frequencey Penalty": "",
|
"Frequencey Penalty": "Pénalité de Fréquence",
|
||||||
"Full Screen Mode": "Mode plein écran",
|
"Full Screen Mode": "Mode plein écran",
|
||||||
"General": "Général",
|
"General": "Général",
|
||||||
"General Settings": "Paramètres généraux",
|
"General Settings": "Paramètres Généraux",
|
||||||
"Generating search query": "",
|
"Generating search query": "",
|
||||||
"Generation Info": "Informations de génération",
|
"Generation Info": "Informations de la Génération",
|
||||||
"Good Response": "Bonne réponse",
|
"Good Response": "Bonne Réponse",
|
||||||
"h:mm a": "h:mm a",
|
"h:mm a": "h:mm a",
|
||||||
"has no conversations.": "n'a pas de conversations.",
|
"has no conversations.": "n'a pas de conversations.",
|
||||||
"Hello, {{name}}": "Bonjour, {{name}}",
|
"Hello, {{name}}": "Bonjour, {{name}}",
|
||||||
"Help": "Aide",
|
"Help": "Aide",
|
||||||
"Hide": "Cacher",
|
"Hide": "Cacher",
|
||||||
"How can I help you today?": "Comment puis-je vous aider aujourd'hui ?",
|
"How can I help you today?": "Comment puis-je vous aider aujourd'hui ?",
|
||||||
"Hybrid Search": "Recherche hybride",
|
"Hybrid Search": "Recherche Hybride",
|
||||||
"Image Generation (Experimental)": "Génération d'image (Expérimental)",
|
"Image Generation (Experimental)": "Génération d'Image (Expérimental)",
|
||||||
"Image Generation Engine": "Moteur de génération d'image",
|
"Image Generation Engine": "Moteur de Génération d'Image",
|
||||||
"Image Settings": "Paramètres d'image",
|
"Image Settings": "Paramètres d'Image",
|
||||||
"Images": "Images",
|
"Images": "Images",
|
||||||
"Import Chats": "Importer les chats",
|
"Import Chats": "Importer les Chats",
|
||||||
"Import Documents Mapping": "Importer la correspondance des documents",
|
"Import Documents Mapping": "Importer la Correspondance des Documents",
|
||||||
"Import Models": "",
|
"Import Models": "Importer des Modèles",
|
||||||
"Import Prompts": "Importer les prompts",
|
"Import Prompts": "Importer des Prompts",
|
||||||
"Include `--api` flag when running stable-diffusion-webui": "Inclure le drapeau `--api` lors de l'exécution de stable-diffusion-webui",
|
"Include `--api` flag when running stable-diffusion-webui": "Inclure le drapeau `--api` lors de l'exécution de stable-diffusion-webui",
|
||||||
"Input commands": "Entrez les commandes d'entrée",
|
"Input commands": "Entrez les commandes d'entrée",
|
||||||
"Interface": "Interface",
|
"Interface": "Interface",
|
||||||
"Invalid Tag": "Tag invalide",
|
"Invalid Tag": "Tag Invalide",
|
||||||
"January": "Janvier",
|
"January": "Janvier",
|
||||||
"join our Discord for help.": "rejoignez notre Discord pour obtenir de l'aide.",
|
"join our Discord for help.": "rejoignez notre Discord pour obtenir de l'aide.",
|
||||||
"JSON": "JSON",
|
"JSON": "JSON",
|
||||||
"JSON Preview": "",
|
"JSON Preview": "Aperçu JSON",
|
||||||
"July": "Juillet",
|
"July": "Juillet",
|
||||||
"June": "Juin",
|
"June": "Juin",
|
||||||
"JWT Expiration": "Expiration JWT",
|
"JWT Expiration": "Expiration JWT",
|
||||||
"JWT Token": "Jeton JWT",
|
"JWT Token": "Jeton JWT",
|
||||||
"Keep Alive": "Garder en vie",
|
"Keep Alive": "Rester en vie",
|
||||||
"Keyboard shortcuts": "Raccourcis clavier",
|
"Keyboard shortcuts": "Raccourcis clavier",
|
||||||
"Language": "Langue",
|
"Language": "Langue",
|
||||||
"Last Active": "Dernière activité",
|
"Last Active": "Dernier Activité",
|
||||||
"Light": "Clair",
|
"Light": "Clair",
|
||||||
"Listening...": "Écoute...",
|
"Listening...": "Écoute...",
|
||||||
"LLMs can make mistakes. Verify important information.": "Les LLMs peuvent faire des erreurs. Vérifiez les informations importantes.",
|
"LLMs can make mistakes. Verify important information.": "Les LLMs peuvent faire des erreurs. Vérifiez les informations importantes.",
|
||||||
|
|
@ -252,13 +252,13 @@
|
||||||
"Manage Models": "Gérer les modèles",
|
"Manage Models": "Gérer les modèles",
|
||||||
"Manage Ollama Models": "Gérer les modèles Ollama",
|
"Manage Ollama Models": "Gérer les modèles Ollama",
|
||||||
"March": "Mars",
|
"March": "Mars",
|
||||||
"Max Tokens (num_predict)": "",
|
"Max Tokens (num_predict)": "Tokens maximaux (num_predict)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé simultanément. Veuillez réessayer plus tard.",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé simultanément. Veuillez réessayer plus tard.",
|
||||||
"May": "Mai",
|
"May": "Mai",
|
||||||
"Memories accessible by LLMs will be shown here.": "Les mémoires accessibles par les LLM seront affichées ici.",
|
"Memories accessible by LLMs will be shown here.": "Les Mémoires des LLMs apparaîtront ici.",
|
||||||
"Memory": "Mémoire",
|
"Memory": "Mémoire",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Les messages que vous envoyez après la création de votre lien ne seront pas partagés. Les utilisateurs avec l'URL pourront voir le chat partagé.",
|
"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",
|
"Minimum Score": "Score Minimum",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Mirostat Eta",
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
"Mirostat Tau": "Mirostat Tau",
|
"Mirostat Tau": "Mirostat Tau",
|
||||||
|
|
@ -267,91 +267,90 @@
|
||||||
"Model '{{modelName}}' has been successfully downloaded.": "Le modèle '{{modelName}}' a été téléchargé avec succès.",
|
"Model '{{modelName}}' has been successfully downloaded.": "Le modèle '{{modelName}}' a été téléchargé avec succès.",
|
||||||
"Model '{{modelTag}}' is already in queue for downloading.": "Le modèle '{{modelTag}}' est déjà dans la file d'attente pour le téléchargement.",
|
"Model '{{modelTag}}' is already in queue for downloading.": "Le modèle '{{modelTag}}' est déjà dans la file d'attente pour le téléchargement.",
|
||||||
"Model {{modelId}} not found": "Modèle {{modelId}} non trouvé",
|
"Model {{modelId}} not found": "Modèle {{modelId}} non trouvé",
|
||||||
"Model {{modelName}} is not vision capable": "",
|
"Model {{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.": "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 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": "",
|
"Model ID": "ID du Modèle",
|
||||||
"Model not selected": "Modèle non sélectionné",
|
"Model not selected": "Modèle non sélectionné",
|
||||||
"Model Params": "",
|
"Model Params": "Paramètres du Modèle",
|
||||||
"Model Whitelisting": "Liste blanche de modèle",
|
"Model Whitelisting": "Liste Blanche de Modèle",
|
||||||
"Model(s) Whitelisted": "Modèle(s) sur liste blanche",
|
"Model(s) Whitelisted": "Modèle(s) sur Liste Blanche",
|
||||||
"Modelfile Content": "Contenu du fichier de modèle",
|
"Modelfile Content": "Contenu du Fichier de Modèle",
|
||||||
"Models": "Modèles",
|
"Models": "Modèles",
|
||||||
"More": "Plus",
|
"More": "Plus",
|
||||||
"Name": "Nom",
|
"Name": "Nom",
|
||||||
"Name Tag": "Tag de nom",
|
"Name Tag": "Tag de Nom",
|
||||||
"Name your model": "",
|
"Name your model": "Nommez votre modèle",
|
||||||
"New Chat": "Nouveau chat",
|
"New Chat": "Nouveau chat",
|
||||||
"New Password": "Nouveau mot de passe",
|
"New Password": "Nouveau mot de passe",
|
||||||
"No results found": "Aucun résultat trouvé",
|
"No results found": "Aucun résultat",
|
||||||
"No search query generated": "",
|
"No search query generated": "",
|
||||||
"No search results found": "",
|
"No search results found": "",
|
||||||
"No source available": "Aucune source disponible",
|
"No source available": "Aucune source disponible",
|
||||||
"Not factually correct": "Non, pas exactement correct",
|
"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 retournera que les documents avec un score supérieur ou égal au score minimum.",
|
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Note : Si vous définissez un score minimum, la recherche ne renverra que les documents ayant un score supérieur ou égal au score minimum.",
|
||||||
"Notifications": "Notifications de bureau",
|
"Notifications": "Notifications de bureau",
|
||||||
"November": "Novembre",
|
"November": "Novembre",
|
||||||
"October": "Octobre",
|
"October": "Octobre",
|
||||||
"Off": "Désactivé",
|
"Off": "Désactivé",
|
||||||
"Okay, Let's Go!": "D'accord, allons-y !",
|
"Okay, Let's Go!": "D'accord, allons-y !",
|
||||||
"OLED Dark": "OLED Sombre",
|
"OLED Dark": "Sombre OLED",
|
||||||
"Ollama": "Ollama",
|
"Ollama": "Ollama",
|
||||||
"Ollama API": "",
|
"Ollama API": "API Ollama",
|
||||||
"Ollama Version": "Version Ollama",
|
"Ollama Version": "Version Ollama",
|
||||||
"On": "Activé",
|
"On": "Activé",
|
||||||
"Only": "Seulement",
|
"Only": "Seulement",
|
||||||
"Only alphanumeric characters and hyphens are allowed in the command string.": "Seuls les caractères alphanumériques et les tirets sont autorisés dans la chaîne de commande.",
|
"Only alphanumeric characters and hyphens are allowed in the command string.": "Seuls les caractères alphanumériques et les tirets sont autorisés dans la chaîne de commande.",
|
||||||
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Oups ! Tenez bon ! Vos fichiers sont encore dans le four. Nous les cuisinons à la perfection. Soyez patient et nous vous informerons dès qu'ils seront prêts.",
|
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Oups ! Tenez bon ! Vos fichiers sont encore dans le four. Nous les cuisinons à la perfection. Soyez patient et nous vous informerons dès qu'ils seront prêts.",
|
||||||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! Looks like the URL is invalid. Please double-check and try again.",
|
"Oops! 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.": "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.": "Oups ! Vous utilisez une méthode non-supportée (frontend uniquement). Veuillez également servir WebUI depuis le backend.",
|
||||||
"Open": "Ouvrir",
|
"Open": "Ouvrir",
|
||||||
"Open AI": "Open AI",
|
"Open AI": "Open AI",
|
||||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||||
"Open new chat": "Ouvrir un nouveau chat",
|
"Open new chat": "Ouvrir un nouveau chat",
|
||||||
"OpenAI": "OpenAI",
|
"OpenAI": "OpenAI",
|
||||||
"OpenAI API": "API OpenAI",
|
"OpenAI API": "API OpenAI",
|
||||||
"OpenAI API Config": "Configuration API OpenAI",
|
"OpenAI API Config": "Config API OpenAI",
|
||||||
"OpenAI API Key is required.": "La clé API OpenAI est requise.",
|
"OpenAI API Key is required.": "La clé d'API OpenAI est requise.",
|
||||||
"OpenAI URL/Key required.": "L'URL/Clé OpenAI est requise.",
|
"OpenAI URL/Key required.": "URL/Clé OpenAI requise.",
|
||||||
"or": "ou",
|
"or": "ou",
|
||||||
"Other": "Autre",
|
"Other": "Autre",
|
||||||
"Overview": "Aperçu",
|
|
||||||
"Password": "Mot de passe",
|
"Password": "Mot de passe",
|
||||||
"PDF document (.pdf)": "Document PDF (.pdf)",
|
"PDF document (.pdf)": "Document PDF (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
|
"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
|
||||||
"pending": "en attente",
|
"pending": "en attente",
|
||||||
"Permission denied when accessing microphone: {{error}}": "Permission refusée lors de l'accès au microphone : {{error}}",
|
"Permission denied when accessing microphone: {{error}}": "Permission refusée lors de l'accès au microphone : {{error}}",
|
||||||
"Personalization": "Personnalisation",
|
"Personalization": "Personnalisation",
|
||||||
"Plain text (.txt)": "Texte brut (.txt)",
|
"Plain text (.txt)": "Texte Brute (.txt)",
|
||||||
"Playground": "Aire de jeu",
|
"Playground": "Aire de jeu",
|
||||||
"Positive attitude": "Attitude positive",
|
"Positive attitude": "Attitude Positive",
|
||||||
"Previous 30 days": "30 derniers jours",
|
"Previous 30 days": "30 jours précédents",
|
||||||
"Previous 7 days": "7 derniers jours",
|
"Previous 7 days": "7 jours précédents",
|
||||||
"Profile Image": "Image de profil",
|
"Profile Image": "Image du Profil",
|
||||||
"Prompt": "Prompt",
|
"Prompt": "Prompt",
|
||||||
"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (par exemple, Dites-moi un fait amusant sur l'Imperium romain)",
|
"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (p. ex. Raconte moi un fait amusant sur l'Empire Romain)",
|
||||||
"Prompt Content": "Contenu du prompt",
|
"Prompt Content": "Contenu du prompt",
|
||||||
"Prompt suggestions": "Suggestions de prompt",
|
"Prompt suggestions": "Suggestions de prompt",
|
||||||
"Prompts": "Prompts",
|
"Prompts": "Prompts",
|
||||||
"Pull \"{{searchValue}}\" from Ollama.com": "Tirer \"{{searchValue}}\" de Ollama.com",
|
"Pull \"{{searchValue}}\" from Ollama.com": "Récupérer \"{{searchValue}}\" de Ollama.com",
|
||||||
"Pull a model from Ollama.com": "Tirer un modèle 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",
|
"Query Params": "Paramètres de Requête",
|
||||||
"RAG Template": "Modèle RAG",
|
"RAG Template": "Modèle RAG",
|
||||||
"Read Aloud": "Lire à l'oreille",
|
"Read Aloud": "Lire à Voix Haute",
|
||||||
"Record voice": "Enregistrer la voix",
|
"Record voice": "Enregistrer la voix",
|
||||||
"Redirecting you to OpenWebUI Community": "Vous redirige vers la communauté OpenWebUI",
|
"Redirecting you to OpenWebUI Community": "Redirection vers la communauté OpenWebUI",
|
||||||
"Refused when it shouldn't have": "Refusé quand il ne devrait pas l'être",
|
"Refused when it shouldn't have": "Refuse quand il ne devrait pas",
|
||||||
"Regenerate": "Régénérer",
|
"Regenerate": "Regénérer",
|
||||||
"Release Notes": "Notes de version",
|
"Release Notes": "Notes de Version",
|
||||||
"Remove": "Supprimer",
|
"Remove": "Retirer",
|
||||||
"Remove Model": "Supprimer le modèle",
|
"Remove Model": "Retirer le Modèle",
|
||||||
"Rename": "Renommer",
|
"Rename": "Renommer",
|
||||||
"Repeat Last N": "Répéter les derniers N",
|
"Repeat Last N": "Répéter les Derniers N",
|
||||||
"Request Mode": "Mode de demande",
|
"Request Mode": "Mode de Demande",
|
||||||
"Reranking Model": "Modèle de reranking",
|
"Reranking Model": "Modèle de Reclassement",
|
||||||
"Reranking model disabled": "Modèle de reranking désactivé",
|
"Reranking model disabled": "Modèle de Reclassement Désactivé",
|
||||||
"Reranking model set to \"{{reranking_model}}\"": "Modèle de reranking défini sur \"{{reranking_model}}\"",
|
"Reranking model set to \"{{reranking_model}}\"": "Modèle de reclassement défini sur \"{{reranking_model}}\"",
|
||||||
"Reset Vector Storage": "Réinitialiser le stockage de vecteur",
|
"Reset Vector Storage": "Réinitialiser le Stockage de Vecteur",
|
||||||
"Response AutoCopy to Clipboard": "Copie automatique de la réponse dans le presse-papiers",
|
"Response AutoCopy to Clipboard": "Copie Automatique de la Réponse dans le Presse-papiers",
|
||||||
"Role": "Rôle",
|
"Role": "Rôle",
|
||||||
"Rosé Pine": "Pin Rosé",
|
"Rosé Pine": "Pin Rosé",
|
||||||
"Rosé Pine Dawn": "Aube Pin Rosé",
|
"Rosé Pine Dawn": "Aube Pin Rosé",
|
||||||
|
|
@ -365,37 +364,39 @@
|
||||||
"Scan for documents from {{path}}": "Scanner des documents depuis {{path}}",
|
"Scan for documents from {{path}}": "Scanner des documents depuis {{path}}",
|
||||||
"Search": "Recherche",
|
"Search": "Recherche",
|
||||||
"Search a model": "Rechercher un modèle",
|
"Search a model": "Rechercher un modèle",
|
||||||
"Search Documents": "Rechercher des documents",
|
"Search Chats": "",
|
||||||
"Search Prompts": "Rechercher des prompts",
|
"Search Documents": "Rechercher des Documents",
|
||||||
|
"Search Models": "",
|
||||||
|
"Search Prompts": "Rechercher des Prompts",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
"See readme.md for instructions": "Voir readme.md pour les instructions",
|
"See readme.md for instructions": "Voir readme.md pour les instructions",
|
||||||
"See what's new": "Voir les nouveautés",
|
"See what's new": "Voir les nouveautés",
|
||||||
"Seed": "Graine",
|
"Seed": "Graine",
|
||||||
"Select a base model": "",
|
"Select a base model": "Sélectionner un modèle de base",
|
||||||
"Select a mode": "Sélectionnez un mode",
|
"Select a mode": "Sélectionner un mode",
|
||||||
"Select a model": "Sélectionner un modèle",
|
"Select a model": "Sélectionner un modèle",
|
||||||
"Select an Ollama instance": "Sélectionner une instance Ollama",
|
"Select an Ollama instance": "Sélectionner une instance Ollama",
|
||||||
"Select model": "Sélectionner un modèle",
|
"Select model": "Sélectionner un modèle",
|
||||||
"Selected model(s) do not support image inputs": "",
|
"Selected model(s) do not support image inputs": "Modèle(s) séléctionés ne supportent pas les entrées images",
|
||||||
"Send": "Envoyer",
|
"Send": "Envoyer",
|
||||||
"Send a Message": "Envoyer un message",
|
"Send a Message": "Envoyer un message",
|
||||||
"Send message": "Envoyer un message",
|
"Send message": "Envoyer un message",
|
||||||
"September": "Septembre",
|
"September": "Septembre",
|
||||||
"Server connection verified": "Connexion au serveur vérifiée",
|
"Server connection verified": "Connexion au serveur vérifiée",
|
||||||
"Set as default": "Définir par défaut",
|
"Set as default": "Définir par défaut",
|
||||||
"Set Default Model": "Définir le modèle par défaut",
|
"Set 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 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 Image Size": "Définir la Taille de l'Image",
|
||||||
"Set Model": "Définir le modèle",
|
"Set Model": "Définir le Modèle",
|
||||||
"Set reranking model (e.g. {{model}})": "Définir le modèle de reranking (par exemple {{model}})",
|
"Set reranking model (e.g. {{model}})": "Définir le modèle de reclassement (p. ex. {{model}})",
|
||||||
"Set Steps": "Définir les étapes",
|
"Set Steps": "Définir les Étapes",
|
||||||
"Set Task Model": "",
|
"Set Task Model": "",
|
||||||
"Set Voice": "Définir la voix",
|
"Set Voice": "Définir la Voix",
|
||||||
"Settings": "Paramètres",
|
"Settings": "Paramètres",
|
||||||
"Settings saved successfully!": "Paramètres enregistrés avec succès !",
|
"Settings saved successfully!": "Paramètres enregistrés avec succès !",
|
||||||
"Share": "Partager",
|
"Share": "Partager",
|
||||||
"Share Chat": "Partager le chat",
|
"Share Chat": "Partager le Chat",
|
||||||
"Share to OpenWebUI Community": "Partager avec la communauté OpenWebUI",
|
"Share to OpenWebUI Community": "Partager avec la communauté OpenWebUI",
|
||||||
"short-summary": "résumé court",
|
"short-summary": "résumé court",
|
||||||
"Show": "Montrer",
|
"Show": "Montrer",
|
||||||
|
|
@ -408,36 +409,36 @@
|
||||||
"Signing in": "Connexion en cours",
|
"Signing in": "Connexion en cours",
|
||||||
"Source": "Source",
|
"Source": "Source",
|
||||||
"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}",
|
"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}",
|
||||||
"Speech-to-Text Engine": "Moteur de reconnaissance vocale",
|
"Speech-to-Text Engine": "Moteur de Reconnaissance Vocale",
|
||||||
"SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition n'est pas prise en charge dans ce navigateur.",
|
"SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition n'est pas prise en charge dans ce navigateur.",
|
||||||
"Stop Sequence": "Séquence d'arrêt",
|
"Stop Sequence": "Séquence d'Arrêt",
|
||||||
"STT Settings": "Paramètres STT",
|
"STT Settings": "Paramètres STT",
|
||||||
"Submit": "Soumettre",
|
"Submit": "Envoyer",
|
||||||
"Subtitle (e.g. about the Roman Empire)": "Sous-titre (par exemple, sur l'empire romain)",
|
"Subtitle (e.g. about the Roman Empire)": "Sous-Titres (p. ex. à propos de l'Empire Romain)",
|
||||||
"Success": "Succès",
|
"Success": "Succès",
|
||||||
"Successfully updated.": "Mis à jour avec succès.",
|
"Successfully updated.": "Mis à jour avec succès.",
|
||||||
"Suggested": "Suggéré",
|
"Suggested": "Suggéré",
|
||||||
"System": "Système",
|
"System": "Système",
|
||||||
"System Prompt": "Invite de système",
|
"System Prompt": "Prompt du Système",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Tell us more:": "Donnez-nous plus:",
|
"Tell us more:": "Dites-nous en plus :",
|
||||||
"Temperature": "Température",
|
"Temperature": "Température",
|
||||||
"Template": "Modèle",
|
"Template": "Modèle",
|
||||||
"Text Completion": "Complétion de texte",
|
"Text Completion": "Complétion de Texte",
|
||||||
"Text-to-Speech Engine": "Moteur de synthèse vocale",
|
"Text-to-Speech Engine": "Moteur de Synthèse Vocale",
|
||||||
"Tfs Z": "Tfs Z",
|
"Tfs Z": "Tfs Z",
|
||||||
"Thanks for your feedback!": "Merci pour votre feedback!",
|
"Thanks for your feedback!": "Merci pour votre avis !",
|
||||||
"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%).",
|
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Le score devrait avoir une valeur entre 0.0 (0%) et 1.0 (100%).",
|
||||||
"Theme": "Thème",
|
"Theme": "Thème",
|
||||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Cela garantit que vos précieuses conversations sont en sécurité dans votre base de données. Merci !",
|
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Cela garantit que vos précieuses conversations sont en sécurité dans votre base de données. Merci !",
|
||||||
"This setting does not sync across browsers or devices.": "Ce paramètre ne se synchronise pas entre les navigateurs ou les appareils.",
|
"This setting does not sync across browsers or devices.": "Ce paramètre ne se synchronise pas entre les navigateurs ou les appareils.",
|
||||||
"Thorough explanation": "Explication approfondie",
|
"Thorough explanation": "Explication détaillée",
|
||||||
"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.",
|
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Conseil : Mettez à jour plusieurs emplacements de variables consécutivement en appuyant sur la touche tab dans l'entrée de chat après chaque remplacement",
|
||||||
"Title": "Titre",
|
"Title": "Titre",
|
||||||
"Title (e.g. Tell me a fun fact)": "Titre (par exemple, Dites-moi un fait amusant)",
|
"Title (e.g. Tell me a fun fact)": "Titre (p. ex. Donne moi un fait amusant)",
|
||||||
"Title Auto-Generation": "Génération automatique de titre",
|
"Title Auto-Generation": "Génération Automatique du Titre",
|
||||||
"Title cannot be an empty string.": "Le titre ne peut pas être une chaîne vide.",
|
"Title cannot be an empty string.": "Le Titre ne peut pas être vide.",
|
||||||
"Title Generation Prompt": "Prompt de génération de titre",
|
"Title Generation Prompt": "Prompt de Génération du Titre",
|
||||||
"to": "à",
|
"to": "à",
|
||||||
"To access the available model names for downloading,": "Pour accéder aux noms de modèles disponibles pour le téléchargement,",
|
"To access the available model names for downloading,": "Pour accéder aux noms de modèles disponibles pour le téléchargement,",
|
||||||
"To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles pour le téléchargement,",
|
"To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles pour le téléchargement,",
|
||||||
|
|
@ -449,11 +450,11 @@
|
||||||
"Top P": "Top P",
|
"Top P": "Top P",
|
||||||
"Trouble accessing Ollama?": "Problèmes d'accès à Ollama ?",
|
"Trouble accessing Ollama?": "Problèmes d'accès à Ollama ?",
|
||||||
"TTS Settings": "Paramètres TTS",
|
"TTS Settings": "Paramètres TTS",
|
||||||
"Type Hugging Face Resolve (Download) URL": "Entrez l'URL de résolution (téléchargement) Hugging Face",
|
"Type Hugging Face Resolve (Download) URL": "Entrez l'URL de Résolution (Téléchargement) Hugging Face",
|
||||||
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh ! Il y a eu un problème de connexion à {{provider}}.",
|
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh ! Il y a eu un problème de connexion à {{provider}}.",
|
||||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Type de fichier inconnu '{{file_type}}', mais accepté et traité comme du texte brut",
|
"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 and Copy Link": "Mettre à Jour et Copier le Lien",
|
||||||
"Update password": "Mettre à jour le mot de passe",
|
"Update password": "Mettre à Jour le Mot de Passe",
|
||||||
"Upload a GGUF model": "Téléverser un modèle GGUF",
|
"Upload a GGUF model": "Téléverser un modèle GGUF",
|
||||||
"Upload files": "Téléverser des fichiers",
|
"Upload files": "Téléverser des fichiers",
|
||||||
"Upload Progress": "Progression du Téléversement",
|
"Upload Progress": "Progression du Téléversement",
|
||||||
|
|
@ -469,29 +470,29 @@
|
||||||
"variable": "variable",
|
"variable": "variable",
|
||||||
"variable to have them replaced with clipboard content.": "variable pour les remplacer par le contenu du presse-papiers.",
|
"variable to have them replaced with clipboard content.": "variable pour les remplacer par le contenu du presse-papiers.",
|
||||||
"Version": "Version",
|
"Version": "Version",
|
||||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Attention : Si vous mettez à jour ou changez votre modèle d'intégration, vous devrez réimporter tous les documents.",
|
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avertissement : Si vous mettez à jour ou modifier votre modèle d'embedding, vous devrez réimporter tous les documents.",
|
||||||
"Web": "Web",
|
"Web": "Web",
|
||||||
"Web Loader Settings": "Paramètres du chargeur Web",
|
"Web Loader Settings": "Paramètres du Chargeur Web",
|
||||||
"Web Params": "Paramètres Web",
|
"Web Params": "Paramètres Web",
|
||||||
"Web Search Disabled": "",
|
"Web Search Disabled": "",
|
||||||
"Web Search Enabled": "",
|
"Web Search Enabled": "",
|
||||||
"Webhook URL": "URL Webhook",
|
"Webhook URL": "URL du Webhook",
|
||||||
"WebUI Add-ons": "Add-ons WebUI",
|
"WebUI Add-ons": "Add-ons WebUI",
|
||||||
"WebUI Settings": "Paramètres WebUI",
|
"WebUI Settings": "Paramètres WebUI",
|
||||||
"WebUI will make requests to": "WebUI effectuera des demandes à",
|
"WebUI will make requests to": "WebUI effectuera des demandes à",
|
||||||
"What’s New in": "Quoi de neuf dans",
|
"What’s New in": "Quoi de neuf dans",
|
||||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Lorsque l'historique est désactivé, les nouveaux chats sur ce navigateur n'apparaîtront pas dans votre historique sur aucun de vos appareils.",
|
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Lorsque l'historique est désactivé, les nouveaux chats sur ce navigateur n'apparaîtront pas dans votre historique sur aucun de vos appareils.",
|
||||||
"Whisper (Local)": "Whisper (Local)",
|
"Whisper (Local)": "Whisper (Local)",
|
||||||
"Workspace": "Espace de travail",
|
"Workspace": "Espace de Travail",
|
||||||
"Write a prompt suggestion (e.g. Who are you?)": "Écrivez un prompt (e.x. Qui est-tu ?)",
|
"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 [sujet ou mot-clé]",
|
"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",
|
"Yesterday": "Hier",
|
||||||
"You": "Vous",
|
"You": "Vous",
|
||||||
"You cannot clone a base model": "",
|
"You cannot clone a base model": "Vous ne pouvez pas cloner un modèle de base",
|
||||||
"You have no archived conversations.": "Vous n'avez aucune conversation archivée.",
|
"You have no archived conversations.": "Vous n'avez pas de conversations archivées",
|
||||||
"You have shared this chat": "Vous avez partagé cette conversation.",
|
"You have shared this chat": "Vous avez partagé ce chat",
|
||||||
"You're a helpful assistant.": "Vous êtes un assistant utile",
|
"You're a helpful assistant.": "Vous êtes un assistant utile.",
|
||||||
"You're now logged in.": "Vous êtes maintenant connecté.",
|
"You're now logged in.": "Vous êtes maintenant connecté.",
|
||||||
"Youtube": "Youtube",
|
"Youtube": "Youtube",
|
||||||
"Youtube Loader Settings": "Paramètres du chargeur de Youtube"
|
"Youtube Loader Settings": "Paramètres du Chargeur YouTube"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "מפתחות API",
|
"API keys": "מפתחות API",
|
||||||
"April": "אפריל",
|
"April": "אפריל",
|
||||||
"Archive": "ארכיון",
|
"Archive": "ארכיון",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "צ'אטים מאורכבים",
|
"Archived Chats": "צ'אטים מאורכבים",
|
||||||
"are allowed - Activate this command by typing": "מותרים - הפעל פקודה זו על ידי הקלדה",
|
"are allowed - Activate this command by typing": "מותרים - הפעל פקודה זו על ידי הקלדה",
|
||||||
"Are you sure?": "האם אתה בטוח?",
|
"Are you sure?": "האם אתה בטוח?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "מותאם אישית",
|
"Custom": "מותאם אישית",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "כהה",
|
"Dark": "כהה",
|
||||||
"Dashboard": "לוח בקרה",
|
|
||||||
"Database": "מסד נתונים",
|
"Database": "מסד נתונים",
|
||||||
"December": "דצמבר",
|
"December": "דצמבר",
|
||||||
"Default": "ברירת מחדל",
|
"Default": "ברירת מחדל",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "מחק",
|
"delete": "מחק",
|
||||||
"Delete": "מחק",
|
"Delete": "מחק",
|
||||||
"Delete a model": "מחק מודל",
|
"Delete a model": "מחק מודל",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "מחק צ'אט",
|
"Delete chat": "מחק צ'אט",
|
||||||
"Delete Chat": "מחק צ'אט",
|
"Delete Chat": "מחק צ'אט",
|
||||||
"Delete Chats": "מחק צ'אטים",
|
|
||||||
"delete this link": "מחק את הקישור הזה",
|
"delete this link": "מחק את הקישור הזה",
|
||||||
"Delete User": "מחק משתמש",
|
"Delete User": "מחק משתמש",
|
||||||
"Deleted {{deleteModelTag}}": "נמחק {{deleteModelTag}}",
|
"Deleted {{deleteModelTag}}": "נמחק {{deleteModelTag}}",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "נדרשת כתובת URL/מפתח של OpenAI.",
|
"OpenAI URL/Key required.": "נדרשת כתובת URL/מפתח של OpenAI.",
|
||||||
"or": "או",
|
"or": "או",
|
||||||
"Other": "אחר",
|
"Other": "אחר",
|
||||||
"Overview": "סקירה כללית",
|
|
||||||
"Password": "סיסמה",
|
"Password": "סיסמה",
|
||||||
"PDF document (.pdf)": "מסמך PDF (.pdf)",
|
"PDF document (.pdf)": "מסמך PDF (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "חילוץ תמונות מ-PDF (OCR)",
|
"PDF Extract Images (OCR)": "חילוץ תמונות מ-PDF (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "סרוק מסמכים מ-{{path}}",
|
"Scan for documents from {{path}}": "סרוק מסמכים מ-{{path}}",
|
||||||
"Search": "חפש",
|
"Search": "חפש",
|
||||||
"Search a model": "חפש מודל",
|
"Search a model": "חפש מודל",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "חפש מסמכים",
|
"Search Documents": "חפש מסמכים",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "חפש פקודות",
|
"Search Prompts": "חפש פקודות",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "एपीआई कुंजियाँ",
|
"API keys": "एपीआई कुंजियाँ",
|
||||||
"April": "अप्रैल",
|
"April": "अप्रैल",
|
||||||
"Archive": "पुरालेख",
|
"Archive": "पुरालेख",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "संग्रहीत चैट",
|
"Archived Chats": "संग्रहीत चैट",
|
||||||
"are allowed - Activate this command by typing": "अनुमति है - टाइप करके इस कमांड को सक्रिय करें",
|
"are allowed - Activate this command by typing": "अनुमति है - टाइप करके इस कमांड को सक्रिय करें",
|
||||||
"Are you sure?": "क्या आपको यकीन है?",
|
"Are you sure?": "क्या आपको यकीन है?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "कस्टम संस्करण",
|
"Custom": "कस्टम संस्करण",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "डार्क",
|
"Dark": "डार्क",
|
||||||
"Dashboard": "डैशबोर्ड",
|
|
||||||
"Database": "डेटाबेस",
|
"Database": "डेटाबेस",
|
||||||
"December": "डिसेंबर",
|
"December": "डिसेंबर",
|
||||||
"Default": "डिफ़ॉल्ट",
|
"Default": "डिफ़ॉल्ट",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "डिलीट",
|
"delete": "डिलीट",
|
||||||
"Delete": "डिलीट",
|
"Delete": "डिलीट",
|
||||||
"Delete a model": "एक मॉडल हटाएँ",
|
"Delete a model": "एक मॉडल हटाएँ",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "चैट हटाएं",
|
"Delete chat": "चैट हटाएं",
|
||||||
"Delete Chat": "चैट हटाएं",
|
"Delete Chat": "चैट हटाएं",
|
||||||
"Delete Chats": "चैट हटाएं",
|
|
||||||
"delete this link": "इस लिंक को हटाएं",
|
"delete this link": "इस लिंक को हटाएं",
|
||||||
"Delete User": "उपभोक्ता मिटायें",
|
"Delete User": "उपभोक्ता मिटायें",
|
||||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} हटा दिया गया",
|
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} हटा दिया गया",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "OpenAI URL/Key आवश्यक है।",
|
"OpenAI URL/Key required.": "OpenAI URL/Key आवश्यक है।",
|
||||||
"or": "या",
|
"or": "या",
|
||||||
"Other": "अन्य",
|
"Other": "अन्य",
|
||||||
"Overview": "अवलोकन",
|
|
||||||
"Password": "पासवर्ड",
|
"Password": "पासवर्ड",
|
||||||
"PDF document (.pdf)": "PDF दस्तावेज़ (.pdf)",
|
"PDF document (.pdf)": "PDF दस्तावेज़ (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "PDF छवियाँ निकालें (OCR)",
|
"PDF Extract Images (OCR)": "PDF छवियाँ निकालें (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "{{path}} से दस्तावेज़ों को स्कैन करें",
|
"Scan for documents from {{path}}": "{{path}} से दस्तावेज़ों को स्कैन करें",
|
||||||
"Search": "खोजें",
|
"Search": "खोजें",
|
||||||
"Search a model": "एक मॉडल खोजें",
|
"Search a model": "एक मॉडल खोजें",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "दस्तावेज़ खोजें",
|
"Search Documents": "दस्तावेज़ खोजें",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "प्रॉम्प्ट खोजें",
|
"Search Prompts": "प्रॉम्प्ट खोजें",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "API ključevi",
|
"API keys": "API ključevi",
|
||||||
"April": "Travanj",
|
"April": "Travanj",
|
||||||
"Archive": "Arhiva",
|
"Archive": "Arhiva",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "Arhivirani razgovori",
|
"Archived Chats": "Arhivirani razgovori",
|
||||||
"are allowed - Activate this command by typing": "su dopušteni - Aktivirajte ovu naredbu upisivanjem",
|
"are allowed - Activate this command by typing": "su dopušteni - Aktivirajte ovu naredbu upisivanjem",
|
||||||
"Are you sure?": "Jeste li sigurni?",
|
"Are you sure?": "Jeste li sigurni?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Prilagođeno",
|
"Custom": "Prilagođeno",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Tamno",
|
"Dark": "Tamno",
|
||||||
"Dashboard": "Nadzorna ploča",
|
|
||||||
"Database": "Baza podataka",
|
"Database": "Baza podataka",
|
||||||
"December": "Prosinac",
|
"December": "Prosinac",
|
||||||
"Default": "Zadano",
|
"Default": "Zadano",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "izbriši",
|
"delete": "izbriši",
|
||||||
"Delete": "Izbriši",
|
"Delete": "Izbriši",
|
||||||
"Delete a model": "Izbriši model",
|
"Delete a model": "Izbriši model",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Izbriši razgovor",
|
"Delete chat": "Izbriši razgovor",
|
||||||
"Delete Chat": "Izbriši razgovor",
|
"Delete Chat": "Izbriši razgovor",
|
||||||
"Delete Chats": "Izbriši razgovore",
|
|
||||||
"delete this link": "izbriši ovu vezu",
|
"delete this link": "izbriši ovu vezu",
|
||||||
"Delete User": "Izbriši korisnika",
|
"Delete User": "Izbriši korisnika",
|
||||||
"Deleted {{deleteModelTag}}": "Izbrisan {{deleteModelTag}}",
|
"Deleted {{deleteModelTag}}": "Izbrisan {{deleteModelTag}}",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "Potreban je OpenAI URL/ključ.",
|
"OpenAI URL/Key required.": "Potreban je OpenAI URL/ključ.",
|
||||||
"or": "ili",
|
"or": "ili",
|
||||||
"Other": "Ostalo",
|
"Other": "Ostalo",
|
||||||
"Overview": "Pregled",
|
|
||||||
"Password": "Lozinka",
|
"Password": "Lozinka",
|
||||||
"PDF document (.pdf)": "PDF dokument (.pdf)",
|
"PDF document (.pdf)": "PDF dokument (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "PDF izdvajanje slika (OCR)",
|
"PDF Extract Images (OCR)": "PDF izdvajanje slika (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "Skeniraj dokumente s {{path}}",
|
"Scan for documents from {{path}}": "Skeniraj dokumente s {{path}}",
|
||||||
"Search": "Pretraga",
|
"Search": "Pretraga",
|
||||||
"Search a model": "Pretraži model",
|
"Search a model": "Pretraži model",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Pretraga dokumenata",
|
"Search Documents": "Pretraga dokumenata",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Pretraga prompta",
|
"Search Prompts": "Pretraga prompta",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "Chiavi API",
|
"API keys": "Chiavi API",
|
||||||
"April": "Aprile",
|
"April": "Aprile",
|
||||||
"Archive": "Archivio",
|
"Archive": "Archivio",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "Chat archiviate",
|
"Archived Chats": "Chat archiviate",
|
||||||
"are allowed - Activate this command by typing": "sono consentiti - Attiva questo comando digitando",
|
"are allowed - Activate this command by typing": "sono consentiti - Attiva questo comando digitando",
|
||||||
"Are you sure?": "Sei sicuro?",
|
"Are you sure?": "Sei sicuro?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Personalizzato",
|
"Custom": "Personalizzato",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Scuro",
|
"Dark": "Scuro",
|
||||||
"Dashboard": "Pannello di controllo",
|
|
||||||
"Database": "Database",
|
"Database": "Database",
|
||||||
"December": "Dicembre",
|
"December": "Dicembre",
|
||||||
"Default": "Predefinito",
|
"Default": "Predefinito",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "elimina",
|
"delete": "elimina",
|
||||||
"Delete": "Elimina",
|
"Delete": "Elimina",
|
||||||
"Delete a model": "Elimina un modello",
|
"Delete a model": "Elimina un modello",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Elimina chat",
|
"Delete chat": "Elimina chat",
|
||||||
"Delete Chat": "Elimina chat",
|
"Delete Chat": "Elimina chat",
|
||||||
"Delete Chats": "Elimina le chat",
|
|
||||||
"delete this link": "elimina questo link",
|
"delete this link": "elimina questo link",
|
||||||
"Delete User": "Elimina utente",
|
"Delete User": "Elimina utente",
|
||||||
"Deleted {{deleteModelTag}}": "Eliminato {{deleteModelTag}}",
|
"Deleted {{deleteModelTag}}": "Eliminato {{deleteModelTag}}",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "URL/Chiave OpenAI obbligatori.",
|
"OpenAI URL/Key required.": "URL/Chiave OpenAI obbligatori.",
|
||||||
"or": "o",
|
"or": "o",
|
||||||
"Other": "Altro",
|
"Other": "Altro",
|
||||||
"Overview": "Panoramica",
|
|
||||||
"Password": "Password",
|
"Password": "Password",
|
||||||
"PDF document (.pdf)": "Documento PDF (.pdf)",
|
"PDF document (.pdf)": "Documento PDF (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "Estrazione immagini PDF (OCR)",
|
"PDF Extract Images (OCR)": "Estrazione immagini PDF (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "Cerca documenti da {{path}}",
|
"Scan for documents from {{path}}": "Cerca documenti da {{path}}",
|
||||||
"Search": "Cerca",
|
"Search": "Cerca",
|
||||||
"Search a model": "Cerca un modello",
|
"Search a model": "Cerca un modello",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Cerca documenti",
|
"Search Documents": "Cerca documenti",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Cerca prompt",
|
"Search Prompts": "Cerca prompt",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "API キー",
|
"API keys": "API キー",
|
||||||
"April": "4月",
|
"April": "4月",
|
||||||
"Archive": "アーカイブ",
|
"Archive": "アーカイブ",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "チャット記録",
|
"Archived Chats": "チャット記録",
|
||||||
"are allowed - Activate this command by typing": "が許可されています - 次のように入力してこのコマンドをアクティブ化します",
|
"are allowed - Activate this command by typing": "が許可されています - 次のように入力してこのコマンドをアクティブ化します",
|
||||||
"Are you sure?": "よろしいですか?",
|
"Are you sure?": "よろしいですか?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "カスタム",
|
"Custom": "カスタム",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "ダーク",
|
"Dark": "ダーク",
|
||||||
"Dashboard": "ダッシュボード",
|
|
||||||
"Database": "データベース",
|
"Database": "データベース",
|
||||||
"December": "12月",
|
"December": "12月",
|
||||||
"Default": "デフォルト",
|
"Default": "デフォルト",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "削除",
|
"delete": "削除",
|
||||||
"Delete": "削除",
|
"Delete": "削除",
|
||||||
"Delete a model": "モデルを削除",
|
"Delete a model": "モデルを削除",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "チャットを削除",
|
"Delete chat": "チャットを削除",
|
||||||
"Delete Chat": "チャットを削除",
|
"Delete Chat": "チャットを削除",
|
||||||
"Delete Chats": "チャットを削除",
|
|
||||||
"delete this link": "このリンクを削除します",
|
"delete this link": "このリンクを削除します",
|
||||||
"Delete User": "ユーザーを削除",
|
"Delete User": "ユーザーを削除",
|
||||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} を削除しました",
|
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} を削除しました",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "OpenAI URL/Key が必要です。",
|
"OpenAI URL/Key required.": "OpenAI URL/Key が必要です。",
|
||||||
"or": "または",
|
"or": "または",
|
||||||
"Other": "その他",
|
"Other": "その他",
|
||||||
"Overview": "概要",
|
|
||||||
"Password": "パスワード",
|
"Password": "パスワード",
|
||||||
"PDF document (.pdf)": "PDF ドキュメント (.pdf)",
|
"PDF document (.pdf)": "PDF ドキュメント (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "PDF 画像抽出 (OCR)",
|
"PDF Extract Images (OCR)": "PDF 画像抽出 (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "{{path}} からドキュメントをスキャン",
|
"Scan for documents from {{path}}": "{{path}} からドキュメントをスキャン",
|
||||||
"Search": "検索",
|
"Search": "検索",
|
||||||
"Search a model": "モデルを検索",
|
"Search a model": "モデルを検索",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "ドキュメントを検索",
|
"Search Documents": "ドキュメントを検索",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "プロンプトを検索",
|
"Search Prompts": "プロンプトを検索",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "API გასაღები",
|
"API keys": "API გასაღები",
|
||||||
"April": "აპრილი",
|
"April": "აპრილი",
|
||||||
"Archive": "არქივი",
|
"Archive": "არქივი",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "ჩატის ისტორიის არქივი",
|
"Archived Chats": "ჩატის ისტორიის არქივი",
|
||||||
"are allowed - Activate this command by typing": "დაშვებულია - ბრძანების გასააქტიურებლად აკრიფეთ:",
|
"are allowed - Activate this command by typing": "დაშვებულია - ბრძანების გასააქტიურებლად აკრიფეთ:",
|
||||||
"Are you sure?": "დარწმუნებული ხარ?",
|
"Are you sure?": "დარწმუნებული ხარ?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "საკუთარი",
|
"Custom": "საკუთარი",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "მუქი",
|
"Dark": "მუქი",
|
||||||
"Dashboard": "პანელი",
|
|
||||||
"Database": "მონაცემთა ბაზა",
|
"Database": "მონაცემთა ბაზა",
|
||||||
"December": "დეკემბერი",
|
"December": "დეკემბერი",
|
||||||
"Default": "დეფოლტი",
|
"Default": "დეფოლტი",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "წაშლა",
|
"delete": "წაშლა",
|
||||||
"Delete": "წაშლა",
|
"Delete": "წაშლა",
|
||||||
"Delete a model": "მოდელის წაშლა",
|
"Delete a model": "მოდელის წაშლა",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "შეტყობინების წაშლა",
|
"Delete chat": "შეტყობინების წაშლა",
|
||||||
"Delete Chat": "შეტყობინების წაშლა",
|
"Delete Chat": "შეტყობინების წაშლა",
|
||||||
"Delete Chats": "შეტყობინებების წაშლა",
|
|
||||||
"delete this link": "ბმულის წაშლა",
|
"delete this link": "ბმულის წაშლა",
|
||||||
"Delete User": "მომხმარებლის წაშლა",
|
"Delete User": "მომხმარებლის წაშლა",
|
||||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} წაშლილია",
|
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} წაშლილია",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "OpenAI URL/Key აუცილებელია",
|
"OpenAI URL/Key required.": "OpenAI URL/Key აუცილებელია",
|
||||||
"or": "ან",
|
"or": "ან",
|
||||||
"Other": "სხვა",
|
"Other": "სხვა",
|
||||||
"Overview": "ოვერვიუ",
|
|
||||||
"Password": "პაროლი",
|
"Password": "პაროლი",
|
||||||
"PDF document (.pdf)": "PDF დოკუმენტი (.pdf)",
|
"PDF document (.pdf)": "PDF დოკუმენტი (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "PDF იდან ამოღებული სურათები (OCR)",
|
"PDF Extract Images (OCR)": "PDF იდან ამოღებული სურათები (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "დოკუმენტების სკანირება {{ path}}-დან",
|
"Scan for documents from {{path}}": "დოკუმენტების სკანირება {{ path}}-დან",
|
||||||
"Search": "ძიება",
|
"Search": "ძიება",
|
||||||
"Search a model": "მოდელის ძიება",
|
"Search a model": "მოდელის ძიება",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "დოკუმენტების ძიება",
|
"Search Documents": "დოკუმენტების ძიება",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "მოთხოვნების ძიება",
|
"Search Prompts": "მოთხოვნების ძიება",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "API 키",
|
"API keys": "API 키",
|
||||||
"April": "4월",
|
"April": "4월",
|
||||||
"Archive": "아카이브",
|
"Archive": "아카이브",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "채팅 기록 아카이브",
|
"Archived Chats": "채팅 기록 아카이브",
|
||||||
"are allowed - Activate this command by typing": "허용됩니다 - 이 명령을 활성화하려면 입력하세요.",
|
"are allowed - Activate this command by typing": "허용됩니다 - 이 명령을 활성화하려면 입력하세요.",
|
||||||
"Are you sure?": "확실합니까?",
|
"Are you sure?": "확실합니까?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "사용자 정의",
|
"Custom": "사용자 정의",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "어두운",
|
"Dark": "어두운",
|
||||||
"Dashboard": "대시보드",
|
|
||||||
"Database": "데이터베이스",
|
"Database": "데이터베이스",
|
||||||
"December": "12월",
|
"December": "12월",
|
||||||
"Default": "기본값",
|
"Default": "기본값",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "삭제",
|
"delete": "삭제",
|
||||||
"Delete": "삭제",
|
"Delete": "삭제",
|
||||||
"Delete a model": "모델 삭제",
|
"Delete a model": "모델 삭제",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "채팅 삭제",
|
"Delete chat": "채팅 삭제",
|
||||||
"Delete Chat": "채팅 삭제",
|
"Delete Chat": "채팅 삭제",
|
||||||
"Delete Chats": "채팅들 삭제",
|
|
||||||
"delete this link": "이 링크를 삭제합니다.",
|
"delete this link": "이 링크를 삭제합니다.",
|
||||||
"Delete User": "사용자 삭제",
|
"Delete User": "사용자 삭제",
|
||||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} 삭제됨",
|
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} 삭제됨",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "OpenAI URL/Key가 필요합니다.",
|
"OpenAI URL/Key required.": "OpenAI URL/Key가 필요합니다.",
|
||||||
"or": "또는",
|
"or": "또는",
|
||||||
"Other": "기타",
|
"Other": "기타",
|
||||||
"Overview": "개요",
|
|
||||||
"Password": "비밀번호",
|
"Password": "비밀번호",
|
||||||
"PDF document (.pdf)": "PDF 문서 (.pdf)",
|
"PDF document (.pdf)": "PDF 문서 (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "PDF에서 이미지 추출 (OCR)",
|
"PDF Extract Images (OCR)": "PDF에서 이미지 추출 (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "{{path}}에서 문서 스캔",
|
"Scan for documents from {{path}}": "{{path}}에서 문서 스캔",
|
||||||
"Search": "검색",
|
"Search": "검색",
|
||||||
"Search a model": "모델 검색",
|
"Search a model": "모델 검색",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "문서 검색",
|
"Search Documents": "문서 검색",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "프롬프트 검색",
|
"Search Prompts": "프롬프트 검색",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "API keys",
|
"API keys": "API keys",
|
||||||
"April": "April",
|
"April": "April",
|
||||||
"Archive": "Archief",
|
"Archive": "Archief",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "chatrecord",
|
"Archived Chats": "chatrecord",
|
||||||
"are allowed - Activate this command by typing": "zijn toegestaan - Activeer deze commando door te typen",
|
"are allowed - Activate this command by typing": "zijn toegestaan - Activeer deze commando door te typen",
|
||||||
"Are you sure?": "Zeker weten?",
|
"Are you sure?": "Zeker weten?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Aangepast",
|
"Custom": "Aangepast",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Donker",
|
"Dark": "Donker",
|
||||||
"Dashboard": "Dashboard",
|
|
||||||
"Database": "Database",
|
"Database": "Database",
|
||||||
"December": "December",
|
"December": "December",
|
||||||
"Default": "Standaard",
|
"Default": "Standaard",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "verwijderen",
|
"delete": "verwijderen",
|
||||||
"Delete": "Verwijderen",
|
"Delete": "Verwijderen",
|
||||||
"Delete a model": "Verwijder een model",
|
"Delete a model": "Verwijder een model",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Verwijder chat",
|
"Delete chat": "Verwijder chat",
|
||||||
"Delete Chat": "Verwijder Chat",
|
"Delete Chat": "Verwijder Chat",
|
||||||
"Delete Chats": "Verwijder Chats",
|
|
||||||
"delete this link": "verwijder deze link",
|
"delete this link": "verwijder deze link",
|
||||||
"Delete User": "Verwijder Gebruiker",
|
"Delete User": "Verwijder Gebruiker",
|
||||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} is verwijderd",
|
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} is verwijderd",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "OpenAI URL/Sleutel vereist.",
|
"OpenAI URL/Key required.": "OpenAI URL/Sleutel vereist.",
|
||||||
"or": "of",
|
"or": "of",
|
||||||
"Other": "Andere",
|
"Other": "Andere",
|
||||||
"Overview": "Overzicht",
|
|
||||||
"Password": "Wachtwoord",
|
"Password": "Wachtwoord",
|
||||||
"PDF document (.pdf)": "PDF document (.pdf)",
|
"PDF document (.pdf)": "PDF document (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "PDF Extract Afbeeldingen (OCR)",
|
"PDF Extract Images (OCR)": "PDF Extract Afbeeldingen (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "Scan voor documenten van {{path}}",
|
"Scan for documents from {{path}}": "Scan voor documenten van {{path}}",
|
||||||
"Search": "Zoeken",
|
"Search": "Zoeken",
|
||||||
"Search a model": "Zoek een model",
|
"Search a model": "Zoek een model",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Zoek Documenten",
|
"Search Documents": "Zoek Documenten",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Zoek Prompts",
|
"Search Prompts": "Zoek Prompts",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "API ਕੁੰਜੀਆਂ",
|
"API keys": "API ਕੁੰਜੀਆਂ",
|
||||||
"April": "ਅਪ੍ਰੈਲ",
|
"April": "ਅਪ੍ਰੈਲ",
|
||||||
"Archive": "ਆਰਕਾਈਵ",
|
"Archive": "ਆਰਕਾਈਵ",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "ਆਰਕਾਈਵ ਕੀਤੀਆਂ ਗੱਲਾਂ",
|
"Archived Chats": "ਆਰਕਾਈਵ ਕੀਤੀਆਂ ਗੱਲਾਂ",
|
||||||
"are allowed - Activate this command by typing": "ਅਨੁਮਤ ਹਨ - ਇਸ ਕਮਾਂਡ ਨੂੰ ਟਾਈਪ ਕਰਕੇ ਸਰਗਰਮ ਕਰੋ",
|
"are allowed - Activate this command by typing": "ਅਨੁਮਤ ਹਨ - ਇਸ ਕਮਾਂਡ ਨੂੰ ਟਾਈਪ ਕਰਕੇ ਸਰਗਰਮ ਕਰੋ",
|
||||||
"Are you sure?": "ਕੀ ਤੁਸੀਂ ਯਕੀਨਨ ਹੋ?",
|
"Are you sure?": "ਕੀ ਤੁਸੀਂ ਯਕੀਨਨ ਹੋ?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "ਕਸਟਮ",
|
"Custom": "ਕਸਟਮ",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "ਗੂੜ੍ਹਾ",
|
"Dark": "ਗੂੜ੍ਹਾ",
|
||||||
"Dashboard": "ਡੈਸ਼ਬੋਰਡ",
|
|
||||||
"Database": "ਡਾਟਾਬੇਸ",
|
"Database": "ਡਾਟਾਬੇਸ",
|
||||||
"December": "ਦਸੰਬਰ",
|
"December": "ਦਸੰਬਰ",
|
||||||
"Default": "ਮੂਲ",
|
"Default": "ਮੂਲ",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "ਮਿਟਾਓ",
|
"delete": "ਮਿਟਾਓ",
|
||||||
"Delete": "ਮਿਟਾਓ",
|
"Delete": "ਮਿਟਾਓ",
|
||||||
"Delete a model": "ਇੱਕ ਮਾਡਲ ਮਿਟਾਓ",
|
"Delete a model": "ਇੱਕ ਮਾਡਲ ਮਿਟਾਓ",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "ਗੱਲਬਾਤ ਮਿਟਾਓ",
|
"Delete chat": "ਗੱਲਬਾਤ ਮਿਟਾਓ",
|
||||||
"Delete Chat": "ਗੱਲਬਾਤ ਮਿਟਾਓ",
|
"Delete Chat": "ਗੱਲਬਾਤ ਮਿਟਾਓ",
|
||||||
"Delete Chats": "ਗੱਲਾਂ ਮਿਟਾਓ",
|
|
||||||
"delete this link": "ਇਸ ਲਿੰਕ ਨੂੰ ਮਿਟਾਓ",
|
"delete this link": "ਇਸ ਲਿੰਕ ਨੂੰ ਮਿਟਾਓ",
|
||||||
"Delete User": "ਉਪਭੋਗਤਾ ਮਿਟਾਓ",
|
"Delete User": "ਉਪਭੋਗਤਾ ਮਿਟਾਓ",
|
||||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} ਮਿਟਾਇਆ ਗਿਆ",
|
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} ਮਿਟਾਇਆ ਗਿਆ",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "ਓਪਨਏਆਈ URL/ਕੁੰਜੀ ਦੀ ਲੋੜ ਹੈ।",
|
"OpenAI URL/Key required.": "ਓਪਨਏਆਈ URL/ਕੁੰਜੀ ਦੀ ਲੋੜ ਹੈ।",
|
||||||
"or": "ਜਾਂ",
|
"or": "ਜਾਂ",
|
||||||
"Other": "ਹੋਰ",
|
"Other": "ਹੋਰ",
|
||||||
"Overview": "ਸੰਖੇਪ",
|
|
||||||
"Password": "ਪਾਸਵਰਡ",
|
"Password": "ਪਾਸਵਰਡ",
|
||||||
"PDF document (.pdf)": "PDF ਡਾਕੂਮੈਂਟ (.pdf)",
|
"PDF document (.pdf)": "PDF ਡਾਕੂਮੈਂਟ (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "PDF ਚਿੱਤਰ ਕੱਢੋ (OCR)",
|
"PDF Extract Images (OCR)": "PDF ਚਿੱਤਰ ਕੱਢੋ (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "{{path}} ਤੋਂ ਡਾਕੂਮੈਂਟਾਂ ਲਈ ਸਕੈਨ ਕਰੋ",
|
"Scan for documents from {{path}}": "{{path}} ਤੋਂ ਡਾਕੂਮੈਂਟਾਂ ਲਈ ਸਕੈਨ ਕਰੋ",
|
||||||
"Search": "ਖੋਜ",
|
"Search": "ਖੋਜ",
|
||||||
"Search a model": "ਇੱਕ ਮਾਡਲ ਖੋਜੋ",
|
"Search a model": "ਇੱਕ ਮਾਡਲ ਖੋਜੋ",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "ਡਾਕੂਮੈਂਟ ਖੋਜੋ",
|
"Search Documents": "ਡਾਕੂਮੈਂਟ ਖੋਜੋ",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "ਪ੍ਰੰਪਟ ਖੋਜੋ",
|
"Search Prompts": "ਪ੍ਰੰਪਟ ਖੋਜੋ",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "Klucze API",
|
"API keys": "Klucze API",
|
||||||
"April": "Kwiecień",
|
"April": "Kwiecień",
|
||||||
"Archive": "Archiwum",
|
"Archive": "Archiwum",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "Zarchiwizowane czaty",
|
"Archived Chats": "Zarchiwizowane czaty",
|
||||||
"are allowed - Activate this command by typing": "są dozwolone - Aktywuj to polecenie, wpisując",
|
"are allowed - Activate this command by typing": "są dozwolone - Aktywuj to polecenie, wpisując",
|
||||||
"Are you sure?": "Jesteś pewien?",
|
"Are you sure?": "Jesteś pewien?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Niestandardowy",
|
"Custom": "Niestandardowy",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Ciemny",
|
"Dark": "Ciemny",
|
||||||
"Dashboard": "Dashboard",
|
|
||||||
"Database": "Baza danych",
|
"Database": "Baza danych",
|
||||||
"December": "Grudzień",
|
"December": "Grudzień",
|
||||||
"Default": "Domyślny",
|
"Default": "Domyślny",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "usuń",
|
"delete": "usuń",
|
||||||
"Delete": "Usuń",
|
"Delete": "Usuń",
|
||||||
"Delete a model": "Usuń model",
|
"Delete a model": "Usuń model",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Usuń czat",
|
"Delete chat": "Usuń czat",
|
||||||
"Delete Chat": "Usuń czat",
|
"Delete Chat": "Usuń czat",
|
||||||
"Delete Chats": "Usuń czaty",
|
|
||||||
"delete this link": "usuń ten link",
|
"delete this link": "usuń ten link",
|
||||||
"Delete User": "Usuń użytkownika",
|
"Delete User": "Usuń użytkownika",
|
||||||
"Deleted {{deleteModelTag}}": "Usunięto {{deleteModelTag}}",
|
"Deleted {{deleteModelTag}}": "Usunięto {{deleteModelTag}}",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "URL/Klucz OpenAI jest wymagany.",
|
"OpenAI URL/Key required.": "URL/Klucz OpenAI jest wymagany.",
|
||||||
"or": "lub",
|
"or": "lub",
|
||||||
"Other": "Inne",
|
"Other": "Inne",
|
||||||
"Overview": "Przegląd",
|
|
||||||
"Password": "Hasło",
|
"Password": "Hasło",
|
||||||
"PDF document (.pdf)": "Dokument PDF (.pdf)",
|
"PDF document (.pdf)": "Dokument PDF (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "PDF Wyodrębnij obrazy (OCR)",
|
"PDF Extract Images (OCR)": "PDF Wyodrębnij obrazy (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "Skanuj dokumenty z {{path}}",
|
"Scan for documents from {{path}}": "Skanuj dokumenty z {{path}}",
|
||||||
"Search": "Szukaj",
|
"Search": "Szukaj",
|
||||||
"Search a model": "Szukaj modelu",
|
"Search a model": "Szukaj modelu",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Szukaj dokumentów",
|
"Search Documents": "Szukaj dokumentów",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Szukaj promptów",
|
"Search Prompts": "Szukaj promptów",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "Chaves da API",
|
"API keys": "Chaves da API",
|
||||||
"April": "Abril",
|
"April": "Abril",
|
||||||
"Archive": "Arquivo",
|
"Archive": "Arquivo",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "Bate-papos arquivados",
|
"Archived Chats": "Bate-papos arquivados",
|
||||||
"are allowed - Activate this command by typing": "são permitidos - Ative este comando digitando",
|
"are allowed - Activate this command by typing": "são permitidos - Ative este comando digitando",
|
||||||
"Are you sure?": "Tem certeza?",
|
"Are you sure?": "Tem certeza?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Personalizado",
|
"Custom": "Personalizado",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Escuro",
|
"Dark": "Escuro",
|
||||||
"Dashboard": "Painel",
|
|
||||||
"Database": "Banco de dados",
|
"Database": "Banco de dados",
|
||||||
"December": "Dezembro",
|
"December": "Dezembro",
|
||||||
"Default": "Padrão",
|
"Default": "Padrão",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "excluir",
|
"delete": "excluir",
|
||||||
"Delete": "Excluir",
|
"Delete": "Excluir",
|
||||||
"Delete a model": "Excluir um modelo",
|
"Delete a model": "Excluir um modelo",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Excluir bate-papo",
|
"Delete chat": "Excluir bate-papo",
|
||||||
"Delete Chat": "Excluir Bate-papo",
|
"Delete Chat": "Excluir Bate-papo",
|
||||||
"Delete Chats": "Excluir Bate-papos",
|
|
||||||
"delete this link": "excluir este link",
|
"delete this link": "excluir este link",
|
||||||
"Delete User": "Excluir Usuário",
|
"Delete User": "Excluir Usuário",
|
||||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} excluído",
|
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} excluído",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "URL/Chave da API OpenAI é necessária.",
|
"OpenAI URL/Key required.": "URL/Chave da API OpenAI é necessária.",
|
||||||
"or": "ou",
|
"or": "ou",
|
||||||
"Other": "Outro",
|
"Other": "Outro",
|
||||||
"Overview": "Visão Geral",
|
|
||||||
"Password": "Senha",
|
"Password": "Senha",
|
||||||
"PDF document (.pdf)": "Documento PDF (.pdf)",
|
"PDF document (.pdf)": "Documento PDF (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
|
"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "Digitalizar documentos de {{path}}",
|
"Scan for documents from {{path}}": "Digitalizar documentos de {{path}}",
|
||||||
"Search": "Pesquisar",
|
"Search": "Pesquisar",
|
||||||
"Search a model": "Pesquisar um modelo",
|
"Search a model": "Pesquisar um modelo",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Pesquisar Documentos",
|
"Search Documents": "Pesquisar Documentos",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Pesquisar Prompts",
|
"Search Prompts": "Pesquisar Prompts",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "Chaves da API",
|
"API keys": "Chaves da API",
|
||||||
"April": "Abril",
|
"April": "Abril",
|
||||||
"Archive": "Arquivo",
|
"Archive": "Arquivo",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "Bate-papos arquivados",
|
"Archived Chats": "Bate-papos arquivados",
|
||||||
"are allowed - Activate this command by typing": "são permitidos - Ative este comando digitando",
|
"are allowed - Activate this command by typing": "são permitidos - Ative este comando digitando",
|
||||||
"Are you sure?": "Tem certeza?",
|
"Are you sure?": "Tem certeza?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Personalizado",
|
"Custom": "Personalizado",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Escuro",
|
"Dark": "Escuro",
|
||||||
"Dashboard": "Painel",
|
|
||||||
"Database": "Banco de dados",
|
"Database": "Banco de dados",
|
||||||
"December": "Dezembro",
|
"December": "Dezembro",
|
||||||
"Default": "Padrão",
|
"Default": "Padrão",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "excluir",
|
"delete": "excluir",
|
||||||
"Delete": "Excluir",
|
"Delete": "Excluir",
|
||||||
"Delete a model": "Excluir um modelo",
|
"Delete a model": "Excluir um modelo",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Excluir bate-papo",
|
"Delete chat": "Excluir bate-papo",
|
||||||
"Delete Chat": "Excluir Bate-papo",
|
"Delete Chat": "Excluir Bate-papo",
|
||||||
"Delete Chats": "Excluir Bate-papos",
|
|
||||||
"delete this link": "excluir este link",
|
"delete this link": "excluir este link",
|
||||||
"Delete User": "Excluir Usuário",
|
"Delete User": "Excluir Usuário",
|
||||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} excluído",
|
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} excluído",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "URL/Chave da API OpenAI é necessária.",
|
"OpenAI URL/Key required.": "URL/Chave da API OpenAI é necessária.",
|
||||||
"or": "ou",
|
"or": "ou",
|
||||||
"Other": "Outro",
|
"Other": "Outro",
|
||||||
"Overview": "Visão Geral",
|
|
||||||
"Password": "Senha",
|
"Password": "Senha",
|
||||||
"PDF document (.pdf)": "Documento PDF (.pdf)",
|
"PDF document (.pdf)": "Documento PDF (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
|
"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "Digitalizar documentos de {{path}}",
|
"Scan for documents from {{path}}": "Digitalizar documentos de {{path}}",
|
||||||
"Search": "Pesquisar",
|
"Search": "Pesquisar",
|
||||||
"Search a model": "Pesquisar um modelo",
|
"Search a model": "Pesquisar um modelo",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Pesquisar Documentos",
|
"Search Documents": "Pesquisar Documentos",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Pesquisar Prompts",
|
"Search Prompts": "Pesquisar Prompts",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "Ключи API",
|
"API keys": "Ключи API",
|
||||||
"April": "Апрель",
|
"April": "Апрель",
|
||||||
"Archive": "Архив",
|
"Archive": "Архив",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "запис на чат",
|
"Archived Chats": "запис на чат",
|
||||||
"are allowed - Activate this command by typing": "разрешено - активируйте эту команду вводом",
|
"are allowed - Activate this command by typing": "разрешено - активируйте эту команду вводом",
|
||||||
"Are you sure?": "Вы уверены?",
|
"Are you sure?": "Вы уверены?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Пользовательский",
|
"Custom": "Пользовательский",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Тёмный",
|
"Dark": "Тёмный",
|
||||||
"Dashboard": "Панель управления",
|
|
||||||
"Database": "База данных",
|
"Database": "База данных",
|
||||||
"December": "Декабрь",
|
"December": "Декабрь",
|
||||||
"Default": "По умолчанию",
|
"Default": "По умолчанию",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "удалить",
|
"delete": "удалить",
|
||||||
"Delete": "Удалить",
|
"Delete": "Удалить",
|
||||||
"Delete a model": "Удалить модель",
|
"Delete a model": "Удалить модель",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Удалить чат",
|
"Delete chat": "Удалить чат",
|
||||||
"Delete Chat": "Удалить чат",
|
"Delete Chat": "Удалить чат",
|
||||||
"Delete Chats": "Удалить чаты",
|
|
||||||
"delete this link": "удалить эту ссылку",
|
"delete this link": "удалить эту ссылку",
|
||||||
"Delete User": "Удалить пользователя",
|
"Delete User": "Удалить пользователя",
|
||||||
"Deleted {{deleteModelTag}}": "Удалено {{deleteModelTag}}",
|
"Deleted {{deleteModelTag}}": "Удалено {{deleteModelTag}}",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "Требуется URL-адрес API OpenAI или ключ API.",
|
"OpenAI URL/Key required.": "Требуется URL-адрес API OpenAI или ключ API.",
|
||||||
"or": "или",
|
"or": "или",
|
||||||
"Other": "Прочее",
|
"Other": "Прочее",
|
||||||
"Overview": "Обзор",
|
|
||||||
"Password": "Пароль",
|
"Password": "Пароль",
|
||||||
"PDF document (.pdf)": "PDF-документ (.pdf)",
|
"PDF document (.pdf)": "PDF-документ (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "Извлечение изображений из PDF (OCR)",
|
"PDF Extract Images (OCR)": "Извлечение изображений из PDF (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "Сканирование документов из {{path}}",
|
"Scan for documents from {{path}}": "Сканирование документов из {{path}}",
|
||||||
"Search": "Поиск",
|
"Search": "Поиск",
|
||||||
"Search a model": "Поиск модели",
|
"Search a model": "Поиск модели",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Поиск документов",
|
"Search Documents": "Поиск документов",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Поиск промтов",
|
"Search Prompts": "Поиск промтов",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "API кључеви",
|
"API keys": "API кључеви",
|
||||||
"April": "Април",
|
"April": "Април",
|
||||||
"Archive": "Архива",
|
"Archive": "Архива",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "Архивирана ћаскања",
|
"Archived Chats": "Архивирана ћаскања",
|
||||||
"are allowed - Activate this command by typing": "су дозвољени - Покрените ову наредбу уношењем",
|
"are allowed - Activate this command by typing": "су дозвољени - Покрените ову наредбу уношењем",
|
||||||
"Are you sure?": "Да ли сте сигурни?",
|
"Are you sure?": "Да ли сте сигурни?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Прилагођено",
|
"Custom": "Прилагођено",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Тамна",
|
"Dark": "Тамна",
|
||||||
"Dashboard": "Контролна табла",
|
|
||||||
"Database": "База података",
|
"Database": "База података",
|
||||||
"December": "Децембар",
|
"December": "Децембар",
|
||||||
"Default": "Подразумевано",
|
"Default": "Подразумевано",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "обриши",
|
"delete": "обриши",
|
||||||
"Delete": "Обриши",
|
"Delete": "Обриши",
|
||||||
"Delete a model": "Обриши модел",
|
"Delete a model": "Обриши модел",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Обриши ћаскање",
|
"Delete chat": "Обриши ћаскање",
|
||||||
"Delete Chat": "Обриши ћаскање",
|
"Delete Chat": "Обриши ћаскање",
|
||||||
"Delete Chats": "Обриши ћаскања",
|
|
||||||
"delete this link": "обриши ову везу",
|
"delete this link": "обриши ову везу",
|
||||||
"Delete User": "Обриши корисника",
|
"Delete User": "Обриши корисника",
|
||||||
"Deleted {{deleteModelTag}}": "Обрисано {{deleteModelTag}}",
|
"Deleted {{deleteModelTag}}": "Обрисано {{deleteModelTag}}",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "Потребан је OpenAI URL/кључ.",
|
"OpenAI URL/Key required.": "Потребан је OpenAI URL/кључ.",
|
||||||
"or": "или",
|
"or": "или",
|
||||||
"Other": "Остало",
|
"Other": "Остало",
|
||||||
"Overview": "Преглед",
|
|
||||||
"Password": "Лозинка",
|
"Password": "Лозинка",
|
||||||
"PDF document (.pdf)": "PDF документ (.pdf)",
|
"PDF document (.pdf)": "PDF документ (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "Извлачење PDF слика (OCR)",
|
"PDF Extract Images (OCR)": "Извлачење PDF слика (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "Скенирај документе из {{path}}",
|
"Scan for documents from {{path}}": "Скенирај документе из {{path}}",
|
||||||
"Search": "Претражи",
|
"Search": "Претражи",
|
||||||
"Search a model": "Претражи модел",
|
"Search a model": "Претражи модел",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Претражи документе",
|
"Search Documents": "Претражи документе",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Претражи упите",
|
"Search Prompts": "Претражи упите",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "API-nycklar",
|
"API keys": "API-nycklar",
|
||||||
"April": "April",
|
"April": "April",
|
||||||
"Archive": "Arkiv",
|
"Archive": "Arkiv",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "Arkiverade chattar",
|
"Archived Chats": "Arkiverade chattar",
|
||||||
"are allowed - Activate this command by typing": "är tillåtna - Aktivera detta kommando genom att skriva",
|
"are allowed - Activate this command by typing": "är tillåtna - Aktivera detta kommando genom att skriva",
|
||||||
"Are you sure?": "Är du säker?",
|
"Are you sure?": "Är du säker?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Anpassad",
|
"Custom": "Anpassad",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Mörk",
|
"Dark": "Mörk",
|
||||||
"Dashboard": "Instrumentbräda",
|
|
||||||
"Database": "Databas",
|
"Database": "Databas",
|
||||||
"December": "December",
|
"December": "December",
|
||||||
"Default": "Standard",
|
"Default": "Standard",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "radera",
|
"delete": "radera",
|
||||||
"Delete": "Radera",
|
"Delete": "Radera",
|
||||||
"Delete a model": "Ta bort en modell",
|
"Delete a model": "Ta bort en modell",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Radera chatt",
|
"Delete chat": "Radera chatt",
|
||||||
"Delete Chat": "Radera chatt",
|
"Delete Chat": "Radera chatt",
|
||||||
"Delete Chats": "Radera chattar",
|
|
||||||
"delete this link": "radera denna länk",
|
"delete this link": "radera denna länk",
|
||||||
"Delete User": "Radera användare",
|
"Delete User": "Radera användare",
|
||||||
"Deleted {{deleteModelTag}}": "Raderad {{deleteModelTag}}",
|
"Deleted {{deleteModelTag}}": "Raderad {{deleteModelTag}}",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "OpenAI-URL/nyckel krävs.",
|
"OpenAI URL/Key required.": "OpenAI-URL/nyckel krävs.",
|
||||||
"or": "eller",
|
"or": "eller",
|
||||||
"Other": "Andra",
|
"Other": "Andra",
|
||||||
"Overview": "Översikt",
|
|
||||||
"Password": "Lösenord",
|
"Password": "Lösenord",
|
||||||
"PDF document (.pdf)": "PDF-dokument (.pdf)",
|
"PDF document (.pdf)": "PDF-dokument (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "PDF Extrahera bilder (OCR)",
|
"PDF Extract Images (OCR)": "PDF Extrahera bilder (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "Skanna efter dokument från {{path}}",
|
"Scan for documents from {{path}}": "Skanna efter dokument från {{path}}",
|
||||||
"Search": "Sök",
|
"Search": "Sök",
|
||||||
"Search a model": "Sök efter en modell",
|
"Search a model": "Sök efter en modell",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Sök dokument",
|
"Search Documents": "Sök dokument",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Sök promptar",
|
"Search Prompts": "Sök promptar",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "API anahtarları",
|
"API keys": "API anahtarları",
|
||||||
"April": "Nisan",
|
"April": "Nisan",
|
||||||
"Archive": "Arşiv",
|
"Archive": "Arşiv",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "Arşivlenmiş Sohbetler",
|
"Archived Chats": "Arşivlenmiş Sohbetler",
|
||||||
"are allowed - Activate this command by typing": "izin verilir - Bu komutu yazarak etkinleştirin",
|
"are allowed - Activate this command by typing": "izin verilir - Bu komutu yazarak etkinleştirin",
|
||||||
"Are you sure?": "Emin misiniz?",
|
"Are you sure?": "Emin misiniz?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Özel",
|
"Custom": "Özel",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Koyu",
|
"Dark": "Koyu",
|
||||||
"Dashboard": "Panel",
|
|
||||||
"Database": "Veritabanı",
|
"Database": "Veritabanı",
|
||||||
"December": "Aralık",
|
"December": "Aralık",
|
||||||
"Default": "Varsayılan",
|
"Default": "Varsayılan",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "sil",
|
"delete": "sil",
|
||||||
"Delete": "Sil",
|
"Delete": "Sil",
|
||||||
"Delete a model": "Bir modeli sil",
|
"Delete a model": "Bir modeli sil",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Sohbeti sil",
|
"Delete chat": "Sohbeti sil",
|
||||||
"Delete Chat": "Sohbeti Sil",
|
"Delete Chat": "Sohbeti Sil",
|
||||||
"Delete Chats": "Sohbetleri Sil",
|
|
||||||
"delete this link": "bu bağlantıyı sil",
|
"delete this link": "bu bağlantıyı sil",
|
||||||
"Delete User": "Kullanıcıyı Sil",
|
"Delete User": "Kullanıcıyı Sil",
|
||||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} silindi",
|
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} silindi",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "OpenAI URL/Anahtar gereklidir.",
|
"OpenAI URL/Key required.": "OpenAI URL/Anahtar gereklidir.",
|
||||||
"or": "veya",
|
"or": "veya",
|
||||||
"Other": "Diğer",
|
"Other": "Diğer",
|
||||||
"Overview": "Genel Bakış",
|
|
||||||
"Password": "Parola",
|
"Password": "Parola",
|
||||||
"PDF document (.pdf)": "PDF belgesi (.pdf)",
|
"PDF document (.pdf)": "PDF belgesi (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "PDF Görüntülerini Çıkart (OCR)",
|
"PDF Extract Images (OCR)": "PDF Görüntülerini Çıkart (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "{{path}} dizininden belgeleri tarayın",
|
"Scan for documents from {{path}}": "{{path}} dizininden belgeleri tarayın",
|
||||||
"Search": "Ara",
|
"Search": "Ara",
|
||||||
"Search a model": "Bir model ara",
|
"Search a model": "Bir model ara",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Belgeleri Ara",
|
"Search Documents": "Belgeleri Ara",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Prompt Ara",
|
"Search Prompts": "Prompt Ara",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "Ключі API",
|
"API keys": "Ключі API",
|
||||||
"April": "Квітень",
|
"April": "Квітень",
|
||||||
"Archive": "Архів",
|
"Archive": "Архів",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "Архівовані чати",
|
"Archived Chats": "Архівовані чати",
|
||||||
"are allowed - Activate this command by typing": "дозволено - активізуйте цю команду набором",
|
"are allowed - Activate this command by typing": "дозволено - активізуйте цю команду набором",
|
||||||
"Are you sure?": "Ви впевнені?",
|
"Are you sure?": "Ви впевнені?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Налаштувати",
|
"Custom": "Налаштувати",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Темна",
|
"Dark": "Темна",
|
||||||
"Dashboard": "Панель управління",
|
|
||||||
"Database": "База даних",
|
"Database": "База даних",
|
||||||
"December": "Грудень",
|
"December": "Грудень",
|
||||||
"Default": "За замовчуванням",
|
"Default": "За замовчуванням",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "видалити",
|
"delete": "видалити",
|
||||||
"Delete": "Видалити",
|
"Delete": "Видалити",
|
||||||
"Delete a model": "Видалити модель",
|
"Delete a model": "Видалити модель",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Видалити чат",
|
"Delete chat": "Видалити чат",
|
||||||
"Delete Chat": "Видалити чат",
|
"Delete Chat": "Видалити чат",
|
||||||
"Delete Chats": "Видалити чати",
|
|
||||||
"delete this link": "видалити це посилання",
|
"delete this link": "видалити це посилання",
|
||||||
"Delete User": "Видалити користувача",
|
"Delete User": "Видалити користувача",
|
||||||
"Deleted {{deleteModelTag}}": "Видалено {{deleteModelTag}}",
|
"Deleted {{deleteModelTag}}": "Видалено {{deleteModelTag}}",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "Потрібен OpenAI URL/ключ.",
|
"OpenAI URL/Key required.": "Потрібен OpenAI URL/ключ.",
|
||||||
"or": "або",
|
"or": "або",
|
||||||
"Other": "Інше",
|
"Other": "Інше",
|
||||||
"Overview": "Огляд",
|
|
||||||
"Password": "Пароль",
|
"Password": "Пароль",
|
||||||
"PDF document (.pdf)": "PDF документ (.pdf)",
|
"PDF document (.pdf)": "PDF документ (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "Розпізнавання зображень з PDF (OCR)",
|
"PDF Extract Images (OCR)": "Розпізнавання зображень з PDF (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "Сканування документів з {{path}}",
|
"Scan for documents from {{path}}": "Сканування документів з {{path}}",
|
||||||
"Search": "Пошук",
|
"Search": "Пошук",
|
||||||
"Search a model": "Шукати модель",
|
"Search a model": "Шукати модель",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Пошук документів",
|
"Search Documents": "Пошук документів",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Пошук промтів",
|
"Search Prompts": "Пошук промтів",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "API Keys",
|
"API keys": "API Keys",
|
||||||
"April": "Tháng 4",
|
"April": "Tháng 4",
|
||||||
"Archive": "Lưu trữ",
|
"Archive": "Lưu trữ",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "bản ghi trò chuyện",
|
"Archived Chats": "bản ghi trò chuyện",
|
||||||
"are allowed - Activate this command by typing": "được phép - Kích hoạt lệnh này bằng cách gõ",
|
"are allowed - Activate this command by typing": "được phép - Kích hoạt lệnh này bằng cách gõ",
|
||||||
"Are you sure?": "Bạn có chắc chắn không?",
|
"Are you sure?": "Bạn có chắc chắn không?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "Tùy chỉnh",
|
"Custom": "Tùy chỉnh",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "Tối",
|
"Dark": "Tối",
|
||||||
"Dashboard": "Trang tổng quan",
|
|
||||||
"Database": "Cơ sở dữ liệu",
|
"Database": "Cơ sở dữ liệu",
|
||||||
"December": "Tháng 12",
|
"December": "Tháng 12",
|
||||||
"Default": "Mặc định",
|
"Default": "Mặc định",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "xóa",
|
"delete": "xóa",
|
||||||
"Delete": "Xóa",
|
"Delete": "Xóa",
|
||||||
"Delete a model": "Xóa mô hình",
|
"Delete a model": "Xóa mô hình",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "Xóa nội dung chat",
|
"Delete chat": "Xóa nội dung chat",
|
||||||
"Delete Chat": "Xóa chat",
|
"Delete Chat": "Xóa chat",
|
||||||
"Delete Chats": "Xóa nội dung chat",
|
|
||||||
"delete this link": "Xóa link này",
|
"delete this link": "Xóa link này",
|
||||||
"Delete User": "Xóa người dùng",
|
"Delete User": "Xóa người dùng",
|
||||||
"Deleted {{deleteModelTag}}": "Đã xóa {{deleteModelTag}}",
|
"Deleted {{deleteModelTag}}": "Đã xóa {{deleteModelTag}}",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "Yêu cầu URL/Key API OpenAI.",
|
"OpenAI URL/Key required.": "Yêu cầu URL/Key API OpenAI.",
|
||||||
"or": "hoặc",
|
"or": "hoặc",
|
||||||
"Other": "Khác",
|
"Other": "Khác",
|
||||||
"Overview": "Tổng quan",
|
|
||||||
"Password": "Mật khẩu",
|
"Password": "Mật khẩu",
|
||||||
"PDF document (.pdf)": "Tập tin PDF (.pdf)",
|
"PDF document (.pdf)": "Tập tin PDF (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "Trích xuất ảnh từ PDF (OCR)",
|
"PDF Extract Images (OCR)": "Trích xuất ảnh từ PDF (OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "Quét tài liệu từ đường dẫn: {{path}}",
|
"Scan for documents from {{path}}": "Quét tài liệu từ đường dẫn: {{path}}",
|
||||||
"Search": "Tìm kiếm",
|
"Search": "Tìm kiếm",
|
||||||
"Search a model": "Tìm model",
|
"Search a model": "Tìm model",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "Tìm tài liệu",
|
"Search Documents": "Tìm tài liệu",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "Tìm prompt",
|
"Search Prompts": "Tìm prompt",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "API 密钥",
|
"API keys": "API 密钥",
|
||||||
"April": "四月",
|
"April": "四月",
|
||||||
"Archive": "存档",
|
"Archive": "存档",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "聊天记录存档",
|
"Archived Chats": "聊天记录存档",
|
||||||
"are allowed - Activate this command by typing": "允许 - 通过输入来激活这个命令",
|
"are allowed - Activate this command by typing": "允许 - 通过输入来激活这个命令",
|
||||||
"Are you sure?": "你确定吗?",
|
"Are you sure?": "你确定吗?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "自定义",
|
"Custom": "自定义",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "暗色",
|
"Dark": "暗色",
|
||||||
"Dashboard": "仪表盘",
|
|
||||||
"Database": "数据库",
|
"Database": "数据库",
|
||||||
"December": "十二月",
|
"December": "十二月",
|
||||||
"Default": "默认",
|
"Default": "默认",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "删除",
|
"delete": "删除",
|
||||||
"Delete": "删除",
|
"Delete": "删除",
|
||||||
"Delete a model": "删除一个模型",
|
"Delete a model": "删除一个模型",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "删除聊天",
|
"Delete chat": "删除聊天",
|
||||||
"Delete Chat": "删除聊天",
|
"Delete Chat": "删除聊天",
|
||||||
"Delete Chats": "删除聊天记录",
|
|
||||||
"delete this link": "删除这个链接",
|
"delete this link": "删除这个链接",
|
||||||
"Delete User": "删除用户",
|
"Delete User": "删除用户",
|
||||||
"Deleted {{deleteModelTag}}": "已删除{{deleteModelTag}}",
|
"Deleted {{deleteModelTag}}": "已删除{{deleteModelTag}}",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "需要 OpenAI URL/Key",
|
"OpenAI URL/Key required.": "需要 OpenAI URL/Key",
|
||||||
"or": "或",
|
"or": "或",
|
||||||
"Other": "其他",
|
"Other": "其他",
|
||||||
"Overview": "概述",
|
|
||||||
"Password": "密码",
|
"Password": "密码",
|
||||||
"PDF document (.pdf)": "PDF 文档 (.pdf)",
|
"PDF document (.pdf)": "PDF 文档 (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "PDF 图像处理 (使用 OCR)",
|
"PDF Extract Images (OCR)": "PDF 图像处理 (使用 OCR)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "从 {{path}} 扫描文档",
|
"Scan for documents from {{path}}": "从 {{path}} 扫描文档",
|
||||||
"Search": "搜索",
|
"Search": "搜索",
|
||||||
"Search a model": "搜索模型",
|
"Search a model": "搜索模型",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "搜索文档",
|
"Search Documents": "搜索文档",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "搜索提示词",
|
"Search Prompts": "搜索提示词",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
"API keys": "API Keys",
|
"API keys": "API Keys",
|
||||||
"April": "4月",
|
"April": "4月",
|
||||||
"Archive": "存檔",
|
"Archive": "存檔",
|
||||||
|
"Archive All Chats": "",
|
||||||
"Archived Chats": "聊天記錄存檔",
|
"Archived Chats": "聊天記錄存檔",
|
||||||
"are allowed - Activate this command by typing": "是允許的 - 透過輸入",
|
"are allowed - Activate this command by typing": "是允許的 - 透過輸入",
|
||||||
"Are you sure?": "你確定嗎?",
|
"Are you sure?": "你確定嗎?",
|
||||||
|
|
@ -120,7 +121,6 @@
|
||||||
"Custom": "自訂",
|
"Custom": "自訂",
|
||||||
"Customize models for a specific purpose": "",
|
"Customize models for a specific purpose": "",
|
||||||
"Dark": "暗色",
|
"Dark": "暗色",
|
||||||
"Dashboard": "儀表板",
|
|
||||||
"Database": "資料庫",
|
"Database": "資料庫",
|
||||||
"December": "12月",
|
"December": "12月",
|
||||||
"Default": "預設",
|
"Default": "預設",
|
||||||
|
|
@ -133,9 +133,9 @@
|
||||||
"delete": "刪除",
|
"delete": "刪除",
|
||||||
"Delete": "刪除",
|
"Delete": "刪除",
|
||||||
"Delete a model": "刪除一個模型",
|
"Delete a model": "刪除一個模型",
|
||||||
|
"Delete All Chats": "",
|
||||||
"Delete chat": "刪除聊天紀錄",
|
"Delete chat": "刪除聊天紀錄",
|
||||||
"Delete Chat": "刪除聊天紀錄",
|
"Delete Chat": "刪除聊天紀錄",
|
||||||
"Delete Chats": "刪除聊天紀錄",
|
|
||||||
"delete this link": "刪除此連結",
|
"delete this link": "刪除此連結",
|
||||||
"Delete User": "刪除用戶",
|
"Delete User": "刪除用戶",
|
||||||
"Deleted {{deleteModelTag}}": "已刪除 {{deleteModelTag}}",
|
"Deleted {{deleteModelTag}}": "已刪除 {{deleteModelTag}}",
|
||||||
|
|
@ -314,7 +314,6 @@
|
||||||
"OpenAI URL/Key required.": "需要 OpenAI URL/金鑰。",
|
"OpenAI URL/Key required.": "需要 OpenAI URL/金鑰。",
|
||||||
"or": "或",
|
"or": "或",
|
||||||
"Other": "其他",
|
"Other": "其他",
|
||||||
"Overview": "總覽",
|
|
||||||
"Password": "密碼",
|
"Password": "密碼",
|
||||||
"PDF document (.pdf)": "PDF 文件 (.pdf)",
|
"PDF document (.pdf)": "PDF 文件 (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "PDF 圖像擷取(OCR 光學文字辨識)",
|
"PDF Extract Images (OCR)": "PDF 圖像擷取(OCR 光學文字辨識)",
|
||||||
|
|
@ -365,7 +364,9 @@
|
||||||
"Scan for documents from {{path}}": "從 {{path}} 掃描文件",
|
"Scan for documents from {{path}}": "從 {{path}} 掃描文件",
|
||||||
"Search": "搜尋",
|
"Search": "搜尋",
|
||||||
"Search a model": "搜尋模型",
|
"Search a model": "搜尋模型",
|
||||||
|
"Search Chats": "",
|
||||||
"Search Documents": "搜尋文件",
|
"Search Documents": "搜尋文件",
|
||||||
|
"Search Models": "",
|
||||||
"Search Prompts": "搜尋提示詞",
|
"Search Prompts": "搜尋提示詞",
|
||||||
"Search Results": "",
|
"Search Results": "",
|
||||||
"Searching the web for '{{searchQuery}}'": "",
|
"Searching the web for '{{searchQuery}}'": "",
|
||||||
|
|
|
||||||
|
|
@ -133,9 +133,9 @@ type Config = {
|
||||||
images?: boolean;
|
images?: boolean;
|
||||||
default_models?: string[];
|
default_models?: string[];
|
||||||
default_prompt_suggestions?: PromptSuggestion[];
|
default_prompt_suggestions?: PromptSuggestion[];
|
||||||
trusted_header_auth?: boolean;
|
auth_trusted_header?: boolean;
|
||||||
model_config?: GlobalModelConfig;
|
model_config?: GlobalModelConfig;
|
||||||
websearch?: boolean;
|
enable_websearch?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
type PromptSuggestion = {
|
type PromptSuggestion = {
|
||||||
|
|
|
||||||
|
|
@ -12,11 +12,12 @@ export const sanitizeResponseContent = (content: string) => {
|
||||||
.replace(/<$/, '')
|
.replace(/<$/, '')
|
||||||
.replaceAll(/<\|[a-z]+\|>/g, ' ')
|
.replaceAll(/<\|[a-z]+\|>/g, ' ')
|
||||||
.replaceAll('<', '<')
|
.replaceAll('<', '<')
|
||||||
|
.replaceAll('>', '>')
|
||||||
.trim();
|
.trim();
|
||||||
};
|
};
|
||||||
|
|
||||||
export const revertSanitizedResponseContent = (content: string) => {
|
export const revertSanitizedResponseContent = (content: string) => {
|
||||||
return content.replaceAll('<', '<');
|
return content.replaceAll('<', '<').replaceAll('>', '>');
|
||||||
};
|
};
|
||||||
|
|
||||||
export const capitalizeFirstLetter = (string) => {
|
export const capitalizeFirstLetter = (string) => {
|
||||||
|
|
|
||||||
78
src/routes/(app)/admin/+layout.svelte
Normal file
78
src/routes/(app)/admin/+layout.svelte
Normal file
|
|
@ -0,0 +1,78 @@
|
||||||
|
<script lang="ts">
|
||||||
|
import { onMount, getContext } from 'svelte';
|
||||||
|
|
||||||
|
import { WEBUI_NAME, showSidebar } from '$lib/stores';
|
||||||
|
import MenuLines from '$lib/components/icons/MenuLines.svelte';
|
||||||
|
import { page } from '$app/stores';
|
||||||
|
|
||||||
|
const i18n = getContext('i18n');
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<svelte:head>
|
||||||
|
<title>
|
||||||
|
{$i18n.t('Admin Panel')} | {$WEBUI_NAME}
|
||||||
|
</title>
|
||||||
|
</svelte:head>
|
||||||
|
|
||||||
|
<div class=" flex flex-col w-full min-h-screen max-h-screen">
|
||||||
|
<div class=" px-4 pt-3 mt-0.5 mb-1">
|
||||||
|
<div class=" flex items-center gap-1">
|
||||||
|
<div class="{$showSidebar ? 'md:hidden' : ''} mr-1 self-start flex flex-none items-center">
|
||||||
|
<button
|
||||||
|
id="sidebar-toggle-button"
|
||||||
|
class="cursor-pointer p-1 flex rounded-xl hover:bg-gray-100 dark:hover:bg-gray-850 transition"
|
||||||
|
on:click={() => {
|
||||||
|
showSidebar.set(!$showSidebar);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div class=" m-auto self-center">
|
||||||
|
<MenuLines />
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center text-xl font-semibold">{$i18n.t('Workspace')}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- <div class="px-4 my-1">
|
||||||
|
<div
|
||||||
|
class="flex scrollbar-none overflow-x-auto w-fit text-center text-sm font-medium rounded-xl bg-transparent/10 p-1"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="min-w-fit rounded-lg p-1.5 px-3 {$page.url.pathname.includes('/workspace/models')
|
||||||
|
? 'bg-gray-50 dark:bg-gray-850'
|
||||||
|
: ''} transition"
|
||||||
|
href="/workspace/models">{$i18n.t('Models')}</a
|
||||||
|
>
|
||||||
|
|
||||||
|
<a
|
||||||
|
class="min-w-fit rounded-lg p-1.5 px-3 {$page.url.pathname.includes('/workspace/prompts')
|
||||||
|
? 'bg-gray-50 dark:bg-gray-850'
|
||||||
|
: ''} transition"
|
||||||
|
href="/workspace/prompts">{$i18n.t('Prompts')}</a
|
||||||
|
>
|
||||||
|
|
||||||
|
<a
|
||||||
|
class="min-w-fit rounded-lg p-1.5 px-3 {$page.url.pathname.includes('/workspace/documents')
|
||||||
|
? 'bg-gray-50 dark:bg-gray-850'
|
||||||
|
: ''} transition"
|
||||||
|
href="/workspace/documents"
|
||||||
|
>
|
||||||
|
{$i18n.t('Documents')}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a
|
||||||
|
class="min-w-fit rounded-lg p-1.5 px-3 {$page.url.pathname.includes('/workspace/playground')
|
||||||
|
? 'bg-gray-50 dark:bg-gray-850'
|
||||||
|
: ''} transition"
|
||||||
|
href="/workspace/playground">{$i18n.t('Playground')}</a
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div> -->
|
||||||
|
|
||||||
|
<hr class=" my-2 dark:border-gray-850" />
|
||||||
|
|
||||||
|
<div class=" py-1 px-5 flex-1 max-h-full overflow-y-auto">
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
@ -82,10 +82,6 @@
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:head>
|
|
||||||
<title>{$i18n.t('Admin Panel')} | {$WEBUI_NAME}</title>
|
|
||||||
</svelte:head>
|
|
||||||
|
|
||||||
{#key selectedUser}
|
{#key selectedUser}
|
||||||
<EditUserModal
|
<EditUserModal
|
||||||
bind:show={showEditUserModal}
|
bind:show={showEditUserModal}
|
||||||
|
|
@ -106,265 +102,222 @@
|
||||||
<UserChatsModal bind:show={showUserChatsModal} user={selectedUser} />
|
<UserChatsModal bind:show={showUserChatsModal} user={selectedUser} />
|
||||||
<SettingsModal bind:show={showSettingsModal} />
|
<SettingsModal bind:show={showSettingsModal} />
|
||||||
|
|
||||||
<div class=" flex flex-col w-full min-h-screen">
|
{#if loaded}
|
||||||
{#if loaded}
|
<div class="mt-0.5 mb-3 gap-1 flex flex-col md:flex-row justify-between">
|
||||||
<div class="px-4 pt-3 mt-0.5 mb-1">
|
<div class="flex md:self-center text-lg font-medium px-0.5">
|
||||||
<div class=" flex items-center gap-1">
|
{$i18n.t('All Users')}
|
||||||
<div class="{$showSidebar ? 'md:hidden' : ''} mr-1 self-start flex flex-none items-center">
|
<div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-200 dark:bg-gray-700" />
|
||||||
|
<span class="text-lg font-medium text-gray-500 dark:text-gray-300">{users.length}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex gap-1">
|
||||||
|
<input
|
||||||
|
class="w-full md:w-60 rounded-xl py-1.5 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||||
|
placeholder={$i18n.t('Search')}
|
||||||
|
bind:value={search}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<div class="flex gap-0.5">
|
||||||
|
<Tooltip content="Add User">
|
||||||
<button
|
<button
|
||||||
id="sidebar-toggle-button"
|
class=" px-2 py-2 rounded-xl border border-gray-200 dark:border-gray-600 dark:border-0 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition font-medium text-sm flex items-center space-x-1"
|
||||||
class="cursor-pointer p-1 flex rounded-xl hover:bg-gray-100 dark:hover:bg-gray-850 transition"
|
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
showSidebar.set(!$showSidebar);
|
showAddUserModal = !showAddUserModal;
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div class=" m-auto self-center">
|
<svg
|
||||||
<MenuLines />
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
</div>
|
viewBox="0 0 16 16"
|
||||||
|
fill="currentColor"
|
||||||
|
class="w-4 h-4"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M8.75 3.75a.75.75 0 0 0-1.5 0v3.5h-3.5a.75.75 0 0 0 0 1.5h3.5v3.5a.75.75 0 0 0 1.5 0v-3.5h3.5a.75.75 0 0 0 0-1.5h-3.5v-3.5Z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</Tooltip>
|
||||||
<div class="flex items-center text-xl font-semibold">{$i18n.t('Dashboard')}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- <div class="px-4 my-1">
|
<Tooltip content={$i18n.t('Admin Settings')}>
|
||||||
<div
|
<button
|
||||||
class="flex scrollbar-none overflow-x-auto w-fit text-center text-sm font-medium rounded-xl bg-transparent/10 p-1"
|
class=" px-2 py-2 rounded-xl border border-gray-200 dark:border-gray-600 dark:border-0 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition font-medium text-sm flex items-center space-x-1"
|
||||||
>
|
on:click={() => {
|
||||||
<button
|
showSettingsModal = !showSettingsModal;
|
||||||
class="min-w-fit rounded-lg p-1.5 px-3 {tab === ''
|
}}
|
||||||
? 'bg-gray-50 dark:bg-gray-850'
|
|
||||||
: ''} transition"
|
|
||||||
type="button"
|
|
||||||
on:click={() => {
|
|
||||||
tab = '';
|
|
||||||
}}>{$i18n.t('Overview')}</button
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div> -->
|
|
||||||
|
|
||||||
<hr class=" my-2 dark:border-gray-850" />
|
|
||||||
|
|
||||||
<div class="px-6">
|
|
||||||
<div class="mt-0.5 mb-3 gap-1 flex flex-col md:flex-row justify-between">
|
|
||||||
<div class="flex md:self-center text-lg font-medium px-0.5">
|
|
||||||
{$i18n.t('All Users')}
|
|
||||||
<div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-200 dark:bg-gray-700" />
|
|
||||||
<span class="text-lg font-medium text-gray-500 dark:text-gray-300">{users.length}</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flex gap-1">
|
|
||||||
<input
|
|
||||||
class="w-full md:w-60 rounded-xl py-1.5 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
|
||||||
placeholder={$i18n.t('Search')}
|
|
||||||
bind:value={search}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div class="flex gap-0.5">
|
|
||||||
<Tooltip content="Add User">
|
|
||||||
<button
|
|
||||||
class=" px-2 py-2 rounded-xl border border-gray-200 dark:border-gray-600 dark:border-0 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition font-medium text-sm flex items-center space-x-1"
|
|
||||||
on:click={() => {
|
|
||||||
showAddUserModal = !showAddUserModal;
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 16 16"
|
|
||||||
fill="currentColor"
|
|
||||||
class="w-4 h-4"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
d="M8.75 3.75a.75.75 0 0 0-1.5 0v3.5h-3.5a.75.75 0 0 0 0 1.5h3.5v3.5a.75.75 0 0 0 1.5 0v-3.5h3.5a.75.75 0 0 0 0-1.5h-3.5v-3.5Z"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
</Tooltip>
|
|
||||||
|
|
||||||
<Tooltip content={$i18n.t('Admin Settings')}>
|
|
||||||
<button
|
|
||||||
class=" px-2 py-2 rounded-xl border border-gray-200 dark:border-gray-600 dark:border-0 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition font-medium text-sm flex items-center space-x-1"
|
|
||||||
on:click={() => {
|
|
||||||
showSettingsModal = !showSettingsModal;
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 16 16"
|
|
||||||
fill="currentColor"
|
|
||||||
class="w-4 h-4"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
fill-rule="evenodd"
|
|
||||||
d="M6.955 1.45A.5.5 0 0 1 7.452 1h1.096a.5.5 0 0 1 .497.45l.17 1.699c.484.12.94.312 1.356.562l1.321-1.081a.5.5 0 0 1 .67.033l.774.775a.5.5 0 0 1 .034.67l-1.08 1.32c.25.417.44.873.561 1.357l1.699.17a.5.5 0 0 1 .45.497v1.096a.5.5 0 0 1-.45.497l-1.699.17c-.12.484-.312.94-.562 1.356l1.082 1.322a.5.5 0 0 1-.034.67l-.774.774a.5.5 0 0 1-.67.033l-1.322-1.08c-.416.25-.872.44-1.356.561l-.17 1.699a.5.5 0 0 1-.497.45H7.452a.5.5 0 0 1-.497-.45l-.17-1.699a4.973 4.973 0 0 1-1.356-.562L4.108 13.37a.5.5 0 0 1-.67-.033l-.774-.775a.5.5 0 0 1-.034-.67l1.08-1.32a4.971 4.971 0 0 1-.561-1.357l-1.699-.17A.5.5 0 0 1 1 8.548V7.452a.5.5 0 0 1 .45-.497l1.699-.17c.12-.484.312-.94.562-1.356L2.629 4.107a.5.5 0 0 1 .034-.67l.774-.774a.5.5 0 0 1 .67-.033L5.43 3.71a4.97 4.97 0 0 1 1.356-.561l.17-1.699ZM6 8c0 .538.212 1.026.558 1.385l.057.057a2 2 0 0 0 2.828-2.828l-.058-.056A2 2 0 0 0 6 8Z"
|
|
||||||
clip-rule="evenodd"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
</Tooltip>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="scrollbar-hidden relative overflow-x-auto whitespace-nowrap">
|
|
||||||
<table class="w-full text-sm text-left text-gray-500 dark:text-gray-400 table-auto">
|
|
||||||
<thead
|
|
||||||
class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-850 dark:text-gray-400"
|
|
||||||
>
|
>
|
||||||
<tr>
|
<svg
|
||||||
<th scope="col" class="px-3 py-2"> {$i18n.t('Role')} </th>
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
<th scope="col" class="px-3 py-2"> {$i18n.t('Name')} </th>
|
viewBox="0 0 16 16"
|
||||||
<th scope="col" class="px-3 py-2"> {$i18n.t('Email')} </th>
|
fill="currentColor"
|
||||||
<th scope="col" class="px-3 py-2"> {$i18n.t('Last Active')} </th>
|
class="w-4 h-4"
|
||||||
|
>
|
||||||
<th scope="col" class="px-3 py-2"> {$i18n.t('Created at')} </th>
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
<th scope="col" class="px-3 py-2 text-right" />
|
d="M6.955 1.45A.5.5 0 0 1 7.452 1h1.096a.5.5 0 0 1 .497.45l.17 1.699c.484.12.94.312 1.356.562l1.321-1.081a.5.5 0 0 1 .67.033l.774.775a.5.5 0 0 1 .034.67l-1.08 1.32c.25.417.44.873.561 1.357l1.699.17a.5.5 0 0 1 .45.497v1.096a.5.5 0 0 1-.45.497l-1.699.17c-.12.484-.312.94-.562 1.356l1.082 1.322a.5.5 0 0 1-.034.67l-.774.774a.5.5 0 0 1-.67.033l-1.322-1.08c-.416.25-.872.44-1.356.561l-.17 1.699a.5.5 0 0 1-.497.45H7.452a.5.5 0 0 1-.497-.45l-.17-1.699a4.973 4.973 0 0 1-1.356-.562L4.108 13.37a.5.5 0 0 1-.67-.033l-.774-.775a.5.5 0 0 1-.034-.67l1.08-1.32a4.971 4.971 0 0 1-.561-1.357l-1.699-.17A.5.5 0 0 1 1 8.548V7.452a.5.5 0 0 1 .45-.497l1.699-.17c.12-.484.312-.94.562-1.356L2.629 4.107a.5.5 0 0 1 .034-.67l.774-.774a.5.5 0 0 1 .67-.033L5.43 3.71a4.97 4.97 0 0 1 1.356-.561l.17-1.699ZM6 8c0 .538.212 1.026.558 1.385l.057.057a2 2 0 0 0 2.828-2.828l-.058-.056A2 2 0 0 0 6 8Z"
|
||||||
</tr>
|
clip-rule="evenodd"
|
||||||
</thead>
|
/>
|
||||||
<tbody>
|
</svg>
|
||||||
{#each users
|
</button>
|
||||||
.filter((user) => {
|
</Tooltip>
|
||||||
if (search === '') {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
let name = user.name.toLowerCase();
|
|
||||||
const query = search.toLowerCase();
|
|
||||||
return name.includes(query);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.slice((page - 1) * 20, page * 20) as user}
|
|
||||||
<tr class="bg-white border-b dark:bg-gray-900 dark:border-gray-700 text-xs">
|
|
||||||
<td class="px-3 py-2 min-w-[7rem] w-28">
|
|
||||||
<button
|
|
||||||
class=" flex items-center gap-2 text-xs px-3 py-0.5 rounded-lg {user.role ===
|
|
||||||
'admin' && 'text-sky-600 dark:text-sky-200 bg-sky-200/30'} {user.role ===
|
|
||||||
'user' && 'text-green-600 dark:text-green-200 bg-green-200/30'} {user.role ===
|
|
||||||
'pending' && 'text-gray-600 dark:text-gray-200 bg-gray-200/30'}"
|
|
||||||
on:click={() => {
|
|
||||||
if (user.role === 'user') {
|
|
||||||
updateRoleHandler(user.id, 'admin');
|
|
||||||
} else if (user.role === 'pending') {
|
|
||||||
updateRoleHandler(user.id, 'user');
|
|
||||||
} else {
|
|
||||||
updateRoleHandler(user.id, 'pending');
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
class="w-1 h-1 rounded-full {user.role === 'admin' &&
|
|
||||||
'bg-sky-600 dark:bg-sky-300'} {user.role === 'user' &&
|
|
||||||
'bg-green-600 dark:bg-green-300'} {user.role === 'pending' &&
|
|
||||||
'bg-gray-600 dark:bg-gray-300'}"
|
|
||||||
/>
|
|
||||||
{$i18n.t(user.role)}</button
|
|
||||||
>
|
|
||||||
</td>
|
|
||||||
<td class="px-3 py-2 font-medium text-gray-900 dark:text-white w-max">
|
|
||||||
<div class="flex flex-row w-max">
|
|
||||||
<img
|
|
||||||
class=" rounded-full w-6 h-6 object-cover mr-2.5"
|
|
||||||
src={user.profile_image_url.startsWith(WEBUI_BASE_URL) ||
|
|
||||||
user.profile_image_url.startsWith('https://www.gravatar.com/avatar/') ||
|
|
||||||
user.profile_image_url.startsWith('data:')
|
|
||||||
? user.profile_image_url
|
|
||||||
: `/user.png`}
|
|
||||||
alt="user"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div class=" font-medium self-center">{user.name}</div>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td class=" px-3 py-2"> {user.email} </td>
|
|
||||||
|
|
||||||
<td class=" px-3 py-2">
|
|
||||||
{dayjs(user.last_active_at * 1000).fromNow()}
|
|
||||||
</td>
|
|
||||||
|
|
||||||
<td class=" px-3 py-2">
|
|
||||||
{dayjs(user.created_at * 1000).format($i18n.t('MMMM DD, YYYY'))}
|
|
||||||
</td>
|
|
||||||
|
|
||||||
<td class="px-3 py-2 text-right">
|
|
||||||
<div class="flex justify-end w-full">
|
|
||||||
{#if user.role !== 'admin'}
|
|
||||||
<Tooltip content={$i18n.t('Chats')}>
|
|
||||||
<button
|
|
||||||
class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
|
||||||
on:click={async () => {
|
|
||||||
showUserChatsModal = !showUserChatsModal;
|
|
||||||
selectedUser = user;
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<ChatBubbles />
|
|
||||||
</button>
|
|
||||||
</Tooltip>
|
|
||||||
|
|
||||||
<Tooltip content={$i18n.t('Edit User')}>
|
|
||||||
<button
|
|
||||||
class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
|
||||||
on:click={async () => {
|
|
||||||
showEditUserModal = !showEditUserModal;
|
|
||||||
selectedUser = user;
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
fill="none"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
stroke-width="1.5"
|
|
||||||
stroke="currentColor"
|
|
||||||
class="w-4 h-4"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
</Tooltip>
|
|
||||||
|
|
||||||
<Tooltip content={$i18n.t('Delete User')}>
|
|
||||||
<button
|
|
||||||
class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
|
||||||
on:click={async () => {
|
|
||||||
deleteUserHandler(user.id);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
fill="none"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
stroke-width="1.5"
|
|
||||||
stroke="currentColor"
|
|
||||||
class="w-4 h-4"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
</Tooltip>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{/each}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class=" text-gray-500 text-xs mt-2 text-right">
|
|
||||||
ⓘ {$i18n.t("Click on the user role button to change a user's role.")}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<Pagination bind:page count={users.length} />
|
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
</div>
|
||||||
</div>
|
|
||||||
|
<div class="scrollbar-hidden relative whitespace-nowrap overflow-x-auto max-w-full">
|
||||||
|
<table class="w-full text-sm text-left text-gray-500 dark:text-gray-400 table-auto max-w-full">
|
||||||
|
<thead class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-850 dark:text-gray-400">
|
||||||
|
<tr>
|
||||||
|
<th scope="col" class="px-3 py-2"> {$i18n.t('Role')} </th>
|
||||||
|
<th scope="col" class="px-3 py-2"> {$i18n.t('Name')} </th>
|
||||||
|
<th scope="col" class="px-3 py-2"> {$i18n.t('Email')} </th>
|
||||||
|
<th scope="col" class="px-3 py-2"> {$i18n.t('Last Active')} </th>
|
||||||
|
|
||||||
|
<th scope="col" class="px-3 py-2"> {$i18n.t('Created at')} </th>
|
||||||
|
|
||||||
|
<th scope="col" class="px-3 py-2 text-right" />
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{#each users
|
||||||
|
.filter((user) => {
|
||||||
|
if (search === '') {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
let name = user.name.toLowerCase();
|
||||||
|
const query = search.toLowerCase();
|
||||||
|
return name.includes(query);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.slice((page - 1) * 20, page * 20) as user}
|
||||||
|
<tr class="bg-white border-b dark:bg-gray-900 dark:border-gray-700 text-xs">
|
||||||
|
<td class="px-3 py-2 min-w-[7rem] w-28">
|
||||||
|
<button
|
||||||
|
class=" flex items-center gap-2 text-xs px-3 py-0.5 rounded-lg {user.role ===
|
||||||
|
'admin' && 'text-sky-600 dark:text-sky-200 bg-sky-200/30'} {user.role ===
|
||||||
|
'user' && 'text-green-600 dark:text-green-200 bg-green-200/30'} {user.role ===
|
||||||
|
'pending' && 'text-gray-600 dark:text-gray-200 bg-gray-200/30'}"
|
||||||
|
on:click={() => {
|
||||||
|
if (user.role === 'user') {
|
||||||
|
updateRoleHandler(user.id, 'admin');
|
||||||
|
} else if (user.role === 'pending') {
|
||||||
|
updateRoleHandler(user.id, 'user');
|
||||||
|
} else {
|
||||||
|
updateRoleHandler(user.id, 'pending');
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="w-1 h-1 rounded-full {user.role === 'admin' &&
|
||||||
|
'bg-sky-600 dark:bg-sky-300'} {user.role === 'user' &&
|
||||||
|
'bg-green-600 dark:bg-green-300'} {user.role === 'pending' &&
|
||||||
|
'bg-gray-600 dark:bg-gray-300'}"
|
||||||
|
/>
|
||||||
|
{$i18n.t(user.role)}</button
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td class="px-3 py-2 font-medium text-gray-900 dark:text-white w-max">
|
||||||
|
<div class="flex flex-row w-max">
|
||||||
|
<img
|
||||||
|
class=" rounded-full w-6 h-6 object-cover mr-2.5"
|
||||||
|
src={user.profile_image_url.startsWith(WEBUI_BASE_URL) ||
|
||||||
|
user.profile_image_url.startsWith('https://www.gravatar.com/avatar/') ||
|
||||||
|
user.profile_image_url.startsWith('data:')
|
||||||
|
? user.profile_image_url
|
||||||
|
: `/user.png`}
|
||||||
|
alt="user"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<div class=" font-medium self-center">{user.name}</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class=" px-3 py-2"> {user.email} </td>
|
||||||
|
|
||||||
|
<td class=" px-3 py-2">
|
||||||
|
{dayjs(user.last_active_at * 1000).fromNow()}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td class=" px-3 py-2">
|
||||||
|
{dayjs(user.created_at * 1000).format($i18n.t('MMMM DD, YYYY'))}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td class="px-3 py-2 text-right">
|
||||||
|
<div class="flex justify-end w-full">
|
||||||
|
{#if user.role !== 'admin'}
|
||||||
|
<Tooltip content={$i18n.t('Chats')}>
|
||||||
|
<button
|
||||||
|
class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||||
|
on:click={async () => {
|
||||||
|
showUserChatsModal = !showUserChatsModal;
|
||||||
|
selectedUser = user;
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<ChatBubbles />
|
||||||
|
</button>
|
||||||
|
</Tooltip>
|
||||||
|
|
||||||
|
<Tooltip content={$i18n.t('Edit User')}>
|
||||||
|
<button
|
||||||
|
class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||||
|
on:click={async () => {
|
||||||
|
showEditUserModal = !showEditUserModal;
|
||||||
|
selectedUser = user;
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke-width="1.5"
|
||||||
|
stroke="currentColor"
|
||||||
|
class="w-4 h-4"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</Tooltip>
|
||||||
|
|
||||||
|
<Tooltip content={$i18n.t('Delete User')}>
|
||||||
|
<button
|
||||||
|
class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||||
|
on:click={async () => {
|
||||||
|
deleteUserHandler(user.id);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke-width="1.5"
|
||||||
|
stroke="currentColor"
|
||||||
|
class="w-4 h-4"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</Tooltip>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{/each}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class=" text-gray-500 text-xs mt-2 text-right">
|
||||||
|
ⓘ {$i18n.t("Click on the user role button to change a user's role.")}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Pagination bind:page count={users.length} />
|
||||||
|
{/if}
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.font-mona {
|
.font-mona {
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,7 @@
|
||||||
info.id = id;
|
info.id = id;
|
||||||
info.name = name;
|
info.name = name;
|
||||||
info.meta.capabilities = capabilities;
|
info.meta.capabilities = capabilities;
|
||||||
info.params.stop = params.stop !== null ? params.stop.split(',').filter((s) => s.trim()) : null;
|
info.params.stop = params.stop ? params.stop.split(',').filter((s) => s.trim()) : null;
|
||||||
|
|
||||||
if ($models.find((m) => m.id === info.id)) {
|
if ($models.find((m) => m.id === info.id)) {
|
||||||
toast.error(
|
toast.error(
|
||||||
|
|
@ -316,11 +316,9 @@
|
||||||
bind:value={info.base_model_id}
|
bind:value={info.base_model_id}
|
||||||
required
|
required
|
||||||
>
|
>
|
||||||
<option value={null} class=" placeholder:text-gray-500"
|
<option value={null} class=" text-gray-900">{$i18n.t('Select a base model')}</option>
|
||||||
>{$i18n.t('Select a base model')}</option
|
|
||||||
>
|
|
||||||
{#each $models.filter((m) => !m?.preset) as model}
|
{#each $models.filter((m) => !m?.preset) as model}
|
||||||
<option value={model.id}>{model.name}</option>
|
<option value={model.id} class=" text-gray-900">{model.name}</option>
|
||||||
{/each}
|
{/each}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue