Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a58dfccb7d | ||
|
|
b35293228e | ||
|
|
963e250654 | ||
|
|
ca8b766c09 | ||
|
|
21eca7f1c1 | ||
|
|
8062866973 | ||
|
|
99530358fd | ||
|
|
621393ca62 | ||
|
|
0c6284be02 | ||
|
|
9d5e3e2a91 | ||
|
|
7f260938db | ||
|
|
c416444e24 | ||
|
|
b559bc84a7 | ||
|
|
3f53abb233 | ||
|
|
67efd0dd39 | ||
|
|
dcd32faa83 | ||
|
|
8fcb5cee66 | ||
|
|
13b757d847 | ||
|
|
c6d7f24542 | ||
|
|
4c1a9380e6 | ||
|
|
ad6e8edcd3 | ||
|
|
95c742ba9b | ||
|
|
546d442626 | ||
|
|
ed8c0b23a0 | ||
|
|
c8f44b73f1 | ||
|
|
bf6b149b8b | ||
|
|
f334c834e5 | ||
|
|
7c850bb78a | ||
|
|
a280fed4be | ||
|
|
cf9b5241ae | ||
|
|
dfa25af271 | ||
|
|
b538c5a206 | ||
|
|
4fa3fcbb3b | ||
|
|
b049ae269b | ||
|
|
e5bf27e716 | ||
|
|
a9a6ed8b71 | ||
|
|
e6c64282fc | ||
|
|
64b41655bb | ||
|
|
6ac40552b4 | ||
|
|
039c5c540b | ||
|
|
c9ed934d0b | ||
|
|
ef36b21684 | ||
|
|
c44e51ae58 | ||
|
|
6ecb7c80f1 | ||
|
|
380cb93e46 | ||
|
|
36e7662706 | ||
|
|
aa8d26496c | ||
|
|
4619e32b6a | ||
|
|
0352e956b6 | ||
|
|
f999956997 | ||
|
|
bfd268c5e6 | ||
|
|
b7ad47017d | ||
|
|
502b722902 | ||
|
|
c89b34fd75 | ||
|
|
b9b1fdd1a1 | ||
|
|
2e0fa1c6a0 | ||
|
|
f8726719ef | ||
|
|
3569fe9c73 | ||
|
|
4ffcabfb3f | ||
|
|
a7ed74744f | ||
|
|
ae0bb8f1eb | ||
|
|
034411e47e | ||
|
|
baf58ef396 | ||
|
|
006fc3495e | ||
|
|
29a3b82336 | ||
|
|
22a5e196c9 | ||
|
|
deec41d29a | ||
|
|
3978efd710 | ||
|
|
7a80e732df | ||
|
|
6681df29d2 | ||
|
|
9d58bb1c66 | ||
|
|
acbdb05bd0 | ||
|
|
25f5259e84 | ||
|
|
0ced153f86 | ||
|
|
faca8c8b53 | ||
|
|
4ad8181088 | ||
|
|
4f3ff4a69d | ||
|
|
fc0f2f2b3a | ||
|
|
b4cd084117 | ||
|
|
c1fd55bb04 | ||
|
|
77b2d2dbee | ||
|
|
f92aed1b91 | ||
|
|
90a6be8001 | ||
|
|
2e4de209fe | ||
|
|
287147687e | ||
|
|
a53f5d01aa | ||
|
|
1aaa2e8219 | ||
|
|
02b104f56b | ||
|
|
e691839771 | ||
|
|
4c22d130d9 | ||
|
|
065d23d0b1 | ||
|
|
4b0a232ae1 | ||
|
|
81130c205c | ||
|
|
36b94ca5f5 | ||
|
|
9e4326a582 | ||
|
|
8193c2f847 | ||
|
|
fbef731a04 | ||
|
|
dbf88a2eca | ||
|
|
413a9031eb | ||
|
|
23e69bcdb4 | ||
|
|
edff071cd2 | ||
|
|
3b487cfae9 | ||
|
|
a8d2072e9f | ||
|
|
260e42a691 | ||
|
|
596a9c60d7 | ||
|
|
a47e4a1148 | ||
|
|
312c8b9e7a | ||
|
|
1d99508943 | ||
|
|
b42fda0971 | ||
|
|
cf377d2e1c | ||
|
|
ec9d0b8a6d | ||
|
|
14cac8ed22 | ||
|
|
4ecf9dd62d | ||
|
|
b56dcf155c | ||
|
|
63ffdb38aa | ||
|
|
f9289d3079 | ||
|
|
709b56bc40 | ||
|
|
eb38d382ba | ||
|
|
5beaa5d892 | ||
|
|
01b24f6282 | ||
|
|
cbe3694b81 | ||
|
|
f531a51e91 | ||
|
|
a0667dfd1b | ||
|
|
2b78e613a4 | ||
|
|
b34ab10b5e | ||
|
|
f07cc37939 | ||
|
|
957b0ecd15 | ||
|
|
659bc246c9 | ||
|
|
1502af7e94 | ||
|
|
26c5a533ec | ||
|
|
4274016491 | ||
|
|
c6c298b412 | ||
|
|
63eda0fe42 | ||
|
|
c3693c91b3 | ||
|
|
e426067e46 | ||
|
|
2e482eca6d | ||
|
|
fdea1afc7f | ||
|
|
41fecb800d | ||
|
|
52cf06b36c | ||
|
|
ebce006974 | ||
|
|
ff60695a0f | ||
|
|
3aa9685f5a | ||
|
|
6cecb964a9 | ||
|
|
0216ee101c | ||
|
|
d3c6bfb764 | ||
|
|
ea6a5121b3 | ||
|
|
d6a4fe00b3 | ||
|
|
36318e8a1b | ||
|
|
79562a2531 | ||
|
|
d2664ab2a6 | ||
|
|
e664a429a1 | ||
|
|
b09bd1ed34 | ||
|
|
f83c80aaec | ||
|
|
bbc8adca94 | ||
|
|
20c71d127b | ||
|
|
e35df904a0 | ||
|
|
62682a8c4c | ||
|
|
253c02cc3c | ||
|
|
175d1cc8f2 | ||
|
|
23c9122458 | ||
|
|
b42d2886a2 | ||
|
|
c3f90ba347 | ||
|
|
c6eba8c0a1 | ||
|
|
51bdb4cbea | ||
|
|
376b2d0297 | ||
|
|
7e03624408 | ||
|
|
133f223df6 | ||
|
|
8dc73fdbdb | ||
|
|
8ec3ed1830 | ||
|
|
8b71ce23bb | ||
|
|
82079e644a | ||
|
|
1e7a364c68 | ||
|
|
c74e7df6a0 | ||
|
|
29d8f8d91b | ||
|
|
0d1553562d | ||
|
|
8e3312c032 | ||
|
|
878d12da24 | ||
|
|
c1dfafcc9e | ||
|
|
6668d79519 | ||
|
|
775a3dc359 | ||
|
|
98f935b8f7 | ||
|
|
86359ef374 | ||
|
|
ef8fbaae28 | ||
|
|
9e48aeca45 | ||
|
|
9518111ed3 | ||
|
|
4fea55bac3 | ||
|
|
027dd848eb | ||
|
|
98928fc5f0 | ||
|
|
6e843ab563 | ||
|
|
b3a0d47a67 | ||
|
|
d492d29153 | ||
|
|
ed21f9f906 | ||
|
|
bdadfc958c | ||
|
|
3bbd238d7d | ||
|
|
4eecdbadd3 | ||
|
|
a33b0abbe0 | ||
|
|
3d0f457306 | ||
|
|
ca5f1c1efb | ||
|
|
e72592eac3 | ||
|
|
72e9cecb17 | ||
|
|
27e7494853 | ||
|
|
f0a8aca0e3 | ||
|
|
4514595811 | ||
|
|
e0bcbf0b79 | ||
|
|
285725eaab | ||
|
|
9a4770eb17 | ||
|
|
8a11985fce | ||
|
|
731b3654d8 | ||
|
|
da4e976d5c | ||
|
|
b74739f91b | ||
|
|
6b5c452a3c | ||
|
|
40075f69f9 | ||
|
|
7702803e5c | ||
|
|
3731f1950a | ||
|
|
9ab47cf628 | ||
|
|
676688aabf | ||
|
|
5958d8775c | ||
|
|
dfd5de9381 | ||
|
|
ac0164c4cc | ||
|
|
9e258ea466 | ||
|
|
0aacb95700 | ||
|
|
3668179dfe | ||
|
|
fa26b8d7cf | ||
|
|
07283ca0cf | ||
|
|
917dde7edf | ||
|
|
8102347296 | ||
|
|
736d8586f1 | ||
|
|
c97d4bbb50 | ||
|
|
553dcd208c | ||
|
|
e19c327279 | ||
|
|
6d0e4852cc | ||
|
|
d258523a3c | ||
|
|
dbc352f01b | ||
|
|
5e8a74ef74 | ||
|
|
3cc3671e74 | ||
|
|
d4d7c3d8b6 | ||
|
|
69083b6485 | ||
|
|
feba1f2e3c | ||
|
|
bb20251b43 | ||
|
|
1ec2e74b07 | ||
|
|
db6f6e62b9 | ||
|
|
a99743c1c8 | ||
|
|
04dd0f2b72 | ||
|
|
b4eb630fc2 | ||
|
|
8494b97e05 | ||
|
|
a98ff3c151 | ||
|
|
b16967a29f | ||
|
|
73afa73286 | ||
|
|
63ab526bfb | ||
|
|
cf92909d9a | ||
|
|
ca6a71749c | ||
|
|
79778fa221 | ||
|
|
6806b01327 | ||
|
|
6f06577f18 | ||
|
|
bc4bb0b4e5 | ||
|
|
f40aee9d2e | ||
|
|
26bf1ef621 | ||
|
|
03618fd2e0 | ||
|
|
fa3721bcde | ||
|
|
a049b38ab5 | ||
|
|
540a669dae | ||
|
|
e266504463 | ||
|
|
f07172bfe6 | ||
|
|
856845e5f2 | ||
|
|
14c0efe300 | ||
|
|
eb10001eb7 | ||
|
|
90c3d68f00 | ||
|
|
97098edfeb | ||
|
|
9f9122b6d7 | ||
|
|
8dcb3d78dc | ||
|
|
4dd77b785a | ||
|
|
7d7a29cfb9 | ||
|
|
f462744fc8 | ||
|
|
9ab97b834a | ||
|
|
7ba7b959a8 | ||
|
|
b094153af2 | ||
|
|
0ef27bfc5e | ||
|
|
a62b0924df | ||
|
|
eff736acd2 | ||
|
|
38cc0da990 | ||
|
|
37ff651723 | ||
|
|
fae7db89e6 | ||
|
|
ef21397f0d | ||
|
|
2011cbd210 | ||
|
|
ebcc5be1bf | ||
|
|
3661dd16b8 | ||
|
|
2aa5d26735 | ||
|
|
d50639971a | ||
|
|
fede1e9e3b | ||
|
|
f7777f489e | ||
|
|
93ae6084d6 | ||
|
|
3b39334bae | ||
|
|
da8ee43481 | ||
|
|
a843e81aaf |
@@ -5,6 +5,74 @@ 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.11] - 2024-08-02
|
||||
|
||||
### Added
|
||||
|
||||
- **📊 Model Information Display**: Added visuals for model selection, including images next to model names for more intuitive navigation.
|
||||
- **🗣 ElevenLabs Voice Adaptations**: Voice enhancements including support for ElevenLabs voice ID by name for personalized vocal interactions.
|
||||
- **⌨️ Arrow Keys Model Selection**: Users can now use arrow keys for quicker model selection, enhancing accessibility.
|
||||
- **🔍 Fuzzy Search in Model Selector**: Enhanced model selector with fuzzy search to locate models swiftly, including descriptions.
|
||||
- **🕹️ ComfyUI Flux Image Generation**: Added support for the new Flux image gen model; introduces environment controls like weight precision and CLIP model options in Settings.
|
||||
- **💾 Display File Size for Uploads**: Enhanced file interface now displays file size, preparing for upcoming upload restrictions.
|
||||
- **🎚️ Advanced Params "Min P"**: Added 'Min P' parameter in the advanced settings for customized model precision control.
|
||||
- **🔒 Enhanced OAuth**: Introduced custom redirect URI support for OAuth behind reverse proxies, enabling safer authentication processes.
|
||||
- **🖥 Enhanced Latex Rendering**: Adjustments made to latex rendering processes, now accurately detecting and presenting latex inputs from text.
|
||||
- **🌐 Internationalization**: Enhanced with new Romanian and updated Vietnamese and Ukrainian translations, helping broaden accessibility for international users.
|
||||
|
||||
### Fixed
|
||||
|
||||
- **🔧 Tags Handling in Document Upload**: Tags are now properly sent to the upload document handler, resolving issues with missing metadata.
|
||||
- **🖥️ Sensitive Input Fields**: Corrected browser misinterpretation of secure input fields, preventing misclassification as password fields.
|
||||
- **📂 Static Path Resolution in PDF Generation**: Fixed static paths that adjust dynamically to prevent issues across various environments.
|
||||
|
||||
### Changed
|
||||
|
||||
- **🎨 UI/UX Styling Enhancements**: Multiple minor styling updates for a cleaner and more intuitive user interface.
|
||||
- **🚧 Refactoring Various Components**: Numerous refactoring changes across styling, file handling, and function simplifications for clarity and performance.
|
||||
- **🎛️ User Valves Management**: Moved user valves from settings to direct chat controls for more user-friendly access during interactions.
|
||||
|
||||
### Removed
|
||||
|
||||
- **⚙️ Health Check Logging**: Removed verbose logging from the health checking processes to declutter logs and improve backend performance.
|
||||
|
||||
## [0.3.10] - 2024-07-17
|
||||
|
||||
### Fixed
|
||||
|
||||
- **🔄 Improved File Upload**: Addressed the issue where file uploads lacked animation.
|
||||
- **💬 Chat Continuity**: Fixed a problem where existing chats were not functioning properly in some instances.
|
||||
- **🗂️ Chat File Reset**: Resolved the issue of chat files not resetting for new conversations, now ensuring a clean slate for each chat session.
|
||||
- **📁 Document Workspace Uploads**: Corrected the handling of document uploads in the workspace using the Files API.
|
||||
|
||||
## [0.3.9] - 2024-07-17
|
||||
|
||||
### Added
|
||||
|
||||
- **📁 Files Chat Controls**: We've reverted to the old file handling behavior where uploaded files are always included. You can now manage files directly within the chat controls section, giving you the ability to remove files as needed.
|
||||
- **🔧 "Action" Function Support**: Introducing a new "Action" function to write custom buttons to the message toolbar. This feature enables more interactive messaging, with documentation coming soon.
|
||||
- **📜 Citations Handling**: For newly uploaded files in documents workspace, citations will now display the actual filename. Additionally, you can click on these filenames to open the file in a new tab for easier access.
|
||||
- **🛠️ Event Emitter and Call Updates**: Enhanced 'event_emitter' to allow message replacement and 'event_call' to support text input for Tools and Functions. Detailed documentation will be provided shortly.
|
||||
- **🎨 Styling Refactor**: Various styling updates for a cleaner and more cohesive user interface.
|
||||
- **🌐 Enhanced Translations**: Improved translations for Catalan, Ukrainian, and Brazilian Portuguese.
|
||||
|
||||
### Fixed
|
||||
|
||||
- **🔧 Chat Controls Priority**: Resolved an issue where Chat Controls values were being overridden by model information parameters. The priority is now Chat Controls, followed by Global Settings, then Model Settings.
|
||||
- **🪲 Debug Logs**: Fixed an issue where debug logs were not being logged properly.
|
||||
- **🔑 Automatic1111 Auth Key**: The auth key for Automatic1111 is no longer required.
|
||||
- **📝 Title Generation**: Ensured that the title generation runs only once, even when multiple models are in a chat.
|
||||
- **✅ Boolean Values in Params**: Added support for boolean values in parameters.
|
||||
- **🖼️ Files Overlay Styling**: Fixed the styling issue with the files overlay.
|
||||
|
||||
### Changed
|
||||
|
||||
- **⬆️ Dependency Updates**
|
||||
- Upgraded 'pydantic' from version 2.7.1 to 2.8.2.
|
||||
- Upgraded 'sqlalchemy' from version 2.0.30 to 2.0.31.
|
||||
- Upgraded 'unstructured' from version 0.14.9 to 0.14.10.
|
||||
- Upgraded 'chromadb' from version 0.5.3 to 0.5.4.
|
||||
|
||||
## [0.3.8] - 2024-07-09
|
||||
|
||||
### Added
|
||||
@@ -27,6 +95,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
### Changed
|
||||
|
||||
- **🗃️ Database Backend**: Switched from Peewee to SQLAlchemy for improved concurrency support, enhancing database performance.
|
||||
- **⬆️ ChromaDB Update**: Upgraded to version 0.5.3. Ensure your remote ChromaDB instance matches this version.
|
||||
- **🔤 Primary Font Styling**: Updated primary font to Archivo for better visual consistency.
|
||||
- **🔄 Font Change for Windows**: Replaced Arimo with Inter font for Windows users, improving readability.
|
||||
- **🚀 Lazy Loading**: Implemented lazy loading for 'faster_whisper' and 'sentence_transformers' to reduce startup memory usage.
|
||||
|
||||
+5
-3
@@ -97,6 +97,7 @@ RUN if [ "$USE_OLLAMA" = "true" ]; then \
|
||||
apt-get update && \
|
||||
# Install pandoc and netcat
|
||||
apt-get install -y --no-install-recommends pandoc netcat-openbsd curl && \
|
||||
apt-get install -y --no-install-recommends gcc python3-dev && \
|
||||
# for RAG OCR
|
||||
apt-get install -y --no-install-recommends ffmpeg libsm6 libxext6 && \
|
||||
# install helper tools
|
||||
@@ -107,8 +108,9 @@ RUN if [ "$USE_OLLAMA" = "true" ]; then \
|
||||
rm -rf /var/lib/apt/lists/*; \
|
||||
else \
|
||||
apt-get update && \
|
||||
# Install pandoc and netcat
|
||||
apt-get install -y --no-install-recommends pandoc netcat-openbsd curl jq && \
|
||||
# Install pandoc, netcat and gcc
|
||||
apt-get install -y --no-install-recommends pandoc gcc netcat-openbsd curl jq && \
|
||||
apt-get install -y --no-install-recommends gcc python3-dev && \
|
||||
# for RAG OCR
|
||||
apt-get install -y --no-install-recommends ffmpeg libsm6 libxext6 && \
|
||||
# cleanup
|
||||
@@ -149,7 +151,7 @@ COPY --chown=$UID:$GID ./backend .
|
||||
|
||||
EXPOSE 8080
|
||||
|
||||
HEALTHCHECK CMD curl --silent --fail http://localhost:8080/health | jq -e '.status == true' || exit 1
|
||||
HEALTHCHECK CMD curl --silent --fail http://localhost:${PORT:-8080}/health | jq -ne 'input.status == true' || exit 1
|
||||
|
||||
USER $UID:$GID
|
||||
|
||||
|
||||
+171
-42
@@ -10,12 +10,12 @@ from fastapi import (
|
||||
File,
|
||||
Form,
|
||||
)
|
||||
|
||||
from fastapi.responses import StreamingResponse, JSONResponse, FileResponse
|
||||
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from pydantic import BaseModel
|
||||
|
||||
from typing import List
|
||||
import uuid
|
||||
import requests
|
||||
import hashlib
|
||||
@@ -31,6 +31,7 @@ from utils.utils import (
|
||||
)
|
||||
from utils.misc import calculate_sha256
|
||||
|
||||
|
||||
from config import (
|
||||
SRC_LOG_LEVELS,
|
||||
CACHE_DIR,
|
||||
@@ -43,6 +44,7 @@ from config import (
|
||||
AUDIO_STT_OPENAI_API_KEY,
|
||||
AUDIO_TTS_OPENAI_API_BASE_URL,
|
||||
AUDIO_TTS_OPENAI_API_KEY,
|
||||
AUDIO_TTS_API_KEY,
|
||||
AUDIO_STT_ENGINE,
|
||||
AUDIO_STT_MODEL,
|
||||
AUDIO_TTS_ENGINE,
|
||||
@@ -75,6 +77,7 @@ app.state.config.TTS_OPENAI_API_KEY = AUDIO_TTS_OPENAI_API_KEY
|
||||
app.state.config.TTS_ENGINE = AUDIO_TTS_ENGINE
|
||||
app.state.config.TTS_MODEL = AUDIO_TTS_MODEL
|
||||
app.state.config.TTS_VOICE = AUDIO_TTS_VOICE
|
||||
app.state.config.TTS_API_KEY = AUDIO_TTS_API_KEY
|
||||
|
||||
# setting device type for whisper model
|
||||
whisper_device_type = DEVICE_TYPE if DEVICE_TYPE and DEVICE_TYPE == "cuda" else "cpu"
|
||||
@@ -87,6 +90,7 @@ SPEECH_CACHE_DIR.mkdir(parents=True, exist_ok=True)
|
||||
class TTSConfigForm(BaseModel):
|
||||
OPENAI_API_BASE_URL: str
|
||||
OPENAI_API_KEY: str
|
||||
API_KEY: str
|
||||
ENGINE: str
|
||||
MODEL: str
|
||||
VOICE: str
|
||||
@@ -137,6 +141,7 @@ async def get_audio_config(user=Depends(get_admin_user)):
|
||||
"tts": {
|
||||
"OPENAI_API_BASE_URL": app.state.config.TTS_OPENAI_API_BASE_URL,
|
||||
"OPENAI_API_KEY": app.state.config.TTS_OPENAI_API_KEY,
|
||||
"API_KEY": app.state.config.TTS_API_KEY,
|
||||
"ENGINE": app.state.config.TTS_ENGINE,
|
||||
"MODEL": app.state.config.TTS_MODEL,
|
||||
"VOICE": app.state.config.TTS_VOICE,
|
||||
@@ -156,6 +161,7 @@ async def update_audio_config(
|
||||
):
|
||||
app.state.config.TTS_OPENAI_API_BASE_URL = form_data.tts.OPENAI_API_BASE_URL
|
||||
app.state.config.TTS_OPENAI_API_KEY = form_data.tts.OPENAI_API_KEY
|
||||
app.state.config.TTS_API_KEY = form_data.tts.API_KEY
|
||||
app.state.config.TTS_ENGINE = form_data.tts.ENGINE
|
||||
app.state.config.TTS_MODEL = form_data.tts.MODEL
|
||||
app.state.config.TTS_VOICE = form_data.tts.VOICE
|
||||
@@ -169,6 +175,7 @@ async def update_audio_config(
|
||||
"tts": {
|
||||
"OPENAI_API_BASE_URL": app.state.config.TTS_OPENAI_API_BASE_URL,
|
||||
"OPENAI_API_KEY": app.state.config.TTS_OPENAI_API_KEY,
|
||||
"API_KEY": app.state.config.TTS_API_KEY,
|
||||
"ENGINE": app.state.config.TTS_ENGINE,
|
||||
"MODEL": app.state.config.TTS_MODEL,
|
||||
"VOICE": app.state.config.TTS_VOICE,
|
||||
@@ -194,55 +201,111 @@ async def speech(request: Request, user=Depends(get_verified_user)):
|
||||
if file_path.is_file():
|
||||
return FileResponse(file_path)
|
||||
|
||||
headers = {}
|
||||
headers["Authorization"] = f"Bearer {app.state.config.TTS_OPENAI_API_KEY}"
|
||||
headers["Content-Type"] = "application/json"
|
||||
if app.state.config.TTS_ENGINE == "openai":
|
||||
headers = {}
|
||||
headers["Authorization"] = f"Bearer {app.state.config.TTS_OPENAI_API_KEY}"
|
||||
headers["Content-Type"] = "application/json"
|
||||
|
||||
try:
|
||||
body = body.decode("utf-8")
|
||||
body = json.loads(body)
|
||||
body["model"] = app.state.config.TTS_MODEL
|
||||
body = json.dumps(body).encode("utf-8")
|
||||
except Exception as e:
|
||||
pass
|
||||
try:
|
||||
body = body.decode("utf-8")
|
||||
body = json.loads(body)
|
||||
body["model"] = app.state.config.TTS_MODEL
|
||||
body = json.dumps(body).encode("utf-8")
|
||||
except Exception as e:
|
||||
pass
|
||||
|
||||
r = None
|
||||
try:
|
||||
r = requests.post(
|
||||
url=f"{app.state.config.TTS_OPENAI_API_BASE_URL}/audio/speech",
|
||||
data=body,
|
||||
headers=headers,
|
||||
stream=True,
|
||||
)
|
||||
r = None
|
||||
try:
|
||||
r = requests.post(
|
||||
url=f"{app.state.config.TTS_OPENAI_API_BASE_URL}/audio/speech",
|
||||
data=body,
|
||||
headers=headers,
|
||||
stream=True,
|
||||
)
|
||||
|
||||
r.raise_for_status()
|
||||
r.raise_for_status()
|
||||
|
||||
# Save the streaming content to a file
|
||||
with open(file_path, "wb") as f:
|
||||
for chunk in r.iter_content(chunk_size=8192):
|
||||
f.write(chunk)
|
||||
# Save the streaming content to a file
|
||||
with open(file_path, "wb") as f:
|
||||
for chunk in r.iter_content(chunk_size=8192):
|
||||
f.write(chunk)
|
||||
|
||||
with open(file_body_path, "w") as f:
|
||||
json.dump(json.loads(body.decode("utf-8")), f)
|
||||
with open(file_body_path, "w") as f:
|
||||
json.dump(json.loads(body.decode("utf-8")), f)
|
||||
|
||||
# Return the saved file
|
||||
return FileResponse(file_path)
|
||||
# Return the saved file
|
||||
return FileResponse(file_path)
|
||||
|
||||
except Exception as e:
|
||||
log.exception(e)
|
||||
error_detail = "Open WebUI: Server Connection Error"
|
||||
if r is not None:
|
||||
try:
|
||||
res = r.json()
|
||||
if "error" in res:
|
||||
error_detail = f"External: {res['error']['message']}"
|
||||
except:
|
||||
error_detail = f"External: {e}"
|
||||
except Exception as e:
|
||||
log.exception(e)
|
||||
error_detail = "Open WebUI: Server Connection Error"
|
||||
if r is not None:
|
||||
try:
|
||||
res = r.json()
|
||||
if "error" in res:
|
||||
error_detail = f"External: {res['error']['message']}"
|
||||
except:
|
||||
error_detail = f"External: {e}"
|
||||
|
||||
raise HTTPException(
|
||||
status_code=r.status_code if r != None else 500,
|
||||
detail=error_detail,
|
||||
)
|
||||
raise HTTPException(
|
||||
status_code=r.status_code if r != None else 500,
|
||||
detail=error_detail,
|
||||
)
|
||||
|
||||
elif app.state.config.TTS_ENGINE == "elevenlabs":
|
||||
payload = None
|
||||
try:
|
||||
payload = json.loads(body.decode("utf-8"))
|
||||
except Exception as e:
|
||||
log.exception(e)
|
||||
raise HTTPException(status_code=400, detail="Invalid JSON payload")
|
||||
|
||||
voice_id = payload.get("voice", "")
|
||||
url = f"https://api.elevenlabs.io/v1/text-to-speech/{voice_id}"
|
||||
|
||||
headers = {
|
||||
"Accept": "audio/mpeg",
|
||||
"Content-Type": "application/json",
|
||||
"xi-api-key": app.state.config.TTS_API_KEY,
|
||||
}
|
||||
|
||||
data = {
|
||||
"text": payload["input"],
|
||||
"model_id": app.state.config.TTS_MODEL,
|
||||
"voice_settings": {"stability": 0.5, "similarity_boost": 0.5},
|
||||
}
|
||||
|
||||
try:
|
||||
r = requests.post(url, json=data, headers=headers)
|
||||
|
||||
r.raise_for_status()
|
||||
|
||||
# Save the streaming content to a file
|
||||
with open(file_path, "wb") as f:
|
||||
for chunk in r.iter_content(chunk_size=8192):
|
||||
f.write(chunk)
|
||||
|
||||
with open(file_body_path, "w") as f:
|
||||
json.dump(json.loads(body.decode("utf-8")), f)
|
||||
|
||||
# Return the saved file
|
||||
return FileResponse(file_path)
|
||||
|
||||
except Exception as e:
|
||||
log.exception(e)
|
||||
error_detail = "Open WebUI: Server Connection Error"
|
||||
if r is not None:
|
||||
try:
|
||||
res = r.json()
|
||||
if "error" in res:
|
||||
error_detail = f"External: {res['error']['message']}"
|
||||
except:
|
||||
error_detail = f"External: {e}"
|
||||
|
||||
raise HTTPException(
|
||||
status_code=r.status_code if r != None else 500,
|
||||
detail=error_detail,
|
||||
)
|
||||
|
||||
|
||||
@app.post("/transcriptions")
|
||||
@@ -373,3 +436,69 @@ def transcribe(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail=ERROR_MESSAGES.DEFAULT(e),
|
||||
)
|
||||
|
||||
|
||||
def get_available_models() -> List[dict]:
|
||||
if app.state.config.TTS_ENGINE == "openai":
|
||||
return [{"id": "tts-1"}, {"id": "tts-1-hd"}]
|
||||
elif app.state.config.TTS_ENGINE == "elevenlabs":
|
||||
headers = {
|
||||
"xi-api-key": app.state.config.TTS_API_KEY,
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
|
||||
try:
|
||||
response = requests.get(
|
||||
"https://api.elevenlabs.io/v1/models", headers=headers
|
||||
)
|
||||
response.raise_for_status()
|
||||
models = response.json()
|
||||
return [
|
||||
{"name": model["name"], "id": model["model_id"]} for model in models
|
||||
]
|
||||
except requests.RequestException as e:
|
||||
log.error(f"Error fetching voices: {str(e)}")
|
||||
return []
|
||||
|
||||
|
||||
@app.get("/models")
|
||||
async def get_models(user=Depends(get_verified_user)):
|
||||
return {"models": get_available_models()}
|
||||
|
||||
|
||||
def get_available_voices() -> List[dict]:
|
||||
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"},
|
||||
]
|
||||
elif app.state.config.TTS_ENGINE == "elevenlabs":
|
||||
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
|
||||
)
|
||||
response.raise_for_status()
|
||||
voices_data = response.json()
|
||||
|
||||
voices = []
|
||||
for voice in voices_data.get("voices", []):
|
||||
voices.append({"name": voice["name"], "id": voice["voice_id"]})
|
||||
return voices
|
||||
except requests.RequestException as e:
|
||||
log.error(f"Error fetching voices: {str(e)}")
|
||||
|
||||
return []
|
||||
|
||||
|
||||
@app.get("/voices")
|
||||
async def get_voices(user=Depends(get_verified_user)):
|
||||
return {"voices": get_available_voices()}
|
||||
|
||||
@@ -42,6 +42,9 @@ from config import (
|
||||
COMFYUI_SAMPLER,
|
||||
COMFYUI_SCHEDULER,
|
||||
COMFYUI_SD3,
|
||||
COMFYUI_FLUX,
|
||||
COMFYUI_FLUX_WEIGHT_DTYPE,
|
||||
COMFYUI_FLUX_FP8_CLIP,
|
||||
IMAGES_OPENAI_API_BASE_URL,
|
||||
IMAGES_OPENAI_API_KEY,
|
||||
IMAGE_GENERATION_MODEL,
|
||||
@@ -85,6 +88,9 @@ 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
|
||||
|
||||
|
||||
def get_automatic1111_api_auth():
|
||||
@@ -421,7 +427,7 @@ def save_url_image(url):
|
||||
|
||||
|
||||
@app.post("/generations")
|
||||
def generate_image(
|
||||
async def image_generations(
|
||||
form_data: GenerateImageForm,
|
||||
user=Depends(get_verified_user),
|
||||
):
|
||||
@@ -497,6 +503,15 @@ def generate_image(
|
||||
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)
|
||||
|
||||
res = comfyui_generate_image(
|
||||
|
||||
@@ -125,6 +125,135 @@ COMFYUI_DEFAULT_PROMPT = """
|
||||
}
|
||||
"""
|
||||
|
||||
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.sft"
|
||||
},
|
||||
"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.sft",
|
||||
"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")
|
||||
@@ -194,6 +323,9 @@ class ImageGenerationPayload(BaseModel):
|
||||
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
|
||||
|
||||
|
||||
def comfyui_generate_image(
|
||||
@@ -215,21 +347,46 @@ def comfyui_generate_image(
|
||||
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)
|
||||
)
|
||||
|
||||
# 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
|
||||
comfyui_prompt["7"]["inputs"]["text"] = payload.negative_prompt
|
||||
|
||||
if payload.steps:
|
||||
comfyui_prompt["3"]["inputs"]["steps"] = payload.steps
|
||||
|
||||
comfyui_prompt["3"]["inputs"]["seed"] = (
|
||||
payload.seed if payload.seed else random.randint(0, 18446744073709551614)
|
||||
)
|
||||
|
||||
try:
|
||||
ws = websocket.WebSocket()
|
||||
|
||||
+86
-26
@@ -728,8 +728,10 @@ async def generate_chat_completion(
|
||||
)
|
||||
|
||||
payload = {
|
||||
**form_data.model_dump(exclude_none=True),
|
||||
**form_data.model_dump(exclude_none=True, exclude=["metadata"]),
|
||||
}
|
||||
if "metadata" in payload:
|
||||
del payload["metadata"]
|
||||
|
||||
model_id = form_data.model
|
||||
model_info = Models.get_model_by_id(model_id)
|
||||
@@ -741,52 +743,85 @@ async def generate_chat_completion(
|
||||
model_info.params = model_info.params.model_dump()
|
||||
|
||||
if model_info.params:
|
||||
payload["options"] = {}
|
||||
if payload.get("options") is None:
|
||||
payload["options"] = {}
|
||||
|
||||
if model_info.params.get("mirostat", None):
|
||||
if (
|
||||
model_info.params.get("mirostat", None)
|
||||
and payload["options"].get("mirostat") is None
|
||||
):
|
||||
payload["options"]["mirostat"] = model_info.params.get("mirostat", None)
|
||||
|
||||
if model_info.params.get("mirostat_eta", None):
|
||||
if (
|
||||
model_info.params.get("mirostat_eta", None)
|
||||
and payload["options"].get("mirostat_eta") is None
|
||||
):
|
||||
payload["options"]["mirostat_eta"] = model_info.params.get(
|
||||
"mirostat_eta", None
|
||||
)
|
||||
|
||||
if model_info.params.get("mirostat_tau", None):
|
||||
|
||||
if (
|
||||
model_info.params.get("mirostat_tau", None)
|
||||
and payload["options"].get("mirostat_tau") is None
|
||||
):
|
||||
payload["options"]["mirostat_tau"] = model_info.params.get(
|
||||
"mirostat_tau", None
|
||||
)
|
||||
|
||||
if model_info.params.get("num_ctx", None):
|
||||
if (
|
||||
model_info.params.get("num_ctx", None)
|
||||
and payload["options"].get("num_ctx") is None
|
||||
):
|
||||
payload["options"]["num_ctx"] = model_info.params.get("num_ctx", None)
|
||||
|
||||
if model_info.params.get("num_batch", None):
|
||||
if (
|
||||
model_info.params.get("num_batch", None)
|
||||
and payload["options"].get("num_batch") is None
|
||||
):
|
||||
payload["options"]["num_batch"] = model_info.params.get(
|
||||
"num_batch", None
|
||||
)
|
||||
|
||||
if model_info.params.get("num_keep", None):
|
||||
if (
|
||||
model_info.params.get("num_keep", None)
|
||||
and payload["options"].get("num_keep") is None
|
||||
):
|
||||
payload["options"]["num_keep"] = model_info.params.get("num_keep", None)
|
||||
|
||||
if model_info.params.get("repeat_last_n", None):
|
||||
if (
|
||||
model_info.params.get("repeat_last_n", None)
|
||||
and payload["options"].get("repeat_last_n") is None
|
||||
):
|
||||
payload["options"]["repeat_last_n"] = model_info.params.get(
|
||||
"repeat_last_n", None
|
||||
)
|
||||
|
||||
if model_info.params.get("frequency_penalty", None):
|
||||
if (
|
||||
model_info.params.get("frequency_penalty", None)
|
||||
and payload["options"].get("frequency_penalty") is None
|
||||
):
|
||||
payload["options"]["repeat_penalty"] = model_info.params.get(
|
||||
"frequency_penalty", None
|
||||
)
|
||||
|
||||
if model_info.params.get("temperature", None) is not None:
|
||||
if (
|
||||
model_info.params.get("temperature", None) is not None
|
||||
and payload["options"].get("temperature") is None
|
||||
):
|
||||
payload["options"]["temperature"] = model_info.params.get(
|
||||
"temperature", None
|
||||
)
|
||||
|
||||
if model_info.params.get("seed", None):
|
||||
if (
|
||||
model_info.params.get("seed", None) is not None
|
||||
and payload["options"].get("seed") is None
|
||||
):
|
||||
payload["options"]["seed"] = model_info.params.get("seed", None)
|
||||
|
||||
if model_info.params.get("stop", None):
|
||||
if (
|
||||
model_info.params.get("stop", None)
|
||||
and payload["options"].get("stop") is None
|
||||
):
|
||||
payload["options"]["stop"] = (
|
||||
[
|
||||
bytes(stop, "utf-8").decode("unicode_escape")
|
||||
@@ -796,37 +831,62 @@ async def generate_chat_completion(
|
||||
else None
|
||||
)
|
||||
|
||||
if model_info.params.get("tfs_z", None):
|
||||
if (
|
||||
model_info.params.get("tfs_z", None)
|
||||
and payload["options"].get("tfs_z") is None
|
||||
):
|
||||
payload["options"]["tfs_z"] = model_info.params.get("tfs_z", None)
|
||||
|
||||
if model_info.params.get("max_tokens", None):
|
||||
if (
|
||||
model_info.params.get("max_tokens", None)
|
||||
and payload["options"].get("max_tokens") is None
|
||||
):
|
||||
payload["options"]["num_predict"] = model_info.params.get(
|
||||
"max_tokens", None
|
||||
)
|
||||
|
||||
if model_info.params.get("top_k", None):
|
||||
if (
|
||||
model_info.params.get("top_k", None)
|
||||
and payload["options"].get("top_k") is None
|
||||
):
|
||||
payload["options"]["top_k"] = model_info.params.get("top_k", None)
|
||||
|
||||
if model_info.params.get("top_p", None):
|
||||
if (
|
||||
model_info.params.get("top_p", None)
|
||||
and payload["options"].get("top_p") is None
|
||||
):
|
||||
payload["options"]["top_p"] = model_info.params.get("top_p", None)
|
||||
|
||||
if model_info.params.get("use_mmap", None):
|
||||
if (
|
||||
model_info.params.get("min_p", None)
|
||||
and payload["options"].get("min_p") is None
|
||||
):
|
||||
payload["options"]["min_p"] = model_info.params.get("min_p", None)
|
||||
|
||||
if (
|
||||
model_info.params.get("use_mmap", None)
|
||||
and payload["options"].get("use_mmap") is None
|
||||
):
|
||||
payload["options"]["use_mmap"] = model_info.params.get("use_mmap", None)
|
||||
|
||||
if model_info.params.get("use_mlock", None):
|
||||
if (
|
||||
model_info.params.get("use_mlock", None)
|
||||
and payload["options"].get("use_mlock") is None
|
||||
):
|
||||
payload["options"]["use_mlock"] = model_info.params.get(
|
||||
"use_mlock", None
|
||||
)
|
||||
|
||||
if model_info.params.get("num_thread", None):
|
||||
if (
|
||||
model_info.params.get("num_thread", None)
|
||||
and payload["options"].get("num_thread") is None
|
||||
):
|
||||
payload["options"]["num_thread"] = model_info.params.get(
|
||||
"num_thread", None
|
||||
)
|
||||
|
||||
system = model_info.params.get("system", None)
|
||||
if system:
|
||||
# Check if the payload already has a system message
|
||||
# If not, add a system message to the payload
|
||||
system = prompt_template(
|
||||
system,
|
||||
**(
|
||||
@@ -893,10 +953,10 @@ async def generate_openai_chat_completion(
|
||||
user=Depends(get_verified_user),
|
||||
):
|
||||
form_data = OpenAIChatCompletionForm(**form_data)
|
||||
payload = {**form_data.model_dump(exclude_none=True, exclude=["metadata"])}
|
||||
|
||||
payload = {
|
||||
**form_data.model_dump(exclude_none=True),
|
||||
}
|
||||
if "metadata" in payload:
|
||||
del payload["metadata"]
|
||||
|
||||
model_id = form_data.model
|
||||
model_info = Models.get_model_by_id(model_id)
|
||||
|
||||
+27
-20
@@ -21,6 +21,7 @@ from utils.utils import (
|
||||
get_admin_user,
|
||||
)
|
||||
from utils.task import prompt_template
|
||||
from utils.misc import add_or_update_system_message
|
||||
|
||||
from config import (
|
||||
SRC_LOG_LEVELS,
|
||||
@@ -357,6 +358,8 @@ async def generate_chat_completion(
|
||||
):
|
||||
idx = 0
|
||||
payload = {**form_data}
|
||||
if "metadata" in payload:
|
||||
del payload["metadata"]
|
||||
|
||||
model_id = form_data.get("model")
|
||||
model_info = Models.get_model_by_id(model_id)
|
||||
@@ -368,24 +371,36 @@ async def generate_chat_completion(
|
||||
model_info.params = model_info.params.model_dump()
|
||||
|
||||
if model_info.params:
|
||||
if model_info.params.get("temperature", None) is not None:
|
||||
if (
|
||||
model_info.params.get("temperature", None) is not None
|
||||
and payload.get("temperature") is None
|
||||
):
|
||||
payload["temperature"] = float(model_info.params.get("temperature"))
|
||||
|
||||
if model_info.params.get("top_p", None):
|
||||
if model_info.params.get("top_p", None) and payload.get("top_p") is None:
|
||||
payload["top_p"] = int(model_info.params.get("top_p", None))
|
||||
|
||||
if model_info.params.get("max_tokens", None):
|
||||
if (
|
||||
model_info.params.get("max_tokens", None)
|
||||
and payload.get("max_tokens") is None
|
||||
):
|
||||
payload["max_tokens"] = int(model_info.params.get("max_tokens", None))
|
||||
|
||||
if model_info.params.get("frequency_penalty", None):
|
||||
if (
|
||||
model_info.params.get("frequency_penalty", None)
|
||||
and payload.get("frequency_penalty") is None
|
||||
):
|
||||
payload["frequency_penalty"] = int(
|
||||
model_info.params.get("frequency_penalty", None)
|
||||
)
|
||||
|
||||
if model_info.params.get("seed", None):
|
||||
if (
|
||||
model_info.params.get("seed", None) is not None
|
||||
and payload.get("seed") is None
|
||||
):
|
||||
payload["seed"] = model_info.params.get("seed", None)
|
||||
|
||||
if model_info.params.get("stop", None):
|
||||
if model_info.params.get("stop", None) and payload.get("stop") is None:
|
||||
payload["stop"] = (
|
||||
[
|
||||
bytes(stop, "utf-8").decode("unicode_escape")
|
||||
@@ -410,21 +425,10 @@ async def generate_chat_completion(
|
||||
else {}
|
||||
),
|
||||
)
|
||||
# Check if the payload already has a system message
|
||||
# If not, add a system message to the payload
|
||||
if payload.get("messages"):
|
||||
for message in payload["messages"]:
|
||||
if message.get("role") == "system":
|
||||
message["content"] = system + message["content"]
|
||||
break
|
||||
else:
|
||||
payload["messages"].insert(
|
||||
0,
|
||||
{
|
||||
"role": "system",
|
||||
"content": system,
|
||||
},
|
||||
)
|
||||
payload["messages"] = add_or_update_system_message(
|
||||
system, payload["messages"]
|
||||
)
|
||||
|
||||
else:
|
||||
pass
|
||||
@@ -458,6 +462,9 @@ async def generate_chat_completion(
|
||||
headers = {}
|
||||
headers["Authorization"] = f"Bearer {key}"
|
||||
headers["Content-Type"] = "application/json"
|
||||
if "openrouter.ai" in app.state.config.OPENAI_API_BASE_URLS[idx]:
|
||||
headers["HTTP-Referer"] = "https://openwebui.com/"
|
||||
headers["X-Title"] = "Open WebUI"
|
||||
|
||||
r = None
|
||||
session = None
|
||||
|
||||
@@ -930,7 +930,9 @@ def store_web_search(form_data: SearchForm, user=Depends(get_verified_user)):
|
||||
)
|
||||
|
||||
|
||||
def store_data_in_vector_db(data, collection_name, overwrite: bool = False) -> bool:
|
||||
def store_data_in_vector_db(
|
||||
data, collection_name, metadata: Optional[dict] = None, overwrite: bool = False
|
||||
) -> bool:
|
||||
|
||||
text_splitter = RecursiveCharacterTextSplitter(
|
||||
chunk_size=app.state.config.CHUNK_SIZE,
|
||||
@@ -942,7 +944,7 @@ def store_data_in_vector_db(data, collection_name, overwrite: bool = False) -> b
|
||||
|
||||
if len(docs) > 0:
|
||||
log.info(f"store_data_in_vector_db {docs}")
|
||||
return store_docs_in_vector_db(docs, collection_name, overwrite), None
|
||||
return store_docs_in_vector_db(docs, collection_name, metadata, overwrite), None
|
||||
else:
|
||||
raise ValueError(ERROR_MESSAGES.EMPTY_CONTENT)
|
||||
|
||||
@@ -956,14 +958,16 @@ def store_text_in_vector_db(
|
||||
add_start_index=True,
|
||||
)
|
||||
docs = text_splitter.create_documents([text], metadatas=[metadata])
|
||||
return store_docs_in_vector_db(docs, collection_name, overwrite)
|
||||
return store_docs_in_vector_db(docs, collection_name, overwrite=overwrite)
|
||||
|
||||
|
||||
def store_docs_in_vector_db(docs, collection_name, overwrite: bool = False) -> bool:
|
||||
def store_docs_in_vector_db(
|
||||
docs, collection_name, metadata: Optional[dict] = None, overwrite: bool = False
|
||||
) -> bool:
|
||||
log.info(f"store_docs_in_vector_db {docs} {collection_name}")
|
||||
|
||||
texts = [doc.page_content for doc in docs]
|
||||
metadatas = [doc.metadata for doc in docs]
|
||||
metadatas = [{**doc.metadata, **(metadata if metadata else {})} for doc in docs]
|
||||
|
||||
# ChromaDB does not like datetime formats
|
||||
# for meta-data so convert them to string.
|
||||
@@ -1095,6 +1099,13 @@ def get_loader(filename: str, file_content_type: str, file_path: str):
|
||||
"vue",
|
||||
"svelte",
|
||||
"msg",
|
||||
"ex",
|
||||
"exs",
|
||||
"erl",
|
||||
"tsx",
|
||||
"jsx",
|
||||
"hs",
|
||||
"lhs",
|
||||
]
|
||||
|
||||
if (
|
||||
@@ -1237,13 +1248,21 @@ def process_doc(
|
||||
data = loader.load()
|
||||
|
||||
try:
|
||||
result = store_data_in_vector_db(data, collection_name)
|
||||
result = store_data_in_vector_db(
|
||||
data,
|
||||
collection_name,
|
||||
{
|
||||
"file_id": form_data.file_id,
|
||||
"name": file.meta.get("name", file.filename),
|
||||
},
|
||||
)
|
||||
|
||||
if result:
|
||||
return {
|
||||
"status": True,
|
||||
"collection_name": collection_name,
|
||||
"known_type": known_type,
|
||||
"filename": file.meta.get("name", file.filename),
|
||||
}
|
||||
except Exception as e:
|
||||
raise HTTPException(
|
||||
|
||||
@@ -52,7 +52,6 @@ async def user_join(sid, data):
|
||||
user = Users.get_user_by_id(data["id"])
|
||||
|
||||
if user:
|
||||
|
||||
SESSION_POOL[sid] = user.id
|
||||
if user.id in USER_POOL:
|
||||
USER_POOL[user.id].append(sid)
|
||||
@@ -80,7 +79,6 @@ def get_models_in_use():
|
||||
|
||||
@sio.on("usage")
|
||||
async def usage(sid, data):
|
||||
|
||||
model_id = data["model"]
|
||||
|
||||
# Cancel previous callback if there is one
|
||||
@@ -137,3 +135,34 @@ async def disconnect(sid):
|
||||
await sio.emit("user-count", {"count": len(USER_POOL)})
|
||||
else:
|
||||
print(f"Unknown session ID {sid} disconnected")
|
||||
|
||||
|
||||
def get_event_emitter(request_info):
|
||||
async def __event_emitter__(event_data):
|
||||
await sio.emit(
|
||||
"chat-events",
|
||||
{
|
||||
"chat_id": request_info["chat_id"],
|
||||
"message_id": request_info["message_id"],
|
||||
"data": event_data,
|
||||
},
|
||||
to=request_info["session_id"],
|
||||
)
|
||||
|
||||
return __event_emitter__
|
||||
|
||||
|
||||
def get_event_call(request_info):
|
||||
async def __event_call__(event_data):
|
||||
response = await sio.call(
|
||||
"chat-events",
|
||||
{
|
||||
"chat_id": request_info["chat_id"],
|
||||
"message_id": request_info["message_id"],
|
||||
"data": event_data,
|
||||
},
|
||||
to=request_info["session_id"],
|
||||
)
|
||||
return response
|
||||
|
||||
return __event_call__
|
||||
|
||||
+244
-258
@@ -1,9 +1,6 @@
|
||||
from fastapi import FastAPI, Depends
|
||||
from fastapi.routing import APIRoute
|
||||
from fastapi import FastAPI
|
||||
from fastapi.responses import StreamingResponse
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from starlette.middleware.sessions import SessionMiddleware
|
||||
from sqlalchemy.orm import Session
|
||||
from apps.webui.routers import (
|
||||
auths,
|
||||
users,
|
||||
@@ -20,15 +17,17 @@ from apps.webui.routers import (
|
||||
)
|
||||
from apps.webui.models.functions import Functions
|
||||
from apps.webui.models.models import Models
|
||||
|
||||
from apps.webui.utils import load_function_module_by_id
|
||||
|
||||
from utils.misc import stream_message_template
|
||||
from utils.misc import (
|
||||
openai_chat_chunk_message_template,
|
||||
openai_chat_completion_message_template,
|
||||
add_or_update_system_message,
|
||||
)
|
||||
from utils.task import prompt_template
|
||||
|
||||
|
||||
from config import (
|
||||
WEBUI_BUILD_HASH,
|
||||
SHOW_ADMIN_DETAILS,
|
||||
ADMIN_EMAIL,
|
||||
WEBUI_AUTH,
|
||||
@@ -36,6 +35,7 @@ from config import (
|
||||
DEFAULT_PROMPT_SUGGESTIONS,
|
||||
DEFAULT_USER_ROLE,
|
||||
ENABLE_SIGNUP,
|
||||
ENABLE_LOGIN_FORM,
|
||||
USER_PERMISSIONS,
|
||||
WEBHOOK_URL,
|
||||
WEBUI_AUTH_TRUSTED_EMAIL_HEADER,
|
||||
@@ -48,12 +48,12 @@ from config import (
|
||||
OAUTH_PICTURE_CLAIM,
|
||||
)
|
||||
|
||||
from apps.socket.main import get_event_call, get_event_emitter
|
||||
|
||||
import inspect
|
||||
import uuid
|
||||
import time
|
||||
import json
|
||||
|
||||
from typing import Iterator, Generator
|
||||
from typing import Iterator, Generator, AsyncGenerator
|
||||
from pydantic import BaseModel
|
||||
|
||||
app = FastAPI()
|
||||
@@ -63,6 +63,7 @@ origins = ["*"]
|
||||
app.state.config = AppConfig()
|
||||
|
||||
app.state.config.ENABLE_SIGNUP = ENABLE_SIGNUP
|
||||
app.state.config.ENABLE_LOGIN_FORM = ENABLE_LOGIN_FORM
|
||||
app.state.config.JWT_EXPIRES_IN = JWT_EXPIRES_IN
|
||||
app.state.AUTH_TRUSTED_EMAIL_HEADER = WEBUI_AUTH_TRUSTED_EMAIL_HEADER
|
||||
app.state.AUTH_TRUSTED_NAME_HEADER = WEBUI_AUTH_TRUSTED_NAME_HEADER
|
||||
@@ -124,57 +125,63 @@ async def get_status():
|
||||
}
|
||||
|
||||
|
||||
def get_function_module(pipe_id: str):
|
||||
# Check if function is already loaded
|
||||
if pipe_id not in app.state.FUNCTIONS:
|
||||
function_module, _, _ = load_function_module_by_id(pipe_id)
|
||||
app.state.FUNCTIONS[pipe_id] = function_module
|
||||
else:
|
||||
function_module = app.state.FUNCTIONS[pipe_id]
|
||||
|
||||
if hasattr(function_module, "valves") and hasattr(function_module, "Valves"):
|
||||
valves = Functions.get_function_valves_by_id(pipe_id)
|
||||
function_module.valves = function_module.Valves(**(valves if valves else {}))
|
||||
return function_module
|
||||
|
||||
|
||||
async def get_pipe_models():
|
||||
pipes = Functions.get_functions_by_type("pipe", active_only=True)
|
||||
pipe_models = []
|
||||
|
||||
for pipe in pipes:
|
||||
# Check if function is already loaded
|
||||
if pipe.id not in app.state.FUNCTIONS:
|
||||
function_module, function_type, frontmatter = load_function_module_by_id(
|
||||
pipe.id
|
||||
)
|
||||
app.state.FUNCTIONS[pipe.id] = function_module
|
||||
else:
|
||||
function_module = app.state.FUNCTIONS[pipe.id]
|
||||
|
||||
if hasattr(function_module, "valves") and hasattr(function_module, "Valves"):
|
||||
valves = Functions.get_function_valves_by_id(pipe.id)
|
||||
function_module.valves = function_module.Valves(
|
||||
**(valves if valves else {})
|
||||
)
|
||||
function_module = get_function_module(pipe.id)
|
||||
|
||||
# Check if function is a manifold
|
||||
if hasattr(function_module, "type"):
|
||||
if function_module.type == "manifold":
|
||||
manifold_pipes = []
|
||||
if hasattr(function_module, "pipes"):
|
||||
manifold_pipes = []
|
||||
|
||||
# Check if pipes is a function or a list
|
||||
if callable(function_module.pipes):
|
||||
manifold_pipes = function_module.pipes()
|
||||
else:
|
||||
manifold_pipes = function_module.pipes
|
||||
# Check if pipes is a function or a list
|
||||
if callable(function_module.pipes):
|
||||
manifold_pipes = function_module.pipes()
|
||||
else:
|
||||
manifold_pipes = function_module.pipes
|
||||
|
||||
for p in manifold_pipes:
|
||||
manifold_pipe_id = f'{pipe.id}.{p["id"]}'
|
||||
manifold_pipe_name = p["name"]
|
||||
for p in manifold_pipes:
|
||||
manifold_pipe_id = f'{pipe.id}.{p["id"]}'
|
||||
manifold_pipe_name = p["name"]
|
||||
|
||||
if hasattr(function_module, "name"):
|
||||
manifold_pipe_name = (
|
||||
f"{function_module.name}{manifold_pipe_name}"
|
||||
)
|
||||
if hasattr(function_module, "name"):
|
||||
manifold_pipe_name = f"{function_module.name}{manifold_pipe_name}"
|
||||
|
||||
pipe_models.append(
|
||||
{
|
||||
"id": manifold_pipe_id,
|
||||
"name": manifold_pipe_name,
|
||||
"object": "model",
|
||||
"created": pipe.created_at,
|
||||
"owned_by": "openai",
|
||||
"pipe": {"type": pipe.type},
|
||||
}
|
||||
)
|
||||
pipe_flag = {"type": pipe.type}
|
||||
if hasattr(function_module, "ChatValves"):
|
||||
pipe_flag["valves_spec"] = function_module.ChatValves.schema()
|
||||
|
||||
pipe_models.append(
|
||||
{
|
||||
"id": manifold_pipe_id,
|
||||
"name": manifold_pipe_name,
|
||||
"object": "model",
|
||||
"created": pipe.created_at,
|
||||
"owned_by": "openai",
|
||||
"pipe": pipe_flag,
|
||||
}
|
||||
)
|
||||
else:
|
||||
pipe_flag = {"type": "pipe"}
|
||||
if hasattr(function_module, "ChatValves"):
|
||||
pipe_flag["valves_spec"] = function_module.ChatValves.schema()
|
||||
|
||||
pipe_models.append(
|
||||
{
|
||||
"id": pipe.id,
|
||||
@@ -182,239 +189,218 @@ async def get_pipe_models():
|
||||
"object": "model",
|
||||
"created": pipe.created_at,
|
||||
"owned_by": "openai",
|
||||
"pipe": {"type": "pipe"},
|
||||
"pipe": pipe_flag,
|
||||
}
|
||||
)
|
||||
|
||||
return pipe_models
|
||||
|
||||
|
||||
async def execute_pipe(pipe, params):
|
||||
if inspect.iscoroutinefunction(pipe):
|
||||
return await pipe(**params)
|
||||
else:
|
||||
return pipe(**params)
|
||||
|
||||
|
||||
async def get_message_content(res: str | Generator | AsyncGenerator) -> str:
|
||||
if isinstance(res, str):
|
||||
return res
|
||||
if isinstance(res, Generator):
|
||||
return "".join(map(str, res))
|
||||
if isinstance(res, AsyncGenerator):
|
||||
return "".join([str(stream) async for stream in res])
|
||||
|
||||
|
||||
def process_line(form_data: dict, line):
|
||||
if isinstance(line, BaseModel):
|
||||
line = line.model_dump_json()
|
||||
line = f"data: {line}"
|
||||
if isinstance(line, dict):
|
||||
line = f"data: {json.dumps(line)}"
|
||||
|
||||
try:
|
||||
line = line.decode("utf-8")
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
if line.startswith("data:"):
|
||||
return f"{line}\n\n"
|
||||
else:
|
||||
line = openai_chat_chunk_message_template(form_data["model"], line)
|
||||
return f"data: {json.dumps(line)}\n\n"
|
||||
|
||||
|
||||
def get_pipe_id(form_data: dict) -> str:
|
||||
pipe_id = form_data["model"]
|
||||
if "." in pipe_id:
|
||||
pipe_id, _ = pipe_id.split(".", 1)
|
||||
print(pipe_id)
|
||||
return pipe_id
|
||||
|
||||
|
||||
def get_function_params(function_module, form_data, user, extra_params={}):
|
||||
pipe_id = get_pipe_id(form_data)
|
||||
# Get the signature of the function
|
||||
sig = inspect.signature(function_module.pipe)
|
||||
params = {"body": form_data}
|
||||
|
||||
for key, value in extra_params.items():
|
||||
if key in sig.parameters:
|
||||
params[key] = value
|
||||
|
||||
if "__user__" in sig.parameters:
|
||||
__user__ = {
|
||||
"id": user.id,
|
||||
"email": user.email,
|
||||
"name": user.name,
|
||||
"role": user.role,
|
||||
}
|
||||
|
||||
try:
|
||||
if hasattr(function_module, "UserValves"):
|
||||
__user__["valves"] = function_module.UserValves(
|
||||
**Functions.get_user_valves_by_id_and_user_id(pipe_id, user.id)
|
||||
)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
params["__user__"] = __user__
|
||||
return params
|
||||
|
||||
|
||||
# inplace function: form_data is modified
|
||||
def apply_model_params_to_body(params: dict, form_data: dict) -> dict:
|
||||
if not params:
|
||||
return form_data
|
||||
|
||||
mappings = {
|
||||
"temperature": float,
|
||||
"top_p": int,
|
||||
"max_tokens": int,
|
||||
"frequency_penalty": int,
|
||||
"seed": lambda x: x,
|
||||
"stop": lambda x: [bytes(s, "utf-8").decode("unicode_escape") for s in x],
|
||||
}
|
||||
|
||||
for key, cast_func in mappings.items():
|
||||
if (value := params.get(key)) is not None:
|
||||
form_data[key] = cast_func(value)
|
||||
|
||||
return form_data
|
||||
|
||||
|
||||
# inplace function: form_data is modified
|
||||
def apply_model_system_prompt_to_body(params: dict, form_data: dict, user) -> dict:
|
||||
system = params.get("system", None)
|
||||
if not system:
|
||||
return form_data
|
||||
|
||||
if user:
|
||||
template_params = {
|
||||
"user_name": user.name,
|
||||
"user_location": user.info.get("location") if user.info else None,
|
||||
}
|
||||
else:
|
||||
template_params = {}
|
||||
system = prompt_template(system, **template_params)
|
||||
form_data["messages"] = add_or_update_system_message(
|
||||
system, form_data.get("messages", [])
|
||||
)
|
||||
return form_data
|
||||
|
||||
|
||||
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)
|
||||
|
||||
__event_emitter__ = None
|
||||
__event_call__ = None
|
||||
__task__ = None
|
||||
|
||||
if metadata:
|
||||
if all(k in metadata for k in ("session_id", "chat_id", "message_id")):
|
||||
__event_emitter__ = get_event_emitter(metadata)
|
||||
__event_call__ = get_event_call(metadata)
|
||||
__task__ = metadata.get("task", None)
|
||||
|
||||
if model_info:
|
||||
if model_info.base_model_id:
|
||||
form_data["model"] = model_info.base_model_id
|
||||
|
||||
model_info.params = model_info.params.model_dump()
|
||||
params = model_info.params.model_dump()
|
||||
form_data = apply_model_params_to_body(params, form_data)
|
||||
form_data = apply_model_system_prompt_to_body(params, form_data, user)
|
||||
|
||||
if model_info.params:
|
||||
if model_info.params.get("temperature", None) is not None:
|
||||
form_data["temperature"] = float(model_info.params.get("temperature"))
|
||||
pipe_id = get_pipe_id(form_data)
|
||||
function_module = get_function_module(pipe_id)
|
||||
|
||||
if model_info.params.get("top_p", None):
|
||||
form_data["top_p"] = int(model_info.params.get("top_p", None))
|
||||
pipe = function_module.pipe
|
||||
params = get_function_params(
|
||||
function_module,
|
||||
form_data,
|
||||
user,
|
||||
{
|
||||
"__event_emitter__": __event_emitter__,
|
||||
"__event_call__": __event_call__,
|
||||
"__task__": __task__,
|
||||
},
|
||||
)
|
||||
|
||||
if model_info.params.get("max_tokens", None):
|
||||
form_data["max_tokens"] = int(model_info.params.get("max_tokens", None))
|
||||
|
||||
if model_info.params.get("frequency_penalty", None):
|
||||
form_data["frequency_penalty"] = int(
|
||||
model_info.params.get("frequency_penalty", None)
|
||||
)
|
||||
|
||||
if model_info.params.get("seed", None):
|
||||
form_data["seed"] = model_info.params.get("seed", None)
|
||||
|
||||
if model_info.params.get("stop", None):
|
||||
form_data["stop"] = (
|
||||
[
|
||||
bytes(stop, "utf-8").decode("unicode_escape")
|
||||
for stop in model_info.params["stop"]
|
||||
]
|
||||
if model_info.params.get("stop", None)
|
||||
else None
|
||||
)
|
||||
|
||||
system = model_info.params.get("system", None)
|
||||
if system:
|
||||
system = prompt_template(
|
||||
system,
|
||||
**(
|
||||
{
|
||||
"user_name": user.name,
|
||||
"user_location": (
|
||||
user.info.get("location") if user.info else None
|
||||
),
|
||||
}
|
||||
if user
|
||||
else {}
|
||||
),
|
||||
)
|
||||
# Check if the payload already has a system message
|
||||
# If not, add a system message to the payload
|
||||
if form_data.get("messages"):
|
||||
for message in form_data["messages"]:
|
||||
if message.get("role") == "system":
|
||||
message["content"] = system + message["content"]
|
||||
break
|
||||
else:
|
||||
form_data["messages"].insert(
|
||||
0,
|
||||
{
|
||||
"role": "system",
|
||||
"content": system,
|
||||
},
|
||||
)
|
||||
|
||||
else:
|
||||
pass
|
||||
|
||||
async def job():
|
||||
pipe_id = form_data["model"]
|
||||
if "." in pipe_id:
|
||||
pipe_id, sub_pipe_id = pipe_id.split(".", 1)
|
||||
print(pipe_id)
|
||||
|
||||
# Check if function is already loaded
|
||||
if pipe_id not in app.state.FUNCTIONS:
|
||||
function_module, function_type, frontmatter = load_function_module_by_id(
|
||||
pipe_id
|
||||
)
|
||||
app.state.FUNCTIONS[pipe_id] = function_module
|
||||
else:
|
||||
function_module = app.state.FUNCTIONS[pipe_id]
|
||||
|
||||
if hasattr(function_module, "valves") and hasattr(function_module, "Valves"):
|
||||
|
||||
valves = Functions.get_function_valves_by_id(pipe_id)
|
||||
function_module.valves = function_module.Valves(
|
||||
**(valves if valves else {})
|
||||
)
|
||||
|
||||
pipe = function_module.pipe
|
||||
|
||||
# Get the signature of the function
|
||||
sig = inspect.signature(pipe)
|
||||
params = {"body": form_data}
|
||||
|
||||
if "__user__" in sig.parameters:
|
||||
__user__ = {
|
||||
"id": user.id,
|
||||
"email": user.email,
|
||||
"name": user.name,
|
||||
"role": user.role,
|
||||
}
|
||||
if form_data["stream"]:
|
||||
|
||||
async def stream_content():
|
||||
try:
|
||||
if hasattr(function_module, "UserValves"):
|
||||
__user__["valves"] = function_module.UserValves(
|
||||
**Functions.get_user_valves_by_id_and_user_id(pipe_id, user.id)
|
||||
)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
res = await execute_pipe(pipe, params)
|
||||
|
||||
params = {**params, "__user__": __user__}
|
||||
|
||||
if form_data["stream"]:
|
||||
|
||||
async def stream_content():
|
||||
try:
|
||||
if inspect.iscoroutinefunction(pipe):
|
||||
res = await pipe(**params)
|
||||
else:
|
||||
res = pipe(**params)
|
||||
|
||||
# Directly return if the response is a StreamingResponse
|
||||
if isinstance(res, StreamingResponse):
|
||||
async for data in res.body_iterator:
|
||||
yield data
|
||||
return
|
||||
if isinstance(res, dict):
|
||||
yield f"data: {json.dumps(res)}\n\n"
|
||||
return
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error: {e}")
|
||||
yield f"data: {json.dumps({'error': {'detail':str(e)}})}\n\n"
|
||||
# Directly return if the response is a StreamingResponse
|
||||
if isinstance(res, StreamingResponse):
|
||||
async for data in res.body_iterator:
|
||||
yield data
|
||||
return
|
||||
if isinstance(res, dict):
|
||||
yield f"data: {json.dumps(res)}\n\n"
|
||||
return
|
||||
|
||||
if isinstance(res, str):
|
||||
message = stream_message_template(form_data["model"], res)
|
||||
yield f"data: {json.dumps(message)}\n\n"
|
||||
|
||||
if isinstance(res, Iterator):
|
||||
for line in res:
|
||||
if isinstance(line, BaseModel):
|
||||
line = line.model_dump_json()
|
||||
line = f"data: {line}"
|
||||
if isinstance(line, dict):
|
||||
line = f"data: {json.dumps(line)}"
|
||||
|
||||
try:
|
||||
line = line.decode("utf-8")
|
||||
except:
|
||||
pass
|
||||
|
||||
if line.startswith("data:"):
|
||||
yield f"{line}\n\n"
|
||||
else:
|
||||
line = stream_message_template(form_data["model"], line)
|
||||
yield f"data: {json.dumps(line)}\n\n"
|
||||
|
||||
if isinstance(res, str) or isinstance(res, Generator):
|
||||
finish_message = {
|
||||
"id": f"{form_data['model']}-{str(uuid.uuid4())}",
|
||||
"object": "chat.completion.chunk",
|
||||
"created": int(time.time()),
|
||||
"model": form_data["model"],
|
||||
"choices": [
|
||||
{
|
||||
"index": 0,
|
||||
"delta": {},
|
||||
"logprobs": None,
|
||||
"finish_reason": "stop",
|
||||
}
|
||||
],
|
||||
}
|
||||
|
||||
yield f"data: {json.dumps(finish_message)}\n\n"
|
||||
yield f"data: [DONE]"
|
||||
|
||||
return StreamingResponse(stream_content(), media_type="text/event-stream")
|
||||
else:
|
||||
|
||||
try:
|
||||
if inspect.iscoroutinefunction(pipe):
|
||||
res = await pipe(**params)
|
||||
else:
|
||||
res = pipe(**params)
|
||||
|
||||
if isinstance(res, StreamingResponse):
|
||||
return res
|
||||
except Exception as e:
|
||||
print(f"Error: {e}")
|
||||
return {"error": {"detail": str(e)}}
|
||||
yield f"data: {json.dumps({'error': {'detail':str(e)}})}\n\n"
|
||||
return
|
||||
|
||||
if isinstance(res, dict):
|
||||
return res
|
||||
elif isinstance(res, BaseModel):
|
||||
return res.model_dump()
|
||||
else:
|
||||
message = ""
|
||||
if isinstance(res, str):
|
||||
message = res
|
||||
if isinstance(res, Generator):
|
||||
for stream in res:
|
||||
message = f"{message}{stream}"
|
||||
if isinstance(res, str):
|
||||
message = openai_chat_chunk_message_template(form_data["model"], res)
|
||||
yield f"data: {json.dumps(message)}\n\n"
|
||||
|
||||
return {
|
||||
"id": f"{form_data['model']}-{str(uuid.uuid4())}",
|
||||
"object": "chat.completion",
|
||||
"created": int(time.time()),
|
||||
"model": form_data["model"],
|
||||
"choices": [
|
||||
{
|
||||
"index": 0,
|
||||
"message": {
|
||||
"role": "assistant",
|
||||
"content": message,
|
||||
},
|
||||
"logprobs": None,
|
||||
"finish_reason": "stop",
|
||||
}
|
||||
],
|
||||
}
|
||||
if isinstance(res, Iterator):
|
||||
for line in res:
|
||||
yield process_line(form_data, line)
|
||||
|
||||
return await job()
|
||||
if isinstance(res, AsyncGenerator):
|
||||
async for line in res:
|
||||
yield process_line(form_data, line)
|
||||
|
||||
if isinstance(res, str) or isinstance(res, Generator):
|
||||
finish_message = openai_chat_chunk_message_template(
|
||||
form_data["model"], ""
|
||||
)
|
||||
finish_message["choices"][0]["finish_reason"] = "stop"
|
||||
yield f"data: {json.dumps(finish_message)}\n\n"
|
||||
yield "data: [DONE]"
|
||||
|
||||
return StreamingResponse(stream_content(), media_type="text/event-stream")
|
||||
else:
|
||||
try:
|
||||
res = await execute_pipe(pipe, params)
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error: {e}")
|
||||
return {"error": {"detail": str(e)}}
|
||||
|
||||
if isinstance(res, StreamingResponse) or isinstance(res, dict):
|
||||
return res
|
||||
if isinstance(res, BaseModel):
|
||||
return res.model_dump()
|
||||
|
||||
message = await get_message_content(res)
|
||||
return openai_chat_completion_message_template(form_data["model"], message)
|
||||
|
||||
@@ -159,7 +159,7 @@ class AuthsTable:
|
||||
log.info(f"authenticate_user_by_trusted_header: {email}")
|
||||
try:
|
||||
with get_db() as db:
|
||||
auth = db.query(Auth).filter(email=email, active=True).first()
|
||||
auth = db.query(Auth).filter_by(email=email, active=True).first()
|
||||
if auth:
|
||||
user = Users.get_user_by_id(auth.id)
|
||||
return user
|
||||
|
||||
@@ -245,6 +245,38 @@ class ChatTable:
|
||||
)
|
||||
return [ChatModel.model_validate(chat) for chat in all_chats]
|
||||
|
||||
def get_chat_title_id_list_by_user_id(
|
||||
self,
|
||||
user_id: str,
|
||||
include_archived: bool = False,
|
||||
skip: int = 0,
|
||||
limit: int = 50,
|
||||
) -> List[ChatTitleIdResponse]:
|
||||
with get_db() as db:
|
||||
query = db.query(Chat).filter_by(user_id=user_id)
|
||||
if not include_archived:
|
||||
query = query.filter_by(archived=False)
|
||||
|
||||
all_chats = (
|
||||
query.order_by(Chat.updated_at.desc())
|
||||
# limit cols
|
||||
.with_entities(
|
||||
Chat.id, Chat.title, Chat.updated_at, Chat.created_at
|
||||
).all()
|
||||
)
|
||||
# result has to be destrctured from sqlalchemy `row` and mapped to a dict since the `ChatModel`is not the returned dataclass.
|
||||
return [
|
||||
ChatTitleIdResponse.model_validate(
|
||||
{
|
||||
"id": chat[0],
|
||||
"title": chat[1],
|
||||
"updated_at": chat[2],
|
||||
"created_at": chat[3],
|
||||
}
|
||||
)
|
||||
for chat in all_chats
|
||||
]
|
||||
|
||||
def get_chat_list_by_chat_ids(
|
||||
self, chat_ids: List[str], skip: int = 0, limit: int = 50
|
||||
) -> List[ChatModel]:
|
||||
|
||||
@@ -167,6 +167,15 @@ class FunctionsTable:
|
||||
.all()
|
||||
]
|
||||
|
||||
def get_global_action_functions(self) -> List[FunctionModel]:
|
||||
with get_db() as db:
|
||||
return [
|
||||
FunctionModel.model_validate(function)
|
||||
for function in db.query(Function)
|
||||
.filter_by(type="action", is_active=True, is_global=True)
|
||||
.all()
|
||||
]
|
||||
|
||||
def get_function_valves_by_id(self, id: str) -> Optional[dict]:
|
||||
with get_db() as db:
|
||||
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
import json
|
||||
import logging
|
||||
from typing import Optional
|
||||
from typing import Optional, List
|
||||
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
from sqlalchemy import String, Column, BigInteger, Text
|
||||
from sqlalchemy import Column, BigInteger, Text
|
||||
|
||||
from apps.webui.internal.db import Base, JSONField, get_db
|
||||
|
||||
from typing import List, Union, Optional
|
||||
from config import SRC_LOG_LEVELS
|
||||
|
||||
import time
|
||||
@@ -113,7 +111,6 @@ class ModelForm(BaseModel):
|
||||
|
||||
|
||||
class ModelsTable:
|
||||
|
||||
def insert_new_model(
|
||||
self, form_data: ModelForm, user_id: str
|
||||
) -> Optional[ModelModel]:
|
||||
@@ -126,9 +123,7 @@ class ModelsTable:
|
||||
}
|
||||
)
|
||||
try:
|
||||
|
||||
with get_db() as db:
|
||||
|
||||
result = Model(**model.model_dump())
|
||||
db.add(result)
|
||||
db.commit()
|
||||
@@ -144,13 +139,11 @@ class ModelsTable:
|
||||
|
||||
def get_all_models(self) -> List[ModelModel]:
|
||||
with get_db() as db:
|
||||
|
||||
return [ModelModel.model_validate(model) for model in db.query(Model).all()]
|
||||
|
||||
def get_model_by_id(self, id: str) -> Optional[ModelModel]:
|
||||
try:
|
||||
with get_db() as db:
|
||||
|
||||
model = db.get(Model, id)
|
||||
return ModelModel.model_validate(model)
|
||||
except:
|
||||
@@ -178,7 +171,6 @@ class ModelsTable:
|
||||
def delete_model_by_id(self, id: str) -> bool:
|
||||
try:
|
||||
with get_db() as db:
|
||||
|
||||
db.query(Model).filter_by(id=id).delete()
|
||||
db.commit()
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@ class TagTable:
|
||||
) -> Optional[TagModel]:
|
||||
try:
|
||||
with get_db() as db:
|
||||
tag = db.query(Tag).filter(name=name, user_id=user_id).first()
|
||||
tag = db.query(Tag).filter_by(name=name, user_id=user_id).first()
|
||||
return TagModel.model_validate(tag)
|
||||
except Exception as e:
|
||||
return None
|
||||
|
||||
@@ -45,7 +45,7 @@ router = APIRouter()
|
||||
async def get_session_user_chat_list(
|
||||
user=Depends(get_verified_user), skip: int = 0, limit: int = 50
|
||||
):
|
||||
return Chats.get_chat_list_by_user_id(user.id, skip, limit)
|
||||
return Chats.get_chat_title_id_list_by_user_id(user.id, skip=skip, limit=limit)
|
||||
|
||||
|
||||
############################
|
||||
|
||||
@@ -58,6 +58,7 @@ def upload_file(file: UploadFile = File(...), user=Depends(get_verified_user)):
|
||||
|
||||
# replace filename with uuid
|
||||
id = str(uuid.uuid4())
|
||||
name = filename
|
||||
filename = f"{id}_{filename}"
|
||||
file_path = f"{UPLOAD_DIR}/{filename}"
|
||||
|
||||
@@ -73,6 +74,7 @@ def upload_file(file: UploadFile = File(...), user=Depends(get_verified_user)):
|
||||
"id": id,
|
||||
"filename": filename,
|
||||
"meta": {
|
||||
"name": name,
|
||||
"content_type": file.content_type,
|
||||
"size": len(contents),
|
||||
"path": file_path,
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
from pathlib import Path
|
||||
import site
|
||||
|
||||
from fastapi import APIRouter, UploadFile, File, Response
|
||||
from fastapi import Depends, HTTPException, status
|
||||
from starlette.responses import StreamingResponse, FileResponse
|
||||
@@ -64,8 +67,18 @@ async def download_chat_as_pdf(
|
||||
pdf = FPDF()
|
||||
pdf.add_page()
|
||||
|
||||
STATIC_DIR = "./static"
|
||||
FONTS_DIR = f"{STATIC_DIR}/fonts"
|
||||
# When running in docker, workdir is /app/backend, so fonts is in /app/backend/static/fonts
|
||||
FONTS_DIR = Path("./static/fonts")
|
||||
|
||||
# Non Docker Installation
|
||||
|
||||
# When running using `pip install` the static directory is in the site packages.
|
||||
if not FONTS_DIR.exists():
|
||||
FONTS_DIR = Path(site.getsitepackages()[0]) / "static/fonts"
|
||||
# When running using `pip install -e .` the static directory is in the site packages.
|
||||
# This path only works if `open-webui serve` is run from the root of this project.
|
||||
if not FONTS_DIR.exists():
|
||||
FONTS_DIR = Path("./backend/static/fonts")
|
||||
|
||||
pdf.add_font("NotoSans", "", f"{FONTS_DIR}/NotoSans-Regular.ttf")
|
||||
pdf.add_font("NotoSans", "b", f"{FONTS_DIR}/NotoSans-Bold.ttf")
|
||||
|
||||
@@ -79,6 +79,8 @@ def load_function_module_by_id(function_id):
|
||||
return module.Pipe(), "pipe", frontmatter
|
||||
elif hasattr(module, "Filter"):
|
||||
return module.Filter(), "filter", frontmatter
|
||||
elif hasattr(module, "Action"):
|
||||
return module.Action(), "action", frontmatter
|
||||
else:
|
||||
raise Exception("No Function class found")
|
||||
except Exception as e:
|
||||
|
||||
@@ -77,6 +77,16 @@ for source in log_sources:
|
||||
|
||||
log.setLevel(SRC_LOG_LEVELS["CONFIG"])
|
||||
|
||||
|
||||
class EndpointFilter(logging.Filter):
|
||||
def filter(self, record: logging.LogRecord) -> bool:
|
||||
return record.getMessage().find("/health") == -1
|
||||
|
||||
|
||||
# Filter out /endpoint
|
||||
logging.getLogger("uvicorn.access").addFilter(EndpointFilter())
|
||||
|
||||
|
||||
WEBUI_NAME = os.environ.get("WEBUI_NAME", "Open WebUI")
|
||||
if WEBUI_NAME != "Open WebUI":
|
||||
WEBUI_NAME += " (Open WebUI)"
|
||||
@@ -339,6 +349,12 @@ GOOGLE_OAUTH_SCOPE = PersistentConfig(
|
||||
os.environ.get("GOOGLE_OAUTH_SCOPE", "openid email profile"),
|
||||
)
|
||||
|
||||
GOOGLE_REDIRECT_URI = PersistentConfig(
|
||||
"GOOGLE_REDIRECT_URI",
|
||||
"oauth.google.redirect_uri",
|
||||
os.environ.get("GOOGLE_REDIRECT_URI", ""),
|
||||
)
|
||||
|
||||
MICROSOFT_CLIENT_ID = PersistentConfig(
|
||||
"MICROSOFT_CLIENT_ID",
|
||||
"oauth.microsoft.client_id",
|
||||
@@ -363,6 +379,12 @@ MICROSOFT_OAUTH_SCOPE = PersistentConfig(
|
||||
os.environ.get("MICROSOFT_OAUTH_SCOPE", "openid email profile"),
|
||||
)
|
||||
|
||||
MICROSOFT_REDIRECT_URI = PersistentConfig(
|
||||
"MICROSOFT_REDIRECT_URI",
|
||||
"oauth.microsoft.redirect_uri",
|
||||
os.environ.get("MICROSOFT_REDIRECT_URI", ""),
|
||||
)
|
||||
|
||||
OAUTH_CLIENT_ID = PersistentConfig(
|
||||
"OAUTH_CLIENT_ID",
|
||||
"oauth.oidc.client_id",
|
||||
@@ -381,6 +403,12 @@ OPENID_PROVIDER_URL = PersistentConfig(
|
||||
os.environ.get("OPENID_PROVIDER_URL", ""),
|
||||
)
|
||||
|
||||
OPENID_REDIRECT_URI = PersistentConfig(
|
||||
"OPENID_REDIRECT_URI",
|
||||
"oauth.oidc.redirect_uri",
|
||||
os.environ.get("OPENID_REDIRECT_URI", ""),
|
||||
)
|
||||
|
||||
OAUTH_SCOPES = PersistentConfig(
|
||||
"OAUTH_SCOPES",
|
||||
"oauth.oidc.scopes",
|
||||
@@ -414,6 +442,7 @@ def load_oauth_providers():
|
||||
"client_secret": GOOGLE_CLIENT_SECRET.value,
|
||||
"server_metadata_url": "https://accounts.google.com/.well-known/openid-configuration",
|
||||
"scope": GOOGLE_OAUTH_SCOPE.value,
|
||||
"redirect_uri": GOOGLE_REDIRECT_URI.value,
|
||||
}
|
||||
|
||||
if (
|
||||
@@ -426,6 +455,7 @@ def load_oauth_providers():
|
||||
"client_secret": MICROSOFT_CLIENT_SECRET.value,
|
||||
"server_metadata_url": f"https://login.microsoftonline.com/{MICROSOFT_CLIENT_TENANT_ID.value}/v2.0/.well-known/openid-configuration",
|
||||
"scope": MICROSOFT_OAUTH_SCOPE.value,
|
||||
"redirect_uri": MICROSOFT_REDIRECT_URI.value,
|
||||
}
|
||||
|
||||
if (
|
||||
@@ -439,6 +469,7 @@ def load_oauth_providers():
|
||||
"server_metadata_url": OPENID_PROVIDER_URL.value,
|
||||
"scope": OAUTH_SCOPES.value,
|
||||
"name": OAUTH_PROVIDER_NAME.value,
|
||||
"redirect_uri": OPENID_REDIRECT_URI.value,
|
||||
}
|
||||
|
||||
|
||||
@@ -709,6 +740,12 @@ ENABLE_SIGNUP = PersistentConfig(
|
||||
),
|
||||
)
|
||||
|
||||
ENABLE_LOGIN_FORM = PersistentConfig(
|
||||
"ENABLE_LOGIN_FORM",
|
||||
"ui.ENABLE_LOGIN_FORM",
|
||||
os.environ.get("ENABLE_LOGIN_FORM", "True").lower() == "true",
|
||||
)
|
||||
|
||||
DEFAULT_LOCALE = PersistentConfig(
|
||||
"DEFAULT_LOCALE",
|
||||
"ui.default_locale",
|
||||
@@ -1265,6 +1302,24 @@ COMFYUI_SD3 = PersistentConfig(
|
||||
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.getenv("COMFYUI_FLUX_FP8_CLIP", ""),
|
||||
)
|
||||
|
||||
IMAGES_OPENAI_API_BASE_URL = PersistentConfig(
|
||||
"IMAGES_OPENAI_API_BASE_URL",
|
||||
"image_generation.openai.api_base_url",
|
||||
@@ -1329,6 +1384,11 @@ AUDIO_TTS_OPENAI_API_KEY = PersistentConfig(
|
||||
os.getenv("AUDIO_TTS_OPENAI_API_KEY", OPENAI_API_KEY),
|
||||
)
|
||||
|
||||
AUDIO_TTS_API_KEY = PersistentConfig(
|
||||
"AUDIO_TTS_API_KEY",
|
||||
"audio.tts.api_key",
|
||||
os.getenv("AUDIO_TTS_API_KEY", ""),
|
||||
)
|
||||
|
||||
AUDIO_TTS_ENGINE = PersistentConfig(
|
||||
"AUDIO_TTS_ENGINE",
|
||||
|
||||
@@ -95,8 +95,8 @@ class TASKS(str, Enum):
|
||||
def __str__(self) -> str:
|
||||
return super().__str__()
|
||||
|
||||
DEFAULT = lambda task="": f"{task if task else 'default'}"
|
||||
TITLE_GENERATION = "Title Generation"
|
||||
EMOJI_GENERATION = "Emoji Generation"
|
||||
QUERY_GENERATION = "Query Generation"
|
||||
FUNCTION_CALLING = "Function Calling"
|
||||
DEFAULT = lambda task="": f"{task if task else 'generation'}"
|
||||
TITLE_GENERATION = "title_generation"
|
||||
EMOJI_GENERATION = "emoji_generation"
|
||||
QUERY_GENERATION = "query_generation"
|
||||
FUNCTION_CALLING = "function_calling"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"version": 0,
|
||||
"ui": {
|
||||
"default_locale": "en-US",
|
||||
"default_locale": "",
|
||||
"prompt_suggestions": [
|
||||
{
|
||||
"title": ["Help me study", "vocabulary for a college entrance exam"],
|
||||
|
||||
+240
-72
@@ -13,8 +13,6 @@ import aiohttp
|
||||
import requests
|
||||
import mimetypes
|
||||
import shutil
|
||||
import os
|
||||
import uuid
|
||||
import inspect
|
||||
|
||||
from fastapi import FastAPI, Request, Depends, status, UploadFile, File, Form
|
||||
@@ -29,7 +27,7 @@ from starlette.middleware.sessions import SessionMiddleware
|
||||
from starlette.responses import StreamingResponse, Response, RedirectResponse
|
||||
|
||||
|
||||
from apps.socket.main import sio, app as socket_app
|
||||
from apps.socket.main import app as socket_app, get_event_emitter, get_event_call
|
||||
from apps.ollama.main import (
|
||||
app as ollama_app,
|
||||
get_all_models as get_ollama_models,
|
||||
@@ -79,6 +77,7 @@ from utils.task import (
|
||||
from utils.misc import (
|
||||
get_last_user_message,
|
||||
add_or_update_system_message,
|
||||
prepend_to_first_user_message_content,
|
||||
parse_duration,
|
||||
)
|
||||
|
||||
@@ -317,7 +316,7 @@ async def get_function_call_response(
|
||||
{"role": "user", "content": f"Query: {prompt}"},
|
||||
],
|
||||
"stream": False,
|
||||
"task": TASKS.FUNCTION_CALLING,
|
||||
"task": str(TASKS.FUNCTION_CALLING),
|
||||
}
|
||||
|
||||
try:
|
||||
@@ -618,38 +617,15 @@ class ChatCompletionMiddleware(BaseHTTPMiddleware):
|
||||
content={"detail": str(e)},
|
||||
)
|
||||
|
||||
# Extract session_id, chat_id and message_id from the request body
|
||||
session_id = None
|
||||
if "session_id" in body:
|
||||
session_id = body["session_id"]
|
||||
del body["session_id"]
|
||||
chat_id = None
|
||||
if "chat_id" in body:
|
||||
chat_id = body["chat_id"]
|
||||
del body["chat_id"]
|
||||
message_id = None
|
||||
if "id" in body:
|
||||
message_id = body["id"]
|
||||
del body["id"]
|
||||
metadata = {
|
||||
"chat_id": body.pop("chat_id", None),
|
||||
"message_id": body.pop("id", None),
|
||||
"session_id": body.pop("session_id", None),
|
||||
"valves": body.pop("valves", None),
|
||||
}
|
||||
|
||||
async def __event_emitter__(data):
|
||||
await sio.emit(
|
||||
"chat-events",
|
||||
{
|
||||
"chat_id": chat_id,
|
||||
"message_id": message_id,
|
||||
"data": data,
|
||||
},
|
||||
to=session_id,
|
||||
)
|
||||
|
||||
async def __event_call__(data):
|
||||
response = await sio.call(
|
||||
"chat-events",
|
||||
{"chat_id": chat_id, "message_id": message_id, "data": data},
|
||||
to=session_id,
|
||||
)
|
||||
return response
|
||||
__event_emitter__ = get_event_emitter(metadata)
|
||||
__event_call__ = get_event_call(metadata)
|
||||
|
||||
# Initialize data_items to store additional data to be sent to the client
|
||||
data_items = []
|
||||
@@ -692,17 +668,29 @@ class ChatCompletionMiddleware(BaseHTTPMiddleware):
|
||||
if len(contexts) > 0:
|
||||
context_string = "/n".join(contexts).strip()
|
||||
prompt = get_last_user_message(body["messages"])
|
||||
body["messages"] = add_or_update_system_message(
|
||||
rag_template(
|
||||
rag_app.state.config.RAG_TEMPLATE, context_string, prompt
|
||||
),
|
||||
body["messages"],
|
||||
)
|
||||
|
||||
# Workaround for Ollama 2.0+ system prompt issue
|
||||
# TODO: replace with add_or_update_system_message
|
||||
if model["owned_by"] == "ollama":
|
||||
body["messages"] = prepend_to_first_user_message_content(
|
||||
rag_template(
|
||||
rag_app.state.config.RAG_TEMPLATE, context_string, prompt
|
||||
),
|
||||
body["messages"],
|
||||
)
|
||||
else:
|
||||
body["messages"] = add_or_update_system_message(
|
||||
rag_template(
|
||||
rag_app.state.config.RAG_TEMPLATE, context_string, prompt
|
||||
),
|
||||
body["messages"],
|
||||
)
|
||||
|
||||
# If there are citations, add them to the data_items
|
||||
if len(citations) > 0:
|
||||
data_items.append({"citations": citations})
|
||||
|
||||
body["metadata"] = metadata
|
||||
modified_body_bytes = json.dumps(body).encode("utf-8")
|
||||
# Replace the request body with the modified one
|
||||
request._body = modified_body_bytes
|
||||
@@ -823,9 +811,6 @@ def filter_pipeline(payload, user):
|
||||
if "detail" in res:
|
||||
raise Exception(r.status_code, res["detail"])
|
||||
|
||||
if "pipeline" not in app.state.MODELS[model_id] and "task" in payload:
|
||||
del payload["task"]
|
||||
|
||||
return payload
|
||||
|
||||
|
||||
@@ -935,6 +920,7 @@ webui_app.state.EMBEDDING_FUNCTION = rag_app.state.EMBEDDING_FUNCTION
|
||||
|
||||
|
||||
async def get_all_models():
|
||||
# TODO: Optimize this function
|
||||
pipe_models = []
|
||||
openai_models = []
|
||||
ollama_models = []
|
||||
@@ -961,6 +947,14 @@ async def get_all_models():
|
||||
|
||||
models = pipe_models + openai_models + ollama_models
|
||||
|
||||
global_action_ids = [
|
||||
function.id for function in Functions.get_global_action_functions()
|
||||
]
|
||||
enabled_action_ids = [
|
||||
function.id
|
||||
for function in Functions.get_functions_by_type("action", active_only=True)
|
||||
]
|
||||
|
||||
custom_models = Models.get_all_models()
|
||||
for custom_model in custom_models:
|
||||
if custom_model.base_model_id == None:
|
||||
@@ -971,9 +965,16 @@ async def get_all_models():
|
||||
):
|
||||
model["name"] = custom_model.name
|
||||
model["info"] = custom_model.model_dump()
|
||||
|
||||
action_ids = []
|
||||
if "info" in model and "meta" in model["info"]:
|
||||
action_ids.extend(model["info"]["meta"].get("actionIds", []))
|
||||
|
||||
model["action_ids"] = action_ids
|
||||
else:
|
||||
owned_by = "openai"
|
||||
pipe = None
|
||||
action_ids = []
|
||||
|
||||
for model in models:
|
||||
if (
|
||||
@@ -983,6 +984,9 @@ async def get_all_models():
|
||||
owned_by = model["owned_by"]
|
||||
if "pipe" in model:
|
||||
pipe = model["pipe"]
|
||||
|
||||
if "info" in model and "meta" in model["info"]:
|
||||
action_ids.extend(model["info"]["meta"].get("actionIds", []))
|
||||
break
|
||||
|
||||
models.append(
|
||||
@@ -995,9 +999,59 @@ async def get_all_models():
|
||||
"info": custom_model.model_dump(),
|
||||
"preset": True,
|
||||
**({"pipe": pipe} if pipe is not None else {}),
|
||||
"action_ids": action_ids,
|
||||
}
|
||||
)
|
||||
|
||||
for model in models:
|
||||
action_ids = []
|
||||
if "action_ids" in model:
|
||||
action_ids = model["action_ids"]
|
||||
del model["action_ids"]
|
||||
|
||||
action_ids = action_ids + global_action_ids
|
||||
action_ids = list(set(action_ids))
|
||||
action_ids = [
|
||||
action_id for action_id in action_ids if action_id in enabled_action_ids
|
||||
]
|
||||
|
||||
model["actions"] = []
|
||||
for action_id in action_ids:
|
||||
action = Functions.get_function_by_id(action_id)
|
||||
|
||||
if action_id in webui_app.state.FUNCTIONS:
|
||||
function_module = webui_app.state.FUNCTIONS[action_id]
|
||||
else:
|
||||
function_module, _, _ = load_function_module_by_id(action_id)
|
||||
webui_app.state.FUNCTIONS[action_id] = function_module
|
||||
|
||||
if hasattr(function_module, "actions"):
|
||||
actions = function_module.actions
|
||||
model["actions"].extend(
|
||||
[
|
||||
{
|
||||
"id": f"{action_id}.{_action['id']}",
|
||||
"name": _action.get(
|
||||
"name", f"{action.name} ({_action['id']})"
|
||||
),
|
||||
"description": action.meta.description,
|
||||
"icon_url": _action.get(
|
||||
"icon_url", action.meta.manifest.get("icon_url", None)
|
||||
),
|
||||
}
|
||||
for _action in actions
|
||||
]
|
||||
)
|
||||
else:
|
||||
model["actions"].append(
|
||||
{
|
||||
"id": action_id,
|
||||
"name": action.name,
|
||||
"description": action.meta.description,
|
||||
"icon_url": action.meta.manifest.get("icon_url", None),
|
||||
}
|
||||
)
|
||||
|
||||
app.state.MODELS = {model["id"]: model for model in models}
|
||||
webui_app.state.MODELS = app.state.MODELS
|
||||
|
||||
@@ -1036,13 +1090,24 @@ async def generate_chat_completions(form_data: dict, user=Depends(get_verified_u
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="Model not found",
|
||||
)
|
||||
|
||||
model = app.state.MODELS[model_id]
|
||||
|
||||
pipe = model.get("pipe")
|
||||
if pipe:
|
||||
# `task` field is used to determine the type of the request, e.g. `title_generation`, `query_generation`, etc.
|
||||
task = None
|
||||
if "task" in form_data:
|
||||
task = form_data["task"]
|
||||
del form_data["task"]
|
||||
|
||||
if task:
|
||||
if "metadata" in form_data:
|
||||
form_data["metadata"]["task"] = task
|
||||
else:
|
||||
form_data["metadata"] = {"task": task}
|
||||
|
||||
if model.get("pipe"):
|
||||
return await generate_function_chat_completion(form_data, user=user)
|
||||
if model["owned_by"] == "ollama":
|
||||
print("generate_ollama_chat_completion")
|
||||
return await generate_ollama_chat_completion(form_data, user=user)
|
||||
else:
|
||||
return await generate_openai_chat_completion(form_data, user=user)
|
||||
@@ -1101,30 +1166,27 @@ async def chat_completed(form_data: dict, user=Depends(get_verified_user)):
|
||||
status_code=r.status_code,
|
||||
content=res,
|
||||
)
|
||||
except:
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
else:
|
||||
pass
|
||||
|
||||
async def __event_emitter__(event_data):
|
||||
await sio.emit(
|
||||
"chat-events",
|
||||
{
|
||||
"chat_id": data["chat_id"],
|
||||
"message_id": data["id"],
|
||||
"data": event_data,
|
||||
},
|
||||
to=data["session_id"],
|
||||
)
|
||||
__event_emitter__ = get_event_emitter(
|
||||
{
|
||||
"chat_id": data["chat_id"],
|
||||
"message_id": data["id"],
|
||||
"session_id": data["session_id"],
|
||||
}
|
||||
)
|
||||
|
||||
async def __event_call__(event_data):
|
||||
response = await sio.call(
|
||||
"chat-events",
|
||||
{"chat_id": data["chat_id"], "message_id": data["id"], "data": event_data},
|
||||
to=data["session_id"],
|
||||
)
|
||||
return response
|
||||
__event_call__ = get_event_call(
|
||||
{
|
||||
"chat_id": data["chat_id"],
|
||||
"message_id": data["id"],
|
||||
"session_id": data["session_id"],
|
||||
}
|
||||
)
|
||||
|
||||
def get_priority(function_id):
|
||||
function = Functions.get_function_by_id(function_id)
|
||||
@@ -1222,6 +1284,110 @@ async def chat_completed(form_data: dict, user=Depends(get_verified_user)):
|
||||
return data
|
||||
|
||||
|
||||
@app.post("/api/chat/actions/{action_id}")
|
||||
async def chat_action(action_id: str, form_data: dict, user=Depends(get_verified_user)):
|
||||
if "." in action_id:
|
||||
action_id, sub_action_id = action_id.split(".")
|
||||
else:
|
||||
sub_action_id = None
|
||||
|
||||
action = Functions.get_function_by_id(action_id)
|
||||
if not action:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="Action not found",
|
||||
)
|
||||
|
||||
data = form_data
|
||||
model_id = data["model"]
|
||||
if model_id not in app.state.MODELS:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="Model not found",
|
||||
)
|
||||
model = app.state.MODELS[model_id]
|
||||
|
||||
__event_emitter__ = get_event_emitter(
|
||||
{
|
||||
"chat_id": data["chat_id"],
|
||||
"message_id": data["id"],
|
||||
"session_id": data["session_id"],
|
||||
}
|
||||
)
|
||||
__event_call__ = get_event_call(
|
||||
{
|
||||
"chat_id": data["chat_id"],
|
||||
"message_id": data["id"],
|
||||
"session_id": data["session_id"],
|
||||
}
|
||||
)
|
||||
|
||||
if action_id in webui_app.state.FUNCTIONS:
|
||||
function_module = webui_app.state.FUNCTIONS[action_id]
|
||||
else:
|
||||
function_module, _, _ = load_function_module_by_id(action_id)
|
||||
webui_app.state.FUNCTIONS[action_id] = function_module
|
||||
|
||||
if hasattr(function_module, "valves") and hasattr(function_module, "Valves"):
|
||||
valves = Functions.get_function_valves_by_id(action_id)
|
||||
function_module.valves = function_module.Valves(**(valves if valves else {}))
|
||||
|
||||
if hasattr(function_module, "action"):
|
||||
try:
|
||||
action = function_module.action
|
||||
|
||||
# Get the signature of the function
|
||||
sig = inspect.signature(action)
|
||||
params = {"body": data}
|
||||
|
||||
# Extra parameters to be passed to the function
|
||||
extra_params = {
|
||||
"__model__": model,
|
||||
"__id__": sub_action_id if sub_action_id is not None else action_id,
|
||||
"__event_emitter__": __event_emitter__,
|
||||
"__event_call__": __event_call__,
|
||||
}
|
||||
|
||||
# Add extra params in contained in function signature
|
||||
for key, value in extra_params.items():
|
||||
if key in sig.parameters:
|
||||
params[key] = value
|
||||
|
||||
if "__user__" in sig.parameters:
|
||||
__user__ = {
|
||||
"id": user.id,
|
||||
"email": user.email,
|
||||
"name": user.name,
|
||||
"role": user.role,
|
||||
}
|
||||
|
||||
try:
|
||||
if hasattr(function_module, "UserValves"):
|
||||
__user__["valves"] = function_module.UserValves(
|
||||
**Functions.get_user_valves_by_id_and_user_id(
|
||||
action_id, user.id
|
||||
)
|
||||
)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
params = {**params, "__user__": __user__}
|
||||
|
||||
if inspect.iscoroutinefunction(action):
|
||||
data = await action(**params)
|
||||
else:
|
||||
data = action(**params)
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error: {e}")
|
||||
return JSONResponse(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
content={"detail": str(e)},
|
||||
)
|
||||
|
||||
return data
|
||||
|
||||
|
||||
##################################
|
||||
#
|
||||
# Task Endpoints
|
||||
@@ -1314,7 +1480,7 @@ async def generate_title(form_data: dict, user=Depends(get_verified_user)):
|
||||
"stream": False,
|
||||
"max_tokens": 50,
|
||||
"chat_id": form_data.get("chat_id", None),
|
||||
"task": TASKS.TITLE_GENERATION,
|
||||
"task": str(TASKS.TITLE_GENERATION),
|
||||
}
|
||||
|
||||
log.debug(payload)
|
||||
@@ -1367,7 +1533,7 @@ async def generate_search_query(form_data: dict, user=Depends(get_verified_user)
|
||||
"messages": [{"role": "user", "content": content}],
|
||||
"stream": False,
|
||||
"max_tokens": 30,
|
||||
"task": TASKS.QUERY_GENERATION,
|
||||
"task": str(TASKS.QUERY_GENERATION),
|
||||
}
|
||||
|
||||
print(payload)
|
||||
@@ -1424,7 +1590,7 @@ Message: """{{prompt}}"""
|
||||
"stream": False,
|
||||
"max_tokens": 4,
|
||||
"chat_id": form_data.get("chat_id", None),
|
||||
"task": TASKS.EMOJI_GENERATION,
|
||||
"task": str(TASKS.EMOJI_GENERATION),
|
||||
}
|
||||
|
||||
log.debug(payload)
|
||||
@@ -1577,7 +1743,6 @@ class AddPipelineForm(BaseModel):
|
||||
|
||||
@app.post("/api/pipelines/add")
|
||||
async def add_pipeline(form_data: AddPipelineForm, user=Depends(get_admin_user)):
|
||||
|
||||
r = None
|
||||
try:
|
||||
urlIdx = form_data.urlIdx
|
||||
@@ -1620,7 +1785,6 @@ class DeletePipelineForm(BaseModel):
|
||||
|
||||
@app.delete("/api/pipelines/delete")
|
||||
async def delete_pipeline(form_data: DeletePipelineForm, user=Depends(get_admin_user)):
|
||||
|
||||
r = None
|
||||
try:
|
||||
urlIdx = form_data.urlIdx
|
||||
@@ -1698,7 +1862,6 @@ async def get_pipeline_valves(
|
||||
models = await get_all_models()
|
||||
r = None
|
||||
try:
|
||||
|
||||
url = openai_app.state.config.OPENAI_API_BASE_URLS[urlIdx]
|
||||
key = openai_app.state.config.OPENAI_API_KEYS[urlIdx]
|
||||
|
||||
@@ -1833,6 +1996,7 @@ async def get_app_config():
|
||||
"auth": WEBUI_AUTH,
|
||||
"auth_trusted_header": bool(webui_app.state.AUTH_TRUSTED_EMAIL_HEADER),
|
||||
"enable_signup": webui_app.state.config.ENABLE_SIGNUP,
|
||||
"enable_login_form": webui_app.state.config.ENABLE_LOGIN_FORM,
|
||||
"enable_web_search": rag_app.state.config.ENABLE_RAG_WEB_SEARCH,
|
||||
"enable_image_generation": images_app.state.config.ENABLED,
|
||||
"enable_community_sharing": webui_app.state.config.ENABLE_COMMUNITY_SHARING,
|
||||
@@ -1949,6 +2113,7 @@ for provider_name, provider_config in OAUTH_PROVIDERS.items():
|
||||
client_kwargs={
|
||||
"scope": provider_config["scope"],
|
||||
},
|
||||
redirect_uri=provider_config["redirect_uri"],
|
||||
)
|
||||
|
||||
# SessionMiddleware is used by authlib for oauth
|
||||
@@ -1966,7 +2131,10 @@ if len(OAUTH_PROVIDERS) > 0:
|
||||
async def oauth_login(provider: str, request: Request):
|
||||
if provider not in OAUTH_PROVIDERS:
|
||||
raise HTTPException(404)
|
||||
redirect_uri = request.url_for("oauth_callback", provider=provider)
|
||||
# If the provider has a custom redirect URL, use that, otherwise automatically generate one
|
||||
redirect_uri = OAUTH_PROVIDERS[provider].get("redirect_uri") or request.url_for(
|
||||
"oauth_callback", provider=provider
|
||||
)
|
||||
return await oauth.create_client(provider).authorize_redirect(request, redirect_uri)
|
||||
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ config = context.config
|
||||
# Interpret the config file for Python logging.
|
||||
# This line sets up loggers basically.
|
||||
if config.config_file_name is not None:
|
||||
fileConfig(config.config_file_name)
|
||||
fileConfig(config.config_file_name, disable_existing_loggers=False)
|
||||
|
||||
# add your model's MetaData object here
|
||||
# for 'autogenerate' support
|
||||
|
||||
+12
-10
@@ -1,6 +1,6 @@
|
||||
fastapi==0.111.0
|
||||
uvicorn[standard]==0.22.0
|
||||
pydantic==2.7.1
|
||||
pydantic==2.8.2
|
||||
python-multipart==0.0.9
|
||||
|
||||
Flask==3.0.3
|
||||
@@ -12,7 +12,7 @@ passlib[bcrypt]==1.7.4
|
||||
|
||||
requests==2.32.3
|
||||
aiohttp==3.9.5
|
||||
sqlalchemy==2.0.30
|
||||
sqlalchemy==2.0.31
|
||||
alembic==1.13.2
|
||||
peewee==3.17.6
|
||||
peewee-migrate==1.12.2
|
||||
@@ -30,19 +30,20 @@ APScheduler==3.10.4
|
||||
# AI libraries
|
||||
openai
|
||||
anthropic
|
||||
google-generativeai==0.5.4
|
||||
google-generativeai==0.7.2
|
||||
tiktoken
|
||||
|
||||
langchain==0.2.6
|
||||
langchain-community==0.2.6
|
||||
langchain==0.2.11
|
||||
langchain-community==0.2.10
|
||||
langchain-chroma==0.1.2
|
||||
|
||||
fake-useragent==1.5.1
|
||||
chromadb==0.5.3
|
||||
chromadb==0.5.4
|
||||
sentence-transformers==3.0.1
|
||||
pypdf==4.2.0
|
||||
docx2txt==0.8
|
||||
python-pptx==0.6.23
|
||||
unstructured==0.14.9
|
||||
unstructured==0.15.0
|
||||
Markdown==3.6
|
||||
pypandoc==1.13
|
||||
pandas==2.2.2
|
||||
@@ -50,9 +51,10 @@ openpyxl==3.1.5
|
||||
pyxlsb==1.0.10
|
||||
xlrd==2.0.1
|
||||
validators==0.28.1
|
||||
psutil
|
||||
|
||||
opencv-python-headless==4.10.0.84
|
||||
rapidocr-onnxruntime==1.3.22
|
||||
rapidocr-onnxruntime==1.3.24
|
||||
|
||||
fpdf2==2.7.9
|
||||
rank-bm25==0.2.2
|
||||
@@ -63,13 +65,13 @@ PyJWT[crypto]==2.8.0
|
||||
authlib==1.3.1
|
||||
|
||||
black==24.4.2
|
||||
langfuse==2.38.0
|
||||
langfuse==2.39.2
|
||||
youtube-transcript-api==0.6.2
|
||||
pytube==15.0.0
|
||||
|
||||
extract_msg
|
||||
pydub
|
||||
duckduckgo-search~=6.1.7
|
||||
duckduckgo-search~=6.2.1
|
||||
|
||||
## Tests
|
||||
docker~=7.1.0
|
||||
|
||||
+54
-32
@@ -1,6 +1,5 @@
|
||||
from pathlib import Path
|
||||
import hashlib
|
||||
import json
|
||||
import re
|
||||
from datetime import timedelta
|
||||
from typing import Optional, List, Tuple
|
||||
@@ -8,37 +7,39 @@ import uuid
|
||||
import time
|
||||
|
||||
|
||||
def get_last_user_message_item(messages: List[dict]) -> str:
|
||||
def get_last_user_message_item(messages: List[dict]) -> Optional[dict]:
|
||||
for message in reversed(messages):
|
||||
if message["role"] == "user":
|
||||
return message
|
||||
return None
|
||||
|
||||
|
||||
def get_last_user_message(messages: List[dict]) -> str:
|
||||
message = get_last_user_message_item(messages)
|
||||
|
||||
if message is not None:
|
||||
if isinstance(message["content"], list):
|
||||
for item in message["content"]:
|
||||
if item["type"] == "text":
|
||||
return item["text"]
|
||||
def get_content_from_message(message: dict) -> Optional[str]:
|
||||
if isinstance(message["content"], list):
|
||||
for item in message["content"]:
|
||||
if item["type"] == "text":
|
||||
return item["text"]
|
||||
else:
|
||||
return message["content"]
|
||||
return None
|
||||
|
||||
|
||||
def get_last_assistant_message(messages: List[dict]) -> str:
|
||||
def get_last_user_message(messages: List[dict]) -> Optional[str]:
|
||||
message = get_last_user_message_item(messages)
|
||||
if message is None:
|
||||
return None
|
||||
|
||||
return get_content_from_message(message)
|
||||
|
||||
|
||||
def get_last_assistant_message(messages: List[dict]) -> Optional[str]:
|
||||
for message in reversed(messages):
|
||||
if message["role"] == "assistant":
|
||||
if isinstance(message["content"], list):
|
||||
for item in message["content"]:
|
||||
if item["type"] == "text":
|
||||
return item["text"]
|
||||
return message["content"]
|
||||
return get_content_from_message(message)
|
||||
return None
|
||||
|
||||
|
||||
def get_system_message(messages: List[dict]) -> dict:
|
||||
def get_system_message(messages: List[dict]) -> Optional[dict]:
|
||||
for message in messages:
|
||||
if message["role"] == "system":
|
||||
return message
|
||||
@@ -49,10 +50,25 @@ def remove_system_message(messages: List[dict]) -> List[dict]:
|
||||
return [message for message in messages if message["role"] != "system"]
|
||||
|
||||
|
||||
def pop_system_message(messages: List[dict]) -> Tuple[dict, List[dict]]:
|
||||
def pop_system_message(messages: List[dict]) -> Tuple[Optional[dict], List[dict]]:
|
||||
return get_system_message(messages), remove_system_message(messages)
|
||||
|
||||
|
||||
def prepend_to_first_user_message_content(
|
||||
content: str, messages: List[dict]
|
||||
) -> List[dict]:
|
||||
for message in messages:
|
||||
if message["role"] == "user":
|
||||
if isinstance(message["content"], list):
|
||||
for item in message["content"]:
|
||||
if item["type"] == "text":
|
||||
item["text"] = f"{content}\n{item['text']}"
|
||||
else:
|
||||
message["content"] = f"{content}\n{message['content']}"
|
||||
break
|
||||
return messages
|
||||
|
||||
|
||||
def add_or_update_system_message(content: str, messages: List[dict]):
|
||||
"""
|
||||
Adds a new system message at the beginning of the messages list
|
||||
@@ -72,23 +88,29 @@ def add_or_update_system_message(content: str, messages: List[dict]):
|
||||
return messages
|
||||
|
||||
|
||||
def stream_message_template(model: str, message: str):
|
||||
def openai_chat_message_template(model: str):
|
||||
return {
|
||||
"id": f"{model}-{str(uuid.uuid4())}",
|
||||
"object": "chat.completion.chunk",
|
||||
"created": int(time.time()),
|
||||
"model": model,
|
||||
"choices": [
|
||||
{
|
||||
"index": 0,
|
||||
"delta": {"content": message},
|
||||
"logprobs": None,
|
||||
"finish_reason": None,
|
||||
}
|
||||
],
|
||||
"choices": [{"index": 0, "logprobs": None, "finish_reason": None}],
|
||||
}
|
||||
|
||||
|
||||
def openai_chat_chunk_message_template(model: str, message: str):
|
||||
template = openai_chat_message_template(model)
|
||||
template["object"] = "chat.completion.chunk"
|
||||
template["choices"][0]["delta"] = {"content": message}
|
||||
return template
|
||||
|
||||
|
||||
def openai_chat_completion_message_template(model: str, message: str):
|
||||
template = openai_chat_message_template(model)
|
||||
template["object"] = "chat.completion"
|
||||
template["choices"][0]["message"] = {"content": message, "role": "assistant"}
|
||||
template["choices"][0]["finish_reason"] = "stop"
|
||||
|
||||
|
||||
def get_gravatar_url(email):
|
||||
# Trim leading and trailing whitespace from
|
||||
# an email address and force all characters
|
||||
@@ -159,7 +181,7 @@ def extract_folders_after_data_docs(path):
|
||||
tags = []
|
||||
|
||||
folders = parts[index_docs:-1]
|
||||
for idx, part in enumerate(folders):
|
||||
for idx, _ in enumerate(folders):
|
||||
tags.append("/".join(folders[: idx + 1]))
|
||||
|
||||
return tags
|
||||
@@ -255,11 +277,11 @@ def parse_ollama_modelfile(model_text):
|
||||
value = param_match.group(1)
|
||||
|
||||
try:
|
||||
if param_type == int:
|
||||
if param_type is int:
|
||||
value = int(value)
|
||||
elif param_type == float:
|
||||
elif param_type is float:
|
||||
value = float(value)
|
||||
elif param_type == bool:
|
||||
elif param_type is bool:
|
||||
value = value.lower() == "true"
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque elit eget gravida cum sociis natoque. Morbi tristique senectus et netus et malesuada. Sapien nec sagittis aliquam malesuada bibendum. Amet consectetur adipiscing elit duis tristique sollicitudin. Non pulvinar neque laoreet suspendisse interdum consectetur libero. Arcu cursus vitae congue mauris rhoncus aenean vel elit scelerisque. Nec feugiat nisl pretium fusce id velit. Imperdiet proin fermentum leo vel. Arcu dui vivamus arcu felis bibendum ut tristique et egestas. Pellentesque sit amet porttitor eget dolor morbi non arcu risus. Egestas tellus rutrum tellus pellentesque eu tincidunt tortor aliquam. Et ultrices neque ornare aenean euismod.
|
||||
|
||||
Enim nulla aliquet porttitor lacus luctus accumsan tortor posuere ac. Viverra nibh cras pulvinar mattis nunc. Lacinia at quis risus sed vulputate. Ac tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Bibendum arcu vitae elementum curabitur vitae nunc. Consectetur adipiscing elit duis tristique sollicitudin nibh sit amet commodo. Velit egestas dui id ornare arcu odio ut. Et malesuada fames ac turpis egestas integer eget aliquet. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Morbi tristique senectus et netus. Pretium viverra suspendisse potenti nullam ac tortor vitae. Parturient montes nascetur ridiculus mus mauris vitae. Quis viverra nibh cras pulvinar mattis nunc sed blandit libero. Euismod nisi porta lorem mollis aliquam ut porttitor leo. Mauris in aliquam sem fringilla ut morbi. Faucibus pulvinar elementum integer enim neque. Neque sodales ut etiam sit. Consectetur a erat nam at.
|
||||
|
||||
Sed nisi lacus sed viverra tellus in hac habitasse. Proin sagittis nisl rhoncus mattis rhoncus. Risus commodo viverra maecenas accumsan lacus. Morbi quis commodo odio aenean sed adipiscing. Mollis nunc sed id semper risus in. Ultricies mi eget mauris pharetra et ultrices neque. Amet luctus venenatis lectus magna fringilla urna porttitor rhoncus. Eget magna fermentum iaculis eu non diam phasellus. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Id donec ultrices tincidunt arcu non sodales. Sed cras ornare arcu dui vivamus arcu felis bibendum ut. Urna duis convallis convallis tellus id interdum velit. Rhoncus mattis rhoncus urna neque viverra justo nec. Purus semper eget duis at tellus at urna condimentum. Et odio pellentesque diam volutpat commodo sed egestas. Blandit volutpat maecenas volutpat blandit. In egestas erat imperdiet sed euismod nisi porta lorem mollis. Est ullamcorper eget nulla facilisi etiam dignissim.
|
||||
|
||||
Justo nec ultrices dui sapien eget mi proin sed. Purus gravida quis blandit turpis cursus in hac. Placerat orci nulla pellentesque dignissim enim sit. Morbi tristique senectus et netus et malesuada fames ac. Consequat mauris nunc congue nisi. Eu lobortis elementum nibh tellus molestie nunc non blandit. Viverra justo nec ultrices dui. Morbi non arcu risus quis. Elementum sagittis vitae et leo duis. Lectus mauris ultrices eros in cursus. Neque laoreet suspendisse interdum consectetur.
|
||||
|
||||
Facilisis gravida neque convallis a cras. Nisl rhoncus mattis rhoncus urna neque viverra justo. Faucibus purus in massa tempor. Lacus laoreet non curabitur gravida arcu ac tortor. Tincidunt eget nullam non nisi est sit amet. Ornare lectus sit amet est placerat in egestas. Sollicitudin tempor id eu nisl nunc mi. Scelerisque viverra mauris in aliquam sem fringilla ut. Ullamcorper sit amet risus nullam. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Velit euismod in pellentesque massa placerat duis ultricies lacus. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros in. Lorem ipsum dolor sit amet. Sit amet mauris commodo quis imperdiet. Quam pellentesque nec nam aliquam sem et tortor. Amet nisl purus in mollis nunc. Sed risus pretium quam vulputate dignissim suspendisse in est. Nisl condimentum id venenatis a condimentum. Velit euismod in pellentesque massa. Quam id leo in vitae turpis massa sed.
|
||||
@@ -0,0 +1,46 @@
|
||||
// eslint-disable-next-line @typescript-eslint/triple-slash-reference
|
||||
/// <reference path="../support/index.d.ts" />
|
||||
|
||||
describe('Documents', () => {
|
||||
const timestamp = Date.now();
|
||||
|
||||
before(() => {
|
||||
cy.uploadTestDocument(timestamp);
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cy.deleteTestDocument(timestamp);
|
||||
});
|
||||
|
||||
context('Admin', () => {
|
||||
beforeEach(() => {
|
||||
// Login as the admin user
|
||||
cy.loginAdmin();
|
||||
// Visit the home page
|
||||
cy.visit('/workspace/documents');
|
||||
cy.get('button').contains('#cypress-test').click();
|
||||
});
|
||||
|
||||
it('can see documents', () => {
|
||||
cy.get('div').contains(`document-test-initial-${timestamp}.txt`).should('have.length', 1);
|
||||
});
|
||||
|
||||
it('can see edit button', () => {
|
||||
cy.get('div')
|
||||
.contains(`document-test-initial-${timestamp}.txt`)
|
||||
.get("button[aria-label='Edit Doc']")
|
||||
.should('exist');
|
||||
});
|
||||
|
||||
it('can see delete button', () => {
|
||||
cy.get('div')
|
||||
.contains(`document-test-initial-${timestamp}.txt`)
|
||||
.get("button[aria-label='Delete Doc']")
|
||||
.should('exist');
|
||||
});
|
||||
|
||||
it('can see upload button', () => {
|
||||
cy.get("button[aria-label='Add Docs']").should('exist');
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,4 +1,6 @@
|
||||
/// <reference types="cypress" />
|
||||
// eslint-disable-next-line @typescript-eslint/triple-slash-reference
|
||||
/// <reference path="../support/index.d.ts" />
|
||||
|
||||
export const adminUser = {
|
||||
name: 'Admin User',
|
||||
@@ -10,6 +12,9 @@ const login = (email: string, password: string) => {
|
||||
return cy.session(
|
||||
email,
|
||||
() => {
|
||||
// Make sure to test against us english to have stable tests,
|
||||
// regardless on local language preferences
|
||||
localStorage.setItem('locale', 'en-US');
|
||||
// Visit auth page
|
||||
cy.visit('/auth');
|
||||
// Fill out the form
|
||||
@@ -68,6 +73,50 @@ Cypress.Commands.add('register', (name, email, password) => register(name, email
|
||||
Cypress.Commands.add('registerAdmin', () => registerAdmin());
|
||||
Cypress.Commands.add('loginAdmin', () => loginAdmin());
|
||||
|
||||
Cypress.Commands.add('uploadTestDocument', (suffix: any) => {
|
||||
// Login as admin
|
||||
cy.loginAdmin();
|
||||
// upload example document
|
||||
cy.visit('/workspace/documents');
|
||||
// Create a document
|
||||
cy.get("button[aria-label='Add Docs']").click();
|
||||
cy.readFile('cypress/data/example-doc.txt').then((text) => {
|
||||
// select file
|
||||
cy.get('#upload-doc-input').selectFile(
|
||||
{
|
||||
contents: Cypress.Buffer.from(text + Date.now()),
|
||||
fileName: `document-test-initial-${suffix}.txt`,
|
||||
mimeType: 'text/plain',
|
||||
lastModified: Date.now()
|
||||
},
|
||||
{
|
||||
force: true
|
||||
}
|
||||
);
|
||||
// open tag input
|
||||
cy.get("button[aria-label='Add Tag']").click();
|
||||
cy.get("input[placeholder='Add a tag']").type('cypress-test');
|
||||
cy.get("button[aria-label='Save Tag']").click();
|
||||
|
||||
// submit to upload
|
||||
cy.get("button[type='submit']").click();
|
||||
|
||||
// wait for upload to finish
|
||||
cy.get('button').contains('#cypress-test').should('exist');
|
||||
cy.get('div').contains(`document-test-initial-${suffix}.txt`).should('exist');
|
||||
});
|
||||
});
|
||||
|
||||
Cypress.Commands.add('deleteTestDocument', (suffix: any) => {
|
||||
cy.loginAdmin();
|
||||
cy.visit('/workspace/documents');
|
||||
// clean up uploaded documents
|
||||
cy.get('div')
|
||||
.contains(`document-test-initial-${suffix}.txt`)
|
||||
.find("button[aria-label='Delete Doc']")
|
||||
.click();
|
||||
});
|
||||
|
||||
before(() => {
|
||||
cy.registerAdmin();
|
||||
});
|
||||
|
||||
Vendored
+2
@@ -7,5 +7,7 @@ declare namespace Cypress {
|
||||
register(name: string, email: string, password: string): Chainable<Element>;
|
||||
registerAdmin(): Chainable<Element>;
|
||||
loginAdmin(): Chainable<Element>;
|
||||
uploadTestDocument(suffix: any): Chainable<Element>;
|
||||
deleteTestDocument(suffix: any): Chainable<Element>;
|
||||
}
|
||||
}
|
||||
|
||||
Generated
+11
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "open-webui",
|
||||
"version": "0.3.8",
|
||||
"version": "0.3.11",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "open-webui",
|
||||
"version": "0.3.8",
|
||||
"version": "0.3.11",
|
||||
"dependencies": {
|
||||
"@codemirror/lang-javascript": "^6.2.2",
|
||||
"@codemirror/lang-python": "^6.1.6",
|
||||
@@ -20,6 +20,7 @@
|
||||
"dayjs": "^1.11.10",
|
||||
"eventsource-parser": "^1.1.2",
|
||||
"file-saver": "^2.0.5",
|
||||
"fuse.js": "^7.0.0",
|
||||
"highlight.js": "^11.9.0",
|
||||
"i18next": "^23.10.0",
|
||||
"i18next-browser-languagedetector": "^7.2.0",
|
||||
@@ -4820,6 +4821,14 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/fuse.js": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.0.0.tgz",
|
||||
"integrity": "sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q==",
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/gc-hook": {
|
||||
"version": "0.3.1",
|
||||
"resolved": "https://registry.npmjs.org/gc-hook/-/gc-hook-0.3.1.tgz",
|
||||
|
||||
+2
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "open-webui",
|
||||
"version": "0.3.8",
|
||||
"version": "0.3.11",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "npm run pyodide:fetch && vite dev --host",
|
||||
@@ -60,6 +60,7 @@
|
||||
"dayjs": "^1.11.10",
|
||||
"eventsource-parser": "^1.1.2",
|
||||
"file-saver": "^2.0.5",
|
||||
"fuse.js": "^7.0.0",
|
||||
"highlight.js": "^11.9.0",
|
||||
"i18next": "^23.10.0",
|
||||
"i18next-browser-languagedetector": "^7.2.0",
|
||||
|
||||
+2
-2
@@ -23,7 +23,7 @@ dependencies = [
|
||||
"peewee==3.17.5",
|
||||
"peewee-migrate==1.12.2",
|
||||
"psycopg2-binary==2.9.9",
|
||||
"PyMySQL==1.1.0",
|
||||
"PyMySQL==1.1.1",
|
||||
"bcrypt==4.1.3",
|
||||
|
||||
"boto3==1.34.110",
|
||||
@@ -33,7 +33,7 @@ dependencies = [
|
||||
"google-generativeai==0.5.4",
|
||||
|
||||
"langchain==0.2.0",
|
||||
"langchain-community==0.2.0",
|
||||
"langchain-community==0.2.9",
|
||||
"langchain-chroma==0.1.1",
|
||||
|
||||
"fake-useragent==1.5.1",
|
||||
|
||||
@@ -154,3 +154,7 @@ input[type='number'] {
|
||||
.tippy-box[data-theme~='dark'] {
|
||||
@apply rounded-lg bg-gray-950 text-xs border border-gray-900 shadow-xl;
|
||||
}
|
||||
|
||||
.password {
|
||||
-webkit-text-security: disc;
|
||||
}
|
||||
|
||||
+5
-2
@@ -65,6 +65,7 @@
|
||||
|
||||
%sveltekit.head%
|
||||
</head>
|
||||
|
||||
<body data-sveltekit-preload-data="hover">
|
||||
<div style="display: contents">%sveltekit.body%</div>
|
||||
|
||||
@@ -86,7 +87,7 @@
|
||||
height: 6rem;
|
||||
top: 44%;
|
||||
left: 50%;
|
||||
margin-left: -3rem;
|
||||
transform: translateX(-50%);
|
||||
"
|
||||
src="/static/splash.png"
|
||||
/>
|
||||
@@ -98,7 +99,7 @@
|
||||
left: 50%;
|
||||
|
||||
width: 24rem;
|
||||
margin-left: -12rem;
|
||||
transform: translateX(-50%);
|
||||
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -154,6 +155,7 @@
|
||||
#splash-screen {
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
html.dark #splash-screen {
|
||||
background: #000;
|
||||
}
|
||||
@@ -210,6 +212,7 @@
|
||||
opacity: 0.65;
|
||||
}
|
||||
}
|
||||
|
||||
.animate-pulse-fast {
|
||||
animation: pulse 1.5s cubic-bezier(0.4, 0, 0.6, 1) infinite;
|
||||
}
|
||||
|
||||
@@ -131,3 +131,59 @@ export const synthesizeOpenAISpeech = async (
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
export const getModels = async (token: string = '') => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${AUDIO_API_BASE_URL}/models`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
Authorization: `Bearer ${token}`
|
||||
}
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.catch((err) => {
|
||||
error = err.detail;
|
||||
console.log(err);
|
||||
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
export const getVoices = async (token: string = '') => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${AUDIO_API_BASE_URL}/voices`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
Authorization: `Bearer ${token}`
|
||||
}
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.catch((err) => {
|
||||
error = err.detail;
|
||||
console.log(err);
|
||||
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
@@ -104,6 +104,45 @@ export const chatCompleted = async (token: string, body: ChatCompletedForm) => {
|
||||
return res;
|
||||
};
|
||||
|
||||
type ChatActionForm = {
|
||||
model: string;
|
||||
messages: string[];
|
||||
chat_id: string;
|
||||
};
|
||||
|
||||
export const chatAction = async (token: string, action_id: string, body: ChatActionForm) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_BASE_URL}/api/chat/actions/${action_id}`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
...(token && { authorization: `Bearer ${token}` })
|
||||
},
|
||||
body: JSON.stringify(body)
|
||||
})
|
||||
.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 = err;
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
export const getTaskConfig = async (token: string = '') => {
|
||||
let error = null;
|
||||
|
||||
|
||||
@@ -425,7 +425,7 @@ export const resetUploadDir = async (token: string) => {
|
||||
export const resetVectorDB = async (token: string) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${RAG_API_BASE_URL}/reset`, {
|
||||
const res = await fetch(`${RAG_API_BASE_URL}/reset/db`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
|
||||
@@ -1,13 +1,19 @@
|
||||
<script lang="ts">
|
||||
import { getAudioConfig, updateAudioConfig } from '$lib/apis/audio';
|
||||
import { user, settings, config } from '$lib/stores';
|
||||
import { createEventDispatcher, onMount, getContext } from 'svelte';
|
||||
import { toast } from 'svelte-sonner';
|
||||
import Switch from '$lib/components/common/Switch.svelte';
|
||||
import { getBackendConfig } from '$lib/apis';
|
||||
import SensitiveInput from '$lib/components/common/SensitiveInput.svelte';
|
||||
import { createEventDispatcher, onMount, getContext } from 'svelte';
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
import { getBackendConfig } from '$lib/apis';
|
||||
import {
|
||||
getAudioConfig,
|
||||
updateAudioConfig,
|
||||
getModels as _getModels,
|
||||
getVoices as _getVoices
|
||||
} from '$lib/apis/audio';
|
||||
import { user, settings, config } from '$lib/stores';
|
||||
|
||||
import SensitiveInput from '$lib/components/common/SensitiveInput.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let saveHandler: Function;
|
||||
@@ -16,6 +22,7 @@
|
||||
|
||||
let TTS_OPENAI_API_BASE_URL = '';
|
||||
let TTS_OPENAI_API_KEY = '';
|
||||
let TTS_API_KEY = '';
|
||||
let TTS_ENGINE = '';
|
||||
let TTS_MODEL = '';
|
||||
let TTS_VOICE = '';
|
||||
@@ -29,30 +36,41 @@
|
||||
let models = [];
|
||||
let nonLocalVoices = false;
|
||||
|
||||
const getOpenAIVoices = () => {
|
||||
voices = [
|
||||
{ name: 'alloy' },
|
||||
{ name: 'echo' },
|
||||
{ name: 'fable' },
|
||||
{ name: 'onyx' },
|
||||
{ name: 'nova' },
|
||||
{ name: 'shimmer' }
|
||||
];
|
||||
};
|
||||
const getModels = async () => {
|
||||
if (TTS_ENGINE === '') {
|
||||
models = [];
|
||||
} else {
|
||||
const res = await _getModels(localStorage.token).catch((e) => {
|
||||
toast.error(e);
|
||||
});
|
||||
|
||||
const getOpenAIModels = () => {
|
||||
models = [{ name: 'tts-1' }, { name: 'tts-1-hd' }];
|
||||
};
|
||||
|
||||
const getWebAPIVoices = () => {
|
||||
const getVoicesLoop = setInterval(async () => {
|
||||
voices = await speechSynthesis.getVoices();
|
||||
|
||||
// do your loop
|
||||
if (voices.length > 0) {
|
||||
clearInterval(getVoicesLoop);
|
||||
if (res) {
|
||||
console.log(res);
|
||||
models = res.models;
|
||||
}
|
||||
}, 100);
|
||||
}
|
||||
};
|
||||
|
||||
const getVoices = async () => {
|
||||
if (TTS_ENGINE === '') {
|
||||
const getVoicesLoop = setInterval(async () => {
|
||||
voices = await speechSynthesis.getVoices();
|
||||
|
||||
// do your loop
|
||||
if (voices.length > 0) {
|
||||
clearInterval(getVoicesLoop);
|
||||
}
|
||||
}, 100);
|
||||
} else {
|
||||
const res = await _getVoices(localStorage.token).catch((e) => {
|
||||
toast.error(e);
|
||||
});
|
||||
|
||||
if (res) {
|
||||
console.log(res);
|
||||
voices = res.voices;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const updateConfigHandler = async () => {
|
||||
@@ -60,6 +78,7 @@
|
||||
tts: {
|
||||
OPENAI_API_BASE_URL: TTS_OPENAI_API_BASE_URL,
|
||||
OPENAI_API_KEY: TTS_OPENAI_API_KEY,
|
||||
API_KEY: TTS_API_KEY,
|
||||
ENGINE: TTS_ENGINE,
|
||||
MODEL: TTS_MODEL,
|
||||
VOICE: TTS_VOICE
|
||||
@@ -86,6 +105,7 @@
|
||||
console.log(res);
|
||||
TTS_OPENAI_API_BASE_URL = res.tts.OPENAI_API_BASE_URL;
|
||||
TTS_OPENAI_API_KEY = res.tts.OPENAI_API_KEY;
|
||||
TTS_API_KEY = res.tts.API_KEY;
|
||||
|
||||
TTS_ENGINE = res.tts.ENGINE;
|
||||
TTS_MODEL = res.tts.MODEL;
|
||||
@@ -98,12 +118,8 @@
|
||||
STT_MODEL = res.stt.MODEL;
|
||||
}
|
||||
|
||||
if (TTS_ENGINE === 'openai') {
|
||||
getOpenAIVoices();
|
||||
getOpenAIModels();
|
||||
} else {
|
||||
getWebAPIVoices();
|
||||
}
|
||||
await getVoices();
|
||||
await getModels();
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -138,7 +154,7 @@
|
||||
<div>
|
||||
<div class="mt-1 flex gap-2 mb-1">
|
||||
<input
|
||||
class="flex-1 w-full rounded-l-lg py-2 pl-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
class="flex-1 w-full rounded-lg py-2 pl-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
placeholder={$i18n.t('API Base URL')}
|
||||
bind:value={STT_OPENAI_API_BASE_URL}
|
||||
required
|
||||
@@ -182,19 +198,23 @@
|
||||
class=" dark:bg-gray-900 w-fit pr-8 rounded px-2 p-1 text-xs bg-transparent outline-none text-right"
|
||||
bind:value={TTS_ENGINE}
|
||||
placeholder="Select a mode"
|
||||
on:change={(e) => {
|
||||
on:change={async (e) => {
|
||||
await updateConfigHandler();
|
||||
await getVoices();
|
||||
await getModels();
|
||||
|
||||
if (e.target.value === 'openai') {
|
||||
getOpenAIVoices();
|
||||
TTS_VOICE = 'alloy';
|
||||
TTS_MODEL = 'tts-1';
|
||||
} else {
|
||||
getWebAPIVoices();
|
||||
TTS_VOICE = '';
|
||||
TTS_MODEL = '';
|
||||
}
|
||||
}}
|
||||
>
|
||||
<option value="">{$i18n.t('Web API')}</option>
|
||||
<option value="openai">{$i18n.t('OpenAI')}</option>
|
||||
<option value="elevenlabs">{$i18n.t('ElevenLabs')}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
@@ -203,7 +223,7 @@
|
||||
<div>
|
||||
<div class="mt-1 flex gap-2 mb-1">
|
||||
<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"
|
||||
class="flex-1 w-full rounded-lg py-2 pl-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
placeholder={$i18n.t('API Base URL')}
|
||||
bind:value={TTS_OPENAI_API_BASE_URL}
|
||||
required
|
||||
@@ -212,6 +232,17 @@
|
||||
<SensitiveInput placeholder={$i18n.t('API Key')} bind:value={TTS_OPENAI_API_KEY} />
|
||||
</div>
|
||||
</div>
|
||||
{:else if TTS_ENGINE === 'elevenlabs'}
|
||||
<div>
|
||||
<div class="mt-1 flex gap-2 mb-1">
|
||||
<input
|
||||
class="flex-1 w-full rounded-lg py-2 pl-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={TTS_API_KEY}
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<hr class=" dark:border-gray-850 my-2" />
|
||||
@@ -252,7 +283,7 @@
|
||||
|
||||
<datalist id="voice-list">
|
||||
{#each voices as voice}
|
||||
<option value={voice.name} />
|
||||
<option value={voice.id}>{voice.name}</option>
|
||||
{/each}
|
||||
</datalist>
|
||||
</div>
|
||||
@@ -263,15 +294,56 @@
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
list="model-list"
|
||||
list="tts-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={TTS_MODEL}
|
||||
placeholder="Select a model"
|
||||
/>
|
||||
|
||||
<datalist id="model-list">
|
||||
<datalist id="tts-model-list">
|
||||
{#each models as model}
|
||||
<option value={model.name} />
|
||||
<option value={model.id} />
|
||||
{/each}
|
||||
</datalist>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{:else if TTS_ENGINE === 'elevenlabs'}
|
||||
<div class=" flex gap-2">
|
||||
<div class="w-full">
|
||||
<div class=" mb-1.5 text-sm font-medium">{$i18n.t('TTS Voice')}</div>
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
list="voice-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={TTS_VOICE}
|
||||
placeholder="Select a voice"
|
||||
/>
|
||||
|
||||
<datalist id="voice-list">
|
||||
{#each voices as voice}
|
||||
<option value={voice.id}>{voice.name}</option>
|
||||
{/each}
|
||||
</datalist>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="w-full">
|
||||
<div class=" mb-1.5 text-sm font-medium">{$i18n.t('TTS Model')}</div>
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
list="tts-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={TTS_MODEL}
|
||||
placeholder="Select a model"
|
||||
/>
|
||||
|
||||
<datalist id="tts-model-list">
|
||||
{#each models as model}
|
||||
<option value={model.id} />
|
||||
{/each}
|
||||
</datalist>
|
||||
</div>
|
||||
|
||||
@@ -269,7 +269,7 @@
|
||||
saveHandler();
|
||||
}}
|
||||
>
|
||||
<div class=" space-y-2.5 overflow-y-scroll scrollbar-hidden h-full">
|
||||
<div class=" space-y-2.5 overflow-y-scroll scrollbar-hidden h-full pr-1.5">
|
||||
<div class="flex flex-col gap-0.5">
|
||||
<div class=" mb-0.5 text-sm font-medium">{$i18n.t('General Settings')}</div>
|
||||
|
||||
@@ -615,7 +615,7 @@
|
||||
<div class=" ">
|
||||
<div class=" text-sm font-medium">{$i18n.t('Query Params')}</div>
|
||||
|
||||
<div class=" flex">
|
||||
<div class=" flex gap-1">
|
||||
<div class=" flex w-full justify-between">
|
||||
<div class="self-center text-xs font-medium min-w-fit">{$i18n.t('Top K')}</div>
|
||||
|
||||
@@ -632,7 +632,7 @@
|
||||
</div>
|
||||
|
||||
{#if querySettings.hybrid === true}
|
||||
<div class="flex w-full">
|
||||
<div class=" flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium min-w-fit">
|
||||
{$i18n.t('Minimum Score')}
|
||||
</div>
|
||||
|
||||
@@ -282,6 +282,7 @@
|
||||
<SensitiveInput
|
||||
placeholder={$i18n.t('Enter api auth string (e.g. username:password)')}
|
||||
bind:value={AUTOMATIC1111_API_AUTH}
|
||||
required={false}
|
||||
/>
|
||||
|
||||
<div class="mt-2 text-xs text-gray-400 dark:text-gray-500">
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
import { createOpenAITextStream } from '$lib/apis/streaming';
|
||||
import { queryMemory } from '$lib/apis/memories';
|
||||
import { getAndUpdateUserLocation, getUserSettings } from '$lib/apis/users';
|
||||
import { chatCompleted, generateTitle, generateSearchQuery } from '$lib/apis';
|
||||
import { chatCompleted, generateTitle, generateSearchQuery, chatAction } from '$lib/apis';
|
||||
|
||||
import Banner from '../common/Banner.svelte';
|
||||
import MessageInput from '$lib/components/chat/MessageInput.svelte';
|
||||
@@ -78,6 +78,9 @@
|
||||
let showEventConfirmation = false;
|
||||
let eventConfirmationTitle = '';
|
||||
let eventConfirmationMessage = '';
|
||||
let eventConfirmationInput = false;
|
||||
let eventConfirmationInputPlaceholder = '';
|
||||
let eventConfirmationInputValue = '';
|
||||
let eventCallback = null;
|
||||
|
||||
let showModelSelector = true;
|
||||
@@ -96,6 +99,8 @@
|
||||
|
||||
let title = '';
|
||||
let prompt = '';
|
||||
|
||||
let chatFiles = [];
|
||||
let files = [];
|
||||
let messages = [];
|
||||
let history = {
|
||||
@@ -156,12 +161,28 @@
|
||||
} else {
|
||||
message.citations = [data];
|
||||
}
|
||||
} else if (type === 'message') {
|
||||
message.content += data.content;
|
||||
} else if (type === 'replace') {
|
||||
message.content = data.content;
|
||||
} else if (type === 'confirmation') {
|
||||
eventCallback = cb;
|
||||
|
||||
eventConfirmationInput = false;
|
||||
showEventConfirmation = true;
|
||||
|
||||
eventConfirmationTitle = data.title;
|
||||
eventConfirmationMessage = data.message;
|
||||
} else if (type === 'input') {
|
||||
eventCallback = cb;
|
||||
|
||||
eventConfirmationInput = true;
|
||||
showEventConfirmation = true;
|
||||
|
||||
eventConfirmationTitle = data.title;
|
||||
eventConfirmationMessage = data.message;
|
||||
eventConfirmationInputPlaceholder = data.placeholder;
|
||||
eventConfirmationInputValue = data?.value ?? '';
|
||||
} else {
|
||||
console.log('Unknown message type', data);
|
||||
}
|
||||
@@ -244,6 +265,8 @@
|
||||
messages: {},
|
||||
currentId: null
|
||||
};
|
||||
|
||||
chatFiles = [];
|
||||
params = {};
|
||||
|
||||
if ($page.url.searchParams.get('models')) {
|
||||
@@ -259,6 +282,10 @@
|
||||
|
||||
if ($page.url.searchParams.get('q')) {
|
||||
prompt = $page.url.searchParams.get('q') ?? '';
|
||||
selectedToolIds = ($page.url.searchParams.get('tool_ids') ?? '')
|
||||
.split(',')
|
||||
.map((id) => id.trim())
|
||||
.filter((id) => id);
|
||||
|
||||
if (prompt) {
|
||||
await tick();
|
||||
@@ -315,6 +342,7 @@
|
||||
}
|
||||
|
||||
params = chatContent?.params ?? {};
|
||||
chatFiles = chatContent?.files ?? [];
|
||||
|
||||
autoScroll = true;
|
||||
await tick();
|
||||
@@ -347,7 +375,7 @@
|
||||
}
|
||||
};
|
||||
|
||||
const chatCompletedHandler = async (modelId, responseMessageId, messages) => {
|
||||
const chatCompletedHandler = async (chatId, modelId, responseMessageId, messages) => {
|
||||
await mermaid.run({
|
||||
querySelector: '.mermaid'
|
||||
});
|
||||
@@ -361,7 +389,7 @@
|
||||
info: m.info ? m.info : undefined,
|
||||
timestamp: m.timestamp
|
||||
})),
|
||||
chat_id: $chatId,
|
||||
chat_id: chatId,
|
||||
session_id: $socket?.id,
|
||||
id: responseMessageId
|
||||
}).catch((error) => {
|
||||
@@ -383,6 +411,65 @@
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
if ($chatId == chatId) {
|
||||
if ($settings.saveChatHistory ?? true) {
|
||||
chat = await updateChatById(localStorage.token, chatId, {
|
||||
models: selectedModels,
|
||||
messages: messages,
|
||||
history: history,
|
||||
params: params,
|
||||
files: chatFiles
|
||||
});
|
||||
await chats.set(await getChatList(localStorage.token));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const chatActionHandler = async (chatId, actionId, modelId, responseMessageId) => {
|
||||
const res = await chatAction(localStorage.token, actionId, {
|
||||
model: modelId,
|
||||
messages: messages.map((m) => ({
|
||||
id: m.id,
|
||||
role: m.role,
|
||||
content: m.content,
|
||||
info: m.info ? m.info : undefined,
|
||||
timestamp: m.timestamp
|
||||
})),
|
||||
chat_id: chatId,
|
||||
session_id: $socket?.id,
|
||||
id: responseMessageId
|
||||
}).catch((error) => {
|
||||
toast.error(error);
|
||||
messages.at(-1).error = { content: error };
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res !== null) {
|
||||
// Update chat history with the new messages
|
||||
for (const message of res.messages) {
|
||||
history.messages[message.id] = {
|
||||
...history.messages[message.id],
|
||||
...(history.messages[message.id].content !== message.content
|
||||
? { originalContent: history.messages[message.id].content }
|
||||
: {}),
|
||||
...message
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
if ($chatId == chatId) {
|
||||
if ($settings.saveChatHistory ?? true) {
|
||||
chat = await updateChatById(localStorage.token, chatId, {
|
||||
models: selectedModels,
|
||||
messages: messages,
|
||||
history: history,
|
||||
params: params,
|
||||
files: chatFiles
|
||||
});
|
||||
await chats.set(await getChatList(localStorage.token));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const getChatEventEmitter = async (modelId: string, chatId: string = '') => {
|
||||
@@ -439,6 +526,13 @@
|
||||
}
|
||||
|
||||
const _files = JSON.parse(JSON.stringify(files));
|
||||
chatFiles.push(..._files.filter((item) => ['doc', 'file', 'collection'].includes(item.type)));
|
||||
chatFiles = chatFiles.filter(
|
||||
// Remove duplicates
|
||||
(item, index, array) =>
|
||||
array.findIndex((i) => JSON.stringify(i) === JSON.stringify(item)) === index
|
||||
);
|
||||
|
||||
files = [];
|
||||
|
||||
prompt = '';
|
||||
@@ -617,6 +711,7 @@
|
||||
let _response = null;
|
||||
|
||||
const responseMessage = history.messages[responseMessageId];
|
||||
const userMessage = history.messages[responseMessage.parentId];
|
||||
|
||||
// Wait until history/message have been updated
|
||||
await tick();
|
||||
@@ -679,24 +774,15 @@
|
||||
}
|
||||
});
|
||||
|
||||
let files = [];
|
||||
let files = JSON.parse(JSON.stringify(chatFiles));
|
||||
if (model?.info?.meta?.knowledge ?? false) {
|
||||
files = model.info.meta.knowledge;
|
||||
files.push(...model.info.meta.knowledge);
|
||||
}
|
||||
const lastUserMessage = messages.filter((message) => message.role === 'user').at(-1);
|
||||
|
||||
files = [
|
||||
...files,
|
||||
...(lastUserMessage?.files?.filter((item) =>
|
||||
['doc', 'file', 'collection', 'web_search_results'].includes(item.type)
|
||||
) ?? []),
|
||||
...(responseMessage?.files?.filter((item) =>
|
||||
['doc', 'file', 'collection', 'web_search_results'].includes(item.type)
|
||||
) ?? [])
|
||||
].filter(
|
||||
// Remove duplicates
|
||||
(item, index, array) =>
|
||||
array.findIndex((i) => JSON.stringify(i) === JSON.stringify(item)) === index
|
||||
files.push(
|
||||
...(userMessage?.files ?? []).filter((item) =>
|
||||
['doc', 'file', 'collection'].includes(item.type)
|
||||
),
|
||||
...(responseMessage?.files ?? []).filter((item) => ['web_search_results'].includes(item.type))
|
||||
);
|
||||
|
||||
eventTarget.dispatchEvent(
|
||||
@@ -752,7 +838,7 @@
|
||||
controller.abort('User: Stop Response');
|
||||
} else {
|
||||
const messages = createMessagesList(responseMessageId);
|
||||
await chatCompletedHandler(model.id, responseMessageId, messages);
|
||||
await chatCompletedHandler(_chatId, model.id, responseMessageId, messages);
|
||||
}
|
||||
|
||||
_response = responseMessage.content;
|
||||
@@ -860,7 +946,8 @@
|
||||
messages: messages,
|
||||
history: history,
|
||||
models: selectedModels,
|
||||
params: params
|
||||
params: params,
|
||||
files: chatFiles
|
||||
});
|
||||
await chats.set(await getChatList(localStorage.token));
|
||||
}
|
||||
@@ -914,7 +1001,7 @@
|
||||
scrollToBottom();
|
||||
}
|
||||
|
||||
if (messages.length == 2 && messages.at(1).content !== '') {
|
||||
if (messages.length == 2 && messages.at(1).content !== '' && selectedModels[0] === model.id) {
|
||||
window.history.replaceState(history.state, '', `/c/${_chatId}`);
|
||||
const _title = await generateChatTitle(userPrompt);
|
||||
await setChatTitle(_chatId, _title);
|
||||
@@ -925,25 +1012,19 @@
|
||||
|
||||
const sendPromptOpenAI = async (model, userPrompt, responseMessageId, _chatId) => {
|
||||
let _response = null;
|
||||
const responseMessage = history.messages[responseMessageId];
|
||||
|
||||
let files = [];
|
||||
const responseMessage = history.messages[responseMessageId];
|
||||
const userMessage = history.messages[responseMessage.parentId];
|
||||
|
||||
let files = JSON.parse(JSON.stringify(chatFiles));
|
||||
if (model?.info?.meta?.knowledge ?? false) {
|
||||
files = model.info.meta.knowledge;
|
||||
files.push(...model.info.meta.knowledge);
|
||||
}
|
||||
const lastUserMessage = messages.filter((message) => message.role === 'user').at(-1);
|
||||
files = [
|
||||
...files,
|
||||
...(lastUserMessage?.files?.filter((item) =>
|
||||
['doc', 'file', 'collection', 'web_search_results'].includes(item.type)
|
||||
) ?? []),
|
||||
...(responseMessage?.files?.filter((item) =>
|
||||
['doc', 'file', 'collection', 'web_search_results'].includes(item.type)
|
||||
) ?? [])
|
||||
].filter(
|
||||
// Remove duplicates
|
||||
(item, index, array) =>
|
||||
array.findIndex((i) => JSON.stringify(i) === JSON.stringify(item)) === index
|
||||
files.push(
|
||||
...(userMessage?.files ?? []).filter((item) =>
|
||||
['doc', 'file', 'collection'].includes(item.type)
|
||||
),
|
||||
...(responseMessage?.files ?? []).filter((item) => ['web_search_results'].includes(item.type))
|
||||
);
|
||||
|
||||
scrollToBottom();
|
||||
@@ -1064,7 +1145,7 @@
|
||||
} else {
|
||||
const messages = createMessagesList(responseMessageId);
|
||||
|
||||
await chatCompletedHandler(model.id, responseMessageId, messages);
|
||||
await chatCompletedHandler(_chatId, model.id, responseMessageId, messages);
|
||||
}
|
||||
|
||||
_response = responseMessage.content;
|
||||
@@ -1137,7 +1218,8 @@
|
||||
models: selectedModels,
|
||||
messages: messages,
|
||||
history: history,
|
||||
params: params
|
||||
params: params,
|
||||
files: chatFiles
|
||||
});
|
||||
await chats.set(await getChatList(localStorage.token));
|
||||
}
|
||||
@@ -1175,7 +1257,7 @@
|
||||
scrollToBottom();
|
||||
}
|
||||
|
||||
if (messages.length == 2) {
|
||||
if (messages.length == 2 && selectedModels[0] === model.id) {
|
||||
window.history.replaceState(history.state, '', `/c/${_chatId}`);
|
||||
|
||||
const _title = await generateChatTitle(userPrompt);
|
||||
@@ -1408,8 +1490,15 @@
|
||||
bind:show={showEventConfirmation}
|
||||
title={eventConfirmationTitle}
|
||||
message={eventConfirmationMessage}
|
||||
input={eventConfirmationInput}
|
||||
inputPlaceholder={eventConfirmationInputPlaceholder}
|
||||
inputValue={eventConfirmationInputValue}
|
||||
on:confirm={(e) => {
|
||||
eventCallback(true);
|
||||
if (e.detail) {
|
||||
eventCallback(e.detail);
|
||||
} else {
|
||||
eventCallback(true);
|
||||
}
|
||||
}}
|
||||
on:cancel={() => {
|
||||
eventCallback(false);
|
||||
@@ -1511,6 +1600,7 @@
|
||||
{sendPrompt}
|
||||
{continueGeneration}
|
||||
{regenerateResponse}
|
||||
{chatActionHandler}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1539,6 +1629,17 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ChatControls bind:show={showControls} bind:params />
|
||||
<ChatControls
|
||||
models={selectedModelIds.reduce((a, e, i, arr) => {
|
||||
const model = $models.find((m) => m.id === e);
|
||||
if (model) {
|
||||
return [...a, model];
|
||||
}
|
||||
return a;
|
||||
}, [])}
|
||||
bind:show={showControls}
|
||||
bind:chatFiles
|
||||
bind:params
|
||||
/>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@@ -6,7 +6,10 @@
|
||||
|
||||
export let show = false;
|
||||
|
||||
export let models = [];
|
||||
|
||||
export let chatId = null;
|
||||
export let chatFiles = [];
|
||||
export let params = {};
|
||||
|
||||
let largeScreen = false;
|
||||
@@ -43,6 +46,8 @@
|
||||
on:close={() => {
|
||||
show = false;
|
||||
}}
|
||||
{models}
|
||||
bind:chatFiles
|
||||
bind:params
|
||||
/>
|
||||
</div>
|
||||
@@ -56,6 +61,8 @@
|
||||
on:close={() => {
|
||||
show = false;
|
||||
}}
|
||||
{models}
|
||||
bind:chatFiles
|
||||
bind:params
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -5,7 +5,13 @@
|
||||
|
||||
import XMark from '$lib/components/icons/XMark.svelte';
|
||||
import AdvancedParams from '../Settings/Advanced/AdvancedParams.svelte';
|
||||
import Valves from '$lib/components/chat/Controls/Valves.svelte';
|
||||
import FileItem from '$lib/components/common/FileItem.svelte';
|
||||
import Collapsible from '$lib/components/common/Collapsible.svelte';
|
||||
|
||||
export let models = [];
|
||||
|
||||
export let chatFiles = [];
|
||||
export let params = {};
|
||||
</script>
|
||||
|
||||
@@ -22,28 +28,59 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class=" dark:text-gray-200 text-sm font-primary">
|
||||
<div>
|
||||
<div class="mb-1.5 font-medium">System Prompt</div>
|
||||
<div class=" dark:text-gray-200 text-sm font-primary py-0.5">
|
||||
{#if chatFiles.length > 0}
|
||||
<Collapsible title={$i18n.t('Files')} open={true}>
|
||||
<div class="flex flex-col gap-1 mt-1.5" slot="content">
|
||||
{#each chatFiles as file, fileIdx}
|
||||
<FileItem
|
||||
className="w-full"
|
||||
url={`${file?.url}`}
|
||||
name={file.name}
|
||||
type={file.type}
|
||||
size={file?.size}
|
||||
dismissible={true}
|
||||
on:dismiss={() => {
|
||||
// Remove the file from the chatFiles array
|
||||
|
||||
<div>
|
||||
<textarea
|
||||
bind:value={params.system}
|
||||
class="w-full rounded-lg px-4 py-3 text-sm dark:text-gray-300 dark:bg-gray-850 border border-gray-100 dark:border-gray-800 outline-none resize-none"
|
||||
rows="3"
|
||||
placeholder="Enter system prompt"
|
||||
/>
|
||||
chatFiles.splice(fileIdx, 1);
|
||||
chatFiles = chatFiles;
|
||||
}}
|
||||
/>
|
||||
{/each}
|
||||
</div>
|
||||
</Collapsible>
|
||||
|
||||
<hr class="my-2 border-gray-100 dark:border-gray-800" />
|
||||
{/if}
|
||||
|
||||
<Collapsible title={$i18n.t('Valves')}>
|
||||
<div class="text-sm mt-1.5" slot="content">
|
||||
<Valves />
|
||||
</div>
|
||||
</div>
|
||||
</Collapsible>
|
||||
|
||||
<hr class="my-2 border-gray-100 dark:border-gray-800" />
|
||||
|
||||
<div>
|
||||
<div class="mb-1.5 font-medium">Advanced Params</div>
|
||||
|
||||
<div>
|
||||
<AdvancedParams bind:params />
|
||||
<Collapsible title={$i18n.t('System Prompt')} open={true}>
|
||||
<div class=" mt-1.5" slot="content">
|
||||
<textarea
|
||||
bind:value={params.system}
|
||||
class="w-full rounded-lg px-3.5 py-2.5 text-sm dark:text-gray-300 dark:bg-gray-850 border border-gray-100 dark:border-gray-800 outline-none resize-none"
|
||||
rows="4"
|
||||
placeholder={$i18n.t('Enter system prompt')}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</Collapsible>
|
||||
|
||||
<hr class="my-2 border-gray-100 dark:border-gray-800" />
|
||||
|
||||
<Collapsible title={$i18n.t('Advanced Params')} open={true}>
|
||||
<div class="text-sm mt-1.5" slot="content">
|
||||
<div>
|
||||
<AdvancedParams bind:params />
|
||||
</div>
|
||||
</div>
|
||||
</Collapsible>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,188 @@
|
||||
<script lang="ts">
|
||||
import { toast } from 'svelte-sonner';
|
||||
|
||||
import { config, functions, models, settings, tools, user } from '$lib/stores';
|
||||
import { createEventDispatcher, onMount, getContext, tick } from 'svelte';
|
||||
|
||||
import {
|
||||
getUserValvesSpecById as getToolUserValvesSpecById,
|
||||
getUserValvesById as getToolUserValvesById,
|
||||
updateUserValvesById as updateToolUserValvesById
|
||||
} from '$lib/apis/tools';
|
||||
import {
|
||||
getUserValvesSpecById as getFunctionUserValvesSpecById,
|
||||
getUserValvesById as getFunctionUserValvesById,
|
||||
updateUserValvesById as updateFunctionUserValvesById
|
||||
} from '$lib/apis/functions';
|
||||
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
import Spinner from '$lib/components/common/Spinner.svelte';
|
||||
import Valves from '$lib/components/common/Valves.svelte';
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
let tab = 'tools';
|
||||
let selectedId = '';
|
||||
|
||||
let loading = false;
|
||||
|
||||
let valvesSpec = null;
|
||||
let valves = {};
|
||||
|
||||
let debounceTimer;
|
||||
|
||||
const debounceSubmitHandler = async () => {
|
||||
if (debounceTimer) {
|
||||
clearTimeout(debounceTimer);
|
||||
}
|
||||
|
||||
// Set a new timer
|
||||
debounceTimer = setTimeout(() => {
|
||||
submitHandler();
|
||||
}, 500); // 0.5 second debounce
|
||||
};
|
||||
|
||||
const getUserValves = async () => {
|
||||
loading = true;
|
||||
if (tab === 'tools') {
|
||||
valves = await getToolUserValvesById(localStorage.token, selectedId);
|
||||
valvesSpec = await getToolUserValvesSpecById(localStorage.token, selectedId);
|
||||
} else if (tab === 'functions') {
|
||||
valves = await getFunctionUserValvesById(localStorage.token, selectedId);
|
||||
valvesSpec = await getFunctionUserValvesSpecById(localStorage.token, selectedId);
|
||||
}
|
||||
|
||||
if (valvesSpec) {
|
||||
// Convert array to string
|
||||
for (const property in valvesSpec.properties) {
|
||||
if (valvesSpec.properties[property]?.type === 'array') {
|
||||
valves[property] = (valves[property] ?? []).join(',');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
loading = false;
|
||||
};
|
||||
|
||||
const submitHandler = async () => {
|
||||
if (valvesSpec) {
|
||||
// Convert string to array
|
||||
for (const property in valvesSpec.properties) {
|
||||
if (valvesSpec.properties[property]?.type === 'array') {
|
||||
valves[property] = (valves[property] ?? '').split(',').map((v) => v.trim());
|
||||
}
|
||||
}
|
||||
|
||||
if (tab === 'tools') {
|
||||
const res = await updateToolUserValvesById(localStorage.token, selectedId, valves).catch(
|
||||
(error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
}
|
||||
);
|
||||
|
||||
if (res) {
|
||||
toast.success($i18n.t('Valves updated'));
|
||||
valves = res;
|
||||
}
|
||||
} else if (tab === 'functions') {
|
||||
const res = await updateFunctionUserValvesById(
|
||||
localStorage.token,
|
||||
selectedId,
|
||||
valves
|
||||
).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
toast.success($i18n.t('Valves updated'));
|
||||
valves = res;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
$: if (tab) {
|
||||
selectedId = '';
|
||||
}
|
||||
|
||||
$: if (selectedId) {
|
||||
getUserValves();
|
||||
}
|
||||
</script>
|
||||
|
||||
<form
|
||||
class="flex flex-col h-full justify-between space-y-3 text-sm"
|
||||
on:submit|preventDefault={() => {
|
||||
submitHandler();
|
||||
dispatch('save');
|
||||
}}
|
||||
>
|
||||
<div class="flex flex-col">
|
||||
<div class="space-y-1">
|
||||
<div class="flex gap-2">
|
||||
<div class="flex-1">
|
||||
<select
|
||||
class=" w-full rounded text-xs py-2 px-1 bg-transparent outline-none"
|
||||
bind:value={tab}
|
||||
placeholder="Select"
|
||||
>
|
||||
<option value="tools" class="bg-gray-100 dark:bg-gray-800">{$i18n.t('Tools')}</option>
|
||||
<option value="functions" class="bg-gray-100 dark:bg-gray-800"
|
||||
>{$i18n.t('Functions')}</option
|
||||
>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="flex-1">
|
||||
<select
|
||||
class="w-full rounded py-2 px-1 text-xs bg-transparent outline-none"
|
||||
bind:value={selectedId}
|
||||
on:change={async () => {
|
||||
await tick();
|
||||
}}
|
||||
>
|
||||
{#if tab === 'tools'}
|
||||
<option value="" selected disabled class="bg-gray-100 dark:bg-gray-800"
|
||||
>{$i18n.t('Select a tool')}</option
|
||||
>
|
||||
|
||||
{#each $tools as tool, toolIdx}
|
||||
<option value={tool.id} class="bg-gray-100 dark:bg-gray-800">{tool.name}</option>
|
||||
{/each}
|
||||
{:else if tab === 'functions'}
|
||||
<option value="" selected disabled class="bg-gray-100 dark:bg-gray-800"
|
||||
>{$i18n.t('Select a function')}</option
|
||||
>
|
||||
|
||||
{#each $functions as func, funcIdx}
|
||||
<option value={func.id} class="bg-gray-100 dark:bg-gray-800">{func.name}</option>
|
||||
{/each}
|
||||
{/if}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{#if selectedId}
|
||||
<hr class="dark:border-gray-800 my-1 w-full" />
|
||||
|
||||
<div class="my-2 text-xs">
|
||||
{#if !loading}
|
||||
<Valves
|
||||
{valvesSpec}
|
||||
bind:valves
|
||||
on:change={() => {
|
||||
debounceSubmitHandler();
|
||||
}}
|
||||
/>
|
||||
{:else}
|
||||
<Spinner className="size-5" />
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</form>
|
||||
@@ -40,6 +40,8 @@
|
||||
import Headphone from '../icons/Headphone.svelte';
|
||||
import VoiceRecording from './MessageInput/VoiceRecording.svelte';
|
||||
import { transcribeAudio } from '$lib/apis/audio';
|
||||
import FileItem from '../common/FileItem.svelte';
|
||||
import FilesOverlay from './MessageInput/FilesOverlay.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
@@ -96,6 +98,7 @@
|
||||
|
||||
const uploadFileHandler = async (file) => {
|
||||
console.log(file);
|
||||
|
||||
// Check if the file is an audio file and transcribe/convert it to text file
|
||||
if (['audio/mpeg', 'audio/wav'].includes(file['type'])) {
|
||||
const res = await transcribeAudio(localStorage.token, file).catch((error) => {
|
||||
@@ -110,40 +113,49 @@
|
||||
}
|
||||
}
|
||||
|
||||
// Upload the file to the server
|
||||
const uploadedFile = await uploadFile(localStorage.token, file).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
const fileItem = {
|
||||
type: 'file',
|
||||
file: '',
|
||||
id: null,
|
||||
url: '',
|
||||
name: file.name,
|
||||
collection_name: '',
|
||||
status: '',
|
||||
size: file.size,
|
||||
error: ''
|
||||
};
|
||||
files = [...files, fileItem];
|
||||
|
||||
if (uploadedFile) {
|
||||
const fileItem = {
|
||||
type: 'file',
|
||||
file: uploadedFile,
|
||||
id: uploadedFile.id,
|
||||
url: `${WEBUI_API_BASE_URL}/files/${uploadedFile.id}`,
|
||||
name: file.name,
|
||||
collection_name: '',
|
||||
status: 'uploaded',
|
||||
error: ''
|
||||
};
|
||||
files = [...files, fileItem];
|
||||
try {
|
||||
const uploadedFile = await uploadFile(localStorage.token, file);
|
||||
|
||||
// TODO: Check if tools & functions have files support to skip this step to delegate file processing
|
||||
// Default Upload to VectorDB
|
||||
if (
|
||||
SUPPORTED_FILE_TYPE.includes(file['type']) ||
|
||||
SUPPORTED_FILE_EXTENSIONS.includes(file.name.split('.').at(-1))
|
||||
) {
|
||||
processFileItem(fileItem);
|
||||
if (uploadedFile) {
|
||||
fileItem.status = 'uploaded';
|
||||
fileItem.file = uploadedFile;
|
||||
fileItem.id = uploadedFile.id;
|
||||
fileItem.url = `${WEBUI_API_BASE_URL}/files/${uploadedFile.id}`;
|
||||
|
||||
// TODO: Check if tools & functions have files support to skip this step to delegate file processing
|
||||
// Default Upload to VectorDB
|
||||
if (
|
||||
SUPPORTED_FILE_TYPE.includes(file['type']) ||
|
||||
SUPPORTED_FILE_EXTENSIONS.includes(file.name.split('.').at(-1))
|
||||
) {
|
||||
processFileItem(fileItem);
|
||||
} else {
|
||||
toast.error(
|
||||
$i18n.t(`Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.`, {
|
||||
file_type: file['type']
|
||||
})
|
||||
);
|
||||
processFileItem(fileItem);
|
||||
}
|
||||
} else {
|
||||
toast.error(
|
||||
$i18n.t(`Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.`, {
|
||||
file_type: file['type']
|
||||
})
|
||||
);
|
||||
processFileItem(fileItem);
|
||||
files = files.filter((item) => item.status !== null);
|
||||
}
|
||||
} catch (e) {
|
||||
toast.error(e);
|
||||
files = files.filter((item) => item.status !== null);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -160,7 +172,6 @@
|
||||
// Remove the failed doc from the files array
|
||||
// files = files.filter((f) => f.id !== fileItem.id);
|
||||
toast.error(e);
|
||||
|
||||
fileItem.status = 'processed';
|
||||
files = files;
|
||||
}
|
||||
@@ -297,24 +308,7 @@
|
||||
});
|
||||
</script>
|
||||
|
||||
{#if dragged}
|
||||
<div
|
||||
class="fixed {$showSidebar
|
||||
? 'left-0 md:left-[260px] md:w-[calc(100%-260px)]'
|
||||
: 'left-0'} w-full h-full flex z-50 touch-none pointer-events-none"
|
||||
id="dropzone"
|
||||
role="region"
|
||||
aria-label="Drag and Drop Container"
|
||||
>
|
||||
<div class="absolute w-full h-full backdrop-blur bg-gray-800/40 flex justify-center">
|
||||
<div class="m-auto pt-64 flex flex-col justify-center">
|
||||
<div class="max-w-md">
|
||||
<AddFilesPlaceholder />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
<FilesOverlay show={dragged} />
|
||||
|
||||
<div class="w-full font-primary">
|
||||
<div class=" -mb-0.5 mx-auto inset-x-0 bg-transparent flex justify-center">
|
||||
@@ -500,10 +494,10 @@
|
||||
dir={$settings?.chatDirection ?? 'LTR'}
|
||||
>
|
||||
{#if files.length > 0}
|
||||
<div class="mx-2 mt-2 mb-1 flex flex-wrap gap-2">
|
||||
<div class="mx-1 mt-2.5 mb-1 flex flex-wrap gap-2">
|
||||
{#each files as file, fileIdx}
|
||||
<div class=" relative group">
|
||||
{#if file.type === 'image'}
|
||||
{#if file.type === 'image'}
|
||||
<div class=" relative group">
|
||||
<div class="relative">
|
||||
<img
|
||||
src={file.url}
|
||||
@@ -534,137 +528,41 @@
|
||||
</Tooltip>
|
||||
{/if}
|
||||
</div>
|
||||
{:else if ['doc', 'file'].includes(file.type)}
|
||||
<div
|
||||
class="h-16 w-[15rem] flex items-center space-x-3 px-2.5 dark:bg-gray-600 rounded-xl border border-gray-200 dark:border-none"
|
||||
>
|
||||
<div class="p-2.5 bg-red-400 text-white rounded-lg">
|
||||
{#if file.status === 'processed'}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="w-6 h-6"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625ZM7.5 15a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 7.5 15Zm.75 2.25a.75.75 0 0 0 0 1.5H12a.75.75 0 0 0 0-1.5H8.25Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
<path
|
||||
d="M12.971 1.816A5.23 5.23 0 0 1 14.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 0 1 3.434 1.279 9.768 9.768 0 0 0-6.963-6.963Z"
|
||||
/>
|
||||
</svg>
|
||||
{:else}
|
||||
<svg
|
||||
class=" w-6 h-6 translate-y-[0.5px]"
|
||||
fill="currentColor"
|
||||
viewBox="0 0 24 24"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
><style>
|
||||
.spinner_qM83 {
|
||||
animation: spinner_8HQG 1.05s infinite;
|
||||
}
|
||||
.spinner_oXPr {
|
||||
animation-delay: 0.1s;
|
||||
}
|
||||
.spinner_ZTLf {
|
||||
animation-delay: 0.2s;
|
||||
}
|
||||
@keyframes spinner_8HQG {
|
||||
0%,
|
||||
57.14% {
|
||||
animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);
|
||||
transform: translate(0);
|
||||
}
|
||||
28.57% {
|
||||
animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);
|
||||
transform: translateY(-6px);
|
||||
}
|
||||
100% {
|
||||
transform: translate(0);
|
||||
}
|
||||
}
|
||||
</style><circle
|
||||
class="spinner_qM83"
|
||||
cx="4"
|
||||
cy="12"
|
||||
r="2.5"
|
||||
/><circle
|
||||
class="spinner_qM83 spinner_oXPr"
|
||||
cx="12"
|
||||
cy="12"
|
||||
r="2.5"
|
||||
/><circle
|
||||
class="spinner_qM83 spinner_ZTLf"
|
||||
cx="20"
|
||||
cy="12"
|
||||
r="2.5"
|
||||
/></svg
|
||||
>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col justify-center -space-y-0.5">
|
||||
<div class=" dark:text-gray-100 text-sm font-medium line-clamp-1">
|
||||
{file.name}
|
||||
</div>
|
||||
|
||||
<div class=" text-gray-500 text-sm">{$i18n.t('Document')}</div>
|
||||
</div>
|
||||
</div>
|
||||
{:else if file.type === 'collection'}
|
||||
<div
|
||||
class="h-16 w-[15rem] flex items-center space-x-3 px-2.5 dark:bg-gray-600 rounded-xl border border-gray-200 dark:border-none"
|
||||
>
|
||||
<div class="p-2.5 bg-red-400 text-white rounded-lg">
|
||||
<div class=" absolute -top-1 -right-1">
|
||||
<button
|
||||
class=" bg-gray-400 text-white border border-white rounded-full group-hover:visible invisible transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
files.splice(fileIdx, 1);
|
||||
files = files;
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-6 h-6"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M7.5 3.375c0-1.036.84-1.875 1.875-1.875h.375a3.75 3.75 0 0 1 3.75 3.75v1.875C13.5 8.161 14.34 9 15.375 9h1.875A3.75 3.75 0 0 1 21 12.75v3.375C21 17.16 20.16 18 19.125 18h-9.75A1.875 1.875 0 0 1 7.5 16.125V3.375Z"
|
||||
/>
|
||||
<path
|
||||
d="M15 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 17.25 7.5h-1.875A.375.375 0 0 1 15 7.125V5.25ZM4.875 6H6v10.125A3.375 3.375 0 0 0 9.375 19.5H16.5v1.125c0 1.035-.84 1.875-1.875 1.875h-9.75A1.875 1.875 0 0 1 3 20.625V7.875C3 6.839 3.84 6 4.875 6Z"
|
||||
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>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col justify-center -space-y-0.5">
|
||||
<div class=" dark:text-gray-100 text-sm font-medium line-clamp-1">
|
||||
{file?.title ?? `#${file.name}`}
|
||||
</div>
|
||||
|
||||
<div class=" text-gray-500 text-sm">{$i18n.t('Collection')}</div>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class=" absolute -top-1 -right-1">
|
||||
<button
|
||||
class=" bg-gray-400 text-white border border-white rounded-full group-hover:visible invisible transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
files.splice(fileIdx, 1);
|
||||
files = files;
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
{:else}
|
||||
<FileItem
|
||||
name={file.name}
|
||||
type={file.type}
|
||||
size={file?.size}
|
||||
status={file.status}
|
||||
dismissible={true}
|
||||
on:dismiss={() => {
|
||||
files.splice(fileIdx, 1);
|
||||
files = files;
|
||||
}}
|
||||
/>
|
||||
{/if}
|
||||
{/each}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
<script lang="ts">
|
||||
import { showSidebar } from '$lib/stores';
|
||||
import AddFilesPlaceholder from '$lib/components/AddFilesPlaceholder.svelte';
|
||||
|
||||
export let show = false;
|
||||
let overlayElement = null;
|
||||
|
||||
$: if (show && overlayElement) {
|
||||
document.body.appendChild(overlayElement);
|
||||
document.body.style.overflow = 'hidden';
|
||||
} else if (overlayElement) {
|
||||
document.body.removeChild(overlayElement);
|
||||
document.body.style.overflow = 'unset';
|
||||
}
|
||||
</script>
|
||||
|
||||
{#if show}
|
||||
<div
|
||||
bind:this={overlayElement}
|
||||
class="fixed {$showSidebar
|
||||
? 'left-0 md:left-[260px] md:w-[calc(100%-260px)]'
|
||||
: 'left-0'} fixed top-0 right-0 bottom-0 w-full h-full flex z-[9999] touch-none pointer-events-none"
|
||||
id="dropzone"
|
||||
role="region"
|
||||
aria-label="Drag and Drop Container"
|
||||
>
|
||||
<div class="absolute w-full h-full backdrop-blur bg-gray-800/40 flex justify-center">
|
||||
<div class="m-auto pt-64 flex flex-col justify-center">
|
||||
<div class="max-w-md">
|
||||
<AddFilesPlaceholder />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
@@ -22,6 +22,7 @@
|
||||
export let sendPrompt: Function;
|
||||
export let continueGeneration: Function;
|
||||
export let regenerateResponse: Function;
|
||||
export let chatActionHandler: Function;
|
||||
|
||||
export let user = $_user;
|
||||
export let prompt;
|
||||
@@ -335,6 +336,9 @@
|
||||
copyToClipboard={copyToClipboardWithToast}
|
||||
{continueGeneration}
|
||||
{regenerateResponse}
|
||||
on:action={async (e) => {
|
||||
await chatActionHandler(chatId, e.detail, message.model, message.id);
|
||||
}}
|
||||
on:save={async (e) => {
|
||||
console.log('save', e);
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<script lang="ts">
|
||||
import { getContext, onMount, tick } from 'svelte';
|
||||
|
||||
import Modal from '$lib/components/common/Modal.svelte';
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
@@ -54,9 +53,25 @@
|
||||
<div class="text-sm font-medium dark:text-gray-300">
|
||||
{$i18n.t('Source')}
|
||||
</div>
|
||||
<div class="text-sm dark:text-gray-400">
|
||||
{document.source?.name ?? $i18n.t('No source available')}
|
||||
</div>
|
||||
|
||||
{#if document.source?.name}
|
||||
<div class="text-sm dark:text-gray-400">
|
||||
<a
|
||||
href={document?.metadata?.file_id
|
||||
? `/api/v1/files/${document?.metadata?.file_id}/content`
|
||||
: document.source.name.includes('http')
|
||||
? document.source.name
|
||||
: `#`}
|
||||
target="_blank"
|
||||
>
|
||||
{document?.metadata?.name ?? document.source.name}
|
||||
</a>
|
||||
</div>
|
||||
{:else}
|
||||
<div class="text-sm dark:text-gray-400">
|
||||
{$i18n.t('No source available')}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="flex flex-col w-full">
|
||||
<div class=" text-sm font-medium dark:text-gray-300">
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
import CitationsModal from '$lib/components/chat/Messages/CitationsModal.svelte';
|
||||
import Spinner from '$lib/components/common/Spinner.svelte';
|
||||
import WebSearchResults from './ResponseMessage/WebSearchResults.svelte';
|
||||
import Sparkles from '$lib/components/icons/Sparkles.svelte';
|
||||
|
||||
export let message;
|
||||
export let siblings;
|
||||
@@ -54,6 +55,7 @@
|
||||
export let copyToClipboard: Function;
|
||||
export let continueGeneration: Function;
|
||||
export let regenerateResponse: Function;
|
||||
export let chatActionHandler: Function;
|
||||
|
||||
let model = null;
|
||||
$: model = $models.find((m) => m.id === message.model);
|
||||
@@ -173,7 +175,10 @@
|
||||
delimiters: [
|
||||
{ left: '$$', right: '$$', display: false },
|
||||
{ left: '$ ', right: ' $', display: false },
|
||||
{ left: '\\pu{', right: '}', display: false },
|
||||
{ left: '\\ce{', right: '}', display: false },
|
||||
{ left: '\\(', right: '\\)', display: false },
|
||||
{ left: '( ', right: ' )', display: false },
|
||||
{ left: '\\[', right: '\\]', display: false },
|
||||
{ left: '[ ', right: ' ]', display: false }
|
||||
],
|
||||
@@ -216,7 +221,7 @@
|
||||
if ((message?.content ?? '').trim() !== '') {
|
||||
speaking = true;
|
||||
|
||||
if ($config.audio.tts.engine === 'openai') {
|
||||
if ($config.audio.tts.engine !== '') {
|
||||
loadingSpeech = true;
|
||||
|
||||
const sentences = extractSentences(message.content).reduce((mergedTexts, currentText) => {
|
||||
@@ -248,7 +253,9 @@
|
||||
for (const [idx, sentence] of sentences.entries()) {
|
||||
const res = await synthesizeOpenAISpeech(
|
||||
localStorage.token,
|
||||
$settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice,
|
||||
$settings?.audio?.tts?.defaultVoice === $config.audio.tts.voice
|
||||
? $settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice
|
||||
: $config?.audio?.tts?.voice,
|
||||
sentence
|
||||
).catch((error) => {
|
||||
toast.error(error);
|
||||
@@ -431,7 +438,7 @@
|
||||
{@const status = (
|
||||
message?.statusHistory ?? [...(message?.status ? [message?.status] : [])]
|
||||
).at(-1)}
|
||||
<div class="flex items-center gap-2 pt-1 pb-1">
|
||||
<div class="flex items-center gap-2 pt-0.5 pb-1">
|
||||
{#if status.done === false}
|
||||
<div class="">
|
||||
<Spinner className="size-4" />
|
||||
@@ -564,6 +571,11 @@
|
||||
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 };
|
||||
@@ -1020,6 +1032,33 @@
|
||||
</svg>
|
||||
</button>
|
||||
</Tooltip>
|
||||
|
||||
{#each model?.actions ?? [] as action}
|
||||
<Tooltip content={action.name} placement="bottom">
|
||||
<button
|
||||
type="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={() => {
|
||||
dispatch('action', action.id);
|
||||
}}
|
||||
>
|
||||
{#if action.icon_url}
|
||||
<img
|
||||
src={action.icon_url}
|
||||
class="w-4 h-4 {action.icon_url.includes('svg')
|
||||
? 'dark:invert-[80%]'
|
||||
: ''}"
|
||||
style="fill: currentColor;"
|
||||
alt={action.name}
|
||||
/>
|
||||
{:else}
|
||||
<Sparkles strokeWidth="2.1" className="size-4" />
|
||||
{/if}
|
||||
</button>
|
||||
</Tooltip>
|
||||
{/each}
|
||||
{/if}
|
||||
{/if}
|
||||
{/if}
|
||||
|
||||
@@ -20,7 +20,10 @@
|
||||
<ChevronDown strokeWidth="3.5" className="size-3.5 " />
|
||||
{/if}
|
||||
</div>
|
||||
<div class="text-sm border border-gray-300/30 dark:border-gray-700/50 rounded-xl" slot="content">
|
||||
<div
|
||||
class="text-sm border border-gray-300/30 dark:border-gray-700/50 rounded-xl mb-1.5"
|
||||
slot="content"
|
||||
>
|
||||
{#if status?.query}
|
||||
<a
|
||||
href="https://www.google.com/search?q={status.query}"
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
import { user as _user } from '$lib/stores';
|
||||
import { getFileContentById } from '$lib/apis/files';
|
||||
import FileItem from '$lib/components/common/FileItem.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
@@ -98,107 +99,14 @@
|
||||
<div class={$settings?.chatBubble ?? true ? 'self-end' : ''}>
|
||||
{#if file.type === 'image'}
|
||||
<img src={file.url} alt="input" class=" max-h-96 rounded-lg" draggable="false" />
|
||||
{:else if file.type === 'file'}
|
||||
<button
|
||||
class="h-16 w-72 flex items-center space-x-3 px-2.5 dark:bg-gray-850 rounded-xl border border-gray-200 dark:border-none text-left"
|
||||
type="button"
|
||||
on:click={async () => {
|
||||
if (file?.url) {
|
||||
window.open(`${file?.url}/content`, '_blank').focus();
|
||||
}
|
||||
}}
|
||||
>
|
||||
<div class="p-2.5 bg-red-400 text-white rounded-lg">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="w-6 h-6"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625ZM7.5 15a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 7.5 15Zm.75 2.25a.75.75 0 0 0 0 1.5H12a.75.75 0 0 0 0-1.5H8.25Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
<path
|
||||
d="M12.971 1.816A5.23 5.23 0 0 1 14.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 0 1 3.434 1.279 9.768 9.768 0 0 0-6.963-6.963Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col justify-center -space-y-0.5">
|
||||
<div class=" dark:text-gray-100 text-sm font-medium line-clamp-1">
|
||||
{file.name}
|
||||
</div>
|
||||
|
||||
<div class=" text-gray-500 text-sm">{$i18n.t('File')}</div>
|
||||
</div>
|
||||
</button>
|
||||
{:else if file.type === 'doc'}
|
||||
<button
|
||||
class="h-16 w-72 flex items-center space-x-3 px-2.5 dark:bg-gray-850 rounded-xl border border-gray-200 dark:border-none text-left"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
if (file?.url) {
|
||||
window.open(file?.url, '_blank').focus();
|
||||
}
|
||||
}}
|
||||
>
|
||||
<div class="p-2.5 bg-red-400 text-white rounded-lg">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="w-6 h-6"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625ZM7.5 15a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 7.5 15Zm.75 2.25a.75.75 0 0 0 0 1.5H12a.75.75 0 0 0 0-1.5H8.25Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
<path
|
||||
d="M12.971 1.816A5.23 5.23 0 0 1 14.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 0 1 3.434 1.279 9.768 9.768 0 0 0-6.963-6.963Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col justify-center -space-y-0.5">
|
||||
<div class=" dark:text-gray-100 text-sm font-medium line-clamp-1">
|
||||
{file.name}
|
||||
</div>
|
||||
|
||||
<div class=" text-gray-500 text-sm">{$i18n.t('Document')}</div>
|
||||
</div>
|
||||
</button>
|
||||
{:else if file.type === 'collection'}
|
||||
<button
|
||||
class="h-16 w-72 flex items-center space-x-3 px-2.5 dark:bg-gray-600 rounded-xl border border-gray-200 dark:border-none text-left"
|
||||
type="button"
|
||||
>
|
||||
<div class="p-2.5 bg-red-400 text-white rounded-lg">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="w-6 h-6"
|
||||
>
|
||||
<path
|
||||
d="M7.5 3.375c0-1.036.84-1.875 1.875-1.875h.375a3.75 3.75 0 0 1 3.75 3.75v1.875C13.5 8.161 14.34 9 15.375 9h1.875A3.75 3.75 0 0 1 21 12.75v3.375C21 17.16 20.16 18 19.125 18h-9.75A1.875 1.875 0 0 1 7.5 16.125V3.375Z"
|
||||
/>
|
||||
<path
|
||||
d="M15 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 17.25 7.5h-1.875A.375.375 0 0 1 15 7.125V5.25ZM4.875 6H6v10.125A3.375 3.375 0 0 0 9.375 19.5H16.5v1.125c0 1.035-.84 1.875-1.875 1.875h-9.75A1.875 1.875 0 0 1 3 20.625V7.875C3 6.839 3.84 6 4.875 6Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col justify-center -space-y-0.5">
|
||||
<div class=" dark:text-gray-100 text-sm font-medium line-clamp-1">
|
||||
{file?.title ?? `#${file.name}`}
|
||||
</div>
|
||||
|
||||
<div class=" text-gray-500 text-sm">{$i18n.t('Collection')}</div>
|
||||
</div>
|
||||
</button>
|
||||
{:else}
|
||||
<FileItem
|
||||
url={file.url}
|
||||
name={file.name}
|
||||
type={file.type}
|
||||
size={file?.size}
|
||||
colorClassName="bg-white dark:bg-gray-850 "
|
||||
/>
|
||||
{/if}
|
||||
</div>
|
||||
{/each}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<script lang="ts">
|
||||
import { DropdownMenu } from 'bits-ui';
|
||||
import { marked } from 'marked';
|
||||
import Fuse from 'fuse.js';
|
||||
|
||||
import { flyAndScale } from '$lib/utils/transitions';
|
||||
import { createEventDispatcher, onMount, getContext, tick } from 'svelte';
|
||||
@@ -33,7 +34,7 @@
|
||||
[key: string]: any;
|
||||
} = [];
|
||||
|
||||
export let className = 'w-[30rem]';
|
||||
export let className = 'w-[32rem]';
|
||||
|
||||
let show = false;
|
||||
|
||||
@@ -43,17 +44,31 @@
|
||||
let searchValue = '';
|
||||
let ollamaVersion = null;
|
||||
|
||||
$: filteredItems = items.filter(
|
||||
(item) =>
|
||||
(searchValue
|
||||
? item.value.toLowerCase().includes(searchValue.toLowerCase()) ||
|
||||
item.label.toLowerCase().includes(searchValue.toLowerCase()) ||
|
||||
(item.model?.info?.meta?.tags ?? []).some((tag) =>
|
||||
tag.name.toLowerCase().includes(searchValue.toLowerCase())
|
||||
)
|
||||
: true) && !(item.model?.info?.meta?.hidden ?? false)
|
||||
let selectedModelIdx = 0;
|
||||
|
||||
const fuse = new Fuse(
|
||||
items
|
||||
.filter((item) => !item.model?.info?.meta?.hidden)
|
||||
.map((item) => {
|
||||
const _item = {
|
||||
...item,
|
||||
modelName: item.model?.name,
|
||||
tags: item.model?.info?.meta?.tags?.map((tag) => tag.name).join(' '),
|
||||
desc: item.model?.info?.meta?.description
|
||||
};
|
||||
return _item;
|
||||
}),
|
||||
{
|
||||
keys: ['value', 'label', 'tags', 'desc', 'modelName']
|
||||
}
|
||||
);
|
||||
|
||||
$: filteredItems = searchValue
|
||||
? fuse.search(searchValue).map((e) => {
|
||||
return e.item;
|
||||
})
|
||||
: items.filter((item) => !item.model?.info?.meta?.hidden);
|
||||
|
||||
const pullModelHandler = async () => {
|
||||
const sanitizedModelTag = searchValue.trim().replace(/^ollama\s+(run|pull)\s+/, '');
|
||||
|
||||
@@ -202,6 +217,7 @@
|
||||
bind:open={show}
|
||||
onOpenChange={async () => {
|
||||
searchValue = '';
|
||||
selectedModelIdx = 0;
|
||||
window.setTimeout(() => document.getElementById('model-search-input')?.focus(), 0);
|
||||
}}
|
||||
closeFocus={false}
|
||||
@@ -238,19 +254,41 @@
|
||||
class="w-full text-sm bg-transparent outline-none"
|
||||
placeholder={searchPlaceholder}
|
||||
autocomplete="off"
|
||||
on:keydown={(e) => {
|
||||
if (e.code === 'Enter' && filteredItems.length > 0) {
|
||||
value = filteredItems[selectedModelIdx].value;
|
||||
show = false;
|
||||
return; // dont need to scroll on selection
|
||||
} else if (e.code === 'ArrowDown') {
|
||||
selectedModelIdx = Math.min(selectedModelIdx + 1, filteredItems.length - 1);
|
||||
} else if (e.code === 'ArrowUp') {
|
||||
selectedModelIdx = Math.max(selectedModelIdx - 1, 0);
|
||||
} else {
|
||||
// if the user types something, reset to the top selection.
|
||||
selectedModelIdx = 0;
|
||||
}
|
||||
|
||||
const item = document.querySelector(`[data-arrow-selected="true"]`);
|
||||
item?.scrollIntoView({ block: 'center', inline: 'nearest', behavior: 'instant' });
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<hr class="border-gray-100 dark:border-gray-800" />
|
||||
{/if}
|
||||
|
||||
<div class="px-3 my-2 max-h-64 overflow-y-auto scrollbar-hidden">
|
||||
{#each filteredItems as item}
|
||||
<div class="px-3 my-2 max-h-64 overflow-y-auto scrollbar-hidden group">
|
||||
{#each filteredItems as item, index}
|
||||
<button
|
||||
aria-label="model-item"
|
||||
class="flex w-full text-left font-medium line-clamp-1 select-none items-center rounded-button py-2 pl-3 pr-1.5 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"
|
||||
class="flex w-full text-left font-medium line-clamp-1 select-none items-center rounded-button py-2 pl-3 pr-1.5 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 {index ===
|
||||
selectedModelIdx
|
||||
? 'bg-gray-100 dark:bg-gray-800 group-hover:bg-transparent'
|
||||
: ''}"
|
||||
data-arrow-selected={index === selectedModelIdx}
|
||||
on:click={() => {
|
||||
value = item.value;
|
||||
selectedModelIdx = index;
|
||||
|
||||
show = false;
|
||||
}}
|
||||
@@ -270,7 +308,14 @@
|
||||
<div class="flex items-center gap-2">
|
||||
<div class="flex items-center min-w-fit">
|
||||
<div class="line-clamp-1">
|
||||
{item.label}
|
||||
<div class="flex items-center min-w-fit">
|
||||
<img
|
||||
src={item.model?.info?.meta?.profile_image_url ?? '/static/favicon.png'}
|
||||
alt="Model"
|
||||
class="rounded-full size-5 flex items-center mr-2"
|
||||
/>
|
||||
{item.label}
|
||||
</div>
|
||||
</div>
|
||||
{#if item.model.owned_by === 'ollama' && (item.model.ollama?.details?.parameter_size ?? '') !== ''}
|
||||
<div class="flex ml-1 items-center translate-y-[0.5px]">
|
||||
@@ -295,23 +340,11 @@
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
{#if !$mobile && (item?.model?.info?.meta?.tags ?? []).length > 0}
|
||||
<div class="flex gap-0.5 self-center items-center h-full translate-y-[0.5px]">
|
||||
{#each item.model?.info?.meta.tags as tag}
|
||||
<div
|
||||
class=" text-xs font-bold px-1 rounded uppercase line-clamp-1 bg-gray-500/20 text-gray-700 dark:text-gray-200"
|
||||
>
|
||||
{tag.name}
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<!-- {JSON.stringify(item.info)} -->
|
||||
|
||||
{#if item.model.owned_by === 'openai'}
|
||||
<Tooltip content={`${'External'}`}>
|
||||
<div class="">
|
||||
<div class="translate-y-[1px]">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
@@ -342,7 +375,7 @@
|
||||
)
|
||||
)}`}
|
||||
>
|
||||
<div class="">
|
||||
<div class=" translate-y-[1px]">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
@@ -360,6 +393,20 @@
|
||||
</div>
|
||||
</Tooltip>
|
||||
{/if}
|
||||
|
||||
{#if !$mobile && (item?.model?.info?.meta?.tags ?? []).length > 0}
|
||||
<div class="flex gap-0.5 self-center items-center h-full translate-y-[0.5px]">
|
||||
{#each item.model?.info?.meta.tags as tag}
|
||||
<Tooltip content={tag.name}>
|
||||
<div
|
||||
class=" text-xs font-bold px-1 rounded uppercase line-clamp-1 bg-gray-500/20 text-gray-700 dark:text-gray-200"
|
||||
>
|
||||
{tag.name}
|
||||
</div>
|
||||
</Tooltip>
|
||||
{/each}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<script lang="ts">
|
||||
import Switch from '$lib/components/common/Switch.svelte';
|
||||
import { getContext, createEventDispatcher } from 'svelte';
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
@@ -19,6 +20,7 @@
|
||||
mirostat_tau: null,
|
||||
top_k: null,
|
||||
top_p: null,
|
||||
min_p: null,
|
||||
tfs_z: null,
|
||||
num_ctx: null,
|
||||
num_batch: null,
|
||||
@@ -384,6 +386,52 @@
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Min P')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition flex-shrink-0 outline-none"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.min_p = (params?.min_p ?? null) === null ? 0.0 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.min_p ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.min_p ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
id="steps-range"
|
||||
type="range"
|
||||
min="0"
|
||||
max="1"
|
||||
step="0.05"
|
||||
bind:value={params.min_p}
|
||||
class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<input
|
||||
bind:value={params.min_p}
|
||||
type="number"
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="0"
|
||||
max="1"
|
||||
step="any"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Frequency Penalty')}</div>
|
||||
@@ -720,10 +768,22 @@
|
||||
{#if (params?.use_mmap ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('On')}</span>
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.use_mmap ?? null) !== null}
|
||||
<div class="flex justify-between items-center mt-1">
|
||||
<div class="text-xs text-gray-500">
|
||||
{params.use_mmap ? 'Enabled' : 'Disabled'}
|
||||
</div>
|
||||
|
||||
<div class=" pr-2">
|
||||
<Switch bind:state={params.use_mmap} />
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
@@ -740,10 +800,22 @@
|
||||
{#if (params?.use_mlock ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('On')}</span>
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.use_mlock ?? null) !== null}
|
||||
<div class="flex justify-between items-center mt-1">
|
||||
<div class="text-xs text-gray-500">
|
||||
{params.use_mlock ? 'Enabled' : 'Disabled'}
|
||||
</div>
|
||||
|
||||
<div class=" pr-2">
|
||||
<Switch bind:state={params.use_mlock} />
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
<script lang="ts">
|
||||
import { user, settings, config } from '$lib/stores';
|
||||
import { createEventDispatcher, onMount, getContext } from 'svelte';
|
||||
import { toast } from 'svelte-sonner';
|
||||
import { createEventDispatcher, onMount, getContext } from 'svelte';
|
||||
|
||||
import { user, settings, config } from '$lib/stores';
|
||||
import { getVoices as _getVoices } from '$lib/apis/audio';
|
||||
|
||||
import Switch from '$lib/components/common/Switch.svelte';
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
@@ -20,26 +23,26 @@
|
||||
let voices = [];
|
||||
let voice = '';
|
||||
|
||||
const getOpenAIVoices = () => {
|
||||
voices = [
|
||||
{ name: 'alloy' },
|
||||
{ name: 'echo' },
|
||||
{ name: 'fable' },
|
||||
{ name: 'onyx' },
|
||||
{ name: 'nova' },
|
||||
{ name: 'shimmer' }
|
||||
];
|
||||
};
|
||||
const getVoices = async () => {
|
||||
if ($config.audio.tts.engine === '') {
|
||||
const getVoicesLoop = setInterval(async () => {
|
||||
voices = await speechSynthesis.getVoices();
|
||||
|
||||
const getWebAPIVoices = () => {
|
||||
const getVoicesLoop = setInterval(async () => {
|
||||
voices = await speechSynthesis.getVoices();
|
||||
// do your loop
|
||||
if (voices.length > 0) {
|
||||
clearInterval(getVoicesLoop);
|
||||
}
|
||||
}, 100);
|
||||
} else {
|
||||
const res = await _getVoices(localStorage.token).catch((e) => {
|
||||
toast.error(e);
|
||||
});
|
||||
|
||||
// do your loop
|
||||
if (voices.length > 0) {
|
||||
clearInterval(getVoicesLoop);
|
||||
if (res) {
|
||||
console.log(res);
|
||||
voices = res.voices;
|
||||
}
|
||||
}, 100);
|
||||
}
|
||||
};
|
||||
|
||||
const toggleResponseAutoPlayback = async () => {
|
||||
@@ -58,14 +61,16 @@
|
||||
responseAutoPlayback = $settings.responseAutoPlayback ?? false;
|
||||
|
||||
STTEngine = $settings?.audio?.stt?.engine ?? '';
|
||||
voice = $settings?.audio?.tts?.voice ?? $config.audio.tts.voice ?? '';
|
||||
|
||||
if ($settings?.audio?.tts?.defaultVoice === $config.audio.tts.voice) {
|
||||
voice = $settings?.audio?.tts?.voice ?? $config.audio.tts.voice ?? '';
|
||||
} else {
|
||||
voice = $config.audio.tts.voice ?? '';
|
||||
}
|
||||
|
||||
nonLocalVoices = $settings.audio?.tts?.nonLocalVoices ?? false;
|
||||
|
||||
if ($config.audio.tts.engine === 'openai') {
|
||||
getOpenAIVoices();
|
||||
} else {
|
||||
getWebAPIVoices();
|
||||
}
|
||||
await getVoices();
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -79,6 +84,7 @@
|
||||
},
|
||||
tts: {
|
||||
voice: voice !== '' ? voice : undefined,
|
||||
defaultVoice: $config?.audio?.tts?.voice ?? '',
|
||||
nonLocalVoices: $config.audio.tts.engine === '' ? nonLocalVoices : undefined
|
||||
}
|
||||
}
|
||||
@@ -181,7 +187,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{:else if $config.audio.tts.engine === 'openai'}
|
||||
{:else if $config.audio.tts.engine !== ''}
|
||||
<div>
|
||||
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('Set Voice')}</div>
|
||||
<div class="flex w-full">
|
||||
@@ -195,7 +201,7 @@
|
||||
|
||||
<datalist id="voice-list">
|
||||
{#each voices as voice}
|
||||
<option value={voice.name} />
|
||||
<option value={voice.id}>{voice.name}</option>
|
||||
{/each}
|
||||
</datalist>
|
||||
</div>
|
||||
|
||||
@@ -144,7 +144,10 @@
|
||||
chatDirection = $settings.chatDirection ?? 'LTR';
|
||||
userLocation = $settings.userLocation ?? false;
|
||||
|
||||
defaultModelId = ($settings?.models ?? ['']).at(0);
|
||||
defaultModelId = $settings?.models?.at(0) ?? '';
|
||||
if ($config?.default_models) {
|
||||
defaultModelId = $config.default_models.split(',')[0];
|
||||
}
|
||||
|
||||
backgroundImageUrl = $settings.backgroundImageUrl ?? null;
|
||||
});
|
||||
|
||||
@@ -1,273 +0,0 @@
|
||||
<script lang="ts">
|
||||
import { toast } from 'svelte-sonner';
|
||||
|
||||
import { config, functions, models, settings, tools, user } from '$lib/stores';
|
||||
import { createEventDispatcher, onMount, getContext, tick } from 'svelte';
|
||||
|
||||
import {
|
||||
getUserValvesSpecById as getToolUserValvesSpecById,
|
||||
getUserValvesById as getToolUserValvesById,
|
||||
updateUserValvesById as updateToolUserValvesById
|
||||
} from '$lib/apis/tools';
|
||||
import {
|
||||
getUserValvesSpecById as getFunctionUserValvesSpecById,
|
||||
getUserValvesById as getFunctionUserValvesById,
|
||||
updateUserValvesById as updateFunctionUserValvesById
|
||||
} from '$lib/apis/functions';
|
||||
|
||||
import ManageModal from './Personalization/ManageModal.svelte';
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
import Spinner from '$lib/components/common/Spinner.svelte';
|
||||
import Switch from '$lib/components/common/Switch.svelte';
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let saveSettings: Function;
|
||||
|
||||
let tab = 'tools';
|
||||
let selectedId = '';
|
||||
|
||||
let loading = false;
|
||||
|
||||
let valvesSpec = null;
|
||||
let valves = {};
|
||||
|
||||
const getUserValves = async () => {
|
||||
loading = true;
|
||||
if (tab === 'tools') {
|
||||
valves = await getToolUserValvesById(localStorage.token, selectedId);
|
||||
valvesSpec = await getToolUserValvesSpecById(localStorage.token, selectedId);
|
||||
} else if (tab === 'functions') {
|
||||
valves = await getFunctionUserValvesById(localStorage.token, selectedId);
|
||||
valvesSpec = await getFunctionUserValvesSpecById(localStorage.token, selectedId);
|
||||
}
|
||||
|
||||
if (valvesSpec) {
|
||||
// Convert array to string
|
||||
for (const property in valvesSpec.properties) {
|
||||
if (valvesSpec.properties[property]?.type === 'array') {
|
||||
valves[property] = (valves[property] ?? []).join(',');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
loading = false;
|
||||
};
|
||||
|
||||
const submitHandler = async () => {
|
||||
if (valvesSpec) {
|
||||
// Convert string to array
|
||||
for (const property in valvesSpec.properties) {
|
||||
if (valvesSpec.properties[property]?.type === 'array') {
|
||||
valves[property] = (valves[property] ?? '').split(',').map((v) => v.trim());
|
||||
}
|
||||
}
|
||||
|
||||
if (tab === 'tools') {
|
||||
const res = await updateToolUserValvesById(localStorage.token, selectedId, valves).catch(
|
||||
(error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
}
|
||||
);
|
||||
|
||||
if (res) {
|
||||
toast.success($i18n.t('Valves updated'));
|
||||
valves = res;
|
||||
}
|
||||
} else if (tab === 'functions') {
|
||||
const res = await updateFunctionUserValvesById(
|
||||
localStorage.token,
|
||||
selectedId,
|
||||
valves
|
||||
).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
toast.success($i18n.t('Valves updated'));
|
||||
valves = res;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
$: if (tab) {
|
||||
selectedId = '';
|
||||
}
|
||||
|
||||
$: if (selectedId) {
|
||||
getUserValves();
|
||||
}
|
||||
</script>
|
||||
|
||||
<form
|
||||
class="flex flex-col h-full justify-between space-y-3 text-sm"
|
||||
on:submit|preventDefault={() => {
|
||||
submitHandler();
|
||||
dispatch('save');
|
||||
}}
|
||||
>
|
||||
<div class="flex flex-col pr-1.5 overflow-y-scroll max-h-[25rem]">
|
||||
<div>
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<Tooltip content="">
|
||||
<div class="text-sm font-medium">
|
||||
{$i18n.t('Manage Valves')}
|
||||
</div>
|
||||
</Tooltip>
|
||||
|
||||
<div class=" self-end">
|
||||
<select
|
||||
class=" dark:bg-gray-900 w-fit pr-8 rounded text-xs bg-transparent outline-none text-right"
|
||||
bind:value={tab}
|
||||
placeholder="Select"
|
||||
>
|
||||
<option value="tools">{$i18n.t('Tools')}</option>
|
||||
<option value="functions">{$i18n.t('Functions')}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="space-y-1">
|
||||
<div class="flex gap-2">
|
||||
<div class="flex-1">
|
||||
<select
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
bind:value={selectedId}
|
||||
on:change={async () => {
|
||||
await tick();
|
||||
}}
|
||||
>
|
||||
{#if tab === 'tools'}
|
||||
<option value="" selected disabled class="bg-gray-100 dark:bg-gray-700"
|
||||
>{$i18n.t('Select a tool')}</option
|
||||
>
|
||||
|
||||
{#each $tools as tool, toolIdx}
|
||||
<option value={tool.id} class="bg-gray-100 dark:bg-gray-700">{tool.name}</option>
|
||||
{/each}
|
||||
{:else if tab === 'functions'}
|
||||
<option value="" selected disabled class="bg-gray-100 dark:bg-gray-700"
|
||||
>{$i18n.t('Select a function')}</option
|
||||
>
|
||||
|
||||
{#each $functions as func, funcIdx}
|
||||
<option value={func.id} class="bg-gray-100 dark:bg-700">{func.name}</option>
|
||||
{/each}
|
||||
{/if}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{#if selectedId}
|
||||
<hr class="dark:border-gray-800 my-3 w-full" />
|
||||
|
||||
<div>
|
||||
{#if !loading}
|
||||
{#if valvesSpec}
|
||||
{#each Object.keys(valvesSpec.properties) as property, idx}
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">
|
||||
{valvesSpec.properties[property].title}
|
||||
|
||||
{#if (valvesSpec?.required ?? []).includes(property)}
|
||||
<span class=" text-gray-500">*required</span>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
valves[property] =
|
||||
(valves[property] ?? null) === null
|
||||
? valvesSpec.properties[property]?.default ?? ''
|
||||
: null;
|
||||
}}
|
||||
>
|
||||
{#if (valves[property] ?? null) === null}
|
||||
<span class="ml-2 self-center">
|
||||
{#if (valvesSpec?.required ?? []).includes(property)}
|
||||
{$i18n.t('None')}
|
||||
{:else}
|
||||
{$i18n.t('Default')}
|
||||
{/if}
|
||||
</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center"> {$i18n.t('Custom')} </span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (valves[property] ?? null) !== null}
|
||||
<!-- {valves[property]} -->
|
||||
<div class="flex mt-0.5 mb-1.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
{#if valvesSpec.properties[property]?.enum ?? null}
|
||||
<select
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
bind:value={valves[property]}
|
||||
>
|
||||
{#each valvesSpec.properties[property].enum as option}
|
||||
<option value={option} selected={option === valves[property]}>
|
||||
{option}
|
||||
</option>
|
||||
{/each}
|
||||
</select>
|
||||
{:else if (valvesSpec.properties[property]?.type ?? null) === 'boolean'}
|
||||
<div class="flex justify-between items-center">
|
||||
<div class="text-xs text-gray-500">
|
||||
{valves[property] ? 'Enabled' : 'Disabled'}
|
||||
</div>
|
||||
|
||||
<div class=" pr-2">
|
||||
<Switch bind:state={valves[property]} />
|
||||
</div>
|
||||
</div>
|
||||
{:else}
|
||||
<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={valvesSpec.properties[property].title}
|
||||
bind:value={valves[property]}
|
||||
autocomplete="off"
|
||||
required
|
||||
/>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if (valvesSpec.properties[property]?.description ?? null) !== null}
|
||||
<div class="text-xs text-gray-500">
|
||||
{valvesSpec.properties[property].description}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/each}
|
||||
{:else}
|
||||
<div>No valves</div>
|
||||
{/if}
|
||||
{:else}
|
||||
<Spinner className="size-5" />
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class="flex justify-end 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>
|
||||
@@ -15,7 +15,6 @@
|
||||
import Chats from './Settings/Chats.svelte';
|
||||
import User from '../icons/User.svelte';
|
||||
import Personalization from './Settings/Personalization.svelte';
|
||||
import Valves from './Settings/Valves.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
@@ -188,30 +187,6 @@
|
||||
<div class=" self-center">{$i18n.t('Audio')}</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 ===
|
||||
'valves'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-100 dark:hover:bg-gray-850'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'valves';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-4"
|
||||
>
|
||||
<path
|
||||
d="M18.75 12.75h1.5a.75.75 0 0 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM12 6a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 6ZM12 18a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 18ZM3.75 6.75h1.5a.75.75 0 1 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM5.25 18.75h-1.5a.75.75 0 0 1 0-1.5h1.5a.75.75 0 0 1 0 1.5ZM3 12a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 3 12ZM9 3.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5ZM12.75 12a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM9 15.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Valves')}</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 ===
|
||||
'chats'
|
||||
@@ -349,13 +324,6 @@
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'valves'}
|
||||
<Valves
|
||||
{saveSettings}
|
||||
on:save={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'chats'}
|
||||
<Chats {saveSettings} />
|
||||
{:else if selectedTab === 'account'}
|
||||
|
||||
@@ -1,14 +1,41 @@
|
||||
<script lang="ts">
|
||||
import { slide } from 'svelte/transition';
|
||||
import { quintOut } from 'svelte/easing';
|
||||
|
||||
import ChevronUp from '../icons/ChevronUp.svelte';
|
||||
import ChevronDown from '../icons/ChevronDown.svelte';
|
||||
|
||||
export let open = false;
|
||||
export let className = '';
|
||||
export let title = null;
|
||||
</script>
|
||||
|
||||
<div class={className}>
|
||||
<button on:click={() => (open = !open)}>
|
||||
<slot />
|
||||
</button>
|
||||
{#if title !== null}
|
||||
<button class="w-full" on:click={() => (open = !open)}>
|
||||
<div class=" w-full font-medium transition flex items-center justify-between gap-2">
|
||||
<div>
|
||||
{title}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
{#if open}
|
||||
<ChevronUp strokeWidth="3.5" className="size-3.5 " />
|
||||
{:else}
|
||||
<ChevronDown strokeWidth="3.5" className="size-3.5 " />
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</button>
|
||||
{:else}
|
||||
<button on:click={() => (open = !open)}>
|
||||
<div
|
||||
class="flex items-center gap-2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300 transition"
|
||||
>
|
||||
<slot />
|
||||
</div>
|
||||
</button>
|
||||
{/if}
|
||||
|
||||
{#if open}
|
||||
<div transition:slide={{ duration: 300, easing: quintOut, axis: 'y' }}>
|
||||
|
||||
@@ -13,7 +13,12 @@
|
||||
export let cancelLabel = $i18n.t('Cancel');
|
||||
export let confirmLabel = $i18n.t('Confirm');
|
||||
|
||||
export let input = false;
|
||||
export let inputPlaceholder = '';
|
||||
export let inputValue = '';
|
||||
|
||||
export let show = false;
|
||||
|
||||
let modalElement = null;
|
||||
let mounted = false;
|
||||
|
||||
@@ -73,6 +78,16 @@
|
||||
{:else}
|
||||
{$i18n.t('This action cannot be undone. Do you wish to continue?')}
|
||||
{/if}
|
||||
|
||||
{#if input}
|
||||
<textarea
|
||||
bind:value={inputValue}
|
||||
placeholder={inputPlaceholder ? inputPlaceholder : $i18n.t('Enter your message')}
|
||||
class="w-full mt-2 rounded-lg px-4 py-2 text-sm dark:text-gray-300 dark:bg-gray-900 outline-none resize-none"
|
||||
rows="3"
|
||||
required
|
||||
/>
|
||||
{/if}
|
||||
</div>
|
||||
</slot>
|
||||
|
||||
@@ -91,7 +106,7 @@
|
||||
class="bg-gray-900 hover:bg-gray-850 text-gray-100 dark:bg-gray-100 dark:hover:bg-white dark:text-gray-800 font-medium w-full py-2.5 rounded-lg transition"
|
||||
on:click={() => {
|
||||
show = false;
|
||||
dispatch('confirm');
|
||||
dispatch('confirm', inputValue);
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
|
||||
@@ -0,0 +1,154 @@
|
||||
<script lang="ts">
|
||||
import { createEventDispatcher, getContext } from 'svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
export let className = 'w-72';
|
||||
export let colorClassName = 'bg-white dark:bg-gray-800';
|
||||
export let url: string | null = null;
|
||||
|
||||
export let clickHandler: Function | null = null;
|
||||
|
||||
export let dismissible = false;
|
||||
export let status = 'processed';
|
||||
|
||||
export let name: string;
|
||||
export let type: string;
|
||||
export let size: number;
|
||||
|
||||
function formatSize(size) {
|
||||
if (size == null) return 'Unknown size';
|
||||
if (typeof size !== 'number' || size < 0) return 'Invalid size';
|
||||
if (size === 0) return '0 B';
|
||||
const units = ['B', 'KB', 'MB', 'GB', 'TB'];
|
||||
let unitIndex = 0;
|
||||
|
||||
while (size >= 1024 && unitIndex < units.length - 1) {
|
||||
size /= 1024;
|
||||
unitIndex++;
|
||||
}
|
||||
return `${size.toFixed(1)} ${units[unitIndex]}`;
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="relative group">
|
||||
<button
|
||||
class="h-14 {className} flex items-center space-x-3 {colorClassName} rounded-xl border border-gray-100 dark:border-gray-800 text-left"
|
||||
type="button"
|
||||
on:click={async () => {
|
||||
if (clickHandler === null) {
|
||||
if (url) {
|
||||
if (type === 'file') {
|
||||
window.open(`${url}/content`, '_blank').focus();
|
||||
} else {
|
||||
window.open(`${url}`, '_blank').focus();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
clickHandler();
|
||||
}
|
||||
}}
|
||||
>
|
||||
<div class="p-4 py-[1.1rem] bg-red-400 text-white rounded-l-xl">
|
||||
{#if status === 'processed'}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class=" size-5"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625ZM7.5 15a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 7.5 15Zm.75 2.25a.75.75 0 0 0 0 1.5H12a.75.75 0 0 0 0-1.5H8.25Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
<path
|
||||
d="M12.971 1.816A5.23 5.23 0 0 1 14.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 0 1 3.434 1.279 9.768 9.768 0 0 0-6.963-6.963Z"
|
||||
/>
|
||||
</svg>
|
||||
{:else}
|
||||
<svg
|
||||
class=" size-5 translate-y-[0.5px]"
|
||||
fill="currentColor"
|
||||
viewBox="0 0 24 24"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
><style>
|
||||
.spinner_qM83 {
|
||||
animation: spinner_8HQG 1.05s infinite;
|
||||
}
|
||||
.spinner_oXPr {
|
||||
animation-delay: 0.1s;
|
||||
}
|
||||
.spinner_ZTLf {
|
||||
animation-delay: 0.2s;
|
||||
}
|
||||
@keyframes spinner_8HQG {
|
||||
0%,
|
||||
57.14% {
|
||||
animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);
|
||||
transform: translate(0);
|
||||
}
|
||||
28.57% {
|
||||
animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);
|
||||
transform: translateY(-6px);
|
||||
}
|
||||
100% {
|
||||
transform: translate(0);
|
||||
}
|
||||
}
|
||||
</style><circle class="spinner_qM83" cx="4" cy="12" r="2.5" /><circle
|
||||
class="spinner_qM83 spinner_oXPr"
|
||||
cx="12"
|
||||
cy="12"
|
||||
r="2.5"
|
||||
/><circle class="spinner_qM83 spinner_ZTLf" cx="20" cy="12" r="2.5" /></svg
|
||||
>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col justify-center -space-y-0.5 pl-1.5 pr-4 w-full">
|
||||
<div class=" dark:text-gray-100 text-sm font-medium line-clamp-1 mb-1">
|
||||
{name}
|
||||
</div>
|
||||
|
||||
<div class=" flex justify-between text-gray-500 text-xs">
|
||||
{#if type === 'file'}
|
||||
{$i18n.t('File')}
|
||||
{:else if type === 'doc'}
|
||||
{$i18n.t('Document')}
|
||||
{:else if type === 'collection'}
|
||||
{$i18n.t('Collection')}
|
||||
{:else}
|
||||
<span class=" capitalize">{type}</span>
|
||||
{/if}
|
||||
{#if size}
|
||||
<span class="capitalize">{formatSize(size)}</span>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</button>
|
||||
|
||||
{#if dismissible}
|
||||
<div class=" absolute -top-1 -right-1">
|
||||
<button
|
||||
class=" bg-gray-400 text-white border border-white rounded-full group-hover:visible invisible transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
dispatch('dismiss');
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
@@ -1,6 +1,7 @@
|
||||
<script lang="ts">
|
||||
export let value: string = '';
|
||||
export let placeholder = '';
|
||||
export let required = true;
|
||||
export let readOnly = false;
|
||||
export let outerClassName = 'flex flex-1';
|
||||
export let inputClassName =
|
||||
@@ -12,13 +13,13 @@
|
||||
|
||||
<div class={outerClassName}>
|
||||
<input
|
||||
class={inputClassName}
|
||||
class={`${inputClassName} ${show ? '' : 'password'}`}
|
||||
{placeholder}
|
||||
bind:value
|
||||
required={!readOnly}
|
||||
required={required && !readOnly}
|
||||
disabled={readOnly}
|
||||
autocomplete="off"
|
||||
{...{ type: show ? 'text' : 'password' }}
|
||||
type="text"
|
||||
/>
|
||||
<button
|
||||
class={showButtonClassName}
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
{/each}
|
||||
</datalist>
|
||||
|
||||
<button type="button" on:click={addTagHandler}>
|
||||
<button type="button" aria-label={$i18n.t('Save Tag')} on:click={addTagHandler}>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
@@ -63,6 +63,7 @@
|
||||
<button
|
||||
class=" cursor-pointer self-center p-0.5 flex h-fit items-center dark:hover:bg-gray-700 rounded-full transition border dark:border-gray-600 border-dashed"
|
||||
type="button"
|
||||
aria-label={$i18n.t('Add Tag')}
|
||||
on:click={() => {
|
||||
showTagInput = !showTagInput;
|
||||
}}
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
<script>
|
||||
import { onMount, getContext, createEventDispatcher } from 'svelte';
|
||||
const dispatch = createEventDispatcher();
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
import Switch from './Switch.svelte';
|
||||
|
||||
export let valvesSpec = null;
|
||||
export let valves = {};
|
||||
</script>
|
||||
|
||||
{#if valvesSpec && Object.keys(valvesSpec?.properties ?? {}).length}
|
||||
{#each Object.keys(valvesSpec.properties) as property, idx}
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">
|
||||
{valvesSpec.properties[property].title}
|
||||
|
||||
{#if (valvesSpec?.required ?? []).includes(property)}
|
||||
<span class=" text-gray-500">*required</span>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
valves[property] =
|
||||
(valves[property] ?? null) === null
|
||||
? valvesSpec.properties[property]?.default ?? ''
|
||||
: null;
|
||||
|
||||
dispatch('change');
|
||||
}}
|
||||
>
|
||||
{#if (valves[property] ?? null) === null}
|
||||
<span class="ml-2 self-center">
|
||||
{#if (valvesSpec?.required ?? []).includes(property)}
|
||||
{$i18n.t('None')}
|
||||
{:else}
|
||||
{$i18n.t('Default')}
|
||||
{/if}
|
||||
</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center"> {$i18n.t('Custom')} </span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (valves[property] ?? null) !== null}
|
||||
<!-- {valves[property]} -->
|
||||
<div class="flex mt-0.5 mb-1.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
{#if valvesSpec.properties[property]?.enum ?? null}
|
||||
<select
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none border border-gray-100 dark:border-gray-800"
|
||||
bind:value={valves[property]}
|
||||
on:change={() => {
|
||||
dispatch('change');
|
||||
}}
|
||||
>
|
||||
{#each valvesSpec.properties[property].enum as option}
|
||||
<option value={option} selected={option === valves[property]}>
|
||||
{option}
|
||||
</option>
|
||||
{/each}
|
||||
</select>
|
||||
{:else if (valvesSpec.properties[property]?.type ?? null) === 'boolean'}
|
||||
<div class="flex justify-between items-center">
|
||||
<div class="text-xs text-gray-500">
|
||||
{valves[property] ? 'Enabled' : 'Disabled'}
|
||||
</div>
|
||||
|
||||
<div class=" pr-2">
|
||||
<Switch
|
||||
bind:state={valves[property]}
|
||||
on:change={() => {
|
||||
dispatch('change');
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{:else}
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none border border-gray-100 dark:border-gray-800"
|
||||
type="text"
|
||||
placeholder={valvesSpec.properties[property].title}
|
||||
bind:value={valves[property]}
|
||||
autocomplete="off"
|
||||
required
|
||||
on:change={() => {
|
||||
dispatch('change');
|
||||
}}
|
||||
/>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if (valvesSpec.properties[property]?.description ?? null) !== null}
|
||||
<div class="text-xs text-gray-500">
|
||||
{valvesSpec.properties[property].description}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/each}
|
||||
{:else}
|
||||
<div class="text-xs">No valves</div>
|
||||
{/if}
|
||||
@@ -16,6 +16,7 @@
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let show = false;
|
||||
export let uploadDoc: Function;
|
||||
let uploadDocInputElement: HTMLInputElement;
|
||||
let inputFiles;
|
||||
let tags = [];
|
||||
@@ -26,32 +27,6 @@
|
||||
content: null
|
||||
};
|
||||
|
||||
const uploadDoc = async (file) => {
|
||||
const res = await uploadDocToVectorDB(localStorage.token, '', file).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
await createNewDoc(
|
||||
localStorage.token,
|
||||
res.collection_name,
|
||||
res.filename,
|
||||
transformFileName(res.filename),
|
||||
res.filename,
|
||||
tags.length > 0
|
||||
? {
|
||||
tags: tags
|
||||
}
|
||||
: null
|
||||
).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
await documents.set(await getDocs(localStorage.token));
|
||||
}
|
||||
};
|
||||
|
||||
const submitHandler = async () => {
|
||||
if (inputFiles && inputFiles.length > 0) {
|
||||
for (const file of inputFiles) {
|
||||
@@ -60,12 +35,12 @@
|
||||
SUPPORTED_FILE_TYPE.includes(file['type']) ||
|
||||
SUPPORTED_FILE_EXTENSIONS.includes(file.name.split('.').at(-1))
|
||||
) {
|
||||
uploadDoc(file);
|
||||
uploadDoc(file, tags);
|
||||
} else {
|
||||
toast.error(
|
||||
`Unknown File Type '${file['type']}', but accepting and treating as plain text`
|
||||
);
|
||||
uploadDoc(file);
|
||||
uploadDoc(file, tags);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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="M9.813 15.904 9 18.75l-.813-2.846a4.5 4.5 0 0 0-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 0 0 3.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 0 0 3.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 0 0-3.09 3.09ZM18.259 8.715 18 9.75l-.259-1.035a3.375 3.375 0 0 0-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 0 0 2.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 0 0 2.456 2.456L21.75 6l-1.035.259a3.375 3.375 0 0 0-2.456 2.456ZM16.894 20.567 16.5 21.75l-.394-1.183a2.25 2.25 0 0 0-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 0 0 1.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 0 0 1.423 1.423l1.183.394-1.183.394a2.25 2.25 0 0 0-1.423 1.423Z"
|
||||
/>
|
||||
</svg>
|
||||
@@ -238,7 +238,7 @@
|
||||
<div class="px-2.5 flex justify-between space-x-1 text-gray-600 dark:text-gray-400">
|
||||
<a
|
||||
id="sidebar-new-chat-button"
|
||||
class="flex flex-1 justify-between rounded-xl px-2 py-2 hover:bg-gray-100 dark:hover:bg-gray-850 transition"
|
||||
class="flex flex-1 justify-between rounded-xl px-2 py-2 hover:bg-gray-100 dark:hover:bg-gray-900 transition"
|
||||
href="/"
|
||||
draggable="false"
|
||||
on:click={async () => {
|
||||
@@ -282,7 +282,7 @@
|
||||
</a>
|
||||
|
||||
<button
|
||||
class=" cursor-pointer px-2 py-2 flex rounded-xl hover:bg-gray-100 dark:hover:bg-gray-850 transition"
|
||||
class=" cursor-pointer px-2 py-2 flex rounded-xl hover:bg-gray-100 dark:hover:bg-gray-900 transition"
|
||||
on:click={() => {
|
||||
showSidebar.set(!$showSidebar);
|
||||
}}
|
||||
|
||||
@@ -8,14 +8,16 @@
|
||||
import { createNewDoc, deleteDocByName, getDocs } from '$lib/apis/documents';
|
||||
|
||||
import { SUPPORTED_FILE_TYPE, SUPPORTED_FILE_EXTENSIONS } from '$lib/constants';
|
||||
import { uploadDocToVectorDB } from '$lib/apis/rag';
|
||||
import { transformFileName } from '$lib/utils';
|
||||
import { processDocToVectorDB, uploadDocToVectorDB } from '$lib/apis/rag';
|
||||
import { blobToFile, transformFileName } from '$lib/utils';
|
||||
|
||||
import Checkbox from '$lib/components/common/Checkbox.svelte';
|
||||
|
||||
import EditDocModal from '$lib/components/documents/EditDocModal.svelte';
|
||||
import AddFilesPlaceholder from '$lib/components/AddFilesPlaceholder.svelte';
|
||||
import AddDocModal from '$lib/components/documents/AddDocModal.svelte';
|
||||
import { transcribeAudio } from '$lib/apis/audio';
|
||||
import { uploadFile } from '$lib/apis/files';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
@@ -49,8 +51,29 @@
|
||||
await documents.set(await getDocs(localStorage.token));
|
||||
};
|
||||
|
||||
const uploadDoc = async (file) => {
|
||||
const res = await uploadDocToVectorDB(localStorage.token, '', file).catch((error) => {
|
||||
const uploadDoc = async (file, tags?: object) => {
|
||||
console.log(file);
|
||||
// Check if the file is an audio file and transcribe/convert it to text file
|
||||
if (['audio/mpeg', 'audio/wav'].includes(file['type'])) {
|
||||
const transcribeRes = await transcribeAudio(localStorage.token, file).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (transcribeRes) {
|
||||
console.log(transcribeRes);
|
||||
const blob = new Blob([transcribeRes.text], { type: 'text/plain' });
|
||||
file = blobToFile(blob, `${file.name}.txt`);
|
||||
}
|
||||
}
|
||||
|
||||
// Upload the file to the server
|
||||
const uploadedFile = await uploadFile(localStorage.token, file).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
const res = await processDocToVectorDB(localStorage.token, uploadedFile.id).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
@@ -61,7 +84,12 @@
|
||||
res.collection_name,
|
||||
res.filename,
|
||||
transformFileName(res.filename),
|
||||
res.filename
|
||||
res.filename,
|
||||
tags?.length > 0
|
||||
? {
|
||||
tags: tags
|
||||
}
|
||||
: null
|
||||
).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
@@ -182,7 +210,7 @@
|
||||
<EditDocModal bind:show={showEditDocModal} {selectedDoc} />
|
||||
{/key}
|
||||
|
||||
<AddDocModal bind:show={showAddDocModal} />
|
||||
<AddDocModal bind:show={showAddDocModal} {uploadDoc} />
|
||||
|
||||
<div class="mb-3">
|
||||
<div class="flex justify-between items-center">
|
||||
@@ -216,6 +244,7 @@
|
||||
<div>
|
||||
<button
|
||||
class=" px-2 py-2 rounded-xl border border-gray-200 dark:border-gray-600 dark:border-0 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 transition font-medium text-sm flex items-center space-x-1"
|
||||
aria-label={$i18n.t('Add Docs')}
|
||||
on:click={() => {
|
||||
showAddDocModal = true;
|
||||
}}
|
||||
@@ -418,6 +447,7 @@
|
||||
<button
|
||||
class="self-center w-fit text-sm z-20 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"
|
||||
aria-label={$i18n.t('Edit Doc')}
|
||||
on:click={async (e) => {
|
||||
e.stopPropagation();
|
||||
showEditDocModal = !showEditDocModal;
|
||||
@@ -465,6 +495,7 @@
|
||||
<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"
|
||||
aria-label={$i18n.t('Delete Doc')}
|
||||
on:click={(e) => {
|
||||
e.stopPropagation();
|
||||
|
||||
@@ -518,7 +549,8 @@
|
||||
doc.collection_name,
|
||||
doc.filename,
|
||||
doc.name,
|
||||
doc.title
|
||||
doc.title,
|
||||
doc.content
|
||||
).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
|
||||
@@ -122,12 +122,17 @@
|
||||
|
||||
if (res) {
|
||||
if (func.is_global) {
|
||||
toast.success($i18n.t('Filter is now globally enabled'));
|
||||
func.type === 'filter'
|
||||
? toast.success($i18n.t('Filter is now globally enabled'))
|
||||
: toast.success($i18n.t('Function is now globally enabled'));
|
||||
} else {
|
||||
toast.success($i18n.t('Filter is now globally disabled'));
|
||||
func.type === 'filter'
|
||||
? toast.success($i18n.t('Filter is now globally disabled'))
|
||||
: toast.success($i18n.t('Function is now globally disabled'));
|
||||
}
|
||||
|
||||
functions.set(await getFunctions(localStorage.token));
|
||||
models.set(await getModels(localStorage.token));
|
||||
}
|
||||
};
|
||||
</script>
|
||||
@@ -230,7 +235,7 @@
|
||||
</a>
|
||||
<div class="flex flex-row gap-0.5 self-center">
|
||||
{#if func?.meta?.manifest?.funding_url ?? false}
|
||||
<Tooltip content="Support">
|
||||
<Tooltip content={$i18n.t('Support')}>
|
||||
<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"
|
||||
@@ -244,7 +249,7 @@
|
||||
</Tooltip>
|
||||
{/if}
|
||||
|
||||
<Tooltip content="Valves">
|
||||
<Tooltip content={$i18n.t('Valves')}>
|
||||
<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"
|
||||
@@ -294,7 +299,7 @@
|
||||
showDeleteConfirm = true;
|
||||
}}
|
||||
toggleGlobalHandler={() => {
|
||||
if (func.type === 'filter') {
|
||||
if (['filter', 'action'].includes(func.type)) {
|
||||
toggleGlobalHandler(func);
|
||||
}
|
||||
}}
|
||||
@@ -309,7 +314,7 @@
|
||||
</FunctionMenu>
|
||||
|
||||
<div class=" self-center mx-1">
|
||||
<Tooltip content={func.is_active ? 'Enabled' : 'Disabled'}>
|
||||
<Tooltip content={func.is_active ? $i18n.t('Enabled') : $i18n.t('Disabled')}>
|
||||
<Switch
|
||||
bind:state={func.is_active}
|
||||
on:change={async (e) => {
|
||||
@@ -489,15 +494,15 @@
|
||||
<div>Please carefully review the following warnings:</div>
|
||||
|
||||
<ul class=" mt-1 list-disc pl-4 text-xs">
|
||||
<li>Functions allow arbitrary code execution.</li>
|
||||
<li>Do not install functions from sources you do not fully trust.</li>
|
||||
<li>{$i18n.t('Functions allow arbitrary code execution.')}</li>
|
||||
<li>{$i18n.t('Do not install functions from sources you do not fully trust.')}</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="my-3">
|
||||
I acknowledge that I have read and I understand the implications of my action. I am aware of
|
||||
the risks associated with executing arbitrary code and I have verified the trustworthiness of
|
||||
the source.
|
||||
{$i18n.t(
|
||||
'I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.'
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</ConfirmDialog>
|
||||
|
||||
@@ -309,7 +309,7 @@ class Pipe:
|
||||
<input
|
||||
class="w-full px-3 py-2 text-sm font-medium bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
|
||||
type="text"
|
||||
placeholder="Function Name (e.g. My Filter)"
|
||||
placeholder={$i18n.t('Function Name (e.g. My Filter)')}
|
||||
bind:value={name}
|
||||
required
|
||||
/>
|
||||
@@ -317,7 +317,7 @@ class Pipe:
|
||||
<input
|
||||
class="w-full px-3 py-2 text-sm font-medium disabled:text-gray-300 dark:disabled:text-gray-700 bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
|
||||
type="text"
|
||||
placeholder="Function ID (e.g. my_filter)"
|
||||
placeholder={$i18n.t('Function ID (e.g. my_filter)')}
|
||||
bind:value={id}
|
||||
required
|
||||
disabled={edit}
|
||||
@@ -326,7 +326,9 @@ class Pipe:
|
||||
<input
|
||||
class="w-full px-3 py-2 text-sm font-medium bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
|
||||
type="text"
|
||||
placeholder="Function Description (e.g. A filter to remove profanity from text)"
|
||||
placeholder={$i18n.t(
|
||||
'Function Description (e.g. A filter to remove profanity from text)'
|
||||
)}
|
||||
bind:value={meta.description}
|
||||
required
|
||||
/>
|
||||
@@ -348,10 +350,10 @@ class Pipe:
|
||||
<div class="pb-3 flex justify-between">
|
||||
<div class="flex-1 pr-3">
|
||||
<div class="text-xs text-gray-500 line-clamp-2">
|
||||
<span class=" font-semibold dark:text-gray-200">Warning:</span> Functions allow
|
||||
arbitrary code execution <br />—
|
||||
<span class=" font-semibold dark:text-gray-200">{$i18n.t('Warning:')}</span>
|
||||
{$i18n.t('Functions allow arbitrary code execution')} <br />—
|
||||
<span class=" font-medium dark:text-gray-400"
|
||||
>don't install random functions from sources you don't trust.</span
|
||||
>{$i18n.t(`don't install random functions from sources you don't trust.`)}</span
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
@@ -376,18 +378,18 @@ class Pipe:
|
||||
>
|
||||
<div class="text-sm text-gray-500">
|
||||
<div class=" bg-yellow-500/20 text-yellow-700 dark:text-yellow-200 rounded-lg px-4 py-3">
|
||||
<div>Please carefully review the following warnings:</div>
|
||||
<div>{$i18n.t('Please carefully review the following warnings:')}</div>
|
||||
|
||||
<ul class=" mt-1 list-disc pl-4 text-xs">
|
||||
<li>Functions allow arbitrary code execution.</li>
|
||||
<li>Do not install functions from sources you do not fully trust.</li>
|
||||
<li>{$i18n.t('Functions allow arbitrary code execution.')}</li>
|
||||
<li>{$i18n.t('Do not install functions from sources you do not fully trust.')}</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="my-3">
|
||||
I acknowledge that I have read and I understand the implications of my action. I am aware of
|
||||
the risks associated with executing arbitrary code and I have verified the trustworthiness of
|
||||
the source.
|
||||
{$i18n.t(
|
||||
'I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.'
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</ConfirmDialog>
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
align="start"
|
||||
transition={flyAndScale}
|
||||
>
|
||||
{#if func.type === 'filter'}
|
||||
{#if ['filter', 'action'].includes(func.type)}
|
||||
<div
|
||||
class="flex gap-2 justify-between items-center px-3 py-2 text-sm font-medium cursor-pointerrounded-md"
|
||||
>
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
<script lang="ts">
|
||||
import { getContext, onMount } from 'svelte';
|
||||
import Checkbox from '$lib/components/common/Checkbox.svelte';
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let actions = [];
|
||||
export let selectedActionIds = [];
|
||||
|
||||
let _actions = {};
|
||||
|
||||
onMount(() => {
|
||||
_actions = actions.reduce((acc, action) => {
|
||||
acc[action.id] = {
|
||||
...action,
|
||||
selected: selectedActionIds.includes(action.id)
|
||||
};
|
||||
|
||||
return acc;
|
||||
}, {});
|
||||
});
|
||||
</script>
|
||||
|
||||
<div>
|
||||
<div class="flex w-full justify-between mb-1">
|
||||
<div class=" self-center text-sm font-semibold">{$i18n.t('Actions')}</div>
|
||||
</div>
|
||||
|
||||
<div class=" text-xs dark:text-gray-500">
|
||||
{$i18n.t('To select actions here, add them to the "Functions" workspace first.')}
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col">
|
||||
{#if actions.length > 0}
|
||||
<div class=" flex items-center mt-2 flex-wrap">
|
||||
{#each Object.keys(_actions) as action, actionIdx}
|
||||
<div class=" flex items-center gap-2 mr-3">
|
||||
<div class="self-center flex items-center">
|
||||
<Checkbox
|
||||
state={_actions[action].selected ? 'checked' : 'unchecked'}
|
||||
on:change={(e) => {
|
||||
_actions[action].selected = e.detail === 'checked';
|
||||
selectedActionIds = Object.keys(_actions).filter((t) => _actions[t].selected);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 text-sm w-full capitalize font-medium">
|
||||
<Tooltip content={_actions[action].meta.description}>
|
||||
{_actions[action].name}
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
@@ -221,7 +221,7 @@
|
||||
</Tooltip>
|
||||
{/if}
|
||||
|
||||
<Tooltip content="Valves">
|
||||
<Tooltip content={$i18n.t('Valves')}>
|
||||
<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"
|
||||
@@ -436,18 +436,20 @@
|
||||
>
|
||||
<div class="text-sm text-gray-500">
|
||||
<div class=" bg-yellow-500/20 text-yellow-700 dark:text-yellow-200 rounded-lg px-4 py-3">
|
||||
<div>Please carefully review the following warnings:</div>
|
||||
<div>{$i18n.t('Please carefully review the following warnings:')}</div>
|
||||
|
||||
<ul class=" mt-1 list-disc pl-4 text-xs">
|
||||
<li>Tools have a function calling system that allows arbitrary code execution.</li>
|
||||
<li>Do not install tools from sources you do not fully trust.</li>
|
||||
<li>
|
||||
{$i18n.t('Tools have a function calling system that allows arbitrary code execution')}.
|
||||
</li>
|
||||
<li>{$i18n.t('Do not install tools from sources you do not fully trust.')}</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="my-3">
|
||||
I acknowledge that I have read and I understand the implications of my action. I am aware of
|
||||
the risks associated with executing arbitrary code and I have verified the trustworthiness of
|
||||
the source.
|
||||
{$i18n.t(
|
||||
'I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.'
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</ConfirmDialog>
|
||||
|
||||
@@ -197,7 +197,7 @@ class Tools:
|
||||
<input
|
||||
class="w-full px-3 py-2 text-sm font-medium bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
|
||||
type="text"
|
||||
placeholder="Toolkit Name (e.g. My ToolKit)"
|
||||
placeholder={$i18n.t('Toolkit Name (e.g. My ToolKit)')}
|
||||
bind:value={name}
|
||||
required
|
||||
/>
|
||||
@@ -205,7 +205,7 @@ class Tools:
|
||||
<input
|
||||
class="w-full px-3 py-2 text-sm font-medium disabled:text-gray-300 dark:disabled:text-gray-700 bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
|
||||
type="text"
|
||||
placeholder="Toolkit ID (e.g. my_toolkit)"
|
||||
placeholder={$i18n.t('Toolkit ID (e.g. my_toolkit)')}
|
||||
bind:value={id}
|
||||
required
|
||||
disabled={edit}
|
||||
@@ -214,7 +214,9 @@ class Tools:
|
||||
<input
|
||||
class="w-full px-3 py-2 text-sm font-medium bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
|
||||
type="text"
|
||||
placeholder="Toolkit Description (e.g. A toolkit for performing various operations)"
|
||||
placeholder={$i18n.t(
|
||||
'Toolkit Description (e.g. A toolkit for performing various operations)'
|
||||
)}
|
||||
bind:value={meta.description}
|
||||
required
|
||||
/>
|
||||
@@ -236,10 +238,10 @@ class Tools:
|
||||
<div class="pb-3 flex justify-between">
|
||||
<div class="flex-1 pr-3">
|
||||
<div class="text-xs text-gray-500 line-clamp-2">
|
||||
<span class=" font-semibold dark:text-gray-200">Warning:</span> Tools are a function
|
||||
calling system with arbitrary code execution <br />—
|
||||
<span class=" font-semibold dark:text-gray-200">{$i18n.t('Warning:')}</span>
|
||||
{$i18n.t('Tools are a function calling system with arbitrary code execution')} <br />—
|
||||
<span class=" font-medium dark:text-gray-400"
|
||||
>don't install random tools from sources you don't trust.</span
|
||||
>{$i18n.t(`don't install random tools from sources you don't trust.`)}</span
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
@@ -264,18 +266,20 @@ class Tools:
|
||||
>
|
||||
<div class="text-sm text-gray-500">
|
||||
<div class=" bg-yellow-500/20 text-yellow-700 dark:text-yellow-200 rounded-lg px-4 py-3">
|
||||
<div>Please carefully review the following warnings:</div>
|
||||
<div>{$i18n.t('Please carefully review the following warnings:')}</div>
|
||||
|
||||
<ul class=" mt-1 list-disc pl-4 text-xs">
|
||||
<li>Tools have a function calling system that allows arbitrary code execution.</li>
|
||||
<li>Do not install tools from sources you do not fully trust.</li>
|
||||
<li>
|
||||
{$i18n.t('Tools have a function calling system that allows arbitrary code execution.')}
|
||||
</li>
|
||||
<li>{$i18n.t('Do not install tools from sources you do not fully trust.')}</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="my-3">
|
||||
I acknowledge that I have read and I understand the implications of my action. I am aware of
|
||||
the risks associated with executing arbitrary code and I have verified the trustworthiness of
|
||||
the source.
|
||||
{$i18n.t(
|
||||
'I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.'
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</ConfirmDialog>
|
||||
|
||||
@@ -44,23 +44,25 @@
|
||||
}}
|
||||
>
|
||||
<div class="px-1 text-sm">
|
||||
<div class=" my-2">
|
||||
The developers behind this plugin are passionate volunteers from the community. If you
|
||||
find this plugin helpful, please consider contributing to its development.
|
||||
<div class="my-2">
|
||||
{$i18n.t(
|
||||
'The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.'
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div class=" my-2">
|
||||
Your entire contribution will go directly to the plugin developer; Open WebUI does not
|
||||
take any percentage. However, the chosen funding platform might have its own fees.
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-800 my-3" />
|
||||
|
||||
<div class="my-2">
|
||||
Support this plugin: <a
|
||||
{$i18n.t(
|
||||
'Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.'
|
||||
)}
|
||||
</div>
|
||||
|
||||
<hr class="dark:border-gray-800 my-3" />
|
||||
<div class="my-2">
|
||||
{$i18n.t('Support this plugin:')}
|
||||
<a
|
||||
href={manifest.funding_url}
|
||||
target="_blank"
|
||||
class=" underline text-blue-400 hover:text-blue-300">{manifest.funding_url}</a
|
||||
class="underline text-blue-400 hover:text-blue-300">{manifest.funding_url}</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
import { getToolValvesById, getToolValvesSpecById, updateToolValvesById } from '$lib/apis/tools';
|
||||
import Spinner from '../../common/Spinner.svelte';
|
||||
import Switch from '$lib/components/common/Switch.svelte';
|
||||
import Valves from '$lib/components/common/Valves.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
const dispatch = createEventDispatcher();
|
||||
@@ -127,91 +128,7 @@
|
||||
>
|
||||
<div class="px-1">
|
||||
{#if !loading}
|
||||
{#if valvesSpec}
|
||||
{#each Object.keys(valvesSpec.properties) as property, idx}
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">
|
||||
{valvesSpec.properties[property].title}
|
||||
|
||||
{#if (valvesSpec?.required ?? []).includes(property)}
|
||||
<span class=" text-gray-500">*required</span>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
valves[property] =
|
||||
(valves[property] ?? null) === null
|
||||
? valvesSpec.properties[property]?.default ?? ''
|
||||
: null;
|
||||
}}
|
||||
>
|
||||
{#if (valves[property] ?? null) === null}
|
||||
<span class="ml-2 self-center">
|
||||
{#if (valvesSpec?.required ?? []).includes(property)}
|
||||
{$i18n.t('None')}
|
||||
{:else}
|
||||
{$i18n.t('Default')}
|
||||
{/if}
|
||||
</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center"> {$i18n.t('Custom')} </span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (valves[property] ?? null) !== null}
|
||||
<!-- {valves[property]} -->
|
||||
<div class="flex mt-0.5 mb-1.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
{#if valvesSpec.properties[property]?.enum ?? null}
|
||||
<select
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
bind:value={valves[property]}
|
||||
>
|
||||
{#each valvesSpec.properties[property].enum as option}
|
||||
<option value={option} selected={option === valves[property]}>
|
||||
{option}
|
||||
</option>
|
||||
{/each}
|
||||
</select>
|
||||
{:else if (valvesSpec.properties[property]?.type ?? null) === 'boolean'}
|
||||
<div class="flex justify-between items-center">
|
||||
<div class="text-xs text-gray-500">
|
||||
{valves[property] ? 'Enabled' : 'Disabled'}
|
||||
</div>
|
||||
|
||||
<div class=" pr-2">
|
||||
<Switch bind:state={valves[property]} />
|
||||
</div>
|
||||
</div>
|
||||
{:else}
|
||||
<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={valvesSpec.properties[property].title}
|
||||
bind:value={valves[property]}
|
||||
autocomplete="off"
|
||||
required
|
||||
/>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if (valvesSpec.properties[property]?.description ?? null) !== null}
|
||||
<div class="text-xs text-gray-500">
|
||||
{valvesSpec.properties[property].description}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/each}
|
||||
{:else}
|
||||
<div class="text-sm">No valves</div>
|
||||
{/if}
|
||||
<Valves {valvesSpec} bind:valves />
|
||||
{:else}
|
||||
<Spinner className="size-5" />
|
||||
{/if}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "الحساب",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "معلومات دقيقة",
|
||||
"Actions": "",
|
||||
"Active Users": "",
|
||||
"Add": "أضف",
|
||||
"Add a model id": "إضافة معرف نموذج",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "إضافة ذكرايات",
|
||||
"Add message": "اضافة رسالة",
|
||||
"Add Model": "اضافة موديل",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "اضافة تاق",
|
||||
"Add User": "اضافة مستخدم",
|
||||
"Adjusting these settings will apply changes universally to all users.": "سيؤدي ضبط هذه الإعدادات إلى تطبيق التغييرات بشكل عام على كافة المستخدمين",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "حذف المحادثه",
|
||||
"Delete Chat": "حذف المحادثه.",
|
||||
"Delete chat?": "",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "",
|
||||
"Delete prompt?": "",
|
||||
"delete this link": "أحذف هذا الرابط",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "حذف {{name}}",
|
||||
"Description": "وصف",
|
||||
"Didn't fully follow instructions": "لم أتبع التعليمات بشكل كامل",
|
||||
"Disabled": "",
|
||||
"Discover a function": "",
|
||||
"Discover a model": "اكتشف نموذجا",
|
||||
"Discover a prompt": "اكتشاف موجه",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "اعرض اسم المستخدم بدلاً منك في الدردشة",
|
||||
"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": "",
|
||||
@@ -195,6 +201,8 @@
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "لا يجري أي اتصالات خارجية، وتظل بياناتك آمنة على الخادم المستضاف محليًا.",
|
||||
"Don't Allow": "لا تسمح بذلك",
|
||||
"Don't have an account?": "ليس لديك حساب؟",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "لا أحب النمط",
|
||||
"Done": "",
|
||||
"Download": "تحميل",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "تعديل الملف",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "تعديل المستخدم",
|
||||
"ElevenLabs": "",
|
||||
"Email": "البريد",
|
||||
"Embedding Batch Size": "",
|
||||
"Embedding Model": "نموذج التضمين",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "تمكين مشاركة المجتمع",
|
||||
"Enable New Sign Ups": "تفعيل عمليات التسجيل الجديدة",
|
||||
"Enable Web Search": "تمكين بحث الويب",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "تأكد من أن ملف CSV الخاص بك يتضمن 4 أعمدة بهذا الترتيب: Name, Email, Password, Role.",
|
||||
"Enter {{role}} message here": "أدخل رسالة {{role}} هنا",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "أدخل مفتاح واجهة برمجة تطبيقات Serpstack",
|
||||
"Enter stop sequence": "أدخل تسلسل التوقف",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "أدخل Top K",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "URL (e.g. http://localhost:11434)",
|
||||
"Enter Your Email": "أدخل البريد الاكتروني",
|
||||
"Enter Your Full Name": "أدخل الاسم كامل",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "ادخل كلمة المرور",
|
||||
"Enter Your Role": "أدخل الصلاحيات",
|
||||
"Error": "خطأ",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "",
|
||||
"File Mode": "وضع الملف",
|
||||
"File not found.": "لم يتم العثور على الملف.",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "",
|
||||
"Filter is now globally enabled": "",
|
||||
"Filters": "",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "عقوبة التردد",
|
||||
"Function created successfully": "",
|
||||
"Function deleted successfully": "",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "",
|
||||
"Functions": "",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "",
|
||||
"General": "عام",
|
||||
"General Settings": "الاعدادات العامة",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "إنشاء استعلام بحث",
|
||||
"Generation Info": "معلومات الجيل",
|
||||
"Get up and running with": "",
|
||||
"Global": "",
|
||||
"Good Response": "استجابة جيدة",
|
||||
"Google PSE API Key": "مفتاح واجهة برمجة تطبيقات PSE من Google",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "",
|
||||
"How can I help you today?": "كيف استطيع مساعدتك اليوم؟",
|
||||
"Hybrid Search": "البحث الهجين",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "توليد الصور (تجريبي)",
|
||||
"Image Generation Engine": "محرك توليد الصور",
|
||||
"Image Settings": "إعدادات الصورة",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "اختصارات لوحة المفاتيح",
|
||||
"Knowledge": "",
|
||||
"Language": "اللغة",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "آخر نشاط",
|
||||
"Last Modified": "",
|
||||
"Light": "فاتح",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "إدارة النماذج",
|
||||
"Manage Ollama Models": "Ollama إدارة موديلات ",
|
||||
"Manage Pipelines": "إدارة خطوط الأنابيب",
|
||||
"Manage Valves": "",
|
||||
"March": "مارس",
|
||||
"Max Tokens (num_predict)": "ماكس توكنز (num_predict)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "يمكن تنزيل 3 نماذج كحد أقصى في وقت واحد. الرجاء معاودة المحاولة في وقت لاحق.",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"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": "الحد الأدنى من النقاط",
|
||||
"Mirostat": "Mirostat",
|
||||
"Mirostat Eta": "Mirostat Eta",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "صمامات خطوط الأنابيب",
|
||||
"Plain text (.txt)": "نص عادي (.txt)",
|
||||
"Playground": "مكان التجربة",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "موقف ايجابي",
|
||||
"Previous 30 days": "أخر 30 يوم",
|
||||
"Previous 7 days": "أخر 7 أيام",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "من اليمين إلى اليسار",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "",
|
||||
"Save": "حفظ",
|
||||
"Save & Create": "حفظ وإنشاء",
|
||||
"Save & Update": "حفظ وتحديث",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "لم يعد حفظ سجلات الدردشة مباشرة في مساحة تخزين متصفحك مدعومًا. يرجى تخصيص بعض الوقت لتنزيل وحذف سجلات الدردشة الخاصة بك عن طريق النقر على الزر أدناه. لا تقلق، يمكنك بسهولة إعادة استيراد سجلات الدردشة الخاصة بك إلى الواجهة الخلفية من خلاله",
|
||||
"Scan": "مسح",
|
||||
"Scan complete!": "تم المسح",
|
||||
@@ -562,6 +588,8 @@
|
||||
"Success": "نجاح",
|
||||
"Successfully updated.": "تم التحديث بنجاح",
|
||||
"Suggested": "مقترحات",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "النظام",
|
||||
"System Prompt": "محادثة النظام",
|
||||
"Tags": "الوسوم",
|
||||
@@ -574,6 +602,7 @@
|
||||
"Text-to-Speech Engine": "محرك تحويل النص إلى كلام",
|
||||
"Tfs Z": "Tfs Z",
|
||||
"Thanks for your feedback!": "شكرا لملاحظاتك!",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "يجب أن تكون النتيجة قيمة تتراوح بين 0.0 (0%) و1.0 (100%).",
|
||||
"Theme": "الثيم",
|
||||
"Thinking...": "",
|
||||
@@ -597,6 +626,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "الى كتابة المحادثه",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "اليوم",
|
||||
@@ -607,7 +637,13 @@
|
||||
"Tool deleted successfully": "",
|
||||
"Tool imported successfully": "",
|
||||
"Tool updated successfully": "",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "هل تواجه مشكلة في الوصول",
|
||||
@@ -649,6 +685,7 @@
|
||||
"Version": "إصدار",
|
||||
"Voice": "",
|
||||
"Warning": "تحذير",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "تحذير: إذا قمت بتحديث أو تغيير نموذج التضمين الخاص بك، فستحتاج إلى إعادة استيراد كافة المستندات.",
|
||||
"Web": "Web",
|
||||
"Web API": "",
|
||||
@@ -675,6 +712,7 @@
|
||||
"You're a helpful assistant.": "مساعدك المفيد هنا",
|
||||
"You're now logged in.": "لقد قمت الآن بتسجيل الدخول.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Youtube تحميل اعدادات"
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "Акаунт",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Точни информация",
|
||||
"Actions": "",
|
||||
"Active Users": "",
|
||||
"Add": "Добавяне",
|
||||
"Add a model id": "Добавяне на ИД на модел",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "Добавяне на Памет",
|
||||
"Add message": "Добавяне на съобщение",
|
||||
"Add Model": "Добавяне на Модел",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "добавяне на тагове",
|
||||
"Add User": "Добавяне на потребител",
|
||||
"Adjusting these settings will apply changes universally to all users.": "При промяна на тези настройки промените се прилагат за всички потребители.",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "Изтриване на чат",
|
||||
"Delete Chat": "Изтриване на Чат",
|
||||
"Delete chat?": "",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "",
|
||||
"Delete prompt?": "",
|
||||
"delete this link": "Изтриване на този линк",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "Изтрито {{име}}",
|
||||
"Description": "Описание",
|
||||
"Didn't fully follow instructions": "Не следва инструкциите",
|
||||
"Disabled": "",
|
||||
"Discover a function": "",
|
||||
"Discover a model": "Открийте модел",
|
||||
"Discover a prompt": "Откриване на промпт",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Показване на потребителското име вместо Вие в чата",
|
||||
"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": "",
|
||||
@@ -195,6 +201,8 @@
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "няма външни връзки, и вашите данни остават сигурни на локално назначен сървър.",
|
||||
"Don't Allow": "Не Позволявай",
|
||||
"Don't have an account?": "Нямате акаунт?",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "Не харесваш стила?",
|
||||
"Done": "",
|
||||
"Download": "Изтегляне отменено",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "Редактиране на документ",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Редактиране на потребител",
|
||||
"ElevenLabs": "",
|
||||
"Email": "Имейл",
|
||||
"Embedding Batch Size": "",
|
||||
"Embedding Model": "Модел за вграждане",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "Разрешаване на споделяне в общност",
|
||||
"Enable New Sign Ups": "Вклюване на Нови Потребители",
|
||||
"Enable Web Search": "Разрешаване на търсене в уеб",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Уверете се, че вашият CSV файл включва 4 колони в следния ред: Име, Имейл, Парола, Роля.",
|
||||
"Enter {{role}} message here": "Въведете съобщение за {{role}} тук",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Въведете Serpstack API ключ",
|
||||
"Enter stop sequence": "Въведете стоп последователност",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "Въведете Top K",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "Въведете URL (напр. http://localhost:11434)",
|
||||
"Enter Your Email": "Въведете имейл",
|
||||
"Enter Your Full Name": "Въведете вашето пълно име",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "Въведете вашата парола",
|
||||
"Enter Your Role": "Въведете вашата роля",
|
||||
"Error": "Грешка",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "",
|
||||
"File Mode": "Файл Мод",
|
||||
"File not found.": "Файл не е намерен.",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "",
|
||||
"Filter is now globally enabled": "",
|
||||
"Filters": "",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "Наказание за честота",
|
||||
"Function created successfully": "",
|
||||
"Function deleted successfully": "",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "",
|
||||
"Functions": "",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "",
|
||||
"General": "Основни",
|
||||
"General Settings": "Основни Настройки",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "Генериране на заявка за търсене",
|
||||
"Generation Info": "Информация за Генерация",
|
||||
"Get up and running with": "",
|
||||
"Global": "",
|
||||
"Good Response": "Добра отговор",
|
||||
"Google PSE API Key": "Google PSE API ключ",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "",
|
||||
"How can I help you today?": "Как мога да ви помогна днес?",
|
||||
"Hybrid Search": "Hybrid Search",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "Генерация на изображения (Експериментално)",
|
||||
"Image Generation Engine": "Двигател за генериране на изображения",
|
||||
"Image Settings": "Настройки на изображения",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "Клавиши за бърз достъп",
|
||||
"Knowledge": "",
|
||||
"Language": "Език",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "Последни активни",
|
||||
"Last Modified": "",
|
||||
"Light": "Светъл",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "Управление на Моделите",
|
||||
"Manage Ollama Models": "Управление на Ollama Моделите",
|
||||
"Manage Pipelines": "Управление на тръбопроводи",
|
||||
"Manage Valves": "",
|
||||
"March": "Март",
|
||||
"Max Tokens (num_predict)": "Макс токени (num_predict)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимум 3 модели могат да бъдат сваляни едновременно. Моля, опитайте отново по-късно.",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"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": "Минимална оценка",
|
||||
"Mirostat": "Mirostat",
|
||||
"Mirostat Eta": "Mirostat Eta",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "Тръбопроводи Вентили",
|
||||
"Plain text (.txt)": "Plain text (.txt)",
|
||||
"Playground": "Плейграунд",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "Позитивна ативност",
|
||||
"Previous 30 days": "Предыдущите 30 дни",
|
||||
"Previous 7 days": "Предыдущите 7 дни",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "",
|
||||
"Save": "Запис",
|
||||
"Save & Create": "Запис & Създаване",
|
||||
"Save & Update": "Запис & Актуализиране",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Запазването на чат логове директно в хранилището на вашия браузър вече не се поддържа. Моля, отделете малко време, за да изтеглите и изтриете чат логовете си, като щракнете върху бутона по-долу. Не се притеснявайте, можете лесно да импортирате отново чат логовете си в бекенда чрез",
|
||||
"Scan": "Сканиране",
|
||||
"Scan complete!": "Сканиране завършено!",
|
||||
@@ -558,6 +584,8 @@
|
||||
"Success": "Успех",
|
||||
"Successfully updated.": "Успешно обновено.",
|
||||
"Suggested": "Препоръчано",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "Система",
|
||||
"System Prompt": "Системен Промпт",
|
||||
"Tags": "Тагове",
|
||||
@@ -570,6 +598,7 @@
|
||||
"Text-to-Speech Engine": "Text-to-Speech Engine",
|
||||
"Tfs Z": "Tfs Z",
|
||||
"Thanks for your feedback!": "Благодарим ви за вашия отзив!",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "The score should be a value between 0.0 (0%) and 1.0 (100%).",
|
||||
"Theme": "Тема",
|
||||
"Thinking...": "",
|
||||
@@ -593,6 +622,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "към чат входа.",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "днес",
|
||||
@@ -603,7 +633,13 @@
|
||||
"Tool deleted successfully": "",
|
||||
"Tool imported successfully": "",
|
||||
"Tool updated successfully": "",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Проблеми с достъпът до Ollama?",
|
||||
@@ -645,6 +681,7 @@
|
||||
"Version": "Версия",
|
||||
"Voice": "",
|
||||
"Warning": "Предупреждение",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Предупреждение: Ако актуализирате или промените вашия модел за вграждане, трябва да повторите импортирането на всички документи.",
|
||||
"Web": "Уеб",
|
||||
"Web API": "",
|
||||
@@ -671,6 +708,7 @@
|
||||
"You're a helpful assistant.": "Вие сте полезен асистент.",
|
||||
"You're now logged in.": "Сега, вие влязохте в системата.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Youtube Loader Settings"
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "একাউন্ট",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "সঠিক তথ্য",
|
||||
"Actions": "",
|
||||
"Active Users": "",
|
||||
"Add": "যোগ করুন",
|
||||
"Add a model id": "একটি মডেল ID যোগ করুন",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "মেমোরি যোগ করুন",
|
||||
"Add message": "মেসেজ যোগ করুন",
|
||||
"Add Model": "মডেল যোগ করুন",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "ট্যাগ যোগ করুন",
|
||||
"Add User": "ইউজার যোগ করুন",
|
||||
"Adjusting these settings will apply changes universally to all users.": "এই সেটিংগুলো পরিবর্তন করলে তা সব ইউজারের উপরেই প্রয়োগ করা হবে",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "চ্যাট মুছে ফেলুন",
|
||||
"Delete Chat": "চ্যাট মুছে ফেলুন",
|
||||
"Delete chat?": "",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "",
|
||||
"Delete prompt?": "",
|
||||
"delete this link": "এই লিংক মুছে ফেলুন",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "{{name}} মোছা হয়েছে",
|
||||
"Description": "বিবরণ",
|
||||
"Didn't fully follow instructions": "ইনস্ট্রাকশন সম্পূর্ণ অনুসরণ করা হয়নি",
|
||||
"Disabled": "",
|
||||
"Discover a function": "",
|
||||
"Discover a model": "একটি মডেল আবিষ্কার করুন",
|
||||
"Discover a prompt": "একটি প্রম্পট খুঁজে বের করুন",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "চ্যাটে 'আপনি'-র পরবর্তে ইউজারনেম দেখান",
|
||||
"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": "",
|
||||
@@ -195,6 +201,8 @@
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "কোন এক্সটার্নাল কানেকশন তৈরি করে না, এবং আপনার ডেটা আর লোকালি হোস্টেড সার্ভারেই নিরাপদে থাকে।",
|
||||
"Don't Allow": "অনুমোদন দেবেন না",
|
||||
"Don't have an account?": "একাউন্ট নেই?",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "স্টাইল পছন্দ করেন না",
|
||||
"Done": "",
|
||||
"Download": "ডাউনলোড",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "ডকুমেন্ট এডিট করুন",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "ইউজার এডিট করুন",
|
||||
"ElevenLabs": "",
|
||||
"Email": "ইমেইল",
|
||||
"Embedding Batch Size": "",
|
||||
"Embedding Model": "ইমেজ ইমেবডিং মডেল",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "সম্প্রদায় শেয়ারকরণ সক্ষম করুন",
|
||||
"Enable New Sign Ups": "নতুন সাইনআপ চালু করুন",
|
||||
"Enable Web Search": "ওয়েব অনুসন্ধান সক্ষম করুন",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "আপনার সিএসভি ফাইলটিতে এই ক্রমে 4 টি কলাম অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন: নাম, ইমেল, পাসওয়ার্ড, ভূমিকা।.",
|
||||
"Enter {{role}} message here": "{{role}} মেসেজ এখানে লিখুন",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Serpstack API কী লিখুন",
|
||||
"Enter stop sequence": "স্টপ সিকোয়েন্স লিখুন",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "Top K লিখুন",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "ইউআরএল দিন (যেমন http://localhost:11434)",
|
||||
"Enter Your Email": "আপনার ইমেইল লিখুন",
|
||||
"Enter Your Full Name": "আপনার পূর্ণ নাম লিখুন",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "আপনার পাসওয়ার্ড লিখুন",
|
||||
"Enter Your Role": "আপনার রোল লিখুন",
|
||||
"Error": "ত্রুটি",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "",
|
||||
"File Mode": "ফাইল মোড",
|
||||
"File not found.": "ফাইল পাওয়া যায়নি",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "",
|
||||
"Filter is now globally enabled": "",
|
||||
"Filters": "",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "ফ্রিকোয়েন্সি পেনাল্টি",
|
||||
"Function created successfully": "",
|
||||
"Function deleted successfully": "",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "",
|
||||
"Functions": "",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "",
|
||||
"General": "সাধারণ",
|
||||
"General Settings": "সাধারণ সেটিংসমূহ",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "অনুসন্ধান ক্যোয়ারী তৈরি করা হচ্ছে",
|
||||
"Generation Info": "জেনারেশন ইনফো",
|
||||
"Get up and running with": "",
|
||||
"Global": "",
|
||||
"Good Response": "ভালো সাড়া",
|
||||
"Google PSE API Key": "গুগল পিএসই এপিআই কী",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "",
|
||||
"How can I help you today?": "আপনাকে আজ কিভাবে সাহায্য করতে পারি?",
|
||||
"Hybrid Search": "হাইব্রিড অনুসন্ধান",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "ইমেজ জেনারেশন (পরিক্ষামূলক)",
|
||||
"Image Generation Engine": "ইমেজ জেনারেশন ইঞ্জিন",
|
||||
"Image Settings": "ছবির সেটিংসমূহ",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "কিবোর্ড শর্টকাটসমূহ",
|
||||
"Knowledge": "",
|
||||
"Language": "ভাষা",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "সর্বশেষ সক্রিয়",
|
||||
"Last Modified": "",
|
||||
"Light": "লাইট",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "মডেলসমূহ ব্যবস্থাপনা করুন",
|
||||
"Manage Ollama Models": "Ollama মডেলসূহ ব্যবস্থাপনা করুন",
|
||||
"Manage Pipelines": "পাইপলাইন পরিচালনা করুন",
|
||||
"Manage Valves": "",
|
||||
"March": "মার্চ",
|
||||
"Max Tokens (num_predict)": "সর্বোচ্চ টোকেন (num_predict)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "একসঙ্গে সর্বোচ্চ তিনটি মডেল ডাউনলোড করা যায়। দয়া করে পরে আবার চেষ্টা করুন।",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"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",
|
||||
"Mirostat": "Mirostat",
|
||||
"Mirostat Eta": "Mirostat Eta",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "পাইপলাইন ভালভ",
|
||||
"Plain text (.txt)": "প্লায়েন টেক্সট (.txt)",
|
||||
"Playground": "খেলাঘর",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "পজিটিভ আক্রমণ",
|
||||
"Previous 30 days": "পূর্ব ৩০ দিন",
|
||||
"Previous 7 days": "পূর্ব ৭ দিন",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "রোজ পাইন",
|
||||
"Rosé Pine Dawn": "ভোরের রোজ পাইন",
|
||||
"RTL": "RTL",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "",
|
||||
"Save": "সংরক্ষণ",
|
||||
"Save & Create": "সংরক্ষণ এবং তৈরি করুন",
|
||||
"Save & Update": "সংরক্ষণ এবং আপডেট করুন",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "মাধ্যমে",
|
||||
"Scan": "স্ক্যান",
|
||||
"Scan complete!": "স্ক্যান সম্পন্ন হয়েছে!",
|
||||
@@ -558,6 +584,8 @@
|
||||
"Success": "সফল",
|
||||
"Successfully updated.": "সফলভাবে আপডেট হয়েছে",
|
||||
"Suggested": "প্রস্তাবিত",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "সিস্টেম",
|
||||
"System Prompt": "সিস্টেম প্রম্পট",
|
||||
"Tags": "ট্যাগসমূহ",
|
||||
@@ -570,6 +598,7 @@
|
||||
"Text-to-Speech Engine": "টেক্সট-টু-স্পিচ ইঞ্জিন",
|
||||
"Tfs Z": "Tfs Z",
|
||||
"Thanks for your feedback!": "আপনার মতামত ধন্যবাদ!",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "স্কোর একটি 0.0 (0%) এবং 1.0 (100%) এর মধ্যে একটি মান হওয়া উচিত।",
|
||||
"Theme": "থিম",
|
||||
"Thinking...": "",
|
||||
@@ -593,6 +622,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "চ্যাট ইনপুটে",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "আজ",
|
||||
@@ -603,7 +633,13 @@
|
||||
"Tool deleted successfully": "",
|
||||
"Tool imported successfully": "",
|
||||
"Tool updated successfully": "",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Ollama এক্সেস করতে সমস্যা হচ্ছে?",
|
||||
@@ -645,6 +681,7 @@
|
||||
"Version": "ভার্সন",
|
||||
"Voice": "",
|
||||
"Warning": "সতর্কীকরণ",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "সতর্কীকরণ: আপনি যদি আপনার এম্বেডিং মডেল আপডেট বা পরিবর্তন করেন, তাহলে আপনাকে সমস্ত নথি পুনরায় আমদানি করতে হবে।.",
|
||||
"Web": "ওয়েব",
|
||||
"Web API": "",
|
||||
@@ -671,6 +708,7 @@
|
||||
"You're a helpful assistant.": "আপনি একজন উপকারী এসিস্ট্যান্ট",
|
||||
"You're now logged in.": "আপনি এখন লগইন করা অবস্থায় আছেন",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "YouTube",
|
||||
"Youtube Loader Settings": "YouTube লোডার সেটিংস"
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "Compte",
|
||||
"Account Activation Pending": "Activació del compte pendent",
|
||||
"Accurate information": "Informació precisa",
|
||||
"Actions": "",
|
||||
"Active Users": "Usuaris actius",
|
||||
"Add": "Afegir",
|
||||
"Add a model id": "Afegeix un identificador de model",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "Afegir memòria",
|
||||
"Add message": "Afegir un missatge",
|
||||
"Add Model": "Afegir un model",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "Afegir etiquetes",
|
||||
"Add User": "Afegir un usuari",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Si ajustes aquesta preferència, els canvis s'aplicaran de manera universal a tots els usuaris.",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "Eliminar xat",
|
||||
"Delete Chat": "Eliminar xat",
|
||||
"Delete chat?": "Eliminar el xat?",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "Eliminar funció?",
|
||||
"Delete prompt?": "Eliminar indicació?",
|
||||
"delete this link": "Eliminar aquest enllaç",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "S'ha eliminat {{name}}",
|
||||
"Description": "Descripció",
|
||||
"Didn't fully follow instructions": "No s'han seguit les instruccions completament",
|
||||
"Disabled": "Deshabilitat",
|
||||
"Discover a function": "Descobrir una funció",
|
||||
"Discover a model": "Descobrir un model",
|
||||
"Discover a prompt": "Descobrir una indicació",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "Descartable",
|
||||
"Display Emoji in Call": "Mostrar emojis a la trucada",
|
||||
"Display the username instead of You in the Chat": "Mostrar el nom d'usuari en lloc de 'Tu' al xat",
|
||||
"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ó",
|
||||
@@ -195,6 +201,8 @@
|
||||
"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.",
|
||||
"Don't Allow": "No permetre",
|
||||
"Don't have an account?": "No tens un compte?",
|
||||
"don't install random functions from sources you don't trust.": "no instal·lis funcions aleatòries de fonts en què no confiïs.",
|
||||
"don't install random tools from sources you don't trust.": "no instal·lis eines aleatòries de fonts en què no confiïs.",
|
||||
"Don't like the style": "No t'agrada l'estil?",
|
||||
"Done": "Fet",
|
||||
"Download": "Descarregar",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "Editar el document",
|
||||
"Edit Memory": "Editar la memòria",
|
||||
"Edit User": "Editar l'usuari",
|
||||
"ElevenLabs": "",
|
||||
"Email": "Correu electrònic",
|
||||
"Embedding Batch Size": "Mida del lot d'incrustació",
|
||||
"Embedding Model": "Model d'incrustació",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "Activar l'ús compartit amb la comunitat",
|
||||
"Enable New Sign Ups": "Permetre nous registres",
|
||||
"Enable Web Search": "Activar la cerca web",
|
||||
"Enabled": "Habilitat",
|
||||
"Engine": "Motor",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assegura't que els teus fitxers CSV inclouen 4 columnes en aquest ordre: Nom, Correu electrònic, Contrasenya, Rol.",
|
||||
"Enter {{role}} message here": "Introdueix aquí el missatge de {{role}}",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "Introdueix la clau API Serply",
|
||||
"Enter Serpstack API Key": "Introdueix la clau API Serpstack",
|
||||
"Enter stop sequence": "Introdueix la seqüència de parada",
|
||||
"Enter system prompt": "Introdueix la indicació de sistema",
|
||||
"Enter Tavily API Key": "Introdueix la clau API de Tavily",
|
||||
"Enter Tika Server URL": "Introdueix l'URL del servidor Tika",
|
||||
"Enter Top K": "Introdueix Top K",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "Introdueix l'URL (p. ex. http://localhost:11434)",
|
||||
"Enter Your Email": "Introdueix el teu correu electrònic",
|
||||
"Enter Your Full Name": "Introdueix el teu nom complet",
|
||||
"Enter your message": "Introdueix el teu missatge",
|
||||
"Enter Your Password": "Introdueix la teva contrasenya",
|
||||
"Enter Your Role": "Introdueix el teu rol",
|
||||
"Error": "Error",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "Arxiu",
|
||||
"File Mode": "Mode d'arxiu",
|
||||
"File not found.": "No s'ha trobat l'arxiu.",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "El filtre ha estat desactivat globalment",
|
||||
"Filter is now globally enabled": "El filtre ha estat activat globalment",
|
||||
"Filters": "Filtres",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "Penalització per freqüència",
|
||||
"Function created successfully": "La funció s'ha creat correctament",
|
||||
"Function deleted successfully": "La funció s'ha eliminat correctament",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "Descripció de la funció (per exemple, un filtre per eliminar paraules malsonants del text)",
|
||||
"Function ID (e.g. my_filter)": "ID de la funció (per exemple, el_meu_filtre)",
|
||||
"Function is now globally disabled": "La funció ha estat desactivada globalment",
|
||||
"Function is now globally enabled": "La funció ha estat activada globalment",
|
||||
"Function Name (e.g. My Filter)": "Nom de la funció (per exemple, El Meu Filtre)",
|
||||
"Function updated successfully": "La funció s'ha actualitzat correctament",
|
||||
"Functions": "Funcions",
|
||||
"Functions allow arbitrary code execution": "Les funcions permeten l'execució de codi arbitrari",
|
||||
"Functions allow arbitrary code execution.": "Les funcions permeten l'execució de codi arbitrari.",
|
||||
"Functions imported successfully": "Les funcions s'han importat correctament",
|
||||
"General": "General",
|
||||
"General Settings": "Preferències generals",
|
||||
"Generate Image": "Generar imatge",
|
||||
"Generating search query": "Generant consulta",
|
||||
"Generation Info": "Informació sobre la generació",
|
||||
"Get up and running with": "Posa't en marxa amb",
|
||||
"Global": "Global",
|
||||
"Good Response": "Bona resposta",
|
||||
"Google PSE API Key": "Clau API PSE de Google",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "Amagar el model",
|
||||
"How can I help you today?": "Com et puc ajudar avui?",
|
||||
"Hybrid Search": "Cerca híbrida",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Afirmo que he llegit i entenc les implicacions de la meva acció. Soc conscient dels riscos associats a l'execució de codi arbitrari i he verificat la fiabilitat de la font.",
|
||||
"Image Generation (Experimental)": "Generació d'imatges (Experimental)",
|
||||
"Image Generation Engine": "Motor de generació d'imatges",
|
||||
"Image Settings": "Preferències d'imatges",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "Dreceres de teclat",
|
||||
"Knowledge": "Coneixement",
|
||||
"Language": "Idioma",
|
||||
"large language models, locally.": "models de llenguatge extensos, localment",
|
||||
"Last Active": "Activitat recent",
|
||||
"Last Modified": "Modificació",
|
||||
"Light": "Clar",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "Gestionar els models",
|
||||
"Manage Ollama Models": "Gestionar els models Ollama",
|
||||
"Manage Pipelines": "Gestionar les Pipelines",
|
||||
"Manage Valves": "Gestionar les Valves",
|
||||
"March": "Març",
|
||||
"Max Tokens (num_predict)": "Nombre màxim de Tokens (num_predict)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Es poden descarregar un màxim de 3 models simultàniament. Si us plau, prova-ho més tard.",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "Memòria eliminada correctament",
|
||||
"Memory updated successfully": "Memòria actualitzada correctament",
|
||||
"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": "",
|
||||
"Minimum Score": "Puntuació mínima",
|
||||
"Mirostat": "Mirostat",
|
||||
"Mirostat Eta": "Eta de Mirostat",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "Vàlvules de les Pipelines",
|
||||
"Plain text (.txt)": "Text pla (.txt)",
|
||||
"Playground": "Zona de jocs",
|
||||
"Please carefully review the following warnings:": "Si us plau, revisa els següents avisos amb cura:",
|
||||
"Positive attitude": "Actitud positiva",
|
||||
"Previous 30 days": "30 dies anteriors",
|
||||
"Previous 7 days": "7 dies anteriors",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Albada Rosé Pine",
|
||||
"RTL": "RTL",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "Executa Llama 2, Code Llama, i altres models. Personalitza i crea els teus propis models.",
|
||||
"Running": "S'està executant",
|
||||
"Save": "Desar",
|
||||
"Save & Create": "Desar i crear",
|
||||
"Save & Update": "Desar i actualitzar",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Desar els registres de xat directament a l'emmagatzematge del teu navegador ja no està suportat. Si us plau, descarregr i elimina els registres de xat fent clic al botó de sota. No et preocupis, pots tornar a importar fàcilment els teus registres de xat al backend a través de",
|
||||
"Scan": "Escanejar",
|
||||
"Scan complete!": "Escaneigr completat!",
|
||||
@@ -559,6 +585,8 @@
|
||||
"Success": "Èxit",
|
||||
"Successfully updated.": "Actualitzat correctament.",
|
||||
"Suggested": "Suggerit",
|
||||
"Support": "Dona suport",
|
||||
"Support this plugin:": "Dona suport a aquest complement:",
|
||||
"System": "Sistema",
|
||||
"System Prompt": "Indicació del Sistema",
|
||||
"Tags": "Etiquetes",
|
||||
@@ -571,6 +599,7 @@
|
||||
"Text-to-Speech Engine": "Motor de text a veu",
|
||||
"Tfs Z": "Tfs Z",
|
||||
"Thanks for your feedback!": "Gràcies pel teu comentari!",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Els desenvolupadors d'aquest complement són voluntaris apassionats de la comunitat. Si trobeu útil aquest complement, considereu contribuir al seu desenvolupament.",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "El valor de puntuació hauria de ser entre 0.0 (0%) i 1.0 (100%).",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "Pensant...",
|
||||
@@ -594,6 +623,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Per accedir a la WebUI, poseu-vos en contacte amb l'administrador. Els administradors poden gestionar els estats dels usuaris des del tauler d'administració.",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "Per afegir documents aquí, puja-ls primer a l'espai de treball \"Documents\".",
|
||||
"to chat input.": "a l'entrada del xat.",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "Per seleccionar filtres aquí, afegeix-los primer a l'espai de treball \"Funcions\".",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "Per seleccionar kits d'eines aquí, afegeix-los primer a l'espai de treball \"Eines\".",
|
||||
"Today": "Avui",
|
||||
@@ -604,7 +634,13 @@
|
||||
"Tool deleted successfully": "Eina eliminada correctament",
|
||||
"Tool imported successfully": "Eina importada correctament",
|
||||
"Tool updated successfully": "Eina actualitzada correctament",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "Descripció del kit d'eines (p. ex. Un kit d'eines per fer diverses operacions)",
|
||||
"Toolkit ID (e.g. my_toolkit)": "ID del kit d'eines (p. ex. el_meu_kit)",
|
||||
"Toolkit Name (e.g. My ToolKit)": "Nom del kit d'eines (p. ex. El meu kit)",
|
||||
"Tools": "Eines",
|
||||
"Tools are a function calling system with arbitrary code execution": "Les eines són un sistema de crida a funcions amb execució de codi arbitrari",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "Les eines disposen d'un sistema de crida a funcions que permet execució de codi arbitrari",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "Les eines disposen d'un sistema de crida a funcions que permet execució de codi arbitrari.",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problemes en accedir a Ollama?",
|
||||
@@ -646,6 +682,7 @@
|
||||
"Version": "Versió",
|
||||
"Voice": "Veu",
|
||||
"Warning": "Avís",
|
||||
"Warning:": "Avís:",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avís: Si s'actualitza o es canvia el model d'incrustació, s'hauran de tornar a importar tots els documents.",
|
||||
"Web": "Web",
|
||||
"Web API": "Web API",
|
||||
@@ -672,6 +709,7 @@
|
||||
"You're a helpful assistant.": "Ets un assistent útil.",
|
||||
"You're now logged in.": "Ara estàs connectat.",
|
||||
"Your account status is currently pending activation.": "El compte està actualment pendent d'activació",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "Tota la teva contribució anirà directament al desenvolupador del complement; Open WebUI no se'n queda cap percentatge. Tanmateix, la plataforma de finançament escollida pot tenir les seves pròpies comissions.",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Preferències del carregador de Youtube"
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "Account",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "",
|
||||
"Actions": "",
|
||||
"Active Users": "",
|
||||
"Add": "",
|
||||
"Add a model id": "",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "",
|
||||
"Add message": "Pagdugang og mensahe",
|
||||
"Add Model": "",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "idugang ang mga tag",
|
||||
"Add User": "",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Ang pag-adjust niini nga mga setting magamit ang mga pagbag-o sa tanan nga tiggamit.",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "Pagtangtang sa panaghisgot",
|
||||
"Delete Chat": "",
|
||||
"Delete chat?": "",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "",
|
||||
"Delete prompt?": "",
|
||||
"delete this link": "",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "",
|
||||
"Description": "Deskripsyon",
|
||||
"Didn't fully follow instructions": "",
|
||||
"Disabled": "",
|
||||
"Discover a function": "",
|
||||
"Discover a model": "",
|
||||
"Discover a prompt": "Pagkaplag usa ka prompt",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Ipakita ang username imbes nga 'Ikaw' sa Panaghisgutan",
|
||||
"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": "",
|
||||
@@ -195,6 +201,8 @@
|
||||
"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.",
|
||||
"Don't Allow": "Dili tugotan",
|
||||
"Don't have an account?": "Wala kay account ?",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "",
|
||||
"Done": "",
|
||||
"Download": "",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "I-edit ang dokumento",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "I-edit ang tiggamit",
|
||||
"ElevenLabs": "",
|
||||
"Email": "E-mail",
|
||||
"Embedding Batch Size": "",
|
||||
"Embedding Model": "",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "",
|
||||
"Enable New Sign Ups": "I-enable ang bag-ong mga rehistro",
|
||||
"Enable Web Search": "",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
|
||||
"Enter {{role}} message here": "Pagsulod sa mensahe {{role}} dinhi",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "",
|
||||
"Enter stop sequence": "Pagsulod sa katapusan nga han-ay",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "Pagsulod sa Top K",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "",
|
||||
"Enter Your Email": "Pagsulod sa imong e-mail address",
|
||||
"Enter Your Full Name": "Ibutang ang imong tibuok nga ngalan",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "Ibutang ang imong password",
|
||||
"Enter Your Role": "",
|
||||
"Error": "",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "",
|
||||
"File Mode": "File mode",
|
||||
"File not found.": "Wala makit-an ang file.",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "",
|
||||
"Filter is now globally enabled": "",
|
||||
"Filters": "",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "",
|
||||
"Function created successfully": "",
|
||||
"Function deleted successfully": "",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "",
|
||||
"Functions": "",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "",
|
||||
"General": "Heneral",
|
||||
"General Settings": "kinatibuk-ang mga setting",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "",
|
||||
"Generation Info": "",
|
||||
"Get up and running with": "",
|
||||
"Global": "",
|
||||
"Good Response": "",
|
||||
"Google PSE API Key": "",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "",
|
||||
"How can I help you today?": "Unsaon nako pagtabang kanimo karon?",
|
||||
"Hybrid Search": "",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "Pagmugna og hulagway (Eksperimento)",
|
||||
"Image Generation Engine": "Makina sa paghimo og imahe",
|
||||
"Image Settings": "Mga Setting sa Imahen",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "Mga shortcut sa keyboard",
|
||||
"Knowledge": "",
|
||||
"Language": "Pinulongan",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "",
|
||||
"Last Modified": "",
|
||||
"Light": "Kahayag",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "Pagdumala sa mga templates",
|
||||
"Manage Ollama Models": "Pagdumala sa mga modelo sa Ollama",
|
||||
"Manage Pipelines": "",
|
||||
"Manage Valves": "",
|
||||
"March": "",
|
||||
"Max Tokens (num_predict)": "",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Ang labing taas nga 3 nga mga disenyo mahimong ma-download nga dungan. ",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"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": "",
|
||||
"Mirostat": "Mirostat",
|
||||
"Mirostat Eta": "Mirostat Eta",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "",
|
||||
"Plain text (.txt)": "",
|
||||
"Playground": "Dulaanan",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "",
|
||||
"Previous 30 days": "",
|
||||
"Previous 7 days": "",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Aube Pine Rosé",
|
||||
"RTL": "",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "",
|
||||
"Save": "Tipigi",
|
||||
"Save & Create": "I-save ug Paghimo",
|
||||
"Save & Update": "I-save ug I-update",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Ang pag-save sa mga chat log direkta sa imong browser storage dili na suportado. ",
|
||||
"Scan": "Aron ma-scan",
|
||||
"Scan complete!": "Nakompleto ang pag-scan!",
|
||||
@@ -558,6 +584,8 @@
|
||||
"Success": "Kalampusan",
|
||||
"Successfully updated.": "Malampuson nga na-update.",
|
||||
"Suggested": "",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "Sistema",
|
||||
"System Prompt": "Madasig nga Sistema",
|
||||
"Tags": "Mga tag",
|
||||
@@ -570,6 +598,7 @@
|
||||
"Text-to-Speech Engine": "Text-to-speech nga makina",
|
||||
"Tfs Z": "Tfs Z",
|
||||
"Thanks for your feedback!": "",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "",
|
||||
@@ -593,6 +622,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "sa entrada sa iring.",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "",
|
||||
@@ -603,7 +633,13 @@
|
||||
"Tool deleted successfully": "",
|
||||
"Tool imported successfully": "",
|
||||
"Tool updated successfully": "",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Ibabaw nga P",
|
||||
"Trouble accessing Ollama?": "Adunay mga problema sa pag-access sa Ollama?",
|
||||
@@ -645,6 +681,7 @@
|
||||
"Version": "Bersyon",
|
||||
"Voice": "",
|
||||
"Warning": "",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
|
||||
"Web": "Web",
|
||||
"Web API": "",
|
||||
@@ -671,6 +708,7 @@
|
||||
"You're a helpful assistant.": "Usa ka ka mapuslanon nga katabang",
|
||||
"You're now logged in.": "Konektado ka na karon.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "",
|
||||
"Youtube Loader Settings": ""
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "Konto",
|
||||
"Account Activation Pending": "Kontoaktivierung ausstehend",
|
||||
"Accurate information": "Präzise Information(en)",
|
||||
"Actions": "",
|
||||
"Active Users": "Aktive Benutzer",
|
||||
"Add": "Hinzufügen",
|
||||
"Add a model id": "Modell-ID hinzufügen",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "Erinnerung hinzufügen",
|
||||
"Add message": "Nachricht hinzufügen",
|
||||
"Add Model": "Modell hinzufügen",
|
||||
"Add Tag": "Tag hinzufügen",
|
||||
"Add Tags": "Tags hinzufügen",
|
||||
"Add User": "Benutzer hinzufügen",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Das Anpassen dieser Einstellungen wird Änderungen universell auf alle Benutzer anwenden.",
|
||||
@@ -130,7 +132,7 @@
|
||||
"Content Extraction": "Inhaltsextraktion",
|
||||
"Context Length": "Kontextlänge",
|
||||
"Continue Response": "Antwort fortsetzen",
|
||||
"Continue with {{provider}}": "Mit {{Anbieter}} fortfahren",
|
||||
"Continue with {{provider}}": "Mit {{provider}} fortfahren",
|
||||
"Controls": "",
|
||||
"Copied shared chat URL to clipboard!": "Freigabelink in die Zwischenablage kopiert!",
|
||||
"Copy": "Kopieren",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "Unterhaltung löschen",
|
||||
"Delete Chat": "Unterhaltung löschen",
|
||||
"Delete chat?": "Unterhaltung löschen?",
|
||||
"Delete Doc": "Dokument löschen",
|
||||
"Delete function?": "Funktion löschen?",
|
||||
"Delete prompt?": "Prompt löschen?",
|
||||
"delete this link": "diesen Link löschen",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "{{name}} gelöscht",
|
||||
"Description": "Beschreibung",
|
||||
"Didn't fully follow instructions": "Nicht genau den Answeisungen gefolgt",
|
||||
"Disabled": "",
|
||||
"Discover a function": "Entdecken Sie weitere Funktionen",
|
||||
"Discover a model": "Entdecken Sie weitere Modelle",
|
||||
"Discover a prompt": "Entdecken Sie weitere Prompts",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "ausblendbar",
|
||||
"Display Emoji in Call": "Emojis im Anruf anzeigen",
|
||||
"Display the username instead of You in the Chat": "Soll \"Sie\" durch Ihren Benutzernamen ersetzt werden?",
|
||||
"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",
|
||||
@@ -195,6 +201,8 @@
|
||||
"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.",
|
||||
"Don't Allow": "Verbieten",
|
||||
"Don't have an account?": "Haben Sie noch kein Benutzerkonto?",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "schlechter Schreibstil",
|
||||
"Done": "Erledigt",
|
||||
"Download": "Exportieren",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "Dokument bearbeiten",
|
||||
"Edit Memory": "Erinnerungen bearbeiten",
|
||||
"Edit User": "Benutzer bearbeiten",
|
||||
"ElevenLabs": "",
|
||||
"Email": "E-Mail",
|
||||
"Embedding Batch Size": "Embedding-Stapelgröße",
|
||||
"Embedding Model": "Embedding-Modell",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "Community-Freigabe aktivieren",
|
||||
"Enable New Sign Ups": "Registrierung erlauben",
|
||||
"Enable Web Search": "Websuche aktivieren",
|
||||
"Enabled": "",
|
||||
"Engine": "Engine",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Stellen Sie sicher, dass Ihre CSV-Datei 4 Spalten in dieser Reihenfolge enthält: Name, E-Mail, Passwort, Rolle.",
|
||||
"Enter {{role}} message here": "Geben Sie die {{role}}-Nachricht hier ein",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "Geben Sie den",
|
||||
"Enter Serpstack API Key": "Geben Sie den Serpstack-API-Schlüssel ein",
|
||||
"Enter stop sequence": "Stop-Sequenz eingeben",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "Geben Sie den Tavily-API-Schlüssel ein",
|
||||
"Enter Tika Server URL": "Geben Sie die Tika-Server-URL ein",
|
||||
"Enter Top K": "Geben Sie Top K ein",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "Geben Sie die URL ein (z. B. http://localhost:11434)",
|
||||
"Enter Your Email": "Geben Sie Ihre E-Mail-Adresse ein",
|
||||
"Enter Your Full Name": "Geben Sie Ihren vollständigen Namen ein",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "Geben Sie Ihr Passwort ein",
|
||||
"Enter Your Role": "Geben Sie Ihre Rolle ein",
|
||||
"Error": "Fehler",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "Datei",
|
||||
"File Mode": "Datei-Modus",
|
||||
"File not found.": "Datei nicht gefunden.",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "Filter ist jetzt global deaktiviert",
|
||||
"Filter is now globally enabled": "Filter ist jetzt global aktiviert",
|
||||
"Filters": "Filter",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "Frequenzstrafe",
|
||||
"Function created successfully": "Funktion erfolgreich erstellt",
|
||||
"Function deleted successfully": "Funktion erfolgreich gelöscht",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "Funktion erfolgreich aktualisiert",
|
||||
"Functions": "Funktionen",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "Funktionen erfolgreich importiert",
|
||||
"General": "Allgemein",
|
||||
"General Settings": "Allgemeine Einstellungen",
|
||||
"Generate Image": "Bild erzeugen",
|
||||
"Generating search query": "Suchanfrage wird erstellt",
|
||||
"Generation Info": "Generierungsinformationen",
|
||||
"Get up and running with": "",
|
||||
"Global": "Global",
|
||||
"Good Response": "Gute Antwort",
|
||||
"Google PSE API Key": "Google PSE-API-Schlüssel",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "Modell ausblenden",
|
||||
"How can I help you today?": "Wie kann ich Ihnen heute helfen?",
|
||||
"Hybrid Search": "Hybride Suche",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "Bildgenerierung (experimentell)",
|
||||
"Image Generation Engine": "Bildgenerierungs-Engine",
|
||||
"Image Settings": "Bildeinstellungen",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "Tastenkombinationen",
|
||||
"Knowledge": "Wissen",
|
||||
"Language": "Sprache",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "Zuletzt aktiv",
|
||||
"Last Modified": "Zuletzt bearbeitet",
|
||||
"Light": "Hell",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "Modelle verwalten",
|
||||
"Manage Ollama Models": "Ollama-Modelle verwalten",
|
||||
"Manage Pipelines": "Pipelines verwalten",
|
||||
"Manage Valves": "Valves verwalten",
|
||||
"March": "März",
|
||||
"Max Tokens (num_predict)": "Maximale Tokenanzahl (num_predict)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Es können maximal 3 Modelle gleichzeitig heruntergeladen werden. Bitte versuchen Sie es später erneut.",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "Erinnerung erfolgreich gelöscht",
|
||||
"Memory updated successfully": "Erinnerung erfolgreich aktualisiert",
|
||||
"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",
|
||||
"Mirostat": "Mirostat",
|
||||
"Mirostat Eta": "Mirostat Eta",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "Pipeline Valves",
|
||||
"Plain text (.txt)": "Nur Text (.txt)",
|
||||
"Playground": "Testumgebung",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "Positive Einstellung",
|
||||
"Previous 30 days": "Vorherige 30 Tage",
|
||||
"Previous 7 days": "Vorherige 7 Tage",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "Läuft",
|
||||
"Save": "Speichern",
|
||||
"Save & Create": "Erstellen",
|
||||
"Save & Update": "Aktualisieren",
|
||||
"Save Tag": "Tag speichern",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Das direkte Speichern von Unterhaltungen im Browser-Speicher wird nicht mehr unterstützt. Bitte nehmen Sie einen Moment Zeit, um Ihre Unterhaltungen zu exportieren und zu löschen, indem Sie auf die Schaltfläche unten klicken. Keine Sorge, Sie können Ihre Unterhaltungen problemlos über das Backend wieder importieren.",
|
||||
"Scan": "Scannen",
|
||||
"Scan complete!": "Scan abgeschlossen!",
|
||||
@@ -558,6 +584,8 @@
|
||||
"Success": "Erfolg",
|
||||
"Successfully updated.": "Erfolgreich aktualisiert.",
|
||||
"Suggested": "Vorgeschlagen",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "System",
|
||||
"System Prompt": "System-Prompt",
|
||||
"Tags": "Tags",
|
||||
@@ -570,6 +598,7 @@
|
||||
"Text-to-Speech Engine": "Text-zu-Sprache-Engine",
|
||||
"Tfs Z": "Tfs Z",
|
||||
"Thanks for your feedback!": "Danke für Ihr Feedback!",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Die Punktzahl sollte ein Wert zwischen 0,0 (0 %) und 1,0 (100 %) sein.",
|
||||
"Theme": "Design",
|
||||
"Thinking...": "Denke nach...",
|
||||
@@ -593,6 +622,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Um auf das WebUI zugreifen zu können, wenden Sie sich bitte an einen Administrator. Administratoren können den Benutzerstatus über das Admin-Panel verwalten.",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "Um Dokumente hinzuzufügen, laden Sie sie zuerst im Arbeitsbereich „Dokumente“ hoch.",
|
||||
"to chat input.": "zum Eingabefeld der Unterhaltung.",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "Um Filter auszuwählen, fügen Sie diese zunächst dem Arbeitsbereich „Funktionen“ hinzu.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "Um Toolkits auszuwählen, fügen Sie sie zunächst dem Arbeitsbereich „Werkzeuge“ hinzu.",
|
||||
"Today": "Heute",
|
||||
@@ -603,7 +633,13 @@
|
||||
"Tool deleted successfully": "Werkzeug erfolgreich gelöscht",
|
||||
"Tool imported successfully": "Werkzeug erfolgreich importiert",
|
||||
"Tool updated successfully": "Werkzeug erfolgreich aktualisiert",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "Werkzeuge",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Probleme beim Zugriff auf Ollama?",
|
||||
@@ -645,6 +681,7 @@
|
||||
"Version": "Version",
|
||||
"Voice": "Stimme",
|
||||
"Warning": "Warnung",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Warnung: Wenn Sie das Einbettungsmodell aktualisieren oder ändern, müssen Sie alle Dokumente erneut importieren.",
|
||||
"Web": "Web",
|
||||
"Web API": "Web-API",
|
||||
@@ -671,6 +708,7 @@
|
||||
"You're a helpful assistant.": "Du bist ein hilfreicher Assistent.",
|
||||
"You're now logged in.": "Sie sind jetzt eingeloggt.",
|
||||
"Your account status is currently pending activation.": "Ihr Kontostatus ist derzeit ausstehend und wartet auf Aktivierung.",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "YouTube",
|
||||
"Youtube Loader Settings": "YouTube-Ladeeinstellungen"
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "Account",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "",
|
||||
"Actions": "",
|
||||
"Active Users": "",
|
||||
"Add": "",
|
||||
"Add a model id": "",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "",
|
||||
"Add message": "Add Prompt",
|
||||
"Add Model": "",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "",
|
||||
"Add User": "",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Adjusting these settings will apply changes to all users. Such universal, very wow.",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "Delete chat",
|
||||
"Delete Chat": "",
|
||||
"Delete chat?": "",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "",
|
||||
"Delete prompt?": "",
|
||||
"delete this link": "",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "",
|
||||
"Description": "Description",
|
||||
"Didn't fully follow instructions": "",
|
||||
"Disabled": "",
|
||||
"Discover a function": "",
|
||||
"Discover a model": "",
|
||||
"Discover a prompt": "Discover a prompt",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Display username instead of You in Chat",
|
||||
"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": "",
|
||||
@@ -195,6 +201,8 @@
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "does not connect external, data stays safe locally.",
|
||||
"Don't Allow": "Don't Allow",
|
||||
"Don't have an account?": "No account? Much sad.",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "",
|
||||
"Done": "",
|
||||
"Download": "",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "Edit Doge",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Edit Wowser",
|
||||
"ElevenLabs": "",
|
||||
"Email": "Email",
|
||||
"Embedding Batch Size": "",
|
||||
"Embedding Model": "",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "",
|
||||
"Enable New Sign Ups": "Enable New Bark Ups",
|
||||
"Enable Web Search": "",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
|
||||
"Enter {{role}} message here": "Enter {{role}} bork here",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "",
|
||||
"Enter stop sequence": "Enter stop bark",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "Enter Top Wow",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "",
|
||||
"Enter Your Email": "Enter Your Dogemail",
|
||||
"Enter Your Full Name": "Enter Your Full Wow",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "Enter Your Barkword",
|
||||
"Enter Your Role": "",
|
||||
"Error": "",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "",
|
||||
"File Mode": "Bark Mode",
|
||||
"File not found.": "Bark not found.",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "",
|
||||
"Filter is now globally enabled": "",
|
||||
"Filters": "",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "",
|
||||
"Function created successfully": "",
|
||||
"Function deleted successfully": "",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "",
|
||||
"Functions": "",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "",
|
||||
"General": "Woweral",
|
||||
"General Settings": "General Doge Settings",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "",
|
||||
"Generation Info": "",
|
||||
"Get up and running with": "",
|
||||
"Global": "",
|
||||
"Good Response": "",
|
||||
"Google PSE API Key": "",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "",
|
||||
"How can I help you today?": "How can I halp u today?",
|
||||
"Hybrid Search": "",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "Image Wow (Much Experiment)",
|
||||
"Image Generation Engine": "Image Engine",
|
||||
"Image Settings": "Settings for Wowmage",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "Keyboard Barkcuts",
|
||||
"Knowledge": "",
|
||||
"Language": "Doge Speak",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "",
|
||||
"Last Modified": "",
|
||||
"Light": "Light",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "Manage Wowdels",
|
||||
"Manage Ollama Models": "Manage Ollama Wowdels",
|
||||
"Manage Pipelines": "",
|
||||
"Manage Valves": "",
|
||||
"March": "",
|
||||
"Max Tokens (num_predict)": "",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maximum of 3 models can be downloaded simultaneously. Please try again later.",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"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": "",
|
||||
"Mirostat": "Mirostat",
|
||||
"Mirostat Eta": "Mirostat Eta",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "",
|
||||
"Plain text (.txt)": "Plain text (.txt)",
|
||||
"Playground": "Playground",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "",
|
||||
"Previous 30 days": "",
|
||||
"Previous 7 days": "",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "",
|
||||
"Save": "Save much wow",
|
||||
"Save & Create": "Save & Create much create",
|
||||
"Save & Update": "Save & Update much update",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Saving chat logs in browser storage not support anymore. Pls download and delete your chat logs by click button below. Much easy re-import to backend through",
|
||||
"Scan": "Scan much scan",
|
||||
"Scan complete!": "Scan complete! Very wow!",
|
||||
@@ -560,6 +586,8 @@
|
||||
"Success": "Success very success",
|
||||
"Successfully updated.": "Successfully updated. Very updated.",
|
||||
"Suggested": "",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "System very system",
|
||||
"System Prompt": "System Prompt much prompt",
|
||||
"Tags": "Tags very tags",
|
||||
@@ -572,6 +600,7 @@
|
||||
"Text-to-Speech Engine": "Text-to-Speech Engine much speak",
|
||||
"Tfs Z": "Tfs Z much Z",
|
||||
"Thanks for your feedback!": "",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "",
|
||||
"Theme": "Theme much theme",
|
||||
"Thinking...": "",
|
||||
@@ -595,6 +624,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "to chat input. Very chat.",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "",
|
||||
@@ -605,7 +635,13 @@
|
||||
"Tool deleted successfully": "",
|
||||
"Tool imported successfully": "",
|
||||
"Tool updated successfully": "",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "Top K very top",
|
||||
"Top P": "Top P very top",
|
||||
"Trouble accessing Ollama?": "Trouble accessing Ollama? Much trouble?",
|
||||
@@ -647,6 +683,7 @@
|
||||
"Version": "Version much version",
|
||||
"Voice": "",
|
||||
"Warning": "",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
|
||||
"Web": "Web very web",
|
||||
"Web API": "",
|
||||
@@ -673,6 +710,7 @@
|
||||
"You're a helpful assistant.": "You're a helpful assistant. Much helpful.",
|
||||
"You're now logged in.": "You're now logged in. Much logged.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "",
|
||||
"Youtube Loader Settings": ""
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "",
|
||||
"Actions": "",
|
||||
"Active Users": "",
|
||||
"Add": "",
|
||||
"Add a model id": "",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "",
|
||||
"Add message": "",
|
||||
"Add Model": "",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "",
|
||||
"Add User": "",
|
||||
"Adjusting these settings will apply changes universally to all users.": "",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "",
|
||||
"Delete Chat": "",
|
||||
"Delete chat?": "",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "",
|
||||
"Delete prompt?": "",
|
||||
"delete this link": "",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "",
|
||||
"Description": "",
|
||||
"Didn't fully follow instructions": "",
|
||||
"Disabled": "",
|
||||
"Discover a function": "",
|
||||
"Discover a model": "",
|
||||
"Discover a prompt": "",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "",
|
||||
"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": "",
|
||||
@@ -195,6 +201,8 @@
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "",
|
||||
"Don't Allow": "",
|
||||
"Don't have an account?": "",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "",
|
||||
"Done": "",
|
||||
"Download": "",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "",
|
||||
"ElevenLabs": "",
|
||||
"Email": "",
|
||||
"Embedding Batch Size": "",
|
||||
"Embedding Model": "",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "",
|
||||
"Enable New Sign Ups": "",
|
||||
"Enable Web Search": "",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
|
||||
"Enter {{role}} message here": "",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "",
|
||||
"Enter stop sequence": "",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "",
|
||||
"Enter Your Email": "",
|
||||
"Enter Your Full Name": "",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "",
|
||||
"Enter Your Role": "",
|
||||
"Error": "",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "",
|
||||
"File Mode": "",
|
||||
"File not found.": "",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "",
|
||||
"Filter is now globally enabled": "",
|
||||
"Filters": "",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "",
|
||||
"Function created successfully": "",
|
||||
"Function deleted successfully": "",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "",
|
||||
"Functions": "",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "",
|
||||
"General": "",
|
||||
"General Settings": "",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "",
|
||||
"Generation Info": "",
|
||||
"Get up and running with": "",
|
||||
"Global": "",
|
||||
"Good Response": "",
|
||||
"Google PSE API Key": "",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "",
|
||||
"How can I help you today?": "",
|
||||
"Hybrid Search": "",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "",
|
||||
"Image Generation Engine": "",
|
||||
"Image Settings": "",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "",
|
||||
"Knowledge": "",
|
||||
"Language": "",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "",
|
||||
"Last Modified": "",
|
||||
"Light": "",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "",
|
||||
"Manage Ollama Models": "",
|
||||
"Manage Pipelines": "",
|
||||
"Manage Valves": "",
|
||||
"March": "",
|
||||
"Max Tokens (num_predict)": "",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"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": "",
|
||||
"Mirostat": "",
|
||||
"Mirostat Eta": "",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "",
|
||||
"Plain text (.txt)": "",
|
||||
"Playground": "",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "",
|
||||
"Previous 30 days": "",
|
||||
"Previous 7 days": "",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "",
|
||||
"Rosé Pine Dawn": "",
|
||||
"RTL": "",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "",
|
||||
"Save": "",
|
||||
"Save & Create": "",
|
||||
"Save & Update": "",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "",
|
||||
"Scan": "",
|
||||
"Scan complete!": "",
|
||||
@@ -558,6 +584,8 @@
|
||||
"Success": "",
|
||||
"Successfully updated.": "",
|
||||
"Suggested": "",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "",
|
||||
"System Prompt": "",
|
||||
"Tags": "",
|
||||
@@ -570,6 +598,7 @@
|
||||
"Text-to-Speech Engine": "",
|
||||
"Tfs Z": "",
|
||||
"Thanks for your feedback!": "",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "",
|
||||
"Theme": "",
|
||||
"Thinking...": "",
|
||||
@@ -593,6 +622,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "",
|
||||
@@ -603,7 +633,13 @@
|
||||
"Tool deleted successfully": "",
|
||||
"Tool imported successfully": "",
|
||||
"Tool updated successfully": "",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "",
|
||||
"Top P": "",
|
||||
"Trouble accessing Ollama?": "",
|
||||
@@ -645,6 +681,7 @@
|
||||
"Version": "",
|
||||
"Voice": "",
|
||||
"Warning": "",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
|
||||
"Web": "",
|
||||
"Web API": "",
|
||||
@@ -671,6 +708,7 @@
|
||||
"You're a helpful assistant.": "",
|
||||
"You're now logged in.": "",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "",
|
||||
"Youtube Loader Settings": ""
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "",
|
||||
"Actions": "",
|
||||
"Active Users": "",
|
||||
"Add": "",
|
||||
"Add a model id": "",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "",
|
||||
"Add message": "",
|
||||
"Add Model": "",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "",
|
||||
"Add User": "",
|
||||
"Adjusting these settings will apply changes universally to all users.": "",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "",
|
||||
"Delete Chat": "",
|
||||
"Delete chat?": "",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "",
|
||||
"Delete prompt?": "",
|
||||
"delete this link": "",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "",
|
||||
"Description": "",
|
||||
"Didn't fully follow instructions": "",
|
||||
"Disabled": "",
|
||||
"Discover a function": "",
|
||||
"Discover a model": "",
|
||||
"Discover a prompt": "",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "",
|
||||
"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": "",
|
||||
@@ -195,6 +201,8 @@
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "",
|
||||
"Don't Allow": "",
|
||||
"Don't have an account?": "",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "",
|
||||
"Done": "",
|
||||
"Download": "",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "",
|
||||
"ElevenLabs": "",
|
||||
"Email": "",
|
||||
"Embedding Batch Size": "",
|
||||
"Embedding Model": "",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "",
|
||||
"Enable New Sign Ups": "",
|
||||
"Enable Web Search": "",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
|
||||
"Enter {{role}} message here": "",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "",
|
||||
"Enter stop sequence": "",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "",
|
||||
"Enter Your Email": "",
|
||||
"Enter Your Full Name": "",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "",
|
||||
"Enter Your Role": "",
|
||||
"Error": "",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "",
|
||||
"File Mode": "",
|
||||
"File not found.": "",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "",
|
||||
"Filter is now globally enabled": "",
|
||||
"Filters": "",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "",
|
||||
"Function created successfully": "",
|
||||
"Function deleted successfully": "",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "",
|
||||
"Functions": "",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "",
|
||||
"General": "",
|
||||
"General Settings": "",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "",
|
||||
"Generation Info": "",
|
||||
"Get up and running with": "",
|
||||
"Global": "",
|
||||
"Good Response": "",
|
||||
"Google PSE API Key": "",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "",
|
||||
"How can I help you today?": "",
|
||||
"Hybrid Search": "",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "",
|
||||
"Image Generation Engine": "",
|
||||
"Image Settings": "",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "",
|
||||
"Knowledge": "",
|
||||
"Language": "",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "",
|
||||
"Last Modified": "",
|
||||
"Light": "",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "",
|
||||
"Manage Ollama Models": "",
|
||||
"Manage Pipelines": "",
|
||||
"Manage Valves": "",
|
||||
"March": "",
|
||||
"Max Tokens (num_predict)": "",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"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": "",
|
||||
"Mirostat": "",
|
||||
"Mirostat Eta": "",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "",
|
||||
"Plain text (.txt)": "",
|
||||
"Playground": "",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "",
|
||||
"Previous 30 days": "",
|
||||
"Previous 7 days": "",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "",
|
||||
"Rosé Pine Dawn": "",
|
||||
"RTL": "",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "",
|
||||
"Save": "",
|
||||
"Save & Create": "",
|
||||
"Save & Update": "",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "",
|
||||
"Scan": "",
|
||||
"Scan complete!": "",
|
||||
@@ -558,6 +584,8 @@
|
||||
"Success": "",
|
||||
"Successfully updated.": "",
|
||||
"Suggested": "",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "",
|
||||
"System Prompt": "",
|
||||
"Tags": "",
|
||||
@@ -570,6 +598,7 @@
|
||||
"Text-to-Speech Engine": "",
|
||||
"Tfs Z": "",
|
||||
"Thanks for your feedback!": "",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "",
|
||||
"Theme": "",
|
||||
"Thinking...": "",
|
||||
@@ -593,6 +622,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "",
|
||||
@@ -603,7 +633,13 @@
|
||||
"Tool deleted successfully": "",
|
||||
"Tool imported successfully": "",
|
||||
"Tool updated successfully": "",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "",
|
||||
"Top P": "",
|
||||
"Trouble accessing Ollama?": "",
|
||||
@@ -645,6 +681,7 @@
|
||||
"Version": "",
|
||||
"Voice": "",
|
||||
"Warning": "",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
|
||||
"Web": "",
|
||||
"Web API": "",
|
||||
@@ -671,6 +708,7 @@
|
||||
"You're a helpful assistant.": "",
|
||||
"You're now logged in.": "",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "",
|
||||
"Youtube Loader Settings": ""
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "Cuenta",
|
||||
"Account Activation Pending": "Activación de cuenta pendiente",
|
||||
"Accurate information": "Información precisa",
|
||||
"Actions": "",
|
||||
"Active Users": "Usuarios activos",
|
||||
"Add": "Agregar",
|
||||
"Add a model id": "Adición de un identificador de modelo",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "Agregar Memoria",
|
||||
"Add message": "Agregar Prompt",
|
||||
"Add Model": "Agregar Modelo",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "agregar etiquetas",
|
||||
"Add User": "Agregar Usuario",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Ajustar estas opciones aplicará los cambios universalmente a todos los usuarios.",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "Borrar chat",
|
||||
"Delete Chat": "Borrar Chat",
|
||||
"Delete chat?": "Borrar el chat?",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "",
|
||||
"Delete prompt?": "",
|
||||
"delete this link": "Borrar este enlace",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "Eliminado {{nombre}}",
|
||||
"Description": "Descripción",
|
||||
"Didn't fully follow instructions": "No siguió las instrucciones",
|
||||
"Disabled": "",
|
||||
"Discover a function": "Descubre una función",
|
||||
"Discover a model": "Descubrir un modelo",
|
||||
"Discover a prompt": "Descubre un Prompt",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "Desestimable",
|
||||
"Display Emoji in Call": "Muestra Emoji en llamada",
|
||||
"Display the username instead of You in the Chat": "Mostrar el nombre de usuario en lugar de Usted en el chat",
|
||||
"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",
|
||||
@@ -195,6 +201,8 @@
|
||||
"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.",
|
||||
"Don't Allow": "No Permitir",
|
||||
"Don't have an account?": "¿No tienes una cuenta?",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "No te gusta el estilo?",
|
||||
"Done": "Hecho",
|
||||
"Download": "Descargar",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "Editar Documento",
|
||||
"Edit Memory": "Editar Memoria",
|
||||
"Edit User": "Editar Usuario",
|
||||
"ElevenLabs": "",
|
||||
"Email": "Email",
|
||||
"Embedding Batch Size": "Tamaño de Embedding",
|
||||
"Embedding Model": "Modelo de Embedding",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "Habilitar el uso compartido de la comunidad",
|
||||
"Enable New Sign Ups": "Habilitar Nuevos Registros",
|
||||
"Enable Web Search": "Habilitar la búsqueda web",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Asegúrese de que su archivo CSV incluya 4 columnas en este orden: Nombre, Correo Electrónico, Contraseña, Rol.",
|
||||
"Enter {{role}} message here": "Ingrese el mensaje {{role}} aquí",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "Ingrese la clave API de Serply",
|
||||
"Enter Serpstack API Key": "Ingrese la clave API de Serpstack",
|
||||
"Enter stop sequence": "Ingrese la secuencia de parada",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "Ingrese la clave API de Tavily",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "Ingrese el Top K",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "Ingrese la URL (p.ej., http://localhost:11434)",
|
||||
"Enter Your Email": "Ingrese su correo electrónico",
|
||||
"Enter Your Full Name": "Ingrese su nombre completo",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "Ingrese su contraseña",
|
||||
"Enter Your Role": "Ingrese su rol",
|
||||
"Error": "Error",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "Archivo",
|
||||
"File Mode": "Modo de archivo",
|
||||
"File not found.": "Archivo no encontrado.",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "",
|
||||
"Filter is now globally enabled": "",
|
||||
"Filters": "Filtros",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "Penalización de frecuencia",
|
||||
"Function created successfully": "Función creada exitosamente",
|
||||
"Function deleted successfully": "Función borrada exitosamente",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "Función actualizada exitosamente",
|
||||
"Functions": "Funciones",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "Funciones importadas exitosamente",
|
||||
"General": "General",
|
||||
"General Settings": "Opciones Generales",
|
||||
"Generate Image": "Generar imagen",
|
||||
"Generating search query": "Generación de consultas de búsqueda",
|
||||
"Generation Info": "Información de Generación",
|
||||
"Get up and running with": "",
|
||||
"Global": "",
|
||||
"Good Response": "Buena Respuesta",
|
||||
"Google PSE API Key": "Clave API de Google PSE",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "Esconder Modelo",
|
||||
"How can I help you today?": "¿Cómo puedo ayudarte hoy?",
|
||||
"Hybrid Search": "Búsqueda Híbrida",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "Generación de imágenes (experimental)",
|
||||
"Image Generation Engine": "Motor de generación de imágenes",
|
||||
"Image Settings": "Ajustes de la Imágen",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "Atajos de teclado",
|
||||
"Knowledge": "Conocimiento",
|
||||
"Language": "Lenguaje",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "Última Actividad",
|
||||
"Last Modified": "Modificado por última vez",
|
||||
"Light": "Claro",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "Administrar Modelos",
|
||||
"Manage Ollama Models": "Administrar Modelos Ollama",
|
||||
"Manage Pipelines": "Administrar Pipelines",
|
||||
"Manage Valves": "Gestionar Valves",
|
||||
"March": "Marzo",
|
||||
"Max Tokens (num_predict)": "Máximo de fichas (num_predict)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Se pueden descargar un máximo de 3 modelos simultáneamente. Por favor, inténtelo de nuevo más tarde.",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "Memoria borrada correctamente",
|
||||
"Memory updated successfully": "Memoria actualizada correctamente",
|
||||
"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",
|
||||
"Mirostat": "Mirostat",
|
||||
"Mirostat Eta": "Mirostat Eta",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "Tuberías Válvulas",
|
||||
"Plain text (.txt)": "Texto plano (.txt)",
|
||||
"Playground": "Patio de juegos",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "Actitud positiva",
|
||||
"Previous 30 days": "Últimos 30 días",
|
||||
"Previous 7 days": "Últimos 7 días",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "Ejecutando",
|
||||
"Save": "Guardar",
|
||||
"Save & Create": "Guardar y Crear",
|
||||
"Save & Update": "Guardar y Actualizar",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Ya no se admite guardar registros de chat directamente en el almacenamiento de su navegador. Tómese un momento para descargar y eliminar sus registros de chat haciendo clic en el botón a continuación. No te preocupes, puedes volver a importar fácilmente tus registros de chat al backend a través de",
|
||||
"Scan": "Escanear",
|
||||
"Scan complete!": "¡Escaneo completado!",
|
||||
@@ -559,6 +585,8 @@
|
||||
"Success": "Éxito",
|
||||
"Successfully updated.": "Actualizado exitosamente.",
|
||||
"Suggested": "Sugerido",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "Sistema",
|
||||
"System Prompt": "Prompt del sistema",
|
||||
"Tags": "Etiquetas",
|
||||
@@ -571,6 +599,7 @@
|
||||
"Text-to-Speech Engine": "Motor de texto a voz",
|
||||
"Tfs Z": "Tfs Z",
|
||||
"Thanks for your feedback!": "¡Gracias por tu retroalimentación!",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "El puntaje debe ser un valor entre 0.0 (0%) y 1.0 (100%).",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "Pensando...",
|
||||
@@ -594,6 +623,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Para acceder al interfaz de usuario web, por favor contacte al administrador. Los administradores pueden administrar los estados de los usuarios desde el panel de administración.",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "Para agregar documentos aquí, subalos al área de trabajo \"Documentos\" primero.",
|
||||
"to chat input.": "a la entrada del chat.",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "Para seleccionar filtros aquí, agreguelos al área de trabajo \"Funciones\" primero.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "Para seleccionar herramientas aquí, agreguelas al área de trabajo \"Herramientas\" primero.",
|
||||
"Today": "Hoy",
|
||||
@@ -604,7 +634,13 @@
|
||||
"Tool deleted successfully": "Herramienta eliminada con éxito",
|
||||
"Tool imported successfully": "Herramienta importada con éxito",
|
||||
"Tool updated successfully": "Herramienta actualizada con éxito",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "Herramientas",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "¿Problemas para acceder a Ollama?",
|
||||
@@ -646,6 +682,7 @@
|
||||
"Version": "Versión",
|
||||
"Voice": "Voz",
|
||||
"Warning": "Advertencia",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Advertencia: Si actualiza o cambia su modelo de inserción, necesitará volver a importar todos los documentos.",
|
||||
"Web": "Web",
|
||||
"Web API": "API Web",
|
||||
@@ -672,6 +709,7 @@
|
||||
"You're a helpful assistant.": "Usted es un asistente útil.",
|
||||
"You're now logged in.": "Usted ahora está conectado.",
|
||||
"Your account status is currently pending activation.": "El estado de su cuenta actualmente se encuentra pendiente de activación.",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Configuración del cargador de Youtube"
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "حساب کاربری",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "اطلاعات دقیق",
|
||||
"Actions": "",
|
||||
"Active Users": "",
|
||||
"Add": "اضافه کردن",
|
||||
"Add a model id": "افزودن شناسه مدل",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "اضافه کردن یادگیری",
|
||||
"Add message": "اضافه کردن پیغام",
|
||||
"Add Model": "اضافه کردن مدل",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "اضافه کردن تگ\u200cها",
|
||||
"Add User": "اضافه کردن کاربر",
|
||||
"Adjusting these settings will apply changes universally to all users.": "با تنظیم این تنظیمات، تغییرات به طور کلی برای همه کاربران اعمال می شود.",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "حذف گپ",
|
||||
"Delete Chat": "حذف گپ",
|
||||
"Delete chat?": "",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "",
|
||||
"Delete prompt?": "",
|
||||
"delete this link": "حذف این لینک",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "حذف شده {{name}}",
|
||||
"Description": "توضیحات",
|
||||
"Didn't fully follow instructions": "نمی تواند دستورالعمل را کامل پیگیری کند",
|
||||
"Disabled": "",
|
||||
"Discover a function": "",
|
||||
"Discover a model": "کشف یک مدل",
|
||||
"Discover a prompt": "یک اعلان را کشف کنید",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "نمایش نام کاربری به جای «شما» در چت",
|
||||
"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": "",
|
||||
@@ -195,6 +201,8 @@
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "هیچ اتصال خارجی ایجاد نمی کند و داده های شما به طور ایمن در سرور میزبان محلی شما باقی می ماند.",
|
||||
"Don't Allow": "اجازه نده",
|
||||
"Don't have an account?": "حساب کاربری ندارید؟",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "نظری ندارید؟",
|
||||
"Done": "",
|
||||
"Download": "دانلود کن",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "ویرایش سند",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "ویرایش کاربر",
|
||||
"ElevenLabs": "",
|
||||
"Email": "ایمیل",
|
||||
"Embedding Batch Size": "",
|
||||
"Embedding Model": "مدل پیدائش",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "فعالسازی اشتراک انجمن",
|
||||
"Enable New Sign Ups": "فعال کردن ثبت نام\u200cهای جدید",
|
||||
"Enable Web Search": "فعالسازی جستجوی وب",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "اطمینان حاصل کنید که فایل CSV شما شامل چهار ستون در این ترتیب است: نام، ایمیل، رمز عبور، نقش.",
|
||||
"Enter {{role}} message here": "پیام {{role}} را اینجا وارد کنید",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "کلید API Serpstack را وارد کنید",
|
||||
"Enter stop sequence": "توالی توقف را وارد کنید",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "مقدار Top K را وارد کنید",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "مقدار URL را وارد کنید (مثال http://localhost:11434)",
|
||||
"Enter Your Email": "ایمیل خود را وارد کنید",
|
||||
"Enter Your Full Name": "نام کامل خود را وارد کنید",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "رمز عبور خود را وارد کنید",
|
||||
"Enter Your Role": "نقش خود را وارد کنید",
|
||||
"Error": "خطا",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "",
|
||||
"File Mode": "حالت فایل",
|
||||
"File not found.": "فایل یافت نشد.",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "",
|
||||
"Filter is now globally enabled": "",
|
||||
"Filters": "",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "مجازات فرکانس",
|
||||
"Function created successfully": "",
|
||||
"Function deleted successfully": "",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "",
|
||||
"Functions": "",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "",
|
||||
"General": "عمومی",
|
||||
"General Settings": "تنظیمات عمومی",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "در حال تولید پرسوجوی جستجو",
|
||||
"Generation Info": "اطلاعات تولید",
|
||||
"Get up and running with": "",
|
||||
"Global": "",
|
||||
"Good Response": "پاسخ خوب",
|
||||
"Google PSE API Key": "گوگل PSE API کلید",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "",
|
||||
"How can I help you today?": "امروز چطور می توانم کمک تان کنم؟",
|
||||
"Hybrid Search": "جستجوی همزمان",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "تولید تصویر (آزمایشی)",
|
||||
"Image Generation Engine": "موتور تولید تصویر",
|
||||
"Image Settings": "تنظیمات تصویر",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "میانبرهای صفحه کلید",
|
||||
"Knowledge": "",
|
||||
"Language": "زبان",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "آخرین فعال",
|
||||
"Last Modified": "",
|
||||
"Light": "روشن",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "مدیریت مدل\u200cها",
|
||||
"Manage Ollama Models": "مدیریت مدل\u200cهای اولاما",
|
||||
"Manage Pipelines": "مدیریت خطوط لوله",
|
||||
"Manage Valves": "",
|
||||
"March": "مارچ",
|
||||
"Max Tokens (num_predict)": "توکنهای بیشینه (num_predict)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "حداکثر 3 مدل را می توان به طور همزمان دانلود کرد. لطفاً بعداً دوباره امتحان کنید.",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"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": "نماد کمینه",
|
||||
"Mirostat": "Mirostat",
|
||||
"Mirostat Eta": "Mirostat Eta",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "شیرالات خطوط لوله",
|
||||
"Plain text (.txt)": "متن ساده (.txt)",
|
||||
"Playground": "زمین بازی",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "نظرات مثبت",
|
||||
"Previous 30 days": "30 روز قبل",
|
||||
"Previous 7 days": "7 روز قبل",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "",
|
||||
"Save": "ذخیره",
|
||||
"Save & Create": "ذخیره و ایجاد",
|
||||
"Save & Update": "ذخیره و به\u200cروزرسانی",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "ذخیره گزارش\u200cهای چت مستقیماً در حافظه مرورگر شما دیگر پشتیبانی نمی\u200cشود. لطفاً با کلیک بر روی دکمه زیر، چند لحظه برای دانلود و حذف گزارش های چت خود وقت بگذارید. نگران نباشید، شما به راحتی می توانید گزارش های چت خود را از طریق بکند دوباره وارد کنید",
|
||||
"Scan": "اسکن",
|
||||
"Scan complete!": "اسکن کامل شد!",
|
||||
@@ -558,6 +584,8 @@
|
||||
"Success": "موفقیت",
|
||||
"Successfully updated.": "با موفقیت به روز شد",
|
||||
"Suggested": "پیشنهادی",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "سیستم",
|
||||
"System Prompt": "پرامپت سیستم",
|
||||
"Tags": "تگ\u200cها",
|
||||
@@ -570,6 +598,7 @@
|
||||
"Text-to-Speech Engine": "موتور تبدیل متن به گفتار",
|
||||
"Tfs Z": "Tfs Z",
|
||||
"Thanks for your feedback!": "با تشکر از بازخورد شما!",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "امتیاز باید یک مقدار بین 0.0 (0%) و 1.0 (100%) باشد.",
|
||||
"Theme": "قالب",
|
||||
"Thinking...": "",
|
||||
@@ -593,6 +622,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "در ورودی گپ.",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "امروز",
|
||||
@@ -603,7 +633,13 @@
|
||||
"Tool deleted successfully": "",
|
||||
"Tool imported successfully": "",
|
||||
"Tool updated successfully": "",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "در دسترسی به اولاما مشکل دارید؟",
|
||||
@@ -645,6 +681,7 @@
|
||||
"Version": "نسخه",
|
||||
"Voice": "",
|
||||
"Warning": "هشدار",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "هشدار: اگر شما به روز کنید یا تغییر دهید مدل شما، باید تمام سند ها را مجددا وارد کنید.",
|
||||
"Web": "وب",
|
||||
"Web API": "",
|
||||
@@ -671,6 +708,7 @@
|
||||
"You're a helpful assistant.": "تو یک دستیار سودمند هستی.",
|
||||
"You're now logged in.": "شما اکنون وارد شده\u200cاید.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "یوتیوب",
|
||||
"Youtube Loader Settings": "تنظیمات لودر یوتیوب"
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "Tili",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Tarkkaa tietoa",
|
||||
"Actions": "",
|
||||
"Active Users": "",
|
||||
"Add": "Lisää",
|
||||
"Add a model id": "Mallitunnuksen lisääminen",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "Lisää muistia",
|
||||
"Add message": "Lisää viesti",
|
||||
"Add Model": "Lisää malli",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "Lisää tageja",
|
||||
"Add User": "Lisää käyttäjä",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Näiden asetusten säätäminen vaikuttaa kaikkiin käyttäjiin.",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "Poista keskustelu",
|
||||
"Delete Chat": "Poista keskustelu",
|
||||
"Delete chat?": "",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "",
|
||||
"Delete prompt?": "",
|
||||
"delete this link": "poista tämä linkki",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "Poistettu {{nimi}}",
|
||||
"Description": "Kuvaus",
|
||||
"Didn't fully follow instructions": "Ei noudattanut ohjeita täysin",
|
||||
"Disabled": "",
|
||||
"Discover a function": "",
|
||||
"Discover a model": "Tutustu malliin",
|
||||
"Discover a prompt": "Löydä kehote",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Näytä käyttäjänimi keskustelussa",
|
||||
"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": "",
|
||||
@@ -195,6 +201,8 @@
|
||||
"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.",
|
||||
"Don't Allow": "Älä salli",
|
||||
"Don't have an account?": "Eikö sinulla ole tiliä?",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "En pidä tyylistä",
|
||||
"Done": "",
|
||||
"Download": "Lataa",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "Muokkaa asiakirjaa",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Muokkaa käyttäjää",
|
||||
"ElevenLabs": "",
|
||||
"Email": "Sähköposti",
|
||||
"Embedding Batch Size": "",
|
||||
"Embedding Model": "Upotusmalli",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "Ota yhteisön jakaminen käyttöön",
|
||||
"Enable New Sign Ups": "Salli uudet rekisteröitymiset",
|
||||
"Enable Web Search": "Ota verkkohaku käyttöön",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Varmista, että CSV-tiedostossasi on 4 saraketta seuraavassa järjestyksessä: Nimi, Sähköposti, Salasana, Rooli.",
|
||||
"Enter {{role}} message here": "Kirjoita {{role}} viesti tähän",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Anna Serpstack API -avain",
|
||||
"Enter stop sequence": "Syötä lopetussekvenssi",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "Syötä Top K",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "Syötä URL (esim. http://localhost:11434)",
|
||||
"Enter Your Email": "Syötä sähköpostiosoitteesi",
|
||||
"Enter Your Full Name": "Syötä koko nimesi",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "Syötä salasanasi",
|
||||
"Enter Your Role": "Syötä roolisi",
|
||||
"Error": "Virhe",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "",
|
||||
"File Mode": "Tiedostotila",
|
||||
"File not found.": "Tiedostoa ei löytynyt.",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "",
|
||||
"Filter is now globally enabled": "",
|
||||
"Filters": "",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "Taajuussakko",
|
||||
"Function created successfully": "",
|
||||
"Function deleted successfully": "",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "",
|
||||
"Functions": "",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "",
|
||||
"General": "Yleinen",
|
||||
"General Settings": "Yleisasetukset",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "Hakukyselyn luominen",
|
||||
"Generation Info": "Generointitiedot",
|
||||
"Get up and running with": "",
|
||||
"Global": "",
|
||||
"Good Response": "Hyvä vastaus",
|
||||
"Google PSE API Key": "Google PSE API -avain",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "",
|
||||
"How can I help you today?": "Kuinka voin auttaa tänään?",
|
||||
"Hybrid Search": "Hybridihaku",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "Kuvagenerointi (kokeellinen)",
|
||||
"Image Generation Engine": "Kuvagenerointimoottori",
|
||||
"Image Settings": "Kuva-asetukset",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "Pikanäppäimet",
|
||||
"Knowledge": "",
|
||||
"Language": "Kieli",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "Viimeksi aktiivinen",
|
||||
"Last Modified": "",
|
||||
"Light": "Vaalea",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "Hallitse malleja",
|
||||
"Manage Ollama Models": "Hallitse Ollama-malleja",
|
||||
"Manage Pipelines": "Hallitse putkia",
|
||||
"Manage Valves": "",
|
||||
"March": "maaliskuu",
|
||||
"Max Tokens (num_predict)": "Tokenien enimmäismäärä (num_predict)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Enintään 3 mallia voidaan ladata samanaikaisesti. Yritä myöhemmin uudelleen.",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"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",
|
||||
"Mirostat": "Mirostat",
|
||||
"Mirostat Eta": "Mirostat Eta",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "Putkistot Venttiilit",
|
||||
"Plain text (.txt)": "Pelkkä teksti (.txt)",
|
||||
"Playground": "Leikkipaikka",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "Positiivinen asenne",
|
||||
"Previous 30 days": "Edelliset 30 päivää",
|
||||
"Previous 7 days": "Edelliset 7 päivää",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "Rosee-mänty",
|
||||
"Rosé Pine Dawn": "Aamuinen Rosee-mänty",
|
||||
"RTL": "RTL",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "",
|
||||
"Save": "Tallenna",
|
||||
"Save & Create": "Tallenna ja luo",
|
||||
"Save & Update": "Tallenna ja päivitä",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Keskustelulokien tallentaminen suoraan selaimen tallennustilaan ei ole enää tuettua. Lataa ja poista keskustelulokit napsauttamalla alla olevaa painiketta. Älä huoli, voit helposti tuoda keskustelulokit takaisin backendiin",
|
||||
"Scan": "Skannaa",
|
||||
"Scan complete!": "Skannaus valmis!",
|
||||
@@ -558,6 +584,8 @@
|
||||
"Success": "Onnistui",
|
||||
"Successfully updated.": "Päivitetty onnistuneesti.",
|
||||
"Suggested": "Suositeltu",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "Järjestelmä",
|
||||
"System Prompt": "Järjestelmäkehote",
|
||||
"Tags": "Tagit",
|
||||
@@ -570,6 +598,7 @@
|
||||
"Text-to-Speech Engine": "Puhemoottori",
|
||||
"Tfs Z": "TFS Z",
|
||||
"Thanks for your feedback!": "Kiitos palautteestasi!",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Pisteytyksen tulee olla arvo välillä 0.0 (0%) ja 1.0 (100%).",
|
||||
"Theme": "Teema",
|
||||
"Thinking...": "",
|
||||
@@ -593,6 +622,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "keskustelusyötteeseen.",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Tänään",
|
||||
@@ -603,7 +633,13 @@
|
||||
"Tool deleted successfully": "",
|
||||
"Tool imported successfully": "",
|
||||
"Tool updated successfully": "",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Ongelmia Ollama-yhteydessä?",
|
||||
@@ -645,6 +681,7 @@
|
||||
"Version": "Versio",
|
||||
"Voice": "",
|
||||
"Warning": "Varoitus",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Varoitus: Jos päivität tai vaihdat upotusmallia, sinun on tuotava kaikki asiakirjat uudelleen.",
|
||||
"Web": "Web",
|
||||
"Web API": "",
|
||||
@@ -671,6 +708,7 @@
|
||||
"You're a helpful assistant.": "Olet avulias apulainen.",
|
||||
"You're now logged in.": "Olet nyt kirjautunut sisään.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Youtube Loader-asetukset"
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "Compte",
|
||||
"Account Activation Pending": "Activation du compte en attente",
|
||||
"Accurate information": "Information exacte",
|
||||
"Actions": "",
|
||||
"Active Users": "Utilisateurs actifs",
|
||||
"Add": "Ajouter",
|
||||
"Add a model id": "Ajouter un identifiant de modèle",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "Ajouter de la mémoire",
|
||||
"Add message": "Ajouter un message",
|
||||
"Add Model": "Ajouter un modèle",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "Ajouter des balises",
|
||||
"Add User": "Ajouter un Utilisateur",
|
||||
"Adjusting these settings will apply changes universally to all users.": "L'ajustement de ces paramètres appliquera universellement les changements à tous les utilisateurs.",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "Supprimer la conversation",
|
||||
"Delete Chat": "Supprimer la Conversation",
|
||||
"Delete chat?": "Supprimer la conversation ?",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "Supprimer la fonction ?",
|
||||
"Delete prompt?": "Supprimer la prompt ?",
|
||||
"delete this link": "supprimer ce lien",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "Supprimé {{name}}",
|
||||
"Description": "Description",
|
||||
"Didn't fully follow instructions": "N'a pas entièrement respecté les instructions",
|
||||
"Disabled": "",
|
||||
"Discover a function": "Découvrez une fonction",
|
||||
"Discover a model": "Découvrir un modèle",
|
||||
"Discover a prompt": "Découvrir une suggestion",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "Fermeture",
|
||||
"Display Emoji in Call": "Afficher les emojis pendant l'appel",
|
||||
"Display the username instead of You in the Chat": "Afficher le nom d'utilisateur à la place de \"Vous\" dans le Chat",
|
||||
"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",
|
||||
@@ -195,6 +201,8 @@
|
||||
"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.",
|
||||
"Don't Allow": "Ne pas autoriser",
|
||||
"Don't have an account?": "Vous n'avez pas de compte ?",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "N'apprécie pas le style",
|
||||
"Done": "Terminé",
|
||||
"Download": "Télécharger",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "Modifier le document",
|
||||
"Edit Memory": "Modifier la mémoire",
|
||||
"Edit User": "Modifier l'utilisateur",
|
||||
"ElevenLabs": "",
|
||||
"Email": "E-mail",
|
||||
"Embedding Batch Size": "Taille du lot d'encodage",
|
||||
"Embedding Model": "Modèle d'embedding",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "Activer le partage communautaire",
|
||||
"Enable New Sign Ups": "Activer les nouvelles inscriptions",
|
||||
"Enable Web Search": "Activer la recherche sur le Web",
|
||||
"Enabled": "",
|
||||
"Engine": "Moteur",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Vérifiez que votre fichier CSV comprenne les 4 colonnes dans cet ordre : Name, Email, Password, Role.",
|
||||
"Enter {{role}} message here": "Entrez le message {{role}} ici",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "Entrez la clé API Serply",
|
||||
"Enter Serpstack API Key": "Entrez la clé API Serpstack",
|
||||
"Enter stop sequence": "Entrez la séquence d'arrêt",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "Entrez la clé API Tavily",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "Entrez les Top K",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "Entrez l'URL (par ex. http://localhost:11434)",
|
||||
"Enter Your Email": "Entrez votre adresse e-mail",
|
||||
"Enter Your Full Name": "Entrez votre nom complet",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "Entrez votre mot de passe",
|
||||
"Enter Your Role": "Entrez votre rôle",
|
||||
"Error": "Erreur",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "Fichier",
|
||||
"File Mode": "Mode fichier",
|
||||
"File not found.": "Fichier introuvable.",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "Le filtre est maintenant désactivé globalement",
|
||||
"Filter is now globally enabled": "Le filtre est désormais activé globalement",
|
||||
"Filters": "Filtres",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "Pénalité de fréquence",
|
||||
"Function created successfully": "La fonction a été créée avec succès",
|
||||
"Function deleted successfully": "Fonction supprimée avec succès",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "La fonction a été mise à jour avec succès",
|
||||
"Functions": "Fonctions",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "Fonctions importées avec succès",
|
||||
"General": "Général",
|
||||
"General Settings": "Paramètres Généraux",
|
||||
"Generate Image": "Générer une image",
|
||||
"Generating search query": "Génération d'une requête de recherche",
|
||||
"Generation Info": "Informations sur la génération",
|
||||
"Get up and running with": "",
|
||||
"Global": "Mondial",
|
||||
"Good Response": "Bonne réponse",
|
||||
"Google PSE API Key": "Clé API Google PSE",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "Masquer le modèle",
|
||||
"How can I help you today?": "Comment puis-je vous être utile aujourd'hui ?",
|
||||
"Hybrid Search": "Recherche hybride",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "Génération d'images (expérimental)",
|
||||
"Image Generation Engine": "Moteur de génération d'images",
|
||||
"Image Settings": "Paramètres de l'image",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "Raccourcis clavier",
|
||||
"Knowledge": "Connaissance",
|
||||
"Language": "Langue",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "Dernière activité",
|
||||
"Last Modified": "Dernière modification",
|
||||
"Light": "Lumineux",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "Gérer les Modèles",
|
||||
"Manage Ollama Models": "Gérer les modèles Ollama",
|
||||
"Manage Pipelines": "Gérer les pipelines",
|
||||
"Manage Valves": "Gérer les vannes",
|
||||
"March": "Mars",
|
||||
"Max Tokens (num_predict)": "Tokens maximaux (num_predict)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé en même temps. Veuillez réessayer ultérieurement.",
|
||||
@@ -353,6 +375,7 @@
|
||||
"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",
|
||||
"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",
|
||||
"Mirostat": "Mirostat",
|
||||
"Mirostat Eta": "Mirostat Eta",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "Vannes de Pipelines",
|
||||
"Plain text (.txt)": "Texte simple (.txt)",
|
||||
"Playground": "Aire de jeux",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "Attitude positive",
|
||||
"Previous 30 days": "30 derniers jours",
|
||||
"Previous 7 days": "7 derniers jours",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "Pin rosé",
|
||||
"Rosé Pine Dawn": "Aube de Pin Rosé",
|
||||
"RTL": "RTL",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "Courir",
|
||||
"Save": "Enregistrer",
|
||||
"Save & Create": "Enregistrer & Créer",
|
||||
"Save & Update": "Enregistrer & Mettre à jour",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "La sauvegarde des journaux de discussion directement dans le stockage de votre navigateur n'est plus prise en charge. Veuillez prendre un instant pour télécharger et supprimer vos journaux de discussion en cliquant sur le bouton ci-dessous. Pas de soucis, vous pouvez facilement les réimporter depuis le backend via l'interface ci-dessous",
|
||||
"Scan": "Scanner",
|
||||
"Scan complete!": "Scan terminé !",
|
||||
@@ -559,6 +585,8 @@
|
||||
"Success": "Réussite",
|
||||
"Successfully updated.": "Mise à jour réussie.",
|
||||
"Suggested": "Sugéré",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "Système",
|
||||
"System Prompt": "Prompt du système",
|
||||
"Tags": "Balises",
|
||||
@@ -571,6 +599,7 @@
|
||||
"Text-to-Speech Engine": "Moteur de synthèse vocale",
|
||||
"Tfs Z": "Tfs Z",
|
||||
"Thanks for your feedback!": "Merci pour vos commentaires !",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Le score doit être une valeur comprise entre 0,0 (0\u00a0%) et 1,0 (100\u00a0%).",
|
||||
"Theme": "Thème",
|
||||
"Thinking...": "En train de réfléchir...",
|
||||
@@ -594,6 +623,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Pour accéder à l'interface Web, veuillez contacter l'administrateur. Les administrateurs peuvent gérer les statuts des utilisateurs depuis le panneau d'administration.",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "Pour ajouter des documents ici, téléchargez-les d'abord dans l'espace de travail « Documents ». ",
|
||||
"to chat input.": "à l'entrée de discussion.",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "Pour sélectionner des filtres ici, ajoutez-les d'abord à l'espace de travail « Fonctions ». ",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "Pour sélectionner des toolkits ici, ajoutez-les d'abord à l'espace de travail « Outils ». ",
|
||||
"Today": "Aujourd'hui",
|
||||
@@ -604,7 +634,13 @@
|
||||
"Tool deleted successfully": "Outil supprimé avec succès",
|
||||
"Tool imported successfully": "Outil importé avec succès",
|
||||
"Tool updated successfully": "L'outil a été mis à jour avec succès",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "Outils",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Rencontrez-vous des difficultés pour accéder à Ollama ?",
|
||||
@@ -646,6 +682,7 @@
|
||||
"Version": "Version améliorée",
|
||||
"Voice": "Voix",
|
||||
"Warning": "Avertissement !",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avertissement : Si vous mettez à jour ou modifiez votre modèle d'encodage, vous devrez réimporter tous les documents.",
|
||||
"Web": "Web",
|
||||
"Web API": "API Web",
|
||||
@@ -672,6 +709,7 @@
|
||||
"You're a helpful assistant.": "Vous êtes un assistant serviable.",
|
||||
"You're now logged in.": "Vous êtes désormais connecté.",
|
||||
"Your account status is currently pending activation.": "Votre statut de compte est actuellement en attente d'activation.",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "YouTube",
|
||||
"Youtube Loader Settings": "Paramètres de l'outil de téléchargement YouTube"
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "Compte",
|
||||
"Account Activation Pending": "Activation du compte en attente",
|
||||
"Accurate information": "Information exacte",
|
||||
"Actions": "",
|
||||
"Active Users": "Utilisateurs actifs",
|
||||
"Add": "Ajouter",
|
||||
"Add a model id": "Ajouter un identifiant de modèle",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "Ajouter de la mémoire",
|
||||
"Add message": "Ajouter un message",
|
||||
"Add Model": "Ajouter un modèle",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "Ajouter des balises",
|
||||
"Add User": "Ajouter un Utilisateur",
|
||||
"Adjusting these settings will apply changes universally to all users.": "L'ajustement de ces paramètres appliquera universellement les changements à tous les utilisateurs.",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "Supprimer la conversation",
|
||||
"Delete Chat": "Supprimer la Conversation",
|
||||
"Delete chat?": "Supprimer la conversation ?",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "Supprimer la fonction ?",
|
||||
"Delete prompt?": "Supprimer la prompt ?",
|
||||
"delete this link": "supprimer ce lien",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "Supprimé {{name}}",
|
||||
"Description": "Description",
|
||||
"Didn't fully follow instructions": "N'a pas entièrement respecté les instructions",
|
||||
"Disabled": "",
|
||||
"Discover a function": "Découvrez une fonction",
|
||||
"Discover a model": "Découvrir un modèle",
|
||||
"Discover a prompt": "Découvrir une suggestion",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "Fermeture",
|
||||
"Display Emoji in Call": "Afficher les emojis pendant l'appel",
|
||||
"Display the username instead of You in the Chat": "Afficher le nom d'utilisateur à la place de \"Vous\" dans le Chat",
|
||||
"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",
|
||||
@@ -195,6 +201,8 @@
|
||||
"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.",
|
||||
"Don't Allow": "Ne pas autoriser",
|
||||
"Don't have an account?": "Vous n'avez pas de compte ?",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "N'apprécie pas le style",
|
||||
"Done": "Terminé",
|
||||
"Download": "Télécharger",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "Modifier le document",
|
||||
"Edit Memory": "Modifier la mémoire",
|
||||
"Edit User": "Modifier l'utilisateur",
|
||||
"ElevenLabs": "",
|
||||
"Email": "E-mail",
|
||||
"Embedding Batch Size": "Taille du lot d'encodage",
|
||||
"Embedding Model": "Modèle d'embedding",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "Activer le partage communautaire",
|
||||
"Enable New Sign Ups": "Activer les nouvelles inscriptions",
|
||||
"Enable Web Search": "Activer la recherche web",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Vérifiez que votre fichier CSV comprenne les 4 colonnes dans cet ordre : Name, Email, Password, Role.",
|
||||
"Enter {{role}} message here": "Entrez le message {{role}} ici",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "Entrez la clé API Serply",
|
||||
"Enter Serpstack API Key": "Entrez la clé API Serpstack",
|
||||
"Enter stop sequence": "Entrez la séquence d'arrêt",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "Entrez la clé API Tavily",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "Entrez les Top K",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "Entrez l'URL (par ex. http://localhost:11434)",
|
||||
"Enter Your Email": "Entrez votre adresse e-mail",
|
||||
"Enter Your Full Name": "Entrez votre nom complet",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "Entrez votre mot de passe",
|
||||
"Enter Your Role": "Entrez votre rôle",
|
||||
"Error": "Erreur",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "Fichier",
|
||||
"File Mode": "Mode fichier",
|
||||
"File not found.": "Fichier introuvable.",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "Le filtre est maintenant désactivé globalement",
|
||||
"Filter is now globally enabled": "Le filtre est désormais activé globalement",
|
||||
"Filters": "Filtres",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "Pénalité de fréquence",
|
||||
"Function created successfully": "La fonction a été créée avec succès",
|
||||
"Function deleted successfully": "Fonction supprimée avec succès",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "La fonction a été mise à jour avec succès",
|
||||
"Functions": "Fonctions",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "Fonctions importées avec succès",
|
||||
"General": "Général",
|
||||
"General Settings": "Paramètres Généraux",
|
||||
"Generate Image": "Générer une image",
|
||||
"Generating search query": "Génération d'une requête de recherche",
|
||||
"Generation Info": "Informations sur la génération",
|
||||
"Get up and running with": "",
|
||||
"Global": "Mondial",
|
||||
"Good Response": "Bonne réponse",
|
||||
"Google PSE API Key": "Clé API Google PSE",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "Masquer le modèle",
|
||||
"How can I help you today?": "Comment puis-je vous être utile aujourd'hui ?",
|
||||
"Hybrid Search": "Recherche hybride",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "Génération d'images (expérimental)",
|
||||
"Image Generation Engine": "Moteur de génération d'images",
|
||||
"Image Settings": "Paramètres de l'image",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "Raccourcis clavier",
|
||||
"Knowledge": "Connaissance",
|
||||
"Language": "Langue",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "Dernière activité",
|
||||
"Last Modified": "Dernière modification",
|
||||
"Light": "Lumineux",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "Gérer les Modèles",
|
||||
"Manage Ollama Models": "Gérer les modèles Ollama",
|
||||
"Manage Pipelines": "Gérer les pipelines",
|
||||
"Manage Valves": "Gérer les vannes",
|
||||
"March": "Mars",
|
||||
"Max Tokens (num_predict)": "Tokens maximaux (num_predict)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé en même temps. Veuillez réessayer ultérieurement.",
|
||||
@@ -353,6 +375,7 @@
|
||||
"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",
|
||||
"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",
|
||||
"Mirostat": "Mirostat",
|
||||
"Mirostat Eta": "Mirostat Eta",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "Vannes de Pipelines",
|
||||
"Plain text (.txt)": "Texte simple (.txt)",
|
||||
"Playground": "Aire de jeux",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "Attitude positive",
|
||||
"Previous 30 days": "30 derniers jours",
|
||||
"Previous 7 days": "7 derniers jours",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "Pin rosé",
|
||||
"Rosé Pine Dawn": "Aube de Pin Rosé",
|
||||
"RTL": "RTL",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "Courir",
|
||||
"Save": "Enregistrer",
|
||||
"Save & Create": "Enregistrer & Créer",
|
||||
"Save & Update": "Enregistrer & Mettre à jour",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "La sauvegarde des journaux de discussion directement dans le stockage de votre navigateur n'est plus prise en charge. Veuillez prendre un instant pour télécharger et supprimer vos journaux de discussion en cliquant sur le bouton ci-dessous. Pas de soucis, vous pouvez facilement les réimporter depuis le backend via l'interface ci-dessous",
|
||||
"Scan": "Scanner",
|
||||
"Scan complete!": "Scan terminé !",
|
||||
@@ -559,6 +585,8 @@
|
||||
"Success": "Réussite",
|
||||
"Successfully updated.": "Mise à jour réussie.",
|
||||
"Suggested": "Sugéré",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "Système",
|
||||
"System Prompt": "Prompt du système",
|
||||
"Tags": "Balises",
|
||||
@@ -571,6 +599,7 @@
|
||||
"Text-to-Speech Engine": "Moteur de synthèse vocale",
|
||||
"Tfs Z": "Tfs Z",
|
||||
"Thanks for your feedback!": "Merci pour vos commentaires !",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Le score doit être une valeur comprise entre 0,0 (0\u00a0%) et 1,0 (100\u00a0%).",
|
||||
"Theme": "Thème",
|
||||
"Thinking...": "En train de réfléchir...",
|
||||
@@ -594,6 +623,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Pour accéder à l'interface Web, veuillez contacter l'administrateur. Les administrateurs peuvent gérer les statuts des utilisateurs depuis le panneau d'administration.",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "Pour ajouter des documents ici, téléchargez-les d'abord dans l'espace de travail « Documents ». ",
|
||||
"to chat input.": "à l'entrée de discussion.",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "Pour sélectionner des filtres ici, ajoutez-les d'abord à l'espace de travail « Fonctions ». ",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "Pour sélectionner des toolkits ici, ajoutez-les d'abord à l'espace de travail « Outils ». ",
|
||||
"Today": "Aujourd'hui",
|
||||
@@ -604,7 +634,13 @@
|
||||
"Tool deleted successfully": "Outil supprimé avec succès",
|
||||
"Tool imported successfully": "Outil importé avec succès",
|
||||
"Tool updated successfully": "L'outil a été mis à jour avec succès",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "Outils",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Rencontrez-vous des difficultés pour accéder à Ollama ?",
|
||||
@@ -646,6 +682,7 @@
|
||||
"Version": "Version améliorée",
|
||||
"Voice": "Voix",
|
||||
"Warning": "Avertissement !",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avertissement : Si vous mettez à jour ou modifiez votre modèle d'encodage, vous devrez réimporter tous les documents.",
|
||||
"Web": "Web",
|
||||
"Web API": "API Web",
|
||||
@@ -672,6 +709,7 @@
|
||||
"You're a helpful assistant.": "Vous êtes un assistant serviable.",
|
||||
"You're now logged in.": "Vous êtes désormais connecté.",
|
||||
"Your account status is currently pending activation.": "Votre statut de compte est actuellement en attente d'activation.",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "YouTube",
|
||||
"Youtube Loader Settings": "Paramètres de l'outil de téléchargement YouTube"
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "חשבון",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "מידע מדויק",
|
||||
"Actions": "",
|
||||
"Active Users": "",
|
||||
"Add": "הוסף",
|
||||
"Add a model id": "הוספת מזהה דגם",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "הוסף זיכרון",
|
||||
"Add message": "הוסף הודעה",
|
||||
"Add Model": "הוסף מודל",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "הוסף תגים",
|
||||
"Add User": "הוסף משתמש",
|
||||
"Adjusting these settings will apply changes universally to all users.": "התאמת הגדרות אלו תחול על כל המשתמשים.",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "מחק צ'אט",
|
||||
"Delete Chat": "מחק צ'אט",
|
||||
"Delete chat?": "",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "",
|
||||
"Delete prompt?": "",
|
||||
"delete this link": "מחק את הקישור הזה",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "נמחק {{name}}",
|
||||
"Description": "תיאור",
|
||||
"Didn't fully follow instructions": "לא עקב אחרי ההוראות באופן מלא",
|
||||
"Disabled": "",
|
||||
"Discover a function": "",
|
||||
"Discover a model": "גלה מודל",
|
||||
"Discover a prompt": "גלה פקודה",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "הצג את שם המשתמש במקום 'אתה' בצ'אט",
|
||||
"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": "",
|
||||
@@ -195,6 +201,8 @@
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "לא מבצע חיבורים חיצוניים, והנתונים שלך נשמרים באופן מאובטח בשרת המקומי שלך.",
|
||||
"Don't Allow": "אל תאפשר",
|
||||
"Don't have an account?": "אין לך חשבון?",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "לא אוהב את הסגנון",
|
||||
"Done": "",
|
||||
"Download": "הורד",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "ערוך מסמך",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "ערוך משתמש",
|
||||
"ElevenLabs": "",
|
||||
"Email": "דוא\"ל",
|
||||
"Embedding Batch Size": "",
|
||||
"Embedding Model": "מודל הטמעה",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "הפיכת שיתוף קהילה לזמין",
|
||||
"Enable New Sign Ups": "אפשר הרשמות חדשות",
|
||||
"Enable Web Search": "הפיכת חיפוש באינטרנט לזמין",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "ודא שקובץ ה-CSV שלך כולל 4 עמודות בסדר הבא: שם, דוא\"ל, סיסמה, תפקיד.",
|
||||
"Enter {{role}} message here": "הזן הודעת {{role}} כאן",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "הזן מפתח API של Serpstack",
|
||||
"Enter stop sequence": "הזן רצף עצירה",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "הזן Top K",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "הזן כתובת URL (למשל http://localhost:11434)",
|
||||
"Enter Your Email": "הזן את דוא\"ל שלך",
|
||||
"Enter Your Full Name": "הזן את שמך המלא",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "הזן את הסיסמה שלך",
|
||||
"Enter Your Role": "הזן את התפקיד שלך",
|
||||
"Error": "שגיאה",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "",
|
||||
"File Mode": "מצב קובץ",
|
||||
"File not found.": "הקובץ לא נמצא.",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "",
|
||||
"Filter is now globally enabled": "",
|
||||
"Filters": "",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "עונש תדירות",
|
||||
"Function created successfully": "",
|
||||
"Function deleted successfully": "",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "",
|
||||
"Functions": "",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "",
|
||||
"General": "כללי",
|
||||
"General Settings": "הגדרות כלליות",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "יצירת שאילתת חיפוש",
|
||||
"Generation Info": "מידע על היצירה",
|
||||
"Get up and running with": "",
|
||||
"Global": "",
|
||||
"Good Response": "תגובה טובה",
|
||||
"Google PSE API Key": "מפתח API של Google PSE",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "",
|
||||
"How can I help you today?": "כיצד אוכל לעזור לך היום?",
|
||||
"Hybrid Search": "חיפוש היברידי",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "יצירת תמונות (ניסיוני)",
|
||||
"Image Generation Engine": "מנוע יצירת תמונות",
|
||||
"Image Settings": "הגדרות תמונה",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "קיצורי מקלדת",
|
||||
"Knowledge": "",
|
||||
"Language": "שפה",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "פעיל לאחרונה",
|
||||
"Last Modified": "",
|
||||
"Light": "בהיר",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "נהל מודלים",
|
||||
"Manage Ollama Models": "נהל מודלים של Ollama",
|
||||
"Manage Pipelines": "ניהול צינורות",
|
||||
"Manage Valves": "",
|
||||
"March": "מרץ",
|
||||
"Max Tokens (num_predict)": "מקסימום אסימונים (num_predict)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "ניתן להוריד מקסימום 3 מודלים בו זמנית. אנא נסה שוב מאוחר יותר.",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"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": "ציון מינימלי",
|
||||
"Mirostat": "Mirostat",
|
||||
"Mirostat Eta": "Mirostat Eta",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "צינורות שסתומים",
|
||||
"Plain text (.txt)": "טקסט פשוט (.txt)",
|
||||
"Playground": "אזור משחקים",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "גישה חיובית",
|
||||
"Previous 30 days": "30 הימים הקודמים",
|
||||
"Previous 7 days": "7 הימים הקודמים",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "",
|
||||
"Save": "שמור",
|
||||
"Save & Create": "שמור וצור",
|
||||
"Save & Update": "שמור ועדכן",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "שמירת יומני צ'אט ישירות באחסון הדפדפן שלך אינה נתמכת יותר. אנא הקדש רגע להוריד ולמחוק את יומני הצ'אט שלך על ידי לחיצה על הכפתור למטה. אל דאגה, באפשרותך לייבא מחדש בקלות את יומני הצ'אט שלך לשרת האחורי דרך",
|
||||
"Scan": "סרוק",
|
||||
"Scan complete!": "הסריקה הושלמה!",
|
||||
@@ -559,6 +585,8 @@
|
||||
"Success": "הצלחה",
|
||||
"Successfully updated.": "עדכון הצלחה.",
|
||||
"Suggested": "מומלץ",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "מערכת",
|
||||
"System Prompt": "תגובת מערכת",
|
||||
"Tags": "תגיות",
|
||||
@@ -571,6 +599,7 @@
|
||||
"Text-to-Speech Engine": "מנוע טקסט לדיבור",
|
||||
"Tfs Z": "Tfs Z",
|
||||
"Thanks for your feedback!": "תודה על המשוב שלך!",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "ציון צריך להיות ערך בין 0.0 (0%) ל-1.0 (100%)",
|
||||
"Theme": "נושא",
|
||||
"Thinking...": "",
|
||||
@@ -594,6 +623,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "לקלטת שיחה.",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "היום",
|
||||
@@ -604,7 +634,13 @@
|
||||
"Tool deleted successfully": "",
|
||||
"Tool imported successfully": "",
|
||||
"Tool updated successfully": "",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "קשה לגשת לOllama?",
|
||||
@@ -646,6 +682,7 @@
|
||||
"Version": "גרסה",
|
||||
"Voice": "",
|
||||
"Warning": "אזהרה",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "אזהרה: אם תעדכן או תשנה את מודל ההטבעה שלך, יהיה עליך לייבא מחדש את כל המסמכים.",
|
||||
"Web": "רשת",
|
||||
"Web API": "",
|
||||
@@ -672,6 +709,7 @@
|
||||
"You're a helpful assistant.": "אתה עוזר מועיל.",
|
||||
"You're now logged in.": "כעת אתה מחובר.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "הגדרות Youtube Loader"
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "खाता",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "सटीक जानकारी",
|
||||
"Actions": "",
|
||||
"Active Users": "",
|
||||
"Add": "जोड़ें",
|
||||
"Add a model id": "मॉडल आईडी जोड़ना",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "मेमोरी जोड़ें",
|
||||
"Add message": "संदेश डालें",
|
||||
"Add Model": "मॉडल जोड़ें",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "टैगों को जोड़ें",
|
||||
"Add User": "उपयोगकर्ता जोड़ें",
|
||||
"Adjusting these settings will apply changes universally to all users.": "इन सेटिंग्स को समायोजित करने से परिवर्तन सभी उपयोगकर्ताओं पर सार्वभौमिक रूप से लागू होंगे।",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "चैट हटाएं",
|
||||
"Delete Chat": "चैट हटाएं",
|
||||
"Delete chat?": "",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "",
|
||||
"Delete prompt?": "",
|
||||
"delete this link": "इस लिंक को हटाएं",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "{{name}} हटा दिया गया",
|
||||
"Description": "विवरण",
|
||||
"Didn't fully follow instructions": "निर्देशों का पूरी तरह से पालन नहीं किया",
|
||||
"Disabled": "",
|
||||
"Discover a function": "",
|
||||
"Discover a model": "एक मॉडल की खोज करें",
|
||||
"Discover a prompt": "प्रॉम्प्ट खोजें",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "चैट में 'आप' के स्थान पर उपयोगकर्ता नाम प्रदर्शित करें",
|
||||
"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": "",
|
||||
@@ -195,6 +201,8 @@
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "कोई बाहरी कनेक्शन नहीं बनाता है, और आपका डेटा आपके स्थानीय रूप से होस्ट किए गए सर्वर पर सुरक्षित रूप से रहता है।",
|
||||
"Don't Allow": "अनुमति न दें",
|
||||
"Don't have an account?": "कोई खाता नहीं है?",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "शैली पसंद नहीं है",
|
||||
"Done": "",
|
||||
"Download": "डाउनलोड",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "दस्तावेज़ संपादित करें",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "यूजर को संपादित करो",
|
||||
"ElevenLabs": "",
|
||||
"Email": "ईमेल",
|
||||
"Embedding Batch Size": "",
|
||||
"Embedding Model": "मॉडेल अनुकूलन",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "समुदाय साझाकरण सक्षम करें",
|
||||
"Enable New Sign Ups": "नए साइन अप सक्रिय करें",
|
||||
"Enable Web Search": "वेब खोज सक्षम करें",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "सुनिश्चित करें कि आपकी CSV फ़ाइल में इस क्रम में 4 कॉलम शामिल हैं: नाम, ईमेल, पासवर्ड, भूमिका।",
|
||||
"Enter {{role}} message here": "यहां {{role}} संदेश दर्ज करें",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "सर्पस्टैक एपीआई कुंजी दर्ज करें",
|
||||
"Enter stop sequence": "स्टॉप अनुक्रम दर्ज करें",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "शीर्ष K दर्ज करें",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "यूआरएल दर्ज करें (उदा. http://localhost:11434)",
|
||||
"Enter Your Email": "अपना ईमेल दर्ज करें",
|
||||
"Enter Your Full Name": "अपना पूरा नाम भरें",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "अपना पासवर्ड भरें",
|
||||
"Enter Your Role": "अपनी भूमिका दर्ज करें",
|
||||
"Error": "चूक",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "",
|
||||
"File Mode": "फ़ाइल मोड",
|
||||
"File not found.": "फ़ाइल प्राप्त नहीं हुई।",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "",
|
||||
"Filter is now globally enabled": "",
|
||||
"Filters": "",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "फ्रीक्वेंसी पेनल्टी",
|
||||
"Function created successfully": "",
|
||||
"Function deleted successfully": "",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "",
|
||||
"Functions": "",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "",
|
||||
"General": "सामान्य",
|
||||
"General Settings": "सामान्य सेटिंग्स",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "खोज क्वेरी जनरेट करना",
|
||||
"Generation Info": "जनरेशन की जानकारी",
|
||||
"Get up and running with": "",
|
||||
"Global": "",
|
||||
"Good Response": "अच्छी प्रतिक्रिया",
|
||||
"Google PSE API Key": "Google PSE API कुंजी",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "",
|
||||
"How can I help you today?": "आज मैं आपकी कैसे मदद कर सकता हूँ?",
|
||||
"Hybrid Search": "हाइब्रिड खोज",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "छवि निर्माण (प्रायोगिक)",
|
||||
"Image Generation Engine": "छवि निर्माण इंजन",
|
||||
"Image Settings": "छवि सेटिंग्स",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "कीबोर्ड शॉर्टकट",
|
||||
"Knowledge": "",
|
||||
"Language": "भाषा",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "पिछली बार सक्रिय",
|
||||
"Last Modified": "",
|
||||
"Light": "सुन",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "मॉडल प्रबंधित करें",
|
||||
"Manage Ollama Models": "Ollama मॉडल प्रबंधित करें",
|
||||
"Manage Pipelines": "पाइपलाइनों का प्रबंधन करें",
|
||||
"Manage Valves": "",
|
||||
"March": "मार्च",
|
||||
"Max Tokens (num_predict)": "अधिकतम टोकन (num_predict)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "अधिकतम 3 मॉडल एक साथ डाउनलोड किये जा सकते हैं। कृपया बाद में पुन: प्रयास करें।",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"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": "न्यूनतम स्कोर",
|
||||
"Mirostat": "मिरोस्टा",
|
||||
"Mirostat Eta": "मिरोस्टा ईटा",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "पाइपलाइन वाल्व",
|
||||
"Plain text (.txt)": "सादा पाठ (.txt)",
|
||||
"Playground": "कार्यक्षेत्र",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "सकारात्मक रवैया",
|
||||
"Previous 30 days": "पिछले 30 दिन",
|
||||
"Previous 7 days": "पिछले 7 दिन",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "रोसे पिन",
|
||||
"Rosé Pine Dawn": "रोसे पिन डेन",
|
||||
"RTL": "RTL",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "",
|
||||
"Save": "सहेजें",
|
||||
"Save & Create": "सहेजें और बनाएं",
|
||||
"Save & Update": "सहेजें और अपडेट करें",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "चैट लॉग को सीधे आपके ब्राउज़र के स्टोरेज में सहेजना अब समर्थित नहीं है। कृपया नीचे दिए गए बटन पर क्लिक करके डाउनलोड करने और अपने चैट लॉग को हटाने के लिए कुछ समय दें। चिंता न करें, आप आसानी से अपने चैट लॉग को बैकएंड पर पुनः आयात कर सकते हैं",
|
||||
"Scan": "स्कैन",
|
||||
"Scan complete!": "स्कैन पूरा हुआ!",
|
||||
@@ -558,6 +584,8 @@
|
||||
"Success": "संपन्न",
|
||||
"Successfully updated.": "सफलतापूर्वक उत्परिवर्तित।",
|
||||
"Suggested": "सुझावी",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "सिस्टम",
|
||||
"System Prompt": "सिस्टम प्रॉम्प्ट",
|
||||
"Tags": "टैग",
|
||||
@@ -570,6 +598,7 @@
|
||||
"Text-to-Speech Engine": "टेक्स्ट-टू-स्पीच इंजन",
|
||||
"Tfs Z": "टफ्स Z",
|
||||
"Thanks for your feedback!": "आपकी प्रतिक्रिया के लिए धन्यवाद!",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "स्कोर का मान 0.0 (0%) और 1.0 (100%) के बीच होना चाहिए।",
|
||||
"Theme": "थीम",
|
||||
"Thinking...": "",
|
||||
@@ -593,6 +622,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "इनपुट चैट करने के लिए.",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "आज",
|
||||
@@ -603,7 +633,13 @@
|
||||
"Tool deleted successfully": "",
|
||||
"Tool imported successfully": "",
|
||||
"Tool updated successfully": "",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "शीर्ष K",
|
||||
"Top P": "शीर्ष P",
|
||||
"Trouble accessing Ollama?": "Ollama तक पहुँचने में परेशानी हो रही है?",
|
||||
@@ -645,6 +681,7 @@
|
||||
"Version": "संस्करण",
|
||||
"Voice": "",
|
||||
"Warning": "चेतावनी",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "चेतावनी: यदि आप अपने एम्बेडिंग मॉडल को अपडेट या बदलते हैं, तो आपको सभी दस्तावेज़ों को फिर से आयात करने की आवश्यकता होगी।",
|
||||
"Web": "वेब",
|
||||
"Web API": "",
|
||||
@@ -671,6 +708,7 @@
|
||||
"You're a helpful assistant.": "आप एक सहायक सहायक हैं",
|
||||
"You're now logged in.": "अब आप लॉग इन हो गए हैं",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "यूट्यूब लोडर सेटिंग्स"
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "Račun",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Točne informacije",
|
||||
"Actions": "",
|
||||
"Active Users": "Aktivni korisnici",
|
||||
"Add": "Dodaj",
|
||||
"Add a model id": "Dodavanje ID-a modela",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "Dodaj memoriju",
|
||||
"Add message": "Dodaj poruku",
|
||||
"Add Model": "Dodaj model",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "Dodaj oznake",
|
||||
"Add User": "Dodaj korisnika",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Podešavanje će se primijeniti univerzalno na sve korisnike.",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "Izbriši razgovor",
|
||||
"Delete Chat": "Izbriši razgovor",
|
||||
"Delete chat?": "",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "",
|
||||
"Delete prompt?": "",
|
||||
"delete this link": "izbriši ovu vezu",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "Izbrisano {{name}}",
|
||||
"Description": "Opis",
|
||||
"Didn't fully follow instructions": "Nije u potpunosti slijedio upute",
|
||||
"Disabled": "",
|
||||
"Discover a function": "",
|
||||
"Discover a model": "Otkrijte model",
|
||||
"Discover a prompt": "Otkrijte prompt",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "Odbaciti",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Prikaži korisničko ime umjesto Vas u razgovoru",
|
||||
"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",
|
||||
@@ -195,6 +201,8 @@
|
||||
"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.",
|
||||
"Don't Allow": "Ne dopuštaj",
|
||||
"Don't have an account?": "Nemate račun?",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "Ne sviđa mi se stil",
|
||||
"Done": "",
|
||||
"Download": "Preuzimanje",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "Uredi dokument",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Uredi korisnika",
|
||||
"ElevenLabs": "",
|
||||
"Email": "Email",
|
||||
"Embedding Batch Size": "Embedding - Veličina batch-a",
|
||||
"Embedding Model": "Embedding model",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "Omogući zajedničko korištenje zajednice",
|
||||
"Enable New Sign Ups": "Omogući nove prijave",
|
||||
"Enable Web Search": "Omogući pretraživanje weba",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Provjerite da vaša CSV datoteka uključuje 4 stupca u ovom redoslijedu: Name, Email, Password, Role.",
|
||||
"Enter {{role}} message here": "Unesite {{role}} poruku ovdje",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "Unesite Serply API ključ",
|
||||
"Enter Serpstack API Key": "Unesite Serpstack API ključ",
|
||||
"Enter stop sequence": "Unesite sekvencu zaustavljanja",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "Unesite Top K",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "Unesite URL (npr. http://localhost:11434)",
|
||||
"Enter Your Email": "Unesite svoj email",
|
||||
"Enter Your Full Name": "Unesite svoje puno ime",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "Unesite svoju lozinku",
|
||||
"Enter Your Role": "Unesite svoju ulogu",
|
||||
"Error": "Greška",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "",
|
||||
"File Mode": "Način datoteke",
|
||||
"File not found.": "Datoteka nije pronađena.",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "",
|
||||
"Filter is now globally enabled": "",
|
||||
"Filters": "",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "Kazna za učestalost",
|
||||
"Function created successfully": "",
|
||||
"Function deleted successfully": "",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "",
|
||||
"Functions": "",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "",
|
||||
"General": "Općenito",
|
||||
"General Settings": "Opće postavke",
|
||||
"Generate Image": "Gneriraj sliku",
|
||||
"Generating search query": "Generiranje upita za pretraživanje",
|
||||
"Generation Info": "Informacije o generaciji",
|
||||
"Get up and running with": "",
|
||||
"Global": "",
|
||||
"Good Response": "Dobar odgovor",
|
||||
"Google PSE API Key": "Google PSE API ključ",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "",
|
||||
"How can I help you today?": "Kako vam mogu pomoći danas?",
|
||||
"Hybrid Search": "Hibridna pretraga",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "Generiranje slika (eksperimentalno)",
|
||||
"Image Generation Engine": "Stroj za generiranje slika",
|
||||
"Image Settings": "Postavke slike",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "Tipkovnički prečaci",
|
||||
"Knowledge": "Znanje",
|
||||
"Language": "Jezik",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "Zadnja aktivnost",
|
||||
"Last Modified": "",
|
||||
"Light": "Svijetlo",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "Upravljanje modelima",
|
||||
"Manage Ollama Models": "Upravljanje Ollama modelima",
|
||||
"Manage Pipelines": "Upravljanje cjevovodima",
|
||||
"Manage Valves": "",
|
||||
"March": "Ožujak",
|
||||
"Max Tokens (num_predict)": "Maksimalan broj tokena (num_predict)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksimalno 3 modela se mogu preuzeti istovremeno. Pokušajte ponovo kasnije.",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"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",
|
||||
"Mirostat": "Mirostat",
|
||||
"Mirostat Eta": "Mirostat Eta",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "Ventili za cjevovode",
|
||||
"Plain text (.txt)": "Običan tekst (.txt)",
|
||||
"Playground": "Igralište",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "Pozitivan stav",
|
||||
"Previous 30 days": "Prethodnih 30 dana",
|
||||
"Previous 7 days": "Prethodnih 7 dana",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "Pokrenuto",
|
||||
"Save": "Spremi",
|
||||
"Save & Create": "Spremi i stvori",
|
||||
"Save & Update": "Spremi i ažuriraj",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Spremanje zapisnika razgovora izravno u pohranu vašeg preglednika više nije podržano. Molimo vas da odvojite trenutak za preuzimanje i brisanje zapisnika razgovora klikom na gumb ispod. Ne brinite, možete lako ponovno uvesti zapisnike razgovora u backend putem",
|
||||
"Scan": "Skeniraj",
|
||||
"Scan complete!": "Skeniranje dovršeno!",
|
||||
@@ -559,6 +585,8 @@
|
||||
"Success": "Uspjeh",
|
||||
"Successfully updated.": "Uspješno ažurirano.",
|
||||
"Suggested": "Predloženo",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "Sustav",
|
||||
"System Prompt": "Sistemski prompt",
|
||||
"Tags": "Oznake",
|
||||
@@ -571,6 +599,7 @@
|
||||
"Text-to-Speech Engine": "Stroj za pretvorbu teksta u govor",
|
||||
"Tfs Z": "Tfs Z",
|
||||
"Thanks for your feedback!": "Hvala na povratnim informacijama!",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Ocjena treba biti vrijednost između 0,0 (0%) i 1,0 (100%).",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "Razmišljam",
|
||||
@@ -594,6 +623,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Za pristup WebUI-u obratite se administratoru. Administratori mogu upravljati statusima korisnika s Admin panela.",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "Da biste ovdje dodali dokumente, prvo ih prenesite u radni prostor \"Dokumenti\".",
|
||||
"to chat input.": "u unos razgovora.",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Danas",
|
||||
@@ -604,7 +634,13 @@
|
||||
"Tool deleted successfully": "",
|
||||
"Tool imported successfully": "",
|
||||
"Tool updated successfully": "",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "Alati",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problemi s pristupom Ollama?",
|
||||
@@ -646,6 +682,7 @@
|
||||
"Version": "Verzija",
|
||||
"Voice": "",
|
||||
"Warning": "Upozorenje",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Upozorenje: Ako ažurirate ili promijenite svoj model za umetanje, morat ćete ponovno uvesti sve dokumente.",
|
||||
"Web": "Web",
|
||||
"Web API": "Web API",
|
||||
@@ -672,6 +709,7 @@
|
||||
"You're a helpful assistant.": "Vi ste korisni asistent.",
|
||||
"You're now logged in.": "Sada ste prijavljeni.",
|
||||
"Your account status is currently pending activation.": "Status vašeg računa trenutno čeka aktivaciju.",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "YouTube",
|
||||
"Youtube Loader Settings": "YouTube postavke učitavanja"
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "Akun",
|
||||
"Account Activation Pending": "Aktivasi Akun Tertunda",
|
||||
"Accurate information": "Informasi yang akurat",
|
||||
"Actions": "",
|
||||
"Active Users": "Pengguna Aktif",
|
||||
"Add": "Tambah",
|
||||
"Add a model id": "Tambahkan id model",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "Menambahkan Memori",
|
||||
"Add message": "Tambahkan pesan",
|
||||
"Add Model": "Tambahkan Model",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "Tambahkan Tag",
|
||||
"Add User": "Tambah Pengguna",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Menyesuaikan pengaturan ini akan menerapkan perubahan secara universal ke semua pengguna.",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "Menghapus obrolan",
|
||||
"Delete Chat": "Menghapus Obrolan",
|
||||
"Delete chat?": "Menghapus obrolan?",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "Fungsi hapus?",
|
||||
"Delete prompt?": "Perintah hapus?",
|
||||
"delete this link": "hapus tautan ini",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "Menghapus {{name}}",
|
||||
"Description": "Deskripsi",
|
||||
"Didn't fully follow instructions": "Tidak sepenuhnya mengikuti instruksi",
|
||||
"Disabled": "",
|
||||
"Discover a function": "Menemukan sebuah fungsi",
|
||||
"Discover a model": "Menemukan sebuah model",
|
||||
"Discover a prompt": "Temukan petunjuk",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "Tidak dapat digunakan",
|
||||
"Display Emoji in Call": "Menampilkan Emoji dalam Panggilan",
|
||||
"Display the username instead of You in the Chat": "Menampilkan nama pengguna, bukan Anda di Obrolan",
|
||||
"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",
|
||||
@@ -195,6 +201,8 @@
|
||||
"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.",
|
||||
"Don't Allow": "Jangan Izinkan",
|
||||
"Don't have an account?": "Tidak memiliki akun?",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "Tidak suka gayanya",
|
||||
"Done": "Selesai",
|
||||
"Download": "Unduh",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "Edit Dokumen",
|
||||
"Edit Memory": "Edit Memori",
|
||||
"Edit User": "Edit Pengguna",
|
||||
"ElevenLabs": "",
|
||||
"Email": "Email",
|
||||
"Embedding Batch Size": "Menyematkan Ukuran Batch",
|
||||
"Embedding Model": "Model Penyematan",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "Aktifkan Berbagi Komunitas",
|
||||
"Enable New Sign Ups": "Aktifkan Pendaftaran Baru",
|
||||
"Enable Web Search": "Aktifkan Pencarian Web",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Pastikan file CSV Anda menyertakan 4 kolom dengan urutan sebagai berikut: Nama, Email, Kata Sandi, Peran.",
|
||||
"Enter {{role}} message here": "Masukkan pesan {{role}} di sini",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "Masukkan Kunci API Serply",
|
||||
"Enter Serpstack API Key": "Masukkan Kunci API Serpstack",
|
||||
"Enter stop sequence": "Masukkan urutan berhenti",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "Masukkan Kunci API Tavily",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "Masukkan Top K",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "Masukkan URL (mis. http://localhost:11434)",
|
||||
"Enter Your Email": "Masukkan Email Anda",
|
||||
"Enter Your Full Name": "Masukkan Nama Lengkap Anda",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "Masukkan Kata Sandi Anda",
|
||||
"Enter Your Role": "Masukkan Peran Anda",
|
||||
"Error": "Kesalahan",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "Berkas",
|
||||
"File Mode": "Mode File",
|
||||
"File not found.": "File tidak ditemukan.",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "Filter sekarang dinonaktifkan secara global",
|
||||
"Filter is now globally enabled": "Filter sekarang diaktifkan secara global",
|
||||
"Filters": "Filter",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "Penalti Frekuensi",
|
||||
"Function created successfully": "Fungsi berhasil dibuat",
|
||||
"Function deleted successfully": "Fungsi berhasil dihapus",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "Fungsi berhasil diperbarui",
|
||||
"Functions": "Fungsi",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "Fungsi berhasil diimpor",
|
||||
"General": "Umum",
|
||||
"General Settings": "Pengaturan Umum",
|
||||
"Generate Image": "Menghasilkan Gambar",
|
||||
"Generating search query": "Membuat kueri penelusuran",
|
||||
"Generation Info": "Info Pembuatan",
|
||||
"Get up and running with": "",
|
||||
"Global": "Global",
|
||||
"Good Response": "Respons yang Baik",
|
||||
"Google PSE API Key": "Kunci API Google PSE",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "Sembunyikan Model",
|
||||
"How can I help you today?": "Ada yang bisa saya bantu hari ini?",
|
||||
"Hybrid Search": "Pencarian Hibrida",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "Pembuatan Gambar (Eksperimental)",
|
||||
"Image Generation Engine": "Mesin Pembuat Gambar",
|
||||
"Image Settings": "Pengaturan Gambar",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "Pintasan keyboard",
|
||||
"Knowledge": "Pengetahuan",
|
||||
"Language": "Bahasa",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "Terakhir Aktif",
|
||||
"Last Modified": "Terakhir Dimodifikasi",
|
||||
"Light": "Cahaya",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "Kelola Model",
|
||||
"Manage Ollama Models": "Mengelola Model Ollama",
|
||||
"Manage Pipelines": "Mengelola Saluran Pipa",
|
||||
"Manage Valves": "Kelola Katup",
|
||||
"March": "Maret",
|
||||
"Max Tokens (num_predict)": "Token Maksimal (num_prediksi)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksimal 3 model dapat diunduh secara bersamaan. Silakan coba lagi nanti.",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "Memori berhasil dihapus",
|
||||
"Memory updated successfully": "Memori berhasil diperbarui",
|
||||
"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",
|
||||
"Mirostat": "Mirostat",
|
||||
"Mirostat Eta": "Mirostat Eta",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "Katup Saluran Pipa",
|
||||
"Plain text (.txt)": "Teks biasa (.txt)",
|
||||
"Playground": "Taman bermain",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "Sikap positif",
|
||||
"Previous 30 days": "30 hari sebelumnya",
|
||||
"Previous 7 days": "7 hari sebelumnya",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "Pinus Rosé",
|
||||
"Rosé Pine Dawn": "Rosé Pine Fajar",
|
||||
"RTL": "RTL",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "Berjalan",
|
||||
"Save": "Simpan",
|
||||
"Save & Create": "Simpan & Buat",
|
||||
"Save & Update": "Simpan & Perbarui",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Menyimpan log obrolan secara langsung ke penyimpanan browser Anda tidak lagi didukung. Mohon luangkan waktu sejenak untuk mengunduh dan menghapus log obrolan Anda dengan mengeklik tombol di bawah ini. Jangan khawatir, Anda dapat dengan mudah mengimpor kembali log obrolan Anda ke backend melalui",
|
||||
"Scan": "Pindai",
|
||||
"Scan complete!": "Pindai selesai!",
|
||||
@@ -558,6 +584,8 @@
|
||||
"Success": "Berhasil",
|
||||
"Successfully updated.": "Berhasil diperbarui.",
|
||||
"Suggested": "Disarankan",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "Sistem",
|
||||
"System Prompt": "Permintaan Sistem",
|
||||
"Tags": "Tag",
|
||||
@@ -570,6 +598,7 @@
|
||||
"Text-to-Speech Engine": "Mesin Teks-ke-Suara",
|
||||
"Tfs Z": "Tfs Z",
|
||||
"Thanks for your feedback!": "Terima kasih atas umpan balik Anda!",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Nilai yang diberikan haruslah nilai antara 0,0 (0%) dan 1,0 (100%).",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "Berpikir",
|
||||
@@ -593,6 +622,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Untuk mengakses WebUI, hubungi administrator. Admin dapat mengelola status pengguna dari Panel Admin.",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "Untuk menambahkan dokumen di sini, unggah dokumen ke ruang kerja \"Dokumen\" terlebih dahulu.",
|
||||
"to chat input.": "Untuk memasukkan input obrolan.",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "Untuk memilih filter di sini, tambahkan filter ke ruang kerja \"Fungsi\" terlebih dahulu.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "Untuk memilih perangkat di sini, tambahkan ke ruang kerja \"Alat\" terlebih dahulu.",
|
||||
"Today": "Hari ini",
|
||||
@@ -603,7 +633,13 @@
|
||||
"Tool deleted successfully": "Alat berhasil dihapus",
|
||||
"Tool imported successfully": "Alat berhasil diimpor",
|
||||
"Tool updated successfully": "Alat berhasil diperbarui",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "Alat",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "K atas",
|
||||
"Top P": "P Atas",
|
||||
"Trouble accessing Ollama?": "Kesulitan mengakses Ollama?",
|
||||
@@ -645,6 +681,7 @@
|
||||
"Version": "Versi",
|
||||
"Voice": "Suara",
|
||||
"Warning": "Peringatan",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Peringatan: Jika Anda memperbarui atau mengubah model penyematan, Anda harus mengimpor ulang semua dokumen.",
|
||||
"Web": "Web",
|
||||
"Web API": "API Web",
|
||||
@@ -671,6 +708,7 @@
|
||||
"You're a helpful assistant.": "Anda adalah asisten yang membantu.",
|
||||
"You're now logged in.": "Anda sekarang sudah masuk.",
|
||||
"Your account status is currently pending activation.": "Status akun Anda saat ini sedang menunggu aktivasi.",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Pengaturan Pemuat Youtube"
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "Account",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Informazioni accurate",
|
||||
"Actions": "",
|
||||
"Active Users": "",
|
||||
"Add": "Aggiungi",
|
||||
"Add a model id": "Aggiungere un ID modello",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "Aggiungi memoria",
|
||||
"Add message": "Aggiungi messaggio",
|
||||
"Add Model": "Aggiungi modello",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "Aggiungi tag",
|
||||
"Add User": "Aggiungi utente",
|
||||
"Adjusting these settings will apply changes universally to all users.": "La modifica di queste impostazioni applicherà le modifiche universalmente a tutti gli utenti.",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "Elimina chat",
|
||||
"Delete Chat": "Elimina chat",
|
||||
"Delete chat?": "",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "",
|
||||
"Delete prompt?": "",
|
||||
"delete this link": "elimina questo link",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "Eliminato {{name}}",
|
||||
"Description": "Descrizione",
|
||||
"Didn't fully follow instructions": "Non ha seguito completamente le istruzioni",
|
||||
"Disabled": "",
|
||||
"Discover a function": "",
|
||||
"Discover a model": "Scopri un modello",
|
||||
"Discover a prompt": "Scopri un prompt",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Visualizza il nome utente invece di Tu nella chat",
|
||||
"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": "",
|
||||
@@ -195,6 +201,8 @@
|
||||
"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.",
|
||||
"Don't Allow": "Non consentire",
|
||||
"Don't have an account?": "Non hai un account?",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "Non ti piace lo stile",
|
||||
"Done": "",
|
||||
"Download": "Scarica",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "Modifica documento",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Modifica utente",
|
||||
"ElevenLabs": "",
|
||||
"Email": "Email",
|
||||
"Embedding Batch Size": "",
|
||||
"Embedding Model": "Modello di embedding",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "Abilita la condivisione della community",
|
||||
"Enable New Sign Ups": "Abilita nuove iscrizioni",
|
||||
"Enable Web Search": "Abilita ricerca Web",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assicurati che il tuo file CSV includa 4 colonne in questo ordine: Nome, Email, Password, Ruolo.",
|
||||
"Enter {{role}} message here": "Inserisci il messaggio per {{role}} qui",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Inserisci la chiave API Serpstack",
|
||||
"Enter stop sequence": "Inserisci la sequenza di arresto",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "Inserisci Top K",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "Inserisci URL (ad esempio http://localhost:11434)",
|
||||
"Enter Your Email": "Inserisci la tua email",
|
||||
"Enter Your Full Name": "Inserisci il tuo nome completo",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "Inserisci la tua password",
|
||||
"Enter Your Role": "Inserisci il tuo ruolo",
|
||||
"Error": "Errore",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "",
|
||||
"File Mode": "Modalità file",
|
||||
"File not found.": "File non trovato.",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "",
|
||||
"Filter is now globally enabled": "",
|
||||
"Filters": "",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "Penalità di frequenza",
|
||||
"Function created successfully": "",
|
||||
"Function deleted successfully": "",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "",
|
||||
"Functions": "",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "",
|
||||
"General": "Generale",
|
||||
"General Settings": "Impostazioni generali",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "Generazione di query di ricerca",
|
||||
"Generation Info": "Informazioni generazione",
|
||||
"Get up and running with": "",
|
||||
"Global": "",
|
||||
"Good Response": "Buona risposta",
|
||||
"Google PSE API Key": "Chiave API PSE di Google",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "",
|
||||
"How can I help you today?": "Come posso aiutarti oggi?",
|
||||
"Hybrid Search": "Ricerca ibrida",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "Generazione di immagini (sperimentale)",
|
||||
"Image Generation Engine": "Motore di generazione immagini",
|
||||
"Image Settings": "Impostazioni immagine",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "Scorciatoie da tastiera",
|
||||
"Knowledge": "",
|
||||
"Language": "Lingua",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "Ultima attività",
|
||||
"Last Modified": "",
|
||||
"Light": "Chiaro",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "Gestisci modelli",
|
||||
"Manage Ollama Models": "Gestisci modelli Ollama",
|
||||
"Manage Pipelines": "Gestire le pipeline",
|
||||
"Manage Valves": "",
|
||||
"March": "Marzo",
|
||||
"Max Tokens (num_predict)": "Numero massimo di gettoni (num_predict)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "È possibile scaricare un massimo di 3 modelli contemporaneamente. Riprova più tardi.",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"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",
|
||||
"Mirostat": "Mirostat",
|
||||
"Mirostat Eta": "Mirostat Eta",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "Valvole per tubazioni",
|
||||
"Plain text (.txt)": "Testo normale (.txt)",
|
||||
"Playground": "Terreno di gioco",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "Attitudine positiva",
|
||||
"Previous 30 days": "Ultimi 30 giorni",
|
||||
"Previous 7 days": "Ultimi 7 giorni",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "",
|
||||
"Save": "Salva",
|
||||
"Save & Create": "Salva e crea",
|
||||
"Save & Update": "Salva e aggiorna",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Il salvataggio dei registri della chat direttamente nell'archivio del browser non è più supportato. Si prega di dedicare un momento per scaricare ed eliminare i registri della chat facendo clic sul pulsante in basso. Non preoccuparti, puoi facilmente reimportare i registri della chat nel backend tramite",
|
||||
"Scan": "Scansione",
|
||||
"Scan complete!": "Scansione completata!",
|
||||
@@ -559,6 +585,8 @@
|
||||
"Success": "Successo",
|
||||
"Successfully updated.": "Aggiornato con successo.",
|
||||
"Suggested": "Suggerito",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "Sistema",
|
||||
"System Prompt": "Prompt di sistema",
|
||||
"Tags": "Tag",
|
||||
@@ -571,6 +599,7 @@
|
||||
"Text-to-Speech Engine": "Motore da testo a voce",
|
||||
"Tfs Z": "Tfs Z",
|
||||
"Thanks for your feedback!": "Grazie per il tuo feedback!",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Il punteggio dovrebbe essere un valore compreso tra 0.0 (0%) e 1.0 (100%).",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "",
|
||||
@@ -594,6 +623,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "all'input della chat.",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Oggi",
|
||||
@@ -604,7 +634,13 @@
|
||||
"Tool deleted successfully": "",
|
||||
"Tool imported successfully": "",
|
||||
"Tool updated successfully": "",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problemi di accesso a Ollama?",
|
||||
@@ -646,6 +682,7 @@
|
||||
"Version": "Versione",
|
||||
"Voice": "",
|
||||
"Warning": "Avvertimento",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Attenzione: se aggiorni o cambi il tuo modello di embedding, dovrai reimportare tutti i documenti.",
|
||||
"Web": "Web",
|
||||
"Web API": "",
|
||||
@@ -672,6 +709,7 @@
|
||||
"You're a helpful assistant.": "Sei un assistente utile.",
|
||||
"You're now logged in.": "Ora hai effettuato l'accesso.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Impostazioni del caricatore Youtube"
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "アカウント",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "情報の正確性",
|
||||
"Actions": "",
|
||||
"Active Users": "",
|
||||
"Add": "追加",
|
||||
"Add a model id": "モデル ID を追加する",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "メモリを追加",
|
||||
"Add message": "メッセージを追加",
|
||||
"Add Model": "モデルを追加",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "タグを追加",
|
||||
"Add User": "ユーザーを追加",
|
||||
"Adjusting these settings will apply changes universally to all users.": "これらの設定を調整すると、すべてのユーザーに普遍的に変更が適用されます。",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "チャットを削除",
|
||||
"Delete Chat": "チャットを削除",
|
||||
"Delete chat?": "",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "",
|
||||
"Delete prompt?": "",
|
||||
"delete this link": "このリンクを削除します",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "{{name}}を削除しました",
|
||||
"Description": "説明",
|
||||
"Didn't fully follow instructions": "説明に沿って操作していませんでした",
|
||||
"Disabled": "",
|
||||
"Discover a function": "",
|
||||
"Discover a model": "モデルを検出する",
|
||||
"Discover a prompt": "プロンプトを見つける",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "チャットで「あなた」の代わりにユーザー名を表示",
|
||||
"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": "",
|
||||
@@ -195,6 +201,8 @@
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "外部接続を行わず、データはローカルでホストされているサーバー上に安全に保持されます。",
|
||||
"Don't Allow": "許可しない",
|
||||
"Don't have an account?": "アカウントをお持ちではありませんか?",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "デザインが好きでない",
|
||||
"Done": "",
|
||||
"Download": "ダウンロードをキャンセルしました",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "ドキュメントを編集",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "ユーザーを編集",
|
||||
"ElevenLabs": "",
|
||||
"Email": "メールアドレス",
|
||||
"Embedding Batch Size": "",
|
||||
"Embedding Model": "埋め込みモデル",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "コミュニティ共有の有効化",
|
||||
"Enable New Sign Ups": "新規登録を有効化",
|
||||
"Enable Web Search": "Web 検索を有効にする",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "CSVファイルに4つの列が含まれていることを確認してください: Name, Email, Password, Role.",
|
||||
"Enter {{role}} message here": "{{role}} メッセージをここに入力してください",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Serpstack APIキーの入力",
|
||||
"Enter stop sequence": "ストップシーケンスを入力してください",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "トップ K を入力してください",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "URL を入力してください (例: http://localhost:11434)",
|
||||
"Enter Your Email": "メールアドレスを入力してください",
|
||||
"Enter Your Full Name": "フルネームを入力してください",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "パスワードを入力してください",
|
||||
"Enter Your Role": "ロールを入力してください",
|
||||
"Error": "エラー",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "",
|
||||
"File Mode": "ファイルモード",
|
||||
"File not found.": "ファイルが見つかりません。",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "",
|
||||
"Filter is now globally enabled": "",
|
||||
"Filters": "",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "周波数ペナルティ",
|
||||
"Function created successfully": "",
|
||||
"Function deleted successfully": "",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "",
|
||||
"Functions": "",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "",
|
||||
"General": "一般",
|
||||
"General Settings": "一般設定",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "検索クエリの生成",
|
||||
"Generation Info": "生成情報",
|
||||
"Get up and running with": "",
|
||||
"Global": "",
|
||||
"Good Response": "良い応答",
|
||||
"Google PSE API Key": "Google PSE APIキー",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "",
|
||||
"How can I help you today?": "今日はどのようにお手伝いしましょうか?",
|
||||
"Hybrid Search": "ブリッジ検索",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "画像生成 (実験的)",
|
||||
"Image Generation Engine": "画像生成エンジン",
|
||||
"Image Settings": "画像設定",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "キーボードショートカット",
|
||||
"Knowledge": "",
|
||||
"Language": "言語",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "最終アクティブ",
|
||||
"Last Modified": "",
|
||||
"Light": "ライト",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "モデルを管理",
|
||||
"Manage Ollama Models": "Ollama モデルを管理",
|
||||
"Manage Pipelines": "パイプラインの管理",
|
||||
"Manage Valves": "",
|
||||
"March": "3月",
|
||||
"Max Tokens (num_predict)": "最大トークン数 (num_predict)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "同時にダウンロードできるモデルは最大 3 つです。後でもう一度お試しください。",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"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": "最低スコア",
|
||||
"Mirostat": "ミロスタット",
|
||||
"Mirostat Eta": "ミロスタット Eta",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "パイプラインバルブ",
|
||||
"Plain text (.txt)": "プレーンテキスト (.txt)",
|
||||
"Playground": "プレイグラウンド",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "陽気な態度",
|
||||
"Previous 30 days": "前の30日間",
|
||||
"Previous 7 days": "前の7日間",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "",
|
||||
"Save": "保存",
|
||||
"Save & Create": "保存して作成",
|
||||
"Save & Update": "保存して更新",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "チャットログをブラウザのストレージに直接保存する機能はサポートされなくなりました。下のボタンをクリックして、チャットログをダウンロードして削除してください。ご心配なく。チャットログは、次の方法でバックエンドに簡単に再インポートできます。",
|
||||
"Scan": "スキャン",
|
||||
"Scan complete!": "スキャン完了!",
|
||||
@@ -557,6 +583,8 @@
|
||||
"Success": "成功",
|
||||
"Successfully updated.": "正常に更新されました。",
|
||||
"Suggested": "提案",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "システム",
|
||||
"System Prompt": "システムプロンプト",
|
||||
"Tags": "タグ",
|
||||
@@ -569,6 +597,7 @@
|
||||
"Text-to-Speech Engine": "テキスト音声変換エンジン",
|
||||
"Tfs Z": "Tfs Z",
|
||||
"Thanks for your feedback!": "ご意見ありがとうございます!",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "スコアは0.0(0%)から1.0(100%)の間の値にしてください。",
|
||||
"Theme": "テーマ",
|
||||
"Thinking...": "",
|
||||
@@ -592,6 +621,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "チャット入力へ。",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "今日",
|
||||
@@ -602,7 +632,13 @@
|
||||
"Tool deleted successfully": "",
|
||||
"Tool imported successfully": "",
|
||||
"Tool updated successfully": "",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "トップ K",
|
||||
"Top P": "トップ P",
|
||||
"Trouble accessing Ollama?": "Ollama へのアクセスに問題がありますか?",
|
||||
@@ -644,6 +680,7 @@
|
||||
"Version": "バージョン",
|
||||
"Voice": "",
|
||||
"Warning": "警告",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "警告: 埋め込みモデルを更新または変更した場合は、すべてのドキュメントを再インポートする必要があります。",
|
||||
"Web": "ウェブ",
|
||||
"Web API": "",
|
||||
@@ -670,6 +707,7 @@
|
||||
"You're a helpful assistant.": "あなたは役に立つアシスタントです。",
|
||||
"You're now logged in.": "ログインしました。",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "YouTube",
|
||||
"Youtube Loader Settings": "Youtubeローダー設定"
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "ანგარიში",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "დიდი ინფორმაცია",
|
||||
"Actions": "",
|
||||
"Active Users": "",
|
||||
"Add": "დამატება",
|
||||
"Add a model id": "დაამატეთ მოდელის ID",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "მემორიის დამატება",
|
||||
"Add message": "შეტყობინების დამატება",
|
||||
"Add Model": "მოდელის დამატება",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "ტეგების დამატება",
|
||||
"Add User": "მომხმარებლის დამატება",
|
||||
"Adjusting these settings will apply changes universally to all users.": "ამ პარამეტრების რეგულირება ცვლილებებს უნივერსალურად გამოიყენებს ყველა მომხმარებლისთვის",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "შეტყობინების წაშლა",
|
||||
"Delete Chat": "შეტყობინების წაშლა",
|
||||
"Delete chat?": "",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "",
|
||||
"Delete prompt?": "",
|
||||
"delete this link": "ბმულის წაშლა",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "Deleted {{name}}",
|
||||
"Description": "აღწერა",
|
||||
"Didn't fully follow instructions": "ვერ ყველა ინფორმაციისთვის ვერ ხელახლა ჩაწერე",
|
||||
"Disabled": "",
|
||||
"Discover a function": "",
|
||||
"Discover a model": "გაიგეთ მოდელი",
|
||||
"Discover a prompt": "აღმოაჩინეთ მოთხოვნა",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "ჩატში აჩვენე მომხმარებლის სახელი თქვენს ნაცვლად",
|
||||
"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": "",
|
||||
@@ -195,6 +201,8 @@
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "არ ამყარებს გარე კავშირებს და თქვენი მონაცემები უსაფრთხოდ რჩება თქვენს ადგილობრივ სერვერზე.",
|
||||
"Don't Allow": "არ დაუშვა",
|
||||
"Don't have an account?": "არ გაქვს ანგარიში?",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "არ ეთიკურია ფართოდ",
|
||||
"Done": "",
|
||||
"Download": "ჩამოტვირთვა გაუქმებულია",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "დოკუმენტის ედიტირება",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "მომხმარებლის ედიტირება",
|
||||
"ElevenLabs": "",
|
||||
"Email": "ელ-ფოსტა",
|
||||
"Embedding Batch Size": "",
|
||||
"Embedding Model": "ჩასმის ძირითადი პროგრამა",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "საზოგადოების გაზიარების ჩართვა",
|
||||
"Enable New Sign Ups": "ახალი რეგისტრაციების ჩართვა",
|
||||
"Enable Web Search": "ვებ ძიების ჩართვა",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "გთხოვთ, უზრუნველყოთ, რომთქვევის CSV-ფაილი შეიცავს 4 ველი, ჩაწერილი ორივე ველი უდრის პირველი ველით.",
|
||||
"Enter {{role}} message here": "შეიყვანე {{role}} შეტყობინება აქ",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "შეიყვანეთ Serpstack API Key",
|
||||
"Enter stop sequence": "შეიყვანეთ ტოპ თანმიმდევრობა",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "შეიყვანეთ Top K",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "შეიყვანეთ მისამართი (მაგალითად http://localhost:11434)",
|
||||
"Enter Your Email": "შეიყვანეთ თქვენი ელ-ფოსტა",
|
||||
"Enter Your Full Name": "შეიყვანეთ თქვენი სრული სახელი",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "შეიყვანეთ თქვენი პაროლი",
|
||||
"Enter Your Role": "შეიყვანეთ თქვენი როლი",
|
||||
"Error": "შეცდომა",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "",
|
||||
"File Mode": "ფაილური რეჟიმი",
|
||||
"File not found.": "ფაილი ვერ მოიძებნა",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "",
|
||||
"Filter is now globally enabled": "",
|
||||
"Filters": "",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "სიხშირის ჯარიმა",
|
||||
"Function created successfully": "",
|
||||
"Function deleted successfully": "",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "",
|
||||
"Functions": "",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "",
|
||||
"General": "ზოგადი",
|
||||
"General Settings": "ზოგადი პარამეტრები",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "საძიებო მოთხოვნის გენერირება",
|
||||
"Generation Info": "გენერაციის ინფორმაცია",
|
||||
"Get up and running with": "",
|
||||
"Global": "",
|
||||
"Good Response": "დიდი პასუხი",
|
||||
"Google PSE API Key": "Google PSE API გასაღები",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "",
|
||||
"How can I help you today?": "როგორ შემიძლია დაგეხმარო დღეს?",
|
||||
"Hybrid Search": "ჰიბრიდური ძებნა",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "სურათების გენერაცია (ექსპერიმენტული)",
|
||||
"Image Generation Engine": "სურათის გენერაციის ძრავა",
|
||||
"Image Settings": "სურათის პარამეტრები",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "კლავიატურის მალსახმობები",
|
||||
"Knowledge": "",
|
||||
"Language": "ენა",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "ბოლო აქტიური",
|
||||
"Last Modified": "",
|
||||
"Light": "მსუბუქი",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "მოდელების მართვა",
|
||||
"Manage Ollama Models": "Ollama მოდელების მართვა",
|
||||
"Manage Pipelines": "მილსადენების მართვა",
|
||||
"Manage Valves": "",
|
||||
"March": "მარტივი",
|
||||
"Max Tokens (num_predict)": "მაქს ტოკენსი (num_predict)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "მაქსიმუმ 3 მოდელის ჩამოტვირთვა შესაძლებელია ერთდროულად. Გთხოვთ სცადოთ მოგვიანებით.",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"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": "მინიმალური ქულა",
|
||||
"Mirostat": "მიროსტატი",
|
||||
"Mirostat Eta": "მიროსტატი ეტა",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "მილსადენების სარქველები",
|
||||
"Plain text (.txt)": "ტექსტი (.txt)",
|
||||
"Playground": "სათამაშო მოედანი",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "პოზიტიური ანგარიში",
|
||||
"Previous 30 days": "უკან 30 დღე",
|
||||
"Previous 7 days": "უკან 7 დღე",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "ვარდისფერი ფიჭვის ხე",
|
||||
"Rosé Pine Dawn": "ვარდისფერი ფიჭვის გარიჟრაჟი",
|
||||
"RTL": "RTL",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "",
|
||||
"Save": "შენახვა",
|
||||
"Save & Create": "დამახსოვრება და შექმნა",
|
||||
"Save & Update": "დამახსოვრება და განახლება",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "ჩეთის ისტორიის შენახვა პირდაპირ თქვენი ბრაუზერის საცავში აღარ არის მხარდაჭერილი. გთხოვთ, დაუთმოთ და წაშალოთ თქვენი ჩატის ჟურნალები ქვემოთ მოცემულ ღილაკზე დაწკაპუნებით. არ ინერვიულოთ, თქვენ შეგიძლიათ მარტივად ხელახლა შემოიტანოთ თქვენი ჩეთის ისტორია ბექენდში",
|
||||
"Scan": "სკანირება",
|
||||
"Scan complete!": "სკანირება დასრულდა!",
|
||||
@@ -558,6 +584,8 @@
|
||||
"Success": "წარმატება",
|
||||
"Successfully updated.": "წარმატებით განახლდა",
|
||||
"Suggested": "პირდაპირ პოპულარული",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "სისტემა",
|
||||
"System Prompt": "სისტემური მოთხოვნა",
|
||||
"Tags": "ტეგები",
|
||||
@@ -570,6 +598,7 @@
|
||||
"Text-to-Speech Engine": "ტექსტურ-ხმოვანი ძრავი",
|
||||
"Tfs Z": "Tfs Z",
|
||||
"Thanks for your feedback!": "მადლობა გამოხმაურებისთვის!",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "ქულა 0.0 (0%) და 1.0 (100%) ჩაშენებული უნდა იყოს.",
|
||||
"Theme": "თემა",
|
||||
"Thinking...": "",
|
||||
@@ -593,6 +622,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "ჩატში",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "დღეს",
|
||||
@@ -603,7 +633,13 @@
|
||||
"Tool deleted successfully": "",
|
||||
"Tool imported successfully": "",
|
||||
"Tool updated successfully": "",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "ტოპ K",
|
||||
"Top P": "ტოპ P",
|
||||
"Trouble accessing Ollama?": "Ollama-ს ვერ უკავშირდები?",
|
||||
@@ -645,6 +681,7 @@
|
||||
"Version": "ვერსია",
|
||||
"Voice": "",
|
||||
"Warning": "გაფრთხილება",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "გაფრთხილება: თუ განაახლებთ ან შეცვლით ჩანერგვის მოდელს, მოგიწევთ ყველა დოკუმენტის ხელახლა იმპორტი.",
|
||||
"Web": "ვები",
|
||||
"Web API": "",
|
||||
@@ -671,6 +708,7 @@
|
||||
"You're a helpful assistant.": "თქვენ სასარგებლო ასისტენტი ხართ.",
|
||||
"You're now logged in.": "თქვენ შესული ხართ.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Youtube Loader Settings"
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "계정",
|
||||
"Account Activation Pending": "계정 활성화 보류",
|
||||
"Accurate information": "정확한 정보",
|
||||
"Actions": "",
|
||||
"Active Users": "활성 사용자",
|
||||
"Add": "추가",
|
||||
"Add a model id": "모델 ID 추가",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "메모리 추가",
|
||||
"Add message": "메시지 추가",
|
||||
"Add Model": "모델 추가",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "태그 추가",
|
||||
"Add User": "사용자 추가",
|
||||
"Adjusting these settings will apply changes universally to all users.": "이 설정을 조정하면 모든 사용자에게 적용됩니다.",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "채팅 삭제",
|
||||
"Delete Chat": "채팅 삭제",
|
||||
"Delete chat?": "채팅을 삭제하겠습니까?",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "",
|
||||
"Delete prompt?": "",
|
||||
"delete this link": "이 링크를 삭제합니다.",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "{{name}}을(를) 삭제했습니다.",
|
||||
"Description": "설명",
|
||||
"Didn't fully follow instructions": "완전히 지침을 따르지 않음",
|
||||
"Disabled": "",
|
||||
"Discover a function": "",
|
||||
"Discover a model": "모델 검색",
|
||||
"Discover a prompt": "프롬프트 검색",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "제외가능",
|
||||
"Display Emoji in Call": "콜(call)에서 이모지 표시",
|
||||
"Display the username instead of You in the Chat": "채팅에서 '당신' 대신 사용자 이름 표시",
|
||||
"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": "문서 조사",
|
||||
@@ -195,6 +201,8 @@
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "어떠한 외부 연결도 하지 않으며, 데이터는 로컬에서 호스팅되는 서버에 안전하게 유지됩니다.",
|
||||
"Don't Allow": "허용 안 함",
|
||||
"Don't have an account?": "계정이 없으신가요?",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "스타일을 좋아하지 않으세요?",
|
||||
"Done": "",
|
||||
"Download": "다운로드",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "문서 편집",
|
||||
"Edit Memory": "메모리 편집",
|
||||
"Edit User": "사용자 편집",
|
||||
"ElevenLabs": "",
|
||||
"Email": "이메일",
|
||||
"Embedding Batch Size": "임베딩 배치 크기",
|
||||
"Embedding Model": "임베딩 모델",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "커뮤니티 공유 활성화",
|
||||
"Enable New Sign Ups": "새 회원가입 활성화",
|
||||
"Enable Web Search": "웹 검색 활성화",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "CSV 파일에 이름, 이메일, 비밀번호, 역할 4개의 컬럼이 순서대로 포함되어 있는지 확인하세요.",
|
||||
"Enter {{role}} message here": "여기에 {{role}} 메시지 입력",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "Serply API 키 입력",
|
||||
"Enter Serpstack API Key": "Serpstack API 키 입력",
|
||||
"Enter stop sequence": "중지 시퀀스 입력",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "Tavily API 키 입력",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "Top K 입력",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "URL 입력(예: http://localhost:11434)",
|
||||
"Enter Your Email": "이메일 입력",
|
||||
"Enter Your Full Name": "이름 입력",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "비밀번호 입력",
|
||||
"Enter Your Role": "역할 입력",
|
||||
"Error": "오류",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "",
|
||||
"File Mode": "파일 모드",
|
||||
"File not found.": "파일을 찾을 수 없습니다.",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "",
|
||||
"Filter is now globally enabled": "",
|
||||
"Filters": "",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "프리퀀시 페널티",
|
||||
"Function created successfully": "",
|
||||
"Function deleted successfully": "",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "",
|
||||
"Functions": "",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "",
|
||||
"General": "일반",
|
||||
"General Settings": "일반 설정",
|
||||
"Generate Image": "이미지 생성",
|
||||
"Generating search query": "검색 쿼리 생성",
|
||||
"Generation Info": "생성 정보",
|
||||
"Get up and running with": "",
|
||||
"Global": "",
|
||||
"Good Response": "좋은 응답",
|
||||
"Google PSE API Key": "Google PSE API 키",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "",
|
||||
"How can I help you today?": "오늘 어떻게 도와드릴까요?",
|
||||
"Hybrid Search": "하이브리드 검색",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "이미지 생성(실험적)",
|
||||
"Image Generation Engine": "이미지 생성 엔진",
|
||||
"Image Settings": "이미지 설정",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "키보드 단축키",
|
||||
"Knowledge": "지식 기반",
|
||||
"Language": "언어",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "최근 활동",
|
||||
"Last Modified": "마지막 수정",
|
||||
"Light": "Light",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "모델 관리",
|
||||
"Manage Ollama Models": "Ollama 모델 관리",
|
||||
"Manage Pipelines": "파이프라인 관리",
|
||||
"Manage Valves": "",
|
||||
"March": "3월",
|
||||
"Max Tokens (num_predict)": "최대 토큰(num_predict)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "최대 3개의 모델을 동시에 다운로드할 수 있습니다. 나중에 다시 시도하세요.",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"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": "최소 점수",
|
||||
"Mirostat": "Mirostat",
|
||||
"Mirostat Eta": "Mirostat Eta",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "파이프라인 밸브",
|
||||
"Plain text (.txt)": "일반 텍스트(.txt)",
|
||||
"Playground": "놀이터",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "긍정적인 자세",
|
||||
"Previous 30 days": "이전 30일",
|
||||
"Previous 7 days": "이전 7일",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "실행 중",
|
||||
"Save": "저장",
|
||||
"Save & Create": "저장 및 생성",
|
||||
"Save & Update": "저장 및 업데이트",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "브라우저의 저장소에 채팅 로그를 직접 저장하는 것은 더 이상 지원되지 않습니다. 아래 버튼을 클릭하여 채팅 로그를 다운로드하고 삭제하세요. 걱정 마세요. 백엔드를 통해 채팅 로그를 쉽게 다시 가져올 수 있습니다.",
|
||||
"Scan": "스캔",
|
||||
"Scan complete!": "스캔 완료!",
|
||||
@@ -558,6 +584,8 @@
|
||||
"Success": "성공",
|
||||
"Successfully updated.": "성공적으로 업데이트되었습니다.",
|
||||
"Suggested": "제안",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "시스템",
|
||||
"System Prompt": "시스템 프롬프트",
|
||||
"Tags": "태그",
|
||||
@@ -570,6 +598,7 @@
|
||||
"Text-to-Speech Engine": "텍스트-음성 변환 엔진",
|
||||
"Tfs Z": "Tfs Z",
|
||||
"Thanks for your feedback!": "피드백 감사합니다!",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "점수는 0.0(0%)에서 1.0(100%) 사이의 값이어야 합니다.",
|
||||
"Theme": "테마",
|
||||
"Thinking...": "생각 중...",
|
||||
@@ -593,6 +622,7 @@
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "WebUI에 접속하려면 관리자에게 문의하십시오. 관리자는 관리자 패널에서 사용자 상태를 관리할 수 있습니다.",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "여기에 문서를 추가하려면, \"문서\" 워크스페이스에 먼저 업로드하세요.",
|
||||
"to chat input.": "채팅 입력으로.",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "여기서 도구를 선택하려면, \"도구\" 워크스페이스에 먼저 추가하세요.",
|
||||
"Today": "오늘",
|
||||
@@ -603,7 +633,13 @@
|
||||
"Tool deleted successfully": "",
|
||||
"Tool imported successfully": "",
|
||||
"Tool updated successfully": "",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "도구",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Ollama에 접근하는 데 문제가 있나요?",
|
||||
@@ -645,6 +681,7 @@
|
||||
"Version": "버전",
|
||||
"Voice": "음성",
|
||||
"Warning": "경고",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "주의: 기존 임베딩 모델을 변경 또는 업데이트하는 경우, 모든 문서를 다시 가져와야 합니다.",
|
||||
"Web": "웹",
|
||||
"Web API": "웹 API",
|
||||
@@ -671,6 +708,7 @@
|
||||
"You're a helpful assistant.": "당신은 유용한 어시스턴트입니다.",
|
||||
"You're now logged in.": "로그인되었습니다.",
|
||||
"Your account status is currently pending activation.": "현재 계정은 아직 활성화되지 않았습니다.",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "유튜브",
|
||||
"Youtube Loader Settings": "유튜브 로더 설정"
|
||||
}
|
||||
|
||||
@@ -111,6 +111,10 @@
|
||||
"code": "pt-PT",
|
||||
"title": "Portuguese (Portugal)"
|
||||
},
|
||||
{
|
||||
"code": "ro-RO",
|
||||
"title": "Romanian (Romania)"
|
||||
},
|
||||
{
|
||||
"code": "ru-RU",
|
||||
"title": "Russian (Russia)"
|
||||
@@ -123,6 +127,10 @@
|
||||
"code": "sr-RS",
|
||||
"title": "Serbian (Српски)"
|
||||
},
|
||||
{
|
||||
"code": "th-TH",
|
||||
"title": "Thailand (ไทย)"
|
||||
},
|
||||
{
|
||||
"code": "tr-TR",
|
||||
"title": "Turkish (Türkçe)"
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"Account": "Paskyra",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Tiksli informacija",
|
||||
"Actions": "",
|
||||
"Active Users": "",
|
||||
"Add": "",
|
||||
"Add a model id": "",
|
||||
@@ -27,6 +28,7 @@
|
||||
"Add Memory": "",
|
||||
"Add message": "Pridėti žinutę",
|
||||
"Add Model": "Pridėti modelį",
|
||||
"Add Tag": "",
|
||||
"Add Tags": "Pridėti žymas",
|
||||
"Add User": "Pridėti naudotoją",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Šių nustatymų pakeitimas bus pritakytas visiems naudotojams.",
|
||||
@@ -168,6 +170,7 @@
|
||||
"Delete chat": "Išrinti pokalbį",
|
||||
"Delete Chat": "Ištrinti pokalbį",
|
||||
"Delete chat?": "",
|
||||
"Delete Doc": "",
|
||||
"Delete function?": "",
|
||||
"Delete prompt?": "",
|
||||
"delete this link": "Ištrinti nuorodą",
|
||||
@@ -177,6 +180,7 @@
|
||||
"Deleted {{name}}": "",
|
||||
"Description": "Aprašymas",
|
||||
"Didn't fully follow instructions": "Pilnai nesekė instrukcijų",
|
||||
"Disabled": "",
|
||||
"Discover a function": "",
|
||||
"Discover a model": "",
|
||||
"Discover a prompt": "Atrasti užklausas",
|
||||
@@ -188,6 +192,8 @@
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Rodyti naudotojo vardą vietoje žodžio Jūs pokalbyje",
|
||||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
"Document": "Dokumentas",
|
||||
"Document Settings": "Dokumento nuostatos",
|
||||
"Documentation": "",
|
||||
@@ -195,6 +201,8 @@
|
||||
"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.",
|
||||
"Don't Allow": "Neleisti",
|
||||
"Don't have an account?": "Neturite paskyros?",
|
||||
"don't install random functions from sources you don't trust.": "",
|
||||
"don't install random tools from sources you don't trust.": "",
|
||||
"Don't like the style": "Nepatinka stilius",
|
||||
"Done": "",
|
||||
"Download": "Parsisiųsti",
|
||||
@@ -206,6 +214,7 @@
|
||||
"Edit Doc": "Redaguoti dokumentą",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Redaguoti naudotoją",
|
||||
"ElevenLabs": "",
|
||||
"Email": "El. paštas",
|
||||
"Embedding Batch Size": "",
|
||||
"Embedding Model": "Embedding modelis",
|
||||
@@ -215,6 +224,7 @@
|
||||
"Enable Community Sharing": "",
|
||||
"Enable New Sign Ups": "Aktyvuoti naujas registracijas",
|
||||
"Enable Web Search": "",
|
||||
"Enabled": "",
|
||||
"Engine": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Įsitikinkite, kad CSV failas turi 4 kolonas šiuo eiliškumu: Name, Email, Password, Role.",
|
||||
"Enter {{role}} message here": "Įveskite {{role}} žinutę čia",
|
||||
@@ -236,6 +246,7 @@
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "",
|
||||
"Enter stop sequence": "Įveskite pabaigos sekvenciją",
|
||||
"Enter system prompt": "",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter Top K": "Įveskite Top K",
|
||||
@@ -243,6 +254,7 @@
|
||||
"Enter URL (e.g. http://localhost:11434)": "Įveskite nuorododą (pvz. http://localhost:11434",
|
||||
"Enter Your Email": "Įveskite el. pašto adresą",
|
||||
"Enter Your Full Name": "Įveskite vardą bei pavardę",
|
||||
"Enter your message": "",
|
||||
"Enter Your Password": "Įveskite slaptažodį",
|
||||
"Enter Your Role": "Įveskite savo rolę",
|
||||
"Error": "",
|
||||
@@ -266,6 +278,7 @@
|
||||
"File": "",
|
||||
"File Mode": "Dokumentų rėžimas",
|
||||
"File not found.": "Failas nerastas.",
|
||||
"Files": "",
|
||||
"Filter is now globally disabled": "",
|
||||
"Filter is now globally enabled": "",
|
||||
"Filters": "",
|
||||
@@ -278,14 +291,22 @@
|
||||
"Frequency Penalty": "",
|
||||
"Function created successfully": "",
|
||||
"Function deleted successfully": "",
|
||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
||||
"Function ID (e.g. my_filter)": "",
|
||||
"Function is now globally disabled": "",
|
||||
"Function is now globally enabled": "",
|
||||
"Function Name (e.g. My Filter)": "",
|
||||
"Function updated successfully": "",
|
||||
"Functions": "",
|
||||
"Functions allow arbitrary code execution": "",
|
||||
"Functions allow arbitrary code execution.": "",
|
||||
"Functions imported successfully": "",
|
||||
"General": "Bendri",
|
||||
"General Settings": "Bendri nustatymai",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "",
|
||||
"Generation Info": "Generavimo informacija",
|
||||
"Get up and running with": "",
|
||||
"Global": "",
|
||||
"Good Response": "Geras atsakymas",
|
||||
"Google PSE API Key": "",
|
||||
@@ -298,6 +319,7 @@
|
||||
"Hide Model": "",
|
||||
"How can I help you today?": "Kuo galėčiau Jums padėti ?",
|
||||
"Hybrid Search": "Hibridinė paieška",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"Image Generation (Experimental)": "Vaizdų generavimas (eksperimentinis)",
|
||||
"Image Generation Engine": "Vaizdų generavimo variklis",
|
||||
"Image Settings": "Vaizdų nustatymai",
|
||||
@@ -328,6 +350,7 @@
|
||||
"Keyboard shortcuts": "Klaviatūros trumpiniai",
|
||||
"Knowledge": "",
|
||||
"Language": "Kalba",
|
||||
"large language models, locally.": "",
|
||||
"Last Active": "Paskutinį kartą aktyvus",
|
||||
"Last Modified": "",
|
||||
"Light": "Šviesus",
|
||||
@@ -341,7 +364,6 @@
|
||||
"Manage Models": "Tvarkyti modelius",
|
||||
"Manage Ollama Models": "Tvarkyti Ollama modelius",
|
||||
"Manage Pipelines": "",
|
||||
"Manage Valves": "",
|
||||
"March": "Kovas",
|
||||
"Max Tokens (num_predict)": "",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Daugiausiai trys modeliai gali būti parsisiunčiami vienu metu.",
|
||||
@@ -353,6 +375,7 @@
|
||||
"Memory deleted successfully": "",
|
||||
"Memory updated successfully": "",
|
||||
"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": "Minimalus rezultatas",
|
||||
"Mirostat": "Mirostat",
|
||||
"Mirostat Eta": "Mirostat Eta",
|
||||
@@ -438,6 +461,7 @@
|
||||
"Pipelines Valves": "",
|
||||
"Plain text (.txt)": "Grynas tekstas (.txt)",
|
||||
"Playground": "Eksperimentavimo erdvė",
|
||||
"Please carefully review the following warnings:": "",
|
||||
"Positive attitude": "Pozityvus elgesys",
|
||||
"Previous 30 days": "Paskutinės 30 dienų",
|
||||
"Previous 7 days": "Paskutinės 7 dienos",
|
||||
@@ -475,10 +499,12 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "",
|
||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
||||
"Running": "",
|
||||
"Save": "Išsaugoti",
|
||||
"Save & Create": "Išsaugoti ir sukurti",
|
||||
"Save & Update": "Išsaugoti ir atnaujinti",
|
||||
"Save Tag": "",
|
||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Pokalbių saugojimas naršyklėje nebegalimas.",
|
||||
"Scan": "Skenuoti",
|
||||
"Scan complete!": "Skenavimas baigtas!",
|
||||
@@ -560,6 +586,8 @@
|
||||
"Success": "Sėkmingai",
|
||||
"Successfully updated.": "Sėkmingai atnaujinta.",
|
||||
"Suggested": "Siūloma",
|
||||
"Support": "",
|
||||
"Support this plugin:": "",
|
||||
"System": "Sistema",
|
||||
"System Prompt": "Sistemos užklausa",
|
||||
"Tags": "Žymos",
|
||||
@@ -572,6 +600,7 @@
|
||||
"Text-to-Speech Engine": "Balso sintezės modelis",
|
||||
"Tfs Z": "Tfs Z",
|
||||
"Thanks for your feedback!": "Ačiū už atsiliepimus",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Rezultatas turėtų būti tarp 0.0 (0%) ir 1.0 (100%)",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "",
|
||||
@@ -589,12 +618,13 @@
|
||||
"Title Auto-Generation": "Automatinis pavadinimų generavimas",
|
||||
"Title cannot be an empty string.": "Pavadinimas negali būti tuščias",
|
||||
"Title Generation Prompt": "Pavadinimo generavimo užklausa",
|
||||
"to": "kam",
|
||||
"to": "➡️",
|
||||
"To access the available model names for downloading,": "Tam, kad prieiti prie galimų parsisiųsti modelių",
|
||||
"To access the GGUF models available for downloading,": "Tam, kad prieiti prie galimų parsisiųsti GGUF,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "į pokalbio įvestį",
|
||||
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Šiandien",
|
||||
@@ -605,7 +635,13 @@
|
||||
"Tool deleted successfully": "",
|
||||
"Tool imported successfully": "",
|
||||
"Tool updated successfully": "",
|
||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
||||
"Toolkit ID (e.g. my_toolkit)": "",
|
||||
"Toolkit Name (e.g. My ToolKit)": "",
|
||||
"Tools": "",
|
||||
"Tools are a function calling system with arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problemos prieinant prie Ollama?",
|
||||
@@ -647,6 +683,7 @@
|
||||
"Version": "Versija",
|
||||
"Voice": "",
|
||||
"Warning": "",
|
||||
"Warning:": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Jei pakeisite embedding modelį, turėsite reimportuoti visus dokumentus",
|
||||
"Web": "Web",
|
||||
"Web API": "",
|
||||
@@ -673,6 +710,7 @@
|
||||
"You're a helpful assistant.": "Esi asistentas.",
|
||||
"You're now logged in.": "Esate prisijungę.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Youtube krovimo nustatymai"
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user