Compare commits

..
35 Commits
Author SHA1 Message Date
Timothy Jaeryang Baek 5be97b81d6 Merge pull request #2743 from open-webui/dev
fix: changelog
2024-06-02 18:27:36 -07:00
Timothy J. Baek 42f335851f fix: changelog 2024-06-02 18:27:18 -07:00
Timothy Jaeryang Baek 0744806523 Merge pull request #2742 from open-webui/dev
0.2.2
2024-06-02 18:26:09 -07:00
Timothy J. Baek a36555a25a chore: version bump 2024-06-02 18:26:00 -07:00
Timothy J. Baek 814fbb73f3 feat: RESET_CONFIG_ON_START 2024-06-02 18:14:36 -07:00
Timothy J. Baek 3d74c04f50 feat: mermaid rendering support 2024-06-02 18:03:30 -07:00
Timothy J. Baek a9e5003c4f fix: filter outlet 2024-06-02 17:49:44 -07:00
Timothy J. Baek 32a61ea15d fix: pipelines 2024-06-02 16:46:33 -07:00
Timothy Jaeryang Baek d9a3e4db39 Merge pull request #2731 from cheahjs/fix/ollama-cancellation
fix: ollama and openai stream cancellation
2024-06-02 16:27:11 -07:00
Timothy Jaeryang Baek c5ff4c24e1 Merge branch 'dev' into fix/ollama-cancellation 2024-06-02 16:27:01 -07:00
Timothy Jaeryang Baek 9b3fdb1838 Merge pull request #2741 from open-webui/dev
fix: validate lengths for openai urls and keys
2024-06-02 16:21:28 -07:00
Timothy J. Baek 27ff3ab112 fix: validate lengths for openai urls and keys 2024-06-02 16:20:22 -07:00
Timothy Jaeryang Baek d09164b729 Merge pull request #2739 from open-webui/dev
fix
2024-06-02 15:19:59 -07:00
Timothy Jaeryang Baek 44597314c6 Merge pull request #2737 from cheahjs/fix/docker-tag-again
fix: another attempt at fixing tag docker builds
2024-06-02 14:49:18 -07:00
Jun Siang Cheah 3176fe0c2b fix: another attempt at fixing tag docker builds 2024-06-02 22:35:59 +01:00
Timothy Jaeryang Baek cfc78dedf0 Merge pull request #2736 from open-webui/dev
fix
2024-06-02 14:08:43 -07:00
Timothy J. Baek 642079ca29 Update CHANGELOG.md 2024-06-02 14:08:23 -07:00
Timothy J. Baek 523455a46e refac: styling 2024-06-02 14:04:37 -07:00
Timothy Jaeryang Baek 8eb81c9127 Merge pull request #2735 from open-webui/dev
0.2.1
2024-06-02 14:01:54 -07:00
Timothy J. Baek 6e818e3694 doc: changelog 2024-06-02 14:01:05 -07:00
Timothy J. Baek 6de8327665 chore: version bump 2024-06-02 13:54:11 -07:00
Timothy J. Baek 0a9f41a044 feat: single model export 2024-06-02 13:53:02 -07:00
Timothy J. Baek 2e24c2d4d3 refac 2024-06-02 13:48:14 -07:00
Timothy J. Baek 41442897e3 fix: connections 2024-06-02 13:45:04 -07:00
Timothy J. Baek e0ba585204 feat: include num_thread in advanced params 2024-06-02 13:20:38 -07:00
Timothy Jaeryang Baek 0bae97218d Merge pull request #2722 from SimonOriginal/main
Updated Ukrainian translation to v0.2.0  🇺🇦
2024-06-02 11:45:55 -07:00
Timothy Jaeryang Baek 2ad286698b Merge pull request #2718 from cheahjs/fix/tag-docker-build
fix: docker build on tag broke due to cache
2024-06-02 11:45:21 -07:00
Timothy Jaeryang Baek 5015486fc2 Merge pull request #2715 from que-nguyen/dev
Update vi-VN/translation.json
2024-06-02 11:45:04 -07:00
Jun Siang Cheah b5b2b70f4a fix: bad payload refactor 2024-06-02 19:40:18 +01:00
Jun Siang Cheah 7f74426a22 fix: openai streaming cancellation using aiohttp 2024-06-02 18:48:45 +01:00
Jun Siang Cheah 4dd51badfe fix: ollama streaming cancellation using aiohttp 2024-06-02 18:06:12 +01:00
Jun Siang Cheah 24c35c308d fix: stream defaults to true, return request ID 2024-06-02 17:09:15 +01:00
SimonOriginal 80c6a39fab Updated Ukrainian translation to v0.2.0 2024-06-02 14:42:15 +02:00
Jun Siang Cheah 45bff743a2 fix: docker build on tag broke due to cache 2024-06-02 10:01:01 +01:00
Que Nguyen afd62c3b22 Update translation.json
These changes serve to complete the Vietnamese translation.
2024-06-02 13:53:38 +07:00
55 changed files with 2382 additions and 1132 deletions

No files matched your search

