mirror of
https://github.com/open-webui/open-webui.git
synced 2025-12-12 04:15:25 +00:00
commit
8a620cab44
117 changed files with 4199 additions and 4245 deletions
4
.github/dependabot.yml
vendored
4
.github/dependabot.yml
vendored
|
|
@ -3,10 +3,10 @@ updates:
|
|||
- package-ecosystem: pip
|
||||
directory: '/backend'
|
||||
schedule:
|
||||
interval: weekly
|
||||
interval: monthly
|
||||
target-branch: 'dev'
|
||||
- package-ecosystem: 'github-actions'
|
||||
directory: '/'
|
||||
schedule:
|
||||
# Check for updates to GitHub Actions every week
|
||||
interval: 'weekly'
|
||||
interval: monthly
|
||||
|
|
|
|||
31
CHANGELOG.md
31
CHANGELOG.md
|
|
@ -5,6 +5,37 @@ All notable changes to this project will be documented in this file.
|
|||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [0.3.14] - 2024-08-21
|
||||
|
||||
### Added
|
||||
|
||||
- **🛠️ Custom ComfyUI Workflow**: Deprecating several older environment variables, this enhancement introduces a new, customizable workflow for a more tailored user experience.
|
||||
- **🔀 Merge Responses in Many Model Chat**: Enhances the dialogue by merging responses from multiple models into a single, coherent reply, improving the interaction quality in many model chats.
|
||||
- **✅ Multiple Instances of Same Model in Chats**: Enhanced many model chat to support adding multiple instances of the same model.
|
||||
- **🔧 Quick Actions in Model Workspace**: Enhanced Shift key quick actions for hiding/unhiding and deleting models, facilitating a smoother workflow.
|
||||
- **🗨️ Markdown Rendering in User Messages**: User messages are now rendered in Markdown, enhancing readability and interaction.
|
||||
- **💬 Temporary Chat Feature**: Introduced a temporary chat feature, deprecating the old chat history setting to enhance user interaction flexibility.
|
||||
- **🖋️ User Message Editing**: Enhanced the user chat editing feature to allow saving changes without sending, providing more flexibility in message management.
|
||||
- **🛡️ Security Enhancements**: Various security improvements implemented across the platform to ensure safer user experiences.
|
||||
- **🌍 Updated Translations**: Enhanced translations for Chinese, Ukrainian, and Bahasa Malaysia, improving localization and user comprehension.
|
||||
|
||||
### Fixed
|
||||
|
||||
- **📑 Mermaid Rendering Issue**: Addressed issues with Mermaid chart rendering to ensure clean and clear visual data representation.
|
||||
- **🎭 PWA Icon Maskability**: Fixed the Progressive Web App icon to be maskable, ensuring proper display on various device home screens.
|
||||
- **🔀 Cloned Model Chat Freezing Issue**: Fixed a bug where cloning many model chats would cause freezing, enhancing stability and responsiveness.
|
||||
- **🔍 Generic Error Handling and Refinements**: Various minor fixes and refinements to address previously untracked issues, ensuring smoother operations.
|
||||
|
||||
### Changed
|
||||
|
||||
- **🖼️ Image Generation Refactor**: Overhauled image generation processes for improved efficiency and quality.
|
||||
- **🔨 Refactor Tool and Function Calling**: Refactored tool and function calling mechanisms for improved clarity and maintainability.
|
||||
- **🌐 Backend Library Updates**: Updated critical backend libraries including SQLAlchemy, uvicorn[standard], faster-whisper, bcrypt, and boto3 for enhanced performance and security.
|
||||
|
||||
### Removed
|
||||
|
||||
- **🚫 Deprecated ComfyUI Environment Variables**: Removed several outdated environment variables related to ComfyUI settings, simplifying configuration management.
|
||||
|
||||
## [0.3.13] - 2024-08-14
|
||||
|
||||
### Added
|
||||
|
|
|
|||
|
|
@ -1,5 +1,12 @@
|
|||
import os
|
||||
import hashlib
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import uuid
|
||||
from functools import lru_cache
|
||||
from pathlib import Path
|
||||
|
||||
import requests
|
||||
from fastapi import (
|
||||
FastAPI,
|
||||
Request,
|
||||
|
|
@ -8,34 +15,14 @@ from fastapi import (
|
|||
status,
|
||||
UploadFile,
|
||||
File,
|
||||
Form,
|
||||
)
|
||||
from fastapi.responses import StreamingResponse, JSONResponse, FileResponse
|
||||
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from fastapi.responses import FileResponse
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
import uuid
|
||||
import requests
|
||||
import hashlib
|
||||
from pathlib import Path
|
||||
import json
|
||||
|
||||
from constants import ERROR_MESSAGES
|
||||
from utils.utils import (
|
||||
decode_token,
|
||||
get_current_user,
|
||||
get_verified_user,
|
||||
get_admin_user,
|
||||
)
|
||||
from utils.misc import calculate_sha256
|
||||
|
||||
|
||||
from config import (
|
||||
SRC_LOG_LEVELS,
|
||||
CACHE_DIR,
|
||||
UPLOAD_DIR,
|
||||
WHISPER_MODEL,
|
||||
WHISPER_MODEL_DIR,
|
||||
WHISPER_MODEL_AUTO_UPDATE,
|
||||
|
|
@ -51,6 +38,13 @@ from config import (
|
|||
AUDIO_TTS_MODEL,
|
||||
AUDIO_TTS_VOICE,
|
||||
AppConfig,
|
||||
CORS_ALLOW_ORIGIN,
|
||||
)
|
||||
from constants import ERROR_MESSAGES
|
||||
from utils.utils import (
|
||||
get_current_user,
|
||||
get_verified_user,
|
||||
get_admin_user,
|
||||
)
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
|
@ -59,7 +53,7 @@ log.setLevel(SRC_LOG_LEVELS["AUDIO"])
|
|||
app = FastAPI()
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=["*"],
|
||||
allow_origins=CORS_ALLOW_ORIGIN,
|
||||
allow_credentials=True,
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
|
|
@ -261,6 +255,13 @@ async def speech(request: Request, user=Depends(get_verified_user)):
|
|||
raise HTTPException(status_code=400, detail="Invalid JSON payload")
|
||||
|
||||
voice_id = payload.get("voice", "")
|
||||
|
||||
if voice_id not in get_available_voices():
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail="Invalid voice id",
|
||||
)
|
||||
|
||||
url = f"https://api.elevenlabs.io/v1/text-to-speech/{voice_id}"
|
||||
|
||||
headers = {
|
||||
|
|
@ -466,39 +467,58 @@ async def get_models(user=Depends(get_verified_user)):
|
|||
return {"models": get_available_models()}
|
||||
|
||||
|
||||
def get_available_voices() -> list[dict]:
|
||||
def get_available_voices() -> dict:
|
||||
"""Returns {voice_id: voice_name} dict"""
|
||||
ret = {}
|
||||
if app.state.config.TTS_ENGINE == "openai":
|
||||
return [
|
||||
{"name": "alloy", "id": "alloy"},
|
||||
{"name": "echo", "id": "echo"},
|
||||
{"name": "fable", "id": "fable"},
|
||||
{"name": "onyx", "id": "onyx"},
|
||||
{"name": "nova", "id": "nova"},
|
||||
{"name": "shimmer", "id": "shimmer"},
|
||||
]
|
||||
ret = {
|
||||
"alloy": "alloy",
|
||||
"echo": "echo",
|
||||
"fable": "fable",
|
||||
"onyx": "onyx",
|
||||
"nova": "nova",
|
||||
"shimmer": "shimmer",
|
||||
}
|
||||
elif app.state.config.TTS_ENGINE == "elevenlabs":
|
||||
try:
|
||||
ret = get_elevenlabs_voices()
|
||||
except Exception as e:
|
||||
# Avoided @lru_cache with exception
|
||||
pass
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
@lru_cache
|
||||
def get_elevenlabs_voices() -> dict:
|
||||
"""
|
||||
Note, set the following in your .env file to use Elevenlabs:
|
||||
AUDIO_TTS_ENGINE=elevenlabs
|
||||
AUDIO_TTS_API_KEY=sk_... # Your Elevenlabs API key
|
||||
AUDIO_TTS_VOICE=EXAVITQu4vr4xnSDxMaL # From https://api.elevenlabs.io/v1/voices
|
||||
AUDIO_TTS_MODEL=eleven_multilingual_v2
|
||||
"""
|
||||
headers = {
|
||||
"xi-api-key": app.state.config.TTS_API_KEY,
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
|
||||
try:
|
||||
response = requests.get(
|
||||
"https://api.elevenlabs.io/v1/voices", headers=headers
|
||||
)
|
||||
# TODO: Add retries
|
||||
response = requests.get("https://api.elevenlabs.io/v1/voices", headers=headers)
|
||||
response.raise_for_status()
|
||||
voices_data = response.json()
|
||||
|
||||
voices = []
|
||||
voices = {}
|
||||
for voice in voices_data.get("voices", []):
|
||||
voices.append({"name": voice["name"], "id": voice["voice_id"]})
|
||||
return voices
|
||||
voices[voice["voice_id"]] = voice["name"]
|
||||
except requests.RequestException as e:
|
||||
# Avoid @lru_cache with exception
|
||||
log.error(f"Error fetching voices: {str(e)}")
|
||||
raise RuntimeError(f"Error fetching voices: {str(e)}")
|
||||
|
||||
return []
|
||||
return voices
|
||||
|
||||
|
||||
@app.get("/voices")
|
||||
async def get_voices(user=Depends(get_verified_user)):
|
||||
return {"voices": get_available_voices()}
|
||||
return {"voices": [{"id": k, "name": v} for k, v in get_available_voices().items()]}
|
||||
|
|
|
|||
|
|
@ -1,26 +1,10 @@
|
|||
import re
|
||||
import requests
|
||||
import base64
|
||||
from fastapi import (
|
||||
FastAPI,
|
||||
Request,
|
||||
Depends,
|
||||
HTTPException,
|
||||
status,
|
||||
UploadFile,
|
||||
File,
|
||||
Form,
|
||||
)
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
|
||||
from constants import ERROR_MESSAGES
|
||||
from utils.utils import (
|
||||
get_verified_user,
|
||||
get_admin_user,
|
||||
)
|
||||
|
||||
from apps.images.utils.comfyui import ImageGenerationPayload, comfyui_generate_image
|
||||
from utils.misc import calculate_sha256
|
||||
from typing import Optional
|
||||
from pydantic import BaseModel
|
||||
from pathlib import Path
|
||||
|
|
@ -29,7 +13,21 @@ import uuid
|
|||
import base64
|
||||
import json
|
||||
import logging
|
||||
import re
|
||||
import requests
|
||||
|
||||
from utils.utils import (
|
||||
get_verified_user,
|
||||
get_admin_user,
|
||||
)
|
||||
|
||||
from apps.images.utils.comfyui import (
|
||||
ComfyUIWorkflow,
|
||||
ComfyUIGenerateImageForm,
|
||||
comfyui_generate_image,
|
||||
)
|
||||
|
||||
from constants import ERROR_MESSAGES
|
||||
from config import (
|
||||
SRC_LOG_LEVELS,
|
||||
CACHE_DIR,
|
||||
|
|
@ -38,18 +36,14 @@ from config import (
|
|||
AUTOMATIC1111_BASE_URL,
|
||||
AUTOMATIC1111_API_AUTH,
|
||||
COMFYUI_BASE_URL,
|
||||
COMFYUI_CFG_SCALE,
|
||||
COMFYUI_SAMPLER,
|
||||
COMFYUI_SCHEDULER,
|
||||
COMFYUI_SD3,
|
||||
COMFYUI_FLUX,
|
||||
COMFYUI_FLUX_WEIGHT_DTYPE,
|
||||
COMFYUI_FLUX_FP8_CLIP,
|
||||
COMFYUI_WORKFLOW,
|
||||
COMFYUI_WORKFLOW_NODES,
|
||||
IMAGES_OPENAI_API_BASE_URL,
|
||||
IMAGES_OPENAI_API_KEY,
|
||||
IMAGE_GENERATION_MODEL,
|
||||
IMAGE_SIZE,
|
||||
IMAGE_STEPS,
|
||||
CORS_ALLOW_ORIGIN,
|
||||
AppConfig,
|
||||
)
|
||||
|
||||
|
|
@ -62,7 +56,7 @@ IMAGE_CACHE_DIR.mkdir(parents=True, exist_ok=True)
|
|||
app = FastAPI()
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=["*"],
|
||||
allow_origins=CORS_ALLOW_ORIGIN,
|
||||
allow_credentials=True,
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
|
|
@ -81,16 +75,94 @@ app.state.config.MODEL = IMAGE_GENERATION_MODEL
|
|||
app.state.config.AUTOMATIC1111_BASE_URL = AUTOMATIC1111_BASE_URL
|
||||
app.state.config.AUTOMATIC1111_API_AUTH = AUTOMATIC1111_API_AUTH
|
||||
app.state.config.COMFYUI_BASE_URL = COMFYUI_BASE_URL
|
||||
app.state.config.COMFYUI_WORKFLOW = COMFYUI_WORKFLOW
|
||||
app.state.config.COMFYUI_WORKFLOW_NODES = COMFYUI_WORKFLOW_NODES
|
||||
|
||||
app.state.config.IMAGE_SIZE = IMAGE_SIZE
|
||||
app.state.config.IMAGE_STEPS = IMAGE_STEPS
|
||||
app.state.config.COMFYUI_CFG_SCALE = COMFYUI_CFG_SCALE
|
||||
app.state.config.COMFYUI_SAMPLER = COMFYUI_SAMPLER
|
||||
app.state.config.COMFYUI_SCHEDULER = COMFYUI_SCHEDULER
|
||||
app.state.config.COMFYUI_SD3 = COMFYUI_SD3
|
||||
app.state.config.COMFYUI_FLUX = COMFYUI_FLUX
|
||||
app.state.config.COMFYUI_FLUX_WEIGHT_DTYPE = COMFYUI_FLUX_WEIGHT_DTYPE
|
||||
app.state.config.COMFYUI_FLUX_FP8_CLIP = COMFYUI_FLUX_FP8_CLIP
|
||||
|
||||
|
||||
@app.get("/config")
|
||||
async def get_config(request: Request, user=Depends(get_admin_user)):
|
||||
return {
|
||||
"enabled": app.state.config.ENABLED,
|
||||
"engine": app.state.config.ENGINE,
|
||||
"openai": {
|
||||
"OPENAI_API_BASE_URL": app.state.config.OPENAI_API_BASE_URL,
|
||||
"OPENAI_API_KEY": app.state.config.OPENAI_API_KEY,
|
||||
},
|
||||
"automatic1111": {
|
||||
"AUTOMATIC1111_BASE_URL": app.state.config.AUTOMATIC1111_BASE_URL,
|
||||
"AUTOMATIC1111_API_AUTH": app.state.config.AUTOMATIC1111_API_AUTH,
|
||||
},
|
||||
"comfyui": {
|
||||
"COMFYUI_BASE_URL": app.state.config.COMFYUI_BASE_URL,
|
||||
"COMFYUI_WORKFLOW": app.state.config.COMFYUI_WORKFLOW,
|
||||
"COMFYUI_WORKFLOW_NODES": app.state.config.COMFYUI_WORKFLOW_NODES,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
class OpenAIConfigForm(BaseModel):
|
||||
OPENAI_API_BASE_URL: str
|
||||
OPENAI_API_KEY: str
|
||||
|
||||
|
||||
class Automatic1111ConfigForm(BaseModel):
|
||||
AUTOMATIC1111_BASE_URL: str
|
||||
AUTOMATIC1111_API_AUTH: str
|
||||
|
||||
|
||||
class ComfyUIConfigForm(BaseModel):
|
||||
COMFYUI_BASE_URL: str
|
||||
COMFYUI_WORKFLOW: str
|
||||
COMFYUI_WORKFLOW_NODES: list[dict]
|
||||
|
||||
|
||||
class ConfigForm(BaseModel):
|
||||
enabled: bool
|
||||
engine: str
|
||||
openai: OpenAIConfigForm
|
||||
automatic1111: Automatic1111ConfigForm
|
||||
comfyui: ComfyUIConfigForm
|
||||
|
||||
|
||||
@app.post("/config/update")
|
||||
async def update_config(form_data: ConfigForm, user=Depends(get_admin_user)):
|
||||
app.state.config.ENGINE = form_data.engine
|
||||
app.state.config.ENABLED = form_data.enabled
|
||||
|
||||
app.state.config.OPENAI_API_BASE_URL = form_data.openai.OPENAI_API_BASE_URL
|
||||
app.state.config.OPENAI_API_KEY = form_data.openai.OPENAI_API_KEY
|
||||
|
||||
app.state.config.AUTOMATIC1111_BASE_URL = (
|
||||
form_data.automatic1111.AUTOMATIC1111_BASE_URL
|
||||
)
|
||||
app.state.config.AUTOMATIC1111_API_AUTH = (
|
||||
form_data.automatic1111.AUTOMATIC1111_API_AUTH
|
||||
)
|
||||
|
||||
app.state.config.COMFYUI_BASE_URL = form_data.comfyui.COMFYUI_BASE_URL
|
||||
app.state.config.COMFYUI_WORKFLOW = form_data.comfyui.COMFYUI_WORKFLOW
|
||||
app.state.config.COMFYUI_WORKFLOW_NODES = form_data.comfyui.COMFYUI_WORKFLOW_NODES
|
||||
|
||||
return {
|
||||
"enabled": app.state.config.ENABLED,
|
||||
"engine": app.state.config.ENGINE,
|
||||
"openai": {
|
||||
"OPENAI_API_BASE_URL": app.state.config.OPENAI_API_BASE_URL,
|
||||
"OPENAI_API_KEY": app.state.config.OPENAI_API_KEY,
|
||||
},
|
||||
"automatic1111": {
|
||||
"AUTOMATIC1111_BASE_URL": app.state.config.AUTOMATIC1111_BASE_URL,
|
||||
"AUTOMATIC1111_API_AUTH": app.state.config.AUTOMATIC1111_API_AUTH,
|
||||
},
|
||||
"comfyui": {
|
||||
"COMFYUI_BASE_URL": app.state.config.COMFYUI_BASE_URL,
|
||||
"COMFYUI_WORKFLOW": app.state.config.COMFYUI_WORKFLOW,
|
||||
"COMFYUI_WORKFLOW_NODES": app.state.config.COMFYUI_WORKFLOW_NODES,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
def get_automatic1111_api_auth():
|
||||
|
|
@ -103,166 +175,110 @@ def get_automatic1111_api_auth():
|
|||
return f"Basic {auth1111_base64_encoded_string}"
|
||||
|
||||
|
||||
@app.get("/config")
|
||||
async def get_config(request: Request, user=Depends(get_admin_user)):
|
||||
return {
|
||||
"engine": app.state.config.ENGINE,
|
||||
"enabled": app.state.config.ENABLED,
|
||||
}
|
||||
|
||||
|
||||
class ConfigUpdateForm(BaseModel):
|
||||
engine: str
|
||||
enabled: bool
|
||||
|
||||
|
||||
@app.post("/config/update")
|
||||
async def update_config(form_data: ConfigUpdateForm, user=Depends(get_admin_user)):
|
||||
app.state.config.ENGINE = form_data.engine
|
||||
app.state.config.ENABLED = form_data.enabled
|
||||
return {
|
||||
"engine": app.state.config.ENGINE,
|
||||
"enabled": app.state.config.ENABLED,
|
||||
}
|
||||
|
||||
|
||||
class EngineUrlUpdateForm(BaseModel):
|
||||
AUTOMATIC1111_BASE_URL: Optional[str] = None
|
||||
AUTOMATIC1111_API_AUTH: Optional[str] = None
|
||||
COMFYUI_BASE_URL: Optional[str] = None
|
||||
|
||||
|
||||
@app.get("/url")
|
||||
async def get_engine_url(user=Depends(get_admin_user)):
|
||||
return {
|
||||
"AUTOMATIC1111_BASE_URL": app.state.config.AUTOMATIC1111_BASE_URL,
|
||||
"AUTOMATIC1111_API_AUTH": app.state.config.AUTOMATIC1111_API_AUTH,
|
||||
"COMFYUI_BASE_URL": app.state.config.COMFYUI_BASE_URL,
|
||||
}
|
||||
|
||||
|
||||
@app.post("/url/update")
|
||||
async def update_engine_url(
|
||||
form_data: EngineUrlUpdateForm, user=Depends(get_admin_user)
|
||||
):
|
||||
if form_data.AUTOMATIC1111_BASE_URL is None:
|
||||
app.state.config.AUTOMATIC1111_BASE_URL = AUTOMATIC1111_BASE_URL
|
||||
else:
|
||||
url = form_data.AUTOMATIC1111_BASE_URL.strip("/")
|
||||
@app.get("/config/url/verify")
|
||||
async def verify_url(user=Depends(get_admin_user)):
|
||||
if app.state.config.ENGINE == "automatic1111":
|
||||
try:
|
||||
r = requests.head(url)
|
||||
r = requests.get(
|
||||
url=f"{app.state.config.AUTOMATIC1111_BASE_URL}/sdapi/v1/options",
|
||||
headers={"authorization": get_automatic1111_api_auth()},
|
||||
)
|
||||
r.raise_for_status()
|
||||
app.state.config.AUTOMATIC1111_BASE_URL = url
|
||||
return True
|
||||
except Exception as e:
|
||||
app.state.config.ENABLED = False
|
||||
raise HTTPException(status_code=400, detail=ERROR_MESSAGES.INVALID_URL)
|
||||
|
||||
if form_data.COMFYUI_BASE_URL is None:
|
||||
app.state.config.COMFYUI_BASE_URL = COMFYUI_BASE_URL
|
||||
else:
|
||||
url = form_data.COMFYUI_BASE_URL.strip("/")
|
||||
|
||||
elif app.state.config.ENGINE == "comfyui":
|
||||
try:
|
||||
r = requests.head(url)
|
||||
r = requests.get(url=f"{app.state.config.COMFYUI_BASE_URL}/object_info")
|
||||
r.raise_for_status()
|
||||
app.state.config.COMFYUI_BASE_URL = url
|
||||
return True
|
||||
except Exception as e:
|
||||
app.state.config.ENABLED = False
|
||||
raise HTTPException(status_code=400, detail=ERROR_MESSAGES.INVALID_URL)
|
||||
|
||||
if form_data.AUTOMATIC1111_API_AUTH is None:
|
||||
app.state.config.AUTOMATIC1111_API_AUTH = AUTOMATIC1111_API_AUTH
|
||||
else:
|
||||
app.state.config.AUTOMATIC1111_API_AUTH = form_data.AUTOMATIC1111_API_AUTH
|
||||
return True
|
||||
|
||||
|
||||
def set_image_model(model: str):
|
||||
app.state.config.MODEL = model
|
||||
if app.state.config.ENGINE in ["", "automatic1111"]:
|
||||
api_auth = get_automatic1111_api_auth()
|
||||
r = requests.get(
|
||||
url=f"{app.state.config.AUTOMATIC1111_BASE_URL}/sdapi/v1/options",
|
||||
headers={"authorization": api_auth},
|
||||
)
|
||||
options = r.json()
|
||||
if model != options["sd_model_checkpoint"]:
|
||||
options["sd_model_checkpoint"] = model
|
||||
r = requests.post(
|
||||
url=f"{app.state.config.AUTOMATIC1111_BASE_URL}/sdapi/v1/options",
|
||||
json=options,
|
||||
headers={"authorization": api_auth},
|
||||
)
|
||||
return app.state.config.MODEL
|
||||
|
||||
|
||||
def get_image_model():
|
||||
if app.state.config.ENGINE == "openai":
|
||||
return app.state.config.MODEL if app.state.config.MODEL else "dall-e-2"
|
||||
elif app.state.config.ENGINE == "comfyui":
|
||||
return app.state.config.MODEL if app.state.config.MODEL else ""
|
||||
elif app.state.config.ENGINE == "automatic1111" or app.state.config.ENGINE == "":
|
||||
try:
|
||||
r = requests.get(
|
||||
url=f"{app.state.config.AUTOMATIC1111_BASE_URL}/sdapi/v1/options",
|
||||
headers={"authorization": get_automatic1111_api_auth()},
|
||||
)
|
||||
options = r.json()
|
||||
return options["sd_model_checkpoint"]
|
||||
except Exception as e:
|
||||
app.state.config.ENABLED = False
|
||||
raise HTTPException(status_code=400, detail=ERROR_MESSAGES.DEFAULT(e))
|
||||
|
||||
|
||||
class ImageConfigForm(BaseModel):
|
||||
MODEL: str
|
||||
IMAGE_SIZE: str
|
||||
IMAGE_STEPS: int
|
||||
|
||||
|
||||
@app.get("/image/config")
|
||||
async def get_image_config(user=Depends(get_admin_user)):
|
||||
return {
|
||||
"AUTOMATIC1111_BASE_URL": app.state.config.AUTOMATIC1111_BASE_URL,
|
||||
"AUTOMATIC1111_API_AUTH": app.state.config.AUTOMATIC1111_API_AUTH,
|
||||
"COMFYUI_BASE_URL": app.state.config.COMFYUI_BASE_URL,
|
||||
"status": True,
|
||||
}
|
||||
|
||||
|
||||
class OpenAIConfigUpdateForm(BaseModel):
|
||||
url: str
|
||||
key: str
|
||||
|
||||
|
||||
@app.get("/openai/config")
|
||||
async def get_openai_config(user=Depends(get_admin_user)):
|
||||
return {
|
||||
"OPENAI_API_BASE_URL": app.state.config.OPENAI_API_BASE_URL,
|
||||
"OPENAI_API_KEY": app.state.config.OPENAI_API_KEY,
|
||||
}
|
||||
|
||||
|
||||
@app.post("/openai/config/update")
|
||||
async def update_openai_config(
|
||||
form_data: OpenAIConfigUpdateForm, user=Depends(get_admin_user)
|
||||
):
|
||||
if form_data.key == "":
|
||||
raise HTTPException(status_code=400, detail=ERROR_MESSAGES.API_KEY_NOT_FOUND)
|
||||
|
||||
app.state.config.OPENAI_API_BASE_URL = form_data.url
|
||||
app.state.config.OPENAI_API_KEY = form_data.key
|
||||
|
||||
return {
|
||||
"status": True,
|
||||
"OPENAI_API_BASE_URL": app.state.config.OPENAI_API_BASE_URL,
|
||||
"OPENAI_API_KEY": app.state.config.OPENAI_API_KEY,
|
||||
}
|
||||
|
||||
|
||||
class ImageSizeUpdateForm(BaseModel):
|
||||
size: str
|
||||
|
||||
|
||||
@app.get("/size")
|
||||
async def get_image_size(user=Depends(get_admin_user)):
|
||||
return {"IMAGE_SIZE": app.state.config.IMAGE_SIZE}
|
||||
|
||||
|
||||
@app.post("/size/update")
|
||||
async def update_image_size(
|
||||
form_data: ImageSizeUpdateForm, user=Depends(get_admin_user)
|
||||
):
|
||||
pattern = r"^\d+x\d+$" # Regular expression pattern
|
||||
if re.match(pattern, form_data.size):
|
||||
app.state.config.IMAGE_SIZE = form_data.size
|
||||
return {
|
||||
"MODEL": app.state.config.MODEL,
|
||||
"IMAGE_SIZE": app.state.config.IMAGE_SIZE,
|
||||
"status": True,
|
||||
"IMAGE_STEPS": app.state.config.IMAGE_STEPS,
|
||||
}
|
||||
|
||||
|
||||
@app.post("/image/config/update")
|
||||
async def update_image_config(form_data: ImageConfigForm, user=Depends(get_admin_user)):
|
||||
app.state.config.MODEL = form_data.MODEL
|
||||
|
||||
pattern = r"^\d+x\d+$"
|
||||
if re.match(pattern, form_data.IMAGE_SIZE):
|
||||
app.state.config.IMAGE_SIZE = form_data.IMAGE_SIZE
|
||||
else:
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail=ERROR_MESSAGES.INCORRECT_FORMAT(" (e.g., 512x512)."),
|
||||
)
|
||||
|
||||
|
||||
class ImageStepsUpdateForm(BaseModel):
|
||||
steps: int
|
||||
|
||||
|
||||
@app.get("/steps")
|
||||
async def get_image_size(user=Depends(get_admin_user)):
|
||||
return {"IMAGE_STEPS": app.state.config.IMAGE_STEPS}
|
||||
|
||||
|
||||
@app.post("/steps/update")
|
||||
async def update_image_size(
|
||||
form_data: ImageStepsUpdateForm, user=Depends(get_admin_user)
|
||||
):
|
||||
if form_data.steps >= 0:
|
||||
app.state.config.IMAGE_STEPS = form_data.steps
|
||||
return {
|
||||
"IMAGE_STEPS": app.state.config.IMAGE_STEPS,
|
||||
"status": True,
|
||||
}
|
||||
if form_data.IMAGE_STEPS >= 0:
|
||||
app.state.config.IMAGE_STEPS = form_data.IMAGE_STEPS
|
||||
else:
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail=ERROR_MESSAGES.INCORRECT_FORMAT(" (e.g., 50)."),
|
||||
)
|
||||
|
||||
return {
|
||||
"MODEL": app.state.config.MODEL,
|
||||
"IMAGE_SIZE": app.state.config.IMAGE_SIZE,
|
||||
"IMAGE_STEPS": app.state.config.IMAGE_STEPS,
|
||||
}
|
||||
|
||||
|
||||
@app.get("/models")
|
||||
def get_models(user=Depends(get_verified_user)):
|
||||
|
|
@ -273,18 +289,50 @@ def get_models(user=Depends(get_verified_user)):
|
|||
{"id": "dall-e-3", "name": "DALL·E 3"},
|
||||
]
|
||||
elif app.state.config.ENGINE == "comfyui":
|
||||
|
||||
# TODO - get models from comfyui
|
||||
r = requests.get(url=f"{app.state.config.COMFYUI_BASE_URL}/object_info")
|
||||
info = r.json()
|
||||
|
||||
workflow = json.loads(app.state.config.COMFYUI_WORKFLOW)
|
||||
model_node_id = None
|
||||
|
||||
for node in app.state.config.COMFYUI_WORKFLOW_NODES:
|
||||
if node["type"] == "model":
|
||||
model_node_id = node["node_ids"][0]
|
||||
break
|
||||
|
||||
if model_node_id:
|
||||
model_list_key = None
|
||||
|
||||
print(workflow[model_node_id]["class_type"])
|
||||
for key in info[workflow[model_node_id]["class_type"]]["input"][
|
||||
"required"
|
||||
]:
|
||||
if "_name" in key:
|
||||
model_list_key = key
|
||||
break
|
||||
|
||||
if model_list_key:
|
||||
return list(
|
||||
map(
|
||||
lambda model: {"id": model, "name": model},
|
||||
info["CheckpointLoaderSimple"]["input"]["required"]["ckpt_name"][0],
|
||||
info[workflow[model_node_id]["class_type"]]["input"][
|
||||
"required"
|
||||
][model_list_key][0],
|
||||
)
|
||||
)
|
||||
|
||||
else:
|
||||
return list(
|
||||
map(
|
||||
lambda model: {"id": model, "name": model},
|
||||
info["CheckpointLoaderSimple"]["input"]["required"][
|
||||
"ckpt_name"
|
||||
][0],
|
||||
)
|
||||
)
|
||||
elif (
|
||||
app.state.config.ENGINE == "automatic1111" or app.state.config.ENGINE == ""
|
||||
):
|
||||
r = requests.get(
|
||||
url=f"{app.state.config.AUTOMATIC1111_BASE_URL}/sdapi/v1/sd-models",
|
||||
headers={"authorization": get_automatic1111_api_auth()},
|
||||
|
|
@ -301,69 +349,11 @@ def get_models(user=Depends(get_verified_user)):
|
|||
raise HTTPException(status_code=400, detail=ERROR_MESSAGES.DEFAULT(e))
|
||||
|
||||
|
||||
@app.get("/models/default")
|
||||
async def get_default_model(user=Depends(get_admin_user)):
|
||||
try:
|
||||
if app.state.config.ENGINE == "openai":
|
||||
return {
|
||||
"model": (
|
||||
app.state.config.MODEL if app.state.config.MODEL else "dall-e-2"
|
||||
)
|
||||
}
|
||||
elif app.state.config.ENGINE == "comfyui":
|
||||
return {"model": (app.state.config.MODEL if app.state.config.MODEL else "")}
|
||||
else:
|
||||
r = requests.get(
|
||||
url=f"{app.state.config.AUTOMATIC1111_BASE_URL}/sdapi/v1/options",
|
||||
headers={"authorization": get_automatic1111_api_auth()},
|
||||
)
|
||||
options = r.json()
|
||||
return {"model": options["sd_model_checkpoint"]}
|
||||
except Exception as e:
|
||||
app.state.config.ENABLED = False
|
||||
raise HTTPException(status_code=400, detail=ERROR_MESSAGES.DEFAULT(e))
|
||||
|
||||
|
||||
class UpdateModelForm(BaseModel):
|
||||
model: str
|
||||
|
||||
|
||||
def set_model_handler(model: str):
|
||||
if app.state.config.ENGINE in ["openai", "comfyui"]:
|
||||
app.state.config.MODEL = model
|
||||
return app.state.config.MODEL
|
||||
else:
|
||||
api_auth = get_automatic1111_api_auth()
|
||||
r = requests.get(
|
||||
url=f"{app.state.config.AUTOMATIC1111_BASE_URL}/sdapi/v1/options",
|
||||
headers={"authorization": api_auth},
|
||||
)
|
||||
options = r.json()
|
||||
|
||||
if model != options["sd_model_checkpoint"]:
|
||||
options["sd_model_checkpoint"] = model
|
||||
r = requests.post(
|
||||
url=f"{app.state.config.AUTOMATIC1111_BASE_URL}/sdapi/v1/options",
|
||||
json=options,
|
||||
headers={"authorization": api_auth},
|
||||
)
|
||||
|
||||
return options
|
||||
|
||||
|
||||
@app.post("/models/default/update")
|
||||
def update_default_model(
|
||||
form_data: UpdateModelForm,
|
||||
user=Depends(get_verified_user),
|
||||
):
|
||||
return set_model_handler(form_data.model)
|
||||
|
||||
|
||||
class GenerateImageForm(BaseModel):
|
||||
model: Optional[str] = None
|
||||
prompt: str
|
||||
n: int = 1
|
||||
size: Optional[str] = None
|
||||
n: int = 1
|
||||
negative_prompt: Optional[str] = None
|
||||
|
||||
|
||||
|
|
@ -479,7 +469,6 @@ async def image_generations(
|
|||
return images
|
||||
|
||||
elif app.state.config.ENGINE == "comfyui":
|
||||
|
||||
data = {
|
||||
"prompt": form_data.prompt,
|
||||
"width": width,
|
||||
|
|
@ -493,32 +482,20 @@ async def image_generations(
|
|||
if form_data.negative_prompt is not None:
|
||||
data["negative_prompt"] = form_data.negative_prompt
|
||||
|
||||
if app.state.config.COMFYUI_CFG_SCALE:
|
||||
data["cfg_scale"] = app.state.config.COMFYUI_CFG_SCALE
|
||||
|
||||
if app.state.config.COMFYUI_SAMPLER is not None:
|
||||
data["sampler"] = app.state.config.COMFYUI_SAMPLER
|
||||
|
||||
if app.state.config.COMFYUI_SCHEDULER is not None:
|
||||
data["scheduler"] = app.state.config.COMFYUI_SCHEDULER
|
||||
|
||||
if app.state.config.COMFYUI_SD3 is not None:
|
||||
data["sd3"] = app.state.config.COMFYUI_SD3
|
||||
|
||||
if app.state.config.COMFYUI_FLUX is not None:
|
||||
data["flux"] = app.state.config.COMFYUI_FLUX
|
||||
|
||||
if app.state.config.COMFYUI_FLUX_WEIGHT_DTYPE is not None:
|
||||
data["flux_weight_dtype"] = app.state.config.COMFYUI_FLUX_WEIGHT_DTYPE
|
||||
|
||||
if app.state.config.COMFYUI_FLUX_FP8_CLIP is not None:
|
||||
data["flux_fp8_clip"] = app.state.config.COMFYUI_FLUX_FP8_CLIP
|
||||
|
||||
data = ImageGenerationPayload(**data)
|
||||
|
||||
form_data = ComfyUIGenerateImageForm(
|
||||
**{
|
||||
"workflow": ComfyUIWorkflow(
|
||||
**{
|
||||
"workflow": app.state.config.COMFYUI_WORKFLOW,
|
||||
"nodes": app.state.config.COMFYUI_WORKFLOW_NODES,
|
||||
}
|
||||
),
|
||||
**data,
|
||||
}
|
||||
)
|
||||
res = await comfyui_generate_image(
|
||||
app.state.config.MODEL,
|
||||
data,
|
||||
form_data,
|
||||
user.id,
|
||||
app.state.config.COMFYUI_BASE_URL,
|
||||
)
|
||||
|
|
@ -532,13 +509,15 @@ async def image_generations(
|
|||
file_body_path = IMAGE_CACHE_DIR.joinpath(f"{image_filename}.json")
|
||||
|
||||
with open(file_body_path, "w") as f:
|
||||
json.dump(data.model_dump(exclude_none=True), f)
|
||||
json.dump(form_data.model_dump(exclude_none=True), f)
|
||||
|
||||
log.debug(f"images: {images}")
|
||||
return images
|
||||
else:
|
||||
elif (
|
||||
app.state.config.ENGINE == "automatic1111" or app.state.config.ENGINE == ""
|
||||
):
|
||||
if form_data.model:
|
||||
set_model_handler(form_data.model)
|
||||
set_image_model(form_data.model)
|
||||
|
||||
data = {
|
||||
"prompt": form_data.prompt,
|
||||
|
|
@ -560,7 +539,6 @@ async def image_generations(
|
|||
)
|
||||
|
||||
res = r.json()
|
||||
|
||||
log.debug(f"res: {res}")
|
||||
|
||||
images = []
|
||||
|
|
@ -577,7 +555,6 @@ async def image_generations(
|
|||
|
||||
except Exception as e:
|
||||
error = e
|
||||
|
||||
if r != None:
|
||||
data = r.json()
|
||||
if "error" in data:
|
||||
|
|
|
|||
|
|
@ -15,245 +15,6 @@ from pydantic import BaseModel
|
|||
|
||||
from typing import Optional
|
||||
|
||||
COMFYUI_DEFAULT_PROMPT = """
|
||||
{
|
||||
"3": {
|
||||
"inputs": {
|
||||
"seed": 0,
|
||||
"steps": 20,
|
||||
"cfg": 8,
|
||||
"sampler_name": "euler",
|
||||
"scheduler": "normal",
|
||||
"denoise": 1,
|
||||
"model": [
|
||||
"4",
|
||||
0
|
||||
],
|
||||
"positive": [
|
||||
"6",
|
||||
0
|
||||
],
|
||||
"negative": [
|
||||
"7",
|
||||
0
|
||||
],
|
||||
"latent_image": [
|
||||
"5",
|
||||
0
|
||||
]
|
||||
},
|
||||
"class_type": "KSampler",
|
||||
"_meta": {
|
||||
"title": "KSampler"
|
||||
}
|
||||
},
|
||||
"4": {
|
||||
"inputs": {
|
||||
"ckpt_name": "model.safetensors"
|
||||
},
|
||||
"class_type": "CheckpointLoaderSimple",
|
||||
"_meta": {
|
||||
"title": "Load Checkpoint"
|
||||
}
|
||||
},
|
||||
"5": {
|
||||
"inputs": {
|
||||
"width": 512,
|
||||
"height": 512,
|
||||
"batch_size": 1
|
||||
},
|
||||
"class_type": "EmptyLatentImage",
|
||||
"_meta": {
|
||||
"title": "Empty Latent Image"
|
||||
}
|
||||
},
|
||||
"6": {
|
||||
"inputs": {
|
||||
"text": "Prompt",
|
||||
"clip": [
|
||||
"4",
|
||||
1
|
||||
]
|
||||
},
|
||||
"class_type": "CLIPTextEncode",
|
||||
"_meta": {
|
||||
"title": "CLIP Text Encode (Prompt)"
|
||||
}
|
||||
},
|
||||
"7": {
|
||||
"inputs": {
|
||||
"text": "Negative Prompt",
|
||||
"clip": [
|
||||
"4",
|
||||
1
|
||||
]
|
||||
},
|
||||
"class_type": "CLIPTextEncode",
|
||||
"_meta": {
|
||||
"title": "CLIP Text Encode (Prompt)"
|
||||
}
|
||||
},
|
||||
"8": {
|
||||
"inputs": {
|
||||
"samples": [
|
||||
"3",
|
||||
0
|
||||
],
|
||||
"vae": [
|
||||
"4",
|
||||
2
|
||||
]
|
||||
},
|
||||
"class_type": "VAEDecode",
|
||||
"_meta": {
|
||||
"title": "VAE Decode"
|
||||
}
|
||||
},
|
||||
"9": {
|
||||
"inputs": {
|
||||
"filename_prefix": "ComfyUI",
|
||||
"images": [
|
||||
"8",
|
||||
0
|
||||
]
|
||||
},
|
||||
"class_type": "SaveImage",
|
||||
"_meta": {
|
||||
"title": "Save Image"
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
FLUX_DEFAULT_PROMPT = """
|
||||
{
|
||||
"5": {
|
||||
"inputs": {
|
||||
"width": 1024,
|
||||
"height": 1024,
|
||||
"batch_size": 1
|
||||
},
|
||||
"class_type": "EmptyLatentImage"
|
||||
},
|
||||
"6": {
|
||||
"inputs": {
|
||||
"text": "Input Text Here",
|
||||
"clip": [
|
||||
"11",
|
||||
0
|
||||
]
|
||||
},
|
||||
"class_type": "CLIPTextEncode"
|
||||
},
|
||||
"8": {
|
||||
"inputs": {
|
||||
"samples": [
|
||||
"13",
|
||||
0
|
||||
],
|
||||
"vae": [
|
||||
"10",
|
||||
0
|
||||
]
|
||||
},
|
||||
"class_type": "VAEDecode"
|
||||
},
|
||||
"9": {
|
||||
"inputs": {
|
||||
"filename_prefix": "ComfyUI",
|
||||
"images": [
|
||||
"8",
|
||||
0
|
||||
]
|
||||
},
|
||||
"class_type": "SaveImage"
|
||||
},
|
||||
"10": {
|
||||
"inputs": {
|
||||
"vae_name": "ae.safetensors"
|
||||
},
|
||||
"class_type": "VAELoader"
|
||||
},
|
||||
"11": {
|
||||
"inputs": {
|
||||
"clip_name1": "clip_l.safetensors",
|
||||
"clip_name2": "t5xxl_fp16.safetensors",
|
||||
"type": "flux"
|
||||
},
|
||||
"class_type": "DualCLIPLoader"
|
||||
},
|
||||
"12": {
|
||||
"inputs": {
|
||||
"unet_name": "flux1-dev.safetensors",
|
||||
"weight_dtype": "default"
|
||||
},
|
||||
"class_type": "UNETLoader"
|
||||
},
|
||||
"13": {
|
||||
"inputs": {
|
||||
"noise": [
|
||||
"25",
|
||||
0
|
||||
],
|
||||
"guider": [
|
||||
"22",
|
||||
0
|
||||
],
|
||||
"sampler": [
|
||||
"16",
|
||||
0
|
||||
],
|
||||
"sigmas": [
|
||||
"17",
|
||||
0
|
||||
],
|
||||
"latent_image": [
|
||||
"5",
|
||||
0
|
||||
]
|
||||
},
|
||||
"class_type": "SamplerCustomAdvanced"
|
||||
},
|
||||
"16": {
|
||||
"inputs": {
|
||||
"sampler_name": "euler"
|
||||
},
|
||||
"class_type": "KSamplerSelect"
|
||||
},
|
||||
"17": {
|
||||
"inputs": {
|
||||
"scheduler": "simple",
|
||||
"steps": 20,
|
||||
"denoise": 1,
|
||||
"model": [
|
||||
"12",
|
||||
0
|
||||
]
|
||||
},
|
||||
"class_type": "BasicScheduler"
|
||||
},
|
||||
"22": {
|
||||
"inputs": {
|
||||
"model": [
|
||||
"12",
|
||||
0
|
||||
],
|
||||
"conditioning": [
|
||||
"6",
|
||||
0
|
||||
]
|
||||
},
|
||||
"class_type": "BasicGuider"
|
||||
},
|
||||
"25": {
|
||||
"inputs": {
|
||||
"noise_seed": 778937779713005
|
||||
},
|
||||
"class_type": "RandomNoise"
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
|
||||
def queue_prompt(prompt, client_id, base_url):
|
||||
log.info("queue_prompt")
|
||||
|
|
@ -311,82 +72,71 @@ def get_images(ws, prompt, client_id, base_url):
|
|||
return {"data": output_images}
|
||||
|
||||
|
||||
class ImageGenerationPayload(BaseModel):
|
||||
class ComfyUINodeInput(BaseModel):
|
||||
type: Optional[str] = None
|
||||
node_ids: list[str] = []
|
||||
key: Optional[str] = "text"
|
||||
value: Optional[str] = None
|
||||
|
||||
|
||||
class ComfyUIWorkflow(BaseModel):
|
||||
workflow: str
|
||||
nodes: list[ComfyUINodeInput]
|
||||
|
||||
|
||||
class ComfyUIGenerateImageForm(BaseModel):
|
||||
workflow: ComfyUIWorkflow
|
||||
|
||||
prompt: str
|
||||
negative_prompt: Optional[str] = ""
|
||||
steps: Optional[int] = None
|
||||
seed: Optional[int] = None
|
||||
negative_prompt: Optional[str] = None
|
||||
width: int
|
||||
height: int
|
||||
n: int = 1
|
||||
cfg_scale: Optional[float] = None
|
||||
sampler: Optional[str] = None
|
||||
scheduler: Optional[str] = None
|
||||
sd3: Optional[bool] = None
|
||||
flux: Optional[bool] = None
|
||||
flux_weight_dtype: Optional[str] = None
|
||||
flux_fp8_clip: Optional[bool] = None
|
||||
|
||||
steps: Optional[int] = None
|
||||
seed: Optional[int] = None
|
||||
|
||||
|
||||
async def comfyui_generate_image(
|
||||
model: str, payload: ImageGenerationPayload, client_id, base_url
|
||||
model: str, payload: ComfyUIGenerateImageForm, client_id, base_url
|
||||
):
|
||||
ws_url = base_url.replace("http://", "ws://").replace("https://", "wss://")
|
||||
workflow = json.loads(payload.workflow.workflow)
|
||||
|
||||
comfyui_prompt = json.loads(COMFYUI_DEFAULT_PROMPT)
|
||||
|
||||
if payload.cfg_scale:
|
||||
comfyui_prompt["3"]["inputs"]["cfg"] = payload.cfg_scale
|
||||
|
||||
if payload.sampler:
|
||||
comfyui_prompt["3"]["inputs"]["sampler"] = payload.sampler
|
||||
|
||||
if payload.scheduler:
|
||||
comfyui_prompt["3"]["inputs"]["scheduler"] = payload.scheduler
|
||||
|
||||
if payload.sd3:
|
||||
comfyui_prompt["5"]["class_type"] = "EmptySD3LatentImage"
|
||||
|
||||
if payload.steps:
|
||||
comfyui_prompt["3"]["inputs"]["steps"] = payload.steps
|
||||
|
||||
comfyui_prompt["4"]["inputs"]["ckpt_name"] = model
|
||||
comfyui_prompt["7"]["inputs"]["text"] = payload.negative_prompt
|
||||
comfyui_prompt["3"]["inputs"]["seed"] = (
|
||||
payload.seed if payload.seed else random.randint(0, 18446744073709551614)
|
||||
for node in payload.workflow.nodes:
|
||||
if node.type:
|
||||
if node.type == "model":
|
||||
for node_id in node.node_ids:
|
||||
workflow[node_id]["inputs"][node.key] = model
|
||||
elif node.type == "prompt":
|
||||
for node_id in node.node_ids:
|
||||
workflow[node_id]["inputs"]["text"] = payload.prompt
|
||||
elif node.type == "negative_prompt":
|
||||
for node_id in node.node_ids:
|
||||
workflow[node_id]["inputs"]["text"] = payload.negative_prompt
|
||||
elif node.type == "width":
|
||||
for node_id in node.node_ids:
|
||||
workflow[node_id]["inputs"]["width"] = payload.width
|
||||
elif node.type == "height":
|
||||
for node_id in node.node_ids:
|
||||
workflow[node_id]["inputs"]["height"] = payload.height
|
||||
elif node.type == "n":
|
||||
for node_id in node.node_ids:
|
||||
workflow[node_id]["inputs"]["batch_size"] = payload.n
|
||||
elif node.type == "steps":
|
||||
for node_id in node.node_ids:
|
||||
workflow[node_id]["inputs"]["steps"] = payload.steps
|
||||
elif node.type == "seed":
|
||||
seed = (
|
||||
payload.seed
|
||||
if payload.seed
|
||||
else random.randint(0, 18446744073709551614)
|
||||
)
|
||||
|
||||
# as Flux uses a completely different workflow, we must treat it specially
|
||||
if payload.flux:
|
||||
comfyui_prompt = json.loads(FLUX_DEFAULT_PROMPT)
|
||||
comfyui_prompt["12"]["inputs"]["unet_name"] = model
|
||||
comfyui_prompt["25"]["inputs"]["noise_seed"] = (
|
||||
payload.seed if payload.seed else random.randint(0, 18446744073709551614)
|
||||
)
|
||||
|
||||
if payload.sampler:
|
||||
comfyui_prompt["16"]["inputs"]["sampler_name"] = payload.sampler
|
||||
|
||||
if payload.steps:
|
||||
comfyui_prompt["17"]["inputs"]["steps"] = payload.steps
|
||||
|
||||
if payload.scheduler:
|
||||
comfyui_prompt["17"]["inputs"]["scheduler"] = payload.scheduler
|
||||
|
||||
if payload.flux_weight_dtype:
|
||||
comfyui_prompt["12"]["inputs"]["weight_dtype"] = payload.flux_weight_dtype
|
||||
|
||||
if payload.flux_fp8_clip:
|
||||
comfyui_prompt["11"]["inputs"][
|
||||
"clip_name2"
|
||||
] = "t5xxl_fp8_e4m3fn.safetensors"
|
||||
|
||||
comfyui_prompt["5"]["inputs"]["batch_size"] = payload.n
|
||||
comfyui_prompt["5"]["inputs"]["width"] = payload.width
|
||||
comfyui_prompt["5"]["inputs"]["height"] = payload.height
|
||||
|
||||
# set the text prompt for our positive CLIPTextEncode
|
||||
comfyui_prompt["6"]["inputs"]["text"] = payload.prompt
|
||||
for node_id in node.node_ids:
|
||||
workflow[node.node_id]["inputs"]["seed"] = seed
|
||||
else:
|
||||
for node_id in node.node_ids:
|
||||
workflow[node_id]["inputs"][node.key] = node.value
|
||||
|
||||
try:
|
||||
ws = websocket.WebSocket()
|
||||
|
|
@ -397,9 +147,7 @@ async def comfyui_generate_image(
|
|||
return None
|
||||
|
||||
try:
|
||||
images = await asyncio.to_thread(
|
||||
get_images, ws, comfyui_prompt, client_id, base_url
|
||||
)
|
||||
images = await asyncio.to_thread(get_images, ws, workflow, client_id, base_url)
|
||||
except Exception as e:
|
||||
log.exception(f"Error while receiving images: {e}")
|
||||
images = None
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ from config import (
|
|||
MODEL_FILTER_LIST,
|
||||
UPLOAD_DIR,
|
||||
AppConfig,
|
||||
CORS_ALLOW_ORIGIN,
|
||||
)
|
||||
from utils.misc import (
|
||||
calculate_sha256,
|
||||
|
|
@ -55,7 +56,7 @@ log.setLevel(SRC_LOG_LEVELS["OLLAMA"])
|
|||
app = FastAPI()
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=["*"],
|
||||
allow_origins=CORS_ALLOW_ORIGIN,
|
||||
allow_credentials=True,
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
|
|
@ -147,13 +148,17 @@ async def cleanup_response(
|
|||
await session.close()
|
||||
|
||||
|
||||
async def post_streaming_url(url: str, payload: str, stream: bool = True):
|
||||
async def post_streaming_url(url: str, payload: Union[str, bytes], stream: bool = True):
|
||||
r = None
|
||||
try:
|
||||
session = aiohttp.ClientSession(
|
||||
trust_env=True, timeout=aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT)
|
||||
)
|
||||
r = await session.post(url, data=payload)
|
||||
r = await session.post(
|
||||
url,
|
||||
data=payload,
|
||||
headers={"Content-Type": "application/json"},
|
||||
)
|
||||
r.raise_for_status()
|
||||
|
||||
if stream:
|
||||
|
|
@ -422,6 +427,7 @@ async def copy_model(
|
|||
r = requests.request(
|
||||
method="POST",
|
||||
url=f"{url}/api/copy",
|
||||
headers={"Content-Type": "application/json"},
|
||||
data=form_data.model_dump_json(exclude_none=True).encode(),
|
||||
)
|
||||
|
||||
|
|
@ -470,6 +476,7 @@ async def delete_model(
|
|||
r = requests.request(
|
||||
method="DELETE",
|
||||
url=f"{url}/api/delete",
|
||||
headers={"Content-Type": "application/json"},
|
||||
data=form_data.model_dump_json(exclude_none=True).encode(),
|
||||
)
|
||||
try:
|
||||
|
|
@ -510,6 +517,7 @@ async def show_model_info(form_data: ModelNameForm, user=Depends(get_verified_us
|
|||
r = requests.request(
|
||||
method="POST",
|
||||
url=f"{url}/api/show",
|
||||
headers={"Content-Type": "application/json"},
|
||||
data=form_data.model_dump_json(exclude_none=True).encode(),
|
||||
)
|
||||
try:
|
||||
|
|
@ -567,6 +575,7 @@ async def generate_embeddings(
|
|||
r = requests.request(
|
||||
method="POST",
|
||||
url=f"{url}/api/embeddings",
|
||||
headers={"Content-Type": "application/json"},
|
||||
data=form_data.model_dump_json(exclude_none=True).encode(),
|
||||
)
|
||||
try:
|
||||
|
|
@ -616,6 +625,7 @@ def generate_ollama_embeddings(
|
|||
r = requests.request(
|
||||
method="POST",
|
||||
url=f"{url}/api/embeddings",
|
||||
headers={"Content-Type": "application/json"},
|
||||
data=form_data.model_dump_json(exclude_none=True).encode(),
|
||||
)
|
||||
try:
|
||||
|
|
@ -721,11 +731,8 @@ async def generate_chat_completion(
|
|||
url_idx: Optional[int] = None,
|
||||
user=Depends(get_verified_user),
|
||||
):
|
||||
log.debug(f"{form_data.model_dump_json(exclude_none=True).encode()}=")
|
||||
|
||||
payload = {
|
||||
**form_data.model_dump(exclude_none=True, exclude=["metadata"]),
|
||||
}
|
||||
payload = {**form_data.model_dump(exclude_none=True)}
|
||||
log.debug(f"{payload = }")
|
||||
if "metadata" in payload:
|
||||
del payload["metadata"]
|
||||
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ from config import (
|
|||
ENABLE_MODEL_FILTER,
|
||||
MODEL_FILTER_LIST,
|
||||
AppConfig,
|
||||
CORS_ALLOW_ORIGIN,
|
||||
)
|
||||
from typing import Optional, Literal, overload
|
||||
|
||||
|
|
@ -45,7 +46,7 @@ log.setLevel(SRC_LOG_LEVELS["OPENAI"])
|
|||
app = FastAPI()
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=["*"],
|
||||
allow_origins=CORS_ALLOW_ORIGIN,
|
||||
allow_credentials=True,
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
|
|
|
|||
|
|
@ -129,6 +129,7 @@ from config import (
|
|||
RAG_WEB_SEARCH_RESULT_COUNT,
|
||||
RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
|
||||
RAG_EMBEDDING_OPENAI_BATCH_SIZE,
|
||||
CORS_ALLOW_ORIGIN,
|
||||
)
|
||||
|
||||
from constants import ERROR_MESSAGES
|
||||
|
|
@ -240,12 +241,9 @@ app.state.EMBEDDING_FUNCTION = get_embedding_function(
|
|||
app.state.config.RAG_EMBEDDING_OPENAI_BATCH_SIZE,
|
||||
)
|
||||
|
||||
origins = ["*"]
|
||||
|
||||
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=origins,
|
||||
allow_origins=CORS_ALLOW_ORIGIN,
|
||||
allow_credentials=True,
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ from utils.misc import (
|
|||
apply_model_system_prompt_to_body,
|
||||
)
|
||||
|
||||
from utils.tools import get_tools
|
||||
|
||||
from config import (
|
||||
SHOW_ADMIN_DETAILS,
|
||||
|
|
@ -43,10 +44,12 @@ from config import (
|
|||
JWT_EXPIRES_IN,
|
||||
WEBUI_BANNERS,
|
||||
ENABLE_COMMUNITY_SHARING,
|
||||
ENABLE_MESSAGE_RATING,
|
||||
AppConfig,
|
||||
OAUTH_USERNAME_CLAIM,
|
||||
OAUTH_PICTURE_CLAIM,
|
||||
OAUTH_EMAIL_CLAIM,
|
||||
CORS_ALLOW_ORIGIN,
|
||||
)
|
||||
|
||||
from apps.socket.main import get_event_call, get_event_emitter
|
||||
|
|
@ -59,8 +62,6 @@ from pydantic import BaseModel
|
|||
|
||||
app = FastAPI()
|
||||
|
||||
origins = ["*"]
|
||||
|
||||
app.state.config = AppConfig()
|
||||
|
||||
app.state.config.ENABLE_SIGNUP = ENABLE_SIGNUP
|
||||
|
|
@ -82,6 +83,7 @@ app.state.config.WEBHOOK_URL = WEBHOOK_URL
|
|||
app.state.config.BANNERS = WEBUI_BANNERS
|
||||
|
||||
app.state.config.ENABLE_COMMUNITY_SHARING = ENABLE_COMMUNITY_SHARING
|
||||
app.state.config.ENABLE_MESSAGE_RATING = ENABLE_MESSAGE_RATING
|
||||
|
||||
app.state.config.OAUTH_USERNAME_CLAIM = OAUTH_USERNAME_CLAIM
|
||||
app.state.config.OAUTH_PICTURE_CLAIM = OAUTH_PICTURE_CLAIM
|
||||
|
|
@ -93,7 +95,7 @@ app.state.FUNCTIONS = {}
|
|||
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=origins,
|
||||
allow_origins=CORS_ALLOW_ORIGIN,
|
||||
allow_credentials=True,
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
|
|
@ -274,7 +276,9 @@ def get_function_params(function_module, form_data, user, extra_params={}):
|
|||
async def generate_function_chat_completion(form_data, user):
|
||||
model_id = form_data.get("model")
|
||||
model_info = Models.get_model_by_id(model_id)
|
||||
metadata = form_data.pop("metadata", None)
|
||||
metadata = form_data.pop("metadata", {})
|
||||
files = metadata.get("files", [])
|
||||
tool_ids = metadata.get("tool_ids", [])
|
||||
|
||||
__event_emitter__ = None
|
||||
__event_call__ = None
|
||||
|
|
@ -286,6 +290,20 @@ async def generate_function_chat_completion(form_data, user):
|
|||
__event_call__ = get_event_call(metadata)
|
||||
__task__ = metadata.get("task", None)
|
||||
|
||||
extra_params = {
|
||||
"__event_emitter__": __event_emitter__,
|
||||
"__event_call__": __event_call__,
|
||||
"__task__": __task__,
|
||||
}
|
||||
tools_params = {
|
||||
**extra_params,
|
||||
"__model__": app.state.MODELS[form_data["model"]],
|
||||
"__messages__": form_data["messages"],
|
||||
"__files__": files,
|
||||
}
|
||||
configured_tools = get_tools(app, tool_ids, user, tools_params)
|
||||
|
||||
extra_params["__tools__"] = configured_tools
|
||||
if model_info:
|
||||
if model_info.base_model_id:
|
||||
form_data["model"] = model_info.base_model_id
|
||||
|
|
@ -298,16 +316,7 @@ async def generate_function_chat_completion(form_data, user):
|
|||
function_module = get_function_module(pipe_id)
|
||||
|
||||
pipe = function_module.pipe
|
||||
params = get_function_params(
|
||||
function_module,
|
||||
form_data,
|
||||
user,
|
||||
{
|
||||
"__event_emitter__": __event_emitter__,
|
||||
"__event_call__": __event_call__,
|
||||
"__task__": __task__,
|
||||
},
|
||||
)
|
||||
params = get_function_params(function_module, form_data, user, extra_params)
|
||||
|
||||
if form_data["stream"]:
|
||||
|
||||
|
|
|
|||
|
|
@ -1,12 +1,10 @@
|
|||
from pydantic import BaseModel, ConfigDict, parse_obj_as
|
||||
from typing import Union, Optional
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
from typing import Optional
|
||||
import time
|
||||
|
||||
from sqlalchemy import String, Column, BigInteger, Text
|
||||
|
||||
from utils.misc import get_gravatar_url
|
||||
|
||||
from apps.webui.internal.db import Base, JSONField, Session, get_db
|
||||
from apps.webui.internal.db import Base, JSONField, get_db
|
||||
from apps.webui.models.chats import Chats
|
||||
|
||||
####################
|
||||
|
|
@ -78,7 +76,6 @@ class UserUpdateForm(BaseModel):
|
|||
|
||||
|
||||
class UsersTable:
|
||||
|
||||
def insert_new_user(
|
||||
self,
|
||||
id: str,
|
||||
|
|
@ -122,7 +119,6 @@ class UsersTable:
|
|||
def get_user_by_api_key(self, api_key: str) -> Optional[UserModel]:
|
||||
try:
|
||||
with get_db() as db:
|
||||
|
||||
user = db.query(User).filter_by(api_key=api_key).first()
|
||||
return UserModel.model_validate(user)
|
||||
except Exception:
|
||||
|
|
@ -131,7 +127,6 @@ class UsersTable:
|
|||
def get_user_by_email(self, email: str) -> Optional[UserModel]:
|
||||
try:
|
||||
with get_db() as db:
|
||||
|
||||
user = db.query(User).filter_by(email=email).first()
|
||||
return UserModel.model_validate(user)
|
||||
except Exception:
|
||||
|
|
@ -140,7 +135,6 @@ class UsersTable:
|
|||
def get_user_by_oauth_sub(self, sub: str) -> Optional[UserModel]:
|
||||
try:
|
||||
with get_db() as db:
|
||||
|
||||
user = db.query(User).filter_by(oauth_sub=sub).first()
|
||||
return UserModel.model_validate(user)
|
||||
except Exception:
|
||||
|
|
@ -195,7 +189,6 @@ class UsersTable:
|
|||
def update_user_last_active_by_id(self, id: str) -> Optional[UserModel]:
|
||||
try:
|
||||
with get_db() as db:
|
||||
|
||||
db.query(User).filter_by(id=id).update(
|
||||
{"last_active_at": int(time.time())}
|
||||
)
|
||||
|
|
|
|||
|
|
@ -352,6 +352,7 @@ async def get_admin_config(request: Request, user=Depends(get_admin_user)):
|
|||
"DEFAULT_USER_ROLE": request.app.state.config.DEFAULT_USER_ROLE,
|
||||
"JWT_EXPIRES_IN": request.app.state.config.JWT_EXPIRES_IN,
|
||||
"ENABLE_COMMUNITY_SHARING": request.app.state.config.ENABLE_COMMUNITY_SHARING,
|
||||
"ENABLE_MESSAGE_RATING": request.app.state.config.ENABLE_MESSAGE_RATING,
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -361,6 +362,7 @@ class AdminConfig(BaseModel):
|
|||
DEFAULT_USER_ROLE: str
|
||||
JWT_EXPIRES_IN: str
|
||||
ENABLE_COMMUNITY_SHARING: bool
|
||||
ENABLE_MESSAGE_RATING: bool
|
||||
|
||||
|
||||
@router.post("/admin/config")
|
||||
|
|
@ -382,6 +384,7 @@ async def update_admin_config(
|
|||
request.app.state.config.ENABLE_COMMUNITY_SHARING = (
|
||||
form_data.ENABLE_COMMUNITY_SHARING
|
||||
)
|
||||
request.app.state.config.ENABLE_MESSAGE_RATING = form_data.ENABLE_MESSAGE_RATING
|
||||
|
||||
return {
|
||||
"SHOW_ADMIN_DETAILS": request.app.state.config.SHOW_ADMIN_DETAILS,
|
||||
|
|
@ -389,6 +392,7 @@ async def update_admin_config(
|
|||
"DEFAULT_USER_ROLE": request.app.state.config.DEFAULT_USER_ROLE,
|
||||
"JWT_EXPIRES_IN": request.app.state.config.JWT_EXPIRES_IN,
|
||||
"ENABLE_COMMUNITY_SHARING": request.app.state.config.ENABLE_COMMUNITY_SHARING,
|
||||
"ENABLE_MESSAGE_RATING": request.app.state.config.ENABLE_MESSAGE_RATING,
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -85,9 +85,10 @@ async def download_chat_as_pdf(
|
|||
pdf.add_font("NotoSans", "i", f"{FONTS_DIR}/NotoSans-Italic.ttf")
|
||||
pdf.add_font("NotoSansKR", "", f"{FONTS_DIR}/NotoSansKR-Regular.ttf")
|
||||
pdf.add_font("NotoSansJP", "", f"{FONTS_DIR}/NotoSansJP-Regular.ttf")
|
||||
pdf.add_font("NotoSansSC", "", f"{FONTS_DIR}/NotoSansSC-Regular.ttf")
|
||||
|
||||
pdf.set_font("NotoSans", size=12)
|
||||
pdf.set_fallback_fonts(["NotoSansKR", "NotoSansJP"])
|
||||
pdf.set_fallback_fonts(["NotoSansKR", "NotoSansJP", "NotoSansSC"])
|
||||
|
||||
pdf.set_auto_page_break(auto=True, margin=15)
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@ import sys
|
|||
import logging
|
||||
import importlib.metadata
|
||||
import pkgutil
|
||||
from urllib.parse import urlparse
|
||||
|
||||
import chromadb
|
||||
from chromadb import Settings
|
||||
from bs4 import BeautifulSoup
|
||||
|
|
@ -174,7 +176,6 @@ for version in soup.find_all("h2"):
|
|||
|
||||
CHANGELOG = changelog_json
|
||||
|
||||
|
||||
####################################
|
||||
# SAFE_MODE
|
||||
####################################
|
||||
|
|
@ -806,10 +807,24 @@ USER_PERMISSIONS_CHAT_DELETION = (
|
|||
os.environ.get("USER_PERMISSIONS_CHAT_DELETION", "True").lower() == "true"
|
||||
)
|
||||
|
||||
USER_PERMISSIONS_CHAT_EDITING = (
|
||||
os.environ.get("USER_PERMISSIONS_CHAT_EDITING", "True").lower() == "true"
|
||||
)
|
||||
|
||||
USER_PERMISSIONS_CHAT_TEMPORARY = (
|
||||
os.environ.get("USER_PERMISSIONS_CHAT_TEMPORARY", "True").lower() == "true"
|
||||
)
|
||||
|
||||
USER_PERMISSIONS = PersistentConfig(
|
||||
"USER_PERMISSIONS",
|
||||
"ui.user_permissions",
|
||||
{"chat": {"deletion": USER_PERMISSIONS_CHAT_DELETION}},
|
||||
{
|
||||
"chat": {
|
||||
"deletion": USER_PERMISSIONS_CHAT_DELETION,
|
||||
"editing": USER_PERMISSIONS_CHAT_EDITING,
|
||||
"temporary": USER_PERMISSIONS_CHAT_TEMPORARY,
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
ENABLE_MODEL_FILTER = PersistentConfig(
|
||||
|
|
@ -840,6 +855,47 @@ ENABLE_COMMUNITY_SHARING = PersistentConfig(
|
|||
os.environ.get("ENABLE_COMMUNITY_SHARING", "True").lower() == "true",
|
||||
)
|
||||
|
||||
ENABLE_MESSAGE_RATING = PersistentConfig(
|
||||
"ENABLE_MESSAGE_RATING",
|
||||
"ui.enable_message_rating",
|
||||
os.environ.get("ENABLE_MESSAGE_RATING", "True").lower() == "true",
|
||||
)
|
||||
|
||||
|
||||
def validate_cors_origins(origins):
|
||||
for origin in origins:
|
||||
if origin != "*":
|
||||
validate_cors_origin(origin)
|
||||
|
||||
|
||||
def validate_cors_origin(origin):
|
||||
parsed_url = urlparse(origin)
|
||||
|
||||
# Check if the scheme is either http or https
|
||||
if parsed_url.scheme not in ["http", "https"]:
|
||||
raise ValueError(
|
||||
f"Invalid scheme in CORS_ALLOW_ORIGIN: '{origin}'. Only 'http' and 'https' are allowed."
|
||||
)
|
||||
|
||||
# Ensure that the netloc (domain + port) is present, indicating it's a valid URL
|
||||
if not parsed_url.netloc:
|
||||
raise ValueError(f"Invalid URL structure in CORS_ALLOW_ORIGIN: '{origin}'.")
|
||||
|
||||
|
||||
# For production, you should only need one host as
|
||||
# fastapi serves the svelte-kit built frontend and backend from the same host and port.
|
||||
# To test CORS_ALLOW_ORIGIN locally, you can set something like
|
||||
# CORS_ALLOW_ORIGIN=http://localhost:5173;http://localhost:8080
|
||||
# in your .env file depending on your frontend port, 5173 in this case.
|
||||
CORS_ALLOW_ORIGIN = os.environ.get("CORS_ALLOW_ORIGIN", "*").split(";")
|
||||
|
||||
if "*" in CORS_ALLOW_ORIGIN:
|
||||
log.warning(
|
||||
"\n\nWARNING: CORS_ALLOW_ORIGIN IS SET TO '*' - NOT RECOMMENDED FOR PRODUCTION DEPLOYMENTS.\n"
|
||||
)
|
||||
|
||||
validate_cors_origins(CORS_ALLOW_ORIGIN)
|
||||
|
||||
|
||||
class BannerModel(BaseModel):
|
||||
id: str
|
||||
|
|
@ -895,10 +951,7 @@ TITLE_GENERATION_PROMPT_TEMPLATE = PersistentConfig(
|
|||
"task.title.prompt_template",
|
||||
os.environ.get(
|
||||
"TITLE_GENERATION_PROMPT_TEMPLATE",
|
||||
"""Here is the query:
|
||||
{{prompt:middletruncate:8000}}
|
||||
|
||||
Create a concise, 3-5 word phrase with an emoji as a title for the previous query. Suitable Emojis for the summary can be used to enhance understanding but avoid quotation marks or special formatting. RESPOND ONLY WITH THE TITLE TEXT.
|
||||
"""Create a concise, 3-5 word title with an emoji as a title for the prompt in the given language. Suitable Emojis for the summary can be used to enhance understanding but avoid quotation marks or special formatting. RESPOND ONLY WITH THE TITLE TEXT.
|
||||
|
||||
Examples of titles:
|
||||
📉 Stock Market Trends
|
||||
|
|
@ -906,7 +959,9 @@ Examples of titles:
|
|||
Evolution of Music Streaming
|
||||
Remote Work Productivity Tips
|
||||
Artificial Intelligence in Healthcare
|
||||
🎮 Video Game Development Insights""",
|
||||
🎮 Video Game Development Insights
|
||||
|
||||
Prompt: {{prompt:middletruncate:8000}}""",
|
||||
),
|
||||
)
|
||||
|
||||
|
|
@ -939,8 +994,7 @@ TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = PersistentConfig(
|
|||
"task.tools.prompt_template",
|
||||
os.environ.get(
|
||||
"TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE",
|
||||
"""Tools: {{TOOLS}}
|
||||
If a function tool doesn't match the query, return an empty string. Else, pick a function tool, fill in the parameters from the function tool's schema, and return it in the format { "name": \"functionName\", "parameters": { "key": "value" } }. Only pick a function if the user asks. Only return the object. Do not return any other text.""",
|
||||
"""Available Tools: {{TOOLS}}\nReturn an empty string if no tools match the query. If a function tool matches, construct and return a JSON object in the format {\"name\": \"functionName\", \"parameters\": {\"requiredFunctionParamKey\": \"requiredFunctionParamValue\"}} using the appropriate tool and its parameters. Only return the object and limit the response to the JSON object without additional text.""",
|
||||
),
|
||||
)
|
||||
|
||||
|
|
@ -1056,7 +1110,7 @@ RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE = (
|
|||
RAG_EMBEDDING_OPENAI_BATCH_SIZE = PersistentConfig(
|
||||
"RAG_EMBEDDING_OPENAI_BATCH_SIZE",
|
||||
"rag.embedding_openai_batch_size",
|
||||
os.environ.get("RAG_EMBEDDING_OPENAI_BATCH_SIZE", 1),
|
||||
int(os.environ.get("RAG_EMBEDDING_OPENAI_BATCH_SIZE", "1")),
|
||||
)
|
||||
|
||||
RAG_RERANKING_MODEL = PersistentConfig(
|
||||
|
|
@ -1288,46 +1342,127 @@ COMFYUI_BASE_URL = PersistentConfig(
|
|||
os.getenv("COMFYUI_BASE_URL", ""),
|
||||
)
|
||||
|
||||
COMFYUI_CFG_SCALE = PersistentConfig(
|
||||
"COMFYUI_CFG_SCALE",
|
||||
"image_generation.comfyui.cfg_scale",
|
||||
os.getenv("COMFYUI_CFG_SCALE", ""),
|
||||
COMFYUI_DEFAULT_WORKFLOW = """
|
||||
{
|
||||
"3": {
|
||||
"inputs": {
|
||||
"seed": 0,
|
||||
"steps": 20,
|
||||
"cfg": 8,
|
||||
"sampler_name": "euler",
|
||||
"scheduler": "normal",
|
||||
"denoise": 1,
|
||||
"model": [
|
||||
"4",
|
||||
0
|
||||
],
|
||||
"positive": [
|
||||
"6",
|
||||
0
|
||||
],
|
||||
"negative": [
|
||||
"7",
|
||||
0
|
||||
],
|
||||
"latent_image": [
|
||||
"5",
|
||||
0
|
||||
]
|
||||
},
|
||||
"class_type": "KSampler",
|
||||
"_meta": {
|
||||
"title": "KSampler"
|
||||
}
|
||||
},
|
||||
"4": {
|
||||
"inputs": {
|
||||
"ckpt_name": "model.safetensors"
|
||||
},
|
||||
"class_type": "CheckpointLoaderSimple",
|
||||
"_meta": {
|
||||
"title": "Load Checkpoint"
|
||||
}
|
||||
},
|
||||
"5": {
|
||||
"inputs": {
|
||||
"width": 512,
|
||||
"height": 512,
|
||||
"batch_size": 1
|
||||
},
|
||||
"class_type": "EmptyLatentImage",
|
||||
"_meta": {
|
||||
"title": "Empty Latent Image"
|
||||
}
|
||||
},
|
||||
"6": {
|
||||
"inputs": {
|
||||
"text": "Prompt",
|
||||
"clip": [
|
||||
"4",
|
||||
1
|
||||
]
|
||||
},
|
||||
"class_type": "CLIPTextEncode",
|
||||
"_meta": {
|
||||
"title": "CLIP Text Encode (Prompt)"
|
||||
}
|
||||
},
|
||||
"7": {
|
||||
"inputs": {
|
||||
"text": "",
|
||||
"clip": [
|
||||
"4",
|
||||
1
|
||||
]
|
||||
},
|
||||
"class_type": "CLIPTextEncode",
|
||||
"_meta": {
|
||||
"title": "CLIP Text Encode (Prompt)"
|
||||
}
|
||||
},
|
||||
"8": {
|
||||
"inputs": {
|
||||
"samples": [
|
||||
"3",
|
||||
0
|
||||
],
|
||||
"vae": [
|
||||
"4",
|
||||
2
|
||||
]
|
||||
},
|
||||
"class_type": "VAEDecode",
|
||||
"_meta": {
|
||||
"title": "VAE Decode"
|
||||
}
|
||||
},
|
||||
"9": {
|
||||
"inputs": {
|
||||
"filename_prefix": "ComfyUI",
|
||||
"images": [
|
||||
"8",
|
||||
0
|
||||
]
|
||||
},
|
||||
"class_type": "SaveImage",
|
||||
"_meta": {
|
||||
"title": "Save Image"
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
|
||||
COMFYUI_WORKFLOW = PersistentConfig(
|
||||
"COMFYUI_WORKFLOW",
|
||||
"image_generation.comfyui.workflow",
|
||||
os.getenv("COMFYUI_WORKFLOW", COMFYUI_DEFAULT_WORKFLOW),
|
||||
)
|
||||
|
||||
COMFYUI_SAMPLER = PersistentConfig(
|
||||
"COMFYUI_SAMPLER",
|
||||
"image_generation.comfyui.sampler",
|
||||
os.getenv("COMFYUI_SAMPLER", ""),
|
||||
)
|
||||
|
||||
COMFYUI_SCHEDULER = PersistentConfig(
|
||||
"COMFYUI_SCHEDULER",
|
||||
"image_generation.comfyui.scheduler",
|
||||
os.getenv("COMFYUI_SCHEDULER", ""),
|
||||
)
|
||||
|
||||
COMFYUI_SD3 = PersistentConfig(
|
||||
"COMFYUI_SD3",
|
||||
"image_generation.comfyui.sd3",
|
||||
os.environ.get("COMFYUI_SD3", "").lower() == "true",
|
||||
)
|
||||
|
||||
COMFYUI_FLUX = PersistentConfig(
|
||||
"COMFYUI_FLUX",
|
||||
"image_generation.comfyui.flux",
|
||||
os.environ.get("COMFYUI_FLUX", "").lower() == "true",
|
||||
)
|
||||
|
||||
COMFYUI_FLUX_WEIGHT_DTYPE = PersistentConfig(
|
||||
"COMFYUI_FLUX_WEIGHT_DTYPE",
|
||||
"image_generation.comfyui.flux_weight_dtype",
|
||||
os.getenv("COMFYUI_FLUX_WEIGHT_DTYPE", ""),
|
||||
)
|
||||
|
||||
COMFYUI_FLUX_FP8_CLIP = PersistentConfig(
|
||||
"COMFYUI_FLUX_FP8_CLIP",
|
||||
"image_generation.comfyui.flux_fp8_clip",
|
||||
os.environ.get("COMFYUI_FLUX_FP8_CLIP", "").lower() == "true",
|
||||
COMFYUI_WORKFLOW_NODES = PersistentConfig(
|
||||
"COMFYUI_WORKFLOW",
|
||||
"image_generation.comfyui.nodes",
|
||||
[],
|
||||
)
|
||||
|
||||
IMAGES_OPENAI_API_BASE_URL = PersistentConfig(
|
||||
|
|
@ -1410,13 +1545,13 @@ AUDIO_TTS_ENGINE = PersistentConfig(
|
|||
AUDIO_TTS_MODEL = PersistentConfig(
|
||||
"AUDIO_TTS_MODEL",
|
||||
"audio.tts.model",
|
||||
os.getenv("AUDIO_TTS_MODEL", "tts-1"),
|
||||
os.getenv("AUDIO_TTS_MODEL", "tts-1"), # OpenAI default model
|
||||
)
|
||||
|
||||
AUDIO_TTS_VOICE = PersistentConfig(
|
||||
"AUDIO_TTS_VOICE",
|
||||
"audio.tts.voice",
|
||||
os.getenv("AUDIO_TTS_VOICE", "alloy"),
|
||||
os.getenv("AUDIO_TTS_VOICE", "alloy"), # OpenAI default voice
|
||||
)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -100,3 +100,4 @@ class TASKS(str, Enum):
|
|||
EMOJI_GENERATION = "emoji_generation"
|
||||
QUERY_GENERATION = "query_generation"
|
||||
FUNCTION_CALLING = "function_calling"
|
||||
MOA_RESPONSE_GENERATION = "moa_response_generation"
|
||||
|
|
|
|||
694
backend/main.py
694
backend/main.py
File diff suppressed because it is too large
Load diff
|
|
@ -1,5 +1,5 @@
|
|||
fastapi==0.111.0
|
||||
uvicorn[standard]==0.22.0
|
||||
uvicorn[standard]==0.30.6
|
||||
pydantic==2.8.2
|
||||
python-multipart==0.0.9
|
||||
|
||||
|
|
@ -13,17 +13,17 @@ passlib[bcrypt]==1.7.4
|
|||
requests==2.32.3
|
||||
aiohttp==3.10.2
|
||||
|
||||
sqlalchemy==2.0.31
|
||||
sqlalchemy==2.0.32
|
||||
alembic==1.13.2
|
||||
peewee==3.17.6
|
||||
peewee-migrate==1.12.2
|
||||
psycopg2-binary==2.9.9
|
||||
PyMySQL==1.1.1
|
||||
bcrypt==4.1.3
|
||||
bcrypt==4.2.0
|
||||
|
||||
pymongo
|
||||
redis
|
||||
boto3==1.34.153
|
||||
boto3==1.35.0
|
||||
|
||||
argon2-cffi==23.1.0
|
||||
APScheduler==3.10.4
|
||||
|
|
@ -44,7 +44,7 @@ sentence-transformers==3.0.1
|
|||
pypdf==4.3.1
|
||||
docx2txt==0.8
|
||||
python-pptx==1.0.0
|
||||
unstructured==0.15.0
|
||||
unstructured==0.15.5
|
||||
Markdown==3.6
|
||||
pypandoc==1.13
|
||||
pandas==2.2.2
|
||||
|
|
@ -60,7 +60,7 @@ rapidocr-onnxruntime==1.3.24
|
|||
fpdf2==2.7.9
|
||||
rank-bm25==0.2.2
|
||||
|
||||
faster-whisper==1.0.2
|
||||
faster-whisper==1.0.3
|
||||
|
||||
PyJWT[crypto]==2.9.0
|
||||
authlib==1.3.1
|
||||
|
|
|
|||
BIN
backend/static/fonts/NotoSansSC-Regular.ttf
Normal file
BIN
backend/static/fonts/NotoSansSC-Regular.ttf
Normal file
Binary file not shown.
104
backend/utils/schemas.py
Normal file
104
backend/utils/schemas.py
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
from pydantic import BaseModel, Field, create_model
|
||||
from typing import Any, Optional, Type
|
||||
|
||||
|
||||
def json_schema_to_model(tool_dict: dict[str, Any]) -> Type[BaseModel]:
|
||||
"""
|
||||
Converts a JSON schema to a Pydantic BaseModel class.
|
||||
|
||||
Args:
|
||||
json_schema: The JSON schema to convert.
|
||||
|
||||
Returns:
|
||||
A Pydantic BaseModel class.
|
||||
"""
|
||||
|
||||
# Extract the model name from the schema title.
|
||||
model_name = tool_dict["name"]
|
||||
schema = tool_dict["parameters"]
|
||||
|
||||
# Extract the field definitions from the schema properties.
|
||||
field_definitions = {
|
||||
name: json_schema_to_pydantic_field(name, prop, schema.get("required", []))
|
||||
for name, prop in schema.get("properties", {}).items()
|
||||
}
|
||||
|
||||
# Create the BaseModel class using create_model().
|
||||
return create_model(model_name, **field_definitions)
|
||||
|
||||
|
||||
def json_schema_to_pydantic_field(
|
||||
name: str, json_schema: dict[str, Any], required: list[str]
|
||||
) -> Any:
|
||||
"""
|
||||
Converts a JSON schema property to a Pydantic field definition.
|
||||
|
||||
Args:
|
||||
name: The field name.
|
||||
json_schema: The JSON schema property.
|
||||
|
||||
Returns:
|
||||
A Pydantic field definition.
|
||||
"""
|
||||
|
||||
# Get the field type.
|
||||
type_ = json_schema_to_pydantic_type(json_schema)
|
||||
|
||||
# Get the field description.
|
||||
description = json_schema.get("description")
|
||||
|
||||
# Get the field examples.
|
||||
examples = json_schema.get("examples")
|
||||
|
||||
# Create a Field object with the type, description, and examples.
|
||||
# The 'required' flag will be set later when creating the model.
|
||||
return (
|
||||
type_,
|
||||
Field(
|
||||
description=description,
|
||||
examples=examples,
|
||||
default=... if name in required else None,
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
def json_schema_to_pydantic_type(json_schema: dict[str, Any]) -> Any:
|
||||
"""
|
||||
Converts a JSON schema type to a Pydantic type.
|
||||
|
||||
Args:
|
||||
json_schema: The JSON schema to convert.
|
||||
|
||||
Returns:
|
||||
A Pydantic type.
|
||||
"""
|
||||
|
||||
type_ = json_schema.get("type")
|
||||
|
||||
if type_ == "string" or type_ == "str":
|
||||
return str
|
||||
elif type_ == "integer" or type_ == "int":
|
||||
return int
|
||||
elif type_ == "number" or type_ == "float":
|
||||
return float
|
||||
elif type_ == "boolean" or type_ == "bool":
|
||||
return bool
|
||||
elif type_ == "array":
|
||||
items_schema = json_schema.get("items")
|
||||
if items_schema:
|
||||
item_type = json_schema_to_pydantic_type(items_schema)
|
||||
return list[item_type]
|
||||
else:
|
||||
return list
|
||||
elif type_ == "object":
|
||||
# Handle nested models.
|
||||
properties = json_schema.get("properties")
|
||||
if properties:
|
||||
nested_model = json_schema_to_model(json_schema)
|
||||
return nested_model
|
||||
else:
|
||||
return dict
|
||||
elif type_ == "null":
|
||||
return Optional[Any] # Use Optional[Any] for nullable fields
|
||||
else:
|
||||
raise ValueError(f"Unsupported JSON schema type: {type_}")
|
||||
|
|
@ -121,6 +121,43 @@ def search_query_generation_template(
|
|||
return template
|
||||
|
||||
|
||||
def moa_response_generation_template(
|
||||
template: str, prompt: str, responses: list[str]
|
||||
) -> str:
|
||||
def replacement_function(match):
|
||||
full_match = match.group(0)
|
||||
start_length = match.group(1)
|
||||
end_length = match.group(2)
|
||||
middle_length = match.group(3)
|
||||
|
||||
if full_match == "{{prompt}}":
|
||||
return prompt
|
||||
elif start_length is not None:
|
||||
return prompt[: int(start_length)]
|
||||
elif end_length is not None:
|
||||
return prompt[-int(end_length) :]
|
||||
elif middle_length is not None:
|
||||
middle_length = int(middle_length)
|
||||
if len(prompt) <= middle_length:
|
||||
return prompt
|
||||
start = prompt[: math.ceil(middle_length / 2)]
|
||||
end = prompt[-math.floor(middle_length / 2) :]
|
||||
return f"{start}...{end}"
|
||||
return ""
|
||||
|
||||
template = re.sub(
|
||||
r"{{prompt}}|{{prompt:start:(\d+)}}|{{prompt:end:(\d+)}}|{{prompt:middletruncate:(\d+)}}",
|
||||
replacement_function,
|
||||
template,
|
||||
)
|
||||
|
||||
responses = [f'"""{response}"""' for response in responses]
|
||||
responses = "\n\n".join(responses)
|
||||
|
||||
template = template.replace("{{responses}}", responses)
|
||||
return template
|
||||
|
||||
|
||||
def tools_function_calling_generation_template(template: str, tools_specs: str) -> str:
|
||||
template = template.replace("{{TOOLS}}", tools_specs)
|
||||
return template
|
||||
|
|
|
|||
|
|
@ -1,5 +1,90 @@
|
|||
import inspect
|
||||
from typing import get_type_hints
|
||||
import logging
|
||||
from typing import Awaitable, Callable, get_type_hints
|
||||
|
||||
from apps.webui.models.tools import Tools
|
||||
from apps.webui.models.users import UserModel
|
||||
from apps.webui.utils import load_toolkit_module_by_id
|
||||
|
||||
from utils.schemas import json_schema_to_model
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def apply_extra_params_to_tool_function(
|
||||
function: Callable, extra_params: dict
|
||||
) -> Callable[..., Awaitable]:
|
||||
sig = inspect.signature(function)
|
||||
extra_params = {
|
||||
key: value for key, value in extra_params.items() if key in sig.parameters
|
||||
}
|
||||
is_coroutine = inspect.iscoroutinefunction(function)
|
||||
|
||||
async def new_function(**kwargs):
|
||||
extra_kwargs = kwargs | extra_params
|
||||
if is_coroutine:
|
||||
return await function(**extra_kwargs)
|
||||
return function(**extra_kwargs)
|
||||
|
||||
return new_function
|
||||
|
||||
|
||||
# Mutation on extra_params
|
||||
def get_tools(
|
||||
webui_app, tool_ids: list[str], user: UserModel, extra_params: dict
|
||||
) -> dict[str, dict]:
|
||||
tools = {}
|
||||
for tool_id in tool_ids:
|
||||
toolkit = Tools.get_tool_by_id(tool_id)
|
||||
if toolkit is None:
|
||||
continue
|
||||
|
||||
module = webui_app.state.TOOLS.get(tool_id, None)
|
||||
if module is None:
|
||||
module, _ = load_toolkit_module_by_id(tool_id)
|
||||
webui_app.state.TOOLS[tool_id] = module
|
||||
|
||||
extra_params["__id__"] = tool_id
|
||||
if hasattr(module, "valves") and hasattr(module, "Valves"):
|
||||
valves = Tools.get_tool_valves_by_id(tool_id) or {}
|
||||
module.valves = module.Valves(**valves)
|
||||
|
||||
if hasattr(module, "UserValves"):
|
||||
extra_params["__user__"]["valves"] = module.UserValves( # type: ignore
|
||||
**Tools.get_user_valves_by_id_and_user_id(tool_id, user.id)
|
||||
)
|
||||
|
||||
for spec in toolkit.specs:
|
||||
# TODO: Fix hack for OpenAI API
|
||||
for val in spec.get("parameters", {}).get("properties", {}).values():
|
||||
if val["type"] == "str":
|
||||
val["type"] = "string"
|
||||
function_name = spec["name"]
|
||||
|
||||
# convert to function that takes only model params and inserts custom params
|
||||
original_func = getattr(module, function_name)
|
||||
callable = apply_extra_params_to_tool_function(original_func, extra_params)
|
||||
if hasattr(original_func, "__doc__"):
|
||||
callable.__doc__ = original_func.__doc__
|
||||
|
||||
# TODO: This needs to be a pydantic model
|
||||
tool_dict = {
|
||||
"toolkit_id": tool_id,
|
||||
"callable": callable,
|
||||
"spec": spec,
|
||||
"pydantic_model": json_schema_to_model(spec),
|
||||
"file_handler": hasattr(module, "file_handler") and module.file_handler,
|
||||
"citation": hasattr(module, "citation") and module.citation,
|
||||
}
|
||||
|
||||
# TODO: if collision, prepend toolkit name
|
||||
if function_name in tools:
|
||||
log.warning(f"Tool {function_name} already exists in another toolkit!")
|
||||
log.warning(f"Collision between {toolkit} and {tool_id}.")
|
||||
log.warning(f"Discarding {toolkit}.{function_name}")
|
||||
else:
|
||||
tools[function_name] = tool_dict
|
||||
return tools
|
||||
|
||||
|
||||
def doc_to_dict(docstring):
|
||||
|
|
|
|||
29
package-lock.json
generated
29
package-lock.json
generated
|
|
@ -1,12 +1,12 @@
|
|||
{
|
||||
"name": "open-webui",
|
||||
"version": "0.3.13",
|
||||
"version": "0.3.14",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "open-webui",
|
||||
"version": "0.3.13",
|
||||
"version": "0.3.14",
|
||||
"dependencies": {
|
||||
"@codemirror/lang-javascript": "^6.2.2",
|
||||
"@codemirror/lang-python": "^6.1.6",
|
||||
|
|
@ -18,6 +18,7 @@
|
|||
"codemirror": "^6.0.1",
|
||||
"crc-32": "^1.2.2",
|
||||
"dayjs": "^1.11.10",
|
||||
"dompurify": "^3.1.6",
|
||||
"eventsource-parser": "^1.1.2",
|
||||
"file-saver": "^2.0.5",
|
||||
"fuse.js": "^7.0.0",
|
||||
|
|
@ -29,7 +30,6 @@
|
|||
"js-sha256": "^0.10.1",
|
||||
"katex": "^0.16.9",
|
||||
"marked": "^9.1.0",
|
||||
"marked-katex-extension": "^5.1.1",
|
||||
"mermaid": "^10.9.1",
|
||||
"pyodide": "^0.26.1",
|
||||
"socket.io-client": "^4.2.0",
|
||||
|
|
@ -1545,11 +1545,6 @@
|
|||
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@types/katex": {
|
||||
"version": "0.16.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz",
|
||||
"integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ=="
|
||||
},
|
||||
"node_modules/@types/mdast": {
|
||||
"version": "3.0.15",
|
||||
"resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
|
||||
|
|
@ -3918,9 +3913,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/dompurify": {
|
||||
"version": "3.1.5",
|
||||
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.5.tgz",
|
||||
"integrity": "sha512-lwG+n5h8QNpxtyrJW/gJWckL+1/DQiYMX8f7t8Z2AZTPw1esVrqjI63i7Zc2Gz0aKzLVMYC1V1PL/ky+aY/NgA=="
|
||||
"version": "3.1.6",
|
||||
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz",
|
||||
"integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ=="
|
||||
},
|
||||
"node_modules/domutils": {
|
||||
"version": "3.1.0",
|
||||
|
|
@ -6042,18 +6037,6 @@
|
|||
"node": ">= 16"
|
||||
}
|
||||
},
|
||||
"node_modules/marked-katex-extension": {
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/marked-katex-extension/-/marked-katex-extension-5.1.1.tgz",
|
||||
"integrity": "sha512-piquiCyZpZ1aiocoJlJkRXr+hkk5UI4xw9GhRZiIAAgvX5rhzUDSJ0seup1JcsgueC8MLNDuqe5cRcAzkFE42Q==",
|
||||
"dependencies": {
|
||||
"@types/katex": "^0.16.7"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"katex": ">=0.16 <0.17",
|
||||
"marked": ">=4 <15"
|
||||
}
|
||||
},
|
||||
"node_modules/matcher-collection": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/matcher-collection/-/matcher-collection-2.0.1.tgz",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "open-webui",
|
||||
"version": "0.3.13",
|
||||
"version": "0.3.14",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "npm run pyodide:fetch && vite dev --host",
|
||||
|
|
@ -59,6 +59,7 @@
|
|||
"codemirror": "^6.0.1",
|
||||
"crc-32": "^1.2.2",
|
||||
"dayjs": "^1.11.10",
|
||||
"dompurify": "^3.1.6",
|
||||
"eventsource-parser": "^1.1.2",
|
||||
"file-saver": "^2.0.5",
|
||||
"fuse.js": "^7.0.0",
|
||||
|
|
@ -70,7 +71,6 @@
|
|||
"js-sha256": "^0.10.1",
|
||||
"katex": "^0.16.9",
|
||||
"marked": "^9.1.0",
|
||||
"marked-katex-extension": "^5.1.1",
|
||||
"mermaid": "^10.9.1",
|
||||
"pyodide": "^0.26.1",
|
||||
"socket.io-client": "^4.2.0",
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ authors = [
|
|||
license = { file = "LICENSE" }
|
||||
dependencies = [
|
||||
"fastapi==0.111.0",
|
||||
"uvicorn[standard]==0.22.0",
|
||||
"uvicorn[standard]==0.30.6",
|
||||
"pydantic==2.8.2",
|
||||
"python-multipart==0.0.9",
|
||||
|
||||
|
|
@ -21,17 +21,17 @@ dependencies = [
|
|||
"requests==2.32.3",
|
||||
"aiohttp==3.10.2",
|
||||
|
||||
"sqlalchemy==2.0.31",
|
||||
"sqlalchemy==2.0.32",
|
||||
"alembic==1.13.2",
|
||||
"peewee==3.17.6",
|
||||
"peewee-migrate==1.12.2",
|
||||
"psycopg2-binary==2.9.9",
|
||||
"PyMySQL==1.1.1",
|
||||
"bcrypt==4.1.3",
|
||||
"bcrypt==4.2.0",
|
||||
|
||||
"pymongo",
|
||||
"redis",
|
||||
"boto3==1.34.153",
|
||||
"boto3==1.35.0",
|
||||
|
||||
"argon2-cffi==23.1.0",
|
||||
"APScheduler==3.10.4",
|
||||
|
|
@ -51,7 +51,7 @@ dependencies = [
|
|||
"pypdf==4.3.1",
|
||||
"docx2txt==0.8",
|
||||
"python-pptx==1.0.0",
|
||||
"unstructured==0.15.0",
|
||||
"unstructured==0.15.5",
|
||||
"Markdown==3.6",
|
||||
"pypandoc==1.13",
|
||||
"pandas==2.2.2",
|
||||
|
|
@ -67,7 +67,7 @@ dependencies = [
|
|||
"fpdf2==2.7.9",
|
||||
"rank-bm25==0.2.2",
|
||||
|
||||
"faster-whisper==1.0.2",
|
||||
"faster-whisper==1.0.3",
|
||||
|
||||
"PyJWT[crypto]==2.9.0",
|
||||
"authlib==1.3.1",
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ backoff==2.2.1
|
|||
# via langfuse
|
||||
# via posthog
|
||||
# via unstructured
|
||||
bcrypt==4.1.3
|
||||
bcrypt==4.2.0
|
||||
# via chromadb
|
||||
# via open-webui
|
||||
# via passlib
|
||||
|
|
@ -63,9 +63,9 @@ black==24.8.0
|
|||
# via open-webui
|
||||
blinker==1.8.2
|
||||
# via flask
|
||||
boto3==1.34.153
|
||||
boto3==1.35.0
|
||||
# via open-webui
|
||||
botocore==1.34.155
|
||||
botocore==1.35.2
|
||||
# via boto3
|
||||
# via s3transfer
|
||||
build==1.2.1
|
||||
|
|
@ -156,7 +156,7 @@ fastapi==0.111.0
|
|||
# via open-webui
|
||||
fastapi-cli==0.0.4
|
||||
# via fastapi
|
||||
faster-whisper==1.0.2
|
||||
faster-whisper==1.0.3
|
||||
# via open-webui
|
||||
filelock==3.14.0
|
||||
# via huggingface-hub
|
||||
|
|
@ -632,7 +632,7 @@ sniffio==1.3.1
|
|||
# via openai
|
||||
soupsieve==2.5
|
||||
# via beautifulsoup4
|
||||
sqlalchemy==2.0.31
|
||||
sqlalchemy==2.0.32
|
||||
# via alembic
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
|
|
@ -703,7 +703,7 @@ tzlocal==5.2
|
|||
# via extract-msg
|
||||
ujson==5.10.0
|
||||
# via fastapi
|
||||
unstructured==0.15.0
|
||||
unstructured==0.15.5
|
||||
# via open-webui
|
||||
unstructured-client==0.22.0
|
||||
# via unstructured
|
||||
|
|
@ -715,7 +715,7 @@ urllib3==2.2.1
|
|||
# via kubernetes
|
||||
# via requests
|
||||
# via unstructured-client
|
||||
uvicorn==0.22.0
|
||||
uvicorn==0.30.6
|
||||
# via chromadb
|
||||
# via fastapi
|
||||
# via open-webui
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ backoff==2.2.1
|
|||
# via langfuse
|
||||
# via posthog
|
||||
# via unstructured
|
||||
bcrypt==4.1.3
|
||||
bcrypt==4.2.0
|
||||
# via chromadb
|
||||
# via open-webui
|
||||
# via passlib
|
||||
|
|
@ -63,9 +63,9 @@ black==24.8.0
|
|||
# via open-webui
|
||||
blinker==1.8.2
|
||||
# via flask
|
||||
boto3==1.34.153
|
||||
boto3==1.35.0
|
||||
# via open-webui
|
||||
botocore==1.34.155
|
||||
botocore==1.35.2
|
||||
# via boto3
|
||||
# via s3transfer
|
||||
build==1.2.1
|
||||
|
|
@ -156,7 +156,7 @@ fastapi==0.111.0
|
|||
# via open-webui
|
||||
fastapi-cli==0.0.4
|
||||
# via fastapi
|
||||
faster-whisper==1.0.2
|
||||
faster-whisper==1.0.3
|
||||
# via open-webui
|
||||
filelock==3.14.0
|
||||
# via huggingface-hub
|
||||
|
|
@ -632,7 +632,7 @@ sniffio==1.3.1
|
|||
# via openai
|
||||
soupsieve==2.5
|
||||
# via beautifulsoup4
|
||||
sqlalchemy==2.0.31
|
||||
sqlalchemy==2.0.32
|
||||
# via alembic
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
|
|
@ -703,7 +703,7 @@ tzlocal==5.2
|
|||
# via extract-msg
|
||||
ujson==5.10.0
|
||||
# via fastapi
|
||||
unstructured==0.15.0
|
||||
unstructured==0.15.5
|
||||
# via open-webui
|
||||
unstructured-client==0.22.0
|
||||
# via unstructured
|
||||
|
|
@ -715,7 +715,7 @@ urllib3==2.2.1
|
|||
# via kubernetes
|
||||
# via requests
|
||||
# via unstructured-client
|
||||
uvicorn==0.22.0
|
||||
uvicorn==0.30.6
|
||||
# via chromadb
|
||||
# via fastapi
|
||||
# via open-webui
|
||||
|
|
|
|||
|
|
@ -34,6 +34,10 @@ math {
|
|||
@apply rounded-lg;
|
||||
}
|
||||
|
||||
.markdown-prose {
|
||||
@apply prose dark:prose-invert prose-p:my-0 prose-img:my-1 prose-headings:my-1 prose-pre:my-0 prose-table:my-0 prose-blockquote:my-0 prose-ul:-my-0 prose-ol:-my-0 prose-li:-my-0 whitespace-pre-line;
|
||||
}
|
||||
|
||||
.markdown a {
|
||||
@apply underline;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { IMAGES_API_BASE_URL } from '$lib/constants';
|
||||
|
||||
export const getImageGenerationConfig = async (token: string = '') => {
|
||||
export const getConfig = async (token: string = '') => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${IMAGES_API_BASE_URL}/config`, {
|
||||
|
|
@ -32,11 +32,7 @@ export const getImageGenerationConfig = async (token: string = '') => {
|
|||
return res;
|
||||
};
|
||||
|
||||
export const updateImageGenerationConfig = async (
|
||||
token: string = '',
|
||||
engine: string,
|
||||
enabled: boolean
|
||||
) => {
|
||||
export const updateConfig = async (token: string = '', config: object) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${IMAGES_API_BASE_URL}/config/update`, {
|
||||
|
|
@ -47,8 +43,7 @@ export const updateImageGenerationConfig = async (
|
|||
...(token && { authorization: `Bearer ${token}` })
|
||||
},
|
||||
body: JSON.stringify({
|
||||
engine,
|
||||
enabled
|
||||
...config
|
||||
})
|
||||
})
|
||||
.then(async (res) => {
|
||||
|
|
@ -72,10 +67,10 @@ export const updateImageGenerationConfig = async (
|
|||
return res;
|
||||
};
|
||||
|
||||
export const getOpenAIConfig = async (token: string = '') => {
|
||||
export const verifyConfigUrl = async (token: string = '') => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${IMAGES_API_BASE_URL}/openai/config`, {
|
||||
const res = await fetch(`${IMAGES_API_BASE_URL}/config/url/verify`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
|
|
@ -104,46 +99,10 @@ export const getOpenAIConfig = async (token: string = '') => {
|
|||
return res;
|
||||
};
|
||||
|
||||
export const updateOpenAIConfig = async (token: string = '', url: string, key: string) => {
|
||||
export const getImageGenerationConfig = async (token: string = '') => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${IMAGES_API_BASE_URL}/openai/config/update`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
...(token && { authorization: `Bearer ${token}` })
|
||||
},
|
||||
body: JSON.stringify({
|
||||
url: url,
|
||||
key: key
|
||||
})
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
if ('detail' in err) {
|
||||
error = err.detail;
|
||||
} else {
|
||||
error = 'Server connection failed';
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
export const getImageGenerationEngineUrls = async (token: string = '') => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${IMAGES_API_BASE_URL}/url`, {
|
||||
const res = await fetch(`${IMAGES_API_BASE_URL}/image/config`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
|
|
@ -172,19 +131,17 @@ export const getImageGenerationEngineUrls = async (token: string = '') => {
|
|||
return res;
|
||||
};
|
||||
|
||||
export const updateImageGenerationEngineUrls = async (token: string = '', urls: object = {}) => {
|
||||
export const updateImageGenerationConfig = async (token: string = '', config: object) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${IMAGES_API_BASE_URL}/url/update`, {
|
||||
const res = await fetch(`${IMAGES_API_BASE_URL}/image/config/update`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
...(token && { authorization: `Bearer ${token}` })
|
||||
},
|
||||
body: JSON.stringify({
|
||||
...urls
|
||||
})
|
||||
body: JSON.stringify({ ...config })
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
|
|
@ -207,138 +164,6 @@ export const updateImageGenerationEngineUrls = async (token: string = '', urls:
|
|||
return res;
|
||||
};
|
||||
|
||||
export const getImageSize = async (token: string = '') => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${IMAGES_API_BASE_URL}/size`, {
|
||||
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);
|
||||
if ('detail' in err) {
|
||||
error = err.detail;
|
||||
} else {
|
||||
error = 'Server connection failed';
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res.IMAGE_SIZE;
|
||||
};
|
||||
|
||||
export const updateImageSize = async (token: string = '', size: string) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${IMAGES_API_BASE_URL}/size/update`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
...(token && { authorization: `Bearer ${token}` })
|
||||
},
|
||||
body: JSON.stringify({
|
||||
size: size
|
||||
})
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
if ('detail' in err) {
|
||||
error = err.detail;
|
||||
} else {
|
||||
error = 'Server connection failed';
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res.IMAGE_SIZE;
|
||||
};
|
||||
|
||||
export const getImageSteps = async (token: string = '') => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${IMAGES_API_BASE_URL}/steps`, {
|
||||
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);
|
||||
if ('detail' in err) {
|
||||
error = err.detail;
|
||||
} else {
|
||||
error = 'Server connection failed';
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res.IMAGE_STEPS;
|
||||
};
|
||||
|
||||
export const updateImageSteps = async (token: string = '', steps: number) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${IMAGES_API_BASE_URL}/steps/update`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
...(token && { authorization: `Bearer ${token}` })
|
||||
},
|
||||
body: JSON.stringify({ steps })
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
if ('detail' in err) {
|
||||
error = err.detail;
|
||||
} else {
|
||||
error = 'Server connection failed';
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res.IMAGE_STEPS;
|
||||
};
|
||||
|
||||
export const getImageGenerationModels = async (token: string = '') => {
|
||||
let error = null;
|
||||
|
||||
|
|
@ -371,73 +196,6 @@ export const getImageGenerationModels = async (token: string = '') => {
|
|||
return res;
|
||||
};
|
||||
|
||||
export const getDefaultImageGenerationModel = async (token: string = '') => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${IMAGES_API_BASE_URL}/models/default`, {
|
||||
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);
|
||||
if ('detail' in err) {
|
||||
error = err.detail;
|
||||
} else {
|
||||
error = 'Server connection failed';
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res.model;
|
||||
};
|
||||
|
||||
export const updateDefaultImageGenerationModel = async (token: string = '', model: string) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${IMAGES_API_BASE_URL}/models/default/update`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
...(token && { authorization: `Bearer ${token}` })
|
||||
},
|
||||
body: JSON.stringify({
|
||||
model: model
|
||||
})
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
if ('detail' in err) {
|
||||
error = err.detail;
|
||||
} else {
|
||||
error = 'Server connection failed';
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res.model;
|
||||
};
|
||||
|
||||
export const imageGenerations = async (token: string = '', prompt: string) => {
|
||||
let error = null;
|
||||
|
||||
|
|
|
|||
|
|
@ -333,6 +333,42 @@ export const generateSearchQuery = async (
|
|||
return res?.choices[0]?.message?.content.replace(/["']/g, '') ?? prompt;
|
||||
};
|
||||
|
||||
export const generateMoACompletion = async (
|
||||
token: string = '',
|
||||
model: string,
|
||||
prompt: string,
|
||||
responses: string[]
|
||||
) => {
|
||||
const controller = new AbortController();
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_BASE_URL}/api/task/moa/completions`, {
|
||||
signal: controller.signal,
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
Authorization: `Bearer ${token}`
|
||||
},
|
||||
body: JSON.stringify({
|
||||
model: model,
|
||||
prompt: prompt,
|
||||
responses: responses,
|
||||
stream: true
|
||||
})
|
||||
}).catch((err) => {
|
||||
console.log(err);
|
||||
error = err;
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return [res, controller];
|
||||
};
|
||||
|
||||
export const getPipelinesList = async (token: string = '') => {
|
||||
let error = null;
|
||||
|
||||
|
|
@ -629,6 +665,7 @@ export const getBackendConfig = async () => {
|
|||
|
||||
const res = await fetch(`${WEBUI_BASE_URL}/api/config`, {
|
||||
method: 'GET',
|
||||
credentials: 'include',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
|
|
@ -913,6 +950,7 @@ export interface ModelConfig {
|
|||
export interface ModelMeta {
|
||||
description?: string;
|
||||
capabilities?: object;
|
||||
profile_image_url?: string;
|
||||
}
|
||||
|
||||
export interface ModelParams {}
|
||||
|
|
|
|||
|
|
@ -396,7 +396,7 @@ export const deleteModel = async (token: string, tagName: string, urlIdx: string
|
|||
return res;
|
||||
};
|
||||
|
||||
export const pullModel = async (token: string, tagName: string, urlIdx: string | null = null) => {
|
||||
export const pullModel = async (token: string, tagName: string, urlIdx: number | null = null) => {
|
||||
let error = null;
|
||||
const controller = new AbortController();
|
||||
|
||||
|
|
|
|||
|
|
@ -336,8 +336,11 @@
|
|||
<div class="flex-1 mt-3 lg:mt-0 overflow-y-scroll">
|
||||
{#if selectedTab === 'general'}
|
||||
<General
|
||||
saveHandler={() => {
|
||||
saveHandler={async () => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
|
||||
await tick();
|
||||
await config.set(await getBackendConfig());
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'users'}
|
||||
|
|
|
|||
|
|
@ -1,22 +1,10 @@
|
|||
<script lang="ts">
|
||||
import {
|
||||
getCommunitySharingEnabledStatus,
|
||||
getWebhookUrl,
|
||||
toggleCommunitySharingEnabledStatus,
|
||||
updateWebhookUrl
|
||||
} from '$lib/apis';
|
||||
import {
|
||||
getAdminConfig,
|
||||
getDefaultUserRole,
|
||||
getJWTExpiresDuration,
|
||||
getSignUpEnabledStatus,
|
||||
toggleSignUpEnabledStatus,
|
||||
updateAdminConfig,
|
||||
updateDefaultUserRole,
|
||||
updateJWTExpiresDuration
|
||||
} from '$lib/apis/auths';
|
||||
import { getBackendConfig, getWebhookUrl, updateWebhookUrl } from '$lib/apis';
|
||||
import { getAdminConfig, updateAdminConfig } from '$lib/apis/auths';
|
||||
import Switch from '$lib/components/common/Switch.svelte';
|
||||
import { config } from '$lib/stores';
|
||||
import { onMount, getContext } from 'svelte';
|
||||
import { toast } from 'svelte-sonner';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
|
|
@ -30,7 +18,7 @@
|
|||
const res = await updateAdminConfig(localStorage.token, adminConfig);
|
||||
|
||||
if (res) {
|
||||
toast.success(i18n.t('Settings updated successfully'));
|
||||
saveHandler();
|
||||
} else {
|
||||
toast.error(i18n.t('Failed to update settings'));
|
||||
}
|
||||
|
|
@ -51,9 +39,8 @@
|
|||
|
||||
<form
|
||||
class="flex flex-col h-full justify-between space-y-3 text-sm"
|
||||
on:submit|preventDefault={() => {
|
||||
on:submit|preventDefault={async () => {
|
||||
updateHandler();
|
||||
saveHandler();
|
||||
}}
|
||||
>
|
||||
<div class=" space-y-3 overflow-y-scroll scrollbar-hidden h-full">
|
||||
|
|
@ -98,6 +85,12 @@
|
|||
<Switch bind:state={adminConfig.ENABLE_COMMUNITY_SHARING} />
|
||||
</div>
|
||||
|
||||
<div class="my-3 flex w-full items-center justify-between pr-2">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Enable Message Rating')}</div>
|
||||
|
||||
<Switch bind:state={adminConfig.ENABLE_MESSAGE_RATING} />
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-850 my-2" />
|
||||
|
||||
<div class=" w-full justify-between">
|
||||
|
|
|
|||
|
|
@ -2,152 +2,172 @@
|
|||
import { toast } from 'svelte-sonner';
|
||||
|
||||
import { createEventDispatcher, onMount, getContext } from 'svelte';
|
||||
import { config, user } from '$lib/stores';
|
||||
import { config as backendConfig, user } from '$lib/stores';
|
||||
|
||||
import { getBackendConfig } from '$lib/apis';
|
||||
import {
|
||||
getImageGenerationModels,
|
||||
getDefaultImageGenerationModel,
|
||||
updateDefaultImageGenerationModel,
|
||||
getImageSize,
|
||||
getImageGenerationConfig,
|
||||
updateImageGenerationConfig,
|
||||
getImageGenerationEngineUrls,
|
||||
updateImageGenerationEngineUrls,
|
||||
updateImageSize,
|
||||
getImageSteps,
|
||||
updateImageSteps,
|
||||
getOpenAIConfig,
|
||||
updateOpenAIConfig
|
||||
getConfig,
|
||||
updateConfig,
|
||||
verifyConfigUrl
|
||||
} from '$lib/apis/images';
|
||||
import { getBackendConfig } from '$lib/apis';
|
||||
import SensitiveInput from '$lib/components/common/SensitiveInput.svelte';
|
||||
import Switch from '$lib/components/common/Switch.svelte';
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
let loading = false;
|
||||
|
||||
let imageGenerationEngine = '';
|
||||
let enableImageGeneration = false;
|
||||
let config = null;
|
||||
let imageGenerationConfig = null;
|
||||
|
||||
let AUTOMATIC1111_BASE_URL = '';
|
||||
let AUTOMATIC1111_API_AUTH = '';
|
||||
let COMFYUI_BASE_URL = '';
|
||||
|
||||
let OPENAI_API_BASE_URL = '';
|
||||
let OPENAI_API_KEY = '';
|
||||
|
||||
let selectedModel = '';
|
||||
let models = null;
|
||||
|
||||
let imageSize = '';
|
||||
let steps = 50;
|
||||
let workflowNodes = [
|
||||
{
|
||||
type: 'prompt',
|
||||
key: 'text',
|
||||
node_ids: ''
|
||||
},
|
||||
{
|
||||
type: 'model',
|
||||
key: 'ckpt_name',
|
||||
node_ids: ''
|
||||
},
|
||||
{
|
||||
type: 'width',
|
||||
key: 'width',
|
||||
node_ids: ''
|
||||
},
|
||||
{
|
||||
type: 'height',
|
||||
key: 'height',
|
||||
node_ids: ''
|
||||
},
|
||||
{
|
||||
type: 'steps',
|
||||
key: 'steps',
|
||||
node_ids: ''
|
||||
}
|
||||
];
|
||||
|
||||
const getModels = async () => {
|
||||
models = await getImageGenerationModels(localStorage.token).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
selectedModel = await getDefaultImageGenerationModel(localStorage.token).catch((error) => {
|
||||
return '';
|
||||
});
|
||||
};
|
||||
|
||||
const updateUrlHandler = async () => {
|
||||
if (imageGenerationEngine === 'comfyui') {
|
||||
const res = await updateImageGenerationEngineUrls(localStorage.token, {
|
||||
COMFYUI_BASE_URL: COMFYUI_BASE_URL
|
||||
}).catch((error) => {
|
||||
toast.error(error);
|
||||
|
||||
console.log(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
COMFYUI_BASE_URL = res.COMFYUI_BASE_URL;
|
||||
|
||||
await getModels();
|
||||
|
||||
if (models) {
|
||||
toast.success($i18n.t('Server connection verified'));
|
||||
}
|
||||
} else {
|
||||
({ COMFYUI_BASE_URL } = await getImageGenerationEngineUrls(localStorage.token));
|
||||
}
|
||||
} else {
|
||||
const res = await updateImageGenerationEngineUrls(localStorage.token, {
|
||||
AUTOMATIC1111_BASE_URL: AUTOMATIC1111_BASE_URL,
|
||||
AUTOMATIC1111_API_AUTH: AUTOMATIC1111_API_AUTH
|
||||
}).catch((error) => {
|
||||
const updateConfigHandler = async () => {
|
||||
const res = await updateConfig(localStorage.token, config).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
AUTOMATIC1111_BASE_URL = res.AUTOMATIC1111_BASE_URL;
|
||||
AUTOMATIC1111_API_AUTH = res.AUTOMATIC1111_API_AUTH;
|
||||
|
||||
await getModels();
|
||||
|
||||
if (models) {
|
||||
toast.success($i18n.t('Server connection verified'));
|
||||
}
|
||||
} else {
|
||||
({ AUTOMATIC1111_BASE_URL, AUTOMATIC1111_API_AUTH } = await getImageGenerationEngineUrls(
|
||||
localStorage.token
|
||||
));
|
||||
}
|
||||
}
|
||||
};
|
||||
const updateImageGeneration = async () => {
|
||||
const res = await updateImageGenerationConfig(
|
||||
localStorage.token,
|
||||
imageGenerationEngine,
|
||||
enableImageGeneration
|
||||
).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
imageGenerationEngine = res.engine;
|
||||
enableImageGeneration = res.enabled;
|
||||
config = res;
|
||||
}
|
||||
|
||||
if (enableImageGeneration) {
|
||||
config.set(await getBackendConfig(localStorage.token));
|
||||
if (config.enabled) {
|
||||
backendConfig.set(await getBackendConfig());
|
||||
getModels();
|
||||
}
|
||||
};
|
||||
|
||||
const validateJSON = (json) => {
|
||||
try {
|
||||
const obj = JSON.parse(json);
|
||||
|
||||
if (obj && typeof obj === 'object') {
|
||||
return true;
|
||||
}
|
||||
} catch (e) {}
|
||||
return false;
|
||||
};
|
||||
|
||||
const saveHandler = async () => {
|
||||
loading = true;
|
||||
|
||||
if (config?.comfyui?.COMFYUI_WORKFLOW) {
|
||||
if (!validateJSON(config.comfyui.COMFYUI_WORKFLOW)) {
|
||||
toast.error('Invalid JSON format for ComfyUI Workflow.');
|
||||
loading = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (config?.comfyui?.COMFYUI_WORKFLOW) {
|
||||
config.comfyui.COMFYUI_WORKFLOW_NODES = workflowNodes.map((node) => {
|
||||
return {
|
||||
type: node.type,
|
||||
key: node.key,
|
||||
node_ids: node.node_ids.split(',').map((id) => id.trim())
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
await updateConfig(localStorage.token, config).catch((error) => {
|
||||
toast.error(error);
|
||||
loading = false;
|
||||
return null;
|
||||
});
|
||||
|
||||
await updateImageGenerationConfig(localStorage.token, imageGenerationConfig).catch((error) => {
|
||||
toast.error(error);
|
||||
loading = false;
|
||||
return null;
|
||||
});
|
||||
|
||||
getModels();
|
||||
dispatch('save');
|
||||
loading = false;
|
||||
};
|
||||
|
||||
onMount(async () => {
|
||||
if ($user.role === 'admin') {
|
||||
const res = await getImageGenerationConfig(localStorage.token).catch((error) => {
|
||||
const res = await getConfig(localStorage.token).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
imageGenerationEngine = res.engine;
|
||||
enableImageGeneration = res.enabled;
|
||||
config = res;
|
||||
}
|
||||
const URLS = await getImageGenerationEngineUrls(localStorage.token);
|
||||
|
||||
AUTOMATIC1111_BASE_URL = URLS.AUTOMATIC1111_BASE_URL;
|
||||
AUTOMATIC1111_API_AUTH = URLS.AUTOMATIC1111_API_AUTH;
|
||||
COMFYUI_BASE_URL = URLS.COMFYUI_BASE_URL;
|
||||
|
||||
const config = await getOpenAIConfig(localStorage.token);
|
||||
|
||||
OPENAI_API_KEY = config.OPENAI_API_KEY;
|
||||
OPENAI_API_BASE_URL = config.OPENAI_API_BASE_URL;
|
||||
|
||||
imageSize = await getImageSize(localStorage.token);
|
||||
steps = await getImageSteps(localStorage.token);
|
||||
|
||||
if (enableImageGeneration) {
|
||||
if (config.enabled) {
|
||||
getModels();
|
||||
}
|
||||
|
||||
if (config.comfyui.COMFYUI_WORKFLOW) {
|
||||
config.comfyui.COMFYUI_WORKFLOW = JSON.stringify(
|
||||
JSON.parse(config.comfyui.COMFYUI_WORKFLOW),
|
||||
null,
|
||||
2
|
||||
);
|
||||
}
|
||||
|
||||
if ((config?.comfyui?.COMFYUI_WORKFLOW_NODES ?? []).length >= 5) {
|
||||
workflowNodes = config.comfyui.COMFYUI_WORKFLOW_NODES.map((node) => {
|
||||
return {
|
||||
type: node.type,
|
||||
key: node.key,
|
||||
node_ids: node.node_ids.join(',')
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
const imageConfigRes = await getImageGenerationConfig(localStorage.token).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (imageConfigRes) {
|
||||
imageGenerationConfig = imageConfigRes;
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
|
@ -155,101 +175,97 @@
|
|||
<form
|
||||
class="flex flex-col h-full justify-between space-y-3 text-sm"
|
||||
on:submit|preventDefault={async () => {
|
||||
loading = true;
|
||||
|
||||
if (imageGenerationEngine === 'openai') {
|
||||
await updateOpenAIConfig(localStorage.token, OPENAI_API_BASE_URL, OPENAI_API_KEY);
|
||||
}
|
||||
|
||||
await updateDefaultImageGenerationModel(localStorage.token, selectedModel);
|
||||
|
||||
await updateImageSize(localStorage.token, imageSize).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
await updateImageSteps(localStorage.token, steps).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
dispatch('save');
|
||||
loading = false;
|
||||
saveHandler();
|
||||
}}
|
||||
>
|
||||
<div class=" space-y-3 overflow-y-scroll scrollbar-hidden">
|
||||
<div class=" space-y-3 overflow-y-scroll scrollbar-hidden pr-2">
|
||||
{#if config && imageGenerationConfig}
|
||||
<div>
|
||||
<div class=" mb-1 text-sm font-medium">{$i18n.t('Image Settings')}</div>
|
||||
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Image Generation Engine')}</div>
|
||||
<div class="flex items-center relative">
|
||||
<select
|
||||
class="w-fit pr-8 rounded px-2 p-1 text-xs bg-transparent outline-none text-right"
|
||||
bind:value={imageGenerationEngine}
|
||||
placeholder={$i18n.t('Select a mode')}
|
||||
on:change={async () => {
|
||||
await updateImageGeneration();
|
||||
}}
|
||||
>
|
||||
<option value="">{$i18n.t('Default (Automatic1111)')}</option>
|
||||
<option value="comfyui">{$i18n.t('ComfyUI')}</option>
|
||||
<option value="openai">{$i18n.t('Open AI (Dall-E)')}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">
|
||||
{$i18n.t('Image Generation (Experimental)')}
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
on:click={() => {
|
||||
if (imageGenerationEngine === '' && AUTOMATIC1111_BASE_URL === '') {
|
||||
<div class="px-1">
|
||||
<Switch
|
||||
bind:state={config.enabled}
|
||||
on:change={(e) => {
|
||||
const enabled = e.detail;
|
||||
|
||||
if (enabled) {
|
||||
if (
|
||||
config.engine === 'automatic1111' &&
|
||||
config.automatic1111.AUTOMATIC1111_BASE_URL === ''
|
||||
) {
|
||||
toast.error($i18n.t('AUTOMATIC1111 Base URL is required.'));
|
||||
enableImageGeneration = false;
|
||||
} else if (imageGenerationEngine === 'comfyui' && COMFYUI_BASE_URL === '') {
|
||||
config.enabled = false;
|
||||
} else if (
|
||||
config.engine === 'comfyui' &&
|
||||
config.comfyui.COMFYUI_BASE_URL === ''
|
||||
) {
|
||||
toast.error($i18n.t('ComfyUI Base URL is required.'));
|
||||
enableImageGeneration = false;
|
||||
} else if (imageGenerationEngine === 'openai' && OPENAI_API_KEY === '') {
|
||||
config.enabled = false;
|
||||
} else if (config.engine === 'openai' && config.openai.OPENAI_API_KEY === '') {
|
||||
toast.error($i18n.t('OpenAI API Key is required.'));
|
||||
enableImageGeneration = false;
|
||||
} else {
|
||||
enableImageGeneration = !enableImageGeneration;
|
||||
config.enabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
updateImageGeneration();
|
||||
updateConfigHandler();
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Image Generation Engine')}</div>
|
||||
<div class="flex items-center relative">
|
||||
<select
|
||||
class="w-fit pr-8 rounded px-2 p-1 text-xs bg-transparent outline-none text-right"
|
||||
bind:value={config.engine}
|
||||
placeholder={$i18n.t('Select Engine')}
|
||||
on:change={async () => {
|
||||
updateConfigHandler();
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
{#if enableImageGeneration === true}
|
||||
<span class="ml-2 self-center">{$i18n.t('On')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Off')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
<option value="openai">{$i18n.t('Default (Open AI)')}</option>
|
||||
<option value="comfyui">{$i18n.t('ComfyUI')}</option>
|
||||
<option value="automatic1111">{$i18n.t('Automatic1111')}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr class=" dark:border-gray-850" />
|
||||
|
||||
{#if imageGenerationEngine === ''}
|
||||
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('AUTOMATIC1111 Base URL')}</div>
|
||||
<div class="flex flex-col gap-2">
|
||||
{#if (config?.engine ?? 'automatic1111') === 'automatic1111'}
|
||||
<div>
|
||||
<div class=" mb-2 text-sm font-medium">{$i18n.t('AUTOMATIC1111 Base URL')}</div>
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1 mr-2">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
placeholder={$i18n.t('Enter URL (e.g. http://127.0.0.1:7860/)')}
|
||||
bind:value={AUTOMATIC1111_BASE_URL}
|
||||
bind:value={config.automatic1111.AUTOMATIC1111_BASE_URL}
|
||||
/>
|
||||
</div>
|
||||
<button
|
||||
class="px-2.5 bg-gray-50 hover:bg-gray-100 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
updateUrlHandler();
|
||||
on:click={async () => {
|
||||
await updateConfigHandler();
|
||||
const res = await verifyConfigUrl(localStorage.token).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
toast.success($i18n.t('Server connection verified'));
|
||||
}
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
|
|
@ -277,11 +293,15 @@
|
|||
{$i18n.t('(e.g. `sh webui.sh --api`)')}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('AUTOMATIC1111 Api Auth String')}</div>
|
||||
<div>
|
||||
<div class=" mb-2 text-sm font-medium">
|
||||
{$i18n.t('AUTOMATIC1111 Api Auth String')}
|
||||
</div>
|
||||
<SensitiveInput
|
||||
placeholder={$i18n.t('Enter api auth string (e.g. username:password)')}
|
||||
bind:value={AUTOMATIC1111_API_AUTH}
|
||||
bind:value={config.automatic1111.AUTOMATIC1111_API_AUTH}
|
||||
required={false}
|
||||
/>
|
||||
|
||||
|
|
@ -292,24 +312,36 @@
|
|||
href="https://github.com/AUTOMATIC1111/stable-diffusion-webui/discussions/13993"
|
||||
target="_blank"
|
||||
>
|
||||
{$i18n.t('(e.g. `sh webui.sh --api --api-auth username_password`)').replace('_', ':')}
|
||||
{$i18n
|
||||
.t('(e.g. `sh webui.sh --api --api-auth username_password`)')
|
||||
.replace('_', ':')}
|
||||
</a>
|
||||
</div>
|
||||
{:else if imageGenerationEngine === 'comfyui'}
|
||||
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('ComfyUI Base URL')}</div>
|
||||
</div>
|
||||
{:else if config?.engine === 'comfyui'}
|
||||
<div class="">
|
||||
<div class=" mb-2 text-sm font-medium">{$i18n.t('ComfyUI Base URL')}</div>
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1 mr-2">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
placeholder={$i18n.t('Enter URL (e.g. http://127.0.0.1:7860/)')}
|
||||
bind:value={COMFYUI_BASE_URL}
|
||||
bind:value={config.comfyui.COMFYUI_BASE_URL}
|
||||
/>
|
||||
</div>
|
||||
<button
|
||||
class="px-2.5 bg-gray-50 hover:bg-gray-100 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
updateUrlHandler();
|
||||
on:click={async () => {
|
||||
await updateConfigHandler();
|
||||
const res = await verifyConfigUrl(localStorage.token).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
toast.success($i18n.t('Server connection verified'));
|
||||
}
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
|
|
@ -326,7 +358,101 @@
|
|||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
{:else if imageGenerationEngine === 'openai'}
|
||||
</div>
|
||||
|
||||
<div class="">
|
||||
<div class=" mb-2 text-sm font-medium">{$i18n.t('ComfyUI Workflow')}</div>
|
||||
|
||||
{#if config.comfyui.COMFYUI_WORKFLOW}
|
||||
<textarea
|
||||
class="w-full rounded-lg mb-1 py-2 px-4 text-xs bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none disabled:text-gray-600 resize-none"
|
||||
rows="10"
|
||||
bind:value={config.comfyui.COMFYUI_WORKFLOW}
|
||||
required
|
||||
/>
|
||||
{/if}
|
||||
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
id="upload-comfyui-workflow-input"
|
||||
hidden
|
||||
type="file"
|
||||
accept=".json"
|
||||
on:change={(e) => {
|
||||
const file = e.target.files[0];
|
||||
const reader = new FileReader();
|
||||
|
||||
reader.onload = (e) => {
|
||||
config.comfyui.COMFYUI_WORKFLOW = e.target.result;
|
||||
e.target.value = null;
|
||||
};
|
||||
|
||||
reader.readAsText(file);
|
||||
}}
|
||||
/>
|
||||
|
||||
<button
|
||||
class="w-full text-sm font-medium py-2 bg-transparent hover:bg-gray-100 border border-dashed dark:border-gray-800 dark:hover:bg-gray-850 text-center rounded-xl"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
document.getElementById('upload-comfyui-workflow-input')?.click();
|
||||
}}
|
||||
>
|
||||
{$i18n.t('Click here to upload a workflow.json file.')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-2 text-xs text-gray-400 dark:text-gray-500">
|
||||
{$i18n.t('Make sure to export a workflow.json file as API format from ComfyUI.')}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{#if config.comfyui.COMFYUI_WORKFLOW}
|
||||
<div class="">
|
||||
<div class=" mb-2 text-sm font-medium">{$i18n.t('ComfyUI Workflow Nodes')}</div>
|
||||
|
||||
<div class="text-xs flex flex-col gap-1.5">
|
||||
{#each workflowNodes as node}
|
||||
<div class="flex w-full items-center border dark:border-gray-850 rounded-lg">
|
||||
<div class="flex-shrink-0">
|
||||
<div
|
||||
class=" capitalize line-clamp-1 font-medium px-3 py-1 w-20 text-center rounded-l-lg bg-green-500/10 text-green-700 dark:text-green-200"
|
||||
>
|
||||
{node.type}
|
||||
</div>
|
||||
</div>
|
||||
<div class="">
|
||||
<Tooltip content="Input Key (e.g. text, unet_name, steps)">
|
||||
<input
|
||||
class="py-1 px-3 w-24 text-xs text-center bg-transparent outline-none border-r dark:border-gray-850"
|
||||
placeholder="Key"
|
||||
bind:value={node.key}
|
||||
required
|
||||
/>
|
||||
</Tooltip>
|
||||
</div>
|
||||
|
||||
<div class="w-full">
|
||||
<Tooltip
|
||||
content="Comma separated Node Ids (e.g. 1 or 1,2)"
|
||||
placement="top-start"
|
||||
>
|
||||
<input
|
||||
class="w-full py-1 px-4 rounded-r-lg text-xs bg-transparent outline-none"
|
||||
placeholder="Node Ids"
|
||||
bind:value={node.node_ids}
|
||||
required
|
||||
/>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
{:else if config?.engine === 'openai'}
|
||||
<div>
|
||||
<div class=" mb-1.5 text-sm font-medium">{$i18n.t('OpenAI API Config')}</div>
|
||||
|
||||
|
|
@ -334,30 +460,35 @@
|
|||
<input
|
||||
class="flex-1 w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
placeholder={$i18n.t('API Base URL')}
|
||||
bind:value={OPENAI_API_BASE_URL}
|
||||
bind:value={config.openai.OPENAI_API_BASE_URL}
|
||||
required
|
||||
/>
|
||||
|
||||
<SensitiveInput placeholder={$i18n.t('API Key')} bind:value={OPENAI_API_KEY} />
|
||||
<SensitiveInput
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={config.openai.OPENAI_API_KEY}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
{#if enableImageGeneration}
|
||||
{#if config?.enabled}
|
||||
<hr class=" dark:border-gray-850" />
|
||||
|
||||
<div>
|
||||
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('Set Default Model')}</div>
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1 mr-2">
|
||||
{#if imageGenerationEngine === 'openai' && !OPENAI_API_BASE_URL.includes('https://api.openai.com')}
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<Tooltip content={$i18n.t('Enter Model ID')} placement="top-start">
|
||||
<input
|
||||
list="model-list"
|
||||
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
bind:value={selectedModel}
|
||||
bind:value={imageGenerationConfig.MODEL}
|
||||
placeholder="Select a model"
|
||||
required
|
||||
/>
|
||||
|
||||
<datalist id="model-list">
|
||||
|
|
@ -365,24 +496,9 @@
|
|||
<option value={model.id}>{model.name}</option>
|
||||
{/each}
|
||||
</datalist>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
{:else}
|
||||
<select
|
||||
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
bind:value={selectedModel}
|
||||
placeholder={$i18n.t('Select a model')}
|
||||
required
|
||||
>
|
||||
{#if !selectedModel}
|
||||
<option value="" disabled selected>{$i18n.t('Select a model')}</option>
|
||||
{/if}
|
||||
{#each models ?? [] as model}
|
||||
<option value={model.id} class="bg-gray-100 dark:bg-gray-700">{model.name}</option
|
||||
>
|
||||
{/each}
|
||||
</select>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -391,11 +507,14 @@
|
|||
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('Set Image Size')}</div>
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1 mr-2">
|
||||
<Tooltip content={$i18n.t('Enter Image Size (e.g. 512x512)')} placement="top-start">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
placeholder={$i18n.t('Enter Image Size (e.g. 512x512)')}
|
||||
bind:value={imageSize}
|
||||
bind:value={imageGenerationConfig.IMAGE_SIZE}
|
||||
required
|
||||
/>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -404,15 +523,19 @@
|
|||
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('Set Steps')}</div>
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1 mr-2">
|
||||
<Tooltip content={$i18n.t('Enter Number of Steps (e.g. 50)')} placement="top-start">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
placeholder={$i18n.t('Enter Number of Steps (e.g. 50)')}
|
||||
bind:value={steps}
|
||||
bind:value={imageGenerationConfig.IMAGE_STEPS}
|
||||
required
|
||||
/>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class="flex justify-end pt-3 text-sm font-medium">
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
let ollamaEnabled = null;
|
||||
|
||||
let OLLAMA_URLS = [];
|
||||
let selectedOllamaUrlIdx: string | null = null;
|
||||
let selectedOllamaUrlIdx: number | null = null;
|
||||
|
||||
let updateModelId = null;
|
||||
let updateProgress = null;
|
||||
|
|
|
|||
|
|
@ -18,7 +18,9 @@
|
|||
let whitelistModels = [''];
|
||||
let permissions = {
|
||||
chat: {
|
||||
deletion: true
|
||||
deletion: true,
|
||||
edit: true,
|
||||
temporary: true
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -92,6 +94,88 @@
|
|||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class=" flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Allow Chat Editing')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
on:click={() => {
|
||||
permissions.chat.editing = !(permissions?.chat?.editing ?? true);
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
{#if permissions?.chat?.editing ?? true}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M11.5 1A3.5 3.5 0 0 0 8 4.5V7H2.5A1.5 1.5 0 0 0 1 8.5v5A1.5 1.5 0 0 0 2.5 15h7a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 9.5 7V4.5a2 2 0 1 1 4 0v1.75a.75.75 0 0 0 1.5 0V4.5A3.5 3.5 0 0 0 11.5 1Z"
|
||||
/>
|
||||
</svg>
|
||||
<span class="ml-2 self-center">{$i18n.t('Allow')}</span>
|
||||
{:else}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M8 1a3.5 3.5 0 0 0-3.5 3.5V7A1.5 1.5 0 0 0 3 8.5v5A1.5 1.5 0 0 0 4.5 15h7a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 11.5 7V4.5A3.5 3.5 0 0 0 8 1Zm2 6V4.5a2 2 0 1 0-4 0V7h4Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
|
||||
<span class="ml-2 self-center">{$i18n.t("Don't Allow")}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class=" flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Allow Temporary Chat')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
on:click={() => {
|
||||
permissions.chat.temporary = !(permissions?.chat?.temporary ?? true);
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
{#if permissions?.chat?.temporary ?? true}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M11.5 1A3.5 3.5 0 0 0 8 4.5V7H2.5A1.5 1.5 0 0 0 1 8.5v5A1.5 1.5 0 0 0 2.5 15h7a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 9.5 7V4.5a2 2 0 1 1 4 0v1.75a.75.75 0 0 0 1.5 0V4.5A3.5 3.5 0 0 0 11.5 1Z"
|
||||
/>
|
||||
</svg>
|
||||
<span class="ml-2 self-center">{$i18n.t('Allow')}</span>
|
||||
{:else}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M8 1a3.5 3.5 0 0 0-3.5 3.5V7A1.5 1.5 0 0 0 3 8.5v5A1.5 1.5 0 0 0 4.5 15h7a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 11.5 7V4.5A3.5 3.5 0 0 0 8 1Zm2 6V4.5a2 2 0 1 0-4 0V7h4Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
|
||||
<span class="ml-2 self-center">{$i18n.t("Don't Allow")}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-850 my-2" />
|
||||
|
|
|
|||
|
|
@ -26,7 +26,8 @@
|
|||
socket,
|
||||
showCallOverlay,
|
||||
tools,
|
||||
currentChatPage
|
||||
currentChatPage,
|
||||
temporaryChatEnabled
|
||||
} from '$lib/stores';
|
||||
import {
|
||||
convertMessagesToHistory,
|
||||
|
|
@ -53,7 +54,13 @@
|
|||
import { createOpenAITextStream } from '$lib/apis/streaming';
|
||||
import { queryMemory } from '$lib/apis/memories';
|
||||
import { getAndUpdateUserLocation, getUserSettings } from '$lib/apis/users';
|
||||
import { chatCompleted, generateTitle, generateSearchQuery, chatAction } from '$lib/apis';
|
||||
import {
|
||||
chatCompleted,
|
||||
generateTitle,
|
||||
generateSearchQuery,
|
||||
chatAction,
|
||||
generateMoACompletion
|
||||
} from '$lib/apis';
|
||||
|
||||
import Banner from '../common/Banner.svelte';
|
||||
import MessageInput from '$lib/components/chat/MessageInput.svelte';
|
||||
|
|
@ -166,6 +173,14 @@
|
|||
message.content += data.content;
|
||||
} else if (type === 'replace') {
|
||||
message.content = data.content;
|
||||
} else if (type === 'action') {
|
||||
if (data.action === 'continue') {
|
||||
const continueButton = document.getElementById('continue-response-button');
|
||||
|
||||
if (continueButton) {
|
||||
continueButton.click();
|
||||
}
|
||||
}
|
||||
} else if (type === 'confirmation') {
|
||||
eventCallback = cb;
|
||||
|
||||
|
|
@ -238,7 +253,7 @@
|
|||
}
|
||||
});
|
||||
} else {
|
||||
if (!($settings.saveChatHistory ?? true)) {
|
||||
if ($temporaryChatEnabled) {
|
||||
await goto('/');
|
||||
}
|
||||
}
|
||||
|
|
@ -414,7 +429,7 @@
|
|||
}
|
||||
|
||||
if ($chatId == chatId) {
|
||||
if ($settings.saveChatHistory ?? true) {
|
||||
if (!$temporaryChatEnabled) {
|
||||
chat = await updateChatById(localStorage.token, chatId, {
|
||||
models: selectedModels,
|
||||
messages: messages,
|
||||
|
|
@ -429,7 +444,7 @@
|
|||
}
|
||||
};
|
||||
|
||||
const chatActionHandler = async (chatId, actionId, modelId, responseMessageId) => {
|
||||
const chatActionHandler = async (chatId, actionId, modelId, responseMessageId, event = null) => {
|
||||
const res = await chatAction(localStorage.token, actionId, {
|
||||
model: modelId,
|
||||
messages: messages.map((m) => ({
|
||||
|
|
@ -439,6 +454,7 @@
|
|||
info: m.info ? m.info : undefined,
|
||||
timestamp: m.timestamp
|
||||
})),
|
||||
...(event ? { event: event } : {}),
|
||||
chat_id: chatId,
|
||||
session_id: $socket?.id,
|
||||
id: responseMessageId
|
||||
|
|
@ -462,7 +478,7 @@
|
|||
}
|
||||
|
||||
if ($chatId == chatId) {
|
||||
if ($settings.saveChatHistory ?? true) {
|
||||
if (!$temporaryChatEnabled) {
|
||||
chat = await updateChatById(localStorage.token, chatId, {
|
||||
models: selectedModels,
|
||||
messages: messages,
|
||||
|
|
@ -552,7 +568,7 @@
|
|||
content: userPrompt,
|
||||
files: _files.length > 0 ? _files : undefined,
|
||||
timestamp: Math.floor(Date.now() / 1000), // Unix epoch
|
||||
models: selectedModels.filter((m, mIdx) => selectedModels.indexOf(m) === mIdx)
|
||||
models: selectedModels
|
||||
};
|
||||
|
||||
// Add message to history and Set currentId to messageId
|
||||
|
|
@ -572,7 +588,11 @@
|
|||
return _responses;
|
||||
};
|
||||
|
||||
const sendPrompt = async (prompt, parentId, { modelId = null, newChat = false } = {}) => {
|
||||
const sendPrompt = async (
|
||||
prompt,
|
||||
parentId,
|
||||
{ modelId = null, modelIdx = null, newChat = false } = {}
|
||||
) => {
|
||||
let _responses = [];
|
||||
|
||||
// If modelId is provided, use it, else use selected model
|
||||
|
|
@ -584,7 +604,7 @@
|
|||
|
||||
// Create response messages for each selected model
|
||||
const responseMessageIds = {};
|
||||
for (const modelId of selectedModelIds) {
|
||||
for (const [_modelIdx, modelId] of selectedModelIds.entries()) {
|
||||
const model = $models.filter((m) => m.id === modelId).at(0);
|
||||
|
||||
if (model) {
|
||||
|
|
@ -597,6 +617,7 @@
|
|||
content: '',
|
||||
model: model.id,
|
||||
modelName: model.name ?? model.id,
|
||||
modelIdx: modelIdx ? modelIdx : _modelIdx,
|
||||
userContext: null,
|
||||
timestamp: Math.floor(Date.now() / 1000) // Unix epoch
|
||||
};
|
||||
|
|
@ -613,14 +634,14 @@
|
|||
];
|
||||
}
|
||||
|
||||
responseMessageIds[modelId] = responseMessageId;
|
||||
responseMessageIds[`${modelId}-${modelIdx ? modelIdx : _modelIdx}`] = responseMessageId;
|
||||
}
|
||||
}
|
||||
await tick();
|
||||
|
||||
// Create new chat if only one message in messages
|
||||
if (newChat && messages.length == 2) {
|
||||
if ($settings.saveChatHistory ?? true) {
|
||||
if (!$temporaryChatEnabled) {
|
||||
chat = await createNewChat(localStorage.token, {
|
||||
id: $chatId,
|
||||
title: $i18n.t('New Chat'),
|
||||
|
|
@ -645,7 +666,7 @@
|
|||
const _chatId = JSON.parse(JSON.stringify($chatId));
|
||||
|
||||
await Promise.all(
|
||||
selectedModelIds.map(async (modelId) => {
|
||||
selectedModelIds.map(async (modelId, _modelIdx) => {
|
||||
console.log('modelId', modelId);
|
||||
const model = $models.filter((m) => m.id === modelId).at(0);
|
||||
|
||||
|
|
@ -663,7 +684,8 @@
|
|||
);
|
||||
}
|
||||
|
||||
let responseMessageId = responseMessageIds[modelId];
|
||||
let responseMessageId =
|
||||
responseMessageIds[`${modelId}-${modelIdx ? modelIdx : _modelIdx}`];
|
||||
let responseMessage = history.messages[responseMessageId];
|
||||
|
||||
let userContext = null;
|
||||
|
|
@ -953,20 +975,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
if ($chatId == _chatId) {
|
||||
if ($settings.saveChatHistory ?? true) {
|
||||
chat = await updateChatById(localStorage.token, _chatId, {
|
||||
messages: messages,
|
||||
history: history,
|
||||
models: selectedModels,
|
||||
params: params,
|
||||
files: chatFiles
|
||||
});
|
||||
|
||||
currentChatPage.set(1);
|
||||
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||
}
|
||||
}
|
||||
await saveChatHandler(_chatId);
|
||||
} else {
|
||||
if (res !== null) {
|
||||
const error = await res.json();
|
||||
|
|
@ -1227,7 +1236,7 @@
|
|||
}
|
||||
|
||||
if ($chatId == _chatId) {
|
||||
if ($settings.saveChatHistory ?? true) {
|
||||
if (!$temporaryChatEnabled) {
|
||||
chat = await updateChatById(localStorage.token, _chatId, {
|
||||
models: selectedModels,
|
||||
messages: messages,
|
||||
|
|
@ -1340,7 +1349,10 @@
|
|||
} else {
|
||||
// If there are multiple models selected, use the model of the response message for regeneration
|
||||
// e.g. many model chat
|
||||
await sendPrompt(userPrompt, userMessage.id, { modelId: message.model });
|
||||
await sendPrompt(userPrompt, userMessage.id, {
|
||||
modelId: message.model,
|
||||
modelIdx: message.modelIdx
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
@ -1400,7 +1412,7 @@
|
|||
title = _title;
|
||||
}
|
||||
|
||||
if ($settings.saveChatHistory ?? true) {
|
||||
if (!$temporaryChatEnabled) {
|
||||
chat = await updateChatById(localStorage.token, _chatId, { title: _title });
|
||||
|
||||
currentChatPage.set(1);
|
||||
|
|
@ -1492,6 +1504,69 @@
|
|||
return [];
|
||||
});
|
||||
};
|
||||
|
||||
const saveChatHandler = async (_chatId) => {
|
||||
if ($chatId == _chatId) {
|
||||
if (!$temporaryChatEnabled) {
|
||||
chat = await updateChatById(localStorage.token, _chatId, {
|
||||
messages: messages,
|
||||
history: history,
|
||||
models: selectedModels,
|
||||
params: params,
|
||||
files: chatFiles
|
||||
});
|
||||
|
||||
currentChatPage.set(1);
|
||||
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||
}
|
||||
}
|
||||
};
|
||||
const mergeResponses = async (messageId, responses, _chatId) => {
|
||||
console.log('mergeResponses', messageId, responses);
|
||||
const message = history.messages[messageId];
|
||||
const mergedResponse = {
|
||||
status: true,
|
||||
content: ''
|
||||
};
|
||||
message.merged = mergedResponse;
|
||||
messages = messages;
|
||||
|
||||
try {
|
||||
const [res, controller] = await generateMoACompletion(
|
||||
localStorage.token,
|
||||
message.model,
|
||||
history.messages[message.parentId].content,
|
||||
responses
|
||||
);
|
||||
|
||||
if (res && res.ok && res.body) {
|
||||
const textStream = await createOpenAITextStream(res.body, $settings.splitLargeChunks);
|
||||
for await (const update of textStream) {
|
||||
const { value, done, citations, error, usage } = update;
|
||||
if (error || done) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (mergedResponse.content == '' && value == '\n') {
|
||||
continue;
|
||||
} else {
|
||||
mergedResponse.content += value;
|
||||
messages = messages;
|
||||
}
|
||||
|
||||
if (autoScroll) {
|
||||
scrollToBottom();
|
||||
}
|
||||
}
|
||||
|
||||
await saveChatHandler(_chatId);
|
||||
} else {
|
||||
console.error(res);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
|
|
@ -1618,6 +1693,7 @@
|
|||
{sendPrompt}
|
||||
{continueGeneration}
|
||||
{regenerateResponse}
|
||||
{mergeResponses}
|
||||
{chatActionHandler}
|
||||
/>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -5,15 +5,12 @@
|
|||
|
||||
import { toast } from 'svelte-sonner';
|
||||
import { getChatList, updateChatById } from '$lib/apis/chats';
|
||||
import { copyToClipboard, findWordIndices } from '$lib/utils';
|
||||
|
||||
import UserMessage from './Messages/UserMessage.svelte';
|
||||
import ResponseMessage from './Messages/ResponseMessage.svelte';
|
||||
import Placeholder from './Messages/Placeholder.svelte';
|
||||
import Spinner from '../common/Spinner.svelte';
|
||||
import { imageGenerations } from '$lib/apis/images';
|
||||
import { copyToClipboard, findWordIndices } from '$lib/utils';
|
||||
import CompareMessages from './Messages/CompareMessages.svelte';
|
||||
import { stringify } from 'postcss';
|
||||
import MultiResponseMessages from './Messages/MultiResponseMessages.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
|
|
@ -22,6 +19,7 @@
|
|||
export let sendPrompt: Function;
|
||||
export let continueGeneration: Function;
|
||||
export let regenerateResponse: Function;
|
||||
export let mergeResponses: Function;
|
||||
export let chatActionHandler: Function;
|
||||
|
||||
export let user = $_user;
|
||||
|
|
@ -53,7 +51,8 @@
|
|||
}
|
||||
};
|
||||
|
||||
const confirmEditMessage = async (messageId, content) => {
|
||||
const confirmEditMessage = async (messageId, content, submit = true) => {
|
||||
if (submit) {
|
||||
let userPrompt = content;
|
||||
let userMessageId = uuidv4();
|
||||
|
||||
|
|
@ -64,7 +63,7 @@
|
|||
role: 'user',
|
||||
content: userPrompt,
|
||||
...(history.messages[messageId].files && { files: history.messages[messageId].files }),
|
||||
models: selectedModels.filter((m, mIdx) => selectedModels.indexOf(m) === mIdx)
|
||||
models: selectedModels
|
||||
};
|
||||
|
||||
let messageParentId = history.messages[messageId].parentId;
|
||||
|
|
@ -81,6 +80,14 @@
|
|||
|
||||
await tick();
|
||||
await sendPrompt(userPrompt, userMessageId);
|
||||
} else {
|
||||
history.messages[messageId].content = content;
|
||||
await tick();
|
||||
await updateChatById(localStorage.token, chatId, {
|
||||
messages: messages,
|
||||
history: history
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const updateChatMessages = async () => {
|
||||
|
|
@ -326,7 +333,7 @@
|
|||
{showNextMessage}
|
||||
copyToClipboard={copyToClipboardWithToast}
|
||||
/>
|
||||
{:else if $mobile || (history.messages[message.parentId]?.models?.length ?? 1) === 1}
|
||||
{:else if (history.messages[message.parentId]?.models?.length ?? 1) === 1}
|
||||
{#key message.id && history.currentId}
|
||||
<ResponseMessage
|
||||
{message}
|
||||
|
|
@ -342,7 +349,13 @@
|
|||
{continueGeneration}
|
||||
{regenerateResponse}
|
||||
on:action={async (e) => {
|
||||
console.log('action', e);
|
||||
if (typeof e.detail === 'string') {
|
||||
await chatActionHandler(chatId, e.detail, message.model, message.id);
|
||||
} else {
|
||||
const { id, event } = e.detail;
|
||||
await chatActionHandler(chatId, id, message.model, message.id, event);
|
||||
}
|
||||
}}
|
||||
on:save={async (e) => {
|
||||
console.log('save', e);
|
||||
|
|
@ -358,8 +371,9 @@
|
|||
{/key}
|
||||
{:else}
|
||||
{#key message.parentId}
|
||||
<CompareMessages
|
||||
<MultiResponseMessages
|
||||
bind:history
|
||||
isLastMessage={messageIdx + 1 === messages.length}
|
||||
{messages}
|
||||
{readOnly}
|
||||
{chatId}
|
||||
|
|
@ -370,6 +384,7 @@
|
|||
{rateMessage}
|
||||
copyToClipboard={copyToClipboardWithToast}
|
||||
{continueGeneration}
|
||||
{mergeResponses}
|
||||
{regenerateResponse}
|
||||
on:change={async () => {
|
||||
await updateChatById(localStorage.token, chatId, {
|
||||
|
|
|
|||
56
src/lib/components/chat/Messages/Citations.svelte
Normal file
56
src/lib/components/chat/Messages/Citations.svelte
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
<script lang="ts">
|
||||
import CitationsModal from './CitationsModal.svelte';
|
||||
|
||||
export let citations = [];
|
||||
|
||||
let showCitationModal = false;
|
||||
let selectedCitation = null;
|
||||
</script>
|
||||
|
||||
<CitationsModal bind:show={showCitationModal} citation={selectedCitation} />
|
||||
|
||||
<div class="mt-1 mb-2 w-full flex gap-1 items-center flex-wrap">
|
||||
{#each citations.reduce((acc, citation) => {
|
||||
citation.document.forEach((document, index) => {
|
||||
const metadata = citation.metadata?.[index];
|
||||
const id = metadata?.source ?? 'N/A';
|
||||
let source = citation?.source;
|
||||
|
||||
if (metadata?.name) {
|
||||
source = { ...source, name: metadata.name };
|
||||
}
|
||||
|
||||
// Check if ID looks like a URL
|
||||
if (id.startsWith('http://') || id.startsWith('https://')) {
|
||||
source = { name: id };
|
||||
}
|
||||
|
||||
const existingSource = acc.find((item) => item.id === id);
|
||||
|
||||
if (existingSource) {
|
||||
existingSource.document.push(document);
|
||||
existingSource.metadata.push(metadata);
|
||||
} else {
|
||||
acc.push( { id: id, source: source, document: [document], metadata: metadata ? [metadata] : [] } );
|
||||
}
|
||||
});
|
||||
return acc;
|
||||
}, []) as citation, idx}
|
||||
<div class="flex gap-1 text-xs font-semibold">
|
||||
<button
|
||||
class="flex dark:text-gray-300 py-1 px-1 bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-xl"
|
||||
on:click={() => {
|
||||
showCitationModal = true;
|
||||
selectedCitation = citation;
|
||||
}}
|
||||
>
|
||||
<div class="bg-white dark:bg-gray-700 rounded-full size-4">
|
||||
{idx + 1}
|
||||
</div>
|
||||
<div class="flex-1 mx-2 line-clamp-1">
|
||||
{citation.source.name}
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
|
|
@ -3,6 +3,8 @@
|
|||
import { loadPyodide } from 'pyodide';
|
||||
import mermaid from 'mermaid';
|
||||
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
|
||||
import { getContext, getAllContexts, onMount } from 'svelte';
|
||||
import { copyToClipboard } from '$lib/utils';
|
||||
|
||||
|
|
@ -213,15 +215,19 @@ __builtins__.input = input`);
|
|||
|
||||
let debounceTimeout;
|
||||
|
||||
$: if (code) {
|
||||
if (lang === 'mermaid' && (token?.raw ?? '').endsWith('```')) {
|
||||
(async () => {
|
||||
const drawMermaidDiagram = async () => {
|
||||
try {
|
||||
const { svg } = await mermaid.render(`mermaid-${id}`, code);
|
||||
const { svg } = await mermaid.render(`mermaid-${uuidv4()}`, code);
|
||||
mermaidHtml = svg;
|
||||
} catch (error) {
|
||||
console.error('Error:', error);
|
||||
console.log('Error:', error);
|
||||
}
|
||||
};
|
||||
|
||||
$: if (token.raw) {
|
||||
if (lang === 'mermaid' && (token?.raw ?? '').slice(-4).includes('```')) {
|
||||
(async () => {
|
||||
await drawMermaidDiagram();
|
||||
})();
|
||||
} else {
|
||||
// Function to perform the code highlighting
|
||||
|
|
@ -237,15 +243,18 @@ __builtins__.input = input`);
|
|||
}
|
||||
|
||||
onMount(async () => {
|
||||
await mermaid.initialize({ startOnLoad: true });
|
||||
|
||||
if (lang === 'mermaid' && (token?.raw ?? '').endsWith('```')) {
|
||||
try {
|
||||
const { svg } = await mermaid.render(`mermaid-${id}`, code);
|
||||
mermaidHtml = svg;
|
||||
} catch (error) {
|
||||
console.error('Error:', error);
|
||||
}
|
||||
if (document.documentElement.classList.contains('dark')) {
|
||||
mermaid.initialize({
|
||||
startOnLoad: true,
|
||||
theme: 'dark',
|
||||
securityLevel: 'loose'
|
||||
});
|
||||
} else {
|
||||
mermaid.initialize({
|
||||
startOnLoad: true,
|
||||
theme: 'default',
|
||||
securityLevel: 'loose'
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
|
@ -253,15 +262,15 @@ __builtins__.input = input`);
|
|||
<div class="my-2" dir="ltr">
|
||||
{#if lang === 'mermaid'}
|
||||
{#if mermaidHtml}
|
||||
{@html mermaidHtml}
|
||||
{@html `${mermaidHtml}`}
|
||||
{:else}
|
||||
<pre class=" mermaid-{id}">{code}</pre>
|
||||
<pre class="mermaid">{code}</pre>
|
||||
{/if}
|
||||
{:else}
|
||||
<div
|
||||
class="flex justify-between bg-[#202123] text-white text-xs px-4 pt-1 pb-0.5 rounded-t-lg overflow-x-auto"
|
||||
>
|
||||
<div class="p-1">{@html lang}</div>
|
||||
<div class="p-1">{lang}</div>
|
||||
|
||||
<div class="flex items-center">
|
||||
{#if lang.toLowerCase() === 'python' || lang.toLowerCase() === 'py' || (lang === '' && checkPythonCode(code))}
|
||||
|
|
|
|||
|
|
@ -1,167 +0,0 @@
|
|||
<script lang="ts">
|
||||
import { createEventDispatcher } from 'svelte';
|
||||
|
||||
import { updateChatById } from '$lib/apis/chats';
|
||||
import { onMount, tick } from 'svelte';
|
||||
import ResponseMessage from './ResponseMessage.svelte';
|
||||
|
||||
export let chatId;
|
||||
|
||||
export let history;
|
||||
export let messages = [];
|
||||
export let messageIdx;
|
||||
|
||||
export let parentMessage;
|
||||
|
||||
export let readOnly = false;
|
||||
|
||||
export let updateChatMessages: Function;
|
||||
export let confirmEditResponseMessage: Function;
|
||||
export let rateMessage: Function;
|
||||
|
||||
export let copyToClipboard: Function;
|
||||
export let continueGeneration: Function;
|
||||
export let regenerateResponse: Function;
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
let currentMessageId;
|
||||
|
||||
let groupedMessagesIdx = {};
|
||||
let groupedMessages = {};
|
||||
|
||||
$: groupedMessages = parentMessage?.models.reduce((a, model) => {
|
||||
const modelMessages = parentMessage?.childrenIds
|
||||
.map((id) => history.messages[id])
|
||||
.filter((m) => m.model === model);
|
||||
|
||||
return {
|
||||
...a,
|
||||
[model]: { messages: modelMessages }
|
||||
};
|
||||
}, {});
|
||||
|
||||
const showPreviousMessage = (model) => {
|
||||
groupedMessagesIdx[model] = Math.max(0, groupedMessagesIdx[model] - 1);
|
||||
let messageId = groupedMessages[model].messages[groupedMessagesIdx[model]].id;
|
||||
|
||||
console.log(messageId);
|
||||
let messageChildrenIds = history.messages[messageId].childrenIds;
|
||||
|
||||
while (messageChildrenIds.length !== 0) {
|
||||
messageId = messageChildrenIds.at(-1);
|
||||
messageChildrenIds = history.messages[messageId].childrenIds;
|
||||
}
|
||||
|
||||
history.currentId = messageId;
|
||||
|
||||
dispatch('change');
|
||||
};
|
||||
|
||||
const showNextMessage = (model) => {
|
||||
groupedMessagesIdx[model] = Math.min(
|
||||
groupedMessages[model].messages.length - 1,
|
||||
groupedMessagesIdx[model] + 1
|
||||
);
|
||||
|
||||
let messageId = groupedMessages[model].messages[groupedMessagesIdx[model]].id;
|
||||
console.log(messageId);
|
||||
|
||||
let messageChildrenIds = history.messages[messageId].childrenIds;
|
||||
|
||||
while (messageChildrenIds.length !== 0) {
|
||||
messageId = messageChildrenIds.at(-1);
|
||||
messageChildrenIds = history.messages[messageId].childrenIds;
|
||||
}
|
||||
|
||||
history.currentId = messageId;
|
||||
|
||||
dispatch('change');
|
||||
};
|
||||
|
||||
onMount(async () => {
|
||||
await tick();
|
||||
currentMessageId = messages[messageIdx].id;
|
||||
|
||||
for (const model of parentMessage?.models) {
|
||||
const idx = groupedMessages[model].messages.findIndex((m) => m.id === currentMessageId);
|
||||
|
||||
if (idx !== -1) {
|
||||
groupedMessagesIdx[model] = idx;
|
||||
} else {
|
||||
groupedMessagesIdx[model] = 0;
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<div>
|
||||
<div
|
||||
class="flex snap-x snap-mandatory overflow-x-auto scrollbar-hidden"
|
||||
id="responses-container-{parentMessage.id}"
|
||||
>
|
||||
{#key currentMessageId}
|
||||
{#each Object.keys(groupedMessages) as model}
|
||||
{#if groupedMessagesIdx[model] !== undefined && groupedMessages[model].messages.length > 0}
|
||||
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
||||
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||
{@const message = groupedMessages[model].messages[groupedMessagesIdx[model]]}
|
||||
|
||||
<div
|
||||
class=" snap-center min-w-80 w-full max-w-full m-1 border {history.messages[
|
||||
currentMessageId
|
||||
].model === model
|
||||
? 'border-gray-100 dark:border-gray-800 border-[1.5px]'
|
||||
: 'border-gray-50 dark:border-gray-850 '} transition p-5 rounded-3xl"
|
||||
on:click={() => {
|
||||
if (currentMessageId != message.id) {
|
||||
currentMessageId = message.id;
|
||||
let messageId = message.id;
|
||||
console.log(messageId);
|
||||
//
|
||||
let messageChildrenIds = history.messages[messageId].childrenIds;
|
||||
while (messageChildrenIds.length !== 0) {
|
||||
messageId = messageChildrenIds.at(-1);
|
||||
messageChildrenIds = history.messages[messageId].childrenIds;
|
||||
}
|
||||
history.currentId = messageId;
|
||||
dispatch('change');
|
||||
}
|
||||
}}
|
||||
>
|
||||
{#key history.currentId}
|
||||
<ResponseMessage
|
||||
message={groupedMessages[model].messages[groupedMessagesIdx[model]]}
|
||||
siblings={groupedMessages[model].messages.map((m) => m.id)}
|
||||
isLastMessage={true}
|
||||
{updateChatMessages}
|
||||
{confirmEditResponseMessage}
|
||||
showPreviousMessage={() => showPreviousMessage(model)}
|
||||
showNextMessage={() => showNextMessage(model)}
|
||||
{readOnly}
|
||||
{rateMessage}
|
||||
{copyToClipboard}
|
||||
{continueGeneration}
|
||||
regenerateResponse={async (message) => {
|
||||
regenerateResponse(message);
|
||||
await tick();
|
||||
groupedMessagesIdx[model] = groupedMessages[model].messages.length - 1;
|
||||
}}
|
||||
on:save={async (e) => {
|
||||
console.log('save', e);
|
||||
|
||||
const message = e.detail;
|
||||
history.messages[message.id] = message;
|
||||
await updateChatById(localStorage.token, chatId, {
|
||||
messages: messages,
|
||||
history: history
|
||||
});
|
||||
}}
|
||||
/>
|
||||
{/key}
|
||||
</div>
|
||||
{/if}
|
||||
{/each}
|
||||
{/key}
|
||||
</div>
|
||||
</div>
|
||||
26
src/lib/components/chat/Messages/Error.svelte
Normal file
26
src/lib/components/chat/Messages/Error.svelte
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
<script lang="ts">
|
||||
export let content = '';
|
||||
</script>
|
||||
|
||||
<div
|
||||
class="flex mt-2 mb-4 space-x-2 border px-4 py-3 border-red-800 bg-red-800/30 font-medium rounded-lg"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="w-5 h-5 self-center"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z"
|
||||
/>
|
||||
</svg>
|
||||
|
||||
<div class=" self-center">
|
||||
{content}
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
<script lang="ts">
|
||||
import Image from '$lib/components/common/Image.svelte';
|
||||
import CodeBlock from './CodeBlock.svelte';
|
||||
|
||||
/* The html content of the tag */
|
||||
export let html; //: string;
|
||||
let parsedHTML = [html];
|
||||
|
||||
export let images;
|
||||
export let codes;
|
||||
|
||||
// all images are in {{IMAGE_0}}, {{IMAGE_1}}.... format
|
||||
// all codes are in {{CODE_0}}, {{CODE_1}}.... format
|
||||
|
||||
const rules = [];
|
||||
rules.forEach((rule) => {
|
||||
parsedHTML = parsedHTML.map((substr) => substr.split(rule.regex)).flat();
|
||||
});
|
||||
</script>
|
||||
|
||||
{#each parsedHTML as part}
|
||||
{@const match = rules.find((rule) => rule.regex.test(part))}
|
||||
{#if match}
|
||||
<svelte:component this={match.component} {...match.props}>
|
||||
{@html part}
|
||||
</svelte:component>
|
||||
{:else}
|
||||
{@html part}
|
||||
{/if}
|
||||
{/each}
|
||||
32
src/lib/components/chat/Messages/Markdown.svelte
Normal file
32
src/lib/components/chat/Messages/Markdown.svelte
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
<script>
|
||||
import { marked } from 'marked';
|
||||
import markedKatex from '$lib/utils/marked/katex-extension';
|
||||
import { replaceTokens, processResponseContent } from '$lib/utils';
|
||||
import { user } from '$lib/stores';
|
||||
|
||||
import MarkdownTokens from './Markdown/MarkdownTokens.svelte';
|
||||
|
||||
export let id;
|
||||
export let content;
|
||||
export let model = null;
|
||||
|
||||
let tokens = [];
|
||||
|
||||
const options = {
|
||||
throwOnError: false
|
||||
};
|
||||
|
||||
marked.use(markedKatex(options));
|
||||
|
||||
$: (async () => {
|
||||
if (content) {
|
||||
tokens = marked.lexer(
|
||||
replaceTokens(processResponseContent(content), model?.name, $user?.name)
|
||||
);
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
|
||||
{#key id}
|
||||
<MarkdownTokens {tokens} {id} />
|
||||
{/key}
|
||||
|
|
@ -1,10 +1,12 @@
|
|||
<script lang="ts">
|
||||
import DOMPurify from 'dompurify';
|
||||
import type { Token } from 'marked';
|
||||
import { revertSanitizedResponseContent, unescapeHtml } from '$lib/utils';
|
||||
import { onMount } from 'svelte';
|
||||
import Image from '$lib/components/common/Image.svelte';
|
||||
|
||||
import KatexRenderer from './KatexRenderer.svelte';
|
||||
import { WEBUI_BASE_URL } from '$lib/constants';
|
||||
|
||||
export let id: string;
|
||||
export let tokens: Token[];
|
||||
|
|
@ -14,7 +16,14 @@
|
|||
{#if token.type === 'escape'}
|
||||
{unescapeHtml(token.text)}
|
||||
{:else if token.type === 'html'}
|
||||
{@html token.text}
|
||||
{@const html = DOMPurify.sanitize(token.text)}
|
||||
{#if html && html.includes('<video')}
|
||||
{@html html}
|
||||
{:else if token.text.includes(`<iframe src="${WEBUI_BASE_URL}/api/v1/files/`)}
|
||||
{@html `${token.text}`}
|
||||
{:else}
|
||||
{token.text}
|
||||
{/if}
|
||||
{:else if token.type === 'link'}
|
||||
<a href={token.href} target="_blank" rel="nofollow" title={token.title}>{token.text}</a>
|
||||
{:else if token.type === 'image'}
|
||||
|
|
@ -28,7 +37,7 @@
|
|||
<svelte:self id={`${id}-em`} tokens={token.tokens} />
|
||||
</em>
|
||||
{:else if token.type === 'codespan'}
|
||||
<code class="codespan">{revertSanitizedResponseContent(token.raw)}</code>
|
||||
<code class="codespan">{unescapeHtml(token.text)}</code>
|
||||
{:else if token.type === 'br'}
|
||||
<br />
|
||||
{:else if token.type === 'del'}
|
||||
|
|
@ -39,6 +48,14 @@
|
|||
{#if token.text}
|
||||
<KatexRenderer content={revertSanitizedResponseContent(token.text)} displayMode={false} />
|
||||
{/if}
|
||||
{:else if token.type === 'iframe'}
|
||||
<iframe
|
||||
src="{WEBUI_BASE_URL}/api/v1/files/{token.fileId}/content"
|
||||
title={token.fileId}
|
||||
width="100%"
|
||||
frameborder="0"
|
||||
onload="this.style.height=(this.contentWindow.document.body.scrollHeight+20)+'px';"
|
||||
></iframe>
|
||||
{:else if token.type === 'text'}
|
||||
{token.raw}
|
||||
{/if}
|
||||
|
|
@ -1,11 +1,13 @@
|
|||
<script lang="ts">
|
||||
import DOMPurify from 'dompurify';
|
||||
import { onMount } from 'svelte';
|
||||
import type { Token } from 'marked';
|
||||
import { marked, type Token } from 'marked';
|
||||
import { revertSanitizedResponseContent, unescapeHtml } from '$lib/utils';
|
||||
|
||||
import CodeBlock from '$lib/components/chat/Messages/CodeBlock.svelte';
|
||||
import MarkdownInlineTokens from '$lib/components/chat/Messages/MarkdownInlineTokens.svelte';
|
||||
import MarkdownInlineTokens from '$lib/components/chat/Messages/Markdown/MarkdownInlineTokens.svelte';
|
||||
import KatexRenderer from './KatexRenderer.svelte';
|
||||
import { WEBUI_BASE_URL } from '$lib/constants';
|
||||
|
||||
export let id: string;
|
||||
export let tokens: Token[];
|
||||
|
|
@ -91,7 +93,22 @@
|
|||
</ul>
|
||||
{/if}
|
||||
{:else if token.type === 'html'}
|
||||
{@html token.text}
|
||||
{@const html = DOMPurify.sanitize(token.text)}
|
||||
{#if html && html.includes('<video')}
|
||||
{@html html}
|
||||
{:else if token.text.includes(`<iframe src="${WEBUI_BASE_URL}/api/v1/files/`)}
|
||||
{@html `${token.text}`}
|
||||
{:else}
|
||||
{token.text}
|
||||
{/if}
|
||||
{:else if token.type === 'iframe'}
|
||||
<iframe
|
||||
src="{WEBUI_BASE_URL}/api/v1/files/{token.fileId}/content"
|
||||
title={token.fileId}
|
||||
width="100%"
|
||||
frameborder="0"
|
||||
onload="this.style.height=(this.contentWindow.document.body.scrollHeight+20)+'px';"
|
||||
></iframe>
|
||||
{:else if token.type === 'paragraph'}
|
||||
<p>
|
||||
<MarkdownInlineTokens id={`${id}-${tokenIdx}-p`} tokens={token.tokens ?? []} />
|
||||
261
src/lib/components/chat/Messages/MultiResponseMessages.svelte
Normal file
261
src/lib/components/chat/Messages/MultiResponseMessages.svelte
Normal file
|
|
@ -0,0 +1,261 @@
|
|||
<script lang="ts">
|
||||
import dayjs from 'dayjs';
|
||||
import { onMount, tick, getContext } from 'svelte';
|
||||
import { createEventDispatcher } from 'svelte';
|
||||
|
||||
import { mobile, settings } from '$lib/stores';
|
||||
|
||||
import { generateMoACompletion } from '$lib/apis';
|
||||
import { updateChatById } from '$lib/apis/chats';
|
||||
import { createOpenAITextStream } from '$lib/apis/streaming';
|
||||
|
||||
import ResponseMessage from './ResponseMessage.svelte';
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
import Merge from '$lib/components/icons/Merge.svelte';
|
||||
|
||||
import Markdown from './Markdown.svelte';
|
||||
import Name from './Name.svelte';
|
||||
import Skeleton from './Skeleton.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let chatId;
|
||||
|
||||
export let history;
|
||||
export let messages = [];
|
||||
export let messageIdx;
|
||||
|
||||
export let parentMessage;
|
||||
export let isLastMessage;
|
||||
|
||||
export let readOnly = false;
|
||||
|
||||
export let updateChatMessages: Function;
|
||||
export let confirmEditResponseMessage: Function;
|
||||
export let rateMessage: Function;
|
||||
|
||||
export let copyToClipboard: Function;
|
||||
export let continueGeneration: Function;
|
||||
export let mergeResponses: Function;
|
||||
export let regenerateResponse: Function;
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
let currentMessageId;
|
||||
let groupedMessages = {};
|
||||
let groupedMessagesIdx = {};
|
||||
|
||||
$: if (parentMessage) {
|
||||
initHandler();
|
||||
}
|
||||
|
||||
const showPreviousMessage = (modelIdx) => {
|
||||
groupedMessagesIdx[modelIdx] = Math.max(0, groupedMessagesIdx[modelIdx] - 1);
|
||||
let messageId = groupedMessages[modelIdx].messages[groupedMessagesIdx[modelIdx]].id;
|
||||
|
||||
console.log(messageId);
|
||||
let messageChildrenIds = history.messages[messageId].childrenIds;
|
||||
|
||||
while (messageChildrenIds.length !== 0) {
|
||||
messageId = messageChildrenIds.at(-1);
|
||||
messageChildrenIds = history.messages[messageId].childrenIds;
|
||||
}
|
||||
|
||||
history.currentId = messageId;
|
||||
dispatch('change');
|
||||
};
|
||||
|
||||
const showNextMessage = (modelIdx) => {
|
||||
groupedMessagesIdx[modelIdx] = Math.min(
|
||||
groupedMessages[modelIdx].messages.length - 1,
|
||||
groupedMessagesIdx[modelIdx] + 1
|
||||
);
|
||||
|
||||
let messageId = groupedMessages[modelIdx].messages[groupedMessagesIdx[modelIdx]].id;
|
||||
console.log(messageId);
|
||||
|
||||
let messageChildrenIds = history.messages[messageId].childrenIds;
|
||||
|
||||
while (messageChildrenIds.length !== 0) {
|
||||
messageId = messageChildrenIds.at(-1);
|
||||
messageChildrenIds = history.messages[messageId].childrenIds;
|
||||
}
|
||||
|
||||
history.currentId = messageId;
|
||||
dispatch('change');
|
||||
};
|
||||
|
||||
const initHandler = async () => {
|
||||
await tick();
|
||||
currentMessageId = messages[messageIdx].id;
|
||||
|
||||
groupedMessages = parentMessage?.models.reduce((a, model, modelIdx) => {
|
||||
// Find all messages that are children of the parent message and have the same model
|
||||
const modelMessages = parentMessage?.childrenIds
|
||||
.map((id) => history.messages[id])
|
||||
.filter((m) => m.modelIdx === modelIdx);
|
||||
|
||||
return {
|
||||
...a,
|
||||
[modelIdx]: { messages: modelMessages }
|
||||
};
|
||||
}, {});
|
||||
|
||||
groupedMessagesIdx = parentMessage?.models.reduce((a, model, modelIdx) => {
|
||||
const idx = groupedMessages[modelIdx].messages.findIndex((m) => m.id === currentMessageId);
|
||||
if (idx !== -1) {
|
||||
return {
|
||||
...a,
|
||||
[modelIdx]: idx
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
...a,
|
||||
[modelIdx]: 0
|
||||
};
|
||||
}
|
||||
}, {});
|
||||
};
|
||||
|
||||
const mergeResponsesHandler = async () => {
|
||||
const responses = Object.keys(groupedMessages).map((modelIdx) => {
|
||||
const { messages } = groupedMessages[modelIdx];
|
||||
return messages[groupedMessagesIdx[modelIdx]].content;
|
||||
});
|
||||
mergeResponses(currentMessageId, responses, chatId);
|
||||
};
|
||||
|
||||
onMount(async () => {
|
||||
initHandler();
|
||||
});
|
||||
</script>
|
||||
|
||||
<div>
|
||||
<div
|
||||
class="flex snap-x snap-mandatory overflow-x-auto scrollbar-hidden"
|
||||
id="responses-container-{chatId}-{parentMessage.id}"
|
||||
>
|
||||
{#key currentMessageId}
|
||||
{#each Object.keys(groupedMessages) as modelIdx}
|
||||
{#if groupedMessagesIdx[modelIdx] !== undefined && groupedMessages[modelIdx].messages.length > 0}
|
||||
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
||||
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||
{@const message = groupedMessages[modelIdx].messages[groupedMessagesIdx[modelIdx]]}
|
||||
|
||||
<div
|
||||
class=" snap-center w-full max-w-full m-1 border {history.messages[currentMessageId]
|
||||
?.modelIdx == modelIdx
|
||||
? `border-gray-100 dark:border-gray-800 border-[1.5px] ${
|
||||
$mobile ? 'min-w-full' : 'min-w-[32rem]'
|
||||
}`
|
||||
: `border-gray-50 dark:border-gray-850 border-dashed ${
|
||||
$mobile ? 'min-w-full' : 'min-w-80'
|
||||
}`} transition-all p-5 rounded-2xl"
|
||||
on:click={() => {
|
||||
if (currentMessageId != message.id) {
|
||||
currentMessageId = message.id;
|
||||
let messageId = message.id;
|
||||
console.log(messageId);
|
||||
//
|
||||
let messageChildrenIds = history.messages[messageId].childrenIds;
|
||||
while (messageChildrenIds.length !== 0) {
|
||||
messageId = messageChildrenIds.at(-1);
|
||||
messageChildrenIds = history.messages[messageId].childrenIds;
|
||||
}
|
||||
history.currentId = messageId;
|
||||
dispatch('change');
|
||||
}
|
||||
}}
|
||||
>
|
||||
{#key history.currentId}
|
||||
{#if message}
|
||||
<ResponseMessage
|
||||
{message}
|
||||
siblings={groupedMessages[modelIdx].messages.map((m) => m.id)}
|
||||
isLastMessage={true}
|
||||
{updateChatMessages}
|
||||
{confirmEditResponseMessage}
|
||||
showPreviousMessage={() => showPreviousMessage(modelIdx)}
|
||||
showNextMessage={() => showNextMessage(modelIdx)}
|
||||
{readOnly}
|
||||
{rateMessage}
|
||||
{copyToClipboard}
|
||||
{continueGeneration}
|
||||
regenerateResponse={async (message) => {
|
||||
regenerateResponse(message);
|
||||
await tick();
|
||||
groupedMessagesIdx[modelIdx] = groupedMessages[modelIdx].messages.length - 1;
|
||||
}}
|
||||
on:save={async (e) => {
|
||||
console.log('save', e);
|
||||
|
||||
const message = e.detail;
|
||||
history.messages[message.id] = message;
|
||||
await updateChatById(localStorage.token, chatId, {
|
||||
messages: messages,
|
||||
history: history
|
||||
});
|
||||
}}
|
||||
/>
|
||||
{/if}
|
||||
{/key}
|
||||
</div>
|
||||
{/if}
|
||||
{/each}
|
||||
{/key}
|
||||
</div>
|
||||
|
||||
{#if !readOnly && isLastMessage}
|
||||
{#if !Object.keys(groupedMessages).find((modelIdx) => {
|
||||
const { messages } = groupedMessages[modelIdx];
|
||||
return !messages[groupedMessagesIdx[modelIdx]].done;
|
||||
})}
|
||||
<div class="flex justify-end">
|
||||
<div class="w-full">
|
||||
{#if history.messages[currentMessageId]?.merged?.status}
|
||||
{@const message = history.messages[currentMessageId]?.merged}
|
||||
|
||||
<div class="w-full rounded-xl pl-5 pr-2 py-2">
|
||||
<Name>
|
||||
Merged Response
|
||||
|
||||
{#if message.timestamp}
|
||||
<span
|
||||
class=" self-center invisible group-hover:visible text-gray-400 text-xs font-medium uppercase ml-0.5 -mt-0.5"
|
||||
>
|
||||
{dayjs(message.timestamp * 1000).format($i18n.t('h:mm a'))}
|
||||
</span>
|
||||
{/if}
|
||||
</Name>
|
||||
|
||||
<div class="mt-1 markdown-prose w-full min-w-full">
|
||||
{#if (message?.content ?? '') === ''}
|
||||
<Skeleton />
|
||||
{:else}
|
||||
<Markdown id={`merged`} content={message.content ?? ''} />
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class=" flex-shrink-0 text-gray-600 dark:text-gray-500 mt-1">
|
||||
<Tooltip content={$i18n.t('Merge Responses')} placement="bottom">
|
||||
<button
|
||||
type="button"
|
||||
id="merge-response-button"
|
||||
class="{true
|
||||
? 'visible'
|
||||
: 'invisible group-hover:visible'} p-1 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button"
|
||||
on:click={() => {
|
||||
mergeResponsesHandler();
|
||||
}}
|
||||
>
|
||||
<Merge className=" size-5 " />
|
||||
</button>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
</div>
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
import { WEBUI_BASE_URL } from '$lib/constants';
|
||||
import { marked } from 'marked';
|
||||
|
||||
import { config, user, models as _models } from '$lib/stores';
|
||||
import { config, user, models as _models, temporaryChatEnabled } from '$lib/stores';
|
||||
import { onMount, getContext } from 'svelte';
|
||||
|
||||
import { blur, fade } from 'svelte/transition';
|
||||
|
|
@ -10,6 +10,7 @@
|
|||
import Suggestions from '../MessageInput/Suggestions.svelte';
|
||||
import { sanitizeResponseContent } from '$lib/utils';
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
import EyeSlash from '$lib/components/icons/EyeSlash.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
|
|
@ -64,6 +65,18 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
{#if $temporaryChatEnabled}
|
||||
<Tooltip
|
||||
content="This chat won't appear in history and your messages will not be saved."
|
||||
className="w-fit"
|
||||
placement="top-start"
|
||||
>
|
||||
<div class="flex items-center gap-2 text-gray-500 font-medium text-lg my-2 w-fit">
|
||||
<EyeSlash strokeWidth="2.5" className="size-5" /> Temporary Chat
|
||||
</div>
|
||||
</Tooltip>
|
||||
{/if}
|
||||
|
||||
<div
|
||||
class=" mt-2 mb-4 text-3xl text-gray-800 dark:text-gray-100 font-semibold text-left flex items-center gap-4 font-primary"
|
||||
>
|
||||
|
|
@ -113,7 +126,8 @@
|
|||
<div class=" w-full font-primary" in:fade={{ duration: 200, delay: 300 }}>
|
||||
<Suggestions
|
||||
suggestionPrompts={models[selectedModelIdx]?.info?.meta?.suggestion_prompts ??
|
||||
$config.default_prompt_suggestions}
|
||||
$config?.default_prompt_suggestions ??
|
||||
[]}
|
||||
{submitPrompt}
|
||||
/>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -57,7 +57,10 @@
|
|||
message.annotation.reason = selectedReason;
|
||||
message.annotation.comment = comment;
|
||||
|
||||
dispatch('submit');
|
||||
dispatch('submit', {
|
||||
reason: selectedReason,
|
||||
comment: comment
|
||||
});
|
||||
|
||||
toast.success($i18n.t('Thanks for your feedback!'));
|
||||
show = false;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
<script lang="ts">
|
||||
import { toast } from 'svelte-sonner';
|
||||
import dayjs from 'dayjs';
|
||||
import { marked } from 'marked';
|
||||
|
||||
import { fade } from 'svelte/transition';
|
||||
import { createEventDispatcher } from 'svelte';
|
||||
|
|
@ -18,8 +17,7 @@
|
|||
approximateToHumanReadable,
|
||||
extractSentences,
|
||||
replaceTokens,
|
||||
revertSanitizedResponseContent,
|
||||
sanitizeResponseContent
|
||||
processResponseContent
|
||||
} from '$lib/utils';
|
||||
import { WEBUI_BASE_URL } from '$lib/constants';
|
||||
|
||||
|
|
@ -34,7 +32,9 @@
|
|||
import Spinner from '$lib/components/common/Spinner.svelte';
|
||||
import WebSearchResults from './ResponseMessage/WebSearchResults.svelte';
|
||||
import Sparkles from '$lib/components/icons/Sparkles.svelte';
|
||||
import MarkdownTokens from './MarkdownTokens.svelte';
|
||||
import Markdown from './Markdown.svelte';
|
||||
import Error from './Error.svelte';
|
||||
import Citations from './Citations.svelte';
|
||||
|
||||
export let message;
|
||||
export let siblings;
|
||||
|
|
@ -59,7 +59,6 @@
|
|||
let edit = false;
|
||||
let editedContent = '';
|
||||
let editTextAreaElement: HTMLTextAreaElement;
|
||||
let tooltipInstance = null;
|
||||
|
||||
let sentencesAudio = {};
|
||||
let speaking = null;
|
||||
|
|
@ -69,29 +68,6 @@
|
|||
let generatingImage = false;
|
||||
|
||||
let showRateComment = false;
|
||||
let showCitationModal = false;
|
||||
|
||||
let selectedCitation = null;
|
||||
|
||||
let tokens;
|
||||
|
||||
import 'katex/dist/katex.min.css';
|
||||
|
||||
import markedKatex from '$lib/utils/katex-extension';
|
||||
|
||||
const options = {
|
||||
throwOnError: false
|
||||
};
|
||||
|
||||
marked.use(markedKatex(options));
|
||||
|
||||
$: (async () => {
|
||||
if (message?.content) {
|
||||
tokens = marked.lexer(
|
||||
replaceTokens(sanitizeResponseContent(message?.content), model?.name, $user?.name)
|
||||
);
|
||||
}
|
||||
})();
|
||||
|
||||
const playAudio = (idx) => {
|
||||
return new Promise((res) => {
|
||||
|
|
@ -284,8 +260,6 @@
|
|||
});
|
||||
</script>
|
||||
|
||||
<CitationsModal bind:show={showCitationModal} citation={selectedCitation} />
|
||||
|
||||
{#key message.id}
|
||||
<div
|
||||
class=" flex w-full message-{message.id}"
|
||||
|
|
@ -303,7 +277,7 @@
|
|||
|
||||
{#if message.timestamp}
|
||||
<span
|
||||
class=" self-center invisible group-hover:visible text-gray-400 text-xs font-medium uppercase"
|
||||
class=" self-center invisible group-hover:visible text-gray-400 text-xs font-medium uppercase ml-0.5 -mt-0.5"
|
||||
>
|
||||
{dayjs(message.timestamp * 1000).format($i18n.t('h:mm a'))}
|
||||
</span>
|
||||
|
|
@ -323,9 +297,7 @@
|
|||
</div>
|
||||
{/if}
|
||||
|
||||
<div
|
||||
class="prose chat-{message.role} w-full max-w-full dark:prose-invert prose-p:my-0 prose-img:my-1 prose-headings:my-1 prose-pre:my-0 prose-table:my-0 prose-blockquote:my-0 prose-ul:-my-0 prose-ol:-my-0 prose-li:-my-0 whitespace-pre-line"
|
||||
>
|
||||
<div class="chat-{message.role} w-full min-w-full markdown-prose">
|
||||
<div>
|
||||
{#if (message?.statusHistory ?? [...(message?.status ? [message?.status] : [])]).length > 0}
|
||||
{@const status = (
|
||||
|
|
@ -410,82 +382,15 @@
|
|||
{:else if message.content && message.error !== true}
|
||||
<!-- always show message contents even if there's an error -->
|
||||
<!-- unless message.error === true which is legacy error handling, where the error message is stored in message.content -->
|
||||
{#key message.id}
|
||||
<MarkdownTokens id={message.id} {tokens} />
|
||||
{/key}
|
||||
<Markdown id={message.id} content={message.content} {model} />
|
||||
{/if}
|
||||
|
||||
{#if message.error}
|
||||
<div
|
||||
class="flex mt-2 mb-4 space-x-2 border px-4 py-3 border-red-800 bg-red-800/30 font-medium rounded-lg"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="w-5 h-5 self-center"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z"
|
||||
/>
|
||||
</svg>
|
||||
|
||||
<div class=" self-center">
|
||||
{message?.error?.content ?? message.content}
|
||||
</div>
|
||||
</div>
|
||||
<Error content={message?.error?.content ?? message.content} />
|
||||
{/if}
|
||||
|
||||
{#if message.citations}
|
||||
<div class="mt-1 mb-2 w-full flex gap-1 items-center flex-wrap">
|
||||
{#each message.citations.reduce((acc, citation) => {
|
||||
citation.document.forEach((document, index) => {
|
||||
const metadata = citation.metadata?.[index];
|
||||
const id = metadata?.source ?? 'N/A';
|
||||
let source = citation?.source;
|
||||
|
||||
if (metadata?.name) {
|
||||
source = { ...source, name: metadata.name };
|
||||
}
|
||||
|
||||
// Check if ID looks like a URL
|
||||
if (id.startsWith('http://') || id.startsWith('https://')) {
|
||||
source = { name: id };
|
||||
}
|
||||
|
||||
const existingSource = acc.find((item) => item.id === id);
|
||||
|
||||
if (existingSource) {
|
||||
existingSource.document.push(document);
|
||||
existingSource.metadata.push(metadata);
|
||||
} else {
|
||||
acc.push( { id: id, source: source, document: [document], metadata: metadata ? [metadata] : [] } );
|
||||
}
|
||||
});
|
||||
return acc;
|
||||
}, []) as citation, idx}
|
||||
<div class="flex gap-1 text-xs font-semibold">
|
||||
<button
|
||||
class="flex dark:text-gray-300 py-1 px-1 bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-xl"
|
||||
on:click={() => {
|
||||
showCitationModal = true;
|
||||
selectedCitation = citation;
|
||||
}}
|
||||
>
|
||||
<div class="bg-white dark:bg-gray-700 rounded-full size-4">
|
||||
{idx + 1}
|
||||
</div>
|
||||
<div class="flex-1 mx-2 line-clamp-1">
|
||||
{citation.source.name}
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
<Citations citations={message.citations} />
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
|
|
@ -495,7 +400,7 @@
|
|||
{#if !edit}
|
||||
{#if message.done || siblings.length > 1}
|
||||
<div
|
||||
class=" flex justify-start overflow-x-auto buttons text-gray-600 dark:text-gray-500"
|
||||
class=" flex justify-start overflow-x-auto buttons text-gray-600 dark:text-gray-500 mt-0.5"
|
||||
>
|
||||
{#if siblings.length > 1}
|
||||
<div class="flex self-center min-w-fit" dir="ltr">
|
||||
|
|
@ -553,6 +458,7 @@
|
|||
|
||||
{#if message.done}
|
||||
{#if !readOnly}
|
||||
{#if $user.role === 'user' ? ($config?.permissions?.chat?.editing ?? true) : true}
|
||||
<Tooltip content={$i18n.t('Edit')} placement="bottom">
|
||||
<button
|
||||
class="{isLastMessage
|
||||
|
|
@ -579,6 +485,7 @@
|
|||
</button>
|
||||
</Tooltip>
|
||||
{/if}
|
||||
{/if}
|
||||
|
||||
<Tooltip content={$i18n.t('Copy')} placement="bottom">
|
||||
<button
|
||||
|
|
@ -814,6 +721,7 @@
|
|||
{/if}
|
||||
|
||||
{#if !readOnly}
|
||||
{#if $config?.features.enable_message_rating ?? true}
|
||||
<Tooltip content={$i18n.t('Good Response')} placement="bottom">
|
||||
<button
|
||||
class="{isLastMessage
|
||||
|
|
@ -822,10 +730,24 @@
|
|||
?.annotation?.rating ?? null) === 1
|
||||
? 'bg-gray-100 dark:bg-gray-800'
|
||||
: ''} dark:hover:text-white hover:text-black transition"
|
||||
on:click={() => {
|
||||
rateMessage(message.id, 1);
|
||||
showRateComment = true;
|
||||
on:click={async () => {
|
||||
await rateMessage(message.id, 1);
|
||||
|
||||
(model?.actions ?? [])
|
||||
.filter((action) => action?.__webui__ ?? false)
|
||||
.forEach((action) => {
|
||||
dispatch('action', {
|
||||
id: action.id,
|
||||
event: {
|
||||
id: 'good-response',
|
||||
data: {
|
||||
messageId: message.id
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
showRateComment = true;
|
||||
window.setTimeout(() => {
|
||||
document
|
||||
.getElementById(`message-feedback-${message.id}`)
|
||||
|
|
@ -857,8 +779,23 @@
|
|||
?.annotation?.rating ?? null) === -1
|
||||
? 'bg-gray-100 dark:bg-gray-800'
|
||||
: ''} dark:hover:text-white hover:text-black transition"
|
||||
on:click={() => {
|
||||
rateMessage(message.id, -1);
|
||||
on:click={async () => {
|
||||
await rateMessage(message.id, -1);
|
||||
|
||||
(model?.actions ?? [])
|
||||
.filter((action) => action?.__webui__ ?? false)
|
||||
.forEach((action) => {
|
||||
dispatch('action', {
|
||||
id: action.id,
|
||||
event: {
|
||||
id: 'bad-response',
|
||||
data: {
|
||||
messageId: message.id
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
showRateComment = true;
|
||||
window.setTimeout(() => {
|
||||
document
|
||||
|
|
@ -882,16 +819,32 @@
|
|||
>
|
||||
</button>
|
||||
</Tooltip>
|
||||
{/if}
|
||||
|
||||
{#if isLastMessage}
|
||||
<Tooltip content={$i18n.t('Continue Response')} placement="bottom">
|
||||
<button
|
||||
type="button"
|
||||
id="continue-response-button"
|
||||
class="{isLastMessage
|
||||
? 'visible'
|
||||
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button"
|
||||
on:click={() => {
|
||||
continueGeneration();
|
||||
|
||||
(model?.actions ?? [])
|
||||
.filter((action) => action?.__webui__ ?? false)
|
||||
.forEach((action) => {
|
||||
dispatch('action', {
|
||||
id: action.id,
|
||||
event: {
|
||||
id: 'continue-response',
|
||||
data: {
|
||||
messageId: message.id
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
|
|
@ -925,6 +878,20 @@
|
|||
on:click={() => {
|
||||
showRateComment = false;
|
||||
regenerateResponse(message);
|
||||
|
||||
(model?.actions ?? [])
|
||||
.filter((action) => action?.__webui__ ?? false)
|
||||
.forEach((action) => {
|
||||
dispatch('action', {
|
||||
id: action.id,
|
||||
event: {
|
||||
id: 'regenerate-response',
|
||||
data: {
|
||||
messageId: message.id
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
|
|
@ -944,7 +911,7 @@
|
|||
</button>
|
||||
</Tooltip>
|
||||
|
||||
{#each model?.actions ?? [] as action}
|
||||
{#each (model?.actions ?? []).filter((action) => !(action?.__webui__ ?? false)) as action}
|
||||
<Tooltip content={action.name} placement="bottom">
|
||||
<button
|
||||
type="button"
|
||||
|
|
@ -981,8 +948,24 @@
|
|||
messageId={message.id}
|
||||
bind:show={showRateComment}
|
||||
bind:message
|
||||
on:submit={() => {
|
||||
on:submit={(e) => {
|
||||
updateChatMessages();
|
||||
|
||||
(model?.actions ?? [])
|
||||
.filter((action) => action?.__webui__ ?? false)
|
||||
.forEach((action) => {
|
||||
dispatch('action', {
|
||||
id: action.id,
|
||||
event: {
|
||||
id: 'rate-comment',
|
||||
data: {
|
||||
messageId: message.id,
|
||||
comment: e.detail.comment,
|
||||
reason: e.detail.reason
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}}
|
||||
/>
|
||||
{/if}
|
||||
|
|
|
|||
|
|
@ -10,6 +10,10 @@
|
|||
import { user as _user } from '$lib/stores';
|
||||
import { getFileContentById } from '$lib/apis/files';
|
||||
import FileItem from '$lib/components/common/FileItem.svelte';
|
||||
import { marked } from 'marked';
|
||||
import { processResponseContent, replaceTokens } from '$lib/utils';
|
||||
import MarkdownTokens from './Markdown/MarkdownTokens.svelte';
|
||||
import Markdown from './Markdown.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
|
|
@ -41,8 +45,8 @@
|
|||
messageEditTextAreaElement?.focus();
|
||||
};
|
||||
|
||||
const editMessageConfirmHandler = async () => {
|
||||
confirmEditMessage(message.id, editedContent);
|
||||
const editMessageConfirmHandler = async (submit = true) => {
|
||||
confirmEditMessage(message.id, editedContent, submit);
|
||||
|
||||
edit = false;
|
||||
editedContent = '';
|
||||
|
|
@ -81,7 +85,7 @@
|
|||
|
||||
{#if message.timestamp}
|
||||
<span
|
||||
class=" invisible group-hover:visible text-gray-400 text-xs font-medium uppercase"
|
||||
class=" invisible group-hover:visible text-gray-400 text-xs font-medium uppercase ml-0.5 -mt-0.5"
|
||||
>
|
||||
{dayjs(message.timestamp * 1000).format($i18n.t('h:mm a'))}
|
||||
</span>
|
||||
|
|
@ -90,9 +94,7 @@
|
|||
</div>
|
||||
{/if}
|
||||
|
||||
<div
|
||||
class="prose chat-{message.role} w-full max-w-full flex flex-col justify-end dark:prose-invert prose-headings:my-0 prose-p:my-0 prose-p:-mb-4 prose-pre:my-0 prose-table:my-0 prose-blockquote:my-0 prose-img:my-0 prose-ul:-my-4 prose-ol:-my-4 prose-li:-my-3 prose-ul:-mb-6 prose-ol:-mb-6 prose-li:-mb-4 whitespace-pre-line"
|
||||
>
|
||||
<div class="chat-{message.role} w-full min-w-full markdown-prose">
|
||||
{#if message.files}
|
||||
<div class="mt-2.5 mb-1 w-full flex flex-col justify-end overflow-x-auto gap-1 flex-wrap">
|
||||
{#each message.files as file}
|
||||
|
|
@ -133,12 +135,25 @@
|
|||
const isEnterPressed = e.key === 'Enter';
|
||||
|
||||
if (isCmdOrCtrlPressed && isEnterPressed) {
|
||||
document.getElementById('save-edit-message-button')?.click();
|
||||
document.getElementById('confirm-edit-message-button')?.click();
|
||||
}
|
||||
}}
|
||||
/>
|
||||
|
||||
<div class=" mt-2 mb-1 flex justify-end space-x-1.5 text-sm font-medium">
|
||||
<div class=" mt-2 mb-1 flex justify-between text-sm font-medium">
|
||||
<div>
|
||||
<button
|
||||
id="save-edit-message-button"
|
||||
class=" px-4 py-2 bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 border dark:border-gray-700 text-gray-700 dark:text-gray-200 transition rounded-3xl"
|
||||
on:click={() => {
|
||||
editMessageConfirmHandler(false);
|
||||
}}
|
||||
>
|
||||
{$i18n.t('Save')}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="flex space-x-1.5">
|
||||
<button
|
||||
id="close-edit-message-button"
|
||||
class="px-4 py-2 bg-white dark:bg-gray-900 hover:bg-gray-100 text-gray-800 dark:text-gray-100 transition rounded-3xl"
|
||||
|
|
@ -150,7 +165,7 @@
|
|||
</button>
|
||||
|
||||
<button
|
||||
id="save-edit-message-button"
|
||||
id="confirm-edit-message-button"
|
||||
class=" px-4 py-2 bg-gray-900 dark:bg-white hover:bg-gray-850 text-gray-100 dark:text-gray-800 transition rounded-3xl"
|
||||
on:click={() => {
|
||||
editMessageConfirmHandler();
|
||||
|
|
@ -160,17 +175,20 @@
|
|||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{:else}
|
||||
<div class="w-full">
|
||||
<div class="flex {($settings?.chatBubble ?? true) ? 'justify-end' : ''} mb-2">
|
||||
<div class="flex {($settings?.chatBubble ?? true) ? 'justify-end pb-1' : 'w-full'}">
|
||||
<div
|
||||
class="rounded-3xl {($settings?.chatBubble ?? true)
|
||||
? `max-w-[90%] px-5 py-2 bg-gray-50 dark:bg-gray-850 ${
|
||||
message.files ? 'rounded-tr-lg' : ''
|
||||
}`
|
||||
: ''} "
|
||||
: ' w-full'}"
|
||||
>
|
||||
<pre id="user-message">{message.content}</pre>
|
||||
{#if message.content}
|
||||
<Markdown id={message.id} content={message.content} />
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<script lang="ts">
|
||||
import { models, showSettings, settings, user, mobile } from '$lib/stores';
|
||||
import { models, showSettings, settings, user, mobile, config } from '$lib/stores';
|
||||
import { onMount, tick, getContext } from 'svelte';
|
||||
import { toast } from 'svelte-sonner';
|
||||
import Selector from './ModelSelector/Selector.svelte';
|
||||
|
|
@ -46,6 +46,9 @@
|
|||
label: model.name,
|
||||
model: model
|
||||
}))}
|
||||
showTemporaryChatControl={$user.role === 'user'
|
||||
? ($config?.permissions?.chat?.temporary ?? true)
|
||||
: true}
|
||||
bind:value={selectedModel}
|
||||
/>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -12,12 +12,15 @@
|
|||
|
||||
import { deleteModel, getOllamaVersion, pullModel } from '$lib/apis/ollama';
|
||||
|
||||
import { user, MODEL_DOWNLOAD_POOL, models, mobile } from '$lib/stores';
|
||||
import { user, MODEL_DOWNLOAD_POOL, models, mobile, temporaryChatEnabled } from '$lib/stores';
|
||||
import { toast } from 'svelte-sonner';
|
||||
import { capitalizeFirstLetter, sanitizeResponseContent, splitStream } from '$lib/utils';
|
||||
import { getModels } from '$lib/apis';
|
||||
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
import Switch from '$lib/components/common/Switch.svelte';
|
||||
import ChatBubbleOval from '$lib/components/icons/ChatBubbleOval.svelte';
|
||||
import { goto } from '$app/navigation';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
const dispatch = createEventDispatcher();
|
||||
|
|
@ -27,12 +30,15 @@
|
|||
export let searchEnabled = true;
|
||||
export let searchPlaceholder = $i18n.t('Search a model');
|
||||
|
||||
export let showTemporaryChatControl = false;
|
||||
|
||||
export let items: {
|
||||
label: string;
|
||||
value: string;
|
||||
model: Model;
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
[key: string]: any;
|
||||
} = [];
|
||||
}[] = [];
|
||||
|
||||
export let className = 'w-[32rem]';
|
||||
|
||||
|
|
@ -59,7 +65,8 @@
|
|||
return _item;
|
||||
}),
|
||||
{
|
||||
keys: ['value', 'label', 'tags', 'desc', 'modelName']
|
||||
keys: ['value', 'tags', 'modelName'],
|
||||
threshold: 0.3
|
||||
}
|
||||
);
|
||||
|
||||
|
|
@ -513,6 +520,35 @@
|
|||
{/each}
|
||||
</div>
|
||||
|
||||
{#if showTemporaryChatControl}
|
||||
<hr class="border-gray-100 dark:border-gray-800" />
|
||||
|
||||
<div class="flex items-center mx-2 my-2">
|
||||
<button
|
||||
class="flex justify-between w-full font-medium line-clamp-1 select-none items-center rounded-button py-2 px-3 text-sm text-gray-700 dark:text-gray-100 outline-none transition-all duration-75 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg cursor-pointer data-[highlighted]:bg-muted"
|
||||
on:click={async () => {
|
||||
temporaryChatEnabled.set(!$temporaryChatEnabled);
|
||||
await goto('/');
|
||||
const newChatButton = document.getElementById('new-chat-button');
|
||||
setTimeout(() => {
|
||||
newChatButton?.click();
|
||||
}, 0);
|
||||
show = false;
|
||||
}}
|
||||
>
|
||||
<div class="flex gap-2.5 items-center">
|
||||
<ChatBubbleOval className="size-4" strokeWidth="2.5" />
|
||||
|
||||
{$i18n.t(`Temporary Chat`)}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<Switch state={$temporaryChatEnabled} />
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class="hidden w-[42rem]" />
|
||||
<div class="hidden w-[32rem]" />
|
||||
</slot>
|
||||
|
|
|
|||
|
|
@ -20,8 +20,8 @@
|
|||
const i18n = getContext('i18n');
|
||||
|
||||
export let saveSettings: Function;
|
||||
|
||||
// Chats
|
||||
let saveChatHistory = true;
|
||||
let importFiles;
|
||||
|
||||
let showArchiveConfirm = false;
|
||||
|
|
@ -95,82 +95,10 @@
|
|||
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||
scrollPaginationEnabled.set(true);
|
||||
};
|
||||
|
||||
const toggleSaveChatHistory = async () => {
|
||||
saveChatHistory = !saveChatHistory;
|
||||
console.log(saveChatHistory);
|
||||
|
||||
if (saveChatHistory === false) {
|
||||
await goto('/');
|
||||
}
|
||||
saveSettings({ saveChatHistory: saveChatHistory });
|
||||
};
|
||||
|
||||
onMount(async () => {
|
||||
saveChatHistory = $settings.saveChatHistory ?? true;
|
||||
});
|
||||
</script>
|
||||
|
||||
<div class="flex flex-col h-full justify-between space-y-3 text-sm max-h-[22rem]">
|
||||
<div class=" space-y-2">
|
||||
<div
|
||||
class="flex flex-col justify-between rounded-md items-center py-2 px-3.5 w-full transition"
|
||||
>
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-sm font-medium">{$i18n.t('Chat History')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
toggleSaveChatHistory();
|
||||
}}
|
||||
>
|
||||
{#if saveChatHistory === true}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z" />
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M1.38 8.28a.87.87 0 0 1 0-.566 7.003 7.003 0 0 1 13.238.006.87.87 0 0 1 0 .566A7.003 7.003 0 0 1 1.379 8.28ZM11 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
|
||||
<span class="ml-2 self-center"> {$i18n.t('On')} </span>
|
||||
{:else}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M3.28 2.22a.75.75 0 0 0-1.06 1.06l10.5 10.5a.75.75 0 1 0 1.06-1.06l-1.322-1.323a7.012 7.012 0 0 0 2.16-3.11.87.87 0 0 0 0-.567A7.003 7.003 0 0 0 4.82 3.76l-1.54-1.54Zm3.196 3.195 1.135 1.136A1.502 1.502 0 0 1 9.45 8.389l1.136 1.135a3 3 0 0 0-4.109-4.109Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
<path
|
||||
d="m7.812 10.994 1.816 1.816A7.003 7.003 0 0 1 1.38 8.28a.87.87 0 0 1 0-.566 6.985 6.985 0 0 1 1.113-2.039l2.513 2.513a3 3 0 0 0 2.806 2.806Z"
|
||||
/>
|
||||
</svg>
|
||||
|
||||
<span class="ml-2 self-center">{$i18n.t('Off')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="text-xs text-left w-full font-medium mt-0.5">
|
||||
{$i18n.t('This setting does not sync across browsers or devices.')}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-850" />
|
||||
|
||||
<div class="flex flex-col">
|
||||
<input
|
||||
id="chat-import-input"
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
let themes = ['dark', 'light', 'rose-pine dark', 'rose-pine-dawn light', 'oled-dark'];
|
||||
let selectedTheme = 'system';
|
||||
|
||||
let languages = [];
|
||||
let languages: Awaited<ReturnType<typeof getLanguages>> = [];
|
||||
let lang = $i18n.language;
|
||||
let notificationEnabled = false;
|
||||
let system = '';
|
||||
|
|
@ -41,7 +41,7 @@
|
|||
|
||||
// Advanced
|
||||
let requestFormat = '';
|
||||
let keepAlive = null;
|
||||
let keepAlive: string | null = null;
|
||||
|
||||
let params = {
|
||||
// Advanced
|
||||
|
|
@ -59,7 +59,8 @@
|
|||
num_ctx: null,
|
||||
num_batch: null,
|
||||
num_keep: null,
|
||||
max_tokens: null
|
||||
max_tokens: null,
|
||||
num_gpu: null
|
||||
};
|
||||
|
||||
const toggleRequestFormat = async () => {
|
||||
|
|
@ -321,7 +322,8 @@
|
|||
max_tokens: params.max_tokens !== null ? params.max_tokens : undefined,
|
||||
use_mmap: params.use_mmap !== null ? params.use_mmap : undefined,
|
||||
use_mlock: params.use_mlock !== null ? params.use_mlock : undefined,
|
||||
num_thread: params.num_thread !== null ? params.num_thread : undefined
|
||||
num_thread: params.num_thread !== null ? params.num_thread : undefined,
|
||||
num_gpu: params.num_gpu !== null ? params.num_gpu : undefined
|
||||
},
|
||||
keepAlive: keepAlive ? (isNaN(keepAlive) ? keepAlive : parseInt(keepAlive)) : undefined
|
||||
});
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
let ollamaEnabled = null;
|
||||
|
||||
let OLLAMA_URLS = [];
|
||||
let selectedOllamaUrlIdx: string | null = null;
|
||||
let selectedOllamaUrlIdx: number | null = null;
|
||||
|
||||
let updateModelId = null;
|
||||
let updateProgress = null;
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@
|
|||
class="tabs flex flex-row overflow-x-auto space-x-1 md:space-x-0 md:space-y-1 md:flex-col flex-1 md:flex-none md:w-40 dark:text-gray-200 text-xs text-left mb-3 md:mb-0"
|
||||
>
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-left transition {selectedTab ===
|
||||
'general'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-100 dark:hover:bg-gray-850'}"
|
||||
|
|
@ -120,7 +120,7 @@
|
|||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-left transition {selectedTab ===
|
||||
'interface'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-100 dark:hover:bg-gray-850'}"
|
||||
|
|
@ -146,7 +146,7 @@
|
|||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-left transition {selectedTab ===
|
||||
'personalization'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-100 dark:hover:bg-gray-850'}"
|
||||
|
|
@ -161,7 +161,7 @@
|
|||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-left transition {selectedTab ===
|
||||
'audio'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-100 dark:hover:bg-gray-850'}"
|
||||
|
|
@ -188,7 +188,7 @@
|
|||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-left transition {selectedTab ===
|
||||
'chats'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-100 dark:hover:bg-gray-850'}"
|
||||
|
|
@ -214,7 +214,7 @@
|
|||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-left transition {selectedTab ===
|
||||
'account'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-100 dark:hover:bg-gray-850'}"
|
||||
|
|
@ -241,7 +241,7 @@
|
|||
|
||||
{#if $user.role === 'admin'}
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-left transition {selectedTab ===
|
||||
'admin'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-100 dark:hover:bg-gray-850'}"
|
||||
|
|
@ -269,7 +269,7 @@
|
|||
{/if}
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-left transition {selectedTab ===
|
||||
'about'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-100 dark:hover:bg-gray-850'}"
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
export let src = '';
|
||||
export let alt = '';
|
||||
|
||||
export let className = '';
|
||||
export let className = ' w-full';
|
||||
|
||||
let _src = '';
|
||||
$: _src = src.startsWith('/') ? `${WEBUI_BASE_URL}${src}` : src;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<script lang="ts">
|
||||
import { onMount } from 'svelte';
|
||||
import { onDestroy, onMount } from 'svelte';
|
||||
import { fade } from 'svelte/transition';
|
||||
|
||||
import { flyAndScale } from '$lib/utils/transitions';
|
||||
|
|
@ -47,6 +47,13 @@
|
|||
document.body.removeChild(modalElement);
|
||||
document.body.style.overflow = 'unset';
|
||||
}
|
||||
|
||||
onDestroy(() => {
|
||||
show = false;
|
||||
if (modalElement) {
|
||||
document.body.removeChild(modalElement);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
{#if show}
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
<div class="flex items-center">
|
||||
<input
|
||||
bind:value={tagName}
|
||||
class=" px-2 cursor-pointer self-center text-xs h-fit bg-transparent outline-none line-clamp-1 w-[5.5rem]"
|
||||
class=" px-2 cursor-pointer self-center text-xs h-fit bg-transparent outline-none line-clamp-1 w-[6.5rem]"
|
||||
placeholder={$i18n.t('Add a tag')}
|
||||
list="tagOptions"
|
||||
on:keydown={(event) => {
|
||||
|
|
|
|||
|
|
@ -1,126 +0,0 @@
|
|||
<script lang="ts">
|
||||
import { getDocs } from '$lib/apis/documents';
|
||||
import {
|
||||
getRAGConfig,
|
||||
updateRAGConfig,
|
||||
getQuerySettings,
|
||||
scanDocs,
|
||||
updateQuerySettings,
|
||||
resetVectorDB,
|
||||
getEmbeddingConfig,
|
||||
updateEmbeddingConfig,
|
||||
getRerankingConfig,
|
||||
updateRerankingConfig
|
||||
} from '$lib/apis/rag';
|
||||
|
||||
import { documents, models } from '$lib/stores';
|
||||
import { onMount, getContext } from 'svelte';
|
||||
import { toast } from 'svelte-sonner';
|
||||
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let saveHandler: Function;
|
||||
|
||||
let scanDirLoading = false;
|
||||
let updateEmbeddingModelLoading = false;
|
||||
let updateRerankingModelLoading = false;
|
||||
|
||||
let showResetConfirm = false;
|
||||
|
||||
let chunkSize = 0;
|
||||
let chunkOverlap = 0;
|
||||
let pdfExtractImages = true;
|
||||
|
||||
const submitHandler = async () => {
|
||||
const res = await updateRAGConfig(localStorage.token, {
|
||||
pdf_extract_images: pdfExtractImages,
|
||||
chunk: {
|
||||
chunk_overlap: chunkOverlap,
|
||||
chunk_size: chunkSize
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
onMount(async () => {
|
||||
const res = await getRAGConfig(localStorage.token);
|
||||
|
||||
if (res) {
|
||||
pdfExtractImages = res.pdf_extract_images;
|
||||
|
||||
chunkSize = res.chunk.chunk_size;
|
||||
chunkOverlap = res.chunk.chunk_overlap;
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<form
|
||||
class="flex flex-col h-full justify-between space-y-3 text-sm"
|
||||
on:submit|preventDefault={() => {
|
||||
submitHandler();
|
||||
saveHandler();
|
||||
}}
|
||||
>
|
||||
<div class=" space-y-3 pr-1.5 overflow-y-scroll h-full max-h-[22rem]">
|
||||
<div class=" ">
|
||||
<div class=" text-sm font-medium">{$i18n.t('Chunk Params')}</div>
|
||||
|
||||
<div class=" flex">
|
||||
<div class=" flex w-full justify-between">
|
||||
<div class="self-center text-xs font-medium min-w-fit">{$i18n.t('Chunk Size')}</div>
|
||||
|
||||
<div class="self-center p-3">
|
||||
<input
|
||||
class=" w-full rounded-lg py-1.5 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="number"
|
||||
placeholder={$i18n.t('Enter Chunk Size')}
|
||||
bind:value={chunkSize}
|
||||
autocomplete="off"
|
||||
min="0"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex w-full">
|
||||
<div class=" self-center text-xs font-medium min-w-fit">
|
||||
{$i18n.t('Chunk Overlap')}
|
||||
</div>
|
||||
|
||||
<div class="self-center p-3">
|
||||
<input
|
||||
class="w-full rounded-lg py-1.5 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="number"
|
||||
placeholder={$i18n.t('Enter Chunk Overlap')}
|
||||
bind:value={chunkOverlap}
|
||||
autocomplete="off"
|
||||
min="0"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pr-2">
|
||||
<div class="flex justify-between items-center text-xs">
|
||||
<div class=" text-xs font-medium">{$i18n.t('PDF Extract Images (OCR)')}</div>
|
||||
|
||||
<button
|
||||
class=" text-xs font-medium text-gray-500"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
pdfExtractImages = !pdfExtractImages;
|
||||
}}>{pdfExtractImages ? $i18n.t('On') : $i18n.t('Off')}</button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-end pt-3 text-sm font-medium">
|
||||
<button
|
||||
class=" px-4 py-2 bg-emerald-700 hover:bg-emerald-800 text-gray-100 transition rounded-lg"
|
||||
type="submit"
|
||||
>
|
||||
{$i18n.t('Save')}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
|
@ -1,119 +0,0 @@
|
|||
<script lang="ts">
|
||||
import { getDocs } from '$lib/apis/documents';
|
||||
import {
|
||||
getRAGConfig,
|
||||
updateRAGConfig,
|
||||
getQuerySettings,
|
||||
scanDocs,
|
||||
updateQuerySettings,
|
||||
resetVectorDB,
|
||||
getEmbeddingConfig,
|
||||
updateEmbeddingConfig,
|
||||
getRerankingConfig,
|
||||
updateRerankingConfig
|
||||
} from '$lib/apis/rag';
|
||||
|
||||
import { documents, models } from '$lib/stores';
|
||||
import { onMount, getContext } from 'svelte';
|
||||
import { toast } from 'svelte-sonner';
|
||||
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let saveHandler: Function;
|
||||
|
||||
let querySettings = {
|
||||
template: '',
|
||||
r: 0.0,
|
||||
k: 4,
|
||||
hybrid: false
|
||||
};
|
||||
|
||||
const submitHandler = async () => {
|
||||
querySettings = await updateQuerySettings(localStorage.token, querySettings);
|
||||
};
|
||||
|
||||
onMount(async () => {
|
||||
querySettings = await getQuerySettings(localStorage.token);
|
||||
});
|
||||
</script>
|
||||
|
||||
<form
|
||||
class="flex flex-col h-full justify-between space-y-3 text-sm"
|
||||
on:submit|preventDefault={() => {
|
||||
submitHandler();
|
||||
saveHandler();
|
||||
}}
|
||||
>
|
||||
<div class=" space-y-3 pr-1.5 overflow-y-scroll max-h-[25rem]">
|
||||
<div class=" ">
|
||||
<div class=" text-sm font-medium">{$i18n.t('Query Params')}</div>
|
||||
|
||||
<div class=" flex">
|
||||
<div class=" flex w-full justify-between">
|
||||
<div class="self-center text-xs font-medium min-w-fit">{$i18n.t('Top K')}</div>
|
||||
|
||||
<div class="self-center p-3">
|
||||
<input
|
||||
class=" w-full rounded-lg py-1.5 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="number"
|
||||
placeholder={$i18n.t('Enter Top K')}
|
||||
bind:value={querySettings.k}
|
||||
autocomplete="off"
|
||||
min="0"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{#if querySettings.hybrid === true}
|
||||
<div class="flex w-full">
|
||||
<div class=" self-center text-xs font-medium min-w-fit">
|
||||
{$i18n.t('Minimum Score')}
|
||||
</div>
|
||||
|
||||
<div class="self-center p-3">
|
||||
<input
|
||||
class=" w-full rounded-lg py-1.5 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="number"
|
||||
step="0.01"
|
||||
placeholder={$i18n.t('Enter Score')}
|
||||
bind:value={querySettings.r}
|
||||
autocomplete="off"
|
||||
min="0.0"
|
||||
title={$i18n.t('The score should be a value between 0.0 (0%) and 1.0 (100%).')}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
{#if querySettings.hybrid === true}
|
||||
<div class="mt-2 mb-1 text-xs text-gray-400 dark:text-gray-500">
|
||||
{$i18n.t(
|
||||
'Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.'
|
||||
)}
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-850 my-3" />
|
||||
{/if}
|
||||
|
||||
<div>
|
||||
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('RAG Template')}</div>
|
||||
<textarea
|
||||
bind:value={querySettings.template}
|
||||
class="w-full rounded-lg px-4 py-3 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none resize-none"
|
||||
rows="4"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-end pt-3 text-sm font-medium">
|
||||
<button
|
||||
class=" px-4 py-2 bg-emerald-700 hover:bg-emerald-800 text-gray-100 transition rounded-lg"
|
||||
type="submit"
|
||||
>
|
||||
{$i18n.t('Save')}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
|
@ -1,285 +0,0 @@
|
|||
<script lang="ts">
|
||||
import { getRAGConfig, updateRAGConfig } from '$lib/apis/rag';
|
||||
import Switch from '$lib/components/common/Switch.svelte';
|
||||
|
||||
import { documents, models } from '$lib/stores';
|
||||
import { onMount, getContext } from 'svelte';
|
||||
import { toast } from 'svelte-sonner';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let saveHandler: Function;
|
||||
|
||||
let webConfig = null;
|
||||
let webSearchEngines = ['searxng', 'google_pse', 'brave', 'serpstack', 'serper', 'serply'];
|
||||
|
||||
let youtubeLanguage = 'en';
|
||||
let youtubeTranslation = null;
|
||||
|
||||
const submitHandler = async () => {
|
||||
const res = await updateRAGConfig(localStorage.token, {
|
||||
web: webConfig,
|
||||
youtube: {
|
||||
language: youtubeLanguage.split(',').map((lang) => lang.trim()),
|
||||
translation: youtubeTranslation
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
onMount(async () => {
|
||||
const res = await getRAGConfig(localStorage.token);
|
||||
|
||||
if (res) {
|
||||
webConfig = res.web;
|
||||
|
||||
youtubeLanguage = res.youtube.language.join(',');
|
||||
youtubeTranslation = res.youtube.translation;
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<form
|
||||
class="flex flex-col h-full justify-between space-y-3 text-sm"
|
||||
on:submit|preventDefault={async () => {
|
||||
await submitHandler();
|
||||
saveHandler();
|
||||
}}
|
||||
>
|
||||
<div class=" space-y-3 pr-1.5 overflow-y-scroll h-full max-h-[22rem]">
|
||||
{#if webConfig}
|
||||
<div>
|
||||
<div class=" mb-1 text-sm font-medium">
|
||||
{$i18n.t('Web Search')}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">
|
||||
{$i18n.t('Enable Web Search')}
|
||||
</div>
|
||||
|
||||
<Switch bind:state={webConfig.search.enabled} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Web Search Engine')}</div>
|
||||
<div class="flex items-center relative">
|
||||
<select
|
||||
class="dark:bg-gray-900 w-fit pr-8 rounded px-2 p-1 text-xs bg-transparent outline-none text-right"
|
||||
bind:value={webConfig.search.engine}
|
||||
placeholder={$i18n.t('Select a engine')}
|
||||
required
|
||||
>
|
||||
<option disabled selected value="">{$i18n.t('Select a engine')}</option>
|
||||
{#each webSearchEngines as engine}
|
||||
<option value={engine}>{engine}</option>
|
||||
{/each}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{#if webConfig.search.engine !== ''}
|
||||
<div class="mt-1.5">
|
||||
{#if webConfig.search.engine === 'searxng'}
|
||||
<div>
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Searxng Query URL')}
|
||||
</div>
|
||||
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter Searxng Query URL')}
|
||||
bind:value={webConfig.search.searxng_query_url}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{:else if webConfig.search.engine === 'google_pse'}
|
||||
<div>
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Google PSE API Key')}
|
||||
</div>
|
||||
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter Google PSE API Key')}
|
||||
bind:value={webConfig.search.google_pse_api_key}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-1.5">
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Google PSE Engine Id')}
|
||||
</div>
|
||||
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter Google PSE Engine Id')}
|
||||
bind:value={webConfig.search.google_pse_engine_id}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{:else if webConfig.search.engine === 'brave'}
|
||||
<div>
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Brave Search API Key')}
|
||||
</div>
|
||||
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter Brave Search API Key')}
|
||||
bind:value={webConfig.search.brave_search_api_key}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{:else if webConfig.search.engine === 'serpstack'}
|
||||
<div>
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Serpstack API Key')}
|
||||
</div>
|
||||
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter Serpstack API Key')}
|
||||
bind:value={webConfig.search.serpstack_api_key}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{:else if webConfig.search.engine === 'serper'}
|
||||
<div>
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Serper API Key')}
|
||||
</div>
|
||||
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter Serper API Key')}
|
||||
bind:value={webConfig.search.serper_api_key}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if webConfig.search.enabled}
|
||||
<div class="mt-2 flex gap-2 mb-1">
|
||||
<div class="w-full">
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Search Result Count')}
|
||||
</div>
|
||||
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
placeholder={$i18n.t('Search Result Count')}
|
||||
bind:value={webConfig.search.result_count}
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="w-full">
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Concurrent Requests')}
|
||||
</div>
|
||||
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
placeholder={$i18n.t('Concurrent Requests')}
|
||||
bind:value={webConfig.search.concurrent_requests}
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-850 my-2" />
|
||||
|
||||
<div>
|
||||
<div class=" mb-1 text-sm font-medium">
|
||||
{$i18n.t('Web Loader Settings')}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">
|
||||
{$i18n.t('Bypass SSL verification for Websites')}
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
on:click={() => {
|
||||
webConfig.ssl_verification = !webConfig.ssl_verification;
|
||||
submitHandler();
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
{#if webConfig.ssl_verification === true}
|
||||
<span class="ml-2 self-center">{$i18n.t('On')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Off')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" mt-2 mb-1 text-sm font-medium">
|
||||
{$i18n.t('Youtube Loader Settings')}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" w-20 text-xs font-medium self-center">{$i18n.t('Language')}</div>
|
||||
<div class=" flex-1 self-center">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter language codes')}
|
||||
bind:value={youtubeLanguage}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="flex justify-end pt-3 text-sm font-medium">
|
||||
<button
|
||||
class=" px-4 py-2 bg-emerald-700 hover:bg-emerald-800 text-gray-100 transition rounded-lg"
|
||||
type="submit"
|
||||
>
|
||||
{$i18n.t('Save')}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
|
@ -1,187 +0,0 @@
|
|||
<script>
|
||||
import { getContext, tick } from 'svelte';
|
||||
import Modal from '../common/Modal.svelte';
|
||||
import General from './Settings/General.svelte';
|
||||
import ChunkParams from './Settings/ChunkParams.svelte';
|
||||
import QueryParams from './Settings/QueryParams.svelte';
|
||||
import WebParams from './Settings/WebParams.svelte';
|
||||
import { toast } from 'svelte-sonner';
|
||||
import { config } from '$lib/stores';
|
||||
import { getBackendConfig } from '$lib/apis';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let show = false;
|
||||
|
||||
let selectedTab = 'general';
|
||||
</script>
|
||||
|
||||
<Modal bind:show>
|
||||
<div>
|
||||
<div class=" flex justify-between dark:text-gray-300 px-5 pt-4">
|
||||
<div class=" text-lg font-medium self-center">{$i18n.t('Document Settings')}</div>
|
||||
<button
|
||||
class="self-center"
|
||||
on:click={() => {
|
||||
show = false;
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-5 h-5"
|
||||
>
|
||||
<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 class="flex flex-col md:flex-row w-full p-4 md:space-x-4">
|
||||
<div
|
||||
class="tabs flex flex-row overflow-x-auto space-x-1 md:space-x-0 md:space-y-1 md:flex-col flex-1 md:flex-none md:w-40 dark:text-gray-200 text-xs text-left mb-3 md:mb-0"
|
||||
>
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'general'
|
||||
? 'bg-gray-200 dark:bg-gray-700'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-800'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'general';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<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>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('General')}</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'chunk'
|
||||
? 'bg-gray-200 dark:bg-gray-700'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-800'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'chunk';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M5.625 1.5H9a3.75 3.75 0 0 1 3.75 3.75v1.875c0 1.036.84 1.875 1.875 1.875H16.5a3.75 3.75 0 0 1 3.75 3.75v7.875c0 1.035-.84 1.875-1.875 1.875H5.625a1.875 1.875 0 0 1-1.875-1.875V3.375c0-1.036.84-1.875 1.875-1.875ZM12.75 12a.75.75 0 0 0-1.5 0v2.25H9a.75.75 0 0 0 0 1.5h2.25V18a.75.75 0 0 0 1.5 0v-2.25H15a.75.75 0 0 0 0-1.5h-2.25V12Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
<path
|
||||
d="M14.25 5.25a5.23 5.23 0 0 0-1.279-3.434 9.768 9.768 0 0 1 6.963 6.963A5.23 5.23 0 0 0 16.5 7.5h-1.875a.375.375 0 0 1-.375-.375V5.25Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Chunk Params')}</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'query'
|
||||
? 'bg-gray-200 dark:bg-gray-700'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-800'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'query';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path d="M11.625 16.5a1.875 1.875 0 1 0 0-3.75 1.875 1.875 0 0 0 0 3.75Z" />
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M5.625 1.5H9a3.75 3.75 0 0 1 3.75 3.75v1.875c0 1.036.84 1.875 1.875 1.875H16.5a3.75 3.75 0 0 1 3.75 3.75v7.875c0 1.035-.84 1.875-1.875 1.875H5.625a1.875 1.875 0 0 1-1.875-1.875V3.375c0-1.036.84-1.875 1.875-1.875Zm6 16.5c.66 0 1.277-.19 1.797-.518l1.048 1.048a.75.75 0 0 0 1.06-1.06l-1.047-1.048A3.375 3.375 0 1 0 11.625 18Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
<path
|
||||
d="M14.25 5.25a5.23 5.23 0 0 0-1.279-3.434 9.768 9.768 0 0 1 6.963 6.963A5.23 5.23 0 0 0 16.5 7.5h-1.875a.375.375 0 0 1-.375-.375V5.25Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Query Params')}</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'web'
|
||||
? 'bg-gray-200 dark:bg-gray-700'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-800'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'web';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M21.721 12.752a9.711 9.711 0 0 0-.945-5.003 12.754 12.754 0 0 1-4.339 2.708 18.991 18.991 0 0 1-.214 4.772 17.165 17.165 0 0 0 5.498-2.477ZM14.634 15.55a17.324 17.324 0 0 0 .332-4.647c-.952.227-1.945.347-2.966.347-1.021 0-2.014-.12-2.966-.347a17.515 17.515 0 0 0 .332 4.647 17.385 17.385 0 0 0 5.268 0ZM9.772 17.119a18.963 18.963 0 0 0 4.456 0A17.182 17.182 0 0 1 12 21.724a17.18 17.18 0 0 1-2.228-4.605ZM7.777 15.23a18.87 18.87 0 0 1-.214-4.774 12.753 12.753 0 0 1-4.34-2.708 9.711 9.711 0 0 0-.944 5.004 17.165 17.165 0 0 0 5.498 2.477ZM21.356 14.752a9.765 9.765 0 0 1-7.478 6.817 18.64 18.64 0 0 0 1.988-4.718 18.627 18.627 0 0 0 5.49-2.098ZM2.644 14.752c1.682.971 3.53 1.688 5.49 2.099a18.64 18.64 0 0 0 1.988 4.718 9.765 9.765 0 0 1-7.478-6.816ZM13.878 2.43a9.755 9.755 0 0 1 6.116 3.986 11.267 11.267 0 0 1-3.746 2.504 18.63 18.63 0 0 0-2.37-6.49ZM12 2.276a17.152 17.152 0 0 1 2.805 7.121c-.897.23-1.837.353-2.805.353-.968 0-1.908-.122-2.805-.353A17.151 17.151 0 0 1 12 2.276ZM10.122 2.43a18.629 18.629 0 0 0-2.37 6.49 11.266 11.266 0 0 1-3.746-2.504 9.754 9.754 0 0 1 6.116-3.985Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Web Params')}</div>
|
||||
</button>
|
||||
</div>
|
||||
<div class="flex-1 md:min-h-[380px]">
|
||||
{#if selectedTab === 'general'}
|
||||
<General
|
||||
saveHandler={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'chunk'}
|
||||
<ChunkParams
|
||||
saveHandler={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'query'}
|
||||
<QueryParams
|
||||
saveHandler={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'web'}
|
||||
<WebParams
|
||||
saveHandler={async () => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
|
||||
await tick();
|
||||
await config.set(await getBackendConfig());
|
||||
}}
|
||||
/>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Modal>
|
||||
19
src/lib/components/icons/ChatBubbleOval.svelte
Normal file
19
src/lib/components/icons/ChatBubbleOval.svelte
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<script lang="ts">
|
||||
export let className = 'size-4';
|
||||
export let strokeWidth = '1.5';
|
||||
</script>
|
||||
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width={strokeWidth}
|
||||
stroke="currentColor"
|
||||
class={className}
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M12 20.25c4.97 0 9-3.694 9-8.25s-4.03-8.25-9-8.25S3 7.444 3 12c0 2.104.859 4.023 2.273 5.48.432.447.74 1.04.586 1.641a4.483 4.483 0 0 1-.923 1.785A5.969 5.969 0 0 0 6 21c1.282 0 2.47-.402 3.445-1.087.81.22 1.668.337 2.555.337Z"
|
||||
/>
|
||||
</svg>
|
||||
19
src/lib/components/icons/EyeSlash.svelte
Normal file
19
src/lib/components/icons/EyeSlash.svelte
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<script lang="ts">
|
||||
export let className = 'w-4 h-4';
|
||||
export let strokeWidth = '1.5';
|
||||
</script>
|
||||
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width={strokeWidth}
|
||||
stroke="currentColor"
|
||||
class={className}
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M3.98 8.223A10.477 10.477 0 0 0 1.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.451 10.451 0 0 1 12 4.5c4.756 0 8.773 3.162 10.065 7.498a10.522 10.522 0 0 1-4.293 5.774M6.228 6.228 3 3m3.228 3.228 3.65 3.65m7.894 7.894L21 21m-3.228-3.228-3.65-3.65m0 0a3 3 0 1 0-4.243-4.243m4.242 4.242L9.88 9.88"
|
||||
/>
|
||||
</svg>
|
||||
19
src/lib/components/icons/Merge.svelte
Normal file
19
src/lib/components/icons/Merge.svelte
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<script lang="ts">
|
||||
export let className = 'w-4 h-4';
|
||||
export let strokeWidth = '1.5';
|
||||
</script>
|
||||
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width={strokeWidth}
|
||||
stroke="currentColor"
|
||||
class={className}
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M8 8v8m0-8a2 2 0 1 0 0-4 2 2 0 0 0 0 4Zm0 8a2 2 0 1 0 0 4 2 2 0 0 0 0-4Zm6-2a2 2 0 1 1 4 0 2 2 0 0 1-4 0Zm0 0h-1a5 5 0 0 1-5-5v-.5"
|
||||
/>
|
||||
</svg>
|
||||
|
|
@ -13,7 +13,8 @@
|
|||
showArchivedChats,
|
||||
pinnedChats,
|
||||
scrollPaginationEnabled,
|
||||
currentChatPage
|
||||
currentChatPage,
|
||||
temporaryChatEnabled
|
||||
} from '$lib/stores';
|
||||
import { onMount, getContext, tick } from 'svelte';
|
||||
|
||||
|
|
@ -380,47 +381,10 @@
|
|||
{/if}
|
||||
|
||||
<div class="relative flex flex-col flex-1 overflow-y-auto">
|
||||
{#if !($settings.saveChatHistory ?? true)}
|
||||
<div class="absolute z-40 w-full h-full bg-gray-50/90 dark:bg-black/90 flex justify-center">
|
||||
<div class=" text-left px-5 py-2">
|
||||
<div class=" font-medium">{$i18n.t('Chat History is off for this browser.')}</div>
|
||||
<div class="text-xs mt-2">
|
||||
{$i18n.t(
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices."
|
||||
)}
|
||||
<span class=" font-semibold"
|
||||
>{$i18n.t('This setting does not sync across browsers or devices.')}</span
|
||||
>
|
||||
</div>
|
||||
|
||||
<div class="mt-3">
|
||||
<button
|
||||
class="flex justify-center items-center space-x-1.5 px-3 py-2.5 rounded-lg text-xs bg-gray-100 hover:bg-gray-200 transition text-gray-800 font-medium w-full"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
saveSettings({
|
||||
saveChatHistory: true
|
||||
});
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-3 h-3"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M8 1a.75.75 0 0 1 .75.75v6.5a.75.75 0 0 1-1.5 0v-6.5A.75.75 0 0 1 8 1ZM4.11 3.05a.75.75 0 0 1 0 1.06 5.5 5.5 0 1 0 7.78 0 .75.75 0 0 1 1.06-1.06 7 7 0 1 1-9.9 0 .75.75 0 0 1 1.06 0Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
|
||||
<div>{$i18n.t('Enable Chat History')}</div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{#if $temporaryChatEnabled}
|
||||
<div
|
||||
class="absolute z-40 w-full h-full bg-gray-50/90 dark:bg-black/90 flex justify-center"
|
||||
></div>
|
||||
{/if}
|
||||
|
||||
<div class="px-2 mt-0.5 mb-2 flex justify-center space-x-2">
|
||||
|
|
|
|||
|
|
@ -29,9 +29,12 @@
|
|||
import ManifestModal from './common/ManifestModal.svelte';
|
||||
import Heart from '../icons/Heart.svelte';
|
||||
import DeleteConfirmDialog from '$lib/components/common/ConfirmDialog.svelte';
|
||||
import GarbageBin from '../icons/GarbageBin.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
let shiftKey = false;
|
||||
|
||||
let functionsImportInputElement: HTMLInputElement;
|
||||
let importFiles;
|
||||
|
||||
|
|
@ -135,6 +138,34 @@
|
|||
models.set(await getModels(localStorage.token));
|
||||
}
|
||||
};
|
||||
|
||||
onMount(() => {
|
||||
const onKeyDown = (event) => {
|
||||
if (event.key === 'Shift') {
|
||||
shiftKey = true;
|
||||
}
|
||||
};
|
||||
|
||||
const onKeyUp = (event) => {
|
||||
if (event.key === 'Shift') {
|
||||
shiftKey = false;
|
||||
}
|
||||
};
|
||||
|
||||
const onBlur = () => {
|
||||
shiftKey = false;
|
||||
};
|
||||
|
||||
window.addEventListener('keydown', onKeyDown);
|
||||
window.addEventListener('keyup', onKeyUp);
|
||||
window.addEventListener('blur', onBlur);
|
||||
|
||||
return () => {
|
||||
window.removeEventListener('keydown', onKeyDown);
|
||||
window.removeEventListener('keyup', onKeyUp);
|
||||
window.removeEventListener('blur', onBlur);
|
||||
};
|
||||
});
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
|
|
@ -234,6 +265,19 @@
|
|||
</div>
|
||||
</a>
|
||||
<div class="flex flex-row gap-0.5 self-center">
|
||||
{#if shiftKey}
|
||||
<Tooltip content={$i18n.t('Delete')}>
|
||||
<button
|
||||
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
deleteHandler(func);
|
||||
}}
|
||||
>
|
||||
<GarbageBin />
|
||||
</button>
|
||||
</Tooltip>
|
||||
{:else}
|
||||
{#if func?.meta?.manifest?.funding_url ?? false}
|
||||
<Tooltip content={$i18n.t('Support')}>
|
||||
<button
|
||||
|
|
@ -312,6 +356,7 @@
|
|||
<EllipsisHorizontal className="size-5" />
|
||||
</button>
|
||||
</FunctionMenu>
|
||||
{/if}
|
||||
|
||||
<div class=" self-center mx-1">
|
||||
<Tooltip content={func.is_active ? $i18n.t('Enabled') : $i18n.t('Disabled')}>
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@
|
|||
|
||||
<div slot="content">
|
||||
<DropdownMenu.Content
|
||||
class="w-full max-w-[160px] rounded-xl px-1 py-1.5 border border-gray-300/30 dark:border-gray-700/50 z-50 bg-white dark:bg-gray-850 dark:text-white shadow"
|
||||
class="w-full max-w-[180px] rounded-xl px-1 py-1.5 border border-gray-300/30 dark:border-gray-700/50 z-50 bg-white dark:bg-gray-850 dark:text-white shadow"
|
||||
sideOffset={-2}
|
||||
side="bottom"
|
||||
align="start"
|
||||
|
|
|
|||
|
|
@ -18,9 +18,13 @@
|
|||
import EllipsisHorizontal from '../icons/EllipsisHorizontal.svelte';
|
||||
import ModelMenu from './Models/ModelMenu.svelte';
|
||||
import ModelDeleteConfirmDialog from '../common/ConfirmDialog.svelte';
|
||||
import Tooltip from '../common/Tooltip.svelte';
|
||||
import GarbageBin from '../icons/GarbageBin.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
let shiftKey = false;
|
||||
|
||||
let showModelDeleteConfirm = false;
|
||||
|
||||
let localModelfiles = [];
|
||||
|
|
@ -194,6 +198,32 @@
|
|||
}
|
||||
});
|
||||
}
|
||||
|
||||
const onKeyDown = (event) => {
|
||||
if (event.key === 'Shift') {
|
||||
shiftKey = true;
|
||||
}
|
||||
};
|
||||
|
||||
const onKeyUp = (event) => {
|
||||
if (event.key === 'Shift') {
|
||||
shiftKey = false;
|
||||
}
|
||||
};
|
||||
|
||||
const onBlur = () => {
|
||||
shiftKey = false;
|
||||
};
|
||||
|
||||
window.addEventListener('keydown', onKeyDown);
|
||||
window.addEventListener('keyup', onKeyUp);
|
||||
window.addEventListener('blur', onBlur);
|
||||
|
||||
return () => {
|
||||
window.removeEventListener('keydown', onKeyDown);
|
||||
window.removeEventListener('keyup', onKeyUp);
|
||||
window.removeEventListener('blur', onBlur);
|
||||
};
|
||||
});
|
||||
</script>
|
||||
|
||||
|
|
@ -314,6 +344,70 @@
|
|||
</div>
|
||||
</a>
|
||||
<div class="flex flex-row gap-0.5 self-center">
|
||||
{#if shiftKey}
|
||||
<Tooltip
|
||||
content={(model?.info?.meta?.hidden ?? false)
|
||||
? $i18n.t('Show Model')
|
||||
: $i18n.t('Hide Model')}
|
||||
>
|
||||
<button
|
||||
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
hideModelHandler(model);
|
||||
}}
|
||||
>
|
||||
{#if model?.info?.meta?.hidden ?? false}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="size-4"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M3.98 8.223A10.477 10.477 0 0 0 1.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.451 10.451 0 0 1 12 4.5c4.756 0 8.773 3.162 10.065 7.498a10.522 10.522 0 0 1-4.293 5.774M6.228 6.228 3 3m3.228 3.228 3.65 3.65m7.894 7.894L21 21m-3.228-3.228-3.65-3.65m0 0a3 3 0 1 0-4.243-4.243m4.242 4.242L9.88 9.88"
|
||||
/>
|
||||
</svg>
|
||||
{:else}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="size-4"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M2.036 12.322a1.012 1.012 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178Z"
|
||||
/>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z"
|
||||
/>
|
||||
</svg>
|
||||
{/if}
|
||||
</button>
|
||||
</Tooltip>
|
||||
|
||||
<Tooltip content={$i18n.t('Delete')}>
|
||||
<button
|
||||
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
deleteModelHandler(model);
|
||||
}}
|
||||
>
|
||||
<GarbageBin />
|
||||
</button>
|
||||
</Tooltip>
|
||||
{:else}
|
||||
<a
|
||||
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
type="button"
|
||||
|
|
@ -362,6 +456,7 @@
|
|||
<EllipsisHorizontal className="size-5" />
|
||||
</button>
|
||||
</ModelMenu>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{/each}
|
||||
|
|
|
|||
|
|
@ -24,9 +24,12 @@
|
|||
import ManifestModal from './common/ManifestModal.svelte';
|
||||
import Heart from '../icons/Heart.svelte';
|
||||
import DeleteConfirmDialog from '$lib/components/common/ConfirmDialog.svelte';
|
||||
import GarbageBin from '../icons/GarbageBin.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
let shiftKey = false;
|
||||
|
||||
let toolsImportInputElement: HTMLInputElement;
|
||||
let importFiles;
|
||||
|
||||
|
|
@ -107,6 +110,34 @@
|
|||
tools.set(await getTools(localStorage.token));
|
||||
}
|
||||
};
|
||||
|
||||
onMount(() => {
|
||||
const onKeyDown = (event) => {
|
||||
if (event.key === 'Shift') {
|
||||
shiftKey = true;
|
||||
}
|
||||
};
|
||||
|
||||
const onKeyUp = (event) => {
|
||||
if (event.key === 'Shift') {
|
||||
shiftKey = false;
|
||||
}
|
||||
};
|
||||
|
||||
const onBlur = () => {
|
||||
shiftKey = false;
|
||||
};
|
||||
|
||||
window.addEventListener('keydown', onKeyDown);
|
||||
window.addEventListener('keyup', onKeyUp);
|
||||
window.addEventListener('blur', onBlur);
|
||||
|
||||
return () => {
|
||||
window.removeEventListener('keydown', onKeyDown);
|
||||
window.removeEventListener('keyup', onKeyUp);
|
||||
window.removeEventListener('blur', onBlur);
|
||||
};
|
||||
});
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
|
|
@ -206,6 +237,19 @@
|
|||
</div>
|
||||
</a>
|
||||
<div class="flex flex-row gap-0.5 self-center">
|
||||
{#if shiftKey}
|
||||
<Tooltip content={$i18n.t('Delete')}>
|
||||
<button
|
||||
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
deleteHandler(tool);
|
||||
}}
|
||||
>
|
||||
<GarbageBin />
|
||||
</button>
|
||||
</Tooltip>
|
||||
{:else}
|
||||
{#if tool?.meta?.manifest?.funding_url ?? false}
|
||||
<Tooltip content="Support">
|
||||
<button
|
||||
|
|
@ -278,6 +322,7 @@
|
|||
<EllipsisHorizontal className="size-5" />
|
||||
</button>
|
||||
</ToolMenu>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{/each}
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "جميع المستخدمين",
|
||||
"Allow": "يسمح",
|
||||
"Allow Chat Deletion": "يستطيع حذف المحادثات",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "",
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"alphanumeric characters and hyphens": "الأحرف الأبجدية الرقمية والواصلات",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "",
|
||||
"August": "أغسطس",
|
||||
"Auto-playback response": "استجابة التشغيل التلقائي",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 الرابط الرئيسي",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 الرابط مطلوب",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "UI الدردشة",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "اتجاه المحادثة",
|
||||
"Chat History": "تاريخ المحادثة",
|
||||
"Chat History is off for this browser.": "سجل الدردشة معطل لهذا المتصفح",
|
||||
"Chats": "المحادثات",
|
||||
"Check Again": "تحقق مرة اخرى",
|
||||
"Check for updates": "تحقق من التحديثات",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "أضغط هنا للاختيار ملف csv",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "انقر هنا لاختيار المستندات",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "أضغط هنا",
|
||||
"Click on the user role button to change a user's role.": "أضغط على أسم الصلاحيات لتغيرها للمستخدم",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "ComfyUI الرابط الافتراضي",
|
||||
"ComfyUI Base URL is required.": "ComfyUI الرابط مطلوب",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "الأوامر",
|
||||
"Concurrent Requests": "الطلبات المتزامنة",
|
||||
"Confirm": "",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "قاعدة البيانات",
|
||||
"December": "ديسمبر",
|
||||
"Default": "الإفتراضي",
|
||||
"Default (Automatic1111)": "(Automatic1111) الإفتراضي",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "(SentenceTransformers) الإفتراضي",
|
||||
"Default Model": "النموذج الافتراضي",
|
||||
"Default model updated": "الإفتراضي تحديث الموديل",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "المستند",
|
||||
"Document Settings": "أعدادات المستند",
|
||||
"Documentation": "",
|
||||
"Documents": "مستندات",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "لا يجري أي اتصالات خارجية، وتظل بياناتك آمنة على الخادم المستضاف محليًا.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "نموذج التضمين",
|
||||
"Embedding Model Engine": "تضمين محرك النموذج",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "تم تعيين نموذج التضمين على \"{{embedding_model}}\"",
|
||||
"Enable Chat History": "تمكين سجل الدردشة",
|
||||
"Enable Community Sharing": "تمكين مشاركة المجتمع",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "تفعيل عمليات التسجيل الجديدة",
|
||||
"Enable Web Search": "تمكين بحث الويب",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "أدخل معرف محرك PSE من Google",
|
||||
"Enter Image Size (e.g. 512x512)": "(e.g. 512x512) أدخل حجم الصورة ",
|
||||
"Enter language codes": "أدخل كود اللغة",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "(e.g. {{modelTag}}) أدخل الموديل تاق",
|
||||
"Enter Number of Steps (e.g. 50)": "(e.g. 50) أدخل عدد الخطوات",
|
||||
"Enter Score": "أدخل النتيجة",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "من جهة اليسار إلى اليمين",
|
||||
"Made by OpenWebUI Community": "OpenWebUI تم إنشاؤه بواسطة مجتمع ",
|
||||
"Make sure to enclose them with": "تأكد من إرفاقها",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "",
|
||||
"Manage Models": "إدارة النماذج",
|
||||
"Manage Ollama Models": "Ollama إدارة موديلات ",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "لن تتم مشاركة الرسائل التي ترسلها بعد إنشاء الرابط الخاص بك. سيتمكن المستخدمون الذين لديهم عنوان URL من عرض الدردشة المشتركة",
|
||||
"Min P": "",
|
||||
"Minimum Score": "الحد الأدنى من النقاط",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "خطاء! يبدو أن عنوان URL غير صالح. يرجى التحقق مرة أخرى والمحاولة مرة أخرى.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "خطاء! أنت تستخدم طريقة غير مدعومة (الواجهة الأمامية فقط). يرجى تقديم واجهة WebUI من الواجهة الخلفية.",
|
||||
"Open AI (Dall-E)": "AI (Dall-E) فتح",
|
||||
"Open new chat": "فتح محادثة جديده",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -540,13 +545,13 @@
|
|||
"Select a base model": "حدد نموذجا أساسيا",
|
||||
"Select a engine": "",
|
||||
"Select a function": "",
|
||||
"Select a mode": "أختار موديل",
|
||||
"Select a model": "أختار الموديل",
|
||||
"Select a pipeline": "حدد مسارا",
|
||||
"Select a pipeline url": "حدد عنوان URL لخط الأنابيب",
|
||||
"Select a tool": "",
|
||||
"Select an Ollama instance": "أختار سيرفر ",
|
||||
"Select Documents": "",
|
||||
"Select Engine": "",
|
||||
"Select model": " أختار موديل",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "النموذج (النماذج) المحددة لا تدعم مدخلات الصور",
|
||||
|
|
@ -568,7 +573,6 @@
|
|||
"Set Voice": "ضبط الصوت",
|
||||
"Settings": "الاعدادات",
|
||||
"Settings saved successfully!": "تم حفظ الاعدادات بنجاح",
|
||||
"Settings updated successfully": "",
|
||||
"Share": "كشاركة",
|
||||
"Share Chat": "مشاركة الدردشة",
|
||||
"Share to OpenWebUI Community": "OpenWebUI شارك في مجتمع",
|
||||
|
|
@ -604,6 +608,7 @@
|
|||
"Tell us more:": "أخبرنا المزيد:",
|
||||
"Temperature": "درجة حرارة",
|
||||
"Template": "نموذج",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "اكتمال النص",
|
||||
"Text-to-Speech Engine": "محرك تحويل النص إلى كلام",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -615,7 +620,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "وهذا يضمن حفظ محادثاتك القيمة بشكل آمن في قاعدة بياناتك الخلفية. شكرًا لك!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "لا تتم مزامنة هذا الإعداد عبر المتصفحات أو الأجهزة.",
|
||||
"This will delete": "",
|
||||
"Thorough explanation": "شرح شامل",
|
||||
"Tika": "",
|
||||
|
|
@ -696,14 +700,12 @@
|
|||
"Web": "Web",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Web تحميل اعدادات",
|
||||
"Web Params": "Web تحميل اعدادات",
|
||||
"Web Search": "بحث الويب",
|
||||
"Web Search Engine": "محرك بحث الويب",
|
||||
"Webhook URL": "Webhook الرابط",
|
||||
"WebUI Settings": "WebUI اعدادات",
|
||||
"WebUI will make requests to": "سوف يقوم WebUI بتقديم طلبات ل",
|
||||
"What’s New in": "ما هو الجديد",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "عند إيقاف تشغيل السجل، لن تظهر الدردشات الجديدة على هذا المتصفح في سجلك على أي من أجهزتك.",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "مساحة العمل",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "Всички Потребители",
|
||||
"Allow": "Позволи",
|
||||
"Allow Chat Deletion": "Позволи Изтриване на Чат",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "",
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"alphanumeric characters and hyphens": "алфанумерични знаци и тире",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "",
|
||||
"August": "Август",
|
||||
"Auto-playback response": "Аувтоматично възпроизвеждане на Отговора",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Базов URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Базов URL е задължителен.",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "UI за чат бублон",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "Направление на чата",
|
||||
"Chat History": "Чат История",
|
||||
"Chat History is off for this browser.": "Чат История е изключен за този браузър.",
|
||||
"Chats": "Чатове",
|
||||
"Check Again": "Проверете Още Веднъж",
|
||||
"Check for updates": "Проверка за актуализации",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "Натиснете тук, за да изберете csv файл.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Натиснете тук, за да изберете документи.",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "натиснете тук.",
|
||||
"Click on the user role button to change a user's role.": "Натиснете върху бутона за промяна на ролята на потребителя.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "ComfyUI Base URL",
|
||||
"ComfyUI Base URL is required.": "ComfyUI Base URL е задължително.",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "Команда",
|
||||
"Concurrent Requests": "Едновременни искания",
|
||||
"Confirm": "",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "База данни",
|
||||
"December": "Декември",
|
||||
"Default": "По подразбиране",
|
||||
"Default (Automatic1111)": "По подразбиране (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "По подразбиране (SentenceTransformers)",
|
||||
"Default Model": "Модел по подразбиране",
|
||||
"Default model updated": "Моделът по подразбиране е обновен",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "Документ",
|
||||
"Document Settings": "Документ Настройки",
|
||||
"Documentation": "",
|
||||
"Documents": "Документи",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "няма външни връзки, и вашите данни остават сигурни на локално назначен сървър.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "Модел за вграждане",
|
||||
"Embedding Model Engine": "Модел за вграждане",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Модел за вграждане е настроен на \"{{embedding_model}}\"",
|
||||
"Enable Chat History": "Вклюване на Чат История",
|
||||
"Enable Community Sharing": "Разрешаване на споделяне в общност",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "Вклюване на Нови Потребители",
|
||||
"Enable Web Search": "Разрешаване на търсене в уеб",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Въведете идентификатор на двигателя на Google PSE",
|
||||
"Enter Image Size (e.g. 512x512)": "Въведете размер на изображението (напр. 512x512)",
|
||||
"Enter language codes": "Въведете кодове на езика",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Въведете таг на модел (напр. {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Въведете брой стъпки (напр. 50)",
|
||||
"Enter Score": "Въведете оценка",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Направено от OpenWebUI общността",
|
||||
"Make sure to enclose them with": "Уверете се, че са заключени с",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "",
|
||||
"Manage Models": "Управление на Моделите",
|
||||
"Manage Ollama Models": "Управление на Ollama Моделите",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Съобщенията, които изпращате след създаването на връзката, няма да бъдат споделяни. Потребителите с URL адреса ще могат да видят споделения чат.",
|
||||
"Min P": "",
|
||||
"Minimum Score": "Минимална оценка",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Упс! Изглежда URL адресът е невалиден. Моля, проверете отново и опитайте пак.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Упс! Използвате неподдържан метод (само фронтенд). Моля, сервирайте WebUI от бекенда.",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "Отвори нов чат",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -536,13 +541,13 @@
|
|||
"Select a base model": "Изберете базов модел",
|
||||
"Select a engine": "",
|
||||
"Select a function": "",
|
||||
"Select a mode": "Изберете режим",
|
||||
"Select a model": "Изберете модел",
|
||||
"Select a pipeline": "Изберете тръбопровод",
|
||||
"Select a pipeline url": "Избор на URL адрес на канал",
|
||||
"Select a tool": "",
|
||||
"Select an Ollama instance": "Изберете Ollama инстанция",
|
||||
"Select Documents": "",
|
||||
"Select Engine": "",
|
||||
"Select model": "Изберете модел",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Избраният(те) модел(и) не поддържа въвеждане на изображения",
|
||||
|
|
@ -564,7 +569,6 @@
|
|||
"Set Voice": "Задай Глас",
|
||||
"Settings": "Настройки",
|
||||
"Settings saved successfully!": "Настройките са запазени успешно!",
|
||||
"Settings updated successfully": "",
|
||||
"Share": "Подели",
|
||||
"Share Chat": "Подели Чат",
|
||||
"Share to OpenWebUI Community": "Споделите с OpenWebUI Общността",
|
||||
|
|
@ -600,6 +604,7 @@
|
|||
"Tell us more:": "Повече информация:",
|
||||
"Temperature": "Температура",
|
||||
"Template": "Шаблон",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "Text Completion",
|
||||
"Text-to-Speech Engine": "Text-to-Speech Engine",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -611,7 +616,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Това гарантира, че ценните ви разговори се запазват сигурно във вашата бекенд база данни. Благодарим ви!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "Тази настройка не се синхронизира между браузъри или устройства.",
|
||||
"This will delete": "",
|
||||
"Thorough explanation": "Това е подробно описание.",
|
||||
"Tika": "",
|
||||
|
|
@ -692,14 +696,12 @@
|
|||
"Web": "Уеб",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Настройки за зареждане на уеб",
|
||||
"Web Params": "Параметри за уеб",
|
||||
"Web Search": "Търсене в уеб",
|
||||
"Web Search Engine": "Уеб търсачка",
|
||||
"Webhook URL": "Уебхук URL",
|
||||
"WebUI Settings": "WebUI Настройки",
|
||||
"WebUI will make requests to": "WebUI ще направи заявки към",
|
||||
"What’s New in": "Какво е новото в",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Когато историята е изключена, нови чатове в този браузър ще не се показват в историята на никои от вашия профил.",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "Работно пространство",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "সব ইউজার",
|
||||
"Allow": "অনুমোদন",
|
||||
"Allow Chat Deletion": "চ্যাট ডিলিট করতে দিন",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "",
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"alphanumeric characters and hyphens": "ইংরেজি অক্ষর, সংখ্যা এবং হাইফেন",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "",
|
||||
"August": "আগস্ট",
|
||||
"Auto-playback response": "রেসপন্স অটো-প্লেব্যাক",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 বেজ ইউআরএল",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 বেজ ইউআরএল আবশ্যক",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "চ্যাট বাবল UI",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "চ্যাট দিকনির্দেশ",
|
||||
"Chat History": "চ্যাট হিস্টোরি",
|
||||
"Chat History is off for this browser.": "এই ব্রাউজারের জন্য চ্যাট হিস্টোরি বন্ধ আছে",
|
||||
"Chats": "চ্যাটসমূহ",
|
||||
"Check Again": "আবার চেক করুন",
|
||||
"Check for updates": "নতুন আপডেট আছে কিনা চেক করুন",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "একটি csv ফাইল নির্বাচন করার জন্য এখানে ক্লিক করুন",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "ডকুমেন্টগুলো নির্বাচন করার জন্য এখানে ক্লিক করুন",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "এখানে ক্লিক করুন",
|
||||
"Click on the user role button to change a user's role.": "ইউজারের পদবি পরিবর্তন করার জন্য ইউজারের পদবি বাটনে ক্লিক করুন",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "ComfyUI Base URL",
|
||||
"ComfyUI Base URL is required.": "ComfyUI Base URL আবশ্যক।",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "কমান্ড",
|
||||
"Concurrent Requests": "সমকালীন অনুরোধ",
|
||||
"Confirm": "",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "ডেটাবেজ",
|
||||
"December": "ডেসেম্বর",
|
||||
"Default": "ডিফল্ট",
|
||||
"Default (Automatic1111)": "ডিফল্ট (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "ডিফল্ট (SentenceTransformers)",
|
||||
"Default Model": "ডিফল্ট মডেল",
|
||||
"Default model updated": "ডিফল্ট মডেল আপডেট হয়েছে",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "ডকুমেন্ট",
|
||||
"Document Settings": "ডকুমেন্ট সেটিংসমূহ",
|
||||
"Documentation": "",
|
||||
"Documents": "ডকুমেন্টসমূহ",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "কোন এক্সটার্নাল কানেকশন তৈরি করে না, এবং আপনার ডেটা আর লোকালি হোস্টেড সার্ভারেই নিরাপদে থাকে।",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "ইমেজ ইমেবডিং মডেল",
|
||||
"Embedding Model Engine": "ইমেজ ইমেবডিং মডেল ইঞ্জিন",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "ইমেজ ইমেবডিং মডেল সেট করা হয়েছে - \"{{embedding_model}}\"",
|
||||
"Enable Chat History": "চ্যাট হিস্টোরি চালু করুন",
|
||||
"Enable Community Sharing": "সম্প্রদায় শেয়ারকরণ সক্ষম করুন",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "নতুন সাইনআপ চালু করুন",
|
||||
"Enable Web Search": "ওয়েব অনুসন্ধান সক্ষম করুন",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "গুগল পিএসই ইঞ্জিন আইডি লিখুন",
|
||||
"Enter Image Size (e.g. 512x512)": "ছবির মাপ লিখুন (যেমন 512x512)",
|
||||
"Enter language codes": "ল্যাঙ্গুয়েজ কোড লিখুন",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "মডেল ট্যাগ লিখুন (e.g. {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "ধাপের সংখ্যা দিন (যেমন: 50)",
|
||||
"Enter Score": "স্কোর দিন",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "OpenWebUI কমিউনিটিকর্তৃক নির্মিত",
|
||||
"Make sure to enclose them with": "এটা দিয়ে বন্ধনী দিতে ভুলবেন না",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "",
|
||||
"Manage Models": "মডেলসমূহ ব্যবস্থাপনা করুন",
|
||||
"Manage Ollama Models": "Ollama মডেলসূহ ব্যবস্থাপনা করুন",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "আপনার লিঙ্ক তৈরি করার পরে আপনার পাঠানো বার্তাগুলি শেয়ার করা হবে না। ইউআরএল ব্যবহারকারীরা শেয়ার করা চ্যাট দেখতে পারবেন।",
|
||||
"Min P": "",
|
||||
"Minimum Score": "Minimum Score",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "ওহ, মনে হচ্ছে ইউআরএলটা ইনভ্যালিড। দয়া করে আর চেক করে চেষ্টা করুন।",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "আপনি একটা আনসাপোর্টেড পদ্ধতি (শুধু ফ্রন্টএন্ড) ব্যবহার করছেন। দয়া করে WebUI ব্যাকএন্ড থেকে চালনা করুন।",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "নতুন চ্যাট খুলুন",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -536,13 +541,13 @@
|
|||
"Select a base model": "একটি বেস মডেল নির্বাচন করুন",
|
||||
"Select a engine": "",
|
||||
"Select a function": "",
|
||||
"Select a mode": "একটি মডেল নির্বাচন করুন",
|
||||
"Select a model": "একটি মডেল নির্বাচন করুন",
|
||||
"Select a pipeline": "একটি পাইপলাইন নির্বাচন করুন",
|
||||
"Select a pipeline url": "একটি পাইপলাইন URL নির্বাচন করুন",
|
||||
"Select a tool": "",
|
||||
"Select an Ollama instance": "একটি Ollama ইন্সট্যান্স নির্বাচন করুন",
|
||||
"Select Documents": "",
|
||||
"Select Engine": "",
|
||||
"Select model": "মডেল নির্বাচন করুন",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "নির্বাচিত মডেল(গুলি) চিত্র ইনপুট সমর্থন করে না",
|
||||
|
|
@ -564,7 +569,6 @@
|
|||
"Set Voice": "কন্ঠস্বর নির্ধারণ করুন",
|
||||
"Settings": "সেটিংসমূহ",
|
||||
"Settings saved successfully!": "সেটিংগুলো সফলভাবে সংরক্ষিত হয়েছে",
|
||||
"Settings updated successfully": "",
|
||||
"Share": "শেয়ার করুন",
|
||||
"Share Chat": "চ্যাট শেয়ার করুন",
|
||||
"Share to OpenWebUI Community": "OpenWebUI কমিউনিটিতে শেয়ার করুন",
|
||||
|
|
@ -600,6 +604,7 @@
|
|||
"Tell us more:": "আরও বলুন:",
|
||||
"Temperature": "তাপমাত্রা",
|
||||
"Template": "টেম্পলেট",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "লেখা সম্পন্নকরণ",
|
||||
"Text-to-Speech Engine": "টেক্সট-টু-স্পিচ ইঞ্জিন",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -611,7 +616,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "এটা নিশ্চিত করে যে, আপনার গুরুত্বপূর্ণ আলোচনা নিরাপদে আপনার ব্যাকএন্ড ডেটাবেজে সংরক্ষিত আছে। ধন্যবাদ!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "এই সেটিং অন্যন্য ব্রাউজার বা ডিভাইসের সাথে সিঙ্ক্রোনাইজ নয় না।",
|
||||
"This will delete": "",
|
||||
"Thorough explanation": "পুঙ্খানুপুঙ্খ ব্যাখ্যা",
|
||||
"Tika": "",
|
||||
|
|
@ -692,14 +696,12 @@
|
|||
"Web": "ওয়েব",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "ওয়েব লোডার সেটিংস",
|
||||
"Web Params": "ওয়েব প্যারামিটারসমূহ",
|
||||
"Web Search": "ওয়েব অনুসন্ধান",
|
||||
"Web Search Engine": "ওয়েব সার্চ ইঞ্জিন",
|
||||
"Webhook URL": "ওয়েবহুক URL",
|
||||
"WebUI Settings": "WebUI সেটিংসমূহ",
|
||||
"WebUI will make requests to": "WebUI যেখানে রিকোয়েস্ট পাঠাবে",
|
||||
"What’s New in": "এতে নতুন কী",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "যদি হিস্টোরি বন্ধ থাকে তাহলে এই ব্রাউজারের নতুন চ্যাটগুলো আপনার কোন ডিভাইসের হিস্টোরিতেই দেখা যাবে না।",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "ওয়ার্কস্পেস",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "Tots els usuaris",
|
||||
"Allow": "Permetre",
|
||||
"Allow Chat Deletion": "Permetre la supressió del xat",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "Permetre veus no locals",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "Permetre la ubicació de l'usuari",
|
||||
"Allow Voice Interruption in Call": "Permetre la interrupció de la veu en una trucada",
|
||||
"alphanumeric characters and hyphens": "caràcters alfanumèrics i guions",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "Les preferències d'àudio s'han actualitzat correctament",
|
||||
"August": "Agost",
|
||||
"Auto-playback response": "Reproduir la resposta automàticament",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "Cadena d'autenticació de l'API d'AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL": "URL Base d'AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "Es requereix l'URL Base d'AUTOMATIC1111.",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "Chat Bubble UI",
|
||||
"Chat Controls": "Controls de xat",
|
||||
"Chat direction": "Direcció del xat",
|
||||
"Chat History": "Històric del xat",
|
||||
"Chat History is off for this browser.": "L'historic del xat està desactivat per a aquest navegador.",
|
||||
"Chats": "Xats",
|
||||
"Check Again": "Comprovar-ho de nou",
|
||||
"Check for updates": "Comprovar si hi ha actualitzacions",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "Clica aquí per seleccionar un fitxer csv.",
|
||||
"Click here to select a py file.": "Clica aquí per seleccionar un fitxer py.",
|
||||
"Click here to select documents.": "Clica aquí per seleccionar documents.",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "clica aquí.",
|
||||
"Click on the user role button to change a user's role.": "Clica sobre el botó de rol d'usuari per canviar el rol d'un usuari.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Permís d'escriptura al porta-retalls denegat. Comprova els ajustos de navegador per donar l'accés necessari.",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "URL base de ComfyUI",
|
||||
"ComfyUI Base URL is required.": "L'URL base de ComfyUI és obligatòria.",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "Comanda",
|
||||
"Concurrent Requests": "Peticions simultànies",
|
||||
"Confirm": "Confirmar",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "Base de dades",
|
||||
"December": "Desembre",
|
||||
"Default": "Per defecte",
|
||||
"Default (Automatic1111)": "Per defecte (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "Per defecte (SentenceTransformers)",
|
||||
"Default Model": "Model per defecte",
|
||||
"Default model updated": "Model per defecte actualitzat",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "No instal·lis funcions de fonts en què no confiïs plenament.",
|
||||
"Do not install tools from sources you do not fully trust.": "No instal·lis eines de fonts en què no confiïs plenament.",
|
||||
"Document": "Document",
|
||||
"Document Settings": "Preferències de documents",
|
||||
"Documentation": "Documentació",
|
||||
"Documents": "Documents",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "no realitza connexions externes, i les teves dades romanen segures al teu servidor allotjat localment.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "Model d'incrustació",
|
||||
"Embedding Model Engine": "Motor de model d'incrustació",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Model d'incrustació configurat a \"{{embedding_model}}\"",
|
||||
"Enable Chat History": "Activar l'historial de xats",
|
||||
"Enable Community Sharing": "Activar l'ús compartit amb la comunitat",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "Permetre nous registres",
|
||||
"Enable Web Search": "Activar la cerca web",
|
||||
"Enabled": "Habilitat",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Introdueix l'identificador del motor PSE de Google",
|
||||
"Enter Image Size (e.g. 512x512)": "Introdueix la mida de la imatge (p. ex. 512x512)",
|
||||
"Enter language codes": "Introdueix els codis de llenguatge",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Introdueix l'etiqueta del model (p. ex. {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Introdueix el nombre de passos (p. ex. 50)",
|
||||
"Enter Score": "Introdueix la puntuació",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Creat per la Comunitat OpenWebUI",
|
||||
"Make sure to enclose them with": "Assegura't d'envoltar-los amb",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "Gestionar",
|
||||
"Manage Models": "Gestionar els models",
|
||||
"Manage Ollama Models": "Gestionar els models Ollama",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "Memòria eliminada correctament",
|
||||
"Memory deleted successfully": "Memòria eliminada correctament",
|
||||
"Memory updated successfully": "Memòria actualitzada correctament",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Els missatges enviats després de crear el teu enllaç no es compartiran. Els usuaris amb l'URL podran veure el xat compartit.",
|
||||
"Min P": "Min P",
|
||||
"Minimum Score": "Puntuació mínima",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Ui! Sembla que l'URL no és vàlida. Si us plau, revisa-la i torna-ho a provar.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "Ui! Hi ha hagut un error en la resposta anterior. Torna a provar-ho o contacta amb un administrador",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ui! Estàs utilitzant un mètode no suportat (només frontend). Si us plau, serveix la WebUI des del backend.",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "Obre un xat nou",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "La versió d'Open WebUI (v{{OPEN_WEBUI_VERSION}}) és inferior a la versió requerida (v{{REQUIRED_VERSION}})",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -537,13 +542,13 @@
|
|||
"Select a base model": "Seleccionar un model base",
|
||||
"Select a engine": "Seleccionar un motor",
|
||||
"Select a function": "Seleccionar una funció",
|
||||
"Select a mode": "Seleccionar un mode",
|
||||
"Select a model": "Seleccionar un model",
|
||||
"Select a pipeline": "Seleccionar una Pipeline",
|
||||
"Select a pipeline url": "Seleccionar l'URL d'una Pipeline",
|
||||
"Select a tool": "Seleccionar una eina",
|
||||
"Select an Ollama instance": "Seleccionar una instància d'Ollama",
|
||||
"Select Documents": "Seleccionar documents",
|
||||
"Select Engine": "",
|
||||
"Select model": "Seleccionar un model",
|
||||
"Select only one model to call": "Seleccionar només un model per trucar",
|
||||
"Selected model(s) do not support image inputs": "El(s) model(s) seleccionats no admeten l'entrada d'imatges",
|
||||
|
|
@ -565,7 +570,6 @@
|
|||
"Set Voice": "Establir la veu",
|
||||
"Settings": "Preferències",
|
||||
"Settings saved successfully!": "Les preferències s'han desat correctament",
|
||||
"Settings updated successfully": "Les preferències s'han actualitzat correctament",
|
||||
"Share": "Compartir",
|
||||
"Share Chat": "Compartir el xat",
|
||||
"Share to OpenWebUI Community": "Compartir amb la comunitat OpenWebUI",
|
||||
|
|
@ -601,6 +605,7 @@
|
|||
"Tell us more:": "Dona'ns més informació:",
|
||||
"Temperature": "Temperatura",
|
||||
"Template": "Plantilla",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "Completament de text",
|
||||
"Text-to-Speech Engine": "Motor de text a veu",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -612,7 +617,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "Aquesta acció no es pot desfer. Vols continuar?",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Això assegura que les teves converses valuoses queden desades de manera segura a la teva base de dades. Gràcies!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Aquesta és una funció experimental, és possible que no funcioni com s'espera i està subjecta a canvis en qualsevol moment.",
|
||||
"This setting does not sync across browsers or devices.": "Aquesta preferència no es sincronitza entre navegadors ni dispositius.",
|
||||
"This will delete": "Això eliminarà",
|
||||
"Thorough explanation": "Explicació en detall",
|
||||
"Tika": "Tika",
|
||||
|
|
@ -693,14 +697,12 @@
|
|||
"Web": "Web",
|
||||
"Web API": "Web API",
|
||||
"Web Loader Settings": "Preferències del carregador web",
|
||||
"Web Params": "Paràmetres web",
|
||||
"Web Search": "Cerca la web",
|
||||
"Web Search Engine": "Motor de cerca de la web",
|
||||
"Webhook URL": "URL del webhook",
|
||||
"WebUI Settings": "Preferències de WebUI",
|
||||
"WebUI will make requests to": "WebUI farà peticions a",
|
||||
"What’s New in": "Què hi ha de nou a",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Quan l'historial està desactivat, els nous xats en aquest navegador no apareixeran en el teu historial en cap dels teus dispositius.",
|
||||
"Whisper (Local)": "Whisper (local)",
|
||||
"Widescreen Mode": "Mode de pantalla ampla",
|
||||
"Workspace": "Espai de treball",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "Ang tanan nga mga tiggamit",
|
||||
"Allow": "Sa pagtugot",
|
||||
"Allow Chat Deletion": "Tugoti nga mapapas ang mga chat",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "",
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"alphanumeric characters and hyphens": "alphanumeric nga mga karakter ug hyphen",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "",
|
||||
"August": "",
|
||||
"Auto-playback response": "Autoplay nga tubag",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "Base URL AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "Ang AUTOMATIC1111 base URL gikinahanglan.",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "",
|
||||
"Chat History": "Kasaysayan sa chat",
|
||||
"Chat History is off for this browser.": "Ang kasaysayan sa chat gi-disable alang niini nga browser.",
|
||||
"Chats": "Mga panaghisgot",
|
||||
"Check Again": "Susiha pag-usab",
|
||||
"Check for updates": "Susiha ang mga update",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Pag-klik dinhi aron mapili ang mga dokumento.",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "I-klik dinhi.",
|
||||
"Click on the user role button to change a user's role.": "I-klik ang User Role button aron usbon ang role sa user.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "",
|
||||
"ComfyUI Base URL": "",
|
||||
"ComfyUI Base URL is required.": "",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "Pag-order",
|
||||
"Concurrent Requests": "",
|
||||
"Confirm": "",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "Database",
|
||||
"December": "",
|
||||
"Default": "Pinaagi sa default",
|
||||
"Default (Automatic1111)": "Default (Awtomatiko1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "",
|
||||
"Default Model": "",
|
||||
"Default model updated": "Gi-update nga default template",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "Dokumento",
|
||||
"Document Settings": "Mga Setting sa Dokumento",
|
||||
"Documentation": "",
|
||||
"Documents": "Mga dokumento",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "wala maghimo ug eksternal nga koneksyon, ug ang imong data nagpabiling luwas sa imong lokal nga host server.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "",
|
||||
"Embedding Model Engine": "",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "",
|
||||
"Enable Chat History": "I-enable ang kasaysayan sa chat",
|
||||
"Enable Community Sharing": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "I-enable ang bag-ong mga rehistro",
|
||||
"Enable Web Search": "",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "",
|
||||
"Enter Image Size (e.g. 512x512)": "Pagsulod sa gidak-on sa hulagway (pananglitan 512x512)",
|
||||
"Enter language codes": "",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Pagsulod sa template tag (e.g. {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Pagsulod sa gidaghanon sa mga lakang (e.g. 50)",
|
||||
"Enter Score": "",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "",
|
||||
"Made by OpenWebUI Community": "Gihimo sa komunidad sa OpenWebUI",
|
||||
"Make sure to enclose them with": "Siguruha nga palibutan sila",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "",
|
||||
"Manage Models": "Pagdumala sa mga templates",
|
||||
"Manage Ollama Models": "Pagdumala sa mga modelo sa Ollama",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
|
||||
"Min P": "",
|
||||
"Minimum Score": "",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! ",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! ",
|
||||
"Open AI (Dall-E)": "Buksan ang AI (Dall-E)",
|
||||
"Open new chat": "Ablihi ang bag-ong diskusyon",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "",
|
||||
|
|
@ -536,13 +541,13 @@
|
|||
"Select a base model": "",
|
||||
"Select a engine": "",
|
||||
"Select a function": "",
|
||||
"Select a mode": "Pagpili og mode",
|
||||
"Select a model": "Pagpili og modelo",
|
||||
"Select a pipeline": "",
|
||||
"Select a pipeline url": "",
|
||||
"Select a tool": "",
|
||||
"Select an Ollama instance": "Pagpili usa ka pananglitan sa Ollama",
|
||||
"Select Documents": "",
|
||||
"Select Engine": "",
|
||||
"Select model": "Pagpili og modelo",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "",
|
||||
|
|
@ -564,7 +569,6 @@
|
|||
"Set Voice": "Ibutang ang tingog",
|
||||
"Settings": "Mga setting",
|
||||
"Settings saved successfully!": "Malampuson nga na-save ang mga setting!",
|
||||
"Settings updated successfully": "",
|
||||
"Share": "",
|
||||
"Share Chat": "",
|
||||
"Share to OpenWebUI Community": "Ipakigbahin sa komunidad sa OpenWebUI",
|
||||
|
|
@ -600,6 +604,7 @@
|
|||
"Tell us more:": "",
|
||||
"Temperature": "Temperatura",
|
||||
"Template": "Modelo",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "Pagkompleto sa teksto",
|
||||
"Text-to-Speech Engine": "Text-to-speech nga makina",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -611,7 +616,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Kini nagsiguro nga ang imong bililhon nga mga panag-istoryahanay luwas nga natipig sa imong backend database. ",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "Kini nga setting wala mag-sync tali sa mga browser o device.",
|
||||
"This will delete": "",
|
||||
"Thorough explanation": "",
|
||||
"Tika": "",
|
||||
|
|
@ -692,14 +696,12 @@
|
|||
"Web": "Web",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "",
|
||||
"Web Params": "",
|
||||
"Web Search": "",
|
||||
"Web Search Engine": "",
|
||||
"Webhook URL": "",
|
||||
"WebUI Settings": "Mga Setting sa WebUI",
|
||||
"WebUI will make requests to": "Ang WebUI maghimo mga hangyo sa",
|
||||
"What’s New in": "Unsay bag-o sa",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Kung ang kasaysayan gipalong, ang mga bag-ong chat sa kini nga browser dili makita sa imong kasaysayan sa bisan unsang mga aparato.",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "Alle Benutzer",
|
||||
"Allow": "Erlauben",
|
||||
"Allow Chat Deletion": "Unterhaltungen löschen erlauben",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "Nicht-lokale Stimmen erlauben",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "Standort freigeben",
|
||||
"Allow Voice Interruption in Call": "Unterbrechung durch Stimme im Anruf zulassen",
|
||||
"alphanumeric characters and hyphens": "alphanumerische Zeichen und Bindestriche",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "Audioeinstellungen erfolgreich aktualisiert",
|
||||
"August": "August",
|
||||
"Auto-playback response": "Antwort automatisch abspielen",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111-API-Authentifizierungszeichenfolge",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111-Basis-URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111-Basis-URL ist erforderlich.",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "Chat Bubble UI",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "Textrichtung",
|
||||
"Chat History": "Unterhaltungsverlauf",
|
||||
"Chat History is off for this browser.": "Unterhaltungsverlauf ist in diesem Browser deaktiviert.",
|
||||
"Chats": "Unterhaltungen",
|
||||
"Check Again": "Erneut überprüfen",
|
||||
"Check for updates": "Nach Updates suchen",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "Klicken Sie zum Auswählen einer CSV-Datei hier.",
|
||||
"Click here to select a py file.": "Klicken Sie zum Auswählen einer py-Datei hier.",
|
||||
"Click here to select documents.": "Klicken Sie zum Auswählen von Dokumenten hier",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "hier klicken.",
|
||||
"Click on the user role button to change a user's role.": "Klicken Sie auf die Benutzerrolle, um sie zu ändern.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Schreibberechtigung für die Zwischenablage verweigert. Bitte überprüfen Sie Ihre Browsereinstellungen, um den erforderlichen Zugriff zu erlauben.",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "ComfyUI-Basis-URL",
|
||||
"ComfyUI Base URL is required.": "ComfyUI-Basis-URL wird benötigt.",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "Befehl",
|
||||
"Concurrent Requests": "Anzahl gleichzeitiger Anfragen",
|
||||
"Confirm": "Bestätigen",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "Datenbank",
|
||||
"December": "Dezember",
|
||||
"Default": "Standard",
|
||||
"Default (Automatic1111)": "Standard (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "Standard (SentenceTransformers)",
|
||||
"Default Model": "Standardmodell",
|
||||
"Default model updated": "Standardmodell aktualisiert",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "Dokument",
|
||||
"Document Settings": "Dokumenteinstellungen",
|
||||
"Documentation": "Dokumentation",
|
||||
"Documents": "Dokumente",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "stellt keine externen Verbindungen her, und Ihre Daten bleiben sicher auf Ihrem lokal gehosteten Server.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "Embedding-Modell",
|
||||
"Embedding Model Engine": "Embedding-Modell-Engine",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Embedding-Modell auf \"{{embedding_model}}\" gesetzt",
|
||||
"Enable Chat History": "Unterhaltungshistorie aktivieren",
|
||||
"Enable Community Sharing": "Community-Freigabe aktivieren",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "Registrierung erlauben",
|
||||
"Enable Web Search": "Websuche aktivieren",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Geben Sie die Google PSE-Engine-ID ein",
|
||||
"Enter Image Size (e.g. 512x512)": "Geben Sie die Bildgröße ein (z. B. 512x512)",
|
||||
"Enter language codes": "Geben Sie die Sprachcodes ein",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Gebn Sie den Model-Tag ein",
|
||||
"Enter Number of Steps (e.g. 50)": "Geben Sie die Anzahl an Schritten ein (z. B. 50)",
|
||||
"Enter Score": "Punktzahl eingeben",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Von der OpenWebUI-Community",
|
||||
"Make sure to enclose them with": "Umschließe Variablen mit",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "Verwalten",
|
||||
"Manage Models": "Modelle verwalten",
|
||||
"Manage Ollama Models": "Ollama-Modelle verwalten",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "Erinnerung erfolgreich gelöscht",
|
||||
"Memory deleted successfully": "Erinnerung erfolgreich gelöscht",
|
||||
"Memory updated successfully": "Erinnerung erfolgreich aktualisiert",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Nachrichten, die Sie nach der Erstellung Ihres Links senden, werden nicht geteilt. Nutzer mit der URL können die freigegebene Unterhaltung einsehen.",
|
||||
"Min P": "",
|
||||
"Minimum Score": "Mindestpunktzahl",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Hoppla! Es scheint, dass die URL ungültig ist. Bitte überprüfen Sie diese und versuchen Sie es erneut.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "Hoppla! Es gab einen Fehler in der vorherigen Antwort. Bitte versuchen Sie es erneut oder kontaktieren Sie den Administrator.",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Hoppla! Sie verwenden eine nicht unterstützte Methode (nur Frontend). Bitte stellen Sie die WebUI vom Backend bereit.",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "Neuen Chat öffnen",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Die installierte Open-WebUI-Version (v{{OPEN_WEBUI_VERSION}}) ist niedriger als die erforderliche Version (v{{REQUIRED_VERSION}})",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -536,13 +541,13 @@
|
|||
"Select a base model": "Wählen Sie ein Basismodell",
|
||||
"Select a engine": "Wählen Sie eine Engine",
|
||||
"Select a function": "Wählen Sie eine Funktion",
|
||||
"Select a mode": "Wählen Sie einen Modus",
|
||||
"Select a model": "Wählen Sie ein Modell",
|
||||
"Select a pipeline": "Wählen Sie eine Pipeline",
|
||||
"Select a pipeline url": "Wählen Sie eine Pipeline-URL",
|
||||
"Select a tool": "Wählen Sie ein Werkzeug",
|
||||
"Select an Ollama instance": "Wählen Sie eine Ollama-Instanz",
|
||||
"Select Documents": "Dokumente auswählen",
|
||||
"Select Engine": "",
|
||||
"Select model": "Modell auswählen",
|
||||
"Select only one model to call": "Wählen Sie nur ein Modell zum Anrufen aus",
|
||||
"Selected model(s) do not support image inputs": "Ihre ausgewählten Modelle unterstützen keine Bildeingaben",
|
||||
|
|
@ -564,7 +569,6 @@
|
|||
"Set Voice": "Stimme festlegen",
|
||||
"Settings": "Einstellungen",
|
||||
"Settings saved successfully!": "Einstellungen erfolgreich gespeichert!",
|
||||
"Settings updated successfully": "Einstellungen erfolgreich aktualisiert",
|
||||
"Share": "Teilen",
|
||||
"Share Chat": "Unterhaltung teilen",
|
||||
"Share to OpenWebUI Community": "Mit OpenWebUI Community teilen",
|
||||
|
|
@ -600,6 +604,7 @@
|
|||
"Tell us more:": "Erzähl uns mehr",
|
||||
"Temperature": "Temperatur",
|
||||
"Template": "Vorlage",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "Textvervollständigung",
|
||||
"Text-to-Speech Engine": "Text-zu-Sprache-Engine",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -611,7 +616,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "Diese Aktion kann nicht rückgängig gemacht werden. Möchten Sie fortfahren?",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dies stellt sicher, dass Ihre wertvollen Unterhaltungen sicher in Ihrer Backend-Datenbank gespeichert werden. Vielen Dank!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Dies ist eine experimentelle Funktion, sie funktioniert möglicherweise nicht wie erwartet und kann jederzeit geändert werden.",
|
||||
"This setting does not sync across browsers or devices.": "Diese Einstellung wird nicht zwischen Browsern oder Geräten synchronisiert.",
|
||||
"This will delete": "Dies löscht",
|
||||
"Thorough explanation": "Ausführliche Erklärung",
|
||||
"Tika": "Tika",
|
||||
|
|
@ -692,14 +696,12 @@
|
|||
"Web": "Web",
|
||||
"Web API": "Web-API",
|
||||
"Web Loader Settings": "Web Loader Einstellungen",
|
||||
"Web Params": "Web Parameter",
|
||||
"Web Search": "Websuche",
|
||||
"Web Search Engine": "Suchmaschine",
|
||||
"Webhook URL": "Webhook URL",
|
||||
"WebUI Settings": "WebUI-Einstellungen",
|
||||
"WebUI will make requests to": "WebUI sendet Anfragen an:",
|
||||
"What’s New in": "Neuigkeiten von",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Wenn der Verlauf deaktiviert ist, werden neue Unterhaltungen in diesem Browser nicht im Verlauf Ihrer anderen Geräte erscheinen.",
|
||||
"Whisper (Local)": "Whisper (lokal)",
|
||||
"Widescreen Mode": "Breitbildmodus",
|
||||
"Workspace": "Arbeitsbereich",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "All Users",
|
||||
"Allow": "Allow",
|
||||
"Allow Chat Deletion": "Allow Delete Chats",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "",
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"alphanumeric characters and hyphens": "so alpha, many hyphen",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "",
|
||||
"August": "",
|
||||
"Auto-playback response": "Auto-playback response",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Base URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Base URL is required.",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "",
|
||||
"Chat History": "Chat History",
|
||||
"Chat History is off for this browser.": "Chat History off for this browser. Such sadness.",
|
||||
"Chats": "Chats",
|
||||
"Check Again": "Check Again",
|
||||
"Check for updates": "Check for updates",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Click to select documents",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "click here. Such click.",
|
||||
"Click on the user role button to change a user's role.": "Click user role button to change role.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "",
|
||||
"ComfyUI Base URL": "",
|
||||
"ComfyUI Base URL is required.": "",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "Command",
|
||||
"Concurrent Requests": "",
|
||||
"Confirm": "",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "Database",
|
||||
"December": "",
|
||||
"Default": "Default",
|
||||
"Default (Automatic1111)": "Default (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "",
|
||||
"Default Model": "",
|
||||
"Default model updated": "Default model much updated",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "Document",
|
||||
"Document Settings": "Document Settings",
|
||||
"Documentation": "",
|
||||
"Documents": "Documents",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "does not connect external, data stays safe locally.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "",
|
||||
"Embedding Model Engine": "",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "",
|
||||
"Enable Chat History": "Activate Chat Story",
|
||||
"Enable Community Sharing": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "Enable New Bark Ups",
|
||||
"Enable Web Search": "",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "",
|
||||
"Enter Image Size (e.g. 512x512)": "Enter Size of Wow (e.g. 512x512)",
|
||||
"Enter language codes": "",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Enter model doge tag (e.g. {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Enter Number of Steps (e.g. 50)",
|
||||
"Enter Score": "",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "",
|
||||
"Made by OpenWebUI Community": "Made by OpenWebUI Community",
|
||||
"Make sure to enclose them with": "Make sure to enclose them with",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "",
|
||||
"Manage Models": "Manage Wowdels",
|
||||
"Manage Ollama Models": "Manage Ollama Wowdels",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
|
||||
"Min P": "",
|
||||
"Minimum Score": "",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"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! There was an error in the previous response. Please try again or contact admin.": "",
|
||||
"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.",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "Open new bark",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "",
|
||||
|
|
@ -538,13 +543,13 @@
|
|||
"Select a base model": "",
|
||||
"Select a engine": "",
|
||||
"Select a function": "",
|
||||
"Select a mode": "Select a mode very choose",
|
||||
"Select a model": "Select a model much choice",
|
||||
"Select a pipeline": "",
|
||||
"Select a pipeline url": "",
|
||||
"Select a tool": "",
|
||||
"Select an Ollama instance": "Select an Ollama instance very choose",
|
||||
"Select Documents": "",
|
||||
"Select Engine": "",
|
||||
"Select model": "Select model much choice",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "",
|
||||
|
|
@ -566,7 +571,6 @@
|
|||
"Set Voice": "Set Voice so speak",
|
||||
"Settings": "Settings much settings",
|
||||
"Settings saved successfully!": "Settings saved successfully! Very success!",
|
||||
"Settings updated successfully": "",
|
||||
"Share": "",
|
||||
"Share Chat": "",
|
||||
"Share to OpenWebUI Community": "Share to OpenWebUI Community much community",
|
||||
|
|
@ -602,6 +606,7 @@
|
|||
"Tell us more:": "",
|
||||
"Temperature": "Temperature very temp",
|
||||
"Template": "Template much template",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "Text Completion much complete",
|
||||
"Text-to-Speech Engine": "Text-to-Speech Engine much speak",
|
||||
"Tfs Z": "Tfs Z much Z",
|
||||
|
|
@ -613,7 +618,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "This ensures that your valuable conversations are securely saved to your backend database. Thank you! Much secure!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "This setting does not sync across browsers or devices. Very not sync.",
|
||||
"This will delete": "",
|
||||
"Thorough explanation": "",
|
||||
"Tika": "",
|
||||
|
|
@ -694,14 +698,12 @@
|
|||
"Web": "Web very web",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "",
|
||||
"Web Params": "",
|
||||
"Web Search": "",
|
||||
"Web Search Engine": "",
|
||||
"Webhook URL": "",
|
||||
"WebUI Settings": "WebUI Settings much settings",
|
||||
"WebUI will make requests to": "WebUI will make requests to much request",
|
||||
"What’s New in": "What’s New in much new",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "When history is turned off, new chats on this browser won't appear in your history on any of your devices. Much history.",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "",
|
||||
"Allow": "",
|
||||
"Allow Chat Deletion": "",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "",
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"alphanumeric characters and hyphens": "",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "",
|
||||
"August": "",
|
||||
"Auto-playback response": "",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "",
|
||||
"AUTOMATIC1111 Base URL is required.": "",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "",
|
||||
"Chat History": "",
|
||||
"Chat History is off for this browser.": "",
|
||||
"Chats": "",
|
||||
"Check Again": "",
|
||||
"Check for updates": "",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "",
|
||||
"Click on the user role button to change a user's role.": "",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "",
|
||||
"ComfyUI Base URL": "",
|
||||
"ComfyUI Base URL is required.": "",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "",
|
||||
"Concurrent Requests": "",
|
||||
"Confirm": "",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "",
|
||||
"December": "",
|
||||
"Default": "",
|
||||
"Default (Automatic1111)": "",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "",
|
||||
"Default Model": "",
|
||||
"Default model updated": "",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "",
|
||||
"Document Settings": "",
|
||||
"Documentation": "",
|
||||
"Documents": "",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "",
|
||||
"Embedding Model Engine": "",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "",
|
||||
"Enable Chat History": "",
|
||||
"Enable Community Sharing": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "",
|
||||
"Enable Web Search": "",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "",
|
||||
"Enter Image Size (e.g. 512x512)": "",
|
||||
"Enter language codes": "",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "",
|
||||
"Enter Number of Steps (e.g. 50)": "",
|
||||
"Enter Score": "",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "",
|
||||
"Made by OpenWebUI Community": "",
|
||||
"Make sure to enclose them with": "",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "",
|
||||
"Manage Models": "",
|
||||
"Manage Ollama Models": "",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
|
||||
"Min P": "",
|
||||
"Minimum Score": "",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "",
|
||||
"Open AI (Dall-E)": "",
|
||||
"Open new chat": "",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "",
|
||||
|
|
@ -536,13 +541,13 @@
|
|||
"Select a base model": "",
|
||||
"Select a engine": "",
|
||||
"Select a function": "",
|
||||
"Select a mode": "",
|
||||
"Select a model": "",
|
||||
"Select a pipeline": "",
|
||||
"Select a pipeline url": "",
|
||||
"Select a tool": "",
|
||||
"Select an Ollama instance": "",
|
||||
"Select Documents": "",
|
||||
"Select Engine": "",
|
||||
"Select model": "",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "",
|
||||
|
|
@ -564,7 +569,6 @@
|
|||
"Set Voice": "",
|
||||
"Settings": "",
|
||||
"Settings saved successfully!": "",
|
||||
"Settings updated successfully": "",
|
||||
"Share": "",
|
||||
"Share Chat": "",
|
||||
"Share to OpenWebUI Community": "",
|
||||
|
|
@ -600,6 +604,7 @@
|
|||
"Tell us more:": "",
|
||||
"Temperature": "",
|
||||
"Template": "",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "",
|
||||
"Text-to-Speech Engine": "",
|
||||
"Tfs Z": "",
|
||||
|
|
@ -611,7 +616,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "",
|
||||
"This will delete": "",
|
||||
"Thorough explanation": "",
|
||||
"Tika": "",
|
||||
|
|
@ -692,14 +696,12 @@
|
|||
"Web": "",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "",
|
||||
"Web Params": "",
|
||||
"Web Search": "",
|
||||
"Web Search Engine": "",
|
||||
"Webhook URL": "",
|
||||
"WebUI Settings": "",
|
||||
"WebUI will make requests to": "",
|
||||
"What’s New in": "",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "",
|
||||
"Allow": "",
|
||||
"Allow Chat Deletion": "",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "",
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"alphanumeric characters and hyphens": "",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "",
|
||||
"August": "",
|
||||
"Auto-playback response": "",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "",
|
||||
"AUTOMATIC1111 Base URL is required.": "",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "",
|
||||
"Chat History": "",
|
||||
"Chat History is off for this browser.": "",
|
||||
"Chats": "",
|
||||
"Check Again": "",
|
||||
"Check for updates": "",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "",
|
||||
"Click on the user role button to change a user's role.": "",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "",
|
||||
"ComfyUI Base URL": "",
|
||||
"ComfyUI Base URL is required.": "",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "",
|
||||
"Concurrent Requests": "",
|
||||
"Confirm": "",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "",
|
||||
"December": "",
|
||||
"Default": "",
|
||||
"Default (Automatic1111)": "",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "",
|
||||
"Default Model": "",
|
||||
"Default model updated": "",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "",
|
||||
"Document Settings": "",
|
||||
"Documentation": "",
|
||||
"Documents": "",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "",
|
||||
"Embedding Model Engine": "",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "",
|
||||
"Enable Chat History": "",
|
||||
"Enable Community Sharing": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "",
|
||||
"Enable Web Search": "",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "",
|
||||
"Enter Image Size (e.g. 512x512)": "",
|
||||
"Enter language codes": "",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "",
|
||||
"Enter Number of Steps (e.g. 50)": "",
|
||||
"Enter Score": "",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "",
|
||||
"Made by OpenWebUI Community": "",
|
||||
"Make sure to enclose them with": "",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "",
|
||||
"Manage Models": "",
|
||||
"Manage Ollama Models": "",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
|
||||
"Min P": "",
|
||||
"Minimum Score": "",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "",
|
||||
"Open AI (Dall-E)": "",
|
||||
"Open new chat": "",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "",
|
||||
|
|
@ -536,13 +541,13 @@
|
|||
"Select a base model": "",
|
||||
"Select a engine": "",
|
||||
"Select a function": "",
|
||||
"Select a mode": "",
|
||||
"Select a model": "",
|
||||
"Select a pipeline": "",
|
||||
"Select a pipeline url": "",
|
||||
"Select a tool": "",
|
||||
"Select an Ollama instance": "",
|
||||
"Select Documents": "",
|
||||
"Select Engine": "",
|
||||
"Select model": "",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "",
|
||||
|
|
@ -564,7 +569,6 @@
|
|||
"Set Voice": "",
|
||||
"Settings": "",
|
||||
"Settings saved successfully!": "",
|
||||
"Settings updated successfully": "",
|
||||
"Share": "",
|
||||
"Share Chat": "",
|
||||
"Share to OpenWebUI Community": "",
|
||||
|
|
@ -600,6 +604,7 @@
|
|||
"Tell us more:": "",
|
||||
"Temperature": "",
|
||||
"Template": "",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "",
|
||||
"Text-to-Speech Engine": "",
|
||||
"Tfs Z": "",
|
||||
|
|
@ -611,7 +616,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "",
|
||||
"This will delete": "",
|
||||
"Thorough explanation": "",
|
||||
"Tika": "",
|
||||
|
|
@ -692,14 +696,12 @@
|
|||
"Web": "",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "",
|
||||
"Web Params": "",
|
||||
"Web Search": "",
|
||||
"Web Search Engine": "",
|
||||
"Webhook URL": "",
|
||||
"WebUI Settings": "",
|
||||
"WebUI will make requests to": "",
|
||||
"What’s New in": "",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "Todos los Usuarios",
|
||||
"Allow": "Permitir",
|
||||
"Allow Chat Deletion": "Permitir Borrar Chats",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "Permitir voces no locales",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "Permitir Ubicación del Usuario",
|
||||
"Allow Voice Interruption in Call": "Permitir interrupción de voz en llamada",
|
||||
"alphanumeric characters and hyphens": "caracteres alfanuméricos y guiones",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "Opciones de audio actualizadas correctamente",
|
||||
"August": "Agosto",
|
||||
"Auto-playback response": "Respuesta de reproducción automática",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "Dirección URL de AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "La dirección URL de AUTOMATIC1111 es requerida.",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "Burbuja de chat UI",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "Dirección del Chat",
|
||||
"Chat History": "Historial del Chat",
|
||||
"Chat History is off for this browser.": "El Historial del Chat está apagado para este navegador.",
|
||||
"Chats": "Chats",
|
||||
"Check Again": "Verifica de nuevo",
|
||||
"Check for updates": "Verificar actualizaciones",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "Presiona aquí para seleccionar un archivo csv.",
|
||||
"Click here to select a py file.": "Presiona aquí para seleccionar un archivo py.",
|
||||
"Click here to select documents.": "Presiona aquí para seleccionar documentos",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "Presiona aquí.",
|
||||
"Click on the user role button to change a user's role.": "Presiona en el botón de roles del usuario para cambiar su rol.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Permisos de escritura del portapapeles denegados. Por favor, comprueba las configuraciones de tu navegador para otorgar el acceso necesario.",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "ComfyUI Base URL",
|
||||
"ComfyUI Base URL is required.": "ComfyUI Base URL es requerido.",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "Comando",
|
||||
"Concurrent Requests": "Solicitudes simultáneas",
|
||||
"Confirm": "Confirmar",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "Base de datos",
|
||||
"December": "Diciembre",
|
||||
"Default": "Por defecto",
|
||||
"Default (Automatic1111)": "Por defecto (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "Por defecto (SentenceTransformers)",
|
||||
"Default Model": "Modelo predeterminado",
|
||||
"Default model updated": "El modelo por defecto ha sido actualizado",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "Documento",
|
||||
"Document Settings": "Configuración del Documento",
|
||||
"Documentation": "Documentación",
|
||||
"Documents": "Documentos",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "no realiza ninguna conexión externa y sus datos permanecen seguros en su servidor alojado localmente.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "Modelo de Embedding",
|
||||
"Embedding Model Engine": "Motor de Modelo de Embedding",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Modelo de Embedding configurado a \"{{embedding_model}}\"",
|
||||
"Enable Chat History": "Activa el Historial de Chat",
|
||||
"Enable Community Sharing": "Habilitar el uso compartido de la comunidad",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "Habilitar Nuevos Registros",
|
||||
"Enable Web Search": "Habilitar la búsqueda web",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Introduzca el ID del motor PSE de Google",
|
||||
"Enter Image Size (e.g. 512x512)": "Ingrese el tamaño de la imagen (p.ej. 512x512)",
|
||||
"Enter language codes": "Ingrese códigos de idioma",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Ingrese la etiqueta del modelo (p.ej. {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Ingrese el número de pasos (p.ej., 50)",
|
||||
"Enter Score": "Ingrese la puntuación",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Hecho por la comunidad de OpenWebUI",
|
||||
"Make sure to enclose them with": "Asegúrese de adjuntarlos con",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "Gestionar",
|
||||
"Manage Models": "Administrar Modelos",
|
||||
"Manage Ollama Models": "Administrar Modelos Ollama",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "Memoria liberada correctamente",
|
||||
"Memory deleted successfully": "Memoria borrada correctamente",
|
||||
"Memory updated successfully": "Memoria actualizada correctamente",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Los mensajes que envíe después de crear su enlace no se compartirán. Los usuarios con el enlace podrán ver el chat compartido.",
|
||||
"Min P": "",
|
||||
"Minimum Score": "Puntuación mínima",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "¡Ups! Parece que la URL no es válida. Vuelva a verificar e inténtelo nuevamente.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "¡Oops! Hubo un error en la respuesta anterior. Intente de nuevo o póngase en contacto con el administrador.",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "¡Ups! Estás utilizando un método no compatible (solo frontend). Por favor ejecute la WebUI desde el backend.",
|
||||
"Open AI (Dall-E)": "Abrir AI (Dall-E)",
|
||||
"Open new chat": "Abrir nuevo chat",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -537,13 +542,13 @@
|
|||
"Select a base model": "Seleccionar un modelo base",
|
||||
"Select a engine": "Busca un motor",
|
||||
"Select a function": "Busca una función",
|
||||
"Select a mode": "Selecciona un modo",
|
||||
"Select a model": "Selecciona un modelo",
|
||||
"Select a pipeline": "Selección de una Pipeline",
|
||||
"Select a pipeline url": "Selección de una dirección URL de Pipeline",
|
||||
"Select a tool": "Busca una herramienta",
|
||||
"Select an Ollama instance": "Seleccione una instancia de Ollama",
|
||||
"Select Documents": "Seleccionar Documentos",
|
||||
"Select Engine": "",
|
||||
"Select model": "Selecciona un modelo",
|
||||
"Select only one model to call": "Selecciona sólo un modelo para llamar",
|
||||
"Selected model(s) do not support image inputs": "Los modelos seleccionados no admiten entradas de imagen",
|
||||
|
|
@ -565,7 +570,6 @@
|
|||
"Set Voice": "Establecer la voz",
|
||||
"Settings": "Configuración",
|
||||
"Settings saved successfully!": "¡Configuración guardada con éxito!",
|
||||
"Settings updated successfully": "¡Configuración actualizada con éxito!",
|
||||
"Share": "Compartir",
|
||||
"Share Chat": "Compartir Chat",
|
||||
"Share to OpenWebUI Community": "Compartir con la comunidad OpenWebUI",
|
||||
|
|
@ -601,6 +605,7 @@
|
|||
"Tell us more:": "Dinos más:",
|
||||
"Temperature": "Temperatura",
|
||||
"Template": "Plantilla",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "Finalización de texto",
|
||||
"Text-to-Speech Engine": "Motor de texto a voz",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -612,7 +617,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "Esta acción no se puede deshacer. ¿Desea continuar?",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Esto garantiza que sus valiosas conversaciones se guarden de forma segura en su base de datos en el backend. ¡Gracias!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Esta es una característica experimental que puede no funcionar como se esperaba y está sujeto a cambios en cualquier momento.",
|
||||
"This setting does not sync across browsers or devices.": "Esta configuración no se sincroniza entre navegadores o dispositivos.",
|
||||
"This will delete": "Esto eliminará",
|
||||
"Thorough explanation": "Explicación exhaustiva",
|
||||
"Tika": "",
|
||||
|
|
@ -693,14 +697,12 @@
|
|||
"Web": "Web",
|
||||
"Web API": "API Web",
|
||||
"Web Loader Settings": "Web Loader Settings",
|
||||
"Web Params": "Web Params",
|
||||
"Web Search": "Búsqueda en la Web",
|
||||
"Web Search Engine": "Motor de búsqueda web",
|
||||
"Webhook URL": "Webhook URL",
|
||||
"WebUI Settings": "Configuración del WebUI",
|
||||
"WebUI will make requests to": "WebUI realizará solicitudes a",
|
||||
"What’s New in": "Novedades en",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Cuando el historial está desactivado, los nuevos chats en este navegador no aparecerán en el historial de ninguno de sus dispositivos..",
|
||||
"Whisper (Local)": "Whisper (Local)",
|
||||
"Widescreen Mode": "Modo de pantalla ancha",
|
||||
"Workspace": "Espacio de trabajo",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "همه کاربران",
|
||||
"Allow": "اجازه دادن",
|
||||
"Allow Chat Deletion": "اجازه حذف گپ",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "",
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"alphanumeric characters and hyphens": "حروف الفبایی و خط فاصله",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "",
|
||||
"August": "آگوست",
|
||||
"Auto-playback response": "پخش خودکار پاسخ ",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "پایه URL AUTOMATIC1111 ",
|
||||
"AUTOMATIC1111 Base URL is required.": "به URL پایه AUTOMATIC1111 مورد نیاز است.",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "UI\u200cی\u200c گفتگو\u200c",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "جهت\u200cگفتگو",
|
||||
"Chat History": "تاریخچه\u200cی گفتگو",
|
||||
"Chat History is off for this browser.": "سابقه گپ برای این مرورگر خاموش است.",
|
||||
"Chats": "گپ\u200cها",
|
||||
"Check Again": "چک مجدد",
|
||||
"Check for updates": "بررسی به\u200cروزرسانی",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "برای انتخاب یک فایل csv اینجا را کلیک کنید.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "برای انتخاب اسناد اینجا را کلیک کنید.",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "اینجا کلیک کنید.",
|
||||
"Click on the user role button to change a user's role.": "برای تغییر نقش کاربر، روی دکمه نقش کاربر کلیک کنید.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "کومیوآی",
|
||||
"ComfyUI Base URL": "URL پایه کومیوآی",
|
||||
"ComfyUI Base URL is required.": "URL پایه کومیوآی الزامی است.",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "دستور",
|
||||
"Concurrent Requests": "درخواست های همزمان",
|
||||
"Confirm": "",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "پایگاه داده",
|
||||
"December": "دسامبر",
|
||||
"Default": "پیشفرض",
|
||||
"Default (Automatic1111)": "پیشفرض (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "پیشفرض (SentenceTransformers)",
|
||||
"Default Model": "مدل پیشفرض",
|
||||
"Default model updated": "مدل پیشفرض به\u200cروزرسانی شد",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "سند",
|
||||
"Document Settings": "تنظیمات سند",
|
||||
"Documentation": "",
|
||||
"Documents": "اسناد",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "هیچ اتصال خارجی ایجاد نمی کند و داده های شما به طور ایمن در سرور میزبان محلی شما باقی می ماند.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "مدل پیدائش",
|
||||
"Embedding Model Engine": "محرک مدل پیدائش",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "مدل پیدائش را به \"{{embedding_model}}\" تنظیم کنید",
|
||||
"Enable Chat History": "تاریخچه چت را فعال کنید",
|
||||
"Enable Community Sharing": "فعالسازی اشتراک انجمن",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "فعال کردن ثبت نام\u200cهای جدید",
|
||||
"Enable Web Search": "فعالسازی جستجوی وب",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "شناسه موتور PSE گوگل را وارد کنید",
|
||||
"Enter Image Size (e.g. 512x512)": "اندازه تصویر را وارد کنید (مثال: 512x512)",
|
||||
"Enter language codes": "کد زبان را وارد کنید",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "تگ مدل را وارد کنید (مثلا {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "تعداد گام ها را وارد کنید (مثال: 50)",
|
||||
"Enter Score": "امتیاز را وارد کنید",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "ساخته شده توسط OpenWebUI Community",
|
||||
"Make sure to enclose them with": "مطمئن شوید که آنها را با این محصور کنید:",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "",
|
||||
"Manage Models": "مدیریت مدل\u200cها",
|
||||
"Manage Ollama Models": "مدیریت مدل\u200cهای اولاما",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "پیام های شما بعد از ایجاد لینک شما به اشتراک نمی گردد. کاربران با لینک URL می توانند چت اشتراک را مشاهده کنند.",
|
||||
"Min P": "",
|
||||
"Minimum Score": "نماد کمینه",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "اوه! به نظر می رسد URL نامعتبر است. لطفاً دوباره بررسی کنید و دوباره امتحان کنید.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "اوه! شما از یک روش پشتیبانی نشده (فقط frontend) استفاده می کنید. لطفاً WebUI را از بکند اجرا کنید.",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "باز کردن گپ جدید",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -536,13 +541,13 @@
|
|||
"Select a base model": "انتخاب یک مدل پایه",
|
||||
"Select a engine": "",
|
||||
"Select a function": "",
|
||||
"Select a mode": "یک حالت انتخاب کنید",
|
||||
"Select a model": "انتخاب یک مدل",
|
||||
"Select a pipeline": "انتخاب یک خط لوله",
|
||||
"Select a pipeline url": "یک ادرس خط لوله را انتخاب کنید",
|
||||
"Select a tool": "",
|
||||
"Select an Ollama instance": "انتخاب یک نمونه از اولاما",
|
||||
"Select Documents": "",
|
||||
"Select Engine": "",
|
||||
"Select model": "انتخاب یک مدل",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "مدل) های (انتخاب شده ورودیهای تصویر را پشتیبانی نمیکند",
|
||||
|
|
@ -564,7 +569,6 @@
|
|||
"Set Voice": "تنظیم صدا",
|
||||
"Settings": "تنظیمات",
|
||||
"Settings saved successfully!": "تنظیمات با موفقیت ذخیره شد!",
|
||||
"Settings updated successfully": "",
|
||||
"Share": "اشتراک\u200cگذاری",
|
||||
"Share Chat": "اشتراک\u200cگذاری چت",
|
||||
"Share to OpenWebUI Community": "اشتراک گذاری با OpenWebUI Community",
|
||||
|
|
@ -600,6 +604,7 @@
|
|||
"Tell us more:": "بیشتر بگویید:",
|
||||
"Temperature": "دما",
|
||||
"Template": "الگو",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "تکمیل متن",
|
||||
"Text-to-Speech Engine": "موتور تبدیل متن به گفتار",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -611,7 +616,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "این تضمین می کند که مکالمات ارزشمند شما به طور ایمن در پایگاه داده بکند ذخیره می شود. تشکر!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "این تنظیم در مرورگرها یا دستگاه\u200cها همگام\u200cسازی نمی\u200cشود.",
|
||||
"This will delete": "",
|
||||
"Thorough explanation": "توضیح کامل",
|
||||
"Tika": "",
|
||||
|
|
@ -692,14 +696,12 @@
|
|||
"Web": "وب",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "تنظیمات لودر وب",
|
||||
"Web Params": "پارامترهای وب",
|
||||
"Web Search": "جستجوی وب",
|
||||
"Web Search Engine": "موتور جستجوی وب",
|
||||
"Webhook URL": "URL وبهوک",
|
||||
"WebUI Settings": "تنظیمات WebUI",
|
||||
"WebUI will make requests to": "WebUI درخواست\u200cها را ارسال خواهد کرد به",
|
||||
"What’s New in": "موارد جدید در",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "وقتی سابقه خاموش است، چت\u200cهای جدید در این مرورگر در سابقه شما در هیچ یک از دستگاه\u200cهایتان ظاهر نمی\u200cشوند.",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "محیط کار",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "Kaikki käyttäjät",
|
||||
"Allow": "Salli",
|
||||
"Allow Chat Deletion": "Salli keskustelujen poisto",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "",
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"alphanumeric characters and hyphens": "kirjaimia, numeroita ja väliviivoja",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "",
|
||||
"August": "elokuu",
|
||||
"Auto-playback response": "Soita vastaus automaattisesti",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111-perus-URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111-perus-URL vaaditaan.",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "Keskustelu-pallojen käyttöliittymä",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "Keskustelun suunta",
|
||||
"Chat History": "Keskusteluhistoria",
|
||||
"Chat History is off for this browser.": "Keskusteluhistoria on pois päältä tällä selaimella.",
|
||||
"Chats": "Keskustelut",
|
||||
"Check Again": "Tarkista uudelleen",
|
||||
"Check for updates": "Tarkista päivitykset",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "Klikkaa tästä valitaksesi CSV-tiedosto.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Klikkaa tästä valitaksesi asiakirjoja.",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "klikkaa tästä.",
|
||||
"Click on the user role button to change a user's role.": "Klikkaa käyttäjän roolipainiketta vaihtaaksesi käyttäjän roolia.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "ComfyUI-perus-URL",
|
||||
"ComfyUI Base URL is required.": "ComfyUI-perus-URL vaaditaan.",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "Komento",
|
||||
"Concurrent Requests": "Samanaikaiset pyynnöt",
|
||||
"Confirm": "",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "Tietokanta",
|
||||
"December": "joulukuu",
|
||||
"Default": "Oletus",
|
||||
"Default (Automatic1111)": "Oletus (AUTOMATIC1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "Oletus (SentenceTransformers)",
|
||||
"Default Model": "Oletusmalli",
|
||||
"Default model updated": "Oletusmalli päivitetty",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "Asiakirja",
|
||||
"Document Settings": "Asiakirja-asetukset",
|
||||
"Documentation": "",
|
||||
"Documents": "Asiakirjat",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "ei tee ulkoisia yhteyksiä, ja tietosi pysyvät turvallisesti paikallisesti isännöidyllä palvelimellasi.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "Upotusmalli",
|
||||
"Embedding Model Engine": "Upotusmallin moottori",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "\"{{embedding_model}}\" valittu upotusmalliksi",
|
||||
"Enable Chat History": "Ota keskusteluhistoria käyttöön",
|
||||
"Enable Community Sharing": "Ota yhteisön jakaminen käyttöön",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "Salli uudet rekisteröitymiset",
|
||||
"Enable Web Search": "Ota verkkohaku käyttöön",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Anna Google PSE -moottorin tunnus",
|
||||
"Enter Image Size (e.g. 512x512)": "Syötä kuvan koko (esim. 512x512)",
|
||||
"Enter language codes": "Syötä kielikoodit",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Syötä mallitagi (esim. {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Syötä askelien määrä (esim. 50)",
|
||||
"Enter Score": "Syötä pisteet",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Tehnyt OpenWebUI-yhteisö",
|
||||
"Make sure to enclose them with": "Varmista, että suljet ne",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "",
|
||||
"Manage Models": "Hallitse malleja",
|
||||
"Manage Ollama Models": "Hallitse Ollama-malleja",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Linkin luomisen jälkeen lähettämiäsi viestejä ei jaeta. Käyttäjät, joilla on URL-osoite, voivat tarkastella jaettua keskustelua.",
|
||||
"Min P": "",
|
||||
"Minimum Score": "Vähimmäispisteet",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Hups! Näyttää siltä, että URL on virheellinen. Tarkista se ja yritä uudelleen.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Hupsista! Käytät ei-tuettua menetelmää. WebUI pitää palvella backendista.",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "Avaa uusi keskustelu",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -536,13 +541,13 @@
|
|||
"Select a base model": "Valitse perusmalli",
|
||||
"Select a engine": "",
|
||||
"Select a function": "",
|
||||
"Select a mode": "Valitse tila",
|
||||
"Select a model": "Valitse malli",
|
||||
"Select a pipeline": "Valitse putki",
|
||||
"Select a pipeline url": "Valitse putken URL-osoite",
|
||||
"Select a tool": "",
|
||||
"Select an Ollama instance": "Valitse Ollama-instanssi",
|
||||
"Select Documents": "",
|
||||
"Select Engine": "",
|
||||
"Select model": "Valitse malli",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Valitut mallit eivät tue kuvasyötteitä",
|
||||
|
|
@ -564,7 +569,6 @@
|
|||
"Set Voice": "Aseta puheääni",
|
||||
"Settings": "Asetukset",
|
||||
"Settings saved successfully!": "Asetukset tallennettu onnistuneesti!",
|
||||
"Settings updated successfully": "",
|
||||
"Share": "Jaa",
|
||||
"Share Chat": "Jaa keskustelu",
|
||||
"Share to OpenWebUI Community": "Jaa OpenWebUI-yhteisöön",
|
||||
|
|
@ -600,6 +604,7 @@
|
|||
"Tell us more:": "Kerro lisää:",
|
||||
"Temperature": "Lämpötila",
|
||||
"Template": "Malline",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "Tekstin täydennys",
|
||||
"Text-to-Speech Engine": "Puhemoottori",
|
||||
"Tfs Z": "TFS Z",
|
||||
|
|
@ -611,7 +616,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Tämä varmistaa, että arvokkaat keskustelusi tallennetaan turvallisesti backend-tietokantaasi. Kiitos!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "Tämä asetus ei synkronoidu selainten tai laitteiden välillä.",
|
||||
"This will delete": "",
|
||||
"Thorough explanation": "Perusteellinen selitys",
|
||||
"Tika": "",
|
||||
|
|
@ -692,14 +696,12 @@
|
|||
"Web": "Web",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Web Loader asetukset",
|
||||
"Web Params": "Web-parametrit",
|
||||
"Web Search": "Web-haku",
|
||||
"Web Search Engine": "Web-hakukone",
|
||||
"Webhook URL": "Webhook-URL",
|
||||
"WebUI Settings": "WebUI-asetukset",
|
||||
"WebUI will make requests to": "WebUI tekee pyyntöjä",
|
||||
"What’s New in": "Mitä uutta",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Kun historia on pois päältä, uudet keskustelut tässä selaimessa eivät näy historiassasi millään laitteellasi.",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "Työtilat",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "Tous les Utilisateurs",
|
||||
"Allow": "Autoriser",
|
||||
"Allow Chat Deletion": "Autoriser la suppression de l'historique de chat",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "Autoriser les voix non locales",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "Autoriser l'emplacement de l'utilisateur",
|
||||
"Allow Voice Interruption in Call": "Autoriser l'interruption vocale pendant un appel",
|
||||
"alphanumeric characters and hyphens": "caractères alphanumériques et tirets",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "Les paramètres audio ont été mis à jour avec succès",
|
||||
"August": "Août",
|
||||
"Auto-playback response": "Réponse de lecture automatique",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Chaîne d'authentification de l'API",
|
||||
"AUTOMATIC1111 Base URL": "URL de base AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "L'URL de base {AUTOMATIC1111} est requise.",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "Bulles de discussion",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "Direction du chat",
|
||||
"Chat History": "Historique de discussion",
|
||||
"Chat History is off for this browser.": "L'historique de chat est désactivé pour ce navigateur",
|
||||
"Chats": "Conversations",
|
||||
"Check Again": "Vérifiez à nouveau.",
|
||||
"Check for updates": "Vérifier les mises à jour disponibles",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "Cliquez ici pour sélectionner un fichier CSV.",
|
||||
"Click here to select a py file.": "Cliquez ici pour sélectionner un fichier .py.",
|
||||
"Click here to select documents.": "Cliquez ici pour sélectionner les documents.",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "cliquez ici.",
|
||||
"Click on the user role button to change a user's role.": "Cliquez sur le bouton de rôle d'utilisateur pour modifier le rôle d'un utilisateur.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "L'autorisation d'écriture du presse-papier a été refusée. Veuillez vérifier les paramètres de votre navigateur pour accorder l'accès nécessaire.",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "URL de base ComfyUI",
|
||||
"ComfyUI Base URL is required.": "L'URL de base ComfyUI est requise.",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "Commande",
|
||||
"Concurrent Requests": "Demandes concurrentes",
|
||||
"Confirm": "Confirmer",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "Base de données",
|
||||
"December": "Décembre",
|
||||
"Default": "Par défaut",
|
||||
"Default (Automatic1111)": "Par défaut (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "Par défaut (Sentence Transformers)",
|
||||
"Default Model": "Modèle standard",
|
||||
"Default model updated": "Modèle par défaut mis à jour",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "Document",
|
||||
"Document Settings": "Paramètres du document",
|
||||
"Documentation": "Documentation",
|
||||
"Documents": "Documents",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "ne fait aucune connexion externe et garde vos données en sécurité sur votre serveur local.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "Modèle d'embedding",
|
||||
"Embedding Model Engine": "Moteur de modèle d'encodage",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Modèle d'encodage défini sur « {{embedding_model}} »",
|
||||
"Enable Chat History": "Activer l'historique de conversation",
|
||||
"Enable Community Sharing": "Activer le partage communautaire",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "Activer les nouvelles inscriptions",
|
||||
"Enable Web Search": "Activer la recherche sur le Web",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Entrez l'identifiant du moteur Google PSE",
|
||||
"Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (par ex. 512x512)",
|
||||
"Enter language codes": "Entrez les codes de langue",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Entrez l'étiquette du modèle (par ex. {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Entrez le nombre de pas (par ex. 50)",
|
||||
"Enter Score": "Entrez votre score",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Réalisé par la communauté OpenWebUI",
|
||||
"Make sure to enclose them with": "Assurez-vous de les inclure dans",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "Gérer",
|
||||
"Manage Models": "Gérer les Modèles",
|
||||
"Manage Ollama Models": "Gérer les modèles Ollama",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "La mémoire a été effacée avec succès",
|
||||
"Memory deleted successfully": "La mémoire a été supprimée avec succès",
|
||||
"Memory updated successfully": "La mémoire a été mise à jour avec succès",
|
||||
"Merge Responses": "",
|
||||
"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 avoir créé votre lien ne seront pas partagés. Les utilisateurs disposant de l'URL pourront voir le chat partagé.",
|
||||
"Min P": "",
|
||||
"Minimum Score": "Score minimal",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oups ! Il semble que l'URL soit invalide. Veuillez vérifier à nouveau et réessayer.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "Oops ! Il y a eu une erreur dans la réponse précédente. Veuillez réessayer ou contacter l'administrateur.",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oups\u00a0! Vous utilisez une méthode non prise en charge (frontend uniquement). Veuillez servir l'interface Web à partir du backend.",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "Ouvrir une nouvelle discussion",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -537,13 +542,13 @@
|
|||
"Select a base model": "Sélectionnez un modèle de base",
|
||||
"Select a engine": "Sélectionnez un moteur",
|
||||
"Select a function": "Sélectionnez une fonction",
|
||||
"Select a mode": "Choisissez un mode",
|
||||
"Select a model": "Sélectionnez un modèle",
|
||||
"Select a pipeline": "Sélectionnez un pipeline",
|
||||
"Select a pipeline url": "Sélectionnez l'URL du pipeline",
|
||||
"Select a tool": "Sélectionnez un outil",
|
||||
"Select an Ollama instance": "Sélectionnez une instance Ollama",
|
||||
"Select Documents": "Sélectionnez des documents",
|
||||
"Select Engine": "",
|
||||
"Select model": "Sélectionnez un modèle",
|
||||
"Select only one model to call": "Sélectionnez seulement un modèle pour appeler",
|
||||
"Selected model(s) do not support image inputs": "Les modèle(s) sélectionné(s) ne prennent pas en charge les entrées d'images",
|
||||
|
|
@ -565,7 +570,6 @@
|
|||
"Set Voice": "Définir la voix",
|
||||
"Settings": "Paramètres",
|
||||
"Settings saved successfully!": "Paramètres enregistrés avec succès !",
|
||||
"Settings updated successfully": "Les paramètres ont été mis à jour avec succès",
|
||||
"Share": "Partager",
|
||||
"Share Chat": "Partage de conversation",
|
||||
"Share to OpenWebUI Community": "Partager avec la communauté OpenWebUI",
|
||||
|
|
@ -601,6 +605,7 @@
|
|||
"Tell us more:": "Dites-nous en plus à ce sujet : ",
|
||||
"Temperature": "Température",
|
||||
"Template": "Template",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "Complétion de texte",
|
||||
"Text-to-Speech Engine": "Moteur de synthèse vocale",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -612,7 +617,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "Cette action ne peut pas être annulée. Souhaitez-vous continuer ?",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Cela garantit que vos conversations précieuses soient sauvegardées en toute sécurité dans votre base de données backend. Merci !",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Il s'agit d'une fonctionnalité expérimentale, elle peut ne pas fonctionner comme prévu et est sujette à modification à tout moment.",
|
||||
"This setting does not sync across browsers or devices.": "Ce paramètre ne se synchronise pas entre les navigateurs ou les appareils.",
|
||||
"This will delete": "Cela supprimera",
|
||||
"Thorough explanation": "Explication approfondie",
|
||||
"Tika": "Tika",
|
||||
|
|
@ -693,14 +697,12 @@
|
|||
"Web": "Web",
|
||||
"Web API": "API Web",
|
||||
"Web Loader Settings": "Paramètres du chargeur web",
|
||||
"Web Params": "Paramètres Web",
|
||||
"Web Search": "Recherche Web",
|
||||
"Web Search Engine": "Moteur de recherche Web",
|
||||
"Webhook URL": "URL du webhook",
|
||||
"WebUI Settings": "Paramètres de WebUI",
|
||||
"WebUI will make requests to": "WebUI effectuera des requêtes vers",
|
||||
"What’s New in": "Quoi de neuf",
|
||||
"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 nouvelles conversations sur ce navigateur ne seront pas enregistrés dans votre historique sur aucun de vos appareils.",
|
||||
"Whisper (Local)": "Whisper (local)",
|
||||
"Widescreen Mode": "Mode Grand Écran",
|
||||
"Workspace": "Espace de travail",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "Tous les Utilisateurs",
|
||||
"Allow": "Autoriser",
|
||||
"Allow Chat Deletion": "Autoriser la suppression de l'historique de chat",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "Autoriser les voix non locales",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "Autoriser l'emplacement de l'utilisateur",
|
||||
"Allow Voice Interruption in Call": "Autoriser l'interruption vocale pendant un appel",
|
||||
"alphanumeric characters and hyphens": "caractères alphanumériques et tirets",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "Les paramètres audio ont été mis à jour avec succès",
|
||||
"August": "Août",
|
||||
"Auto-playback response": "Réponse de lecture automatique",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Chaîne d'authentification de l'API",
|
||||
"AUTOMATIC1111 Base URL": "URL de base AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "L'URL de base {AUTOMATIC1111} est requise.",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "Bulles de discussion",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "Direction du chat",
|
||||
"Chat History": "Historique de discussion",
|
||||
"Chat History is off for this browser.": "L'historique de chat est désactivé pour ce navigateur",
|
||||
"Chats": "Conversations",
|
||||
"Check Again": "Vérifiez à nouveau.",
|
||||
"Check for updates": "Vérifier les mises à jour disponibles",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "Cliquez ici pour sélectionner un fichier CSV.",
|
||||
"Click here to select a py file.": "Cliquez ici pour sélectionner un fichier .py.",
|
||||
"Click here to select documents.": "Cliquez ici pour sélectionner les documents.",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "cliquez ici.",
|
||||
"Click on the user role button to change a user's role.": "Cliquez sur le bouton de rôle d'utilisateur pour modifier le rôle d'un utilisateur.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "L'autorisation d'écriture du presse-papier a été refusée. Veuillez vérifier les paramètres de votre navigateur pour accorder l'accès nécessaire.",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "URL de base ComfyUI",
|
||||
"ComfyUI Base URL is required.": "L'URL de base ComfyUI est requise.",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "Commande",
|
||||
"Concurrent Requests": "Demandes concurrentes",
|
||||
"Confirm": "Confirmer",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "Base de données",
|
||||
"December": "Décembre",
|
||||
"Default": "Par défaut",
|
||||
"Default (Automatic1111)": "Par défaut (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "Par défaut (Sentence Transformers)",
|
||||
"Default Model": "Modèle standard",
|
||||
"Default model updated": "Modèle par défaut mis à jour",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "Document",
|
||||
"Document Settings": "Paramètres du document",
|
||||
"Documentation": "Documentation",
|
||||
"Documents": "Documents",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "ne fait aucune connexion externe et garde vos données en sécurité sur votre serveur local.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "Modèle d'embedding",
|
||||
"Embedding Model Engine": "Moteur de modèle d'encodage",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Modèle d'encodage défini sur « {{embedding_model}} »",
|
||||
"Enable Chat History": "Activer l'historique de conversation",
|
||||
"Enable Community Sharing": "Activer le partage communautaire",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "Activer les nouvelles inscriptions",
|
||||
"Enable Web Search": "Activer la recherche web",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Entrez l'identifiant du moteur Google PSE",
|
||||
"Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (par ex. 512x512)",
|
||||
"Enter language codes": "Entrez les codes de langue",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Entrez l'étiquette du modèle (par ex. {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Entrez le nombre de pas (par ex. 50)",
|
||||
"Enter Score": "Entrez votre score",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Réalisé par la communauté OpenWebUI",
|
||||
"Make sure to enclose them with": "Assurez-vous de les inclure dans",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "Gérer",
|
||||
"Manage Models": "Gérer les Modèles",
|
||||
"Manage Ollama Models": "Gérer les modèles Ollama",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "La mémoire a été effacée avec succès",
|
||||
"Memory deleted successfully": "La mémoire a été supprimée avec succès",
|
||||
"Memory updated successfully": "La mémoire a été mise à jour avec succès",
|
||||
"Merge Responses": "",
|
||||
"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 avoir créé votre lien ne seront pas partagés. Les utilisateurs disposant de l'URL pourront voir le chat partagé.",
|
||||
"Min P": "",
|
||||
"Minimum Score": "Score minimal",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oups ! Il semble que l'URL soit invalide. Veuillez vérifier à nouveau et réessayer.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "Oops ! Il y a eu une erreur dans la réponse précédente. Veuillez réessayer ou contacter l'administrateur.",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oups\u00a0! Vous utilisez une méthode non prise en charge (frontend uniquement). Veuillez servir l'interface Web à partir du backend.",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "Ouvrir une nouvelle discussion",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "La version Open WebUI (v{{OPEN_WEBUI_VERSION}}) est inférieure à la version requise (v{{REQUIRED_VERSION}})",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -537,13 +542,13 @@
|
|||
"Select a base model": "Sélectionnez un modèle de base",
|
||||
"Select a engine": "Sélectionnez un moteur",
|
||||
"Select a function": "Sélectionnez une fonction",
|
||||
"Select a mode": "Choisissez un mode",
|
||||
"Select a model": "Sélectionnez un modèle",
|
||||
"Select a pipeline": "Sélectionnez un pipeline",
|
||||
"Select a pipeline url": "Sélectionnez l'URL du pipeline",
|
||||
"Select a tool": "Sélectionnez un outil",
|
||||
"Select an Ollama instance": "Sélectionnez une instance Ollama",
|
||||
"Select Documents": "Sélectionnez des documents",
|
||||
"Select Engine": "",
|
||||
"Select model": "Sélectionnez un modèle",
|
||||
"Select only one model to call": "Sélectionnez seulement un modèle pour appeler",
|
||||
"Selected model(s) do not support image inputs": "Les modèle(s) sélectionné(s) ne prennent pas en charge les entrées d'images",
|
||||
|
|
@ -565,7 +570,6 @@
|
|||
"Set Voice": "Définir la voix",
|
||||
"Settings": "Paramètres",
|
||||
"Settings saved successfully!": "Paramètres enregistrés avec succès !",
|
||||
"Settings updated successfully": "Les paramètres ont été mis à jour avec succès",
|
||||
"Share": "Partager",
|
||||
"Share Chat": "Partage de conversation",
|
||||
"Share to OpenWebUI Community": "Partager avec la communauté OpenWebUI",
|
||||
|
|
@ -601,6 +605,7 @@
|
|||
"Tell us more:": "Dites-nous en plus à ce sujet : ",
|
||||
"Temperature": "Température",
|
||||
"Template": "Template",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "Complétion de texte",
|
||||
"Text-to-Speech Engine": "Moteur de synthèse vocale",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -612,7 +617,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "Cette action ne peut pas être annulée. Souhaitez-vous continuer ?",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Cela garantit que vos conversations précieuses soient sauvegardées en toute sécurité dans votre base de données backend. Merci !",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Il s'agit d'une fonctionnalité expérimentale, elle peut ne pas fonctionner comme prévu et est sujette à modification à tout moment.",
|
||||
"This setting does not sync across browsers or devices.": "Ce paramètre ne se synchronise pas entre les navigateurs ou les appareils.",
|
||||
"This will delete": "Cela supprimera",
|
||||
"Thorough explanation": "Explication approfondie",
|
||||
"Tika": "Tika",
|
||||
|
|
@ -693,14 +697,12 @@
|
|||
"Web": "Web",
|
||||
"Web API": "API Web",
|
||||
"Web Loader Settings": "Paramètres du chargeur web",
|
||||
"Web Params": "Paramètres Web",
|
||||
"Web Search": "Recherche Web",
|
||||
"Web Search Engine": "Moteur de recherche Web",
|
||||
"Webhook URL": "URL du webhook",
|
||||
"WebUI Settings": "Paramètres de WebUI",
|
||||
"WebUI will make requests to": "WebUI effectuera des requêtes vers",
|
||||
"What’s New in": "Quoi de neuf",
|
||||
"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 nouvelles conversations sur ce navigateur ne seront pas enregistrés dans votre historique sur aucun de vos appareils.",
|
||||
"Whisper (Local)": "Whisper (local)",
|
||||
"Widescreen Mode": "Mode Grand Écran",
|
||||
"Workspace": "Espace de travail",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "כל המשתמשים",
|
||||
"Allow": "אפשר",
|
||||
"Allow Chat Deletion": "אפשר מחיקת צ'אט",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "",
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"alphanumeric characters and hyphens": "תווים אלפאנומריים ומקפים",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "",
|
||||
"August": "אוגוסט",
|
||||
"Auto-playback response": "תגובת השמעה אוטומטית",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "כתובת URL בסיסית של AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "נדרשת כתובת URL בסיסית של AUTOMATIC1111",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "UI של תיבת הדיבור",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "כיוון צ'אט",
|
||||
"Chat History": "היסטוריית צ'אט",
|
||||
"Chat History is off for this browser.": "היסטוריית הצ'אט כבויה לדפדפן זה.",
|
||||
"Chats": "צ'אטים",
|
||||
"Check Again": "בדוק שוב",
|
||||
"Check for updates": "בדוק עדכונים",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "לחץ כאן לבחירת קובץ csv.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "לחץ כאן לבחירת מסמכים.",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "לחץ כאן.",
|
||||
"Click on the user role button to change a user's role.": "לחץ על כפתור תפקיד המשתמש כדי לשנות את תפקיד המשתמש.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "כתובת URL בסיסית של ComfyUI",
|
||||
"ComfyUI Base URL is required.": "נדרשת כתובת URL בסיסית של ComfyUI",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "פקודה",
|
||||
"Concurrent Requests": "בקשות בו-זמניות",
|
||||
"Confirm": "",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "מסד נתונים",
|
||||
"December": "דצמבר",
|
||||
"Default": "ברירת מחדל",
|
||||
"Default (Automatic1111)": "ברירת מחדל (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "ברירת מחדל (SentenceTransformers)",
|
||||
"Default Model": "מודל ברירת מחדל",
|
||||
"Default model updated": "המודל המוגדר כברירת מחדל עודכן",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "מסמך",
|
||||
"Document Settings": "הגדרות מסמך",
|
||||
"Documentation": "",
|
||||
"Documents": "מסמכים",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "לא מבצע חיבורים חיצוניים, והנתונים שלך נשמרים באופן מאובטח בשרת המקומי שלך.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "מודל הטמעה",
|
||||
"Embedding Model Engine": "מנוע מודל הטמעה",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "מודל ההטמעה הוגדר ל-\"{{embedding_model}}\"",
|
||||
"Enable Chat History": "הפעל היסטוריית צ'אט",
|
||||
"Enable Community Sharing": "הפיכת שיתוף קהילה לזמין",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "אפשר הרשמות חדשות",
|
||||
"Enable Web Search": "הפיכת חיפוש באינטרנט לזמין",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "הזן את מזהה מנוע PSE של Google",
|
||||
"Enter Image Size (e.g. 512x512)": "הזן גודל תמונה (למשל 512x512)",
|
||||
"Enter language codes": "הזן קודי שפה",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "הזן תג מודל (למשל {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "הזן מספר שלבים (למשל 50)",
|
||||
"Enter Score": "הזן ציון",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "נוצר על ידי קהילת OpenWebUI",
|
||||
"Make sure to enclose them with": "ודא להקיף אותם עם",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "",
|
||||
"Manage Models": "נהל מודלים",
|
||||
"Manage Ollama Models": "נהל מודלים של Ollama",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "הודעות שתשלח לאחר יצירת הקישור לא ישותפו. משתמשים עם כתובת האתר יוכלו לצפות בצ'אט המשותף.",
|
||||
"Min P": "",
|
||||
"Minimum Score": "ציון מינימלי",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "אופס! נראה שהכתובת URL אינה תקינה. אנא בדוק שוב ונסה שנית.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "אופס! אתה משתמש בשיטה לא נתמכת (רק חזית). אנא שרת את ממשק המשתמש האינטרנטי מהשרת האחורי.",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "פתח צ'אט חדש",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -537,13 +542,13 @@
|
|||
"Select a base model": "בחירת מודל בסיס",
|
||||
"Select a engine": "",
|
||||
"Select a function": "",
|
||||
"Select a mode": "בחר מצב",
|
||||
"Select a model": "בחר מודל",
|
||||
"Select a pipeline": "בחר קו צינור",
|
||||
"Select a pipeline url": "בחר כתובת URL של קו צינור",
|
||||
"Select a tool": "",
|
||||
"Select an Ollama instance": "בחר מופע של Ollama",
|
||||
"Select Documents": "",
|
||||
"Select Engine": "",
|
||||
"Select model": "בחר מודל",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "דגמים נבחרים אינם תומכים בקלט תמונה",
|
||||
|
|
@ -565,7 +570,6 @@
|
|||
"Set Voice": "הגדר קול",
|
||||
"Settings": "הגדרות",
|
||||
"Settings saved successfully!": "ההגדרות נשמרו בהצלחה!",
|
||||
"Settings updated successfully": "",
|
||||
"Share": "שתף",
|
||||
"Share Chat": "שתף צ'אט",
|
||||
"Share to OpenWebUI Community": "שתף לקהילת OpenWebUI",
|
||||
|
|
@ -601,6 +605,7 @@
|
|||
"Tell us more:": "תרשמו יותר:",
|
||||
"Temperature": "טמפרטורה",
|
||||
"Template": "תבנית",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "תחילת טקסט",
|
||||
"Text-to-Speech Engine": "מנוע טקסט לדיבור",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -612,7 +617,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "פעולה זו מבטיחה שהשיחות בעלות הערך שלך יישמרו באופן מאובטח במסד הנתונים העורפי שלך. תודה!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "הגדרה זו אינה מסתנכרנת בין דפדפנים או מכשירים.",
|
||||
"This will delete": "",
|
||||
"Thorough explanation": "תיאור מפורט",
|
||||
"Tika": "",
|
||||
|
|
@ -693,14 +697,12 @@
|
|||
"Web": "רשת",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "הגדרות טעינת אתר",
|
||||
"Web Params": "פרמטרים Web",
|
||||
"Web Search": "חיפוש באינטרנט",
|
||||
"Web Search Engine": "מנוע חיפוש באינטרנט",
|
||||
"Webhook URL": "URL Webhook",
|
||||
"WebUI Settings": "הגדרות WebUI",
|
||||
"WebUI will make requests to": "WebUI יבקש לבקש",
|
||||
"What’s New in": "מה חדש ב",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "כאשר ההיסטוריה מושבתת, צ'אטים חדשים בדפדפן זה לא יופיעו בהיסטוריה שלך באף אחד מהמכשירים שלך.",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "סביבה",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "सभी उपयोगकर्ता",
|
||||
"Allow": "अनुमति दें",
|
||||
"Allow Chat Deletion": "चैट हटाने की अनुमति दें",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "",
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"alphanumeric characters and hyphens": "अल्फ़ान्यूमेरिक वर्ण और हाइफ़न",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "",
|
||||
"August": "अगस्त",
|
||||
"Auto-playback response": "ऑटो-प्लेबैक प्रतिक्रिया",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 बेस यूआरएल",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 का बेस यूआरएल आवश्यक है।",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "चैट बॉली",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "चैट दिशा",
|
||||
"Chat History": "चैट का इतिहास",
|
||||
"Chat History is off for this browser.": "इस ब्राउज़र के लिए चैट इतिहास बंद है।",
|
||||
"Chats": "सभी चैट",
|
||||
"Check Again": "फिर से जाँचो",
|
||||
"Check for updates": "अपडेट के लिए जाँच",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "सीएसवी फ़ाइल का चयन करने के लिए यहां क्लिक करें।",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "दस्तावेज़ चुनने के लिए यहां क्लिक करें।",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "यहाँ क्लिक करें।",
|
||||
"Click on the user role button to change a user's role.": "उपयोगकर्ता की भूमिका बदलने के लिए उपयोगकर्ता भूमिका बटन पर क्लिक करें।",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "ComfyUI बेस यूआरएल",
|
||||
"ComfyUI Base URL is required.": "ComfyUI का बेस यूआरएल आवश्यक है",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "कमांड",
|
||||
"Concurrent Requests": "समवर्ती अनुरोध",
|
||||
"Confirm": "",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "डेटाबेस",
|
||||
"December": "डिसेंबर",
|
||||
"Default": "डिफ़ॉल्ट",
|
||||
"Default (Automatic1111)": "डिफ़ॉल्ट (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "डिफ़ॉल्ट (SentenceTransformers)",
|
||||
"Default Model": "डिफ़ॉल्ट मॉडल",
|
||||
"Default model updated": "डिफ़ॉल्ट मॉडल अपडेट किया गया",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "दस्तावेज़",
|
||||
"Document Settings": "दस्तावेज़ सेटिंग्स",
|
||||
"Documentation": "",
|
||||
"Documents": "दस्तावेज़",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "कोई बाहरी कनेक्शन नहीं बनाता है, और आपका डेटा आपके स्थानीय रूप से होस्ट किए गए सर्वर पर सुरक्षित रूप से रहता है।",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "मॉडेल अनुकूलन",
|
||||
"Embedding Model Engine": "एंबेडिंग मॉडल इंजन",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "एम्बेडिंग मॉडल को \"{{embedding_model}}\" पर सेट किया गया",
|
||||
"Enable Chat History": "चैट इतिहास सक्रिय करें",
|
||||
"Enable Community Sharing": "समुदाय साझाकरण सक्षम करें",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "नए साइन अप सक्रिय करें",
|
||||
"Enable Web Search": "वेब खोज सक्षम करें",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Google PSE इंजन आईडी दर्ज करें",
|
||||
"Enter Image Size (e.g. 512x512)": "छवि का आकार दर्ज करें (उदा. 512x512)",
|
||||
"Enter language codes": "भाषा कोड दर्ज करें",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Model tag दर्ज करें (उदा. {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "चरणों की संख्या दर्ज करें (उदा. 50)",
|
||||
"Enter Score": "स्कोर दर्ज करें",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "OpenWebUI समुदाय द्वारा निर्मित",
|
||||
"Make sure to enclose them with": "उन्हें संलग्न करना सुनिश्चित करें",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "",
|
||||
"Manage Models": "मॉडल प्रबंधित करें",
|
||||
"Manage Ollama Models": "Ollama मॉडल प्रबंधित करें",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "अपना लिंक बनाने के बाद आपके द्वारा भेजे गए संदेश साझा नहीं किए जाएंगे। यूआरएल वाले यूजर्स शेयर की गई चैट देख पाएंगे।",
|
||||
"Min P": "",
|
||||
"Minimum Score": "न्यूनतम स्कोर",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "उफ़! ऐसा लगता है कि यूआरएल अमान्य है. कृपया दोबारा जांचें और पुनः प्रयास करें।",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "उफ़! आप एक असमर्थित विधि (केवल फ्रंटएंड) का उपयोग कर रहे हैं। कृपया बैकएंड से WebUI सर्वे करें।",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "नई चैट खोलें",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -536,13 +541,13 @@
|
|||
"Select a base model": "एक आधार मॉडल का चयन करें",
|
||||
"Select a engine": "",
|
||||
"Select a function": "",
|
||||
"Select a mode": "एक मोड चुनें",
|
||||
"Select a model": "एक मॉडल चुनें",
|
||||
"Select a pipeline": "एक पाइपलाइन का चयन करें",
|
||||
"Select a pipeline url": "एक पाइपलाइन url चुनें",
|
||||
"Select a tool": "",
|
||||
"Select an Ollama instance": "एक Ollama Instance चुनें",
|
||||
"Select Documents": "",
|
||||
"Select Engine": "",
|
||||
"Select model": "मॉडल चुनें",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "चयनित मॉडल छवि इनपुट का समर्थन नहीं करते हैं",
|
||||
|
|
@ -564,7 +569,6 @@
|
|||
"Set Voice": "आवाज सेट करें",
|
||||
"Settings": "सेटिंग्स",
|
||||
"Settings saved successfully!": "सेटिंग्स सफलतापूर्वक सहेजी गईं!",
|
||||
"Settings updated successfully": "",
|
||||
"Share": "साझा करें",
|
||||
"Share Chat": "चैट साझा करें",
|
||||
"Share to OpenWebUI Community": "OpenWebUI समुदाय में साझा करें",
|
||||
|
|
@ -600,6 +604,7 @@
|
|||
"Tell us more:": "हमें और अधिक बताएँ:",
|
||||
"Temperature": "टेंपेरेचर",
|
||||
"Template": "टेम्पलेट",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "पाठ समापन",
|
||||
"Text-to-Speech Engine": "टेक्स्ट-टू-स्पीच इंजन",
|
||||
"Tfs Z": "टफ्स Z",
|
||||
|
|
@ -611,7 +616,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "यह सुनिश्चित करता है कि आपकी मूल्यवान बातचीत आपके बैकएंड डेटाबेस में सुरक्षित रूप से सहेजी गई है। धन्यवाद!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "यह सेटिंग सभी ब्राउज़रों या डिवाइसों में समन्वयित नहीं होती है",
|
||||
"This will delete": "",
|
||||
"Thorough explanation": "विस्तृत व्याख्या",
|
||||
"Tika": "",
|
||||
|
|
@ -692,14 +696,12 @@
|
|||
"Web": "वेब",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "वेब लोडर सेटिंग्स",
|
||||
"Web Params": "वेब पैरामीटर",
|
||||
"Web Search": "वेब खोज",
|
||||
"Web Search Engine": "वेब खोज इंजन",
|
||||
"Webhook URL": "वेबहुक URL",
|
||||
"WebUI Settings": "WebUI सेटिंग्स",
|
||||
"WebUI will make requests to": "WebUI अनुरोध करेगा",
|
||||
"What’s New in": "इसमें नया क्या है",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "जब इतिहास बंद हो जाता है, तो इस ब्राउज़र पर नई चैट आपके किसी भी डिवाइस पर इतिहास में दिखाई नहीं देंगी।",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "वर्कस्पेस",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "Svi korisnici",
|
||||
"Allow": "Dopusti",
|
||||
"Allow Chat Deletion": "Dopusti brisanje razgovora",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "Dopusti nelokalne glasove",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "",
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"alphanumeric characters and hyphens": "alfanumerički znakovi i crtice",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "",
|
||||
"August": "Kolovoz",
|
||||
"Auto-playback response": "Automatska reprodukcija odgovora",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 osnovni URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "Potreban je AUTOMATIC1111 osnovni URL.",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "Razgovor - Bubble UI",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "Razgovor - smijer",
|
||||
"Chat History": "Povijest razgovora",
|
||||
"Chat History is off for this browser.": "Povijest razgovora je isključena za ovaj preglednik.",
|
||||
"Chats": "Razgovori",
|
||||
"Check Again": "Provjeri ponovo",
|
||||
"Check for updates": "Provjeri za ažuriranja",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "Kliknite ovdje da odaberete csv datoteku.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Kliknite ovdje da odaberete dokumente.",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "kliknite ovdje.",
|
||||
"Click on the user role button to change a user's role.": "Kliknite na gumb uloge korisnika za promjenu uloge korisnika.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "ComfyUI osnovni URL",
|
||||
"ComfyUI Base URL is required.": "Potreban je ComfyUI osnovni URL.",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "Naredba",
|
||||
"Concurrent Requests": "Istodobni zahtjevi",
|
||||
"Confirm": "",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "Baza podataka",
|
||||
"December": "Prosinac",
|
||||
"Default": "Zadano",
|
||||
"Default (Automatic1111)": "Zadano (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "Zadano (SentenceTransformers)",
|
||||
"Default Model": "Zadani model",
|
||||
"Default model updated": "Zadani model ažuriran",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "Dokument",
|
||||
"Document Settings": "Postavke dokumenta",
|
||||
"Documentation": "Dokumentacija",
|
||||
"Documents": "Dokumenti",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "ne uspostavlja vanjske veze, a vaši podaci ostaju sigurno na vašem lokalno hostiranom poslužitelju.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "Embedding model",
|
||||
"Embedding Model Engine": "Embedding model pogon",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Embedding model postavljen na \"{{embedding_model}}\"",
|
||||
"Enable Chat History": "Omogući povijest razgovora",
|
||||
"Enable Community Sharing": "Omogući zajedničko korištenje zajednice",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "Omogući nove prijave",
|
||||
"Enable Web Search": "Omogući pretraživanje weba",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Unesite ID Google PSE motora",
|
||||
"Enter Image Size (e.g. 512x512)": "Unesite veličinu slike (npr. 512x512)",
|
||||
"Enter language codes": "Unesite kodove jezika",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Unesite oznaku modela (npr. {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Unesite broj koraka (npr. 50)",
|
||||
"Enter Score": "Unesite ocjenu",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Izradio OpenWebUI Community",
|
||||
"Make sure to enclose them with": "Provjerite da ih zatvorite s",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "Upravljaj",
|
||||
"Manage Models": "Upravljanje modelima",
|
||||
"Manage Ollama Models": "Upravljanje Ollama modelima",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Poruke koje pošaljete nakon stvaranja veze neće se dijeliti. Korisnici s URL-om moći će vidjeti zajednički chat.",
|
||||
"Min P": "",
|
||||
"Minimum Score": "Minimalna ocjena",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Ups! Izgleda da je URL nevažeći. Molimo provjerite ponovno i pokušajte ponovo.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ups! Koristite nepodržanu metodu (samo frontend). Molimo poslužite WebUI s backend-a.",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "Otvorite novi razgovor",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -537,13 +542,13 @@
|
|||
"Select a base model": "Odabir osnovnog modela",
|
||||
"Select a engine": "Odaberite pogon",
|
||||
"Select a function": "",
|
||||
"Select a mode": "Odaberite način",
|
||||
"Select a model": "Odaberite model",
|
||||
"Select a pipeline": "Odabir kanala",
|
||||
"Select a pipeline url": "Odabir URL-a kanala",
|
||||
"Select a tool": "",
|
||||
"Select an Ollama instance": "Odaberite Ollama instancu",
|
||||
"Select Documents": "Odaberite dokumente",
|
||||
"Select Engine": "",
|
||||
"Select model": "Odaberite model",
|
||||
"Select only one model to call": "Odaberite samo jedan model za poziv",
|
||||
"Selected model(s) do not support image inputs": "Odabrani modeli ne podržavaju unose slika",
|
||||
|
|
@ -565,7 +570,6 @@
|
|||
"Set Voice": "Postavi glas",
|
||||
"Settings": "Postavke",
|
||||
"Settings saved successfully!": "Postavke su uspješno spremljene!",
|
||||
"Settings updated successfully": "Postavke uspješno ažurirane",
|
||||
"Share": "Podijeli",
|
||||
"Share Chat": "Podijeli razgovor",
|
||||
"Share to OpenWebUI Community": "Podijeli u OpenWebUI zajednici",
|
||||
|
|
@ -601,6 +605,7 @@
|
|||
"Tell us more:": "Recite nam više:",
|
||||
"Temperature": "Temperatura",
|
||||
"Template": "Predložak",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "Dovršavanje teksta",
|
||||
"Text-to-Speech Engine": "Stroj za pretvorbu teksta u govor",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -612,7 +617,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Ovo osigurava da su vaši vrijedni razgovori sigurno spremljeni u bazu podataka. Hvala vam!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Ovo je eksperimentalna značajka, možda neće funkcionirati prema očekivanjima i podložna je promjenama u bilo kojem trenutku.",
|
||||
"This setting does not sync across browsers or devices.": "Ova postavka se ne sinkronizira između preglednika ili uređaja.",
|
||||
"This will delete": "",
|
||||
"Thorough explanation": "Detaljno objašnjenje",
|
||||
"Tika": "",
|
||||
|
|
@ -693,14 +697,12 @@
|
|||
"Web": "Web",
|
||||
"Web API": "Web API",
|
||||
"Web Loader Settings": "Postavke web učitavanja",
|
||||
"Web Params": "Web parametri",
|
||||
"Web Search": "Internet pretraga",
|
||||
"Web Search Engine": "Web tražilica",
|
||||
"Webhook URL": "URL webkuke",
|
||||
"WebUI Settings": "WebUI postavke",
|
||||
"WebUI will make requests to": "WebUI će slati zahtjeve na",
|
||||
"What’s New in": "Što je novo u",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Kada je povijest isključena, novi razgovori na ovom pregledniku neće se pojaviti u vašoj povijesti na bilo kojem od vaših uređaja.",
|
||||
"Whisper (Local)": "Whisper (lokalno)",
|
||||
"Widescreen Mode": "Mod širokog zaslona",
|
||||
"Workspace": "Radna ploča",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "Semua Pengguna",
|
||||
"Allow": "Mengizinkan",
|
||||
"Allow Chat Deletion": "Izinkan Penghapusan Obrolan",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "Izinkan suara non-lokal",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "Izinkan Lokasi Pengguna",
|
||||
"Allow Voice Interruption in Call": "Izinkan Gangguan Suara dalam Panggilan",
|
||||
"alphanumeric characters and hyphens": "karakter alfanumerik dan tanda hubung",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "Pengaturan audio berhasil diperbarui",
|
||||
"August": "Agustus",
|
||||
"Auto-playback response": "Respons pemutaran otomatis",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api Auth String",
|
||||
"AUTOMATIC1111 Base URL": "URL Dasar AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 URL Dasar diperlukan.",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "UI Gelembung Obrolan",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "Arah obrolan",
|
||||
"Chat History": "Riwayat Obrolan",
|
||||
"Chat History is off for this browser.": "Riwayat Obrolan tidak aktif untuk browser ini.",
|
||||
"Chats": "Obrolan",
|
||||
"Check Again": "Periksa Lagi",
|
||||
"Check for updates": "Memeriksa pembaruan",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "Klik di sini untuk memilih file csv.",
|
||||
"Click here to select a py file.": "Klik di sini untuk memilih file py.",
|
||||
"Click here to select documents.": "Klik di sini untuk memilih dokumen.",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "Klik di sini.",
|
||||
"Click on the user role button to change a user's role.": "Klik tombol peran pengguna untuk mengubah peran pengguna.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Izin menulis papan klip ditolak. Periksa pengaturan peramban Anda untuk memberikan akses yang diperlukan.",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "URL Dasar ComfyUI",
|
||||
"ComfyUI Base URL is required.": "URL Dasar ComfyUI diperlukan.",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "Perintah",
|
||||
"Concurrent Requests": "Permintaan Bersamaan",
|
||||
"Confirm": "Konfirmasi",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "Basis data",
|
||||
"December": "Desember",
|
||||
"Default": "Default",
|
||||
"Default (Automatic1111)": "Default (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "Default (Pengubah Kalimat)",
|
||||
"Default Model": "Model Default",
|
||||
"Default model updated": "Model default diperbarui",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "Dokumen",
|
||||
"Document Settings": "Pengaturan Dokumen",
|
||||
"Documentation": "Dokumentasi",
|
||||
"Documents": "Dokumen",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "tidak membuat koneksi eksternal apa pun, dan data Anda tetap aman di server yang dihosting secara lokal.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "Model Penyematan",
|
||||
"Embedding Model Engine": "Mesin Model Penyematan",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Model penyematan diatur ke \"{{embedding_model}}\"",
|
||||
"Enable Chat History": "Aktifkan Riwayat Obrolan",
|
||||
"Enable Community Sharing": "Aktifkan Berbagi Komunitas",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "Aktifkan Pendaftaran Baru",
|
||||
"Enable Web Search": "Aktifkan Pencarian Web",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Masukkan Id Mesin Google PSE",
|
||||
"Enter Image Size (e.g. 512x512)": "Masukkan Ukuran Gambar (mis. 512x512)",
|
||||
"Enter language codes": "Masukkan kode bahasa",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Masukkan tag model (misalnya {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Masukkan Jumlah Langkah (mis. 50)",
|
||||
"Enter Score": "Masukkan Skor",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Dibuat oleh Komunitas OpenWebUI",
|
||||
"Make sure to enclose them with": "Pastikan untuk melampirkannya dengan",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "Mengelola",
|
||||
"Manage Models": "Kelola Model",
|
||||
"Manage Ollama Models": "Mengelola Model Ollama",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "Memori berhasil dihapus",
|
||||
"Memory deleted successfully": "Memori berhasil dihapus",
|
||||
"Memory updated successfully": "Memori berhasil diperbarui",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Pesan yang Anda kirim setelah membuat tautan tidak akan dibagikan. Pengguna yang memiliki URL tersebut akan dapat melihat obrolan yang dibagikan.",
|
||||
"Min P": "",
|
||||
"Minimum Score": "Skor Minimum",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Ups! Sepertinya URL tidak valid. Mohon periksa ulang dan coba lagi.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "Ups! Ada kesalahan pada respons sebelumnya. Silakan coba lagi atau hubungi admin.",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ups! Anda menggunakan metode yang tidak didukung (hanya untuk frontend). Silakan sajikan WebUI dari backend.",
|
||||
"Open AI (Dall-E)": "Buka AI (Dall-E)",
|
||||
"Open new chat": "Buka obrolan baru",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -536,13 +541,13 @@
|
|||
"Select a base model": "Pilih model dasar",
|
||||
"Select a engine": "Pilih mesin",
|
||||
"Select a function": "Memilih fungsi",
|
||||
"Select a mode": "Pilih mode",
|
||||
"Select a model": "Pilih model",
|
||||
"Select a pipeline": "Pilih saluran pipa",
|
||||
"Select a pipeline url": "Pilih url saluran pipa",
|
||||
"Select a tool": "Pilih alat",
|
||||
"Select an Ollama instance": "Pilih contoh Ollama",
|
||||
"Select Documents": "Pilih Dokumen",
|
||||
"Select Engine": "",
|
||||
"Select model": "Pilih model",
|
||||
"Select only one model to call": "Pilih hanya satu model untuk dipanggil",
|
||||
"Selected model(s) do not support image inputs": "Model yang dipilih tidak mendukung input gambar",
|
||||
|
|
@ -564,7 +569,6 @@
|
|||
"Set Voice": "Mengatur Suara",
|
||||
"Settings": "Pengaturan",
|
||||
"Settings saved successfully!": "Pengaturan berhasil disimpan!",
|
||||
"Settings updated successfully": "Pengaturan berhasil diperbarui",
|
||||
"Share": "Berbagi",
|
||||
"Share Chat": "Bagikan Obrolan",
|
||||
"Share to OpenWebUI Community": "Bagikan ke Komunitas OpenWebUI",
|
||||
|
|
@ -600,6 +604,7 @@
|
|||
"Tell us more:": "Beri tahu kami lebih lanjut:",
|
||||
"Temperature": "Suhu",
|
||||
"Template": "Templat",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "Penyelesaian Teks",
|
||||
"Text-to-Speech Engine": "Mesin Teks-ke-Suara",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -611,7 +616,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "Tindakan ini tidak dapat dibatalkan. Apakah Anda ingin melanjutkan?",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Ini akan memastikan bahwa percakapan Anda yang berharga disimpan dengan aman ke basis data backend. Terima kasih!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Ini adalah fitur eksperimental, mungkin tidak berfungsi seperti yang diharapkan dan dapat berubah sewaktu-waktu.",
|
||||
"This setting does not sync across browsers or devices.": "Pengaturan ini tidak disinkronkan di seluruh browser atau perangkat.",
|
||||
"This will delete": "Ini akan menghapus",
|
||||
"Thorough explanation": "Penjelasan menyeluruh",
|
||||
"Tika": "",
|
||||
|
|
@ -692,14 +696,12 @@
|
|||
"Web": "Web",
|
||||
"Web API": "API Web",
|
||||
"Web Loader Settings": "Pengaturan Pemuat Web",
|
||||
"Web Params": "Parameter Web",
|
||||
"Web Search": "Pencarian Web",
|
||||
"Web Search Engine": "Mesin Pencari Web",
|
||||
"Webhook URL": "URL pengait web",
|
||||
"WebUI Settings": "Pengaturan WebUI",
|
||||
"WebUI will make requests to": "WebUI akan membuat permintaan ke",
|
||||
"What’s New in": "Apa yang Baru di",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Ketika riwayat dimatikan, obrolan baru di browser ini tidak akan muncul di riwayat Anda di perangkat mana pun.",
|
||||
"Whisper (Local)": "Bisikan (Lokal)",
|
||||
"Widescreen Mode": "Mode Layar Lebar",
|
||||
"Workspace": "Ruang Kerja",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "Tutti gli utenti",
|
||||
"Allow": "Consenti",
|
||||
"Allow Chat Deletion": "Consenti l'eliminazione della chat",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "",
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"alphanumeric characters and hyphens": "caratteri alfanumerici e trattini",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "",
|
||||
"August": "Agosto",
|
||||
"Auto-playback response": "Riproduzione automatica della risposta",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "URL base AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "L'URL base AUTOMATIC1111 è obbligatorio.",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "UI bolle chat",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "Direzione chat",
|
||||
"Chat History": "Cronologia chat",
|
||||
"Chat History is off for this browser.": "La cronologia chat è disattivata per questo browser.",
|
||||
"Chats": "Chat",
|
||||
"Check Again": "Controlla di nuovo",
|
||||
"Check for updates": "Controlla aggiornamenti",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "Clicca qui per selezionare un file csv.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Clicca qui per selezionare i documenti.",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "clicca qui.",
|
||||
"Click on the user role button to change a user's role.": "Clicca sul pulsante del ruolo utente per modificare il ruolo di un utente.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "URL base ComfyUI",
|
||||
"ComfyUI Base URL is required.": "L'URL base ComfyUI è obbligatorio.",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "Comando",
|
||||
"Concurrent Requests": "Richieste simultanee",
|
||||
"Confirm": "",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "Database",
|
||||
"December": "Dicembre",
|
||||
"Default": "Predefinito",
|
||||
"Default (Automatic1111)": "Predefinito (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "Predefinito (SentenceTransformers)",
|
||||
"Default Model": "Modello di default",
|
||||
"Default model updated": "Modello predefinito aggiornato",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "Documento",
|
||||
"Document Settings": "Impostazioni documento",
|
||||
"Documentation": "",
|
||||
"Documents": "Documenti",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "non effettua connessioni esterne e i tuoi dati rimangono al sicuro sul tuo server ospitato localmente.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "Modello di embedding",
|
||||
"Embedding Model Engine": "Motore del modello di embedding",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Modello di embedding impostato su \"{{embedding_model}}\"",
|
||||
"Enable Chat History": "Abilita cronologia chat",
|
||||
"Enable Community Sharing": "Abilita la condivisione della community",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "Abilita nuove iscrizioni",
|
||||
"Enable Web Search": "Abilita ricerca Web",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Inserisci l'ID motore PSE di Google",
|
||||
"Enter Image Size (e.g. 512x512)": "Inserisci la dimensione dell'immagine (ad esempio 512x512)",
|
||||
"Enter language codes": "Inserisci i codici lingua",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Inserisci il tag del modello (ad esempio {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Inserisci il numero di passaggi (ad esempio 50)",
|
||||
"Enter Score": "Inserisci il punteggio",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Realizzato dalla comunità OpenWebUI",
|
||||
"Make sure to enclose them with": "Assicurati di racchiuderli con",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "",
|
||||
"Manage Models": "Gestisci modelli",
|
||||
"Manage Ollama Models": "Gestisci modelli Ollama",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "I messaggi inviati dopo la creazione del link non verranno condivisi. Gli utenti con l'URL saranno in grado di visualizzare la chat condivisa.",
|
||||
"Min P": "",
|
||||
"Minimum Score": "Punteggio minimo",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Ops! Sembra che l'URL non sia valido. Si prega di ricontrollare e riprovare.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ops! Stai utilizzando un metodo non supportato (solo frontend). Si prega di servire la WebUI dal backend.",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "Apri nuova chat",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -537,13 +542,13 @@
|
|||
"Select a base model": "Selezionare un modello di base",
|
||||
"Select a engine": "",
|
||||
"Select a function": "",
|
||||
"Select a mode": "Seleziona una modalità",
|
||||
"Select a model": "Seleziona un modello",
|
||||
"Select a pipeline": "Selezionare una tubazione",
|
||||
"Select a pipeline url": "Selezionare l'URL di una pipeline",
|
||||
"Select a tool": "",
|
||||
"Select an Ollama instance": "Seleziona un'istanza Ollama",
|
||||
"Select Documents": "",
|
||||
"Select Engine": "",
|
||||
"Select model": "Seleziona modello",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "I modelli selezionati non supportano l'input di immagini",
|
||||
|
|
@ -565,7 +570,6 @@
|
|||
"Set Voice": "Imposta voce",
|
||||
"Settings": "Impostazioni",
|
||||
"Settings saved successfully!": "Impostazioni salvate con successo!",
|
||||
"Settings updated successfully": "",
|
||||
"Share": "Condividi",
|
||||
"Share Chat": "Condividi chat",
|
||||
"Share to OpenWebUI Community": "Condividi con la comunità OpenWebUI",
|
||||
|
|
@ -601,6 +605,7 @@
|
|||
"Tell us more:": "Raccontaci di più:",
|
||||
"Temperature": "Temperatura",
|
||||
"Template": "Modello",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "Completamento del testo",
|
||||
"Text-to-Speech Engine": "Motore da testo a voce",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -612,7 +617,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Ciò garantisce che le tue preziose conversazioni siano salvate in modo sicuro nel tuo database backend. Grazie!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "Questa impostazione non si sincronizza tra browser o dispositivi.",
|
||||
"This will delete": "",
|
||||
"Thorough explanation": "Spiegazione dettagliata",
|
||||
"Tika": "",
|
||||
|
|
@ -693,14 +697,12 @@
|
|||
"Web": "Web",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Impostazioni del caricatore Web",
|
||||
"Web Params": "Parametri Web",
|
||||
"Web Search": "Ricerca sul Web",
|
||||
"Web Search Engine": "Motore di ricerca Web",
|
||||
"Webhook URL": "URL webhook",
|
||||
"WebUI Settings": "Impostazioni WebUI",
|
||||
"WebUI will make requests to": "WebUI effettuerà richieste a",
|
||||
"What’s New in": "Novità in",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Quando la cronologia è disattivata, le nuove chat su questo browser non verranno visualizzate nella cronologia su nessuno dei tuoi dispositivi.",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "Area di lavoro",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "すべてのユーザー",
|
||||
"Allow": "許可",
|
||||
"Allow Chat Deletion": "チャットの削除を許可",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "",
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"alphanumeric characters and hyphens": "英数字とハイフン",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "",
|
||||
"August": "8月",
|
||||
"Auto-playback response": "応答の自動再生",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 ベース URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 ベース URL が必要です。",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "チャットバブルUI",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "チャットの方向",
|
||||
"Chat History": "チャット履歴",
|
||||
"Chat History is off for this browser.": "このブラウザではチャット履歴が無効になっています。",
|
||||
"Chats": "チャット",
|
||||
"Check Again": "再確認",
|
||||
"Check for updates": "アップデートを確認",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "CSVファイルを選択するにはここをクリックしてください。",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "ドキュメントを選択するにはここをクリックしてください。",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "ここをクリックしてください。",
|
||||
"Click on the user role button to change a user's role.": "ユーザーの役割を変更するには、ユーザー役割ボタンをクリックしてください。",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "ComfyUIベースURL",
|
||||
"ComfyUI Base URL is required.": "ComfyUIベースURLが必要です。",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "コマンド",
|
||||
"Concurrent Requests": "コンカレント要求",
|
||||
"Confirm": "",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "データベース",
|
||||
"December": "12月",
|
||||
"Default": "デフォルト",
|
||||
"Default (Automatic1111)": "デフォルト (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "デフォルト (SentenceTransformers)",
|
||||
"Default Model": "デフォルトモデル",
|
||||
"Default model updated": "デフォルトモデルが更新されました",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "ドキュメント",
|
||||
"Document Settings": "ドキュメント設定",
|
||||
"Documentation": "",
|
||||
"Documents": "ドキュメント",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "外部接続を行わず、データはローカルでホストされているサーバー上に安全に保持されます。",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "埋め込みモデル",
|
||||
"Embedding Model Engine": "埋め込みモデルエンジン",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "埋め込みモデルを\"{{embedding_model}}\"に設定しました",
|
||||
"Enable Chat History": "チャット履歴を有効化",
|
||||
"Enable Community Sharing": "コミュニティ共有の有効化",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "新規登録を有効化",
|
||||
"Enable Web Search": "Web 検索を有効にする",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Google PSE エンジン ID を入力します。",
|
||||
"Enter Image Size (e.g. 512x512)": "画像サイズを入力してください (例: 512x512)",
|
||||
"Enter language codes": "言語コードを入力してください",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "モデルタグを入力してください (例: {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "ステップ数を入力してください (例: 50)",
|
||||
"Enter Score": "スコアを入力してください",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "OpenWebUI コミュニティによって作成",
|
||||
"Make sure to enclose them with": "必ず次で囲んでください",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "",
|
||||
"Manage Models": "モデルを管理",
|
||||
"Manage Ollama Models": "Ollama モデルを管理",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "リンクを作成した後、送信したメッセージは共有されません。URL を持つユーザーは共有チャットを閲覧できます。",
|
||||
"Min P": "",
|
||||
"Minimum Score": "最低スコア",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "おっと! URL が無効なようです。もう一度確認してやり直してください。",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "おっと! サポートされていない方法 (フロントエンドのみ) を使用しています。バックエンドから WebUI を提供してください。",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "新しいチャットを開く",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -535,13 +540,13 @@
|
|||
"Select a base model": "基本モデルの選択",
|
||||
"Select a engine": "",
|
||||
"Select a function": "",
|
||||
"Select a mode": "モードを選択",
|
||||
"Select a model": "モデルを選択",
|
||||
"Select a pipeline": "パイプラインの選択",
|
||||
"Select a pipeline url": "パイプラインの URL を選択する",
|
||||
"Select a tool": "",
|
||||
"Select an Ollama instance": "Ollama インスタンスを選択",
|
||||
"Select Documents": "",
|
||||
"Select Engine": "",
|
||||
"Select model": "モデルを選択",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "一部のモデルは画像入力をサポートしていません",
|
||||
|
|
@ -563,7 +568,6 @@
|
|||
"Set Voice": "音声を設定",
|
||||
"Settings": "設定",
|
||||
"Settings saved successfully!": "設定が正常に保存されました!",
|
||||
"Settings updated successfully": "",
|
||||
"Share": "共有",
|
||||
"Share Chat": "チャットを共有",
|
||||
"Share to OpenWebUI Community": "OpenWebUI コミュニティに共有",
|
||||
|
|
@ -599,6 +603,7 @@
|
|||
"Tell us more:": "もっと話してください:",
|
||||
"Temperature": "温度",
|
||||
"Template": "テンプレート",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "テキスト補完",
|
||||
"Text-to-Speech Engine": "テキスト音声変換エンジン",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -610,7 +615,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "これは、貴重な会話がバックエンドデータベースに安全に保存されることを保証します。ありがとうございます!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "この設定は、ブラウザやデバイス間で同期されません。",
|
||||
"This will delete": "",
|
||||
"Thorough explanation": "詳細な説明",
|
||||
"Tika": "",
|
||||
|
|
@ -691,14 +695,12 @@
|
|||
"Web": "ウェブ",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Web 読み込み設定",
|
||||
"Web Params": "Web パラメータ",
|
||||
"Web Search": "ウェブ検索",
|
||||
"Web Search Engine": "ウェブ検索エンジン",
|
||||
"Webhook URL": "Webhook URL",
|
||||
"WebUI Settings": "WebUI 設定",
|
||||
"WebUI will make requests to": "WebUI は次に対してリクエストを行います",
|
||||
"What’s New in": "新機能",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "履歴が無効になっている場合、このブラウザでの新しいチャットは、どのデバイスの履歴にも表示されません。",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "ワークスペース",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "ყველა მომხმარებელი",
|
||||
"Allow": "ნების დართვა",
|
||||
"Allow Chat Deletion": "მიმოწერის წაშლის დაშვება",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "",
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"alphanumeric characters and hyphens": "ალფანუმერული სიმბოლოები და დეფისები",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "",
|
||||
"August": "აგვისტო",
|
||||
"Auto-playback response": "ავტომატური დაკვრის პასუხი",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 საბაზისო მისამართი",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 საბაზისო მისამართი აუცილებელია",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "ჩატის ბულბი",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "ჩატის მიმართულება",
|
||||
"Chat History": "მიმოწერის ისტორია",
|
||||
"Chat History is off for this browser.": "მიმოწერის ისტორია ამ ბრაუზერისთვის გათიშულია",
|
||||
"Chats": "მიმოწერები",
|
||||
"Check Again": "თავიდან შემოწმება",
|
||||
"Check for updates": "განახლებების ძიება",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "ასარჩევად, დააკლიკე აქ",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "დოკუმენტების ასარჩევად, დააკლიკე აქ",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "დააკლიკე აქ",
|
||||
"Click on the user role button to change a user's role.": "დააკლიკეთ მომხმარებლის როლის ღილაკს რომ შეცვალოთ მომხმარების როლი",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "ComfyUI საბაზისო URL",
|
||||
"ComfyUI Base URL is required.": "ComfyUI საბაზისო URL აუცილებელია.",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "ბრძანება",
|
||||
"Concurrent Requests": "თანმხლები მოთხოვნები",
|
||||
"Confirm": "",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "მონაცემთა ბაზა",
|
||||
"December": "დეკემბერი",
|
||||
"Default": "დეფოლტი",
|
||||
"Default (Automatic1111)": "დეფოლტ (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "დეფოლტ (SentenceTransformers)",
|
||||
"Default Model": "ნაგულისხმები მოდელი",
|
||||
"Default model updated": "დეფოლტ მოდელი განახლებულია",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "დოკუმენტი",
|
||||
"Document Settings": "დოკუმენტის პარამეტრები",
|
||||
"Documentation": "",
|
||||
"Documents": "დოკუმენტები",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "არ ამყარებს გარე კავშირებს და თქვენი მონაცემები უსაფრთხოდ რჩება თქვენს ადგილობრივ სერვერზე.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "ჩასმის ძირითადი პროგრამა",
|
||||
"Embedding Model Engine": "ჩასმის ძირითადი პროგრამა",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "ჩასმის ძირითადი პროგრამა ჩართულია \"{{embedding_model}}\"",
|
||||
"Enable Chat History": "მიმოწერის ისტორიის ჩართვა",
|
||||
"Enable Community Sharing": "საზოგადოების გაზიარების ჩართვა",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "ახალი რეგისტრაციების ჩართვა",
|
||||
"Enable Web Search": "ვებ ძიების ჩართვა",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "შეიყვანეთ Google PSE ძრავის ID",
|
||||
"Enter Image Size (e.g. 512x512)": "შეიყვანეთ სურათის ზომა (მაგ. 512x512)",
|
||||
"Enter language codes": "შეიყვანეთ ენის კოდი",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "შეიყვანეთ მოდელის ტეგი (მაგ. {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "შეიყვანეთ ნაბიჯების რაოდენობა (მაგ. 50)",
|
||||
"Enter Score": "შეიყვანეთ ქულა",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "დამზადებულია OpenWebUI საზოგადოების მიერ",
|
||||
"Make sure to enclose them with": "დარწმუნდით, რომ დაურთეთ ისინი",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "",
|
||||
"Manage Models": "მოდელების მართვა",
|
||||
"Manage Ollama Models": "Ollama მოდელების მართვა",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "შეტყობინებები, რომელსაც თქვენ აგზავნით თქვენი ბმულის შექმნის შემდეგ, არ იქნება გაზიარებული. URL– ის მქონე მომხმარებლებს შეეძლებათ ნახონ საერთო ჩატი.",
|
||||
"Min P": "",
|
||||
"Minimum Score": "მინიმალური ქულა",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "უი! როგორც ჩანს, მისამართი არასწორია. გთხოვთ, გადაამოწმოთ და ისევ სცადოთ.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "უპს! თქვენ იყენებთ მხარდაუჭერელ მეთოდს (მხოლოდ frontend). გთხოვთ, მოემსახუროთ WebUI-ს ბექენდიდან",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "ახალი მიმოწერის გახსნა",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -536,13 +541,13 @@
|
|||
"Select a base model": "აირჩიეთ ბაზის მოდელი",
|
||||
"Select a engine": "",
|
||||
"Select a function": "",
|
||||
"Select a mode": "რეჟიმის არჩევა",
|
||||
"Select a model": "მოდელის არჩევა",
|
||||
"Select a pipeline": "აირჩიეთ მილსადენი",
|
||||
"Select a pipeline url": "აირჩიეთ მილსადენის url",
|
||||
"Select a tool": "",
|
||||
"Select an Ollama instance": "Ollama ინსტანსის არჩევა",
|
||||
"Select Documents": "",
|
||||
"Select Engine": "",
|
||||
"Select model": "მოდელის არჩევა",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "შერჩეული მოდელი (ებ) ი არ უჭერს მხარს გამოსახულების შეყვანას",
|
||||
|
|
@ -564,7 +569,6 @@
|
|||
"Set Voice": "ხმის დაყენება",
|
||||
"Settings": "ხელსაწყოები",
|
||||
"Settings saved successfully!": "პარამეტრები წარმატებით განახლდა!",
|
||||
"Settings updated successfully": "",
|
||||
"Share": "გაზიარება",
|
||||
"Share Chat": "გაზიარება",
|
||||
"Share to OpenWebUI Community": "გააზიარე OpenWebUI საზოგადოებაში ",
|
||||
|
|
@ -600,6 +604,7 @@
|
|||
"Tell us more:": "ჩვენთან დავუკავშირდით",
|
||||
"Temperature": "ტემპერატურა",
|
||||
"Template": "შაბლონი",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "ტექსტის დასრულება",
|
||||
"Text-to-Speech Engine": "ტექსტურ-ხმოვანი ძრავი",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -611,7 +616,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "ეს უზრუნველყოფს, რომ თქვენი ძვირფასი საუბრები უსაფრთხოდ შეინახება თქვენს backend მონაცემთა ბაზაში. Გმადლობთ!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "ეს პარამეტრი არ სინქრონიზდება ბრაუზერებსა და მოწყობილობებში",
|
||||
"This will delete": "",
|
||||
"Thorough explanation": "ვრცლად აღწერა",
|
||||
"Tika": "",
|
||||
|
|
@ -692,14 +696,12 @@
|
|||
"Web": "ვები",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "ვების ჩატარების პარამეტრები",
|
||||
"Web Params": "ვების პარამეტრები",
|
||||
"Web Search": "ვებ ძებნა",
|
||||
"Web Search Engine": "ვებ საძიებო სისტემა",
|
||||
"Webhook URL": "Webhook URL",
|
||||
"WebUI Settings": "WebUI პარამეტრები",
|
||||
"WebUI will make requests to": "WebUI გამოგიგზავნით მოთხოვნებს",
|
||||
"What’s New in": "რა არის ახალი",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "როდესაც ისტორია გამორთულია, ახალი ჩეთები ამ ბრაუზერში არ გამოჩნდება თქვენს ისტორიაში არცერთ მოწყობილობაზე.",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "ვულერი",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "모든 사용자",
|
||||
"Allow": "허용",
|
||||
"Allow Chat Deletion": "채팅 삭제 허용",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "외부 음성 허용",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "사용자 위치 활용 허용",
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"alphanumeric characters and hyphens": "영문자, 숫자, 하이픈",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "",
|
||||
"August": "8월",
|
||||
"Auto-playback response": "응답 자동 재생",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 기본 URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 기본 URL 설정이 필요합니다.",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "버블형 채팅 UI",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "채팅 방향",
|
||||
"Chat History": "채팅 기록",
|
||||
"Chat History is off for this browser.": "브라우저에서 채팅 기록이 꺼져 있습니다.",
|
||||
"Chats": "채팅",
|
||||
"Check Again": "다시 확인",
|
||||
"Check for updates": "업데이트 확인",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "csv 파일을 선택하려면 여기를 클릭하세요.",
|
||||
"Click here to select a py file.": "py 파일을 선택하려면 여기를 클릭하세요.",
|
||||
"Click here to select documents.": "문서를 선택하려면 여기를 클릭하세요.",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "여기를 클릭하세요.",
|
||||
"Click on the user role button to change a user's role.": "사용자 역할 버튼을 클릭하여 사용자의 역할을 변경하세요.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "ComfyUI 기본 URL",
|
||||
"ComfyUI Base URL is required.": "ComfyUI 기본 URL이 필요합니다.",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "명령",
|
||||
"Concurrent Requests": "동시 요청 수",
|
||||
"Confirm": "확인",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "데이터베이스",
|
||||
"December": "12월",
|
||||
"Default": "기본값",
|
||||
"Default (Automatic1111)": "기본값 (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "기본값 (SentenceTransformers)",
|
||||
"Default Model": "기본 모델",
|
||||
"Default model updated": "기본 모델이 업데이트되었습니다.",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "문서",
|
||||
"Document Settings": "문서 설정",
|
||||
"Documentation": "문서 조사",
|
||||
"Documents": "문서",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "어떠한 외부 연결도 하지 않으며, 데이터는 로컬에서 호스팅되는 서버에 안전하게 유지됩니다.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "임베딩 모델",
|
||||
"Embedding Model Engine": "임베딩 모델 엔진",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "임베딩 모델을 \"{{embedding_model}}\"로 설정함",
|
||||
"Enable Chat History": "채팅 기록 활성화",
|
||||
"Enable Community Sharing": "커뮤니티 공유 활성화",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "새 회원가입 활성화",
|
||||
"Enable Web Search": "웹 검색 활성화",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Google PSE 엔진 ID 입력",
|
||||
"Enter Image Size (e.g. 512x512)": "이미지 크기 입력(예: 512x512)",
|
||||
"Enter language codes": "언어 코드 입력",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "모델 태그 입력(예: {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "단계 수 입력(예: 50)",
|
||||
"Enter Score": "점수 입력",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "OpenWebUI 커뮤니티에 의해 개발됨",
|
||||
"Make sure to enclose them with": "꼭 다음으로 감싸세요:",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "관리",
|
||||
"Manage Models": "모델 관리",
|
||||
"Manage Ollama Models": "Ollama 모델 관리",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "링크 생성 후에 보낸 메시지는 공유되지 않습니다. URL이 있는 사용자는 공유된 채팅을 볼 수 있습니다.",
|
||||
"Min P": "",
|
||||
"Minimum Score": "최소 점수",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "이런! URL이 잘못된 것 같습니다. 다시 한번 확인하고 다시 시도해주세요.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "이런! 지원되지 않는 방식(프론트엔드만)을 사용하고 계십니다. 백엔드에서 WebUI를 제공해주세요.",
|
||||
"Open AI (Dall-E)": "OpenAI(Dall-E)",
|
||||
"Open new chat": "새 채팅 열기",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -536,13 +541,13 @@
|
|||
"Select a base model": "기본 모델 선택",
|
||||
"Select a engine": "엔진 선택",
|
||||
"Select a function": "",
|
||||
"Select a mode": "모드 선택",
|
||||
"Select a model": "모델 선택",
|
||||
"Select a pipeline": "파이프라인 선택",
|
||||
"Select a pipeline url": "파이프라인 URL 선택",
|
||||
"Select a tool": "",
|
||||
"Select an Ollama instance": "Ollama 인스턴스 선택",
|
||||
"Select Documents": "문서 선택",
|
||||
"Select Engine": "",
|
||||
"Select model": "모델 선택",
|
||||
"Select only one model to call": "콜을 위해서는 모델을 하나만 선택해야 합니다.",
|
||||
"Selected model(s) do not support image inputs": "선택한 모델은 이미지 입력을 지원하지 않습니다.",
|
||||
|
|
@ -564,7 +569,6 @@
|
|||
"Set Voice": "음성 설정",
|
||||
"Settings": "설정",
|
||||
"Settings saved successfully!": "설정이 성공적으로 저장되었습니다!",
|
||||
"Settings updated successfully": "설정이 성공적으로 업데이트되었습니다.",
|
||||
"Share": "공유",
|
||||
"Share Chat": "채팅 공유",
|
||||
"Share to OpenWebUI Community": "OpenWebUI 커뮤니티에 공유",
|
||||
|
|
@ -600,6 +604,7 @@
|
|||
"Tell us more:": "더 알려주세요:",
|
||||
"Temperature": "온도",
|
||||
"Template": "템플릿",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "텍스트 완성",
|
||||
"Text-to-Speech Engine": "텍스트-음성 변환 엔진",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -611,7 +616,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "이 액션은 되돌릴 수 없습니다. 계속하시겠습니까?",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "이렇게 하면 소중한 대화 내용이 백엔드 데이터베이스에 안전하게 저장됩니다. 감사합니다!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "이것은 실험적 기능으로, 예상대로 작동하지 않을 수 있으며 언제든지 변경될 수 있습니다.",
|
||||
"This setting does not sync across browsers or devices.": "이 설정은 브라우저 또는 장치 간에 동기화되지 않습니다.",
|
||||
"This will delete": "이것은 다음을 삭제합니다.",
|
||||
"Thorough explanation": "완전한 설명",
|
||||
"Tika": "",
|
||||
|
|
@ -692,14 +696,12 @@
|
|||
"Web": "웹",
|
||||
"Web API": "웹 API",
|
||||
"Web Loader Settings": "웹 로더 설정",
|
||||
"Web Params": "웹 파라미터",
|
||||
"Web Search": "웹 검색",
|
||||
"Web Search Engine": "웹 검색 엔진",
|
||||
"Webhook URL": "웹훅 URL",
|
||||
"WebUI Settings": "WebUI 설정",
|
||||
"WebUI will make requests to": "WebUI 요청 대상:",
|
||||
"What’s New in": "새로운 기능:",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "기록 기능이 꺼져 있으면 이 브라우저의 새 채팅이 다른 장치의 채팅 기록에 나타나지 않습니다.",
|
||||
"Whisper (Local)": "Whisper (로컬)",
|
||||
"Widescreen Mode": "와이드스크린 모드",
|
||||
"Workspace": "워크스페이스",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "Visi naudotojai",
|
||||
"Allow": "Leisti",
|
||||
"Allow Chat Deletion": "Leisti pokalbių ištrynimą",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "Leisti nelokalius balsus",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "Leisti naudotojo vietos matymą",
|
||||
"Allow Voice Interruption in Call": "Leisti pertraukimą skambučio metu",
|
||||
"alphanumeric characters and hyphens": "skaičiai, raidės ir brūkšneliai",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "Audio nustatymai sėkmingai išsaugoti",
|
||||
"August": "Rugpjūtis",
|
||||
"Auto-playback response": "Automatinis atsakymo skaitymas",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api Auth String",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 bazės nuoroda",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 bazės nuoroda reikalinga.",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "Pokalbio burbulo sąsaja",
|
||||
"Chat Controls": "Pokalbio valdymas",
|
||||
"Chat direction": "Pokalbio linkmė",
|
||||
"Chat History": "Pokalbių istorija",
|
||||
"Chat History is off for this browser.": "Šioje naršyklėje pokalbių istorija išjungta.",
|
||||
"Chats": "Pokalbiai",
|
||||
"Check Again": "Patikrinti iš naujo",
|
||||
"Check for updates": "Patikrinti atnaujinimus",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "Spauskite čia tam, kad pasirinkti csv failą",
|
||||
"Click here to select a py file.": "Spauskite čia norėdami pasirinkti py failą",
|
||||
"Click here to select documents.": "Spauskite čia norėdami pasirinkti dokumentus.",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "paspauskite čia.",
|
||||
"Click on the user role button to change a user's role.": "Paspauskite ant naudotojo rolės mygtuko tam, kad pakeisti naudotojo rolę.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Iškarpinės naudojimas neleidžiamas naršyklės.",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "ComfyUI bazės nuoroda",
|
||||
"ComfyUI Base URL is required.": "ComfyUI bazės nuoroda privaloma",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "Command",
|
||||
"Concurrent Requests": "Kelios užklausos vienu metu",
|
||||
"Confirm": "Patvrtinti",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "Duomenų bazė",
|
||||
"December": "Gruodis",
|
||||
"Default": "Numatytasis",
|
||||
"Default (Automatic1111)": "Numatytasis (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "Numatytasis (SentenceTransformers)",
|
||||
"Default Model": "Numatytasis modelis",
|
||||
"Default model updated": "Numatytasis modelis atnaujintas",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "Neinstaliuokite funkcijų iš nepatikimų šaltinių",
|
||||
"Do not install tools from sources you do not fully trust.": "Neinstaliuokite įrankių iš nepatikimų šaltinių",
|
||||
"Document": "Dokumentas",
|
||||
"Document Settings": "Dokumento nuostatos",
|
||||
"Documentation": "Dokumentacija",
|
||||
"Documents": "Dokumentai",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "neturi jokių išorinių ryšių ir duomenys lieka serveryje.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "Embedding modelis",
|
||||
"Embedding Model Engine": "Embedding modelio variklis",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Embedding modelis nustatytas kaip\"{{embedding_model}}\"",
|
||||
"Enable Chat History": "Aktyvuoti pokalbių istoriją",
|
||||
"Enable Community Sharing": "Leisti dalinimąsi su bendruomene",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "Aktyvuoti naujas registracijas",
|
||||
"Enable Web Search": "Leisti paiešką internete",
|
||||
"Enabled": "Leisti",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Įveskite Google PSE variklio ID",
|
||||
"Enter Image Size (e.g. 512x512)": "Įveskite paveiksliuko dydį (pvz. 512x512)",
|
||||
"Enter language codes": "Įveskite kalbos kodus",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Įveskite modelio žymą (pvz. {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Įveskite žingsnių kiekį (pvz. 50)",
|
||||
"Enter Score": "Įveskite rezultatą",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Sukurta OpenWebUI bendruomenės",
|
||||
"Make sure to enclose them with": "Užtikrinktie, kad įtraukiate viduje:",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "Tvarkyti",
|
||||
"Manage Models": "Tvarkyti modelius",
|
||||
"Manage Ollama Models": "Tvarkyti Ollama modelius",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "Atmintis ištrinta sėkmingai",
|
||||
"Memory deleted successfully": "Atmintis ištrinta sėkmingai",
|
||||
"Memory updated successfully": "Atmintis atnaujinta sėkmingai",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Žinutės, kurias siunčiate po nuorodos sukūrimo nebus matomos nuorodos turėtojams. Naudotojai su nuoroda matys žinutes iki nuorodos sukūrimo.",
|
||||
"Min P": "Mažiausias p",
|
||||
"Minimum Score": "Minimalus rezultatas",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Regis nuoroda nevalidi. Prašau patikrtinkite ir pabandykite iš naujo.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "Įvyko klaida. Pabandykite iš naujo arba susisiekite su administratoriumi.",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Naudojate nepalaikomą (front-end) web ui rėžimą. Prašau serviruokite WebUI iš back-end",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "Atverti naują pokalbį",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Tortue Chat versija per sena. Reikalinga (v{{REQUIRED_VERSION}}) versija.",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -538,13 +543,13 @@
|
|||
"Select a base model": "Pasirinkite bazinį modelį",
|
||||
"Select a engine": "Pasirinkite variklį",
|
||||
"Select a function": "Pasirinkite funkciją",
|
||||
"Select a mode": "Pasirinkti režimą",
|
||||
"Select a model": "Pasirinkti modelį",
|
||||
"Select a pipeline": "Pasirinkite procesą",
|
||||
"Select a pipeline url": "Pasirinkite proceso nuorodą",
|
||||
"Select a tool": "Pasirinkite įrankį",
|
||||
"Select an Ollama instance": "Pasirinkti Ollama instanciją",
|
||||
"Select Documents": "Pasirinkite dokumentus",
|
||||
"Select Engine": "",
|
||||
"Select model": "Pasirinkti modelį",
|
||||
"Select only one model to call": "Pasirinkite vieną modelį",
|
||||
"Selected model(s) do not support image inputs": "Pasirinkti modeliai nepalaiko vaizdinių užklausų",
|
||||
|
|
@ -566,7 +571,6 @@
|
|||
"Set Voice": "Numatyti balsą",
|
||||
"Settings": "Nustatymai",
|
||||
"Settings saved successfully!": "Parametrai sėkmingai išsaugoti!",
|
||||
"Settings updated successfully": "Nustatymai atnaujinti sėkmingai",
|
||||
"Share": "Dalintis",
|
||||
"Share Chat": "Dalintis pokalbiu",
|
||||
"Share to OpenWebUI Community": "Dalintis su OpenWebUI bendruomene",
|
||||
|
|
@ -602,6 +606,7 @@
|
|||
"Tell us more:": "Papasakokite daugiau",
|
||||
"Temperature": "Temperatūra",
|
||||
"Template": "Modelis",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "Teksto pildymas",
|
||||
"Text-to-Speech Engine": "Balso sintezės modelis",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -613,7 +618,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "Šis veiksmas negali būti atšauktas. Ar norite tęsti?",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Tai užtikrina, kad Jūsų pokalbiai saugiai saugojami duomenų bazėje. Ačiū!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Tai eksperimentinė funkcija ir gali veikti nevisada.",
|
||||
"This setting does not sync across browsers or devices.": "Šis parametras nesisinchronizuoja su skirtingomis naršyklėmis ir įrankiais.",
|
||||
"This will delete": "Tai ištrins",
|
||||
"Thorough explanation": "Platus paaiškinimas",
|
||||
"Tika": "Tika",
|
||||
|
|
@ -694,14 +698,12 @@
|
|||
"Web": "Web",
|
||||
"Web API": "Web API",
|
||||
"Web Loader Settings": "Web krovimo nustatymai",
|
||||
"Web Params": "Web nustatymai",
|
||||
"Web Search": "Web paieška",
|
||||
"Web Search Engine": "Web paieškos variklis",
|
||||
"Webhook URL": "Webhook nuoroda",
|
||||
"WebUI Settings": "WebUI parametrai",
|
||||
"WebUI will make requests to": "WebUI vykdys užklausas",
|
||||
"What’s New in": "Kas naujo",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Kai istorija išjungta, pokalbiai neatsiras jūsų istorijoje.",
|
||||
"Whisper (Local)": "Whisper (lokalus)",
|
||||
"Widescreen Mode": "Plataus ekrano rėžimas",
|
||||
"Workspace": "Nuostatos",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "Semua Pengguna",
|
||||
"Allow": "Benarkan",
|
||||
"Allow Chat Deletion": "Benarkan Penghapusan Perbualan",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "Benarkan suara bukan tempatan ",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "Benarkan Lokasi Pengguna",
|
||||
"Allow Voice Interruption in Call": "Benarkan gangguan suara dalam panggilan",
|
||||
"alphanumeric characters and hyphens": "aksara alfanumerik dan tanda sempang",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "Tetapan audio berjaya dikemas kini",
|
||||
"August": "Ogos",
|
||||
"Auto-playback response": "Main semula respons secara automatik",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api Auth String",
|
||||
"AUTOMATIC1111 Base URL": "URL Asas AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "URL Asas AUTOMATIC1111 diperlukan.",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "Antaramuka Buih Perbualan",
|
||||
"Chat Controls": "Kawalan Perbualan",
|
||||
"Chat direction": "Arah Perbualan",
|
||||
"Chat History": "Sejarah Perbualan",
|
||||
"Chat History is off for this browser.": "Sejarah perbualan dimatikan untuk pelayan web ini",
|
||||
"Chats": "Perbualan",
|
||||
"Check Again": "Semak Kembali",
|
||||
"Check for updates": "Semak kemas kini",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "Klik disini untuk memilih fail csv",
|
||||
"Click here to select a py file.": "Klik disini untuk memilih fail py",
|
||||
"Click here to select documents.": "Klik disini untuk memilih dokumen",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "klik disini.",
|
||||
"Click on the user role button to change a user's role.": "Klik pada butang peranan pengguna untuk menukar peranan pengguna",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Kebenaran untuk menulis di papan klip ditolak. Sila semak tetapan pelayan web anda untuk memberikan akses yang diperlukan",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "URL asas ComfyUI",
|
||||
"ComfyUI Base URL is required.": "URL asas ComfyUI diperlukan",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "Arahan",
|
||||
"Concurrent Requests": "Permintaan Serentak",
|
||||
"Confirm": "Sahkan",
|
||||
|
|
@ -134,10 +138,10 @@
|
|||
"Continue Response": "Teruskan Respons",
|
||||
"Continue with {{provider}}": "Teruskan dengan {{provider}}",
|
||||
"Controls": "Kawalan",
|
||||
"Copied": "",
|
||||
"Copied": "Disalin",
|
||||
"Copied shared chat URL to clipboard!": "Menyalin URL sembang kongsi ke papan klip",
|
||||
"Copy": "Salin",
|
||||
"Copy Code": "",
|
||||
"Copy Code": "Salin Kod",
|
||||
"Copy last code block": "Salin Blok Kod Terakhir",
|
||||
"Copy last response": "Salin Respons Terakhir",
|
||||
"Copy Link": "Salin Pautan",
|
||||
|
|
@ -147,7 +151,7 @@
|
|||
"Create new key": "Cipta kekunci baharu",
|
||||
"Create new secret key": "Cipta kekunci rahsia baharu",
|
||||
"Created at": "Dicipta di",
|
||||
"Created At": "Dicipta Di",
|
||||
"Created At": "Dicipta Pada",
|
||||
"Created by": "Dicipta oleh",
|
||||
"CSV Import": "Import CSV",
|
||||
"Current Model": "Model Semasa",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "Pangkalan Data",
|
||||
"December": "Disember",
|
||||
"Default": "Lalai",
|
||||
"Default (Automatic1111)": "Lalai (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "Lalai (SentenceTransformers)",
|
||||
"Default Model": "Model Lalai",
|
||||
"Default model updated": "Model lalai dikemas kini",
|
||||
|
|
@ -193,11 +197,10 @@
|
|||
"Discover, download, and explore model presets": "Temui, muat turun dan teroka model pratetap",
|
||||
"Dismissible": "Diketepikan",
|
||||
"Display Emoji in Call": "Paparkan Emoji dalam Panggilan",
|
||||
"Display the username instead of You in the Chat": "aparkan nama pengguna dan bukannya 'Anda' dalam Sembang",
|
||||
"Display the username instead of You in the Chat": "Paparkan nama pengguna dan bukannya 'Anda' dalam Sembang",
|
||||
"Do not install functions from sources you do not fully trust.": "Jangan pasang fungsi daripada sumber yang anda tidak percayai sepenuhnya.",
|
||||
"Do not install tools from sources you do not fully trust.": "Jangan pasang alat daripada sumber yang anda tidak percaya sepenuhnya.",
|
||||
"Document": "Dokumen",
|
||||
"Document Settings": "Tetapan Dokumen",
|
||||
"Documentation": "Dokumentasi",
|
||||
"Documents": "Dokumen",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "tidak membuat sebarang sambungan luaran, dan data anda kekal selamat pada pelayan yang dihoskan ditempat anda",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "Model Benamkan",
|
||||
"Embedding Model Engine": "Enjin Model Benamkan",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Model Benamkan ditetapkan kepada \"{{embedding_model}}\"",
|
||||
"Enable Chat History": "Benarkan Sejarah Perbualan",
|
||||
"Enable Community Sharing": "Benarkan Perkongsian Komunity",
|
||||
"Enable Community Sharing": "Benarkan Perkongsian Komuniti",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "Benarkan Pendaftaran Baharu",
|
||||
"Enable Web Search": "Benarkan Carian Web",
|
||||
"Enabled": "Dibenarkan",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Masukkan Id Enjin Google PSE",
|
||||
"Enter Image Size (e.g. 512x512)": "Masukkan Saiz Imej (cth 512x512)",
|
||||
"Enter language codes": "Masukkan kod bahasa",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Masukkan tag model (cth {{ modelTag }})",
|
||||
"Enter Number of Steps (e.g. 50)": "Masukkan Bilangan Langkah (cth 50)",
|
||||
"Enter Score": "Masukkan Skor",
|
||||
|
|
@ -266,7 +270,7 @@
|
|||
"Export chat (.json)": "Eksport perbualan (.json)",
|
||||
"Export Chats": "Eksport Perbualan",
|
||||
"Export Documents Mapping": "Eksport Pemetaan Dokumen",
|
||||
"Export Functions": "Eksport 'Fungsi'",
|
||||
"Export Functions": "Eksport Fungsi",
|
||||
"Export LiteLLM config.yaml": "Eksport LiteLLM config.yaml",
|
||||
"Export Models": "Eksport Model",
|
||||
"Export Prompts": "Eksport Gesaan",
|
||||
|
|
@ -339,7 +343,7 @@
|
|||
"Input commands": "Masukkan Arahan",
|
||||
"Install from Github URL": "Pasang daripada URL Github",
|
||||
"Instant Auto-Send After Voice Transcription": "Hantar Secara Automatik Dengan Segera Selepas Transkripsi Suara",
|
||||
"Interface": "Ataramuka",
|
||||
"Interface": "Antaramuka",
|
||||
"Invalid Tag": "Tag tidak sah",
|
||||
"January": "Januari",
|
||||
"join our Discord for help.": "sertai Discord kami untuk mendapatkan bantuan.",
|
||||
|
|
@ -361,9 +365,10 @@
|
|||
"LLMs can make mistakes. Verify important information.": "LLM boleh membuat kesilapan. Sahkan maklumat penting",
|
||||
"Local Models": "Model Tempatan",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Dicipta oleh Komunity OpenWebUI",
|
||||
"Made by OpenWebUI Community": "Dicipta oleh Komuniti OpenWebUI",
|
||||
"Make sure to enclose them with": "Pastikan untuk melampirkannya dengan",
|
||||
"Manage": "Mengurus",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "Urus",
|
||||
"Manage Models": "Urus Model",
|
||||
"Manage Ollama Models": "Urus Model Ollama",
|
||||
"Manage Pipelines": "Urus 'Pipelines'",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "Memori berjaya dikosongkan",
|
||||
"Memory deleted successfully": "Memori berjaya dihapuskan",
|
||||
"Memory updated successfully": "Memori berjaya dikemaskini",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Mesej yang anda hantar selepas membuat pautan anda tidak akan dikongsi. Pengguna dengan URL akan dapat melihat perbualan yang dikongsi.",
|
||||
"Min P": "P Minimum",
|
||||
"Minimum Score": "Skor Minimum",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Maaf, didapati URL tidak sah. Sila semak semula dan cuba lagi.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "Maaf, terdapat ralat dalam respons sebelumnya. Sila cuba lagi atau hubungi pentadbir",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Maaf, Anda menggunakan kaedah yang tidak disokong (bahagian 'frontend' sahaja). Sila sediakan WebUI dari 'backend'.",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "Buka perbualan baru",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) adalah lebih rendah daripada versi yang diperlukan iaitu (v{{REQUIRED_VERSION}})",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -503,7 +508,7 @@
|
|||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Run": "",
|
||||
"Run": "Jalankan",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "Jalankan Llama 2, Code Llama dan model lain. Sesuaikan dan buat sendiri.",
|
||||
"Running": "Sedang dijalankan",
|
||||
"Save": "Simpan",
|
||||
|
|
@ -514,7 +519,7 @@
|
|||
"Scan": "Imbas",
|
||||
"Scan complete!": "Imbasan selesai!",
|
||||
"Scan for documents from {{path}}": "Imbas untuk dokumen dari {{path}}",
|
||||
"Scroll to bottom when switching between branches": "",
|
||||
"Scroll to bottom when switching between branches": "Skrol ke bawah apabila bertukar antara cawangan",
|
||||
"Search": "Carian",
|
||||
"Search a model": "Cari Model",
|
||||
"Search Chats": "Cari Perbualan",
|
||||
|
|
@ -536,13 +541,13 @@
|
|||
"Select a base model": "Pilih model asas",
|
||||
"Select a engine": "Pilih enjin",
|
||||
"Select a function": "Pilih fungsi",
|
||||
"Select a mode": "Pilih Mod",
|
||||
"Select a model": "Pilih model",
|
||||
"Select a pipeline": "Pilih 'pipeline'",
|
||||
"Select a pipeline url": "Pilih url 'pipeline'",
|
||||
"Select a tool": "Pilih alat",
|
||||
"Select an Ollama instance": "Pilih Ollama contoh",
|
||||
"Select Documents": "Pilih Dokumen",
|
||||
"Select Engine": "",
|
||||
"Select model": "Pilih model",
|
||||
"Select only one model to call": "Pilih hanya satu model untuk dipanggil",
|
||||
"Selected model(s) do not support image inputs": "Model dipilih tidak menyokong input imej",
|
||||
|
|
@ -564,7 +569,6 @@
|
|||
"Set Voice": "Tetapan Suara",
|
||||
"Settings": "Tetapan",
|
||||
"Settings saved successfully!": "Tetapan berjaya disimpan!",
|
||||
"Settings updated successfully": "Tetapan berjaya dikemas kini",
|
||||
"Share": "Kongsi",
|
||||
"Share Chat": "Kongsi Perbualan",
|
||||
"Share to OpenWebUI Community": "Kongsi kepada Komuniti OpenWebUI",
|
||||
|
|
@ -600,6 +604,7 @@
|
|||
"Tell us more:": "Beritahu kami lebih lanjut",
|
||||
"Temperature": "Suhu",
|
||||
"Template": "Templat",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "Penyiapan Teks",
|
||||
"Text-to-Speech Engine": "Enjin Teks-ke-Ucapan",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -611,7 +616,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "Tindakan ini tidak boleh diubah semula kepada asal. Adakah anda ingin teruskan",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Ini akan memastikan bahawa perbualan berharga anda disimpan dengan selamat ke pangkalan data 'backend' anda. Terima kasih!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "ni adalah ciri percubaan, ia mungkin tidak berfungsi seperti yang diharapkan dan tertakluk kepada perubahan pada bila-bila masa.",
|
||||
"This setting does not sync across browsers or devices.": "Tetapan ini tidak menyegerak merentas pelayar web atau peranti.",
|
||||
"This will delete": "Ini akan memadam",
|
||||
"Thorough explanation": "Penjelasan menyeluruh",
|
||||
"Tika": "Tika",
|
||||
|
|
@ -692,17 +696,15 @@
|
|||
"Web": "Web",
|
||||
"Web API": "API Web",
|
||||
"Web Loader Settings": "Tetapan Pemuat Web",
|
||||
"Web Params": "Parameter Web",
|
||||
"Web Search": "Carian Web",
|
||||
"Web Search Engine": "Enjin Carian Web",
|
||||
"Webhook URL": "URL 'Webhook'",
|
||||
"WebUI Settings": "Tetapan WebUI",
|
||||
"WebUI will make requests to": "WebUI akan membuat permintaan kepada",
|
||||
"What’s New in": "Apakah yang terbaru dalam",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Apabila sejarah dimatikan, perbualan baharu pada pelayan web ini tidak akan muncul dalam sejarah pada mana-mana peranti anda.",
|
||||
"Whisper (Local)": "Whisper (Local)",
|
||||
"Widescreen Mode": "Mod Skrin Lebar",
|
||||
"Workspace": "Ruang Kerja",
|
||||
"Workspace": "Ruangan Kerja",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Tulis cadangan gesaan (cth Siapakah anda?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Tulis ringkasan dalam 50 patah perkataan yang meringkaskan [topik atau kata kunci].",
|
||||
"Yesterday": "Semalam",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "Alle brukere",
|
||||
"Allow": "Tillat",
|
||||
"Allow Chat Deletion": "Tillat sletting av chatter",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "Tillat ikke-lokale stemmer",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "Aktiver stedstjenester",
|
||||
"Allow Voice Interruption in Call": "Muliggjør stemmeavbrytelse i samtale",
|
||||
"alphanumeric characters and hyphens": "alfanumeriske tegn og bindestreker",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "Lydinnstillingene ble oppdatert",
|
||||
"August": "august",
|
||||
"Auto-playback response": "Automatisk avspilling av svar",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api Autentiseringsstreng",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Grunn-URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Grunn-URL kreves.",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "Chat-boble UI",
|
||||
"Chat Controls": "Chat-kontroller",
|
||||
"Chat direction": "Chat-retning",
|
||||
"Chat History": "Chat-historikk",
|
||||
"Chat History is off for this browser.": "Chat-historikk er av for denne nettleseren.",
|
||||
"Chats": "Chatter",
|
||||
"Check Again": "Sjekk igjen",
|
||||
"Check for updates": "Sjekk for oppdateringer",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "Klikk her for å velge en csv-fil.",
|
||||
"Click here to select a py file.": "Klikk her for å velge en py-fil.",
|
||||
"Click here to select documents.": "Klikk her for å velge dokumenter.",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "klikk her.",
|
||||
"Click on the user role button to change a user's role.": "Klikk på brukerrolle-knappen for å endre en brukers rolle.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Skrivetilgang til utklippstavlen ble avslått. Kontroller nettleserinnstillingene for å gi nødvendig tillatelse.",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "ComfyUI Grunn-URL",
|
||||
"ComfyUI Base URL is required.": "ComfyUI Grunn-URL kreves.",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "Kommando",
|
||||
"Concurrent Requests": "Samtidige forespørsler",
|
||||
"Confirm": "Bekreft",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "Database",
|
||||
"December": "desember",
|
||||
"Default": "Standard",
|
||||
"Default (Automatic1111)": "Standard (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "Standard (SentenceTransformers)",
|
||||
"Default Model": "Standardmodell",
|
||||
"Default model updated": "Standardmodell oppdatert",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "Ikke installer funksjoner fra kilder du ikke fullt ut stoler på.",
|
||||
"Do not install tools from sources you do not fully trust.": "Ikke installer verktøy fra kilder du ikke fullt ut stoler på.",
|
||||
"Document": "Dokument",
|
||||
"Document Settings": "Dokumentinnstillinger",
|
||||
"Documentation": "Dokumentasjon",
|
||||
"Documents": "Dokumenter",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "har ingen tilkobling til eksterne tjenester, og dataene dine blir værende sikkert på din lokale tjener.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "Embedding-modell",
|
||||
"Embedding Model Engine": "Embedding-modellmotor",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Embedding-modell satt til \"{{embedding_model}}\"",
|
||||
"Enable Chat History": "Aktiver chat-historikk",
|
||||
"Enable Community Sharing": "Aktiver deling i fellesskap",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "Aktiver nye registreringer",
|
||||
"Enable Web Search": "Aktiver websøk",
|
||||
"Enabled": "Aktivert",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Skriv inn Google PSE Motor-ID",
|
||||
"Enter Image Size (e.g. 512x512)": "Skriv inn bildestørrelse (f.eks. 512x512)",
|
||||
"Enter language codes": "Skriv inn språkkoder",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Skriv inn modelltag (f.eks. {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Skriv inn antall steg (f.eks. 50)",
|
||||
"Enter Score": "Skriv inn poengsum",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Laget av OpenWebUI-fellesskapet",
|
||||
"Make sure to enclose them with": "Sørg for å omslutte dem med",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "Administrer",
|
||||
"Manage Models": "Administrer modeller",
|
||||
"Manage Ollama Models": "Administrer Ollama-modeller",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "Minne tømt",
|
||||
"Memory deleted successfully": "Minne slettet",
|
||||
"Memory updated successfully": "Minne oppdatert",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Meldinger du sender etter at du har opprettet lenken din vil ikke bli delt. Brukere med URL-en vil kunne se den delte chatten.",
|
||||
"Min P": "",
|
||||
"Minimum Score": "Minimum poengsum",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! Ser ut som URL-en er ugyldig. Vennligst dobbeltsjekk og prøv igjen.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "Oops! Det oppstod en feil i forrige svar. Prøv igjen eller kontakt administrator",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! Du bruker en ikke-støttet metode (kun frontend). Vennligst server WebUI fra backend.",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "Åpne ny chat",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open WebUI-versjon (v{{OPEN_WEBUI_VERSION}}) er lavere enn nødvendig versjon (v{{REQUIRED_VERSION}})",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -536,13 +541,13 @@
|
|||
"Select a base model": "Velg en grunnmodell",
|
||||
"Select a engine": "Velg en motor",
|
||||
"Select a function": "Velg en funksjon",
|
||||
"Select a mode": "Velg en modus",
|
||||
"Select a model": "Velg en modell",
|
||||
"Select a pipeline": "Velg en pipeline",
|
||||
"Select a pipeline url": "Velg en pipeline-URL",
|
||||
"Select a tool": "Velg et verktøy",
|
||||
"Select an Ollama instance": "Velg en Ollama-instans",
|
||||
"Select Documents": "Velg dokumenter",
|
||||
"Select Engine": "",
|
||||
"Select model": "Velg modell",
|
||||
"Select only one model to call": "Velg kun én modell å kalle",
|
||||
"Selected model(s) do not support image inputs": "Valgte modell(er) støtter ikke bildeforslag",
|
||||
|
|
@ -564,7 +569,6 @@
|
|||
"Set Voice": "Sett stemme",
|
||||
"Settings": "Innstillinger",
|
||||
"Settings saved successfully!": "Innstillinger lagret!",
|
||||
"Settings updated successfully": "Innstillinger oppdatert",
|
||||
"Share": "Del",
|
||||
"Share Chat": "Del chat",
|
||||
"Share to OpenWebUI Community": "Del med OpenWebUI-fellesskapet",
|
||||
|
|
@ -600,6 +604,7 @@
|
|||
"Tell us more:": "Fortell oss mer:",
|
||||
"Temperature": "Temperatur",
|
||||
"Template": "Mal",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "Tekstfullføring",
|
||||
"Text-to-Speech Engine": "Tekst-til-tale-motor",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -611,7 +616,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "Denne handlingen kan ikke angres. Ønsker du å fortsette?",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dette sikrer at dine verdifulle samtaler er trygt lagret i backend-databasen din. Takk!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Dette er en eksperimentell funksjon, det er mulig den ikke fungerer som forventet og kan endres når som helst.",
|
||||
"This setting does not sync across browsers or devices.": "Denne innstillingen synkroniseres ikke mellom nettlesere eller enheter.",
|
||||
"This will delete": "Dette vil slette",
|
||||
"Thorough explanation": "Grundig forklaring",
|
||||
"Tika": "Tika",
|
||||
|
|
@ -692,14 +696,12 @@
|
|||
"Web": "Web",
|
||||
"Web API": "Web-API",
|
||||
"Web Loader Settings": "Web-lasterinnstillinger",
|
||||
"Web Params": "Web-parametere",
|
||||
"Web Search": "Websøk",
|
||||
"Web Search Engine": "Websøkemotor",
|
||||
"Webhook URL": "Webhook URL",
|
||||
"WebUI Settings": "WebUI innstillinger",
|
||||
"WebUI will make requests to": "WebUI vil gjøre forespørsler til",
|
||||
"What’s New in": "Hva er nytt i",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Når historikken er slått av, vil nye chatter på denne nettleseren ikke vises i historikken din på noen av enhetene dine.",
|
||||
"Whisper (Local)": "Whisper (Lokal)",
|
||||
"Widescreen Mode": "Bredskjermmodus",
|
||||
"Workspace": "Arbeidsområde",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "Alle Gebruikers",
|
||||
"Allow": "Toestaan",
|
||||
"Allow Chat Deletion": "Sta Chat Verwijdering toe",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "",
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"alphanumeric characters and hyphens": "alfanumerieke karakters en streepjes",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "",
|
||||
"August": "Augustus",
|
||||
"Auto-playback response": "Automatisch afspelen van antwoord",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Base URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Basis URL is verplicht",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "Chat Bubble UI",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "Chat Richting",
|
||||
"Chat History": "Chat Geschiedenis",
|
||||
"Chat History is off for this browser.": "Chat Geschiedenis is uitgeschakeld voor deze browser.",
|
||||
"Chats": "Chats",
|
||||
"Check Again": "Controleer Opnieuw",
|
||||
"Check for updates": "Controleer op updates",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "Klik hier om een csv file te selecteren.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Klik hier om documenten te selecteren",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "klik hier.",
|
||||
"Click on the user role button to change a user's role.": "Klik op de gebruikersrol knop om de rol van een gebruiker te wijzigen.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "ComfyUI Base URL",
|
||||
"ComfyUI Base URL is required.": "ComfyUI Base URL is required.",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "Commando",
|
||||
"Concurrent Requests": "Gelijktijdige verzoeken",
|
||||
"Confirm": "",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "Database",
|
||||
"December": "December",
|
||||
"Default": "Standaard",
|
||||
"Default (Automatic1111)": "Standaard (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "Standaard (SentenceTransformers)",
|
||||
"Default Model": "Standaard model",
|
||||
"Default model updated": "Standaard model bijgewerkt",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "Document",
|
||||
"Document Settings": "Document Instellingen",
|
||||
"Documentation": "",
|
||||
"Documents": "Documenten",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "maakt geen externe verbindingen, en je gegevens blijven veilig op je lokaal gehoste server.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "Embedding Model",
|
||||
"Embedding Model Engine": "Embedding Model Engine",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Embedding model ingesteld op \"{{embedding_model}}\"",
|
||||
"Enable Chat History": "Schakel Chat Geschiedenis in",
|
||||
"Enable Community Sharing": "Delen via de community inschakelen",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "Schakel Nieuwe Registraties in",
|
||||
"Enable Web Search": "Zoeken op het web inschakelen",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Voer Google PSE Engine-ID in",
|
||||
"Enter Image Size (e.g. 512x512)": "Voeg afbeelding formaat toe (Bijv. 512x512)",
|
||||
"Enter language codes": "Voeg taal codes toe",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Voeg model tag toe (Bijv. {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Voeg aantal stappen toe (Bijv. 50)",
|
||||
"Enter Score": "Voeg score toe",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Gemaakt door OpenWebUI Community",
|
||||
"Make sure to enclose them with": "Zorg ervoor dat je ze omringt met",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "",
|
||||
"Manage Models": "Beheer Modellen",
|
||||
"Manage Ollama Models": "Beheer Ollama Modellen",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Berichten die u verzendt nadat u uw link hebt gemaakt, worden niet gedeeld. Gebruikers met de URL kunnen de gedeelde chat bekijken.",
|
||||
"Min P": "",
|
||||
"Minimum Score": "Minimale Score",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! Het lijkt erop dat de URL ongeldig is. Controleer het nogmaals en probeer opnieuw.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! Je gebruikt een niet-ondersteunde methode (alleen frontend). Serveer de WebUI vanuit de backend.",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "Open nieuwe chat",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -536,13 +541,13 @@
|
|||
"Select a base model": "Selecteer een basismodel",
|
||||
"Select a engine": "",
|
||||
"Select a function": "",
|
||||
"Select a mode": "Selecteer een modus",
|
||||
"Select a model": "Selecteer een model",
|
||||
"Select a pipeline": "Selecteer een pijplijn",
|
||||
"Select a pipeline url": "Selecteer een pijplijn-URL",
|
||||
"Select a tool": "",
|
||||
"Select an Ollama instance": "Selecteer een Ollama instantie",
|
||||
"Select Documents": "",
|
||||
"Select Engine": "",
|
||||
"Select model": "Selecteer een model",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Geselecteerde modellen ondersteunen geen beeldinvoer",
|
||||
|
|
@ -564,7 +569,6 @@
|
|||
"Set Voice": "Stel Stem in",
|
||||
"Settings": "Instellingen",
|
||||
"Settings saved successfully!": "Instellingen succesvol opgeslagen!",
|
||||
"Settings updated successfully": "",
|
||||
"Share": "Deel Chat",
|
||||
"Share Chat": "Deel Chat",
|
||||
"Share to OpenWebUI Community": "Deel naar OpenWebUI Community",
|
||||
|
|
@ -600,6 +604,7 @@
|
|||
"Tell us more:": "Vertel ons meer:",
|
||||
"Temperature": "Temperatuur",
|
||||
"Template": "Template",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "Tekst Aanvulling",
|
||||
"Text-to-Speech Engine": "Tekst-naar-Spraak Engine",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -611,7 +616,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dit zorgt ervoor dat je waardevolle gesprekken veilig worden opgeslagen in je backend database. Dank je wel!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "Deze instelling wordt niet gesynchroniseerd tussen browsers of apparaten.",
|
||||
"This will delete": "",
|
||||
"Thorough explanation": "Gevorderde uitleg",
|
||||
"Tika": "",
|
||||
|
|
@ -692,14 +696,12 @@
|
|||
"Web": "Web",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Web Loader instellingen",
|
||||
"Web Params": "Web Params",
|
||||
"Web Search": "Zoeken op het web",
|
||||
"Web Search Engine": "Zoekmachine op het web",
|
||||
"Webhook URL": "Webhook URL",
|
||||
"WebUI Settings": "WebUI Instellingen",
|
||||
"WebUI will make requests to": "WebUI zal verzoeken doen naar",
|
||||
"What’s New in": "Wat is nieuw in",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Wanneer geschiedenis is uitgeschakeld, zullen nieuwe chats op deze browser niet verschijnen in je geschiedenis op een van je apparaten.",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "Werkruimte",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "ਸਾਰੇ ਉਪਭੋਗਤਾ",
|
||||
"Allow": "ਅਨੁਮਤੀ",
|
||||
"Allow Chat Deletion": "ਗੱਲਬਾਤ ਮਿਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "",
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"alphanumeric characters and hyphens": "ਅਲਫ਼ਾਨਯੂਮੈਰਿਕ ਅੱਖਰ ਅਤੇ ਹਾਈਫਨ",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "",
|
||||
"August": "ਅਗਸਤ",
|
||||
"Auto-playback response": "ਆਟੋ-ਪਲੇਬੈਕ ਜਵਾਬ",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 ਬੇਸ URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 ਬੇਸ URL ਦੀ ਲੋੜ ਹੈ।",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "ਗੱਲਬਾਤ ਬਬਲ UI",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "ਗੱਲਬਾਤ ਡਿਰੈਕਟਨ",
|
||||
"Chat History": "ਗੱਲਬਾਤ ਦਾ ਇਤਿਹਾਸ",
|
||||
"Chat History is off for this browser.": "ਇਸ ਬ੍ਰਾਊਜ਼ਰ ਲਈ ਗੱਲਬਾਤ ਦਾ ਇਤਿਹਾਸ ਬੰਦ ਹੈ।",
|
||||
"Chats": "ਗੱਲਾਂ",
|
||||
"Check Again": "ਮੁੜ ਜਾਂਚ ਕਰੋ",
|
||||
"Check for updates": "ਅੱਪਡੇਟ ਲਈ ਜਾਂਚ ਕਰੋ",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "CSV ਫਾਈਲ ਚੁਣਨ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ।",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "ਡਾਕੂਮੈਂਟ ਚੁਣਨ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ।",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ।",
|
||||
"Click on the user role button to change a user's role.": "ਉਪਭੋਗਤਾ ਦੀ ਭੂਮਿਕਾ ਬਦਲਣ ਲਈ ਉਪਭੋਗਤਾ ਭੂਮਿਕਾ ਬਟਨ 'ਤੇ ਕਲਿੱਕ ਕਰੋ।",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ਕੰਫੀਯੂਆਈ",
|
||||
"ComfyUI Base URL": "ਕੰਫੀਯੂਆਈ ਬੇਸ URL",
|
||||
"ComfyUI Base URL is required.": "ਕੰਫੀਯੂਆਈ ਬੇਸ URL ਦੀ ਲੋੜ ਹੈ।",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "ਕਮਾਂਡ",
|
||||
"Concurrent Requests": "ਸਮਕਾਲੀ ਬੇਨਤੀਆਂ",
|
||||
"Confirm": "",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "ਡਾਟਾਬੇਸ",
|
||||
"December": "ਦਸੰਬਰ",
|
||||
"Default": "ਮੂਲ",
|
||||
"Default (Automatic1111)": "ਮੂਲ (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "ਮੂਲ (ਸੈਂਟੈਂਸਟ੍ਰਾਂਸਫਾਰਮਰਸ)",
|
||||
"Default Model": "ਡਿਫਾਲਟ ਮਾਡਲ",
|
||||
"Default model updated": "ਮੂਲ ਮਾਡਲ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "ਡਾਕੂਮੈਂਟ",
|
||||
"Document Settings": "ਡਾਕੂਮੈਂਟ ਸੈਟਿੰਗਾਂ",
|
||||
"Documentation": "",
|
||||
"Documents": "ਡਾਕੂਮੈਂਟ",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "ਕੋਈ ਬਾਹਰੀ ਕਨੈਕਸ਼ਨ ਨਹੀਂ ਬਣਾਉਂਦਾ, ਅਤੇ ਤੁਹਾਡਾ ਡਾਟਾ ਤੁਹਾਡੇ ਸਥਾਨਕ ਸਰਵਰ 'ਤੇ ਸੁਰੱਖਿਅਤ ਰਹਿੰਦਾ ਹੈ।",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "ਐਮਬੈੱਡਿੰਗ ਮਾਡਲ",
|
||||
"Embedding Model Engine": "ਐਮਬੈੱਡਿੰਗ ਮਾਡਲ ਇੰਜਣ",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "ਐਮਬੈੱਡਿੰਗ ਮਾਡਲ ਨੂੰ \"{{embedding_model}}\" 'ਤੇ ਸੈੱਟ ਕੀਤਾ ਗਿਆ",
|
||||
"Enable Chat History": "ਗੱਲਬਾਤ ਦਾ ਇਤਿਹਾਸ ਯੋਗ ਕਰੋ",
|
||||
"Enable Community Sharing": "ਕਮਿਊਨਿਟੀ ਸ਼ੇਅਰਿੰਗ ਨੂੰ ਸਮਰੱਥ ਕਰੋ",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "ਨਵੇਂ ਸਾਈਨ ਅਪ ਯੋਗ ਕਰੋ",
|
||||
"Enable Web Search": "ਵੈੱਬ ਖੋਜ ਨੂੰ ਸਮਰੱਥ ਕਰੋ",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Google PSE ਇੰਜਣ ID ਦਾਖਲ ਕਰੋ",
|
||||
"Enter Image Size (e.g. 512x512)": "ਚਿੱਤਰ ਆਕਾਰ ਦਰਜ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ 512x512)",
|
||||
"Enter language codes": "ਭਾਸ਼ਾ ਕੋਡ ਦਰਜ ਕਰੋ",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "ਮਾਡਲ ਟੈਗ ਦਰਜ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "ਕਦਮਾਂ ਦੀ ਗਿਣਤੀ ਦਰਜ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ 50)",
|
||||
"Enter Score": "ਸਕੋਰ ਦਰਜ ਕਰੋ",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "ਓਪਨਵੈਬਯੂਆਈ ਕਮਿਊਨਿਟੀ ਦੁਆਰਾ ਬਣਾਇਆ ਗਿਆ",
|
||||
"Make sure to enclose them with": "ਸੁਨਿਸ਼ਚਿਤ ਕਰੋ ਕਿ ਉਨ੍ਹਾਂ ਨੂੰ ਘੇਰੋ",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "",
|
||||
"Manage Models": "ਮਾਡਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ",
|
||||
"Manage Ollama Models": "ਓਲਾਮਾ ਮਾਡਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "ਤੁਹਾਡਾ ਲਿੰਕ ਬਣਾਉਣ ਤੋਂ ਬਾਅਦ ਤੁਹਾਡੇ ਵੱਲੋਂ ਭੇਜੇ ਗਏ ਸੁਨੇਹੇ ਸਾਂਝੇ ਨਹੀਂ ਕੀਤੇ ਜਾਣਗੇ। URL ਵਾਲੇ ਉਪਭੋਗਤਾ ਸਾਂਝੀ ਚੈਟ ਨੂੰ ਵੇਖ ਸਕਣਗੇ।",
|
||||
"Min P": "",
|
||||
"Minimum Score": "ਘੱਟੋ-ਘੱਟ ਸਕੋਰ",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "ਓਹੋ! ਲੱਗਦਾ ਹੈ ਕਿ URL ਗਲਤ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਜਾਂਚ ਕਰੋ ਅਤੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ।",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "ਓਹੋ! ਤੁਸੀਂ ਇੱਕ ਅਣਸਮਰਥਿਤ ਢੰਗ ਵਰਤ ਰਹੇ ਹੋ (ਸਿਰਫ਼ ਫਰੰਟਐਂਡ)। ਕਿਰਪਾ ਕਰਕੇ ਵੈਬਯੂਆਈ ਨੂੰ ਬੈਕਐਂਡ ਤੋਂ ਸਰਵ ਕਰੋ।",
|
||||
"Open AI (Dall-E)": "ਓਪਨ ਏਆਈ (ਡਾਲ-ਈ)",
|
||||
"Open new chat": "ਨਵੀਂ ਗੱਲਬਾਤ ਖੋਲ੍ਹੋ",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "ਓਪਨਏਆਈ",
|
||||
|
|
@ -536,13 +541,13 @@
|
|||
"Select a base model": "ਆਧਾਰ ਮਾਡਲ ਚੁਣੋ",
|
||||
"Select a engine": "",
|
||||
"Select a function": "",
|
||||
"Select a mode": "ਇੱਕ ਮੋਡ ਚੁਣੋ",
|
||||
"Select a model": "ਇੱਕ ਮਾਡਲ ਚੁਣੋ",
|
||||
"Select a pipeline": "ਪਾਈਪਲਾਈਨ ਚੁਣੋ",
|
||||
"Select a pipeline url": "ਪਾਈਪਲਾਈਨ URL ਚੁਣੋ",
|
||||
"Select a tool": "",
|
||||
"Select an Ollama instance": "ਇੱਕ ਓਲਾਮਾ ਇੰਸਟੈਂਸ ਚੁਣੋ",
|
||||
"Select Documents": "",
|
||||
"Select Engine": "",
|
||||
"Select model": "ਮਾਡਲ ਚੁਣੋ",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "ਚੁਣੇ ਗਏ ਮਾਡਲ(ਆਂ) ਚਿੱਤਰ ਇਨਪੁੱਟਾਂ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੇ",
|
||||
|
|
@ -564,7 +569,6 @@
|
|||
"Set Voice": "ਆਵਾਜ਼ ਸੈੱਟ ਕਰੋ",
|
||||
"Settings": "ਸੈਟਿੰਗਾਂ",
|
||||
"Settings saved successfully!": "ਸੈਟਿੰਗਾਂ ਸਫਲਤਾਪੂਰਵਕ ਸੰਭਾਲੀਆਂ ਗਈਆਂ!",
|
||||
"Settings updated successfully": "",
|
||||
"Share": "ਸਾਂਝਾ ਕਰੋ",
|
||||
"Share Chat": "ਗੱਲਬਾਤ ਸਾਂਝੀ ਕਰੋ",
|
||||
"Share to OpenWebUI Community": "ਓਪਨਵੈਬਯੂਆਈ ਕਮਿਊਨਿਟੀ ਨਾਲ ਸਾਂਝਾ ਕਰੋ",
|
||||
|
|
@ -600,6 +604,7 @@
|
|||
"Tell us more:": "ਸਾਨੂੰ ਹੋਰ ਦੱਸੋ:",
|
||||
"Temperature": "ਤਾਪਮਾਨ",
|
||||
"Template": "ਟੈਮਪਲੇਟ",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "ਪਾਠ ਪੂਰਨਤਾ",
|
||||
"Text-to-Speech Engine": "ਪਾਠ-ਤੋਂ-ਬੋਲ ਇੰਜਣ",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -611,7 +616,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦਾ ਹੈ ਕਿ ਤੁਹਾਡੀਆਂ ਕੀਮਤੀ ਗੱਲਾਂ ਤੁਹਾਡੇ ਬੈਕਐਂਡ ਡਾਟਾਬੇਸ ਵਿੱਚ ਸੁਰੱਖਿਅਤ ਤੌਰ 'ਤੇ ਸੰਭਾਲੀਆਂ ਗਈਆਂ ਹਨ। ਧੰਨਵਾਦ!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "ਇਹ ਸੈਟਿੰਗ ਬ੍ਰਾਊਜ਼ਰ ਜਾਂ ਡਿਵਾਈਸਾਂ ਵਿੱਚ ਸਿੰਕ ਨਹੀਂ ਹੁੰਦੀ।",
|
||||
"This will delete": "",
|
||||
"Thorough explanation": "ਵਿਸਥਾਰ ਨਾਲ ਵਿਆਖਿਆ",
|
||||
"Tika": "",
|
||||
|
|
@ -692,14 +696,12 @@
|
|||
"Web": "ਵੈਬ",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "ਵੈਬ ਲੋਡਰ ਸੈਟਿੰਗਾਂ",
|
||||
"Web Params": "ਵੈਬ ਪੈਰਾਮੀਟਰ",
|
||||
"Web Search": "ਵੈੱਬ ਖੋਜ",
|
||||
"Web Search Engine": "ਵੈੱਬ ਖੋਜ ਇੰਜਣ",
|
||||
"Webhook URL": "ਵੈਬਹੁੱਕ URL",
|
||||
"WebUI Settings": "ਵੈਬਯੂਆਈ ਸੈਟਿੰਗਾਂ",
|
||||
"WebUI will make requests to": "ਵੈਬਯੂਆਈ ਬੇਨਤੀਆਂ ਕਰੇਗਾ",
|
||||
"What’s New in": "ਨਵਾਂ ਕੀ ਹੈ",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "ਜਦੋਂ ਇਤਿਹਾਸ ਬੰਦ ਹੁੰਦਾ ਹੈ, ਤਾਂ ਇਸ ਬ੍ਰਾਊਜ਼ਰ 'ਤੇ ਨਵੀਆਂ ਗੱਲਾਂ ਤੁਹਾਡੇ ਕਿਸੇ ਵੀ ਜੰਤਰ 'ਤੇ ਤੁਹਾਡੇ ਇਤਿਹਾਸ ਵਿੱਚ ਨਹੀਂ ਆਉਣਗੀਆਂ।",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "ਕਾਰਜਸਥਲ",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "Wszyscy użytkownicy",
|
||||
"Allow": "Pozwól",
|
||||
"Allow Chat Deletion": "Pozwól na usuwanie czatu",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "",
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"alphanumeric characters and hyphens": "znaki alfanumeryczne i myślniki",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "",
|
||||
"August": "Sierpień",
|
||||
"Auto-playback response": "Odtwarzanie automatyczne odpowiedzi",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "",
|
||||
"AUTOMATIC1111 Base URL": "Podstawowy adres URL AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "Podstawowy adres URL AUTOMATIC1111 jest wymagany.",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "Bąbelki czatu",
|
||||
"Chat Controls": "",
|
||||
"Chat direction": "Kierunek czatu",
|
||||
"Chat History": "Historia czatu",
|
||||
"Chat History is off for this browser.": "Historia czatu jest wyłączona dla tej przeglądarki.",
|
||||
"Chats": "Czaty",
|
||||
"Check Again": "Sprawdź ponownie",
|
||||
"Check for updates": "Sprawdź aktualizacje",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "Kliknij tutaj, żeby wybrać plik CSV",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Kliknij tutaj, aby wybrać dokumenty.",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "kliknij tutaj.",
|
||||
"Click on the user role button to change a user's role.": "Kliknij przycisk roli użytkownika, aby zmienić rolę użytkownika.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "Bazowy URL ComfyUI",
|
||||
"ComfyUI Base URL is required.": "Bazowy URL ComfyUI jest wymagany.",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "Polecenie",
|
||||
"Concurrent Requests": "Równoczesne żądania",
|
||||
"Confirm": "",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "Baza danych",
|
||||
"December": "Grudzień",
|
||||
"Default": "Domyślny",
|
||||
"Default (Automatic1111)": "Domyślny (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "Domyślny (SentenceTransformers)",
|
||||
"Default Model": "Model domyślny",
|
||||
"Default model updated": "Domyślny model zaktualizowany",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "Dokument",
|
||||
"Document Settings": "Ustawienia dokumentu",
|
||||
"Documentation": "",
|
||||
"Documents": "Dokumenty",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "nie nawiązuje żadnych zewnętrznych połączeń, a Twoje dane pozostają bezpiecznie na Twoim lokalnie hostowanym serwerze.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "Model osadzania",
|
||||
"Embedding Model Engine": "Silnik modelu osadzania",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Model osadzania ustawiono na \"{{embedding_model}}\"",
|
||||
"Enable Chat History": "Włącz historię czatu",
|
||||
"Enable Community Sharing": "Włączanie udostępniania społecznościowego",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "Włącz nowe rejestracje",
|
||||
"Enable Web Search": "Włączanie wyszukiwania w Internecie",
|
||||
"Enabled": "",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Wprowadź identyfikator aparatu Google PSE",
|
||||
"Enter Image Size (e.g. 512x512)": "Wprowadź rozmiar obrazu (np. 512x512)",
|
||||
"Enter language codes": "Wprowadź kody języków",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Wprowadź tag modelu (np. {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Wprowadź liczbę kroków (np. 50)",
|
||||
"Enter Score": "Wprowadź wynik",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Stworzone przez społeczność OpenWebUI",
|
||||
"Make sure to enclose them with": "Upewnij się, że są one zamknięte w",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "",
|
||||
"Manage Models": "Zarządzaj modelami",
|
||||
"Manage Ollama Models": "Zarządzaj modelami Ollama",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Wiadomości wysyłane po utworzeniu linku nie będą udostępniane. Użytkownicy z adresem URL będą mogli wyświetlić udostępniony czat.",
|
||||
"Min P": "",
|
||||
"Minimum Score": "Minimalny wynik",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Ups! Wygląda na to, że URL jest nieprawidłowy. Sprawdź jeszcze raz i spróbuj ponownie.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ups! Używasz nieobsługiwanej metody (tylko interfejs front-end). Proszę obsłużyć interfejs WebUI z poziomu backendu.",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "Otwórz nowy czat",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -538,13 +543,13 @@
|
|||
"Select a base model": "Wybieranie modelu bazowego",
|
||||
"Select a engine": "",
|
||||
"Select a function": "",
|
||||
"Select a mode": "Wybierz tryb",
|
||||
"Select a model": "Wybierz model",
|
||||
"Select a pipeline": "Wybieranie potoku",
|
||||
"Select a pipeline url": "Wybieranie adresu URL potoku",
|
||||
"Select a tool": "",
|
||||
"Select an Ollama instance": "Wybierz instancję Ollama",
|
||||
"Select Documents": "",
|
||||
"Select Engine": "",
|
||||
"Select model": "Wybierz model",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Wybrane modele nie obsługują danych wejściowych obrazu",
|
||||
|
|
@ -566,7 +571,6 @@
|
|||
"Set Voice": "Ustaw głos",
|
||||
"Settings": "Ustawienia",
|
||||
"Settings saved successfully!": "Ustawienia zapisane pomyślnie!",
|
||||
"Settings updated successfully": "",
|
||||
"Share": "Udostępnij",
|
||||
"Share Chat": "Udostępnij czat",
|
||||
"Share to OpenWebUI Community": "Dziel się z społecznością OpenWebUI",
|
||||
|
|
@ -602,6 +606,7 @@
|
|||
"Tell us more:": "Powiedz nam więcej",
|
||||
"Temperature": "Temperatura",
|
||||
"Template": "Szablon",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "Uzupełnienie tekstu",
|
||||
"Text-to-Speech Engine": "Silnik tekstu na mowę",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -613,7 +618,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "To zapewnia, że Twoje cenne rozmowy są bezpiecznie zapisywane w bazie danych backendowej. Dziękujemy!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "To ustawienie nie synchronizuje się między przeglądarkami ani urządzeniami.",
|
||||
"This will delete": "",
|
||||
"Thorough explanation": "Dokładne wyjaśnienie",
|
||||
"Tika": "",
|
||||
|
|
@ -694,14 +698,12 @@
|
|||
"Web": "Sieć",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Ustawienia pobierania z sieci",
|
||||
"Web Params": "Parametry sieci",
|
||||
"Web Search": "Wyszukiwarka w Internecie",
|
||||
"Web Search Engine": "Wyszukiwarka internetowa",
|
||||
"Webhook URL": "URL webhook",
|
||||
"WebUI Settings": "Ustawienia interfejsu WebUI",
|
||||
"WebUI will make requests to": "Interfejs sieciowy będzie wysyłał żądania do",
|
||||
"What’s New in": "Co nowego w",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Kiedy historia jest wyłączona, nowe czaty na tej przeglądarce nie będą widoczne w historii na żadnym z twoich urządzeń.",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "Obszar roboczy",
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@
|
|||
"All Users": "Todos os Usuários",
|
||||
"Allow": "Permitir",
|
||||
"Allow Chat Deletion": "Permitir Exclusão de Chats",
|
||||
"Allow Chat Editing": "",
|
||||
"Allow non-local voices": "Permitir vozes não locais",
|
||||
"Allow Temporary Chat": "",
|
||||
"Allow User Location": "Permitir Localização do Usuário",
|
||||
"Allow Voice Interruption in Call": "Permitir Interrupção de Voz na Chamada",
|
||||
"alphanumeric characters and hyphens": "caracteres alfanuméricos e hífens",
|
||||
|
|
@ -68,6 +70,7 @@
|
|||
"Audio settings updated successfully": "Configurações de áudio atualizadas com sucesso",
|
||||
"August": "Agosto",
|
||||
"Auto-playback response": "Resposta de reprodução automática",
|
||||
"Automatic1111": "",
|
||||
"AUTOMATIC1111 Api Auth String": "String de Autenticação da API AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL": "URL Base AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "URL Base AUTOMATIC1111 é necessária.",
|
||||
|
|
@ -92,8 +95,6 @@
|
|||
"Chat Bubble UI": "Interface de Bolha de Chat",
|
||||
"Chat Controls": "Controles de Chat",
|
||||
"Chat direction": "Direção do Chat",
|
||||
"Chat History": "Histórico de Chat",
|
||||
"Chat History is off for this browser.": "O Histórico de Chat está desativado para este navegador.",
|
||||
"Chats": "Chats",
|
||||
"Check Again": "Verificar Novamente",
|
||||
"Check for updates": "Verificar atualizações",
|
||||
|
|
@ -111,6 +112,7 @@
|
|||
"Click here to select a csv file.": "Clique aqui para enviar um arquivo csv.",
|
||||
"Click here to select a py file.": "Clique aqui para enviar um arquivo py.",
|
||||
"Click here to select documents.": "Clique aqui para enviar documentos.",
|
||||
"Click here to upload a workflow.json file.": "",
|
||||
"click here.": "clique aqui.",
|
||||
"Click on the user role button to change a user's role.": "Clique no botão de função do usuário para alterar a função de um usuário.",
|
||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Permissão de escrita na área de transferência negada. Verifique as configurações do seu navegador para conceder o acesso necessário.",
|
||||
|
|
@ -121,6 +123,8 @@
|
|||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "URL Base do ComfyUI",
|
||||
"ComfyUI Base URL is required.": "URL Base do ComfyUI é necessária.",
|
||||
"ComfyUI Workflow": "",
|
||||
"ComfyUI Workflow Nodes": "",
|
||||
"Command": "Comando",
|
||||
"Concurrent Requests": "Solicitações Concomitantes",
|
||||
"Confirm": "Confirmar",
|
||||
|
|
@ -159,7 +163,7 @@
|
|||
"Database": "Banco de Dados",
|
||||
"December": "Dezembro",
|
||||
"Default": "Padrão",
|
||||
"Default (Automatic1111)": "Padrão (Automatic1111)",
|
||||
"Default (Open AI)": "",
|
||||
"Default (SentenceTransformers)": "Padrão (SentenceTransformers)",
|
||||
"Default Model": "Modelo Padrão",
|
||||
"Default model updated": "Modelo padrão atualizado",
|
||||
|
|
@ -197,7 +201,6 @@
|
|||
"Do not install functions from sources you do not fully trust.": "Não instale funções de fontes que você não confia totalmente.",
|
||||
"Do not install tools from sources you do not fully trust.": "Não instale ferramentas de fontes que você não confia totalmente.",
|
||||
"Document": "Documento",
|
||||
"Document Settings": "Configurações de Documento",
|
||||
"Documentation": "Documentação",
|
||||
"Documents": "Documentos",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "não faz nenhuma conexão externa, e seus dados permanecem seguros no seu servidor local.",
|
||||
|
|
@ -222,8 +225,8 @@
|
|||
"Embedding Model": "Modelo de Embedding",
|
||||
"Embedding Model Engine": "Motor do Modelo de Embedding",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Modelo de embedding definido para \"{{embedding_model}}\"",
|
||||
"Enable Chat History": "Ativar Histórico de Chat",
|
||||
"Enable Community Sharing": "Ativar Compartilhamento Comunitário",
|
||||
"Enable Message Rating": "",
|
||||
"Enable New Sign Ups": "Ativar Novos Cadastros",
|
||||
"Enable Web Search": "Ativar Pesquisa na Web",
|
||||
"Enabled": "Ativado",
|
||||
|
|
@ -240,6 +243,7 @@
|
|||
"Enter Google PSE Engine Id": "Digite o ID do Motor do Google PSE",
|
||||
"Enter Image Size (e.g. 512x512)": "Digite o Tamanho da Imagem (por exemplo, 512x512)",
|
||||
"Enter language codes": "Digite os códigos de idioma",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Digite a tag do modelo (por exemplo, {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Digite o Número de Passos (por exemplo, 50)",
|
||||
"Enter Score": "Digite a Pontuação",
|
||||
|
|
@ -363,6 +367,7 @@
|
|||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Feito pela Comunidade OpenWebUI",
|
||||
"Make sure to enclose them with": "Certifique-se de encerrá-los com",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "",
|
||||
"Manage": "Gerenciar",
|
||||
"Manage Models": "Gerenciar Modelos",
|
||||
"Manage Ollama Models": "Gerenciar Modelos Ollama",
|
||||
|
|
@ -377,6 +382,7 @@
|
|||
"Memory cleared successfully": "Memória limpa com sucesso",
|
||||
"Memory deleted successfully": "Memória excluída com sucesso",
|
||||
"Memory updated successfully": "Memória atualizada com sucesso",
|
||||
"Merge Responses": "",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Mensagens enviadas após criar seu link não serão compartilhadas. Usuários com o URL poderão visualizar o chat compartilhado.",
|
||||
"Min P": "",
|
||||
"Minimum Score": "Pontuação Mínima",
|
||||
|
|
@ -438,7 +444,6 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Ops! Parece que a URL é inválida. Por favor, verifique novamente e tente de novo.",
|
||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "Ops! Houve um erro na resposta anterior. Por favor, tente novamente ou entre em contato com o administrador.",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ops! Você está usando um método não suportado (somente frontend). Por favor, sirva a WebUI a partir do backend.",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "Abrir novo chat",
|
||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "A versão do Open WebUI (v{{OPEN_WEBUI_VERSION}}) é inferior à versão necessária (v{{REQUIRED_VERSION}})",
|
||||
"OpenAI": "OpenAI",
|
||||
|
|
@ -537,13 +542,13 @@
|
|||
"Select a base model": "Selecione um modelo base",
|
||||
"Select a engine": "Selecione um motor",
|
||||
"Select a function": "Selecione uma função",
|
||||
"Select a mode": "Selecione um modo",
|
||||
"Select a model": "Selecione um modelo",
|
||||
"Select a pipeline": "Selecione um pipeline",
|
||||
"Select a pipeline url": "Selecione uma URL de pipeline",
|
||||
"Select a tool": "Selecione uma ferramenta",
|
||||
"Select an Ollama instance": "Selecione uma instância Ollama",
|
||||
"Select Documents": "Selecionar Documentos",
|
||||
"Select Engine": "",
|
||||
"Select model": "Selecionar modelo",
|
||||
"Select only one model to call": "Selecione apenas um modelo para chamar",
|
||||
"Selected model(s) do not support image inputs": "Modelo(s) selecionado(s) não suportam entradas de imagem",
|
||||
|
|
@ -565,7 +570,6 @@
|
|||
"Set Voice": "Definir Voz",
|
||||
"Settings": "Configurações",
|
||||
"Settings saved successfully!": "Configurações salvas com sucesso!",
|
||||
"Settings updated successfully": "Configurações atualizadas com sucesso",
|
||||
"Share": "Compartilhar",
|
||||
"Share Chat": "Compartilhar Chat",
|
||||
"Share to OpenWebUI Community": "Compartilhar com a Comunidade OpenWebUI",
|
||||
|
|
@ -601,6 +605,7 @@
|
|||
"Tell us more:": "Conte-nos mais:",
|
||||
"Temperature": "Temperatura",
|
||||
"Template": "Modelo",
|
||||
"Temporary Chat": "",
|
||||
"Text Completion": "Conclusão de Texto",
|
||||
"Text-to-Speech Engine": "Motor de Texto para Fala",
|
||||
"Tfs Z": "Tfs Z",
|
||||
|
|
@ -612,7 +617,6 @@
|
|||
"This action cannot be undone. Do you wish to continue?": "Esta ação não pode ser desfeita. Você deseja continuar?",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Isso garante que suas conversas valiosas sejam salvas com segurança no banco de dados do backend. Obrigado!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Esta é uma funcionalidade experimental, pode não funcionar como esperado e está sujeita a alterações a qualquer momento.",
|
||||
"This setting does not sync across browsers or devices.": "Esta configuração não sincroniza entre navegadores ou dispositivos.",
|
||||
"This will delete": "Isso vai excluir",
|
||||
"Thorough explanation": "Explicação detalhada",
|
||||
"Tika": "Tika",
|
||||
|
|
@ -693,14 +697,12 @@
|
|||
"Web": "Web",
|
||||
"Web API": "API Web",
|
||||
"Web Loader Settings": "Configurações do Carregador Web",
|
||||
"Web Params": "Parâmetros Web",
|
||||
"Web Search": "Pesquisa na Web",
|
||||
"Web Search Engine": "Mecanismo de Busca na Web",
|
||||
"Webhook URL": "URL do Webhook",
|
||||
"WebUI Settings": "Configurações da WebUI",
|
||||
"WebUI will make requests to": "A WebUI fará solicitações para",
|
||||
"What’s New in": "O que há de novo em",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Quando o histórico está desativado, novos chats neste navegador não aparecerão no seu histórico em nenhum dos seus dispositivos.",
|
||||
"Whisper (Local)": "Whisper (Local)",
|
||||
"Widescreen Mode": "Modo Tela Cheia",
|
||||
"Workspace": "Espaço de Trabalho",
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue