Compare commits

...

117 commits

Author SHA1 Message Date
921a1cf978 Merge pull request 'main' (!3) from open-webui/open-webui:main into main
Some checks failed
Release / release (push) Failing after 6s
Create and publish a Docker image / build-and-push-image (push) Successful in 31m48s
Python CI / Format Backend (latest, 3.12.2) (push) Failing after 7s
Bun CI / Format & Build Frontend (push) Successful in 1m7s
Reviewed-on: #3
2024-03-26 12:22:22 +01:00
Timothy Jaeryang Baek
ac294a74e7
Merge pull request #1277 from open-webui/dev
Some checks failed
Python CI / Format Backend (latest) (pull_request) Failing after 11s
Bun CI / Format & Build Frontend (pull_request) Successful in 1m6s
0.1.115
2024-03-24 18:20:08 -05:00
Timothy J. Baek
4c9598918a doc: changelog
Co-Author: Fixed the upload experimental feature
Co-Authored-By: rob <64106559+kroonen@users.noreply.github.com>
2024-03-24 16:12:07 -07:00
Timothy Jaeryang Baek
ffa168211e
Merge pull request #1237 from lainedfles/debug_print
Migrate to python logging module with env var control.
2024-03-24 18:04:27 -05:00
Timothy Jaeryang Baek
371dfc1143
Merge branch 'dev' into debug_print 2024-03-24 18:04:03 -05:00
Timothy Jaeryang Baek
a1faa307b1
Merge pull request #1272 from anuraagdjain/feat/cancel-model-download
feat: cancel model download
2024-03-24 18:00:57 -05:00
Timothy J. Baek
a4c4a0370e refac: transition 2024-03-24 15:55:03 -07:00
Timothy J. Baek
3e0aa29683 refac: transition 2024-03-24 15:43:03 -07:00
Timothy J. Baek
df21a92542 fix: select 2024-03-24 15:31:09 -07:00
Timothy J. Baek
b218b02d93 feat: custom model selector 2024-03-24 15:28:36 -07:00
Timothy J. Baek
ff8a55a861 refac: rag api 2024-03-24 00:41:41 -07:00
Timothy J. Baek
7e0ea8f77d feat: RAG text ingestion(store) api 2024-03-24 00:40:27 -07:00
Timothy J. Baek
c2d6d3230b refac: reset vector db 2024-03-23 20:50:57 -07:00
Timothy J. Baek
8d108060d5 refac: styling 2024-03-23 18:08:33 -07:00
Timothy J. Baek
5cb6e9b0b4 refac: styling 2024-03-23 18:07:42 -07:00
Timothy J. Baek
cea74eaf52 feat: light mode theme update 2024-03-23 18:05:36 -07:00
Timothy Jaeryang Baek
adf9ccb5eb
Merge pull request #1275 from open-webui/comfyui
feat: comfyui support
2024-03-23 19:01:51 -05:00
Timothy J. Baek
98624a406f feat: comfyui integration 2024-03-23 17:01:13 -07:00
Timothy J. Baek
862c96fcef feat: comfyui support 2024-03-23 15:38:59 -07:00
Timothy J. Baek
cbaaacfb75 fix: styling 2024-03-23 13:36:11 -07:00
Timothy Jaeryang Baek
3e0d9ad74f
Merge branch 'dev' into feat/cancel-model-download 2024-03-23 15:16:06 -05:00
Timothy J. Baek
e008738f30 feat: cancel download from backend 2024-03-23 13:12:54 -07:00
Timothy J. Baek
244f34c24e refac: cancel download 2024-03-23 13:12:23 -07:00
Timothy J. Baek
642ca5a94a refac: ui 2024-03-23 12:46:06 -07:00
Timothy J. Baek
85187deb4b fix: languages order 2024-03-23 12:43:31 -07:00
Timothy Jaeryang Baek
3305ac5928
Merge pull request #1269 from pazoff/dev
added Italian, Portuguese and Japanese translations
2024-03-23 14:34:54 -05:00
Timothy Jaeryang Baek
51a4e49ae1
Merge pull request #1247 from changchiyou/enhance/zh_TW_translation
Enhance/zh tw translation
2024-03-23 14:34:28 -05:00
Timothy Jaeryang Baek
6c9f552733
Merge pull request #1271 from Axodouble/main
Added nl-NL (Dutch) Translations.
2024-03-23 14:33:54 -05:00
Anuraag Jain
7e6d499486 refac: remove conosle.log 2024-03-23 21:00:01 +02:00
Anuraag Jain
d291821bf3 refac: delete button UI 2024-03-23 20:56:18 +02:00
Anuraag Jain
45311bfa15 Merge branch 'main' into feat/cancel-model-download
# Conflicts:
#	src/lib/components/chat/Settings/Models.svelte
2024-03-23 18:10:35 +02:00
changchiyou
b03f4371d6
enhance: setting 2024-03-23 23:55:42 +08:00
Axodouble
f662aab9e8 Finished Dutch translation. 2024-03-23 13:05:13 +01:00
Axodouble
129253d90d Added partial Dutch (Netherlands, NL) translations. 2024-03-23 12:23:05 +01:00
changchiyou
2d1b67561b
enhance: routes/auth 2024-03-23 17:13:43 +08:00
changchiyou
dca3dbbce6
enhance: admin 2024-03-23 17:07:35 +08:00
changchiyou
e9f1a714e8
enhance: playground 2024-03-23 16:19:14 +08:00
Plamen Vatev
d5b5155c20
add ja-JP (Japanese) translation 2024-03-23 07:29:07 +02:00
Plamen Vatev
6e79530e0e
add Japanese translation 2024-03-23 07:27:24 +02:00
Plamen Vatev
b0a2eb31ee
add Portuguese translation 2024-03-23 07:00:40 +02:00
Plamen Vatev
c0549498bf
add Portuguese translation 2024-03-23 07:00:08 +02:00
Plamen Vatev
f8a922e966
Merge branch 'open-webui:dev' into dev 2024-03-23 06:52:51 +02:00
Timothy J. Baek
5c1e3a460e fix: remove aiofiles dependency 2024-03-22 21:47:53 -07:00
Plamen Vatev
bc04553a7c
add Italian translation 2024-03-23 06:28:26 +02:00
Plamen Vatev
c296e9061e
add Italian translation 2024-03-23 06:22:53 +02:00
changchiyou
e14ad508c9
enhance: e9a198d8ed 2024-03-23 10:14:47 +08:00
changchiyou
e9a198d8ed
enhance: routes/documents & components/documents/Settings/General.svelte 2024-03-23 10:12:11 +08:00
changchiyou
cb0e858c04
enhance: routes/prompts 2024-03-23 09:44:56 +08:00
Timothy Jaeryang Baek
848d2382bc
Merge pull request #1267 from Michelklingler/langfuse_dependency
Added langfuse dependency to the requierements.txt file.
2024-03-22 16:36:21 -05:00
Timothy Jaeryang Baek
106727109e
Merge pull request #1258 from que-nguyen/main
Fixed Vietnamese translation for improved language quality
2024-03-22 16:20:39 -05:00
Timothy Jaeryang Baek
c97051e6eb
Merge pull request #1262 from pazoff/dev
Fixed spelling in Bulgarian translation
2024-03-22 16:20:11 -05:00
Michel K
4140e1b84a Added langfuse dependency to the requierements.txt file. 2024-03-22 14:01:39 -04:00
Plamen Vatev
fe8a3ac2d7
Fix spelling 2024-03-22 17:49:25 +02:00
changchiyou
b5111c4b34
enhance: routes/modelfiles
- `Modelfile` is a proprietary term of Ollama. `模型文件` is the Simplified Chinese translation used in their community but not common used in zh-TW community.
- `Prompt`'s better zh-TW translation is `提示詞`(refert to https://docs.aws.amazon.com/zh_tw/bedrock/latest/userguide/what-is-prompt-engineering.html ) instead of `提示`, which is easily misunderstood as a verb `建議`
2024-03-22 17:17:22 +08:00
Timothy J. Baek
92cc87d908 fix: ollama upload url 2024-03-22 00:58:38 -07:00
Timothy J. Baek
9e37d6edcc refac: gguf upload ui 2024-03-22 00:55:59 -07:00
Timothy J. Baek
77ec296ac3 chore: print removed 2024-03-22 00:11:17 -07:00
Timothy J. Baek
bc80f1438c fix: ollama gguf upload 2024-03-22 00:10:55 -07:00
Timothy J. Baek
af4caec4f5 refac: ollama gguf upload 2024-03-21 23:45:00 -07:00
Que Nguyen
c5e9ceeb06
Merge branch 'open-webui:main' into main 2024-03-22 10:43:03 +07:00
Que Nguyen
47a04a7e3c Fixed Vietnamese translation for improved language quality 2024-03-22 10:42:38 +07:00
Timothy Jaeryang Baek
c54fb92263
Merge pull request #1249 from pazoff/dev
added Bulgarian Translation
2024-03-21 16:29:25 -05:00
Timothy J. Baek
f3c113cb04 fix: languages order 2024-03-21 14:29:05 -07:00
Plamen Vatev
5f26b2a9e3
added bg-BG (Bulgarian) 2024-03-21 17:43:31 +02:00
Plamen Vatev
8935dca279
added Bulgarian Translation 2024-03-21 17:14:59 +02:00
changchiyou
f675a18b05
enhance: i18n's zh-TW translation for About.svelte 2024-03-21 19:38:42 +08:00
Self Denial
f74f2ea765 Merge conflicts 2024-03-21 00:14:13 -06:00
Timothy Jaeryang Baek
5a90e90c0b
Merge pull request #1241 from 7a6ac0/duplicate_def
fix: delete duplicate function
2024-03-20 22:01:13 -05:00
Timothy Jaeryang Baek
2fa94956f4
Merge pull request #1209 from open-webui/dev
0.1.114
2024-03-20 21:34:22 -05:00
Timothy J. Baek
8e52ba8b91 refac: auth required for litellm in dev 2024-03-20 19:33:27 -07:00
Timothy J. Baek
ed0d4b5a2a chore: comment clean up 2024-03-20 19:32:25 -07:00
tabaco.wang
a1412d0b55 fix: delete duplicate function 2024-03-21 10:31:25 +08:00
Timothy J. Baek
1a240e103e doc: changelog 2024-03-20 19:31:15 -07:00
Timothy J. Baek
93c90dc186 feat: litellm model filter support 2024-03-20 19:28:33 -07:00
Timothy J. Baek
8cb7127fbc doc: changelog 2024-03-20 19:01:20 -07:00
Timothy J. Baek
4b91ac352a chore: i18n alphabetically ordering 2024-03-20 18:52:24 -07:00
Timothy Jaeryang Baek
09dc3b7b67
Merge pull request #1226 from marionguyen/main
Added Vietnamese translation files
2024-03-20 20:49:27 -05:00
Timothy J. Baek
bdc51b45ec Update translation.json 2024-03-20 18:49:08 -07:00
Timothy Jaeryang Baek
6313a98287
Merge branch 'dev' into main 2024-03-20 20:48:26 -05:00
Timothy Jaeryang Baek
ae347bb5e7
Merge pull request #1239 from open-webui/webhook
feat: webhook
2024-03-20 20:47:46 -05:00
Timothy J. Baek
fa65be2ad2 refac: post webhook 2024-03-20 18:47:13 -07:00
Timothy J. Baek
2481e48a3a feat: webhook settings frontend 2024-03-20 18:35:54 -07:00
Timothy J. Baek
2c6e2d5e8a feat: webhook backend 2024-03-20 18:35:02 -07:00
Self Denial
e6dd0bfbe0 Migrate to python logging module with env var control. 2024-03-20 17:11:36 -06:00
Que Nguyen
b22ed64770 Added Vietnamese translation files 2024-03-20 11:31:44 +07:00
Timothy Jaeryang Baek
16fe0ee167
Merge pull request #1151 from changchiyou/feat/custom_default_user_permissions_chat_deletion
Feat/custom default user permissions chat deletion
2024-03-19 16:23:23 -05:00
Timothy J. Baek
87344adf29 refac 2024-03-19 14:21:46 -07:00
Timothy J. Baek
349fd0c87d refac: config.json 2024-03-19 14:03:46 -07:00
Timothy Jaeryang Baek
d4a11ca33f
Merge pull request #1220 from justinh-rahb/fix-messsage
Fix spelling
2024-03-19 15:17:06 -05:00
Justin Hayes
bd84ee0c6a Fix spelling 2024-03-19 15:06:45 -04:00
Timothy J. Baek
a9e411fdb9 fix: languages 2024-03-19 11:46:48 -07:00
Timothy Jaeryang Baek
de8de7e008
Merge pull request #1217 from justinh-rahb/french
French (Canada) translations added, some French (France) strings updated/changed
2024-03-19 13:45:53 -05:00
Timothy Jaeryang Baek
63edaae8d8
Merge pull request #1219 from djismgaming/spanish-translation
Spanish translation
2024-03-19 13:44:47 -05:00
Timothy Jaeryang Baek
d3cf9a7535
Merge pull request #1215 from granludo/main
Added Catalan translation
2024-03-19 13:42:53 -05:00
Ismael
7c8727151e spanish translation of the webui 2024-03-19 14:12:04 -04:00
Justin Hayes
c3f805b809 Fix capitalization of words 2024-03-19 12:24:12 -04:00
Justin Hayes
8508319c23 Revert "Change some fr-FR strings"
This reverts commit b21091bc01.
2024-03-19 12:07:16 -04:00
Justin Hayes
b9382f7051
Update languages.json 2024-03-19 11:51:52 -04:00
Justin Hayes
53fb3d9c3e
Add fr-CA translations.json 2024-03-19 11:51:36 -04:00
Justin Hayes
b21091bc01
Change some fr-FR strings 2024-03-19 11:51:21 -04:00
Ludo (Marc Alier)
4de591b930 added catalan to "languages.json" added proper code "ca-ES" 2024-03-19 15:26:02 +01:00
Ludo (Marc Alier)
492d4f3403 Added Catalan translation 2024-03-19 11:27:46 +01:00
Timothy J. Baek
0b163c2c2d Update translation.json 2024-03-19 00:30:44 -07:00
Timothy Jaeryang Baek
7bb8e91edb
Merge pull request #1207 from officialsahyaboutorabi/patch-4
Update languages.json
2024-03-19 02:28:53 -05:00
Timothy Jaeryang Baek
49faff497e
Merge pull request #1206 from officialsahyaboutorabi/patch-3
Create translation.json
2024-03-19 02:28:14 -05:00
Timothy Jaeryang Baek
33888ffaf8
Merge pull request #1205 from adan89lion/patch-1
Enhance Traditional Chinese translation
2024-03-19 02:27:17 -05:00
officialsahyaboutorabi
b10eb0dacc
Update languages.json 2024-03-19 16:14:34 +11:00
officialsahyaboutorabi
7f197a70f9
Create translation.json
For Russian language.
2024-03-19 16:13:20 +11:00
Ismael
61b4ab1e63 spanish translation of the webui 2024-03-18 22:44:38 -04:00
Ismael
51342179ad feat: Add support for Spanish language option in WebUI Settings 2024-03-18 22:44:05 -04:00
Seohyun Joo
f1925841e2
Enhance Traditional Chinese translation
Correct some machine translation mistakes, and convert Mainland China's regional expression to Taiwan.
2024-03-19 10:17:54 +08:00
Timothy J. Baek
e86db74333 refac: stream default value 2024-03-18 18:14:05 -07:00
Timothy J. Baek
c569280806 fix: styling 2024-03-18 17:46:16 -07:00
Timothy J. Baek
bc5d322cbb fix: add doc modal styling 2024-03-18 17:03:08 -07:00
changchiyou
c6e14ce327
refactor: restrict the scope of USER_PERMISSIONS_CHAT_DELETION
it can easily confuse people before becuase when people accidentally set `env.USER_PERMISSIONS_CHAT_DELETION` to `true/yes/Yes`, `USER_PERMISSIONS["chat"]["deletion"]` would become `False`, which is unexpectedly and hard to notice.
2024-03-14 00:01:46 +08:00
changchiyou
04e3b168a6
config: allow custom default user permissions - chat deletion
Allow Chat Deletion
2024-03-13 23:17:22 +08:00
Anuraag Jain
ae97a96379 WIP feat: cancel model download 2024-02-18 21:29:47 +02:00
74 changed files with 7314 additions and 5536 deletions

2
.gitignore vendored
View file

@ -166,7 +166,7 @@ cython_debug/
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear # and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder. # option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/ .idea/
# Logs # Logs
logs logs

View file

@ -5,6 +5,41 @@ 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/), 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). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.1.115] - 2024-03-24
### Added
- **🔍 Custom Model Selector**: Easily find and select custom models with the new search filter feature.
- **🛑 Cancel Model Download**: Added the ability to cancel model downloads.
- **🎨 Image Generation ComfyUI**: Image generation now supports ComfyUI.
- **🌟 Updated Light Theme**: Updated the light theme for a fresh look.
- **🌍 Additional Language Support**: Now supporting Bulgarian, Italian, Portuguese, Japanese, and Dutch.
### Fixed
- **🔧 Fixed Broken Experimental GGUF Upload**: Resolved issues with experimental GGUF upload functionality.
### Changed
- **🔄 Vector Storage Reset Button**: Moved the reset vector storage button to document settings.
## [0.1.114] - 2024-03-20
### Added
- **🔗 Webhook Integration**: Now you can subscribe to new user sign-up events via webhook. Simply navigate to the admin panel > admin settings > webhook URL.
- **🛡️ Enhanced Model Filtering**: Alongside Ollama, OpenAI proxy model whitelisting, we've added model filtering functionality for LiteLLM proxy.
- **🌍 Expanded Language Support**: Spanish, Catalan, and Vietnamese languages are now available, with improvements made to others.
### Fixed
- **🔧 Input Field Spelling**: Resolved issue with spelling mistakes in input fields.
- **🖊️ Light Mode Styling**: Fixed styling issue with light mode in document adding.
### Changed
- **🔄 Language Sorting**: Languages are now sorted alphabetically by their code for improved organization.
## [0.1.113] - 2024-03-18 ## [0.1.113] - 2024-03-18
### Added ### Added

View file

@ -1,4 +1,5 @@
import os import os
import logging
from fastapi import ( from fastapi import (
FastAPI, FastAPI,
Request, Request,
@ -21,7 +22,10 @@ from utils.utils import (
) )
from utils.misc import calculate_sha256 from utils.misc import calculate_sha256
from config import CACHE_DIR, UPLOAD_DIR, WHISPER_MODEL, WHISPER_MODEL_DIR from config import SRC_LOG_LEVELS, CACHE_DIR, UPLOAD_DIR, WHISPER_MODEL, WHISPER_MODEL_DIR
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["AUDIO"])
app = FastAPI() app = FastAPI()
app.add_middleware( app.add_middleware(
@ -38,7 +42,7 @@ def transcribe(
file: UploadFile = File(...), file: UploadFile = File(...),
user=Depends(get_current_user), user=Depends(get_current_user),
): ):
print(file.content_type) log.info(f"file.content_type: {file.content_type}")
if file.content_type not in ["audio/mpeg", "audio/wav"]: if file.content_type not in ["audio/mpeg", "audio/wav"]:
raise HTTPException( raise HTTPException(
@ -62,7 +66,7 @@ def transcribe(
) )
segments, info = model.transcribe(file_path, beam_size=5) segments, info = model.transcribe(file_path, beam_size=5)
print( log.info(
"Detected language '%s' with probability %f" "Detected language '%s' with probability %f"
% (info.language, info.language_probability) % (info.language, info.language_probability)
) )
@ -72,7 +76,7 @@ def transcribe(
return {"text": transcript.strip()} return {"text": transcript.strip()}
except Exception as e: except Exception as e:
print(e) log.exception(e)
raise HTTPException( raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, status_code=status.HTTP_400_BAD_REQUEST,

View file

@ -18,6 +18,8 @@ from utils.utils import (
get_current_user, get_current_user,
get_admin_user, get_admin_user,
) )
from apps.images.utils.comfyui import ImageGenerationPayload, comfyui_generate_image
from utils.misc import calculate_sha256 from utils.misc import calculate_sha256
from typing import Optional from typing import Optional
from pydantic import BaseModel from pydantic import BaseModel
@ -25,10 +27,14 @@ from pathlib import Path
import uuid import uuid
import base64 import base64
import json import json
import logging
from config import CACHE_DIR, AUTOMATIC1111_BASE_URL from config import SRC_LOG_LEVELS, CACHE_DIR, AUTOMATIC1111_BASE_URL, COMFYUI_BASE_URL
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["IMAGES"])
IMAGE_CACHE_DIR = Path(CACHE_DIR).joinpath("./image/generations/") IMAGE_CACHE_DIR = Path(CACHE_DIR).joinpath("./image/generations/")
IMAGE_CACHE_DIR.mkdir(parents=True, exist_ok=True) IMAGE_CACHE_DIR.mkdir(parents=True, exist_ok=True)
@ -49,6 +55,8 @@ app.state.MODEL = ""
app.state.AUTOMATIC1111_BASE_URL = AUTOMATIC1111_BASE_URL app.state.AUTOMATIC1111_BASE_URL = AUTOMATIC1111_BASE_URL
app.state.COMFYUI_BASE_URL = COMFYUI_BASE_URL
app.state.IMAGE_SIZE = "512x512" app.state.IMAGE_SIZE = "512x512"
app.state.IMAGE_STEPS = 50 app.state.IMAGE_STEPS = 50
@ -71,32 +79,48 @@ async def update_config(form_data: ConfigUpdateForm, user=Depends(get_admin_user
return {"engine": app.state.ENGINE, "enabled": app.state.ENABLED} return {"engine": app.state.ENGINE, "enabled": app.state.ENABLED}
class UrlUpdateForm(BaseModel): class EngineUrlUpdateForm(BaseModel):
url: str AUTOMATIC1111_BASE_URL: Optional[str] = None
COMFYUI_BASE_URL: Optional[str] = None
@app.get("/url") @app.get("/url")
async def get_automatic1111_url(user=Depends(get_admin_user)): async def get_engine_url(user=Depends(get_admin_user)):
return {"AUTOMATIC1111_BASE_URL": app.state.AUTOMATIC1111_BASE_URL} return {
"AUTOMATIC1111_BASE_URL": app.state.AUTOMATIC1111_BASE_URL,
"COMFYUI_BASE_URL": app.state.COMFYUI_BASE_URL,
}
@app.post("/url/update") @app.post("/url/update")
async def update_automatic1111_url( async def update_engine_url(
form_data: UrlUpdateForm, user=Depends(get_admin_user) form_data: EngineUrlUpdateForm, user=Depends(get_admin_user)
): ):
if form_data.url == "": if form_data.AUTOMATIC1111_BASE_URL == None:
app.state.AUTOMATIC1111_BASE_URL = AUTOMATIC1111_BASE_URL app.state.AUTOMATIC1111_BASE_URL = AUTOMATIC1111_BASE_URL
else: else:
url = form_data.url.strip("/") url = form_data.AUTOMATIC1111_BASE_URL.strip("/")
try: try:
r = requests.head(url) r = requests.head(url)
app.state.AUTOMATIC1111_BASE_URL = url app.state.AUTOMATIC1111_BASE_URL = url
except Exception as e: except Exception as e:
raise HTTPException(status_code=400, detail=ERROR_MESSAGES.DEFAULT(e)) raise HTTPException(status_code=400, detail=ERROR_MESSAGES.DEFAULT(e))
if form_data.COMFYUI_BASE_URL == None:
app.state.COMFYUI_BASE_URL = COMFYUI_BASE_URL
else:
url = form_data.COMFYUI_BASE_URL.strip("/")
try:
r = requests.head(url)
app.state.COMFYUI_BASE_URL = url
except Exception as e:
raise HTTPException(status_code=400, detail=ERROR_MESSAGES.DEFAULT(e))
return { return {
"AUTOMATIC1111_BASE_URL": app.state.AUTOMATIC1111_BASE_URL, "AUTOMATIC1111_BASE_URL": app.state.AUTOMATIC1111_BASE_URL,
"COMFYUI_BASE_URL": app.state.COMFYUI_BASE_URL,
"status": True, "status": True,
} }
@ -186,6 +210,18 @@ def get_models(user=Depends(get_current_user)):
{"id": "dall-e-2", "name": "DALL·E 2"}, {"id": "dall-e-2", "name": "DALL·E 2"},
{"id": "dall-e-3", "name": "DALL·E 3"}, {"id": "dall-e-3", "name": "DALL·E 3"},
] ]
elif app.state.ENGINE == "comfyui":
r = requests.get(url=f"{app.state.COMFYUI_BASE_URL}/object_info")
info = r.json()
return list(
map(
lambda model: {"id": model, "name": model},
info["CheckpointLoaderSimple"]["input"]["required"]["ckpt_name"][0],
)
)
else: else:
r = requests.get( r = requests.get(
url=f"{app.state.AUTOMATIC1111_BASE_URL}/sdapi/v1/sd-models" url=f"{app.state.AUTOMATIC1111_BASE_URL}/sdapi/v1/sd-models"
@ -207,6 +243,8 @@ async def get_default_model(user=Depends(get_admin_user)):
try: try:
if app.state.ENGINE == "openai": if app.state.ENGINE == "openai":
return {"model": app.state.MODEL if app.state.MODEL else "dall-e-2"} return {"model": app.state.MODEL if app.state.MODEL else "dall-e-2"}
elif app.state.ENGINE == "comfyui":
return {"model": app.state.MODEL if app.state.MODEL else ""}
else: else:
r = requests.get(url=f"{app.state.AUTOMATIC1111_BASE_URL}/sdapi/v1/options") r = requests.get(url=f"{app.state.AUTOMATIC1111_BASE_URL}/sdapi/v1/options")
options = r.json() options = r.json()
@ -221,10 +259,12 @@ class UpdateModelForm(BaseModel):
def set_model_handler(model: str): def set_model_handler(model: str):
if app.state.ENGINE == "openai": if app.state.ENGINE == "openai":
app.state.MODEL = model app.state.MODEL = model
return app.state.MODEL return app.state.MODEL
if app.state.ENGINE == "comfyui":
app.state.MODEL = model
return app.state.MODEL
else: else:
r = requests.get(url=f"{app.state.AUTOMATIC1111_BASE_URL}/sdapi/v1/options") r = requests.get(url=f"{app.state.AUTOMATIC1111_BASE_URL}/sdapi/v1/options")
options = r.json() options = r.json()
@ -266,6 +306,23 @@ def save_b64_image(b64_str):
with open(file_path, "wb") as f: with open(file_path, "wb") as f:
f.write(img_data) f.write(img_data)
return image_id
except Exception as e:
log.error(f"Error saving image: {e}")
return None
def save_url_image(url):
image_id = str(uuid.uuid4())
file_path = IMAGE_CACHE_DIR.joinpath(f"{image_id}.png")
try:
r = requests.get(url)
r.raise_for_status()
with open(file_path, "wb") as image_file:
image_file.write(r.content)
return image_id return image_id
except Exception as e: except Exception as e:
print(f"Error saving image: {e}") print(f"Error saving image: {e}")
@ -278,6 +335,8 @@ def generate_image(
user=Depends(get_current_user), user=Depends(get_current_user),
): ):
width, height = tuple(map(int, app.state.IMAGE_SIZE.split("x")))
r = None r = None
try: try:
if app.state.ENGINE == "openai": if app.state.ENGINE == "openai":
@ -315,12 +374,47 @@ def generate_image(
return images return images
elif app.state.ENGINE == "comfyui":
data = {
"prompt": form_data.prompt,
"width": width,
"height": height,
"n": form_data.n,
}
if app.state.IMAGE_STEPS != None:
data["steps"] = app.state.IMAGE_STEPS
if form_data.negative_prompt != None:
data["negative_prompt"] = form_data.negative_prompt
data = ImageGenerationPayload(**data)
res = comfyui_generate_image(
app.state.MODEL,
data,
user.id,
app.state.COMFYUI_BASE_URL,
)
print(res)
images = []
for image in res["data"]:
image_id = save_url_image(image["url"])
images.append({"url": f"/cache/image/generations/{image_id}.png"})
file_body_path = IMAGE_CACHE_DIR.joinpath(f"{image_id}.json")
with open(file_body_path, "w") as f:
json.dump(data.model_dump(exclude_none=True), f)
print(images)
return images
else: else:
if form_data.model: if form_data.model:
set_model_handler(form_data.model) set_model_handler(form_data.model)
width, height = tuple(map(int, app.state.IMAGE_SIZE.split("x")))
data = { data = {
"prompt": form_data.prompt, "prompt": form_data.prompt,
"batch_size": form_data.n, "batch_size": form_data.n,
@ -341,7 +435,7 @@ def generate_image(
res = r.json() res = r.json()
print(res) log.debug(f"res: {res}")
images = [] images = []

View file

@ -0,0 +1,228 @@
import websocket # NOTE: websocket-client (https://github.com/websocket-client/websocket-client)
import uuid
import json
import urllib.request
import urllib.parse
import random
from pydantic import BaseModel
from typing import Optional
COMFYUI_DEFAULT_PROMPT = """
{
"3": {
"inputs": {
"seed": 0,
"steps": 20,
"cfg": 8,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": 1,
"model": [
"4",
0
],
"positive": [
"6",
0
],
"negative": [
"7",
0
],
"latent_image": [
"5",
0
]
},
"class_type": "KSampler",
"_meta": {
"title": "KSampler"
}
},
"4": {
"inputs": {
"ckpt_name": "model.safetensors"
},
"class_type": "CheckpointLoaderSimple",
"_meta": {
"title": "Load Checkpoint"
}
},
"5": {
"inputs": {
"width": 512,
"height": 512,
"batch_size": 1
},
"class_type": "EmptyLatentImage",
"_meta": {
"title": "Empty Latent Image"
}
},
"6": {
"inputs": {
"text": "Prompt",
"clip": [
"4",
1
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"7": {
"inputs": {
"text": "Negative Prompt",
"clip": [
"4",
1
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"8": {
"inputs": {
"samples": [
"3",
0
],
"vae": [
"4",
2
]
},
"class_type": "VAEDecode",
"_meta": {
"title": "VAE Decode"
}
},
"9": {
"inputs": {
"filename_prefix": "ComfyUI",
"images": [
"8",
0
]
},
"class_type": "SaveImage",
"_meta": {
"title": "Save Image"
}
}
}
"""
def queue_prompt(prompt, client_id, base_url):
print("queue_prompt")
p = {"prompt": prompt, "client_id": client_id}
data = json.dumps(p).encode("utf-8")
req = urllib.request.Request(f"{base_url}/prompt", data=data)
return json.loads(urllib.request.urlopen(req).read())
def get_image(filename, subfolder, folder_type, base_url):
print("get_image")
data = {"filename": filename, "subfolder": subfolder, "type": folder_type}
url_values = urllib.parse.urlencode(data)
with urllib.request.urlopen(f"{base_url}/view?{url_values}") as response:
return response.read()
def get_image_url(filename, subfolder, folder_type, base_url):
print("get_image")
data = {"filename": filename, "subfolder": subfolder, "type": folder_type}
url_values = urllib.parse.urlencode(data)
return f"{base_url}/view?{url_values}"
def get_history(prompt_id, base_url):
print("get_history")
with urllib.request.urlopen(f"{base_url}/history/{prompt_id}") as response:
return json.loads(response.read())
def get_images(ws, prompt, client_id, base_url):
prompt_id = queue_prompt(prompt, client_id, base_url)["prompt_id"]
output_images = []
while True:
out = ws.recv()
if isinstance(out, str):
message = json.loads(out)
if message["type"] == "executing":
data = message["data"]
if data["node"] is None and data["prompt_id"] == prompt_id:
break # Execution is done
else:
continue # previews are binary data
history = get_history(prompt_id, base_url)[prompt_id]
for o in history["outputs"]:
for node_id in history["outputs"]:
node_output = history["outputs"][node_id]
if "images" in node_output:
for image in node_output["images"]:
url = get_image_url(
image["filename"], image["subfolder"], image["type"], base_url
)
output_images.append({"url": url})
return {"data": output_images}
class ImageGenerationPayload(BaseModel):
prompt: str
negative_prompt: Optional[str] = ""
steps: Optional[int] = None
seed: Optional[int] = None
width: int
height: int
n: int = 1
def comfyui_generate_image(
model: str, payload: ImageGenerationPayload, client_id, base_url
):
host = base_url.replace("http://", "").replace("https://", "")
comfyui_prompt = json.loads(COMFYUI_DEFAULT_PROMPT)
comfyui_prompt["4"]["inputs"]["ckpt_name"] = model
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()
ws.connect(f"ws://{host}/ws?clientId={client_id}")
print("WebSocket connection established.")
except Exception as e:
print(f"Failed to connect to WebSocket server: {e}")
return None
try:
images = get_images(ws, comfyui_prompt, client_id, base_url)
except Exception as e:
print(f"Error while receiving images: {e}")
images = None
ws.close()
return images

View file

@ -1,10 +1,27 @@
import logging
from litellm.proxy.proxy_server import ProxyConfig, initialize from litellm.proxy.proxy_server import ProxyConfig, initialize
from litellm.proxy.proxy_server import app from litellm.proxy.proxy_server import app
from fastapi import FastAPI, Request, Depends, status from fastapi import FastAPI, Request, Depends, status, Response
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse
from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint
from starlette.responses import StreamingResponse
import json
from utils.utils import get_http_authorization_cred, get_current_user from utils.utils import get_http_authorization_cred, get_current_user
from config import ENV from config import SRC_LOG_LEVELS, ENV
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["LITELLM"])
from config import (
MODEL_FILTER_ENABLED,
MODEL_FILTER_LIST,
)
proxy_config = ProxyConfig() proxy_config = ProxyConfig()
@ -26,16 +43,58 @@ async def on_startup():
await startup() await startup()
app.state.MODEL_FILTER_ENABLED = MODEL_FILTER_ENABLED
app.state.MODEL_FILTER_LIST = MODEL_FILTER_LIST
@app.middleware("http") @app.middleware("http")
async def auth_middleware(request: Request, call_next): async def auth_middleware(request: Request, call_next):
auth_header = request.headers.get("Authorization", "") auth_header = request.headers.get("Authorization", "")
request.state.user = None
if ENV != "dev": try:
try: user = get_current_user(get_http_authorization_cred(auth_header))
user = get_current_user(get_http_authorization_cred(auth_header)) log.debug(f"user: {user}")
print(user) request.state.user = user
except Exception as e: except Exception as e:
return JSONResponse(status_code=400, content={"detail": str(e)}) return JSONResponse(status_code=400, content={"detail": str(e)})
response = await call_next(request) response = await call_next(request)
return response return response
class ModifyModelsResponseMiddleware(BaseHTTPMiddleware):
async def dispatch(
self, request: Request, call_next: RequestResponseEndpoint
) -> Response:
response = await call_next(request)
user = request.state.user
if "/models" in request.url.path:
if isinstance(response, StreamingResponse):
# Read the content of the streaming response
body = b""
async for chunk in response.body_iterator:
body += chunk
data = json.loads(body.decode("utf-8"))
if app.state.MODEL_FILTER_ENABLED:
if user and user.role == "user":
data["data"] = list(
filter(
lambda model: model["id"]
in app.state.MODEL_FILTER_LIST,
data["data"],
)
)
# Modified Flag
data["modified"] = True
return JSONResponse(content=data)
return response
app.add_middleware(ModifyModelsResponseMiddleware)

View file

@ -1,24 +1,43 @@
from fastapi import FastAPI, Request, Response, HTTPException, Depends, status from fastapi import (
FastAPI,
Request,
Response,
HTTPException,
Depends,
status,
UploadFile,
File,
BackgroundTasks,
)
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import StreamingResponse from fastapi.responses import StreamingResponse
from fastapi.concurrency import run_in_threadpool from fastapi.concurrency import run_in_threadpool
from pydantic import BaseModel, ConfigDict from pydantic import BaseModel, ConfigDict
import os
import copy
import random import random
import requests import requests
import json import json
import uuid import uuid
import aiohttp import aiohttp
import asyncio import asyncio
import logging
from urllib.parse import urlparse
from typing import Optional, List, Union
from apps.web.models.users import Users from apps.web.models.users import Users
from constants import ERROR_MESSAGES from constants import ERROR_MESSAGES
from utils.utils import decode_token, get_current_user, get_admin_user from utils.utils import decode_token, get_current_user, get_admin_user
from config import OLLAMA_BASE_URLS, MODEL_FILTER_ENABLED, MODEL_FILTER_LIST
from typing import Optional, List, Union
from config import SRC_LOG_LEVELS, OLLAMA_BASE_URLS, MODEL_FILTER_ENABLED, MODEL_FILTER_LIST, UPLOAD_DIR
from utils.misc import calculate_sha256
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["OLLAMA"])
app = FastAPI() app = FastAPI()
app.add_middleware( app.add_middleware(
@ -69,7 +88,7 @@ class UrlUpdateForm(BaseModel):
async def update_ollama_api_url(form_data: UrlUpdateForm, user=Depends(get_admin_user)): async def update_ollama_api_url(form_data: UrlUpdateForm, user=Depends(get_admin_user)):
app.state.OLLAMA_BASE_URLS = form_data.urls app.state.OLLAMA_BASE_URLS = form_data.urls
print(app.state.OLLAMA_BASE_URLS) log.info(f"app.state.OLLAMA_BASE_URLS: {app.state.OLLAMA_BASE_URLS}")
return {"OLLAMA_BASE_URLS": app.state.OLLAMA_BASE_URLS} return {"OLLAMA_BASE_URLS": app.state.OLLAMA_BASE_URLS}
@ -90,7 +109,7 @@ async def fetch_url(url):
return await response.json() return await response.json()
except Exception as e: except Exception as e:
# Handle connection error here # Handle connection error here
print(f"Connection error: {e}") log.error(f"Connection error: {e}")
return None return None
@ -114,7 +133,7 @@ def merge_models_lists(model_lists):
async def get_all_models(): async def get_all_models():
print("get_all_models") log.info("get_all_models()")
tasks = [fetch_url(f"{url}/api/tags") for url in app.state.OLLAMA_BASE_URLS] tasks = [fetch_url(f"{url}/api/tags") for url in app.state.OLLAMA_BASE_URLS]
responses = await asyncio.gather(*tasks) responses = await asyncio.gather(*tasks)
@ -155,7 +174,7 @@ async def get_ollama_tags(
return r.json() return r.json()
except Exception as e: except Exception as e:
print(e) log.exception(e)
error_detail = "Open WebUI: Server Connection Error" error_detail = "Open WebUI: Server Connection Error"
if r is not None: if r is not None:
try: try:
@ -201,7 +220,7 @@ async def get_ollama_versions(url_idx: Optional[int] = None):
return r.json() return r.json()
except Exception as e: except Exception as e:
print(e) log.exception(e)
error_detail = "Open WebUI: Server Connection Error" error_detail = "Open WebUI: Server Connection Error"
if r is not None: if r is not None:
try: try:
@ -227,18 +246,33 @@ async def pull_model(
form_data: ModelNameForm, url_idx: int = 0, user=Depends(get_admin_user) form_data: ModelNameForm, url_idx: int = 0, user=Depends(get_admin_user)
): ):
url = app.state.OLLAMA_BASE_URLS[url_idx] url = app.state.OLLAMA_BASE_URLS[url_idx]
print(url) log.info(f"url: {url}")
r = None r = None
def get_request(): def get_request():
nonlocal url nonlocal url
nonlocal r nonlocal r
request_id = str(uuid.uuid4())
try: try:
REQUEST_POOL.append(request_id)
def stream_content(): def stream_content():
for chunk in r.iter_content(chunk_size=8192): try:
yield chunk yield json.dumps({"id": request_id, "done": False}) + "\n"
for chunk in r.iter_content(chunk_size=8192):
if request_id in REQUEST_POOL:
yield chunk
else:
print("User: canceled request")
break
finally:
if hasattr(r, "close"):
r.close()
if request_id in REQUEST_POOL:
REQUEST_POOL.remove(request_id)
r = requests.request( r = requests.request(
method="POST", method="POST",
@ -259,8 +293,9 @@ async def pull_model(
try: try:
return await run_in_threadpool(get_request) return await run_in_threadpool(get_request)
except Exception as e: except Exception as e:
print(e) log.exception(e)
error_detail = "Open WebUI: Server Connection Error" error_detail = "Open WebUI: Server Connection Error"
if r is not None: if r is not None:
try: try:
@ -299,7 +334,7 @@ async def push_model(
) )
url = app.state.OLLAMA_BASE_URLS[url_idx] url = app.state.OLLAMA_BASE_URLS[url_idx]
print(url) log.debug(f"url: {url}")
r = None r = None
@ -331,7 +366,7 @@ async def push_model(
try: try:
return await run_in_threadpool(get_request) return await run_in_threadpool(get_request)
except Exception as e: except Exception as e:
print(e) log.exception(e)
error_detail = "Open WebUI: Server Connection Error" error_detail = "Open WebUI: Server Connection Error"
if r is not None: if r is not None:
try: try:
@ -359,9 +394,9 @@ class CreateModelForm(BaseModel):
async def create_model( async def create_model(
form_data: CreateModelForm, url_idx: int = 0, user=Depends(get_admin_user) form_data: CreateModelForm, url_idx: int = 0, user=Depends(get_admin_user)
): ):
print(form_data) log.debug(f"form_data: {form_data}")
url = app.state.OLLAMA_BASE_URLS[url_idx] url = app.state.OLLAMA_BASE_URLS[url_idx]
print(url) log.info(f"url: {url}")
r = None r = None
@ -383,7 +418,7 @@ async def create_model(
r.raise_for_status() r.raise_for_status()
print(r) log.debug(f"r: {r}")
return StreamingResponse( return StreamingResponse(
stream_content(), stream_content(),
@ -396,7 +431,7 @@ async def create_model(
try: try:
return await run_in_threadpool(get_request) return await run_in_threadpool(get_request)
except Exception as e: except Exception as e:
print(e) log.exception(e)
error_detail = "Open WebUI: Server Connection Error" error_detail = "Open WebUI: Server Connection Error"
if r is not None: if r is not None:
try: try:
@ -434,7 +469,7 @@ async def copy_model(
) )
url = app.state.OLLAMA_BASE_URLS[url_idx] url = app.state.OLLAMA_BASE_URLS[url_idx]
print(url) log.info(f"url: {url}")
try: try:
r = requests.request( r = requests.request(
@ -444,11 +479,11 @@ async def copy_model(
) )
r.raise_for_status() r.raise_for_status()
print(r.text) log.debug(f"r.text: {r.text}")
return True return True
except Exception as e: except Exception as e:
print(e) log.exception(e)
error_detail = "Open WebUI: Server Connection Error" error_detail = "Open WebUI: Server Connection Error"
if r is not None: if r is not None:
try: try:
@ -481,7 +516,7 @@ async def delete_model(
) )
url = app.state.OLLAMA_BASE_URLS[url_idx] url = app.state.OLLAMA_BASE_URLS[url_idx]
print(url) log.info(f"url: {url}")
try: try:
r = requests.request( r = requests.request(
@ -491,11 +526,11 @@ async def delete_model(
) )
r.raise_for_status() r.raise_for_status()
print(r.text) log.debug(f"r.text: {r.text}")
return True return True
except Exception as e: except Exception as e:
print(e) log.exception(e)
error_detail = "Open WebUI: Server Connection Error" error_detail = "Open WebUI: Server Connection Error"
if r is not None: if r is not None:
try: try:
@ -521,7 +556,7 @@ async def show_model_info(form_data: ModelNameForm, user=Depends(get_current_use
url_idx = random.choice(app.state.MODELS[form_data.name]["urls"]) url_idx = random.choice(app.state.MODELS[form_data.name]["urls"])
url = app.state.OLLAMA_BASE_URLS[url_idx] url = app.state.OLLAMA_BASE_URLS[url_idx]
print(url) log.info(f"url: {url}")
try: try:
r = requests.request( r = requests.request(
@ -533,7 +568,7 @@ async def show_model_info(form_data: ModelNameForm, user=Depends(get_current_use
return r.json() return r.json()
except Exception as e: except Exception as e:
print(e) log.exception(e)
error_detail = "Open WebUI: Server Connection Error" error_detail = "Open WebUI: Server Connection Error"
if r is not None: if r is not None:
try: try:
@ -573,7 +608,7 @@ async def generate_embeddings(
) )
url = app.state.OLLAMA_BASE_URLS[url_idx] url = app.state.OLLAMA_BASE_URLS[url_idx]
print(url) log.info(f"url: {url}")
try: try:
r = requests.request( r = requests.request(
@ -585,7 +620,7 @@ async def generate_embeddings(
return r.json() return r.json()
except Exception as e: except Exception as e:
print(e) log.exception(e)
error_detail = "Open WebUI: Server Connection Error" error_detail = "Open WebUI: Server Connection Error"
if r is not None: if r is not None:
try: try:
@ -633,7 +668,7 @@ async def generate_completion(
) )
url = app.state.OLLAMA_BASE_URLS[url_idx] url = app.state.OLLAMA_BASE_URLS[url_idx]
print(url) log.info(f"url: {url}")
r = None r = None
@ -654,7 +689,7 @@ async def generate_completion(
if request_id in REQUEST_POOL: if request_id in REQUEST_POOL:
yield chunk yield chunk
else: else:
print("User: canceled request") log.warning("User: canceled request")
break break
finally: finally:
if hasattr(r, "close"): if hasattr(r, "close"):
@ -709,7 +744,7 @@ class GenerateChatCompletionForm(BaseModel):
format: Optional[str] = None format: Optional[str] = None
options: Optional[dict] = None options: Optional[dict] = None
template: Optional[str] = None template: Optional[str] = None
stream: Optional[bool] = True stream: Optional[bool] = None
keep_alive: Optional[Union[int, str]] = None keep_alive: Optional[Union[int, str]] = None
@ -731,11 +766,11 @@ async def generate_chat_completion(
) )
url = app.state.OLLAMA_BASE_URLS[url_idx] url = app.state.OLLAMA_BASE_URLS[url_idx]
print(url) log.info(f"url: {url}")
r = None r = None
print(form_data.model_dump_json(exclude_none=True).encode()) log.debug("form_data.model_dump_json(exclude_none=True).encode(): {0} ".format(form_data.model_dump_json(exclude_none=True).encode()))
def get_request(): def get_request():
nonlocal form_data nonlocal form_data
@ -754,7 +789,7 @@ async def generate_chat_completion(
if request_id in REQUEST_POOL: if request_id in REQUEST_POOL:
yield chunk yield chunk
else: else:
print("User: canceled request") log.warning("User: canceled request")
break break
finally: finally:
if hasattr(r, "close"): if hasattr(r, "close"):
@ -777,7 +812,7 @@ async def generate_chat_completion(
headers=dict(r.headers), headers=dict(r.headers),
) )
except Exception as e: except Exception as e:
print(e) log.exception(e)
raise e raise e
try: try:
@ -831,7 +866,7 @@ async def generate_openai_chat_completion(
) )
url = app.state.OLLAMA_BASE_URLS[url_idx] url = app.state.OLLAMA_BASE_URLS[url_idx]
print(url) log.info(f"url: {url}")
r = None r = None
@ -854,7 +889,7 @@ async def generate_openai_chat_completion(
if request_id in REQUEST_POOL: if request_id in REQUEST_POOL:
yield chunk yield chunk
else: else:
print("User: canceled request") log.warning("User: canceled request")
break break
finally: finally:
if hasattr(r, "close"): if hasattr(r, "close"):
@ -897,6 +932,211 @@ async def generate_openai_chat_completion(
) )
class UrlForm(BaseModel):
url: str
class UploadBlobForm(BaseModel):
filename: str
def parse_huggingface_url(hf_url):
try:
# Parse the URL
parsed_url = urlparse(hf_url)
# Get the path and split it into components
path_components = parsed_url.path.split("/")
# Extract the desired output
user_repo = "/".join(path_components[1:3])
model_file = path_components[-1]
return model_file
except ValueError:
return None
async def download_file_stream(
ollama_url, file_url, file_path, file_name, chunk_size=1024 * 1024
):
done = False
if os.path.exists(file_path):
current_size = os.path.getsize(file_path)
else:
current_size = 0
headers = {"Range": f"bytes={current_size}-"} if current_size > 0 else {}
timeout = aiohttp.ClientTimeout(total=600) # Set the timeout
async with aiohttp.ClientSession(timeout=timeout) as session:
async with session.get(file_url, headers=headers) as response:
total_size = int(response.headers.get("content-length", 0)) + current_size
with open(file_path, "ab+") as file:
async for data in response.content.iter_chunked(chunk_size):
current_size += len(data)
file.write(data)
done = current_size == total_size
progress = round((current_size / total_size) * 100, 2)
yield f'data: {{"progress": {progress}, "completed": {current_size}, "total": {total_size}}}\n\n'
if done:
file.seek(0)
hashed = calculate_sha256(file)
file.seek(0)
url = f"{ollama_url}/api/blobs/sha256:{hashed}"
response = requests.post(url, data=file)
if response.ok:
res = {
"done": done,
"blob": f"sha256:{hashed}",
"name": file_name,
}
os.remove(file_path)
yield f"data: {json.dumps(res)}\n\n"
else:
raise "Ollama: Could not create blob, Please try again."
# def number_generator():
# for i in range(1, 101):
# yield f"data: {i}\n"
# url = "https://huggingface.co/TheBloke/stablelm-zephyr-3b-GGUF/resolve/main/stablelm-zephyr-3b.Q2_K.gguf"
@app.post("/models/download")
@app.post("/models/download/{url_idx}")
async def download_model(
form_data: UrlForm,
url_idx: Optional[int] = None,
):
if url_idx == None:
url_idx = 0
url = app.state.OLLAMA_BASE_URLS[url_idx]
file_name = parse_huggingface_url(form_data.url)
if file_name:
file_path = f"{UPLOAD_DIR}/{file_name}"
return StreamingResponse(
download_file_stream(url, form_data.url, file_path, file_name),
)
else:
return None
@app.post("/models/upload")
@app.post("/models/upload/{url_idx}")
def upload_model(file: UploadFile = File(...), url_idx: Optional[int] = None):
if url_idx == None:
url_idx = 0
ollama_url = app.state.OLLAMA_BASE_URLS[url_idx]
file_path = f"{UPLOAD_DIR}/{file.filename}"
# Save file in chunks
with open(file_path, "wb+") as f:
for chunk in file.file:
f.write(chunk)
def file_process_stream():
nonlocal ollama_url
total_size = os.path.getsize(file_path)
chunk_size = 1024 * 1024
try:
with open(file_path, "rb") as f:
total = 0
done = False
while not done:
chunk = f.read(chunk_size)
if not chunk:
done = True
continue
total += len(chunk)
progress = round((total / total_size) * 100, 2)
res = {
"progress": progress,
"total": total_size,
"completed": total,
}
yield f"data: {json.dumps(res)}\n\n"
if done:
f.seek(0)
hashed = calculate_sha256(f)
f.seek(0)
url = f"{ollama_url}/api/blobs/sha256:{hashed}"
response = requests.post(url, data=f)
if response.ok:
res = {
"done": done,
"blob": f"sha256:{hashed}",
"name": file.filename,
}
os.remove(file_path)
yield f"data: {json.dumps(res)}\n\n"
else:
raise Exception(
"Ollama: Could not create blob, Please try again."
)
except Exception as e:
res = {"error": str(e)}
yield f"data: {json.dumps(res)}\n\n"
return StreamingResponse(file_process_stream(), media_type="text/event-stream")
# async def upload_model(file: UploadFile = File(), url_idx: Optional[int] = None):
# if url_idx == None:
# url_idx = 0
# url = app.state.OLLAMA_BASE_URLS[url_idx]
# file_location = os.path.join(UPLOAD_DIR, file.filename)
# total_size = file.size
# async def file_upload_generator(file):
# print(file)
# try:
# async with aiofiles.open(file_location, "wb") as f:
# completed_size = 0
# while True:
# chunk = await file.read(1024*1024)
# if not chunk:
# break
# await f.write(chunk)
# completed_size += len(chunk)
# progress = (completed_size / total_size) * 100
# print(progress)
# yield f'data: {json.dumps({"status": "uploading", "percentage": progress, "total": total_size, "completed": completed_size, "done": False})}\n'
# except Exception as e:
# print(e)
# yield f"data: {json.dumps({'status': 'error', 'message': str(e)})}\n"
# finally:
# await file.close()
# print("done")
# yield f'data: {json.dumps({"status": "completed", "percentage": 100, "total": total_size, "completed": completed_size, "done": True})}\n'
# return StreamingResponse(
# file_upload_generator(copy.deepcopy(file)), media_type="text/event-stream"
# )
@app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE"]) @app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE"])
async def deprecated_proxy(path: str, request: Request, user=Depends(get_current_user)): async def deprecated_proxy(path: str, request: Request, user=Depends(get_current_user)):
url = app.state.OLLAMA_BASE_URLS[0] url = app.state.OLLAMA_BASE_URLS[0]
@ -947,7 +1187,7 @@ async def deprecated_proxy(path: str, request: Request, user=Depends(get_current
if request_id in REQUEST_POOL: if request_id in REQUEST_POOL:
yield chunk yield chunk
else: else:
print("User: canceled request") log.warning("User: canceled request")
break break
finally: finally:
if hasattr(r, "close"): if hasattr(r, "close"):

View file

@ -6,6 +6,7 @@ import requests
import aiohttp import aiohttp
import asyncio import asyncio
import json import json
import logging
from pydantic import BaseModel from pydantic import BaseModel
@ -19,6 +20,7 @@ from utils.utils import (
get_admin_user, get_admin_user,
) )
from config import ( from config import (
SRC_LOG_LEVELS,
OPENAI_API_BASE_URLS, OPENAI_API_BASE_URLS,
OPENAI_API_KEYS, OPENAI_API_KEYS,
CACHE_DIR, CACHE_DIR,
@ -31,6 +33,9 @@ from typing import List, Optional
import hashlib import hashlib
from pathlib import Path from pathlib import Path
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["OPENAI"])
app = FastAPI() app = FastAPI()
app.add_middleware( app.add_middleware(
CORSMiddleware, CORSMiddleware,
@ -134,7 +139,7 @@ async def speech(request: Request, user=Depends(get_verified_user)):
return FileResponse(file_path) return FileResponse(file_path)
except Exception as e: except Exception as e:
print(e) log.exception(e)
error_detail = "Open WebUI: Server Connection Error" error_detail = "Open WebUI: Server Connection Error"
if r is not None: if r is not None:
try: try:
@ -160,7 +165,7 @@ async def fetch_url(url, key):
return await response.json() return await response.json()
except Exception as e: except Exception as e:
# Handle connection error here # Handle connection error here
print(f"Connection error: {e}") log.error(f"Connection error: {e}")
return None return None
@ -182,7 +187,7 @@ def merge_models_lists(model_lists):
async def get_all_models(): async def get_all_models():
print("get_all_models") log.info("get_all_models()")
if len(app.state.OPENAI_API_KEYS) == 1 and app.state.OPENAI_API_KEYS[0] == "": if len(app.state.OPENAI_API_KEYS) == 1 and app.state.OPENAI_API_KEYS[0] == "":
models = {"data": []} models = {"data": []}
@ -208,7 +213,7 @@ async def get_all_models():
) )
} }
print(models) log.info(f"models: {models}")
app.state.MODELS = {model["id"]: model for model in models["data"]} app.state.MODELS = {model["id"]: model for model in models["data"]}
return models return models
@ -246,7 +251,7 @@ async def get_models(url_idx: Optional[int] = None, user=Depends(get_current_use
return response_data return response_data
except Exception as e: except Exception as e:
print(e) log.exception(e)
error_detail = "Open WebUI: Server Connection Error" error_detail = "Open WebUI: Server Connection Error"
if r is not None: if r is not None:
try: try:
@ -280,7 +285,7 @@ async def proxy(path: str, request: Request, user=Depends(get_verified_user)):
if body.get("model") == "gpt-4-vision-preview": if body.get("model") == "gpt-4-vision-preview":
if "max_tokens" not in body: if "max_tokens" not in body:
body["max_tokens"] = 4000 body["max_tokens"] = 4000
print("Modified body_dict:", body) log.debug("Modified body_dict:", body)
# Fix for ChatGPT calls failing because the num_ctx key is in body # Fix for ChatGPT calls failing because the num_ctx key is in body
if "num_ctx" in body: if "num_ctx" in body:
@ -292,7 +297,7 @@ async def proxy(path: str, request: Request, user=Depends(get_verified_user)):
# Convert the modified body back to JSON # Convert the modified body back to JSON
body = json.dumps(body) body = json.dumps(body)
except json.JSONDecodeError as e: except json.JSONDecodeError as e:
print("Error loading request body into a dictionary:", e) log.error("Error loading request body into a dictionary:", e)
url = app.state.OPENAI_API_BASE_URLS[idx] url = app.state.OPENAI_API_BASE_URLS[idx]
key = app.state.OPENAI_API_KEYS[idx] key = app.state.OPENAI_API_KEYS[idx]
@ -330,7 +335,7 @@ async def proxy(path: str, request: Request, user=Depends(get_verified_user)):
response_data = r.json() response_data = r.json()
return response_data return response_data
except Exception as e: except Exception as e:
print(e) log.exception(e)
error_detail = "Open WebUI: Server Connection Error" error_detail = "Open WebUI: Server Connection Error"
if r is not None: if r is not None:
try: try:

View file

@ -8,7 +8,7 @@ from fastapi import (
Form, Form,
) )
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
import os, shutil import os, shutil, logging
from pathlib import Path from pathlib import Path
from typing import List from typing import List
@ -54,6 +54,7 @@ from utils.misc import (
) )
from utils.utils import get_current_user, get_admin_user from utils.utils import get_current_user, get_admin_user
from config import ( from config import (
SRC_LOG_LEVELS,
UPLOAD_DIR, UPLOAD_DIR,
DOCS_DIR, DOCS_DIR,
RAG_EMBEDDING_MODEL, RAG_EMBEDDING_MODEL,
@ -66,6 +67,9 @@ from config import (
from constants import ERROR_MESSAGES from constants import ERROR_MESSAGES
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["RAG"])
# #
# if RAG_EMBEDDING_MODEL: # if RAG_EMBEDDING_MODEL:
# sentence_transformer_ef = SentenceTransformer( # sentence_transformer_ef = SentenceTransformer(
@ -110,40 +114,6 @@ class CollectionNameForm(BaseModel):
class StoreWebForm(CollectionNameForm): class StoreWebForm(CollectionNameForm):
url: str url: str
def store_data_in_vector_db(data, collection_name, overwrite: bool = False) -> bool:
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=app.state.CHUNK_SIZE, chunk_overlap=app.state.CHUNK_OVERLAP
)
docs = text_splitter.split_documents(data)
texts = [doc.page_content for doc in docs]
metadatas = [doc.metadata for doc in docs]
try:
if overwrite:
for collection in CHROMA_CLIENT.list_collections():
if collection_name == collection.name:
print(f"deleting existing collection {collection_name}")
CHROMA_CLIENT.delete_collection(name=collection_name)
collection = CHROMA_CLIENT.create_collection(
name=collection_name,
embedding_function=app.state.sentence_transformer_ef,
)
collection.add(
documents=texts, metadatas=metadatas, ids=[str(uuid.uuid1()) for _ in texts]
)
return True
except Exception as e:
print(e)
if e.__class__.__name__ == "UniqueConstraintError":
return True
return False
@app.get("/") @app.get("/")
async def get_status(): async def get_status():
return { return {
@ -274,7 +244,7 @@ def query_doc_handler(
embedding_function=app.state.sentence_transformer_ef, embedding_function=app.state.sentence_transformer_ef,
) )
except Exception as e: except Exception as e:
print(e) log.exception(e)
raise HTTPException( raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, status_code=status.HTTP_400_BAD_REQUEST,
detail=ERROR_MESSAGES.DEFAULT(e), detail=ERROR_MESSAGES.DEFAULT(e),
@ -318,13 +288,63 @@ def store_web(form_data: StoreWebForm, user=Depends(get_current_user)):
"filename": form_data.url, "filename": form_data.url,
} }
except Exception as e: except Exception as e:
print(e) log.exception(e)
raise HTTPException( raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, status_code=status.HTTP_400_BAD_REQUEST,
detail=ERROR_MESSAGES.DEFAULT(e), detail=ERROR_MESSAGES.DEFAULT(e),
) )
def store_data_in_vector_db(data, collection_name, overwrite: bool = False) -> bool:
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=app.state.CHUNK_SIZE,
chunk_overlap=app.state.CHUNK_OVERLAP,
add_start_index=True,
)
docs = text_splitter.split_documents(data)
return store_docs_in_vector_db(docs, collection_name, overwrite)
def store_text_in_vector_db(
text, metadata, collection_name, overwrite: bool = False
) -> bool:
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=app.state.CHUNK_SIZE,
chunk_overlap=app.state.CHUNK_OVERLAP,
add_start_index=True,
)
docs = text_splitter.create_documents([text], metadatas=[metadata])
return store_docs_in_vector_db(docs, collection_name, overwrite)
def store_docs_in_vector_db(docs, collection_name, overwrite: bool = False) -> bool:
texts = [doc.page_content for doc in docs]
metadatas = [doc.metadata for doc in docs]
try:
if overwrite:
for collection in CHROMA_CLIENT.list_collections():
if collection_name == collection.name:
print(f"deleting existing collection {collection_name}")
CHROMA_CLIENT.delete_collection(name=collection_name)
collection = CHROMA_CLIENT.create_collection(
name=collection_name,
embedding_function=app.state.sentence_transformer_ef,
)
collection.add(
documents=texts, metadatas=metadatas, ids=[str(uuid.uuid1()) for _ in texts]
)
return True
except Exception as e:
print(e)
if e.__class__.__name__ == "UniqueConstraintError":
return True
return False
def get_loader(filename: str, file_content_type: str, file_path: str): def get_loader(filename: str, file_content_type: str, file_path: str):
file_ext = filename.split(".")[-1].lower() file_ext = filename.split(".")[-1].lower()
known_type = True known_type = True
@ -416,7 +436,7 @@ def store_doc(
): ):
# "https://www.gutenberg.org/files/1727/1727-h/1727-h.htm" # "https://www.gutenberg.org/files/1727/1727-h/1727-h.htm"
print(file.content_type) log.info(f"file.content_type: {file.content_type}")
try: try:
filename = file.filename filename = file.filename
file_path = f"{UPLOAD_DIR}/{filename}" file_path = f"{UPLOAD_DIR}/{filename}"
@ -447,7 +467,7 @@ def store_doc(
detail=ERROR_MESSAGES.DEFAULT(), detail=ERROR_MESSAGES.DEFAULT(),
) )
except Exception as e: except Exception as e:
print(e) log.exception(e)
if "No pandoc was found" in str(e): if "No pandoc was found" in str(e):
raise HTTPException( raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, status_code=status.HTTP_400_BAD_REQUEST,
@ -460,6 +480,37 @@ def store_doc(
) )
class TextRAGForm(BaseModel):
name: str
content: str
collection_name: Optional[str] = None
@app.post("/text")
def store_text(
form_data: TextRAGForm,
user=Depends(get_current_user),
):
collection_name = form_data.collection_name
if collection_name == None:
collection_name = calculate_sha256_string(form_data.content)
result = store_text_in_vector_db(
form_data.content,
metadata={"name": form_data.name, "created_by": user.id},
collection_name=collection_name,
)
if result:
return {"status": True, "collection_name": collection_name}
else:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=ERROR_MESSAGES.DEFAULT(),
)
@app.get("/scan") @app.get("/scan")
def scan_docs_dir(user=Depends(get_admin_user)): def scan_docs_dir(user=Depends(get_admin_user)):
for path in Path(DOCS_DIR).rglob("./**/*"): for path in Path(DOCS_DIR).rglob("./**/*"):
@ -512,7 +563,7 @@ def scan_docs_dir(user=Depends(get_admin_user)):
) )
except Exception as e: except Exception as e:
print(e) log.exception(e)
return True return True
@ -533,11 +584,11 @@ def reset(user=Depends(get_admin_user)) -> bool:
elif os.path.isdir(file_path): elif os.path.isdir(file_path):
shutil.rmtree(file_path) shutil.rmtree(file_path)
except Exception as e: except Exception as e:
print("Failed to delete %s. Reason: %s" % (file_path, e)) log.error("Failed to delete %s. Reason: %s" % (file_path, e))
try: try:
CHROMA_CLIENT.reset() CHROMA_CLIENT.reset()
except Exception as e: except Exception as e:
print(e) log.exception(e)
return True return True

View file

@ -1,7 +1,11 @@
import re import re
import logging
from typing import List from typing import List
from config import CHROMA_CLIENT from config import SRC_LOG_LEVELS, CHROMA_CLIENT
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["RAG"])
def query_doc(collection_name: str, query: str, k: int, embedding_function): def query_doc(collection_name: str, query: str, k: int, embedding_function):
@ -97,7 +101,7 @@ def rag_template(template: str, context: str, query: str):
def rag_messages(docs, messages, template, k, embedding_function): def rag_messages(docs, messages, template, k, embedding_function):
print(docs) log.debug(f"docs: {docs}")
last_user_message_idx = None last_user_message_idx = None
for i in range(len(messages) - 1, -1, -1): for i in range(len(messages) - 1, -1, -1):
@ -137,6 +141,8 @@ def rag_messages(docs, messages, template, k, embedding_function):
k=k, k=k,
embedding_function=embedding_function, embedding_function=embedding_function,
) )
elif doc["type"] == "text":
context = doc["content"]
else: else:
context = query_doc( context = query_doc(
collection_name=doc["collection_name"], collection_name=doc["collection_name"],
@ -145,7 +151,7 @@ def rag_messages(docs, messages, template, k, embedding_function):
embedding_function=embedding_function, embedding_function=embedding_function,
) )
except Exception as e: except Exception as e:
print(e) log.exception(e)
context = None context = None
relevant_contexts.append(context) relevant_contexts.append(context)

View file

@ -1,13 +1,16 @@
from peewee import * from peewee import *
from config import DATA_DIR from config import SRC_LOG_LEVELS, DATA_DIR
import os import os
import logging
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["DB"])
# Check if the file exists # Check if the file exists
if os.path.exists(f"{DATA_DIR}/ollama.db"): if os.path.exists(f"{DATA_DIR}/ollama.db"):
# Rename the file # Rename the file
os.rename(f"{DATA_DIR}/ollama.db", f"{DATA_DIR}/webui.db") os.rename(f"{DATA_DIR}/ollama.db", f"{DATA_DIR}/webui.db")
print("File renamed successfully.") log.info("File renamed successfully.")
else: else:
pass pass

View file

@ -19,6 +19,7 @@ from config import (
DEFAULT_USER_ROLE, DEFAULT_USER_ROLE,
ENABLE_SIGNUP, ENABLE_SIGNUP,
USER_PERMISSIONS, USER_PERMISSIONS,
WEBHOOK_URL,
) )
app = FastAPI() app = FastAPI()
@ -32,6 +33,7 @@ app.state.DEFAULT_MODELS = DEFAULT_MODELS
app.state.DEFAULT_PROMPT_SUGGESTIONS = DEFAULT_PROMPT_SUGGESTIONS app.state.DEFAULT_PROMPT_SUGGESTIONS = DEFAULT_PROMPT_SUGGESTIONS
app.state.DEFAULT_USER_ROLE = DEFAULT_USER_ROLE app.state.DEFAULT_USER_ROLE = DEFAULT_USER_ROLE
app.state.USER_PERMISSIONS = USER_PERMISSIONS app.state.USER_PERMISSIONS = USER_PERMISSIONS
app.state.WEBHOOK_URL = WEBHOOK_URL
app.add_middleware( app.add_middleware(

View file

@ -2,6 +2,7 @@ from pydantic import BaseModel
from typing import List, Union, Optional from typing import List, Union, Optional
import time import time
import uuid import uuid
import logging
from peewee import * from peewee import *
from apps.web.models.users import UserModel, Users from apps.web.models.users import UserModel, Users
@ -9,6 +10,10 @@ from utils.utils import verify_password
from apps.web.internal.db import DB from apps.web.internal.db import DB
from config import SRC_LOG_LEVELS
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["MODELS"])
#################### ####################
# DB MODEL # DB MODEL
#################### ####################
@ -86,7 +91,7 @@ class AuthsTable:
def insert_new_auth( def insert_new_auth(
self, email: str, password: str, name: str, role: str = "pending" self, email: str, password: str, name: str, role: str = "pending"
) -> Optional[UserModel]: ) -> Optional[UserModel]:
print("insert_new_auth") log.info("insert_new_auth")
id = str(uuid.uuid4()) id = str(uuid.uuid4())
@ -103,7 +108,7 @@ class AuthsTable:
return None return None
def authenticate_user(self, email: str, password: str) -> Optional[UserModel]: def authenticate_user(self, email: str, password: str) -> Optional[UserModel]:
print("authenticate_user", email) log.info(f"authenticate_user: {email}")
try: try:
auth = Auth.get(Auth.email == email, Auth.active == True) auth = Auth.get(Auth.email == email, Auth.active == True)
if auth: if auth:

View file

@ -95,20 +95,6 @@ class ChatTable:
except: except:
return None return None
def update_chat_by_id(self, id: str, chat: dict) -> Optional[ChatModel]:
try:
query = Chat.update(
chat=json.dumps(chat),
title=chat["title"] if "title" in chat else "New Chat",
timestamp=int(time.time()),
).where(Chat.id == id)
query.execute()
chat = Chat.get(Chat.id == id)
return ChatModel(**model_to_dict(chat))
except:
return None
def get_chat_lists_by_user_id( def get_chat_lists_by_user_id(
self, user_id: str, skip: int = 0, limit: int = 50 self, user_id: str, skip: int = 0, limit: int = 50
) -> List[ChatModel]: ) -> List[ChatModel]:

View file

@ -3,6 +3,7 @@ from peewee import *
from playhouse.shortcuts import model_to_dict from playhouse.shortcuts import model_to_dict
from typing import List, Union, Optional from typing import List, Union, Optional
import time import time
import logging
from utils.utils import decode_token from utils.utils import decode_token
from utils.misc import get_gravatar_url from utils.misc import get_gravatar_url
@ -11,6 +12,10 @@ from apps.web.internal.db import DB
import json import json
from config import SRC_LOG_LEVELS
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["MODELS"])
#################### ####################
# Documents DB Schema # Documents DB Schema
#################### ####################
@ -118,7 +123,7 @@ class DocumentsTable:
doc = Document.get(Document.name == form_data.name) doc = Document.get(Document.name == form_data.name)
return DocumentModel(**model_to_dict(doc)) return DocumentModel(**model_to_dict(doc))
except Exception as e: except Exception as e:
print(e) log.exception(e)
return None return None
def update_doc_content_by_name( def update_doc_content_by_name(
@ -138,7 +143,7 @@ class DocumentsTable:
doc = Document.get(Document.name == name) doc = Document.get(Document.name == name)
return DocumentModel(**model_to_dict(doc)) return DocumentModel(**model_to_dict(doc))
except Exception as e: except Exception as e:
print(e) log.exception(e)
return None return None
def delete_doc_by_name(self, name: str) -> bool: def delete_doc_by_name(self, name: str) -> bool:

View file

@ -6,9 +6,14 @@ from playhouse.shortcuts import model_to_dict
import json import json
import uuid import uuid
import time import time
import logging
from apps.web.internal.db import DB from apps.web.internal.db import DB
from config import SRC_LOG_LEVELS
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["MODELS"])
#################### ####################
# Tag DB Schema # Tag DB Schema
#################### ####################
@ -173,7 +178,7 @@ class TagTable:
(ChatIdTag.tag_name == tag_name) & (ChatIdTag.user_id == user_id) (ChatIdTag.tag_name == tag_name) & (ChatIdTag.user_id == user_id)
) )
res = query.execute() # Remove the rows, return number of rows removed. res = query.execute() # Remove the rows, return number of rows removed.
print(res) log.debug(f"res: {res}")
tag_count = self.count_chat_ids_by_tag_name_and_user_id(tag_name, user_id) tag_count = self.count_chat_ids_by_tag_name_and_user_id(tag_name, user_id)
if tag_count == 0: if tag_count == 0:
@ -185,7 +190,7 @@ class TagTable:
return True return True
except Exception as e: except Exception as e:
print("delete_tag", e) log.error(f"delete_tag: {e}")
return False return False
def delete_tag_by_tag_name_and_chat_id_and_user_id( def delete_tag_by_tag_name_and_chat_id_and_user_id(
@ -198,7 +203,7 @@ class TagTable:
& (ChatIdTag.user_id == user_id) & (ChatIdTag.user_id == user_id)
) )
res = query.execute() # Remove the rows, return number of rows removed. res = query.execute() # Remove the rows, return number of rows removed.
print(res) log.debug(f"res: {res}")
tag_count = self.count_chat_ids_by_tag_name_and_user_id(tag_name, user_id) tag_count = self.count_chat_ids_by_tag_name_and_user_id(tag_name, user_id)
if tag_count == 0: if tag_count == 0:
@ -210,7 +215,7 @@ class TagTable:
return True return True
except Exception as e: except Exception as e:
print("delete_tag", e) log.error(f"delete_tag: {e}")
return False return False
def delete_tags_by_chat_id_and_user_id(self, chat_id: str, user_id: str) -> bool: def delete_tags_by_chat_id_and_user_id(self, chat_id: str, user_id: str) -> bool:

View file

@ -27,7 +27,8 @@ from utils.utils import (
create_token, create_token,
) )
from utils.misc import parse_duration, validate_email_format from utils.misc import parse_duration, validate_email_format
from constants import ERROR_MESSAGES from utils.webhook import post_webhook
from constants import ERROR_MESSAGES, WEBHOOK_MESSAGES
router = APIRouter() router = APIRouter()
@ -155,6 +156,17 @@ async def signup(request: Request, form_data: SignupForm):
) )
# response.set_cookie(key='token', value=token, httponly=True) # response.set_cookie(key='token', value=token, httponly=True)
if request.app.state.WEBHOOK_URL:
post_webhook(
request.app.state.WEBHOOK_URL,
WEBHOOK_MESSAGES.USER_SIGNUP(user.name),
{
"action": "signup",
"message": WEBHOOK_MESSAGES.USER_SIGNUP(user.name),
"user": user.model_dump_json(exclude_none=True),
},
)
return { return {
"token": token, "token": token,
"token_type": "Bearer", "token_type": "Bearer",

View file

@ -5,6 +5,7 @@ from utils.utils import get_current_user, get_admin_user
from fastapi import APIRouter from fastapi import APIRouter
from pydantic import BaseModel from pydantic import BaseModel
import json import json
import logging
from apps.web.models.users import Users from apps.web.models.users import Users
from apps.web.models.chats import ( from apps.web.models.chats import (
@ -27,6 +28,10 @@ from apps.web.models.tags import (
from constants import ERROR_MESSAGES from constants import ERROR_MESSAGES
from config import SRC_LOG_LEVELS
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["MODELS"])
router = APIRouter() router = APIRouter()
############################ ############################
@ -78,7 +83,7 @@ async def create_new_chat(form_data: ChatForm, user=Depends(get_current_user)):
chat = Chats.insert_new_chat(user.id, form_data) chat = Chats.insert_new_chat(user.id, form_data)
return ChatResponse(**{**chat.model_dump(), "chat": json.loads(chat.chat)}) return ChatResponse(**{**chat.model_dump(), "chat": json.loads(chat.chat)})
except Exception as e: except Exception as e:
print(e) log.exception(e)
raise HTTPException( raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT() status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT()
) )
@ -95,7 +100,7 @@ async def get_all_tags(user=Depends(get_current_user)):
tags = Tags.get_tags_by_user_id(user.id) tags = Tags.get_tags_by_user_id(user.id)
return tags return tags
except Exception as e: except Exception as e:
print(e) log.exception(e)
raise HTTPException( raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT() status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT()
) )

View file

@ -7,6 +7,7 @@ from fastapi import APIRouter
from pydantic import BaseModel from pydantic import BaseModel
import time import time
import uuid import uuid
import logging
from apps.web.models.users import UserModel, UserUpdateForm, UserRoleUpdateForm, Users from apps.web.models.users import UserModel, UserUpdateForm, UserRoleUpdateForm, Users
from apps.web.models.auths import Auths from apps.web.models.auths import Auths
@ -14,6 +15,10 @@ from apps.web.models.auths import Auths
from utils.utils import get_current_user, get_password_hash, get_admin_user from utils.utils import get_current_user, get_password_hash, get_admin_user
from constants import ERROR_MESSAGES from constants import ERROR_MESSAGES
from config import SRC_LOG_LEVELS
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["MODELS"])
router = APIRouter() router = APIRouter()
############################ ############################
@ -83,7 +88,7 @@ async def update_user_by_id(
if form_data.password: if form_data.password:
hashed = get_password_hash(form_data.password) hashed = get_password_hash(form_data.password)
print(hashed) log.debug(f"hashed: {hashed}")
Auths.update_user_password_by_id(user_id, hashed) Auths.update_user_password_by_id(user_id, hashed)
Auths.update_email_by_id(user_id, form_data.email.lower()) Auths.update_email_by_id(user_id, form_data.email.lower())

View file

@ -21,155 +21,6 @@ from constants import ERROR_MESSAGES
router = APIRouter() router = APIRouter()
class UploadBlobForm(BaseModel):
filename: str
from urllib.parse import urlparse
def parse_huggingface_url(hf_url):
try:
# Parse the URL
parsed_url = urlparse(hf_url)
# Get the path and split it into components
path_components = parsed_url.path.split("/")
# Extract the desired output
user_repo = "/".join(path_components[1:3])
model_file = path_components[-1]
return model_file
except ValueError:
return None
async def download_file_stream(url, file_path, file_name, chunk_size=1024 * 1024):
done = False
if os.path.exists(file_path):
current_size = os.path.getsize(file_path)
else:
current_size = 0
headers = {"Range": f"bytes={current_size}-"} if current_size > 0 else {}
timeout = aiohttp.ClientTimeout(total=600) # Set the timeout
async with aiohttp.ClientSession(timeout=timeout) as session:
async with session.get(url, headers=headers) as response:
total_size = int(response.headers.get("content-length", 0)) + current_size
with open(file_path, "ab+") as file:
async for data in response.content.iter_chunked(chunk_size):
current_size += len(data)
file.write(data)
done = current_size == total_size
progress = round((current_size / total_size) * 100, 2)
yield f'data: {{"progress": {progress}, "completed": {current_size}, "total": {total_size}}}\n\n'
if done:
file.seek(0)
hashed = calculate_sha256(file)
file.seek(0)
url = f"{OLLAMA_BASE_URLS[0]}/api/blobs/sha256:{hashed}"
response = requests.post(url, data=file)
if response.ok:
res = {
"done": done,
"blob": f"sha256:{hashed}",
"name": file_name,
}
os.remove(file_path)
yield f"data: {json.dumps(res)}\n\n"
else:
raise "Ollama: Could not create blob, Please try again."
@router.get("/download")
async def download(
url: str,
):
# url = "https://huggingface.co/TheBloke/stablelm-zephyr-3b-GGUF/resolve/main/stablelm-zephyr-3b.Q2_K.gguf"
file_name = parse_huggingface_url(url)
if file_name:
file_path = f"{UPLOAD_DIR}/{file_name}"
return StreamingResponse(
download_file_stream(url, file_path, file_name),
media_type="text/event-stream",
)
else:
return None
@router.post("/upload")
def upload(file: UploadFile = File(...)):
file_path = f"{UPLOAD_DIR}/{file.filename}"
# Save file in chunks
with open(file_path, "wb+") as f:
for chunk in file.file:
f.write(chunk)
def file_process_stream():
total_size = os.path.getsize(file_path)
chunk_size = 1024 * 1024
try:
with open(file_path, "rb") as f:
total = 0
done = False
while not done:
chunk = f.read(chunk_size)
if not chunk:
done = True
continue
total += len(chunk)
progress = round((total / total_size) * 100, 2)
res = {
"progress": progress,
"total": total_size,
"completed": total,
}
yield f"data: {json.dumps(res)}\n\n"
if done:
f.seek(0)
hashed = calculate_sha256(f)
f.seek(0)
url = f"{OLLAMA_BASE_URLS[0]}/blobs/sha256:{hashed}"
response = requests.post(url, data=f)
if response.ok:
res = {
"done": done,
"blob": f"sha256:{hashed}",
"name": file.filename,
}
os.remove(file_path)
yield f"data: {json.dumps(res)}\n\n"
else:
raise Exception(
"Ollama: Could not create blob, Please try again."
)
except Exception as e:
res = {"error": str(e)}
yield f"data: {json.dumps(res)}\n\n"
return StreamingResponse(file_process_stream(), media_type="text/event-stream")
@router.get("/gravatar") @router.get("/gravatar")
async def get_gravatar( async def get_gravatar(
email: str, email: str,

View file

@ -1,4 +1,6 @@
import os import os
import sys
import logging
import chromadb import chromadb
from chromadb import Settings from chromadb import Settings
from base64 import b64encode from base64 import b64encode
@ -21,7 +23,7 @@ try:
load_dotenv(find_dotenv("../.env")) load_dotenv(find_dotenv("../.env"))
except ImportError: except ImportError:
print("dotenv not installed, skipping...") log.warning("dotenv not installed, skipping...")
WEBUI_NAME = "Aura" WEBUI_NAME = "Aura"
shutil.copyfile("../build/favicon.png", "./static/favicon.png") shutil.copyfile("../build/favicon.png", "./static/favicon.png")
@ -100,6 +102,34 @@ for version in soup.find_all("h2"):
CHANGELOG = changelog_json CHANGELOG = changelog_json
####################################
# LOGGING
####################################
log_levels = ["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"]
GLOBAL_LOG_LEVEL = os.environ.get("GLOBAL_LOG_LEVEL", "").upper()
if GLOBAL_LOG_LEVEL in log_levels:
logging.basicConfig(stream=sys.stdout, level=GLOBAL_LOG_LEVEL, force=True)
else:
GLOBAL_LOG_LEVEL = "INFO"
log = logging.getLogger(__name__)
log.info(f"GLOBAL_LOG_LEVEL: {GLOBAL_LOG_LEVEL}")
log_sources = ["AUDIO", "CONFIG", "DB", "IMAGES", "LITELLM", "MAIN", "MODELS", "OLLAMA", "OPENAI", "RAG"]
SRC_LOG_LEVELS = {}
for source in log_sources:
log_env_var = source + "_LOG_LEVEL"
SRC_LOG_LEVELS[source] = os.environ.get(log_env_var, "").upper()
if SRC_LOG_LEVELS[source] not in log_levels:
SRC_LOG_LEVELS[source] = GLOBAL_LOG_LEVEL
log.info(f"{log_env_var}: {SRC_LOG_LEVELS[source]}")
log.setLevel(SRC_LOG_LEVELS["CONFIG"])
#################################### ####################################
# CUSTOM_NAME # CUSTOM_NAME
#################################### ####################################
@ -125,7 +155,7 @@ if CUSTOM_NAME:
WEBUI_NAME = data["name"] WEBUI_NAME = data["name"]
except Exception as e: except Exception as e:
print(e) log.exception(e)
pass pass
@ -194,9 +224,9 @@ def create_config_file(file_path):
LITELLM_CONFIG_PATH = f"{DATA_DIR}/litellm/config.yaml" LITELLM_CONFIG_PATH = f"{DATA_DIR}/litellm/config.yaml"
if not os.path.exists(LITELLM_CONFIG_PATH): if not os.path.exists(LITELLM_CONFIG_PATH):
print("Config file doesn't exist. Creating...") log.info("Config file doesn't exist. Creating...")
create_config_file(LITELLM_CONFIG_PATH) create_config_file(LITELLM_CONFIG_PATH)
print("Config file created successfully.") log.info("Config file created successfully.")
#################################### ####################################
@ -290,13 +320,19 @@ DEFAULT_PROMPT_SUGGESTIONS = (
DEFAULT_USER_ROLE = os.getenv("DEFAULT_USER_ROLE", "pending") DEFAULT_USER_ROLE = os.getenv("DEFAULT_USER_ROLE", "pending")
USER_PERMISSIONS = {"chat": {"deletion": True}}
USER_PERMISSIONS_CHAT_DELETION = (
os.environ.get("USER_PERMISSIONS_CHAT_DELETION", "True").lower() == "true"
)
USER_PERMISSIONS = {"chat": {"deletion": USER_PERMISSIONS_CHAT_DELETION}}
MODEL_FILTER_ENABLED = os.environ.get("MODEL_FILTER_ENABLED", False) MODEL_FILTER_ENABLED = os.environ.get("MODEL_FILTER_ENABLED", "False").lower() == "true"
MODEL_FILTER_LIST = os.environ.get("MODEL_FILTER_LIST", "") MODEL_FILTER_LIST = os.environ.get("MODEL_FILTER_LIST", "")
MODEL_FILTER_LIST = [model.strip() for model in MODEL_FILTER_LIST.split(";")] MODEL_FILTER_LIST = [model.strip() for model in MODEL_FILTER_LIST.split(";")]
WEBHOOK_URL = os.environ.get("WEBHOOK_URL", "")
#################################### ####################################
# WEBUI_VERSION # WEBUI_VERSION
@ -370,3 +406,4 @@ WHISPER_MODEL_DIR = os.getenv("WHISPER_MODEL_DIR", f"{CACHE_DIR}/whisper/models"
#################################### ####################################
AUTOMATIC1111_BASE_URL = os.getenv("AUTOMATIC1111_BASE_URL", "") AUTOMATIC1111_BASE_URL = os.getenv("AUTOMATIC1111_BASE_URL", "")
COMFYUI_BASE_URL = os.getenv("COMFYUI_BASE_URL", "")

View file

@ -5,6 +5,13 @@ class MESSAGES(str, Enum):
DEFAULT = lambda msg="": f"{msg if msg else ''}" DEFAULT = lambda msg="": f"{msg if msg else ''}"
class WEBHOOK_MESSAGES(str, Enum):
DEFAULT = lambda msg="": f"{msg if msg else ''}"
USER_SIGNUP = lambda username="": (
f"New user signed up: {username}" if username else "New user signed up"
)
class ERROR_MESSAGES(str, Enum): class ERROR_MESSAGES(str, Enum):
def __str__(self) -> str: def __str__(self) -> str:
return super().__str__() return super().__str__()
@ -46,7 +53,7 @@ class ERROR_MESSAGES(str, Enum):
PANDOC_NOT_INSTALLED = "Pandoc is not installed on the server. Please contact your administrator for assistance." PANDOC_NOT_INSTALLED = "Pandoc is not installed on the server. Please contact your administrator for assistance."
INCORRECT_FORMAT = ( INCORRECT_FORMAT = (
lambda err="": f"Invalid format. Please use the correct format{err if err else ''}" lambda err="": f"Invalid format. Please use the correct format{err}"
) )
RATE_LIMIT_EXCEEDED = "API rate limit exceeded" RATE_LIMIT_EXCEEDED = "API rate limit exceeded"

View file

@ -1,5 +1,5 @@
{ {
"version": "0.0.1", "version": 0,
"ui": { "ui": {
"prompt_suggestions": [ "prompt_suggestions": [
{ {

View file

@ -4,6 +4,7 @@ import markdown
import time import time
import os import os
import sys import sys
import logging
import requests import requests
from fastapi import FastAPI, Request, Depends, status from fastapi import FastAPI, Request, Depends, status
@ -38,9 +39,15 @@ from config import (
FRONTEND_BUILD_DIR, FRONTEND_BUILD_DIR,
MODEL_FILTER_ENABLED, MODEL_FILTER_ENABLED,
MODEL_FILTER_LIST, MODEL_FILTER_LIST,
GLOBAL_LOG_LEVEL,
SRC_LOG_LEVELS,
WEBHOOK_URL,
) )
from constants import ERROR_MESSAGES from constants import ERROR_MESSAGES
logging.basicConfig(stream=sys.stdout, level=GLOBAL_LOG_LEVEL)
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["MAIN"])
class SPAStaticFiles(StaticFiles): class SPAStaticFiles(StaticFiles):
async def get_response(self, path: str, scope): async def get_response(self, path: str, scope):
@ -58,6 +65,9 @@ app = FastAPI(docs_url="/docs" if ENV == "dev" else None, redoc_url=None)
app.state.MODEL_FILTER_ENABLED = MODEL_FILTER_ENABLED app.state.MODEL_FILTER_ENABLED = MODEL_FILTER_ENABLED
app.state.MODEL_FILTER_LIST = MODEL_FILTER_LIST app.state.MODEL_FILTER_LIST = MODEL_FILTER_LIST
app.state.WEBHOOK_URL = WEBHOOK_URL
origins = ["*"] origins = ["*"]
@ -66,7 +76,7 @@ class RAGMiddleware(BaseHTTPMiddleware):
if request.method == "POST" and ( if request.method == "POST" and (
"/api/chat" in request.url.path or "/chat/completions" in request.url.path "/api/chat" in request.url.path or "/chat/completions" in request.url.path
): ):
print(request.url.path) log.debug(f"request.url.path: {request.url.path}")
# Read the original request body # Read the original request body
body = await request.body() body = await request.body()
@ -89,7 +99,7 @@ class RAGMiddleware(BaseHTTPMiddleware):
) )
del data["docs"] del data["docs"]
print(data["messages"]) log.debug(f"data['messages']: {data['messages']}")
modified_body_bytes = json.dumps(data).encode("utf-8") modified_body_bytes = json.dumps(data).encode("utf-8")
@ -178,7 +188,7 @@ class ModelFilterConfigForm(BaseModel):
@app.post("/api/config/model/filter") @app.post("/api/config/model/filter")
async def get_model_filter_config( async def update_model_filter_config(
form_data: ModelFilterConfigForm, user=Depends(get_admin_user) form_data: ModelFilterConfigForm, user=Depends(get_admin_user)
): ):
@ -197,6 +207,28 @@ async def get_model_filter_config(
} }
@app.get("/api/webhook")
async def get_webhook_url(user=Depends(get_admin_user)):
return {
"url": app.state.WEBHOOK_URL,
}
class UrlForm(BaseModel):
url: str
@app.post("/api/webhook")
async def update_webhook_url(form_data: UrlForm, user=Depends(get_admin_user)):
app.state.WEBHOOK_URL = form_data.url
webui_app.state.WEBHOOK_URL = app.state.WEBHOOK_URL
return {
"url": app.state.WEBHOOK_URL,
}
@app.get("/api/version") @app.get("/api/version")
async def get_app_config(): async def get_app_config():

View file

@ -45,3 +45,4 @@ PyJWT
pyjwt[crypto] pyjwt[crypto]
black black
langfuse

20
backend/utils/webhook.py Normal file
View file

@ -0,0 +1,20 @@
import requests
def post_webhook(url: str, message: str, event_data: dict) -> bool:
try:
payload = {}
if "https://hooks.slack.com" in url:
payload["text"] = message
elif "https://discord.com/api/webhooks" in url:
payload["content"] = message
else:
payload = {**event_data}
r = requests.post(url, json=payload)
r.raise_for_status()
return True
except Exception as e:
print(e)
return False

6351
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
{ {
"name": "open-webui", "name": "open-webui",
"version": "0.1.113", "version": "0.1.115",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "vite dev --host", "dev": "vite dev --host",

View file

@ -139,7 +139,7 @@ export const updateOpenAIKey = async (token: string = '', key: string) => {
return res.OPENAI_API_KEY; return res.OPENAI_API_KEY;
}; };
export const getAUTOMATIC1111Url = async (token: string = '') => { export const getImageGenerationEngineUrls = async (token: string = '') => {
let error = null; let error = null;
const res = await fetch(`${IMAGES_API_BASE_URL}/url`, { const res = await fetch(`${IMAGES_API_BASE_URL}/url`, {
@ -168,10 +168,10 @@ export const getAUTOMATIC1111Url = async (token: string = '') => {
throw error; throw error;
} }
return res.AUTOMATIC1111_BASE_URL; return res;
}; };
export const updateAUTOMATIC1111Url = async (token: string = '', url: string) => { export const updateImageGenerationEngineUrls = async (token: string = '', urls: object = {}) => {
let error = null; let error = null;
const res = await fetch(`${IMAGES_API_BASE_URL}/url/update`, { const res = await fetch(`${IMAGES_API_BASE_URL}/url/update`, {
@ -182,7 +182,7 @@ export const updateAUTOMATIC1111Url = async (token: string = '', url: string) =>
...(token && { authorization: `Bearer ${token}` }) ...(token && { authorization: `Bearer ${token}` })
}, },
body: JSON.stringify({ body: JSON.stringify({
url: url ...urls
}) })
}) })
.then(async (res) => { .then(async (res) => {
@ -203,7 +203,7 @@ export const updateAUTOMATIC1111Url = async (token: string = '', url: string) =>
throw error; throw error;
} }
return res.AUTOMATIC1111_BASE_URL; return res;
}; };
export const getImageSize = async (token: string = '') => { export const getImageSize = async (token: string = '') => {

View file

@ -139,3 +139,60 @@ export const updateModelFilterConfig = async (
return res; return res;
}; };
export const getWebhookUrl = async (token: string) => {
let error = null;
const res = await fetch(`${WEBUI_BASE_URL}/api/webhook`, {
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) => {
console.log(err);
error = err;
return null;
});
if (error) {
throw error;
}
return res.url;
};
export const updateWebhookUrl = async (token: string, url: string) => {
let error = null;
const res = await fetch(`${WEBUI_BASE_URL}/api/webhook`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`
},
body: JSON.stringify({
url: url
})
})
.then(async (res) => {
if (!res.ok) throw await res.json();
return res.json();
})
.catch((err) => {
console.log(err);
error = err;
return null;
});
if (error) {
throw error;
}
return res.url;
};

View file

@ -271,7 +271,7 @@ export const generateChatCompletion = async (token: string = '', body: object) =
return [res, controller]; return [res, controller];
}; };
export const cancelChatCompletion = async (token: string = '', requestId: string) => { export const cancelOllamaRequest = async (token: string = '', requestId: string) => {
let error = null; let error = null;
const res = await fetch(`${OLLAMA_API_BASE_URL}/cancel/${requestId}`, { const res = await fetch(`${OLLAMA_API_BASE_URL}/cancel/${requestId}`, {
@ -390,6 +390,73 @@ export const pullModel = async (token: string, tagName: string, urlIdx: string |
return res; return res;
}; };
export const downloadModel = async (
token: string,
download_url: string,
urlIdx: string | null = null
) => {
let error = null;
const res = await fetch(
`${OLLAMA_API_BASE_URL}/models/download${urlIdx !== null ? `/${urlIdx}` : ''}`,
{
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`
},
body: JSON.stringify({
url: download_url
})
}
).catch((err) => {
console.log(err);
error = err;
if ('detail' in err) {
error = err.detail;
}
return null;
});
if (error) {
throw error;
}
return res;
};
export const uploadModel = async (token: string, file: File, urlIdx: string | null = null) => {
let error = null;
const formData = new FormData();
formData.append('file', file);
const res = await fetch(
`${OLLAMA_API_BASE_URL}/models/upload${urlIdx !== null ? `/${urlIdx}` : ''}`,
{
method: 'POST',
headers: {
Authorization: `Bearer ${token}`
},
body: formData
}
).catch((err) => {
console.log(err);
error = err;
if ('detail' in err) {
error = err.detail;
}
return null;
});
if (error) {
throw error;
}
return res;
};
// export const pullModel = async (token: string, tagName: string) => { // export const pullModel = async (token: string, tagName: string) => {
// return await fetch(`${OLLAMA_API_BASE_URL}/pull`, { // return await fetch(`${OLLAMA_API_BASE_URL}/pull`, {
// method: 'POST', // method: 'POST',

View file

@ -1,4 +1,5 @@
<script lang="ts"> <script lang="ts">
import { getWebhookUrl, updateWebhookUrl } from '$lib/apis';
import { import {
getDefaultUserRole, getDefaultUserRole,
getJWTExpiresDuration, getJWTExpiresDuration,
@ -16,6 +17,8 @@
let defaultUserRole = 'pending'; let defaultUserRole = 'pending';
let JWTExpiresIn = ''; let JWTExpiresIn = '';
let webhookUrl = '';
const toggleSignUpEnabled = async () => { const toggleSignUpEnabled = async () => {
signUpEnabled = await toggleSignUpEnabledStatus(localStorage.token); signUpEnabled = await toggleSignUpEnabledStatus(localStorage.token);
}; };
@ -28,18 +31,23 @@
JWTExpiresIn = await updateJWTExpiresDuration(localStorage.token, duration); JWTExpiresIn = await updateJWTExpiresDuration(localStorage.token, duration);
}; };
const updateWebhookUrlHandler = async () => {
webhookUrl = await updateWebhookUrl(localStorage.token, webhookUrl);
};
onMount(async () => { onMount(async () => {
signUpEnabled = await getSignUpEnabledStatus(localStorage.token); signUpEnabled = await getSignUpEnabledStatus(localStorage.token);
defaultUserRole = await getDefaultUserRole(localStorage.token); defaultUserRole = await getDefaultUserRole(localStorage.token);
JWTExpiresIn = await getJWTExpiresDuration(localStorage.token); JWTExpiresIn = await getJWTExpiresDuration(localStorage.token);
webhookUrl = await getWebhookUrl(localStorage.token);
}); });
</script> </script>
<form <form
class="flex flex-col h-full justify-between space-y-3 text-sm" class="flex flex-col h-full justify-between space-y-3 text-sm"
on:submit|preventDefault={() => { on:submit|preventDefault={() => {
// console.log('submit');
updateJWTExpiresDurationHandler(JWTExpiresIn); updateJWTExpiresDurationHandler(JWTExpiresIn);
updateWebhookUrlHandler();
saveHandler(); saveHandler();
}} }}
> >
@ -108,6 +116,23 @@
<hr class=" dark:border-gray-700 my-3" /> <hr class=" dark:border-gray-700 my-3" />
<div class=" w-full justify-between">
<div class="flex w-full justify-between">
<div class=" self-center text-xs font-medium">{$i18n.t('Webhook URL')}</div>
</div>
<div class="flex mt-2 space-x-2">
<input
class="w-full rounded py-1.5 px-4 text-sm dark:text-gray-300 dark:bg-gray-800 outline-none border border-gray-100 dark:border-gray-600"
type="text"
placeholder={`https://example.com/webhook`}
bind:value={webhookUrl}
/>
</div>
</div>
<hr class=" dark:border-gray-700 my-3" />
<div class=" w-full justify-between"> <div class=" w-full justify-between">
<div class="flex w-full justify-between"> <div class="flex w-full justify-between">
<div class=" self-center text-xs font-medium">{$i18n.t('JWT Expiration')}</div> <div class=" self-center text-xs font-medium">{$i18n.t('JWT Expiration')}</div>

View file

@ -673,7 +673,7 @@
? chatInputPlaceholder ? chatInputPlaceholder
: isRecording : isRecording
? $i18n.t('Listening...') ? $i18n.t('Listening...')
: $i18n.t('Send a Messsage')} : $i18n.t('Send a Message')}
bind:value={prompt} bind:value={prompt}
on:keypress={(e) => { on:keypress={(e) => {
if (e.keyCode == 13 && !e.shiftKey) { if (e.keyCode == 13 && !e.shiftKey) {

View file

@ -33,7 +33,7 @@
<img <img
src={modelfiles[model]?.imageUrl ?? `${WEBUI_BASE_URL}/static/favicon.png`} src={modelfiles[model]?.imageUrl ?? `${WEBUI_BASE_URL}/static/favicon.png`}
alt="modelfile" alt="modelfile"
class=" w-14 rounded-full border-[1px] border-gray-200 dark:border-none" class=" size-12 rounded-full border-[1px] border-gray-200 dark:border-none"
draggable="false" draggable="false"
/> />
{:else} {:else}
@ -41,7 +41,7 @@
src={models.length === 1 src={models.length === 1
? `${WEBUI_BASE_URL}/static/favicon.png` ? `${WEBUI_BASE_URL}/static/favicon.png`
: `${WEBUI_BASE_URL}/static/favicon.png`} : `${WEBUI_BASE_URL}/static/favicon.png`}
class=" w-14 rounded-full border-[1px] border-gray-200 dark:border-none" class=" size-12 rounded-full border-[1px] border-gray-200 dark:border-none"
alt="logo" alt="logo"
draggable="false" draggable="false"
/> />

View file

@ -422,7 +422,7 @@
class=" flex justify-start space-x-1 overflow-x-auto buttons text-gray-700 dark:text-gray-500" class=" flex justify-start space-x-1 overflow-x-auto buttons text-gray-700 dark:text-gray-500"
> >
{#if siblings.length > 1} {#if siblings.length > 1}
<div class="flex self-center min-w-fit"> <div class="flex self-center min-w-fit -mt-1">
<button <button
class="self-center dark:hover:text-white hover:text-black transition" class="self-center dark:hover:text-white hover:text-black transition"
on:click={() => { on:click={() => {

View file

@ -203,7 +203,7 @@
<div class=" flex justify-start space-x-1 text-gray-700 dark:text-gray-500"> <div class=" flex justify-start space-x-1 text-gray-700 dark:text-gray-500">
{#if siblings.length > 1} {#if siblings.length > 1}
<div class="flex self-center"> <div class="flex self-center -mt-1">
<button <button
class="self-center dark:hover:text-white hover:text-black transition" class="self-center dark:hover:text-white hover:text-black transition"
on:click={() => { on:click={() => {

View file

@ -3,6 +3,7 @@
import { models, showSettings, settings, user } from '$lib/stores'; import { models, showSettings, settings, user } from '$lib/stores';
import { onMount, tick, getContext } from 'svelte'; import { onMount, tick, getContext } from 'svelte';
import { toast } from 'svelte-sonner'; import { toast } from 'svelte-sonner';
import Select from '../common/Select.svelte';
const i18n = getContext('i18n'); const i18n = getContext('i18n');
@ -32,30 +33,24 @@
} }
</script> </script>
<div class="flex flex-col my-2"> <div class="flex flex-col my-2 w-full">
{#each selectedModels as selectedModel, selectedModelIdx} {#each selectedModels as selectedModel, selectedModelIdx}
<div class="flex"> <div class="flex w-full">
<select <div class="overflow-hidden w-full">
id="models" <div class="mr-2 max-w-full">
class="outline-none bg-transparent text-lg font-semibold rounded-lg block w-full placeholder-gray-400" <Select
bind:value={selectedModel} placeholder={$i18n.t('Select a model')}
{disabled} items={$models
> .filter((model) => model.name !== 'hr')
<option class=" text-gray-700" value="" selected disabled .map((model) => ({
>{$i18n.t('Select a model')}</option value: model.id,
> label:
model.name + `${model.size ? ` (${(model.size / 1024 ** 3).toFixed(1)}GB)` : ''}`
{#each $models as model} }))}
{#if model.name === 'hr'} bind:value={selectedModel}
<hr /> />
{:else} </div>
<option value={model.id} class="text-gray-700 text-lg" </div>
>{model.name +
`${model.size ? ` (${(model.size / 1024 ** 3).toFixed(1)}GB)` : ''}`}</option
>
{/if}
{/each}
</select>
{#if selectedModelIdx === 0} {#if selectedModelIdx === 0}
<button <button
@ -136,6 +131,6 @@
{/each} {/each}
</div> </div>
<div class="text-left mt-1.5 text-xs text-gray-500"> <div class="text-left mt-1.5 ml-1 text-xs text-gray-500">
<button on:click={saveDefaultModel}> {$i18n.t('Set as default')}</button> <button on:click={saveDefaultModel}> {$i18n.t('Set as default')}</button>
</div> </div>

View file

@ -2,7 +2,6 @@
import fileSaver from 'file-saver'; import fileSaver from 'file-saver';
const { saveAs } = fileSaver; const { saveAs } = fileSaver;
import { resetVectorDB } from '$lib/apis/rag';
import { chats, user } from '$lib/stores'; import { chats, user } from '$lib/stores';
import { import {
@ -330,38 +329,6 @@
{$i18n.t('Export All Chats (All Users)')} {$i18n.t('Export All Chats (All Users)')}
</div> </div>
</button> </button>
<hr class=" dark:border-gray-700" />
<button
class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
on:click={() => {
const res = resetVectorDB(localStorage.token).catch((error) => {
toast.error(error);
return null;
});
if (res) {
toast.success($i18n.t('Success'));
}
}}
>
<div class=" self-center mr-3">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="w-4 h-4"
>
<path
fill-rule="evenodd"
d="M3.5 2A1.5 1.5 0 0 0 2 3.5v9A1.5 1.5 0 0 0 3.5 14h9a1.5 1.5 0 0 0 1.5-1.5v-7A1.5 1.5 0 0 0 12.5 4H9.621a1.5 1.5 0 0 1-1.06-.44L7.439 2.44A1.5 1.5 0 0 0 6.38 2H3.5Zm6.75 7.75a.75.75 0 0 0 0-1.5h-4.5a.75.75 0 0 0 0 1.5h4.5Z"
clip-rule="evenodd"
/>
</svg>
</div>
<div class=" self-center text-sm font-medium">{$i18n.t('Reset Vector Storage')}</div>
</button>
{/if} {/if}
</div> </div>
</div> </div>

View file

@ -4,14 +4,14 @@
import { createEventDispatcher, onMount, getContext } from 'svelte'; import { createEventDispatcher, onMount, getContext } from 'svelte';
import { config, user } from '$lib/stores'; import { config, user } from '$lib/stores';
import { import {
getAUTOMATIC1111Url,
getImageGenerationModels, getImageGenerationModels,
getDefaultImageGenerationModel, getDefaultImageGenerationModel,
updateDefaultImageGenerationModel, updateDefaultImageGenerationModel,
getImageSize, getImageSize,
getImageGenerationConfig, getImageGenerationConfig,
updateImageGenerationConfig, updateImageGenerationConfig,
updateAUTOMATIC1111Url, getImageGenerationEngineUrls,
updateImageGenerationEngineUrls,
updateImageSize, updateImageSize,
getImageSteps, getImageSteps,
updateImageSteps, updateImageSteps,
@ -31,6 +31,8 @@
let enableImageGeneration = false; let enableImageGeneration = false;
let AUTOMATIC1111_BASE_URL = ''; let AUTOMATIC1111_BASE_URL = '';
let COMFYUI_BASE_URL = '';
let OPENAI_API_KEY = ''; let OPENAI_API_KEY = '';
let selectedModel = ''; let selectedModel = '';
@ -49,24 +51,47 @@
}); });
}; };
const updateAUTOMATIC1111UrlHandler = async () => { const updateUrlHandler = async () => {
const res = await updateAUTOMATIC1111Url(localStorage.token, AUTOMATIC1111_BASE_URL).catch( if (imageGenerationEngine === 'comfyui') {
(error) => { const res = await updateImageGenerationEngineUrls(localStorage.token, {
COMFYUI_BASE_URL: COMFYUI_BASE_URL
}).catch((error) => {
toast.error(error); toast.error(error);
console.log(error);
return null; return null;
} });
);
if (res) { if (res) {
AUTOMATIC1111_BASE_URL = res; COMFYUI_BASE_URL = res.COMFYUI_BASE_URL;
await getModels(); await getModels();
if (models) { if (models) {
toast.success($i18n.t('Server connection verified')); toast.success($i18n.t('Server connection verified'));
}
} else {
({ COMFYUI_BASE_URL } = await getImageGenerationEngineUrls(localStorage.token));
} }
} else { } else {
AUTOMATIC1111_BASE_URL = await getAUTOMATIC1111Url(localStorage.token); const res = await updateImageGenerationEngineUrls(localStorage.token, {
AUTOMATIC1111_BASE_URL: AUTOMATIC1111_BASE_URL
}).catch((error) => {
toast.error(error);
return null;
});
if (res) {
AUTOMATIC1111_BASE_URL = res.AUTOMATIC1111_BASE_URL;
await getModels();
if (models) {
toast.success($i18n.t('Server connection verified'));
}
} else {
({ AUTOMATIC1111_BASE_URL } = await getImageGenerationEngineUrls(localStorage.token));
}
} }
}; };
const updateImageGeneration = async () => { const updateImageGeneration = async () => {
@ -101,7 +126,11 @@
imageGenerationEngine = res.engine; imageGenerationEngine = res.engine;
enableImageGeneration = res.enabled; enableImageGeneration = res.enabled;
} }
AUTOMATIC1111_BASE_URL = await getAUTOMATIC1111Url(localStorage.token); const URLS = await getImageGenerationEngineUrls(localStorage.token);
AUTOMATIC1111_BASE_URL = URLS.AUTOMATIC1111_BASE_URL;
COMFYUI_BASE_URL = URLS.COMFYUI_BASE_URL;
OPENAI_API_KEY = await getOpenAIKey(localStorage.token); OPENAI_API_KEY = await getOpenAIKey(localStorage.token);
imageSize = await getImageSize(localStorage.token); imageSize = await getImageSize(localStorage.token);
@ -154,6 +183,7 @@
}} }}
> >
<option value="">{$i18n.t('Default (Automatic1111)')}</option> <option value="">{$i18n.t('Default (Automatic1111)')}</option>
<option value="comfyui">{$i18n.t('ComfyUI')}</option>
<option value="openai">{$i18n.t('Open AI (Dall-E)')}</option> <option value="openai">{$i18n.t('Open AI (Dall-E)')}</option>
</select> </select>
</div> </div>
@ -171,6 +201,9 @@
if (imageGenerationEngine === '' && AUTOMATIC1111_BASE_URL === '') { if (imageGenerationEngine === '' && AUTOMATIC1111_BASE_URL === '') {
toast.error($i18n.t('AUTOMATIC1111 Base URL is required.')); toast.error($i18n.t('AUTOMATIC1111 Base URL is required.'));
enableImageGeneration = false; enableImageGeneration = false;
} else if (imageGenerationEngine === 'comfyui' && COMFYUI_BASE_URL === '') {
toast.error($i18n.t('ComfyUI Base URL is required.'));
enableImageGeneration = false;
} else if (imageGenerationEngine === 'openai' && OPENAI_API_KEY === '') { } else if (imageGenerationEngine === 'openai' && OPENAI_API_KEY === '') {
toast.error($i18n.t('OpenAI API Key is required.')); toast.error($i18n.t('OpenAI API Key is required.'));
enableImageGeneration = false; enableImageGeneration = false;
@ -204,12 +237,10 @@
/> />
</div> </div>
<button <button
class="px-3 bg-gray-200 hover:bg-gray-300 dark:bg-gray-600 dark:hover:bg-gray-700 rounded-lg transition" class="px-2.5 bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition"
type="button" type="button"
on:click={() => { on:click={() => {
// updateOllamaAPIUrlHandler(); updateUrlHandler();
updateAUTOMATIC1111UrlHandler();
}} }}
> >
<svg <svg
@ -237,6 +268,37 @@
{$i18n.t('(e.g. `sh webui.sh --api`)')} {$i18n.t('(e.g. `sh webui.sh --api`)')}
</a> </a>
</div> </div>
{:else if imageGenerationEngine === 'comfyui'}
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('ComfyUI Base URL')}</div>
<div class="flex w-full">
<div class="flex-1 mr-2">
<input
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
placeholder={$i18n.t('Enter URL (e.g. http://127.0.0.1:7860/)')}
bind:value={COMFYUI_BASE_URL}
/>
</div>
<button
class="px-2.5 bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition"
type="button"
on:click={() => {
updateUrlHandler();
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-4 h-4"
>
<path
fill-rule="evenodd"
d="M15.312 11.424a5.5 5.5 0 01-9.201 2.466l-.312-.311h2.433a.75.75 0 000-1.5H3.989a.75.75 0 00-.75.75v4.242a.75.75 0 001.5 0v-2.43l.31.31a7 7 0 0011.712-3.138.75.75 0 00-1.449-.39zm1.23-3.723a.75.75 0 00.219-.53V2.929a.75.75 0 00-1.5 0V5.36l-.31-.31A7 7 0 003.239 8.188a.75.75 0 101.448.389A5.5 5.5 0 0113.89 6.11l.311.31h-2.432a.75.75 0 000 1.5h4.243a.75.75 0 00.53-.219z"
clip-rule="evenodd"
/>
</svg>
</button>
</div>
{:else if imageGenerationEngine === 'openai'} {:else if imageGenerationEngine === 'openai'}
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('OpenAI API Key')}</div> <div class=" mb-2.5 text-sm font-medium">{$i18n.t('OpenAI API Key')}</div>
<div class="flex w-full"> <div class="flex w-full">
@ -261,6 +323,7 @@
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none" class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
bind:value={selectedModel} bind:value={selectedModel}
placeholder={$i18n.t('Select a model')} placeholder={$i18n.t('Select a model')}
required
> >
{#if !selectedModel} {#if !selectedModel}
<option value="" disabled selected>{$i18n.t('Select a model')}</option> <option value="" disabled selected>{$i18n.t('Select a model')}</option>

View file

@ -5,9 +5,12 @@
import { import {
createModel, createModel,
deleteModel, deleteModel,
downloadModel,
getOllamaUrls, getOllamaUrls,
getOllamaVersion, getOllamaVersion,
pullModel pullModel,
cancelOllamaRequest,
uploadModel
} from '$lib/apis/ollama'; } from '$lib/apis/ollama';
import { WEBUI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants'; import { WEBUI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants';
import { WEBUI_NAME, models, user } from '$lib/stores'; import { WEBUI_NAME, models, user } from '$lib/stores';
@ -60,11 +63,13 @@
let pullProgress = null; let pullProgress = null;
let modelUploadMode = 'file'; let modelUploadMode = 'file';
let modelInputFile = ''; let modelInputFile: File[] | null = null;
let modelFileUrl = ''; let modelFileUrl = '';
let modelFileContent = `TEMPLATE """{{ .System }}\nUSER: {{ .Prompt }}\nASSISTANT: """\nPARAMETER num_ctx 4096\nPARAMETER stop "</s>"\nPARAMETER stop "USER:"\nPARAMETER stop "ASSISTANT:"`; let modelFileContent = `TEMPLATE """{{ .System }}\nUSER: {{ .Prompt }}\nASSISTANT: """\nPARAMETER num_ctx 4096\nPARAMETER stop "</s>"\nPARAMETER stop "USER:"\nPARAMETER stop "ASSISTANT:"`;
let modelFileDigest = ''; let modelFileDigest = '';
let uploadProgress = null; let uploadProgress = null;
let uploadMessage = '';
let deleteModelTag = ''; let deleteModelTag = '';
@ -159,7 +164,7 @@
// Remove the downloaded model // Remove the downloaded model
delete modelDownloadStatus[modelName]; delete modelDownloadStatus[modelName];
console.log(data); modelDownloadStatus = { ...modelDownloadStatus };
if (!data.success) { if (!data.success) {
toast.error(data.error); toast.error(data.error);
@ -184,35 +189,32 @@
const uploadModelHandler = async () => { const uploadModelHandler = async () => {
modelTransferring = true; modelTransferring = true;
uploadProgress = 0;
let uploaded = false; let uploaded = false;
let fileResponse = null; let fileResponse = null;
let name = ''; let name = '';
if (modelUploadMode === 'file') { if (modelUploadMode === 'file') {
const file = modelInputFile[0]; const file = modelInputFile ? modelInputFile[0] : null;
const formData = new FormData();
formData.append('file', file);
fileResponse = await fetch(`${WEBUI_API_BASE_URL}/utils/upload`, { if (file) {
method: 'POST', uploadMessage = 'Uploading...';
headers: {
...($user && { Authorization: `Bearer ${localStorage.token}` }) fileResponse = await uploadModel(localStorage.token, file, selectedOllamaUrlIdx).catch(
}, (error) => {
body: formData toast.error(error);
}).catch((error) => { return null;
console.log(error); }
return null; );
}); }
} else { } else {
fileResponse = await fetch(`${WEBUI_API_BASE_URL}/utils/download?url=${modelFileUrl}`, { uploadProgress = 0;
method: 'GET', fileResponse = await downloadModel(
headers: { localStorage.token,
...($user && { Authorization: `Bearer ${localStorage.token}` }) modelFileUrl,
} selectedOllamaUrlIdx
}).catch((error) => { ).catch((error) => {
console.log(error); toast.error(error);
return null; return null;
}); });
} }
@ -235,6 +237,9 @@
let data = JSON.parse(line.replace(/^data: /, '')); let data = JSON.parse(line.replace(/^data: /, ''));
if (data.progress) { if (data.progress) {
if (uploadMessage) {
uploadMessage = '';
}
uploadProgress = data.progress; uploadProgress = data.progress;
} }
@ -318,7 +323,11 @@
} }
modelFileUrl = ''; modelFileUrl = '';
modelInputFile = '';
if (modelUploadInputElement) {
modelUploadInputElement.value = '';
}
modelInputFile = null;
modelTransferring = false; modelTransferring = false;
uploadProgress = null; uploadProgress = null;
@ -364,12 +373,24 @@
for (const line of lines) { for (const line of lines) {
if (line !== '') { if (line !== '') {
let data = JSON.parse(line); let data = JSON.parse(line);
console.log(data);
if (data.error) { if (data.error) {
throw data.error; throw data.error;
} }
if (data.detail) { if (data.detail) {
throw data.detail; throw data.detail;
} }
if (data.id) {
modelDownloadStatus[opts.modelName] = {
...modelDownloadStatus[opts.modelName],
requestId: data.id,
reader,
done: false
};
console.log(data);
}
if (data.status) { if (data.status) {
if (data.digest) { if (data.digest) {
let downloadProgress = 0; let downloadProgress = 0;
@ -379,11 +400,17 @@
downloadProgress = 100; downloadProgress = 100;
} }
modelDownloadStatus[opts.modelName] = { modelDownloadStatus[opts.modelName] = {
...modelDownloadStatus[opts.modelName],
pullProgress: downloadProgress, pullProgress: downloadProgress,
digest: data.digest digest: data.digest
}; };
} else { } else {
toast.success(data.status); toast.success(data.status);
modelDownloadStatus[opts.modelName] = {
...modelDownloadStatus[opts.modelName],
done: data.status === 'success'
};
} }
} }
} }
@ -396,7 +423,14 @@
opts.callback({ success: false, error, modelName: opts.modelName }); opts.callback({ success: false, error, modelName: opts.modelName });
} }
} }
opts.callback({ success: true, modelName: opts.modelName });
console.log(modelDownloadStatus[opts.modelName]);
if (modelDownloadStatus[opts.modelName].done) {
opts.callback({ success: true, modelName: opts.modelName });
} else {
opts.callback({ success: false, error: 'Download canceled', modelName: opts.modelName });
}
} }
}; };
@ -466,6 +500,18 @@
ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => false); ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => false);
liteLLMModelInfo = await getLiteLLMModelInfo(localStorage.token); liteLLMModelInfo = await getLiteLLMModelInfo(localStorage.token);
}); });
const cancelModelPullHandler = async (model: string) => {
const { reader, requestId } = modelDownloadStatus[model];
if (reader) {
await reader.cancel();
await cancelOllamaRequest(localStorage.token, requestId);
delete modelDownloadStatus[model];
await deleteModel(localStorage.token, model);
toast.success(`${model} download has been canceled`);
}
};
</script> </script>
<div class="flex flex-col h-full justify-between text-sm"> <div class="flex flex-col h-full justify-between text-sm">
@ -596,20 +642,58 @@
{#if Object.keys(modelDownloadStatus).length > 0} {#if Object.keys(modelDownloadStatus).length > 0}
{#each Object.keys(modelDownloadStatus) as model} {#each Object.keys(modelDownloadStatus) as model}
<div class="flex flex-col"> {#if 'pullProgress' in modelDownloadStatus[model]}
<div class="font-medium mb-1">{model}</div> <div class="flex flex-col">
<div class=""> <div class="font-medium mb-1">{model}</div>
<div <div class="">
class="dark:bg-gray-600 bg-gray-500 text-xs font-medium text-gray-100 text-center p-0.5 leading-none rounded-full" <div class="flex flex-row justify-between space-x-4 pr-2">
style="width: {Math.max(15, modelDownloadStatus[model].pullProgress ?? 0)}%" <div class=" flex-1">
> <div
{modelDownloadStatus[model].pullProgress ?? 0}% class="dark:bg-gray-600 bg-gray-500 text-xs font-medium text-gray-100 text-center p-0.5 leading-none rounded-full"
</div> style="width: {Math.max(
<div class="mt-1 text-xs dark:text-gray-500" style="font-size: 0.5rem;"> 15,
{modelDownloadStatus[model].digest} modelDownloadStatus[model].pullProgress ?? 0
)}%"
>
{modelDownloadStatus[model].pullProgress ?? 0}%
</div>
</div>
<Tooltip content="Cancel">
<button
class="text-gray-800 dark:text-gray-100"
on:click={() => {
cancelModelPullHandler(model);
}}
>
<svg
class="w-4 h-4 text-gray-800 dark:text-white"
aria-hidden="true"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
fill="currentColor"
viewBox="0 0 24 24"
>
<path
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M6 18 17.94 6M18 18 6.06 6"
/>
</svg>
</button>
</Tooltip>
</div>
{#if 'digest' in modelDownloadStatus[model]}
<div class="mt-1 text-xs dark:text-gray-500" style="font-size: 0.5rem;">
{modelDownloadStatus[model].digest}
</div>
{/if}
</div> </div>
</div> </div>
</div> {/if}
{/each} {/each}
{/if} {/if}
</div> </div>
@ -715,7 +799,7 @@
<button <button
type="button" type="button"
class="w-full rounded-lg text-left py-2 px-4 dark:text-gray-300 dark:bg-gray-850" class="w-full rounded-lg text-left py-2 px-4 bg-white dark:text-gray-300 dark:bg-gray-850"
on:click={() => { on:click={() => {
modelUploadInputElement.click(); modelUploadInputElement.click();
}} }}
@ -730,7 +814,7 @@
{:else} {:else}
<div class="flex-1 {modelFileUrl !== '' ? 'mr-2' : ''}"> <div class="flex-1 {modelFileUrl !== '' ? 'mr-2' : ''}">
<input <input
class="w-full rounded-lg text-left py-2 px-4 dark:text-gray-300 dark:bg-gray-850 outline-none {modelFileUrl !== class="w-full rounded-lg text-left py-2 px-4 bg-white dark:text-gray-300 dark:bg-gray-850 outline-none {modelFileUrl !==
'' ''
? 'mr-2' ? 'mr-2'
: ''}" : ''}"
@ -745,7 +829,7 @@
{#if (modelUploadMode === 'file' && modelInputFile && modelInputFile.length > 0) || (modelUploadMode === 'url' && modelFileUrl !== '')} {#if (modelUploadMode === 'file' && modelInputFile && modelInputFile.length > 0) || (modelUploadMode === 'url' && modelFileUrl !== '')}
<button <button
class="px-3 text-gray-100 bg-emerald-600 hover:bg-emerald-700 disabled:bg-gray-700 disabled:cursor-not-allowed rounded transition" class="px-2.5 bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg disabled:cursor-not-allowed transition"
type="submit" type="submit"
disabled={modelTransferring} disabled={modelTransferring}
> >
@ -800,7 +884,7 @@
<div class=" my-2.5 text-sm font-medium">{$i18n.t('Modelfile Content')}</div> <div class=" my-2.5 text-sm font-medium">{$i18n.t('Modelfile Content')}</div>
<textarea <textarea
bind:value={modelFileContent} bind:value={modelFileContent}
class="w-full rounded py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-800 outline-none resize-none" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-100 dark:text-gray-100 dark:bg-gray-850 outline-none resize-none"
rows="6" rows="6"
/> />
</div> </div>
@ -815,7 +899,23 @@
> >
</div> </div>
{#if uploadProgress !== null} {#if uploadMessage}
<div class="mt-2">
<div class=" mb-2 text-xs">{$i18n.t('Upload Progress')}</div>
<div class="w-full rounded-full dark:bg-gray-800">
<div
class="dark:bg-gray-600 bg-gray-500 text-xs font-medium text-gray-100 text-center p-0.5 leading-none rounded-full"
style="width: 100%"
>
{uploadMessage}
</div>
</div>
<div class="mt-1 text-xs dark:text-gray-500" style="font-size: 0.5rem;">
{modelFileDigest}
</div>
</div>
{:else if uploadProgress !== null}
<div class="mt-2"> <div class="mt-2">
<div class=" mb-2 text-xs">{$i18n.t('Upload Progress')}</div> <div class=" mb-2 text-xs">{$i18n.t('Upload Progress')}</div>

View file

@ -2,6 +2,8 @@
import { DropdownMenu } from 'bits-ui'; import { DropdownMenu } from 'bits-ui';
import { createEventDispatcher } from 'svelte'; import { createEventDispatcher } from 'svelte';
import { flyAndScale } from '$lib/utils/transitions';
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
</script> </script>
@ -20,6 +22,7 @@
sideOffset={8} sideOffset={8}
side="bottom" side="bottom"
align="start" align="start"
transition={flyAndScale}
> >
<DropdownMenu.Item class="flex items-center px-3 py-2 text-sm font-medium"> <DropdownMenu.Item class="flex items-center px-3 py-2 text-sm font-medium">
<div class="flex items-center">Profile</div> <div class="flex items-center">Profile</div>

View file

@ -2,6 +2,22 @@
export let show = false; export let show = false;
export let src = ''; export let src = '';
export let alt = ''; export let alt = '';
const downloadImage = (url, filename) => {
fetch(url)
.then((response) => response.blob())
.then((blob) => {
const objectUrl = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = objectUrl;
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(objectUrl);
})
.catch((error) => console.error('Error downloading image:', error));
};
</script> </script>
{#if show} {#if show}
@ -35,10 +51,7 @@
<button <button
class=" p-5" class=" p-5"
on:click={() => { on:click={() => {
const a = document.createElement('a'); downloadImage(src, 'Image.png');
a.href = src;
a.download = 'Image.png';
a.click();
}} }}
> >
<svg <svg

View file

@ -2,6 +2,8 @@
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import { fade } from 'svelte/transition'; import { fade } from 'svelte/transition';
import { flyAndScale } from '$lib/utils/transitions';
export let show = true; export let show = true;
export let size = 'md'; export let size = 'md';
@ -41,10 +43,10 @@
}} }}
> >
<div <div
class=" modal-content m-auto rounded-2xl max-w-full {sizeToWidth( class=" m-auto rounded-2xl max-w-full {sizeToWidth(
size size
)} mx-2 bg-gray-50 dark:bg-gray-900 shadow-3xl" )} mx-2 bg-gray-50 dark:bg-gray-900 shadow-3xl"
in:fade={{ duration: 10 }} in:flyAndScale
on:click={(e) => { on:click={(e) => {
e.stopPropagation(); e.stopPropagation();
}} }}

View file

@ -0,0 +1,87 @@
<script lang="ts">
import { Select } from 'bits-ui';
import { flyAndScale } from '$lib/utils/transitions';
import { createEventDispatcher } from 'svelte';
import ChevronDown from '../icons/ChevronDown.svelte';
import Check from '../icons/Check.svelte';
import Search from '../icons/Search.svelte';
const dispatch = createEventDispatcher();
export let value = '';
export let placeholder = 'Select a model';
export let items = [
{ value: 'mango', label: 'Mango' },
{ value: 'watermelon', label: 'Watermelon' },
{ value: 'apple', label: 'Apple' },
{ value: 'pineapple', label: 'Pineapple' },
{ value: 'orange', label: 'Orange' }
];
let searchValue = '';
$: filteredItems = searchValue
? items.filter((item) => item.value.includes(searchValue.toLowerCase()))
: items;
</script>
<Select.Root
{items}
onOpenChange={() => {
searchValue = '';
}}
selected={items.find((item) => item.value === value)}
onSelectedChange={(selectedItem) => {
value = selectedItem.value;
}}
>
<Select.Trigger class="relative w-full" aria-label={placeholder}>
<Select.Value
class="inline-flex h-input px-0.5 w-full outline-none bg-transparent truncate text-lg font-semibold placeholder-gray-400 focus:outline-none"
{placeholder}
/>
<ChevronDown className="absolute end-2 top-1/2 -translate-y-[45%] size-3.5" strokeWidth="2.5" />
</Select.Trigger>
<Select.Content
class="w-full rounded-lg bg-white dark:bg-gray-900 dark:text-white shadow-lg border border-gray-300/30 dark:border-gray-700/50 outline-none"
transition={flyAndScale}
sideOffset={4}
>
<div class="flex items-center gap-2.5 px-5 mt-3.5 mb-3">
<Search className="size-4" strokeWidth="2.5" />
<input
bind:value={searchValue}
class="w-full text-sm bg-transparent outline-none"
placeholder="Search a model"
/>
</div>
<hr class="border-gray-100 dark:border-gray-800" />
<div class="px-3 my-2 max-h-80 overflow-y-auto">
{#each filteredItems as item}
<Select.Item
class="flex w-full 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 data-[highlighted]:bg-muted"
value={item.value}
label={item.label}
>
{item.label}
{#if value === item.value}
<div class="ml-auto">
<Check />
</div>
{/if}
</Select.Item>
{:else}
<span class="block px-5 py-2 text-sm text-gray-700 dark:text-gray-100">
No results found
</span>
{/each}
</div>
</Select.Content>
<Select.Input name="favoriteFruit" />
</Select.Root>

View file

@ -138,7 +138,7 @@
/> />
<button <button
class="w-full text-sm font-medium py-3 bg-gray-850 hover:bg-gray-800 text-center rounded-xl" class="w-full text-sm font-medium py-3 bg-gray-100 hover:bg-gray-200 dark:bg-gray-850 dark:hover:bg-gray-800 text-center rounded-xl"
type="button" type="button"
on:click={() => { on:click={() => {
uploadDocInputElement.click(); uploadDocInputElement.click();

View file

@ -5,8 +5,10 @@
updateRAGConfig, updateRAGConfig,
getQuerySettings, getQuerySettings,
scanDocs, scanDocs,
updateQuerySettings updateQuerySettings,
resetVectorDB
} from '$lib/apis/rag'; } from '$lib/apis/rag';
import { documents } from '$lib/stores'; import { documents } from '$lib/stores';
import { onMount, getContext } from 'svelte'; import { onMount, getContext } from 'svelte';
import { toast } from 'svelte-sonner'; import { toast } from 'svelte-sonner';
@ -17,6 +19,8 @@
let loading = false; let loading = false;
let showResetConfirm = false;
let chunkSize = 0; let chunkSize = 0;
let chunkOverlap = 0; let chunkOverlap = 0;
let pdfExtractImages = true; let pdfExtractImages = true;
@ -231,6 +235,100 @@
/> />
</div> </div>
</div> </div>
<hr class=" dark:border-gray-700" />
{#if showResetConfirm}
<div class="flex justify-between rounded-md items-center py-2 px-3.5 w-full transition">
<div class="flex items-center space-x-3">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="w-4 h-4"
>
<path d="M2 3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3Z" />
<path
fill-rule="evenodd"
d="M13 6H3v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V6ZM5.72 7.47a.75.75 0 0 1 1.06 0L8 8.69l1.22-1.22a.75.75 0 1 1 1.06 1.06L9.06 9.75l1.22 1.22a.75.75 0 1 1-1.06 1.06L8 10.81l-1.22 1.22a.75.75 0 0 1-1.06-1.06l1.22-1.22-1.22-1.22a.75.75 0 0 1 0-1.06Z"
clip-rule="evenodd"
/>
</svg>
<span>{$i18n.t('Are you sure?')}</span>
</div>
<div class="flex space-x-1.5 items-center">
<button
class="hover:text-white transition"
on:click={() => {
const res = resetVectorDB(localStorage.token).catch((error) => {
toast.error(error);
return null;
});
if (res) {
toast.success($i18n.t('Success'));
}
showResetConfirm = false;
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-4 h-4"
>
<path
fill-rule="evenodd"
d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z"
clip-rule="evenodd"
/>
</svg>
</button>
<button
class="hover:text-white transition"
on:click={() => {
showResetConfirm = false;
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-4 h-4"
>
<path
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
/>
</svg>
</button>
</div>
</div>
{:else}
<button
class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
on:click={() => {
showResetConfirm = true;
}}
>
<div class=" self-center mr-3">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="w-4 h-4"
>
<path
fill-rule="evenodd"
d="M3.5 2A1.5 1.5 0 0 0 2 3.5v9A1.5 1.5 0 0 0 3.5 14h9a1.5 1.5 0 0 0 1.5-1.5v-7A1.5 1.5 0 0 0 12.5 4H9.621a1.5 1.5 0 0 1-1.06-.44L7.439 2.44A1.5 1.5 0 0 0 6.38 2H3.5Zm6.75 7.75a.75.75 0 0 0 0-1.5h-4.5a.75.75 0 0 0 0 1.5h4.5Z"
clip-rule="evenodd"
/>
</svg>
</div>
<div class=" self-center text-sm font-medium">{$i18n.t('Reset Vector Storage')}</div>
</button>
{/if}
</div> </div>
<div class="flex justify-end pt-3 text-sm font-medium"> <div class="flex justify-end pt-3 text-sm font-medium">

View file

@ -0,0 +1,15 @@
<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="m4.5 12.75 6 6 9-13.5" />
</svg>

View file

@ -0,0 +1,15 @@
<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="m19.5 8.25-7.5 7.5-7.5-7.5" />
</svg>

View file

@ -0,0 +1,19 @@
<script lang="ts">
export let className = 'w-4 h-4';
export let strokeWidth = '1.5';
</script>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width={strokeWidth}
stroke="currentColor"
class={className}
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z"
/>
</svg>

View file

@ -69,10 +69,7 @@
</script> </script>
<ShareChatModal bind:show={showShareChatModal} {downloadChat} {shareChat} /> <ShareChatModal bind:show={showShareChatModal} {downloadChat} {shareChat} />
<nav <nav id="nav" class=" sticky py-2.5 top-0 flex flex-row justify-center z-30">
id="nav"
class=" sticky py-2.5 top-0 flex flex-row justify-center bg-white/95 dark:bg-gray-900/90 dark:text-gray-200 backdrop-blur-xl z-30"
>
<div <div
class=" flex {$settings?.fullScreenMode ?? null class=" flex {$settings?.fullScreenMode ?? null
? 'max-w-full' ? 'max-w-full'
@ -113,7 +110,7 @@
<Tags {tags} {deleteTag} {addTag} /> <Tags {tags} {deleteTag} {addTag} />
<button <button
class=" cursor-pointer p-1.5 flex dark:hover:bg-gray-700 rounded-lg transition border dark:border-gray-600" class=" cursor-pointer p-1.5 flex dark:hover:bg-gray-700 rounded-lg transition"
on:click={async () => { on:click={async () => {
showShareChatModal = !showShareChatModal; showShareChatModal = !showShareChatModal;

View file

@ -20,10 +20,9 @@
getAllChatTags getAllChatTags
} from '$lib/apis/chats'; } from '$lib/apis/chats';
import { toast } from 'svelte-sonner'; import { toast } from 'svelte-sonner';
import { slide } from 'svelte/transition'; import { fade, slide } from 'svelte/transition';
import { WEBUI_BASE_URL } from '$lib/constants'; import { WEBUI_BASE_URL } from '$lib/constants';
import Tooltip from '../common/Tooltip.svelte'; import Tooltip from '../common/Tooltip.svelte';
import Dropdown from '../common/Dropdown.svelte';
import ChatMenu from './Sidebar/ChatMenu.svelte'; import ChatMenu from './Sidebar/ChatMenu.svelte';
let show = false; let show = false;
@ -108,7 +107,7 @@
bind:this={navElement} bind:this={navElement}
class="h-screen max-h-[100dvh] min-h-screen {show class="h-screen max-h-[100dvh] min-h-screen {show
? 'lg:relative w-[260px]' ? 'lg:relative w-[260px]'
: '-translate-x-[260px] w-[0px]'} bg-black text-gray-200 shadow-2xl text-sm transition z-40 fixed top-0 left-0 : '-translate-x-[260px] w-[0px]'} bg-gray-50 text-gray-900 dark:bg-gray-950 dark:text-gray-200 text-sm transition z-40 fixed top-0 left-0
" "
> >
<div <div
@ -119,7 +118,7 @@
<div class="px-2 flex justify-center space-x-2"> <div class="px-2 flex justify-center space-x-2">
<a <a
id="sidebar-new-chat-button" id="sidebar-new-chat-button"
class="flex-grow flex justify-between rounded-xl px-3.5 py-2 hover:bg-gray-900 transition" class="flex-grow flex justify-between rounded-xl px-4 py-2 hover:bg-gray-200 dark:hover:bg-gray-900 transition"
href="/" href="/"
on:click={async () => { on:click={async () => {
selectedChatId = null; selectedChatId = null;
@ -135,7 +134,7 @@
<div class="self-center mr-1.5"> <div class="self-center mr-1.5">
<img <img
src="{WEBUI_BASE_URL}/static/favicon.png" src="{WEBUI_BASE_URL}/static/favicon.png"
class=" w-7 -translate-x-1.5 rounded-full" class=" size-6 -translate-x-1.5 rounded-full"
alt="logo" alt="logo"
/> />
</div> </div>
@ -164,7 +163,7 @@
{#if $user?.role === 'admin'} {#if $user?.role === 'admin'}
<div class="px-2 flex justify-center mt-0.5"> <div class="px-2 flex justify-center mt-0.5">
<a <a
class="flex-grow flex space-x-3 rounded-xl px-3.5 py-2 hover:bg-gray-900 transition" class="flex-grow flex space-x-3 rounded-xl px-3.5 py-2 hover:bg-gray-200 dark:hover:bg-gray-900 transition"
href="/modelfiles" href="/modelfiles"
on:click={() => { on:click={() => {
selectedChatId = null; selectedChatId = null;
@ -176,7 +175,7 @@
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
fill="none" fill="none"
viewBox="0 0 24 24" viewBox="0 0 24 24"
stroke-width="1.5" stroke-width="2"
stroke="currentColor" stroke="currentColor"
class="w-4 h-4" class="w-4 h-4"
> >
@ -196,7 +195,7 @@
<div class="px-2 flex justify-center"> <div class="px-2 flex justify-center">
<a <a
class="flex-grow flex space-x-3 rounded-xl px-3.5 py-2 hover:bg-gray-900 transition" class="flex-grow flex space-x-3 rounded-xl px-3.5 py-2 hover:bg-gray-200 dark:hover:bg-gray-900 transition"
href="/prompts" href="/prompts"
on:click={() => { on:click={() => {
selectedChatId = null; selectedChatId = null;
@ -208,7 +207,7 @@
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
fill="none" fill="none"
viewBox="0 0 24 24" viewBox="0 0 24 24"
stroke-width="1.5" stroke-width="2"
stroke="currentColor" stroke="currentColor"
class="w-4 h-4" class="w-4 h-4"
> >
@ -228,7 +227,7 @@
<div class="px-2 flex justify-center mb-1"> <div class="px-2 flex justify-center mb-1">
<a <a
class="flex-grow flex space-x-3 rounded-xl px-3.5 py-2 hover:bg-gray-900 transition" class="flex-grow flex space-x-3 rounded-xl px-3.5 py-2 hover:bg-gray-200 dark:hover:bg-gray-900 transition"
href="/documents" href="/documents"
on:click={() => { on:click={() => {
selectedChatId = null; selectedChatId = null;
@ -240,7 +239,7 @@
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
fill="none" fill="none"
viewBox="0 0 24 24" viewBox="0 0 24 24"
stroke-width="1.5" stroke-width="2"
stroke="currentColor" stroke="currentColor"
class="w-4 h-4" class="w-4 h-4"
> >
@ -261,7 +260,7 @@
<div class="relative flex flex-col flex-1 overflow-y-auto"> <div class="relative flex flex-col flex-1 overflow-y-auto">
{#if !($settings.saveChatHistory ?? true)} {#if !($settings.saveChatHistory ?? true)}
<div class="absolute z-40 w-full h-full bg-black/90 flex justify-center"> <div class="absolute z-40 w-full h-full bg-gray-50/90 dark:bg-black/90 flex justify-center">
<div class=" text-left px-5 py-2"> <div class=" text-left px-5 py-2">
<div class=" font-medium">{$i18n.t('Chat History is off for this browser.')}</div> <div class=" font-medium">{$i18n.t('Chat History is off for this browser.')}</div>
<div class="text-xs mt-2"> <div class="text-xs mt-2">
@ -305,7 +304,7 @@
<div class="px-2 mt-1 mb-2 flex justify-center space-x-2"> <div class="px-2 mt-1 mb-2 flex justify-center space-x-2">
<div class="flex w-full" id="chat-search"> <div class="flex w-full" id="chat-search">
<div class="self-center pl-3 py-2 rounded-l-xl bg-gray-950"> <div class="self-center pl-3 py-2 rounded-l-xl bg-white dark:bg-gray-950">
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20" viewBox="0 0 20 20"
@ -321,7 +320,7 @@
</div> </div>
<input <input
class="w-full rounded-r-xl py-1.5 pl-2.5 pr-4 text-sm text-gray-300 bg-gray-950 outline-none" class="w-full rounded-r-xl py-1.5 pl-2.5 pr-4 text-sm dark:text-gray-300 dark:bg-gray-950 outline-none"
placeholder={$i18n.t('Search')} placeholder={$i18n.t('Search')}
bind:value={search} bind:value={search}
on:focus={() => { on:focus={() => {
@ -334,7 +333,7 @@
{#if $tags.length > 0} {#if $tags.length > 0}
<div class="px-2.5 mt-0.5 mb-2 flex gap-1 flex-wrap"> <div class="px-2.5 mt-0.5 mb-2 flex gap-1 flex-wrap">
<button <button
class="px-2.5 text-xs font-medium bg-gray-900 hover:bg-gray-800 transition rounded-full" class="px-2.5 text-xs font-medium bg-gray-100 dark:bg-gray-900 dark:hover:bg-gray-800 transition rounded-full"
on:click={async () => { on:click={async () => {
await chats.set(await getChatList(localStorage.token)); await chats.set(await getChatList(localStorage.token));
}} }}
@ -343,7 +342,7 @@
</button> </button>
{#each $tags as tag} {#each $tags as tag}
<button <button
class="px-2.5 text-xs font-medium bg-gray-900 hover:bg-gray-800 transition rounded-full" class="px-2.5 text-xs font-medium bg-gray-100 dark:bg-gray-900 dark:hover:bg-gray-800 transition rounded-full"
on:click={async () => { on:click={async () => {
let chatIds = await getChatListByTagName(localStorage.token, tag.name); let chatIds = await getChatListByTagName(localStorage.token, tag.name);
if (chatIds.length === 0) { if (chatIds.length === 0) {
@ -385,10 +384,10 @@
class=" w-full flex justify-between rounded-xl px-3 py-2 {chat.id === $chatId || class=" w-full flex justify-between rounded-xl px-3 py-2 {chat.id === $chatId ||
chat.id === chatTitleEditId || chat.id === chatTitleEditId ||
chat.id === chatDeleteId chat.id === chatDeleteId
? 'bg-gray-900' ? 'bg-gray-300 dark:bg-gray-900'
: chat.id === selectedChatId : chat.id === selectedChatId
? 'bg-gray-950' ? 'bg-gray-100 dark:bg-gray-950'
: 'group-hover:bg-gray-950'} whitespace-nowrap text-ellipsis" : 'group-hover:bg-gray-100 dark:group-hover:bg-gray-950'} whitespace-nowrap text-ellipsis"
> >
<input bind:value={chatTitle} class=" bg-transparent w-full outline-none mr-10" /> <input bind:value={chatTitle} class=" bg-transparent w-full outline-none mr-10" />
</div> </div>
@ -397,10 +396,10 @@
class=" w-full flex justify-between rounded-xl px-3 py-2 {chat.id === $chatId || class=" w-full flex justify-between rounded-xl px-3 py-2 {chat.id === $chatId ||
chat.id === chatTitleEditId || chat.id === chatTitleEditId ||
chat.id === chatDeleteId chat.id === chatDeleteId
? 'bg-gray-900' ? 'bg-gray-300 dark:bg-gray-900'
: chat.id === selectedChatId : chat.id === selectedChatId
? 'bg-gray-950' ? 'bg-gray-100 dark:bg-gray-950'
: 'group-hover:bg-gray-950'} whitespace-nowrap text-ellipsis" : ' group-hover:bg-gray-100 dark:group-hover:bg-gray-950'} whitespace-nowrap text-ellipsis"
href="/c/{chat.id}" href="/c/{chat.id}"
on:click={() => { on:click={() => {
selectedChatId = chat.id; selectedChatId = chat.id;
@ -422,10 +421,10 @@
class=" class="
{chat.id === $chatId || chat.id === chatTitleEditId || chat.id === chatDeleteId {chat.id === $chatId || chat.id === chatTitleEditId || chat.id === chatDeleteId
? ' from-gray-900' ? 'from-gray-300 dark:from-gray-900'
: chat.id === selectedChatId : chat.id === selectedChatId
? 'from-gray-950' ? 'from-gray-100 dark:from-gray-950'
: 'invisible group-hover:visible from-gray-950'} : 'invisible group-hover:visible from-gray-100 dark:from-gray-950'}
absolute right-[10px] top-[10px] pr-2 pl-5 bg-gradient-to-l from-80% absolute right-[10px] top-[10px] pr-2 pl-5 bg-gradient-to-l from-80%
to-transparent" to-transparent"
@ -433,7 +432,7 @@
{#if chatTitleEditId === chat.id} {#if chatTitleEditId === chat.id}
<div class="flex self-center space-x-1.5 z-10"> <div class="flex self-center space-x-1.5 z-10">
<button <button
class=" self-center hover:text-white transition" class=" self-center dark:hover:text-white transition"
on:click={() => { on:click={() => {
editChatTitle(chat.id, chatTitle); editChatTitle(chat.id, chatTitle);
chatTitleEditId = null; chatTitleEditId = null;
@ -454,7 +453,7 @@
</svg> </svg>
</button> </button>
<button <button
class=" self-center hover:text-white transition" class=" self-center dark:hover:text-white transition"
on:click={() => { on:click={() => {
chatTitleEditId = null; chatTitleEditId = null;
chatTitle = ''; chatTitle = '';
@ -475,7 +474,7 @@
{:else if chatDeleteId === chat.id} {:else if chatDeleteId === chat.id}
<div class="flex self-center space-x-1.5 z-10"> <div class="flex self-center space-x-1.5 z-10">
<button <button
class=" self-center hover:text-white transition" class=" self-center dark:hover:text-white transition"
on:click={() => { on:click={() => {
deleteChat(chat.id); deleteChat(chat.id);
}} }}
@ -494,7 +493,7 @@
</svg> </svg>
</button> </button>
<button <button
class=" self-center hover:text-white transition" class=" self-center dark:hover:text-white transition"
on:click={() => { on:click={() => {
chatDeleteId = null; chatDeleteId = null;
}} }}
@ -527,7 +526,7 @@
> >
<button <button
aria-label="Chat Menu" aria-label="Chat Menu"
class=" self-center hover:text-white transition" class=" self-center dark:hover:text-white transition"
on:click={() => { on:click={() => {
selectedChatId = chat.id; selectedChatId = chat.id;
}} }}
@ -558,7 +557,7 @@
<div class="flex flex-col"> <div class="flex flex-col">
{#if $user !== undefined} {#if $user !== undefined}
<button <button
class=" flex rounded-xl py-3 px-3.5 w-full hover:bg-gray-900 transition" class=" flex rounded-xl py-3 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-900 transition"
on:click={() => { on:click={() => {
showDropdown = !showDropdown; showDropdown = !showDropdown;
}} }}
@ -576,13 +575,13 @@
{#if showDropdown} {#if showDropdown}
<div <div
id="dropdownDots" id="dropdownDots"
class="absolute z-40 bottom-[70px] 4.5rem rounded-xl shadow w-[240px] bg-gray-900" class="absolute z-40 bottom-[70px] 4.5rem rounded-xl shadow w-[240px] bg-white dark:bg-gray-900"
in:slide={{ duration: 150 }} transition:fade|slide={{ duration: 100 }}
> >
<div class="py-2 w-full"> <div class="py-2 w-full">
{#if $user.role === 'admin'} {#if $user.role === 'admin'}
<button <button
class="flex py-2.5 px-3.5 w-full hover:bg-gray-800 transition" class="flex py-2.5 px-3.5 w-full dark:hover:bg-gray-800 transition"
on:click={() => { on:click={() => {
goto('/admin'); goto('/admin');
showDropdown = false; showDropdown = false;
@ -608,7 +607,7 @@
</button> </button>
<button <button
class="flex py-2.5 px-3.5 w-full hover:bg-gray-800 transition" class="flex py-2.5 px-3.5 w-full dark:hover:bg-gray-800 transition"
on:click={() => { on:click={() => {
goto('/playground'); goto('/playground');
showDropdown = false; showDropdown = false;
@ -635,7 +634,7 @@
{/if} {/if}
<button <button
class="flex py-2.5 px-3.5 w-full hover:bg-gray-800 transition" class="flex py-2.5 px-3.5 w-full dark:hover:bg-gray-800 transition"
on:click={async () => { on:click={async () => {
await showSettings.set(true); await showSettings.set(true);
showDropdown = false; showDropdown = false;
@ -666,11 +665,11 @@
</button> </button>
</div> </div>
<hr class=" border-gray-700 m-0 p-0" /> <hr class=" dark:border-gray-700 m-0 p-0" />
<div class="py-2 w-full"> <div class="py-2 w-full">
<button <button
class="flex py-2.5 px-3.5 w-full hover:bg-gray-800 transition" class="flex py-2.5 px-3.5 w-full dark:hover:bg-gray-800 transition"
on:click={() => { on:click={() => {
localStorage.removeItem('token'); localStorage.removeItem('token');
location.href = '/auth'; location.href = '/auth';
@ -722,7 +721,7 @@
}} }}
><span class="" data-state="closed" ><span class="" data-state="closed"
><div ><div
class="flex h-[72px] w-8 items-center justify-center opacity-20 group-hover:opacity-100 transition" class="flex h-[72px] w-8 items-center justify-center opacity-50 group-hover:opacity-100 transition"
> >
<div class="flex h-6 w-6 flex-col items-center"> <div class="flex h-6 w-6 flex-col items-center">
<div <div

View file

@ -1,5 +1,6 @@
<script lang="ts"> <script lang="ts">
import { DropdownMenu } from 'bits-ui'; import { DropdownMenu } from 'bits-ui';
import { flyAndScale } from '$lib/utils/transitions';
import Dropdown from '$lib/components/common/Dropdown.svelte'; import Dropdown from '$lib/components/common/Dropdown.svelte';
import GarbageBin from '$lib/components/icons/GarbageBin.svelte'; import GarbageBin from '$lib/components/icons/GarbageBin.svelte';
@ -25,10 +26,11 @@
<div slot="content"> <div slot="content">
<DropdownMenu.Content <DropdownMenu.Content
class="w-full max-w-[130px] rounded-lg px-1 py-1.5 border border-gray-700/50 z-50 bg-gray-850 text-white" class="w-full max-w-[130px] rounded-lg px-1 py-1.5 border border-gray-300/30 dark:border-gray-700/50 z-50 bg-white dark:bg-gray-850 dark:text-white shadow"
sideOffset={-2} sideOffset={-2}
side="bottom" side="bottom"
align="start" align="start"
transition={flyAndScale}
> >
<DropdownMenu.Item <DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer" class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer"

View file

@ -0,0 +1,363 @@
{
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'с', 'м', 'ч', 'д', 'с' или '-1' за неограничен срок.",
"(Beta)": "(Бета)",
"(e.g. `sh webui.sh --api`)": "(например `sh webui.sh --api`)",
"(latest)": "(последна)",
"{{modelName}} is thinking...": "{{modelName}} мисли ...",
"{{webUIName}} Backend Required": "{{webUIName}} Изисква се Бекенд",
"a user": "потребител",
"About": "Относно",
"Account": "Акаунт",
"Action": "Действие",
"Add a model": "Добавяне на модел",
"Add a model tag name": "Добавяне на име на таг за модел",
"Add a short description about what this modelfile does": "Добавяне на кратко описание за това какво прави този модфайл",
"Add a short title for this prompt": "Добавяне на кратко заглавие за този промпт",
"Add a tag": "Добавяне на таг",
"Add Docs": "Добавяне на Документи",
"Add Files": "Добавяне на Файлове",
"Add message": "Добавяне на съобщение",
"add tags": "добавяне на тагове",
"Adjusting these settings will apply changes universally to all users.": "При промяна на тези настройки промените се прилагат за всички потребители.",
"admin": "админ",
"Admin Panel": "Панел на Администратор",
"Admin Settings": "Настройки на Администратор",
"Advanced Parameters": "Разширени Параметри",
"all": "всички",
"All Users": "Всички Потребители",
"Allow": "Позволи",
"Allow Chat Deletion": "Позволи Изтриване на Чат",
"alphanumeric characters and hyphens": "алфанумерични знаци и тире",
"Already have an account?": "Вече имате акаунт? ",
"an assistant": "асистент",
"and": "и",
"API Base URL": "API Базов URL",
"API Key": "API Ключ",
"API RPM": "API RPM",
"are allowed - Activate this command by typing": "са разрешени - Активирайте тази команда чрез въвеждане",
"Are you sure?": "Сигурни ли сте?",
"Audio": "Аудио",
"Auto-playback response": "Аувтоматично възпроизвеждане на Отговора",
"Auto-send input after 3 sec.": "Аувтоматично изпращане на входа след 3 сек.",
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Базов URL",
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Базов URL е задължителен.",
"available!": "наличен!",
"Back": "Назад",
"Builder Mode": "Режим на Създаване",
"Cancel": "Отказ",
"Categories": "Категории",
"Change Password": "Промяна на Парола",
"Chat": "Чат",
"Chat History": "Чат История",
"Chat History is off for this browser.": "Чат История е изключен за този браузър.",
"Chats": "Чатове",
"Check Again": "Проверете Още Веднъж",
"Check for updates": "Проверка за актуализации",
"Checking for updates...": "Проверка за актуализации...",
"Choose a model before saving...": "Изберете модел преди запазване...",
"Chunk Overlap": "Chunk Overlap",
"Chunk Params": "Chunk Params",
"Chunk Size": "Chunk Size",
"Click here for help.": "Натиснете тук за помощ.",
"Click here to check other modelfiles.": "Натиснете тук за проверка на други моделфайлове.",
"Click here to select": "Натиснете тук, за да изберете",
"Click here to select documents.": "Натиснете тук, за да изберете документи.",
"click here.": "натиснете тук.",
"Click on the user role button to change a user's role.": "Натиснете върху бутона за промяна на ролята на потребителя.",
"Close": "Затвори",
"Collection": "Колекция",
"Command": "Команда",
"Confirm Password": "Потвърди Парола",
"Connections": "Връзки",
"Content": "Съдържание",
"Context Length": "Дължина на Контекста",
"Conversation Mode": "Режим на Чат",
"Copy last code block": "Копиране на последен код блок",
"Copy last response": "Копиране на последен отговор",
"Copying to clipboard was successful!": "Копирането в клипборда беше успешно!",
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Създайте кратка фраза от 3-5 думи като заглавие за следващото запитване, като стриктно спазвате ограничението от 3-5 думи и избягвате използването на думата 'заглавие':",
"Create a modelfile": "Създаване на модфайл",
"Create Account": "Създаване на Акаунт",
"Created at": "Създадено на",
"Created by": "Създадено от",
"Current Model": "Текущ модел",
"Current Password": "Текуща Парола",
"Custom": "Персонализиран",
"Customize Ollama models for a specific purpose": "Персонализиране на Ollama моделите за конкретна цел",
"Dark": "Тъмен",
"Database": "База данни",
"DD/MM/YYYY HH:mm": "DD/MM/YYYY HH:mm",
"Default": "По подразбиране",
"Default (Automatic1111)": "По подразбиране (Automatic1111)",
"Default (Web API)": "По подразбиране (Web API)",
"Default model updated": "Моделът по подразбиране е обновен",
"Default Prompt Suggestions": "Промпт Предложения по подразбиране",
"Default User Role": "Роля на потребителя по подразбиране",
"delete": "изтриване",
"Delete a model": "Изтриване на модел",
"Delete chat": "Изтриване на чат",
"Delete Chats": "Изтриване на Чатове",
"Deleted {{deleteModelTag}}": "Изтрито {{deleteModelTag}}",
"Deleted {tagName}": "Изтрито {tagName}",
"Description": "Описание",
"Desktop Notifications": "Десктоп Известия",
"Disabled": "Деактивиран",
"Discover a modelfile": "Откриване на модфайл",
"Discover a prompt": "Откриване на промпт",
"Discover, download, and explore custom prompts": "Откриване, сваляне и преглед на персонализирани промптове",
"Discover, download, and explore model presets": "Откриване, сваляне и преглед на пресетове на модели",
"Display the username instead of You in the Chat": "Показване на потребителското име вместо Вие в чата",
"Document": "Документ",
"Document Settings": "Документ Настройки",
"Documents": "Документи",
"does not make any external connections, and your data stays securely on your locally hosted server.": "няма външни връзки, и вашите данни остават сигурни на локално назначен сървър.",
"Don't Allow": "Не Позволявай",
"Don't have an account?": "Нямате акаунт?",
"Download as a File": "Сваляне като Файл",
"Download Database": "Сваляне на база данни",
"Drop any files here to add to the conversation": "Пускане на файлове тук, за да ги добавите в чата",
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "напр. '30с','10м'. Валидни единици са 'с', 'м', 'ч'.",
"Edit Doc": "Редактиране на документ",
"Edit User": "Редактиране на потребител",
"Email": "Имейл",
"Enable Chat History": "Вклюване на Чат История",
"Enable New Sign Ups": "Вклюване на Нови Потребители",
"Enabled": "Включено",
"Enter {{role}} message here": "Въведете съобщение за {{role}} тук",
"Enter API Key": "Въведете API ключ",
"Enter Chunk Overlap": "Въведете Chunk Overlap",
"Enter Chunk Size": "Въведете Chunk Size",
"Enter Image Size (e.g. 512x512)": "Въведете размер на изображението (напр. 512x512)",
"Enter LiteLLM API Base URL (litellm_params.api_base)": "Въведете LiteLLM API Base URL (litellm_params.api_base)",
"Enter LiteLLM API Key (litellm_params.api_key)": "Въведете LiteLLM API Key (litellm_params.api_key)",
"Enter LiteLLM API RPM (litellm_params.rpm)": "Въведете LiteLLM API RPM (litellm_params.rpm)",
"Enter LiteLLM Model (litellm_params.model)": "Въведете LiteLLM Model (litellm_params.model)",
"Enter Max Tokens (litellm_params.max_tokens)": "Въведете Max Tokens (litellm_params.max_tokens)",
"Enter model tag (e.g. {{modelTag}})": "Въведете таг на модел (напр. {{modelTag}})",
"Enter Number of Steps (e.g. 50)": "Въведете брой стъпки (напр. 50)",
"Enter stop sequence": "Въведете стоп последователност",
"Enter Top K": "Въведете Top K",
"Enter URL (e.g. http://127.0.0.1:7860/)": "Въведете URL (напр. http://127.0.0.1:7860/)",
"Enter Your Email": "Въведете имейл",
"Enter Your Full Name": "Въведете вашето пълно име",
"Enter Your Password": "Въведете вашата парола",
"Experimental": "Експериментално",
"Export All Chats (All Users)": "Експортване на всички чатове (За всички потребители)",
"Export Chats": "Експортване на чатове",
"Export Documents Mapping": "Експортване на документен мапинг",
"Export Modelfiles": "Експортване на модфайлове",
"Export Prompts": "Експортване на промптове",
"Failed to read clipboard contents": "Грешка при четене на съдържанието от клипборда",
"File Mode": "Файл Мод",
"File not found.": "Файл не е намерен.",
"Focus chat input": "Фокусиране на чат вход",
"Format your variables using square brackets like this:": "Форматирайте вашите променливи, като използвате квадратни скоби, както следва:",
"From (Base Model)": "От (Базов модел)",
"Full Screen Mode": "На Цял екран",
"General": "Основни",
"General Settings": "Основни Настройки",
"Hello, {{name}}": "Здравей, {{name}}",
"Hide": "Скрий",
"Hide Additional Params": "Скрий допълнителни параметри",
"How can I help you today?": "Как мога да ви помогна днес?",
"Image Generation (Experimental)": "Генерация на изображения (Експериментално)",
"Image Generation Engine": "Двигател за генериране на изображения",
"Image Settings": "Настройки на изображения",
"Images": "Изображения",
"Import Chats": "Импортване на чатове",
"Import Documents Mapping": "Импортване на документен мапинг",
"Import Modelfiles": "Импортване на модфайлове",
"Import Prompts": "Импортване на промптове",
"Include `--api` flag when running stable-diffusion-webui": "Включете флага `--api`, когато стартирате stable-diffusion-webui",
"Interface": "Интерфейс",
"join our Discord for help.": "свържете се с нашия Discord за помощ.",
"JSON": "JSON",
"JWT Expiration": "JWT Expiration",
"JWT Token": "JWT Token",
"Keep Alive": "Keep Alive",
"Keyboard shortcuts": "Клавиши за бърз достъп",
"Language": "Език",
"Light": "Светъл",
"Listening...": "Слушам...",
"LLMs can make mistakes. Verify important information.": "LLMs могат да правят грешки. Проверете важните данни.",
"Made by OpenWebUI Community": "Направено от OpenWebUI общността",
"Make sure to enclose them with": "Уверете се, че са заключени с",
"Manage LiteLLM Models": "Управление на LiteLLM Моделите",
"Manage Models": "Управление на Моделите",
"Manage Ollama Models": "Управление на Ollama Моделите",
"Max Tokens": "Max Tokens",
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимум 3 модели могат да бъдат сваляни едновременно. Моля, опитайте отново по-късно.",
"Mirostat": "Mirostat",
"Mirostat Eta": "Mirostat Eta",
"Mirostat Tau": "Mirostat Tau",
"MMMM DD, YYYY": "MMMM DD, YYYY",
"Model '{{modelName}}' has been successfully downloaded.": "Моделът '{{modelName}}' беше успешно свален.",
"Model '{{modelTag}}' is already in queue for downloading.": "Моделът '{{modelTag}}' е вече в очакване за сваляне.",
"Model {{modelId}} not found": "Моделът {{modelId}} не е намерен",
"Model {{modelName}} already exists.": "Моделът {{modelName}} вече съществува.",
"Model Name": "Име на модел",
"Model not selected": "Не е избран модел",
"Model Tag Name": "Име на таг на модел",
"Model Whitelisting": "Модел Whitelisting",
"Model(s) Whitelisted": "Модели Whitelisted",
"Modelfile": "Модфайл",
"Modelfile Advanced Settings": "Разширени настройки на модфайл",
"Modelfile Content": "Съдържание на модфайл",
"Modelfiles": "Модфайлове",
"Models": "Модели",
"My Documents": "Мои документи",
"My Modelfiles": "Мои модфайлове",
"My Prompts": "Мои промптове",
"Name": "Име",
"Name Tag": "Име Таг",
"Name your modelfile": "Име на модфайла",
"New Chat": "Нов чат",
"New Password": "Нова парола",
"Not sure what to add?": "Не сте сигурни, какво да добавите?",
"Not sure what to write? Switch to": "Не сте сигурни, какво да напишете? Превключете към",
"Off": "Изкл.",
"Okay, Let's Go!": "ОК, Нека започваме!",
"Ollama Base URL": "Ollama Базов URL",
"Ollama Version": "Ollama Версия",
"On": "Вкл.",
"Only": "Само",
"Only alphanumeric characters and hyphens are allowed in the command string.": "Само алфанумерични знаци и тире са разрешени в командния низ.",
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Упс! Задръжте! Файловете ви все още са в пещта за обработка. Готвим ги до съвършенство. Моля, бъдете търпеливи и ще ви уведомим, когато са готови.",
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Упс! Изглежда URL адресът е невалиден. Моля, проверете отново и опитайте пак.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Упс! Използвате неподдържан метод (само фронтенд). Моля, сервирайте WebUI от бекенда.",
"Open": "Отвори",
"Open AI": "Open AI",
"Open AI (Dall-E)": "Open AI (Dall-E)",
"Open new chat": "Отвори нов чат",
"OpenAI API": "OpenAI API",
"OpenAI API Key": "OpenAI API ключ",
"OpenAI API Key is required.": "OpenAI API ключ е задължителен.",
"or": "или",
"Parameters": "Параметри",
"Password": "Парола",
"PDF Extract Images (OCR)": "PDF Extract Images (OCR)",
"pending": "в очакване",
"Permission denied when accessing microphone: {{error}}": "Permission denied when accessing microphone: {{error}}",
"Playground": "Плейграунд",
"Profile": "Профил",
"Prompt Content": "Съдържание на промпта",
"Prompt suggestions": "Промпт предложения",
"Prompts": "Промптове",
"Pull a model from Ollama.com": "Издърпайте модел от Ollama.com",
"Pull Progress": "Прогрес на издърпването",
"Query Params": "Query Параметри",
"RAG Template": "RAG Шаблон",
"Raw Format": "Raw Формат",
"Record voice": "Записване на глас",
"Redirecting you to OpenWebUI Community": "Пренасочване към OpenWebUI общността",
"Release Notes": "Бележки по изданието",
"Repeat Last N": "Repeat Last N",
"Repeat Penalty": "Repeat Penalty",
"Request Mode": "Request Mode",
"Reset Vector Storage": "Ресет Vector Storage",
"Response AutoCopy to Clipboard": "Аувтоматично копиране на отговор в клипборда",
"Role": "Роля",
"Rosé Pine": "Rosé Pine",
"Rosé Pine Dawn": "Rosé Pine Dawn",
"Save": "Запис",
"Save & Create": "Запис & Създаване",
"Save & Submit": "Запис & Изпращане",
"Save & Update": "Запис & Актуализиране",
"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!": "Сканиране завършено!",
"Scan for documents from {{path}}": "Сканиране за документи в {{path}}",
"Search": "Търси",
"Search Documents": "Търси Документи",
"Search Prompts": "Търси Промптове",
"See readme.md for instructions": "Виж readme.md за инструкции",
"See what's new": "Виж какво е новото",
"Seed": "Seed",
"Select a mode": "Изберете режим",
"Select a model": "Изберете модел",
"Select an Ollama instance": "Изберете Ollama инстанция",
"Send a Message": "Изпращане на Съобщение",
"Send message": "Изпращане на съобщение",
"Server connection verified": "Server connection verified",
"Set as default": "Задай като по подразбиране",
"Set Default Model": "Задай Модел По Подразбиране",
"Set Image Size": "Задай Размер на Изображението",
"Set Steps": "Задай Стъпки",
"Set Title Auto-Generation Model": "Задай Модел за Автоматично Генериране на Заглавие",
"Set Voice": "Задай Глас",
"Settings": "Настройки",
"Settings saved successfully!": "Настройките са запазени успешно!",
"Share to OpenWebUI Community": "Споделите с OpenWebUI Общността",
"short-summary": "short-summary",
"Show": "Покажи",
"Show Additional Params": "Покажи допълнителни параметри",
"Show shortcuts": "Покажи",
"sidebar": "sidebar",
"Sign in": "Вписване",
"Sign Out": "Изход",
"Sign up": "Регистрация",
"Speech recognition error: {{error}}": "Speech recognition error: {{error}}",
"Speech-to-Text Engine": "Speech-to-Text Engine",
"SpeechRecognition API is not supported in this browser.": "SpeechRecognition API is not supported in this browser.",
"Stop Sequence": "Stop Sequence",
"STT Settings": "STT Настройки",
"Submit": "Изпращане",
"Success": "Успех",
"Successfully updated.": "Успешно обновено.",
"Sync All": "Синхронизиране на всички",
"System": "Система",
"System Prompt": "Системен Промпт",
"Tags": "Тагове",
"Temperature": "Температура",
"Template": "Шаблон",
"Text Completion": "Text Completion",
"Text-to-Speech Engine": "Text-to-Speech Engine",
"Tfs Z": "Tfs Z",
"Theme": "Тема",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Това гарантира, че ценните ви разговори се запазват сигурно във вашата бекенд база данни. Благодарим ви!",
"This setting does not sync across browsers or devices.": "Тази настройка не се синхронизира между браузъри или устройства.",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Съвет: Актуализирайте няколко слота за променливи последователно, като натискате клавиша Tab в чат входа след всяка подмяна.",
"Title": "Заглавие",
"Title Auto-Generation": "Автоматично Генериране на Заглавие",
"Title Generation Prompt": "Промпт за Генериране на Заглавие",
"to": "до",
"To access the available model names for downloading,": "За да получите достъп до наличните имена на модели за изтегляне,",
"To access the GGUF models available for downloading,": "За да получите достъп до GGUF моделите, налични за изтегляне,",
"to chat input.": "към чат входа.",
"Toggle settings": "Toggle settings",
"Toggle sidebar": "Toggle sidebar",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Проблеми с достъпът до Ollama?",
"TTS Settings": "TTS Настройки",
"Type Hugging Face Resolve (Download) URL": "Въведете Hugging Face Resolve (Download) URL",
"Uh-oh! There was an issue connecting to {{provider}}.": "О, не! Възникна проблем при свързването с {{provider}}.",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Непознат файлов тип '{{file_type}}', но се приема и обработва като текст",
"Update password": "Обновяване на парола",
"Upload a GGUF model": "Качване на GGUF модел",
"Upload files": "Качване на файлове",
"Upload Progress": "Прогрес на качването",
"URL Mode": "URL Mode",
"Use '#' in the prompt input to load and select your documents.": "Използвайте '#' във промпта за да заредите и изберете вашите документи.",
"Use Gravatar": "Използвайте Gravatar",
"user": "потребител",
"User Permissions": "Права на потребителя",
"Users": "Потребители",
"Utilize": "Използване",
"Valid time units:": "Валидни единици за време:",
"variable": "променлива",
"variable to have them replaced with clipboard content.": "променливи да се заменят съдържанието от клипборд.",
"Version": "Версия",
"Web": "Уеб",
"WebUI Add-ons": "WebUI Добавки",
"WebUI Settings": "WebUI Настройки",
"WebUI will make requests to": "WebUI ще направи заявки към",
"Whats New in": "Какво е новото в",
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Когато историята е изключена, нови чатове в този браузър ще не се показват в историята на никои от вашия профил.",
"Whisper (Local)": "Whisper (Локален)",
"Write a prompt suggestion (e.g. Who are you?)": "Напиши предложение за промпт (напр. Кой сте вие?)",
"Write a summary in 50 words that summarizes [topic or keyword].": "Напиши описание в 50 знака, което описва [тема или ключова дума].",
"You": "Вие",
"You're a helpful assistant.": "Вие сте полезен асистент.",
"You're now logged in.": "Сега, вие влязохте в системата."
}

View file

@ -0,0 +1,363 @@
{
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' or '-1' per no caduca mai.",
"(Beta)": "(Beta)",
"(e.g. `sh webui.sh --api`)": "(p. ex. `sh webui.sh --api`)",
"(latest)": "(últim)",
"{{modelName}} is thinking...": "{{modelName}} està pensant...",
"{{webUIName}} Backend Required": "Es requereix Backend de {{webUIName}}",
"a user": "un usuari",
"About": "Sobre",
"Account": "Compte",
"Action": "Acció",
"Add a model": "Afegeix un model",
"Add a model tag name": "Afegeix un nom d'etiqueta de model",
"Add a short description about what this modelfile does": "Afegeix una descripció curta del que fa aquest arxiu de model",
"Add a short title for this prompt": "Afegeix un títol curt per aquest prompt",
"Add a tag": "Afegeix una etiqueta",
"Add Docs": "Afegeix Documents",
"Add Files": "Afegeix Arxius",
"Add message": "Afegeix missatge",
"add tags": "afegeix etiquetes",
"Adjusting these settings will apply changes universally to all users.": "Ajustar aquests paràmetres aplicarà canvis de manera universal a tots els usuaris.",
"admin": "administrador",
"Admin Panel": "Panell d'Administració",
"Admin Settings": "Configuració d'Administració",
"Advanced Parameters": "Paràmetres Avançats",
"all": "tots",
"All Users": "Tots els Usuaris",
"Allow": "Permet",
"Allow Chat Deletion": "Permet la Supressió del Xat",
"alphanumeric characters and hyphens": "caràcters alfanumèrics i guions",
"Already have an account?": "Ja tens un compte?",
"an assistant": "un assistent",
"and": "i",
"API Base URL": "URL Base de l'API",
"API Key": "Clau de l'API",
"API RPM": "RPM de l'API",
"are allowed - Activate this command by typing": "estan permesos - Activa aquesta comanda escrivint",
"Are you sure?": "Estàs segur?",
"Audio": "Àudio",
"Auto-playback response": "Resposta de reproducció automàtica",
"Auto-send input after 3 sec.": "Enviar entrada automàticament després de 3 segons",
"AUTOMATIC1111 Base URL": "URL Base AUTOMATIC1111",
"AUTOMATIC1111 Base URL is required.": "Es requereix l'URL Base AUTOMATIC1111.",
"available!": "disponible!",
"Back": "Enrere",
"Builder Mode": "Mode Constructor",
"Cancel": "Cancel·la",
"Categories": "Categories",
"Change Password": "Canvia la Contrasenya",
"Chat": "Xat",
"Chat History": "Històric del Xat",
"Chat History is off for this browser.": "L'historial de xat està desactivat per a aquest navegador.",
"Chats": "Xats",
"Check Again": "Comprova-ho de Nou",
"Check for updates": "Comprova si hi ha actualitzacions",
"Checking for updates...": "Comprovant actualitzacions...",
"Choose a model before saving...": "Tria un model abans de guardar...",
"Chunk Overlap": "Solapament de Blocs",
"Chunk Params": "Paràmetres de Blocs",
"Chunk Size": "Mida del Bloc",
"Click here for help.": "Fes clic aquí per ajuda.",
"Click here to check other modelfiles.": "Fes clic aquí per comprovar altres fitxers de model.",
"Click here to select": "Fes clic aquí per seleccionar",
"Click here to select documents.": "Fes clic aquí per seleccionar documents.",
"click here.": "fes clic aquí.",
"Click on the user role button to change a user's role.": "Fes clic al botó de rol d'usuari per canviar el rol d'un usuari.",
"Close": "Tanca",
"Collection": "Col·lecció",
"Command": "Comanda",
"Confirm Password": "Confirma la Contrasenya",
"Connections": "Connexions",
"Content": "Contingut",
"Context Length": "Longitud del Context",
"Conversation Mode": "Mode de Conversa",
"Copy last code block": "Copia l'últim bloc de codi",
"Copy last response": "Copia l'última resposta",
"Copying to clipboard was successful!": "La còpia al porta-retalls ha estat exitosa!",
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Crea una frase concisa de 3-5 paraules com a capçalera per a la següent consulta, seguint estrictament el límit de 3-5 paraules i evitant l'ús de la paraula 'títol':",
"Create a modelfile": "Crea un fitxer de model",
"Create Account": "Crea un Compte",
"Created at": "Creat el",
"Created by": "Creat per",
"Current Model": "Model Actual",
"Current Password": "Contrasenya Actual",
"Custom": "Personalitzat",
"Customize Ollama models for a specific purpose": "Personalitza els models Ollama per a un propòsit específic",
"Dark": "Fosc",
"Database": "Base de Dades",
"DD/MM/YYYY HH:mm": "DD/MM/YYYY HH:mm",
"Default": "Per defecte",
"Default (Automatic1111)": "Per defecte (Automatic1111)",
"Default (Web API)": "Per defecte (Web API)",
"Default model updated": "Model per defecte actualitzat",
"Default Prompt Suggestions": "Suggeriments de Prompt Per Defecte",
"Default User Role": "Rol d'Usuari Per Defecte",
"delete": "esborra",
"Delete a model": "Esborra un model",
"Delete chat": "Esborra xat",
"Delete Chats": "Esborra Xats",
"Deleted {{deleteModelTag}}": "Esborrat {{deleteModelTag}}",
"Deleted {tagName}": "Esborrat {tagName}",
"Description": "Descripció",
"Desktop Notifications": "Notificacions d'Escriptori",
"Disabled": "Desactivat",
"Discover a modelfile": "Descobreix un fitxer de model",
"Discover a prompt": "Descobreix un prompt",
"Discover, download, and explore custom prompts": "Descobreix, descarrega i explora prompts personalitzats",
"Discover, download, and explore model presets": "Descobreix, descarrega i explora presets de models",
"Display the username instead of You in the Chat": "Mostra el nom d'usuari en lloc de 'Tu' al Xat",
"Document": "Document",
"Document Settings": "Configuració de Documents",
"Documents": "Documents",
"does not make any external connections, and your data stays securely on your locally hosted server.": "no realitza connexions externes, i les teves dades romanen segures al teu servidor allotjat localment.",
"Don't Allow": "No Permetre",
"Don't have an account?": "No tens un compte?",
"Download as a File": "Descarrega com a Arxiu",
"Download Database": "Descarrega Base de Dades",
"Drop any files here to add to the conversation": "Deixa qualsevol arxiu aquí per afegir-lo a la conversa",
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "p. ex. '30s','10m'. Les unitats de temps vàlides són 's', 'm', 'h'.",
"Edit Doc": "Edita Document",
"Edit User": "Edita Usuari",
"Email": "Correu electrònic",
"Enable Chat History": "Activa Historial de Xat",
"Enable New Sign Ups": "Permet Noves Inscripcions",
"Enabled": "Activat",
"Enter {{role}} message here": "Introdueix aquí el missatge de {{role}}",
"Enter API Key": "Introdueix la Clau API",
"Enter Chunk Overlap": "Introdueix el Solapament de Blocs",
"Enter Chunk Size": "Introdueix la Mida del Bloc",
"Enter Image Size (e.g. 512x512)": "Introdueix la Mida de la Imatge (p. ex. 512x512)",
"Enter LiteLLM API Base URL (litellm_params.api_base)": "Introdueix l'URL Base de LiteLLM API (litellm_params.api_base)",
"Enter LiteLLM API Key (litellm_params.api_key)": "Introdueix la Clau de LiteLLM API (litellm_params.api_key)",
"Enter LiteLLM API RPM (litellm_params.rpm)": "Introdueix RPM de LiteLLM API (litellm_params.rpm)",
"Enter LiteLLM Model (litellm_params.model)": "Introdueix el Model de LiteLLM (litellm_params.model)",
"Enter Max Tokens (litellm_params.max_tokens)": "Introdueix el Màxim de Tokens (litellm_params.max_tokens)",
"Enter model tag (e.g. {{modelTag}})": "Introdueix l'etiqueta del model (p. ex. {{modelTag}})",
"Enter Number of Steps (e.g. 50)": "Introdueix el Nombre de Passos (p. ex. 50)",
"Enter stop sequence": "Introdueix la seqüència de parada",
"Enter Top K": "Introdueix Top K",
"Enter URL (e.g. http://127.0.0.1:7860/)": "Introdueix l'URL (p. ex. http://127.0.0.1:7860/)",
"Enter Your Email": "Introdueix el Teu Correu Electrònic",
"Enter Your Full Name": "Introdueix el Teu Nom Complet",
"Enter Your Password": "Introdueix la Teva Contrasenya",
"Experimental": "Experimental",
"Export All Chats (All Users)": "Exporta Tots els Xats (Tots els Usuaris)",
"Export Chats": "Exporta Xats",
"Export Documents Mapping": "Exporta el Mapatge de Documents",
"Export Modelfiles": "Exporta Fitxers de Model",
"Export Prompts": "Exporta Prompts",
"Failed to read clipboard contents": "No s'ha pogut llegir el contingut del porta-retalls",
"File Mode": "Mode Arxiu",
"File not found.": "Arxiu no trobat.",
"Focus chat input": "Enfoca l'entrada del xat",
"Format your variables using square brackets like this:": "Formata les teves variables utilitzant claudàtors així:",
"From (Base Model)": "Des de (Model Base)",
"Full Screen Mode": "Mode de Pantalla Completa",
"General": "General",
"General Settings": "Configuració General",
"Hello, {{name}}": "Hola, {{name}}",
"Hide": "Amaga",
"Hide Additional Params": "Amaga Paràmetres Addicionals",
"How can I help you today?": "Com et puc ajudar avui?",
"Image Generation (Experimental)": "Generació d'Imatges (Experimental)",
"Image Generation Engine": "Motor de Generació d'Imatges",
"Image Settings": "Configuració d'Imatges",
"Images": "Imatges",
"Import Chats": "Importa Xats",
"Import Documents Mapping": "Importa el Mapa de Documents",
"Import Modelfiles": "Importa Fitxers de Model",
"Import Prompts": "Importa Prompts",
"Include `--api` flag when running stable-diffusion-webui": "Inclou la bandera `--api` quan executis stable-diffusion-webui",
"Interface": "Interfície",
"join our Discord for help.": "uneix-te al nostre Discord per ajuda.",
"JSON": "JSON",
"JWT Expiration": "Expiració de JWT",
"JWT Token": "Token JWT",
"Keep Alive": "Mantén Actiu",
"Keyboard shortcuts": "Dreceres de Teclat",
"Language": "Idioma",
"Light": "Clar",
"Listening...": "Escoltant...",
"LLMs can make mistakes. Verify important information.": "Els LLMs poden cometre errors. Verifica la informació important.",
"Made by OpenWebUI Community": "Creat per la Comunitat OpenWebUI",
"Make sure to enclose them with": "Assegura't d'envoltar-los amb",
"Manage LiteLLM Models": "Gestiona Models LiteLLM",
"Manage Models": "Gestiona Models",
"Manage Ollama Models": "Gestiona Models Ollama",
"Max Tokens": "Màxim de Tokens",
"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.",
"Mirostat": "Mirostat",
"Mirostat Eta": "Eta de Mirostat",
"Mirostat Tau": "Tau de Mirostat",
"MMMM DD, YYYY": "DD de MMMM, YYYY",
"Model '{{modelName}}' has been successfully downloaded.": "El model '{{modelName}}' s'ha descarregat amb èxit.",
"Model '{{modelTag}}' is already in queue for downloading.": "El model '{{modelTag}}' ja està en cua per ser descarregat.",
"Model {{modelId}} not found": "Model {{modelId}} no trobat",
"Model {{modelName}} already exists.": "El model {{modelName}} ja existeix.",
"Model Name": "Nom del Model",
"Model not selected": "Model no seleccionat",
"Model Tag Name": "Nom de l'Etiqueta del Model",
"Model Whitelisting": "Llista Blanca de Models",
"Model(s) Whitelisted": "Model(s) a la Llista Blanca",
"Modelfile": "Fitxer de Model",
"Modelfile Advanced Settings": "Configuració Avançada de Fitxers de Model",
"Modelfile Content": "Contingut del Fitxer de Model",
"Modelfiles": "Fitxers de Model",
"Models": "Models",
"My Documents": "Els Meus Documents",
"My Modelfiles": "Els Meus Fitxers de Model",
"My Prompts": "Els Meus Prompts",
"Name": "Nom",
"Name Tag": "Etiqueta de Nom",
"Name your modelfile": "Nomena el teu fitxer de model",
"New Chat": "Xat Nou",
"New Password": "Nova Contrasenya",
"Not sure what to add?": "No estàs segur del que afegir?",
"Not sure what to write? Switch to": "No estàs segur del que escriure? Canvia a",
"Off": "Desactivat",
"Okay, Let's Go!": "D'acord, Anem!",
"Ollama Base URL": "URL Base d'Ollama",
"Ollama Version": "Versió d'Ollama",
"On": "Activat",
"Only": "Només",
"Only alphanumeric characters and hyphens are allowed in the command string.": "Només es permeten caràcters alfanumèrics i guions en la cadena de comandes.",
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Ui! Aguanta! Els teus fitxers encara estan en el forn de processament. Els estem cuinant a la perfecció. Si us plau, tingues paciència i t'avisarem quan estiguin llestos.",
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Ui! Sembla que l'URL és invàlida. Si us plau, revisa-ho i prova de nou.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ui! Estàs utilitzant un mètode no suportat (només frontend). Si us plau, serveix la WebUI des del backend.",
"Open": "Obre",
"Open AI": "Open AI",
"Open AI (Dall-E)": "Open AI (Dall-E)",
"Open new chat": "Obre un nou xat",
"OpenAI API": "API d'OpenAI",
"OpenAI API Key": "Clau API d'OpenAI",
"OpenAI API Key is required.": "Es requereix la Clau API d'OpenAI.",
"or": "o",
"Parameters": "Paràmetres",
"Password": "Contrasenya",
"PDF Extract Images (OCR)": "Extreu Imatges de PDF (OCR)",
"pending": "pendent",
"Permission denied when accessing microphone: {{error}}": "Permís denegat en accedir al micròfon: {{error}}",
"Playground": "Zona de Jocs",
"Profile": "Perfil",
"Prompt Content": "Contingut del Prompt",
"Prompt suggestions": "Suggeriments de Prompt",
"Prompts": "Prompts",
"Pull a model from Ollama.com": "Treu un model d'Ollama.com",
"Pull Progress": "Progrés de Tracció",
"Query Params": "Paràmetres de Consulta",
"RAG Template": "Plantilla RAG",
"Raw Format": "Format Brut",
"Record voice": "Enregistra veu",
"Redirecting you to OpenWebUI Community": "Redirigint-te a la Comunitat OpenWebUI",
"Release Notes": "Notes de la Versió",
"Repeat Last N": "Repeteix Últim N",
"Repeat Penalty": "Penalització de Repetició",
"Request Mode": "Mode de Sol·licitud",
"Reset Vector Storage": "Reinicia l'Emmagatzematge de Vectors",
"Response AutoCopy to Clipboard": "Resposta AutoCopiar al Portapapers",
"Role": "Rol",
"Rosé Pine": "Rosé Pine",
"Rosé Pine Dawn": "Albada Rosé Pine",
"Save": "Guarda",
"Save & Create": "Guarda i Crea",
"Save & Submit": "Guarda i Envia",
"Save & Update": "Guarda i Actualitza",
"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": "Guardar registres de xat directament a l'emmagatzematge del teu navegador ja no és suportat. Si us plau, pren un moment per descarregar i eliminar els teus registres de xat fent clic al botó de sota. No et preocupis, pots reimportar fàcilment els teus registres de xat al backend a través de",
"Scan": "Escaneja",
"Scan complete!": "Escaneig completat!",
"Scan for documents from {{path}}": "Escaneja documents des de {{path}}",
"Search": "Cerca",
"Search Documents": "Cerca Documents",
"Search Prompts": "Cerca Prompts",
"See readme.md for instructions": "Consulta el readme.md per a instruccions",
"See what's new": "Veure novetats",
"Seed": "Llavor",
"Select a mode": "Selecciona un mode",
"Select a model": "Selecciona un model",
"Select an Ollama instance": "Selecciona una instància d'Ollama",
"Send a Message": "Envia un Missatge",
"Send message": "Envia missatge",
"Server connection verified": "Connexió al servidor verificada",
"Set as default": "Estableix com a predeterminat",
"Set Default Model": "Estableix Model Predeterminat",
"Set Image Size": "Estableix Mida de la Imatge",
"Set Steps": "Estableix Passos",
"Set Title Auto-Generation Model": "Estableix Model d'Auto-Generació de Títol",
"Set Voice": "Estableix Veu",
"Settings": "Configuracions",
"Settings saved successfully!": "Configuracions guardades amb èxit!",
"Share to OpenWebUI Community": "Comparteix amb la Comunitat OpenWebUI",
"short-summary": "resum curt",
"Show": "Mostra",
"Show Additional Params": "Mostra Paràmetres Addicionals",
"Show shortcuts": "Mostra dreceres",
"sidebar": "barra lateral",
"Sign in": "Inicia sessió",
"Sign Out": "Tanca sessió",
"Sign up": "Registra't",
"Speech recognition error: {{error}}": "Error de reconeixement de veu: {{error}}",
"Speech-to-Text Engine": "Motor de Veu a Text",
"SpeechRecognition API is not supported in this browser.": "L'API de Reconèixer Veu no és compatible amb aquest navegador.",
"Stop Sequence": "Atura Seqüència",
"STT Settings": "Configuracions STT",
"Submit": "Envia",
"Success": "Èxit",
"Successfully updated.": "Actualitzat amb èxit.",
"Sync All": "Sincronitza Tot",
"System": "Sistema",
"System Prompt": "Prompt del Sistema",
"Tags": "Etiquetes",
"Temperature": "Temperatura",
"Template": "Plantilla",
"Text Completion": "Completació de Text",
"Text-to-Speech Engine": "Motor de Text a Veu",
"Tfs Z": "Tfs Z",
"Theme": "Tema",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Això assegura que les teves converses valuoses queden segurament guardades a la teva base de dades backend. Gràcies!",
"This setting does not sync across browsers or devices.": "Aquesta configuració no es sincronitza entre navegadors ni dispositius.",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Consell: Actualitza diversos espais de variables consecutivament prement la tecla de tabulació en l'entrada del xat després de cada reemplaçament.",
"Title": "Títol",
"Title Auto-Generation": "Auto-Generació de Títol",
"Title Generation Prompt": "Prompt de Generació de Títol",
"to": "a",
"To access the available model names for downloading,": "Per accedir als noms dels models disponibles per descarregar,",
"To access the GGUF models available for downloading,": "Per accedir als models GGUF disponibles per descarregar,",
"to chat input.": "a l'entrada del xat.",
"Toggle settings": "Commuta configuracions",
"Toggle sidebar": "Commuta barra lateral",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Problemes accedint a Ollama?",
"TTS Settings": "Configuracions TTS",
"Type Hugging Face Resolve (Download) URL": "Escriu URL de Resolució (Descàrrega) de Hugging Face",
"Uh-oh! There was an issue connecting to {{provider}}.": "Uf! Hi va haver un problema connectant-se a {{provider}}.",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Tipus d'Arxiu Desconegut '{{file_type}}', però acceptant i tractant com a text pla",
"Update password": "Actualitza contrasenya",
"Upload a GGUF model": "Puja un model GGUF",
"Upload files": "Puja arxius",
"Upload Progress": "Progrés de Càrrega",
"URL Mode": "Mode URL",
"Use '#' in the prompt input to load and select your documents.": "Utilitza '#' a l'entrada del prompt per carregar i seleccionar els teus documents.",
"Use Gravatar": "Utilitza Gravatar",
"user": "usuari",
"User Permissions": "Permisos d'Usuari",
"Users": "Usuaris",
"Utilize": "Utilitza",
"Valid time units:": "Unitats de temps vàlides:",
"variable": "variable",
"variable to have them replaced with clipboard content.": "variable per tenir-les reemplaçades amb el contingut del porta-retalls.",
"Version": "Versió",
"Web": "Web",
"WebUI Add-ons": "Complements de WebUI",
"WebUI Settings": "Configuració de WebUI",
"WebUI will make requests to": "WebUI farà peticions a",
"Whats New in": "Què hi ha de Nou en",
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Quan l'historial està desactivat, els nous xats en aquest navegador no apareixeran en el teu historial en cap dels teus dispositius.",
"Whisper (Local)": "Whisper (Local)",
"Write a prompt suggestion (e.g. Who are you?)": "Escriu una suggerència de prompt (p. ex. Qui ets tu?)",
"Write a summary in 50 words that summarizes [topic or keyword].": "Escriu un resum en 50 paraules que resumeixi [tema o paraula clau].",
"You": "Tu",
"You're a helpful assistant.": "Ets un assistent útil.",
"You're now logged in.": "Ara estàs connectat."
}

View file

@ -276,7 +276,7 @@
"Select a mode": "", "Select a mode": "",
"Select a model": "Ein Modell auswählen", "Select a model": "Ein Modell auswählen",
"Select an Ollama instance": "", "Select an Ollama instance": "",
"Send a Messsage": "Eine Nachricht senden", "Send a Message": "Eine Nachricht senden",
"Send message": "Nachricht senden", "Send message": "Nachricht senden",
"Server connection verified": "Serververbindung überprüft", "Server connection verified": "Serververbindung überprüft",
"Set as default": "Als Standard festlegen", "Set as default": "Als Standard festlegen",

View file

@ -276,7 +276,7 @@
"Select a mode": "", "Select a mode": "",
"Select a model": "Select a model", "Select a model": "Select a model",
"Select an Ollama instance": "", "Select an Ollama instance": "",
"Send a Messsage": "Send a Messsage", "Send a Message": "Send a Message",
"Send message": "Send message", "Send message": "Send message",
"Server connection verified": "Server connection verified", "Server connection verified": "Server connection verified",
"Set as default": "Set as default", "Set as default": "Set as default",

View file

@ -0,0 +1,363 @@
{
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' o '-1' para evitar expiración.",
"(Beta)": "(Beta)",
"(e.g. `sh webui.sh --api`)": "(p.ej. `sh webui.sh --api`)",
"(latest)": "(latest)",
"{{modelName}} is thinking...": "{{modelName}} está pensando...",
"{{webUIName}} Backend Required": "{{webUIName}} Servidor Requerido",
"a user": "un usuario",
"About": "Sobre nosotros",
"Account": "Cuenta",
"Action": "Acción",
"Add a model": "Agregar un modelo",
"Add a model tag name": "Agregar un nombre de etiqueta de modelo",
"Add a short description about what this modelfile does": "Agregue una descripción corta de lo que este modelfile hace",
"Add a short title for this prompt": "Agregue un título corto para este Prompt",
"Add a tag": "Agregar una etiqueta",
"Add Docs": "Agregar Documentos",
"Add Files": "Agregar Archivos",
"Add message": "Agregar Prompt",
"add tags": "agregar etiquetas",
"Adjusting these settings will apply changes universally to all users.": "Ajustar estas opciones aplicará los cambios universalmente a todos los usuarios.",
"admin": "admin",
"Admin Panel": "Panel de Administrador",
"Admin Settings": "Configuración de Administrador",
"Advanced Parameters": "Parametros Avanzados",
"all": "todo",
"All Users": "Todos los Usuarios",
"Allow": "Permitir",
"Allow Chat Deletion": "Permitir Borrar Chats",
"alphanumeric characters and hyphens": "caracteres alfanuméricos y guiones",
"Already have an account?": "¿Ya tienes una cuenta?",
"an assistant": "un asistente",
"and": "y",
"API Base URL": "Dirección URL de la API",
"API Key": "Clave de la API ",
"API RPM": "RPM de la API",
"are allowed - Activate this command by typing": "están permitidos - Active este comando escribiendo",
"Are you sure?": "Esta usted seguro?",
"Audio": "Audio",
"Auto-playback response": "Respuesta de reproducción automática",
"Auto-send input after 3 sec.": "Envía la información entrada automáticamente luego de 3 segundos.",
"AUTOMATIC1111 Base URL": "Dirección URL de AUTOMATIC1111",
"AUTOMATIC1111 Base URL is required.": "La dirección URL de AUTOMATIC1111 es requerida.",
"available!": "¡disponible!",
"Back": "Vuelve atrás",
"Builder Mode": "Modo de Constructor",
"Cancel": "Cancela",
"Categories": "Categorías",
"Change Password": "Cambia la Contraseña",
"Chat": "Chat",
"Chat History": "Historial del Chat",
"Chat History is off for this browser.": "El Historial del Chat está apagado para este navegador.",
"Chats": "Chats",
"Check Again": "Verifica de nuevo",
"Check for updates": "Verifica actualizaciones",
"Checking for updates...": "Verificando actualizaciones...",
"Choose a model before saving...": "Escoge un modelo antes de guardar los cambios...",
"Chunk Overlap": "Superposición de fragmentos",
"Chunk Params": "Parámetros de fragmentos",
"Chunk Size": "Tamaño de fragmentos",
"Click here for help.": "Presiona aquí para ayuda.",
"Click here to check other modelfiles.": "Presiona aquí para otros modelfiles.",
"Click here to select": "Presiona aquí para seleccionar",
"Click here to select documents.": "Presiona aquí para seleccionar documentos",
"click here.": "Presiona aquí.",
"Click on the user role button to change a user's role.": "Presiona en el botón de roles del usuario para cambiar el rol de un usuario.",
"Close": "Cerrar",
"Collection": "Colección",
"Command": "Comando",
"Confirm Password": "Confirmar Contraseña",
"Connections": "Conexiones",
"Content": "Contenido",
"Context Length": "Largura del contexto",
"Conversation Mode": "Modo de Conversación",
"Copy last code block": "Copia el último bloque de código",
"Copy last response": "Copia la última respuesta",
"Copying to clipboard was successful!": "¡Copiar al portapapeles fue exitoso!",
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Cree una frase concisa de 3 a 5 palabras como encabezado para la siguiente consulta, respetando estrictamente el límite de 3 a 5 palabras y evitando el uso de la palabra 'título':",
"Create a modelfile": "Crea un modelfile",
"Create Account": "Crear una cuenta",
"Created at": "Creado en",
"Created by": "Creado por",
"Current Model": "Modelo Actual",
"Current Password": "Contraseña Actual",
"Custom": "Personalizado",
"Customize Ollama models for a specific purpose": "Personaliza modelos de Ollama para un propósito específico",
"Dark": "Oscuro",
"Database": "Base de datos",
"DD/MM/YYYY HH:mm": "DD/MM/YYYY HH:mm",
"Default": "Por defecto",
"Default (Automatic1111)": "Por defecto (Automatic1111)",
"Default (Web API)": "Por defecto (Web API)",
"Default model updated": "El modelo por defecto ha sido actualizado",
"Default Prompt Suggestions": "Sugerencias de mensajes por defecto",
"Default User Role": "Rol por defecto para usuarios",
"delete": "borrar",
"Delete a model": "Borra un modelo",
"Delete chat": "Borrar chat",
"Delete Chats": "Borrar Chats",
"Deleted {{deleteModelTag}}": "Se borró {{deleteModelTag}}",
"Deleted {tagName}": "Se borró {tagName}",
"Description": "Descripción",
"Desktop Notifications": "Notificaciones",
"Disabled": "Desactivado",
"Discover a modelfile": "Descubre un modelfile",
"Discover a prompt": "Descubre un Prompt",
"Discover, download, and explore custom prompts": "Descubre, descarga, y explora Prompts personalizados",
"Discover, download, and explore model presets": "Descubra, descargue y explore ajustes preestablecidos de modelos",
"Display the username instead of You in the Chat": "Mostrar el nombre de usuario en lugar de Usted en el chat",
"Document": "Documento",
"Document Settings": "Configuración de Documento",
"Documents": "Documentos",
"does not make any external connections, and your data stays securely on your locally hosted server.": "no realiza ninguna conexión externa y sus datos permanecen seguros en su servidor alojado localmente.",
"Don't Allow": "No Permitir",
"Don't have an account?": "No tienes una cuenta?",
"Download as a File": "Descarga como un Archivo",
"Download Database": "Descarga la Base de Datos",
"Drop any files here to add to the conversation": "Suelta cualquier archivo aquí para agregarlo a la conversación",
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "p.ej. '30s','10m'. Unidades válidas de tiempo son 's', 'm', 'h'.",
"Edit Doc": "Editar Documento",
"Edit User": "Editar Usuario",
"Email": "Email",
"Enable Chat History": "Activa el Historial de Chat",
"Enable New Sign Ups": "Habilitar Nuevos Registros",
"Enabled": "Habilitado",
"Enter {{role}} message here": "Introduzca el mensaje {{role}} aquí",
"Enter API Key": "Ingrese la clave API",
"Enter Chunk Overlap": "Ingresar superposición de fragmentos",
"Enter Chunk Size": "Introduzca el tamaño del fragmento",
"Enter Image Size (e.g. 512x512)": "Ingrese el tamaño de la imagen (p.ej. 512x512)",
"Enter LiteLLM API Base URL (litellm_params.api_base)": "Ingrese la URL base de la API LiteLLM (litellm_params.api_base)",
"Enter LiteLLM API Key (litellm_params.api_key)": "Ingrese la clave API LiteLLM (litellm_params.api_key)",
"Enter LiteLLM API RPM (litellm_params.rpm)": "Ingrese el RPM de la API LiteLLM (litellm_params.rpm)",
"Enter LiteLLM Model (litellm_params.model)": "Ingrese el modelo LiteLLM (litellm_params.model)",
"Enter Max Tokens (litellm_params.max_tokens)": "Ingrese tokens máximos (litellm_params.max_tokens)",
"Enter model tag (e.g. {{modelTag}})": "Ingrese la etiqueta del modelo (p.ej. {{modelTag}})",
"Enter Number of Steps (e.g. 50)": "Ingrese el número de pasos (p.ej., 50)",
"Enter stop sequence": "Introduzca la secuencia de parada",
"Enter Top K": "Introduzca el Top K",
"Enter URL (e.g. http://127.0.0.1:7860/)": "Ingrese la URL (p.ej., http://127.0.0.1:7860/)",
"Enter Your Email": "Introduce tu correo electrónico",
"Enter Your Full Name": "Introduce tu nombre completo",
"Enter Your Password": "Introduce tu contraseña",
"Experimental": "Experimental",
"Export All Chats (All Users)": "Exportar todos los chats (Todos los usuarios)",
"Export Chats": "Exportar Chats",
"Export Documents Mapping": "Exportar el mapeo de documentos",
"Export Modelfiles": "Exportal Modelfiles",
"Export Prompts": "Exportar Prompts",
"Failed to read clipboard contents": "No se pudo leer el contenido del portapapeles",
"File Mode": "Modo de archivo",
"File not found.": "Archivo no encontrado.",
"Focus chat input": "Enfoca la entrada del chat",
"Format your variables using square brackets like this:": "Formatee sus variables usando corchetes así:",
"From (Base Model)": "Desde (Modelo Base)",
"Full Screen Mode": "Modo de Pantalla Completa",
"General": "General",
"General Settings": "Opciones Generales",
"Hello, {{name}}": "Hola, {{name}}",
"Hide": "Esconder",
"Hide Additional Params": "Esconde los Parámetros Adicionales",
"How can I help you today?": "¿Cómo puedo ayudarte hoy?",
"Image Generation (Experimental)": "Generación de imágenes (experimental)",
"Image Generation Engine": "Motor de generación de imágenes",
"Image Settings": "Configuración de Imágen",
"Images": "Imágenes",
"Import Chats": "Importar chats",
"Import Documents Mapping": "Importar Mapeo de Documentos",
"Import Modelfiles": "Importar Modelfiles",
"Import Prompts": "Importar Prompts",
"Include `--api` flag when running stable-diffusion-webui": "Incluir el indicador `--api` al ejecutar stable-diffusion-webui",
"Interface": "Interface",
"join our Discord for help.": "Únase a nuestro Discord para obtener ayuda.",
"JSON": "JSON",
"JWT Expiration": "Expiración del JWT",
"JWT Token": "Token JWT",
"Keep Alive": "Mantener Vivo",
"Keyboard shortcuts": "Atajos de teclado",
"Language": "Lenguaje",
"Light": "Claro",
"Listening...": "Escuchando...",
"LLMs can make mistakes. Verify important information.": "Los LLM pueden cometer errores. Verifica la información importante.",
"Made by OpenWebUI Community": "Hecho por la comunidad de OpenWebUI",
"Make sure to enclose them with": "Make sure to enclose them with",
"Manage LiteLLM Models": "Administrar Modelos LiteLLM",
"Manage Models": "Administrar Modelos",
"Manage Ollama Models": "Administrar Modelos Ollama",
"Max Tokens": "Máximo de Tokens",
"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.",
"Mirostat": "Mirostat",
"Mirostat Eta": "Mirostat Eta",
"Mirostat Tau": "Mirostat Tau",
"MMMM DD, YYYY": "MMMM DD, YYYY",
"Model '{{modelName}}' has been successfully downloaded.": "El modelo '{{modelName}}' se ha descargado correctamente.",
"Model '{{modelTag}}' is already in queue for downloading.": "El modelo '{{modelTag}}' ya está en cola para descargar.",
"Model {{modelId}} not found": "El modelo {{modelId}} no fue encontrado",
"Model {{modelName}} already exists.": "El modelo {{modelName}} ya existe.",
"Model Name": "Nombre del modelo",
"Model not selected": "Modelo no seleccionado",
"Model Tag Name": "Nombre de la etiqueta del modelo",
"Model Whitelisting": "Listado de Modelos habilitados",
"Model(s) Whitelisted": "Modelo(s) habilitados",
"Modelfile": "Modelfile",
"Modelfile Advanced Settings": "Opciones avanzadas del Modelfile",
"Modelfile Content": "Contenido del Modelfile",
"Modelfiles": "Modelfiles",
"Models": "Modelos",
"My Documents": "Mis Documentos",
"My Modelfiles": "Mis Modelfiles",
"My Prompts": "Mis Prompts",
"Name": "Nombre",
"Name Tag": "Nombre de etiqueta",
"Name your modelfile": "Nombra tu modelfile",
"New Chat": "Nuevo Chat",
"New Password": "Nueva Contraseña",
"Not sure what to add?": "¿No estás seguro de qué añadir?",
"Not sure what to write? Switch to": "¿No estás seguro de qué escribir? Cambia a",
"Off": "Apagado",
"Okay, Let's Go!": "Okay, Let's Go!",
"Ollama Base URL": "URL base de Ollama",
"Ollama Version": "Version de Ollama",
"On": "Encendido",
"Only": "Solamente",
"Only alphanumeric characters and hyphens are allowed in the command string.": "Sólo se permiten caracteres alfanuméricos y guiones en la cadena de comando.",
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "¡Ups! ¡Agárrate fuerte! Tus archivos todavía están en el horno de procesamiento. Los estamos cocinando a la perfección. Tenga paciencia y le avisaremos una vez que estén listos.",
"Oops! Looks like the URL is invalid. Please double-check and try again.": "¡Ups! Parece que la URL no es válida. Vuelva a verificar e inténtelo nuevamente.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "¡Ups! Estás utilizando un método no compatible (solo frontend). Sirve la WebUI desde el backend.",
"Open": "Abrir",
"Open AI": "Open AI",
"Open AI (Dall-E)": "",
"Open new chat": "Abrir nuevo chat",
"OpenAI API": "OpenAI API",
"OpenAI API Key": "Clave de OpenAI API",
"OpenAI API Key is required.": "La Clave de OpenAI API es requerida.",
"or": "o",
"Parameters": "Parametros",
"Password": "Contraseña",
"PDF Extract Images (OCR)": "Extraer imágenes de PDF (OCR)",
"pending": "pendiente",
"Permission denied when accessing microphone: {{error}}": "Permiso denegado al acceder al micrófono: {{error}}",
"Playground": "Playground",
"Profile": "Perfil",
"Prompt Content": "Contenido del Prompt",
"Prompt suggestions": "Sugerencias de Prompts",
"Prompts": "Prompts",
"Pull a model from Ollama.com": "Extraer un modelo de Ollama.com",
"Pull Progress": "Progreso de extracción",
"Query Params": "Parámetros de consulta",
"RAG Template": "Plantilla de RAG",
"Raw Format": "Formato en crudo",
"Record voice": "Grabar voz",
"Redirecting you to OpenWebUI Community": "Redireccionándote a la comunidad OpenWebUI",
"Release Notes": "Notas de la versión",
"Repeat Last N": "Repetir las últimas N",
"Repeat Penalty": "Penalidad de repetición",
"Request Mode": "Modo de petición",
"Reset Vector Storage": "Restablecer almacenamiento vectorial",
"Response AutoCopy to Clipboard": "Copiar respuesta automáticamente al portapapeles",
"Role": "personalizados",
"Rosé Pine": "Rosé Pine",
"Rosé Pine Dawn": "Rosé Pine Dawn",
"Save": "Guardar",
"Save & Create": "Guardar y Crear",
"Save & Submit": "Guardar y Enviar",
"Save & Update": "Guardar y Actualizar",
"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!",
"Scan for documents from {{path}}": "Escanear en busca de documentos desde {{path}}",
"Search": "Buscar",
"Search Documents": "Buscar Documentos",
"Search Prompts": "Buscar Prompts",
"See readme.md for instructions": "Vea el readme.md para instrucciones",
"See what's new": "Ver qué hay de nuevo",
"Seed": "Seed",
"Select a mode": "Selecciona un modo",
"Select a model": "Selecciona un modelo",
"Select an Ollama instance": "Seleccione una instancia de Ollama",
"Send a Message": "Enviar un Mensaje",
"Send message": "Enviar Mensaje",
"Server connection verified": "Conexión del servidor verificada",
"Set as default": "Establecer por defecto",
"Set Default Model": "Establecer modelo predeterminado",
"Set Image Size": "Establecer tamaño de imagen",
"Set Steps": "Establecer Pasos",
"Set Title Auto-Generation Model": "Establecer modelo de generación automática de títulos",
"Set Voice": "Establecer la voz",
"Settings": "Configuración",
"Settings saved successfully!": "Configuración guardada exitosamente!",
"Share to OpenWebUI Community": "Compartir con la comunidad OpenWebUI",
"short-summary": "resumen-corto",
"Show": "Mostrar",
"Show Additional Params": "Mostrar parámetros adicionales",
"Show shortcuts": "Mostrar atajos",
"sidebar": "barra lateral",
"Sign in": "Iniciar sesión",
"Sign Out": "Desconectar",
"Sign up": "Inscribirse",
"Speech recognition error: {{error}}": "Error de reconocimiento de voz: {{error}}",
"Speech-to-Text Engine": "Motor de voz a texto",
"SpeechRecognition API is not supported in this browser.": "La API SpeechRecognition no es compatible con este navegador.",
"Stop Sequence": "Detener secuencia",
"STT Settings": "Configuraciones de STT",
"Submit": "Enviar",
"Success": "Éxito",
"Successfully updated.": "Actualizado exitosamente.",
"Sync All": "Sincronizar todo",
"System": "Sistema",
"System Prompt": "Prompt del sistema",
"Tags": "Etiquetas",
"Temperature": "Temperatura",
"Template": "Plantilla",
"Text Completion": "Finalización de texto",
"Text-to-Speech Engine": "Motor de texto a voz",
"Tfs Z": "Tfs Z",
"Theme": "Tema",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Esto garantiza que sus valiosas conversaciones se guarden de forma segura en su base de datos en el backend. ¡Gracias!",
"This setting does not sync across browsers or devices.": "Esta configuración no se sincroniza entre navegadores o dispositivos.",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Consejo: actualice varias variables consecutivamente presionando la tecla tab en la entrada del chat después de cada reemplazo.",
"Title": "Título",
"Title Auto-Generation": "Generación automática de títulos",
"Title Generation Prompt": "Prompt de generación de título",
"to": "para",
"To access the available model names for downloading,": "Para acceder a los nombres de modelos disponibles para descargar,",
"To access the GGUF models available for downloading,": "Para acceder a los modelos GGUF disponibles para descargar,",
"to chat input.": "a la entrada del chat.",
"Toggle settings": "Alternar configuración",
"Toggle sidebar": "Alternar barra lateral",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "¿Problemas para acceder a Ollama?",
"TTS Settings": "Configuración de TTS",
"Type Hugging Face Resolve (Download) URL": "Type Hugging Face Resolve (Download) URL",
"Uh-oh! There was an issue connecting to {{provider}}.": "¡UH oh! Hubo un problema al conectarse a {{provider}}.",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Tipo de archivo desconocido '{{file_type}}', pero se acepta y se trata como texto sin formato",
"Update password": "Actualiza contraseña",
"Upload a GGUF model": "Sube un modelo GGUF",
"Upload files": "Subir archivos",
"Upload Progress": "Progreso de carga",
"URL Mode": "Modo de URL",
"Use '#' in the prompt input to load and select your documents.": "Utilice '#' en el prompt para cargar y seleccionar sus documentos.",
"Use Gravatar": "Usar Gravatar",
"user": "usuario",
"User Permissions": "Permisos de usuario",
"Users": "Usuarios",
"Utilize": "Utilizar",
"Valid time units:": "Unidades válidas de tiempo:",
"variable": "variable",
"variable to have them replaced with clipboard content.": "variable para reemplazarlos con el contenido del portapapeles.",
"Version": "Version",
"Web": "Web",
"WebUI Add-ons": "WebUI Add-ons",
"WebUI Settings": "Configuración del WebUI",
"WebUI will make requests to": "WebUI realizará solicitudes a",
"Whats New in": "Lo qué hay de nuevo en",
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Cuando el historial está desactivado, los nuevos chats en este navegador no aparecerán en el historial de ninguno de sus dispositivos..",
"Whisper (Local)": "Whisper (Local)",
"Write a prompt suggestion (e.g. Who are you?)": "Escribe una sugerencia para un prompt (por ejemplo, ¿quién eres?)",
"Write a summary in 50 words that summarizes [topic or keyword].": "Escribe un resumen en 50 palabras que resuma [tema o palabra clave].",
"You": "Usted",
"You're a helpful assistant.": "Eres un asistente útil.",
"You're now logged in.": "Ya has iniciado sesión."
}

View file

@ -276,7 +276,7 @@
"Select a mode": "یک حالت انتخاب کنید", "Select a mode": "یک حالت انتخاب کنید",
"Select a model": "انتخاب یک مدل", "Select a model": "انتخاب یک مدل",
"Select an Ollama instance": "انتخاب یک نمونه از اولاما", "Select an Ollama instance": "انتخاب یک نمونه از اولاما",
"Send a Messsage": "ارسال یک پیام", "Send a Message": "ارسال یک پیام",
"Send message": "ارسال پیام", "Send message": "ارسال پیام",
"Server connection verified": "اتصال سرور تأیید شد", "Server connection verified": "اتصال سرور تأیید شد",
"Set as default": "تنظیم به عنوان پیشفرض", "Set as default": "تنظیم به عنوان پیشفرض",

View file

@ -0,0 +1,363 @@
{
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' ou '-1' pour aucune expiration.",
"(Beta)": "(Bêta)",
"(e.g. `sh webui.sh --api`)": "(par ex. `sh webui.sh --api`)",
"(latest)": "",
"{{modelName}} is thinking...": "{{modelName}} réfléchit...",
"{{webUIName}} Backend Required": "Backend {{webUIName}} requis",
"a user": "un utilisateur",
"About": "À propos",
"Account": "Compte",
"Action": "Action",
"Add a model": "Ajouter un modèle",
"Add a model tag name": "Ajouter un nom de tag pour le modèle",
"Add a short description about what this modelfile does": "Ajouter une courte description de ce que fait ce fichier de modèle",
"Add a short title for this prompt": "Ajouter un court titre pour ce prompt",
"Add a tag": "Ajouter un tag",
"Add Docs": "Ajouter des documents",
"Add Files": "Ajouter des fichiers",
"Add message": "Ajouter un message",
"add tags": "ajouter des tags",
"Adjusting these settings will apply changes universally to all users.": "L'ajustement de ces paramètres appliquera les changements à tous les utilisateurs.",
"admin": "Administrateur",
"Admin Panel": "Panneau d'administration",
"Admin Settings": "Paramètres d'administration",
"Advanced Parameters": "Paramètres avancés",
"all": "tous",
"All Users": "Tous les utilisateurs",
"Allow": "Autoriser",
"Allow Chat Deletion": "Autoriser la suppression des discussions",
"alphanumeric characters and hyphens": "caractères alphanumériques et tirets",
"Already have an account?": "Vous avez déjà un compte ?",
"an assistant": "un assistant",
"and": "et",
"API Base URL": "URL de base de l'API",
"API Key": "Clé API",
"API RPM": "RPM API",
"are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant",
"Are you sure?": "Êtes-vous sûr ?",
"Audio": "Audio",
"Auto-playback response": "Réponse en lecture automatique",
"Auto-send input after 3 sec.": "Envoyer automatiquement l'entrée après 3 sec.",
"AUTOMATIC1111 Base URL": "URL de base AUTOMATIC1111",
"AUTOMATIC1111 Base URL is required.": "L'URL de base AUTOMATIC1111 est requise.",
"available!": "disponible !",
"Back": "Retour",
"Builder Mode": "Mode Constructeur",
"Cancel": "Annuler",
"Categories": "Catégories",
"Change Password": "Changer le mot de passe",
"Chat": "Discussion",
"Chat History": "Historique des discussions",
"Chat History is off for this browser.": "L'historique des discussions est désactivé pour ce navigateur.",
"Chats": "Discussions",
"Check Again": "Vérifier à nouveau",
"Check for updates": "Vérifier les mises à jour",
"Checking for updates...": "Vérification des mises à jour...",
"Choose a model before saving...": "Choisissez un modèle avant d'enregistrer...",
"Chunk Overlap": "Chevauchement de bloc",
"Chunk Params": "Paramètres de bloc",
"Chunk Size": "Taille de bloc",
"Click here for help.": "Cliquez ici pour de l'aide.",
"Click here to check other modelfiles.": "Cliquez ici pour vérifier d'autres fichiers de modèle.",
"Click here to select": "Cliquez ici pour sélectionner",
"Click here to select documents.": "Cliquez ici pour sélectionner des documents.",
"click here.": "cliquez ici.",
"Click on the user role button to change a user's role.": "Cliquez sur le bouton de rôle d'utilisateur pour changer le rôle d'un utilisateur.",
"Close": "Fermer",
"Collection": "Collection",
"Command": "Commande",
"Confirm Password": "Confirmer le mot de passe",
"Connections": "Connexions",
"Content": "Contenu",
"Context Length": "Longueur du contexte",
"Conversation Mode": "Mode de conversation",
"Copy last code block": "Copier le dernier bloc de code",
"Copy last response": "Copier la dernière réponse",
"Copying to clipboard was successful!": "La copie dans le presse-papiers a réussi !",
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Créez une phrase concise de 3 à 5 mots comme en-tête pour la requête suivante, en respectant strictement la limite de 3 à 5 mots et en évitant l'utilisation du mot 'titre' :",
"Create a modelfile": "Créer un fichier de modèle",
"Create Account": "Créer un compte",
"Created at": "Créé le",
"Created by": "Créé par",
"Current Model": "Modèle actuel",
"Current Password": "Mot de passe actuel",
"Custom": "Personnalisé",
"Customize Ollama models for a specific purpose": "Personnaliser les modèles Ollama pour un objectif spécifique",
"Dark": "Sombre",
"Database": "Base de données",
"DD/MM/YYYY HH:mm": "DD/MM/YYYY HH:mm",
"Default": "Par défaut",
"Default (Automatic1111)": "Par défaut (Automatic1111)",
"Default (Web API)": "Par défaut (API Web)",
"Default model updated": "Modèle par défaut mis à jour",
"Default Prompt Suggestions": "Suggestions de prompt par défaut",
"Default User Role": "Rôle d'utilisateur par défaut",
"delete": "supprimer",
"Delete a model": "Supprimer un modèle",
"Delete chat": "Supprimer la discussion",
"Delete Chats": "Supprimer les discussions",
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} supprimé",
"Deleted {tagName}": "{tagName} supprimé",
"Description": "Description",
"Desktop Notifications": "Notifications de bureau",
"Disabled": "Désactivé",
"Discover a modelfile": "Découvrir un fichier de modèle",
"Discover a prompt": "Découvrir un prompt",
"Discover, download, and explore custom prompts": "Découvrir, télécharger et explorer des prompts personnalisés",
"Discover, download, and explore model presets": "Découvrir, télécharger et explorer des préconfigurations de modèles",
"Display the username instead of You in the Chat": "Afficher le nom d'utilisateur au lieu de 'Vous' dans la Discussion",
"Document": "Document",
"Document Settings": "Paramètres du document",
"Documents": "Documents",
"does not make any external connections, and your data stays securely on your locally hosted server.": "ne fait aucune connexion externe, et vos données restent en sécurité sur votre serveur hébergé localement.",
"Don't Allow": "Ne pas autoriser",
"Don't have an account?": "Vous n'avez pas de compte ?",
"Download as a File": "Télécharger en tant que fichier",
"Download Database": "Télécharger la base de données",
"Drop any files here to add to the conversation": "Déposez n'importe quel fichier ici pour les ajouter à la conversation",
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "p. ex. '30s', '10m'. Les unités de temps valides sont 's', 'm', 'h'.",
"Edit Doc": "Éditer le document",
"Edit User": "Éditer l'utilisateur",
"Email": "Email",
"Enable Chat History": "Activer l'historique des discussions",
"Enable New Sign Ups": "Activer les nouvelles inscriptions",
"Enabled": "Activé",
"Enter {{role}} message here": "Entrez le message {{role}} ici",
"Enter API Key": "Entrez la clé API",
"Enter Chunk Overlap": "Entrez le chevauchement de bloc",
"Enter Chunk Size": "Entrez la taille du bloc",
"Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (p. ex. 512x512)",
"Enter LiteLLM API Base URL (litellm_params.api_base)": "Entrez l'URL de base de l'API LiteLLM (litellm_params.api_base)",
"Enter LiteLLM API Key (litellm_params.api_key)": "Entrez la clé API LiteLLM (litellm_params.api_key)",
"Enter LiteLLM API RPM (litellm_params.rpm)": "Entrez le RPM de l'API LiteLLM (litellm_params.rpm)",
"Enter LiteLLM Model (litellm_params.model)": "Entrez le modèle LiteLLM (litellm_params.model)",
"Enter Max Tokens (litellm_params.max_tokens)": "Entrez le nombre max de tokens (litellm_params.max_tokens)",
"Enter model tag (e.g. {{modelTag}})": "Entrez le tag du modèle (p. ex. {{modelTag}})",
"Enter Number of Steps (e.g. 50)": "Entrez le nombre d'étapes (p. ex. 50)",
"Enter stop sequence": "Entrez la séquence de fin",
"Enter Top K": "Entrez Top K",
"Enter URL (e.g. http://127.0.0.1:7860/)": "Entrez l'URL (p. ex. http://127.0.0.1:7860/)",
"Enter Your Email": "Entrez votre adresse email",
"Enter Your Full Name": "Entrez votre nom complet",
"Enter Your Password": "Entrez votre mot de passe",
"Experimental": "Expérimental",
"Export All Chats (All Users)": "Exporter toutes les discussions (Tous les utilisateurs)",
"Export Chats": "Exporter les discussions",
"Export Documents Mapping": "Exporter le mappage des documents",
"Export Modelfiles": "Exporter les fichiers de modèle",
"Export Prompts": "Exporter les prompts",
"Failed to read clipboard contents": "Échec de la lecture du contenu du presse-papiers",
"File Mode": "Mode fichier",
"File not found.": "Fichier introuvable.",
"Focus chat input": "Se concentrer sur l'entrée de la discussion",
"Format your variables using square brackets like this:": "Formatez vos variables en utilisant des crochets comme ceci :",
"From (Base Model)": "De (Modèle de base)",
"Full Screen Mode": "Mode plein écran",
"General": "Général",
"General Settings": "Paramètres généraux",
"Hello, {{name}}": "Bonjour, {{name}}",
"Hide": "Cacher",
"Hide Additional Params": "Cacher les paramètres supplémentaires",
"How can I help you today?": "Comment puis-je vous aider aujourd'hui ?",
"Image Generation (Experimental)": "Génération d'image (Expérimental)",
"Image Generation Engine": "Moteur de génération d'image",
"Image Settings": "Paramètres de l'image",
"Images": "Images",
"Import Chats": "Importer les discussions",
"Import Documents Mapping": "Importer le mappage des documents",
"Import Modelfiles": "Importer les fichiers de modèle",
"Import Prompts": "Importer les prompts",
"Include `--api` flag when running stable-diffusion-webui": "Inclure l'indicateur `--api` lors de l'exécution de stable-diffusion-webui",
"Interface": "Interface",
"join our Discord for help.": "rejoignez notre Discord pour obtenir de l'aide.",
"JSON": "JSON",
"JWT Expiration": "Expiration du JWT",
"JWT Token": "Jeton JWT",
"Keep Alive": "Garder actif",
"Keyboard shortcuts": "Raccourcis clavier",
"Language": "Langue",
"Light": "Lumière",
"Listening...": "Écoute...",
"LLMs can make mistakes. Verify important information.": "Les LLMs peuvent faire des erreurs. Vérifiez les informations importantes.",
"Made by OpenWebUI Community": "Réalisé par la communauté OpenWebUI",
"Make sure to enclose them with": "Assurez-vous de les entourer avec",
"Manage LiteLLM Models": "Gérer les modèles LiteLLM",
"Manage Models": "Gérer les modèles",
"Manage Ollama Models": "Gérer les modèles Ollama",
"Max Tokens": "Tokens maximaux",
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé simultanément. Veuillez réessayer plus tard.",
"Mirostat": "Mirostat",
"Mirostat Eta": "Mirostat Eta",
"Mirostat Tau": "Mirostat Tau",
"MMMM DD, YYYY": "MMMM DD, YYYY",
"Model '{{modelName}}' has been successfully downloaded.": "Le modèle '{{modelName}}' a été téléchargé avec succès.",
"Model '{{modelTag}}' is already in queue for downloading.": "Le modèle '{{modelTag}}' est déjà dans la file d'attente pour le téléchargement.",
"Model {{modelId}} not found": "Modèle {{modelId}} non trouvé",
"Model {{modelName}} already exists.": "Le modèle {{modelName}} existe déjà.",
"Model Name": "Nom du modèle",
"Model not selected": "Modèle non sélectionné",
"Model Tag Name": "Nom de tag du modèle",
"Model Whitelisting": "Liste blanche de modèle",
"Model(s) Whitelisted": "Modèle(s) sur liste blanche",
"Modelfile": "Fichier de modèle",
"Modelfile Advanced Settings": "Paramètres avancés du fichier de modèle",
"Modelfile Content": "Contenu du fichier de modèle",
"Modelfiles": "Fichiers de modèle",
"Models": "Modèles",
"My Documents": "Mes documents",
"My Modelfiles": "Mes fichiers de modèle",
"My Prompts": "Mes prompts",
"Name": "Nom",
"Name Tag": "Tag de nom",
"Name your modelfile": "Nommez votre fichier de modèle",
"New Chat": "Nouvelle discussion",
"New Password": "Nouveau mot de passe",
"Not sure what to add?": "Pas sûr de quoi ajouter ?",
"Not sure what to write? Switch to": "Pas sûr de quoi écrire ? Changez pour",
"Off": "Éteint",
"Okay, Let's Go!": "Okay, Allons-y !",
"Ollama Base URL": "URL de Base Ollama",
"Ollama Version": "Version Ollama",
"On": "Activé",
"Only": "Seulement",
"Only alphanumeric characters and hyphens are allowed in the command string.": "Seuls les caractères alphanumériques et les tirets sont autorisés dans la chaîne de commande.",
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Oups ! Tenez bon ! Vos fichiers sont encore dans le four de traitement. Nous les préparons jusqu'à la perfection. Soyez patient et nous vous informerons dès qu'ils seront prêts.",
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oups ! Il semble que l'URL soit invalide. Merci de vérifier et réessayer.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oups ! Vous utilisez une méthode non prise en charge (frontal uniquement). Veuillez servir WebUI depuis le backend.",
"Open": "Ouvrir",
"Open AI": "Open AI",
"Open AI (Dall-E)": "Open AI (Dall-E)",
"Open new chat": "Ouvrir une nouvelle discussion",
"OpenAI API": "API OpenAI",
"OpenAI API Key": "Clé API OpenAI",
"OpenAI API Key is required.": "La clé API OpenAI est requise.",
"or": "ou",
"Parameters": "Paramètres",
"Password": "Mot de passe",
"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
"pending": "en attente",
"Permission denied when accessing microphone: {{error}}": "Permission refusée lors de l'accès au microphone : {{error}}",
"Playground": "Aire de jeu",
"Profile": "Profil",
"Prompt Content": "Contenu du prompt",
"Prompt suggestions": "Suggestions de prompt",
"Prompts": "Prompts",
"Pull a model from Ollama.com": "Tirer un modèle de Ollama.com",
"Pull Progress": "Progression du téléchargement",
"Query Params": "Paramètres de requête",
"RAG Template": "Modèle RAG",
"Raw Format": "Format brut",
"Record voice": "Enregistrer la voix",
"Redirecting you to OpenWebUI Community": "Vous redirige vers la communauté OpenWebUI",
"Release Notes": "Notes de version",
"Repeat Last N": "Répéter les N derniers",
"Repeat Penalty": "Pénalité de répétition",
"Request Mode": "Mode de requête",
"Reset Vector Storage": "Réinitialiser le stockage vectoriel",
"Response AutoCopy to Clipboard": "Copie automatique de la réponse vers le presse-papiers",
"Role": "Rôle",
"Rosé Pine": "Pin Rosé",
"Rosé Pine Dawn": "Aube Pin Rosé",
"Save": "Enregistrer",
"Save & Create": "Enregistrer & Créer",
"Save & Submit": "Enregistrer & Soumettre",
"Save & Update": "Enregistrer & Mettre à jour",
"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 moment pour télécharger et supprimer vos journaux de discussion en cliquant sur le bouton ci-dessous. Ne vous inquiétez pas, vous pouvez facilement réimporter vos journaux de discussion dans le backend via",
"Scan": "Scanner",
"Scan complete!": "Scan terminé !",
"Scan for documents from {{path}}": "Scanner des documents depuis {{path}}",
"Search": "Recherche",
"Search Documents": "Rechercher des documents",
"Search Prompts": "Rechercher des prompts",
"See readme.md for instructions": "Voir readme.md pour les instructions",
"See what's new": "Voir les nouveautés",
"Seed": "Graine",
"Select a mode": "Sélectionnez un mode",
"Select a model": "Sélectionnez un modèle",
"Select an Ollama instance": "Sélectionner une instance Ollama",
"Send a Message": "Envoyer un message",
"Send message": "Envoyer un message",
"Server connection verified": "Connexion au serveur vérifiée",
"Set as default": "Définir par défaut",
"Set Default Model": "Définir le modèle par défaut",
"Set Image Size": "Définir la taille de l'image",
"Set Steps": "Définir les étapes",
"Set Title Auto-Generation Model": "Définir le modèle de génération automatique de titre",
"Set Voice": "Définir la voix",
"Settings": "Paramètres",
"Settings saved successfully!": "Paramètres enregistrés avec succès !",
"Share to OpenWebUI Community": "Partager avec la communauté OpenWebUI",
"short-summary": "résumé court",
"Show": "Afficher",
"Show Additional Params": "Afficher les paramètres supplémentaires",
"Show shortcuts": "Afficher les raccourcis",
"sidebar": "barre latérale",
"Sign in": "Se connecter",
"Sign Out": "Se déconnecter",
"Sign up": "S'inscrire",
"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}",
"Speech-to-Text Engine": "Moteur reconnaissance vocale",
"SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition n'est pas prise en charge dans ce navigateur.",
"Stop Sequence": "Séquence d'arrêt",
"STT Settings": "Paramètres de STT",
"Submit": "Soumettre",
"Success": "Succès",
"Successfully updated.": "Mis à jour avec succès.",
"Sync All": "Synchroniser tout",
"System": "Système",
"System Prompt": "Prompt Système",
"Tags": "Tags",
"Temperature": "Température",
"Template": "Modèle",
"Text Completion": "Complétion de texte",
"Text-to-Speech Engine": "Moteur de texte à la parole",
"Tfs Z": "Tfs Z",
"Theme": "Thème",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Cela garantit que vos précieuses conversations sont enregistrées en toute sécurité dans votre base de données backend. Merci !",
"This setting does not sync across browsers or devices.": "Ce réglage ne se synchronise pas entre les navigateurs ou les appareils.",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Astuce : Mettez à jour plusieurs emplacements de variables consécutivement en appuyant sur la touche tabulation dans l'entrée de chat après chaque remplacement.",
"Title": "Titre",
"Title Auto-Generation": "Génération automatique de titre",
"Title Generation Prompt": "Prompt de génération de titre",
"to": "à",
"To access the available model names for downloading,": "Pour accéder aux noms de modèles disponibles pour le téléchargement,",
"To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles pour le téléchargement,",
"to chat input.": "à l'entrée du chat.",
"Toggle settings": "Basculer les paramètres",
"Toggle sidebar": "Basculer la barre latérale",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Des problèmes pour accéder à Ollama ?",
"TTS Settings": "Paramètres TTS",
"Type Hugging Face Resolve (Download) URL": "Entrez l'URL de résolution (téléchargement) Hugging Face",
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh ! Il y a eu un problème de connexion à {{provider}}.",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Type de fichier inconnu '{{file_type}}', mais accepté et traité comme du texte brut",
"Update password": "Mettre à jour le mot de passe",
"Upload a GGUF model": "Téléverser un modèle GGUF",
"Upload files": "Téléverser des fichiers",
"Upload Progress": "Progression du Téléversement",
"URL Mode": "Mode URL",
"Use '#' in the prompt input to load and select your documents.": "Utilisez '#' dans l'entrée de prompt pour charger et sélectionner vos documents.",
"Use Gravatar": "Utiliser Gravatar",
"user": "utilisateur",
"User Permissions": "Permissions de l'utilisateur",
"Users": "Utilisateurs",
"Utilize": "Utiliser",
"Valid time units:": "Unités de temps valides :",
"variable": "variable",
"variable to have them replaced with clipboard content.": "variable pour les remplacer par le contenu du presse-papiers.",
"Version": "Version",
"Web": "Web",
"WebUI Add-ons": "Add-ons WebUI",
"WebUI Settings": "Paramètres WebUI",
"WebUI will make requests to": "WebUI effectuera des demandes à",
"Whats New in": "Quoi de neuf dans",
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Lorsque l'historique est désactivé, les nouvelles discussions sur ce navigateur n'apparaîtront pas dans votre historique sur aucun de vos appareils.",
"Whisper (Local)": "Whisper (Local)",
"Write a prompt suggestion (e.g. Who are you?)": "Rédigez une suggestion de prompt (p. ex. Qui êtes-vous ?)",
"Write a summary in 50 words that summarizes [topic or keyword].": "Rédigez un résumé en 50 mots qui résume [sujet ou mot-clé].",
"You": "You",
"You're a helpful assistant.": "Vous êtes un assistant utile",
"You're now logged in.": "Vous êtes maintenant connecté."
}

View file

@ -5,7 +5,7 @@
"(latest)": "", "(latest)": "",
"{{modelName}} is thinking...": "{{modelName}} réfléchit...", "{{modelName}} is thinking...": "{{modelName}} réfléchit...",
"{{webUIName}} Backend Required": "Backend {{webUIName}} requis", "{{webUIName}} Backend Required": "Backend {{webUIName}} requis",
"a user": "", "a user": "un utilisateur",
"About": "À propos", "About": "À propos",
"Account": "Compte", "Account": "Compte",
"Action": "Action", "Action": "Action",
@ -13,7 +13,7 @@
"Add a model tag name": "Ajouter un nom de tag pour le modèle", "Add a model tag name": "Ajouter un nom de tag pour le modèle",
"Add a short description about what this modelfile does": "Ajouter une courte description de ce que fait ce fichier de modèle", "Add a short description about what this modelfile does": "Ajouter une courte description de ce que fait ce fichier de modèle",
"Add a short title for this prompt": "Ajouter un court titre pour ce prompt", "Add a short title for this prompt": "Ajouter un court titre pour ce prompt",
"Add a tag": "", "Add a tag": "Ajouter un tag",
"Add Docs": "Ajouter des documents", "Add Docs": "Ajouter des documents",
"Add Files": "Ajouter des fichiers", "Add Files": "Ajouter des fichiers",
"Add message": "Ajouter un message", "Add message": "Ajouter un message",
@ -29,18 +29,18 @@
"Allow Chat Deletion": "Autoriser la suppression du chat", "Allow Chat Deletion": "Autoriser la suppression du chat",
"alphanumeric characters and hyphens": "caractères alphanumériques et tirets", "alphanumeric characters and hyphens": "caractères alphanumériques et tirets",
"Already have an account?": "Vous avez déjà un compte ?", "Already have an account?": "Vous avez déjà un compte ?",
"an assistant": "", "an assistant": "un assistant",
"and": "et", "and": "et",
"API Base URL": "URL de base de l'API", "API Base URL": "URL de base de l'API",
"API Key": "Clé API", "API Key": "Clé API",
"API RPM": "RPM API", "API RPM": "RPM API",
"are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant", "are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant",
"Are you sure?": "", "Are you sure?": "Êtes-vous sûr ?",
"Audio": "Audio", "Audio": "Audio",
"Auto-playback response": "Réponse en lecture automatique", "Auto-playback response": "Réponse en lecture automatique",
"Auto-send input after 3 sec.": "Envoyer automatiquement l'entrée après 3 sec.", "Auto-send input after 3 sec.": "Envoyer automatiquement l'entrée après 3 sec.",
"AUTOMATIC1111 Base URL": "URL de base AUTOMATIC1111", "AUTOMATIC1111 Base URL": "URL de base AUTOMATIC1111",
"AUTOMATIC1111 Base URL is required.": "", "AUTOMATIC1111 Base URL is required.": "L'URL de base AUTOMATIC1111 est requise.",
"available!": "disponible !", "available!": "disponible !",
"Back": "Retour", "Back": "Retour",
"Builder Mode": "Mode Constructeur", "Builder Mode": "Mode Constructeur",
@ -58,10 +58,10 @@
"Chunk Overlap": "Chevauchement de bloc", "Chunk Overlap": "Chevauchement de bloc",
"Chunk Params": "Paramètres de bloc", "Chunk Params": "Paramètres de bloc",
"Chunk Size": "Taille de bloc", "Chunk Size": "Taille de bloc",
"Click here for help.": "", "Click here for help.": "Cliquez ici pour de l'aide.",
"Click here to check other modelfiles.": "Cliquez ici pour vérifier d'autres fichiers de modèle.", "Click here to check other modelfiles.": "Cliquez ici pour vérifier d'autres fichiers de modèle.",
"Click here to select": "", "Click here to select": "Cliquez ici pour sélectionner",
"Click here to select documents.": "", "Click here to select documents.": "Cliquez ici pour sélectionner des documents.",
"click here.": "cliquez ici.", "click here.": "cliquez ici.",
"Click on the user role button to change a user's role.": "Cliquez sur le bouton de rôle d'utilisateur pour changer le rôle d'un utilisateur.", "Click on the user role button to change a user's role.": "Cliquez sur le bouton de rôle d'utilisateur pour changer le rôle d'un utilisateur.",
"Close": "Fermer", "Close": "Fermer",
@ -88,7 +88,7 @@
"Database": "Base de données", "Database": "Base de données",
"DD/MM/YYYY HH:mm": "DD/MM/YYYY HH:mm", "DD/MM/YYYY HH:mm": "DD/MM/YYYY HH:mm",
"Default": "Par défaut", "Default": "Par défaut",
"Default (Automatic1111)": "", "Default (Automatic1111)": "Par défaut (Automatic1111)",
"Default (Web API)": "Par défaut (API Web)", "Default (Web API)": "Par défaut (API Web)",
"Default model updated": "Modèle par défaut mis à jour", "Default model updated": "Modèle par défaut mis à jour",
"Default Prompt Suggestions": "Suggestions de prompt par défaut", "Default Prompt Suggestions": "Suggestions de prompt par défaut",
@ -123,21 +123,21 @@
"Enable Chat History": "Activer l'historique du chat", "Enable Chat History": "Activer l'historique du chat",
"Enable New Sign Ups": "Activer les nouvelles inscriptions", "Enable New Sign Ups": "Activer les nouvelles inscriptions",
"Enabled": "Activé", "Enabled": "Activé",
"Enter {{role}} message here": "", "Enter {{role}} message here": "Entrez le message {{role}} ici",
"Enter API Key": "", "Enter API Key": "Entrez la clé API",
"Enter Chunk Overlap": "", "Enter Chunk Overlap": "Entrez le chevauchement de bloc",
"Enter Chunk Size": "", "Enter Chunk Size": "Entrez la taille du bloc",
"Enter Image Size (e.g. 512x512)": "", "Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (p. ex. 512x512)",
"Enter LiteLLM API Base URL (litellm_params.api_base)": "", "Enter LiteLLM API Base URL (litellm_params.api_base)": "Entrez l'URL de base de l'API LiteLLM (litellm_params.api_base)",
"Enter LiteLLM API Key (litellm_params.api_key)": "", "Enter LiteLLM API Key (litellm_params.api_key)": "Entrez la clé API LiteLLM (litellm_params.api_key)",
"Enter LiteLLM API RPM (litellm_params.rpm)": "", "Enter LiteLLM API RPM (litellm_params.rpm)": "Entrez le RPM de l'API LiteLLM (litellm_params.rpm)",
"Enter LiteLLM Model (litellm_params.model)": "", "Enter LiteLLM Model (litellm_params.model)": "Entrez le modèle LiteLLM (litellm_params.model)",
"Enter Max Tokens (litellm_params.max_tokens)": "", "Enter Max Tokens (litellm_params.max_tokens)": "Entrez le nombre max de tokens (litellm_params.max_tokens)",
"Enter model tag (e.g. {{modelTag}})": "", "Enter model tag (e.g. {{modelTag}})": "Entrez le tag du modèle (p. ex. {{modelTag}})",
"Enter Number of Steps (e.g. 50)": "", "Enter Number of Steps (e.g. 50)": "Entrez le nombre d'étapes (p. ex. 50)",
"Enter stop sequence": "Entrez la séquence d'arrêt", "Enter stop sequence": "Entrez la séquence de fin",
"Enter Top K": "", "Enter Top K": "Entrez Top K",
"Enter URL (e.g. http://127.0.0.1:7860/)": "", "Enter URL (e.g. http://127.0.0.1:7860/)": "Entrez l'URL (p. ex. http://127.0.0.1:7860/)",
"Enter Your Email": "Entrez votre email", "Enter Your Email": "Entrez votre email",
"Enter Your Full Name": "Entrez votre nom complet", "Enter Your Full Name": "Entrez votre nom complet",
"Enter Your Password": "Entrez votre mot de passe", "Enter Your Password": "Entrez votre mot de passe",
@ -158,10 +158,10 @@
"General Settings": "Paramètres généraux", "General Settings": "Paramètres généraux",
"Hello, {{name}}": "Bonjour, {{name}}", "Hello, {{name}}": "Bonjour, {{name}}",
"Hide": "Cacher", "Hide": "Cacher",
"Hide Additional Params": "Hide Additional Params", "Hide Additional Params": "Hide additional params",
"How can I help you today?": "Comment puis-je vous aider aujourd'hui ?", "How can I help you today?": "Comment puis-je vous aider aujourd'hui ?",
"Image Generation (Experimental)": "Génération d'image (Expérimental)", "Image Generation (Experimental)": "Génération d'image (Expérimental)",
"Image Generation Engine": "", "Image Generation Engine": "Moteur de génération d'image",
"Image Settings": "Paramètres d'image", "Image Settings": "Paramètres d'image",
"Images": "Images", "Images": "Images",
"Import Chats": "Importer les chats", "Import Chats": "Importer les chats",
@ -183,7 +183,7 @@
"Made by OpenWebUI Community": "Réalisé par la communauté OpenWebUI", "Made by OpenWebUI Community": "Réalisé par la communauté OpenWebUI",
"Make sure to enclose them with": "Assurez-vous de les entourer avec", "Make sure to enclose them with": "Assurez-vous de les entourer avec",
"Manage LiteLLM Models": "Gérer les modèles LiteLLM", "Manage LiteLLM Models": "Gérer les modèles LiteLLM",
"Manage Models": "", "Manage Models": "Gérer les modèles",
"Manage Ollama Models": "Gérer les modèles Ollama", "Manage Ollama Models": "Gérer les modèles Ollama",
"Max Tokens": "Tokens maximaux", "Max Tokens": "Tokens maximaux",
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé simultanément. Veuillez réessayer plus tard.", "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé simultanément. Veuillez réessayer plus tard.",
@ -198,8 +198,8 @@
"Model Name": "Nom du modèle", "Model Name": "Nom du modèle",
"Model not selected": "Modèle non sélectionné", "Model not selected": "Modèle non sélectionné",
"Model Tag Name": "Nom de tag du modèle", "Model Tag Name": "Nom de tag du modèle",
"Model Whitelisting": "", "Model Whitelisting": "Liste blanche de modèle",
"Model(s) Whitelisted": "", "Model(s) Whitelisted": "Modèle(s) sur liste blanche",
"Modelfile": "Fichier de modèle", "Modelfile": "Fichier de modèle",
"Modelfile Advanced Settings": "Paramètres avancés du fichier de modèle", "Modelfile Advanced Settings": "Paramètres avancés du fichier de modèle",
"Modelfile Content": "Contenu du fichier de modèle", "Modelfile Content": "Contenu du fichier de modèle",
@ -217,7 +217,7 @@
"Not sure what to write? Switch to": "Vous ne savez pas quoi écrire ? Basculer vers", "Not sure what to write? Switch to": "Vous ne savez pas quoi écrire ? Basculer vers",
"Off": "Désactivé", "Off": "Désactivé",
"Okay, Let's Go!": "D'accord, allons-y !", "Okay, Let's Go!": "D'accord, allons-y !",
"Ollama Base URL": "", "Ollama Base URL": "URL de Base Ollama",
"Ollama Version": "Version Ollama", "Ollama Version": "Version Ollama",
"On": "Activé", "On": "Activé",
"Only": "Seulement", "Only": "Seulement",
@ -227,15 +227,15 @@
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.",
"Open": "Ouvrir", "Open": "Ouvrir",
"Open AI": "Open AI", "Open AI": "Open AI",
"Open AI (Dall-E)": "", "Open AI (Dall-E)": "Open AI (Dall-E)",
"Open new chat": "Ouvrir un nouveau chat", "Open new chat": "Ouvrir un nouveau chat",
"OpenAI API": "API OpenAI", "OpenAI API": "API OpenAI",
"OpenAI API Key": "", "OpenAI API Key": "Clé API OpenAI",
"OpenAI API Key is required.": "", "OpenAI API Key is required.": "La clé API OpenAI est requise.",
"or": "ou", "or": "ou",
"Parameters": "Paramètres", "Parameters": "Paramètres",
"Password": "Mot de passe", "Password": "Mot de passe",
"PDF Extract Images (OCR)": "", "PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
"pending": "en attente", "pending": "en attente",
"Permission denied when accessing microphone: {{error}}": "Permission refusée lors de l'accès au microphone : {{error}}", "Permission denied when accessing microphone: {{error}}": "Permission refusée lors de l'accès au microphone : {{error}}",
"Playground": "Aire de jeu", "Playground": "Aire de jeu",
@ -245,7 +245,7 @@
"Prompts": "Prompts", "Prompts": "Prompts",
"Pull a model from Ollama.com": "Tirer un modèle de Ollama.com", "Pull a model from Ollama.com": "Tirer un modèle de Ollama.com",
"Pull Progress": "Progression du tirage", "Pull Progress": "Progression du tirage",
"Query Params": "", "Query Params": "Paramètres de requête",
"RAG Template": "Modèle RAG", "RAG Template": "Modèle RAG",
"Raw Format": "Format brut", "Raw Format": "Format brut",
"Record voice": "Enregistrer la voix", "Record voice": "Enregistrer la voix",
@ -273,10 +273,10 @@
"See readme.md for instructions": "Voir readme.md pour les instructions", "See readme.md for instructions": "Voir readme.md pour les instructions",
"See what's new": "Voir les nouveautés", "See what's new": "Voir les nouveautés",
"Seed": "Graine", "Seed": "Graine",
"Select a mode": "", "Select a mode": "Sélectionnez un mode",
"Select a model": "Sélectionner un modèle", "Select a model": "Sélectionner un modèle",
"Select an Ollama instance": "", "Select an Ollama instance": "Sélectionner une instance Ollama",
"Send a Messsage": "Envoyer un message", "Send a Message": "Envoyer un message",
"Send message": "Envoyer un message", "Send message": "Envoyer un message",
"Server connection verified": "Connexion au serveur vérifiée", "Server connection verified": "Connexion au serveur vérifiée",
"Set as default": "Définir par défaut", "Set as default": "Définir par défaut",
@ -286,11 +286,11 @@
"Set Title Auto-Generation Model": "Définir le modèle de génération automatique de titre", "Set Title Auto-Generation Model": "Définir le modèle de génération automatique de titre",
"Set Voice": "Définir la voix", "Set Voice": "Définir la voix",
"Settings": "Paramètres", "Settings": "Paramètres",
"Settings saved successfully!": "", "Settings saved successfully!": "Paramètres enregistrés avec succès !",
"Share to OpenWebUI Community": "Partager avec la communauté OpenWebUI", "Share to OpenWebUI Community": "Partager avec la communauté OpenWebUI",
"short-summary": "résumé court", "short-summary": "résumé court",
"Show": "Montrer", "Show": "Montrer",
"Show Additional Params": "Show Additional Params", "Show Additional Params": "Afficher les paramètres supplémentaires",
"Show shortcuts": "Afficher les raccourcis", "Show shortcuts": "Afficher les raccourcis",
"sidebar": "barre latérale", "sidebar": "barre latérale",
"Sign in": "Se connecter", "Sign in": "Se connecter",
@ -322,36 +322,36 @@
"Title Generation Prompt": "Prompt de génération de titre", "Title Generation Prompt": "Prompt de génération de titre",
"to": "à", "to": "à",
"To access the available model names for downloading,": "Pour accéder aux noms de modèles disponibles pour le téléchargement,", "To access the available model names for downloading,": "Pour accéder aux noms de modèles disponibles pour le téléchargement,",
"To access the GGUF models available for downloading,": "To access the GGUF models available for downloading,", "To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles pour le téléchargement,",
"to chat input.": "to chat input.", "to chat input.": "à l'entrée du chat.",
"Toggle settings": "Basculer les paramètres", "Toggle settings": "Basculer les paramètres",
"Toggle sidebar": "Basculer la barre latérale", "Toggle sidebar": "Basculer la barre latérale",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "Problèmes d'accès à Ollama ?", "Trouble accessing Ollama?": "Problèmes d'accès à Ollama ?",
"TTS Settings": "Paramètres TTS", "TTS Settings": "Paramètres TTS",
"Type Hugging Face Resolve (Download) URL": "", "Type Hugging Face Resolve (Download) URL": "Entrez l'URL de résolution (téléchargement) Hugging Face",
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh ! Il y a eu un problème de connexion à {{provider}}.", "Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh ! Il y a eu un problème de connexion à {{provider}}.",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Unknown File Type '{{file_type}}', but accepting and treating as plain text", "Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Type de fichier inconnu '{{file_type}}', mais accepté et traité comme du texte brut",
"Update password": "", "Update password": "Mettre à jour le mot de passe",
"Upload a GGUF model": "Upload a GGUF model", "Upload a GGUF model": "Téléverser un modèle GGUF",
"Upload files": "Téléverser des fichiers", "Upload files": "Téléverser des fichiers",
"Upload Progress": "Upload Progress", "Upload Progress": "Progression du Téléversement",
"URL Mode": "URL Mode", "URL Mode": "Mode URL",
"Use '#' in the prompt input to load and select your documents.": "Utilisez '#' dans l'entrée du prompt pour charger et sélectionner vos documents.", "Use '#' in the prompt input to load and select your documents.": "Utilisez '#' dans l'entrée du prompt pour charger et sélectionner vos documents.",
"Use Gravatar": "", "Use Gravatar": "Utiliser Gravatar",
"user": "Utilisateur", "user": "utilisateur",
"User Permissions": "Permissions d'utilisateur", "User Permissions": "Permissions d'utilisateur",
"Users": "Utilisateurs", "Users": "Utilisateurs",
"Utilize": "Utiliser", "Utilize": "Utiliser",
"Valid time units:": "Unités de temps valides :", "Valid time units:": "Unités de temps valides :",
"variable": "variable", "variable": "variable",
"variable to have them replaced with clipboard content.": "variable pour les remplacer par le contenu du presse-papiers.", "variable to have them replaced with clipboard content.": "variable pour les remplacer par le contenu du presse-papiers.",
"Version": "", "Version": "Version",
"Web": "Web", "Web": "Web",
"WebUI Add-ons": "Add-ons WebUI", "WebUI Add-ons": "Add-ons WebUI",
"WebUI Settings": "Paramètres WebUI", "WebUI Settings": "Paramètres WebUI",
"WebUI will make requests to": "", "WebUI will make requests to": "WebUI effectuera des demandes à",
"Whats New in": "Quoi de neuf dans", "Whats New in": "Quoi de neuf dans",
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Lorsque l'historique est désactivé, les nouveaux chats sur ce navigateur n'apparaîtront pas dans votre historique sur aucun de vos appareils.", "When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Lorsque l'historique est désactivé, les nouveaux chats sur ce navigateur n'apparaîtront pas dans votre historique sur aucun de vos appareils.",
"Whisper (Local)": "Whisper (Local)", "Whisper (Local)": "Whisper (Local)",

View file

@ -0,0 +1,363 @@
{
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' o '-1' per nessuna scadenza.",
"(Beta)": "(Beta)",
"(e.g. sh webui.sh --api)": "(ad esempio sh webui.sh --api)",
"(latest)": "(ultima)",
"{{modelName}} is thinking...": "{{modelName}} sta pensando...",
"{{webUIName}} Backend Required": "{{webUIName}} Backend richiesto",
"a user": "un utente",
"About": "Informazioni",
"Account": "Account",
"Action": "Azione",
"Add a model": "Aggiungi un modello",
"Add a model tag name": "Aggiungi un nome tag del modello",
"Add a short description about what this modelfile does": "Aggiungi una breve descrizione di ciò che fa questo file modello",
"Add a short title for this prompt": "Aggiungi un titolo breve per questo prompt",
"Add a tag": "Aggiungi un tag",
"Add Docs": "Aggiungi documenti",
"Add Files": "Aggiungi file",
"Add message": "Aggiungi messaggio",
"add tags": "aggiungi tag",
"Adjusting these settings will apply changes universally to all users.": "La modifica di queste impostazioni applicherà le modifiche universalmente a tutti gli utenti.",
"admin": "amministratore",
"Admin Panel": "Pannello di amministrazione",
"Admin Settings": "Impostazioni amministratore",
"Advanced Parameters": "Parametri avanzati",
"all": "tutti",
"All Users": "Tutti gli utenti",
"Allow": "Consenti",
"Allow Chat Deletion": "Consenti l'eliminazione della chat",
"alphanumeric characters and hyphens": "caratteri alfanumerici e trattini",
"Already have an account?": "Hai già un account?",
"an assistant": "un assistente",
"and": "e",
"API Base URL": "URL base API",
"API Key": "Chiave API",
"API RPM": "API RPM",
"are allowed - Activate this command by typing": "sono consentiti - Attiva questo comando digitando",
"Are you sure?": "Sei sicuro?",
"Audio": "Audio",
"Auto-playback response": "Riproduzione automatica della risposta",
"Auto-send input after 3 sec.": "Invio automatico dell'input dopo 3 secondi.",
"AUTOMATIC1111 Base URL": "URL base AUTOMATIC1111",
"AUTOMATIC1111 Base URL is required.": "L'URL base AUTOMATIC1111 è obbligatorio.",
"available!": "disponibile!",
"Back": "Indietro",
"Builder Mode": "Modalità costruttore",
"Cancel": "Annulla",
"Categories": "Categorie",
"Change Password": "Cambia password",
"Chat": "Chat",
"Chat History": "Cronologia chat",
"Chat History is off for this browser.": "La cronologia chat è disattivata per questo browser.",
"Chats": "Chat",
"Check Again": "Controlla di nuovo",
"Check for updates": "Controlla aggiornamenti",
"Checking for updates...": "Controllo aggiornamenti...",
"Choose a model before saving...": "Scegli un modello prima di salvare...",
"Chunk Overlap": "Sovrapposizione chunk",
"Chunk Params": "Parametri chunk",
"Chunk Size": "Dimensione chunk",
"Click here for help.": "Clicca qui per aiuto.",
"Click here to check other modelfiles.": "Clicca qui per controllare altri file modello.",
"Click here to select": "Clicca qui per selezionare",
"Click here to select documents.": "Clicca qui per selezionare i documenti.",
"click here.": "clicca qui.",
"Click on the user role button to change a user's role.": "Clicca sul pulsante del ruolo utente per modificare il ruolo di un utente.",
"Close": "Chiudi",
"Collection": "Collezione",
"Command": "Comando",
"Confirm Password": "Conferma password",
"Connections": "Connessioni",
"Content": "Contenuto",
"Context Length": "Lunghezza contesto",
"Conversation Mode": "Modalità conversazione",
"Copy last code block": "Copia ultimo blocco di codice",
"Copy last response": "Copia ultima risposta",
"Copying to clipboard was successful!": "Copia negli appunti riuscita!",
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Crea una frase concisa di 3-5 parole come intestazione per la seguente query, aderendo rigorosamente al limite di 3-5 parole ed evitando l'uso della parola 'titolo':",
"Create a modelfile": "Crea un file modello",
"Create Account": "Crea account",
"Created at": "Creato il",
"Created by": "Creato da",
"Current Model": "Modello corrente",
"Current Password": "Password corrente",
"Custom": "Personalizzato",
"Customize Ollama models for a specific purpose": "Personalizza i modelli Ollama per uno scopo specifico",
"Dark": "Scuro",
"Database": "Database",
"DD/MM/YYYY HH:mm": "DD/MM/YYYY HH:mm",
"Default": "Predefinito",
"Default (Automatic1111)": "Predefinito (Automatic1111)",
"Default (Web API)": "Predefinito (API Web)",
"Default model updated": "Modello predefinito aggiornato",
"Default Prompt Suggestions": "Suggerimenti prompt predefiniti",
"Default User Role": "Ruolo utente predefinito",
"delete": "elimina",
"Delete a model": "Elimina un modello",
"Delete chat": "Elimina chat",
"Delete Chats": "Elimina chat",
"Deleted {{deleteModelTag}}": "Eliminato {{deleteModelTag}}",
"Deleted {tagName}": "Eliminato {tagName}",
"Description": "Descrizione",
"Desktop Notifications": "Notifiche desktop",
"Disabled": "Disabilitato",
"Discover a modelfile": "Scopri un file modello",
"Discover a prompt": "Scopri un prompt",
"Discover, download, and explore custom prompts": "Scopri, scarica ed esplora prompt personalizzati",
"Discover, download, and explore model presets": "Scopri, scarica ed esplora i preset del modello",
"Display the username instead of You in the Chat": "Visualizza il nome utente invece di Tu nella chat",
"Document": "Documento",
"Document Settings": "Impostazioni documento",
"Documents": "Documenti",
"does not make any external connections, and your data stays securely on your locally hosted server.": "non effettua connessioni esterne e i tuoi dati rimangono al sicuro sul tuo server ospitato localmente.",
"Don't Allow": "Non consentire",
"Don't have an account?": "Non hai un account?",
"Download as a File": "Scarica come file",
"Download Database": "Scarica database",
"Drop any files here to add to the conversation": "Trascina qui i file da aggiungere alla conversazione",
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "ad esempio '30s','10m'. Le unità di tempo valide sono 's', 'm', 'h'.",
"Edit Doc": "Modifica documento",
"Edit User": "Modifica utente",
"Email": "Email",
"Enable Chat History": "Abilita cronologia chat",
"Enable New Sign Ups": "Abilita nuove iscrizioni",
"Enabled": "Abilitato",
"Enter {{role}} message here": "Inserisci il messaggio per {{role}} qui",
"Enter API Key": "Inserisci la chiave API",
"Enter Chunk Overlap": "Inserisci la sovrapposizione chunk",
"Enter Chunk Size": "Inserisci la dimensione chunk",
"Enter Image Size (e.g. 512x512)": "Inserisci la dimensione dell'immagine (ad esempio 512x512)",
"Enter LiteLLM API Base URL (litellm_params.api_base)": "Inserisci l'URL base dell'API LiteLLM (litellm_params.api_base)",
"Enter LiteLLM API Key (litellm_params.api_key)": "Inserisci la chiave API LiteLLM (litellm_params.api_key)",
"Enter LiteLLM API RPM (litellm_params.rpm)": "Inserisci LiteLLM API RPM (litellm_params.rpm)",
"Enter LiteLLM Model (litellm_params.model)": "Inserisci il modello LiteLLM (litellm_params.model)",
"Enter Max Tokens (litellm_params.max_tokens)": "Inserisci Max Tokens (litellm_params.max_tokens)",
"Enter model tag (e.g. {{modelTag}})": "Inserisci il tag del modello (ad esempio {{modelTag}})",
"Enter Number of Steps (e.g. 50)": "Inserisci il numero di passaggi (ad esempio 50)",
"Enter stop sequence": "Inserisci la sequenza di arresto",
"Enter Top K": "Inserisci Top K",
"Enter URL (e.g. http://127.0.0.1:7860/)": "Inserisci URL (ad esempio http://127.0.0.1:7860/)",
"Enter Your Email": "Inserisci la tua email",
"Enter Your Full Name": "Inserisci il tuo nome completo",
"Enter Your Password": "Inserisci la tua password",
"Experimental": "Sperimentale",
"Export All Chats (All Users)": "Esporta tutte le chat (tutti gli utenti)",
"Export Chats": "Esporta chat",
"Export Documents Mapping": "Esporta mappatura documenti",
"Export Modelfiles": "Esporta file modello",
"Export Prompts": "Esporta prompt",
"Failed to read clipboard contents": "Impossibile leggere il contenuto degli appunti",
"File Mode": "Modalità file",
"File not found.": "File non trovato.",
"Focus chat input": "Metti a fuoco l'input della chat",
"Format your variables using square brackets like this:": "Formatta le tue variabili usando parentesi quadre come questa:",
"From (Base Model)": "Da (modello base)",
"Full Screen Mode": "Modalità a schermo intero",
"General": "Generale",
"General Settings": "Impostazioni generali",
"Hello, {{name}}": "Ciao, {{name}}",
"Hide": "Nascondi",
"Hide Additional Params": "Nascondi parametri aggiuntivi",
"How can I help you today?": "Come posso aiutarti oggi?",
"Image Generation (Experimental)": "Generazione di immagini (sperimentale)",
"Image Generation Engine": "Motore di generazione immagini",
"Image Settings": "Impostazioni immagine",
"Images": "Immagini",
"Import Chats": "Importa chat",
"Import Documents Mapping": "Importa mappatura documenti",
"Import Modelfiles": "Importa file modello",
"Import Prompts": "Importa prompt",
"Include --api flag when running stable-diffusion-webui": "Includi il flag --api quando esegui stable-diffusion-webui",
"Interface": "Interfaccia",
"join our Discord for help.": "unisciti al nostro Discord per ricevere aiuto.",
"JSON": "JSON",
"JWT Expiration": "Scadenza JWT",
"JWT Token": "Token JWT",
"Keep Alive": "Mantieni attivo",
"Keyboard shortcuts": "Scorciatoie da tastiera",
"Language": "Lingua",
"Light": "Chiaro",
"Listening...": "Ascolto...",
"LLMs can make mistakes. Verify important information.": "Gli LLM possono commettere errori. Verifica le informazioni importanti.",
"Made by OpenWebUI Community": "Realizzato dalla comunità OpenWebUI",
"Make sure to enclose them with": "Assicurati di racchiuderli con",
"Manage LiteLLM Models": "Gestisci modelli LiteLLM",
"Manage Models": "Gestisci modelli",
"Manage Ollama Models": "Gestisci modelli Ollama",
"Max Tokens": "Max token",
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "È possibile scaricare un massimo di 3 modelli contemporaneamente. Riprova più tardi.",
"Mirostat": "Mirostat",
"Mirostat Eta": "Mirostat Eta",
"Mirostat Tau": "Mirostat Tau",
"MMMM DD, YYYY": "MMMM DD, YYYY",
"Model '{{modelName}}' has been successfully downloaded.": "Il modello '{{modelName}}' è stato scaricato con successo.",
"Model '{{modelTag}}' is already in queue for downloading.": "Il modello '{{modelTag}}' è già in coda per il download.",
"Model {{modelId}} not found": "Modello {{modelId}} non trovato",
"Model {{modelName}} already exists.": "Il modello {{modelName}} esiste già.",
"Model Name": "Nome modello",
"Model not selected": "Modello non selezionato",
"Model Tag Name": "Nome tag del modello",
"Model Whitelisting": "Whitelisting del modello",
"Model(s) Whitelisted": "Modello/i in whitelist",
"Modelfile": "File modello",
"Modelfile Advanced Settings": "Impostazioni avanzate del file modello",
"Modelfile Content": "Contenuto del file modello",
"Modelfiles": "File modello",
"Models": "Modelli",
"My Documents": "I miei documenti",
"My Modelfiles": "I miei file modello",
"My Prompts": "I miei prompt",
"Name": "Nome",
"Name Tag": "Nome tag",
"Name your modelfile": "Assegna un nome al tuo file modello",
"New Chat": "Nuova chat",
"New Password": "Nuova password",
"Not sure what to add?": "Non sei sicuro di cosa aggiungere?",
"Not sure what to write? Switch to": "Non sei sicuro di cosa scrivere? Passa a",
"Off": "Disattivato",
"Okay, Let's Go!": "Ok, andiamo!",
"Ollama Base URL": "URL base Ollama",
"Ollama Version": "Versione Ollama",
"On": "Attivato",
"Only": "Solo",
"Only alphanumeric characters and hyphens are allowed in the command string.": "Nella stringa di comando sono consentiti solo caratteri alfanumerici e trattini.",
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Ops! Aspetta! I tuoi file sono ancora in fase di elaborazione. Li stiamo cucinando alla perfezione. Per favore sii paziente e ti faremo sapere quando saranno pronti.",
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Ops! Sembra che l'URL non sia valido. Si prega di ricontrollare e riprovare.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ops! Stai utilizzando un metodo non supportato (solo frontend). Si prega di servire la WebUI dal backend.",
"Open": "Apri",
"Open AI": "Open AI",
"Open AI (Dall-E)": "Open AI (Dall-E)",
"Open new chat": "Apri nuova chat",
"OpenAI API": "API OpenAI",
"OpenAI API Key": "Chiave API OpenAI",
"OpenAI API Key is required.": "La chiave API OpenAI è obbligatoria.",
"or": "o",
"Parameters": "Parametri",
"Password": "Password",
"PDF Extract Images (OCR)": "Estrazione immagini PDF (OCR)",
"pending": "in sospeso",
"Permission denied when accessing microphone: {{error}}": "Autorizzazione negata durante l'accesso al microfono: {{error}}",
"Playground": "Playground",
"Profile": "Profilo",
"Prompt Content": "Contenuto del prompt",
"Prompt suggestions": "Suggerimenti prompt",
"Prompts": "Prompt",
"Pull a model from Ollama.com": "Estrai un modello da Ollama.com",
"Pull Progress": "Avanzamento estrazione",
"Query Params": "Parametri query",
"RAG Template": "Modello RAG",
"Raw Format": "Formato raw",
"Record voice": "Registra voce",
"Redirecting you to OpenWebUI Community": "Reindirizzamento alla comunità OpenWebUI",
"Release Notes": "Note di rilascio",
"Repeat Last N": "Ripeti ultimi N",
"Repeat Penalty": "Penalità di ripetizione",
"Request Mode": "Modalità richiesta",
"Reset Vector Storage": "Reimposta archivio vettoriale",
"Response AutoCopy to Clipboard": "Copia automatica della risposta negli appunti",
"Role": "Ruolo",
"Rosé Pine": "Rosé Pine",
"Rosé Pine Dawn": "Rosé Pine Dawn",
"Save": "Salva",
"Save & Create": "Salva e crea",
"Save & Submit": "Salva e invia",
"Save & Update": "Salva e aggiorna",
"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!",
"Scan for documents from {{path}}": "Cerca documenti da {{path}}",
"Search": "Cerca",
"Search Documents": "Cerca documenti",
"Search Prompts": "Cerca prompt",
"See readme.md for instructions": "Vedi readme.md per le istruzioni",
"See what's new": "Guarda le novità",
"Seed": "Seme",
"Select a mode": "Seleziona una modalità",
"Select a model": "Seleziona un modello",
"Select an Ollama instance": "Seleziona un'istanza Ollama",
"Send a Message": "Invia un messaggio",
"Send message": "Invia messaggio",
"Server connection verified": "Connessione al server verificata",
"Set as default": "Imposta come predefinito",
"Set Default Model": "Imposta modello predefinito",
"Set Image Size": "Imposta dimensione immagine",
"Set Steps": "Imposta passaggi",
"Set Title Auto-Generation Model": "Imposta modello di generazione automatica del titolo",
"Set Voice": "Imposta voce",
"Settings": "Impostazioni",
"Settings saved successfully!": "Impostazioni salvate con successo!",
"Share to OpenWebUI Community": "Condividi con la comunità OpenWebUI",
"short-summary": "riassunto-breve",
"Show": "Mostra",
"Show Additional Params": "Mostra parametri aggiuntivi",
"Show shortcuts": "Mostra",
"sidebar": "barra laterale",
"Sign in": "Accedi",
"Sign Out": "Esci",
"Sign up": "Registrati",
"Speech recognition error: {{error}}": "Errore di riconoscimento vocale: {{error}}",
"Speech-to-Text Engine": "Motore da voce a testo",
"SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition non è supportata in questo browser.",
"Stop Sequence": "Sequenza di arresto",
"STT Settings": "Impostazioni STT",
"Submit": "Invia",
"Success": "Successo",
"Successfully updated.": "Aggiornato con successo.",
"Sync All": "Sincronizza tutto",
"System": "Sistema",
"System Prompt": "Prompt di sistema",
"Tags": "Tag",
"Temperature": "Temperatura",
"Template": "Modello",
"Text Completion": "Completamento del testo",
"Text-to-Speech Engine": "Motore da testo a voce",
"Tfs Z": "Tfs Z",
"Theme": "Tema",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Ciò garantisce che le tue preziose conversazioni siano salvate in modo sicuro nel tuo database backend. Grazie!",
"This setting does not sync across browsers or devices.": "Questa impostazione non si sincronizza tra browser o dispositivi.",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Suggerimento: aggiorna più slot di variabili consecutivamente premendo il tasto tab nell'input della chat dopo ogni sostituzione.",
"Title": "Titolo",
"Title Auto-Generation": "Generazione automatica del titolo",
"Title Generation Prompt": "Prompt di generazione del titolo",
"to": "a",
"To access the available model names for downloading,": "Per accedere ai nomi dei modelli disponibili per il download,",
"To access the GGUF models available for downloading,": "Per accedere ai modelli GGUF disponibili per il download,",
"to chat input.": "all'input della chat.",
"Toggle settings": "Attiva/disattiva impostazioni",
"Toggle sidebar": "Attiva/disattiva barra laterale",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Problemi di accesso a Ollama?",
"TTS Settings": "Impostazioni TTS",
"Type Hugging Face Resolve (Download) URL": "Digita l'URL di Hugging Face Resolve (Download)",
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! Si è verificato un problema durante la connessione a {{provider}}.",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Tipo di file sconosciuto '{{file_type}}', ma accettato e trattato come testo normale",
"Update password": "Aggiorna password",
"Upload a GGUF model": "Carica un modello GGUF",
"Upload files": "Carica file",
"Upload Progress": "Avanzamento caricamento",
"URL Mode": "Modalità URL",
"Use '#' in the prompt input to load and select your documents.": "Usa '#' nell'input del prompt per caricare e selezionare i tuoi documenti.",
"Use Gravatar": "Usa Gravatar",
"user": "utente",
"User Permissions": "Autorizzazioni utente",
"Users": "Utenti",
"Utilize": "Utilizza",
"Valid time units:": "Unità di tempo valide:",
"variable": "variabile",
"variable to have them replaced with clipboard content.": "variabile per farli sostituire con il contenuto degli appunti.",
"Version": "Versione",
"Web": "Web",
"WebUI Add-ons": "Componenti aggiuntivi WebUI",
"WebUI Settings": "Impostazioni WebUI",
"WebUI will make requests to": "WebUI effettuerà richieste a",
"Whats New in": "Novità in",
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Quando la cronologia è disattivata, le nuove chat su questo browser non verranno visualizzate nella cronologia su nessuno dei tuoi dispositivi.",
"Whisper (Local)": "Whisper (locale)",
"Write a prompt suggestion (e.g. Who are you?)": "Scrivi un suggerimento per il prompt (ad esempio Chi sei?)",
"Write a summary in 50 words that summarizes [topic or keyword].": "Scrivi un riassunto in 50 parole che riassume [argomento o parola chiave].",
"You": "Tu",
"You're a helpful assistant.": "Sei un assistente utile.",
"You're now logged in.": "Ora hai effettuato l'accesso."
}

View file

@ -0,0 +1,363 @@
{
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'秒', '分', '時間', '日', '週' または '-1' で無期限。",
"(Beta)": "(ベータ版)",
"(e.g. sh webui.sh --api)": "(例: sh webui.sh --api)",
"(latest)": "(最新)",
"{{modelName}} is thinking...": "{{modelName}} は思考中です...",
"{{webUIName}} Backend Required": "{{webUIName}} バックエンドが必要です",
"a user": "ユーザー",
"About": "概要",
"Account": "アカウント",
"Action": "アクション",
"Add a model": "モデルを追加",
"Add a model tag name": "モデルタグ名を追加",
"Add a short description about what this modelfile does": "このモデルファイルの機能に関する簡単な説明を追加",
"Add a short title for this prompt": "このプロンプトの短いタイトルを追加",
"Add a tag": "タグを追加",
"Add Docs": "ドキュメントを追加",
"Add Files": "ファイルを追加",
"Add message": "メッセージを追加",
"add tags": "タグを追加",
"Adjusting these settings will apply changes universally to all users.": "これらの設定を調整すると、すべてのユーザーに普遍的に変更が適用されます。",
"admin": "管理者",
"Admin Panel": "管理者パネル",
"Admin Settings": "管理者設定",
"Advanced Parameters": "詳細パラメーター",
"all": "すべて",
"All Users": "すべてのユーザー",
"Allow": "許可",
"Allow Chat Deletion": "チャットの削除を許可",
"alphanumeric characters and hyphens": "英数字とハイフン",
"Already have an account?": "すでにアカウントをお持ちですか?",
"an assistant": "アシスタント",
"and": "および",
"API Base URL": "API ベース URL",
"API Key": "API キー",
"API RPM": "API RPM",
"are allowed - Activate this command by typing": "が許可されています - 次のように入力してこのコマンドをアクティブ化します",
"Are you sure?": "よろしいですか?",
"Audio": "オーディオ",
"Auto-playback response": "応答の自動再生",
"Auto-send input after 3 sec.": "3 秒後に自動的に出力を送信",
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 ベース URL",
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 ベース URL が必要です。",
"available!": "利用可能!",
"Back": "戻る",
"Builder Mode": "ビルダーモード",
"Cancel": "キャンセル",
"Categories": "カテゴリ",
"Change Password": "パスワードを変更",
"Chat": "チャット",
"Chat History": "チャット履歴",
"Chat History is off for this browser.": "このブラウザではチャット履歴が無効になっています。",
"Chats": "チャット",
"Check Again": "再確認",
"Check for updates": "アップデートを確認",
"Checking for updates...": "アップデートを確認しています...",
"Choose a model before saving...": "保存する前にモデルを選択してください...",
"Chunk Overlap": "チャンクオーバーラップ",
"Chunk Params": "チャンクパラメーター",
"Chunk Size": "チャンクサイズ",
"Click here for help.": "ヘルプについてはここをクリックしてください。",
"Click here to check other modelfiles.": "他のモデルファイルを確認するにはここをクリックしてください。",
"Click here to select": "選択するにはここをクリックしてください",
"Click here to select documents.": "ドキュメントを選択するにはここをクリックしてください。",
"click here.": "ここをクリックしてください。",
"Click on the user role button to change a user's role.": "ユーザーの役割を変更するには、ユーザー役割ボタンをクリックしてください。",
"Close": "閉じる",
"Collection": "コレクション",
"Command": "コマンド",
"Confirm Password": "パスワードを確認",
"Connections": "接続",
"Content": "コンテンツ",
"Context Length": "コンテキストの長さ",
"Conversation Mode": "会話モード",
"Copy last code block": "最後のコードブロックをコピー",
"Copy last response": "最後の応答をコピー",
"Copying to clipboard was successful!": "クリップボードへのコピーが成功しました!",
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "次のクエリの見出しとして、3〜5語の簡潔なフレーズを作成してください。3〜5語の制限を厳守し、「タイトル」という単語の使用を避けてください。",
"Create a modelfile": "モデルファイルを作成",
"Create Account": "アカウントを作成",
"Created at": "作成日時",
"Created by": "作成者",
"Current Model": "現在のモデル",
"Current Password": "現在のパスワード",
"Custom": "カスタム",
"Customize Ollama models for a specific purpose": "特定の目的に合わせて Ollama モデルをカスタマイズ",
"Dark": "ダーク",
"Database": "データベース",
"DD/MM/YYYY HH:mm": "DD/MM/YYYY HH:mm",
"Default": "デフォルト",
"Default (Automatic1111)": "デフォルト (Automatic1111)",
"Default (Web API)": "デフォルト (Web API)",
"Default model updated": "デフォルトモデルが更新されました",
"Default Prompt Suggestions": "デフォルトのプロンプトの提案",
"Default User Role": "デフォルトのユーザー役割",
"delete": "削除",
"Delete a model": "モデルを削除",
"Delete chat": "チャットを削除",
"Delete Chats": "チャットを削除",
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} を削除しました",
"Deleted {tagName}": "{tagName} を削除しました",
"Description": "説明",
"Desktop Notifications": "デスクトップ通知",
"Disabled": "無効",
"Discover a modelfile": "モデルファイルを見つける",
"Discover a prompt": "プロンプトを見つける",
"Discover, download, and explore custom prompts": "カスタムプロンプトを見つけて、ダウンロードして、探索",
"Discover, download, and explore model presets": "モデルプリセットを見つけて、ダウンロードして、探索",
"Display the username instead of You in the Chat": "チャットで「あなた」の代わりにユーザー名を表示",
"Document": "ドキュメント",
"Document Settings": "ドキュメント設定",
"Documents": "ドキュメント",
"does not make any external connections, and your data stays securely on your locally hosted server.": "外部接続を行わず、データはローカルでホストされているサーバー上に安全に保持されます。",
"Don't Allow": "許可しない",
"Don't have an account?": "アカウントをお持ちではありませんか?",
"Download as a File": "ファイルとしてダウンロード",
"Download Database": "データベースをダウンロード",
"Drop any files here to add to the conversation": "会話を追加するには、ここにファイルをドロップしてください",
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "例: '30秒'、'10分'。有効な時間単位は '秒'、'分'、'時間' です。",
"Edit Doc": "ドキュメントを編集",
"Edit User": "ユーザーを編集",
"Email": "メールアドレス",
"Enable Chat History": "チャット履歴を有効化",
"Enable New Sign Ups": "新規登録を有効化",
"Enabled": "有効",
"Enter {{role}} message here": "{{role}} メッセージをここに入力してください",
"Enter API Key": "API キーを入力してください",
"Enter Chunk Overlap": "チャンクオーバーラップを入力してください",
"Enter Chunk Size": "チャンクサイズを入力してください",
"Enter Image Size (e.g. 512x512)": "画像サイズを入力してください (例: 512x512)",
"Enter LiteLLM API Base URL (litellm_params.api_base)": "LiteLLM API ベース URL を入力してください (litellm_params.api_base)",
"Enter LiteLLM API Key (litellm_params.api_key)": "LiteLLM API キーを入力してください (litellm_params.api_key)",
"Enter LiteLLM API RPM (litellm_params.rpm)": "LiteLLM API RPM を入力してください (litellm_params.rpm)",
"Enter LiteLLM Model (litellm_params.model)": "LiteLLM モデルを入力してください (litellm_params.model)",
"Enter Max Tokens (litellm_params.max_tokens)": "最大トークン数を入力してください (litellm_params.max_tokens)",
"Enter model tag (e.g. {{modelTag}})": "モデルタグを入力してください (例: {{modelTag}})",
"Enter Number of Steps (e.g. 50)": "ステップ数を入力してください (例: 50)",
"Enter stop sequence": "ストップシーケンスを入力してください",
"Enter Top K": "トップ K を入力してください",
"Enter URL (e.g. http://127.0.0.1:7860/)": "URL を入力してください (例: http://127.0.0.1:7860/)",
"Enter Your Email": "メールアドレスを入力してください",
"Enter Your Full Name": "フルネームを入力してください",
"Enter Your Password": "パスワードを入力してください",
"Experimental": "実験的",
"Export All Chats (All Users)": "すべてのチャットをエクスポート (すべてのユーザー)",
"Export Chats": "チャットをエクスポート",
"Export Documents Mapping": "ドキュメントマッピングをエクスポート",
"Export Modelfiles": "モデルファイルをエクスポート",
"Export Prompts": "プロンプトをエクスポート",
"Failed to read clipboard contents": "クリップボードの内容を読み取れませんでした",
"File Mode": "ファイルモード",
"File not found.": "ファイルが見つかりません。",
"Focus chat input": "チャット入力をフォーカス",
"Format your variables using square brackets like this:": "次のように角括弧を使用して変数をフォーマットします。",
"From (Base Model)": "From (ベースモデル)",
"Full Screen Mode": "フルスクリーンモード",
"General": "一般",
"General Settings": "一般設定",
"Hello, {{name}}": "こんにちは、{{name}} さん",
"Hide": "非表示",
"Hide Additional Params": "追加パラメーターを非表示",
"How can I help you today?": "今日はどのようにお手伝いしましょうか?",
"Image Generation (Experimental)": "画像生成 (実験的)",
"Image Generation Engine": "画像生成エンジン",
"Image Settings": "画像設定",
"Images": "画像",
"Import Chats": "チャットをインポート",
"Import Documents Mapping": "ドキュメントマッピングをインポート",
"Import Modelfiles": "モデルファイルをインポート",
"Import Prompts": "プロンプトをインポート",
"Include --api flag when running stable-diffusion-webui": "stable-diffusion-webui を実行するときに --api フラグを含める",
"Interface": "インターフェース",
"join our Discord for help.": "ヘルプについては、Discord に参加してください。",
"JSON": "JSON",
"JWT Expiration": "JWT 有効期限",
"JWT Token": "JWT トークン",
"Keep Alive": "キープアライブ",
"Keyboard shortcuts": "キーボードショートカット",
"Language": "言語",
"Light": "ライト",
"Listening...": "聞いています...",
"LLMs can make mistakes. Verify important information.": "LLM は間違いを犯す可能性があります。重要な情報を検証してください。",
"Made by OpenWebUI Community": "OpenWebUI コミュニティによって作成",
"Make sure to enclose them with": "必ず次で囲んでください",
"Manage LiteLLM Models": "LiteLLM モデルを管理",
"Manage Models": "モデルを管理",
"Manage Ollama Models": "Ollama モデルを管理",
"Max Tokens": "最大トークン数",
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "同時にダウンロードできるモデルは最大 3 つです。後でもう一度お試しください。",
"Mirostat": "ミロスタット",
"Mirostat Eta": "ミロスタット Eta",
"Mirostat Tau": "ミロスタット Tau",
"MMMM DD, YYYY": "MMMM DD, YYYY",
"Model '{{modelName}}' has been successfully downloaded.": "モデル '{{modelName}}' が正常にダウンロードされました。",
"Model '{{modelTag}}' is already in queue for downloading.": "モデル '{{modelTag}}' はすでにダウンロード待ち行列に入っています。",
"Model {{modelId}} not found": "モデル {{modelId}} が見つかりません",
"Model {{modelName}} already exists.": "モデル {{modelName}} はすでに存在します。",
"Model Name": "モデル名",
"Model not selected": "モデルが選択されていません",
"Model Tag Name": "モデルタグ名",
"Model Whitelisting": "モデルホワイトリスト",
"Model(s) Whitelisted": "ホワイトリストに登録されたモデル",
"Modelfile": "モデルファイル",
"Modelfile Advanced Settings": "モデルファイルの詳細設定",
"Modelfile Content": "モデルファイルの内容",
"Modelfiles": "モデルファイル",
"Models": "モデル",
"My Documents": "マイ ドキュメント",
"My Modelfiles": "マイ モデルファイル",
"My Prompts": "マイ プロンプト",
"Name": "名前",
"Name Tag": "名前タグ",
"Name your modelfile": "モデルファイルに名前を付ける",
"New Chat": "新しいチャット",
"New Password": "新しいパスワード",
"Not sure what to add?": "何を追加すればよいかわからない?",
"Not sure what to write? Switch to": "何を書けばよいかわからない? 次に切り替える",
"Off": "オフ",
"Okay, Let's Go!": "OK、始めましょう",
"Ollama Base URL": "Ollama ベース URL",
"Ollama Version": "Ollama バージョン",
"On": "オン",
"Only": "のみ",
"Only alphanumeric characters and hyphens are allowed in the command string.": "コマンド文字列には英数字とハイフンのみが許可されています。",
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "おっと! しばらくお待ちください! ファイルはまだ処理中です。完璧に仕上げていますので、しばらくお待ちください。準備ができたらお知らせします。",
"Oops! Looks like the URL is invalid. Please double-check and try again.": "おっと! URL が無効なようです。もう一度確認してやり直してください。",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "おっと! サポートされていない方法 (フロントエンドのみ) を使用しています。バックエンドから WebUI を提供してください。",
"Open": "開く",
"Open AI": "Open AI",
"Open AI (Dall-E)": "Open AI (Dall-E)",
"Open new chat": "新しいチャットを開く",
"OpenAI API": "OpenAI API",
"OpenAI API Key": "OpenAI API キー",
"OpenAI API Key is required.": "OpenAI API キーが必要です。",
"or": "または",
"Parameters": "パラメーター",
"Password": "パスワード",
"PDF Extract Images (OCR)": "PDF 画像抽出 (OCR)",
"pending": "保留中",
"Permission denied when accessing microphone: {{error}}": "マイクへのアクセス時に権限が拒否されました: {{error}}",
"Playground": "プレイグラウンド",
"Profile": "プロフィール",
"Prompt Content": "プロンプトの内容",
"Prompt suggestions": "プロンプトの提案",
"Prompts": "プロンプト",
"Pull a model from Ollama.com": "Ollama.com からモデルをプル",
"Pull Progress": "プルの進行状況",
"Query Params": "クエリパラメーター",
"RAG Template": "RAG テンプレート",
"Raw Format": "Raw 形式",
"Record voice": "音声を録音",
"Redirecting you to OpenWebUI Community": "OpenWebUI コミュニティにリダイレクトしています",
"Release Notes": "リリースノート",
"Repeat Last N": "最後の N を繰り返す",
"Repeat Penalty": "繰り返しペナルティ",
"Request Mode": "リクエストモード",
"Reset Vector Storage": "ベクトルストレージをリセット",
"Response AutoCopy to Clipboard": "クリップボードへの応答の自動コピー",
"Role": "役割",
"Rosé Pine": "Rosé Pine",
"Rosé Pine Dawn": "Rosé Pine Dawn",
"Save": "保存",
"Save & Create": "保存して作成",
"Save & Submit": "保存して送信",
"Save & Update": "保存して更新",
"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!": "スキャン完了!",
"Scan for documents from {{path}}": "{{path}} からドキュメントをスキャン",
"Search": "検索",
"Search Documents": "ドキュメントを検索",
"Search Prompts": "プロンプトを検索",
"See readme.md for instructions": "手順については readme.md を参照してください",
"See what's new": "新機能を見る",
"Seed": "シード",
"Select a mode": "モードを選択",
"Select a model": "モデルを選択",
"Select an Ollama instance": "Ollama インスタンスを選択",
"Send a Message": "メッセージを送信",
"Send message": "メッセージを送信",
"Server connection verified": "サーバー接続が確認されました",
"Set as default": "デフォルトに設定",
"Set Default Model": "デフォルトモデルを設定",
"Set Image Size": "画像サイズを設定",
"Set Steps": "ステップを設定",
"Set Title Auto-Generation Model": "タイトル自動生成モデルを設定",
"Set Voice": "音声を設定",
"Settings": "設定",
"Settings saved successfully!": "設定が正常に保存されました!",
"Share to OpenWebUI Community": "OpenWebUI コミュニティに共有",
"short-summary": "short-summary",
"Show": "表示",
"Show Additional Params": "追加パラメーターを表示",
"Show shortcuts": "表示",
"sidebar": "サイドバー",
"Sign in": "サインイン",
"Sign Out": "サインアウト",
"Sign up": "サインアップ",
"Speech recognition error: {{error}}": "音声認識エラー: {{error}}",
"Speech-to-Text Engine": "音声テキスト変換エンジン",
"SpeechRecognition API is not supported in this browser.": "このブラウザでは SpeechRecognition API がサポートされていません。",
"Stop Sequence": "ストップシーケンス",
"STT Settings": "STT 設定",
"Submit": "送信",
"Success": "成功",
"Successfully updated.": "正常に更新されました。",
"Sync All": "すべてを同期",
"System": "システム",
"System Prompt": "システムプロンプト",
"Tags": "タグ",
"Temperature": "温度",
"Template": "テンプレート",
"Text Completion": "テキスト補完",
"Text-to-Speech Engine": "テキスト音声変換エンジン",
"Tfs Z": "Tfs Z",
"Theme": "テーマ",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "これは、貴重な会話がバックエンドデータベースに安全に保存されることを保証します。ありがとうございます!",
"This setting does not sync across browsers or devices.": "この設定は、ブラウザやデバイス間で同期されません。",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "ヒント: 各置換後にチャット入力で Tab キーを押すことで、複数の変数スロットを連続して更新できます。",
"Title": "タイトル",
"Title Auto-Generation": "タイトル自動生成",
"Title Generation Prompt": "タイトル生成プロンプト",
"to": "まで",
"To access the available model names for downloading,": "ダウンロード可能なモデル名にアクセスするには、",
"To access the GGUF models available for downloading,": "ダウンロード可能な GGUF モデルにアクセスするには、",
"to chat input.": "チャット入力へ。",
"Toggle settings": "設定を切り替え",
"Toggle sidebar": "サイドバーを切り替え",
"Top K": "トップ K",
"Top P": "トップ P",
"Trouble accessing Ollama?": "Ollama へのアクセスに問題がありますか?",
"TTS Settings": "TTS 設定",
"Type Hugging Face Resolve (Download) URL": "Hugging Face Resolve (ダウンロード) URL を入力してください",
"Uh-oh! There was an issue connecting to {{provider}}.": "おっと! {{provider}} への接続に問題が発生しました。",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "不明なファイルタイプ '{{file_type}}' ですが、プレーンテキストとして受け入れて処理します",
"Update password": "パスワードを更新",
"Upload a GGUF model": "GGUF モデルをアップロード",
"Upload files": "ファイルをアップロード",
"Upload Progress": "アップロードの進行状況",
"URL Mode": "URL モード",
"Use '#' in the prompt input to load and select your documents.": "プロンプト入力で '#' を使用して、ドキュメントを読み込んで選択します。",
"Use Gravatar": "Gravatar を使用する",
"user": "ユーザー",
"User Permissions": "ユーザー権限",
"Users": "ユーザー",
"Utilize": "活用",
"Valid time units:": "有効な時間単位:",
"variable": "変数",
"variable to have them replaced with clipboard content.": "クリップボードの内容に置き換える変数。",
"Version": "バージョン",
"Web": "ウェブ",
"WebUI Add-ons": "WebUI アドオン",
"WebUI Settings": "WebUI 設定",
"WebUI will make requests to": "WebUI は次に対してリクエストを行います",
"Whats New in": "新機能",
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "履歴が無効になっている場合、このブラウザでの新しいチャットは、どのデバイスの履歴にも表示されません。",
"Whisper (Local)": "Whisper (ローカル)",
"Write a prompt suggestion (e.g. Who are you?)": "プロンプトの提案を書いてください (例: あなたは誰ですか?)",
"Write a summary in 50 words that summarizes [topic or keyword].": "[トピックまたはキーワード] を要約する 50 語の概要を書いてください。",
"You": "あなた",
"You're a helpful assistant.": "あなたは役に立つアシスタントです。",
"You're now logged in.": "ログインしました。"
}

View file

@ -4,27 +4,67 @@
"title": "English (US)" "title": "English (US)"
}, },
{ {
"code": "fa-IR", "code": "bg-BG",
"title": "فارسی (Farsi)" "title": "Bulgarian (BG)"
},
{
"code": "ca-ES",
"title": "Catalan"
}, },
{ {
"code": "de-DE", "code": "de-DE",
"title": "Deutsch" "title": "Deutsch"
}, },
{
"code": "es-ES",
"title": "Spanish"
},
{
"code": "fa-IR",
"title": "فارسی (Farsi)"
},
{
"code": "fr-CA",
"title": "French (Canada)"
},
{ {
"code": "fr-FR", "code": "fr-FR",
"title": "French (France)" "title": "French (France)"
}, },
{
"code": "it-IT",
"title": "Italian"
},
{
"code": "ja-JP",
"title": "Japanese"
},
{
"code": "nl-NL",
"title": "Dutch (Netherlands)"
},
{
"code": "pt-PT",
"title": "Portuguese (Portugal)"
},
{
"code": "ru-RU",
"title": "Russian (Russia)"
},
{ {
"code": "uk-UA", "code": "uk-UA",
"title": "Ukrainian" "title": "Ukrainian"
}, },
{ {
"code": "zh-TW", "code": "vi-VN",
"title": "Chinese (Traditional)" "title": "Tiếng Việt"
}, },
{ {
"code": "zh-CN", "code": "zh-CN",
"title": "Chinese (Simplified)" "title": "Chinese (Simplified)"
},
{
"code": "zh-TW",
"title": "Chinese (Traditional)"
} }
] ]

View file

@ -0,0 +1,363 @@
{
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' of '-1' for geen vervaldatum.",
"(Beta)": "(Beta)",
"(e.g. `sh webui.sh --api`)": "(e.g. `sh webui.sh --api`)",
"(latest)": "(nieuwste)",
"{{modelName}} is thinking...": "{{modelName}} is aan het denken...",
"{{webUIName}} Backend Required": "{{webUIName}} Backend Verlpicht",
"a user": "",
"About": "Over",
"Account": "Account",
"Action": "Actie",
"Add a model": "Voeg een model toe",
"Add a model tag name": "Voeg een model tag naam toe",
"Add a short description about what this modelfile does": "Voeg een korte beschrijving toe over wat dit modelfile doet",
"Add a short title for this prompt": "Voeg een korte titel toe voor deze prompt",
"Add a tag": "Voeg een tag toe",
"Add Docs": "Voeg Docs toe",
"Add Files": "Voege Bestanden toe",
"Add message": "Voeg bericht toe",
"add tags": "voeg tags toe",
"Adjusting these settings will apply changes universally to all users.": "Het aanpassen van deze instellingen zal universeel worden toegepast op alle gebruikers.",
"admin": "admin",
"Admin Panel": "Administratieve Paneel",
"Admin Settings": "Administratieve Settings",
"Advanced Parameters": "Geavanceerde Parameters",
"all": "alle",
"All Users": "Alle Gebruikers",
"Allow": "Toestaan",
"Allow Chat Deletion": "Sta Chat Verwijdering toe",
"alphanumeric characters and hyphens": "alfanumerieke karakters en streepjes",
"Already have an account?": "Heb je al een account?",
"an assistant": "een assistent",
"and": "en",
"API Base URL": "API Base URL",
"API Key": "API Key",
"API RPM": "API RPM",
"are allowed - Activate this command by typing": "zijn toegestaan - Activeer deze commando door te typen",
"Are you sure?": "",
"Audio": "Audio",
"Auto-playback response": "Automatisch afspelen van antwoord",
"Auto-send input after 3 sec.": "Automatisch verzenden van input na 3 sec.",
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Base URL",
"AUTOMATIC1111 Base URL is required.": "",
"available!": "beschikbaar!",
"Back": "Terug",
"Builder Mode": "Bouwer Modus",
"Cancel": "Annuleren",
"Categories": "Categorieën",
"Change Password": "Wijzig Wachtwoord",
"Chat": "Chat",
"Chat History": "Chat Geschiedenis",
"Chat History is off for this browser.": "Chat Geschiedenis is uitgeschakeld voor deze browser.",
"Chats": "Chats",
"Check Again": "Controleer Opnieuw",
"Check for updates": "Controleer op updates",
"Checking for updates...": "Controleren op updates...",
"Choose a model before saving...": "Kies een model voordat je opslaat...",
"Chunk Overlap": "Chunk Overlap",
"Chunk Params": "Chunk Params",
"Chunk Size": "Chunk Grootte",
"Click here for help.": "Klik hier voor help.",
"Click here to check other modelfiles.": "Klik hier om andere modelfiles te controleren.",
"Click here to select": "",
"Click here to select documents.": "",
"click here.": "click here.",
"Click on the user role button to change a user's role.": "Klik op de gebruikersrol knop om de rol van een gebruiker te wijzigen.",
"Close": "Sluiten",
"Collection": "Verzameling",
"Command": "Commando",
"Confirm Password": "Bevestig Wachtwoord",
"Connections": "Verbindingen",
"Content": "Inhoud",
"Context Length": "Context Lengte",
"Conversation Mode": "Gespreksmodus",
"Copy last code block": "Kopieer laatste code blok",
"Copy last response": "Kopieer laatste antwoord",
"Copying to clipboard was successful!": "Kopiëren naar klembord was succesvol!",
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Maak een beknopte, 3-5 woorden tellende zin als kop voor de volgende query, strikt aanhoudend aan de 3-5 woorden limiet en het vermijden van het gebruik van het woord 'titel':",
"Create a modelfile": "Maak een modelfile",
"Create Account": "Maak Account",
"Created at": "Gemaakt op",
"Created by": "Gemaakt door",
"Current Model": "Huidig Model",
"Current Password": "Huidig Wachtwoord",
"Custom": "Aangepast",
"Customize Ollama models for a specific purpose": "Pas Ollama modellen aan voor een specifiek doel",
"Dark": "Donker",
"Database": "Database",
"DD/MM/YYYY HH:mm": "YYYY/MM/DD HH:mm",
"Default": "Standaard",
"Default (Automatic1111)": "",
"Default (Web API)": "Standaard (Web API)",
"Default model updated": "Standaard model bijgewerkt",
"Default Prompt Suggestions": "Standaard Prompt Suggesties",
"Default User Role": "Standaard Gebruikersrol",
"delete": "verwijderen",
"Delete a model": "Verwijder een model",
"Delete chat": "Verwijder chat",
"Delete Chats": "Verwijder Chats",
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} is verwijderd",
"Deleted {tagName}": "{tagName} is verwijderd",
"Description": "Beschrijving",
"Desktop Notifications": "Desktop Notificaties",
"Disabled": "Uitgeschakeld",
"Discover a modelfile": "Ontdek een modelfile",
"Discover a prompt": "Ontdek een prompt",
"Discover, download, and explore custom prompts": "Ontdek, download en verken aangepaste prompts",
"Discover, download, and explore model presets": "Ontdek, download en verken model presets",
"Display the username instead of You in the Chat": "Toon de gebruikersnaam in plaats van Jij in de Chat",
"Document": "Document",
"Document Settings": "Document Instellingen",
"Documents": "Documenten",
"does not make any external connections, and your data stays securely on your locally hosted server.": "maakt geen externe verbindingen, en je gegevens blijven veilig op je lokaal gehoste server.",
"Don't Allow": "Niet Toestaan",
"Don't have an account?": "Heb je geen account?",
"Download as a File": "Download als Bestand",
"Download Database": "Download Database",
"Drop any files here to add to the conversation": "Sleep bestanden hier om toe te voegen aan het gesprek",
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "bijv. '30s', '10m'. Geldige tijdseenheden zijn 's', 'm', 'h'.",
"Edit Doc": "Wijzig Doc",
"Edit User": "Wijzig Gebruiker",
"Email": "Email",
"Enable Chat History": "Schakel Chat Geschiedenis in",
"Enable New Sign Ups": "Schakel Nieuwe Registraties in",
"Enabled": "Ingeschakeld",
"Enter {{role}} message here": "",
"Enter API Key": "",
"Enter Chunk Overlap": "",
"Enter Chunk Size": "",
"Enter Image Size (e.g. 512x512)": "",
"Enter LiteLLM API Base URL (litellm_params.api_base)": "",
"Enter LiteLLM API Key (litellm_params.api_key)": "",
"Enter LiteLLM API RPM (litellm_params.rpm)": "",
"Enter LiteLLM Model (litellm_params.model)": "",
"Enter Max Tokens (litellm_params.max_tokens)": "",
"Enter model tag (e.g. {{modelTag}})": "",
"Enter Number of Steps (e.g. 50)": "",
"Enter stop sequence": "Zet stop sequentie",
"Enter Top K": "",
"Enter URL (e.g. http://127.0.0.1:7860/)": "",
"Enter Your Email": "Voer je Email in",
"Enter Your Full Name": "Voer je Volledige Naam in",
"Enter Your Password": "Voer je Wachtwoord in",
"Experimental": "Experimenteel",
"Export All Chats (All Users)": "Exporteer Alle Chats (Alle Gebruikers)",
"Export Chats": "Exporteer Chats",
"Export Documents Mapping": "Exporteer Documenten Mapping",
"Export Modelfiles": "Exporteer Modelfiles",
"Export Prompts": "Exporteer Prompts",
"Failed to read clipboard contents": "Kan klembord inhoud niet lezen",
"File Mode": "Bestandsmodus",
"File not found.": "Bestand niet gevonden.",
"Focus chat input": "Focus chat input",
"Format your variables using square brackets like this:": "Formatteer je variabelen met vierkante haken zoals dit:",
"From (Base Model)": "Van (Basis Model)",
"Full Screen Mode": "Volledig Scherm Modus",
"General": "Algemeen",
"General Settings": "Algemene Instellingen",
"Hello, {{name}}": "Hallo, {{name}}",
"Hide": "Verberg",
"Hide Additional Params": "Verberg Extra Params",
"How can I help you today?": "Hoe kan ik je vandaag helpen?",
"Image Generation (Experimental)": "Afbeelding Generatie (Experimenteel)",
"Image Generation Engine": "",
"Image Settings": "Afbeelding Instellingen",
"Images": "Afbeeldingen",
"Import Chats": "Importeer Chats",
"Import Documents Mapping": "Importeer Documenten Mapping",
"Import Modelfiles": "Importeer Modelfiles",
"Import Prompts": "Importeer Prompts",
"Include `--api` flag when running stable-diffusion-webui": "Voeg `--api` vlag toe bij het uitvoeren van stable-diffusion-webui",
"Interface": "Interface",
"join our Discord for help.": "join onze Discord voor hulp.",
"JSON": "JSON",
"JWT Expiration": "JWT Expiration",
"JWT Token": "JWT Token",
"Keep Alive": "Houd Actief",
"Keyboard shortcuts": "Toetsenbord snelkoppelingen",
"Language": "Taal",
"Light": "Licht",
"Listening...": "Luisteren...",
"LLMs can make mistakes. Verify important information.": "LLMs kunnen fouten maken. Verifieer belangrijke informatie.",
"Made by OpenWebUI Community": "Gemaakt door OpenWebUI Community",
"Make sure to enclose them with": "Zorg ervoor dat je ze omringt met",
"Manage LiteLLM Models": "Beheer LiteLLM Modellen",
"Manage Models": "Beheer Modellen",
"Manage Ollama Models": "Beheer Ollama Modellen",
"Max Tokens": "Max Tokens",
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maximaal 3 modellen kunnen tegelijkertijd worden gedownload. Probeer het later opnieuw.",
"Mirostat": "Mirostat",
"Mirostat Eta": "Mirostat Eta",
"Mirostat Tau": "Mirostat Tau",
"MMMM DD, YYYY": "MMMM DD, YYYY",
"Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' is succesvol gedownload.",
"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' staat al in de wachtrij voor downloaden.",
"Model {{modelId}} not found": "Model {{modelId}} niet gevonden",
"Model {{modelName}} already exists.": "Model {{modelName}} bestaat al.",
"Model Name": "Model Naam",
"Model not selected": "Model niet geselecteerd",
"Model Tag Name": "Model Tag Naam",
"Model Whitelisting": "Model Whitelisting",
"Model(s) Whitelisted": "Model(len) zijn ge-whitelist",
"Modelfile": "Modelfile",
"Modelfile Advanced Settings": "Modelfile Geavanceerde Instellingen",
"Modelfile Content": "Modelfile Inhoud",
"Modelfiles": "Modelfiles",
"Models": "Modellen",
"My Documents": "Mijn Documenten",
"My Modelfiles": "Mijn Modelfiles",
"My Prompts": "Mijn Prompts",
"Name": "Naam",
"Name Tag": "Naam Tag",
"Name your modelfile": "Benoem je modelfile",
"New Chat": "Nieuwe Chat",
"New Password": "Nieuw Wachtwoord",
"Not sure what to add?": "Niet zeker wat toe te voegen?",
"Not sure what to write? Switch to": "Niet zeker wat te schrijven? Schakel over naar",
"Off": "Uit",
"Okay, Let's Go!": "Okay, Laten we gaan!",
"Ollama Base URL": "",
"Ollama Version": "Ollama Versie",
"On": "Aan",
"Only": "Alleen",
"Only alphanumeric characters and hyphens are allowed in the command string.": "Alleen alfanumerieke karakters en streepjes zijn toegestaan in de commando string.",
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Oops! Houd vast! Je bestanden zijn nog steeds in de verwerkingsoven. We zijn ze aan het bereiden tot perfectie. Wees geduldig en we laten je weten wanneer ze klaar zijn.",
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! Het lijkt erop dat de URL ongeldig is. Controleer het nogmaals en probeer opnieuw.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! Je gebruikt een niet-ondersteunde methode (alleen frontend). Serveer de WebUI vanuit de backend.",
"Open": "Open",
"Open AI": "Open AI",
"Open AI (Dall-E)": "",
"Open new chat": "Open nieuwe chat",
"OpenAI API": "OpenAI API",
"OpenAI API Key": "",
"OpenAI API Key is required.": "",
"or": "of",
"Parameters": "Parameters",
"Password": "Wachtwoord",
"PDF Extract Images (OCR)": "PDF Extract Afbeeldingen (OCR)",
"pending": "wachtend",
"Permission denied when accessing microphone: {{error}}": "Toestemming geweigerd bij toegang tot microfoon: {{error}}",
"Playground": "Speeltuin",
"Profile": "Profiel",
"Prompt Content": "Prompt Inhoud",
"Prompt suggestions": "Prompt suggesties",
"Prompts": "Prompts",
"Pull a model from Ollama.com": "Haal een model van Ollama.com",
"Pull Progress": "Haal Voortgang op",
"Query Params": "Query Params",
"RAG Template": "RAG Template",
"Raw Format": "Raw Formaat",
"Record voice": "Neem stem op",
"Redirecting you to OpenWebUI Community": "Je wordt doorgestuurd naar OpenWebUI Community",
"Release Notes": "Release Notes",
"Repeat Last N": "Herhaal Laatste N",
"Repeat Penalty": "Herhaal Straf",
"Request Mode": "Request Modus",
"Reset Vector Storage": "Reset Vector Opslag",
"Response AutoCopy to Clipboard": "Antwoord Automatisch Kopiëren naar Klembord",
"Role": "Rol",
"Rosé Pine": "Rosé Pine",
"Rosé Pine Dawn": "Rosé Pine Dawn",
"Save": "Opslaan",
"Save & Create": "Opslaan & Creëren",
"Save & Submit": "Opslaan & Verzenden",
"Save & Update": "Opslaan & Bijwerken",
"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": "Chat logs direct opslaan in de opslag van je browser wordt niet langer ondersteund. Neem even de tijd om je chat logs te downloaden en te verwijderen door op de knop hieronder te klikken. Maak je geen zorgen, je kunt je chat logs eenvoudig opnieuw importeren naar de backend via",
"Scan": "Scan",
"Scan complete!": "Scan voltooid!",
"Scan for documents from {{path}}": "Scan voor documenten van {{path}}",
"Search": "Zoeken",
"Search Documents": "Zoek Documenten",
"Search Prompts": "Zoek Prompts",
"See readme.md for instructions": "Zie readme.md voor instructies",
"See what's new": "Zie wat er nieuw is",
"Seed": "Seed",
"Select a mode": "",
"Select a model": "Selecteer een model",
"Select an Ollama instance": "",
"Send a Message": "Stuur een Bericht",
"Send message": "Stuur bericht",
"Server connection verified": "Server verbinding geverifieerd",
"Set as default": "Stel in als standaard",
"Set Default Model": "Stel Standaard Model in",
"Set Image Size": "Stel Afbeelding Grootte in",
"Set Steps": "Stel Stappen in",
"Set Title Auto-Generation Model": "Stel Titel Auto-Generatie Model in",
"Set Voice": "Stel Stem in",
"Settings": "Instellingen",
"Settings saved successfully!": "Instellingen succesvol opgeslagen!",
"Share to OpenWebUI Community": "Deel naar OpenWebUI Community",
"short-summary": "korte-samenvatting",
"Show": "Toon",
"Show Additional Params": "Toon Extra Params",
"Show shortcuts": "Toon snelkoppelingen",
"sidebar": "sidebar",
"Sign in": "Inloggen",
"Sign Out": "Uitloggen",
"Sign up": "Registreren",
"Speech recognition error: {{error}}": "Spraakherkenning fout: {{error}}",
"Speech-to-Text Engine": "Spraak-naar-tekst Engine",
"SpeechRecognition API is not supported in this browser.": "SpeechRecognition API wordt niet ondersteund in deze browser.",
"Stop Sequence": "Stop Sequentie",
"STT Settings": "STT Instellingen",
"Submit": "Verzenden",
"Success": "Succes",
"Successfully updated.": "Succesvol bijgewerkt.",
"Sync All": "Synchroniseer Alles",
"System": "Systeem",
"System Prompt": "Systeem Prompt",
"Tags": "Tags",
"Temperature": "Temperatuur",
"Template": "Template",
"Text Completion": "Tekst Aanvulling",
"Text-to-Speech Engine": "Tekst-naar-Spraak Engine",
"Tfs Z": "Tfs Z",
"Theme": "Thema",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dit zorgt ervoor dat je waardevolle gesprekken veilig worden opgeslagen in je backend database. Dank je wel!",
"This setting does not sync across browsers or devices.": "Deze instelling wordt niet gesynchroniseerd tussen browsers of apparaten.",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Tip: Werk meerdere variabele slots achtereenvolgens bij door op de tab-toets te drukken in de chat input na elke vervanging.",
"Title": "Titel",
"Title Auto-Generation": "Titel Auto-Generatie",
"Title Generation Prompt": "Titel Generatie Prompt",
"to": "naar",
"To access the available model names for downloading,": "Om de beschikbare modelnamen voor downloaden te openen,",
"To access the GGUF models available for downloading,": "Om toegang te krijgen tot de GGUF modellen die beschikbaar zijn voor downloaden,",
"to chat input.": "naar chat input.",
"Toggle settings": "Wissel instellingen",
"Toggle sidebar": "Wissel sidebar",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Problemen met toegang tot Ollama?",
"TTS Settings": "TTS instellingen",
"Type Hugging Face Resolve (Download) URL": "",
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! Er was een probleem met verbinden met {{provider}}.",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Onbekend Bestandstype '{{file_type}}', maar accepteren en behandelen als platte tekst",
"Update password": "Wijzig wachtwoord",
"Upload a GGUF model": "Upload een GGUF model",
"Upload files": "Upload bestanden",
"Upload Progress": "Upload Voortgang",
"URL Mode": "URL Modus",
"Use '#' in the prompt input to load and select your documents.": "Gebruik '#' in de prompt input om je documenten te laden en te selecteren.",
"Use Gravatar": "",
"user": "user",
"User Permissions": "Gebruikers Rechten",
"Users": "Gebruikers",
"Utilize": "Utilize",
"Valid time units:": "Geldige tijdseenheden:",
"variable": "variabele",
"variable to have them replaced with clipboard content.": "variabele om ze te laten vervangen door klembord inhoud.",
"Version": "Versie",
"Web": "Web",
"WebUI Add-ons": "WebUI Add-ons",
"WebUI Settings": "WebUI Instellingen",
"WebUI will make requests to": "WebUI zal verzoeken doen naar",
"Whats New in": "Wat is nieuw in",
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Wanneer geschiedenis is uitgeschakeld, zullen nieuwe chats op deze browser niet verschijnen in je geschiedenis op een van je apparaten.",
"Whisper (Local)": "Fluister (Lokaal)",
"Write a prompt suggestion (e.g. Who are you?)": "Schrijf een prompt suggestie (bijv. Wie ben je?)",
"Write a summary in 50 words that summarizes [topic or keyword].": "Schrijf een samenvatting in 50 woorden die [onderwerp of trefwoord] samenvat.",
"You": "Jij",
"You're a helpful assistant.": "Jij bent een behulpzame assistent.",
"You're now logged in.": "Je bent nu ingelogd."
}

View file

@ -0,0 +1,363 @@
{
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 's' ou '-1' para nenhuma expiração.",
"(Beta)": "(Beta)",
"(e.g. `sh webui.sh --api`)": "(por exemplo, `sh webui.sh --api`)",
"(latest)": "(mais recente)",
"{{modelName}} is thinking...": "{{modelName}} está pensando...",
"{{webUIName}} Backend Required": "{{webUIName}} Backend Necessário",
"a user": "um usuário",
"About": "Sobre",
"Account": "Conta",
"Action": "Ação",
"Add a model": "Adicionar um modelo",
"Add a model tag name": "Adicionar um nome de tag de modelo",
"Add a short description about what this modelfile does": "Adicione uma breve descrição sobre o que este arquivo de modelo faz",
"Add a short title for this prompt": "Adicione um título curto para este prompt",
"Add a tag": "Adicionar uma tag",
"Add Docs": "Adicionar Documentos",
"Add Files": "Adicionar Arquivos",
"Add message": "Adicionar mensagem",
"add tags": "adicionar tags",
"Adjusting these settings will apply changes universally to all users.": "Ajustar essas configurações aplicará alterações universalmente a todos os usuários.",
"admin": "administrador",
"Admin Panel": "Painel do Administrador",
"Admin Settings": "Configurações do Administrador",
"Advanced Parameters": "Parâmetros Avançados",
"all": "todos",
"All Users": "Todos os Usuários",
"Allow": "Permitir",
"Allow Chat Deletion": "Permitir Exclusão de Bate-papo",
"alphanumeric characters and hyphens": "caracteres alfanuméricos e hífens",
"Already have an account?": "Já tem uma conta?",
"an assistant": "um assistente",
"and": "e",
"API Base URL": "URL Base da API",
"API Key": "Chave da API",
"API RPM": "API RPM",
"are allowed - Activate this command by typing": "são permitidos - Ative este comando digitando",
"Are you sure?": "Tem certeza?",
"Audio": "Áudio",
"Auto-playback response": "Reprodução automática da resposta",
"Auto-send input after 3 sec.": "Enviar entrada automaticamente após 3 segundos.",
"AUTOMATIC1111 Base URL": "URL Base do AUTOMATIC1111",
"AUTOMATIC1111 Base URL is required.": "A URL Base do AUTOMATIC1111 é obrigatória.",
"available!": "disponível!",
"Back": "Voltar",
"Builder Mode": "Modo de Construtor",
"Cancel": "Cancelar",
"Categories": "Categorias",
"Change Password": "Alterar Senha",
"Chat": "Bate-papo",
"Chat History": "Histórico de Bate-papo",
"Chat History is off for this browser.": "O histórico de bate-papo está desativado para este navegador.",
"Chats": "Bate-papos",
"Check Again": "Verifique novamente",
"Check for updates": "Verificar atualizações",
"Checking for updates...": "Verificando atualizações...",
"Choose a model before saving...": "Escolha um modelo antes de salvar...",
"Chunk Overlap": "Sobreposição de Fragmento",
"Chunk Params": "Parâmetros de Fragmento",
"Chunk Size": "Tamanho do Fragmento",
"Click here for help.": "Clique aqui para obter ajuda.",
"Click here to check other modelfiles.": "Clique aqui para verificar outros arquivos de modelo.",
"Click here to select": "Clique aqui para selecionar",
"Click here to select documents.": "Clique aqui para selecionar documentos.",
"click here.": "clique aqui.",
"Click on the user role button to change a user's role.": "Clique no botão de função do usuário para alterar a função de um usuário.",
"Close": "Fechar",
"Collection": "Coleção",
"Command": "Comando",
"Confirm Password": "Confirmar Senha",
"Connections": "Conexões",
"Content": "Conteúdo",
"Context Length": "Comprimento do Contexto",
"Conversation Mode": "Modo de Conversa",
"Copy last code block": "Copiar último bloco de código",
"Copy last response": "Copiar última resposta",
"Copying to clipboard was successful!": "Cópia para a área de transferência bem-sucedida!",
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Crie uma frase concisa de 3 a 5 palavras como cabeçalho para a seguinte consulta, aderindo estritamente ao limite de 3 a 5 palavras e evitando o uso da palavra 'título':",
"Create a modelfile": "Criar um arquivo de modelo",
"Create Account": "Criar Conta",
"Created at": "Criado em",
"Created by": "Criado por",
"Current Model": "Modelo Atual",
"Current Password": "Senha Atual",
"Custom": "Personalizado",
"Customize Ollama models for a specific purpose": "Personalize os modelos Ollama para um propósito específico",
"Dark": "Escuro",
"Database": "Banco de dados",
"DD/MM/YYYY HH:mm": "DD/MM/AAAA HH:mm",
"Default": "Padrão",
"Default (Automatic1111)": "Padrão (Automatic1111)",
"Default (Web API)": "Padrão (API Web)",
"Default model updated": "Modelo padrão atualizado",
"Default Prompt Suggestions": "Sugestões de Prompt Padrão",
"Default User Role": "Função de Usuário Padrão",
"delete": "excluir",
"Delete a model": "Excluir um modelo",
"Delete chat": "Excluir bate-papo",
"Delete Chats": "Excluir Bate-papos",
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} excluído",
"Deleted {tagName}": "{tagName} excluído",
"Description": "Descrição",
"Desktop Notifications": "Notificações da Área de Trabalho",
"Disabled": "Desativado",
"Discover a modelfile": "Descobrir um arquivo de modelo",
"Discover a prompt": "Descobrir um prompt",
"Discover, download, and explore custom prompts": "Descubra, baixe e explore prompts personalizados",
"Discover, download, and explore model presets": "Descubra, baixe e explore predefinições de modelo",
"Display the username instead of You in the Chat": "Exibir o nome de usuário em vez de Você no Bate-papo",
"Document": "Documento",
"Document Settings": "Configurações de Documento",
"Documents": "Documentos",
"does not make any external connections, and your data stays securely on your locally hosted server.": "não faz conexões externas e seus dados permanecem seguros em seu servidor hospedado localmente.",
"Don't Allow": "Não Permitir",
"Don't have an account?": "Não tem uma conta?",
"Download as a File": "Baixar como Arquivo",
"Download Database": "Baixar Banco de Dados",
"Drop any files here to add to the conversation": "Solte os arquivos aqui para adicionar à conversa",
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "por exemplo, '30s', '10m'. Unidades de tempo válidas são 's', 'm', 'h'.",
"Edit Doc": "Editar Documento",
"Edit User": "Editar Usuário",
"Email": "E-mail",
"Enable Chat History": "Ativar Histórico de Bate-papo",
"Enable New Sign Ups": "Ativar Novas Inscrições",
"Enabled": "Ativado",
"Enter {{role}} message here": "Digite a mensagem de {{role}} aqui",
"Enter API Key": "Digite a Chave da API",
"Enter Chunk Overlap": "Digite a Sobreposição de Fragmento",
"Enter Chunk Size": "Digite o Tamanho do Fragmento",
"Enter Image Size (e.g. 512x512)": "Digite o Tamanho da Imagem (por exemplo, 512x512)",
"Enter LiteLLM API Base URL (litellm_params.api_base)": "Digite a URL Base da API LiteLLM (litellm_params.api_base)",
"Enter LiteLLM API Key (litellm_params.api_key)": "Digite a Chave da API LiteLLM (litellm_params.api_key)",
"Enter LiteLLM API RPM (litellm_params.rpm)": "Digite o RPM da API LiteLLM (litellm_params.rpm)",
"Enter LiteLLM Model (litellm_params.model)": "Digite o Modelo LiteLLM (litellm_params.model)",
"Enter Max Tokens (litellm_params.max_tokens)": "Digite o Máximo de Tokens (litellm_params.max_tokens)",
"Enter model tag (e.g. {{modelTag}})": "Digite a tag do modelo (por exemplo, {{modelTag}})",
"Enter Number of Steps (e.g. 50)": "Digite o Número de Etapas (por exemplo, 50)",
"Enter stop sequence": "Digite a sequência de parada",
"Enter Top K": "Digite o Top K",
"Enter URL (e.g. http://127.0.0.1:7860/)": "Digite a URL (por exemplo, http://127.0.0.1:7860/)",
"Enter Your Email": "Digite seu E-mail",
"Enter Your Full Name": "Digite seu Nome Completo",
"Enter Your Password": "Digite sua Senha",
"Experimental": "Experimental",
"Export All Chats (All Users)": "Exportar Todos os Bate-papos (Todos os Usuários)",
"Export Chats": "Exportar Bate-papos",
"Export Documents Mapping": "Exportar Mapeamento de Documentos",
"Export Modelfiles": "Exportar Arquivos de Modelo",
"Export Prompts": "Exportar Prompts",
"Failed to read clipboard contents": "Falha ao ler o conteúdo da área de transferência",
"File Mode": "Modo de Arquivo",
"File not found.": "Arquivo não encontrado.",
"Focus chat input": "Focar entrada de bate-papo",
"Format your variables using square brackets like this:": "Formate suas variáveis usando colchetes como este:",
"From (Base Model)": "De (Modelo Base)",
"Full Screen Mode": "Modo de Tela Cheia",
"General": "Geral",
"General Settings": "Configurações Gerais",
"Hello, {{name}}": "Olá, {{name}}",
"Hide": "Ocultar",
"Hide Additional Params": "Ocultar Parâmetros Adicionais",
"How can I help you today?": "Como posso ajudá-lo hoje?",
"Image Generation (Experimental)": "Geração de Imagens (Experimental)",
"Image Generation Engine": "Mecanismo de Geração de Imagens",
"Image Settings": "Configurações de Imagem",
"Images": "Imagens",
"Import Chats": "Importar Bate-papos",
"Import Documents Mapping": "Importar Mapeamento de Documentos",
"Import Modelfiles": "Importar Arquivos de Modelo",
"Import Prompts": "Importar Prompts",
"Include `--api` flag when running stable-diffusion-webui": "Inclua a flag `--api` ao executar stable-diffusion-webui",
"Interface": "Interface",
"join our Discord for help.": "junte-se ao nosso Discord para obter ajuda.",
"JSON": "JSON",
"JWT Expiration": "Expiração JWT",
"JWT Token": "Token JWT",
"Keep Alive": "Manter Vivo",
"Keyboard shortcuts": "Atalhos de teclado",
"Language": "Idioma",
"Light": "Claro",
"Listening...": "Ouvindo...",
"LLMs can make mistakes. Verify important information.": "LLMs podem cometer erros. Verifique informações importantes.",
"Made by OpenWebUI Community": "Feito pela Comunidade OpenWebUI",
"Make sure to enclose them with": "Certifique-se de colocá-los entre",
"Manage LiteLLM Models": "Gerenciar Modelos LiteLLM",
"Manage Models": "Gerenciar Modelos",
"Manage Ollama Models": "Gerenciar Modelos Ollama",
"Max Tokens": "Máximo de Tokens",
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Máximo de 3 modelos podem ser baixados simultaneamente. Tente novamente mais tarde.",
"Mirostat": "Mirostat",
"Mirostat Eta": "Mirostat Eta",
"Mirostat Tau": "Mirostat Tau",
"MMMM DD, YYYY": "MMMM DD, AAAA",
"Model '{{modelName}}' has been successfully downloaded.": "O modelo '{{modelName}}' foi baixado com sucesso.",
"Model '{{modelTag}}' is already in queue for downloading.": "O modelo '{{modelTag}}' já está na fila para download.",
"Model {{modelId}} not found": "Modelo {{modelId}} não encontrado",
"Model {{modelName}} already exists.": "O modelo {{modelName}} já existe.",
"Model Name": "Nome do Modelo",
"Model not selected": "Modelo não selecionado",
"Model Tag Name": "Nome da Tag do Modelo",
"Model Whitelisting": "Lista de Permissões de Modelo",
"Model(s) Whitelisted": "Modelo(s) na Lista de Permissões",
"Modelfile": "Arquivo de Modelo",
"Modelfile Advanced Settings": "Configurações Avançadas do Arquivo de Modelo",
"Modelfile Content": "Conteúdo do Arquivo de Modelo",
"Modelfiles": "Arquivos de Modelo",
"Models": "Modelos",
"My Documents": "Meus Documentos",
"My Modelfiles": "Meus Arquivos de Modelo",
"My Prompts": "Meus Prompts",
"Name": "Nome",
"Name Tag": "Tag de Nome",
"Name your modelfile": "Nomeie seu arquivo de modelo",
"New Chat": "Novo Bate-papo",
"New Password": "Nova Senha",
"Not sure what to add?": "Não tem certeza do que adicionar?",
"Not sure what to write? Switch to": "Não tem certeza do que escrever? Mude para",
"Off": "Desligado",
"Okay, Let's Go!": "Ok, Vamos Lá!",
"Ollama Base URL": "URL Base do Ollama",
"Ollama Version": "Versão do Ollama",
"On": "Ligado",
"Only": "Somente",
"Only alphanumeric characters and hyphens are allowed in the command string.": "Somente caracteres alfanuméricos e hífens são permitidos na string de comando.",
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Opa! Aguente firme! Seus arquivos ainda estão no forno de processamento. Estamos cozinhando-os com perfeição. Por favor, seja paciente e avisaremos quando estiverem prontos.",
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Opa! Parece que a URL é inválida. Verifique novamente e tente outra vez.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Opa! Você está usando um método não suportado (somente frontend). Por favor, sirva o WebUI a partir do backend.",
"Open": "Abrir",
"Open AI": "OpenAI",
"Open AI (Dall-E)": "OpenAI (Dall-E)",
"Open new chat": "Abrir novo bate-papo",
"OpenAI API": "API OpenAI",
"OpenAI API Key": "Chave da API OpenAI",
"OpenAI API Key is required.": "A Chave da API OpenAI é obrigatória.",
"or": "ou",
"Parameters": "Parâmetros",
"Password": "Senha",
"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
"pending": "pendente",
"Permission denied when accessing microphone: {{error}}": "Permissão negada ao acessar o microfone: {{error}}",
"Playground": "Playground",
"Profile": "Perfil",
"Prompt Content": "Conteúdo do Prompt",
"Prompt suggestions": "Sugestões de Prompt",
"Prompts": "Prompts",
"Pull a model from Ollama.com": "Extrair um modelo do Ollama.com",
"Pull Progress": "Progresso da Extração",
"Query Params": "Parâmetros de Consulta",
"RAG Template": "Modelo RAG",
"Raw Format": "Formato Bruto",
"Record voice": "Gravar voz",
"Redirecting you to OpenWebUI Community": "Redirecionando você para a Comunidade OpenWebUI",
"Release Notes": "Notas de Lançamento",
"Repeat Last N": "Repetir Últimos N",
"Repeat Penalty": "Penalidade de Repetição",
"Request Mode": "Modo de Solicitação",
"Reset Vector Storage": "Redefinir Armazenamento de Vetor",
"Response AutoCopy to Clipboard": "Cópia Automática da Resposta para a Área de Transferência",
"Role": "Função",
"Rosé Pine": "Rosé Pine",
"Rosé Pine Dawn": "Rosé Pine Dawn",
"Save": "Salvar",
"Save & Create": "Salvar e Criar",
"Save & Submit": "Salvar e Enviar",
"Save & Update": "Salvar e Atualizar",
"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": "Salvar logs de bate-papo diretamente no armazenamento do seu navegador não é mais suportado. Reserve um momento para baixar e excluir seus logs de bate-papo clicando no botão abaixo. Não se preocupe, você pode facilmente reimportar seus logs de bate-papo para o backend através de",
"Scan": "Digitalizar",
"Scan complete!": "Digitalização concluída!",
"Scan for documents from {{path}}": "Digitalizar documentos de {{path}}",
"Search": "Pesquisar",
"Search Documents": "Pesquisar Documentos",
"Search Prompts": "Pesquisar Prompts",
"See readme.md for instructions": "Consulte readme.md para obter instruções",
"See what's new": "Veja o que há de novo",
"Seed": "Semente",
"Select a mode": "Selecione um modo",
"Select a model": "Selecione um modelo",
"Select an Ollama instance": "Selecione uma instância Ollama",
"Send a Message": "Enviar uma Mensagem",
"Send message": "Enviar mensagem",
"Server connection verified": "Conexão com o servidor verificada",
"Set as default": "Definir como padrão",
"Set Default Model": "Definir Modelo Padrão",
"Set Image Size": "Definir Tamanho da Imagem",
"Set Steps": "Definir Etapas",
"Set Title Auto-Generation Model": "Definir Modelo de Geração Automática de Título",
"Set Voice": "Definir Voz",
"Settings": "Configurações",
"Settings saved successfully!": "Configurações salvas com sucesso!",
"Share to OpenWebUI Community": "Compartilhar com a Comunidade OpenWebUI",
"short-summary": "resumo-curto",
"Show": "Mostrar",
"Show Additional Params": "Mostrar Parâmetros Adicionais",
"Show shortcuts": "Mostrar",
"sidebar": "barra lateral",
"Sign in": "Entrar",
"Sign Out": "Sair",
"Sign up": "Inscrever-se",
"Speech recognition error: {{error}}": "Erro de reconhecimento de fala: {{error}}",
"Speech-to-Text Engine": "Mecanismo de Fala para Texto",
"SpeechRecognition API is not supported in this browser.": "A API SpeechRecognition não é suportada neste navegador.",
"Stop Sequence": "Sequência de Parada",
"STT Settings": "Configurações STT",
"Submit": "Enviar",
"Success": "Sucesso",
"Successfully updated.": "Atualizado com sucesso.",
"Sync All": "Sincronizar Tudo",
"System": "Sistema",
"System Prompt": "Prompt do Sistema",
"Tags": "Tags",
"Temperature": "Temperatura",
"Template": "Modelo",
"Text Completion": "Complemento de Texto",
"Text-to-Speech Engine": "Mecanismo de Texto para Fala",
"Tfs Z": "Tfs Z",
"Theme": "Tema",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Isso garante que suas conversas valiosas sejam salvas com segurança em seu banco de dados de backend. Obrigado!",
"This setting does not sync across browsers or devices.": "Esta configuração não sincroniza entre navegadores ou dispositivos.",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Dica: Atualize vários slots de variáveis consecutivamente pressionando a tecla Tab na entrada de bate-papo após cada substituição.",
"Title": "Título",
"Title Auto-Generation": "Geração Automática de Título",
"Title Generation Prompt": "Prompt de Geração de Título",
"to": "para",
"To access the available model names for downloading,": "Para acessar os nomes de modelo disponíveis para download,",
"To access the GGUF models available for downloading,": "Para acessar os modelos GGUF disponíveis para download,",
"to chat input.": "para a entrada de bate-papo.",
"Toggle settings": "Alternar configurações",
"Toggle sidebar": "Alternar barra lateral",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Problemas para acessar o Ollama?",
"TTS Settings": "Configurações TTS",
"Type Hugging Face Resolve (Download) URL": "Digite a URL do Hugging Face Resolve (Download)",
"Uh-oh! There was an issue connecting to {{provider}}.": "Opa! Houve um problema ao conectar-se a {{provider}}.",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Tipo de arquivo desconhecido '{{file_type}}', mas aceitando e tratando como texto simples",
"Update password": "Atualizar senha",
"Upload a GGUF model": "Carregar um modelo GGUF",
"Upload files": "Carregar arquivos",
"Upload Progress": "Progresso do Carregamento",
"URL Mode": "Modo de URL",
"Use '#' in the prompt input to load and select your documents.": "Use '#' na entrada do prompt para carregar e selecionar seus documentos.",
"Use Gravatar": "Usar Gravatar",
"user": "usuário",
"User Permissions": "Permissões do Usuário",
"Users": "Usuários",
"Utilize": "Utilizar",
"Valid time units:": "Unidades de tempo válidas:",
"variable": "variável",
"variable to have them replaced with clipboard content.": "variável para que sejam substituídos pelo conteúdo da área de transferência.",
"Version": "Versão",
"Web": "Web",
"WebUI Add-ons": "Complementos WebUI",
"WebUI Settings": "Configurações WebUI",
"WebUI will make requests to": "WebUI fará solicitações para",
"Whats New in": "O que há de novo em",
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Quando o histórico está desativado, novos bate-papos neste navegador não aparecerão em seu histórico em nenhum dos seus dispositivos.",
"Whisper (Local)": "Whisper (Local)",
"Write a prompt suggestion (e.g. Who are you?)": "Escreva uma sugestão de prompt (por exemplo, Quem é você?)",
"Write a summary in 50 words that summarizes [topic or keyword].": "Escreva um resumo em 50 palavras que resuma [tópico ou palavra-chave].",
"You": "Você",
"You're a helpful assistant.": "Você é um assistente útil.",
"You're now logged in.": "Você está conectado agora."
}

View file

@ -0,0 +1,363 @@
{
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' или '-1' для не истечение.",
"(Beta)": "(бета)",
"(e.g. `sh webui.sh --api`)": "(например: `sh webui.sh --api`)",
"(latest)": "(новый)",
"{{modelName}} is thinking...": "{{modelName}} это думает...",
"{{webUIName}} Backend Required": "{{webUIName}} бэкенд требуемый",
"a user": "юзер",
"About": "Относительно",
"Account": "Аккаунт",
"Action": "Действие",
"Add a model": "Добавьте модель",
"Add a model tag name": "Добавьте тэг модели имя",
"Add a short description about what this modelfile does": "Добавьте краткое описание, что делает этот моделифайл",
"Add a short title for this prompt": "Добавьте краткое название для этого взаимодействия",
"Add a tag": "Добавьте тэг",
"Add Docs": "Добавьте документы",
"Add Files": "Добавьте файлы",
"Add message": "Добавьте message",
"add tags": "Добавьте тэгы",
"Adjusting these settings will apply changes universally to all users.": "Регулирующий этих настроек приведет к изменениям для все юзеры.",
"admin": "админ",
"Admin Panel": "Панель админ",
"Admin Settings": "Настройки админ",
"Advanced Parameters": "Расширенные Параметры",
"all": "всё",
"All Users": "Всё юзеры",
"Allow": "Дозволять",
"Allow Chat Deletion": "Дозволять удаление чат",
"alphanumeric characters and hyphens": "буквенно цифровые символы и дефисы",
"Already have an account?": "у вас есть аккаунт уже?",
"an assistant": "ассистент",
"and": "и",
"API Base URL": "Базовый адрес API",
"API Key": "Ключ API",
"API RPM": "API RPM",
"are allowed - Activate this command by typing": "разрешено - активируйте эту команду набором",
"Are you sure?": "Вы уверены?",
"Audio": "Аудио",
"Auto-playback response": "Автоматическое воспроизведение ответа",
"Auto-send input after 3 sec.": "Автоматическая отправка ввода через 3 секунды.",
"AUTOMATIC1111 Base URL": "Базовый адрес URL AUTOMATIC1111",
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Необходима базовый адрес URL.",
"available!": "доступный!",
"Back": "Назад",
"Builder Mode": "Режим конструктор",
"Cancel": "Аннулировать",
"Categories": "Категории",
"Change Password": "Изменить пароль",
"Chat": "Чат",
"Chat History": "История чат",
"Chat History is off for this browser.": "История чат отключен для этого браузера.",
"Chats": "Чаты",
"Check Again": "Перепроверять",
"Check for updates": "Проверить обновления",
"Checking for updates...": "Проверка обновлений...",
"Choose a model before saving...": "Выберите модель перед сохранением...",
"Chunk Overlap": "Перекрытие фрагментов",
"Chunk Params": "Параметры фрагментов",
"Chunk Size": "Размер фрагмента",
"Click here for help.": "Нажмите здесь для помощь.",
"Click here to check other modelfiles.": "Нажмите тут чтобы проверить другие файлы моделей.",
"Click here to select": "Нажмите тут чтобы выберите",
"Click here to select documents.": "Нажмите здесь чтобы выберите документы.",
"click here.": "нажмите здесь.",
"Click on the user role button to change a user's role.": "Нажмите кнопку роли пользователя чтобы изменить роль пользователя.",
"Close": "Закрывать",
"Collection": "Коллекция",
"Command": "Команда",
"Confirm Password": "Подтвердите пароль",
"Connections": "Соединение",
"Content": "Содержание",
"Context Length": "Длина контексту",
"Conversation Mode": "Режим разговора",
"Copy last code block": "Копировать последний блок кода",
"Copy last response": "Копировать последний ответ",
"Copying to clipboard was successful!": "Копирование в буфер обмена прошло успешно!",
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title'": "Создайте краткую, 3-5 словную фразу в качестве заголовка для следующего запроса, строго соблюдая ограничение в 3-5 слов и избегая использования слова 'заголовок'",
"Create a modelfile": "Создать модельный файл",
"Create Account": "Создать аккаунт",
"Created at": "Создано в",
"Created by": "Создано",
"Current Model": "Текущая модель",
"Current Password": "Текущий пароль",
"Custom": "Пользовательский",
"Customize Ollama models for a specific purpose": "Настроить модели Ollama для конкретной цели",
"Dark": "Тёмный",
"Database": "База данных",
"DD/MM/YYYY HH:mm": "DD/MM/YYYY HH:mm",
"Default": "По умолчанию",
"Default (Automatic1111)": "По умолчанию (Автоматический1111)",
"Default (Web API)": "По умолчанию (Web API)",
"Default model updated": "Модель по умолчанию обновлена",
"Default Prompt Suggestions": "Предложения промтов по умолчанию",
"Default User Role": "Роль пользователя по умолчанию",
"delete": "удалить",
"Delete a model": "Удалить модель",
"Delete chat": "Удалить чат",
"Delete Chats": "Удалить чаты",
"Deleted {{deleteModelTag}}": "Удалено {{deleteModelTag}}",
"Deleted {tagName}": "Удалено {tagName}",
"Description": "Описание",
"Desktop Notifications": "Уведомления на рабочем столе",
"Disabled": "Отключено",
"Discover a modelfile": "Найти файл модели",
"Discover a prompt": "Найти промт",
"Discover, download, and explore custom prompts": "Находите, загружайте и исследуйте настраиваемые промты",
"Discover, download, and explore model presets": "Находите, загружайте и исследуйте предустановки модели",
"Display the username instead of You in the Chat": "Отображать имя пользователя вместо 'Вы' в чате",
"Document": "Документ",
"Document Settings": "Настройки документа",
"Documents": "Документы",
"does not make any external connections, and your data stays securely on your locally hosted server.": "не устанавливает никаких внешних соединений, и ваши данные остаются безопасно на вашем локальном сервере.",
"Don't Allow": "Не разрешать",
"Don't have an account?": "у вас не есть аккаунт?",
"Download as a File": "Загрузить как файл",
"Download Database": "Загрузить базу данных",
"Drop any files here to add to the conversation": "Перетащите сюда файлы, чтобы добавить их в разговор",
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "например, '30с','10м'. Допустимые единицы времени: 'с', 'м', 'ч'.",
"Edit Doc": "Редактировать документ",
"Edit User": "Редактировать пользователя",
"Email": "Электронная почта",
"Enable Chat History": "Включить историю чата",
"Enable New Sign Ups": "Разрешить новые регистрации",
"Enabled": "Включено",
"Enter {{role}} message here": "Введите сообщение {{role}} здесь",
"Enter API Key": "Введите ключ API",
"Enter Chunk Overlap": "Введите перекрытие фрагмента",
"Enter Chunk Size": "Введите размер фрагмента",
"Enter Image Size (e.g. 512x512)": "Введите размер изображения (например, 512x512)",
"Enter LiteLLM API Base URL (litellm_params.api_base)": "Введите базовый URL API LiteLLM (litellm_params.api_base)",
"Enter LiteLLM API Key (litellm_params.api_key)": "Введите ключ API LiteLLM (litellm_params.api_key)",
"Enter LiteLLM API RPM (litellm_params.rpm)": "Введите RPM API LiteLLM (litellm_params.rpm)",
"Enter LiteLLM Model (litellm_params.model)": "Введите модель LiteLLM (litellm_params.model)",
"Enter Max Tokens (litellm_params.max_tokens)": "Введите максимальное количество токенов (litellm_params.max_tokens)",
"Enter model tag (e.g. {{modelTag}})": "Введите тег модели (например, {{modelTag}})",
"Enter Number of Steps (e.g. 50)": "Введите количество шагов (например, 50)",
"Enter stop sequence": "Введите последовательность остановки",
"Enter Top K": "Введите Top K",
"Enter URL (e.g. http://127.0.0.1:7860/)": "Введите URL-адрес (например, http://127.0.0.1:7860/)",
"Enter Your Email": "Введите вашу электронную почту",
"Enter Your Full Name": "Введите ваше полное имя",
"Enter Your Password": "Введите ваш пароль",
"Experimental": "Экспериментальное",
"Export All Chats (All Users)": "Экспортировать все чаты (все пользователи)",
"Export Chats": "Экспортировать чаты",
"Export Documents Mapping": "Экспортировать отображение документов",
"Export Modelfiles": "Экспортировать файлы модели",
"Export Prompts": "Экспортировать промты",
"Failed to read clipboard contents": "Не удалось прочитать содержимое буфера обмена",
"File Mode": "Режим файла",
"File not found.": "Файл не найден.",
"Focus chat input": "Фокус ввода чата",
"Format your variables using square brackets like this:": "Форматируйте ваши переменные, используя квадратные скобки, как здесь:",
"From (Base Model)": "Из (базой модель)",
"Full Screen Mode": "Полноэкранный режим",
"General": "Общее",
"General Settings": "Общие настройки",
"Hello, {{name}}": "Привет, {{name}}",
"Hide": "Скрыть",
"Hide Additional Params": "Скрыть дополнительные параметры",
"How can I help you today?": "Чем я могу помочь вам сегодня?",
"Image Generation (Experimental)": "Генерация изображений (Экспериментально)",
"Image Generation Engine": "Механизм генерации изображений",
"Image Settings": "Настройки изображения",
"Images": "Изображения",
"Import Chats": "Импорт чатов",
"Import Documents Mapping": "Импорт сопоставления документов",
"Import Modelfiles": "Импорт файлов модели",
"Import Prompts": "Импорт подсказок",
"Include `--api` flag when running stable-diffusion-webui": "Добавьте флаг `--api` при запуске stable-diffusion-webui",
"Interface": "Интерфейс",
"join our Discord for help.": "присоединяйтесь к нашему Discord для помощи.",
"JSON": "JSON",
"JWT Expiration": "Истечение срока JWT",
"JWT Token": "Токен JWT",
"Keep Alive": "Поддерживать активность",
"Keyboard shortcuts": "Горячие клавиши",
"Language": "Язык",
"Light": "Светлый",
"Listening...": "Слушаю...",
"LLMs can make mistakes. Verify important information.": "LLMs могут допускать ошибки. Проверяйте важную информацию.",
"Made by OpenWebUI Community": "Сделано сообществом OpenWebUI",
"Make sure to enclose them with": "Убедитесь, что они заключены в",
"Manage LiteLLM Models": "Управление моделями LiteLLM",
"Manage Models": "Управление моделями",
"Manage Ollama Models": "Управление моделями Ollama",
"Max Tokens": "Максимальное количество токенов",
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимальное количество моделей для загрузки одновременно - 3. Пожалуйста, попробуйте позже.",
"Mirostat": "Mirostat",
"Mirostat Eta": "Mirostat Eta",
"Mirostat Tau": "Mirostat Tau",
"MMMM DD, YYYY": "DD MMMM YYYY г.",
"Model '{{modelName}}' has been successfully downloaded.": "Модель '{{modelName}}' успешно загружена.",
"Model '{{modelTag}}' is already in queue for downloading.": "Модель '{{modelTag}}' уже находится в очереди на загрузку.",
"Model {{modelId}} not found": "Модель {{modelId}} не найдена",
"Model {{modelName}} already exists.": "Модель {{modelName}} уже существует.",
"Model Name": "Имя модели",
"Model not selected": "Модель не выбрана",
"Model Tag Name": "Имя тега модели",
"Model Whitelisting": "Включение модели в белый список",
"Model(s) Whitelisted": "Модель(и) включены в белый список",
"Modelfile": "Файл модели",
"Modelfile Advanced Settings": "Дополнительные настройки файла модели",
"Modelfile Content": "Содержимое файла модели",
"Modelfiles": "Файлы моделей",
"Models": "Модели",
"My Documents": "Мои документы",
"My Modelfiles": "Мои файлы моделей",
"My Prompts": "Мои подсказки",
"Name": "Имя",
"Name Tag": "Имя тега",
"Name your modelfile": "Назовите свой файл модели",
"New Chat": "Новый чат",
"New Password": "Новый пароль",
"Not sure what to add?": "Не уверены, что добавить?",
"Not sure what to write? Switch to": "Не уверены, что написать? Переключитесь на",
"Off": "Выключено.",
"Okay, Let's Go!": "Давайте начнём!",
"Ollama Base URL": "Базовый адрес URL Ollama",
"Ollama Version": "Версия Ollama",
"On": "Включено.",
"Only": "Только",
"Only alphanumeric characters and hyphens are allowed in the command string.": "В строке команды разрешено использовать только буквенно-цифровые символы и дефисы.",
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Упс! Зажмите пояса! Ваши файлы все еще в процессе обработки. Мы готовим их до идеального состояния. Пожалуйста, будьте терпеливы, и мы сообщим вам, когда они будут готовы.",
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Упс! Похоже, что URL-адрес недействителен. Пожалуйста, перепроверьте и попробуйте еще раз.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Упс! Вы используете неподдерживаемый метод (только фронтенд). Пожалуйста, обслуживайте веб-интерфейс из бэкенда.",
"Open": "Открыть",
"Open AI": "Open AI",
"Open AI (Dall-E)": "Open AI (Dall-E)",
"Open new chat": "Открыть новый чат",
"OpenAI API": "API OpenAI",
"OpenAI API Key": "Ключ API OpenAI",
"OpenAI API Key is required.": "Требуется ключ API OpenAI.",
"or": "или",
"Parameters": "Параметры",
"Password": "Пароль",
"PDF Extract Images (OCR)": "Извлечение изображений из PDF (OCR)",
"pending": "ожидание",
"Permission denied when accessing microphone: {{error}}": "Отказано в доступе к микрофону: {{error}}",
"Playground": "Площадка",
"Profile": "Профиль",
"Prompt Content": "Содержание промпта",
"Prompt suggestions": "Предложения промптов",
"Prompts": "Промпты",
"Pull a model from Ollama.com": "Загрузить модель с Ollama.com",
"Pull Progress": "Прогресс загрузки",
"Query Params": "Параметры запроса",
"RAG Template": "Шаблон RAG",
"Raw Format": "Сырой формат",
"Record voice": "Записать голос",
"Redirecting you to OpenWebUI Community": "Перенаправляем вас в сообщество OpenWebUI",
"Release Notes": "Примечания к выпуску",
"Repeat Last N": "Повторить последние N",
"Repeat Penalty": "Штраф за повтор",
"Request Mode": "Режим запроса",
"Reset Vector Storage": "Сбросить векторное хранилище",
"Response AutoCopy to Clipboard": "Автоматическое копирование ответа в буфер обмена",
"Role": "Роль",
"Rosé Pine": "Розовое сосновое дерево",
"Rosé Pine Dawn": "Розовое сосновое дерево рассвет",
"Save": "Сохранить",
"Save & Create": "Сохранить и создать",
"Save & Submit": "Сохранить и отправить",
"Save & Update": "Сохранить и обновить",
"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!": "Сканирование завершено!",
"Scan for documents from {{path}}": "Сканирование документов из {{path}}",
"Search": "Поиск",
"Search Documents": "Поиск документов",
"Search Prompts": "Поиск промтов",
"See readme.md for instructions": "Смотрите readme.md для инструкций",
"See what's new": "Посмотреть, что нового",
"Seed": "Сид",
"Select a mode": "Выберите режим",
"Select a model": "Выберите модель",
"Select an Ollama instance": "Выберите экземпляр Ollama",
"Send a Message": "Отправить сообщение",
"Send message": "Отправить сообщение",
"Server connection verified": "Соединение с сервером проверено",
"Set as default": "Установить по умолчанию",
"Set Default Model": "Установить модель по умолчанию",
"Set Image Size": "Установить размер изображения",
"Set Steps": "Установить шаги",
"Set Title Auto-Generation Model": "Установить модель автогенерации заголовков",
"Set Voice": "Установить голос",
"Settings": "Настройки",
"Settings saved successfully!": "Настройки успешно сохранены!",
"Share to OpenWebUI Community": "Поделиться с сообществом OpenWebUI",
"short-summary": "краткое описание",
"Show": "Показать",
"Show Additional Params": "Показать дополнительные параметры",
"Show shortcuts": "Показать клавиатурные сокращения",
"sidebar": "боковая панель",
"Sign in": "Войти",
"Sign Out": "Выход",
"Sign up": "зарегистрировать",
"Speech recognition error: {{error}}": "Ошибка распознавания речи: {{error}}",
"Speech-to-Text Engine": "Система распознавания речи",
"SpeechRecognition API is not supported in this browser.": "API распознавания речи не поддерживается в этом браузере.",
"Stop Sequence": "Последовательность остановки",
"STT Settings": "Настройки распознавания речи",
"Submit": "Отправить",
"Success": "Успех",
"Successfully updated.": "Успешно обновлено.",
"Sync All": "Синхронизировать все",
"System": "Система",
"System Prompt": "Системный промпт",
"Tags": "Теги",
"Temperature": "Температура",
"Template": "Шаблон",
"Text Completion": "Завершение текста",
"Text-to-Speech Engine": "Система синтеза речи",
"Tfs Z": "Tfs Z",
"Theme": "Тема",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Это обеспечивает сохранение ваших ценных разговоров в безопасной базе данных на вашем сервере. Спасибо!",
"This setting does not sync across browsers or devices.": "Эта настройка не синхронизируется между браузерами или устройствами.",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Совет: Обновляйте несколько переменных подряд, нажимая клавишу Tab в поле ввода чата после каждой замены.",
"Title": "Заголовок",
"Title Auto-Generation": "Автогенерация заголовка",
"Title Generation Prompt": "Промпт для генерации заголовка",
"to": "в",
"To access the available model names for downloading,": "Чтобы получить доступ к доступным для загрузки именам моделей,",
"To access the GGUF models available for downloading,": "Чтобы получить доступ к моделям GGUF, доступным для загрузки,",
"to chat input.": "в чате.",
"Toggle settings": "Переключить настройки",
"Toggle sidebar": "Переключить боковую панель",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Проблемы с доступом к Ollama?",
"TTS Settings": "Настройки TTS",
"Type Hugging Face Resolve (Download) URL": "Введите URL-адрес Hugging Face Resolve (загрузки)",
"Uh-oh! There was an issue connecting to {{provider}}.": "Упс! Возникла проблема подключения к {{provider}}.",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Неизвестный тип файла '{{file_type}}', но принимается и обрабатывается как обычный текст",
"Update password": "Обновить пароль",
"Upload a GGUF model": "Загрузить модель GGUF",
"Upload files": "Загрузить файлы",
"Upload Progress": "Прогресс загрузки",
"URL Mode": "Режим URL",
"Use '#' in the prompt input to load and select your documents.": "Используйте '#' в поле ввода промпта для загрузки и выбора ваших документов.",
"Use Gravatar": "Использовать Gravatar",
"user": "пользователь",
"User Permissions": "Права пользователя",
"Users": "Пользователи",
"Utilize": "Использовать",
"Valid time units:": "Допустимые единицы времени:",
"variable": "переменная",
"variable to have them replaced with clipboard content.": "переменная, чтобы их заменить содержимым буфера обмена.",
"Version": "Версия",
"Web": "Веб",
"WebUI Add-ons": "Дополнения для WebUI",
"WebUI Settings": "Настройки WebUI",
"WebUI will make requests to": "WebUI будет отправлять запросы на",
"Whats New in": "Что нового в",
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Когда история отключена, новые чаты в этом браузере не будут отображаться в вашей истории на любом из ваших устройств.",
"Whisper (Local)": "Шепот (локальный)",
"Write a prompt suggestion (e.g. Who are you?)": "Напишите предложение промпта (например, Кто вы?)",
"Write a summary in 50 words that summarizes [topic or keyword].": "Напишите резюме в 50 словах, которое кратко описывает [тему или ключевое слово].",
"You": "Вы",
"You're a helpful assistant.": "Вы полезный ассистент.",
"You're now logged in.": "Вы вошли в систему."
}

View file

@ -276,7 +276,7 @@
"Select a mode": "Оберіть режим", "Select a mode": "Оберіть режим",
"Select a model": "Виберіть модель", "Select a model": "Виберіть модель",
"Select an Ollama instance": "Виберіть екземпляр Ollama", "Select an Ollama instance": "Виберіть екземпляр Ollama",
"Send a Messsage": "Надіслати повідомлення", "Send a Message": "Надіслати повідомлення",
"Send message": "Надіслати повідомлення", "Send message": "Надіслати повідомлення",
"Server connection verified": "З'єднання з сервером підтверджено", "Server connection verified": "З'єднання з сервером підтверджено",
"Set as default": "Встановити за замовчуванням", "Set as default": "Встановити за замовчуванням",

View file

@ -0,0 +1,363 @@
{
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' hoặc '-1' không hết hạn.",
"(Beta)": "(Beta)",
"(e.g. `sh webui.sh --api`)": "(vd: `sh webui.sh --api`)",
"(latest)": "(mới nhất)",
"{{modelName}} is thinking...": "{{modelName}} đang suy nghĩ...",
"{{webUIName}} Backend Required": "{{webUIName}} Yêu cầu Backend",
"a user": "người sử dụng",
"About": "Giới thiệu",
"Account": "Tài khoản",
"Action": "Tác vụ",
"Add a model": "Thêm mô hình",
"Add a model tag name": "Thêm tên thẻ mô hình (tag)",
"Add a short description about what this modelfile does": "Thêm mô tả ngắn về việc tệp mô tả mô hình (modelfile) này làm gì",
"Add a short title for this prompt": "Thêm tiêu đề ngắn cho prompt này",
"Add a tag": "Thêm thẻ (tag)",
"Add Docs": "Thêm tài liệu",
"Add Files": "Thêm tệp",
"Add message": "Thêm tin nhắn",
"add tags": "thêm thẻ",
"Adjusting these settings will apply changes universally to all users.": "Các thay đổi cài đặt này sẽ áp dụng cho tất cả người sử dụng.",
"admin": "quản trị viên",
"Admin Panel": "Trang Quản trị",
"Admin Settings": "Cài đặt hệ thống",
"Advanced Parameters": "Các tham số Nâng cao",
"all": "tất cả",
"All Users": "Danh sách người sử dụng",
"Allow": "Cho phép",
"Allow Chat Deletion": "Cho phép Xóa nội dung chat",
"alphanumeric characters and hyphens": "ký tự số và gạch nối",
"Already have an account?": "Bạn đã có tài khoản?",
"an assistant": "trợ lý",
"and": "và",
"API Base URL": "Đường dẫn tới API (API Base URL)",
"API Key": "API Key",
"API RPM": "API RPM",
"are allowed - Activate this command by typing": "được phép - Kích hoạt lệnh này bằng cách gõ",
"Are you sure?": "Bạn có chắc chắn không?",
"Audio": "Âm thanh",
"Auto-playback response": "Tự động phát lại phản hồi (Auto-playback)",
"Auto-send input after 3 sec.": "Tự động gửi đầu vào sau 3 giây.",
"AUTOMATIC1111 Base URL": "Đường dẫn kết nối tới AUTOMATIC1111 (Base URL)",
"AUTOMATIC1111 Base URL is required.": "Base URL của AUTOMATIC1111 là bắt buộc.",
"available!": "có sẵn!",
"Back": "Quay lại",
"Builder Mode": "Chế độ Builder",
"Cancel": "Hủy bỏ",
"Categories": "Danh mục",
"Change Password": "Đổi Mật khẩu",
"Chat": "Trò chuyện",
"Chat History": "Lịch sử chat",
"Chat History is off for this browser.": "Lịch sử chat đã tắt cho trình duyệt này.",
"Chats": "Chat",
"Check Again": "Kiểm tra Lại",
"Check for updates": "Kiểm tra cập nhật",
"Checking for updates...": "Đang kiểm tra cập nhật...",
"Choose a model before saving...": "Chọn mô hình trước khi lưu...",
"Chunk Overlap": "Kích thước chồng lấn (overlap)",
"Chunk Params": "Cài đặt số lượng ký tự cho khối ký tự (chunk)",
"Chunk Size": "Kích thức khối (size)",
"Click here for help.": "Bấm vào đây để được trợ giúp.",
"Click here to check other modelfiles.": "Bấm vào đây để kiểm tra các tệp mô tả mô hình (modelfiles) khác.",
"Click here to select": "Bấm vào đây để chọn",
"Click here to select documents.": "Bấm vào đây để chọn tài liệu.",
"click here.": "bấm vào đây.",
"Click on the user role button to change a user's role.": "Bấm vào nút trong cột VAI TRÒ để thay đổi quyền của người sử dụng.",
"Close": "Đóng",
"Collection": "Bộ sưu tập",
"Command": "Lệnh",
"Confirm Password": "Xác nhận Mật khẩu",
"Connections": "Kết nối",
"Content": "Nội dung",
"Context Length": "Độ dài ngữ cảnh (Context Length)",
"Conversation Mode": "Chế độ hội thoại",
"Copy last code block": "Sao chép khối mã cuối cùng",
"Copy last response": "Sao chép phản hồi cuối cùng",
"Copying to clipboard was successful!": "Sao chép vào clipboard thành công!",
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Tạo một cụm từ súc tích, 3-5 từ làm tiêu đề cho truy vấn sau, tuân thủ nghiêm ngặt giới hạn 3-5 từ và tránh sử dụng từ 'tiêu đề':",
"Create a modelfile": "Tạo tệp mô tả mô hình",
"Create Account": "Tạo Tài khoản",
"Created at": "Được tạo vào lúc",
"Created by": "Được tạo bởi",
"Current Model": "Mô hình hiện tại",
"Current Password": "Mật khẩu hiện tại",
"Custom": "Tùy chỉnh",
"Customize Ollama models for a specific purpose": "Tùy chỉnh các mô hình dựa trên Ollama cho một mục đích cụ thể",
"Dark": "Tối",
"Database": "Cơ sở dữ liệu",
"DD/MM/YYYY HH:mm": "DD/MM/YYYY HH:mm",
"Default": "Mặc định",
"Default (Automatic1111)": "Mặc định (Automatic1111)",
"Default (Web API)": "Mặc định (Web API)",
"Default model updated": "Mô hình mặc định đã được cập nhật",
"Default Prompt Suggestions": "Đề xuất prompt mặc định",
"Default User Role": "Vai trò mặc định",
"delete": "xóa",
"Delete a model": "Xóa mô hình",
"Delete chat": "Xóa nội dung chat",
"Delete Chats": "Xóa nội dung chat",
"Deleted {{deleteModelTag}}": "Đã xóa {{deleteModelTag}}",
"Deleted {tagName}": "Đã xóa {tagName}",
"Description": "Mô tả",
"Desktop Notifications": "Thông báo trên máy tính (Notification)",
"Disabled": "Đã vô hiệu hóa",
"Discover a modelfile": "Khám phá thêm các mô hình mới",
"Discover a prompt": "Khám phá thêm prompt mới",
"Discover, download, and explore custom prompts": "Tìm kiếm, tải về và khám phá thêm các prompt tùy chỉnh",
"Discover, download, and explore model presets": "Tìm kiếm, tải về và khám phá thêm các thiết lập mô hình sẵn",
"Display the username instead of You in the Chat": "Hiển thị tên người sử dụng thay vì 'Bạn' trong nội dung chat",
"Document": "Tài liệu",
"Document Settings": "Cấu hình kho tài liệu",
"Documents": "Tài liệu",
"does not make any external connections, and your data stays securely on your locally hosted server.": "không thực hiện bất kỳ kết nối ngoài nào, và dữ liệu của bạn vẫn được lưu trữ an toàn trên máy chủ lưu trữ cục bộ của bạn.",
"Don't Allow": "Không Cho phép",
"Don't have an account?": "Không có tài khoản?",
"Download as a File": "Tải xuống dưới dạng tệp",
"Download Database": "Tải xuống Cơ sở dữ liệu",
"Drop any files here to add to the conversation": "Thả bất kỳ tệp nào ở đây để thêm vào nội dung chat",
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "vd: '30s','10m'. Đơn vị thời gian hợp lệ là 's', 'm', 'h'.",
"Edit Doc": "Thay đổi tài liệu",
"Edit User": "Thay đổi thông tin người sử dụng",
"Email": "Email",
"Enable Chat History": "Bật Lịch sử chat",
"Enable New Sign Ups": "Cho phép đăng ký mới",
"Enabled": "Đã bật",
"Enter {{role}} message here": "Nhập yêu cầu của {{role}} ở đây",
"Enter API Key": "Nhập Khóa API",
"Enter Chunk Overlap": "Nhập Chunk chồng lấn (overlap)",
"Enter Chunk Size": "Nhập Kích thước Chunk",
"Enter Image Size (e.g. 512x512)": "Nhập Kích thước ảnh (vd: 512x512)",
"Enter LiteLLM API Base URL (litellm_params.api_base)": "Nhập URL Cơ bản API LiteLLM (litellm_params.api_base)",
"Enter LiteLLM API Key (litellm_params.api_key)": "Nhập Khóa API LiteLLM (litellm_params.api_key)",
"Enter LiteLLM API RPM (litellm_params.rpm)": "Nhập RPM API LiteLLM (litellm_params.rpm)",
"Enter LiteLLM Model (litellm_params.model)": "Nhập Mô hình LiteLLM (litellm_params.model)",
"Enter Max Tokens (litellm_params.max_tokens)": "Nhập Số Token Tối đa (litellm_params.max_tokens)",
"Enter model tag (e.g. {{modelTag}})": "Nhập thẻ mô hình (vd: {{modelTag}})",
"Enter Number of Steps (e.g. 50)": "Nhập số Steps (vd: 50)",
"Enter stop sequence": "Nhập stop sequence",
"Enter Top K": "Nhập Top K",
"Enter URL (e.g. http://127.0.0.1:7860/)": "Nhập URL (vd: http://127.0.0.1:7860/)",
"Enter Your Email": "Nhập Email của bạn",
"Enter Your Full Name": "Nhập Họ và Tên của bạn",
"Enter Your Password": "Nhập Mật khẩu của bạn",
"Experimental": "Thử nghiệm",
"Export All Chats (All Users)": "Tải về tất cả nội dung chat (tất cả mọi người)",
"Export Chats": "Tải nội dung chat về máy",
"Export Documents Mapping": "Tải cấu trúc tài liệu về máy",
"Export Modelfiles": "Tải tệp mô tả về máy",
"Export Prompts": "Tải các prompt về máy",
"Failed to read clipboard contents": "Không thể đọc nội dung clipboard",
"File Mode": "Chế độ Tệp văn bản",
"File not found.": "Không tìm thấy tệp.",
"Focus chat input": "Tập trung vào nội dung chat",
"Format your variables using square brackets like this:": "Định dạng các biến của bạn bằng cách sử dụng dấu ngoặc vuông như thế này:",
"From (Base Model)": "Từ (Base Model)",
"Full Screen Mode": "Chế độ Toàn màn hình",
"General": "Cài đặt chung",
"General Settings": "Cấu hình chung",
"Hello, {{name}}": "Xin chào, {{name}}",
"Hide": "Ẩn",
"Hide Additional Params": "Ẩn Các tham số bổ sung",
"How can I help you today?": "Tôi có thể giúp gì cho bạn hôm nay?",
"Image Generation (Experimental)": "Tạo ảnh (thử nghiệm)",
"Image Generation Engine": "Công cụ tạo ảnh",
"Image Settings": "Cài đặt ảnh",
"Images": "Hình ảnh",
"Import Chats": "Nạp lại nội dung chat",
"Import Documents Mapping": "Nạp cấu trúc tài liệu",
"Import Modelfiles": "Nạp tệp mô tả",
"Import Prompts": "Nạp các prompt lên hệ thống",
"Include `--api` flag when running stable-diffusion-webui": "Bao gồm flag `--api` khi chạy stable-diffusion-webui",
"Interface": "Giao diện",
"join our Discord for help.": "tham gia Discord của chúng tôi để được trợ giúp.",
"JSON": "JSON",
"JWT Expiration": "JWT Hết hạn",
"JWT Token": "Token JWT",
"Keep Alive": "Giữ kết nối",
"Keyboard shortcuts": "Phím tắt",
"Language": "Ngôn ngữ",
"Light": "Sáng",
"Listening...": "Đang nghe...",
"LLMs can make mistakes. Verify important information.": "Hệ thống có thể tạo ra nội dung không chính xác hoặc sai. Hãy kiểm chứng kỹ lưỡng thông tin trước khi tiếp nhận và sử dụng.",
"Made by OpenWebUI Community": "Được tạo bởi Cộng đồng OpenWebUI",
"Make sure to enclose them with": "Hãy chắc chắn bao quanh chúng bằng",
"Manage LiteLLM Models": "Quản lý mô hình với LiteLLM",
"Manage Models": "Quản lý mô hình",
"Manage Ollama Models": "Quản lý mô hình với Ollama",
"Max Tokens": "Max Tokens",
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Tối đa 3 mô hình có thể được tải xuống cùng lúc. Vui lòng thử lại sau.",
"Mirostat": "Mirostat",
"Mirostat Eta": "Mirostat Eta",
"Mirostat Tau": "Mirostat Tau",
"MMMM DD, YYYY": "MMMM DD, YYYY",
"Model '{{modelName}}' has been successfully downloaded.": "Mô hình '{{modelName}}' đã được tải xuống thành công.",
"Model '{{modelTag}}' is already in queue for downloading.": "Mô hình '{{modelTag}}' đã có trong hàng đợi để tải xuống.",
"Model {{modelId}} not found": "Không tìm thấy Mô hình {{modelId}}",
"Model {{modelName}} already exists.": "Mô hình {{modelName}} đã tồn tại.",
"Model Name": "Tên Mô hình",
"Model not selected": "Chưa chọn Mô hình",
"Model Tag Name": "Tên thẻ Mô hình",
"Model Whitelisting": "Whitelist mô hình",
"Model(s) Whitelisted": "các mô hình được cho vào danh sách Whitelist",
"Modelfile": "Tệp Mô hình",
"Modelfile Advanced Settings": "Cài đặt Nâng cao Tệp Mô hình",
"Modelfile Content": "Nội dung Tệp Mô hình",
"Modelfiles": "Tệp Mô hình",
"Models": "Mô hình",
"My Documents": "Tài liệu của tôi",
"My Modelfiles": "Tệp Mô hình của tôi",
"My Prompts": "Các prompt của tôi",
"Name": "Tên",
"Name Tag": "Tên Thẻ",
"Name your modelfile": "Đặt tên cho tệp mô hình của bạn",
"New Chat": "Tạo cuộc trò chuyện mới",
"New Password": "Mật khẩu mới",
"Not sure what to add?": "Không chắc phải thêm gì?",
"Not sure what to write? Switch to": "Không chắc phải viết gì? Chuyển sang",
"Off": "Tắt",
"Okay, Let's Go!": "Được rồi, Bắt đầu thôi!",
"Ollama Base URL": "Đường dẫn tới API của Ollama (Ollama Base URL)",
"Ollama Version": "Phiên bản Ollama",
"On": "Bật",
"Only": "Only",
"Only alphanumeric characters and hyphens are allowed in the command string.": "Chỉ ký tự số và gạch nối được phép trong chuỗi lệnh.",
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Vui lòng kiên nhẫn chờ đợi! Các tệp của bạn vẫn đang trong được phân tích và xử lý. Chúng tôi đang cố gắng hoàn thành chúng. Vui lòng kiên nhẫn và chúng tôi sẽ cho bạn biết khi chúng sẵn sàng.",
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Rất tiếc! URL dường như không hợp lệ. Vui lòng kiểm tra lại và thử lại.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Rất tiếc! Bạn đang sử dụng một phương thức không được hỗ trợ (chỉ dành cho frontend). Vui lòng cung cấp phương thức cho WebUI từ phía backend.",
"Open": "Mở",
"Open AI": "Open AI",
"Open AI (Dall-E)": "Open AI (Dall-E)",
"Open new chat": "Mở nội dung chat mới",
"OpenAI API": "API OpenAI",
"OpenAI API Key": "Khóa API OpenAI",
"OpenAI API Key is required.": "Bắt buộc nhập API OpenAI Key.",
"or": "hoặc",
"Parameters": "Tham số",
"Password": "Mật khẩu",
"PDF Extract Images (OCR)": "Trích xuất ảnh từ PDF (OCR)",
"pending": "đang chờ phê duyệt",
"Permission denied when accessing microphone: {{error}}": "Quyền truy cập micrô bị từ chối: {{error}}",
"Playground": "Thử nghiệm (Playground)",
"Profile": "Hồ sơ",
"Prompt Content": "Nội dung prompt",
"Prompt suggestions": "Gợi ý prompt",
"Prompts": "Prompt",
"Pull a model from Ollama.com": "Tải mô hình từ Ollama.com",
"Pull Progress": "Tiến trình Tải xuống",
"Query Params": "Tham số Truy vấn",
"RAG Template": "Mẫu prompt cho RAG",
"Raw Format": "Raw Format",
"Record voice": "Ghi âm",
"Redirecting you to OpenWebUI Community": "Đang chuyển hướng bạn đến Cộng đồng OpenWebUI",
"Release Notes": "Mô tả những cập nhật mới",
"Repeat Last N": "Repeat Last N",
"Repeat Penalty": "Repeat Penalty",
"Request Mode": "Request Mode",
"Reset Vector Storage": "Cài đặt lại Vector Storage",
"Response AutoCopy to Clipboard": "Tự động Sao chép Phản hồi vào clipboard",
"Role": "Vai trò",
"Rosé Pine": "Rosé Pine",
"Rosé Pine Dawn": "Rosé Pine Dawn",
"Save": "Lưu",
"Save & Create": "Lưu & Tạo",
"Save & Submit": "Lưu & Gửi",
"Save & Update": "Lưu & Cập nhật",
"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": "Không còn hỗ trợ lưu trữ lịch sử chat trực tiếp vào bộ nhớ trình duyệt của bạn. Vui lòng dành thời gian để tải xuống và xóa lịch sử chat của bạn bằng cách nhấp vào nút bên dưới. Đừng lo lắng, bạn có thể dễ dàng nhập lại lịch sử chat của mình vào backend thông qua",
"Scan": "Quét tài liệu",
"Scan complete!": "Quét hoàn tất!",
"Scan for documents from {{path}}": "Quét tài liệu từ đường dẫn: {{path}}",
"Search": "Tìm kiếm",
"Search Documents": "Tìm tài liệu",
"Search Prompts": "Tìm prompt",
"See readme.md for instructions": "Xem readme.md để biết hướng dẫn",
"See what's new": "Xem những cập nhật mới",
"Seed": "Seed",
"Select a mode": "Chọn một chế độ",
"Select a model": "Chọn mô hình",
"Select an Ollama instance": "Chọn một thực thể Ollama",
"Send a Message": "Gửi yêu cầu",
"Send message": "Gửi yêu cầu",
"Server connection verified": "Kết nối máy chủ đã được xác minh",
"Set as default": "Đặt làm mặc định",
"Set Default Model": "Đặt Mô hình Mặc định",
"Set Image Size": "Đặt Kích thước ảnh",
"Set Steps": "Đặt Số Bước",
"Set Title Auto-Generation Model": "Đặt tiêu đề tự động",
"Set Voice": "Đặt Giọng nói",
"Settings": "Cài đặt",
"Settings saved successfully!": "Cài đặt đã được lưu thành công!",
"Share to OpenWebUI Community": "Chia sẻ đến Cộng đồng OpenWebUI",
"short-summary": "tóm tắt ngắn",
"Show": "Hiển thị",
"Show Additional Params": "Hiển thị Tham số Bổ sung",
"Show shortcuts": "Hiển thị phím tắt",
"sidebar": "thanh bên",
"Sign in": "Đăng nhập",
"Sign Out": "Đăng xuất",
"Sign up": "Đăng ký",
"Speech recognition error: {{error}}": "Lỗi nhận dạng giọng nói: {{error}}",
"Speech-to-Text Engine": "Công cụ Nhận dạng Giọng nói",
"SpeechRecognition API is not supported in this browser.": "Trình duyệt này không hỗ trợ API Nhận dạng Giọng nói.",
"Stop Sequence": "Trình tự Dừng",
"STT Settings": "Cài đặt Nhận dạng Giọng nói",
"Submit": "Gửi",
"Success": "Thành công",
"Successfully updated.": "Đã cập nhật thành công.",
"Sync All": "Đồng bộ hóa Tất cả",
"System": "Hệ thống",
"System Prompt": "Prompt Hệ thống (System Prompt)",
"Tags": "Thẻ",
"Temperature": "Temperature",
"Template": "Mẫu",
"Text Completion": "Hoàn tất Văn bản",
"Text-to-Speech Engine": "Công cụ Chuyển Văn bản thành Giọng nói",
"Tfs Z": "Tfs Z",
"Theme": "Chủ đề",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Điều này đảm bảo rằng các nội dung chat có giá trị của bạn được lưu an toàn vào cơ sở dữ liệu backend của bạn. Cảm ơn bạn!",
"This setting does not sync across browsers or devices.": "Cài đặt này không đồng bộ hóa trên các trình duyệt hoặc thiết bị.",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Mẹo: Cập nhật nhiều khe biến liên tiếp bằng cách nhấn phím tab trong đầu vào trò chuyện sau mỗi việc thay thế.",
"Title": "Tiêu đề",
"Title Auto-Generation": "Tự động Tạo Tiêu đề",
"Title Generation Prompt": "Prompt tạo tiêu đề",
"to": "đến",
"To access the available model names for downloading,": "Để truy cập các tên mô hình có sẵn để tải xuống,",
"To access the GGUF models available for downloading,": "Để truy cập các mô hình GGUF có sẵn để tải xuống,",
"to chat input.": "đến đầu vào trò chuyện.",
"Toggle settings": "Bật/tắt cài đặt",
"Toggle sidebar": "Bật/tắt thanh bên",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Gặp vấn đề khi truy cập Ollama?",
"TTS Settings": "Cài đặt Chuyển văn bản thành Giọng nói",
"Type Hugging Face Resolve (Download) URL": "Nhập URL Hugging Face Resolve (Tải xuống)",
"Uh-oh! There was an issue connecting to {{provider}}.": "Ồ! Đã xảy ra sự cố khi kết nối với {{provider}}.",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Loại Tệp Không xác định '{{file_type}}', nhưng đang chấp nhận và xử lý như văn bản thô",
"Update password": "Cập nhật mật khẩu",
"Upload a GGUF model": "Tải lên mô hình GGUF",
"Upload files": "Tải tệp lên hệ thống",
"Upload Progress": "Tiến trình tải tệp lên hệ thống",
"URL Mode": "Chế độ URL",
"Use '#' in the prompt input to load and select your documents.": "Sử dụng '#' trong đầu vào của prompt để tải về và lựa chọn tài liệu của bạn cần truy vấn.",
"Use Gravatar": "Sử dụng Gravatar",
"user": "Người sử dụng",
"User Permissions": "Phân quyền sử dụng",
"Users": "người sử dụng",
"Utilize": "Sử dụng",
"Valid time units:": "Đơn vị thời gian hợp lệ:",
"variable": "biến",
"variable to have them replaced with clipboard content.": "biến để có chúng được thay thế bằng nội dung clipboard.",
"Version": "Phiên bản",
"Web": "Web",
"WebUI Add-ons": "Tiện ích WebUI",
"WebUI Settings": "Cài đặt WebUI",
"WebUI will make requests to": "WebUI sẽ thực hiện các yêu cầu đến",
"What's New in": "Có gì mới trong",
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Khi chế độ lịch sử chat đã tắt, các nội dung chat mới trên trình duyệt này sẽ không xuất hiện trên bất kỳ thiết bị nào của bạn.",
"Whisper (Local)": "Whisper (Local)",
"Write a prompt suggestion (e.g. Who are you?)": "Hãy viết một prompt (vd: Bạn là ai?)",
"Write a summary in 50 words that summarizes [topic or keyword].": "Viết một tóm tắt trong vòng 50 từ cho [chủ đề hoặc từ khóa].",
"You": "Bạn",
"You're a helpful assistant.": "Bạn là một trợ lý hữu ích.",
"You're now logged in.": "Bạn đã đăng nhập."
}

View file

@ -276,7 +276,7 @@
"Select a mode": "选择一个模式", "Select a mode": "选择一个模式",
"Select a model": "选择一个模型", "Select a model": "选择一个模型",
"Select an Ollama instance": "", "Select an Ollama instance": "",
"Send a Messsage": "发送消息", "Send a Message": "发送消息",
"Send message": "发送消息", "Send message": "发送消息",
"Server connection verified": "服务器连接已验证", "Server connection verified": "服务器连接已验证",
"Set as default": "设为默认", "Set as default": "设为默认",

View file

@ -2,362 +2,363 @@
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' 或 '-1' 表示無期限。", "'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' 或 '-1' 表示無期限。",
"(Beta)": "(測試版)", "(Beta)": "(測試版)",
"(e.g. `sh webui.sh --api`)": "(例如 `sh webui.sh --api`)", "(e.g. `sh webui.sh --api`)": "(例如 `sh webui.sh --api`)",
"(latest)": "", "(latest)": "(最新版)",
"{{modelName}} is thinking...": "{{modelName}} 正在思考...", "{{modelName}} is thinking...": "{{modelName}} 正在思考...",
"{{webUIName}} Backend Required": "需要 {{webUIName}} 後", "{{webUIName}} Backend Required": "需要 {{webUIName}} 後",
"a user": "", "a user": "使用者",
"About": "關於", "About": "關於",
"Account": "帳", "Account": "帳",
"Action": "動作", "Action": "動作",
"Add a model": "添加模型", "Add a model": "新增模型",
"Add a model tag name": "添加模型標籤名稱", "Add a model tag name": "新增模型標籤",
"Add a short description about what this modelfile does": "添加關於此模型文件功能的簡短描述", "Add a short description about what this modelfile does": "為這個 Modelfile 添加一段簡短的描述",
"Add a short title for this prompt": "為此提示添加一個簡短的標題", "Add a short title for this prompt": "為這個提示詞添加一個簡短的標題",
"Add a tag": "添加標籤", "Add a tag": "新增標籤",
"Add Docs": "添加文件", "Add Docs": "新增文件",
"Add Files": "添加文件", "Add Files": "新增檔案",
"Add message": "添加信息", "Add message": "新增訊息",
"add tags": "添加標籤", "add tags": "新增標籤",
"Adjusting these settings will apply changes universally to all users.": "調整這些設置將對所有用戶進行通用更改。", "Adjusting these settings will apply changes universally to all users.": "調整這些設定將對所有使用者進行更改。",
"admin": "管理員", "admin": "管理員",
"Admin Panel": "管理員面板", "Admin Panel": "管理員控制台",
"Admin Settings": "管理設", "Admin Settings": "管理設",
"Advanced Parameters": "高級參數", "Advanced Parameters": "進階參數",
"all": "所有", "all": "所有",
"All Users": "所有用戶", "All Users": "所有使用者",
"Allow": "允許", "Allow": "允許",
"Allow Chat Deletion": "允許刪除聊天", "Allow Chat Deletion": "允許刪除聊天紀錄",
"alphanumeric characters and hyphens": "字母數字字符和連字符", "alphanumeric characters and hyphens": "英文字母、數字0~9和連字符-",
"Already have an account?": "已經有帳了嗎?", "Already have an account?": "已經有帳了嗎?",
"an assistant": "", "an assistant": "助手",
"and": "和", "and": "和",
"API Base URL": "API Base URL", "API Base URL": "API 基本 URL",
"API Key": "API Key", "API Key": "API 金鑰",
"API RPM": "API RPM", "API RPM": "API RPM",
"are allowed - Activate this command by typing": "是允許的 - 通過輸入啟動此命令", "are allowed - Activate this command by typing": "是允許的 - 透過輸入",
"Are you sure?": "你確定嗎?", "Are you sure?": "你確定嗎?",
"Audio": "音頻", "assistant": "助手",
"Auto-playback response": "自動播放回應", "Audio": "音訊",
"Auto-send input after 3 sec.": "3秒後自動發送輸入", "Auto-playback response": "自動播放回答",
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Base URL - 啟動的連接網址", "Auto-send input after 3 sec.": "3秒後自動傳送輸入內容",
"AUTOMATIC1111 Base URL is required.": "需要 AUTOMATIC1111 Base URL - 啟動的連接網址", "AUTOMATIC1111 Base URL": "AUTOMATIC1111 基本 URL",
"available!": "可用!", "AUTOMATIC1111 Base URL is required.": "需要 AUTOMATIC1111 基本 URL",
"available!": "可以使用!",
"Back": "返回", "Back": "返回",
"Builder Mode": "建構模式", "Builder Mode": "建構模式",
"Cancel": "取消", "Cancel": "取消",
"Categories": "分類", "Categories": "分類",
"Change Password": "改密碼", "Change Password": "改密碼",
"Chat": "聊天", "Chat": "聊天",
"Chat History": "聊天歷史", "Chat History": "聊天紀錄功能",
"Chat History is off for this browser.": "此瀏覽器已關閉聊天歷史。", "Chat History is off for this browser.": "此瀏覽器已關閉聊天紀錄功能。",
"Chats": "聊天", "Chats": "聊天",
"Check Again": "再次檢查", "Check Again": "重新檢查",
"Check for updates": "檢查更新", "Check for updates": "檢查更新",
"Checking for updates...": "正在檢查更新...", "Checking for updates...": "正在檢查更新...",
"Choose a model before saving...": "存前選擇一個模型...", "Choose a model before saving...": "存前選擇一個模型...",
"Chunk Overlap": "區塊重疊", "Chunk Overlap": "Chunk Overlap",
"Chunk Params": "區塊參數", "Chunk Params": "Chunk 參數",
"Chunk Size": "區塊大小", "Chunk Size": "Chunk 大小",
"Click here for help.": "點擊這裡尋幫助。", "Click here for help.": "點擊這裡尋幫助。",
"Click here to check other modelfiles.": "點擊這裡檢查其他模型文件。", "Click here to check other modelfiles.": "點擊這裡檢查其他 Modelfiles。",
"Click here to select": "點擊這裡選擇", "Click here to select": "點擊這裡選擇",
"Click here to select documents.": "點擊這裡選擇文件。", "Click here to select documents.": "點擊這裡選擇文件。",
"click here.": "點擊這裡。", "click here.": "點擊這裡。",
"Click on the user role button to change a user's role.": "點擊用戶角色按鈕以更改用戶的角色。", "Click on the user role button to change a user's role.": "點擊使用者 Role 按鈕以更改使用者的 Role。",
"Close": "關閉", "Close": "關閉",
"Collection": "收藏", "Collection": "收藏",
"Command": "命令", "Command": "命令",
"Confirm Password": "確認密碼", "Confirm Password": "確認密碼",
"Connections": "連", "Connections": "連",
"Content": "內容", "Content": "內容",
"Context Length": "上下文長度", "Context Length": "上下文長度",
"Conversation Mode": "對話模式", "Conversation Mode": "對話模式",
"Copy last code block": "複製最後一個代碼塊", "Copy last code block": "複製最後一個程式碼區塊",
"Copy last response": "複製最後一個回", "Copy last response": "複製最後一個回",
"Copying to clipboard was successful!": "複製到剪貼板成功", "Copying to clipboard was successful!": "成功複製到剪貼簿",
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "為下面的查詢創建一個簡潔的、3-5個詞的短語作為標題嚴格遵守3-5個詞的限制避免使用'標題'這個詞:", "Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "為以下的查詢建立一個簡潔、3-5 個詞的短語作為標題,嚴格遵守 3-5 個詞的限制,避免使用「標題」這個詞:",
"Create a modelfile": "創建一個模型文件", "Create a modelfile": "建立 Modelfile",
"Create Account": "創建帳戶", "Create Account": "建立帳號",
"Created at": "建於", "Created at": "於",
"Created by": "建者", "Created by": "者",
"Current Model": "前模型", "Current Model": "前模型",
"Current Password": "前密碼", "Current Password": "前密碼",
"Custom": "自定義", "Custom": "自",
"Customize Ollama models for a specific purpose": "為特定目的自定義Ollama模型", "Customize Ollama models for a specific purpose": "定制特定用途的 Ollama 模型",
"Dark": "暗色", "Dark": "暗色",
"Database": "資料庫", "Database": "資料庫",
"DD/MM/YYYY HH:mm": "DD/MM/YYYY HH:mm", "DD/MM/YYYY HH:mm": "DD/MM/YYYY HH:mm",
"Default": "預設", "Default": "預設",
"Default (Automatic1111)": "預設Automatic1111", "Default (Automatic1111)": "預設Automatic1111",
"Default (Web API)": "預設Web API", "Default (Web API)": "預設Web API",
"Default model updated": "預設模型已更新", "Default model updated": "預設模型已更新",
"Default Prompt Suggestions": "預設提示建議", "Default Prompt Suggestions": "預設提示建議",
"Default User Role": "預設用戶角色", "Default User Role": "預設用戶 Role",
"delete": "刪除", "delete": "刪除",
"Delete a model": "刪除一個模型", "Delete a model": "刪除一個模型",
"Delete chat": "刪除聊天", "Delete chat": "刪除聊天紀錄",
"Delete Chats": "刪除聊天", "Delete Chats": "刪除聊天紀錄",
"Deleted {{deleteModelTag}}": "已刪除{{deleteModelTag}}", "Deleted {{deleteModelTag}}": "已刪除 {{deleteModelTag}}",
"Deleted {tagName}": "已刪除{tagName}", "Deleted {tagName}": "已刪除 {tagName}",
"Description": "描述", "Description": "描述",
"Desktop Notifications": "桌面通知", "Desktop Notifications": "桌面通知",
"Disabled": "已用", "Disabled": "已用",
"Discover a modelfile": "發現一個模型文件", "Discover a modelfile": "發現新 Modelfile",
"Discover a prompt": "發現一個提示", "Discover a prompt": "發現新提示詞",
"Discover, download, and explore custom prompts": "發現、下載並探索自定義提示", "Discover, download, and explore custom prompts": "發現、下載並探索他人設置的提示詞",
"Discover, download, and explore model presets": "發現、下載並探索模型預設", "Discover, download, and explore model presets": "發現、下載並探索他人設置的模型",
"Display the username instead of You in the Chat": "在聊天中顯示用戶名而不是“您”", "Display the username instead of You in the Chat": "在聊天中顯示使用者名稱而不是「你」",
"Document": "文", "Document": "文",
"Document Settings": "文件設", "Document Settings": "文件設",
"Documents": "文件", "Documents": "文件",
"does not make any external connections, and your data stays securely on your locally hosted server.": "不建立任何外部連接,您的數據安全地留在您的本地服務器上。", "does not make any external connections, and your data stays securely on your locally hosted server.": "不會與外部溝通,你的數據會安全地留在你的本機伺服器上。",
"Don't Allow": "不允許", "Don't Allow": "不允許",
"Don't have an account?": "沒有帳號?", "Don't have an account?": "沒有註冊帳號?",
"Download as a File": "作為文件下載", "Download as a File": "下載為文件",
"Download Database": "下載資料庫", "Download Database": "下載資料庫",
"Drop any files here to add to the conversation": "拖拽任何文件到此處以添加到對話中", "Drop any files here to add to the conversation": "拖拽文件到此處以新增至對話",
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "例如 '30秒', '10分鐘'。有效的時間單位為 '秒', '分', '小時'。", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "例如 '30s', '10m'。有效的時間單位為 's', 'm', 'h'。",
"Edit Doc": "編輯文", "Edit Doc": "編輯文",
"Edit User": "編輯用戶", "Edit User": "編輯使用者",
"Email": "電子郵件", "Email": "電子郵件",
"Enable Chat History": "啟用聊天歷史", "Enable Chat History": "啟用聊天歷史",
"Enable New Sign Ups": "允許新用戶註冊", "Enable New Sign Ups": "允許註冊新帳號",
"Enabled": "已啟用", "Enabled": "已啟用",
"Enter {{role}} message here": "", "Enter {{role}} message here": "在這裡輸入 {{role}} 訊息",
"Enter API Key": "輸入API Key", "Enter API Key": "輸入 API 金鑰",
"Enter Chunk Overlap": "輸入區塊重疊", "Enter Chunk Overlap": "輸入 Chunk Overlap",
"Enter Chunk Size": "輸入區塊大小", "Enter Chunk Size": "輸入 Chunk 大小",
"Enter Image Size (e.g. 512x512)": "輸入圖片大小(例如 512x512", "Enter Image Size (e.g. 512x512)": "輸入圖片大小(例如 512x512",
"Enter LiteLLM API Base URL (litellm_params.api_base)": "輸入 LiteLLM API 基 URLlitellm_params.api_base", "Enter LiteLLM API Base URL (litellm_params.api_base)": "輸入 LiteLLM API 基 URLlitellm_params.api_base",
"Enter LiteLLM API Key (litellm_params.api_key)": "輸入 LiteLLM API litellm_params.api_key", "Enter LiteLLM API Key (litellm_params.api_key)": "輸入 LiteLLM API 金鑰litellm_params.api_key",
"Enter LiteLLM API RPM (litellm_params.rpm)": "輸入 LiteLLM API RPMlitellm_params.rpm", "Enter LiteLLM API RPM (litellm_params.rpm)": "輸入 LiteLLM API RPMlitellm_params.rpm",
"Enter LiteLLM Model (litellm_params.model)": "輸入 LiteLLM 模型litellm_params.model", "Enter LiteLLM Model (litellm_params.model)": "輸入 LiteLLM 模型litellm_params.model",
"Enter Max Tokens (litellm_params.max_tokens)": "輸入最大令牌litellm_params.max_tokens", "Enter Max Tokens (litellm_params.max_tokens)": "輸入最大 Token litellm_params.max_tokens",
"Enter model tag (e.g. {{modelTag}})": "輸入模型標籤(例如 {{modelTag}}", "Enter model tag (e.g. {{modelTag}})": "輸入模型標籤(例如 {{modelTag}}",
"Enter Number of Steps (e.g. 50)": "輸入步數(例如 50", "Enter Number of Steps (e.g. 50)": "輸入步數(例如 50",
"Enter stop sequence": "輸入停止序列", "Enter stop sequence": "輸入停止序列",
"Enter Top K": "輸入 Top K", "Enter Top K": "輸入 Top K",
"Enter URL (e.g. http://127.0.0.1:7860/)": "輸入 URL例如 http://127.0.0.1:7860/", "Enter URL (e.g. http://127.0.0.1:7860/)": "輸入 URL例如 http://127.0.0.1:7860/",
"Enter Your Email": "輸入的電子郵件", "Enter Your Email": "輸入的電子郵件",
"Enter Your Full Name": "輸入的全名", "Enter Your Full Name": "輸入的全名",
"Enter Your Password": "輸入的密碼", "Enter Your Password": "輸入的密碼",
"Experimental": "實驗性的", "Experimental": "實驗功能",
"Export All Chats (All Users)": "導出所有聊天(所有用戶", "Export All Chats (All Users)": "匯出所有聊天紀錄(所有使用者",
"Export Chats": "導出聊天", "Export Chats": "匯出聊天紀錄",
"Export Documents Mapping": "出文件映射", "Export Documents Mapping": "出文件映射",
"Export Modelfiles": "導出模型文件", "Export Modelfiles": "匯出 Modelfiles",
"Export Prompts": "導出提示", "Export Prompts": "匯出提示詞",
"Failed to read clipboard contents": "無法讀取剪貼內容", "Failed to read clipboard contents": "無法讀取剪貼簿內容",
"File Mode": "文件模式", "File Mode": "檔案模式",
"File not found.": "文件未找到。", "File not found.": "檔案。",
"Focus chat input": "聚焦聊天輸入", "Focus chat input": "聚焦聊天輸入",
"Format your variables using square brackets like this:": "使用這樣的方括號來格式化你的變量", "Format your variables using square brackets like this:": "像這樣使用方括號來格式化你的變數",
"From (Base Model)": "來自(基礎模型)", "From (Base Model)": "來自(基礎模型)",
"Full Screen Mode": "全模式", "Full Screen Mode": "全螢幕模式",
"General": "用", "General": "用",
"General Settings": "通用設置", "General Settings": "常用設定",
"Hello, {{name}}": "你好, {{name}}", "Hello, {{name}}": "你好, {{name}}",
"Hide": "隱藏", "Hide": "隱藏",
"Hide Additional Params": "隱藏附加參數", "Hide Additional Params": "隱藏額外參數",
"How can I help you today?": "我今天如何幫助您", "How can I help you today?": "今天能為你做什麼",
"Image Generation (Experimental)": "圖像生成(實驗", "Image Generation (Experimental)": "圖像生成(實驗功能",
"Image Generation Engine": "圖像生成引擎", "Image Generation Engine": "圖像生成引擎",
"Image Settings": "圖像設置", "Image Settings": "圖片設定",
"Images": "圖片", "Images": "圖片",
"Import Chats": "導入聊天", "Import Chats": "匯入聊天紀錄",
"Import Documents Mapping": "入文件映射", "Import Documents Mapping": "入文件映射",
"Import Modelfiles": "導入模型文件", "Import Modelfiles": "匯入 Modelfiles",
"Import Prompts": "導入提示", "Import Prompts": "匯入提示詞",
"Include `--api` flag when running stable-diffusion-webui": "運行 stable-diffusion-webui 時包含 `--api` 標誌", "Include `--api` flag when running stable-diffusion-webui": "在運行 stable-diffusion-webui 時加上 `--api` 標誌",
"Interface": "介面", "Interface": "介面",
"join our Discord for help.": "加入我們的 Discord 尋幫助。", "join our Discord for help.": "加入我們的 Discord 尋幫助。",
"JSON": "JSON", "JSON": "JSON",
"JWT Expiration": "JWT 過期", "JWT Expiration": "JWT 過期時間",
"JWT Token": "JWT 令牌", "JWT Token": "JWT Token",
"Keep Alive": "保持活", "Keep Alive": "保持活",
"Keyboard shortcuts": "鍵盤快鍵", "Keyboard shortcuts": "鍵盤快鍵",
"Language": "語言", "Language": "語言",
"Light": "亮色", "Light": "亮色",
"Listening...": "聽...", "Listening...": "正在...",
"LLMs can make mistakes. Verify important information.": "LLM 可能會犯錯。驗證重要信息。", "LLMs can make mistakes. Verify important information.": "LLM 可能會產生錯誤。請驗證重要資訊。",
"Made by OpenWebUI Community": "由 OpenWebUI 社區製作", "Made by OpenWebUI Community": "由 OpenWebUI 社區製作",
"Make sure to enclose them with": "確保用...圍起來", "Make sure to enclose them with": "請確保變數有被以下符號框住:",
"Manage LiteLLM Models": "管理 LiteLLM 模型", "Manage LiteLLM Models": "管理 LiteLLM 模型",
"Manage Models": "", "Manage Models": "管理模組",
"Manage Ollama Models": "管理 Ollama 模型", "Manage Ollama Models": "管理 Ollama 模型",
"Max Tokens": "最大令牌數", "Max Tokens": "最大 Token 數",
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "最多可以同時下載3個模型。請稍後再試。", "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "最多可以同時下載 3 個模型。請稍後再試。",
"Mirostat": "Mirostat", "Mirostat": "Mirostat",
"Mirostat Eta": "Mirostat Eta", "Mirostat Eta": "Mirostat Eta",
"Mirostat Tau": "Mirostat Tau", "Mirostat Tau": "Mirostat Tau",
"MMMM DD, YYYY": "MMMM DD, YYYY", "MMMM DD, YYYY": "MMMM DD, YYYY",
"Model '{{modelName}}' has been successfully downloaded.": "模型 '{{modelName}}' 已成功下載。", "Model '{{modelName}}' has been successfully downloaded.": "'{{modelName}}' 模型已成功下載。",
"Model '{{modelTag}}' is already in queue for downloading.": "模型 '{{modelTag}}' 已經在下載隊列中。", "Model '{{modelTag}}' is already in queue for downloading.": "'{{modelTag}}' 模型已經在下載佇列中。",
"Model {{modelId}} not found": "模型 {{modelId}} 未找到", "Model {{modelId}} not found": "找不到 {{modelId}} 模型",
"Model {{modelName}} already exists.": "模型 {{modelName}} 已存在。", "Model {{modelName}} already exists.": "模型 {{modelName}} 已存在。",
"Model Name": "模型名稱", "Model Name": "模型名稱",
"Model not selected": "未選擇模型", "Model not selected": "未選擇模型",
"Model Tag Name": "模型標籤名稱", "Model Tag Name": "模型標籤",
"Model Whitelisting": "", "Model Whitelisting": "白名單模型",
"Model(s) Whitelisted": "", "Model(s) Whitelisted": "模型已加入白名單",
"Modelfile": "模型文件", "Modelfile": "Modelfile",
"Modelfile Advanced Settings": "模型文件高級設置", "Modelfile Advanced Settings": "Modelfile 進階設定",
"Modelfile Content": "模型文件內容", "Modelfile Content": "Modelfile 內容",
"Modelfiles": "模型文件", "Modelfiles": "Modelfiles",
"Models": "模型", "Models": "模型",
"My Documents": "我的文件", "My Documents": "我的文件",
"My Modelfiles": "我的模型文件", "My Modelfiles": "我的 Modelfiles",
"My Prompts": "我的提示", "My Prompts": "我的提示",
"Name": "名稱", "Name": "名稱",
"Name Tag": "名稱標籤", "Name Tag": "名稱標籤",
"Name your modelfile": "命名您的模型文件", "Name your modelfile": "命名你的 Modelfile",
"New Chat": "新聊天", "New Chat": "新聊天",
"New Password": "新密碼", "New Password": "新密碼",
"Not sure what to add?": "不確定要添加什麼", "Not sure what to add?": "不確定要新增什麼嗎",
"Not sure what to write? Switch to": "不確定寫什麼?切換到", "Not sure what to write? Switch to": "不確定寫什麼?切換到",
"Off": "關", "Off": "關",
"Okay, Let's Go!": "好的,啟動吧!", "Okay, Let's Go!": "好的,啟動吧!",
"Ollama Base URL": "Ollama Base URL - Ollama 啟動的連接網址", "Ollama Base URL": "Ollama 基本 URL",
"Ollama Version": "Ollama 版本", "Ollama Version": "Ollama 版本",
"On": "開", "On": "開",
"Only": "僅有", "Only": "僅有",
"Only alphanumeric characters and hyphens are allowed in the command string.": "命令字符串中只允許使用字母數字字符和連字符。", "Only alphanumeric characters and hyphens are allowed in the command string.": "命令字串中只能包含英文字母、數字0~9和連字符-。",
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "哎呀!請稍等!您的文件仍在處理中。我們正在將它們烹飪至完美。請耐心等待,一旦準備好,我們會通知您。", "Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "哎呀!請稍等!你的文件還在處理中。我們正最佳化文件,請耐心等待,一旦準備好,我們會通知你。",
"Oops! Looks like the URL is invalid. Please double-check and try again.": "哎呀!看起來 URL 無效。請仔細檢查後再試一次。", "Oops! Looks like the URL is invalid. Please double-check and try again.": "哎呀!看起來 URL 無效。請仔細檢查後再試一次。",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "哎呀!您正在使用不支持的方法(僅限前端)。請從後端提供 WebUI。", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "哎呀!你正在使用不支援的方法(僅有前台)。請從後台提供 WebUI。",
"Open": "開", "Open": "",
"Open AI": "Open AI", "Open AI": "Open AI",
"Open AI (Dall-E)": "Open AI (Dall-E)", "Open AI (Dall-E)": "Open AI (Dall-E)",
"Open new chat": "開新聊天", "Open new chat": "新聊天",
"OpenAI API": "OpenAI API", "OpenAI API": "OpenAI API",
"OpenAI API Key": "OpenAI API Key", "OpenAI API Key": "OpenAI API 金鑰",
"OpenAI API Key is required.": "需要 OpenAI API Key。", "OpenAI API Key is required.": "需要 OpenAI API 金鑰。",
"or": "或", "or": "或",
"Parameters": "參數", "Parameters": "參數",
"Password": "密碼", "Password": "密碼",
"PDF Extract Images (OCR)": "", "PDF Extract Images (OCR)": "PDF 圖像擷取OCR 光學文字辨識)",
"pending": "待", "pending": "待審查",
"Permission denied when accessing microphone: {{error}}": "訪問麥克風時權限被拒絕: {{error}}", "Permission denied when accessing microphone: {{error}}": "存取麥克風時被拒絕權限: {{error}}",
"Playground": "AI 對話遊樂場", "Playground": "AI 對話遊樂場",
"Profile": "個人資料", "Profile": "個人資料",
"Prompt Content": "提示內容", "Prompt Content": "提示內容",
"Prompt suggestions": "提示建議", "Prompt suggestions": "提示建議",
"Prompts": "提示", "Prompts": "提示",
"Pull a model from Ollama.com": "從 Ollama.com 下載模型", "Pull a model from Ollama.com": "從 Ollama.com 下載模型",
"Pull Progress": "下載進度", "Pull Progress": "下載進度",
"Query Params": "查詢參數", "Query Params": "查詢參數",
"RAG Template": "RAG 範例", "RAG Template": "RAG 範例",
"Raw Format": "原始格式", "Raw Format": "原始格式",
"Record voice": "錄音", "Record voice": "錄音",
"Redirecting you to OpenWebUI Community": "重定向您到 OpenWebUI 社群", "Redirecting you to OpenWebUI Community": "將你重新導向到 OpenWebUI 社群",
"Release Notes": "發布說明", "Release Notes": "發布說明",
"Repeat Last N": "重複最後 N 次", "Repeat Last N": "重複最後 N 次",
"Repeat Penalty": "重複懲罰", "Repeat Penalty": "重複懲罰",
"Request Mode": "請求模式", "Request Mode": "請求模式",
"Reset Vector Storage": "重置向量儲", "Reset Vector Storage": "重置向量存空間",
"Response AutoCopy to Clipboard": "回應自動複製到剪貼板", "Response AutoCopy to Clipboard": "自動複製回答到剪貼簿",
"Role": "角色", "Role": "Role",
"Rosé Pine": "玫瑰松", "Rosé Pine": "玫瑰松",
"Rosé Pine Dawn": "玫瑰松黎明", "Rosé Pine Dawn": "黎明玫瑰松",
"Save": "存", "Save": "存",
"Save & Create": "保存並創建", "Save & Create": "儲存並建立",
"Save & Submit": "保存並提交", "Save & Submit": "儲存並送出",
"Save & Update": "存並更新", "Save & Update": "存並更新",
"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 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": "掃描",
"Scan complete!": "掃描完成!", "Scan complete!": "掃描完成!",
"Scan for documents from {{path}}": "從 {{path}} 掃描文", "Scan for documents from {{path}}": "從 {{path}} 掃描文",
"Search": "搜", "Search": "搜",
"Search Documents": "搜索文檔", "Search Documents": "搜尋文件",
"Search Prompts": "搜索提示", "Search Prompts": "搜尋提示詞",
"See readme.md for instructions": "查看 readme.md 獲取指南", "See readme.md for instructions": "查看 readme.md 獲取指南",
"See what's new": "查看最新內容", "See what's new": "查看最新內容",
"Seed": "種子", "Seed": "種子",
"Select a mode": "選擇模式", "Select a mode": "選擇模式",
"Select a model": "選擇一個模型", "Select a model": "選擇一個模型",
"Select an Ollama instance": "", "Select an Ollama instance": "選擇 Ollama 實例",
"Send a Messsage": "發送消息", "Send a Message": "傳送訊息",
"Send message": "發送消息", "Send message": "傳送訊息",
"Server connection verified": "伺服器連接已驗證", "Server connection verified": "已驗證伺服器連線",
"Set as default": "設為默認", "Set as default": "設為預設",
"Set Default Model": "設置默認模型", "Set Default Model": "設定預設模型",
"Set Image Size": "設置圖像大小", "Set Image Size": "設定圖片大小",
"Set Steps": "設置步驟", "Set Steps": "設定步數",
"Set Title Auto-Generation Model": "設置標題自動生成模型", "Set Title Auto-Generation Model": "設定自動生成標題用模型",
"Set Voice": "設語音", "Set Voice": "設語音",
"Settings": "設", "Settings": "設",
"Settings saved successfully!": "", "Settings saved successfully!": "成功儲存設定",
"Share to OpenWebUI Community": "分享到 OpenWebUI 社群", "Share to OpenWebUI Community": "分享到 OpenWebUI 社群",
"short-summary": "簡短摘要", "short-summary": "簡短摘要",
"Show": "顯示", "Show": "顯示",
"Show Additional Params": "顯示額外參數", "Show Additional Params": "顯示額外參數",
"Show shortcuts": "顯示快捷方式", "Show shortcuts": "顯示快速鍵",
"sidebar": "側邊欄", "sidebar": "側邊欄",
"Sign in": "登", "Sign in": "登",
"Sign Out": "登出", "Sign Out": "登出",
"Sign up": "註冊", "Sign up": "註冊",
"Speech recognition error: {{error}}": "語音識別錯誤: {{error}}", "Speech recognition error: {{error}}": "語音識別錯誤: {{error}}",
"Speech-to-Text Engine": "語音轉文字引擎", "Speech-to-Text Engine": "語音轉文字引擎",
"SpeechRecognition API is not supported in this browser.": "此瀏覽器不支持 SpeechRecognition API。", "SpeechRecognition API is not supported in this browser.": "此瀏覽器不支持 SpeechRecognition API。",
"Stop Sequence": "停止序列", "Stop Sequence": "停止序列",
"STT Settings": "語音轉文字設", "STT Settings": "語音轉文字設",
"Submit": "提交", "Submit": "提交",
"Success": "成功", "Success": "成功",
"Successfully updated.": "更新成功。", "Successfully updated.": "更新成功。",
"Sync All": "同步所有", "Sync All": "全部同步",
"System": "系統", "System": "系統",
"System Prompt": "系統提示", "System Prompt": "系統提示",
"Tags": "標籤", "Tags": "標籤",
"Temperature": "溫度", "Temperature": "溫度",
"Template": "模板", "Template": "模板",
"Text Completion": "文本完成", "Text Completion": "文本補全Text Completion",
"Text-to-Speech Engine": "文轉語音引擎", "Text-to-Speech Engine": "文轉語音引擎",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Theme": "主題", "Theme": "主題",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "這確保了您寶貴的對話安全地保存到您的後端數據庫。謝謝您", "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "這確保你寶貴的對話安全地儲存到你的後台資料庫。謝謝",
"This setting does not sync across browsers or devices.": "此設置不會在瀏覽器或設備之間同步。", "This setting does not sync across browsers or devices.": "此設定不會在瀏覽器或裝置間同步。",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "提示:通過在每次替換後在聊天輸入中按 Tab 鍵連續更新多個變量槽。", "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "提示:透過在每次替換後在聊天輸入框中按 Tab 鍵連續更新多個變數。",
"Title": "標題", "Title": "標題",
"Title Auto-Generation": "標題自動生成", "Title Auto-Generation": "自動生成標題",
"Title Generation Prompt": "標題生成提示", "Title Generation Prompt": "自動生成標題的提示詞",
"to": "到", "to": "到",
"To access the available model names for downloading,": "要訪問可供下載的模型名稱,", "To access the available model names for downloading,": "若想查看可供下載的模型名稱,",
"To access the GGUF models available for downloading,": "要訪問可供下載的 GGUF 模型", "To access the GGUF models available for downloading,": "若想查看可供下載的 GGUF 模型名稱",
"to chat input.": "到聊天輸入。", "to chat input.": "到聊天輸入框來啟動此命令。",
"Toggle settings": "切換設", "Toggle settings": "切換設",
"Toggle sidebar": "切換側邊欄", "Toggle sidebar": "切換側邊欄",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "訪問 Ollama 時遇到問題?", "Trouble accessing Ollama?": "存取 Ollama 時遇到問題?",
"TTS Settings": "文本轉語音設置", "TTS Settings": "文字轉語音設定",
"Type Hugging Face Resolve (Download) URL": "輸入 Hugging Face 解析下載URL", "Type Hugging Face Resolve (Download) URL": "輸入 Hugging Face 解析後的下載URL",
"Uh-oh! There was an issue connecting to {{provider}}.": "哎呀!連到 {{provider}} 時出現問題。", "Uh-oh! There was an issue connecting to {{provider}}.": "哎呀!連到 {{provider}} 時出現問題。",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "未知的文件類型 '{{file_type}}',但接受並視為純文", "Unknown File Type '{{file_type}}', but accepting and treating as plain text": "未知的文件類型 '{{file_type}}',但接受並視為純文",
"Update password": "更新密碼", "Update password": "更新密碼",
"Upload a GGUF model": "上傳一個 GGUF 模型", "Upload a GGUF model": "上傳一個 GGUF 模型",
"Upload files": "上傳文件", "Upload files": "上傳文件",
"Upload Progress": "上傳進度", "Upload Progress": "上傳進度",
"URL Mode": "URL 模式", "URL Mode": "URL 模式",
"Use '#' in the prompt input to load and select your documents.": "使用 '#' 在提示輸入中以加載並選擇您的文檔。", "Use '#' in the prompt input to load and select your documents.": "在輸入框中輸入 '#' 以載入並選擇你的文件。",
"Use Gravatar": "使用 Gravatar", "Use Gravatar": "使用 Gravatar",
"user": "用戶", "user": "使用者",
"User Permissions": "用戶權限", "User Permissions": "使用者權限",
"Users": "用戶", "Users": "使用者",
"Utilize": "用", "Utilize": "使用",
"Valid time units:": "有效時間單位:", "Valid time units:": "有效時間單位:",
"variable": "變", "variable": "變",
"variable to have them replaced with clipboard content.": "變量將它們替換為剪貼板內容。", "variable to have them replaced with clipboard content.": "變數將替換為剪貼簿內容。",
"Version": "", "Version": "版本",
"Web": "網頁", "Web": "網頁",
"WebUI Add-ons": "WebUI 件", "WebUI Add-ons": "WebUI 擴充套件",
"WebUI Settings": "WebUI 設", "WebUI Settings": "WebUI 設",
"WebUI will make requests to": "", "WebUI will make requests to": "WebUI 將會存取",
"Whats New in": "什麼是新的在", "Whats New in": "全新內容",
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "當歷史被關閉時,這個瀏覽器上的新聊天將不會出現在任何設備的歷史記錄中。", "When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "當歷史被關閉時,這個瀏覽器上的新聊天將不會出現在任何裝置的歷史記錄中。",
"Whisper (Local)": "Whisper", "Whisper (Local)": "Whisper",
"Write a prompt suggestion (e.g. Who are you?)": "寫一個提示建議(例如,你是誰?)", "Write a prompt suggestion (e.g. Who are you?)": "寫一個提示詞建議(例如:你是誰?)",
"Write a summary in 50 words that summarizes [topic or keyword].": "寫一個50字的摘要來概括[主題或關鍵詞]。", "Write a summary in 50 words that summarizes [topic or keyword].": "寫一個50字的摘要來概括[主題或關鍵詞]。",
"You": "你", "You": "你",
"You're a helpful assistant.": "你是一個有幫助的助手。", "You're a helpful assistant.": "你是一位善於協助他人的助手。",
"You're now logged in.": "你現在已經登錄了。" "You're now logged in.": "已登入。"
} }

View file

@ -0,0 +1,48 @@
import { cubicOut } from 'svelte/easing';
import type { TransitionConfig } from 'svelte/transition';
type FlyAndScaleParams = {
y?: number;
start?: number;
duration?: number;
};
const defaultFlyAndScaleParams = { y: -8, start: 0.95, duration: 200 };
export const flyAndScale = (node: Element, params?: FlyAndScaleParams): TransitionConfig => {
const style = getComputedStyle(node);
const transform = style.transform === 'none' ? '' : style.transform;
const withDefaults = { ...defaultFlyAndScaleParams, ...params };
const scaleConversion = (valueA: number, scaleA: [number, number], scaleB: [number, number]) => {
const [minA, maxA] = scaleA;
const [minB, maxB] = scaleB;
const percentage = (valueA - minA) / (maxA - minA);
const valueB = percentage * (maxB - minB) + minB;
return valueB;
};
const styleToString = (style: Record<string, number | string | undefined>): string => {
return Object.keys(style).reduce((str, key) => {
if (style[key] === undefined) return str;
return str + `${key}:${style[key]};`;
}, '');
};
return {
duration: withDefaults.duration ?? 200,
delay: 0,
css: (t) => {
const y = scaleConversion(t, [0, 1], [withDefaults.y, 0]);
const scale = scaleConversion(t, [0, 1], [withDefaults.start, 1]);
return styleToString({
transform: `${transform} translate3d(0, ${y}px, 0) scale(${scale})`,
opacity: t
});
},
easing: cubicOut
};
};

View file

@ -19,7 +19,7 @@
} from '$lib/stores'; } from '$lib/stores';
import { copyToClipboard, splitStream } from '$lib/utils'; import { copyToClipboard, splitStream } from '$lib/utils';
import { generateChatCompletion, cancelChatCompletion, generateTitle } from '$lib/apis/ollama'; import { generateChatCompletion, cancelOllamaRequest, generateTitle } from '$lib/apis/ollama';
import { import {
addTagById, addTagById,
createNewChat, createNewChat,
@ -104,7 +104,7 @@
const initNewChat = async () => { const initNewChat = async () => {
if (currentRequestId !== null) { if (currentRequestId !== null) {
await cancelChatCompletion(localStorage.token, currentRequestId); await cancelOllamaRequest(localStorage.token, currentRequestId);
currentRequestId = null; currentRequestId = null;
} }
window.history.replaceState(history.state, '', `/`); window.history.replaceState(history.state, '', `/`);
@ -372,7 +372,7 @@
if (stopResponseFlag) { if (stopResponseFlag) {
controller.abort('User: Stop Response'); controller.abort('User: Stop Response');
await cancelChatCompletion(localStorage.token, currentRequestId); await cancelOllamaRequest(localStorage.token, currentRequestId);
} }
currentRequestId = null; currentRequestId = null;

View file

@ -19,7 +19,7 @@
} from '$lib/stores'; } from '$lib/stores';
import { copyToClipboard, splitStream, convertMessagesToHistory } from '$lib/utils'; import { copyToClipboard, splitStream, convertMessagesToHistory } from '$lib/utils';
import { generateChatCompletion, generateTitle, cancelChatCompletion } from '$lib/apis/ollama'; import { generateChatCompletion, generateTitle, cancelOllamaRequest } from '$lib/apis/ollama';
import { import {
addTagById, addTagById,
createNewChat, createNewChat,
@ -382,7 +382,7 @@
if (stopResponseFlag) { if (stopResponseFlag) {
controller.abort('User: Stop Response'); controller.abort('User: Stop Response');
await cancelChatCompletion(localStorage.token, currentRequestId); await cancelOllamaRequest(localStorage.token, currentRequestId);
} }
currentRequestId = null; currentRequestId = null;
@ -843,7 +843,7 @@
shareEnabled={messages.length > 0} shareEnabled={messages.length > 0}
initNewChat={async () => { initNewChat={async () => {
if (currentRequestId !== null) { if (currentRequestId !== null) {
await cancelChatCompletion(localStorage.token, currentRequestId); await cancelOllamaRequest(localStorage.token, currentRequestId);
currentRequestId = null; currentRequestId = null;
} }

View file

@ -13,7 +13,7 @@
} from '$lib/constants'; } from '$lib/constants';
import { WEBUI_NAME, config, user, models, settings } from '$lib/stores'; import { WEBUI_NAME, config, user, models, settings } from '$lib/stores';
import { cancelChatCompletion, generateChatCompletion } from '$lib/apis/ollama'; import { cancelOllamaRequest, generateChatCompletion } from '$lib/apis/ollama';
import { generateOpenAIChatCompletion } from '$lib/apis/openai'; import { generateOpenAIChatCompletion } from '$lib/apis/openai';
import { splitStream } from '$lib/utils'; import { splitStream } from '$lib/utils';
@ -52,7 +52,7 @@
// const cancelHandler = async () => { // const cancelHandler = async () => {
// if (currentRequestId) { // if (currentRequestId) {
// const res = await cancelChatCompletion(localStorage.token, currentRequestId); // const res = await cancelOllamaRequest(localStorage.token, currentRequestId);
// currentRequestId = null; // currentRequestId = null;
// loading = false; // loading = false;
// } // }
@ -95,7 +95,7 @@
const { value, done } = await reader.read(); const { value, done } = await reader.read();
if (done || stopResponseFlag) { if (done || stopResponseFlag) {
if (stopResponseFlag) { if (stopResponseFlag) {
await cancelChatCompletion(localStorage.token, currentRequestId); await cancelOllamaRequest(localStorage.token, currentRequestId);
} }
currentRequestId = null; currentRequestId = null;
@ -181,7 +181,7 @@
const { value, done } = await reader.read(); const { value, done } = await reader.read();
if (done || stopResponseFlag) { if (done || stopResponseFlag) {
if (stopResponseFlag) { if (stopResponseFlag) {
await cancelChatCompletion(localStorage.token, currentRequestId); await cancelOllamaRequest(localStorage.token, currentRequestId);
} }
currentRequestId = null; currentRequestId = null;