+6
View File
@@ -70,8 +70,10 @@ jobs:
images: ${{ env.FULL_IMAGE_NAME }} images: ${{ env.FULL_IMAGE_NAME }}
tags: | tags: |
type=ref,event=branch type=ref,event=branch
${{ github.ref_type == 'tag' && 'type=raw,value=main' || '' }}
flavor: | flavor: |
prefix=cache-${{ matrix.platform }}- prefix=cache-${{ matrix.platform }}-
latest=false
- name: Build Docker image (latest) - name: Build Docker image (latest)
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
@@ -158,8 +160,10 @@ jobs:
images: ${{ env.FULL_IMAGE_NAME }} images: ${{ env.FULL_IMAGE_NAME }}
tags: | tags: |
type=ref,event=branch type=ref,event=branch
${{ github.ref_type == 'tag' && 'type=raw,value=main' || '' }}
flavor: | flavor: |
prefix=cache-cuda-${{ matrix.platform }}- prefix=cache-cuda-${{ matrix.platform }}-
latest=false
- name: Build Docker image (cuda) - name: Build Docker image (cuda)
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
@@ -247,8 +251,10 @@ jobs:
images: ${{ env.FULL_IMAGE_NAME }} images: ${{ env.FULL_IMAGE_NAME }}
tags: | tags: |
type=ref,event=branch type=ref,event=branch
${{ github.ref_type == 'tag' && 'type=raw,value=main' || '' }}
flavor: | flavor: |
prefix=cache-ollama-${{ matrix.platform }}- prefix=cache-ollama-${{ matrix.platform }}-
latest=false
- name: Build Docker image (ollama) - name: Build Docker image (ollama)
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
+28
View File
@@ -5,6 +5,34 @@ 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.2.2] - 2024-06-02
### Added
- **🌊 Mermaid Rendering Support**: We've included support for Mermaid rendering. This allows you to create beautiful diagrams and flowcharts directly within Open WebUI.
- **🔄 New Environment Variable 'RESET_CONFIG_ON_START'**: Introducing a new environment variable: 'RESET_CONFIG_ON_START'. Set this variable to reset your configuration settings upon starting the application, making it easier to revert to default settings.
### Fixed
- **🔧 Pipelines Filter Issue**: We've addressed an issue with the pipelines where filters were not functioning as expected.
## [0.2.1] - 2024-06-02
### Added
- **🖱️ Single Model Export Button**: Easily export models with just one click using the new single model export button.
- **🖥️ Advanced Parameters Support**: Added support for 'num_thread', 'use_mmap', and 'use_mlock' parameters for Ollama.
- **🌐 Improved Vietnamese Translation**: Enhanced Vietnamese language support for a better user experience for our Vietnamese-speaking community.
### Fixed
- **🔧 OpenAI URL API Save Issue**: Corrected a problem preventing the saving of OpenAI URL API settings.
- **🚫 Display Issue with Disabled Ollama API**: Fixed the display bug causing models to appear in settings when the Ollama API was disabled.
### Changed
- **💡 Versioning Update**: As a reminder from our previous update, version 0.2.y will focus primarily on bug fixes, while major updates will be designated as 0.x from now on for better version tracking.
## [0.2.0] - 2024-06-01 ## [0.2.0] - 2024-06-01
### Added ### Added
+119 -379
View File
@@ -29,6 +29,8 @@ import time
from urllib.parse import urlparse from urllib.parse import urlparse
from typing import Optional, List, Union from typing import Optional, List, Union
from starlette.background import BackgroundTask
from apps.webui.models.models import Models from apps.webui.models.models import Models
from apps.webui.models.users import Users from apps.webui.models.users import Users
from constants import ERROR_MESSAGES from constants import ERROR_MESSAGES
@@ -75,9 +77,6 @@ app.state.config.OLLAMA_BASE_URLS = OLLAMA_BASE_URLS
app.state.MODELS = {} app.state.MODELS = {}
REQUEST_POOL = []
# TODO: Implement a more intelligent load balancing mechanism for distributing requests among multiple backend instances. # TODO: Implement a more intelligent load balancing mechanism for distributing requests among multiple backend instances.
# Current implementation uses a simple round-robin approach (random.choice). Consider incorporating algorithms like weighted round-robin, # Current implementation uses a simple round-robin approach (random.choice). Consider incorporating algorithms like weighted round-robin,
# least connections, or least response time for better resource utilization and performance optimization. # least connections, or least response time for better resource utilization and performance optimization.
@@ -132,16 +131,6 @@ async def update_ollama_api_url(form_data: UrlUpdateForm, user=Depends(get_admin
return {"OLLAMA_BASE_URLS": app.state.config.OLLAMA_BASE_URLS} return {"OLLAMA_BASE_URLS": app.state.config.OLLAMA_BASE_URLS}
@app.get("/cancel/{request_id}")
async def cancel_ollama_request(request_id: str, user=Depends(get_current_user)):
if user:
if request_id in REQUEST_POOL:
REQUEST_POOL.remove(request_id)
return True
else:
raise HTTPException(status_code=401, detail=ERROR_MESSAGES.ACCESS_PROHIBITED)
async def fetch_url(url): async def fetch_url(url):
timeout = aiohttp.ClientTimeout(total=5) timeout = aiohttp.ClientTimeout(total=5)
try: try:
@@ -154,6 +143,45 @@ async def fetch_url(url):
return None return None
async def cleanup_response(
response: Optional[aiohttp.ClientResponse],
session: Optional[aiohttp.ClientSession],
):
if response:
response.close()
if session:
await session.close()
async def post_streaming_url(url: str, payload: str):
r = None
try:
session = aiohttp.ClientSession()
r = await session.post(url, data=payload)
r.raise_for_status()
return StreamingResponse(
r.content,
status_code=r.status,
headers=dict(r.headers),
background=BackgroundTask(cleanup_response, response=r, session=session),
)
except Exception as e:
error_detail = "Open WebUI: Server Connection Error"
if r is not None:
try:
res = await r.json()
if "error" in res:
error_detail = f"Ollama: {res['error']}"
except:
error_detail = f"Ollama: {e}"
raise HTTPException(
status_code=r.status if r else 500,
detail=error_detail,
)
def merge_models_lists(model_lists): def merge_models_lists(model_lists):
merged_models = {} merged_models = {}
@@ -313,65 +341,7 @@ async def pull_model(
# Admin should be able to pull models from any source # Admin should be able to pull models from any source
payload = {**form_data.model_dump(exclude_none=True), "insecure": True} payload = {**form_data.model_dump(exclude_none=True), "insecure": True}
def get_request(): return await post_streaming_url(f"{url}/api/pull", json.dumps(payload))
nonlocal url
nonlocal r
request_id = str(uuid.uuid4())
try:
REQUEST_POOL.append(request_id)
def stream_content():
try:
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:
log.warning("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(
method="POST",
url=f"{url}/api/pull",
data=json.dumps(payload),
stream=True,
)
r.raise_for_status()
return StreamingResponse(
stream_content(),
status_code=r.status_code,
headers=dict(r.headers),
)
except Exception as e:
raise e
try:
return await run_in_threadpool(get_request)
except Exception as e:
log.exception(e)
error_detail = "Open WebUI: Server Connection Error"
if r is not None:
try:
res = r.json()
if "error" in res:
error_detail = f"Ollama: {res['error']}"
except:
error_detail = f"Ollama: {e}"
raise HTTPException(
status_code=r.status_code if r else 500,
detail=error_detail,
)
class PushModelForm(BaseModel): class PushModelForm(BaseModel):
@@ -399,50 +369,9 @@ async def push_model(
url = app.state.config.OLLAMA_BASE_URLS[url_idx] url = app.state.config.OLLAMA_BASE_URLS[url_idx]
log.debug(f"url: {url}") log.debug(f"url: {url}")
r = None return await post_streaming_url(
f"{url}/api/push", form_data.model_dump_json(exclude_none=True).encode()
def get_request(): )
nonlocal url
nonlocal r
try:
def stream_content():
for chunk in r.iter_content(chunk_size=8192):
yield chunk
r = requests.request(
method="POST",
url=f"{url}/api/push",
data=form_data.model_dump_json(exclude_none=True).encode(),
)
r.raise_for_status()
return StreamingResponse(
stream_content(),
status_code=r.status_code,
headers=dict(r.headers),
)
except Exception as e:
raise e
try:
return await run_in_threadpool(get_request)
except Exception as e:
log.exception(e)
error_detail = "Open WebUI: Server Connection Error"
if r is not None:
try:
res = r.json()
if "error" in res:
error_detail = f"Ollama: {res['error']}"
except:
error_detail = f"Ollama: {e}"
raise HTTPException(
status_code=r.status_code if r else 500,
detail=error_detail,
)
class CreateModelForm(BaseModel): class CreateModelForm(BaseModel):
@@ -461,53 +390,9 @@ async def create_model(
url = app.state.config.OLLAMA_BASE_URLS[url_idx] url = app.state.config.OLLAMA_BASE_URLS[url_idx]
log.info(f"url: {url}") log.info(f"url: {url}")
r = None return await post_streaming_url(
f"{url}/api/create", form_data.model_dump_json(exclude_none=True).encode()
def get_request(): )
nonlocal url
nonlocal r
try:
def stream_content():
for chunk in r.iter_content(chunk_size=8192):
yield chunk
r = requests.request(
method="POST",
url=f"{url}/api/create",
data=form_data.model_dump_json(exclude_none=True).encode(),
stream=True,
)
r.raise_for_status()
log.debug(f"r: {r}")
return StreamingResponse(
stream_content(),
status_code=r.status_code,
headers=dict(r.headers),
)
except Exception as e:
raise e
try:
return await run_in_threadpool(get_request)
except Exception as e:
log.exception(e)
error_detail = "Open WebUI: Server Connection Error"
if r is not None:
try:
res = r.json()
if "error" in res:
error_detail = f"Ollama: {res['error']}"
except:
error_detail = f"Ollama: {e}"
raise HTTPException(
status_code=r.status_code if r else 500,
detail=error_detail,
)
class CopyModelForm(BaseModel): class CopyModelForm(BaseModel):
@@ -797,66 +682,9 @@ async def generate_completion(
url = app.state.config.OLLAMA_BASE_URLS[url_idx] url = app.state.config.OLLAMA_BASE_URLS[url_idx]
log.info(f"url: {url}") log.info(f"url: {url}")
r = None return await post_streaming_url(
f"{url}/api/generate", form_data.model_dump_json(exclude_none=True).encode()
def get_request(): )
nonlocal form_data
nonlocal r
request_id = str(uuid.uuid4())
try:
REQUEST_POOL.append(request_id)
def stream_content():
try:
if form_data.stream:
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:
log.warning("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(
method="POST",
url=f"{url}/api/generate",
data=form_data.model_dump_json(exclude_none=True).encode(),
stream=True,
)
r.raise_for_status()
return StreamingResponse(
stream_content(),
status_code=r.status_code,
headers=dict(r.headers),
)
except Exception as e:
raise e
try:
return await run_in_threadpool(get_request)
except Exception as e:
error_detail = "Open WebUI: Server Connection Error"
if r is not None:
try:
res = r.json()
if "error" in res:
error_detail = f"Ollama: {res['error']}"
except:
error_detail = f"Ollama: {e}"
raise HTTPException(
status_code=r.status_code if r else 500,
detail=error_detail,
)
class ChatMessage(BaseModel): class ChatMessage(BaseModel):
@@ -906,44 +734,77 @@ async def generate_chat_completion(
if model_info.params: if model_info.params:
payload["options"] = {} payload["options"] = {}
payload["options"]["mirostat"] = model_info.params.get("mirostat", None) if model_info.params.get("mirostat", None):
payload["options"]["mirostat_eta"] = model_info.params.get( payload["options"]["mirostat"] = model_info.params.get("mirostat", None)
"mirostat_eta", None
)
payload["options"]["mirostat_tau"] = model_info.params.get(
"mirostat_tau", None
)
payload["options"]["num_ctx"] = model_info.params.get("num_ctx", None)
payload["options"]["repeat_last_n"] = model_info.params.get( if model_info.params.get("mirostat_eta", None):
"repeat_last_n", None payload["options"]["mirostat_eta"] = model_info.params.get(
) "mirostat_eta", None
payload["options"]["repeat_penalty"] = model_info.params.get( )
"frequency_penalty", None
)
payload["options"]["temperature"] = model_info.params.get( if model_info.params.get("mirostat_tau", None):
"temperature", None
)
payload["options"]["seed"] = model_info.params.get("seed", None)
payload["options"]["stop"] = ( payload["options"]["mirostat_tau"] = model_info.params.get(
[ "mirostat_tau", None
bytes(stop, "utf-8").decode("unicode_escape") )
for stop in model_info.params["stop"]
]
if model_info.params.get("stop", None)
else None
)
payload["options"]["tfs_z"] = model_info.params.get("tfs_z", None) if model_info.params.get("num_ctx", None):
payload["options"]["num_ctx"] = model_info.params.get("num_ctx", None)
payload["options"]["num_predict"] = model_info.params.get( if model_info.params.get("repeat_last_n", None):
"max_tokens", None payload["options"]["repeat_last_n"] = model_info.params.get(
) "repeat_last_n", None
payload["options"]["top_k"] = model_info.params.get("top_k", None) )
payload["options"]["top_p"] = model_info.params.get("top_p", None) if model_info.params.get("frequency_penalty", None):
payload["options"]["repeat_penalty"] = model_info.params.get(
"frequency_penalty", None
)
if model_info.params.get("temperature", None):
payload["options"]["temperature"] = model_info.params.get(
"temperature", None
)
if model_info.params.get("seed", None):
payload["options"]["seed"] = model_info.params.get("seed", None)
if model_info.params.get("stop", None):
payload["options"]["stop"] = (
[
bytes(stop, "utf-8").decode("unicode_escape")
for stop in model_info.params["stop"]
]
if model_info.params.get("stop", None)
else None
)
if model_info.params.get("tfs_z", None):
payload["options"]["tfs_z"] = model_info.params.get("tfs_z", None)
if model_info.params.get("max_tokens", None):
payload["options"]["num_predict"] = model_info.params.get(
"max_tokens", None
)
if model_info.params.get("top_k", None):
payload["options"]["top_k"] = model_info.params.get("top_k", None)
if model_info.params.get("top_p", None):
payload["options"]["top_p"] = model_info.params.get("top_p", None)
if model_info.params.get("use_mmap", None):
payload["options"]["use_mmap"] = model_info.params.get("use_mmap", None)
if model_info.params.get("use_mlock", None):
payload["options"]["use_mlock"] = model_info.params.get(
"use_mlock", None
)
if model_info.params.get("num_thread", None):
payload["options"]["num_thread"] = model_info.params.get(
"num_thread", None
)
if model_info.params.get("system", None): if model_info.params.get("system", None):
# Check if the payload already has a system message # Check if the payload already has a system message
@@ -981,67 +842,7 @@ async def generate_chat_completion(
print(payload) print(payload)
r = None return await post_streaming_url(f"{url}/api/chat", json.dumps(payload))
def get_request():
nonlocal payload
nonlocal r
request_id = str(uuid.uuid4())
try:
REQUEST_POOL.append(request_id)
def stream_content():
try:
if payload.get("stream", None):
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:
log.warning("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(
method="POST",
url=f"{url}/api/chat",
data=json.dumps(payload),
stream=True,
)
r.raise_for_status()
return StreamingResponse(
stream_content(),
status_code=r.status_code,
headers=dict(r.headers),
)
except Exception as e:
log.exception(e)
raise e
try:
return await run_in_threadpool(get_request)
except Exception as e:
error_detail = "Open WebUI: Server Connection Error"
if r is not None:
try:
res = r.json()
if "error" in res:
error_detail = f"Ollama: {res['error']}"
except:
error_detail = f"Ollama: {e}"
raise HTTPException(
status_code=r.status_code if r else 500,
detail=error_detail,
)
# TODO: we should update this part once Ollama supports other types # TODO: we should update this part once Ollama supports other types
@@ -1132,68 +933,7 @@ async def generate_openai_chat_completion(
url = app.state.config.OLLAMA_BASE_URLS[url_idx] url = app.state.config.OLLAMA_BASE_URLS[url_idx]
log.info(f"url: {url}") log.info(f"url: {url}")
r = None return await post_streaming_url(f"{url}/v1/chat/completions", json.dumps(payload))
def get_request():
nonlocal payload
nonlocal r
request_id = str(uuid.uuid4())
try:
REQUEST_POOL.append(request_id)
def stream_content():
try:
if payload.get("stream"):
yield json.dumps(
{"request_id": request_id, "done": False}
) + "\n"
for chunk in r.iter_content(chunk_size=8192):
if request_id in REQUEST_POOL:
yield chunk
else:
log.warning("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(
method="POST",
url=f"{url}/v1/chat/completions",
data=json.dumps(payload),
stream=True,
)
r.raise_for_status()
return StreamingResponse(
stream_content(),
status_code=r.status_code,
headers=dict(r.headers),
)
except Exception as e:
raise e
try:
return await run_in_threadpool(get_request)
except Exception as e:
error_detail = "Open WebUI: Server Connection Error"
if r is not None:
try:
res = r.json()
if "error" in res:
error_detail = f"Ollama: {res['error']}"
except:
error_detail = f"Ollama: {e}"
raise HTTPException(
status_code=r.status_code if r else 500,
detail=error_detail,
)
@app.get("/v1/models") @app.get("/v1/models")
@@ -1522,7 +1262,7 @@ async def deprecated_proxy(
if path == "generate": if path == "generate":
data = json.loads(body.decode("utf-8")) data = json.loads(body.decode("utf-8"))
if not ("stream" in data and data["stream"] == False): if data.get("stream", True):
yield json.dumps({"id": request_id, "done": False}) + "\n" yield json.dumps({"id": request_id, "done": False}) + "\n"
elif path == "chat": elif path == "chat":
+50 -10
View File
@@ -9,6 +9,7 @@ import json
import logging import logging
from pydantic import BaseModel from pydantic import BaseModel
from starlette.background import BackgroundTask
from apps.webui.models.models import Models from apps.webui.models.models import Models
from apps.webui.models.users import Users from apps.webui.models.users import Users
@@ -194,6 +195,16 @@ async def fetch_url(url, key):
return None return None
async def cleanup_response(
response: Optional[aiohttp.ClientResponse],
session: Optional[aiohttp.ClientSession],
):
if response:
response.close()
if session:
await session.close()
def merge_models_lists(model_lists): def merge_models_lists(model_lists):
log.debug(f"merge_models_lists {model_lists}") log.debug(f"merge_models_lists {model_lists}")
merged_list = [] merged_list = []
@@ -228,6 +239,27 @@ async def get_all_models(raw: bool = False):
) or not app.state.config.ENABLE_OPENAI_API: ) or not app.state.config.ENABLE_OPENAI_API:
models = {"data": []} models = {"data": []}
else: else:
# Check if API KEYS length is same than API URLS length
if len(app.state.config.OPENAI_API_KEYS) != len(
app.state.config.OPENAI_API_BASE_URLS
):
# if there are more keys than urls, remove the extra keys
if len(app.state.config.OPENAI_API_KEYS) > len(
app.state.config.OPENAI_API_BASE_URLS
):
app.state.config.OPENAI_API_KEYS = app.state.config.OPENAI_API_KEYS[
: len(app.state.config.OPENAI_API_BASE_URLS)
]
# if there are more urls than keys, add empty keys
else:
app.state.config.OPENAI_API_KEYS += [
""
for _ in range(
len(app.state.config.OPENAI_API_BASE_URLS)
- len(app.state.config.OPENAI_API_KEYS)
)
]
tasks = [ tasks = [
fetch_url(f"{url}/models", app.state.config.OPENAI_API_KEYS[idx]) fetch_url(f"{url}/models", app.state.config.OPENAI_API_KEYS[idx])
for idx, url in enumerate(app.state.config.OPENAI_API_BASE_URLS) for idx, url in enumerate(app.state.config.OPENAI_API_BASE_URLS)
@@ -426,40 +458,48 @@ async def proxy(path: str, request: Request, user=Depends(get_verified_user)):
headers["Content-Type"] = "application/json" headers["Content-Type"] = "application/json"
r = None r = None
session = None
streaming = False
try: try:
r = requests.request( session = aiohttp.ClientSession()
r = await session.request(
method=request.method, method=request.method,
url=target_url, url=target_url,
data=payload if payload else body, data=payload if payload else body,
headers=headers, headers=headers,
stream=True,
) )
r.raise_for_status() r.raise_for_status()
# Check if response is SSE # Check if response is SSE
if "text/event-stream" in r.headers.get("Content-Type", ""): if "text/event-stream" in r.headers.get("Content-Type", ""):
streaming = True
return StreamingResponse( return StreamingResponse(
r.iter_content(chunk_size=8192), r.content,
status_code=r.status_code, status_code=r.status,
headers=dict(r.headers), headers=dict(r.headers),
background=BackgroundTask(
cleanup_response, response=r, session=session
),
) )
else: else:
response_data = r.json() response_data = await r.json()
return response_data return response_data
except Exception as e: except Exception as e:
log.exception(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:
res = r.json() res = await r.json()
print(res) print(res)
if "error" in res: if "error" in res:
error_detail = f"External: {res['error']['message'] if 'message' in res['error'] else res['error']}" error_detail = f"External: {res['error']['message'] if 'message' in res['error'] else res['error']}"
except: except:
error_detail = f"External: {e}" error_detail = f"External: {e}"
raise HTTPException(status_code=r.status if r else 500, detail=error_detail)
raise HTTPException( finally:
status_code=r.status_code if r else 500, detail=error_detail if not streaming and session:
) if r:
r.close()
await session.close()
+11
View File
@@ -180,6 +180,17 @@ WEBUI_BUILD_HASH = os.environ.get("WEBUI_BUILD_HASH", "dev-build")
DATA_DIR = Path(os.getenv("DATA_DIR", BACKEND_DIR / "data")).resolve() DATA_DIR = Path(os.getenv("DATA_DIR", BACKEND_DIR / "data")).resolve()
FRONTEND_BUILD_DIR = Path(os.getenv("FRONTEND_BUILD_DIR", BASE_DIR / "build")).resolve() FRONTEND_BUILD_DIR = Path(os.getenv("FRONTEND_BUILD_DIR", BASE_DIR / "build")).resolve()
RESET_CONFIG_ON_START = (
os.environ.get("RESET_CONFIG_ON_START", "False").lower() == "true"
)
if RESET_CONFIG_ON_START:
try:
os.remove(f"{DATA_DIR}/config.json")
with open(f"{DATA_DIR}/config.json", "w") as f:
f.write("{}")
except:
pass
try: try:
CONFIG_DATA = json.loads((DATA_DIR / "config.json").read_text()) CONFIG_DATA = json.loads((DATA_DIR / "config.json").read_text())
except: except:
+10 -4
View File
@@ -498,10 +498,12 @@ async def chat_completed(form_data: dict, user=Depends(get_verified_user)):
] ]
sorted_filters = sorted(filters, key=lambda x: x["pipeline"]["priority"]) sorted_filters = sorted(filters, key=lambda x: x["pipeline"]["priority"])
model = app.state.MODELS[model_id] print(model_id)
if "pipeline" in model: if model_id in app.state.MODELS:
sorted_filters = [model] + sorted_filters model = app.state.MODELS[model_id]
if "pipeline" in model:
sorted_filters = [model] + sorted_filters
for filter in sorted_filters: for filter in sorted_filters:
r = None r = None
@@ -550,7 +552,11 @@ async def get_pipelines_list(user=Depends(get_admin_user)):
responses = await get_openai_models(raw=True) responses = await get_openai_models(raw=True)
print(responses) print(responses)
urlIdxs = [idx for idx, response in enumerate(responses) if "pipelines" in response] urlIdxs = [
idx
for idx, response in enumerate(responses)
if response != None and "pipelines" in response
]
return { return {
"data": [ "data": [
+1117 -5
View File
File diff suppressed because it is too large. Load diff
+2 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "open-webui", "name": "open-webui",
"version": "0.2.0", "version": "0.2.2",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "npm run pyodide:fetch && vite dev --host", "dev": "npm run pyodide:fetch && vite dev --host",
@@ -63,6 +63,7 @@
"js-sha256": "^0.10.1", "js-sha256": "^0.10.1",
"katex": "^0.16.9", "katex": "^0.16.9",
"marked": "^9.1.0", "marked": "^9.1.0",
"mermaid": "^10.9.1",
"pyodide": "^0.26.0-alpha.4", "pyodide": "^0.26.0-alpha.4",
"sortablejs": "^1.15.2", "sortablejs": "^1.15.2",
"svelte-sonner": "^0.3.19", "svelte-sonner": "^0.3.19",
+3 -22
View File
@@ -369,27 +369,6 @@ export const generateChatCompletion = async (token: string = '', body: object) =
return [res, controller]; return [res, controller];
}; };
export const cancelOllamaRequest = async (token: string = '', requestId: string) => {
let error = null;
const res = await fetch(`${OLLAMA_API_BASE_URL}/cancel/${requestId}`, {
method: 'GET',
headers: {
'Content-Type': 'text/event-stream',
Authorization: `Bearer ${token}`
}
}).catch((err) => {
error = err;
return null;
});
if (error) {
throw error;
}
return res;
};
export const createModel = async (token: string, tagName: string, content: string) => { export const createModel = async (token: string, tagName: string, content: string) => {
let error = null; let error = null;
@@ -461,8 +440,10 @@ export const deleteModel = async (token: string, tagName: string, urlIdx: string
export const pullModel = async (token: string, tagName: string, urlIdx: string | null = null) => { export const pullModel = async (token: string, tagName: string, urlIdx: string | null = null) => {
let error = null; let error = null;
const controller = new AbortController();
const res = await fetch(`${OLLAMA_API_BASE_URL}/api/pull${urlIdx !== null ? `/${urlIdx}` : ''}`, { const res = await fetch(`${OLLAMA_API_BASE_URL}/api/pull${urlIdx !== null ? `/${urlIdx}` : ''}`, {
signal: controller.signal,
method: 'POST', method: 'POST',
headers: { headers: {
Accept: 'application/json', Accept: 'application/json',
@@ -485,7 +466,7 @@ export const pullModel = async (token: string, tagName: string, urlIdx: string |
if (error) { if (error) {
throw error; throw error;
} }
return res; return [res, controller];
}; };
export const downloadModel = async ( export const downloadModel = async (
+84 -113
View File
@@ -1,6 +1,7 @@
<script lang="ts"> <script lang="ts">
import { v4 as uuidv4 } from 'uuid'; import { v4 as uuidv4 } from 'uuid';
import { toast } from 'svelte-sonner'; import { toast } from 'svelte-sonner';
import mermaid from 'mermaid';
import { getContext, onMount, tick } from 'svelte'; import { getContext, onMount, tick } from 'svelte';
import { goto } from '$app/navigation'; import { goto } from '$app/navigation';
@@ -26,7 +27,7 @@
splitStream splitStream
} from '$lib/utils'; } from '$lib/utils';
import { cancelOllamaRequest, generateChatCompletion } from '$lib/apis/ollama'; import { generateChatCompletion } from '$lib/apis/ollama';
import { import {
addTagById, addTagById,
createNewChat, createNewChat,
@@ -65,7 +66,6 @@
let autoScroll = true; let autoScroll = true;
let processing = ''; let processing = '';
let messagesContainerElement: HTMLDivElement; let messagesContainerElement: HTMLDivElement;
let currentRequestId = null;
let showModelSelector = true; let showModelSelector = true;
@@ -130,10 +130,6 @@
////////////////////////// //////////////////////////
const initNewChat = async () => { const initNewChat = async () => {
if (currentRequestId !== null) {
await cancelOllamaRequest(localStorage.token, currentRequestId);
currentRequestId = null;
}
window.history.replaceState(history.state, '', `/`); window.history.replaceState(history.state, '', `/`);
await chatId.set(''); await chatId.set('');
@@ -251,6 +247,39 @@
} }
}; };
const chatCompletedHandler = async (model, messages) => {
await mermaid.run({
querySelector: '.mermaid'
});
const res = await chatCompleted(localStorage.token, {
model: model.id,
messages: messages.map((m) => ({
id: m.id,
role: m.role,
content: m.content,
timestamp: m.timestamp
})),
chat_id: $chatId
}).catch((error) => {
console.error(error);
return null;
});
if (res !== null) {
// Update chat history with the new messages
for (const message of res.messages) {
history.messages[message.id] = {
...history.messages[message.id],
...(history.messages[message.id].content !== message.content
? { originalContent: history.messages[message.id].content }
: {}),
...message
};
}
}
};
////////////////////////// //////////////////////////
// Ollama functions // Ollama functions
////////////////////////// //////////////////////////
@@ -616,39 +645,11 @@
if (stopResponseFlag) { if (stopResponseFlag) {
controller.abort('User: Stop Response'); controller.abort('User: Stop Response');
await cancelOllamaRequest(localStorage.token, currentRequestId);
} else { } else {
const messages = createMessagesList(responseMessageId); const messages = createMessagesList(responseMessageId);
const res = await chatCompleted(localStorage.token, { await chatCompletedHandler(model, messages);
model: model,
messages: messages.map((m) => ({
id: m.id,
role: m.role,
content: m.content,
timestamp: m.timestamp
})),
chat_id: $chatId
}).catch((error) => {
console.error(error);
return null;
});
if (res !== null) {
// Update chat history with the new messages
for (const message of res.messages) {
history.messages[message.id] = {
...history.messages[message.id],
...(history.messages[message.id].content !== message.content
? { originalContent: history.messages[message.id].content }
: {}),
...message
};
}
}
} }
currentRequestId = null;
break; break;
} }
@@ -669,63 +670,58 @@
throw data; throw data;
} }
if ('id' in data) { if (data.done == false) {
console.log(data); if (responseMessage.content == '' && data.message.content == '\n') {
currentRequestId = data.id; continue;
} else {
if (data.done == false) {
if (responseMessage.content == '' && data.message.content == '\n') {
continue;
} else {
responseMessage.content += data.message.content;
messages = messages;
}
} else { } else {
responseMessage.done = true; responseMessage.content += data.message.content;
if (responseMessage.content == '') {
responseMessage.error = {
code: 400,
content: `Oops! No text generated from Ollama, Please try again.`
};
}
responseMessage.context = data.context ?? null;
responseMessage.info = {
total_duration: data.total_duration,
load_duration: data.load_duration,
sample_count: data.sample_count,
sample_duration: data.sample_duration,
prompt_eval_count: data.prompt_eval_count,
prompt_eval_duration: data.prompt_eval_duration,
eval_count: data.eval_count,
eval_duration: data.eval_duration
};
messages = messages; messages = messages;
}
} else {
responseMessage.done = true;
if ($settings.notificationEnabled && !document.hasFocus()) { if (responseMessage.content == '') {
const notification = new Notification( responseMessage.error = {
selectedModelfile code: 400,
? `${ content: `Oops! No text generated from Ollama, Please try again.`
selectedModelfile.title.charAt(0).toUpperCase() + };
selectedModelfile.title.slice(1) }
}`
: `${model}`,
{
body: responseMessage.content,
icon: selectedModelfile?.imageUrl ?? `${WEBUI_BASE_URL}/static/favicon.png`
}
);
}
if ($settings.responseAutoCopy) { responseMessage.context = data.context ?? null;
copyToClipboard(responseMessage.content); responseMessage.info = {
} total_duration: data.total_duration,
load_duration: data.load_duration,
sample_count: data.sample_count,
sample_duration: data.sample_duration,
prompt_eval_count: data.prompt_eval_count,
prompt_eval_duration: data.prompt_eval_duration,
eval_count: data.eval_count,
eval_duration: data.eval_duration
};
messages = messages;
if ($settings.responseAutoPlayback) { if ($settings.notificationEnabled && !document.hasFocus()) {
await tick(); const notification = new Notification(
document.getElementById(`speak-button-${responseMessage.id}`)?.click(); selectedModelfile
} ? `${
selectedModelfile.title.charAt(0).toUpperCase() +
selectedModelfile.title.slice(1)
}`
: `${model}`,
{
body: responseMessage.content,
icon: selectedModelfile?.imageUrl ?? `${WEBUI_BASE_URL}/static/favicon.png`
}
);
}
if ($settings.responseAutoCopy) {
copyToClipboard(responseMessage.content);
}
if ($settings.responseAutoPlayback) {
await tick();
document.getElementById(`speak-button-${responseMessage.id}`)?.click();
} }
} }
} }
@@ -906,32 +902,7 @@
} else { } else {
const messages = createMessagesList(responseMessageId); const messages = createMessagesList(responseMessageId);
const res = await chatCompleted(localStorage.token, { await chatCompletedHandler(model, messages);
model: model.id,
messages: messages.map((m) => ({
id: m.id,
role: m.role,
content: m.content,
timestamp: m.timestamp
})),
chat_id: $chatId
}).catch((error) => {
console.error(error);
return null;
});
if (res !== null) {
// Update chat history with the new messages
for (const message of res.messages) {
history.messages[message.id] = {
...history.messages[message.id],
...(history.messages[message.id].content !== message.content
? { originalContent: history.messages[message.id].content }
: {}),
...message
};
}
}
} }
break; break;
+1 -2
View File
@@ -1,8 +1,7 @@
<script lang="ts"> <script lang="ts">
import { v4 as uuidv4 } from 'uuid'; import { v4 as uuidv4 } from 'uuid';
import { chats, config, settings, user as _user, mobile } from '$lib/stores'; import { chats, config, settings, user as _user, mobile } from '$lib/stores';
import { tick, getContext } from 'svelte'; import { tick, getContext, onMount } from 'svelte';
import { toast } from 'svelte-sonner'; import { toast } from 'svelte-sonner';
import { getChatList, updateChatById } from '$lib/apis/chats'; import { getChatList, updateChatById } from '$lib/apis/chats';
@@ -5,6 +5,7 @@
import tippy from 'tippy.js'; import tippy from 'tippy.js';
import auto_render from 'katex/dist/contrib/auto-render.mjs'; import auto_render from 'katex/dist/contrib/auto-render.mjs';
import 'katex/dist/katex.min.css'; import 'katex/dist/katex.min.css';
import mermaid from 'mermaid';
import { fade } from 'svelte/transition'; import { fade } from 'svelte/transition';
import { createEventDispatcher } from 'svelte'; import { createEventDispatcher } from 'svelte';
@@ -343,6 +344,10 @@
onMount(async () => { onMount(async () => {
await tick(); await tick();
renderStyling(); renderStyling();
await mermaid.run({
querySelector: '.mermaid'
});
}); });
</script> </script>
@@ -458,11 +463,15 @@
<!-- unless message.error === true which is legacy error handling, where the error message is stored in message.content --> <!-- unless message.error === true which is legacy error handling, where the error message is stored in message.content -->
{#each tokens as token, tokenIdx} {#each tokens as token, tokenIdx}
{#if token.type === 'code'} {#if token.type === 'code'}
<CodeBlock {#if token.lang === 'mermaid'}
id={`${message.id}-${tokenIdx}`} <pre class="mermaid">{revertSanitizedResponseContent(token.text)}</pre>
lang={token?.lang ?? ''} {:else}
code={revertSanitizedResponseContent(token?.text ?? '')} <CodeBlock
/> id={`${message.id}-${tokenIdx}`}
lang={token?.lang ?? ''}
code={revertSanitizedResponseContent(token?.text ?? '')}
/>
{/if}
{:else} {:else}
{@html marked.parse(token.raw, { {@html marked.parse(token.raw, {
...defaults, ...defaults,
@@ -196,7 +196,7 @@
<div class=" mt-2 mb-1 flex justify-end space-x-1.5 text-sm font-medium"> <div class=" mt-2 mb-1 flex justify-end space-x-1.5 text-sm font-medium">
<button <button
id="close-edit-message-button" id="close-edit-message-button"
class="px-4 py-2 bg-white hover:bg-gray-100 text-gray-800 transition rounded-3xl" class="px-4 py-2 bg-white dark:bg-gray-900 hover:bg-gray-100 text-gray-800 dark:text-gray-100 transition rounded-3xl"
on:click={() => { on:click={() => {
cancelEditMessage(); cancelEditMessage();
}} }}
@@ -206,7 +206,7 @@
<button <button
id="save-edit-message-button" id="save-edit-message-button"
class=" px-4 py-2 bg-gray-900 hover:bg-gray-850 text-gray-100 transition rounded-3xl" class=" px-4 py-2 bg-gray-900 dark:bg-white hover:bg-gray-850 text-gray-100 dark:text-gray-800 transition rounded-3xl"
on:click={() => { on:click={() => {
editMessageConfirmHandler(); editMessageConfirmHandler();
}} }}
@@ -8,7 +8,7 @@
import Check from '$lib/components/icons/Check.svelte'; import Check from '$lib/components/icons/Check.svelte';
import Search from '$lib/components/icons/Search.svelte'; import Search from '$lib/components/icons/Search.svelte';
import { cancelOllamaRequest, deleteModel, getOllamaVersion, pullModel } from '$lib/apis/ollama'; import { deleteModel, getOllamaVersion, pullModel } from '$lib/apis/ollama';
import { user, MODEL_DOWNLOAD_POOL, models, mobile } from '$lib/stores'; import { user, MODEL_DOWNLOAD_POOL, models, mobile } from '$lib/stores';
import { toast } from 'svelte-sonner'; import { toast } from 'svelte-sonner';
@@ -72,10 +72,12 @@
return; return;
} }
const res = await pullModel(localStorage.token, sanitizedModelTag, '0').catch((error) => { const [res, controller] = await pullModel(localStorage.token, sanitizedModelTag, '0').catch(
toast.error(error); (error) => {
return null; toast.error(error);
}); return null;
}
);
if (res) { if (res) {
const reader = res.body const reader = res.body
@@ -83,6 +85,16 @@
.pipeThrough(splitStream('\n')) .pipeThrough(splitStream('\n'))
.getReader(); .getReader();
MODEL_DOWNLOAD_POOL.set({
...$MODEL_DOWNLOAD_POOL,
[sanitizedModelTag]: {
...$MODEL_DOWNLOAD_POOL[sanitizedModelTag],
abortController: controller,
reader,
done: false
}
});
while (true) { while (true) {
try { try {
const { value, done } = await reader.read(); const { value, done } = await reader.read();
@@ -101,19 +113,6 @@
throw data.detail; throw data.detail;
} }
if (data.id) {
MODEL_DOWNLOAD_POOL.set({
...$MODEL_DOWNLOAD_POOL,
[sanitizedModelTag]: {
...$MODEL_DOWNLOAD_POOL[sanitizedModelTag],
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;
@@ -181,11 +180,12 @@
}); });
const cancelModelPullHandler = async (model: string) => { const cancelModelPullHandler = async (model: string) => {
const { reader, requestId } = $MODEL_DOWNLOAD_POOL[model]; const { reader, abortController } = $MODEL_DOWNLOAD_POOL[model];
if (abortController) {
abortController.abort();
}
if (reader) { if (reader) {
await reader.cancel(); await reader.cancel();
await cancelOllamaRequest(localStorage.token, requestId);
delete $MODEL_DOWNLOAD_POOL[model]; delete $MODEL_DOWNLOAD_POOL[model];
MODEL_DOWNLOAD_POOL.set({ MODEL_DOWNLOAD_POOL.set({
...$MODEL_DOWNLOAD_POOL ...$MODEL_DOWNLOAD_POOL
@@ -20,6 +20,9 @@
tfs_z: '', tfs_z: '',
num_ctx: '', num_ctx: '',
max_tokens: '', max_tokens: '',
use_mmap: null,
use_mlock: null,
num_thread: null,
template: null template: null
}; };
@@ -559,6 +562,7 @@
</div> </div>
{/if} {/if}
</div> </div>
<div class=" py-0.5 w-full justify-between"> <div class=" py-0.5 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('Max Tokens (num_predict)')}</div> <div class=" self-center text-xs font-medium">{$i18n.t('Max Tokens (num_predict)')}</div>
@@ -604,6 +608,93 @@
</div> </div>
{/if} {/if}
</div> </div>
<div class=" py-0.5 w-full justify-between">
<div class="flex w-full justify-between">
<div class=" self-center text-xs font-medium">{$i18n.t('use_mmap (Ollama)')}</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.use_mmap = (params?.use_mmap ?? null) === null ? true : null;
}}
>
{#if (params?.use_mmap ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('On')}</span>
{/if}
</button>
</div>
</div>
<div class=" py-0.5 w-full justify-between">
<div class="flex w-full justify-between">
<div class=" self-center text-xs font-medium">{$i18n.t('use_mlock (Ollama)')}</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.use_mlock = (params?.use_mlock ?? null) === null ? true : null;
}}
>
{#if (params?.use_mlock ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('On')}</span>
{/if}
</button>
</div>
</div>
<div class=" py-0.5 w-full justify-between">
<div class="flex w-full justify-between">
<div class=" self-center text-xs font-medium">{$i18n.t('num_thread (Ollama)')}</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.num_thread = (params?.num_thread ?? null) === null ? 2 : null;
}}
>
{#if (params?.num_thread ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
{/if}
</button>
</div>
{#if (params?.num_thread ?? null) !== null}
<div class="flex mt-0.5 space-x-2">
<div class=" flex-1">
<input
id="steps-range"
type="range"
min="1"
max="256"
step="1"
bind:value={params.num_thread}
class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
/>
</div>
<div class="">
<input
bind:value={params.num_thread}
type="number"
class=" bg-transparent text-center w-14"
min="1"
max="256"
step="1"
/>
</div>
</div>
{/if}
</div>
<div class=" py-0.5 w-full justify-between"> <div class=" py-0.5 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('Template')}</div> <div class=" self-center text-xs font-medium">{$i18n.t('Template')}</div>
@@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import { models, user } from '$lib/stores'; import { models, user } from '$lib/stores';
import { createEventDispatcher, onMount, getContext } from 'svelte'; import { createEventDispatcher, onMount, getContext, tick } from 'svelte';
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
import { import {
@@ -74,23 +74,48 @@
}; };
const updateOpenAIHandler = async () => { const updateOpenAIHandler = async () => {
// Check if API KEYS length is same than API URLS length
if (OPENAI_API_KEYS.length !== OPENAI_API_BASE_URLS.length) {
// if there are more keys than urls, remove the extra keys
if (OPENAI_API_KEYS.length > OPENAI_API_BASE_URLS.length) {
OPENAI_API_KEYS = OPENAI_API_KEYS.slice(0, OPENAI_API_BASE_URLS.length);
}
// if there are more urls than keys, add empty keys
if (OPENAI_API_KEYS.length < OPENAI_API_BASE_URLS.length) {
const diff = OPENAI_API_BASE_URLS.length - OPENAI_API_KEYS.length;
for (let i = 0; i < diff; i++) {
OPENAI_API_KEYS.push('');
}
}
}
OPENAI_API_BASE_URLS = await updateOpenAIUrls(localStorage.token, OPENAI_API_BASE_URLS); OPENAI_API_BASE_URLS = await updateOpenAIUrls(localStorage.token, OPENAI_API_BASE_URLS);
OPENAI_API_KEYS = await updateOpenAIKeys(localStorage.token, OPENAI_API_KEYS); OPENAI_API_KEYS = await updateOpenAIKeys(localStorage.token, OPENAI_API_KEYS);
await models.set(await getModels()); await models.set(await getModels());
}; };
const updateOllamaUrlsHandler = async () => { const updateOllamaUrlsHandler = async () => {
OLLAMA_BASE_URLS = await updateOllamaUrls(localStorage.token, OLLAMA_BASE_URLS); OLLAMA_BASE_URLS = OLLAMA_BASE_URLS.filter((url) => url !== '');
console.log(OLLAMA_BASE_URLS);
const ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => { if (OLLAMA_BASE_URLS.length === 0) {
toast.error(error); ENABLE_OLLAMA_API = false;
return null; await updateOllamaConfig(localStorage.token, ENABLE_OLLAMA_API);
});
if (ollamaVersion) { toast.info($i18n.t('Ollama API disabled'));
toast.success($i18n.t('Server connection verified')); } else {
await models.set(await getModels()); OLLAMA_BASE_URLS = await updateOllamaUrls(localStorage.token, OLLAMA_BASE_URLS);
const ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => {
toast.error(error);
return null;
});
if (ollamaVersion) {
toast.success($i18n.t('Server connection verified'));
await models.set(await getModels());
}
} }
}; };
@@ -286,6 +311,10 @@
bind:state={ENABLE_OLLAMA_API} bind:state={ENABLE_OLLAMA_API}
on:change={async () => { on:change={async () => {
updateOllamaConfig(localStorage.token, ENABLE_OLLAMA_API); updateOllamaConfig(localStorage.token, ENABLE_OLLAMA_API);
if (OLLAMA_BASE_URLS.length === 0) {
OLLAMA_BASE_URLS = [''];
}
}} }}
/> />
</div> </div>
+469 -444
View File
@@ -8,8 +8,8 @@
getOllamaUrls, getOllamaUrls,
getOllamaVersion, getOllamaVersion,
pullModel, pullModel,
cancelOllamaRequest, uploadModel,
uploadModel getOllamaConfig
} 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';
@@ -28,6 +28,8 @@
// Models // Models
let ollamaEnabled = null;
let OLLAMA_URLS = []; let OLLAMA_URLS = [];
let selectedOllamaUrlIdx: string | null = null; let selectedOllamaUrlIdx: string | null = null;
@@ -67,12 +69,14 @@
console.log(model); console.log(model);
updateModelId = model.id; updateModelId = model.id;
const res = await pullModel(localStorage.token, model.id, selectedOllamaUrlIdx).catch( const [res, controller] = await pullModel(
(error) => { localStorage.token,
toast.error(error); model.id,
return null; selectedOllamaUrlIdx
} ).catch((error) => {
); toast.error(error);
return null;
});
if (res) { if (res) {
const reader = res.body const reader = res.body
@@ -141,10 +145,12 @@
return; return;
} }
const res = await pullModel(localStorage.token, sanitizedModelTag, '0').catch((error) => { const [res, controller] = await pullModel(localStorage.token, sanitizedModelTag, '0').catch(
toast.error(error); (error) => {
return null; toast.error(error);
}); return null;
}
);
if (res) { if (res) {
const reader = res.body const reader = res.body
@@ -152,6 +158,16 @@
.pipeThrough(splitStream('\n')) .pipeThrough(splitStream('\n'))
.getReader(); .getReader();
MODEL_DOWNLOAD_POOL.set({
...$MODEL_DOWNLOAD_POOL,
[sanitizedModelTag]: {
...$MODEL_DOWNLOAD_POOL[sanitizedModelTag],
abortController: controller,
reader,
done: false
}
});
while (true) { while (true) {
try { try {
const { value, done } = await reader.read(); const { value, done } = await reader.read();
@@ -170,19 +186,6 @@
throw data.detail; throw data.detail;
} }
if (data.id) {
MODEL_DOWNLOAD_POOL.set({
...$MODEL_DOWNLOAD_POOL,
[sanitizedModelTag]: {
...$MODEL_DOWNLOAD_POOL[sanitizedModelTag],
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;
@@ -416,11 +419,12 @@
}; };
const cancelModelPullHandler = async (model: string) => { const cancelModelPullHandler = async (model: string) => {
const { reader, requestId } = $MODEL_DOWNLOAD_POOL[model]; const { reader, abortController } = $MODEL_DOWNLOAD_POOL[model];
if (abortController) {
abortController.abort();
}
if (reader) { if (reader) {
await reader.cancel(); await reader.cancel();
await cancelOllamaRequest(localStorage.token, requestId);
delete $MODEL_DOWNLOAD_POOL[model]; delete $MODEL_DOWNLOAD_POOL[model];
MODEL_DOWNLOAD_POOL.set({ MODEL_DOWNLOAD_POOL.set({
...$MODEL_DOWNLOAD_POOL ...$MODEL_DOWNLOAD_POOL
@@ -431,381 +435,63 @@
}; };
onMount(async () => { onMount(async () => {
await Promise.all([ const ollamaConfig = await getOllamaConfig(localStorage.token);
(async () => {
OLLAMA_URLS = await getOllamaUrls(localStorage.token).catch((error) => {
toast.error(error);
return [];
});
if (OLLAMA_URLS.length > 0) { if (ollamaConfig.ENABLE_OLLAMA_API) {
selectedOllamaUrlIdx = 0; ollamaEnabled = true;
}
})(), await Promise.all([
(async () => { (async () => {
ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => false); OLLAMA_URLS = await getOllamaUrls(localStorage.token).catch((error) => {
})() toast.error(error);
]); return [];
});
if (OLLAMA_URLS.length > 0) {
selectedOllamaUrlIdx = 0;
}
})(),
(async () => {
ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => false);
})()
]);
} else {
ollamaEnabled = false;
toast.error('Ollama API is disabled');
}
}); });
</script> </script>
<div class="flex flex-col h-full justify-between text-sm"> <div class="flex flex-col h-full justify-between text-sm">
<div class=" space-y-3 pr-1.5 overflow-y-scroll h-[24rem]"> <div class=" space-y-3 pr-1.5 overflow-y-scroll h-[24rem]">
{#if ollamaVersion !== null} {#if ollamaEnabled}
<div class="space-y-2 pr-1.5"> {#if ollamaVersion !== null}
<div class="text-sm font-medium">{$i18n.t('Manage Ollama Models')}</div> <div class="space-y-2 pr-1.5">
<div class="text-sm font-medium">{$i18n.t('Manage Ollama Models')}</div>
{#if OLLAMA_URLS.length > 0} {#if OLLAMA_URLS.length > 0}
<div class="flex gap-2"> <div class="flex gap-2">
<div class="flex-1 pb-1"> <div class="flex-1 pb-1">
<select
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
bind:value={selectedOllamaUrlIdx}
placeholder={$i18n.t('Select an Ollama instance')}
>
{#each OLLAMA_URLS as url, idx}
<option value={idx} class="bg-gray-100 dark:bg-gray-700">{url}</option>
{/each}
</select>
</div>
<div>
<div class="flex w-full justify-end">
<Tooltip content="Update All Models" placement="top">
<button
class="p-2.5 flex gap-2 items-center 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"
on:click={() => {
updateModelsHandler();
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="w-4 h-4"
>
<path
d="M7 1a.75.75 0 0 1 .75.75V6h-1.5V1.75A.75.75 0 0 1 7 1ZM6.25 6v2.94L5.03 7.72a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l2.5-2.5a.75.75 0 1 0-1.06-1.06L7.75 8.94V6H10a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h2.25Z"
/>
<path
d="M4.268 14A2 2 0 0 0 6 15h6a2 2 0 0 0 2-2v-3a2 2 0 0 0-1-1.732V11a3 3 0 0 1-3 3H4.268Z"
/>
</svg>
</button>
</Tooltip>
</div>
</div>
</div>
{#if updateModelId}
Updating "{updateModelId}" {updateProgress ? `(${updateProgress}%)` : ''}
{/if}
{/if}
<div class="space-y-2">
<div>
<div class=" mb-2 text-sm font-medium">{$i18n.t('Pull a model from Ollama.com')}</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 model tag (e.g. {{modelTag}})', {
modelTag: 'mistral:7b'
})}
bind:value={modelTag}
/>
</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"
on:click={() => {
pullModelHandler();
}}
disabled={modelTransferring}
>
{#if modelTransferring}
<div class="self-center">
<svg
class=" w-4 h-4"
viewBox="0 0 24 24"
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
>
<style>
.spinner_ajPY {
transform-origin: center;
animation: spinner_AtaB 0.75s infinite linear;
}
@keyframes spinner_AtaB {
100% {
transform: rotate(360deg);
}
}
</style>
<path
d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
opacity=".25"
/>
<path
d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
class="spinner_ajPY"
/>
</svg>
</div>
{:else}
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="w-4 h-4"
>
<path
d="M8.75 2.75a.75.75 0 0 0-1.5 0v5.69L5.03 6.22a.75.75 0 0 0-1.06 1.06l3.5 3.5a.75.75 0 0 0 1.06 0l3.5-3.5a.75.75 0 0 0-1.06-1.06L8.75 8.44V2.75Z"
/>
<path
d="M3.5 9.75a.75.75 0 0 0-1.5 0v1.5A2.75 2.75 0 0 0 4.75 14h6.5A2.75 2.75 0 0 0 14 11.25v-1.5a.75.75 0 0 0-1.5 0v1.5c0 .69-.56 1.25-1.25 1.25h-6.5c-.69 0-1.25-.56-1.25-1.25v-1.5Z"
/>
</svg>
{/if}
</button>
</div>
<div class="mt-2 mb-1 text-xs text-gray-400 dark:text-gray-500">
{$i18n.t('To access the available model names for downloading,')}
<a
class=" text-gray-500 dark:text-gray-300 font-medium underline"
href="https://ollama.com/library"
target="_blank">{$i18n.t('click here.')}</a
>
</div>
{#if Object.keys($MODEL_DOWNLOAD_POOL).length > 0}
{#each Object.keys($MODEL_DOWNLOAD_POOL) as model}
{#if 'pullProgress' in $MODEL_DOWNLOAD_POOL[model]}
<div class="flex flex-col">
<div class="font-medium mb-1">{model}</div>
<div class="">
<div class="flex flex-row justify-between space-x-4 pr-2">
<div class=" flex-1">
<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: {Math.max(
15,
$MODEL_DOWNLOAD_POOL[model].pullProgress ?? 0
)}%"
>
{$MODEL_DOWNLOAD_POOL[model].pullProgress ?? 0}%
</div>
</div>
<Tooltip content={$i18n.t('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 $MODEL_DOWNLOAD_POOL[model]}
<div class="mt-1 text-xs dark:text-gray-500" style="font-size: 0.5rem;">
{$MODEL_DOWNLOAD_POOL[model].digest}
</div>
{/if}
</div>
</div>
{/if}
{/each}
{/if}
</div>
<div>
<div class=" mb-2 text-sm font-medium">{$i18n.t('Delete a model')}</div>
<div class="flex w-full">
<div class="flex-1 mr-2">
<select <select
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={deleteModelTag} bind:value={selectedOllamaUrlIdx}
placeholder={$i18n.t('Select a model')} placeholder={$i18n.t('Select an Ollama instance')}
> >
{#if !deleteModelTag} {#each OLLAMA_URLS as url, idx}
<option value="" disabled selected>{$i18n.t('Select a model')}</option> <option value={idx} class="bg-gray-100 dark:bg-gray-700">{url}</option>
{/if}
{#each $models.filter((m) => !(m?.preset ?? false) && m.owned_by === 'ollama' && (selectedOllamaUrlIdx === null ? true : (m?.ollama?.urls ?? []).includes(selectedOllamaUrlIdx))) as model}
<option value={model.name} class="bg-gray-100 dark:bg-gray-700"
>{model.name +
' (' +
(model.ollama.size / 1024 ** 3).toFixed(1) +
' GB)'}</option
>
{/each} {/each}
</select> </select>
</div> </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"
on:click={() => {
deleteModelHandler();
}}
>
<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="M5 3.25V4H2.75a.75.75 0 0 0 0 1.5h.3l.815 8.15A1.5 1.5 0 0 0 5.357 15h5.285a1.5 1.5 0 0 0 1.493-1.35l.815-8.15h.3a.75.75 0 0 0 0-1.5H11v-.75A2.25 2.25 0 0 0 8.75 1h-1.5A2.25 2.25 0 0 0 5 3.25Zm2.25-.75a.75.75 0 0 0-.75.75V4h3v-.75a.75.75 0 0 0-.75-.75h-1.5ZM6.05 6a.75.75 0 0 1 .787.713l.275 5.5a.75.75 0 0 1-1.498.075l-.275-5.5A.75.75 0 0 1 6.05 6Zm3.9 0a.75.75 0 0 1 .712.787l-.275 5.5a.75.75 0 0 1-1.498-.075l.275-5.5a.75.75 0 0 1 .786-.711Z"
clip-rule="evenodd"
/>
</svg>
</button>
</div>
</div>
<div class="pt-1"> <div>
<div class="flex justify-between items-center text-xs"> <div class="flex w-full justify-end">
<div class=" text-sm font-medium">{$i18n.t('Experimental')}</div> <Tooltip content="Update All Models" placement="top">
<button <button
class=" text-xs font-medium text-gray-500" class="p-2.5 flex gap-2 items-center 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={() => {
on:click={() => { updateModelsHandler();
showExperimentalOllama = !showExperimentalOllama; }}
}}>{showExperimentalOllama ? $i18n.t('Hide') : $i18n.t('Show')}</button >
>
</div>
</div>
{#if showExperimentalOllama}
<form
on:submit|preventDefault={() => {
uploadModelHandler();
}}
>
<div class=" mb-2 flex w-full justify-between">
<div class=" text-sm font-medium">{$i18n.t('Upload a GGUF model')}</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
on:click={() => {
if (modelUploadMode === 'file') {
modelUploadMode = 'url';
} else {
modelUploadMode = 'file';
}
}}
type="button"
>
{#if modelUploadMode === 'file'}
<span class="ml-2 self-center">{$i18n.t('File Mode')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('URL Mode')}</span>
{/if}
</button>
</div>
<div class="flex w-full mb-1.5">
<div class="flex flex-col w-full">
{#if modelUploadMode === 'file'}
<div class="flex-1 {modelInputFile && modelInputFile.length > 0 ? 'mr-2' : ''}">
<input
id="model-upload-input"
bind:this={modelUploadInputElement}
type="file"
bind:files={modelInputFile}
on:change={() => {
console.log(modelInputFile);
}}
accept=".gguf,.safetensors"
required
hidden
/>
<button
type="button"
class="w-full rounded-lg text-left py-2 px-4 bg-white dark:text-gray-300 dark:bg-gray-850"
on:click={() => {
modelUploadInputElement.click();
}}
>
{#if modelInputFile && modelInputFile.length > 0}
{modelInputFile[0].name}
{:else}
{$i18n.t('Click here to select')}
{/if}
</button>
</div>
{:else}
<div class="flex-1 {modelFileUrl !== '' ? 'mr-2' : ''}">
<input
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'
: ''}"
type="url"
required
bind:value={modelFileUrl}
placeholder={$i18n.t('Type Hugging Face Resolve (Download) URL')}
/>
</div>
{/if}
</div>
{#if (modelUploadMode === 'file' && modelInputFile && modelInputFile.length > 0) || (modelUploadMode === 'url' && modelFileUrl !== '')}
<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 disabled:cursor-not-allowed transition"
type="submit"
disabled={modelTransferring}
>
{#if modelTransferring}
<div class="self-center">
<svg
class=" w-4 h-4"
viewBox="0 0 24 24"
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
>
<style>
.spinner_ajPY {
transform-origin: center;
animation: spinner_AtaB 0.75s infinite linear;
}
@keyframes spinner_AtaB {
100% {
transform: rotate(360deg);
}
}
</style>
<path
d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
opacity=".25"
/>
<path
d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
class="spinner_ajPY"
/>
</svg>
</div>
{:else}
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16" viewBox="0 0 16 16"
@@ -813,77 +499,416 @@
class="w-4 h-4" class="w-4 h-4"
> >
<path <path
d="M7.25 10.25a.75.75 0 0 0 1.5 0V4.56l2.22 2.22a.75.75 0 1 0 1.06-1.06l-3.5-3.5a.75.75 0 0 0-1.06 0l-3.5 3.5a.75.75 0 0 0 1.06 1.06l2.22-2.22v5.69Z" d="M7 1a.75.75 0 0 1 .75.75V6h-1.5V1.75A.75.75 0 0 1 7 1ZM6.25 6v2.94L5.03 7.72a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l2.5-2.5a.75.75 0 1 0-1.06-1.06L7.75 8.94V6H10a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h2.25Z"
/> />
<path <path
d="M3.5 9.75a.75.75 0 0 0-1.5 0v1.5A2.75 2.75 0 0 0 4.75 14h6.5A2.75 2.75 0 0 0 14 11.25v-1.5a.75.75 0 0 0-1.5 0v1.5c0 .69-.56 1.25-1.25 1.25h-6.5c-.69 0-1.25-.56-1.25-1.25v-1.5Z" d="M4.268 14A2 2 0 0 0 6 15h6a2 2 0 0 0 2-2v-3a2 2 0 0 0-1-1.732V11a3 3 0 0 1-3 3H4.268Z"
/> />
</svg> </svg>
{/if} </button>
</button> </Tooltip>
{/if} </div>
</div>
</div>
{#if updateModelId}
Updating "{updateModelId}" {updateProgress ? `(${updateProgress}%)` : ''}
{/if}
{/if}
<div class="space-y-2">
<div>
<div class=" mb-2 text-sm font-medium">{$i18n.t('Pull a model from Ollama.com')}</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 model tag (e.g. {{modelTag}})', {
modelTag: 'mistral:7b'
})}
bind:value={modelTag}
/>
</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"
on:click={() => {
pullModelHandler();
}}
disabled={modelTransferring}
>
{#if modelTransferring}
<div class="self-center">
<svg
class=" w-4 h-4"
viewBox="0 0 24 24"
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
>
<style>
.spinner_ajPY {
transform-origin: center;
animation: spinner_AtaB 0.75s infinite linear;
}
@keyframes spinner_AtaB {
100% {
transform: rotate(360deg);
}
}
</style>
<path
d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
opacity=".25"
/>
<path
d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
class="spinner_ajPY"
/>
</svg>
</div>
{:else}
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="w-4 h-4"
>
<path
d="M8.75 2.75a.75.75 0 0 0-1.5 0v5.69L5.03 6.22a.75.75 0 0 0-1.06 1.06l3.5 3.5a.75.75 0 0 0 1.06 0l3.5-3.5a.75.75 0 0 0-1.06-1.06L8.75 8.44V2.75Z"
/>
<path
d="M3.5 9.75a.75.75 0 0 0-1.5 0v1.5A2.75 2.75 0 0 0 4.75 14h6.5A2.75 2.75 0 0 0 14 11.25v-1.5a.75.75 0 0 0-1.5 0v1.5c0 .69-.56 1.25-1.25 1.25h-6.5c-.69 0-1.25-.56-1.25-1.25v-1.5Z"
/>
</svg>
{/if}
</button>
</div> </div>
{#if (modelUploadMode === 'file' && modelInputFile && modelInputFile.length > 0) || (modelUploadMode === 'url' && modelFileUrl !== '')} <div class="mt-2 mb-1 text-xs text-gray-400 dark:text-gray-500">
<div> {$i18n.t('To access the available model names for downloading,')}
<div>
<div class=" my-2.5 text-sm font-medium">{$i18n.t('Modelfile Content')}</div>
<textarea
bind:value={modelFileContent}
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"
/>
</div>
</div>
{/if}
<div class=" mt-1 text-xs text-gray-400 dark:text-gray-500">
{$i18n.t('To access the GGUF models available for downloading,')}
<a <a
class=" text-gray-500 dark:text-gray-300 font-medium underline" class=" text-gray-500 dark:text-gray-300 font-medium underline"
href="https://huggingface.co/models?search=gguf" href="https://ollama.com/library"
target="_blank">{$i18n.t('click here.')}</a target="_blank">{$i18n.t('click here.')}</a
> >
</div> </div>
{#if uploadMessage} {#if Object.keys($MODEL_DOWNLOAD_POOL).length > 0}
<div class="mt-2"> {#each Object.keys($MODEL_DOWNLOAD_POOL) as model}
<div class=" mb-2 text-xs">{$i18n.t('Upload Progress')}</div> {#if 'pullProgress' in $MODEL_DOWNLOAD_POOL[model]}
<div class="flex flex-col">
<div class="font-medium mb-1">{model}</div>
<div class="">
<div class="flex flex-row justify-between space-x-4 pr-2">
<div class=" flex-1">
<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: {Math.max(
15,
$MODEL_DOWNLOAD_POOL[model].pullProgress ?? 0
)}%"
>
{$MODEL_DOWNLOAD_POOL[model].pullProgress ?? 0}%
</div>
</div>
<div class="w-full rounded-full dark:bg-gray-800"> <Tooltip content={$i18n.t('Cancel')}>
<div <button
class="dark:bg-gray-600 bg-gray-500 text-xs font-medium text-gray-100 text-center p-0.5 leading-none rounded-full" class="text-gray-800 dark:text-gray-100"
style="width: 100%" on:click={() => {
> cancelModelPullHandler(model);
{uploadMessage} }}
>
<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 $MODEL_DOWNLOAD_POOL[model]}
<div class="mt-1 text-xs dark:text-gray-500" style="font-size: 0.5rem;">
{$MODEL_DOWNLOAD_POOL[model].digest}
</div>
{/if}
</div>
</div> </div>
</div> {/if}
<div class="mt-1 text-xs dark:text-gray-500" style="font-size: 0.5rem;"> {/each}
{modelFileDigest}
</div>
</div>
{:else if uploadProgress !== null}
<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: {Math.max(15, uploadProgress ?? 0)}%"
>
{uploadProgress ?? 0}%
</div>
</div>
<div class="mt-1 text-xs dark:text-gray-500" style="font-size: 0.5rem;">
{modelFileDigest}
</div>
</div>
{/if} {/if}
</form> </div>
{/if}
<div>
<div class=" mb-2 text-sm font-medium">{$i18n.t('Delete a model')}</div>
<div class="flex w-full">
<div class="flex-1 mr-2">
<select
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
bind:value={deleteModelTag}
placeholder={$i18n.t('Select a model')}
>
{#if !deleteModelTag}
<option value="" disabled selected>{$i18n.t('Select a model')}</option>
{/if}
{#each $models.filter((m) => !(m?.preset ?? false) && m.owned_by === 'ollama' && (selectedOllamaUrlIdx === null ? true : (m?.ollama?.urls ?? []).includes(selectedOllamaUrlIdx))) as model}
<option value={model.name} class="bg-gray-100 dark:bg-gray-700"
>{model.name +
' (' +
(model.ollama.size / 1024 ** 3).toFixed(1) +
' GB)'}</option
>
{/each}
</select>
</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"
on:click={() => {
deleteModelHandler();
}}
>
<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="M5 3.25V4H2.75a.75.75 0 0 0 0 1.5h.3l.815 8.15A1.5 1.5 0 0 0 5.357 15h5.285a1.5 1.5 0 0 0 1.493-1.35l.815-8.15h.3a.75.75 0 0 0 0-1.5H11v-.75A2.25 2.25 0 0 0 8.75 1h-1.5A2.25 2.25 0 0 0 5 3.25Zm2.25-.75a.75.75 0 0 0-.75.75V4h3v-.75a.75.75 0 0 0-.75-.75h-1.5ZM6.05 6a.75.75 0 0 1 .787.713l.275 5.5a.75.75 0 0 1-1.498.075l-.275-5.5A.75.75 0 0 1 6.05 6Zm3.9 0a.75.75 0 0 1 .712.787l-.275 5.5a.75.75 0 0 1-1.498-.075l.275-5.5a.75.75 0 0 1 .786-.711Z"
clip-rule="evenodd"
/>
</svg>
</button>
</div>
</div>
<div class="pt-1">
<div class="flex justify-between items-center text-xs">
<div class=" text-sm font-medium">{$i18n.t('Experimental')}</div>
<button
class=" text-xs font-medium text-gray-500"
type="button"
on:click={() => {
showExperimentalOllama = !showExperimentalOllama;
}}>{showExperimentalOllama ? $i18n.t('Hide') : $i18n.t('Show')}</button
>
</div>
</div>
{#if showExperimentalOllama}
<form
on:submit|preventDefault={() => {
uploadModelHandler();
}}
>
<div class=" mb-2 flex w-full justify-between">
<div class=" text-sm font-medium">{$i18n.t('Upload a GGUF model')}</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
on:click={() => {
if (modelUploadMode === 'file') {
modelUploadMode = 'url';
} else {
modelUploadMode = 'file';
}
}}
type="button"
>
{#if modelUploadMode === 'file'}
<span class="ml-2 self-center">{$i18n.t('File Mode')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('URL Mode')}</span>
{/if}
</button>
</div>
<div class="flex w-full mb-1.5">
<div class="flex flex-col w-full">
{#if modelUploadMode === 'file'}
<div
class="flex-1 {modelInputFile && modelInputFile.length > 0 ? 'mr-2' : ''}"
>
<input
id="model-upload-input"
bind:this={modelUploadInputElement}
type="file"
bind:files={modelInputFile}
on:change={() => {
console.log(modelInputFile);
}}
accept=".gguf,.safetensors"
required
hidden
/>
<button
type="button"
class="w-full rounded-lg text-left py-2 px-4 bg-white dark:text-gray-300 dark:bg-gray-850"
on:click={() => {
modelUploadInputElement.click();
}}
>
{#if modelInputFile && modelInputFile.length > 0}
{modelInputFile[0].name}
{:else}
{$i18n.t('Click here to select')}
{/if}
</button>
</div>
{:else}
<div class="flex-1 {modelFileUrl !== '' ? 'mr-2' : ''}">
<input
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'
: ''}"
type="url"
required
bind:value={modelFileUrl}
placeholder={$i18n.t('Type Hugging Face Resolve (Download) URL')}
/>
</div>
{/if}
</div>
{#if (modelUploadMode === 'file' && modelInputFile && modelInputFile.length > 0) || (modelUploadMode === 'url' && modelFileUrl !== '')}
<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 disabled:cursor-not-allowed transition"
type="submit"
disabled={modelTransferring}
>
{#if modelTransferring}
<div class="self-center">
<svg
class=" w-4 h-4"
viewBox="0 0 24 24"
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
>
<style>
.spinner_ajPY {
transform-origin: center;
animation: spinner_AtaB 0.75s infinite linear;
}
@keyframes spinner_AtaB {
100% {
transform: rotate(360deg);
}
}
</style>
<path
d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
opacity=".25"
/>
<path
d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
class="spinner_ajPY"
/>
</svg>
</div>
{:else}
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="w-4 h-4"
>
<path
d="M7.25 10.25a.75.75 0 0 0 1.5 0V4.56l2.22 2.22a.75.75 0 1 0 1.06-1.06l-3.5-3.5a.75.75 0 0 0-1.06 0l-3.5 3.5a.75.75 0 0 0 1.06 1.06l2.22-2.22v5.69Z"
/>
<path
d="M3.5 9.75a.75.75 0 0 0-1.5 0v1.5A2.75 2.75 0 0 0 4.75 14h6.5A2.75 2.75 0 0 0 14 11.25v-1.5a.75.75 0 0 0-1.5 0v1.5c0 .69-.56 1.25-1.25 1.25h-6.5c-.69 0-1.25-.56-1.25-1.25v-1.5Z"
/>
</svg>
{/if}
</button>
{/if}
</div>
{#if (modelUploadMode === 'file' && modelInputFile && modelInputFile.length > 0) || (modelUploadMode === 'url' && modelFileUrl !== '')}
<div>
<div>
<div class=" my-2.5 text-sm font-medium">{$i18n.t('Modelfile Content')}</div>
<textarea
bind:value={modelFileContent}
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"
/>
</div>
</div>
{/if}
<div class=" mt-1 text-xs text-gray-400 dark:text-gray-500">
{$i18n.t('To access the GGUF models available for downloading,')}
<a
class=" text-gray-500 dark:text-gray-300 font-medium underline"
href="https://huggingface.co/models?search=gguf"
target="_blank">{$i18n.t('click here.')}</a
>
</div>
{#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=" 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: {Math.max(15, uploadProgress ?? 0)}%"
>
{uploadProgress ?? 0}%
</div>
</div>
<div class="mt-1 text-xs dark:text-gray-500" style="font-size: 0.5rem;">
{modelFileDigest}
</div>
</div>
{/if}
</form>
{/if}
</div>
</div> </div>
</div> {:else if ollamaVersion === false}
{:else if ollamaVersion === false} <div>Ollama Not Detected</div>
<div>Ollama Not Detected</div> {:else}
<div class="flex h-full justify-center">
<div class="my-auto">
<Spinner className="size-6" />
</div>
</div>
{/if}
{:else if ollamaEnabled === false}
<div>Ollama API is disabled</div>
{:else} {:else}
<div class="flex h-full justify-center"> <div class="flex h-full justify-center">
<div class="my-auto"> <div class="my-auto">
@@ -0,0 +1,19 @@
<script lang="ts">
export let className = 'size-4';
export let strokeWidth = '1.5';
</script>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width={strokeWidth}
stroke="currentColor"
class={className}
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3"
/>
</svg>
@@ -126,6 +126,13 @@
saveAs(blob, `models-export-${Date.now()}.json`); saveAs(blob, `models-export-${Date.now()}.json`);
}; };
const exportModelHandler = async (model) => {
let blob = new Blob([JSON.stringify([model])], {
type: 'application/json'
});
saveAs(blob, `${model.id}-${Date.now()}.json`);
};
const positionChangeHanlder = async () => { const positionChangeHanlder = async () => {
// Get the new order of the models // Get the new order of the models
const modelIds = Array.from(document.getElementById('model-list').children).map((child) => const modelIds = Array.from(document.getElementById('model-list').children).map((child) =>
@@ -322,6 +329,9 @@
cloneHandler={() => { cloneHandler={() => {
cloneModelHandler(model); cloneModelHandler(model);
}} }}
exportHandler={() => {
exportModelHandler(model);
}}
hideHandler={() => { hideHandler={() => {
hideModelHandler(model); hideModelHandler(model);
}} }}
@@ -11,6 +11,7 @@
import Share from '$lib/components/icons/Share.svelte'; import Share from '$lib/components/icons/Share.svelte';
import ArchiveBox from '$lib/components/icons/ArchiveBox.svelte'; import ArchiveBox from '$lib/components/icons/ArchiveBox.svelte';
import DocumentDuplicate from '$lib/components/icons/DocumentDuplicate.svelte'; import DocumentDuplicate from '$lib/components/icons/DocumentDuplicate.svelte';
import ArrowDownTray from '$lib/components/icons/ArrowDownTray.svelte';
const i18n = getContext('i18n'); const i18n = getContext('i18n');
@@ -18,6 +19,8 @@
export let shareHandler: Function; export let shareHandler: Function;
export let cloneHandler: Function; export let cloneHandler: Function;
export let exportHandler: Function;
export let hideHandler: Function; export let hideHandler: Function;
export let deleteHandler: Function; export let deleteHandler: Function;
export let onClose: Function; export let onClose: Function;
@@ -66,6 +69,17 @@
<div class="flex items-center">{$i18n.t('Clone')}</div> <div class="flex items-center">{$i18n.t('Clone')}</div>
</DropdownMenu.Item> </DropdownMenu.Item>
<DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
on:click={() => {
exportHandler();
}}
>
<ArrowDownTray />
<div class="flex items-center">{$i18n.t('Export')}</div>
</DropdownMenu.Item>
<DropdownMenu.Item <DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md" class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
on:click={() => { on:click={() => {
+1 -13
View File
@@ -8,7 +8,7 @@
import { OLLAMA_API_BASE_URL, OPENAI_API_BASE_URL, WEBUI_API_BASE_URL } from '$lib/constants'; import { OLLAMA_API_BASE_URL, OPENAI_API_BASE_URL, WEBUI_API_BASE_URL } from '$lib/constants';
import { WEBUI_NAME, config, user, models, settings } from '$lib/stores'; import { WEBUI_NAME, config, user, models, settings } from '$lib/stores';
import { cancelOllamaRequest, generateChatCompletion } from '$lib/apis/ollama'; import { 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';
@@ -24,7 +24,6 @@
let selectedModelId = ''; let selectedModelId = '';
let loading = false; let loading = false;
let currentRequestId = null;
let stopResponseFlag = false; let stopResponseFlag = false;
let messagesContainerElement: HTMLDivElement; let messagesContainerElement: HTMLDivElement;
@@ -46,14 +45,6 @@
} }
}; };
// const cancelHandler = async () => {
// if (currentRequestId) {
// const res = await cancelOllamaRequest(localStorage.token, currentRequestId);
// currentRequestId = null;
// loading = false;
// }
// };
const stopResponse = () => { const stopResponse = () => {
stopResponseFlag = true; stopResponseFlag = true;
console.log('stopResponse'); console.log('stopResponse');
@@ -171,8 +162,6 @@
if (stopResponseFlag) { if (stopResponseFlag) {
controller.abort('User: Stop Response'); controller.abort('User: Stop Response');
} }
currentRequestId = null;
break; break;
} }
@@ -229,7 +218,6 @@
loading = false; loading = false;
stopResponseFlag = false; stopResponseFlag = false;
currentRequestId = null;
} }
}; };
@@ -204,6 +204,7 @@
"Enter Your Role": "أدخل الصلاحيات", "Enter Your Role": "أدخل الصلاحيات",
"Error": "", "Error": "",
"Experimental": "تجريبي", "Experimental": "تجريبي",
"Export": "",
"Export All Chats (All Users)": "تصدير جميع الدردشات (جميع المستخدمين)", "Export All Chats (All Users)": "تصدير جميع الدردشات (جميع المستخدمين)",
"Export Chats": "تصدير جميع الدردشات", "Export Chats": "تصدير جميع الدردشات",
"Export Documents Mapping": "تصدير وثائق الخرائط", "Export Documents Mapping": "تصدير وثائق الخرائط",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "ملاحظة: إذا قمت بتعيين الحد الأدنى من النقاط، فلن يؤدي البحث إلا إلى إرجاع المستندات التي لها نقاط أكبر من أو تساوي الحد الأدنى من النقاط.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "ملاحظة: إذا قمت بتعيين الحد الأدنى من النقاط، فلن يؤدي البحث إلا إلى إرجاع المستندات التي لها نقاط أكبر من أو تساوي الحد الأدنى من النقاط.",
"Notifications": "إشعارات", "Notifications": "إشعارات",
"November": "نوفمبر", "November": "نوفمبر",
"num_thread (Ollama)": "",
"October": "اكتوبر", "October": "اكتوبر",
"Off": "أغلاق", "Off": "أغلاق",
"Okay, Let's Go!": "حسنا دعنا نذهب!", "Okay, Let's Go!": "حسنا دعنا نذهب!",
"OLED Dark": "OLED داكن", "OLED Dark": "OLED داكن",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Ollama الاصدار", "Ollama Version": "Ollama الاصدار",
"On": "تشغيل", "On": "تشغيل",
"Only": "فقط", "Only": "فقط",
@@ -497,6 +500,8 @@
"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 أستخدم",
"Use Initials": "Initials أستخدم", "Use Initials": "Initials أستخدم",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "مستخدم", "user": "مستخدم",
"User Permissions": "صلاحيات المستخدم", "User Permissions": "صلاحيات المستخدم",
"Users": "المستخدمين", "Users": "المستخدمين",
@@ -204,6 +204,7 @@
"Enter Your Role": "Въведете вашата роля", "Enter Your Role": "Въведете вашата роля",
"Error": "", "Error": "",
"Experimental": "Експериментално", "Experimental": "Експериментално",
"Export": "",
"Export All Chats (All Users)": "Експортване на всички чатове (За всички потребители)", "Export All Chats (All Users)": "Експортване на всички чатове (За всички потребители)",
"Export Chats": "Експортване на чатове", "Export Chats": "Експортване на чатове",
"Export Documents Mapping": "Експортване на документен мапинг", "Export Documents Mapping": "Експортване на документен мапинг",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Забележка: Ако зададете минимален резултат, търсенето ще върне само документи с резултат, по-голям или равен на минималния резултат.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Забележка: Ако зададете минимален резултат, търсенето ще върне само документи с резултат, по-голям или равен на минималния резултат.",
"Notifications": "Десктоп Известия", "Notifications": "Десктоп Известия",
"November": "Ноември", "November": "Ноември",
"num_thread (Ollama)": "",
"October": "Октомври", "October": "Октомври",
"Off": "Изкл.", "Off": "Изкл.",
"Okay, Let's Go!": "ОК, Нека започваме!", "Okay, Let's Go!": "ОК, Нека започваме!",
"OLED Dark": "OLED тъмно", "OLED Dark": "OLED тъмно",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Ollama Версия", "Ollama Version": "Ollama Версия",
"On": "Вкл.", "On": "Вкл.",
"Only": "Само", "Only": "Само",
@@ -493,6 +496,8 @@
"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",
"Use Initials": "Използвайте Инициали", "Use Initials": "Използвайте Инициали",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "потребител", "user": "потребител",
"User Permissions": "Права на потребителя", "User Permissions": "Права на потребителя",
"Users": "Потребители", "Users": "Потребители",
@@ -204,6 +204,7 @@
"Enter Your Role": "আপনার রোল লিখুন", "Enter Your Role": "আপনার রোল লিখুন",
"Error": "", "Error": "",
"Experimental": "পরিক্ষামূলক", "Experimental": "পরিক্ষামূলক",
"Export": "",
"Export All Chats (All Users)": "সব চ্যাট এক্সপোর্ট করুন (সব ইউজারের)", "Export All Chats (All Users)": "সব চ্যাট এক্সপোর্ট করুন (সব ইউজারের)",
"Export Chats": "চ্যাটগুলো এক্সপোর্ট করুন", "Export Chats": "চ্যাটগুলো এক্সপোর্ট করুন",
"Export Documents Mapping": "ডকুমেন্টসমূহ ম্যাপিং এক্সপোর্ট করুন", "Export Documents Mapping": "ডকুমেন্টসমূহ ম্যাপিং এক্সপোর্ট করুন",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "দ্রষ্টব্য: আপনি যদি ন্যূনতম স্কোর সেট করেন তবে অনুসন্ধানটি কেবলমাত্র ন্যূনতম স্কোরের চেয়ে বেশি বা সমান স্কোর সহ নথিগুলি ফেরত দেবে।", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "দ্রষ্টব্য: আপনি যদি ন্যূনতম স্কোর সেট করেন তবে অনুসন্ধানটি কেবলমাত্র ন্যূনতম স্কোরের চেয়ে বেশি বা সমান স্কোর সহ নথিগুলি ফেরত দেবে।",
"Notifications": "নোটিফিকেশনসমূহ", "Notifications": "নোটিফিকেশনসমূহ",
"November": "নভেম্বর", "November": "নভেম্বর",
"num_thread (Ollama)": "",
"October": "অক্টোবর", "October": "অক্টোবর",
"Off": "বন্ধ", "Off": "বন্ধ",
"Okay, Let's Go!": "ঠিক আছে, চলুন যাই!", "Okay, Let's Go!": "ঠিক আছে, চলুন যাই!",
"OLED Dark": "OLED ডার্ক", "OLED Dark": "OLED ডার্ক",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Ollama ভার্সন", "Ollama Version": "Ollama ভার্সন",
"On": "চালু", "On": "চালু",
"Only": "শুধুমাত্র", "Only": "শুধুমাত্র",
@@ -493,6 +496,8 @@
"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 ব্যবহার করুন",
"Use Initials": "নামের আদ্যক্ষর ব্যবহার করুন", "Use Initials": "নামের আদ্যক্ষর ব্যবহার করুন",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "ব্যবহারকারী", "user": "ব্যবহারকারী",
"User Permissions": "ইউজার পারমিশনসমূহ", "User Permissions": "ইউজার পারমিশনসমূহ",
"Users": "ব্যাবহারকারীগণ", "Users": "ব্যাবহারকারীগণ",
@@ -204,6 +204,7 @@
"Enter Your Role": "Introdueix el Teu Ròl", "Enter Your Role": "Introdueix el Teu Ròl",
"Error": "", "Error": "",
"Experimental": "Experimental", "Experimental": "Experimental",
"Export": "",
"Export All Chats (All Users)": "Exporta Tots els Xats (Tots els Usuaris)", "Export All Chats (All Users)": "Exporta Tots els Xats (Tots els Usuaris)",
"Export Chats": "Exporta Xats", "Export Chats": "Exporta Xats",
"Export Documents Mapping": "Exporta el Mapatge de Documents", "Export Documents Mapping": "Exporta el Mapatge de Documents",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Si establiscs una puntuació mínima, la cerca només retornarà documents amb una puntuació major o igual a la puntuació mínima.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Si establiscs una puntuació mínima, la cerca només retornarà documents amb una puntuació major o igual a la puntuació mínima.",
"Notifications": "Notificacions d'Escriptori", "Notifications": "Notificacions d'Escriptori",
"November": "Novembre", "November": "Novembre",
"num_thread (Ollama)": "",
"October": "Octubre", "October": "Octubre",
"Off": "Desactivat", "Off": "Desactivat",
"Okay, Let's Go!": "D'acord, Anem!", "Okay, Let's Go!": "D'acord, Anem!",
"OLED Dark": "OLED Fosc", "OLED Dark": "OLED Fosc",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Versió d'Ollama", "Ollama Version": "Versió d'Ollama",
"On": "Activat", "On": "Activat",
"Only": "Només", "Only": "Només",
@@ -494,6 +497,8 @@
"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 '#' 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", "Use Gravatar": "Utilitza Gravatar",
"Use Initials": "Utilitza Inicials", "Use Initials": "Utilitza Inicials",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "usuari", "user": "usuari",
"User Permissions": "Permisos d'Usuari", "User Permissions": "Permisos d'Usuari",
"Users": "Usuaris", "Users": "Usuaris",
@@ -204,6 +204,7 @@
"Enter Your Role": "", "Enter Your Role": "",
"Error": "", "Error": "",
"Experimental": "Eksperimento", "Experimental": "Eksperimento",
"Export": "",
"Export All Chats (All Users)": "I-export ang tanan nga mga chat (Tanan nga tiggamit)", "Export All Chats (All Users)": "I-export ang tanan nga mga chat (Tanan nga tiggamit)",
"Export Chats": "I-export ang mga chat", "Export Chats": "I-export ang mga chat",
"Export Documents Mapping": "I-export ang pagmapa sa dokumento", "Export Documents Mapping": "I-export ang pagmapa sa dokumento",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
"Notifications": "Mga pahibalo sa desktop", "Notifications": "Mga pahibalo sa desktop",
"November": "", "November": "",
"num_thread (Ollama)": "",
"October": "", "October": "",
"Off": "Napuo", "Off": "Napuo",
"Okay, Let's Go!": "Okay, lakaw na!", "Okay, Let's Go!": "Okay, lakaw na!",
"OLED Dark": "", "OLED Dark": "",
"Ollama": "", "Ollama": "",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Ollama nga bersyon", "Ollama Version": "Ollama nga bersyon",
"On": "Gipaandar", "On": "Gipaandar",
"Only": "Lamang", "Only": "Lamang",
@@ -493,6 +496,8 @@
"Use '#' in the prompt input to load and select your documents.": "Gamita ang '#' sa dali nga pagsulod aron makarga ug mapili ang imong mga dokumento.", "Use '#' in the prompt input to load and select your documents.": "Gamita ang '#' sa dali nga pagsulod aron makarga ug mapili ang imong mga dokumento.",
"Use Gravatar": "Paggamit sa Gravatar", "Use Gravatar": "Paggamit sa Gravatar",
"Use Initials": "", "Use Initials": "",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "tiggamit", "user": "tiggamit",
"User Permissions": "Mga permiso sa tiggamit", "User Permissions": "Mga permiso sa tiggamit",
"Users": "Mga tiggamit", "Users": "Mga tiggamit",
@@ -204,6 +204,7 @@
"Enter Your Role": "Gebe deine Rolle ein", "Enter Your Role": "Gebe deine Rolle ein",
"Error": "", "Error": "",
"Experimental": "Experimentell", "Experimental": "Experimentell",
"Export": "",
"Export All Chats (All Users)": "Alle Chats exportieren (alle Benutzer)", "Export All Chats (All Users)": "Alle Chats exportieren (alle Benutzer)",
"Export Chats": "Chats exportieren", "Export Chats": "Chats exportieren",
"Export Documents Mapping": "Dokumentenmapping exportieren", "Export Documents Mapping": "Dokumentenmapping exportieren",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Hinweis: Wenn du einen Mindestscore festlegst, wird die Suche nur Dokumente zurückgeben, deren Score größer oder gleich dem Mindestscore ist.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Hinweis: Wenn du einen Mindestscore festlegst, wird die Suche nur Dokumente zurückgeben, deren Score größer oder gleich dem Mindestscore ist.",
"Notifications": "Desktop-Benachrichtigungen", "Notifications": "Desktop-Benachrichtigungen",
"November": "November", "November": "November",
"num_thread (Ollama)": "",
"October": "Oktober", "October": "Oktober",
"Off": "Aus", "Off": "Aus",
"Okay, Let's Go!": "Okay, los geht's!", "Okay, Let's Go!": "Okay, los geht's!",
"OLED Dark": "OLED Dunkel", "OLED Dark": "OLED Dunkel",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Ollama-Version", "Ollama Version": "Ollama-Version",
"On": "Ein", "On": "Ein",
"Only": "Nur", "Only": "Nur",
@@ -493,6 +496,8 @@
"Use '#' in the prompt input to load and select your documents.": "Verwende '#' in der Prompt-Eingabe, um deine Dokumente zu laden und auszuwählen.", "Use '#' in the prompt input to load and select your documents.": "Verwende '#' in der Prompt-Eingabe, um deine Dokumente zu laden und auszuwählen.",
"Use Gravatar": "Gravatar verwenden", "Use Gravatar": "Gravatar verwenden",
"Use Initials": "Initialen verwenden", "Use Initials": "Initialen verwenden",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "Benutzer", "user": "Benutzer",
"User Permissions": "Benutzerberechtigungen", "User Permissions": "Benutzerberechtigungen",
"Users": "Benutzer", "Users": "Benutzer",
@@ -204,6 +204,7 @@
"Enter Your Role": "", "Enter Your Role": "",
"Error": "", "Error": "",
"Experimental": "Much Experiment", "Experimental": "Much Experiment",
"Export": "",
"Export All Chats (All Users)": "Export All Chats (All Doggos)", "Export All Chats (All Users)": "Export All Chats (All Doggos)",
"Export Chats": "Export Barks", "Export Chats": "Export Barks",
"Export Documents Mapping": "Export Mappings of Dogos", "Export Documents Mapping": "Export Mappings of Dogos",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
"Notifications": "Notifications", "Notifications": "Notifications",
"November": "", "November": "",
"num_thread (Ollama)": "",
"October": "", "October": "",
"Off": "Off", "Off": "Off",
"Okay, Let's Go!": "Okay, Let's Go!", "Okay, Let's Go!": "Okay, Let's Go!",
"OLED Dark": "OLED Dark", "OLED Dark": "OLED Dark",
"Ollama": "", "Ollama": "",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Ollama Version", "Ollama Version": "Ollama Version",
"On": "On", "On": "On",
"Only": "Only", "Only": "Only",
@@ -493,6 +496,8 @@
"Use '#' in the prompt input to load and select your documents.": "Use '#' in the prompt input to load and select your documents. Much use.", "Use '#' in the prompt input to load and select your documents.": "Use '#' in the prompt input to load and select your documents. Much use.",
"Use Gravatar": "Use Gravatar much avatar", "Use Gravatar": "Use Gravatar much avatar",
"Use Initials": "Use Initials much initial", "Use Initials": "Use Initials much initial",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "user much user", "user": "user much user",
"User Permissions": "User Permissions much permissions", "User Permissions": "User Permissions much permissions",
"Users": "Users much users", "Users": "Users much users",
@@ -204,6 +204,7 @@
"Enter Your Role": "", "Enter Your Role": "",
"Error": "", "Error": "",
"Experimental": "", "Experimental": "",
"Export": "",
"Export All Chats (All Users)": "", "Export All Chats (All Users)": "",
"Export Chats": "", "Export Chats": "",
"Export Documents Mapping": "", "Export Documents Mapping": "",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
"Notifications": "", "Notifications": "",
"November": "", "November": "",
"num_thread (Ollama)": "",
"October": "", "October": "",
"Off": "", "Off": "",
"Okay, Let's Go!": "", "Okay, Let's Go!": "",
"OLED Dark": "", "OLED Dark": "",
"Ollama": "", "Ollama": "",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "", "Ollama Version": "",
"On": "", "On": "",
"Only": "", "Only": "",
@@ -493,6 +496,8 @@
"Use '#' in the prompt input to load and select your documents.": "", "Use '#' in the prompt input to load and select your documents.": "",
"Use Gravatar": "", "Use Gravatar": "",
"Use Initials": "", "Use Initials": "",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "", "user": "",
"User Permissions": "", "User Permissions": "",
"Users": "", "Users": "",
@@ -204,6 +204,7 @@
"Enter Your Role": "", "Enter Your Role": "",
"Error": "", "Error": "",
"Experimental": "", "Experimental": "",
"Export": "",
"Export All Chats (All Users)": "", "Export All Chats (All Users)": "",
"Export Chats": "", "Export Chats": "",
"Export Documents Mapping": "", "Export Documents Mapping": "",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
"Notifications": "", "Notifications": "",
"November": "", "November": "",
"num_thread (Ollama)": "",
"October": "", "October": "",
"Off": "", "Off": "",
"Okay, Let's Go!": "", "Okay, Let's Go!": "",
"OLED Dark": "", "OLED Dark": "",
"Ollama": "", "Ollama": "",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "", "Ollama Version": "",
"On": "", "On": "",
"Only": "", "Only": "",
@@ -493,6 +496,8 @@
"Use '#' in the prompt input to load and select your documents.": "", "Use '#' in the prompt input to load and select your documents.": "",
"Use Gravatar": "", "Use Gravatar": "",
"Use Initials": "", "Use Initials": "",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "", "user": "",
"User Permissions": "", "User Permissions": "",
"Users": "", "Users": "",
@@ -204,6 +204,7 @@
"Enter Your Role": "Ingrese su rol", "Enter Your Role": "Ingrese su rol",
"Error": "", "Error": "",
"Experimental": "Experimental", "Experimental": "Experimental",
"Export": "",
"Export All Chats (All Users)": "Exportar todos los chats (Todos los usuarios)", "Export All Chats (All Users)": "Exportar todos los chats (Todos los usuarios)",
"Export Chats": "Exportar Chats", "Export Chats": "Exportar Chats",
"Export Documents Mapping": "Exportar el mapeo de documentos", "Export Documents Mapping": "Exportar el mapeo de documentos",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Si estableces una puntuación mínima, la búsqueda sólo devolverá documentos con una puntuación mayor o igual a la puntuación mínima.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Si estableces una puntuación mínima, la búsqueda sólo devolverá documentos con una puntuación mayor o igual a la puntuación mínima.",
"Notifications": "Notificaciones", "Notifications": "Notificaciones",
"November": "Noviembre", "November": "Noviembre",
"num_thread (Ollama)": "",
"October": "Octubre", "October": "Octubre",
"Off": "Desactivado", "Off": "Desactivado",
"Okay, Let's Go!": "Bien, ¡Vamos!", "Okay, Let's Go!": "Bien, ¡Vamos!",
"OLED Dark": "OLED oscuro", "OLED Dark": "OLED oscuro",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Versión de Ollama", "Ollama Version": "Versión de Ollama",
"On": "Activado", "On": "Activado",
"Only": "Solamente", "Only": "Solamente",
@@ -494,6 +497,8 @@
"Use '#' in the prompt input to load and select your documents.": "Utilice '#' en el prompt para cargar y seleccionar sus documentos.", "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", "Use Gravatar": "Usar Gravatar",
"Use Initials": "Usar Iniciales", "Use Initials": "Usar Iniciales",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "usuario", "user": "usuario",
"User Permissions": "Permisos de usuario", "User Permissions": "Permisos de usuario",
"Users": "Usuarios", "Users": "Usuarios",
@@ -204,6 +204,7 @@
"Enter Your Role": "نقش خود را وارد کنید", "Enter Your Role": "نقش خود را وارد کنید",
"Error": "", "Error": "",
"Experimental": "آزمایشی", "Experimental": "آزمایشی",
"Export": "",
"Export All Chats (All Users)": "اکسپورت از همه گپ\u200cها(همه کاربران)", "Export All Chats (All Users)": "اکسپورت از همه گپ\u200cها(همه کاربران)",
"Export Chats": "اکسپورت از گپ\u200cها", "Export Chats": "اکسپورت از گپ\u200cها",
"Export Documents Mapping": "اکسپورت از نگاشت اسناد", "Export Documents Mapping": "اکسپورت از نگاشت اسناد",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
"Notifications": "اعلان", "Notifications": "اعلان",
"November": "نوامبر", "November": "نوامبر",
"num_thread (Ollama)": "",
"October": "اکتبر", "October": "اکتبر",
"Off": "خاموش", "Off": "خاموش",
"Okay, Let's Go!": "باشه، بزن بریم!", "Okay, Let's Go!": "باشه، بزن بریم!",
"OLED Dark": "OLED تیره", "OLED Dark": "OLED تیره",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "نسخه اولاما", "Ollama Version": "نسخه اولاما",
"On": "روشن", "On": "روشن",
"Only": "فقط", "Only": "فقط",
@@ -493,6 +496,8 @@
"Use '#' in the prompt input to load and select your documents.": "در پرامپت از '#' برای لود و انتخاب اسناد خود استفاده کنید.", "Use '#' in the prompt input to load and select your documents.": "در پرامپت از '#' برای لود و انتخاب اسناد خود استفاده کنید.",
"Use Gravatar": "استفاده از گراواتار", "Use Gravatar": "استفاده از گراواتار",
"Use Initials": "استفاده از آبزوده", "Use Initials": "استفاده از آبزوده",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "کاربر", "user": "کاربر",
"User Permissions": "مجوزهای کاربر", "User Permissions": "مجوزهای کاربر",
"Users": "کاربران", "Users": "کاربران",
@@ -204,6 +204,7 @@
"Enter Your Role": "Syötä roolisi", "Enter Your Role": "Syötä roolisi",
"Error": "", "Error": "",
"Experimental": "Kokeellinen", "Experimental": "Kokeellinen",
"Export": "",
"Export All Chats (All Users)": "Vie kaikki keskustelut (kaikki käyttäjät)", "Export All Chats (All Users)": "Vie kaikki keskustelut (kaikki käyttäjät)",
"Export Chats": "Vie keskustelut", "Export Chats": "Vie keskustelut",
"Export Documents Mapping": "Vie asiakirjakartoitus", "Export Documents Mapping": "Vie asiakirjakartoitus",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Huom: Jos asetat vähimmäispisteet, haku palauttaa vain asiakirjat, joiden pisteet ovat suurempia tai yhtä suuria kuin vähimmäispistemäärä.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Huom: Jos asetat vähimmäispisteet, haku palauttaa vain asiakirjat, joiden pisteet ovat suurempia tai yhtä suuria kuin vähimmäispistemäärä.",
"Notifications": "Ilmoitukset", "Notifications": "Ilmoitukset",
"November": "marraskuu", "November": "marraskuu",
"num_thread (Ollama)": "",
"October": "lokakuu", "October": "lokakuu",
"Off": "Pois", "Off": "Pois",
"Okay, Let's Go!": "Eikun menoksi!", "Okay, Let's Go!": "Eikun menoksi!",
"OLED Dark": "OLED-tumma", "OLED Dark": "OLED-tumma",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Ollama-versio", "Ollama Version": "Ollama-versio",
"On": "Päällä", "On": "Päällä",
"Only": "Vain", "Only": "Vain",
@@ -493,6 +496,8 @@
"Use '#' in the prompt input to load and select your documents.": "Käytä '#' syötteessä ladataksesi ja valitaksesi asiakirjoja.", "Use '#' in the prompt input to load and select your documents.": "Käytä '#' syötteessä ladataksesi ja valitaksesi asiakirjoja.",
"Use Gravatar": "Käytä Gravataria", "Use Gravatar": "Käytä Gravataria",
"Use Initials": "Käytä alkukirjaimia", "Use Initials": "Käytä alkukirjaimia",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "käyttäjä", "user": "käyttäjä",
"User Permissions": "Käyttäjäoikeudet", "User Permissions": "Käyttäjäoikeudet",
"Users": "Käyttäjät", "Users": "Käyttäjät",
@@ -204,6 +204,7 @@
"Enter Your Role": "Entrez votre rôle", "Enter Your Role": "Entrez votre rôle",
"Error": "", "Error": "",
"Experimental": "Expérimental", "Experimental": "Expérimental",
"Export": "",
"Export All Chats (All Users)": "Exporter toutes les discussions (Tous les utilisateurs)", "Export All Chats (All Users)": "Exporter toutes les discussions (Tous les utilisateurs)",
"Export Chats": "Exporter les discussions", "Export Chats": "Exporter les discussions",
"Export Documents Mapping": "Exporter le mappage des documents", "Export Documents Mapping": "Exporter le mappage des documents",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Note: Si vous définissez un score minimum, la recherche ne retournera que les documents avec un score supérieur ou égal au score minimum.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Note: Si vous définissez un score minimum, la recherche ne retournera que les documents avec un score supérieur ou égal au score minimum.",
"Notifications": "Notifications de bureau", "Notifications": "Notifications de bureau",
"November": "Novembre", "November": "Novembre",
"num_thread (Ollama)": "",
"October": "Octobre", "October": "Octobre",
"Off": "Éteint", "Off": "Éteint",
"Okay, Let's Go!": "Okay, Allons-y !", "Okay, Let's Go!": "Okay, Allons-y !",
"OLED Dark": "OLED Sombre", "OLED Dark": "OLED Sombre",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Version Ollama", "Ollama Version": "Version Ollama",
"On": "Activé", "On": "Activé",
"Only": "Seulement", "Only": "Seulement",
@@ -494,6 +497,8 @@
"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 '#' 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", "Use Gravatar": "Utiliser Gravatar",
"Use Initials": "Utiliser les Initiales", "Use Initials": "Utiliser les Initiales",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "utilisateur", "user": "utilisateur",
"User Permissions": "Permissions de l'utilisateur", "User Permissions": "Permissions de l'utilisateur",
"Users": "Utilisateurs", "Users": "Utilisateurs",
@@ -204,6 +204,7 @@
"Enter Your Role": "Entrez Votre Rôle", "Enter Your Role": "Entrez Votre Rôle",
"Error": "", "Error": "",
"Experimental": "Expérimental", "Experimental": "Expérimental",
"Export": "",
"Export All Chats (All Users)": "Exporter Tous les Chats (Tous les Utilisateurs)", "Export All Chats (All Users)": "Exporter Tous les Chats (Tous les Utilisateurs)",
"Export Chats": "Exporter les Chats", "Export Chats": "Exporter les Chats",
"Export Documents Mapping": "Exporter la Correspondance des Documents", "Export Documents Mapping": "Exporter la Correspondance des Documents",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Note : Si vous définissez un score minimum, la recherche ne renverra que les documents ayant un score supérieur ou égal au score minimum.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Note : Si vous définissez un score minimum, la recherche ne renverra que les documents ayant un score supérieur ou égal au score minimum.",
"Notifications": "Notifications de bureau", "Notifications": "Notifications de bureau",
"November": "Novembre", "November": "Novembre",
"num_thread (Ollama)": "",
"October": "Octobre", "October": "Octobre",
"Off": "Désactivé", "Off": "Désactivé",
"Okay, Let's Go!": "D'accord, allons-y !", "Okay, Let's Go!": "D'accord, allons-y !",
"OLED Dark": "Sombre OLED", "OLED Dark": "Sombre OLED",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "API Ollama", "Ollama API": "API Ollama",
"Ollama API disabled": "",
"Ollama Version": "Version Ollama", "Ollama Version": "Version Ollama",
"On": "Activé", "On": "Activé",
"Only": "Seulement", "Only": "Seulement",
@@ -494,6 +497,8 @@
"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": "Utiliser Gravatar", "Use Gravatar": "Utiliser Gravatar",
"Use Initials": "Utiliser les Initiales", "Use Initials": "Utiliser les Initiales",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "utilisateur", "user": "utilisateur",
"User Permissions": "Permissions d'utilisateur", "User Permissions": "Permissions d'utilisateur",
"Users": "Utilisateurs", "Users": "Utilisateurs",
@@ -204,6 +204,7 @@
"Enter Your Role": "הזן את התפקיד שלך", "Enter Your Role": "הזן את התפקיד שלך",
"Error": "", "Error": "",
"Experimental": "ניסיוני", "Experimental": "ניסיוני",
"Export": "",
"Export All Chats (All Users)": "ייצוא כל הצ'אטים (כל המשתמשים)", "Export All Chats (All Users)": "ייצוא כל הצ'אטים (כל המשתמשים)",
"Export Chats": "ייצוא צ'אטים", "Export Chats": "ייצוא צ'אטים",
"Export Documents Mapping": "ייצוא מיפוי מסמכים", "Export Documents Mapping": "ייצוא מיפוי מסמכים",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "הערה: אם תקבע ציון מינימלי, החיפוש יחזיר רק מסמכים עם ציון שגבוה או שווה לציון המינימלי.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "הערה: אם תקבע ציון מינימלי, החיפוש יחזיר רק מסמכים עם ציון שגבוה או שווה לציון המינימלי.",
"Notifications": "התראות", "Notifications": "התראות",
"November": "נובמבר", "November": "נובמבר",
"num_thread (Ollama)": "",
"October": "אוקטובר", "October": "אוקטובר",
"Off": "כבוי", "Off": "כבוי",
"Okay, Let's Go!": "בסדר, בואו נתחיל!", "Okay, Let's Go!": "בסדר, בואו נתחיל!",
"OLED Dark": "OLED כהה", "OLED Dark": "OLED כהה",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "גרסת Ollama", "Ollama Version": "גרסת Ollama",
"On": "פועל", "On": "פועל",
"Only": "רק", "Only": "רק",
@@ -494,6 +497,8 @@
"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",
"Use Initials": "שימוש ב initials", "Use Initials": "שימוש ב initials",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "משתמש", "user": "משתמש",
"User Permissions": "הרשאות משתמש", "User Permissions": "הרשאות משתמש",
"Users": "משתמשים", "Users": "משתמשים",
@@ -204,6 +204,7 @@
"Enter Your Role": "अपनी भूमिका दर्ज करें", "Enter Your Role": "अपनी भूमिका दर्ज करें",
"Error": "", "Error": "",
"Experimental": "प्रयोगात्मक", "Experimental": "प्रयोगात्मक",
"Export": "",
"Export All Chats (All Users)": "सभी चैट निर्यात करें (सभी उपयोगकर्ताओं की)", "Export All Chats (All Users)": "सभी चैट निर्यात करें (सभी उपयोगकर्ताओं की)",
"Export Chats": "चैट निर्यात करें", "Export Chats": "चैट निर्यात करें",
"Export Documents Mapping": "निर्यात दस्तावेज़ मैपिंग", "Export Documents Mapping": "निर्यात दस्तावेज़ मैपिंग",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "ध्यान दें: यदि आप न्यूनतम स्कोर निर्धारित करते हैं, तो खोज केवल न्यूनतम स्कोर से अधिक या उसके बराबर स्कोर वाले दस्तावेज़ वापस लाएगी।", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "ध्यान दें: यदि आप न्यूनतम स्कोर निर्धारित करते हैं, तो खोज केवल न्यूनतम स्कोर से अधिक या उसके बराबर स्कोर वाले दस्तावेज़ वापस लाएगी।",
"Notifications": "सूचनाएं", "Notifications": "सूचनाएं",
"November": "नवंबर", "November": "नवंबर",
"num_thread (Ollama)": "",
"October": "अक्टूबर", "October": "अक्टूबर",
"Off": "बंद", "Off": "बंद",
"Okay, Let's Go!": "ठीक है, चलिए चलते हैं!", "Okay, Let's Go!": "ठीक है, चलिए चलते हैं!",
"OLED Dark": "OLEDescuro", "OLED Dark": "OLEDescuro",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Ollama Version", "Ollama Version": "Ollama Version",
"On": "चालू", "On": "चालू",
"Only": "केवल", "Only": "केवल",
@@ -493,6 +496,8 @@
"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 का प्रयोग करें",
"Use Initials": "प्रथमाक्षर का प्रयोग करें", "Use Initials": "प्रथमाक्षर का प्रयोग करें",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "उपयोगकर्ता", "user": "उपयोगकर्ता",
"User Permissions": "उपयोगकर्ता अनुमतियाँ", "User Permissions": "उपयोगकर्ता अनुमतियाँ",
"Users": "उपयोगकर्ताओं", "Users": "उपयोगकर्ताओं",
@@ -204,6 +204,7 @@
"Enter Your Role": "Unesite svoju ulogu", "Enter Your Role": "Unesite svoju ulogu",
"Error": "", "Error": "",
"Experimental": "Eksperimentalno", "Experimental": "Eksperimentalno",
"Export": "",
"Export All Chats (All Users)": "Izvoz svih razgovora (svi korisnici)", "Export All Chats (All Users)": "Izvoz svih razgovora (svi korisnici)",
"Export Chats": "Izvoz razgovora", "Export Chats": "Izvoz razgovora",
"Export Documents Mapping": "Izvoz mapiranja dokumenata", "Export Documents Mapping": "Izvoz mapiranja dokumenata",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Napomena: Ako postavite minimalnu ocjenu, pretraga će vratiti samo dokumente s ocjenom većom ili jednakom minimalnoj ocjeni.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Napomena: Ako postavite minimalnu ocjenu, pretraga će vratiti samo dokumente s ocjenom većom ili jednakom minimalnoj ocjeni.",
"Notifications": "Obavijesti", "Notifications": "Obavijesti",
"November": "Studeni", "November": "Studeni",
"num_thread (Ollama)": "",
"October": "Listopad", "October": "Listopad",
"Off": "Isključeno", "Off": "Isključeno",
"Okay, Let's Go!": "U redu, idemo!", "Okay, Let's Go!": "U redu, idemo!",
"OLED Dark": "OLED Tamno", "OLED Dark": "OLED Tamno",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Ollama verzija", "Ollama Version": "Ollama verzija",
"On": "Uključeno", "On": "Uključeno",
"Only": "Samo", "Only": "Samo",
@@ -494,6 +497,8 @@
"Use '#' in the prompt input to load and select your documents.": "Koristite '#' u unosu prompta za učitavanje i odabir vaših dokumenata.", "Use '#' in the prompt input to load and select your documents.": "Koristite '#' u unosu prompta za učitavanje i odabir vaših dokumenata.",
"Use Gravatar": "Koristi Gravatar", "Use Gravatar": "Koristi Gravatar",
"Use Initials": "Koristi inicijale", "Use Initials": "Koristi inicijale",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "korisnik", "user": "korisnik",
"User Permissions": "Korisnička dopuštenja", "User Permissions": "Korisnička dopuštenja",
"Users": "Korisnici", "Users": "Korisnici",
@@ -204,6 +204,7 @@
"Enter Your Role": "Inserisci il tuo ruolo", "Enter Your Role": "Inserisci il tuo ruolo",
"Error": "", "Error": "",
"Experimental": "Sperimentale", "Experimental": "Sperimentale",
"Export": "",
"Export All Chats (All Users)": "Esporta tutte le chat (tutti gli utenti)", "Export All Chats (All Users)": "Esporta tutte le chat (tutti gli utenti)",
"Export Chats": "Esporta chat", "Export Chats": "Esporta chat",
"Export Documents Mapping": "Esporta mappatura documenti", "Export Documents Mapping": "Esporta mappatura documenti",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: se imposti un punteggio minimo, la ricerca restituirà solo i documenti con un punteggio maggiore o uguale al punteggio minimo.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: se imposti un punteggio minimo, la ricerca restituirà solo i documenti con un punteggio maggiore o uguale al punteggio minimo.",
"Notifications": "Notifiche desktop", "Notifications": "Notifiche desktop",
"November": "Novembre", "November": "Novembre",
"num_thread (Ollama)": "",
"October": "Ottobre", "October": "Ottobre",
"Off": "Disattivato", "Off": "Disattivato",
"Okay, Let's Go!": "Ok, andiamo!", "Okay, Let's Go!": "Ok, andiamo!",
"OLED Dark": "OLED scuro", "OLED Dark": "OLED scuro",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Versione Ollama", "Ollama Version": "Versione Ollama",
"On": "Attivato", "On": "Attivato",
"Only": "Solo", "Only": "Solo",
@@ -494,6 +497,8 @@
"Use '#' in the prompt input to load and select your documents.": "Usa '#' nell'input del prompt per caricare e selezionare i tuoi documenti.", "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", "Use Gravatar": "Usa Gravatar",
"Use Initials": "Usa iniziali", "Use Initials": "Usa iniziali",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "utente", "user": "utente",
"User Permissions": "Autorizzazioni utente", "User Permissions": "Autorizzazioni utente",
"Users": "Utenti", "Users": "Utenti",
@@ -204,6 +204,7 @@
"Enter Your Role": "ロールを入力してください", "Enter Your Role": "ロールを入力してください",
"Error": "", "Error": "",
"Experimental": "実験的", "Experimental": "実験的",
"Export": "",
"Export All Chats (All Users)": "すべてのチャットをエクスポート (すべてのユーザー)", "Export All Chats (All Users)": "すべてのチャットをエクスポート (すべてのユーザー)",
"Export Chats": "チャットをエクスポート", "Export Chats": "チャットをエクスポート",
"Export Documents Mapping": "ドキュメントマッピングをエクスポート", "Export Documents Mapping": "ドキュメントマッピングをエクスポート",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "注意:最小スコアを設定した場合、検索は最小スコア以上のスコアを持つドキュメントのみを返します。", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "注意:最小スコアを設定した場合、検索は最小スコア以上のスコアを持つドキュメントのみを返します。",
"Notifications": "デスクトップ通知", "Notifications": "デスクトップ通知",
"November": "11月", "November": "11月",
"num_thread (Ollama)": "",
"October": "10月", "October": "10月",
"Off": "オフ", "Off": "オフ",
"Okay, Let's Go!": "OK、始めましょう!", "Okay, Let's Go!": "OK、始めましょう!",
"OLED Dark": "OLED ダーク", "OLED Dark": "OLED ダーク",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Ollama バージョン", "Ollama Version": "Ollama バージョン",
"On": "オン", "On": "オン",
"Only": "のみ", "Only": "のみ",
@@ -492,6 +495,8 @@
"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 を使用する",
"Use Initials": "初期値を使用する", "Use Initials": "初期値を使用する",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "ユーザー", "user": "ユーザー",
"User Permissions": "ユーザー権限", "User Permissions": "ユーザー権限",
"Users": "ユーザー", "Users": "ユーザー",
@@ -204,6 +204,7 @@
"Enter Your Role": "შეიყვანეთ თქვენი როლი", "Enter Your Role": "შეიყვანეთ თქვენი როლი",
"Error": "", "Error": "",
"Experimental": "ექსპერიმენტალური", "Experimental": "ექსპერიმენტალური",
"Export": "",
"Export All Chats (All Users)": "ექსპორტი ყველა ჩათი (ყველა მომხმარებელი)", "Export All Chats (All Users)": "ექსპორტი ყველა ჩათი (ყველა მომხმარებელი)",
"Export Chats": "მიმოწერის ექსპორტირება", "Export Chats": "მიმოწერის ექსპორტირება",
"Export Documents Mapping": "დოკუმენტების კავშირის ექსპორტი", "Export Documents Mapping": "დოკუმენტების კავშირის ექსპორტი",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "შენიშვნა: თუ თქვენ დააყენებთ მინიმალურ ქულას, ძებნა დააბრუნებს მხოლოდ დოკუმენტებს მინიმალური ქულის მეტი ან ტოლი ქულით.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "შენიშვნა: თუ თქვენ დააყენებთ მინიმალურ ქულას, ძებნა დააბრუნებს მხოლოდ დოკუმენტებს მინიმალური ქულის მეტი ან ტოლი ქულით.",
"Notifications": "შეტყობინება", "Notifications": "შეტყობინება",
"November": "ნოემბერი", "November": "ნოემბერი",
"num_thread (Ollama)": "",
"October": "ოქტომბერი", "October": "ოქტომბერი",
"Off": "გამორთვა", "Off": "გამორთვა",
"Okay, Let's Go!": "კარგი, წავედით!", "Okay, Let's Go!": "კარგი, წავედით!",
"OLED Dark": "OLED მუქი", "OLED Dark": "OLED მუქი",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Ollama ვერსია", "Ollama Version": "Ollama ვერსია",
"On": "ჩართვა", "On": "ჩართვა",
"Only": "მხოლოდ", "Only": "მხოლოდ",
@@ -493,6 +496,8 @@
"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",
"Use Initials": "გამოიყენე ინიციალები", "Use Initials": "გამოიყენე ინიციალები",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "მომხმარებელი", "user": "მომხმარებელი",
"User Permissions": "მომხმარებლის უფლებები", "User Permissions": "მომხმარებლის უფლებები",
"Users": "მომხმარებლები", "Users": "მომხმარებლები",
@@ -204,6 +204,7 @@
"Enter Your Role": "역할 입력", "Enter Your Role": "역할 입력",
"Error": "", "Error": "",
"Experimental": "실험적", "Experimental": "실험적",
"Export": "",
"Export All Chats (All Users)": "모든 채팅 내보내기 (모든 사용자)", "Export All Chats (All Users)": "모든 채팅 내보내기 (모든 사용자)",
"Export Chats": "채팅 내보내기", "Export Chats": "채팅 내보내기",
"Export Documents Mapping": "문서 매핑 내보내기", "Export Documents Mapping": "문서 매핑 내보내기",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "참고: 최소 점수를 설정하면 검색 결과는 최소 점수 이상의 점수를 가진 문서만 반환됩니다.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "참고: 최소 점수를 설정하면 검색 결과는 최소 점수 이상의 점수를 가진 문서만 반환됩니다.",
"Notifications": "알림", "Notifications": "알림",
"November": "11월", "November": "11월",
"num_thread (Ollama)": "",
"October": "10월", "October": "10월",
"Off": "끄기", "Off": "끄기",
"Okay, Let's Go!": "그렇습니다, 시작합시다!", "Okay, Let's Go!": "그렇습니다, 시작합시다!",
"OLED Dark": "OLED 어두운", "OLED Dark": "OLED 어두운",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Ollama 버전", "Ollama Version": "Ollama 버전",
"On": "켜기", "On": "켜기",
"Only": "오직", "Only": "오직",
@@ -492,6 +495,8 @@
"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 사용",
"Use Initials": "초성 사용", "Use Initials": "초성 사용",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "사용자", "user": "사용자",
"User Permissions": "사용자 권한", "User Permissions": "사용자 권한",
"Users": "사용자", "Users": "사용자",
@@ -204,6 +204,7 @@
"Enter Your Role": "Voer je Rol in", "Enter Your Role": "Voer je Rol in",
"Error": "", "Error": "",
"Experimental": "Experimenteel", "Experimental": "Experimenteel",
"Export": "",
"Export All Chats (All Users)": "Exporteer Alle Chats (Alle Gebruikers)", "Export All Chats (All Users)": "Exporteer Alle Chats (Alle Gebruikers)",
"Export Chats": "Exporteer Chats", "Export Chats": "Exporteer Chats",
"Export Documents Mapping": "Exporteer Documenten Mapping", "Export Documents Mapping": "Exporteer Documenten Mapping",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Opmerking: Als u een minimumscore instelt, levert de zoekopdracht alleen documenten op met een score groter dan of gelijk aan de minimumscore.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Opmerking: Als u een minimumscore instelt, levert de zoekopdracht alleen documenten op met een score groter dan of gelijk aan de minimumscore.",
"Notifications": "Desktop Notificaties", "Notifications": "Desktop Notificaties",
"November": "November", "November": "November",
"num_thread (Ollama)": "",
"October": "Oktober", "October": "Oktober",
"Off": "Uit", "Off": "Uit",
"Okay, Let's Go!": "Okay, Laten we gaan!", "Okay, Let's Go!": "Okay, Laten we gaan!",
"OLED Dark": "OLED Donker", "OLED Dark": "OLED Donker",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Ollama Versie", "Ollama Version": "Ollama Versie",
"On": "Aan", "On": "Aan",
"Only": "Alleen", "Only": "Alleen",
@@ -493,6 +496,8 @@
"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 '#' 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": "Gebruik Gravatar", "Use Gravatar": "Gebruik Gravatar",
"Use Initials": "Gebruik Initials", "Use Initials": "Gebruik Initials",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "user", "user": "user",
"User Permissions": "Gebruikers Rechten", "User Permissions": "Gebruikers Rechten",
"Users": "Gebruikers", "Users": "Gebruikers",
@@ -204,6 +204,7 @@
"Enter Your Role": "ਆਪਣੀ ਭੂਮਿਕਾ ਦਰਜ ਕਰੋ", "Enter Your Role": "ਆਪਣੀ ਭੂਮਿਕਾ ਦਰਜ ਕਰੋ",
"Error": "", "Error": "",
"Experimental": "ਪਰਮਾਣੂਕ੍ਰਿਤ", "Experimental": "ਪਰਮਾਣੂਕ੍ਰਿਤ",
"Export": "",
"Export All Chats (All Users)": "ਸਾਰੀਆਂ ਗੱਲਾਂ ਨਿਰਯਾਤ ਕਰੋ (ਸਾਰੇ ਉਪਭੋਗਤਾ)", "Export All Chats (All Users)": "ਸਾਰੀਆਂ ਗੱਲਾਂ ਨਿਰਯਾਤ ਕਰੋ (ਸਾਰੇ ਉਪਭੋਗਤਾ)",
"Export Chats": "ਗੱਲਾਂ ਨਿਰਯਾਤ ਕਰੋ", "Export Chats": "ਗੱਲਾਂ ਨਿਰਯਾਤ ਕਰੋ",
"Export Documents Mapping": "ਡਾਕੂਮੈਂਟ ਮੈਪਿੰਗ ਨਿਰਯਾਤ ਕਰੋ", "Export Documents Mapping": "ਡਾਕੂਮੈਂਟ ਮੈਪਿੰਗ ਨਿਰਯਾਤ ਕਰੋ",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "ਨੋਟ: ਜੇ ਤੁਸੀਂ ਘੱਟੋ-ਘੱਟ ਸਕੋਰ ਸੈੱਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਖੋਜ ਸਿਰਫ਼ ਉਹੀ ਡਾਕੂਮੈਂਟ ਵਾਪਸ ਕਰੇਗੀ ਜਿਨ੍ਹਾਂ ਦਾ ਸਕੋਰ ਘੱਟੋ-ਘੱਟ ਸਕੋਰ ਦੇ ਬਰਾਬਰ ਜਾਂ ਵੱਧ ਹੋਵੇ।", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "ਨੋਟ: ਜੇ ਤੁਸੀਂ ਘੱਟੋ-ਘੱਟ ਸਕੋਰ ਸੈੱਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਖੋਜ ਸਿਰਫ਼ ਉਹੀ ਡਾਕੂਮੈਂਟ ਵਾਪਸ ਕਰੇਗੀ ਜਿਨ੍ਹਾਂ ਦਾ ਸਕੋਰ ਘੱਟੋ-ਘੱਟ ਸਕੋਰ ਦੇ ਬਰਾਬਰ ਜਾਂ ਵੱਧ ਹੋਵੇ।",
"Notifications": "ਸੂਚਨਾਵਾਂ", "Notifications": "ਸੂਚਨਾਵਾਂ",
"November": "ਨਵੰਬਰ", "November": "ਨਵੰਬਰ",
"num_thread (Ollama)": "",
"October": "ਅਕਤੂਬਰ", "October": "ਅਕਤੂਬਰ",
"Off": "ਬੰਦ", "Off": "ਬੰਦ",
"Okay, Let's Go!": "ਠੀਕ ਹੈ, ਚੱਲੋ ਚੱਲੀਏ!", "Okay, Let's Go!": "ਠੀਕ ਹੈ, ਚੱਲੋ ਚੱਲੀਏ!",
"OLED Dark": "OLED ਗੂੜ੍ਹਾ", "OLED Dark": "OLED ਗੂੜ੍ਹਾ",
"Ollama": "ਓਲਾਮਾ", "Ollama": "ਓਲਾਮਾ",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "ਓਲਾਮਾ ਵਰਜਨ", "Ollama Version": "ਓਲਾਮਾ ਵਰਜਨ",
"On": "ਚਾਲੂ", "On": "ਚਾਲੂ",
"Only": "ਸਿਰਫ਼", "Only": "ਸਿਰਫ਼",
@@ -493,6 +496,8 @@
"Use '#' in the prompt input to load and select your documents.": "ਆਪਣੇ ਡਾਕੂਮੈਂਟ ਲੋਡ ਅਤੇ ਚੁਣਨ ਲਈ ਪ੍ਰੰਪਟ ਇਨਪੁਟ ਵਿੱਚ '#' ਵਰਤੋ।", "Use '#' in the prompt input to load and select your documents.": "ਆਪਣੇ ਡਾਕੂਮੈਂਟ ਲੋਡ ਅਤੇ ਚੁਣਨ ਲਈ ਪ੍ਰੰਪਟ ਇਨਪੁਟ ਵਿੱਚ '#' ਵਰਤੋ।",
"Use Gravatar": "ਗ੍ਰਾਵਾਟਾਰ ਵਰਤੋ", "Use Gravatar": "ਗ੍ਰਾਵਾਟਾਰ ਵਰਤੋ",
"Use Initials": "ਸ਼ੁਰੂਆਤੀ ਅੱਖਰ ਵਰਤੋ", "Use Initials": "ਸ਼ੁਰੂਆਤੀ ਅੱਖਰ ਵਰਤੋ",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "ਉਪਭੋਗਤਾ", "user": "ਉਪਭੋਗਤਾ",
"User Permissions": "ਉਪਭੋਗਤਾ ਅਧਿਕਾਰ", "User Permissions": "ਉਪਭੋਗਤਾ ਅਧਿਕਾਰ",
"Users": "ਉਪਭੋਗਤਾ", "Users": "ਉਪਭੋਗਤਾ",
@@ -204,6 +204,7 @@
"Enter Your Role": "Wprowadź swoją rolę", "Enter Your Role": "Wprowadź swoją rolę",
"Error": "", "Error": "",
"Experimental": "Eksperymentalne", "Experimental": "Eksperymentalne",
"Export": "",
"Export All Chats (All Users)": "Eksportuj wszystkie czaty (wszyscy użytkownicy)", "Export All Chats (All Users)": "Eksportuj wszystkie czaty (wszyscy użytkownicy)",
"Export Chats": "Eksportuj czaty", "Export Chats": "Eksportuj czaty",
"Export Documents Mapping": "Eksportuj mapowanie dokumentów", "Export Documents Mapping": "Eksportuj mapowanie dokumentów",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Uwaga: Jeśli ustawisz minimalny wynik, szukanie zwróci jedynie dokumenty z wynikiem większym lub równym minimalnemu.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Uwaga: Jeśli ustawisz minimalny wynik, szukanie zwróci jedynie dokumenty z wynikiem większym lub równym minimalnemu.",
"Notifications": "Powiadomienia", "Notifications": "Powiadomienia",
"November": "Listopad", "November": "Listopad",
"num_thread (Ollama)": "",
"October": "Październik", "October": "Październik",
"Off": "Wyłączony", "Off": "Wyłączony",
"Okay, Let's Go!": "Okej, zaczynamy!", "Okay, Let's Go!": "Okej, zaczynamy!",
"OLED Dark": "Ciemny OLED", "OLED Dark": "Ciemny OLED",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Wersja Ollama", "Ollama Version": "Wersja Ollama",
"On": "Włączony", "On": "Włączony",
"Only": "Tylko", "Only": "Tylko",
@@ -495,6 +498,8 @@
"Use '#' in the prompt input to load and select your documents.": "Użyj '#' w polu wprowadzania polecenia, aby załadować i wybrać swoje dokumenty.", "Use '#' in the prompt input to load and select your documents.": "Użyj '#' w polu wprowadzania polecenia, aby załadować i wybrać swoje dokumenty.",
"Use Gravatar": "Użyj Gravatara", "Use Gravatar": "Użyj Gravatara",
"Use Initials": "Użyj inicjałów", "Use Initials": "Użyj inicjałów",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "użytkownik", "user": "użytkownik",
"User Permissions": "Uprawnienia użytkownika", "User Permissions": "Uprawnienia użytkownika",
"Users": "Użytkownicy", "Users": "Użytkownicy",
@@ -204,6 +204,7 @@
"Enter Your Role": "Digite sua Função", "Enter Your Role": "Digite sua Função",
"Error": "", "Error": "",
"Experimental": "Experimental", "Experimental": "Experimental",
"Export": "",
"Export All Chats (All Users)": "Exportar Todos os Bate-papos (Todos os Usuários)", "Export All Chats (All Users)": "Exportar Todos os Bate-papos (Todos os Usuários)",
"Export Chats": "Exportar Bate-papos", "Export Chats": "Exportar Bate-papos",
"Export Documents Mapping": "Exportar Mapeamento de Documentos", "Export Documents Mapping": "Exportar Mapeamento de Documentos",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Se você definir uma pontuação mínima, a pesquisa só retornará documentos com uma pontuação maior ou igual à pontuação mínima.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Se você definir uma pontuação mínima, a pesquisa só retornará documentos com uma pontuação maior ou igual à pontuação mínima.",
"Notifications": "Notificações da Área de Trabalho", "Notifications": "Notificações da Área de Trabalho",
"November": "Novembro", "November": "Novembro",
"num_thread (Ollama)": "",
"October": "Outubro", "October": "Outubro",
"Off": "Desligado", "Off": "Desligado",
"Okay, Let's Go!": "Ok, Vamos Lá!", "Okay, Let's Go!": "Ok, Vamos Lá!",
"OLED Dark": "OLED Escuro", "OLED Dark": "OLED Escuro",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Versão do Ollama", "Ollama Version": "Versão do Ollama",
"On": "Ligado", "On": "Ligado",
"Only": "Somente", "Only": "Somente",
@@ -494,6 +497,8 @@
"Use '#' in the prompt input to load and select your documents.": "Use '#' na entrada do prompt para carregar e selecionar seus documentos.", "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", "Use Gravatar": "Usar Gravatar",
"Use Initials": "Usar Iniciais", "Use Initials": "Usar Iniciais",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "usuário", "user": "usuário",
"User Permissions": "Permissões do Usuário", "User Permissions": "Permissões do Usuário",
"Users": "Usuários", "Users": "Usuários",
@@ -204,6 +204,7 @@
"Enter Your Role": "Digite sua Função", "Enter Your Role": "Digite sua Função",
"Error": "", "Error": "",
"Experimental": "Experimental", "Experimental": "Experimental",
"Export": "",
"Export All Chats (All Users)": "Exportar Todos os Bate-papos (Todos os Usuários)", "Export All Chats (All Users)": "Exportar Todos os Bate-papos (Todos os Usuários)",
"Export Chats": "Exportar Bate-papos", "Export Chats": "Exportar Bate-papos",
"Export Documents Mapping": "Exportar Mapeamento de Documentos", "Export Documents Mapping": "Exportar Mapeamento de Documentos",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Se você definir uma pontuação mínima, a pesquisa só retornará documentos com uma pontuação maior ou igual à pontuação mínima.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Se você definir uma pontuação mínima, a pesquisa só retornará documentos com uma pontuação maior ou igual à pontuação mínima.",
"Notifications": "Notificações da Área de Trabalho", "Notifications": "Notificações da Área de Trabalho",
"November": "Novembro", "November": "Novembro",
"num_thread (Ollama)": "",
"October": "Outubro", "October": "Outubro",
"Off": "Desligado", "Off": "Desligado",
"Okay, Let's Go!": "Ok, Vamos Lá!", "Okay, Let's Go!": "Ok, Vamos Lá!",
"OLED Dark": "OLED Escuro", "OLED Dark": "OLED Escuro",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Versão do Ollama", "Ollama Version": "Versão do Ollama",
"On": "Ligado", "On": "Ligado",
"Only": "Somente", "Only": "Somente",
@@ -494,6 +497,8 @@
"Use '#' in the prompt input to load and select your documents.": "Use '#' na entrada do prompt para carregar e selecionar seus documentos.", "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", "Use Gravatar": "Usar Gravatar",
"Use Initials": "Usar Iniciais", "Use Initials": "Usar Iniciais",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "usuário", "user": "usuário",
"User Permissions": "Permissões do Usuário", "User Permissions": "Permissões do Usuário",
"Users": "Usuários", "Users": "Usuários",
@@ -204,6 +204,7 @@
"Enter Your Role": "Введите вашу роль", "Enter Your Role": "Введите вашу роль",
"Error": "", "Error": "",
"Experimental": "Экспериментальное", "Experimental": "Экспериментальное",
"Export": "",
"Export All Chats (All Users)": "Экспортировать все чаты (все пользователи)", "Export All Chats (All Users)": "Экспортировать все чаты (все пользователи)",
"Export Chats": "Экспортировать чаты", "Export Chats": "Экспортировать чаты",
"Export Documents Mapping": "Экспортировать отображение документов", "Export Documents Mapping": "Экспортировать отображение документов",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Обратите внимание: Если вы установите минимальный балл, поиск будет возвращать только документы с баллом больше или равным минимальному баллу.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Обратите внимание: Если вы установите минимальный балл, поиск будет возвращать только документы с баллом больше или равным минимальному баллу.",
"Notifications": "Уведомления на рабочем столе", "Notifications": "Уведомления на рабочем столе",
"November": "Ноябрь", "November": "Ноябрь",
"num_thread (Ollama)": "",
"October": "Октябрь", "October": "Октябрь",
"Off": "Выключено.", "Off": "Выключено.",
"Okay, Let's Go!": "Давайте начнём!", "Okay, Let's Go!": "Давайте начнём!",
"OLED Dark": "OLED темная", "OLED Dark": "OLED темная",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Версия Ollama", "Ollama Version": "Версия Ollama",
"On": "Включено.", "On": "Включено.",
"Only": "Только", "Only": "Только",
@@ -495,6 +498,8 @@
"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",
"Use Initials": "Использовать инициалы", "Use Initials": "Использовать инициалы",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "пользователь", "user": "пользователь",
"User Permissions": "Права пользователя", "User Permissions": "Права пользователя",
"Users": "Пользователи", "Users": "Пользователи",
@@ -204,6 +204,7 @@
"Enter Your Role": "Унесите вашу улогу", "Enter Your Role": "Унесите вашу улогу",
"Error": "", "Error": "",
"Experimental": "Експериментално", "Experimental": "Експериментално",
"Export": "",
"Export All Chats (All Users)": "Извези сва ћаскања (сви корисници)", "Export All Chats (All Users)": "Извези сва ћаскања (сви корисници)",
"Export Chats": "Извези ћаскања", "Export Chats": "Извези ћаскања",
"Export Documents Mapping": "Извези мапирање докумената", "Export Documents Mapping": "Извези мапирање докумената",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Напомена: ако подесите најмањи резултат, претрага ће вратити само документе са резултатом већим или једнаким најмањем резултату.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Напомена: ако подесите најмањи резултат, претрага ће вратити само документе са резултатом већим или једнаким најмањем резултату.",
"Notifications": "Обавештења", "Notifications": "Обавештења",
"November": "Новембар", "November": "Новембар",
"num_thread (Ollama)": "",
"October": "Октобар", "October": "Октобар",
"Off": "Искључено", "Off": "Искључено",
"Okay, Let's Go!": "У реду, хајде да кренемо!", "Okay, Let's Go!": "У реду, хајде да кренемо!",
"OLED Dark": "OLED тамна", "OLED Dark": "OLED тамна",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Издање Ollama-е", "Ollama Version": "Издање Ollama-е",
"On": "Укључено", "On": "Укључено",
"Only": "Само", "Only": "Само",
@@ -494,6 +497,8 @@
"Use '#' in the prompt input to load and select your documents.": "Користи '#' у уносу упита да учитате и изаберете ваше документе.", "Use '#' in the prompt input to load and select your documents.": "Користи '#' у уносу упита да учитате и изаберете ваше документе.",
"Use Gravatar": "Користи Граватар", "Use Gravatar": "Користи Граватар",
"Use Initials": "Користи иницијале", "Use Initials": "Користи иницијале",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "корисник", "user": "корисник",
"User Permissions": "Овлашћења корисника", "User Permissions": "Овлашћења корисника",
"Users": "Корисници", "Users": "Корисници",
@@ -204,6 +204,7 @@
"Enter Your Role": "Ange din roll", "Enter Your Role": "Ange din roll",
"Error": "", "Error": "",
"Experimental": "Experimentell", "Experimental": "Experimentell",
"Export": "",
"Export All Chats (All Users)": "Exportera alla chattar (alla användare)", "Export All Chats (All Users)": "Exportera alla chattar (alla användare)",
"Export Chats": "Exportera chattar", "Export Chats": "Exportera chattar",
"Export Documents Mapping": "Exportera dokumentmappning", "Export Documents Mapping": "Exportera dokumentmappning",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Merk: Hvis du angir en minimumspoengsum, returnerer søket bare dokumenter med en poengsum som er større enn eller lik minimumspoengsummen.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Merk: Hvis du angir en minimumspoengsum, returnerer søket bare dokumenter med en poengsum som er større enn eller lik minimumspoengsummen.",
"Notifications": "Notifikationer", "Notifications": "Notifikationer",
"November": "november", "November": "november",
"num_thread (Ollama)": "",
"October": "oktober", "October": "oktober",
"Off": "Av", "Off": "Av",
"Okay, Let's Go!": "Okej, nu kör vi!", "Okay, Let's Go!": "Okej, nu kör vi!",
"OLED Dark": "OLED mörkt", "OLED Dark": "OLED mörkt",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Ollama-version", "Ollama Version": "Ollama-version",
"On": "På", "On": "På",
"Only": "Endast", "Only": "Endast",
@@ -493,6 +496,8 @@
"Use '#' in the prompt input to load and select your documents.": "Använd '#' i promptinmatningen för att ladda och välja dina dokument.", "Use '#' in the prompt input to load and select your documents.": "Använd '#' i promptinmatningen för att ladda och välja dina dokument.",
"Use Gravatar": "Använd Gravatar", "Use Gravatar": "Använd Gravatar",
"Use Initials": "Använd initialer", "Use Initials": "Använd initialer",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "användare", "user": "användare",
"User Permissions": "Användarbehörigheter", "User Permissions": "Användarbehörigheter",
"Users": "Användare", "Users": "Användare",
@@ -204,6 +204,7 @@
"Enter Your Role": "Rolünüzü Girin", "Enter Your Role": "Rolünüzü Girin",
"Error": "Hata", "Error": "Hata",
"Experimental": "Deneysel", "Experimental": "Deneysel",
"Export": "",
"Export All Chats (All Users)": "Tüm Sohbetleri Dışa Aktar (Tüm Kullanıcılar)", "Export All Chats (All Users)": "Tüm Sohbetleri Dışa Aktar (Tüm Kullanıcılar)",
"Export Chats": "Sohbetleri Dışa Aktar", "Export Chats": "Sohbetleri Dışa Aktar",
"Export Documents Mapping": "Belge Eşlemesini Dışa Aktar", "Export Documents Mapping": "Belge Eşlemesini Dışa Aktar",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Not: Minimum bir skor belirlerseniz, arama yalnızca minimum skora eşit veya daha yüksek bir skora sahip belgeleri getirecektir.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Not: Minimum bir skor belirlerseniz, arama yalnızca minimum skora eşit veya daha yüksek bir skora sahip belgeleri getirecektir.",
"Notifications": "Bildirimler", "Notifications": "Bildirimler",
"November": "Kasım", "November": "Kasım",
"num_thread (Ollama)": "",
"October": "Ekim", "October": "Ekim",
"Off": "Kapalı", "Off": "Kapalı",
"Okay, Let's Go!": "Tamam, Hadi Başlayalım!", "Okay, Let's Go!": "Tamam, Hadi Başlayalım!",
"OLED Dark": "OLED Koyu", "OLED Dark": "OLED Koyu",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "Ollama API", "Ollama API": "Ollama API",
"Ollama API disabled": "",
"Ollama Version": "Ollama Sürümü", "Ollama Version": "Ollama Sürümü",
"On": "Açık", "On": "Açık",
"Only": "Yalnızca", "Only": "Yalnızca",
@@ -493,6 +496,8 @@
"Use '#' in the prompt input to load and select your documents.": "Belgelerinizi yüklemek ve seçmek için promptda '#' kullanın.", "Use '#' in the prompt input to load and select your documents.": "Belgelerinizi yüklemek ve seçmek için promptda '#' kullanın.",
"Use Gravatar": "Gravatar Kullan", "Use Gravatar": "Gravatar Kullan",
"Use Initials": "Baş Harfleri Kullan", "Use Initials": "Baş Harfleri Kullan",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "kullanıcı", "user": "kullanıcı",
"User Permissions": "Kullanıcı İzinleri", "User Permissions": "Kullanıcı İzinleri",
"Users": "Kullanıcılar", "Users": "Kullanıcılar",
+78 -73
View File
@@ -3,19 +3,19 @@
"(Beta)": "(Beta)", "(Beta)": "(Beta)",
"(e.g. `sh webui.sh --api`)": "(e.g. `sh webui.sh --api`)", "(e.g. `sh webui.sh --api`)": "(e.g. `sh webui.sh --api`)",
"(latest)": "(остання)", "(latest)": "(остання)",
"{{ models }}": "", "{{ models }}": "{{ models }}",
"{{ owner }}: You cannot delete a base model": "", "{{ owner }}: You cannot delete a base model": "{{ owner }}: Ви не можете видалити базову модель.",
"{{modelName}} is thinking...": "{{modelName}} думає...", "{{modelName}} is thinking...": "{{modelName}} думає...",
"{{user}}'s Chats": "Чати {{user}}а", "{{user}}'s Chats": "Чати {{user}}а",
"{{webUIName}} Backend Required": "Необхідно підключення бекенду {{webUIName}}", "{{webUIName}} Backend Required": "Необхідно підключення бекенду {{webUIName}}",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Модель задач використовується при виконанні таких завдань, як генерація заголовків для чатів та пошукових запитів в Інтернеті",
"a user": "користувача", "a user": "користувача",
"About": "Про програму", "About": "Про програму",
"Account": "Обліковий запис", "Account": "Обліковий запис",
"Accurate information": "Точна інформація", "Accurate information": "Точна інформація",
"Add": "Додати", "Add": "Додати",
"Add a model id": "", "Add a model id": "Додайте id моделі",
"Add a short description about what this model does": "", "Add a short description about what this model does": "Додайте короткий опис того, що робить ця модель",
"Add a short title for this prompt": "Додати коротку назву для цього промту", "Add a short title for this prompt": "Додати коротку назву для цього промту",
"Add a tag": "Додайте тег", "Add a tag": "Додайте тег",
"Add custom prompt": "Додати користувацьку підказку", "Add custom prompt": "Додати користувацьку підказку",
@@ -28,10 +28,10 @@
"Add User": "Додати користувача", "Add User": "Додати користувача",
"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": "Розширені параметри",
"Advanced Params": "", "Advanced Params": "Розширені параметри",
"all": "всі", "all": "всі",
"All Documents": "Усі документи", "All Documents": "Усі документи",
"All Users": "Всі користувачі", "All Users": "Всі користувачі",
@@ -48,7 +48,7 @@
"API keys": "Ключі API", "API keys": "Ключі API",
"April": "Квітень", "April": "Квітень",
"Archive": "Архів", "Archive": "Архів",
"Archive All Chats": "", "Archive All Chats": "Архівувати всі чати",
"Archived Chats": "Архівовані чати", "Archived Chats": "Архівовані чати",
"are allowed - Activate this command by typing": "дозволено - активізуйте цю команду набором", "are allowed - Activate this command by typing": "дозволено - активізуйте цю команду набором",
"Are you sure?": "Ви впевнені?", "Are you sure?": "Ви впевнені?",
@@ -63,14 +63,14 @@
"available!": "доступно!", "available!": "доступно!",
"Back": "Назад", "Back": "Назад",
"Bad Response": "Неправильна відповідь", "Bad Response": "Неправильна відповідь",
"Banners": "", "Banners": "Прапори",
"Base Model (From)": "", "Base Model (From)": "Базова модель (від)",
"before": "до того, як", "before": "до того, як",
"Being lazy": "Не поспішати", "Being lazy": "Не поспішати",
"Brave Search API Key": "", "Brave Search API Key": "Ключ API пошуку Brave",
"Bypass SSL verification for Websites": "Обхід SSL-перевірки для веб-сайтів", "Bypass SSL verification for Websites": "Обхід SSL-перевірки для веб-сайтів",
"Cancel": "Скасувати", "Cancel": "Скасувати",
"Capabilities": "", "Capabilities": "Можливості",
"Change Password": "Змінити пароль", "Change Password": "Змінити пароль",
"Chat": "Чат", "Chat": "Чат",
"Chat Bubble UI": "Бульбашковий UI чату", "Chat Bubble UI": "Бульбашковий UI чату",
@@ -93,14 +93,14 @@
"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.": "Натисніть кнопку ролі користувача, щоб змінити роль користувача.",
"Clone": "", "Clone": "Клонувати",
"Close": "Закрити", "Close": "Закрити",
"Collection": "Колекція", "Collection": "Колекція",
"ComfyUI": "ComfyUI", "ComfyUI": "ComfyUI",
"ComfyUI Base URL": "URL-адреса ComfyUI", "ComfyUI Base URL": "URL-адреса ComfyUI",
"ComfyUI Base URL is required.": "Необхідно вказати URL-адресу ComfyUI.", "ComfyUI Base URL is required.": "Необхідно вказати URL-адресу ComfyUI.",
"Command": "Команда", "Command": "Команда",
"Concurrent Requests": "", "Concurrent Requests": "Одночасні запити",
"Confirm Password": "Підтвердіть пароль", "Confirm Password": "Підтвердіть пароль",
"Connections": "З'єднання", "Connections": "З'єднання",
"Content": "Зміст", "Content": "Зміст",
@@ -114,7 +114,7 @@
"Copy Link": "Копіювати посилання", "Copy Link": "Копіювати посилання",
"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':": "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':", "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':": "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':",
"Create a model": "", "Create a model": "Створити модель",
"Create Account": "Створити обліковий запис", "Create Account": "Створити обліковий запис",
"Create new key": "Створити новий ключ", "Create new key": "Створити новий ключ",
"Create new secret key": "Створити новий секретний ключ", "Create new secret key": "Створити новий секретний ключ",
@@ -123,7 +123,7 @@
"Current Model": "Поточна модель", "Current Model": "Поточна модель",
"Current Password": "Поточний пароль", "Current Password": "Поточний пароль",
"Custom": "Налаштувати", "Custom": "Налаштувати",
"Customize models for a specific purpose": "", "Customize models for a specific purpose": "Налаштуйте моделі для конкретних цілей",
"Dark": "Темна", "Dark": "Темна",
"Database": "База даних", "Database": "База даних",
"December": "Грудень", "December": "Грудень",
@@ -131,24 +131,24 @@
"Default (Automatic1111)": "За замовчуванням (Automatic1111)", "Default (Automatic1111)": "За замовчуванням (Automatic1111)",
"Default (SentenceTransformers)": "За замовчуванням (SentenceTransformers)", "Default (SentenceTransformers)": "За замовчуванням (SentenceTransformers)",
"Default (Web API)": "За замовчуванням (Web API)", "Default (Web API)": "За замовчуванням (Web API)",
"Default Model": "", "Default Model": "Модель за замовчуванням",
"Default model updated": "Модель за замовчуванням оновлено", "Default model updated": "Модель за замовчуванням оновлено",
"Default Prompt Suggestions": "Пропозиції промтів замовчуванням", "Default Prompt Suggestions": "Пропозиції промтів замовчуванням",
"Default User Role": "Роль користувача за замовчуванням", "Default User Role": "Роль користувача за замовчуванням",
"delete": "видалити", "delete": "видалити",
"Delete": "Видалити", "Delete": "Видалити",
"Delete a model": "Видалити модель", "Delete a model": "Видалити модель",
"Delete All Chats": "", "Delete All Chats": "Видалити усі чати",
"Delete chat": "Видалити чат", "Delete chat": "Видалити чат",
"Delete Chat": "Видалити чат", "Delete Chat": "Видалити чат",
"delete this link": "видалити це посилання", "delete this link": "видалити це посилання",
"Delete User": "Видалити користувача", "Delete User": "Видалити користувача",
"Deleted {{deleteModelTag}}": "Видалено {{deleteModelTag}}", "Deleted {{deleteModelTag}}": "Видалено {{deleteModelTag}}",
"Deleted {{name}}": "", "Deleted {{name}}": "Видалено {{name}}",
"Description": "Опис", "Description": "Опис",
"Didn't fully follow instructions": "Не повністю дотримувалися інструкцій", "Didn't fully follow instructions": "Не повністю дотримувалися інструкцій",
"Disabled": "Вимкнено", "Disabled": "Вимкнено",
"Discover a model": "", "Discover a model": "Знайдіть модель",
"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": "Знайдіть, завантажте та досліджуйте налаштовані налаштування моделі",
@@ -173,27 +173,27 @@
"Embedding Model Engine": "Двигун модели встраивания ", "Embedding Model Engine": "Двигун модели встраивания ",
"Embedding model set to \"{{embedding_model}}\"": "Встановлена модель вбудовування \"{{embedding_model}}\"", "Embedding model set to \"{{embedding_model}}\"": "Встановлена модель вбудовування \"{{embedding_model}}\"",
"Enable Chat History": "Увімкнути історію чату", "Enable Chat History": "Увімкнути історію чату",
"Enable Community Sharing": "", "Enable Community Sharing": "Ввімкніть спільний доступ до спільноти",
"Enable New Sign Ups": "Дозволити нові реєстрації", "Enable New Sign Ups": "Дозволити нові реєстрації",
"Enable Web Search": "", "Enable Web Search": "Увімкнути веб-пошук",
"Enabled": "Увімкнено", "Enabled": "Увімкнено",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Переконайтеся, що ваш CSV-файл містить 4 колонки в такому порядку: Ім'я, Email, Пароль, Роль.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Переконайтеся, що ваш CSV-файл містить 4 колонки в такому порядку: Ім'я, Email, Пароль, Роль.",
"Enter {{role}} message here": "Введіть повідомлення {{role}} тут", "Enter {{role}} message here": "Введіть повідомлення {{role}} тут",
"Enter a detail about yourself for your LLMs to recall": "Введіть відомості про себе для запам'ятовування вашими LLM.", "Enter a detail about yourself for your LLMs to recall": "Введіть відомості про себе для запам'ятовування вашими LLM.",
"Enter Brave Search API Key": "", "Enter Brave Search API Key": "Введіть ключ API для пошуку Brave",
"Enter Chunk Overlap": "Введіть перекриття фрагменту", "Enter Chunk Overlap": "Введіть перекриття фрагменту",
"Enter Chunk Size": "Введіть розмір фрагменту", "Enter Chunk Size": "Введіть розмір фрагменту",
"Enter Github Raw URL": "", "Enter Github Raw URL": "Введіть Raw URL-адресу Github",
"Enter Google PSE API Key": "", "Enter Google PSE API Key": "Введіть ключ API Google PSE",
"Enter Google PSE Engine Id": "", "Enter Google PSE Engine Id": "Введіть Google PSE Engine Id",
"Enter Image Size (e.g. 512x512)": "Введіть розмір зображення (напр., 512x512)", "Enter Image Size (e.g. 512x512)": "Введіть розмір зображення (напр., 512x512)",
"Enter language codes": "Введіть мовні коди", "Enter language codes": "Введіть мовні коди",
"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 Score": "Введіть бал", "Enter Score": "Введіть бал",
"Enter Searxng Query URL": "", "Enter Searxng Query URL": "Введіть URL-адресу запиту Searxng",
"Enter Serper API Key": "", "Enter Serper API Key": "Введіть ключ API Serper",
"Enter Serpstack API Key": "", "Enter Serpstack API Key": "Введіть ключ API Serpstack",
"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/)",
@@ -202,12 +202,13 @@
"Enter Your Full Name": "Введіть ваше ім'я", "Enter Your Full Name": "Введіть ваше ім'я",
"Enter Your Password": "Введіть ваш пароль", "Enter Your Password": "Введіть ваш пароль",
"Enter Your Role": "Введіть вашу роль", "Enter Your Role": "Введіть вашу роль",
"Error": "", "Error": "Помилка",
"Experimental": "Експериментальне", "Experimental": "Експериментальне",
"Export": "",
"Export All Chats (All Users)": "Експортувати всі чати (всі користувачі)", "Export All Chats (All Users)": "Експортувати всі чати (всі користувачі)",
"Export Chats": "Експортувати чати", "Export Chats": "Експортувати чати",
"Export Documents Mapping": "Експортувати відображення документів", "Export Documents Mapping": "Експортувати відображення документів",
"Export Models": "", "Export Models": "Експорт моделей",
"Export Prompts": "Експортувати промти", "Export Prompts": "Експортувати промти",
"Failed to create API Key.": "Не вдалося створити API ключ.", "Failed to create API Key.": "Не вдалося створити API ключ.",
"Failed to read clipboard contents": "Не вдалося прочитати вміст буфера обміну", "Failed to read clipboard contents": "Не вдалося прочитати вміст буфера обміну",
@@ -220,15 +221,15 @@
"Focus chat input": "Фокус вводу чату", "Focus chat input": "Фокус вводу чату",
"Followed instructions perfectly": "Бездоганно дотримувався інструкцій", "Followed instructions perfectly": "Бездоганно дотримувався інструкцій",
"Format your variables using square brackets like this:": "Форматуйте свої змінні квадратними дужками так:", "Format your variables using square brackets like this:": "Форматуйте свої змінні квадратними дужками так:",
"Frequency Penalty": "", "Frequency Penalty": "Штраф за частоту",
"Full Screen Mode": "Режим повного екрану", "Full Screen Mode": "Режим повного екрану",
"General": "Загальні", "General": "Загальні",
"General Settings": "Загальні налаштування", "General Settings": "Загальні налаштування",
"Generating search query": "", "Generating search query": "Сформувати пошуковий запит",
"Generation Info": "Інформація про генерацію", "Generation Info": "Інформація про генерацію",
"Good Response": "Гарна відповідь", "Good Response": "Гарна відповідь",
"Google PSE API Key": "", "Google PSE API Key": "Ключ API Google PSE",
"Google PSE Engine Id": "", "Google PSE Engine Id": "Id двигуна Google PSE",
"h:mm a": "h:mm a", "h:mm a": "h:mm a",
"has no conversations.": "не має розмов.", "has no conversations.": "не має розмов.",
"Hello, {{name}}": "Привіт, {{name}}", "Hello, {{name}}": "Привіт, {{name}}",
@@ -242,18 +243,18 @@
"Images": "Зображення", "Images": "Зображення",
"Import Chats": "Імпортувати чати", "Import Chats": "Імпортувати чати",
"Import Documents Mapping": "Імпортувати відображення документів", "Import Documents Mapping": "Імпортувати відображення документів",
"Import Models": "", "Import Models": "Імпорт моделей",
"Import Prompts": "Імпортувати промти", "Import Prompts": "Імпортувати промти",
"Include `--api` flag when running stable-diffusion-webui": "Включіть прапор `--api` при запуску stable-diffusion-webui", "Include `--api` flag when running stable-diffusion-webui": "Включіть прапор `--api` при запуску stable-diffusion-webui",
"Info": "", "Info": "Інфо",
"Input commands": "Команди вводу", "Input commands": "Команди вводу",
"Install from Github URL": "", "Install from Github URL": "Встановіть з URL-адреси Github",
"Interface": "Інтерфейс", "Interface": "Інтерфейс",
"Invalid Tag": "Недійсний тег", "Invalid Tag": "Недійсний тег",
"January": "Січень", "January": "Січень",
"join our Discord for help.": "приєднуйтеся до нашого Discord для допомоги.", "join our Discord for help.": "приєднуйтеся до нашого Discord для допомоги.",
"JSON": "JSON", "JSON": "JSON",
"JSON Preview": "", "JSON Preview": "Перегляд JSON",
"July": "Липень", "July": "Липень",
"June": "Червень", "June": "Червень",
"JWT Expiration": "Термін дії JWT", "JWT Expiration": "Термін дії JWT",
@@ -270,9 +271,9 @@
"Make sure to enclose them with": "Переконайтеся, що вони закриті", "Make sure to enclose them with": "Переконайтеся, що вони закриті",
"Manage Models": "Керування моделями", "Manage Models": "Керування моделями",
"Manage Ollama Models": "Керування моделями Ollama", "Manage Ollama Models": "Керування моделями Ollama",
"Manage Pipelines": "", "Manage Pipelines": "Управління Pipelines",
"March": "Березень", "March": "Березень",
"Max Tokens (num_predict)": "", "Max Tokens (num_predict)": "Макс токенів (num_predict)",
"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 моделі можна завантажити одночасно. Будь ласка, спробуйте пізніше.",
"May": "Травень", "May": "Травень",
"Memories accessible by LLMs will be shown here.": "Пам'ять, яка доступна LLM, буде показана тут.", "Memories accessible by LLMs will be shown here.": "Пам'ять, яка доступна LLM, буде показана тут.",
@@ -287,12 +288,12 @@
"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}} is not vision capable": "", "Model {{modelName}} is not vision capable": "Модель {{modelName}} не здатна бачити",
"Model {{name}} is now {{status}}": "", "Model {{name}} is now {{status}}": "Модель {{name}} тепер має {{status}}",
"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Виявлено шлях до файлової системи моделі. Для оновлення потрібно вказати коротке ім'я моделі, не вдасться продовжити.", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "Виявлено шлях до файлової системи моделі. Для оновлення потрібно вказати коротке ім'я моделі, не вдасться продовжити.",
"Model ID": "", "Model ID": "ID моделі",
"Model not selected": "Модель не вибрана", "Model not selected": "Модель не вибрана",
"Model Params": "", "Model Params": "Параметри моделі",
"Model Whitelisting": "Модель білого списку", "Model Whitelisting": "Модель білого списку",
"Model(s) Whitelisted": "Модель(і) білого списку", "Model(s) Whitelisted": "Модель(і) білого списку",
"Modelfile Content": "Вміст файлу моделі", "Modelfile Content": "Вміст файлу моделі",
@@ -300,23 +301,25 @@
"More": "Більше", "More": "Більше",
"Name": "Ім'я", "Name": "Ім'я",
"Name Tag": "Назва тегу", "Name Tag": "Назва тегу",
"Name your model": "", "Name your model": "Назвіть свою модель",
"New Chat": "Новий чат", "New Chat": "Новий чат",
"New Password": "Новий пароль", "New Password": "Новий пароль",
"No results found": "Не знайдено жодного результату", "No results found": "Не знайдено жодного результату",
"No search query generated": "", "No search query generated": "Пошуковий запит не сформовано",
"No source available": "Джерело не доступне", "No source available": "Джерело не доступне",
"None": "", "None": "Нема",
"Not factually correct": "Не відповідає дійсності", "Not factually correct": "Не відповідає дійсності",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Примітка: Якщо ви встановите мінімальну кількість балів, пошук поверне лише документи з кількістю балів, більшою або рівною мінімальній кількості балів.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Примітка: Якщо ви встановите мінімальну кількість балів, пошук поверне лише документи з кількістю балів, більшою або рівною мінімальній кількості балів.",
"Notifications": "Сповіщення", "Notifications": "Сповіщення",
"November": "Листопад", "November": "Листопад",
"num_thread (Ollama)": "",
"October": "Жовтень", "October": "Жовтень",
"Off": "Вимк", "Off": "Вимк",
"Okay, Let's Go!": "Гаразд, давайте почнемо!", "Okay, Let's Go!": "Гаразд, давайте почнемо!",
"OLED Dark": "Темний OLED", "OLED Dark": "Темний OLED",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "Ollama API",
"Ollama API disabled": "",
"Ollama Version": "Версія Ollama", "Ollama Version": "Версія Ollama",
"On": "Увімк", "On": "Увімк",
"Only": "Тільки", "Only": "Тільки",
@@ -341,8 +344,8 @@
"pending": "на розгляді", "pending": "на розгляді",
"Permission denied when accessing microphone: {{error}}": "Доступ до мікрофона заборонено: {{error}}", "Permission denied when accessing microphone: {{error}}": "Доступ до мікрофона заборонено: {{error}}",
"Personalization": "Персоналізація", "Personalization": "Персоналізація",
"Pipelines": "", "Pipelines": "Pipelines",
"Pipelines Valves": "", "Pipelines Valves": "Pipelines Valves",
"Plain text (.txt)": "Простий текст (.txt)", "Plain text (.txt)": "Простий текст (.txt)",
"Playground": "Майданчик", "Playground": "Майданчик",
"Positive attitude": "Позитивне ставлення", "Positive attitude": "Позитивне ставлення",
@@ -387,34 +390,34 @@
"Scan for documents from {{path}}": "Сканування документів з {{path}}", "Scan for documents from {{path}}": "Сканування документів з {{path}}",
"Search": "Пошук", "Search": "Пошук",
"Search a model": "Шукати модель", "Search a model": "Шукати модель",
"Search Chats": "", "Search Chats": "Пошук в чатах",
"Search Documents": "Пошук документів", "Search Documents": "Пошук документів",
"Search Models": "", "Search Models": "Пошук моделей",
"Search Prompts": "Пошук промтів", "Search Prompts": "Пошук промтів",
"Search Result Count": "", "Search Result Count": "Кількість результатів пошуку",
"Searched {{count}} sites_one": "", "Searched {{count}} sites_one": "Переглянуто {{count}} сайт",
"Searched {{count}} sites_few": "", "Searched {{count}} sites_few": "Переглянуто {{count}} сайти",
"Searched {{count}} sites_many": "", "Searched {{count}} sites_many": "Переглянуто {{count}} сайтів",
"Searched {{count}} sites_other": "", "Searched {{count}} sites_other": "Переглянуто {{count}} сайтів",
"Searching the web for '{{searchQuery}}'": "", "Searching the web for '{{searchQuery}}'": "Пошук в Інтернеті за запитом '{{searchQuery}}'",
"Searxng Query URL": "", "Searxng Query URL": "URL-адреса запиту Searxng",
"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 base model": "", "Select a base model": "Вибрати базову модель",
"Select a mode": "Оберіть режим", "Select a mode": "Оберіть режим",
"Select a model": "Виберіть модель", "Select a model": "Виберіть модель",
"Select a pipeline": "", "Select a pipeline": "Виберіть pipeline",
"Select a pipeline url": "", "Select a pipeline url": "Виберіть адресу pipeline",
"Select an Ollama instance": "Виберіть екземпляр Ollama", "Select an Ollama instance": "Виберіть екземпляр Ollama",
"Select model": "Вибрати модель", "Select model": "Вибрати модель",
"Selected model(s) do not support image inputs": "", "Selected model(s) do not support image inputs": "Вибрані модель(і) не підтримують вхідні зображення",
"Send": "Надіслати", "Send": "Надіслати",
"Send a Message": "Надіслати повідомлення", "Send a Message": "Надіслати повідомлення",
"Send message": "Надіслати повідомлення", "Send message": "Надіслати повідомлення",
"September": "Вересень", "September": "Вересень",
"Serper API Key": "", "Serper API Key": "Ключ API Serper",
"Serpstack API Key": "", "Serpstack API Key": "Ключ API Serpstack",
"Server connection verified": "З'єднання з сервером підтверджено", "Server connection verified": "З'єднання з сервером підтверджено",
"Set as default": "Встановити за замовчуванням", "Set as default": "Встановити за замовчуванням",
"Set Default Model": "Встановити модель за замовчуванням", "Set Default Model": "Встановити модель за замовчуванням",
@@ -423,7 +426,7 @@
"Set Model": "Встановити модель", "Set Model": "Встановити модель",
"Set reranking model (e.g. {{model}})": "Встановити модель переранжування (напр., {{model}})", "Set reranking model (e.g. {{model}})": "Встановити модель переранжування (напр., {{model}})",
"Set Steps": "Встановити кроки", "Set Steps": "Встановити кроки",
"Set Task Model": "", "Set Task Model": "Встановити модель задач",
"Set Voice": "Встановити голос", "Set Voice": "Встановити голос",
"Settings": "Налаштування", "Settings": "Налаштування",
"Settings saved successfully!": "Налаштування успішно збережено!", "Settings saved successfully!": "Налаштування успішно збережено!",
@@ -482,19 +485,21 @@
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "Проблеми з доступом до Ollama?", "Trouble accessing Ollama?": "Проблеми з доступом до Ollama?",
"TTS Settings": "Налаштування TTS", "TTS Settings": "Налаштування TTS",
"Type": "", "Type": "Тип",
"Type Hugging Face Resolve (Download) URL": "Введіть URL ресурсу Hugging Face Resolve (завантаження)", "Type Hugging Face Resolve (Download) URL": "Введіть URL ресурсу Hugging Face Resolve (завантаження)",
"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 and Copy Link": "Оновлення та копіювання посилання", "Update and Copy Link": "Оновлення та копіювання посилання",
"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.": "Для введення промтів до веб-сторінок (URL) або вибору документів, будь ласка, використовуйте символ '#'.", "Use '#' in the prompt input to load and select your documents.": "Для введення промтів до веб-сторінок (URL) або вибору документів, будь ласка, використовуйте символ '#'.",
"Use Gravatar": "Змінити аватар", "Use Gravatar": "Змінити аватар",
"Use Initials": "Використовувати ініціали", "Use Initials": "Використовувати ініціали",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "користувач", "user": "користувач",
"User Permissions": "Права користувача", "User Permissions": "Права користувача",
"Users": "Користувачі", "Users": "Користувачі",
@@ -503,13 +508,13 @@
"variable": "змінна", "variable": "змінна",
"variable to have them replaced with clipboard content.": "змінна, щоб замінити їх вмістом буфера обміну.", "variable to have them replaced with clipboard content.": "змінна, щоб замінити їх вмістом буфера обміну.",
"Version": "Версія", "Version": "Версія",
"Warning": "", "Warning": "Увага!",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Попередження: Якщо ви оновлюєте або змінюєте модель вбудовування, вам потрібно буде повторно імпортувати всі документи.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Попередження: Якщо ви оновлюєте або змінюєте модель вбудовування, вам потрібно буде повторно імпортувати всі документи.",
"Web": "Веб", "Web": "Веб",
"Web Loader Settings": "Налаштування веб-завантажувача", "Web Loader Settings": "Налаштування веб-завантажувача",
"Web Params": "Налаштування веб-завантажувача", "Web Params": "Налаштування веб-завантажувача",
"Web Search": "", "Web Search": "Веб-пошук",
"Web Search Engine": "", "Web Search Engine": "Веб-пошукова система",
"Webhook URL": "URL веб-запиту", "Webhook URL": "URL веб-запиту",
"WebUI Add-ons": "Додатки WebUI", "WebUI Add-ons": "Додатки WebUI",
"WebUI Settings": "Налаштування WebUI", "WebUI Settings": "Налаштування WebUI",
@@ -522,7 +527,7 @@
"Write a summary in 50 words that summarizes [topic or keyword].": "Напишіть стислий зміст у 50 слів, який узагальнює [тема або ключове слово].", "Write a summary in 50 words that summarizes [topic or keyword].": "Напишіть стислий зміст у 50 слів, який узагальнює [тема або ключове слово].",
"Yesterday": "Вчора", "Yesterday": "Вчора",
"You": "Ви", "You": "Ви",
"You cannot clone a base model": "", "You cannot clone a base model": "Базову модель не можна клонувати",
"You have no archived conversations.": "У вас немає архівованих розмов.", "You have no archived conversations.": "У вас немає архівованих розмов.",
"You have shared this chat": "Ви поділилися цим чатом", "You have shared this chat": "Ви поділилися цим чатом",
"You're a helpful assistant.": "Ви корисний асистент.", "You're a helpful assistant.": "Ви корисний асистент.",
+33 -28
View File
@@ -8,13 +8,13 @@
"{{modelName}} is thinking...": "{{modelName}} đang suy nghĩ...", "{{modelName}} is thinking...": "{{modelName}} đang suy nghĩ...",
"{{user}}'s Chats": "{{user}}'s Chats", "{{user}}'s Chats": "{{user}}'s Chats",
"{{webUIName}} Backend Required": "{{webUIName}} Yêu cầu Backend", "{{webUIName}} Backend Required": "{{webUIName}} Yêu cầu Backend",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Mô hình tác vụ được sử dụng khi thực hiện các tác vụ như tạo tiêu đề cho cuộc trò chuyện và truy vấn tìm kiếm trên web",
"a user": "người sử dụng", "a user": "người sử dụng",
"About": "Giới thiệu", "About": "Giới thiệu",
"Account": "Tài khoản", "Account": "Tài khoản",
"Accurate information": "Thông tin chính xác", "Accurate information": "Thông tin chính xác",
"Add": "Thêm", "Add": "Thêm",
"Add a model id": "", "Add a model id": "Thêm model id",
"Add a short description about what this model does": "Thêm mô tả ngắn về những khả năng của model", "Add a short description about what this model does": "Thêm mô tả ngắn về những khả năng của model",
"Add a short title for this prompt": "Thêm tiêu đề ngắn cho prompt này", "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 a tag": "Thêm thẻ (tag)",
@@ -31,7 +31,7 @@
"Admin Panel": "Trang Quản trị", "Admin Panel": "Trang Quản trị",
"Admin Settings": "Cài đặt hệ thống", "Admin Settings": "Cài đặt hệ thống",
"Advanced Parameters": "Các tham số Nâng cao", "Advanced Parameters": "Các tham số Nâng cao",
"Advanced Params": "", "Advanced Params": "Các tham số Nâng cao",
"all": "tất cả", "all": "tất cả",
"All Documents": "Tất cả tài liệu", "All Documents": "Tất cả tài liệu",
"All Users": "Danh sách người sử dụng", "All Users": "Danh sách người sử dụng",
@@ -93,14 +93,14 @@
"Click here to select documents.": "Bấm vào đây để chọn tài liệu.", "Click here to select documents.": "Bấm vào đây để chọn tài liệu.",
"click here.": "bấm vào đây.", "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.", "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.",
"Clone": "", "Clone": "Nhân bản",
"Close": "Đóng", "Close": "Đóng",
"Collection": "Tổng hợp mọi tài liệu", "Collection": "Tổng hợp mọi tài liệu",
"ComfyUI": "ComfyUI", "ComfyUI": "ComfyUI",
"ComfyUI Base URL": "ComfyUI Base URL", "ComfyUI Base URL": "ComfyUI Base URL",
"ComfyUI Base URL is required.": "Base URL của ComfyUI là bắt buộc.", "ComfyUI Base URL is required.": "Base URL của ComfyUI là bắt buộc.",
"Command": "Lệnh", "Command": "Lệnh",
"Concurrent Requests": "", "Concurrent Requests": "Các truy vấn đồng thời",
"Confirm Password": "Xác nhận Mật khẩu", "Confirm Password": "Xác nhận Mật khẩu",
"Connections": "Kết nối", "Connections": "Kết nối",
"Content": "Nội dung", "Content": "Nội dung",
@@ -131,7 +131,7 @@
"Default (Automatic1111)": "Mặc định (Automatic1111)", "Default (Automatic1111)": "Mặc định (Automatic1111)",
"Default (SentenceTransformers)": "Mặc định (SentenceTransformers)", "Default (SentenceTransformers)": "Mặc định (SentenceTransformers)",
"Default (Web API)": "Mặc định (Web API)", "Default (Web API)": "Mặc định (Web API)",
"Default Model": "", "Default Model": "Model mặc định",
"Default model updated": "Mô hình mặc định đã được cập nhật", "Default model updated": "Mô hình mặc định đã được cập nhật",
"Default Prompt Suggestions": "Đề xuất prompt mặc định", "Default Prompt Suggestions": "Đề xuất prompt mặc định",
"Default User Role": "Vai trò mặc định", "Default User Role": "Vai trò mặc định",
@@ -173,27 +173,27 @@
"Embedding Model Engine": "Trình xử lý embedding", "Embedding Model Engine": "Trình xử lý embedding",
"Embedding model set to \"{{embedding_model}}\"": "Mô hình embedding đã được thiết lập thành \"{{embedding_model}}\"", "Embedding model set to \"{{embedding_model}}\"": "Mô hình embedding đã được thiết lập thành \"{{embedding_model}}\"",
"Enable Chat History": "Bật Lịch sử chat", "Enable Chat History": "Bật Lịch sử chat",
"Enable Community Sharing": "", "Enable Community Sharing": "Kích hoạt Chia sẻ Cộng đồng",
"Enable New Sign Ups": "Cho phép đăng ký mới", "Enable New Sign Ups": "Cho phép đăng ký mới",
"Enable Web Search": "", "Enable Web Search": "Kích hoạt tìm kiếm Web",
"Enabled": "Đã bật", "Enabled": "Đã bật",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Đảm bảo tệp CSV của bạn bao gồm 4 cột theo thứ tự sau: Name, Email, Password, Role.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Đảm bảo tệp CSV của bạn bao gồm 4 cột theo thứ tự sau: Name, Email, Password, Role.",
"Enter {{role}} message here": "Nhập yêu cầu của {{role}} ở đây", "Enter {{role}} message here": "Nhập yêu cầu của {{role}} ở đây",
"Enter a detail about yourself for your LLMs to recall": "Nhập chi tiết về bản thân của bạn để LLMs có thể nhớ", "Enter a detail about yourself for your LLMs to recall": "Nhập chi tiết về bản thân của bạn để LLMs có thể nhớ",
"Enter Brave Search API Key": "", "Enter Brave Search API Key": "Nhập API key cho Brave Search",
"Enter Chunk Overlap": "Nhập Chunk chồng lấn (overlap)", "Enter Chunk Overlap": "Nhập Chunk chồng lấn (overlap)",
"Enter Chunk Size": "Nhập Kích thước Chunk", "Enter Chunk Size": "Nhập Kích thước Chunk",
"Enter Github Raw URL": "", "Enter Github Raw URL": "Nhập URL cho Github Raw",
"Enter Google PSE API Key": "", "Enter Google PSE API Key": "Nhập Google PSE API Key",
"Enter Google PSE Engine Id": "", "Enter Google PSE Engine Id": "Nhập Google PSE Engine Id",
"Enter Image Size (e.g. 512x512)": "Nhập Kích thước ảnh (vd: 512x512)", "Enter Image Size (e.g. 512x512)": "Nhập Kích thước ảnh (vd: 512x512)",
"Enter language codes": "Nhập mã ngôn ngữ", "Enter language codes": "Nhập mã ngôn ngữ",
"Enter model tag (e.g. {{modelTag}})": "Nhập thẻ mô hình (vd: {{modelTag}})", "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 Number of Steps (e.g. 50)": "Nhập số Steps (vd: 50)",
"Enter Score": "Nhập Score", "Enter Score": "Nhập Score",
"Enter Searxng Query URL": "", "Enter Searxng Query URL": "Nhập Query URL cho Searxng",
"Enter Serper API Key": "", "Enter Serper API Key": "Nhập Serper API Key",
"Enter Serpstack API Key": "", "Enter Serpstack API Key": "Nhập Serpstack API Key",
"Enter stop sequence": "Nhập stop sequence", "Enter stop sequence": "Nhập stop sequence",
"Enter Top K": "Nhập Top K", "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 URL (e.g. http://127.0.0.1:7860/)": "Nhập URL (vd: http://127.0.0.1:7860/)",
@@ -204,10 +204,11 @@
"Enter Your Role": "Nhập vai trò của bạn", "Enter Your Role": "Nhập vai trò của bạn",
"Error": "Lỗi", "Error": "Lỗi",
"Experimental": "Thử nghiệm", "Experimental": "Thử nghiệm",
"Export": "",
"Export All Chats (All Users)": "Tải về tất cả nội dung chat (tất cả mọi người)", "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 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 Documents Mapping": "Tải cấu trúc tài liệu về máy",
"Export Models": "", "Export Models": "Tải Models về máy",
"Export Prompts": "Tải các prompt về máy", "Export Prompts": "Tải các prompt về máy",
"Failed to create API Key.": "Lỗi khởi tạo API Key", "Failed to create API Key.": "Lỗi khởi tạo API Key",
"Failed to read clipboard contents": "Không thể đọc nội dung clipboard", "Failed to read clipboard contents": "Không thể đọc nội dung clipboard",
@@ -224,7 +225,7 @@
"Full Screen Mode": "Chế độ Toàn màn hình", "Full Screen Mode": "Chế độ Toàn màn hình",
"General": "Cài đặt chung", "General": "Cài đặt chung",
"General Settings": "Cấu hình chung", "General Settings": "Cấu hình chung",
"Generating search query": "", "Generating search query": "Tạo truy vấn tìm kiếm",
"Generation Info": "Thông tin chung", "Generation Info": "Thông tin chung",
"Good Response": "Trả lời tốt", "Good Response": "Trả lời tốt",
"Google PSE API Key": "", "Google PSE API Key": "",
@@ -253,7 +254,7 @@
"January": "Tháng 1", "January": "Tháng 1",
"join our Discord for help.": "tham gia Discord của chúng tôi để được trợ giúp.", "join our Discord for help.": "tham gia Discord của chúng tôi để được trợ giúp.",
"JSON": "JSON", "JSON": "JSON",
"JSON Preview": "", "JSON Preview": "Xem trước JSON",
"July": "Tháng 7", "July": "Tháng 7",
"June": "Tháng 6", "June": "Tháng 6",
"JWT Expiration": "JWT Hết hạn", "JWT Expiration": "JWT Hết hạn",
@@ -270,9 +271,9 @@
"Make sure to enclose them with": "Hãy chắc chắn bao quanh chúng bằng", "Make sure to enclose them with": "Hãy chắc chắn bao quanh chúng bằng",
"Manage Models": "Quản lý mô hình", "Manage Models": "Quản lý mô hình",
"Manage Ollama Models": "Quản lý mô hình với Ollama", "Manage Ollama Models": "Quản lý mô hình với Ollama",
"Manage Pipelines": "", "Manage Pipelines": "Quản lý Pipelines",
"March": "Tháng 3", "March": "Tháng 3",
"Max Tokens (num_predict)": "", "Max Tokens (num_predict)": "Tokens tối đa (num_predict)",
"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.", "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.",
"May": "Tháng 5", "May": "Tháng 5",
"Memories accessible by LLMs will be shown here.": "Memory có thể truy cập bởi LLMs sẽ hiển thị ở đây.", "Memories accessible by LLMs will be shown here.": "Memory có thể truy cập bởi LLMs sẽ hiển thị ở đây.",
@@ -304,19 +305,21 @@
"New Chat": "Tạo chat mới", "New Chat": "Tạo chat mới",
"New Password": "Mật khẩu mới", "New Password": "Mật khẩu mới",
"No results found": "Không tìm thấy kết quả", "No results found": "Không tìm thấy kết quả",
"No search query generated": "", "No search query generated": "Không có truy vấn tìm kiếm nào được tạo ra",
"No source available": "Không có nguồn", "No source available": "Không có nguồn",
"None": "", "None": "",
"Not factually correct": "Không chính xác so với thực tế", "Not factually correct": "Không chính xác so với thực tế",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Lưu ý: Nếu bạn đặt điểm (Score) tối thiểu thì tìm kiếm sẽ chỉ trả về những tài liệu có điểm lớn hơn hoặc bằng điểm tối thiểu.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Lưu ý: Nếu bạn đặt điểm (Score) tối thiểu thì tìm kiếm sẽ chỉ trả về những tài liệu có điểm lớn hơn hoặc bằng điểm tối thiểu.",
"Notifications": "Thông báo trên máy tính (Notification)", "Notifications": "Thông báo trên máy tính (Notification)",
"November": "Tháng 11", "November": "Tháng 11",
"num_thread (Ollama)": "",
"October": "Tháng 10", "October": "Tháng 10",
"Off": "Tắt", "Off": "Tắt",
"Okay, Let's Go!": "Được rồi, Bắt đầu thôi!", "Okay, Let's Go!": "Được rồi, Bắt đầu thôi!",
"OLED Dark": "OLED Dark", "OLED Dark": "OLED Dark",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Phiên bản Ollama", "Ollama Version": "Phiên bản Ollama",
"On": "Bật", "On": "Bật",
"Only": "Only", "Only": "Only",
@@ -391,9 +394,9 @@
"Search Documents": "Tìm tài liệu", "Search Documents": "Tìm tài liệu",
"Search Models": "Tìm model", "Search Models": "Tìm model",
"Search Prompts": "Tìm prompt", "Search Prompts": "Tìm prompt",
"Search Result Count": "", "Search Result Count": "Số kết quả tìm kiếm",
"Searched {{count}} sites_other": "", "Searched {{count}} sites_other": "Đã tìm {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "", "Searching the web for '{{searchQuery}}'": "Tìm kiếm web cho '{{searchQuery}}'",
"Searxng Query URL": "", "Searxng Query URL": "",
"See readme.md for instructions": "Xem readme.md để biết hướng dẫn", "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", "See what's new": "Xem những cập nhật mới",
@@ -405,7 +408,7 @@
"Select a pipeline url": "", "Select a pipeline url": "",
"Select an Ollama instance": "Chọn một thực thể Ollama", "Select an Ollama instance": "Chọn một thực thể Ollama",
"Select model": "Chọn model", "Select model": "Chọn model",
"Selected model(s) do not support image inputs": "", "Selected model(s) do not support image inputs": "Model được lựa chọn không hỗ trợ đầu vào là hình ảnh",
"Send": "Gửi", "Send": "Gửi",
"Send a Message": "Gửi yêu cầu", "Send a Message": "Gửi yêu cầu",
"Send message": "Gửi yêu cầu", "Send message": "Gửi yêu cầu",
@@ -486,12 +489,14 @@
"Update and Copy Link": "Cập nhật và sao chép link", "Update and Copy Link": "Cập nhật và sao chép link",
"Update password": "Cập nhật mật khẩu", "Update password": "Cập nhật mật khẩu",
"Upload a GGUF model": "Tải lên mô hình GGUF", "Upload a GGUF model": "Tải lên mô hình GGUF",
"Upload Files": "", "Upload Files": "Tải tệp lên máy chủ",
"Upload Progress": "Tiến trình 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", "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 '#' 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", "Use Gravatar": "Sử dụng Gravatar",
"Use Initials": "Sử dụng tên viết tắt", "Use Initials": "Sử dụng tên viết tắt",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "Người sử dụng", "user": "Người sử dụng",
"User Permissions": "Phân quyền sử dụng", "User Permissions": "Phân quyền sử dụng",
"Users": "người sử dụng", "Users": "người sử dụng",
@@ -505,8 +510,8 @@
"Web": "Web", "Web": "Web",
"Web Loader Settings": "Cài đặt Web Loader", "Web Loader Settings": "Cài đặt Web Loader",
"Web Params": "Web Params", "Web Params": "Web Params",
"Web Search": "", "Web Search": "Tìm kiếm Web",
"Web Search Engine": "", "Web Search Engine": "Chức năng Tìm kiếm Web",
"Webhook URL": "Webhook URL", "Webhook URL": "Webhook URL",
"WebUI Add-ons": "Tiện ích WebUI", "WebUI Add-ons": "Tiện ích WebUI",
"WebUI Settings": "Cài đặt WebUI", "WebUI Settings": "Cài đặt WebUI",
@@ -204,6 +204,7 @@
"Enter Your Role": "输入您的角色", "Enter Your Role": "输入您的角色",
"Error": "", "Error": "",
"Experimental": "实验性", "Experimental": "实验性",
"Export": "",
"Export All Chats (All Users)": "导出所有聊天(所有用户)", "Export All Chats (All Users)": "导出所有聊天(所有用户)",
"Export Chats": "导出聊天", "Export Chats": "导出聊天",
"Export Documents Mapping": "导出文档映射", "Export Documents Mapping": "导出文档映射",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "注意:如果设置了最低分数,搜索只会返回分数大于或等于最低分数的文档。", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "注意:如果设置了最低分数,搜索只会返回分数大于或等于最低分数的文档。",
"Notifications": "桌面通知", "Notifications": "桌面通知",
"November": "十一月", "November": "十一月",
"num_thread (Ollama)": "",
"October": "十月", "October": "十月",
"Off": "关闭", "Off": "关闭",
"Okay, Let's Go!": "好的,我们开始吧!", "Okay, Let's Go!": "好的,我们开始吧!",
"OLED Dark": "暗黑色", "OLED Dark": "暗黑色",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Ollama 版本", "Ollama Version": "Ollama 版本",
"On": "开", "On": "开",
"Only": "仅", "Only": "仅",
@@ -492,6 +495,8 @@
"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",
"Use Initials": "使用首字母缩写", "Use Initials": "使用首字母缩写",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "用户", "user": "用户",
"User Permissions": "用户权限", "User Permissions": "用户权限",
"Users": "用户", "Users": "用户",
@@ -204,6 +204,7 @@
"Enter Your Role": "輸入你的角色", "Enter Your Role": "輸入你的角色",
"Error": "", "Error": "",
"Experimental": "實驗功能", "Experimental": "實驗功能",
"Export": "",
"Export All Chats (All Users)": "匯出所有聊天紀錄(所有使用者)", "Export All Chats (All Users)": "匯出所有聊天紀錄(所有使用者)",
"Export Chats": "匯出聊天紀錄", "Export Chats": "匯出聊天紀錄",
"Export Documents Mapping": "匯出文件映射", "Export Documents Mapping": "匯出文件映射",
@@ -311,12 +312,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "註:如果設置最低分數,則搜索將只返回分數大於或等於最低分數的文檔。", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "註:如果設置最低分數,則搜索將只返回分數大於或等於最低分數的文檔。",
"Notifications": "桌面通知", "Notifications": "桌面通知",
"November": "11月", "November": "11月",
"num_thread (Ollama)": "",
"October": "10 月", "October": "10 月",
"Off": "關閉", "Off": "關閉",
"Okay, Let's Go!": "好的,啟動吧!", "Okay, Let's Go!": "好的,啟動吧!",
"OLED Dark": "`", "OLED Dark": "`",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Ollama 版本", "Ollama Version": "Ollama 版本",
"On": "開啟", "On": "開啟",
"Only": "僅有", "Only": "僅有",
@@ -492,6 +495,8 @@
"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",
"Use Initials": "使用初始头像", "Use Initials": "使用初始头像",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "使用者", "user": "使用者",
"User Permissions": "使用者權限", "User Permissions": "使用者權限",
"Users": "使用者", "Users": "使用者",