mirror of
https://git.mirrors.martin98.com/https://github.com/open-webui/open-webui
synced 2025-08-19 18:19:12 +08:00
Merge remote-tracking branch 'upstream/dev' into dev
This commit is contained in:
commit
7589e4f5e5
4
.github/workflows/deploy-to-hf-spaces.yml
vendored
4
.github/workflows/deploy-to-hf-spaces.yml
vendored
@ -28,6 +28,8 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
lfs: true
|
||||
|
||||
- name: Remove git history
|
||||
run: rm -rf .git
|
||||
@ -52,7 +54,9 @@ jobs:
|
||||
- name: Set up Git and push to Space
|
||||
run: |
|
||||
git init --initial-branch=main
|
||||
git lfs install
|
||||
git lfs track "*.ttf"
|
||||
git lfs track "*.jpg"
|
||||
rm demo.gif
|
||||
git add .
|
||||
git commit -m "GitHub deploy: ${{ github.sha }}"
|
||||
|
61
CHANGELOG.md
61
CHANGELOG.md
@ -5,6 +5,67 @@ All notable changes to this project will be documented in this file.
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [0.4.1] - 2024-11-19
|
||||
|
||||
### Added
|
||||
|
||||
- **📊 Enhanced Feedback System**: Introduced a detailed 1-10 rating scale for feedback alongside thumbs up/down, preparing for more precise model fine-tuning and improving feedback quality.
|
||||
- **ℹ️ Tool Descriptions on Hover**: Easily access tool descriptions by hovering over the message input, providing a smoother workflow with more context when utilizing tools.
|
||||
|
||||
### Fixed
|
||||
|
||||
- **🗑️ Graceful Handling of Deleted Users**: Resolved an issue where deleted users caused workspace items (models, knowledge, prompts, tools) to fail, ensuring reliable workspace loading.
|
||||
- **🔑 API Key Creation**: Fixed an issue preventing users from creating new API keys, restoring secure and seamless API management.
|
||||
- **🔗 HTTPS Proxy Fix**: Corrected HTTPS proxy issues affecting the '/api/v1/models/' endpoint, ensuring smoother, uninterrupted model management.
|
||||
|
||||
## [0.4.0] - 2024-11-19
|
||||
|
||||
### Added
|
||||
|
||||
- **👥 User Groups**: You can now create and manage user groups, making user organization seamless.
|
||||
- **🔐 Group-Based Access Control**: Set granular access to models, knowledge, prompts, and tools based on user groups, allowing for more controlled and secure environments.
|
||||
- **🛠️ Group-Based User Permissions**: Easily manage workspace permissions. Grant users the ability to upload files, delete, edit, or create temporary chats, as well as define their ability to create models, knowledge, prompts, and tools.
|
||||
- **🔑 LDAP Support**: Newly introduced LDAP authentication adds robust security and scalability to user management.
|
||||
- **🌐 Enhanced OpenAI-Compatible Connections**: Added prefix ID support to avoid model ID clashes, with explicit model ID support for APIs lacking '/models' endpoint support, ensuring smooth operation with custom setups.
|
||||
- **🔐 Ollama API Key Support**: Now manage credentials for Ollama when set behind proxies, including the option to utilize prefix ID for proper distinction across multiple Ollama instances.
|
||||
- **🔄 Connection Enable/Disable Toggle**: Easily enable or disable individual OpenAI and Ollama connections as needed.
|
||||
- **🎨 Redesigned Model Workspace**: Freshly redesigned to improve usability for managing models across users and groups.
|
||||
- **🎨 Redesigned Prompt Workspace**: A fresh UI to conveniently organize and manage prompts.
|
||||
- **🧩 Sorted Functions Workspace**: Functions are now automatically categorized by type (Action, Filter, Pipe), streamlining management.
|
||||
- **💻 Redesigned Collaborative Workspace**: Enhanced support for multiple users contributing to models, knowledge, prompts, or tools, improving collaboration.
|
||||
- **🔧 Auto-Selected Tools in Model Editor**: Tools enabled through the model editor are now automatically selected, whereas previously it only gave users the option to enable the tool, reducing manual steps and enhancing efficiency.
|
||||
- **🔔 Web Search & Tools Indicator**: A clear indication now shows when web search or tools are active, reducing confusion.
|
||||
- **🔑 Toggle API Key Auth**: Tighten security by easily enabling or disabling API key authentication option for Open WebUI.
|
||||
- **🗂️ Agentic Retrieval**: Improve RAG accuracy via smart pre-processing of chat history to determine the best queries before retrieval.
|
||||
- **📁 Large Text as File Option**: Optionally convert large pasted text into a file upload, keeping the chat interface cleaner.
|
||||
- **🗂️ Toggle Citations for Models**: Ability to disable citations has been introduced in the model editor.
|
||||
- **🔍 User Settings Search**: Quickly search for settings fields, improving ease of use and navigation.
|
||||
- **🗣️ Experimental SpeechT5 TTS**: Local SpeechT5 support added for improved text-to-speech capabilities.
|
||||
- **🔄 Unified Reset for Models**: A one-click option has been introduced to reset and remove all models from the Admin Settings.
|
||||
- **🛠️ Initial Setup Wizard**: The setup process now explicitly informs users that they are creating an admin account during the first-time setup, ensuring clarity. Previously, users encountered the login page right away without this distinction.
|
||||
- **🌐 Enhanced Translations**: Several language translations, including Ukrainian, Norwegian, and Brazilian Portuguese, were refined for better localization.
|
||||
|
||||
### Fixed
|
||||
|
||||
- **🎥 YouTube Video Attachments**: Fixed issues preventing proper loading and attachment of YouTube videos as files.
|
||||
- **🔄 Shared Chat Update**: Corrected issues where shared chats were not updating, improving collaboration consistency.
|
||||
- **🔍 DuckDuckGo Rate Limit Fix**: Addressed issues with DuckDuckGo search integration, enhancing search stability and performance when operating within rate limits.
|
||||
- **🧾 Citations Relevance Fix**: Adjusted the relevance percentage calculation for citations, so that Open WebUI properly reflect the accuracy of a retrieved document in RAG, ensuring users get clearer insights into sources.
|
||||
- **🔑 Jina Search API Key Requirement**: Added the option to input an API key for Jina Search, ensuring smooth functionality as keys are now mandatory.
|
||||
|
||||
### Changed
|
||||
|
||||
- **🛠️ Functions Moved to Admin Panel**: As Functions operate as advanced plugins, they are now accessible from the Admin Panel instead of the workspace.
|
||||
- **🛠️ Manage Ollama Connections**: The "Models" section in Admin Settings has been relocated to Admin Settings > "Connections" > Ollama Connections. You can now manage Ollama instances via a dedicated "Manage Ollama" modal from "Connections", streamlining the setup and configuration of Ollama models.
|
||||
- **📊 Base Models in Admin Settings**: Admins can now find all base models, both connections or functions, in the "Models" Admin setting. Global model accessibility can be enabled or disabled here. Models are private by default, requiring explicit permission assignment for user access.
|
||||
- **📌 Sticky Model Selection for New Chats**: The model chosen from a previous chat now persists when creating a new chat. If you click "New Chat" again from the new chat page, it will revert to your default model.
|
||||
- **🎨 Design Refactoring**: Overall design refinements across the platform have been made, providing a more cohesive and polished user experience.
|
||||
|
||||
### Removed
|
||||
|
||||
- **📂 Model List Reordering**: Temporarily removed and will be reintroduced in upcoming user group settings improvements.
|
||||
- **⚙️ Default Model Setting**: Removed the ability to set a default model for users, will be reintroduced with user group settings in the future.
|
||||
|
||||
## [0.3.35] - 2024-10-26
|
||||
|
||||
### Added
|
||||
|
@ -362,8 +362,6 @@ async def get_ollama_tags(
|
||||
user.id, type="read", access_control=model_info.access_control
|
||||
):
|
||||
filtered_models.append(model)
|
||||
else:
|
||||
filtered_models.append(model)
|
||||
models["models"] = filtered_models
|
||||
|
||||
return models
|
||||
@ -931,9 +929,6 @@ async def generate_chat_completion(
|
||||
del payload["metadata"]
|
||||
|
||||
model_id = payload["model"]
|
||||
if ":" not in model_id:
|
||||
model_id = f"{model_id}:latest"
|
||||
|
||||
model_info = Models.get_model_by_id(model_id)
|
||||
|
||||
if model_info:
|
||||
@ -963,6 +958,12 @@ async def generate_chat_completion(
|
||||
status_code=403,
|
||||
detail="Model not found",
|
||||
)
|
||||
elif not bypass_filter:
|
||||
if user.role != "admin":
|
||||
raise HTTPException(
|
||||
status_code=403,
|
||||
detail="Model not found",
|
||||
)
|
||||
|
||||
if ":" not in payload["model"]:
|
||||
payload["model"] = f"{payload['model']}:latest"
|
||||
@ -1051,6 +1052,12 @@ async def generate_openai_chat_completion(
|
||||
status_code=403,
|
||||
detail="Model not found",
|
||||
)
|
||||
else:
|
||||
if user.role != "admin":
|
||||
raise HTTPException(
|
||||
status_code=403,
|
||||
detail="Model not found",
|
||||
)
|
||||
|
||||
if ":" not in payload["model"]:
|
||||
payload["model"] = f"{payload['model']}:latest"
|
||||
@ -1133,8 +1140,6 @@ async def get_openai_models(
|
||||
user.id, type="read", access_control=model_info.access_control
|
||||
):
|
||||
filtered_models.append(model)
|
||||
else:
|
||||
filtered_models.append(model)
|
||||
models = filtered_models
|
||||
|
||||
return {
|
||||
|
@ -313,7 +313,9 @@ async def get_all_models_responses() -> list:
|
||||
prefix_id = api_config.get("prefix_id", None)
|
||||
|
||||
if prefix_id:
|
||||
for model in response["data"]:
|
||||
for model in (
|
||||
response if isinstance(response, list) else response.get("data", [])
|
||||
):
|
||||
model["id"] = f"{prefix_id}.{model['id']}"
|
||||
|
||||
log.debug(f"get_all_models:responses() {responses}")
|
||||
@ -424,8 +426,6 @@ async def get_models(url_idx: Optional[int] = None, user=Depends(get_verified_us
|
||||
user.id, type="read", access_control=model_info.access_control
|
||||
):
|
||||
filtered_models.append(model)
|
||||
else:
|
||||
filtered_models.append(model)
|
||||
models["data"] = filtered_models
|
||||
|
||||
return models
|
||||
@ -512,6 +512,12 @@ async def generate_chat_completion(
|
||||
status_code=403,
|
||||
detail="Model not found",
|
||||
)
|
||||
elif not bypass_filter:
|
||||
if user.role != "admin":
|
||||
raise HTTPException(
|
||||
status_code=403,
|
||||
detail="Model not found",
|
||||
)
|
||||
|
||||
# Attemp to get urlIdx from the model
|
||||
models = await get_all_models()
|
||||
|
98
backend/open_webui/apps/retrieval/loaders/youtube.py
Normal file
98
backend/open_webui/apps/retrieval/loaders/youtube.py
Normal file
@ -0,0 +1,98 @@
|
||||
from typing import Any, Dict, Generator, List, Optional, Sequence, Union
|
||||
from urllib.parse import parse_qs, urlparse
|
||||
from langchain_core.documents import Document
|
||||
|
||||
|
||||
ALLOWED_SCHEMES = {"http", "https"}
|
||||
ALLOWED_NETLOCS = {
|
||||
"youtu.be",
|
||||
"m.youtube.com",
|
||||
"youtube.com",
|
||||
"www.youtube.com",
|
||||
"www.youtube-nocookie.com",
|
||||
"vid.plus",
|
||||
}
|
||||
|
||||
|
||||
def _parse_video_id(url: str) -> Optional[str]:
|
||||
"""Parse a YouTube URL and return the video ID if valid, otherwise None."""
|
||||
parsed_url = urlparse(url)
|
||||
|
||||
if parsed_url.scheme not in ALLOWED_SCHEMES:
|
||||
return None
|
||||
|
||||
if parsed_url.netloc not in ALLOWED_NETLOCS:
|
||||
return None
|
||||
|
||||
path = parsed_url.path
|
||||
|
||||
if path.endswith("/watch"):
|
||||
query = parsed_url.query
|
||||
parsed_query = parse_qs(query)
|
||||
if "v" in parsed_query:
|
||||
ids = parsed_query["v"]
|
||||
video_id = ids if isinstance(ids, str) else ids[0]
|
||||
else:
|
||||
return None
|
||||
else:
|
||||
path = parsed_url.path.lstrip("/")
|
||||
video_id = path.split("/")[-1]
|
||||
|
||||
if len(video_id) != 11: # Video IDs are 11 characters long
|
||||
return None
|
||||
|
||||
return video_id
|
||||
|
||||
|
||||
class YoutubeLoader:
|
||||
"""Load `YouTube` video transcripts."""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
video_id: str,
|
||||
language: Union[str, Sequence[str]] = "en",
|
||||
):
|
||||
"""Initialize with YouTube video ID."""
|
||||
_video_id = _parse_video_id(video_id)
|
||||
self.video_id = _video_id if _video_id is not None else video_id
|
||||
self._metadata = {"source": video_id}
|
||||
self.language = language
|
||||
if isinstance(language, str):
|
||||
self.language = [language]
|
||||
else:
|
||||
self.language = language
|
||||
|
||||
def load(self) -> List[Document]:
|
||||
"""Load YouTube transcripts into `Document` objects."""
|
||||
try:
|
||||
from youtube_transcript_api import (
|
||||
NoTranscriptFound,
|
||||
TranscriptsDisabled,
|
||||
YouTubeTranscriptApi,
|
||||
)
|
||||
except ImportError:
|
||||
raise ImportError(
|
||||
'Could not import "youtube_transcript_api" Python package. '
|
||||
"Please install it with `pip install youtube-transcript-api`."
|
||||
)
|
||||
|
||||
try:
|
||||
transcript_list = YouTubeTranscriptApi.list_transcripts(self.video_id)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return []
|
||||
|
||||
try:
|
||||
transcript = transcript_list.find_transcript(self.language)
|
||||
except NoTranscriptFound:
|
||||
transcript = transcript_list.find_transcript(["en"])
|
||||
|
||||
transcript_pieces: List[Dict[str, Any]] = transcript.fetch()
|
||||
|
||||
transcript = " ".join(
|
||||
map(
|
||||
lambda transcript_piece: transcript_piece["text"].strip(" "),
|
||||
transcript_pieces,
|
||||
)
|
||||
)
|
||||
return [Document(page_content=transcript, metadata=self._metadata)]
|
@ -23,6 +23,7 @@ from open_webui.apps.retrieval.vector.connector import VECTOR_DB_CLIENT
|
||||
|
||||
# Document loaders
|
||||
from open_webui.apps.retrieval.loaders.main import Loader
|
||||
from open_webui.apps.retrieval.loaders.youtube import YoutubeLoader
|
||||
|
||||
# Web search engines
|
||||
from open_webui.apps.retrieval.web.main import SearchResult
|
||||
@ -75,6 +76,8 @@ from open_webui.config import (
|
||||
RAG_FILE_MAX_SIZE,
|
||||
RAG_OPENAI_API_BASE_URL,
|
||||
RAG_OPENAI_API_KEY,
|
||||
RAG_OLLAMA_BASE_URL,
|
||||
RAG_OLLAMA_API_KEY,
|
||||
RAG_RELEVANCE_THRESHOLD,
|
||||
RAG_RERANKING_MODEL,
|
||||
RAG_RERANKING_MODEL_AUTO_UPDATE,
|
||||
@ -118,9 +121,6 @@ from open_webui.utils.misc import (
|
||||
from open_webui.utils.utils import get_admin_user, get_verified_user
|
||||
|
||||
from langchain.text_splitter import RecursiveCharacterTextSplitter, TokenTextSplitter
|
||||
from langchain_community.document_loaders import (
|
||||
YoutubeLoader,
|
||||
)
|
||||
from langchain_core.documents import Document
|
||||
|
||||
|
||||
@ -163,6 +163,9 @@ app.state.config.RAG_TEMPLATE = RAG_TEMPLATE
|
||||
app.state.config.OPENAI_API_BASE_URL = RAG_OPENAI_API_BASE_URL
|
||||
app.state.config.OPENAI_API_KEY = RAG_OPENAI_API_KEY
|
||||
|
||||
app.state.config.OLLAMA_BASE_URL = RAG_OLLAMA_BASE_URL
|
||||
app.state.config.OLLAMA_API_KEY = RAG_OLLAMA_API_KEY
|
||||
|
||||
app.state.config.PDF_EXTRACT_IMAGES = PDF_EXTRACT_IMAGES
|
||||
|
||||
app.state.config.YOUTUBE_LOADER_LANGUAGE = YOUTUBE_LOADER_LANGUAGE
|
||||
@ -261,8 +264,16 @@ app.state.EMBEDDING_FUNCTION = get_embedding_function(
|
||||
app.state.config.RAG_EMBEDDING_ENGINE,
|
||||
app.state.config.RAG_EMBEDDING_MODEL,
|
||||
app.state.sentence_transformer_ef,
|
||||
app.state.config.OPENAI_API_KEY,
|
||||
app.state.config.OPENAI_API_BASE_URL,
|
||||
(
|
||||
app.state.config.OPENAI_API_BASE_URL
|
||||
if app.state.config.RAG_EMBEDDING_ENGINE == "openai"
|
||||
else app.state.config.OLLAMA_BASE_URL
|
||||
),
|
||||
(
|
||||
app.state.config.OPENAI_API_KEY
|
||||
if app.state.config.RAG_EMBEDDING_ENGINE == "openai"
|
||||
else app.state.config.OLLAMA_API_KEY
|
||||
),
|
||||
app.state.config.RAG_EMBEDDING_BATCH_SIZE,
|
||||
)
|
||||
|
||||
@ -312,6 +323,10 @@ async def get_embedding_config(user=Depends(get_admin_user)):
|
||||
"url": app.state.config.OPENAI_API_BASE_URL,
|
||||
"key": app.state.config.OPENAI_API_KEY,
|
||||
},
|
||||
"ollama_config": {
|
||||
"url": app.state.config.OLLAMA_BASE_URL,
|
||||
"key": app.state.config.OLLAMA_API_KEY,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -328,8 +343,14 @@ class OpenAIConfigForm(BaseModel):
|
||||
key: str
|
||||
|
||||
|
||||
class OllamaConfigForm(BaseModel):
|
||||
url: str
|
||||
key: str
|
||||
|
||||
|
||||
class EmbeddingModelUpdateForm(BaseModel):
|
||||
openai_config: Optional[OpenAIConfigForm] = None
|
||||
ollama_config: Optional[OllamaConfigForm] = None
|
||||
embedding_engine: str
|
||||
embedding_model: str
|
||||
embedding_batch_size: Optional[int] = 1
|
||||
@ -350,6 +371,11 @@ async def update_embedding_config(
|
||||
if form_data.openai_config is not None:
|
||||
app.state.config.OPENAI_API_BASE_URL = form_data.openai_config.url
|
||||
app.state.config.OPENAI_API_KEY = form_data.openai_config.key
|
||||
|
||||
if form_data.ollama_config is not None:
|
||||
app.state.config.OLLAMA_BASE_URL = form_data.ollama_config.url
|
||||
app.state.config.OLLAMA_API_KEY = form_data.ollama_config.key
|
||||
|
||||
app.state.config.RAG_EMBEDDING_BATCH_SIZE = form_data.embedding_batch_size
|
||||
|
||||
update_embedding_model(app.state.config.RAG_EMBEDDING_MODEL)
|
||||
@ -358,8 +384,16 @@ async def update_embedding_config(
|
||||
app.state.config.RAG_EMBEDDING_ENGINE,
|
||||
app.state.config.RAG_EMBEDDING_MODEL,
|
||||
app.state.sentence_transformer_ef,
|
||||
app.state.config.OPENAI_API_KEY,
|
||||
app.state.config.OPENAI_API_BASE_URL,
|
||||
(
|
||||
app.state.config.OPENAI_API_BASE_URL
|
||||
if app.state.config.RAG_EMBEDDING_ENGINE == "openai"
|
||||
else app.state.config.OLLAMA_BASE_URL
|
||||
),
|
||||
(
|
||||
app.state.config.OPENAI_API_KEY
|
||||
if app.state.config.RAG_EMBEDDING_ENGINE == "openai"
|
||||
else app.state.config.OLLAMA_API_KEY
|
||||
),
|
||||
app.state.config.RAG_EMBEDDING_BATCH_SIZE,
|
||||
)
|
||||
|
||||
@ -372,6 +406,10 @@ async def update_embedding_config(
|
||||
"url": app.state.config.OPENAI_API_BASE_URL,
|
||||
"key": app.state.config.OPENAI_API_KEY,
|
||||
},
|
||||
"ollama_config": {
|
||||
"url": app.state.config.OLLAMA_BASE_URL,
|
||||
"key": app.state.config.OLLAMA_API_KEY,
|
||||
},
|
||||
}
|
||||
except Exception as e:
|
||||
log.exception(f"Problem updating embedding model: {e}")
|
||||
@ -785,8 +823,16 @@ def save_docs_to_vector_db(
|
||||
app.state.config.RAG_EMBEDDING_ENGINE,
|
||||
app.state.config.RAG_EMBEDDING_MODEL,
|
||||
app.state.sentence_transformer_ef,
|
||||
app.state.config.OPENAI_API_KEY,
|
||||
app.state.config.OPENAI_API_BASE_URL,
|
||||
(
|
||||
app.state.config.OPENAI_API_BASE_URL
|
||||
if app.state.config.RAG_EMBEDDING_ENGINE == "openai"
|
||||
else app.state.config.OLLAMA_BASE_URL
|
||||
),
|
||||
(
|
||||
app.state.config.OPENAI_API_KEY
|
||||
if app.state.config.RAG_EMBEDDING_ENGINE == "openai"
|
||||
else app.state.config.OLLAMA_API_KEY
|
||||
),
|
||||
app.state.config.RAG_EMBEDDING_BATCH_SIZE,
|
||||
)
|
||||
|
||||
@ -1011,12 +1057,10 @@ def process_youtube_video(form_data: ProcessUrlForm, user=Depends(get_verified_u
|
||||
if not collection_name:
|
||||
collection_name = calculate_sha256_string(form_data.url)[:63]
|
||||
|
||||
loader = YoutubeLoader.from_youtube_url(
|
||||
form_data.url,
|
||||
add_video_info=False,
|
||||
language=app.state.config.YOUTUBE_LOADER_LANGUAGE,
|
||||
translation=app.state.YOUTUBE_LOADER_TRANSLATION,
|
||||
loader = YoutubeLoader(
|
||||
form_data.url, language=app.state.config.YOUTUBE_LOADER_LANGUAGE
|
||||
)
|
||||
|
||||
docs = loader.load()
|
||||
content = " ".join([doc.page_content for doc in docs])
|
||||
log.debug(f"text_content: {content}")
|
||||
@ -1235,9 +1279,11 @@ def process_web_search(form_data: SearchForm, user=Depends(get_verified_user)):
|
||||
urls = [result.link for result in web_results]
|
||||
|
||||
loader = get_web_loader(
|
||||
urls, verify_ssl=app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION
|
||||
urls,
|
||||
verify_ssl=app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION,
|
||||
requests_per_second=app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
|
||||
)
|
||||
docs = loader.load()
|
||||
docs = loader.aload()
|
||||
|
||||
save_docs_to_vector_db(docs, collection_name, overwrite=True)
|
||||
|
||||
|
@ -11,11 +11,6 @@ from langchain.retrievers import ContextualCompressionRetriever, EnsembleRetriev
|
||||
from langchain_community.retrievers import BM25Retriever
|
||||
from langchain_core.documents import Document
|
||||
|
||||
|
||||
from open_webui.apps.ollama.main import (
|
||||
GenerateEmbedForm,
|
||||
generate_ollama_batch_embeddings,
|
||||
)
|
||||
from open_webui.apps.retrieval.vector.connector import VECTOR_DB_CLIENT
|
||||
from open_webui.utils.misc import get_last_user_message
|
||||
|
||||
@ -182,35 +177,34 @@ def merge_and_sort_query_results(
|
||||
|
||||
def query_collection(
|
||||
collection_names: list[str],
|
||||
query: str,
|
||||
queries: list[str],
|
||||
embedding_function,
|
||||
k: int,
|
||||
) -> dict:
|
||||
|
||||
results = []
|
||||
query_embedding = embedding_function(query)
|
||||
|
||||
for collection_name in collection_names:
|
||||
if collection_name:
|
||||
try:
|
||||
result = query_doc(
|
||||
collection_name=collection_name,
|
||||
k=k,
|
||||
query_embedding=query_embedding,
|
||||
)
|
||||
if result is not None:
|
||||
results.append(result.model_dump())
|
||||
except Exception as e:
|
||||
log.exception(f"Error when querying the collection: {e}")
|
||||
else:
|
||||
pass
|
||||
for query in queries:
|
||||
query_embedding = embedding_function(query)
|
||||
for collection_name in collection_names:
|
||||
if collection_name:
|
||||
try:
|
||||
result = query_doc(
|
||||
collection_name=collection_name,
|
||||
k=k,
|
||||
query_embedding=query_embedding,
|
||||
)
|
||||
if result is not None:
|
||||
results.append(result.model_dump())
|
||||
except Exception as e:
|
||||
log.exception(f"Error when querying the collection: {e}")
|
||||
else:
|
||||
pass
|
||||
|
||||
return merge_and_sort_query_results(results, k=k)
|
||||
|
||||
|
||||
def query_collection_with_hybrid_search(
|
||||
collection_names: list[str],
|
||||
query: str,
|
||||
queries: list[str],
|
||||
embedding_function,
|
||||
k: int,
|
||||
reranking_function,
|
||||
@ -220,15 +214,16 @@ def query_collection_with_hybrid_search(
|
||||
error = False
|
||||
for collection_name in collection_names:
|
||||
try:
|
||||
result = query_doc_with_hybrid_search(
|
||||
collection_name=collection_name,
|
||||
query=query,
|
||||
embedding_function=embedding_function,
|
||||
k=k,
|
||||
reranking_function=reranking_function,
|
||||
r=r,
|
||||
)
|
||||
results.append(result)
|
||||
for query in queries:
|
||||
result = query_doc_with_hybrid_search(
|
||||
collection_name=collection_name,
|
||||
query=query,
|
||||
embedding_function=embedding_function,
|
||||
k=k,
|
||||
reranking_function=reranking_function,
|
||||
r=r,
|
||||
)
|
||||
results.append(result)
|
||||
except Exception as e:
|
||||
log.exception(
|
||||
"Error when querying the collection with " f"hybrid_search: {e}"
|
||||
@ -285,25 +280,19 @@ def get_embedding_function(
|
||||
embedding_engine,
|
||||
embedding_model,
|
||||
embedding_function,
|
||||
openai_key,
|
||||
openai_url,
|
||||
url,
|
||||
key,
|
||||
embedding_batch_size,
|
||||
):
|
||||
if embedding_engine == "":
|
||||
return lambda query: embedding_function.encode(query).tolist()
|
||||
elif embedding_engine in ["ollama", "openai"]:
|
||||
|
||||
# Wrapper to run the async generate_embeddings synchronously.
|
||||
def sync_generate_embeddings(*args, **kwargs):
|
||||
return asyncio.run(generate_embeddings(*args, **kwargs))
|
||||
|
||||
# Semantic expectation from the original version (using sync wrapper).
|
||||
func = lambda query: sync_generate_embeddings(
|
||||
func = lambda query: generate_embeddings(
|
||||
engine=embedding_engine,
|
||||
model=embedding_model,
|
||||
text=query,
|
||||
key=openai_key if embedding_engine == "openai" else "",
|
||||
url=openai_url if embedding_engine == "openai" else "",
|
||||
url=url,
|
||||
key=key,
|
||||
)
|
||||
|
||||
def generate_multiple(query, func):
|
||||
@ -320,15 +309,14 @@ def get_embedding_function(
|
||||
|
||||
def get_rag_context(
|
||||
files,
|
||||
messages,
|
||||
queries,
|
||||
embedding_function,
|
||||
k,
|
||||
reranking_function,
|
||||
r,
|
||||
hybrid_search,
|
||||
):
|
||||
log.debug(f"files: {files} {messages} {embedding_function} {reranking_function}")
|
||||
query = get_last_user_message(messages)
|
||||
log.debug(f"files: {files} {queries} {embedding_function} {reranking_function}")
|
||||
|
||||
extracted_collections = []
|
||||
relevant_contexts = []
|
||||
@ -370,7 +358,7 @@ def get_rag_context(
|
||||
try:
|
||||
context = query_collection_with_hybrid_search(
|
||||
collection_names=collection_names,
|
||||
query=query,
|
||||
queries=queries,
|
||||
embedding_function=embedding_function,
|
||||
k=k,
|
||||
reranking_function=reranking_function,
|
||||
@ -385,7 +373,7 @@ def get_rag_context(
|
||||
if (not hybrid_search) or (context is None):
|
||||
context = query_collection(
|
||||
collection_names=collection_names,
|
||||
query=query,
|
||||
queries=queries,
|
||||
embedding_function=embedding_function,
|
||||
k=k,
|
||||
)
|
||||
@ -476,8 +464,8 @@ def get_model_path(model: str, update_model: bool = False):
|
||||
return model
|
||||
|
||||
|
||||
async def generate_openai_batch_embeddings(
|
||||
model: str, texts: list[str], key: str, url: str = "https://api.openai.com/v1"
|
||||
def generate_openai_batch_embeddings(
|
||||
model: str, texts: list[str], url: str = "https://api.openai.com/v1", key: str = ""
|
||||
) -> Optional[list[list[float]]]:
|
||||
try:
|
||||
r = requests.post(
|
||||
@ -499,31 +487,50 @@ async def generate_openai_batch_embeddings(
|
||||
return None
|
||||
|
||||
|
||||
async def generate_embeddings(
|
||||
engine: str, model: str, text: Union[str, list[str]], **kwargs
|
||||
):
|
||||
def generate_ollama_batch_embeddings(
|
||||
model: str, texts: list[str], url: str, key: str
|
||||
) -> Optional[list[list[float]]]:
|
||||
try:
|
||||
r = requests.post(
|
||||
f"{url}/api/embed",
|
||||
headers={
|
||||
"Content-Type": "application/json",
|
||||
"Authorization": f"Bearer {key}",
|
||||
},
|
||||
json={"input": texts, "model": model},
|
||||
)
|
||||
r.raise_for_status()
|
||||
data = r.json()
|
||||
|
||||
print(data)
|
||||
if "embeddings" in data:
|
||||
return data["embeddings"]
|
||||
else:
|
||||
raise "Something went wrong :/"
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return None
|
||||
|
||||
|
||||
def generate_embeddings(engine: str, model: str, text: Union[str, list[str]], **kwargs):
|
||||
url = kwargs.get("url", "")
|
||||
key = kwargs.get("key", "")
|
||||
|
||||
if engine == "ollama":
|
||||
if isinstance(text, list):
|
||||
embeddings = await generate_ollama_batch_embeddings(
|
||||
GenerateEmbedForm(**{"model": model, "input": text})
|
||||
embeddings = generate_ollama_batch_embeddings(
|
||||
**{"model": model, "texts": text, "url": url, "key": key}
|
||||
)
|
||||
else:
|
||||
embeddings = await generate_ollama_batch_embeddings(
|
||||
GenerateEmbedForm(**{"model": model, "input": [text]})
|
||||
embeddings = generate_ollama_batch_embeddings(
|
||||
**{"model": model, "texts": [text], "url": url, "key": key}
|
||||
)
|
||||
return (
|
||||
embeddings["embeddings"][0]
|
||||
if isinstance(text, str)
|
||||
else embeddings["embeddings"]
|
||||
)
|
||||
return embeddings[0] if isinstance(text, str) else embeddings
|
||||
elif engine == "openai":
|
||||
key = kwargs.get("key", "")
|
||||
url = kwargs.get("url", "https://api.openai.com/v1")
|
||||
|
||||
if isinstance(text, list):
|
||||
embeddings = await generate_openai_batch_embeddings(model, text, key, url)
|
||||
embeddings = generate_openai_batch_embeddings(model, text, url, key)
|
||||
else:
|
||||
embeddings = await generate_openai_batch_embeddings(model, [text], key, url)
|
||||
embeddings = generate_openai_batch_embeddings(model, [text], url, key)
|
||||
|
||||
return embeddings[0] if isinstance(text, str) else embeddings
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
from opensearchpy import OpenSearch
|
||||
from typing import Optional
|
||||
|
||||
from open_webui.apps.rag.vector.main import VectorItem, SearchResult, GetResult
|
||||
from open_webui.apps.retrieval.vector.main import VectorItem, SearchResult, GetResult
|
||||
from open_webui.config import (
|
||||
OPENSEARCH_URI,
|
||||
OPENSEARCH_SSL,
|
||||
|
@ -1,3 +1,5 @@
|
||||
# TODO: move socket to webui app
|
||||
|
||||
import asyncio
|
||||
import socketio
|
||||
import logging
|
||||
|
@ -35,6 +35,7 @@ from open_webui.config import (
|
||||
ENABLE_LOGIN_FORM,
|
||||
ENABLE_MESSAGE_RATING,
|
||||
ENABLE_SIGNUP,
|
||||
ENABLE_API_KEY,
|
||||
ENABLE_EVALUATION_ARENA_MODELS,
|
||||
EVALUATION_ARENA_MODELS,
|
||||
DEFAULT_ARENA_MODEL,
|
||||
@ -98,6 +99,8 @@ app.state.config = AppConfig()
|
||||
|
||||
app.state.config.ENABLE_SIGNUP = ENABLE_SIGNUP
|
||||
app.state.config.ENABLE_LOGIN_FORM = ENABLE_LOGIN_FORM
|
||||
app.state.config.ENABLE_API_KEY = ENABLE_API_KEY
|
||||
|
||||
app.state.config.JWT_EXPIRES_IN = JWT_EXPIRES_IN
|
||||
app.state.AUTH_TRUSTED_EMAIL_HEADER = WEBUI_AUTH_TRUSTED_EMAIL_HEADER
|
||||
app.state.AUTH_TRUSTED_NAME_HEADER = WEBUI_AUTH_TRUSTED_NAME_HEADER
|
||||
@ -406,6 +409,7 @@ async def generate_function_chat_completion(form_data, user, models: dict = {}):
|
||||
"name": user.name,
|
||||
"role": user.role,
|
||||
},
|
||||
"__metadata__": metadata,
|
||||
}
|
||||
extra_params["__tools__"] = get_tools(
|
||||
app,
|
||||
|
@ -203,15 +203,22 @@ class ChatTable:
|
||||
def update_shared_chat_by_chat_id(self, chat_id: str) -> Optional[ChatModel]:
|
||||
try:
|
||||
with get_db() as db:
|
||||
print("update_shared_chat_by_id")
|
||||
chat = db.get(Chat, chat_id)
|
||||
print(chat)
|
||||
chat.title = chat.title
|
||||
chat.chat = chat.chat
|
||||
db.commit()
|
||||
db.refresh(chat)
|
||||
shared_chat = (
|
||||
db.query(Chat).filter_by(user_id=f"shared-{chat_id}").first()
|
||||
)
|
||||
|
||||
return self.get_chat_by_id(chat.share_id)
|
||||
if shared_chat is None:
|
||||
return self.insert_shared_chat_by_chat_id(chat_id)
|
||||
|
||||
shared_chat.title = chat.title
|
||||
shared_chat.chat = chat.chat
|
||||
|
||||
shared_chat.updated_at = int(time.time())
|
||||
db.commit()
|
||||
db.refresh(shared_chat)
|
||||
|
||||
return ChatModel.model_validate(shared_chat)
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
|
@ -11,7 +11,7 @@ from open_webui.apps.webui.models.files import FileMetadataResponse
|
||||
|
||||
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
from sqlalchemy import BigInteger, Column, String, Text, JSON
|
||||
from sqlalchemy import BigInteger, Column, String, Text, JSON, func
|
||||
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
@ -128,7 +128,12 @@ class GroupTable:
|
||||
return [
|
||||
GroupModel.model_validate(group)
|
||||
for group in db.query(Group)
|
||||
.filter(Group.user_ids.contains([user_id]))
|
||||
.filter(
|
||||
func.json_array_length(Group.user_ids) > 0
|
||||
) # Ensure array exists
|
||||
.filter(
|
||||
Group.user_ids.cast(String).like(f'%"{user_id}"%')
|
||||
) # String-based check
|
||||
.order_by(Group.updated_at.desc())
|
||||
.all()
|
||||
]
|
||||
|
@ -8,6 +8,7 @@ from open_webui.apps.webui.internal.db import Base, get_db
|
||||
from open_webui.env import SRC_LOG_LEVELS
|
||||
|
||||
from open_webui.apps.webui.models.files import FileMetadataResponse
|
||||
from open_webui.apps.webui.models.users import Users, UserResponse
|
||||
|
||||
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
@ -79,17 +80,15 @@ class KnowledgeModel(BaseModel):
|
||||
####################
|
||||
|
||||
|
||||
class KnowledgeResponse(BaseModel):
|
||||
id: str
|
||||
name: str
|
||||
description: str
|
||||
data: Optional[dict] = None
|
||||
meta: Optional[dict] = None
|
||||
class KnowledgeUserModel(KnowledgeModel):
|
||||
user: Optional[UserResponse] = None
|
||||
|
||||
access_control: Optional[dict] = None
|
||||
created_at: int # timestamp in epoch
|
||||
updated_at: int # timestamp in epoch
|
||||
|
||||
class KnowledgeResponse(KnowledgeModel):
|
||||
files: Optional[list[FileMetadataResponse | dict]] = None
|
||||
|
||||
|
||||
class KnowledgeUserResponse(KnowledgeUserModel):
|
||||
files: Optional[list[FileMetadataResponse | dict]] = None
|
||||
|
||||
|
||||
@ -127,18 +126,26 @@ class KnowledgeTable:
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
def get_knowledge_bases(self) -> list[KnowledgeModel]:
|
||||
def get_knowledge_bases(self) -> list[KnowledgeUserModel]:
|
||||
with get_db() as db:
|
||||
return [
|
||||
KnowledgeModel.model_validate(knowledge)
|
||||
for knowledge in db.query(Knowledge)
|
||||
.order_by(Knowledge.updated_at.desc())
|
||||
.all()
|
||||
]
|
||||
knowledge_bases = []
|
||||
for knowledge in (
|
||||
db.query(Knowledge).order_by(Knowledge.updated_at.desc()).all()
|
||||
):
|
||||
user = Users.get_user_by_id(knowledge.user_id)
|
||||
knowledge_bases.append(
|
||||
KnowledgeUserModel.model_validate(
|
||||
{
|
||||
**KnowledgeModel.model_validate(knowledge).model_dump(),
|
||||
"user": user.model_dump() if user else None,
|
||||
}
|
||||
)
|
||||
)
|
||||
return knowledge_bases
|
||||
|
||||
def get_knowledge_bases_by_user_id(
|
||||
self, user_id: str, permission: str = "write"
|
||||
) -> list[KnowledgeModel]:
|
||||
) -> list[KnowledgeUserModel]:
|
||||
knowledge_bases = self.get_knowledge_bases()
|
||||
return [
|
||||
knowledge_base
|
||||
|
@ -5,7 +5,7 @@ from typing import Optional
|
||||
from open_webui.apps.webui.internal.db import Base, JSONField, get_db
|
||||
from open_webui.env import SRC_LOG_LEVELS
|
||||
|
||||
from open_webui.apps.webui.models.groups import Groups
|
||||
from open_webui.apps.webui.models.users import Users, UserResponse
|
||||
|
||||
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
@ -124,20 +124,12 @@ class ModelModel(BaseModel):
|
||||
####################
|
||||
|
||||
|
||||
class ModelResponse(BaseModel):
|
||||
id: str
|
||||
user_id: str
|
||||
base_model_id: Optional[str] = None
|
||||
class ModelUserResponse(ModelModel):
|
||||
user: Optional[UserResponse] = None
|
||||
|
||||
name: str
|
||||
params: ModelParams
|
||||
meta: ModelMeta
|
||||
|
||||
access_control: Optional[dict] = None
|
||||
|
||||
is_active: bool
|
||||
updated_at: int # timestamp in epoch
|
||||
created_at: int # timestamp in epoch
|
||||
class ModelResponse(ModelModel):
|
||||
pass
|
||||
|
||||
|
||||
class ModelForm(BaseModel):
|
||||
@ -181,12 +173,20 @@ class ModelsTable:
|
||||
with get_db() as db:
|
||||
return [ModelModel.model_validate(model) for model in db.query(Model).all()]
|
||||
|
||||
def get_models(self) -> list[ModelModel]:
|
||||
def get_models(self) -> list[ModelUserResponse]:
|
||||
with get_db() as db:
|
||||
return [
|
||||
ModelModel.model_validate(model)
|
||||
for model in db.query(Model).filter(Model.base_model_id != None).all()
|
||||
]
|
||||
models = []
|
||||
for model in db.query(Model).filter(Model.base_model_id != None).all():
|
||||
user = Users.get_user_by_id(model.user_id)
|
||||
models.append(
|
||||
ModelUserResponse.model_validate(
|
||||
{
|
||||
**ModelModel.model_validate(model).model_dump(),
|
||||
"user": user.model_dump() if user else None,
|
||||
}
|
||||
)
|
||||
)
|
||||
return models
|
||||
|
||||
def get_base_models(self) -> list[ModelModel]:
|
||||
with get_db() as db:
|
||||
@ -197,8 +197,8 @@ class ModelsTable:
|
||||
|
||||
def get_models_by_user_id(
|
||||
self, user_id: str, permission: str = "write"
|
||||
) -> list[ModelModel]:
|
||||
models = self.get_all_models()
|
||||
) -> list[ModelUserResponse]:
|
||||
models = self.get_models()
|
||||
return [
|
||||
model
|
||||
for model in models
|
||||
@ -260,5 +260,15 @@ class ModelsTable:
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
def delete_all_models(self) -> bool:
|
||||
try:
|
||||
with get_db() as db:
|
||||
db.query(Model).delete()
|
||||
db.commit()
|
||||
|
||||
return True
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
|
||||
Models = ModelsTable()
|
||||
|
@ -2,7 +2,7 @@ import time
|
||||
from typing import Optional
|
||||
|
||||
from open_webui.apps.webui.internal.db import Base, get_db
|
||||
from open_webui.apps.webui.models.groups import Groups
|
||||
from open_webui.apps.webui.models.users import Users, UserResponse
|
||||
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
from sqlalchemy import BigInteger, Column, String, Text, JSON
|
||||
@ -57,6 +57,10 @@ class PromptModel(BaseModel):
|
||||
####################
|
||||
|
||||
|
||||
class PromptUserResponse(PromptModel):
|
||||
user: Optional[UserResponse] = None
|
||||
|
||||
|
||||
class PromptForm(BaseModel):
|
||||
command: str
|
||||
title: str
|
||||
@ -97,15 +101,26 @@ class PromptsTable:
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
def get_prompts(self) -> list[PromptModel]:
|
||||
def get_prompts(self) -> list[PromptUserResponse]:
|
||||
with get_db() as db:
|
||||
return [
|
||||
PromptModel.model_validate(prompt) for prompt in db.query(Prompt).all()
|
||||
]
|
||||
prompts = []
|
||||
|
||||
for prompt in db.query(Prompt).order_by(Prompt.timestamp.desc()).all():
|
||||
user = Users.get_user_by_id(prompt.user_id)
|
||||
prompts.append(
|
||||
PromptUserResponse.model_validate(
|
||||
{
|
||||
**PromptModel.model_validate(prompt).model_dump(),
|
||||
"user": user.model_dump() if user else None,
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
return prompts
|
||||
|
||||
def get_prompts_by_user_id(
|
||||
self, user_id: str, permission: str = "write"
|
||||
) -> list[PromptModel]:
|
||||
) -> list[PromptUserResponse]:
|
||||
prompts = self.get_prompts()
|
||||
|
||||
return [
|
||||
|
@ -3,7 +3,7 @@ import time
|
||||
from typing import Optional
|
||||
|
||||
from open_webui.apps.webui.internal.db import Base, JSONField, get_db
|
||||
from open_webui.apps.webui.models.users import Users
|
||||
from open_webui.apps.webui.models.users import Users, UserResponse
|
||||
from open_webui.env import SRC_LOG_LEVELS
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
from sqlalchemy import BigInteger, Column, String, Text, JSON
|
||||
@ -86,6 +86,10 @@ class ToolResponse(BaseModel):
|
||||
created_at: int # timestamp in epoch
|
||||
|
||||
|
||||
class ToolUserResponse(ToolResponse):
|
||||
user: Optional[UserResponse] = None
|
||||
|
||||
|
||||
class ToolForm(BaseModel):
|
||||
id: str
|
||||
name: str
|
||||
@ -134,13 +138,24 @@ class ToolsTable:
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
def get_tools(self) -> list[ToolModel]:
|
||||
def get_tools(self) -> list[ToolUserResponse]:
|
||||
with get_db() as db:
|
||||
return [ToolModel.model_validate(tool) for tool in db.query(Tool).all()]
|
||||
tools = []
|
||||
for tool in db.query(Tool).order_by(Tool.updated_at.desc()).all():
|
||||
user = Users.get_user_by_id(tool.user_id)
|
||||
tools.append(
|
||||
ToolUserResponse.model_validate(
|
||||
{
|
||||
**ToolModel.model_validate(tool).model_dump(),
|
||||
"user": user.model_dump() if user else None,
|
||||
}
|
||||
)
|
||||
)
|
||||
return tools
|
||||
|
||||
def get_tools_by_user_id(
|
||||
self, user_id: str, permission: str = "write"
|
||||
) -> list[ToolModel]:
|
||||
) -> list[ToolUserResponse]:
|
||||
tools = self.get_tools()
|
||||
|
||||
return [
|
||||
|
@ -62,6 +62,14 @@ class UserModel(BaseModel):
|
||||
####################
|
||||
|
||||
|
||||
class UserResponse(BaseModel):
|
||||
id: str
|
||||
name: str
|
||||
email: str
|
||||
role: str
|
||||
profile_image_url: str
|
||||
|
||||
|
||||
class UserRoleUpdateForm(BaseModel):
|
||||
id: str
|
||||
role: str
|
||||
|
@ -18,9 +18,10 @@ from open_webui.apps.webui.models.auths import (
|
||||
UserResponse,
|
||||
)
|
||||
from open_webui.apps.webui.models.users import Users
|
||||
from open_webui.config import WEBUI_AUTH
|
||||
|
||||
from open_webui.constants import ERROR_MESSAGES, WEBHOOK_MESSAGES
|
||||
from open_webui.env import (
|
||||
WEBUI_AUTH,
|
||||
WEBUI_AUTH_TRUSTED_EMAIL_HEADER,
|
||||
WEBUI_AUTH_TRUSTED_NAME_HEADER,
|
||||
WEBUI_SESSION_COOKIE_SAME_SITE,
|
||||
@ -580,6 +581,7 @@ async def get_admin_config(request: Request, user=Depends(get_admin_user)):
|
||||
return {
|
||||
"SHOW_ADMIN_DETAILS": request.app.state.config.SHOW_ADMIN_DETAILS,
|
||||
"ENABLE_SIGNUP": request.app.state.config.ENABLE_SIGNUP,
|
||||
"ENABLE_API_KEY": request.app.state.config.ENABLE_API_KEY,
|
||||
"DEFAULT_USER_ROLE": request.app.state.config.DEFAULT_USER_ROLE,
|
||||
"JWT_EXPIRES_IN": request.app.state.config.JWT_EXPIRES_IN,
|
||||
"ENABLE_COMMUNITY_SHARING": request.app.state.config.ENABLE_COMMUNITY_SHARING,
|
||||
@ -590,6 +592,7 @@ async def get_admin_config(request: Request, user=Depends(get_admin_user)):
|
||||
class AdminConfig(BaseModel):
|
||||
SHOW_ADMIN_DETAILS: bool
|
||||
ENABLE_SIGNUP: bool
|
||||
ENABLE_API_KEY: bool
|
||||
DEFAULT_USER_ROLE: str
|
||||
JWT_EXPIRES_IN: str
|
||||
ENABLE_COMMUNITY_SHARING: bool
|
||||
@ -602,6 +605,7 @@ async def update_admin_config(
|
||||
):
|
||||
request.app.state.config.SHOW_ADMIN_DETAILS = form_data.SHOW_ADMIN_DETAILS
|
||||
request.app.state.config.ENABLE_SIGNUP = form_data.ENABLE_SIGNUP
|
||||
request.app.state.config.ENABLE_API_KEY = form_data.ENABLE_API_KEY
|
||||
|
||||
if form_data.DEFAULT_USER_ROLE in ["pending", "user", "admin"]:
|
||||
request.app.state.config.DEFAULT_USER_ROLE = form_data.DEFAULT_USER_ROLE
|
||||
@ -620,6 +624,7 @@ async def update_admin_config(
|
||||
return {
|
||||
"SHOW_ADMIN_DETAILS": request.app.state.config.SHOW_ADMIN_DETAILS,
|
||||
"ENABLE_SIGNUP": request.app.state.config.ENABLE_SIGNUP,
|
||||
"ENABLE_API_KEY": request.app.state.config.ENABLE_API_KEY,
|
||||
"DEFAULT_USER_ROLE": request.app.state.config.DEFAULT_USER_ROLE,
|
||||
"JWT_EXPIRES_IN": request.app.state.config.JWT_EXPIRES_IN,
|
||||
"ENABLE_COMMUNITY_SHARING": request.app.state.config.ENABLE_COMMUNITY_SHARING,
|
||||
@ -733,9 +738,16 @@ async def update_ldap_config(
|
||||
|
||||
# create api key
|
||||
@router.post("/api_key", response_model=ApiKey)
|
||||
async def create_api_key_(user=Depends(get_current_user)):
|
||||
async def generate_api_key(request: Request, user=Depends(get_current_user)):
|
||||
if not request.app.state.config.ENABLE_API_KEY:
|
||||
raise HTTPException(
|
||||
status.HTTP_403_FORBIDDEN,
|
||||
detail=ERROR_MESSAGES.API_KEY_CREATION_NOT_ALLOWED,
|
||||
)
|
||||
|
||||
api_key = create_api_key()
|
||||
success = Users.update_user_api_key_by_id(user.id, api_key)
|
||||
|
||||
if success:
|
||||
return {
|
||||
"api_key": api_key,
|
||||
|
@ -8,6 +8,7 @@ from open_webui.apps.webui.models.knowledge import (
|
||||
Knowledges,
|
||||
KnowledgeForm,
|
||||
KnowledgeResponse,
|
||||
KnowledgeUserResponse,
|
||||
)
|
||||
from open_webui.apps.webui.models.files import Files, FileModel
|
||||
from open_webui.apps.retrieval.vector.connector import VECTOR_DB_CLIENT
|
||||
@ -32,7 +33,7 @@ router = APIRouter()
|
||||
############################
|
||||
|
||||
|
||||
@router.get("/", response_model=list[KnowledgeResponse])
|
||||
@router.get("/", response_model=list[KnowledgeUserResponse])
|
||||
async def get_knowledge(user=Depends(get_verified_user)):
|
||||
knowledge_bases = []
|
||||
|
||||
@ -42,6 +43,7 @@ async def get_knowledge(user=Depends(get_verified_user)):
|
||||
knowledge_bases = Knowledges.get_knowledge_bases_by_user_id(user.id, "read")
|
||||
|
||||
# Get files for each knowledge base
|
||||
knowledge_with_files = []
|
||||
for knowledge_base in knowledge_bases:
|
||||
files = []
|
||||
if knowledge_base.data:
|
||||
@ -69,15 +71,17 @@ async def get_knowledge(user=Depends(get_verified_user)):
|
||||
|
||||
files = Files.get_file_metadatas_by_ids(file_ids)
|
||||
|
||||
knowledge_base = KnowledgeResponse(
|
||||
**knowledge_base.model_dump(),
|
||||
files=files,
|
||||
knowledge_with_files.append(
|
||||
KnowledgeUserResponse(
|
||||
**knowledge_base.model_dump(),
|
||||
files=files,
|
||||
)
|
||||
)
|
||||
|
||||
return knowledge_bases
|
||||
return knowledge_with_files
|
||||
|
||||
|
||||
@router.get("/list", response_model=list[KnowledgeResponse])
|
||||
@router.get("/list", response_model=list[KnowledgeUserResponse])
|
||||
async def get_knowledge_list(user=Depends(get_verified_user)):
|
||||
knowledge_bases = []
|
||||
|
||||
@ -87,6 +91,7 @@ async def get_knowledge_list(user=Depends(get_verified_user)):
|
||||
knowledge_bases = Knowledges.get_knowledge_bases_by_user_id(user.id, "write")
|
||||
|
||||
# Get files for each knowledge base
|
||||
knowledge_with_files = []
|
||||
for knowledge_base in knowledge_bases:
|
||||
files = []
|
||||
if knowledge_base.data:
|
||||
@ -114,12 +119,13 @@ async def get_knowledge_list(user=Depends(get_verified_user)):
|
||||
|
||||
files = Files.get_file_metadatas_by_ids(file_ids)
|
||||
|
||||
knowledge_base = KnowledgeResponse(
|
||||
**knowledge_base.model_dump(),
|
||||
files=files,
|
||||
knowledge_with_files.append(
|
||||
KnowledgeUserResponse(
|
||||
**knowledge_base.model_dump(),
|
||||
files=files,
|
||||
)
|
||||
)
|
||||
|
||||
return knowledge_bases
|
||||
return knowledge_with_files
|
||||
|
||||
|
||||
############################
|
||||
|
@ -4,6 +4,7 @@ from open_webui.apps.webui.models.models import (
|
||||
ModelForm,
|
||||
ModelModel,
|
||||
ModelResponse,
|
||||
ModelUserResponse,
|
||||
Models,
|
||||
)
|
||||
from open_webui.constants import ERROR_MESSAGES
|
||||
@ -22,7 +23,7 @@ router = APIRouter()
|
||||
###########################
|
||||
|
||||
|
||||
@router.get("/", response_model=list[ModelResponse])
|
||||
@router.get("/", response_model=list[ModelUserResponse])
|
||||
async def get_models(id: Optional[str] = None, user=Depends(get_verified_user)):
|
||||
if user.role == "admin":
|
||||
return Models.get_models()
|
||||
@ -82,7 +83,8 @@ async def create_new_model(
|
||||
###########################
|
||||
|
||||
|
||||
@router.get("/id/{id}", response_model=Optional[ModelResponse])
|
||||
# Note: We're not using the typical url path param here, but instead using a query parameter to allow '/' in the id
|
||||
@router.get("/model", response_model=Optional[ModelResponse])
|
||||
async def get_model_by_id(id: str, user=Depends(get_verified_user)):
|
||||
model = Models.get_model_by_id(id)
|
||||
if model:
|
||||
@ -104,7 +106,7 @@ async def get_model_by_id(id: str, user=Depends(get_verified_user)):
|
||||
############################
|
||||
|
||||
|
||||
@router.post("/id/{id}/toggle", response_model=Optional[ModelResponse])
|
||||
@router.post("/model/toggle", response_model=Optional[ModelResponse])
|
||||
async def toggle_model_by_id(id: str, user=Depends(get_verified_user)):
|
||||
model = Models.get_model_by_id(id)
|
||||
if model:
|
||||
@ -139,7 +141,7 @@ async def toggle_model_by_id(id: str, user=Depends(get_verified_user)):
|
||||
############################
|
||||
|
||||
|
||||
@router.post("/id/{id}/update", response_model=Optional[ModelModel])
|
||||
@router.post("/model/update", response_model=Optional[ModelModel])
|
||||
async def update_model_by_id(
|
||||
id: str,
|
||||
form_data: ModelForm,
|
||||
@ -162,7 +164,7 @@ async def update_model_by_id(
|
||||
############################
|
||||
|
||||
|
||||
@router.delete("/id/{id}/delete", response_model=bool)
|
||||
@router.delete("/model/delete", response_model=bool)
|
||||
async def delete_model_by_id(id: str, user=Depends(get_verified_user)):
|
||||
model = Models.get_model_by_id(id)
|
||||
if not model:
|
||||
@ -179,3 +181,9 @@ async def delete_model_by_id(id: str, user=Depends(get_verified_user)):
|
||||
|
||||
result = Models.delete_model_by_id(id)
|
||||
return result
|
||||
|
||||
|
||||
@router.delete("/delete/all", response_model=bool)
|
||||
async def delete_all_models(user=Depends(get_admin_user)):
|
||||
result = Models.delete_all_models()
|
||||
return result
|
||||
|
@ -1,6 +1,11 @@
|
||||
from typing import Optional
|
||||
|
||||
from open_webui.apps.webui.models.prompts import PromptForm, PromptModel, Prompts
|
||||
from open_webui.apps.webui.models.prompts import (
|
||||
PromptForm,
|
||||
PromptUserResponse,
|
||||
PromptModel,
|
||||
Prompts,
|
||||
)
|
||||
from open_webui.constants import ERROR_MESSAGES
|
||||
from fastapi import APIRouter, Depends, HTTPException, status, Request
|
||||
from open_webui.utils.utils import get_admin_user, get_verified_user
|
||||
@ -23,7 +28,7 @@ async def get_prompts(user=Depends(get_verified_user)):
|
||||
return prompts
|
||||
|
||||
|
||||
@router.get("/list", response_model=list[PromptModel])
|
||||
@router.get("/list", response_model=list[PromptUserResponse])
|
||||
async def get_prompt_list(user=Depends(get_verified_user)):
|
||||
if user.role == "admin":
|
||||
prompts = Prompts.get_prompts()
|
||||
|
@ -2,7 +2,13 @@ import os
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
from open_webui.apps.webui.models.tools import ToolForm, ToolModel, ToolResponse, Tools
|
||||
from open_webui.apps.webui.models.tools import (
|
||||
ToolForm,
|
||||
ToolModel,
|
||||
ToolResponse,
|
||||
ToolUserResponse,
|
||||
Tools,
|
||||
)
|
||||
from open_webui.apps.webui.utils import load_tools_module_by_id, replace_imports
|
||||
from open_webui.config import CACHE_DIR, DATA_DIR
|
||||
from open_webui.constants import ERROR_MESSAGES
|
||||
@ -19,7 +25,7 @@ router = APIRouter()
|
||||
############################
|
||||
|
||||
|
||||
@router.get("/", response_model=list[ToolResponse])
|
||||
@router.get("/", response_model=list[ToolUserResponse])
|
||||
async def get_tools(user=Depends(get_verified_user)):
|
||||
if user.role == "admin":
|
||||
tools = Tools.get_tools()
|
||||
@ -33,7 +39,7 @@ async def get_tools(user=Depends(get_verified_user)):
|
||||
############################
|
||||
|
||||
|
||||
@router.get("/list", response_model=list[ToolResponse])
|
||||
@router.get("/list", response_model=list[ToolUserResponse])
|
||||
async def get_tool_list(user=Depends(get_verified_user)):
|
||||
if user.role == "admin":
|
||||
tools = Tools.get_tools()
|
||||
|
@ -265,6 +265,13 @@ class AppConfig:
|
||||
# WEBUI_AUTH (Required for security)
|
||||
####################################
|
||||
|
||||
ENABLE_API_KEY = PersistentConfig(
|
||||
"ENABLE_API_KEY",
|
||||
"auth.api_key.enable",
|
||||
os.environ.get("ENABLE_API_KEY", "True").lower() == "true",
|
||||
)
|
||||
|
||||
|
||||
JWT_EXPIRES_IN = PersistentConfig(
|
||||
"JWT_EXPIRES_IN", "auth.jwt_expiry", os.environ.get("JWT_EXPIRES_IN", "-1")
|
||||
)
|
||||
@ -941,19 +948,49 @@ ENABLE_TAGS_GENERATION = PersistentConfig(
|
||||
os.environ.get("ENABLE_TAGS_GENERATION", "True").lower() == "true",
|
||||
)
|
||||
|
||||
ENABLE_SEARCH_QUERY = PersistentConfig(
|
||||
"ENABLE_SEARCH_QUERY",
|
||||
"task.search.enable",
|
||||
os.environ.get("ENABLE_SEARCH_QUERY", "True").lower() == "true",
|
||||
|
||||
ENABLE_SEARCH_QUERY_GENERATION = PersistentConfig(
|
||||
"ENABLE_SEARCH_QUERY_GENERATION",
|
||||
"task.query.search.enable",
|
||||
os.environ.get("ENABLE_SEARCH_QUERY_GENERATION", "True").lower() == "true",
|
||||
)
|
||||
|
||||
ENABLE_RETRIEVAL_QUERY_GENERATION = PersistentConfig(
|
||||
"ENABLE_RETRIEVAL_QUERY_GENERATION",
|
||||
"task.query.retrieval.enable",
|
||||
os.environ.get("ENABLE_RETRIEVAL_QUERY_GENERATION", "True").lower() == "true",
|
||||
)
|
||||
|
||||
|
||||
SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE = PersistentConfig(
|
||||
"SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE",
|
||||
"task.search.prompt_template",
|
||||
os.environ.get("SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE", ""),
|
||||
QUERY_GENERATION_PROMPT_TEMPLATE = PersistentConfig(
|
||||
"QUERY_GENERATION_PROMPT_TEMPLATE",
|
||||
"task.query.prompt_template",
|
||||
os.environ.get("QUERY_GENERATION_PROMPT_TEMPLATE", ""),
|
||||
)
|
||||
|
||||
DEFAULT_QUERY_GENERATION_PROMPT_TEMPLATE = """### Task:
|
||||
Based on the chat history, determine whether a search is necessary, and if so, generate a 1-3 broad search queries to retrieve comprehensive and updated information. If no search is required, return an empty list.
|
||||
|
||||
### Guidelines:
|
||||
- Respond exclusively with a JSON object.
|
||||
- If a search query is needed, return an object like: { "queries": ["query1", "query2"] } where each query is distinct and concise.
|
||||
- If no search query is necessary, output should be: { "queries": [] }
|
||||
- Default to suggesting a search query to ensure accurate and updated information, unless it is definitively clear no search is required.
|
||||
- Be concise, focusing strictly on composing search queries with no additional commentary or text.
|
||||
- When in doubt, prefer to suggest a search for comprehensiveness.
|
||||
- Today's date is: {{CURRENT_DATE}}
|
||||
|
||||
### Output:
|
||||
JSON format: {
|
||||
"queries": ["query1", "query2"]
|
||||
}
|
||||
|
||||
### Chat History:
|
||||
<chat_history>
|
||||
{{MESSAGES:END:6}}
|
||||
</chat_history>
|
||||
"""
|
||||
|
||||
|
||||
TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = PersistentConfig(
|
||||
"TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE",
|
||||
@ -1181,6 +1218,19 @@ RAG_OPENAI_API_KEY = PersistentConfig(
|
||||
os.getenv("RAG_OPENAI_API_KEY", OPENAI_API_KEY),
|
||||
)
|
||||
|
||||
RAG_OLLAMA_BASE_URL = PersistentConfig(
|
||||
"RAG_OLLAMA_BASE_URL",
|
||||
"rag.ollama.url",
|
||||
os.getenv("RAG_OLLAMA_BASE_URL", OLLAMA_BASE_URL),
|
||||
)
|
||||
|
||||
RAG_OLLAMA_API_KEY = PersistentConfig(
|
||||
"RAG_OLLAMA_API_KEY",
|
||||
"rag.ollama.key",
|
||||
os.getenv("RAG_OLLAMA_API_KEY", ""),
|
||||
)
|
||||
|
||||
|
||||
ENABLE_RAG_LOCAL_WEB_FETCH = (
|
||||
os.getenv("ENABLE_RAG_LOCAL_WEB_FETCH", "False").lower() == "true"
|
||||
)
|
||||
|
@ -62,6 +62,7 @@ class ERROR_MESSAGES(str, Enum):
|
||||
NOT_FOUND = "We could not find what you're looking for :/"
|
||||
USER_NOT_FOUND = "We could not find what you're looking for :/"
|
||||
API_KEY_NOT_FOUND = "Oops! It looks like there's a hiccup. The API key is missing. Please make sure to provide a valid API key to access this feature."
|
||||
API_KEY_NOT_ALLOWED = "Use of API key is not enabled in the environment."
|
||||
|
||||
MALICIOUS = "Unusual activities detected, please try again in a few minutes."
|
||||
|
||||
@ -75,6 +76,7 @@ class ERROR_MESSAGES(str, Enum):
|
||||
OPENAI_NOT_FOUND = lambda name="": "OpenAI API was not found"
|
||||
OLLAMA_NOT_FOUND = "WebUI could not connect to Ollama"
|
||||
CREATE_API_KEY_ERROR = "Oops! Something went wrong while creating your API key. Please try again later. If the issue persists, contact support for assistance."
|
||||
API_KEY_CREATION_NOT_ALLOWED = "API key creation is not allowed in the environment."
|
||||
|
||||
EMPTY_CONTENT = "The content provided is empty. Please ensure that there is text or data present before proceeding."
|
||||
|
||||
|
@ -78,11 +78,13 @@ from open_webui.config import (
|
||||
ENV,
|
||||
FRONTEND_BUILD_DIR,
|
||||
OAUTH_PROVIDERS,
|
||||
ENABLE_SEARCH_QUERY,
|
||||
SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE,
|
||||
STATIC_DIR,
|
||||
TASK_MODEL,
|
||||
TASK_MODEL_EXTERNAL,
|
||||
ENABLE_SEARCH_QUERY_GENERATION,
|
||||
ENABLE_RETRIEVAL_QUERY_GENERATION,
|
||||
QUERY_GENERATION_PROMPT_TEMPLATE,
|
||||
DEFAULT_QUERY_GENERATION_PROMPT_TEMPLATE,
|
||||
TITLE_GENERATION_PROMPT_TEMPLATE,
|
||||
TAGS_GENERATION_PROMPT_TEMPLATE,
|
||||
TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE,
|
||||
@ -122,7 +124,7 @@ from open_webui.utils.security_headers import SecurityHeadersMiddleware
|
||||
from open_webui.utils.task import (
|
||||
moa_response_generation_template,
|
||||
tags_generation_template,
|
||||
search_query_generation_template,
|
||||
query_generation_template,
|
||||
emoji_generation_template,
|
||||
title_generation_template,
|
||||
tools_function_calling_generation_template,
|
||||
@ -206,10 +208,9 @@ app.state.config.ENABLE_TAGS_GENERATION = ENABLE_TAGS_GENERATION
|
||||
app.state.config.TAGS_GENERATION_PROMPT_TEMPLATE = TAGS_GENERATION_PROMPT_TEMPLATE
|
||||
|
||||
|
||||
app.state.config.ENABLE_SEARCH_QUERY = ENABLE_SEARCH_QUERY
|
||||
app.state.config.SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE = (
|
||||
SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE
|
||||
)
|
||||
app.state.config.ENABLE_SEARCH_QUERY_GENERATION = ENABLE_SEARCH_QUERY_GENERATION
|
||||
app.state.config.ENABLE_RETRIEVAL_QUERY_GENERATION = ENABLE_RETRIEVAL_QUERY_GENERATION
|
||||
app.state.config.QUERY_GENERATION_PROMPT_TEMPLATE = QUERY_GENERATION_PROMPT_TEMPLATE
|
||||
|
||||
app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = (
|
||||
TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE
|
||||
@ -492,14 +493,41 @@ async def chat_completion_tools_handler(
|
||||
return body, {"contexts": contexts, "citations": citations}
|
||||
|
||||
|
||||
async def chat_completion_files_handler(body) -> tuple[dict, dict[str, list]]:
|
||||
async def chat_completion_files_handler(
|
||||
body: dict, user: UserModel
|
||||
) -> tuple[dict, dict[str, list]]:
|
||||
contexts = []
|
||||
citations = []
|
||||
|
||||
try:
|
||||
queries_response = await generate_queries(
|
||||
{
|
||||
"model": body["model"],
|
||||
"messages": body["messages"],
|
||||
"type": "retrieval",
|
||||
},
|
||||
user,
|
||||
)
|
||||
queries_response = queries_response["choices"][0]["message"]["content"]
|
||||
|
||||
try:
|
||||
queries_response = json.loads(queries_response)
|
||||
except Exception as e:
|
||||
queries_response = {"queries": []}
|
||||
|
||||
queries = queries_response.get("queries", [])
|
||||
except Exception as e:
|
||||
queries = []
|
||||
|
||||
if len(queries) == 0:
|
||||
queries = [get_last_user_message(body["messages"])]
|
||||
|
||||
print(f"{queries=}")
|
||||
|
||||
if files := body.get("metadata", {}).get("files", None):
|
||||
contexts, citations = get_rag_context(
|
||||
files=files,
|
||||
messages=body["messages"],
|
||||
queries=queries,
|
||||
embedding_function=retrieval_app.state.EMBEDDING_FUNCTION,
|
||||
k=retrieval_app.state.config.TOP_K,
|
||||
reranking_function=retrieval_app.state.sentence_transformer_rf,
|
||||
@ -557,16 +585,34 @@ class ChatCompletionMiddleware(BaseHTTPMiddleware):
|
||||
|
||||
model_info = Models.get_model_by_id(model["id"])
|
||||
if user.role == "user":
|
||||
if model_info and not (
|
||||
user.id == model_info.user_id
|
||||
or has_access(
|
||||
user.id, type="read", access_control=model_info.access_control
|
||||
)
|
||||
):
|
||||
return JSONResponse(
|
||||
status_code=status.HTTP_403_FORBIDDEN,
|
||||
content={"detail": "User does not have access to the model"},
|
||||
)
|
||||
if model.get("arena"):
|
||||
if not has_access(
|
||||
user.id,
|
||||
type="read",
|
||||
access_control=model.get("info", {})
|
||||
.get("meta", {})
|
||||
.get("access_control", {}),
|
||||
):
|
||||
raise HTTPException(
|
||||
status_code=403,
|
||||
detail="Model not found",
|
||||
)
|
||||
else:
|
||||
if not model_info:
|
||||
return JSONResponse(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
content={"detail": "Model not found"},
|
||||
)
|
||||
elif not (
|
||||
user.id == model_info.user_id
|
||||
or has_access(
|
||||
user.id, type="read", access_control=model_info.access_control
|
||||
)
|
||||
):
|
||||
return JSONResponse(
|
||||
status_code=status.HTTP_403_FORBIDDEN,
|
||||
content={"detail": "User does not have access to the model"},
|
||||
)
|
||||
|
||||
metadata = {
|
||||
"chat_id": body.pop("chat_id", None),
|
||||
@ -586,6 +632,7 @@ class ChatCompletionMiddleware(BaseHTTPMiddleware):
|
||||
"name": user.name,
|
||||
"role": user.role,
|
||||
},
|
||||
"__metadata__": metadata,
|
||||
}
|
||||
|
||||
# Initialize data_items to store additional data to be sent to the client
|
||||
@ -624,7 +671,7 @@ class ChatCompletionMiddleware(BaseHTTPMiddleware):
|
||||
log.exception(e)
|
||||
|
||||
try:
|
||||
body, flags = await chat_completion_files_handler(body)
|
||||
body, flags = await chat_completion_files_handler(body, user)
|
||||
contexts.extend(flags.get("contexts", []))
|
||||
citations.extend(flags.get("citations", []))
|
||||
except Exception as e:
|
||||
@ -808,6 +855,11 @@ class PipelineMiddleware(BaseHTTPMiddleware):
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
content={"detail": "Not authenticated"},
|
||||
)
|
||||
except HTTPException as e:
|
||||
return JSONResponse(
|
||||
status_code=e.status_code,
|
||||
content={"detail": e.detail},
|
||||
)
|
||||
|
||||
model_list = await get_all_models()
|
||||
models = {model["id"]: model for model in model_list}
|
||||
@ -893,6 +945,7 @@ async def commit_session_after_request(request: Request, call_next):
|
||||
@app.middleware("http")
|
||||
async def check_url(request: Request, call_next):
|
||||
start_time = int(time.time())
|
||||
request.state.enable_api_key = webui_app.state.config.ENABLE_API_KEY
|
||||
response = await call_next(request)
|
||||
process_time = int(time.time()) - start_time
|
||||
response.headers["X-Process-Time"] = str(process_time)
|
||||
@ -1042,17 +1095,17 @@ async def get_all_models():
|
||||
)
|
||||
|
||||
# Process action_ids to get the actions
|
||||
def get_action_items_from_module(module):
|
||||
def get_action_items_from_module(function, module):
|
||||
actions = []
|
||||
if hasattr(module, "actions"):
|
||||
actions = module.actions
|
||||
return [
|
||||
{
|
||||
"id": f"{module.id}.{action['id']}",
|
||||
"name": action.get("name", f"{module.name} ({action['id']})"),
|
||||
"description": module.meta.description,
|
||||
"id": f"{function.id}.{action['id']}",
|
||||
"name": action.get("name", f"{function.name} ({action['id']})"),
|
||||
"description": function.meta.description,
|
||||
"icon_url": action.get(
|
||||
"icon_url", module.meta.manifest.get("icon_url", None)
|
||||
"icon_url", function.meta.manifest.get("icon_url", None)
|
||||
),
|
||||
}
|
||||
for action in actions
|
||||
@ -1060,10 +1113,10 @@ async def get_all_models():
|
||||
else:
|
||||
return [
|
||||
{
|
||||
"id": module.id,
|
||||
"name": module.name,
|
||||
"description": module.meta.description,
|
||||
"icon_url": module.meta.manifest.get("icon_url", None),
|
||||
"id": function.id,
|
||||
"name": function.name,
|
||||
"description": function.meta.description,
|
||||
"icon_url": function.meta.manifest.get("icon_url", None),
|
||||
}
|
||||
]
|
||||
|
||||
@ -1088,7 +1141,9 @@ async def get_all_models():
|
||||
raise Exception(f"Action not found: {action_id}")
|
||||
|
||||
function_module = get_function_module_by_id(action_id)
|
||||
model["actions"].extend(get_action_items_from_module(function_module))
|
||||
model["actions"].extend(
|
||||
get_action_items_from_module(action_function, function_module)
|
||||
)
|
||||
return models
|
||||
|
||||
|
||||
@ -1107,14 +1162,23 @@ async def get_models(user=Depends(get_verified_user)):
|
||||
if user.role == "user":
|
||||
filtered_models = []
|
||||
for model in models:
|
||||
if model.get("arena"):
|
||||
if has_access(
|
||||
user.id,
|
||||
type="read",
|
||||
access_control=model.get("info", {})
|
||||
.get("meta", {})
|
||||
.get("access_control", {}),
|
||||
):
|
||||
filtered_models.append(model)
|
||||
continue
|
||||
|
||||
model_info = Models.get_model_by_id(model["id"])
|
||||
if model_info:
|
||||
if user.id == model_info.user_id or has_access(
|
||||
user.id, type="read", access_control=model_info.access_control
|
||||
):
|
||||
filtered_models.append(model)
|
||||
else:
|
||||
filtered_models.append(model)
|
||||
models = filtered_models
|
||||
|
||||
return {"data": models}
|
||||
@ -1144,19 +1208,38 @@ async def generate_chat_completions(
|
||||
)
|
||||
|
||||
model = models[model_id]
|
||||
|
||||
# Check if user has access to the model
|
||||
if user.role == "user":
|
||||
model_info = Models.get_model_by_id(model_id)
|
||||
if not (
|
||||
user.id == model_info.user_id
|
||||
or has_access(
|
||||
user.id, type="read", access_control=model_info.access_control
|
||||
)
|
||||
):
|
||||
raise HTTPException(
|
||||
status_code=403,
|
||||
detail="Model not found",
|
||||
)
|
||||
if not bypass_filter and user.role == "user":
|
||||
if model.get("arena"):
|
||||
if not has_access(
|
||||
user.id,
|
||||
type="read",
|
||||
access_control=model.get("info", {})
|
||||
.get("meta", {})
|
||||
.get("access_control", {}),
|
||||
):
|
||||
raise HTTPException(
|
||||
status_code=403,
|
||||
detail="Model not found",
|
||||
)
|
||||
else:
|
||||
model_info = Models.get_model_by_id(model_id)
|
||||
if not model_info:
|
||||
raise HTTPException(
|
||||
status_code=404,
|
||||
detail="Model not found",
|
||||
)
|
||||
elif not (
|
||||
user.id == model_info.user_id
|
||||
or has_access(
|
||||
user.id, type="read", access_control=model_info.access_control
|
||||
)
|
||||
):
|
||||
raise HTTPException(
|
||||
status_code=403,
|
||||
detail="Model not found",
|
||||
)
|
||||
|
||||
if model["owned_by"] == "arena":
|
||||
model_ids = model.get("info", {}).get("meta", {}).get("model_ids")
|
||||
@ -1165,9 +1248,7 @@ async def generate_chat_completions(
|
||||
model_ids = [
|
||||
model["id"]
|
||||
for model in await get_all_models()
|
||||
if model.get("owned_by") != "arena"
|
||||
and not model.get("info", {}).get("meta", {}).get("hidden", False)
|
||||
and model["id"] not in model_ids
|
||||
if model.get("owned_by") != "arena" and model["id"] not in model_ids
|
||||
]
|
||||
|
||||
selected_model_id = None
|
||||
@ -1178,7 +1259,6 @@ async def generate_chat_completions(
|
||||
model["id"]
|
||||
for model in await get_all_models()
|
||||
if model.get("owned_by") != "arena"
|
||||
and not model.get("info", {}).get("meta", {}).get("hidden", False)
|
||||
]
|
||||
selected_model_id = random.choice(model_ids)
|
||||
|
||||
@ -1533,8 +1613,9 @@ async def get_task_config(user=Depends(get_verified_user)):
|
||||
"TITLE_GENERATION_PROMPT_TEMPLATE": app.state.config.TITLE_GENERATION_PROMPT_TEMPLATE,
|
||||
"TAGS_GENERATION_PROMPT_TEMPLATE": app.state.config.TAGS_GENERATION_PROMPT_TEMPLATE,
|
||||
"ENABLE_TAGS_GENERATION": app.state.config.ENABLE_TAGS_GENERATION,
|
||||
"ENABLE_SEARCH_QUERY": app.state.config.ENABLE_SEARCH_QUERY,
|
||||
"SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE": app.state.config.SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE,
|
||||
"ENABLE_SEARCH_QUERY_GENERATION": app.state.config.ENABLE_SEARCH_QUERY_GENERATION,
|
||||
"ENABLE_RETRIEVAL_QUERY_GENERATION": app.state.config.ENABLE_RETRIEVAL_QUERY_GENERATION,
|
||||
"QUERY_GENERATION_PROMPT_TEMPLATE": app.state.config.QUERY_GENERATION_PROMPT_TEMPLATE,
|
||||
"TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE": app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE,
|
||||
}
|
||||
|
||||
@ -1545,8 +1626,9 @@ class TaskConfigForm(BaseModel):
|
||||
TITLE_GENERATION_PROMPT_TEMPLATE: str
|
||||
TAGS_GENERATION_PROMPT_TEMPLATE: str
|
||||
ENABLE_TAGS_GENERATION: bool
|
||||
SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE: str
|
||||
ENABLE_SEARCH_QUERY: bool
|
||||
ENABLE_SEARCH_QUERY_GENERATION: bool
|
||||
ENABLE_RETRIEVAL_QUERY_GENERATION: bool
|
||||
QUERY_GENERATION_PROMPT_TEMPLATE: str
|
||||
TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE: str
|
||||
|
||||
|
||||
@ -1561,11 +1643,16 @@ async def update_task_config(form_data: TaskConfigForm, user=Depends(get_admin_u
|
||||
form_data.TAGS_GENERATION_PROMPT_TEMPLATE
|
||||
)
|
||||
app.state.config.ENABLE_TAGS_GENERATION = form_data.ENABLE_TAGS_GENERATION
|
||||
|
||||
app.state.config.SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE = (
|
||||
form_data.SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE
|
||||
app.state.config.ENABLE_SEARCH_QUERY_GENERATION = (
|
||||
form_data.ENABLE_SEARCH_QUERY_GENERATION
|
||||
)
|
||||
app.state.config.ENABLE_RETRIEVAL_QUERY_GENERATION = (
|
||||
form_data.ENABLE_RETRIEVAL_QUERY_GENERATION
|
||||
)
|
||||
|
||||
app.state.config.QUERY_GENERATION_PROMPT_TEMPLATE = (
|
||||
form_data.QUERY_GENERATION_PROMPT_TEMPLATE
|
||||
)
|
||||
app.state.config.ENABLE_SEARCH_QUERY = form_data.ENABLE_SEARCH_QUERY
|
||||
app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = (
|
||||
form_data.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE
|
||||
)
|
||||
@ -1576,8 +1663,9 @@ async def update_task_config(form_data: TaskConfigForm, user=Depends(get_admin_u
|
||||
"TITLE_GENERATION_PROMPT_TEMPLATE": app.state.config.TITLE_GENERATION_PROMPT_TEMPLATE,
|
||||
"TAGS_GENERATION_PROMPT_TEMPLATE": app.state.config.TAGS_GENERATION_PROMPT_TEMPLATE,
|
||||
"ENABLE_TAGS_GENERATION": app.state.config.ENABLE_TAGS_GENERATION,
|
||||
"SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE": app.state.config.SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE,
|
||||
"ENABLE_SEARCH_QUERY": app.state.config.ENABLE_SEARCH_QUERY,
|
||||
"ENABLE_SEARCH_QUERY_GENERATION": app.state.config.ENABLE_SEARCH_QUERY_GENERATION,
|
||||
"ENABLE_RETRIEVAL_QUERY_GENERATION": app.state.config.ENABLE_RETRIEVAL_QUERY_GENERATION,
|
||||
"QUERY_GENERATION_PROMPT_TEMPLATE": app.state.config.QUERY_GENERATION_PROMPT_TEMPLATE,
|
||||
"TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE": app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE,
|
||||
}
|
||||
|
||||
@ -1753,14 +1841,22 @@ JSON format: { "tags": ["tag1", "tag2", "tag3"] }
|
||||
return await generate_chat_completions(form_data=payload, user=user)
|
||||
|
||||
|
||||
@app.post("/api/task/query/completions")
|
||||
async def generate_search_query(form_data: dict, user=Depends(get_verified_user)):
|
||||
print("generate_search_query")
|
||||
if not app.state.config.ENABLE_SEARCH_QUERY:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail=f"Search query generation is disabled",
|
||||
)
|
||||
@app.post("/api/task/queries/completions")
|
||||
async def generate_queries(form_data: dict, user=Depends(get_verified_user)):
|
||||
print("generate_queries")
|
||||
type = form_data.get("type")
|
||||
if type == "web_search":
|
||||
if not app.state.config.ENABLE_SEARCH_QUERY_GENERATION:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail=f"Search query generation is disabled",
|
||||
)
|
||||
elif type == "retrieval":
|
||||
if not app.state.config.ENABLE_RETRIEVAL_QUERY_GENERATION:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail=f"Query generation is disabled",
|
||||
)
|
||||
|
||||
model_list = await get_all_models()
|
||||
models = {model["id"]: model for model in model_list}
|
||||
@ -1784,36 +1880,19 @@ async def generate_search_query(form_data: dict, user=Depends(get_verified_user)
|
||||
|
||||
model = models[task_model_id]
|
||||
|
||||
if app.state.config.SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE != "":
|
||||
template = app.state.config.SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE
|
||||
if app.state.config.QUERY_GENERATION_PROMPT_TEMPLATE != "":
|
||||
template = app.state.config.QUERY_GENERATION_PROMPT_TEMPLATE
|
||||
else:
|
||||
template = """Given the user's message and interaction history, decide if a web search is necessary. You must be concise and exclusively provide a search query if one is necessary. Refrain from verbose responses or any additional commentary. Prefer suggesting a search if uncertain to provide comprehensive or updated information. If a search isn't needed at all, respond with an empty string. Default to a search query when in doubt. Today's date is {{CURRENT_DATE}}.
|
||||
template = DEFAULT_QUERY_GENERATION_PROMPT_TEMPLATE
|
||||
|
||||
User Message:
|
||||
{{prompt:end:4000}}
|
||||
|
||||
Interaction History:
|
||||
{{MESSAGES:END:6}}
|
||||
|
||||
Search Query:"""
|
||||
|
||||
content = search_query_generation_template(
|
||||
content = query_generation_template(
|
||||
template, form_data["messages"], {"name": user.name}
|
||||
)
|
||||
|
||||
print("content", content)
|
||||
|
||||
payload = {
|
||||
"model": task_model_id,
|
||||
"messages": [{"role": "user", "content": content}],
|
||||
"stream": False,
|
||||
**(
|
||||
{"max_tokens": 30}
|
||||
if models[task_model_id]["owned_by"] == "ollama"
|
||||
else {
|
||||
"max_completion_tokens": 30,
|
||||
}
|
||||
),
|
||||
"metadata": {"task": str(TASKS.QUERY_GENERATION), "task_body": form_data},
|
||||
}
|
||||
log.debug(payload)
|
||||
@ -2354,6 +2433,7 @@ async def get_app_config(request: Request):
|
||||
"auth": WEBUI_AUTH,
|
||||
"auth_trusted_header": bool(webui_app.state.AUTH_TRUSTED_EMAIL_HEADER),
|
||||
"enable_ldap": webui_app.state.config.ENABLE_LDAP,
|
||||
"enable_api_key": webui_app.state.config.ENABLE_API_KEY,
|
||||
"enable_signup": webui_app.state.config.ENABLE_SIGNUP,
|
||||
"enable_login_form": webui_app.state.config.ENABLE_LOGIN_FORM,
|
||||
**(
|
||||
|
@ -163,7 +163,7 @@ def emoji_generation_template(
|
||||
return template
|
||||
|
||||
|
||||
def search_query_generation_template(
|
||||
def query_generation_template(
|
||||
template: str, messages: list[dict], user: Optional[dict] = None
|
||||
) -> str:
|
||||
prompt = get_last_user_message(messages)
|
||||
|
@ -5,13 +5,11 @@ import jwt
|
||||
from datetime import UTC, datetime, timedelta
|
||||
from typing import Optional, Union, List, Dict
|
||||
|
||||
|
||||
from open_webui.apps.webui.models.users import Users
|
||||
|
||||
from open_webui.constants import ERROR_MESSAGES
|
||||
from open_webui.env import WEBUI_SECRET_KEY
|
||||
|
||||
|
||||
from fastapi import Depends, HTTPException, Request, Response, status
|
||||
from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer
|
||||
from passlib.context import CryptContext
|
||||
@ -93,10 +91,13 @@ def get_current_user(
|
||||
|
||||
# auth by api key
|
||||
if token.startswith("sk-"):
|
||||
if not request.state.enable_api_key:
|
||||
raise HTTPException(
|
||||
status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.API_KEY_NOT_ALLOWED
|
||||
)
|
||||
return get_current_user_by_api_key(token)
|
||||
|
||||
# auth by jwt token
|
||||
|
||||
try:
|
||||
data = decode_token(token)
|
||||
except Exception as e:
|
||||
|
@ -37,8 +37,8 @@ anthropic
|
||||
google-generativeai==0.7.2
|
||||
tiktoken
|
||||
|
||||
langchain==0.3.5
|
||||
langchain-community==0.3.3
|
||||
langchain==0.3.7
|
||||
langchain-community==0.3.7
|
||||
langchain-chroma==0.1.4
|
||||
|
||||
fake-useragent==1.5.1
|
||||
@ -82,12 +82,12 @@ authlib==1.3.2
|
||||
|
||||
black==24.8.0
|
||||
langfuse==2.44.0
|
||||
youtube-transcript-api==0.6.2
|
||||
youtube-transcript-api==0.6.3
|
||||
pytube==15.0.0
|
||||
|
||||
extract_msg
|
||||
pydub
|
||||
duckduckgo-search~=6.3.4
|
||||
duckduckgo-search~=6.3.5
|
||||
|
||||
## Tests
|
||||
docker~=7.1.0
|
||||
|
11
package-lock.json
generated
11
package-lock.json
generated
@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "open-webui",
|
||||
"version": "0.4.0.dev1",
|
||||
"version": "0.4.1",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "open-webui",
|
||||
"version": "0.4.0.dev1",
|
||||
"version": "0.4.1",
|
||||
"dependencies": {
|
||||
"@codemirror/lang-javascript": "^6.2.2",
|
||||
"@codemirror/lang-python": "^6.1.6",
|
||||
@ -3999,9 +3999,10 @@
|
||||
"integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g=="
|
||||
},
|
||||
"node_modules/cross-spawn": {
|
||||
"version": "7.0.3",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
||||
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
|
||||
"version": "7.0.6",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
|
||||
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"path-key": "^3.1.0",
|
||||
"shebang-command": "^2.0.0",
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "open-webui",
|
||||
"version": "0.4.0.dev1",
|
||||
"version": "0.4.1",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "npm run pyodide:fetch && vite dev --host",
|
||||
|
@ -9,7 +9,7 @@ dependencies = [
|
||||
"fastapi==0.111.0",
|
||||
"uvicorn[standard]==0.30.6",
|
||||
"pydantic==2.9.2",
|
||||
"python-multipart==0.0.9",
|
||||
"python-multipart==0.0.17",
|
||||
|
||||
"Flask==3.0.3",
|
||||
"Flask-Cors==5.0.0",
|
||||
@ -28,12 +28,13 @@ dependencies = [
|
||||
"peewee==3.17.6",
|
||||
"peewee-migrate==1.12.2",
|
||||
"psycopg2-binary==2.9.9",
|
||||
"pgvector==0.3.5",
|
||||
"PyMySQL==1.1.1",
|
||||
"bcrypt==4.2.0",
|
||||
|
||||
"pymongo",
|
||||
"redis",
|
||||
"boto3==1.35.0",
|
||||
"boto3==1.35.53",
|
||||
|
||||
"argon2-cffi==23.1.0",
|
||||
"APScheduler==3.10.4",
|
||||
@ -43,13 +44,14 @@ dependencies = [
|
||||
"google-generativeai==0.7.2",
|
||||
"tiktoken",
|
||||
|
||||
"langchain==0.3.0",
|
||||
"langchain-community==0.2.12",
|
||||
"langchain==0.3.7",
|
||||
"langchain-community==0.3.7",
|
||||
"langchain-chroma==0.1.4",
|
||||
|
||||
"fake-useragent==1.5.1",
|
||||
"chromadb==0.5.9",
|
||||
"pymilvus==2.4.7",
|
||||
"chromadb==0.5.15",
|
||||
"pymilvus==2.4.9",
|
||||
"qdrant-client~=1.12.0",
|
||||
"opensearch-py==2.7.1",
|
||||
|
||||
"sentence-transformers==3.2.0",
|
||||
@ -86,18 +88,20 @@ dependencies = [
|
||||
|
||||
"black==24.8.0",
|
||||
"langfuse==2.44.0",
|
||||
"youtube-transcript-api==0.6.2",
|
||||
"youtube-transcript-api==0.6.3",
|
||||
"pytube==15.0.0",
|
||||
|
||||
"extract_msg",
|
||||
"pydub",
|
||||
"duckduckgo-search~=6.2.13",
|
||||
"duckduckgo-search~=6.3.5",
|
||||
|
||||
"docker~=7.1.0",
|
||||
"pytest~=8.3.2",
|
||||
"pytest-docker~=3.1.1",
|
||||
|
||||
"googleapis-common-protos==1.63.2"
|
||||
"googleapis-common-protos==1.63.2",
|
||||
|
||||
"ldap3==2.9.1"
|
||||
]
|
||||
readme = "README.md"
|
||||
requires-python = ">= 3.11, < 3.12.0a1"
|
||||
|
@ -348,15 +348,16 @@ export const generateEmoji = async (
|
||||
return null;
|
||||
};
|
||||
|
||||
export const generateSearchQuery = async (
|
||||
export const generateQueries = async (
|
||||
token: string = '',
|
||||
model: string,
|
||||
messages: object[],
|
||||
prompt: string
|
||||
prompt: string,
|
||||
type?: string = 'web_search'
|
||||
) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_BASE_URL}/api/task/query/completions`, {
|
||||
const res = await fetch(`${WEBUI_BASE_URL}/api/task/queries/completions`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
@ -366,7 +367,8 @@ export const generateSearchQuery = async (
|
||||
body: JSON.stringify({
|
||||
model: model,
|
||||
messages: messages,
|
||||
prompt: prompt
|
||||
prompt: prompt,
|
||||
type: type
|
||||
})
|
||||
})
|
||||
.then(async (res) => {
|
||||
@ -385,7 +387,39 @@ export const generateSearchQuery = async (
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res?.choices[0]?.message?.content.replace(/["']/g, '') ?? prompt;
|
||||
try {
|
||||
// Step 1: Safely extract the response string
|
||||
const response = res?.choices[0]?.message?.content ?? '';
|
||||
|
||||
// Step 2: Attempt to fix common JSON format issues like single quotes
|
||||
const sanitizedResponse = response.replace(/['‘’`]/g, '"'); // Convert single quotes to double quotes for valid JSON
|
||||
|
||||
// Step 3: Find the relevant JSON block within the response
|
||||
const jsonStartIndex = sanitizedResponse.indexOf('{');
|
||||
const jsonEndIndex = sanitizedResponse.lastIndexOf('}');
|
||||
|
||||
// Step 4: Check if we found a valid JSON block (with both `{` and `}`)
|
||||
if (jsonStartIndex !== -1 && jsonEndIndex !== -1) {
|
||||
const jsonResponse = sanitizedResponse.substring(jsonStartIndex, jsonEndIndex + 1);
|
||||
|
||||
// Step 5: Parse the JSON block
|
||||
const parsed = JSON.parse(jsonResponse);
|
||||
|
||||
// Step 6: If there's a "queries" key, return the queries array; otherwise, return an empty array
|
||||
if (parsed && parsed.queries) {
|
||||
return Array.isArray(parsed.queries) ? parsed.queries : [];
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
// If no valid JSON block found, return an empty array
|
||||
return [];
|
||||
} catch (e) {
|
||||
// Catch and safely return empty array on any parsing errors
|
||||
console.error('Failed to parse response: ', e);
|
||||
return [];
|
||||
}
|
||||
};
|
||||
|
||||
export const generateMoACompletion = async (
|
||||
|
@ -3,7 +3,7 @@ import { WEBUI_API_BASE_URL } from '$lib/constants';
|
||||
export const getModels = async (token: string = '') => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/models`, {
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/models/`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
@ -97,7 +97,7 @@ export const getModelById = async (token: string, id: string) => {
|
||||
const searchParams = new URLSearchParams();
|
||||
searchParams.append('id', id);
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/models/id/${id}`, {
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/models/model?${searchParams.toString()}`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
@ -132,7 +132,7 @@ export const toggleModelById = async (token: string, id: string) => {
|
||||
const searchParams = new URLSearchParams();
|
||||
searchParams.append('id', id);
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/models/id/${id}/toggle`, {
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/models/model/toggle?${searchParams.toString()}`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
@ -167,7 +167,7 @@ export const updateModelById = async (token: string, id: string, model: object)
|
||||
const searchParams = new URLSearchParams();
|
||||
searchParams.append('id', id);
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/models/id/${id}/update`, {
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/models/model/update?${searchParams.toString()}`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
@ -203,7 +203,39 @@ export const deleteModelById = async (token: string, id: string) => {
|
||||
const searchParams = new URLSearchParams();
|
||||
searchParams.append('id', id);
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/models/id/${id}/delete`, {
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/models/model/delete?${searchParams.toString()}`, {
|
||||
method: 'DELETE',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
authorization: `Bearer ${token}`
|
||||
}
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.then((json) => {
|
||||
return json;
|
||||
})
|
||||
.catch((err) => {
|
||||
error = err;
|
||||
|
||||
console.log(err);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
export const deleteAllModels = async (token: string) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/models/delete/all`, {
|
||||
method: 'DELETE',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
|
@ -22,7 +22,7 @@
|
||||
});
|
||||
</script>
|
||||
|
||||
<Modal bind:show>
|
||||
<Modal bind:show size="lg">
|
||||
<div class="px-5 pt-4 dark:text-gray-300 text-gray-700">
|
||||
<div class="flex justify-between items-start">
|
||||
<div class="text-xl font-semibold">
|
||||
@ -59,7 +59,7 @@
|
||||
</div>
|
||||
|
||||
<div class=" w-full p-4 px-5 text-gray-700 dark:text-gray-100">
|
||||
<div class=" overflow-y-scroll max-h-80 scrollbar-hidden">
|
||||
<div class=" overflow-y-scroll max-h-96 scrollbar-hidden">
|
||||
<div class="mb-3">
|
||||
{#if changelog}
|
||||
{#each Object.keys(changelog) as version}
|
||||
@ -111,7 +111,7 @@
|
||||
await updateUserSettings(localStorage.token, { ui: $settings });
|
||||
show = false;
|
||||
}}
|
||||
class=" px-4 py-2 bg-emerald-700 hover:bg-emerald-800 text-gray-100 transition rounded-lg"
|
||||
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full"
|
||||
>
|
||||
<span class="relative">{$i18n.t("Okay, Let's Go!")}</span>
|
||||
</button>
|
||||
|
@ -31,7 +31,7 @@
|
||||
</script>
|
||||
|
||||
{#if loaded}
|
||||
<div class="flex flex-col lg:flex-row w-full h-full -mt-0.5 pb-2 lg:space-x-4">
|
||||
<div class="flex flex-col lg:flex-row w-full h-full pb-2 lg:space-x-4">
|
||||
<div
|
||||
id="users-tabs-container"
|
||||
class="tabs flex flex-row overflow-x-auto gap-2.5 max-w-full lg:gap-1 lg:flex-col lg:flex-none lg:w-40 dark:text-gray-200 text-sm font-medium text-left scrollbar-none"
|
||||
|
@ -452,7 +452,7 @@
|
||||
|
||||
{#if $config?.features.enable_community_sharing}
|
||||
<div class=" my-16">
|
||||
<div class=" text-lg font-semibold mb-0.5 line-clamp-1">
|
||||
<div class=" text-xl font-medium mb-1 line-clamp-1">
|
||||
{$i18n.t('Made by OpenWebUI Community')}
|
||||
</div>
|
||||
|
||||
|
@ -38,7 +38,7 @@
|
||||
});
|
||||
</script>
|
||||
|
||||
<div class="flex flex-col lg:flex-row w-full h-full pb-2 -mt-0.5 lg:space-x-4">
|
||||
<div class="flex flex-col lg:flex-row w-full h-full pb-2 lg:space-x-4">
|
||||
<div
|
||||
id="admin-settings-tabs-container"
|
||||
class="tabs flex flex-row overflow-x-auto gap-2.5 max-w-full lg:gap-1 lg:flex-col lg:flex-none lg:w-40 dark:text-gray-200 text-sm font-medium text-left scrollbar-none"
|
||||
|
@ -527,8 +527,37 @@
|
||||
<Modal size="sm" bind:show>
|
||||
<div>
|
||||
<div class=" flex justify-between dark:text-gray-100 px-5 pt-4 pb-2">
|
||||
<div class=" text-lg font-medium self-center font-primary">
|
||||
{$i18n.t('Manage Ollama')}
|
||||
<div
|
||||
class="flex w-full justify-between items-center text-lg font-medium self-center font-primary"
|
||||
>
|
||||
<div class=" flex-shrink-0">
|
||||
{$i18n.t('Manage Ollama')}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<Tooltip content="Update All Models" placement="top">
|
||||
<button
|
||||
class="p-2.5 flex gap-2 items-center bg-transparent 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>
|
||||
<button
|
||||
class="self-center"
|
||||
@ -554,6 +583,12 @@
|
||||
<div class=" flex flex-col w-full">
|
||||
<div>
|
||||
<div class="space-y-2">
|
||||
{#if updateModelId}
|
||||
<div class="text-xs">
|
||||
Updating "{updateModelId}" {updateProgress ? `(${updateProgress}%)` : ''}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div>
|
||||
<div class=" mb-2 text-sm font-medium">
|
||||
{$i18n.t('Pull a model from Ollama.com')}
|
||||
|
@ -56,8 +56,11 @@
|
||||
let chunkOverlap = 0;
|
||||
let pdfExtractImages = true;
|
||||
|
||||
let OpenAIKey = '';
|
||||
let OpenAIUrl = '';
|
||||
let OpenAIKey = '';
|
||||
|
||||
let OllamaUrl = '';
|
||||
let OllamaKey = '';
|
||||
|
||||
let querySettings = {
|
||||
template: '',
|
||||
@ -104,19 +107,15 @@
|
||||
const res = await updateEmbeddingConfig(localStorage.token, {
|
||||
embedding_engine: embeddingEngine,
|
||||
embedding_model: embeddingModel,
|
||||
...(embeddingEngine === 'openai' || embeddingEngine === 'ollama'
|
||||
? {
|
||||
embedding_batch_size: embeddingBatchSize
|
||||
}
|
||||
: {}),
|
||||
...(embeddingEngine === 'openai'
|
||||
? {
|
||||
openai_config: {
|
||||
key: OpenAIKey,
|
||||
url: OpenAIUrl
|
||||
}
|
||||
}
|
||||
: {})
|
||||
embedding_batch_size: embeddingBatchSize,
|
||||
ollama_config: {
|
||||
key: OllamaKey,
|
||||
url: OllamaUrl
|
||||
},
|
||||
openai_config: {
|
||||
key: OpenAIKey,
|
||||
url: OpenAIUrl
|
||||
}
|
||||
}).catch(async (error) => {
|
||||
toast.error(error);
|
||||
await setEmbeddingConfig();
|
||||
@ -206,6 +205,9 @@
|
||||
|
||||
OpenAIKey = embeddingConfig.openai_config.key;
|
||||
OpenAIUrl = embeddingConfig.openai_config.url;
|
||||
|
||||
OllamaKey = embeddingConfig.ollama_config.key;
|
||||
OllamaUrl = embeddingConfig.ollama_config.url;
|
||||
}
|
||||
};
|
||||
|
||||
@ -310,7 +312,7 @@
|
||||
</div>
|
||||
|
||||
{#if embeddingEngine === 'openai'}
|
||||
<div class="my-0.5 flex gap-2">
|
||||
<div class="my-0.5 flex gap-2 pr-2">
|
||||
<input
|
||||
class="flex-1 w-full rounded-lg text-sm bg-transparent outline-none"
|
||||
placeholder={$i18n.t('API Base URL')}
|
||||
@ -320,7 +322,23 @@
|
||||
|
||||
<SensitiveInput placeholder={$i18n.t('API Key')} bind:value={OpenAIKey} />
|
||||
</div>
|
||||
{:else if embeddingEngine === 'ollama'}
|
||||
<div class="my-0.5 flex gap-2 pr-2">
|
||||
<input
|
||||
class="flex-1 w-full rounded-lg text-sm bg-transparent outline-none"
|
||||
placeholder={$i18n.t('API Base URL')}
|
||||
bind:value={OllamaUrl}
|
||||
required
|
||||
/>
|
||||
|
||||
<SensitiveInput
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={OllamaKey}
|
||||
required={false}
|
||||
/>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if embeddingEngine === 'ollama' || embeddingEngine === 'openai'}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Embedding Batch Size')}</div>
|
||||
|
@ -11,7 +11,7 @@
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
import Plus from '$lib/components/icons/Plus.svelte';
|
||||
import Model from './Evaluations/Model.svelte';
|
||||
import ModelModal from './Evaluations/ModelModal.svelte';
|
||||
import ArenaModelModal from './Evaluations/ArenaModelModal.svelte';
|
||||
import { getConfig, updateConfig } from '$lib/apis/evaluations';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
@ -65,7 +65,7 @@
|
||||
});
|
||||
</script>
|
||||
|
||||
<ModelModal
|
||||
<ArenaModelModal
|
||||
bind:show={showAddModel}
|
||||
on:submit={async (e) => {
|
||||
addModelHandler(e.detail);
|
||||
|
@ -9,6 +9,7 @@
|
||||
import Minus from '$lib/components/icons/Minus.svelte';
|
||||
import PencilSolid from '$lib/components/icons/PencilSolid.svelte';
|
||||
import { toast } from 'svelte-sonner';
|
||||
import AccessControl from '$lib/components/workspace/common/AccessControl.svelte';
|
||||
|
||||
export let show = false;
|
||||
export let edit = false;
|
||||
@ -39,6 +40,8 @@
|
||||
let modelIds = [];
|
||||
let filterMode = 'include';
|
||||
|
||||
let accessControl = {};
|
||||
|
||||
let imageInputElement;
|
||||
let loading = false;
|
||||
|
||||
@ -74,7 +77,8 @@
|
||||
profile_image_url: profileImageUrl,
|
||||
description: description || null,
|
||||
model_ids: modelIds.length > 0 ? modelIds : null,
|
||||
filter_mode: modelIds.length > 0 ? (filterMode ? filterMode : null) : null
|
||||
filter_mode: modelIds.length > 0 ? (filterMode ? filterMode : null) : null,
|
||||
access_control: accessControl
|
||||
}
|
||||
};
|
||||
|
||||
@ -98,6 +102,7 @@
|
||||
description = model.meta.description;
|
||||
modelIds = model.meta.model_ids || [];
|
||||
filterMode = model.meta?.filter_mode ?? 'include';
|
||||
accessControl = 'access_control' in model.meta ? model.meta.access_control : {};
|
||||
}
|
||||
};
|
||||
|
||||
@ -283,6 +288,14 @@
|
||||
|
||||
<hr class=" border-gray-100 dark:border-gray-700/10 my-2.5 w-full" />
|
||||
|
||||
<div class="my-2 -mx-2">
|
||||
<div class="px-3 py-2 bg-gray-50 dark:bg-gray-950 rounded-lg">
|
||||
<AccessControl bind:accessControl />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class=" border-gray-100 dark:border-gray-700/10 my-2.5 w-full" />
|
||||
|
||||
<div class="flex flex-col w-full">
|
||||
<div class="mb-1 flex justify-between">
|
||||
<div class="text-xs text-gray-500">{$i18n.t('Models')}</div>
|
@ -4,13 +4,13 @@
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
import Cog6 from '$lib/components/icons/Cog6.svelte';
|
||||
import ModelModal from './ModelModal.svelte';
|
||||
import ArenaModelModal from './ArenaModelModal.svelte';
|
||||
export let model;
|
||||
|
||||
let showModel = false;
|
||||
</script>
|
||||
|
||||
<ModelModal
|
||||
<ArenaModelModal
|
||||
bind:show={showModel}
|
||||
edit={true}
|
||||
{model}
|
||||
|
@ -112,6 +112,12 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" flex w-full justify-between pr-2">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Enable API Key Auth')}</div>
|
||||
|
||||
<Switch bind:state={adminConfig.ENABLE_API_KEY} />
|
||||
</div>
|
||||
|
||||
<hr class=" border-gray-50 dark:border-gray-850 my-2" />
|
||||
|
||||
<div class="my-3 flex w-full items-center justify-between pr-2">
|
||||
|
@ -26,8 +26,9 @@
|
||||
TITLE_GENERATION_PROMPT_TEMPLATE: '',
|
||||
TAGS_GENERATION_PROMPT_TEMPLATE: '',
|
||||
ENABLE_TAGS_GENERATION: true,
|
||||
ENABLE_SEARCH_QUERY: true,
|
||||
SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE: ''
|
||||
ENABLE_SEARCH_QUERY_GENERATION: true,
|
||||
ENABLE_RETRIEVAL_QUERY_GENERATION: true,
|
||||
QUERY_GENERATION_PROMPT_TEMPLATE: ''
|
||||
};
|
||||
|
||||
let promptSuggestions = [];
|
||||
@ -164,31 +165,35 @@
|
||||
|
||||
<hr class=" dark:border-gray-850 my-3" />
|
||||
|
||||
<div class="my-3 flex w-full items-center justify-between">
|
||||
<div class=" self-center text-xs font-medium">
|
||||
{$i18n.t('Enable Retrieval Query Generation')}
|
||||
</div>
|
||||
|
||||
<Switch bind:state={taskConfig.ENABLE_RETRIEVAL_QUERY_GENERATION} />
|
||||
</div>
|
||||
|
||||
<div class="my-3 flex w-full items-center justify-between">
|
||||
<div class=" self-center text-xs font-medium">
|
||||
{$i18n.t('Enable Web Search Query Generation')}
|
||||
</div>
|
||||
|
||||
<Switch bind:state={taskConfig.ENABLE_SEARCH_QUERY} />
|
||||
<Switch bind:state={taskConfig.ENABLE_SEARCH_QUERY_GENERATION} />
|
||||
</div>
|
||||
|
||||
{#if taskConfig.ENABLE_SEARCH_QUERY}
|
||||
<div class="">
|
||||
<div class=" mb-2.5 text-xs font-medium">{$i18n.t('Search Query Generation Prompt')}</div>
|
||||
<div class="">
|
||||
<div class=" mb-2.5 text-xs font-medium">{$i18n.t('Query Generation Prompt')}</div>
|
||||
|
||||
<Tooltip
|
||||
content={$i18n.t('Leave empty to use the default prompt, or enter a custom prompt')}
|
||||
placement="top-start"
|
||||
>
|
||||
<Textarea
|
||||
bind:value={taskConfig.SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE}
|
||||
placeholder={$i18n.t(
|
||||
'Leave empty to use the default prompt, or enter a custom prompt'
|
||||
)}
|
||||
/>
|
||||
</Tooltip>
|
||||
</div>
|
||||
{/if}
|
||||
<Tooltip
|
||||
content={$i18n.t('Leave empty to use the default prompt, or enter a custom prompt')}
|
||||
placement="top-start"
|
||||
>
|
||||
<Textarea
|
||||
bind:value={taskConfig.QUERY_GENERATION_PROMPT_TEMPLATE}
|
||||
placeholder={$i18n.t('Leave empty to use the default prompt, or enter a custom prompt')}
|
||||
/>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-850 my-3" />
|
||||
|
@ -9,6 +9,7 @@
|
||||
import { WEBUI_NAME, config, mobile, models as _models, settings, user } from '$lib/stores';
|
||||
import {
|
||||
createNewModel,
|
||||
deleteAllModels,
|
||||
getBaseModels,
|
||||
toggleModelById,
|
||||
updateModelById
|
||||
@ -21,6 +22,8 @@
|
||||
import Spinner from '$lib/components/common/Spinner.svelte';
|
||||
|
||||
import ModelEditor from '$lib/components/workspace/Models/ModelEditor.svelte';
|
||||
import { toast } from 'svelte-sonner';
|
||||
import ConfirmDialog from '$lib/components/common/ConfirmDialog.svelte';
|
||||
|
||||
let importFiles;
|
||||
let modelsImportInputElement: HTMLInputElement;
|
||||
@ -31,8 +34,8 @@
|
||||
let baseModels = null;
|
||||
|
||||
let filteredModels = [];
|
||||
|
||||
let selectedModelId = null;
|
||||
let showResetModal = false;
|
||||
|
||||
$: if (models) {
|
||||
filteredModels = models.filter(
|
||||
@ -57,11 +60,16 @@
|
||||
const workspaceModel = workspaceModels.find((wm) => wm.id === m.id);
|
||||
|
||||
if (workspaceModel) {
|
||||
return workspaceModel;
|
||||
return {
|
||||
...m,
|
||||
...workspaceModel
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
...m,
|
||||
id: m.id,
|
||||
name: m.name,
|
||||
|
||||
is_active: true
|
||||
};
|
||||
}
|
||||
@ -72,13 +80,21 @@
|
||||
model.base_model_id = null;
|
||||
|
||||
if (workspaceModels.find((m) => m.id === model.id)) {
|
||||
await updateModelById(localStorage.token, model.id, model).catch((error) => {
|
||||
const res = await updateModelById(localStorage.token, model.id, model).catch((error) => {
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
toast.success($i18n.t('Model updated successfully'));
|
||||
}
|
||||
} else {
|
||||
await createNewModel(localStorage.token, model).catch((error) => {
|
||||
const res = await createNewModel(localStorage.token, model).catch((error) => {
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
toast.success($i18n.t('Model updated successfully'));
|
||||
}
|
||||
}
|
||||
|
||||
_models.set(await getModels(localStorage.token));
|
||||
@ -93,6 +109,7 @@
|
||||
base_model_id: null,
|
||||
meta: {},
|
||||
params: {},
|
||||
access_control: {},
|
||||
is_active: model.is_active
|
||||
}).catch((error) => {
|
||||
return null;
|
||||
@ -111,6 +128,19 @@
|
||||
});
|
||||
</script>
|
||||
|
||||
<ConfirmDialog
|
||||
title={$i18n.t('Delete All Models')}
|
||||
message={$i18n.t('This will delete all models including custom models and cannot be undone.')}
|
||||
bind:show={showResetModal}
|
||||
onConfirm={async () => {
|
||||
const res = deleteAllModels(localStorage.token);
|
||||
if (res) {
|
||||
toast.success($i18n.t('All models deleted successfully'));
|
||||
init();
|
||||
}
|
||||
}}
|
||||
/>
|
||||
|
||||
{#if models !== null}
|
||||
{#if selectedModelId === null}
|
||||
<div class="flex flex-col gap-1 mt-1.5 mb-2">
|
||||
@ -122,6 +152,22 @@
|
||||
>{filteredModels.length}</span
|
||||
>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<Tooltip content={$i18n.t('This will delete all models including custom models')}>
|
||||
<button
|
||||
class=" px-2.5 py-1 rounded-full flex gap-1 items-center"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
showResetModal = true;
|
||||
}}
|
||||
>
|
||||
<div class="text-xs flex-shrink-0">
|
||||
{$i18n.t('Reset')}
|
||||
</div>
|
||||
</button>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" flex flex-1 items-center w-full space-x-2">
|
||||
@ -168,14 +214,26 @@
|
||||
|
||||
<div class=" flex-1 self-center {(model?.is_active ?? true) ? '' : 'text-gray-500'}">
|
||||
<Tooltip
|
||||
content={marked.parse(model?.meta?.description ?? model.id)}
|
||||
content={marked.parse(
|
||||
!!model?.meta?.description
|
||||
? model?.meta?.description
|
||||
: model?.ollama?.digest
|
||||
? `${model?.ollama?.digest} **(${model?.ollama?.modified_at})**`
|
||||
: model.id
|
||||
)}
|
||||
className=" w-fit"
|
||||
placement="top-start"
|
||||
>
|
||||
<div class=" font-semibold line-clamp-1">{model.name}</div>
|
||||
</Tooltip>
|
||||
<div class=" text-xs overflow-hidden text-ellipsis line-clamp-1 text-gray-500">
|
||||
{model?.meta?.description ?? model.id}
|
||||
<span class=" line-clamp-1">
|
||||
{!!model?.meta?.description
|
||||
? model?.meta?.description
|
||||
: model?.ollama?.digest
|
||||
? `${model.id} (${model?.ollama?.digest})`
|
||||
: model.id}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</button>
|
||||
|
@ -46,7 +46,7 @@
|
||||
});
|
||||
</script>
|
||||
|
||||
<div class="flex flex-col lg:flex-row w-full h-full -mt-0.5 pb-2 lg:space-x-4">
|
||||
<div class="flex flex-col lg:flex-row w-full h-full pb-2 lg:space-x-4">
|
||||
<div
|
||||
id="users-tabs-container"
|
||||
class=" flex flex-row overflow-x-auto gap-2.5 max-w-full lg:gap-1 lg:flex-col lg:flex-none lg:w-40 dark:text-gray-200 text-sm font-medium text-left scrollbar-none"
|
||||
|
@ -55,7 +55,12 @@
|
||||
onDelete={deleteHandler}
|
||||
/>
|
||||
|
||||
<div class="flex items-center gap-3 justify-between px-1 text-xs w-full transition">
|
||||
<button
|
||||
class="flex items-center gap-3 justify-between px-1 text-xs w-full transition"
|
||||
on:click={() => {
|
||||
showEdit = true;
|
||||
}}
|
||||
>
|
||||
<div class="flex items-center gap-1.5 w-full font-medium">
|
||||
<div>
|
||||
<UserCircleSolid className="size-4" />
|
||||
@ -72,13 +77,8 @@
|
||||
</div>
|
||||
|
||||
<div class="w-full flex justify-end">
|
||||
<button
|
||||
class=" rounded-lg p-1 hover:bg-gray-100 dark:hover:bg-gray-850 transition"
|
||||
on:click={() => {
|
||||
showEdit = true;
|
||||
}}
|
||||
>
|
||||
<div class=" rounded-lg p-1 hover:bg-gray-100 dark:hover:bg-gray-850 transition">
|
||||
<Pencil className="size-3.5" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</button>
|
||||
|
@ -66,7 +66,7 @@
|
||||
import {
|
||||
chatCompleted,
|
||||
generateTitle,
|
||||
generateSearchQuery,
|
||||
generateQueries,
|
||||
chatAction,
|
||||
generateMoACompletion,
|
||||
generateTags
|
||||
@ -663,7 +663,8 @@
|
||||
role: m.role,
|
||||
content: m.content,
|
||||
info: m.info ? m.info : undefined,
|
||||
timestamp: m.timestamp
|
||||
timestamp: m.timestamp,
|
||||
...(m.citations ? { citations: m.citations } : {})
|
||||
})),
|
||||
chat_id: chatId,
|
||||
session_id: $socket?.id,
|
||||
@ -716,7 +717,8 @@
|
||||
role: m.role,
|
||||
content: m.content,
|
||||
info: m.info ? m.info : undefined,
|
||||
timestamp: m.timestamp
|
||||
timestamp: m.timestamp,
|
||||
...(m.citations ? { citations: m.citations } : {})
|
||||
})),
|
||||
...(event ? { event: event } : {}),
|
||||
chat_id: chatId,
|
||||
@ -2033,6 +2035,7 @@
|
||||
parentId: string,
|
||||
responseMessageId: string
|
||||
) => {
|
||||
// TODO: move this to the backend
|
||||
const responseMessage = history.messages[responseMessageId];
|
||||
const userMessage = history.messages[parentId];
|
||||
const messages = createMessagesList(history.currentId);
|
||||
@ -2047,17 +2050,17 @@
|
||||
history.messages[responseMessageId] = responseMessage;
|
||||
|
||||
const prompt = userMessage.content;
|
||||
let searchQuery = await generateSearchQuery(
|
||||
let queries = await generateQueries(
|
||||
localStorage.token,
|
||||
model,
|
||||
messages.filter((message) => message?.content?.trim()),
|
||||
prompt
|
||||
).catch((error) => {
|
||||
console.log(error);
|
||||
return prompt;
|
||||
return [prompt];
|
||||
});
|
||||
|
||||
if (!searchQuery || searchQuery == '') {
|
||||
if (queries.length === 0) {
|
||||
responseMessage.statusHistory.push({
|
||||
done: true,
|
||||
error: true,
|
||||
@ -2068,6 +2071,8 @@
|
||||
return;
|
||||
}
|
||||
|
||||
const searchQuery = queries[0];
|
||||
|
||||
responseMessage.statusHistory.push({
|
||||
done: false,
|
||||
action: 'web_search',
|
||||
|
@ -23,7 +23,7 @@
|
||||
import { uploadFile } from '$lib/apis/files';
|
||||
import { getTools } from '$lib/apis/tools';
|
||||
|
||||
import { WEBUI_BASE_URL, WEBUI_API_BASE_URL } from '$lib/constants';
|
||||
import { WEBUI_BASE_URL, WEBUI_API_BASE_URL, PASTED_TEXT_CHARACTER_LIMIT } from '$lib/constants';
|
||||
|
||||
import Tooltip from '../common/Tooltip.svelte';
|
||||
import InputMenu from './MessageInput/InputMenu.svelte';
|
||||
@ -91,7 +91,7 @@
|
||||
});
|
||||
};
|
||||
|
||||
const uploadFileHandler = async (file) => {
|
||||
const uploadFileHandler = async (file, fullContext: boolean = false) => {
|
||||
if ($_user?.role !== 'admin' && !($_user?.permissions?.chat?.file_upload ?? true)) {
|
||||
toast.error($i18n.t('You do not have permission to upload files.'));
|
||||
return null;
|
||||
@ -110,7 +110,8 @@
|
||||
status: 'uploading',
|
||||
size: file.size,
|
||||
error: '',
|
||||
itemId: tempItemId
|
||||
itemId: tempItemId,
|
||||
...(fullContext ? { context: 'full' } : {})
|
||||
};
|
||||
|
||||
if (fileItem.size == 0) {
|
||||
@ -236,15 +237,7 @@
|
||||
dragged = false;
|
||||
};
|
||||
|
||||
let dropzoneElement;
|
||||
|
||||
onMount(async () => {
|
||||
console.log('hi');
|
||||
|
||||
if (!$tools) {
|
||||
await tools.set(await getTools(localStorage.token));
|
||||
}
|
||||
|
||||
loaded = true;
|
||||
|
||||
window.setTimeout(() => {
|
||||
@ -254,17 +247,21 @@
|
||||
|
||||
window.addEventListener('keydown', handleKeyDown);
|
||||
|
||||
if (dropzoneElement) {
|
||||
dropzoneElement?.addEventListener('dragover', onDragOver);
|
||||
dropzoneElement?.addEventListener('drop', onDrop);
|
||||
dropzoneElement?.addEventListener('dragleave', onDragLeave);
|
||||
}
|
||||
await tick();
|
||||
|
||||
const dropzoneElement = document.getElementById('chat-container');
|
||||
|
||||
dropzoneElement?.addEventListener('dragover', onDragOver);
|
||||
dropzoneElement?.addEventListener('drop', onDrop);
|
||||
dropzoneElement?.addEventListener('dragleave', onDragLeave);
|
||||
});
|
||||
|
||||
onDestroy(() => {
|
||||
console.log('destroy');
|
||||
window.removeEventListener('keydown', handleKeyDown);
|
||||
|
||||
const dropzoneElement = document.getElementById('chat-container');
|
||||
|
||||
if (dropzoneElement) {
|
||||
dropzoneElement?.removeEventListener('dragover', onDragOver);
|
||||
dropzoneElement?.removeEventListener('drop', onDrop);
|
||||
@ -273,10 +270,6 @@
|
||||
});
|
||||
</script>
|
||||
|
||||
<div
|
||||
class="absolute top-0 bottom-0 left-0 right-0 w-full h-full touch-none pointer-events-none"
|
||||
bind:this={dropzoneElement}
|
||||
></div>
|
||||
<FilesOverlay show={dragged} />
|
||||
|
||||
{#if loaded}
|
||||
@ -315,11 +308,59 @@
|
||||
<div class="w-full relative">
|
||||
{#if atSelectedModel !== undefined || selectedToolIds.length > 0 || webSearchEnabled}
|
||||
<div
|
||||
class="px-3 pb-0.5 pt-1.5 text-left w-full flex flex-col absolute bottom-0 left-0 right-0 bg-gradient-to-t from-white dark:from-gray-900 z-10"
|
||||
class="px-4 pb-0.5 pt-1.5 text-left w-full flex flex-col absolute bottom-0 left-0 right-0 bg-gradient-to-t from-white dark:from-gray-900 z-10"
|
||||
>
|
||||
{#if selectedToolIds.length > 0}
|
||||
<div class="flex items-center justify-between w-full">
|
||||
<div class="flex items-center gap-2.5 text-sm dark:text-gray-500">
|
||||
<div class="pl-1">
|
||||
<span class="relative flex size-2">
|
||||
<span
|
||||
class="animate-ping absolute inline-flex h-full w-full rounded-full bg-yellow-400 opacity-75"
|
||||
/>
|
||||
<span class="relative inline-flex rounded-full size-2 bg-yellow-500" />
|
||||
</span>
|
||||
</div>
|
||||
<div class=" translate-y-[0.5px] text-ellipsis line-clamp-1 flex">
|
||||
{#each selectedToolIds.map((id) => {
|
||||
return $tools ? $tools.find((t) => t.id === id) : { id: id, name: id };
|
||||
}) as tool, toolIdx (toolIdx)}
|
||||
<Tooltip
|
||||
content={tool?.meta?.description ?? ''}
|
||||
className=" {toolIdx !== 0 ? 'pl-0.5' : ''} flex-shrink-0"
|
||||
placement="top"
|
||||
>
|
||||
{tool.name}
|
||||
</Tooltip>
|
||||
|
||||
{#if toolIdx !== selectedToolIds.length - 1}
|
||||
<span>, </span>
|
||||
{/if}
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if webSearchEnabled}
|
||||
<div class="flex items-center justify-between w-full">
|
||||
<div class="flex items-center gap-2.5 text-sm dark:text-gray-500">
|
||||
<div class="pl-1">
|
||||
<span class="relative flex size-2">
|
||||
<span
|
||||
class="animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75"
|
||||
/>
|
||||
<span class="relative inline-flex rounded-full size-2 bg-green-500" />
|
||||
</span>
|
||||
</div>
|
||||
<div class=" translate-y-[0.5px]">{$i18n.t('Search the web')}</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if atSelectedModel !== undefined}
|
||||
<div class="flex items-center justify-between w-full">
|
||||
<div class="flex items-center gap-2 text-sm dark:text-gray-500">
|
||||
<div class="pl-[1px] flex items-center gap-2 text-sm dark:text-gray-500">
|
||||
<img
|
||||
crossorigin="anonymous"
|
||||
alt="model profile"
|
||||
@ -346,76 +387,6 @@
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if selectedToolIds.length > 0}
|
||||
<div class="flex items-center justify-between w-full">
|
||||
<div class="flex items-center gap-2 text-sm dark:text-gray-500">
|
||||
<div>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="size-3.5"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M11.5 8a3.5 3.5 0 0 0 3.362-4.476c-.094-.325-.497-.39-.736-.15L12.099 5.4a.48.48 0 0 1-.653.033 8.554 8.554 0 0 1-.879-.879.48.48 0 0 1 .033-.653l2.027-2.028c.24-.239.175-.642-.15-.736a3.502 3.502 0 0 0-4.476 3.427c.018.99-.133 2.093-.914 2.7l-5.31 4.13a2.015 2.015 0 1 0 2.828 2.827l4.13-5.309c.607-.78 1.71-.932 2.7-.914L11.5 8ZM3 13.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" translate-y-[0.5px]">
|
||||
{selectedToolIds
|
||||
.map((id) => {
|
||||
return $tools ? $tools.find((tool) => tool.id === id)?.name : id;
|
||||
})
|
||||
.join(', ')}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<button
|
||||
class="flex items-center dark:text-gray-500"
|
||||
on:click={() => {
|
||||
selectedToolIds = [];
|
||||
}}
|
||||
>
|
||||
<XMark />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if webSearchEnabled}
|
||||
<div class="flex items-center justify-between w-full">
|
||||
<div class="flex items-center gap-2 text-sm dark:text-gray-500">
|
||||
<div>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="size-3.5"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M3.757 4.5c.18.217.376.42.586.608.153-.61.354-1.175.596-1.678A5.53 5.53 0 0 0 3.757 4.5ZM8 1a6.994 6.994 0 0 0-7 7 7 7 0 1 0 7-7Zm0 1.5c-.476 0-1.091.386-1.633 1.427-.293.564-.531 1.267-.683 2.063A5.48 5.48 0 0 0 8 6.5a5.48 5.48 0 0 0 2.316-.51c-.152-.796-.39-1.499-.683-2.063C9.09 2.886 8.476 2.5 8 2.5Zm3.657 2.608a8.823 8.823 0 0 0-.596-1.678c.444.298.842.659 1.182 1.07-.18.217-.376.42-.586.608Zm-1.166 2.436A6.983 6.983 0 0 1 8 8a6.983 6.983 0 0 1-2.49-.456 10.703 10.703 0 0 0 .202 2.6c.72.231 1.49.356 2.288.356.798 0 1.568-.125 2.29-.356a10.705 10.705 0 0 0 .2-2.6Zm1.433 1.85a12.652 12.652 0 0 0 .018-2.609c.405-.276.78-.594 1.117-.947a5.48 5.48 0 0 1 .44 2.262 7.536 7.536 0 0 1-1.575 1.293Zm-2.172 2.435a9.046 9.046 0 0 1-3.504 0c.039.084.078.166.12.244C6.907 13.114 7.523 13.5 8 13.5s1.091-.386 1.633-1.427c.04-.078.08-.16.12-.244Zm1.31.74a8.5 8.5 0 0 0 .492-1.298c.457-.197.893-.43 1.307-.696a5.526 5.526 0 0 1-1.8 1.995Zm-6.123 0a8.507 8.507 0 0 1-.493-1.298 8.985 8.985 0 0 1-1.307-.696 5.526 5.526 0 0 0 1.8 1.995ZM2.5 8.1c.463.5.993.935 1.575 1.293a12.652 12.652 0 0 1-.018-2.608 7.037 7.037 0 0 1-1.117-.947 5.48 5.48 0 0 0-.44 2.262Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" translate-y-[0.5px]">{$i18n.t('Search the web')}</div>
|
||||
</div>
|
||||
<div>
|
||||
<button
|
||||
class="flex items-center dark:text-gray-500"
|
||||
on:click={() => {
|
||||
webSearchEnabled = false;
|
||||
}}
|
||||
>
|
||||
<XMark />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@ -623,6 +594,7 @@
|
||||
id="chat-input"
|
||||
trim={true}
|
||||
placeholder={placeholder ? placeholder : $i18n.t('Send a Message')}
|
||||
largeTextAsFile={$settings?.largeTextAsFile ?? false}
|
||||
bind:value={prompt}
|
||||
shiftEnter={!$mobile ||
|
||||
!(
|
||||
@ -776,6 +748,20 @@
|
||||
};
|
||||
|
||||
reader.readAsDataURL(blob);
|
||||
} else if (item.type === 'text/plain') {
|
||||
if ($settings?.largeTextAsFile ?? false) {
|
||||
const text = clipboardData.getData('text/plain');
|
||||
|
||||
if (text.length > PASTED_TEXT_CHARACTER_LIMIT) {
|
||||
e.preventDefault();
|
||||
const blob = new Blob([text], { type: 'text/plain' });
|
||||
const file = new File([blob], `Pasted_Text_${Date.now()}.txt`, {
|
||||
type: 'text/plain'
|
||||
});
|
||||
|
||||
await uploadFileHandler(file, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -952,6 +938,20 @@
|
||||
};
|
||||
|
||||
reader.readAsDataURL(blob);
|
||||
} else if (item.type === 'text/plain') {
|
||||
if ($settings?.largeTextAsFile ?? false) {
|
||||
const text = clipboardData.getData('text/plain');
|
||||
|
||||
if (text.length > PASTED_TEXT_CHARACTER_LIMIT) {
|
||||
e.preventDefault();
|
||||
const blob = new Blob([text], { type: 'text/plain' });
|
||||
const file = new File([blob], `Pasted_Text_${Date.now()}.txt`, {
|
||||
type: 'text/plain'
|
||||
});
|
||||
|
||||
await uploadFileHandler(file, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -80,7 +80,9 @@
|
||||
placement="top-start"
|
||||
className="flex flex-1 gap-2 items-center"
|
||||
>
|
||||
<WrenchSolid />
|
||||
<div class="flex-shrink-0">
|
||||
<WrenchSolid />
|
||||
</div>
|
||||
|
||||
<div class=" truncate">{tools[toolId].name}</div>
|
||||
</Tooltip>
|
||||
@ -104,7 +106,7 @@
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
<hr class="border-gray-100 dark:border-gray-800 my-1" />
|
||||
<hr class="border-black/5 dark:border-white/5 my-1" />
|
||||
{/if}
|
||||
|
||||
{#if $config?.features?.enable_web_search}
|
||||
@ -122,7 +124,7 @@
|
||||
<Switch state={webSearchEnabled} />
|
||||
</button>
|
||||
|
||||
<hr class="border-gray-100 dark:border-gray-800 my-1" />
|
||||
<hr class="border-black/5 dark:border-white/5 my-1" />
|
||||
{/if}
|
||||
|
||||
<DropdownMenu.Item
|
||||
|
@ -38,6 +38,7 @@
|
||||
let selectedReason = null;
|
||||
let comment = '';
|
||||
|
||||
let detailedRating = null;
|
||||
let selectedModel = null;
|
||||
|
||||
$: if (message?.annotation?.rating === 1) {
|
||||
@ -56,6 +57,7 @@
|
||||
tags = (message?.annotation?.tags ?? []).map((tag) => ({
|
||||
name: tag
|
||||
}));
|
||||
detailedRating = message?.annotation?.details?.rating ?? null;
|
||||
};
|
||||
|
||||
onMount(() => {
|
||||
@ -79,7 +81,10 @@
|
||||
dispatch('save', {
|
||||
reason: selectedReason,
|
||||
comment: comment,
|
||||
tags: tags.map((tag) => tag.name)
|
||||
tags: tags.map((tag) => tag.name),
|
||||
details: {
|
||||
rating: detailedRating
|
||||
}
|
||||
});
|
||||
|
||||
toast.success($i18n.t('Thanks for your feedback!'));
|
||||
@ -100,7 +105,9 @@
|
||||
id="message-feedback-{message.id}"
|
||||
>
|
||||
<div class="flex justify-between items-center">
|
||||
<div class=" text-sm">{$i18n.t('Tell us more:')}</div>
|
||||
<div class="text-sm font-medium">{$i18n.t('How would you rate this response?')}</div>
|
||||
|
||||
<!-- <div class=" text-sm">{$i18n.t('Tell us more:')}</div> -->
|
||||
|
||||
<button
|
||||
on:click={() => {
|
||||
@ -120,53 +127,89 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if reasons.length > 0}
|
||||
<div class="flex flex-wrap gap-1.5 text-sm mt-2.5">
|
||||
{#each reasons as reason}
|
||||
<button
|
||||
class="px-3 py-0.5 border border-gray-50 dark:border-gray-850 hover:bg-gray-100 dark:hover:bg-gray-850 {selectedReason ===
|
||||
reason
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ''} transition rounded-lg"
|
||||
on:click={() => {
|
||||
selectedReason = reason;
|
||||
}}
|
||||
>
|
||||
{#if reason === 'accurate_information'}
|
||||
{$i18n.t('Accurate information')}
|
||||
{:else if reason === 'followed_instructions_perfectly'}
|
||||
{$i18n.t('Followed instructions perfectly')}
|
||||
{:else if reason === 'showcased_creativity'}
|
||||
{$i18n.t('Showcased creativity')}
|
||||
{:else if reason === 'positive_attitude'}
|
||||
{$i18n.t('Positive attitude')}
|
||||
{:else if reason === 'attention_to_detail'}
|
||||
{$i18n.t('Attention to detail')}
|
||||
{:else if reason === 'thorough_explanation'}
|
||||
{$i18n.t('Thorough explanation')}
|
||||
{:else if reason === 'dont_like_the_style'}
|
||||
{$i18n.t("Don't like the style")}
|
||||
{:else if reason === 'too_verbose'}
|
||||
{$i18n.t('Too verbose')}
|
||||
{:else if reason === 'not_helpful'}
|
||||
{$i18n.t('Not helpful')}
|
||||
{:else if reason === 'not_factually_correct'}
|
||||
{$i18n.t('Not factually correct')}
|
||||
{:else if reason === 'didnt_fully_follow_instructions'}
|
||||
{$i18n.t("Didn't fully follow instructions")}
|
||||
{:else if reason === 'refused_when_it_shouldnt_have'}
|
||||
{$i18n.t("Refused when it shouldn't have")}
|
||||
{:else if reason === 'being_lazy'}
|
||||
{$i18n.t('Being lazy')}
|
||||
{:else if reason === 'other'}
|
||||
{$i18n.t('Other')}
|
||||
{:else}
|
||||
{reason}
|
||||
{/if}
|
||||
</button>
|
||||
{/each}
|
||||
<div class="w-full flex justify-center">
|
||||
<div class=" relative w-fit">
|
||||
<div class="mt-1.5 w-fit flex gap-1 pb-5">
|
||||
<!-- 1-10 scale -->
|
||||
{#each Array.from({ length: 10 }).map((_, i) => i + 1) as rating}
|
||||
<button
|
||||
class="size-7 text-sm border border-gray-50 dark:border-gray-850 hover:bg-gray-50 dark:hover:bg-gray-850 {detailedRating ===
|
||||
rating
|
||||
? 'bg-gray-100 dark:bg-gray-800'
|
||||
: ''} transition rounded-full disabled:cursor-not-allowed disabled:bg-white disabled:dark:bg-gray-900"
|
||||
on:click={() => {
|
||||
detailedRating = rating;
|
||||
}}
|
||||
disabled={message?.annotation?.rating === -1 ? rating > 5 : rating < 6}
|
||||
>
|
||||
{rating}
|
||||
</button>
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
<div class="absolute bottom-0 left-0 right-0 flex justify-between text-xs">
|
||||
<div>
|
||||
1 - {$i18n.t('Awful')}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
10 - {$i18n.t('Amazing')}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
{#if reasons.length > 0}
|
||||
<div class="text-sm mt-1.5 font-medium">{$i18n.t('Why?')}</div>
|
||||
|
||||
<div class="flex flex-wrap gap-1.5 text-sm mt-1.5">
|
||||
{#each reasons as reason}
|
||||
<button
|
||||
class="px-3 py-0.5 border border-gray-50 dark:border-gray-850 hover:bg-gray-50 dark:hover:bg-gray-850 {selectedReason ===
|
||||
reason
|
||||
? 'bg-gray-100 dark:bg-gray-800'
|
||||
: ''} transition rounded-xl"
|
||||
on:click={() => {
|
||||
selectedReason = reason;
|
||||
}}
|
||||
>
|
||||
{#if reason === 'accurate_information'}
|
||||
{$i18n.t('Accurate information')}
|
||||
{:else if reason === 'followed_instructions_perfectly'}
|
||||
{$i18n.t('Followed instructions perfectly')}
|
||||
{:else if reason === 'showcased_creativity'}
|
||||
{$i18n.t('Showcased creativity')}
|
||||
{:else if reason === 'positive_attitude'}
|
||||
{$i18n.t('Positive attitude')}
|
||||
{:else if reason === 'attention_to_detail'}
|
||||
{$i18n.t('Attention to detail')}
|
||||
{:else if reason === 'thorough_explanation'}
|
||||
{$i18n.t('Thorough explanation')}
|
||||
{:else if reason === 'dont_like_the_style'}
|
||||
{$i18n.t("Don't like the style")}
|
||||
{:else if reason === 'too_verbose'}
|
||||
{$i18n.t('Too verbose')}
|
||||
{:else if reason === 'not_helpful'}
|
||||
{$i18n.t('Not helpful')}
|
||||
{:else if reason === 'not_factually_correct'}
|
||||
{$i18n.t('Not factually correct')}
|
||||
{:else if reason === 'didnt_fully_follow_instructions'}
|
||||
{$i18n.t("Didn't fully follow instructions")}
|
||||
{:else if reason === 'refused_when_it_shouldnt_have'}
|
||||
{$i18n.t("Refused when it shouldn't have")}
|
||||
{:else if reason === 'being_lazy'}
|
||||
{$i18n.t('Being lazy')}
|
||||
{:else if reason === 'other'}
|
||||
{$i18n.t('Other')}
|
||||
{:else}
|
||||
{reason}
|
||||
{/if}
|
||||
</button>
|
||||
{/each}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class="mt-2">
|
||||
<textarea
|
||||
@ -195,7 +238,7 @@
|
||||
</div>
|
||||
|
||||
<button
|
||||
class=" bg-emerald-700 hover:bg-emerald-800 transition text-white text-sm font-medium rounded-xl px-3.5 py-1.5"
|
||||
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full"
|
||||
on:click={() => {
|
||||
saveHandler();
|
||||
}}
|
||||
|
@ -340,19 +340,16 @@
|
||||
|
||||
let feedbackLoading = false;
|
||||
|
||||
const feedbackHandler = async (
|
||||
rating: number | null = null,
|
||||
annotation: object | null = null
|
||||
) => {
|
||||
const feedbackHandler = async (rating: number | null = null, details: object | null = null) => {
|
||||
feedbackLoading = true;
|
||||
console.log('Feedback', rating, annotation);
|
||||
console.log('Feedback', rating, details);
|
||||
|
||||
const updatedMessage = {
|
||||
...message,
|
||||
annotation: {
|
||||
...(message?.annotation ?? {}),
|
||||
...(rating !== null ? { rating: rating } : {}),
|
||||
...(annotation ? annotation : {})
|
||||
...(details ? details : {})
|
||||
}
|
||||
};
|
||||
|
||||
@ -429,7 +426,7 @@
|
||||
|
||||
await tick();
|
||||
|
||||
if (!annotation) {
|
||||
if (!details) {
|
||||
showRateComment = true;
|
||||
|
||||
if (!updatedMessage.annotation?.tags) {
|
||||
@ -656,7 +653,7 @@
|
||||
<Error content={message?.error?.content ?? message.content} />
|
||||
{/if}
|
||||
|
||||
{#if message.citations}
|
||||
{#if message.citations && (model?.info?.meta?.capabilities?.citations ?? true)}
|
||||
<Citations citations={message.citations} />
|
||||
{/if}
|
||||
|
||||
@ -1194,9 +1191,7 @@
|
||||
bind:show={showRateComment}
|
||||
on:save={async (e) => {
|
||||
await feedbackHandler(null, {
|
||||
tags: e.detail.tags,
|
||||
comment: e.detail.comment,
|
||||
reason: e.detail.reason
|
||||
...e.detail
|
||||
});
|
||||
}}
|
||||
/>
|
||||
|
@ -320,12 +320,17 @@
|
||||
<div class="flex items-center min-w-fit">
|
||||
<div class="line-clamp-1">
|
||||
<div class="flex items-center min-w-fit">
|
||||
<img
|
||||
src={item.model?.info?.meta?.profile_image_url ?? '/static/favicon.png'}
|
||||
alt="Model"
|
||||
class="rounded-full size-5 flex items-center mr-2"
|
||||
/>
|
||||
{item.label}
|
||||
<Tooltip
|
||||
content={$user?.role === 'admin' ? (item?.value ?? '') : ''}
|
||||
placement="top-start"
|
||||
>
|
||||
<img
|
||||
src={item.model?.info?.meta?.profile_image_url ?? '/static/favicon.png'}
|
||||
alt="Model"
|
||||
class="rounded-full size-5 flex items-center mr-2"
|
||||
/>
|
||||
{item.label}
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
{#if item.model.owned_by === 'ollama' && (item.model.ollama?.details?.parameter_size ?? '') !== ''}
|
||||
|
@ -75,7 +75,6 @@
|
||||
await tick();
|
||||
};
|
||||
|
||||
let mounted = false;
|
||||
let selectedModelIdx = 0;
|
||||
|
||||
$: if (selectedModels.length > 0) {
|
||||
@ -84,147 +83,143 @@
|
||||
|
||||
$: models = selectedModels.map((id) => $_models.find((m) => m.id === id));
|
||||
|
||||
onMount(() => {
|
||||
mounted = true;
|
||||
});
|
||||
onMount(() => {});
|
||||
</script>
|
||||
|
||||
{#key mounted}
|
||||
<div class="m-auto w-full max-w-6xl px-2 xl:px-20 translate-y-6 py-24 text-center">
|
||||
{#if $temporaryChatEnabled}
|
||||
<Tooltip
|
||||
content="This chat won't appear in history and your messages will not be saved."
|
||||
className="w-full flex justify-center mb-0.5"
|
||||
placement="top"
|
||||
>
|
||||
<div class="flex items-center gap-2 text-gray-500 font-medium text-lg my-2 w-fit">
|
||||
<EyeSlash strokeWidth="2.5" className="size-5" /> Temporary Chat
|
||||
</div>
|
||||
</Tooltip>
|
||||
{/if}
|
||||
|
||||
<div
|
||||
class="w-full text-3xl text-gray-800 dark:text-gray-100 font-medium text-center flex items-center gap-4 font-primary"
|
||||
<div class="m-auto w-full max-w-6xl px-2 xl:px-20 translate-y-6 py-24 text-center">
|
||||
{#if $temporaryChatEnabled}
|
||||
<Tooltip
|
||||
content="This chat won't appear in history and your messages will not be saved."
|
||||
className="w-full flex justify-center mb-0.5"
|
||||
placement="top"
|
||||
>
|
||||
<div class="w-full flex flex-col justify-center items-center">
|
||||
<div class="flex flex-row justify-center gap-3 sm:gap-3.5 w-fit px-5">
|
||||
<div class="flex flex-shrink-0 justify-center">
|
||||
<div class="flex -space-x-4 mb-0.5" in:fade={{ duration: 100 }}>
|
||||
{#each models as model, modelIdx}
|
||||
<Tooltip
|
||||
content={(models[modelIdx]?.info?.meta?.tags ?? [])
|
||||
.map((tag) => tag.name.toUpperCase())
|
||||
.join(', ')}
|
||||
placement="top"
|
||||
>
|
||||
<button
|
||||
on:click={() => {
|
||||
selectedModelIdx = modelIdx;
|
||||
}}
|
||||
>
|
||||
<img
|
||||
crossorigin="anonymous"
|
||||
src={model?.info?.meta?.profile_image_url ??
|
||||
($i18n.language === 'dg-DG'
|
||||
? `/doge.png`
|
||||
: `${WEBUI_BASE_URL}/static/favicon.png`)}
|
||||
class=" size-9 sm:size-10 rounded-full border-[1px] border-gray-200 dark:border-none"
|
||||
alt="logo"
|
||||
draggable="false"
|
||||
/>
|
||||
</button>
|
||||
</Tooltip>
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-center gap-2 text-gray-500 font-medium text-lg my-2 w-fit">
|
||||
<EyeSlash strokeWidth="2.5" className="size-5" /> Temporary Chat
|
||||
</div>
|
||||
</Tooltip>
|
||||
{/if}
|
||||
|
||||
<div class=" text-3xl sm:text-4xl line-clamp-1" in:fade={{ duration: 100 }}>
|
||||
{#if models[selectedModelIdx]?.name}
|
||||
{models[selectedModelIdx]?.name}
|
||||
{:else}
|
||||
{$i18n.t('Hello, {{name}}', { name: $user.name })}
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex mt-1 mb-2">
|
||||
<div in:fade={{ duration: 100, delay: 50 }}>
|
||||
{#if models[selectedModelIdx]?.info?.meta?.description ?? null}
|
||||
<div
|
||||
class="w-full text-3xl text-gray-800 dark:text-gray-100 font-medium text-center flex items-center gap-4 font-primary"
|
||||
>
|
||||
<div class="w-full flex flex-col justify-center items-center">
|
||||
<div class="flex flex-row justify-center gap-3 sm:gap-3.5 w-fit px-5">
|
||||
<div class="flex flex-shrink-0 justify-center">
|
||||
<div class="flex -space-x-4 mb-0.5" in:fade={{ duration: 100 }}>
|
||||
{#each models as model, modelIdx}
|
||||
<Tooltip
|
||||
className=" w-fit"
|
||||
content={marked.parse(
|
||||
sanitizeResponseContent(models[selectedModelIdx]?.info?.meta?.description ?? '')
|
||||
)}
|
||||
content={(models[modelIdx]?.info?.meta?.tags ?? [])
|
||||
.map((tag) => tag.name.toUpperCase())
|
||||
.join(', ')}
|
||||
placement="top"
|
||||
>
|
||||
<div
|
||||
class="mt-0.5 px-2 text-sm font-normal text-gray-500 dark:text-gray-400 line-clamp-2 max-w-xl markdown"
|
||||
<button
|
||||
on:click={() => {
|
||||
selectedModelIdx = modelIdx;
|
||||
}}
|
||||
>
|
||||
{@html marked.parse(
|
||||
sanitizeResponseContent(models[selectedModelIdx]?.info?.meta?.description)
|
||||
)}
|
||||
</div>
|
||||
<img
|
||||
crossorigin="anonymous"
|
||||
src={model?.info?.meta?.profile_image_url ??
|
||||
($i18n.language === 'dg-DG'
|
||||
? `/doge.png`
|
||||
: `${WEBUI_BASE_URL}/static/favicon.png`)}
|
||||
class=" size-9 sm:size-10 rounded-full border-[1px] border-gray-200 dark:border-none"
|
||||
alt="logo"
|
||||
draggable="false"
|
||||
/>
|
||||
</button>
|
||||
</Tooltip>
|
||||
|
||||
{#if models[selectedModelIdx]?.info?.meta?.user}
|
||||
<div class="mt-0.5 text-sm font-normal text-gray-400 dark:text-gray-500">
|
||||
By
|
||||
{#if models[selectedModelIdx]?.info?.meta?.user.community}
|
||||
<a
|
||||
href="https://openwebui.com/m/{models[selectedModelIdx]?.info?.meta?.user
|
||||
.username}"
|
||||
>{models[selectedModelIdx]?.info?.meta?.user.name
|
||||
? models[selectedModelIdx]?.info?.meta?.user.name
|
||||
: `@${models[selectedModelIdx]?.info?.meta?.user.username}`}</a
|
||||
>
|
||||
{:else}
|
||||
{models[selectedModelIdx]?.info?.meta?.user.name}
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="text-base font-normal xl:translate-x-6 md:max-w-3xl w-full py-3 {atSelectedModel
|
||||
? 'mt-2'
|
||||
: ''}"
|
||||
>
|
||||
<MessageInput
|
||||
{history}
|
||||
{selectedModels}
|
||||
bind:files
|
||||
bind:prompt
|
||||
bind:autoScroll
|
||||
bind:selectedToolIds
|
||||
bind:webSearchEnabled
|
||||
bind:atSelectedModel
|
||||
{transparentBackground}
|
||||
{stopResponse}
|
||||
{createMessagePair}
|
||||
placeholder={$i18n.t('How can I help you today?')}
|
||||
on:upload={(e) => {
|
||||
dispatch('upload', e.detail);
|
||||
}}
|
||||
on:submit={(e) => {
|
||||
dispatch('submit', e.detail);
|
||||
}}
|
||||
/>
|
||||
<div class=" text-3xl sm:text-4xl line-clamp-1" in:fade={{ duration: 100 }}>
|
||||
{#if models[selectedModelIdx]?.name}
|
||||
{models[selectedModelIdx]?.name}
|
||||
{:else}
|
||||
{$i18n.t('Hello, {{name}}', { name: $user.name })}
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mx-auto max-w-2xl font-primary" in:fade={{ duration: 200, delay: 200 }}>
|
||||
<div class="mx-5">
|
||||
<Suggestions
|
||||
suggestionPrompts={models[selectedModelIdx]?.info?.meta?.suggestion_prompts ??
|
||||
$config?.default_prompt_suggestions ??
|
||||
[]}
|
||||
on:select={(e) => {
|
||||
selectSuggestionPrompt(e.detail);
|
||||
|
||||
<div class="flex mt-1 mb-2">
|
||||
<div in:fade={{ duration: 100, delay: 50 }}>
|
||||
{#if models[selectedModelIdx]?.info?.meta?.description ?? null}
|
||||
<Tooltip
|
||||
className=" w-fit"
|
||||
content={marked.parse(
|
||||
sanitizeResponseContent(models[selectedModelIdx]?.info?.meta?.description ?? '')
|
||||
)}
|
||||
placement="top"
|
||||
>
|
||||
<div
|
||||
class="mt-0.5 px-2 text-sm font-normal text-gray-500 dark:text-gray-400 line-clamp-2 max-w-xl markdown"
|
||||
>
|
||||
{@html marked.parse(
|
||||
sanitizeResponseContent(models[selectedModelIdx]?.info?.meta?.description)
|
||||
)}
|
||||
</div>
|
||||
</Tooltip>
|
||||
|
||||
{#if models[selectedModelIdx]?.info?.meta?.user}
|
||||
<div class="mt-0.5 text-sm font-normal text-gray-400 dark:text-gray-500">
|
||||
By
|
||||
{#if models[selectedModelIdx]?.info?.meta?.user.community}
|
||||
<a
|
||||
href="https://openwebui.com/m/{models[selectedModelIdx]?.info?.meta?.user
|
||||
.username}"
|
||||
>{models[selectedModelIdx]?.info?.meta?.user.name
|
||||
? models[selectedModelIdx]?.info?.meta?.user.name
|
||||
: `@${models[selectedModelIdx]?.info?.meta?.user.username}`}</a
|
||||
>
|
||||
{:else}
|
||||
{models[selectedModelIdx]?.info?.meta?.user.name}
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="text-base font-normal xl:translate-x-6 md:max-w-3xl w-full py-3 {atSelectedModel
|
||||
? 'mt-2'
|
||||
: ''}"
|
||||
>
|
||||
<MessageInput
|
||||
{history}
|
||||
{selectedModels}
|
||||
bind:files
|
||||
bind:prompt
|
||||
bind:autoScroll
|
||||
bind:selectedToolIds
|
||||
bind:webSearchEnabled
|
||||
bind:atSelectedModel
|
||||
{transparentBackground}
|
||||
{stopResponse}
|
||||
{createMessagePair}
|
||||
placeholder={$i18n.t('How can I help you today?')}
|
||||
on:upload={(e) => {
|
||||
dispatch('upload', e.detail);
|
||||
}}
|
||||
on:submit={(e) => {
|
||||
dispatch('submit', e.detail);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/key}
|
||||
<div class="mx-auto max-w-2xl font-primary" in:fade={{ duration: 200, delay: 200 }}>
|
||||
<div class="mx-5">
|
||||
<Suggestions
|
||||
suggestionPrompts={models[selectedModelIdx]?.info?.meta?.suggestion_prompts ??
|
||||
$config?.default_prompt_suggestions ??
|
||||
[]}
|
||||
on:select={(e) => {
|
||||
selectSuggestionPrompt(e.detail);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -2,7 +2,7 @@
|
||||
import { toast } from 'svelte-sonner';
|
||||
import { onMount, getContext } from 'svelte';
|
||||
|
||||
import { user } from '$lib/stores';
|
||||
import { user, config } from '$lib/stores';
|
||||
import { updateUserProfile, createAPIKey, getAPIKey } from '$lib/apis/auths';
|
||||
|
||||
import UpdatePassword from './Account/UpdatePassword.svelte';
|
||||
@ -26,7 +26,6 @@
|
||||
|
||||
let APIKey = '';
|
||||
let APIKeyCopied = false;
|
||||
|
||||
let profileImageInputElement: HTMLInputElement;
|
||||
|
||||
const submitHandler = async () => {
|
||||
@ -301,96 +300,97 @@
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="justify-between w-full">
|
||||
<div class="flex justify-between w-full">
|
||||
<div class="self-center text-xs font-medium">{$i18n.t('API Key')}</div>
|
||||
</div>
|
||||
{#if $config?.features?.enable_api_key ?? true}
|
||||
<div class="justify-between w-full">
|
||||
<div class="flex justify-between w-full">
|
||||
<div class="self-center text-xs font-medium">{$i18n.t('API Key')}</div>
|
||||
</div>
|
||||
<div class="flex mt-2">
|
||||
{#if APIKey}
|
||||
<SensitiveInput value={APIKey} readOnly={true} />
|
||||
|
||||
<div class="flex mt-2">
|
||||
{#if APIKey}
|
||||
<SensitiveInput value={APIKey} readOnly={true} />
|
||||
|
||||
<button
|
||||
class="ml-1.5 px-1.5 py-1 dark:hover:bg-gray-850 transition rounded-lg"
|
||||
on:click={() => {
|
||||
copyToClipboard(APIKey);
|
||||
APIKeyCopied = true;
|
||||
setTimeout(() => {
|
||||
APIKeyCopied = false;
|
||||
}, 2000);
|
||||
}}
|
||||
>
|
||||
{#if APIKeyCopied}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
{:else}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M11.986 3H12a2 2 0 0 1 2 2v6a2 2 0 0 1-1.5 1.937V7A2.5 2.5 0 0 0 10 4.5H4.063A2 2 0 0 1 6 3h.014A2.25 2.25 0 0 1 8.25 1h1.5a2.25 2.25 0 0 1 2.236 2ZM10.5 4v-.75a.75.75 0 0 0-.75-.75h-1.5a.75.75 0 0 0-.75.75V4h3Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M3 6a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V7a1 1 0 0 0-1-1H3Zm1.75 2.5a.75.75 0 0 0 0 1.5h3.5a.75.75 0 0 0 0-1.5h-3.5ZM4 11.75a.75.75 0 0 1 .75-.75h3.5a.75.75 0 0 1 0 1.5h-3.5a.75.75 0 0 1-.75-.75Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
{/if}
|
||||
</button>
|
||||
|
||||
<Tooltip content={$i18n.t('Create new key')}>
|
||||
<button
|
||||
class=" px-1.5 py-1 dark:hover:bg-gray-850transition rounded-lg"
|
||||
class="ml-1.5 px-1.5 py-1 dark:hover:bg-gray-850 transition rounded-lg"
|
||||
on:click={() => {
|
||||
copyToClipboard(APIKey);
|
||||
APIKeyCopied = true;
|
||||
setTimeout(() => {
|
||||
APIKeyCopied = false;
|
||||
}, 2000);
|
||||
}}
|
||||
>
|
||||
{#if APIKeyCopied}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
{:else}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M11.986 3H12a2 2 0 0 1 2 2v6a2 2 0 0 1-1.5 1.937V7A2.5 2.5 0 0 0 10 4.5H4.063A2 2 0 0 1 6 3h.014A2.25 2.25 0 0 1 8.25 1h1.5a2.25 2.25 0 0 1 2.236 2ZM10.5 4v-.75a.75.75 0 0 0-.75-.75h-1.5a.75.75 0 0 0-.75.75V4h3Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M3 6a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V7a1 1 0 0 0-1-1H3Zm1.75 2.5a.75.75 0 0 0 0 1.5h3.5a.75.75 0 0 0 0-1.5h-3.5ZM4 11.75a.75.75 0 0 1 .75-.75h3.5a.75.75 0 0 1 0 1.5h-3.5a.75.75 0 0 1-.75-.75Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
{/if}
|
||||
</button>
|
||||
|
||||
<Tooltip content={$i18n.t('Create new key')}>
|
||||
<button
|
||||
class=" px-1.5 py-1 dark:hover:bg-gray-850transition rounded-lg"
|
||||
on:click={() => {
|
||||
createAPIKeyHandler();
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
class="size-4"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</Tooltip>
|
||||
{:else}
|
||||
<button
|
||||
class="flex gap-1.5 items-center font-medium px-3.5 py-1.5 rounded-lg bg-gray-100/70 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-850 transition"
|
||||
on:click={() => {
|
||||
createAPIKeyHandler();
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
class="size-4"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</Tooltip>
|
||||
{:else}
|
||||
<button
|
||||
class="flex gap-1.5 items-center font-medium px-3.5 py-1.5 rounded-lg bg-gray-100/70 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-850 transition"
|
||||
on:click={() => {
|
||||
createAPIKeyHandler();
|
||||
}}
|
||||
>
|
||||
<Plus strokeWidth="2" className=" size-3.5" />
|
||||
<Plus strokeWidth="2" className=" size-3.5" />
|
||||
|
||||
{$i18n.t('Create new secret key')}</button
|
||||
>
|
||||
{/if}
|
||||
{$i18n.t('Create new secret key')}</button
|
||||
>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
@ -31,6 +31,7 @@
|
||||
let defaultModelId = '';
|
||||
let showUsername = false;
|
||||
let richTextInput = true;
|
||||
let largeTextAsFile = false;
|
||||
|
||||
let landingPageMode = '';
|
||||
let chatBubble = true;
|
||||
@ -139,6 +140,11 @@
|
||||
saveSettings({ richTextInput });
|
||||
};
|
||||
|
||||
const toggleLargeTextAsFile = async () => {
|
||||
largeTextAsFile = !largeTextAsFile;
|
||||
saveSettings({ largeTextAsFile });
|
||||
};
|
||||
|
||||
const toggleResponseAutoCopy = async () => {
|
||||
const permission = await navigator.clipboard
|
||||
.readText()
|
||||
@ -188,6 +194,8 @@
|
||||
voiceInterruption = $settings.voiceInterruption ?? false;
|
||||
|
||||
richTextInput = $settings.richTextInput ?? true;
|
||||
largeTextAsFile = $settings.largeTextAsFile ?? false;
|
||||
|
||||
landingPageMode = $settings.landingPageMode ?? '';
|
||||
chatBubble = $settings.chatBubble ?? true;
|
||||
widescreenMode = $settings.widescreenMode ?? false;
|
||||
@ -480,6 +488,28 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs">
|
||||
{$i18n.t('Paste Large Text as File')}
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
on:click={() => {
|
||||
toggleLargeTextAsFile();
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
{#if largeTextAsFile === true}
|
||||
<span class="ml-2 self-center">{$i18n.t('On')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Off')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs">
|
||||
|
@ -80,7 +80,7 @@
|
||||
}
|
||||
</script>
|
||||
|
||||
<Modal bind:show size="sm">
|
||||
<Modal bind:show size="md">
|
||||
<div>
|
||||
<div class=" flex justify-between dark:text-gray-300 px-5 pt-4 pb-0.5">
|
||||
<div class=" text-lg font-medium self-center">{$i18n.t('Share Chat')}</div>
|
||||
|
@ -12,6 +12,8 @@
|
||||
export let cancelLabel = $i18n.t('Cancel');
|
||||
export let confirmLabel = $i18n.t('Confirm');
|
||||
|
||||
export let onConfirm = () => {};
|
||||
|
||||
export let input = false;
|
||||
export let inputPlaceholder = '';
|
||||
export let inputValue = '';
|
||||
@ -29,11 +31,17 @@
|
||||
|
||||
if (event.key === 'Enter') {
|
||||
console.log('Enter');
|
||||
show = false;
|
||||
dispatch('confirm', inputValue);
|
||||
confirmHandler();
|
||||
}
|
||||
};
|
||||
|
||||
const confirmHandler = async () => {
|
||||
show = false;
|
||||
|
||||
await onConfirm();
|
||||
dispatch('confirm', inputValue);
|
||||
};
|
||||
|
||||
onMount(() => {
|
||||
mounted = true;
|
||||
});
|
||||
@ -110,8 +118,7 @@
|
||||
<button
|
||||
class="bg-gray-900 hover:bg-gray-850 text-gray-100 dark:bg-gray-100 dark:hover:bg-white dark:text-gray-800 font-medium w-full py-2.5 rounded-lg transition"
|
||||
on:click={() => {
|
||||
show = false;
|
||||
dispatch('confirm', inputValue);
|
||||
confirmHandler();
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
|
@ -26,7 +26,7 @@
|
||||
});
|
||||
</script>
|
||||
|
||||
<Modal bind:show size="md">
|
||||
<Modal bind:show size="lg">
|
||||
<div class="font-primary px-6 py-5 w-full flex flex-col justify-center dark:text-gray-400">
|
||||
<div class=" pb-2">
|
||||
<div class="flex items-start justify-between">
|
||||
|
@ -20,7 +20,7 @@
|
||||
} else if (size === 'sm') {
|
||||
return 'w-[30rem]';
|
||||
} else if (size === 'md') {
|
||||
return 'w-[48rem]';
|
||||
return 'w-[42rem]';
|
||||
} else {
|
||||
return 'w-[56rem]';
|
||||
}
|
||||
|
@ -23,9 +23,11 @@
|
||||
import { keymap } from 'prosemirror-keymap';
|
||||
import { baseKeymap, chainCommands } from 'prosemirror-commands';
|
||||
import { DOMParser, DOMSerializer, Schema, Fragment } from 'prosemirror-model';
|
||||
import { PASTED_TEXT_CHARACTER_LIMIT } from '$lib/constants';
|
||||
|
||||
export let className = 'input-prose';
|
||||
export let shiftEnter = false;
|
||||
export let largeTextAsFile = false;
|
||||
|
||||
export let id = '';
|
||||
export let value = '';
|
||||
@ -412,6 +414,15 @@
|
||||
// Extract plain text from clipboard and paste it without formatting
|
||||
const plainText = event.clipboardData.getData('text/plain');
|
||||
if (plainText) {
|
||||
if (largeTextAsFile) {
|
||||
if (plainText.length > PASTED_TEXT_CHARACTER_LIMIT) {
|
||||
// Dispatch paste event to parent component
|
||||
eventDispatch('paste', { event });
|
||||
event.preventDefault();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
const modifiedText = handleTabIndentation(plainText);
|
||||
console.log(modifiedText);
|
||||
|
||||
|
@ -7,6 +7,7 @@
|
||||
export let width = '200px';
|
||||
|
||||
export let className = '';
|
||||
export let duration = 100;
|
||||
</script>
|
||||
|
||||
{#if show}
|
||||
@ -16,12 +17,12 @@
|
||||
on:mousedown={() => {
|
||||
show = false;
|
||||
}}
|
||||
transition:fade
|
||||
transition:fade={{ duration: duration }}
|
||||
/>
|
||||
|
||||
<div
|
||||
class="absolute z-30 shadow-xl {side === 'right' ? 'right-0' : 'left-0'} top-0 bottom-0"
|
||||
transition:slide={{ easing: quadInOut, axis: side === 'right' ? 'x' : 'y' }}
|
||||
transition:slide={{ duration: duration, easing: quadInOut, axis: side === 'right' ? 'x' : 'y' }}
|
||||
>
|
||||
<div class="{className} h-full" style="width: {show ? width : '0px'}">
|
||||
<slot />
|
||||
|
@ -90,10 +90,10 @@
|
||||
</button>
|
||||
|
||||
{#if role === 'admin'}
|
||||
<button
|
||||
<a
|
||||
class="flex rounded-md py-2 px-3 w-full hover:bg-gray-50 dark:hover:bg-gray-800 transition"
|
||||
href="/playground"
|
||||
on:click={() => {
|
||||
goto('/playground');
|
||||
show = false;
|
||||
|
||||
if ($mobile) {
|
||||
@ -118,12 +118,12 @@
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center truncate">{$i18n.t('Playground')}</div>
|
||||
</button>
|
||||
</a>
|
||||
|
||||
<button
|
||||
<a
|
||||
class="flex rounded-md py-2 px-3 w-full hover:bg-gray-50 dark:hover:bg-gray-800 transition"
|
||||
href="/admin"
|
||||
on:click={() => {
|
||||
goto('/admin');
|
||||
show = false;
|
||||
|
||||
if ($mobile) {
|
||||
@ -148,7 +148,7 @@
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center truncate">{$i18n.t('Admin Panel')}</div>
|
||||
</button>
|
||||
</a>
|
||||
{/if}
|
||||
|
||||
<hr class=" border-gray-50 dark:border-gray-850 my-1 p-0" />
|
||||
|
@ -24,6 +24,8 @@
|
||||
import Search from '../icons/Search.svelte';
|
||||
import Plus from '../icons/Plus.svelte';
|
||||
import Spinner from '../common/Spinner.svelte';
|
||||
import { capitalizeFirstLetter } from '$lib/utils';
|
||||
import Tooltip from '../common/Tooltip.svelte';
|
||||
|
||||
let loaded = false;
|
||||
|
||||
@ -82,7 +84,7 @@
|
||||
}}
|
||||
/>
|
||||
|
||||
<div class="flex flex-col gap-1 mt-1.5 mb-2">
|
||||
<div class="flex flex-col gap-1 my-1.5">
|
||||
<div class="flex justify-between items-center">
|
||||
<div class="flex md:self-center text-xl font-medium px-0.5 items-center">
|
||||
{$i18n.t('Knowledge')}
|
||||
@ -119,10 +121,10 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="my-3 mb-5 grid lg:grid-cols-2 xl:grid-cols-3 gap-2">
|
||||
<div class="mb-5 grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 gap-2">
|
||||
{#each filteredItems as item}
|
||||
<button
|
||||
class=" flex space-x-4 cursor-pointer text-left w-full px-4 py-3 border border-gray-50 dark:border-gray-850 dark:hover:border-gray-800 hover:bg-gray-50 dark:hover:bg-gray-850 transition rounded-xl"
|
||||
class=" flex space-x-4 cursor-pointer text-left w-full px-3 py-2 hover:bg-gray-50 dark:hover:bg-gray-850 transition rounded-xl"
|
||||
on:click={() => {
|
||||
if (item?.meta?.document) {
|
||||
toast.error(
|
||||
@ -137,9 +139,13 @@
|
||||
>
|
||||
<div class=" w-full">
|
||||
<div class="flex items-center justify-between -mt-1">
|
||||
<div class=" font-semibold line-clamp-1 h-fit">{item.name}</div>
|
||||
{#if item?.meta?.document}
|
||||
<Badge type="muted" content={$i18n.t('Document')} />
|
||||
{:else}
|
||||
<Badge type="success" content={$i18n.t('Collection')} />
|
||||
{/if}
|
||||
|
||||
<div class=" flex self-center">
|
||||
<div class=" flex self-center -mr-1 translate-y-1">
|
||||
<ItemMenu
|
||||
on:delete={() => {
|
||||
selectedItem = item;
|
||||
@ -149,18 +155,26 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" self-center flex-1">
|
||||
<div class=" self-center flex-1 px-1 mb-1">
|
||||
<div class=" font-semibold line-clamp-1 h-fit">{item.name}</div>
|
||||
|
||||
<div class=" text-xs overflow-hidden text-ellipsis line-clamp-1">
|
||||
{item.description}
|
||||
</div>
|
||||
|
||||
<div class="mt-5 flex justify-between">
|
||||
<div>
|
||||
{#if item?.meta?.document}
|
||||
<Badge type="muted" content={$i18n.t('Document')} />
|
||||
{:else}
|
||||
<Badge type="success" content={$i18n.t('Collection')} />
|
||||
{/if}
|
||||
<div class="mt-3 flex justify-between">
|
||||
<div class="text-xs text-gray-500">
|
||||
<Tooltip
|
||||
content={item?.user?.email ?? $i18n.t('Deleted User')}
|
||||
className="flex shrink-0"
|
||||
placement="top-start"
|
||||
>
|
||||
{$i18n.t('By {{name}}', {
|
||||
name: capitalizeFirstLetter(
|
||||
item?.user?.name ?? item?.user?.email ?? $i18n.t('Deleted User')
|
||||
)
|
||||
})}
|
||||
</Tooltip>
|
||||
</div>
|
||||
<div class=" text-xs text-gray-500 line-clamp-1">
|
||||
{$i18n.t('Updated')}
|
||||
|
@ -421,6 +421,7 @@
|
||||
}
|
||||
|
||||
const res = await updateKnowledgeById(localStorage.token, id, {
|
||||
...knowledge,
|
||||
name: knowledge.name,
|
||||
description: knowledge.description,
|
||||
access_control: knowledge.access_control
|
||||
@ -624,7 +625,7 @@
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="self-center">
|
||||
<div class="self-center flex-shrink-0">
|
||||
<button
|
||||
class="bg-gray-50 hover:bg-gray-100 text-black dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-white transition px-2 py-1 rounded-full flex gap-1 items-center"
|
||||
type="button"
|
||||
@ -635,7 +636,7 @@
|
||||
<LockClosed strokeWidth="2.5" className="size-3.5" />
|
||||
|
||||
<div class="text-sm font-medium flex-shrink-0">
|
||||
{$i18n.t('Share')}
|
||||
{$i18n.t('Access')}
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
|
@ -32,6 +32,7 @@
|
||||
import ChevronRight from '../icons/ChevronRight.svelte';
|
||||
import Switch from '../common/Switch.svelte';
|
||||
import Spinner from '../common/Spinner.svelte';
|
||||
import { capitalizeFirstLetter } from '$lib/utils';
|
||||
|
||||
let shiftKey = false;
|
||||
|
||||
@ -195,7 +196,7 @@
|
||||
}}
|
||||
/>
|
||||
|
||||
<div class="flex flex-col gap-1 mt-1.5 mb-2">
|
||||
<div class="flex flex-col gap-1 my-1.5">
|
||||
<div class="flex justify-between items-center">
|
||||
<div class="flex items-center md:self-center text-xl font-medium px-0.5">
|
||||
{$i18n.t('Models')}
|
||||
@ -229,40 +230,14 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<a class=" flex space-x-4 cursor-pointer w-full mb-2 px-3 py-1" href="/workspace/models/create">
|
||||
<div class=" self-center w-8 flex-shrink-0">
|
||||
<div
|
||||
class="w-full h-8 flex justify-center rounded-full bg-transparent dark:bg-gray-700 border border-dashed border-gray-200"
|
||||
>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="w-6">
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M12 3.75a.75.75 0 01.75.75v6.75h6.75a.75.75 0 010 1.5h-6.75v6.75a.75.75 0 01-1.5 0v-6.75H4.5a.75.75 0 010-1.5h6.75V4.5a.75.75 0 01.75-.75z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" self-center">
|
||||
<div class=" font-semibold line-clamp-1">{$i18n.t('Create a model')}</div>
|
||||
<div class=" text-sm line-clamp-1 text-gray-500">
|
||||
{$i18n.t('Customize models for a specific purpose')}
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<div class=" my-2 mb-5" id="model-list">
|
||||
<div class=" my-2 mb-5 gap-2 grid lg:grid-cols-2 xl:grid-cols-3" id="model-list">
|
||||
{#each filteredModels as model}
|
||||
<div
|
||||
class=" flex space-x-4 cursor-pointer w-full px-3 py-2 dark:hover:bg-white/5 hover:bg-black/5 rounded-lg transition"
|
||||
class=" flex flex-col cursor-pointer w-full px-3 py-2 dark:hover:bg-white/5 hover:bg-black/5 rounded-xl transition"
|
||||
id="model-item-{model.id}"
|
||||
>
|
||||
<a
|
||||
class=" flex flex-1 space-x-3.5 cursor-pointer w-full"
|
||||
href={`/?models=${encodeURIComponent(model.id)}`}
|
||||
>
|
||||
<div class=" self-center w-8">
|
||||
<div class="flex gap-4 mt-0.5 mb-0.5">
|
||||
<div class=" w-[44px]">
|
||||
<div
|
||||
class=" rounded-full object-cover {model.is_active
|
||||
? ''
|
||||
@ -276,97 +251,128 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" flex-1 self-center {model.is_active ? '' : 'text-gray-500'}">
|
||||
<a
|
||||
class=" flex flex-1 cursor-pointer w-full"
|
||||
href={`/?models=${encodeURIComponent(model.id)}`}
|
||||
>
|
||||
<div class=" flex-1 self-center {model.is_active ? '' : 'text-gray-500'}">
|
||||
<Tooltip
|
||||
content={marked.parse(model?.meta?.description ?? model.id)}
|
||||
className=" w-fit"
|
||||
placement="top-start"
|
||||
>
|
||||
<div class=" font-semibold line-clamp-1">{model.name}</div>
|
||||
</Tooltip>
|
||||
|
||||
<div class="flex gap-1 text-xs overflow-hidden">
|
||||
<div class="line-clamp-1">
|
||||
{#if (model?.meta?.description ?? '').trim()}
|
||||
{model?.meta?.description}
|
||||
{:else}
|
||||
{model.id}
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="flex justify-between items-center -mb-0.5 px-0.5">
|
||||
<div class=" text-xs mt-0.5">
|
||||
<Tooltip
|
||||
content={marked.parse(model?.meta?.description ?? model.id)}
|
||||
className=" w-fit"
|
||||
content={model?.user?.email ?? $i18n.t('Deleted User')}
|
||||
className="flex shrink-0"
|
||||
placement="top-start"
|
||||
>
|
||||
<div class=" font-semibold line-clamp-1">{model.name}</div>
|
||||
<div class="shrink-0 text-gray-500">
|
||||
{$i18n.t('By {{name}}', {
|
||||
name: capitalizeFirstLetter(
|
||||
model?.user?.name ?? model?.user?.email ?? $i18n.t('Deleted User')
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</Tooltip>
|
||||
<div class=" text-xs overflow-hidden text-ellipsis line-clamp-1 text-gray-500">
|
||||
{model?.meta?.description ?? model.id}
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
<div class="flex flex-row gap-0.5 items-center self-center">
|
||||
{#if shiftKey}
|
||||
<Tooltip content={$i18n.t('Delete')}>
|
||||
<button
|
||||
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
deleteModelHandler(model);
|
||||
}}
|
||||
>
|
||||
<GarbageBin />
|
||||
</button>
|
||||
</Tooltip>
|
||||
{:else}
|
||||
{#if $user?.role === 'admin' || model.user_id === $user?.id}
|
||||
<a
|
||||
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
type="button"
|
||||
href={`/workspace/models/edit?id=${encodeURIComponent(model.id)}`}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
{/if}
|
||||
|
||||
<ModelMenu
|
||||
user={$user}
|
||||
{model}
|
||||
shareHandler={() => {
|
||||
shareModelHandler(model);
|
||||
}}
|
||||
cloneHandler={() => {
|
||||
cloneModelHandler(model);
|
||||
}}
|
||||
exportHandler={() => {
|
||||
exportModelHandler(model);
|
||||
}}
|
||||
hideHandler={() => {
|
||||
hideModelHandler(model);
|
||||
}}
|
||||
deleteHandler={() => {
|
||||
selectedModel = model;
|
||||
showModelDeleteConfirm = true;
|
||||
}}
|
||||
onClose={() => {}}
|
||||
>
|
||||
<button
|
||||
class="self-center w-fit text-sm p-1.5 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
type="button"
|
||||
>
|
||||
<EllipsisHorizontal className="size-5" />
|
||||
</button>
|
||||
</ModelMenu>
|
||||
|
||||
<div class="ml-1">
|
||||
<Tooltip content={model.is_active ? $i18n.t('Enabled') : $i18n.t('Disabled')}>
|
||||
<Switch
|
||||
bind:state={model.is_active}
|
||||
on:change={async (e) => {
|
||||
toggleModelById(localStorage.token, model.id);
|
||||
_models.set(await getModels(localStorage.token));
|
||||
<div class="flex flex-row gap-0.5 items-center">
|
||||
{#if shiftKey}
|
||||
<Tooltip content={$i18n.t('Delete')}>
|
||||
<button
|
||||
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
deleteModelHandler(model);
|
||||
}}
|
||||
/>
|
||||
>
|
||||
<GarbageBin />
|
||||
</button>
|
||||
</Tooltip>
|
||||
</div>
|
||||
{/if}
|
||||
{:else}
|
||||
{#if $user?.role === 'admin' || model.user_id === $user?.id}
|
||||
<a
|
||||
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
type="button"
|
||||
href={`/workspace/models/edit?id=${encodeURIComponent(model.id)}`}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
{/if}
|
||||
|
||||
<ModelMenu
|
||||
user={$user}
|
||||
{model}
|
||||
shareHandler={() => {
|
||||
shareModelHandler(model);
|
||||
}}
|
||||
cloneHandler={() => {
|
||||
cloneModelHandler(model);
|
||||
}}
|
||||
exportHandler={() => {
|
||||
exportModelHandler(model);
|
||||
}}
|
||||
hideHandler={() => {
|
||||
hideModelHandler(model);
|
||||
}}
|
||||
deleteHandler={() => {
|
||||
selectedModel = model;
|
||||
showModelDeleteConfirm = true;
|
||||
}}
|
||||
onClose={() => {}}
|
||||
>
|
||||
<button
|
||||
class="self-center w-fit text-sm p-1.5 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
type="button"
|
||||
>
|
||||
<EllipsisHorizontal className="size-5" />
|
||||
</button>
|
||||
</ModelMenu>
|
||||
|
||||
<div class="ml-1">
|
||||
<Tooltip content={model.is_active ? $i18n.t('Enabled') : $i18n.t('Disabled')}>
|
||||
<Switch
|
||||
bind:state={model.is_active}
|
||||
on:change={async (e) => {
|
||||
toggleModelById(localStorage.token, model.id);
|
||||
_models.set(await getModels(localStorage.token));
|
||||
}}
|
||||
/>
|
||||
</Tooltip>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/each}
|
||||
@ -467,7 +473,7 @@
|
||||
|
||||
{#if $config?.features.enable_community_sharing}
|
||||
<div class=" my-16">
|
||||
<div class=" text-lg font-semibold mb-0.5 line-clamp-1">
|
||||
<div class=" text-xl font-medium mb-1 line-clamp-1">
|
||||
{$i18n.t('Made by OpenWebUI Community')}
|
||||
</div>
|
||||
|
||||
|
@ -10,12 +10,14 @@
|
||||
vision: $i18n.t('Model accepts image inputs'),
|
||||
usage: $i18n.t(
|
||||
'Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.'
|
||||
)
|
||||
),
|
||||
citations: $i18n.t('Displays citations in the response')
|
||||
};
|
||||
|
||||
export let capabilities: {
|
||||
vision?: boolean;
|
||||
usage?: boolean;
|
||||
citations?: boolean;
|
||||
} = {};
|
||||
</script>
|
||||
|
||||
|
@ -71,7 +71,8 @@
|
||||
let params = {};
|
||||
let capabilities = {
|
||||
vision: true,
|
||||
usage: undefined
|
||||
usage: undefined,
|
||||
citations: true
|
||||
};
|
||||
|
||||
let knowledge = [];
|
||||
@ -79,7 +80,7 @@
|
||||
let filterIds = [];
|
||||
let actionIds = [];
|
||||
|
||||
let accessControl = null;
|
||||
let accessControl = {};
|
||||
|
||||
const addUsage = (base_model_id) => {
|
||||
const baseModel = $models.find((m) => m.id === base_model_id);
|
||||
@ -209,11 +210,12 @@
|
||||
}
|
||||
});
|
||||
capabilities = { ...capabilities, ...(model?.meta?.capabilities ?? {}) };
|
||||
if (model?.owned_by === 'openai') {
|
||||
capabilities.usage = false;
|
||||
}
|
||||
|
||||
accessControl = model?.access_control ?? null;
|
||||
if ('access_control' in model) {
|
||||
accessControl = model.access_control;
|
||||
} else {
|
||||
accessControl = {};
|
||||
}
|
||||
|
||||
console.log(model?.access_control);
|
||||
console.log(accessControl);
|
||||
@ -343,7 +345,10 @@
|
||||
<div class="self-center md:self-start flex justify-center my-2 flex-shrink-0">
|
||||
<div class="self-center">
|
||||
<button
|
||||
class="rounded-2xl flex flex-shrink-0 items-center bg-white shadow-xl group relative"
|
||||
class="rounded-2xl flex flex-shrink-0 items-center {info.meta.profile_image_url !==
|
||||
'/static/favicon.png'
|
||||
? 'bg-transparent'
|
||||
: 'bg-white'} shadow-xl group relative"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
filesInputElement.click();
|
||||
|
@ -21,6 +21,8 @@
|
||||
import Plus from '../icons/Plus.svelte';
|
||||
import ChevronRight from '../icons/ChevronRight.svelte';
|
||||
import Spinner from '../common/Spinner.svelte';
|
||||
import Tooltip from '../common/Tooltip.svelte';
|
||||
import { capitalizeFirstLetter } from '$lib/utils';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
let promptsImportInputElement: HTMLInputElement;
|
||||
@ -103,7 +105,7 @@
|
||||
</div>
|
||||
</DeleteConfirmDialog>
|
||||
|
||||
<div class="flex flex-col gap-1 mt-1.5 mb-2">
|
||||
<div class="flex flex-col gap-1 my-1.5">
|
||||
<div class="flex justify-between items-center">
|
||||
<div class="flex md:self-center text-xl font-medium px-0.5 items-center">
|
||||
{$i18n.t('Prompts')}
|
||||
@ -137,19 +139,35 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-5">
|
||||
<div class="mb-5 gap-2 grid lg:grid-cols-2 xl:grid-cols-3">
|
||||
{#each filteredItems as prompt}
|
||||
<div
|
||||
class=" flex space-x-4 cursor-pointer w-full px-3 py-2 dark:hover:bg-white/5 hover:bg-black/5 rounded-xl"
|
||||
class=" flex space-x-4 cursor-pointer w-full px-3 py-2 dark:hover:bg-white/5 hover:bg-black/5 rounded-xl transition"
|
||||
>
|
||||
<div class=" flex flex-1 space-x-4 cursor-pointer w-full">
|
||||
<a href={`/workspace/prompts/edit?command=${encodeURIComponent(prompt.command)}`}>
|
||||
<div class=" flex-1 self-center pl-1.5">
|
||||
<div class=" font-semibold line-clamp-1">{prompt.command}</div>
|
||||
<div class=" flex-1 flex items-center gap-2 self-center">
|
||||
<div class=" font-semibold line-clamp-1 capitalize">{prompt.title}</div>
|
||||
<div class=" text-xs overflow-hidden text-ellipsis line-clamp-1">
|
||||
{prompt.title}
|
||||
{prompt.command}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" text-xs px-0.5">
|
||||
<Tooltip
|
||||
content={prompt?.user?.email ?? $i18n.t('Deleted User')}
|
||||
className="flex shrink-0"
|
||||
placement="top-start"
|
||||
>
|
||||
<div class="shrink-0 text-gray-500">
|
||||
{$i18n.t('By {{name}}', {
|
||||
name: capitalizeFirstLetter(
|
||||
prompt?.user?.name ?? prompt?.user?.email ?? $i18n.t('Deleted User')
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="flex flex-row gap-0.5 self-center">
|
||||
@ -297,7 +315,7 @@
|
||||
|
||||
{#if $config?.features.enable_community_sharing}
|
||||
<div class=" my-16">
|
||||
<div class=" text-lg font-semibold mb-0.5 line-clamp-1">
|
||||
<div class=" text-xl font-medium mb-1 line-clamp-1">
|
||||
{$i18n.t('Made by OpenWebUI Community')}
|
||||
</div>
|
||||
|
||||
|
@ -96,7 +96,7 @@
|
||||
required
|
||||
/>
|
||||
|
||||
<div>
|
||||
<div class="self-center flex-shrink-0">
|
||||
<button
|
||||
class="bg-gray-50 hover:bg-gray-100 text-black dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-white transition px-2 py-1 rounded-full flex gap-1 items-center"
|
||||
type="button"
|
||||
@ -107,7 +107,7 @@
|
||||
<LockClosed strokeWidth="2.5" className="size-3.5" />
|
||||
|
||||
<div class="text-sm font-medium flex-shrink-0">
|
||||
{$i18n.t('Share')}
|
||||
{$i18n.t('Access')}
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
|
@ -30,6 +30,7 @@
|
||||
import Plus from '../icons/Plus.svelte';
|
||||
import ChevronRight from '../icons/ChevronRight.svelte';
|
||||
import Spinner from '../common/Spinner.svelte';
|
||||
import { capitalizeFirstLetter } from '$lib/utils';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
@ -172,7 +173,7 @@
|
||||
</svelte:head>
|
||||
|
||||
{#if loaded}
|
||||
<div class="flex flex-col gap-1 mt-1.5 mb-2">
|
||||
<div class="flex flex-col gap-1 my-1.5">
|
||||
<div class="flex justify-between items-center">
|
||||
<div class="flex md:self-center text-xl font-medium px-0.5 items-center">
|
||||
{$i18n.t('Tools')}
|
||||
@ -206,42 +207,60 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-5">
|
||||
<div class="mb-5 gap-2 grid lg:grid-cols-2 xl:grid-cols-3">
|
||||
{#each filteredItems as tool}
|
||||
<div
|
||||
class=" flex space-x-4 cursor-pointer w-full px-3 py-2 dark:hover:bg-white/5 hover:bg-black/5 rounded-xl"
|
||||
class=" flex space-x-4 cursor-pointer w-full px-3 py-2 dark:hover:bg-white/5 hover:bg-black/5 rounded-xl transition"
|
||||
>
|
||||
<a
|
||||
class=" flex flex-1 space-x-3.5 cursor-pointer w-full"
|
||||
href={`/workspace/tools/edit?id=${encodeURIComponent(tool.id)}`}
|
||||
>
|
||||
<div class="flex items-center text-left">
|
||||
<div class=" flex-1 self-center pl-1">
|
||||
<div class=" font-semibold flex items-center gap-1.5">
|
||||
<div
|
||||
class=" text-xs font-bold px-1 rounded uppercase line-clamp-1 bg-gray-500/20 text-gray-700 dark:text-gray-200"
|
||||
>
|
||||
TOOL
|
||||
</div>
|
||||
|
||||
{#if tool?.meta?.manifest?.version}
|
||||
<div class=" flex-1 self-center">
|
||||
<Tooltip content={tool?.meta?.description ?? ''} placement="top-start">
|
||||
<div class=" font-semibold flex items-center gap-1.5">
|
||||
<div
|
||||
class="text-xs font-bold px-1 rounded line-clamp-1 bg-gray-500/20 text-gray-700 dark:text-gray-200"
|
||||
class=" text-xs font-bold px-1 rounded uppercase line-clamp-1 bg-gray-500/20 text-gray-700 dark:text-gray-200"
|
||||
>
|
||||
v{tool?.meta?.manifest?.version ?? ''}
|
||||
TOOL
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class="line-clamp-1">
|
||||
{tool.name}
|
||||
{#if tool?.meta?.manifest?.version}
|
||||
<div
|
||||
class="text-xs font-bold px-1 rounded line-clamp-1 bg-gray-500/20 text-gray-700 dark:text-gray-200"
|
||||
>
|
||||
v{tool?.meta?.manifest?.version ?? ''}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class="line-clamp-1">
|
||||
{tool.name}
|
||||
|
||||
<span class=" text-gray-500 text-xs font-medium flex-shrink-0">{tool.id}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Tooltip>
|
||||
|
||||
<div class="flex gap-1.5 px-1">
|
||||
<div class=" text-gray-500 text-xs font-medium flex-shrink-0">{tool.id}</div>
|
||||
<div class="px-0.5">
|
||||
<div class="flex gap-1.5 mt-0.5 mb-0.5">
|
||||
<div class=" text-xs overflow-hidden text-ellipsis line-clamp-1">
|
||||
{tool.meta.description}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" text-xs overflow-hidden text-ellipsis line-clamp-1">
|
||||
{tool.meta.description}
|
||||
<div class="text-xs text-gray-500 shrink-0">
|
||||
<Tooltip
|
||||
content={tool?.user?.email ?? $i18n.t('Deleted User')}
|
||||
className="flex shrink-0"
|
||||
placement="top-start"
|
||||
>
|
||||
{$i18n.t('By {{name}}', {
|
||||
name: capitalizeFirstLetter(
|
||||
tool?.user?.name ?? tool?.user?.email ?? $i18n.t('Deleted User')
|
||||
)
|
||||
})}
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -418,7 +437,7 @@
|
||||
|
||||
{#if $config?.features.enable_community_sharing}
|
||||
<div class=" my-16">
|
||||
<div class=" text-lg font-semibold mb-0.5 line-clamp-1">
|
||||
<div class=" text-xl font-medium mb-1 line-clamp-1">
|
||||
{$i18n.t('Made by OpenWebUI Community')}
|
||||
</div>
|
||||
|
||||
|
@ -223,7 +223,7 @@ class Tools:
|
||||
</Tooltip>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class="self-center flex-shrink-0">
|
||||
<button
|
||||
class="bg-gray-50 hover:bg-gray-100 text-black dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-white transition px-2 py-1 rounded-full flex gap-1 items-center"
|
||||
type="button"
|
||||
@ -234,7 +234,7 @@ class Tools:
|
||||
<LockClosed strokeWidth="2.5" className="size-3.5" />
|
||||
|
||||
<div class="text-sm font-medium flex-shrink-0">
|
||||
{$i18n.t('Share')}
|
||||
{$i18n.t('Access')}
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
|
@ -18,6 +18,21 @@
|
||||
|
||||
onMount(async () => {
|
||||
groups = await getGroups(localStorage.token);
|
||||
|
||||
if (accessControl === null) {
|
||||
accessControl = null;
|
||||
} else {
|
||||
accessControl = {
|
||||
read: {
|
||||
group_ids: accessControl?.read?.group_ids ?? [],
|
||||
user_ids: accessControl?.read?.user_ids ?? []
|
||||
},
|
||||
write: {
|
||||
group_ids: accessControl?.write?.group_ids ?? [],
|
||||
user_ids: accessControl?.write?.user_ids ?? []
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
$: onChange(accessControl);
|
||||
|
@ -15,7 +15,7 @@
|
||||
<div>
|
||||
<div class=" flex justify-between dark:text-gray-100 px-5 pt-3 pb-1">
|
||||
<div class=" text-lg font-medium self-center font-primary">
|
||||
{$i18n.t('Share')}
|
||||
{$i18n.t('Access Control')}
|
||||
</div>
|
||||
<button
|
||||
class="self-center"
|
||||
|
@ -95,6 +95,8 @@ export const SUPPORTED_FILE_EXTENSIONS = [
|
||||
'msg'
|
||||
];
|
||||
|
||||
export const PASTED_TEXT_CHARACTER_LIMIT = 1000;
|
||||
|
||||
// Source: https://kit.svelte.dev/docs/modules#$env-static-public
|
||||
// This feature, akin to $env/static/private, exclusively incorporates environment variables
|
||||
// that are prefixed with config.kit.env.publicPrefix (usually set to PUBLIC_).
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "يتم استخدام نموذج المهمة عند تنفيذ مهام مثل إنشاء عناوين للدردشات واستعلامات بحث الويب",
|
||||
"a user": "مستخدم",
|
||||
"About": "عن",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "الحساب",
|
||||
"Account Activation Pending": "",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "المعلمات المتقدمة",
|
||||
"All chats": "",
|
||||
"All Documents": "جميع الملفات",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "يستطيع حذف المحادثات",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"Already have an account?": "هل تملك حساب ؟",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "مساعد",
|
||||
"and": "و",
|
||||
"and {{COUNT}} more": "",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 الرابط مطلوب",
|
||||
"Available list": "",
|
||||
"available!": "متاح",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "",
|
||||
"Azure Region": "",
|
||||
"Back": "خلف",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "مفتاح واجهة برمجة تطبيقات البحث الشجاع",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "تجاوز التحقق من SSL للموقع",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "الموديل المختار",
|
||||
"Current Password": "كلمة السر الحالية",
|
||||
"Custom": "مخصص",
|
||||
"Customize models for a specific purpose": "تخصيص النماذج لغرض معين",
|
||||
"Dark": "مظلم",
|
||||
"Database": "قاعدة البيانات",
|
||||
"December": "ديسمبر",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "حذف",
|
||||
"Delete a model": "حذف الموديل",
|
||||
"Delete All Chats": "حذف جميع الدردشات",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "حذف المحادثه",
|
||||
"Delete Chat": "حذف المحادثه.",
|
||||
"Delete chat?": "",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "حذف المستخدم",
|
||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} حذف",
|
||||
"Deleted {{name}}": "حذف {{name}}",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "وصف",
|
||||
"Didn't fully follow instructions": "لم أتبع التعليمات بشكل كامل",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "اعرض اسم المستخدم بدلاً منك في الدردشة",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "نموذج التضمين",
|
||||
"Embedding Model Engine": "تضمين محرك النموذج",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "تم تعيين نموذج التضمين على \"{{embedding_model}}\"",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "تمكين مشاركة المجتمع",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "تفعيل عمليات التسجيل الجديدة",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "تمكين بحث الويب",
|
||||
"Enable Web Search Query Generation": "",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "أخفاء",
|
||||
"Host": "",
|
||||
"How can I help you today?": "كيف استطيع مساعدتك اليوم؟",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "البحث الهجين",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"ID": "",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "",
|
||||
"page": "",
|
||||
"Password": "الباسورد",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "PDF ملف (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF أستخرج الصور (OCR)",
|
||||
"pending": "قيد الانتظار",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Ollama.com \"{{searchValue}}\" أسحب من ",
|
||||
"Pull a model from Ollama.com": "Ollama.com سحب الموديل من ",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "Query Params",
|
||||
"RAG Template": "RAG تنمبلت",
|
||||
"Rating": "",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "نماذج البحث",
|
||||
"Search options": "",
|
||||
"Search Prompts": "أبحث حث",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Result Count": "عدد نتائج البحث",
|
||||
"Search the web": "",
|
||||
"Search Tools": "",
|
||||
@ -855,6 +867,8 @@
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
|
||||
"Thorough explanation": "شرح شامل",
|
||||
"Tika": "",
|
||||
@ -971,6 +985,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Моделът на задачите се използва при изпълнение на задачи като генериране на заглавия за чатове и заявки за търсене в мрежата",
|
||||
"a user": "потребител",
|
||||
"About": "Относно",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "Акаунт",
|
||||
"Account Activation Pending": "",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "Разширени параметри",
|
||||
"All chats": "",
|
||||
"All Documents": "Всички Документи",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "Позволи Изтриване на Чат",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"Already have an account?": "Вече имате акаунт? ",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "асистент",
|
||||
"and": "и",
|
||||
"and {{COUNT}} more": "",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Базов URL е задължителен.",
|
||||
"Available list": "",
|
||||
"available!": "наличен!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "",
|
||||
"Azure Region": "",
|
||||
"Back": "Назад",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "Смел ключ за API за търсене",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "Изключване на SSL проверката за сайтове",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "Текущ модел",
|
||||
"Current Password": "Текуща Парола",
|
||||
"Custom": "Персонализиран",
|
||||
"Customize models for a specific purpose": "Персонализиране на модели за конкретна цел",
|
||||
"Dark": "Тъмен",
|
||||
"Database": "База данни",
|
||||
"December": "Декември",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "Изтриване",
|
||||
"Delete a model": "Изтриване на модел",
|
||||
"Delete All Chats": "Изтриване на всички чатове",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "Изтриване на чат",
|
||||
"Delete Chat": "Изтриване на Чат",
|
||||
"Delete chat?": "",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "Изтриване на потребител",
|
||||
"Deleted {{deleteModelTag}}": "Изтрито {{deleteModelTag}}",
|
||||
"Deleted {{name}}": "Изтрито {{име}}",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "Описание",
|
||||
"Didn't fully follow instructions": "Не следва инструкциите",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Показване на потребителското име вместо Вие в чата",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "Модел за вграждане",
|
||||
"Embedding Model Engine": "Модел за вграждане",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Модел за вграждане е настроен на \"{{embedding_model}}\"",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "Разрешаване на споделяне в общност",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "Вклюване на Нови Потребители",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "Разрешаване на търсене в уеб",
|
||||
"Enable Web Search Query Generation": "",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "Скрий",
|
||||
"Host": "",
|
||||
"How can I help you today?": "Как мога да ви помогна днес?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "Hybrid Search",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"ID": "",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "",
|
||||
"page": "",
|
||||
"Password": "Парола",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "PDF документ (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF Extract Images (OCR)",
|
||||
"pending": "в очакване",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Извади \"{{searchValue}}\" от Ollama.com",
|
||||
"Pull a model from Ollama.com": "Издърпайте модел от Ollama.com",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "Query Параметри",
|
||||
"RAG Template": "RAG Шаблон",
|
||||
"Rating": "",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "Търсене на модели",
|
||||
"Search options": "",
|
||||
"Search Prompts": "Търси Промптове",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Result Count": "Брой резултати от търсенето",
|
||||
"Search the web": "",
|
||||
"Search Tools": "",
|
||||
@ -851,6 +863,8 @@
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
|
||||
"Thorough explanation": "Това е подробно описание.",
|
||||
"Tika": "",
|
||||
@ -967,6 +981,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "চ্যাট এবং ওয়েব অনুসন্ধান প্রশ্নের জন্য শিরোনাম তৈরি করার মতো কাজগুলি সম্পাদন করার সময় একটি টাস্ক মডেল ব্যবহার করা হয়",
|
||||
"a user": "একজন ব্যাবহারকারী",
|
||||
"About": "সম্পর্কে",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "একাউন্ট",
|
||||
"Account Activation Pending": "",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "অ্যাডভান্সড প্যারাম",
|
||||
"All chats": "",
|
||||
"All Documents": "সব ডকুমেন্ট",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "চ্যাট ডিলিট করতে দিন",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"Already have an account?": "আগে থেকেই একাউন্ট আছে?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "একটা এসিস্ট্যান্ট",
|
||||
"and": "এবং",
|
||||
"and {{COUNT}} more": "",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 বেজ ইউআরএল আবশ্যক",
|
||||
"Available list": "",
|
||||
"available!": "উপলব্ধ!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "",
|
||||
"Azure Region": "",
|
||||
"Back": "পেছনে",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "সাহসী অনুসন্ধান API কী",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "ওয়েবসাইটের জন্য SSL যাচাই বাতিল করুন",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "বর্তমান মডেল",
|
||||
"Current Password": "বর্তমান পাসওয়ার্ড",
|
||||
"Custom": "কাস্টম",
|
||||
"Customize models for a specific purpose": "একটি নির্দিষ্ট উদ্দেশ্যে মডেল কাস্টমাইজ করুন",
|
||||
"Dark": "ডার্ক",
|
||||
"Database": "ডেটাবেজ",
|
||||
"December": "ডেসেম্বর",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "মুছে ফেলুন",
|
||||
"Delete a model": "একটি মডেল মুছে ফেলুন",
|
||||
"Delete All Chats": "সব চ্যাট মুছে ফেলুন",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "চ্যাট মুছে ফেলুন",
|
||||
"Delete Chat": "চ্যাট মুছে ফেলুন",
|
||||
"Delete chat?": "",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "ইউজার মুছে ফেলুন",
|
||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} মুছে ফেলা হয়েছে",
|
||||
"Deleted {{name}}": "{{name}} মোছা হয়েছে",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "বিবরণ",
|
||||
"Didn't fully follow instructions": "ইনস্ট্রাকশন সম্পূর্ণ অনুসরণ করা হয়নি",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "চ্যাটে 'আপনি'-র পরবর্তে ইউজারনেম দেখান",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "ইমেজ ইমেবডিং মডেল",
|
||||
"Embedding Model Engine": "ইমেজ ইমেবডিং মডেল ইঞ্জিন",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "ইমেজ ইমেবডিং মডেল সেট করা হয়েছে - \"{{embedding_model}}\"",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "সম্প্রদায় শেয়ারকরণ সক্ষম করুন",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "নতুন সাইনআপ চালু করুন",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "ওয়েব অনুসন্ধান সক্ষম করুন",
|
||||
"Enable Web Search Query Generation": "",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "লুকান",
|
||||
"Host": "",
|
||||
"How can I help you today?": "আপনাকে আজ কিভাবে সাহায্য করতে পারি?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "হাইব্রিড অনুসন্ধান",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"ID": "",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "",
|
||||
"page": "",
|
||||
"Password": "পাসওয়ার্ড",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "PDF ডকুমেন্ট (.pdf)",
|
||||
"PDF Extract Images (OCR)": "পিডিএফ এর ছবি থেকে লেখা বের করুন (OCR)",
|
||||
"pending": "অপেক্ষমান",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Ollama.com থেকে \"{{searchValue}}\" টানুন",
|
||||
"Pull a model from Ollama.com": "Ollama.com থেকে একটি টেনে আনুন আনুন",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "Query প্যারামিটারসমূহ",
|
||||
"RAG Template": "RAG টেম্পলেট",
|
||||
"Rating": "",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "অনুসন্ধান মডেল",
|
||||
"Search options": "",
|
||||
"Search Prompts": "প্রম্পটসমূহ অনুসন্ধান করুন",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Result Count": "অনুসন্ধানের ফলাফল গণনা",
|
||||
"Search the web": "",
|
||||
"Search Tools": "",
|
||||
@ -851,6 +863,8 @@
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
|
||||
"Thorough explanation": "পুঙ্খানুপুঙ্খ ব্যাখ্যা",
|
||||
"Tika": "",
|
||||
@ -967,6 +981,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Un model de tasca s'utilitza quan es realitzen tasques com ara generar títols per a xats i consultes de cerca per a la web",
|
||||
"a user": "un usuari",
|
||||
"About": "Sobre",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "Compte",
|
||||
"Account Activation Pending": "Activació del compte pendent",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "Paràmetres avançats",
|
||||
"All chats": "Tots els xats",
|
||||
"All Documents": "Tots els documents",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "Permetre la supressió del xat",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "Permetre la interrupció de la veu en una trucada",
|
||||
"Already have an account?": "Ja tens un compte?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Alternativa al top_p, i pretén garantir un equilibri de qualitat i varietat. El paràmetre p representa la probabilitat mínima que es consideri un token, en relació amb la probabilitat del token més probable. Per exemple, amb p=0,05 i el token més probable amb una probabilitat de 0,9, es filtren els logits amb un valor inferior a 0,045. (Per defecte: 0.0)",
|
||||
"Amazing": "",
|
||||
"an assistant": "un assistent",
|
||||
"and": "i",
|
||||
"and {{COUNT}} more": "i {{COUNT}} més",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "Es requereix l'URL Base d'AUTOMATIC1111.",
|
||||
"Available list": "Llista de disponibles",
|
||||
"available!": "disponible!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "Azure AI Speech",
|
||||
"Azure Region": "Regió d'Azure",
|
||||
"Back": "Enrere",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "Punt de connexió a Bing Search V7",
|
||||
"Bing Search V7 Subscription Key": "Clau de subscripció a Bing Search V7",
|
||||
"Brave Search API Key": "Clau API de Brave Search",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "Desactivar la verificació SSL per a l'accés a Internet",
|
||||
"Call": "Trucada",
|
||||
"Call feature is not supported when using Web STT engine": "La funció de trucada no s'admet quan s'utilitza el motor Web STT",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "Model actual",
|
||||
"Current Password": "Contrasenya actual",
|
||||
"Custom": "Personalitzat",
|
||||
"Customize models for a specific purpose": "Personalitzar models per a un propòsit específic",
|
||||
"Dark": "Fosc",
|
||||
"Database": "Base de dades",
|
||||
"December": "Desembre",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "Eliminar",
|
||||
"Delete a model": "Eliminar un model",
|
||||
"Delete All Chats": "Eliminar tots els xats",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "Eliminar xat",
|
||||
"Delete Chat": "Eliminar xat",
|
||||
"Delete chat?": "Eliminar el xat?",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "Eliminar usuari",
|
||||
"Deleted {{deleteModelTag}}": "S'ha eliminat {{deleteModelTag}}",
|
||||
"Deleted {{name}}": "S'ha eliminat {{name}}",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "Descriu la teva base de coneixement i objectius",
|
||||
"Description": "Descripció",
|
||||
"Didn't fully follow instructions": "No s'han seguit les instruccions completament",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "Mostrar emojis a la trucada",
|
||||
"Display the username instead of You in the Chat": "Mostrar el nom d'usuari en lloc de 'Tu' al xat",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "Aprofundir en el coneixement",
|
||||
"Do not install functions from sources you do not fully trust.": "No instal·lis funcions de fonts en què no confiïs plenament.",
|
||||
"Do not install tools from sources you do not fully trust.": "No instal·lis eines de fonts en què no confiïs plenament.",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "Model d'incrustació",
|
||||
"Embedding Model Engine": "Motor de model d'incrustació",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Model d'incrustació configurat a \"{{embedding_model}}\"",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "Activar l'ús compartit amb la comunitat",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Activar el bloqueig de memòria (mlock) per evitar que les dades del model s'intercanviïn fora de la memòria RAM. Aquesta opció bloqueja el conjunt de pàgines de treball del model a la memòria RAM, assegurant-se que no s'intercanviaran al disc. Això pot ajudar a mantenir el rendiment evitant errors de pàgina i garantint un accés ràpid a les dades.",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "Activar l'assignació de memòria (mmap) per carregar les dades del model. Aquesta opció permet que el sistema utilitzi l'emmagatzematge en disc com a extensió de la memòria RAM tractant els fitxers de disc com si estiguessin a la memòria RAM. Això pot millorar el rendiment del model permetent un accés més ràpid a les dades. Tanmateix, és possible que no funcioni correctament amb tots els sistemes i pot consumir una quantitat important d'espai en disc.",
|
||||
"Enable Message Rating": "Permetre la qualificació de missatges",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "Activar el mostreig de Mirostat per controlar la perplexitat. (Per defecte: 0, 0 = Inhabilitat, 1 = Mirostat, 2 = Mirostat 2.0)",
|
||||
"Enable New Sign Ups": "Permetre nous registres",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "Activar la generació d'etiquetes",
|
||||
"Enable Web Search": "Activar la cerca web",
|
||||
"Enable Web Search Query Generation": "Activa la generació de consultes de cerca web",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "Amaga",
|
||||
"Host": "Servidor",
|
||||
"How can I help you today?": "Com et puc ajudar avui?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "Cerca híbrida",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Afirmo que he llegit i entenc les implicacions de la meva acció. Soc conscient dels riscos associats a l'execució de codi arbitrari i he verificat la fiabilitat de la font.",
|
||||
"ID": "ID",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "Vista general",
|
||||
"page": "pàgina",
|
||||
"Password": "Contrasenya",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "Document PDF (.pdf)",
|
||||
"PDF Extract Images (OCR)": "Extreu imatges del PDF (OCR)",
|
||||
"pending": "pendent",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Obtenir \"{{searchValue}}\" de Ollama.com",
|
||||
"Pull a model from Ollama.com": "Obtenir un model d'Ollama.com",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "Paràmetres de consulta",
|
||||
"RAG Template": "Plantilla RAG",
|
||||
"Rating": "Valoració",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "Cercar models",
|
||||
"Search options": "Opcions de cerca",
|
||||
"Search Prompts": "Cercar indicacions",
|
||||
"Search Query Generation Prompt": "Indicació de cerca de generació de consultes",
|
||||
"Search Result Count": "Recompte de resultats de cerca",
|
||||
"Search the web": "Cercar la web",
|
||||
"Search Tools": "Cercar eines",
|
||||
@ -852,6 +864,8 @@
|
||||
"This response was generated by \"{{model}}\"": "Aquesta resposta l'ha generat el model \"{{model}}\"",
|
||||
"This will delete": "Això eliminarà",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "Això eliminarà <strong>{{NAME}}</strong> i <strong>tots els continguts</strong>.",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Això restablirà la base de coneixement i sincronitzarà tots els fitxers. Vols continuar?",
|
||||
"Thorough explanation": "Explicació en detall",
|
||||
"Tika": "Tika",
|
||||
@ -968,6 +982,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "Quan està activat, el model respondrà a cada missatge de xat en temps real, generant una resposta tan bon punt l'usuari envia un missatge. Aquest mode és útil per a aplicacions de xat en directe, però pot afectar el rendiment en maquinari més lent.",
|
||||
"wherever you are": "allà on estiguis",
|
||||
"Whisper (Local)": "Whisper (local)",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "Mode de pantalla ampla",
|
||||
"Won": "Ha guanyat",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "Funciona juntament amb top-k. Un valor més alt (p. ex., 0,95) donarà lloc a un text més divers, mentre que un valor més baix (p. ex., 0,5) generarà un text més concentrat i conservador. (Per defecte: 0,9)",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "",
|
||||
"a user": "usa ka user",
|
||||
"About": "Mahitungod sa",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "Account",
|
||||
"Account Activation Pending": "",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "",
|
||||
"All chats": "",
|
||||
"All Documents": "",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "Tugoti nga mapapas ang mga chat",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"Already have an account?": "Naa na kay account ?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "usa ka katabang",
|
||||
"and": "Ug",
|
||||
"and {{COUNT}} more": "",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "Ang AUTOMATIC1111 base URL gikinahanglan.",
|
||||
"Available list": "",
|
||||
"available!": "magamit!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "",
|
||||
"Azure Region": "",
|
||||
"Back": "Balik",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "Kasamtangang modelo",
|
||||
"Current Password": "Kasamtangang Password",
|
||||
"Custom": "Custom",
|
||||
"Customize models for a specific purpose": "",
|
||||
"Dark": "Ngitngit",
|
||||
"Database": "Database",
|
||||
"December": "",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "",
|
||||
"Delete a model": "Pagtangtang sa usa ka template",
|
||||
"Delete All Chats": "",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "Pagtangtang sa panaghisgot",
|
||||
"Delete Chat": "",
|
||||
"Delete chat?": "",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "",
|
||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} gipapas",
|
||||
"Deleted {{name}}": "",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "Deskripsyon",
|
||||
"Didn't fully follow instructions": "",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Ipakita ang username imbes nga 'Ikaw' sa Panaghisgutan",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "",
|
||||
"Embedding Model Engine": "",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "I-enable ang bag-ong mga rehistro",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "",
|
||||
"Enable Web Search Query Generation": "",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "Tagoa",
|
||||
"Host": "",
|
||||
"How can I help you today?": "Unsaon nako pagtabang kanimo karon?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"ID": "",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "",
|
||||
"page": "",
|
||||
"Password": "Password",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "",
|
||||
"PDF Extract Images (OCR)": "PDF Image Extraction (OCR)",
|
||||
"pending": "gipugngan",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "",
|
||||
"Pull a model from Ollama.com": "Pagkuha ug template gikan sa Ollama.com",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "Mga parameter sa pangutana",
|
||||
"RAG Template": "RAG nga modelo",
|
||||
"Rating": "",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "",
|
||||
"Search options": "",
|
||||
"Search Prompts": "Pangitaa ang mga prompt",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Result Count": "",
|
||||
"Search the web": "",
|
||||
"Search Tools": "",
|
||||
@ -851,6 +863,8 @@
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
|
||||
"Thorough explanation": "",
|
||||
"Tika": "",
|
||||
@ -967,6 +981,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Model úloh se používá při provádění úloh, jako je generování názvů pro chaty a vyhledávací dotazy na webu.",
|
||||
"a user": "uživatel",
|
||||
"About": "O programu",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "Účet",
|
||||
"Account Activation Pending": "Čeká na aktivaci účtu",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "Pokročilé parametry",
|
||||
"All chats": "Všechny chaty",
|
||||
"All Documents": "Všechny dokumenty",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "Povolit odstranění chatu",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "Povolit přerušení hlasu při hovoru",
|
||||
"Already have an account?": "Už máte účet?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "asistent",
|
||||
"and": "a",
|
||||
"and {{COUNT}} more": "a {{COUNT}} dalších",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "Vyžaduje se základní URL pro AUTOMATIC1111.",
|
||||
"Available list": "Dostupný seznam",
|
||||
"available!": "k dispozici!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "Azure AI syntéza řeči",
|
||||
"Azure Region": "Azure oblast",
|
||||
"Back": "Zpět",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "Klíč API pro Brave Search",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "Obcházení ověření SSL pro webové stránky",
|
||||
"Call": "Volání",
|
||||
"Call feature is not supported when using Web STT engine": "Funkce pro volání není podporována při použití Web STT engine.",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "Aktuální model",
|
||||
"Current Password": "Aktuální heslo",
|
||||
"Custom": "Na míru",
|
||||
"Customize models for a specific purpose": "Přizpůsobení modelů pro specifický účel",
|
||||
"Dark": "Tmavý",
|
||||
"Database": "Databáze",
|
||||
"December": "Prosinec",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "Smazat",
|
||||
"Delete a model": "Odstranit model.",
|
||||
"Delete All Chats": "Odstranit všechny konverzace",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "Smazat chat",
|
||||
"Delete Chat": "Smazat chat",
|
||||
"Delete chat?": "Smazat konverzaci?",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "Smazat uživatele",
|
||||
"Deleted {{deleteModelTag}}": "Smazáno {{deleteModelTag}}",
|
||||
"Deleted {{name}}": "Smazáno {{name}}",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "Popis",
|
||||
"Didn't fully follow instructions": "Nenásledovali jste přesně všechny instrukce.",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "Zobrazení emoji během hovoru",
|
||||
"Display the username instead of You in the Chat": "Zobrazit uživatelské jméno místo \"Vás\" v chatu",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "Neinstalujte funkce ze zdrojů, kterým plně nedůvěřujete.",
|
||||
"Do not install tools from sources you do not fully trust.": "Neinstalujte nástroje ze zdrojů, kterým plně nedůvěřujete.",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "Vkládací model (Embedding Model)",
|
||||
"Embedding Model Engine": "Model zabudovaný motor",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Model vkládání nastaven na \"{{embedding_model}}\"",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "Povolit sdílení komunity",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "Povolit hodnocení zpráv",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "Povolit nové registrace",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "Povolit webové vyhledávání",
|
||||
"Enable Web Search Query Generation": "Povolit generování dotazů pro webové vyhledávání",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "Schovej",
|
||||
"Host": "",
|
||||
"How can I help you today?": "Jak vám mohu dnes pomoci?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "Hybridní vyhledávání",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Beru na vědomí, že jsem si přečetl a chápu důsledky svých činů. Jsem si vědom rizik spojených s vykonáváním libovolného kódu a ověřil jsem důvěryhodnost zdroje.",
|
||||
"ID": "ID",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "Přehled",
|
||||
"page": "stránka",
|
||||
"Password": "Heslo",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "PDF dokument (.pdf)",
|
||||
"PDF Extract Images (OCR)": "Extrahování obrázků z PDF (OCR)",
|
||||
"pending": "čeká na vyřízení",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Stáhněte \"{{searchValue}}\" z Ollama.com",
|
||||
"Pull a model from Ollama.com": "Stáhněte model z Ollama.com",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "Parametry dotazu",
|
||||
"RAG Template": "Šablona RAG",
|
||||
"Rating": "Hodnocení",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "Vyhledávací modely",
|
||||
"Search options": "",
|
||||
"Search Prompts": "Vyhledávací dotazy",
|
||||
"Search Query Generation Prompt": "Generování dotazu na vyhledávání",
|
||||
"Search Result Count": "Počet výsledků hledání",
|
||||
"Search the web": "",
|
||||
"Search Tools": "Nástroje pro vyhledávání",
|
||||
@ -853,6 +865,8 @@
|
||||
"This response was generated by \"{{model}}\"": "Tato odpověď byla vygenerována pomocí \"{{model}}\"",
|
||||
"This will delete": "Tím se odstraní",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "Tímto dojde k odstranění <strong>{{NAME}}</strong> a <strong>všech jeho obsahů</strong>.",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Toto obnoví znalostní databázi a synchronizuje všechny soubory. Přejete si pokračovat?",
|
||||
"Thorough explanation": "Obsáhlé vysvětlení",
|
||||
"Tika": "Tika",
|
||||
@ -969,6 +983,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "Whisper (Lokálně)",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "Režim širokoúhlého zobrazení",
|
||||
"Won": "Vyhrál",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "En 'task model' bliver brugt til at opgaver såsom at generere overskrifter til chats eller internetsøgninger",
|
||||
"a user": "en bruger",
|
||||
"About": "Information",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "Profil",
|
||||
"Account Activation Pending": "Aktivering af profil afventer",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "Advancerede indstillinger",
|
||||
"All chats": "",
|
||||
"All Documents": "Alle dokumenter",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "Tillad sletning af chats",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "Tillad afbrydelser i stemme i opkald",
|
||||
"Already have an account?": "Har du allerede en profil?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "en assistent",
|
||||
"and": "og",
|
||||
"and {{COUNT}} more": "",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Base URL er påkrævet.",
|
||||
"Available list": "Tilgængelige lister",
|
||||
"available!": "tilgængelig!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "Azure AI Speech",
|
||||
"Azure Region": "Azure Region",
|
||||
"Back": "Tilbage",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "Brave Search API nøgle",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "Forbigå SSL verifikation på websider",
|
||||
"Call": "Opkald",
|
||||
"Call feature is not supported when using Web STT engine": "Opkaldsfunktion er ikke understøttet for Web STT engine",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "Nuværende model",
|
||||
"Current Password": "Nuværende password",
|
||||
"Custom": "Custom",
|
||||
"Customize models for a specific purpose": "Lav en model til et specifikt formål",
|
||||
"Dark": "Mørk",
|
||||
"Database": "Database",
|
||||
"December": "december",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "Slet",
|
||||
"Delete a model": "Slet en model",
|
||||
"Delete All Chats": "Slet alle chats",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "Slet chat",
|
||||
"Delete Chat": "Slet chat",
|
||||
"Delete chat?": "Slet chat?",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "Slet bruger",
|
||||
"Deleted {{deleteModelTag}}": "Slettede {{deleteModelTag}}",
|
||||
"Deleted {{name}}": "Slettede {{name}}",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "Beskrivelse",
|
||||
"Didn't fully follow instructions": "Fulgte ikke instruktioner",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "Vis emoji i chat",
|
||||
"Display the username instead of You in the Chat": "Vis brugernavn i stedet for Dig i chatten",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "Lad være med at installere funktioner fra kilder, som du ikke stoler på.",
|
||||
"Do not install tools from sources you do not fully trust.": "Lad være med at installere værktøjer fra kilder, som du ikke stoler på.",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "Embedding Model",
|
||||
"Embedding Model Engine": "Embedding Model engine",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Embedding model sat til \"{{embedding_model}}\"",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "Aktiver deling til Community",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "Aktiver rating af besked",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "Aktiver nye signups",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "Aktiver websøgning",
|
||||
"Enable Web Search Query Generation": "Aktiver query generation med websøgning",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "Skjul",
|
||||
"Host": "",
|
||||
"How can I help you today?": "Hvordan kan jeg hjælpe dig i dag?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "Hybrid søgning",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Jeg anerkender, at jeg har læst og forstået konsekvenserne af min handling. Jeg er opmærksom på de risici, der er forbundet med at udføre vilkårlig kode, og jeg har verificeret kildens troværdighed.",
|
||||
"ID": "",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "Oversigt",
|
||||
"page": "side",
|
||||
"Password": "Adgangskode",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "PDF-dokument (.pdf)",
|
||||
"PDF Extract Images (OCR)": "Udtræk billeder fra PDF (OCR)",
|
||||
"pending": "afventer",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Hent \"{{searchValue}}\" fra Ollama.com",
|
||||
"Pull a model from Ollama.com": "Hent en model fra Ollama.com",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "Forespørgselsparametre",
|
||||
"RAG Template": "RAG-skabelon",
|
||||
"Rating": "",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "Søg i modeller",
|
||||
"Search options": "",
|
||||
"Search Prompts": "Søg i prompts",
|
||||
"Search Query Generation Prompt": "Prompt til generering af søgeforespørgsel",
|
||||
"Search Result Count": "Antal søgeresultater",
|
||||
"Search the web": "",
|
||||
"Search Tools": "Søg i værktøjer",
|
||||
@ -851,6 +863,8 @@
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "Dette vil slette",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Dette vil nulstille vidensbasen og synkronisere alle filer. Vil du fortsætte?",
|
||||
"Thorough explanation": "Grundig forklaring",
|
||||
"Tika": "Tika",
|
||||
@ -967,6 +981,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "Whisper (lokal)",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "Widescreen-tilstand",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Aufgabenmodelle können Unterhaltungstitel oder Websuchanfragen generieren.",
|
||||
"a user": "ein Benutzer",
|
||||
"About": "Über",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "Konto",
|
||||
"Account Activation Pending": "Kontoaktivierung ausstehend",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "Erweiterte Parameter",
|
||||
"All chats": "Alle Unterhaltungen",
|
||||
"All Documents": "Alle Dokumente",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "Löschen von Unterhaltungen erlauben",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "Unterbrechung durch Stimme im Anruf zulassen",
|
||||
"Already have an account?": "Haben Sie bereits einen Account?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "ein Assistent",
|
||||
"and": "und",
|
||||
"and {{COUNT}} more": "und {{COUNT}} mehr",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111-Basis-URL ist erforderlich.",
|
||||
"Available list": "Verfügbare Liste",
|
||||
"available!": "Verfügbar!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "Azure AI Speech",
|
||||
"Azure Region": "Azure-Region",
|
||||
"Back": "Zurück",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "Brave Search API-Schlüssel",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "SSL-Überprüfung für Webseiten umgehen",
|
||||
"Call": "Anrufen",
|
||||
"Call feature is not supported when using Web STT engine": "Die Anruffunktion wird nicht unterstützt, wenn die Web-STT-Engine verwendet wird.",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "Aktuelles Modell",
|
||||
"Current Password": "Aktuelles Passwort",
|
||||
"Custom": "Benutzerdefiniert",
|
||||
"Customize models for a specific purpose": "Modelle für einen bestimmten Zweck anpassen",
|
||||
"Dark": "Dunkel",
|
||||
"Database": "Datenbank",
|
||||
"December": "Dezember",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "Löschen",
|
||||
"Delete a model": "Ein Modell löschen",
|
||||
"Delete All Chats": "Alle Unterhaltungen löschen",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "Unterhaltung löschen",
|
||||
"Delete Chat": "Unterhaltung löschen",
|
||||
"Delete chat?": "Unterhaltung löschen?",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "Benutzer löschen",
|
||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} gelöscht",
|
||||
"Deleted {{name}}": "{{name}} gelöscht",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "Beschreibung",
|
||||
"Didn't fully follow instructions": "Nicht genau den Answeisungen gefolgt",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "Emojis im Anruf anzeigen",
|
||||
"Display the username instead of You in the Chat": "Soll \"Sie\" durch Ihren Benutzernamen ersetzt werden?",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "Installieren Sie keine Funktionen aus Quellen, denen Sie nicht vollständig vertrauen.",
|
||||
"Do not install tools from sources you do not fully trust.": "Installieren Sie keine Werkzeuge aus Quellen, denen Sie nicht vollständig vertrauen.",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "Embedding-Modell",
|
||||
"Embedding Model Engine": "Embedding-Modell-Engine",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Embedding-Modell auf \"{{embedding_model}}\" gesetzt",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "Community-Freigabe aktivieren",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "Nachrichtenbewertung aktivieren",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "Registrierung erlauben",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "Websuche aktivieren",
|
||||
"Enable Web Search Query Generation": "Websuchanfragen-Generierung aktivieren",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "Verbergen",
|
||||
"Host": "",
|
||||
"How can I help you today?": "Wie kann ich Ihnen heute helfen?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "Hybride Suche",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Ich bestätige, dass ich gelesen habe und die Auswirkungen meiner Aktion verstehe. Mir sind die Risiken bewusst, die mit der Ausführung beliebigen Codes verbunden sind, und ich habe die Vertrauenswürdigkeit der Quelle überprüft.",
|
||||
"ID": "ID",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "Übersicht",
|
||||
"page": "Seite",
|
||||
"Password": "Passwort",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "PDF-Dokument (.pdf)",
|
||||
"PDF Extract Images (OCR)": "Text von Bildern aus PDFs extrahieren (OCR)",
|
||||
"pending": "ausstehend",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "\"{{searchValue}}\" von Ollama.com beziehen",
|
||||
"Pull a model from Ollama.com": "Modell von Ollama.com beziehen",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "Abfrageparameter",
|
||||
"RAG Template": "RAG-Vorlage",
|
||||
"Rating": "Bewertung",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "Modelle durchsuchen...",
|
||||
"Search options": "",
|
||||
"Search Prompts": "Prompts durchsuchen...",
|
||||
"Search Query Generation Prompt": "Suchanfragengenerierungsvorlage",
|
||||
"Search Result Count": "Anzahl der Suchergebnisse",
|
||||
"Search the web": "",
|
||||
"Search Tools": "Werkzeuge durchsuchen...",
|
||||
@ -851,6 +863,8 @@
|
||||
"This response was generated by \"{{model}}\"": "Diese Antwort wurde von \"{{model}}\" generiert",
|
||||
"This will delete": "Dies löscht",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "Dies löscht <strong>{{NAME}}</strong> und <strong>alle Inhalte</strong>.",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Dadurch wird die Wissensdatenbank zurückgesetzt und alle Dateien synchronisiert. Möchten Sie fortfahren?",
|
||||
"Thorough explanation": "Ausführliche Erklärung",
|
||||
"Tika": "Tika",
|
||||
@ -967,6 +981,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "Whisper (lokal)",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "Breitbildmodus",
|
||||
"Won": "Gewonnen",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "",
|
||||
"a user": "such user",
|
||||
"About": "Much About",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "Account",
|
||||
"Account Activation Pending": "",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "",
|
||||
"All chats": "",
|
||||
"All Documents": "",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "Allow Delete Chats",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"Already have an account?": "Such account exists?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "such assistant",
|
||||
"and": "and",
|
||||
"and {{COUNT}} more": "",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Base URL is required.",
|
||||
"Available list": "",
|
||||
"available!": "available! So excite!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "",
|
||||
"Azure Region": "",
|
||||
"Back": "Back",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "Current Model",
|
||||
"Current Password": "Current Password",
|
||||
"Custom": "Custom",
|
||||
"Customize models for a specific purpose": "",
|
||||
"Dark": "Dark",
|
||||
"Database": "Database",
|
||||
"December": "",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "",
|
||||
"Delete a model": "Delete a model",
|
||||
"Delete All Chats": "",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "Delete chat",
|
||||
"Delete Chat": "",
|
||||
"Delete chat?": "",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "",
|
||||
"Deleted {{deleteModelTag}}": "Deleted {{deleteModelTag}}",
|
||||
"Deleted {{name}}": "",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "Description",
|
||||
"Didn't fully follow instructions": "",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Display username instead of You in Chat",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "",
|
||||
"Embedding Model Engine": "",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "Enable New Bark Ups",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "",
|
||||
"Enable Web Search Query Generation": "",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "Hide",
|
||||
"Host": "",
|
||||
"How can I help you today?": "How can I halp u today?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"ID": "",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "",
|
||||
"page": "",
|
||||
"Password": "Barkword",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "",
|
||||
"PDF Extract Images (OCR)": "PDF Extract Wowmages (OCR)",
|
||||
"pending": "pending",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "",
|
||||
"Pull a model from Ollama.com": "Pull a wowdel from Ollama.com",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "Query Bark",
|
||||
"RAG Template": "RAG Template",
|
||||
"Rating": "",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "",
|
||||
"Search options": "",
|
||||
"Search Prompts": "Search Prompts much wow",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Result Count": "",
|
||||
"Search the web": "",
|
||||
"Search Tools": "",
|
||||
@ -853,6 +865,8 @@
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
|
||||
"Thorough explanation": "",
|
||||
"Tika": "",
|
||||
@ -969,6 +983,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "",
|
||||
"a user": "",
|
||||
"About": "",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "",
|
||||
"Account Activation Pending": "",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "",
|
||||
"All chats": "",
|
||||
"All Documents": "",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"Already have an account?": "",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "",
|
||||
"and": "",
|
||||
"and {{COUNT}} more": "",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "",
|
||||
"Available list": "",
|
||||
"available!": "",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "",
|
||||
"Azure Region": "",
|
||||
"Back": "",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "",
|
||||
"Current Password": "",
|
||||
"Custom": "",
|
||||
"Customize models for a specific purpose": "",
|
||||
"Dark": "",
|
||||
"Database": "",
|
||||
"December": "",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "",
|
||||
"Delete a model": "",
|
||||
"Delete All Chats": "",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "",
|
||||
"Delete Chat": "",
|
||||
"Delete chat?": "",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "",
|
||||
"Deleted {{deleteModelTag}}": "",
|
||||
"Deleted {{name}}": "",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "",
|
||||
"Didn't fully follow instructions": "",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "",
|
||||
"Embedding Model Engine": "",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "",
|
||||
"Enable Web Search Query Generation": "",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "",
|
||||
"Host": "",
|
||||
"How can I help you today?": "",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"ID": "",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "",
|
||||
"page": "",
|
||||
"Password": "",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "",
|
||||
"PDF Extract Images (OCR)": "",
|
||||
"pending": "",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "",
|
||||
"Pull a model from Ollama.com": "",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "",
|
||||
"RAG Template": "",
|
||||
"Rating": "",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "",
|
||||
"Search options": "",
|
||||
"Search Prompts": "",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Result Count": "",
|
||||
"Search the web": "",
|
||||
"Search Tools": "",
|
||||
@ -851,6 +863,8 @@
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
|
||||
"Thorough explanation": "",
|
||||
"Tika": "",
|
||||
@ -967,6 +981,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "",
|
||||
"a user": "",
|
||||
"About": "",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "",
|
||||
"Account Activation Pending": "",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "",
|
||||
"All chats": "",
|
||||
"All Documents": "",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"Already have an account?": "",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "",
|
||||
"and": "",
|
||||
"and {{COUNT}} more": "",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "",
|
||||
"Available list": "",
|
||||
"available!": "",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "",
|
||||
"Azure Region": "",
|
||||
"Back": "",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "",
|
||||
"Current Password": "",
|
||||
"Custom": "",
|
||||
"Customize models for a specific purpose": "",
|
||||
"Dark": "",
|
||||
"Database": "",
|
||||
"December": "",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "",
|
||||
"Delete a model": "",
|
||||
"Delete All Chats": "",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "",
|
||||
"Delete Chat": "",
|
||||
"Delete chat?": "",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "",
|
||||
"Deleted {{deleteModelTag}}": "",
|
||||
"Deleted {{name}}": "",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "",
|
||||
"Didn't fully follow instructions": "",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "",
|
||||
"Embedding Model Engine": "",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "",
|
||||
"Enable Web Search Query Generation": "",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "",
|
||||
"Host": "",
|
||||
"How can I help you today?": "",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"ID": "",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "",
|
||||
"page": "",
|
||||
"Password": "",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "",
|
||||
"PDF Extract Images (OCR)": "",
|
||||
"pending": "",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "",
|
||||
"Pull a model from Ollama.com": "",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "",
|
||||
"RAG Template": "",
|
||||
"Rating": "",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "",
|
||||
"Search options": "",
|
||||
"Search Prompts": "",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Result Count": "",
|
||||
"Search the web": "",
|
||||
"Search Tools": "",
|
||||
@ -851,6 +863,8 @@
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
|
||||
"Thorough explanation": "",
|
||||
"Tika": "",
|
||||
@ -967,6 +981,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Un modelo de tareas se utiliza cuando se realizan tareas como la generación de títulos para chats y consultas de búsqueda web",
|
||||
"a user": "un usuario",
|
||||
"About": "Sobre nosotros",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "Cuenta",
|
||||
"Account Activation Pending": "Activación de cuenta pendiente",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "Parámetros avanzados",
|
||||
"All chats": "",
|
||||
"All Documents": "Todos los Documentos",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "Permitir Borrar Chats",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "Permitir interrupción de voz en llamada",
|
||||
"Already have an account?": "¿Ya tienes una cuenta?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "un asistente",
|
||||
"and": "y",
|
||||
"and {{COUNT}} more": "",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "La dirección URL de AUTOMATIC1111 es requerida.",
|
||||
"Available list": "Lista disponible",
|
||||
"available!": "¡disponible!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "",
|
||||
"Azure Region": "Región de Azure",
|
||||
"Back": "Volver",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "Clave de API de Brave Search",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "Desactivar la verificación SSL para sitios web",
|
||||
"Call": "Llamada",
|
||||
"Call feature is not supported when using Web STT engine": "La funcionalidad de llamada no puede usarse junto con el motor de STT Web",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "Modelo Actual",
|
||||
"Current Password": "Contraseña Actual",
|
||||
"Custom": "Personalizado",
|
||||
"Customize models for a specific purpose": "Personalizar modelos para un propósito específico",
|
||||
"Dark": "Oscuro",
|
||||
"Database": "Base de datos",
|
||||
"December": "Diciembre",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "Borrar",
|
||||
"Delete a model": "Borra un modelo",
|
||||
"Delete All Chats": "Eliminar todos los chats",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "Borrar chat",
|
||||
"Delete Chat": "Borrar Chat",
|
||||
"Delete chat?": "Borrar el chat?",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "Borrar Usuario",
|
||||
"Deleted {{deleteModelTag}}": "Se borró {{deleteModelTag}}",
|
||||
"Deleted {{name}}": "Eliminado {{nombre}}",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "Descripción",
|
||||
"Didn't fully follow instructions": "No siguió las instrucciones",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "Muestra Emoji en llamada",
|
||||
"Display the username instead of You in the Chat": "Mostrar el nombre de usuario en lugar de Usted en el chat",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "No instale funciones desde fuentes que no confíe totalmente.",
|
||||
"Do not install tools from sources you do not fully trust.": "No instale herramientas desde fuentes que no confíe totalmente.",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "Modelo de Embedding",
|
||||
"Embedding Model Engine": "Motor de Modelo de Embedding",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Modelo de Embedding configurado a \"{{embedding_model}}\"",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "Habilitar el uso compartido de la comunidad",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "Habilitar la calificación de los mensajes",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "Habilitar Nuevos Registros",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "Habilitar la búsqueda web",
|
||||
"Enable Web Search Query Generation": "Habilitar generación de consultas web",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "Esconder",
|
||||
"Host": "",
|
||||
"How can I help you today?": "¿Cómo puedo ayudarte hoy?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "Búsqueda Híbrida",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Aseguro que he leído y entiendo las implicaciones de mi acción. Estoy consciente de los riesgos asociados con la ejecución de código arbitrario y he verificado la confianza de la fuente.",
|
||||
"ID": "",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "Vista general",
|
||||
"page": "página",
|
||||
"Password": "Contraseña",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "PDF document (.pdf)",
|
||||
"PDF Extract Images (OCR)": "Extraer imágenes de PDF (OCR)",
|
||||
"pending": "pendiente",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Extraer \"{{searchValue}}\" de Ollama.com",
|
||||
"Pull a model from Ollama.com": "Obtener un modelo de Ollama.com",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "Parámetros de consulta",
|
||||
"RAG Template": "Plantilla de RAG",
|
||||
"Rating": "",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "Buscar Modelos",
|
||||
"Search options": "",
|
||||
"Search Prompts": "Buscar Prompts",
|
||||
"Search Query Generation Prompt": "Búsqueda de consulta de generación de prompts",
|
||||
"Search Result Count": "Recuento de resultados de búsqueda",
|
||||
"Search the web": "",
|
||||
"Search Tools": "Búsqueda de herramientas",
|
||||
@ -852,6 +864,8 @@
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "Esto eliminará",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Esto reseteará la base de conocimientos y sincronizará todos los archivos. ¿Desea continuar?",
|
||||
"Thorough explanation": "Explicación exhaustiva",
|
||||
"Tika": "Tika",
|
||||
@ -968,6 +982,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "Whisper (Local)",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "Modo de pantalla ancha",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "یک مدل وظیفه هنگام انجام وظایف مانند تولید عناوین برای چت ها و نمایش های جستجوی وب استفاده می شود.",
|
||||
"a user": "یک کاربر",
|
||||
"About": "درباره",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "حساب کاربری",
|
||||
"Account Activation Pending": "فعال\u200cسازی حساب در حال انتظار",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "پارام\u200cهای پیشرفته",
|
||||
"All chats": "همهٔ گفتگوها",
|
||||
"All Documents": "همهٔ سند\u200cها",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "اجازهٔ حذف گفتگو",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"Already have an account?": "از قبل حساب کاربری دارید؟",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "یک دستیار",
|
||||
"and": "و",
|
||||
"and {{COUNT}} more": "و {{COUNT}} مورد دیگر",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "به URL پایه AUTOMATIC1111 مورد نیاز است.",
|
||||
"Available list": "فهرست دردسترس",
|
||||
"available!": "در دسترس!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "سخنگوی هوش\u200cمصنوعی Azure",
|
||||
"Azure Region": "منطقهٔ Azure",
|
||||
"Back": "بازگشت",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "کلید API جستجوی شجاع",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "عبور از تأیید SSL برای وب سایت ها",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "مدل فعلی",
|
||||
"Current Password": "رمز عبور فعلی",
|
||||
"Custom": "دلخواه",
|
||||
"Customize models for a specific purpose": "سفارشی کردن مدل ها برای یک هدف خاص",
|
||||
"Dark": "تیره",
|
||||
"Database": "پایگاه داده",
|
||||
"December": "دسامبر",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "حذف",
|
||||
"Delete a model": "حذف یک مدل",
|
||||
"Delete All Chats": "حذف همه گفتگوها",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "حذف گپ",
|
||||
"Delete Chat": "حذف گپ",
|
||||
"Delete chat?": "",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "حذف کاربر",
|
||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} پاک شد",
|
||||
"Deleted {{name}}": "حذف شده {{name}}",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "توضیحات",
|
||||
"Didn't fully follow instructions": "نمی تواند دستورالعمل را کامل پیگیری کند",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "نمایش نام کاربری به جای «شما» در چت",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "مدل پیدائش",
|
||||
"Embedding Model Engine": "محرک مدل پیدائش",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "مدل پیدائش را به \"{{embedding_model}}\" تنظیم کنید",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "فعالسازی اشتراک انجمن",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "فعال کردن ثبت نام\u200cهای جدید",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "فعالسازی جستجوی وب",
|
||||
"Enable Web Search Query Generation": "",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "پنهان\u200cسازی",
|
||||
"Host": "",
|
||||
"How can I help you today?": "امروز چطور می توانم کمک تان کنم؟",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "جستجوی همزمان",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"ID": "",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "نمای کلی",
|
||||
"page": "صفحه",
|
||||
"Password": "رمز عبور",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "PDF سند (.pdf)",
|
||||
"PDF Extract Images (OCR)": "استخراج تصاویر از PDF (OCR)",
|
||||
"pending": "در انتظار",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "بازگرداندن \"{{searchValue}}\" از Ollama.com",
|
||||
"Pull a model from Ollama.com": "دریافت یک مدل از Ollama.com",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "پارامترهای پرس و جو",
|
||||
"RAG Template": "RAG الگوی",
|
||||
"Rating": "",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "جستجوی مدل\u200cها",
|
||||
"Search options": "",
|
||||
"Search Prompts": "جستجوی پرامپت\u200cها",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Result Count": "تعداد نتایج جستجو",
|
||||
"Search the web": "",
|
||||
"Search Tools": "ابزارهای جستجو",
|
||||
@ -851,6 +863,8 @@
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
|
||||
"Thorough explanation": "توضیح کامل",
|
||||
"Tika": "",
|
||||
@ -967,6 +981,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "حالت صفحهٔ عریض",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Tehtävämallia käytetään tehtävien suorittamiseen, kuten otsikoiden luomiseen keskusteluille ja verkkohakukyselyille",
|
||||
"a user": "käyttäjä",
|
||||
"About": "Tietoja",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "Tili",
|
||||
"Account Activation Pending": "",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "Edistyneet parametrit",
|
||||
"All chats": "",
|
||||
"All Documents": "Kaikki asiakirjat",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "Salli keskustelujen poisto",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"Already have an account?": "Onko sinulla jo tili?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "avustaja",
|
||||
"and": "ja",
|
||||
"and {{COUNT}} more": "",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111-perus-URL vaaditaan.",
|
||||
"Available list": "",
|
||||
"available!": "saatavilla!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "",
|
||||
"Azure Region": "",
|
||||
"Back": "Takaisin",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "Brave Search API -avain",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "Ohita SSL-varmennus verkkosivustoille",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "Nykyinen malli",
|
||||
"Current Password": "Nykyinen salasana",
|
||||
"Custom": "Mukautettu",
|
||||
"Customize models for a specific purpose": "Mallien mukauttaminen tiettyyn tarkoitukseen",
|
||||
"Dark": "Tumma",
|
||||
"Database": "Tietokanta",
|
||||
"December": "joulukuu",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "Poista",
|
||||
"Delete a model": "Poista malli",
|
||||
"Delete All Chats": "Poista kaikki keskustelut",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "Poista keskustelu",
|
||||
"Delete Chat": "Poista keskustelu",
|
||||
"Delete chat?": "",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "Poista käyttäjä",
|
||||
"Deleted {{deleteModelTag}}": "Poistettu {{deleteModelTag}}",
|
||||
"Deleted {{name}}": "Poistettu {{nimi}}",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "Kuvaus",
|
||||
"Didn't fully follow instructions": "Ei noudattanut ohjeita täysin",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Näytä käyttäjänimi keskustelussa",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "Upotusmalli",
|
||||
"Embedding Model Engine": "Upotusmallin moottori",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "\"{{embedding_model}}\" valittu upotusmalliksi",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "Ota yhteisön jakaminen käyttöön",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "Salli uudet rekisteröitymiset",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "Ota verkkohaku käyttöön",
|
||||
"Enable Web Search Query Generation": "",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "Piilota",
|
||||
"Host": "",
|
||||
"How can I help you today?": "Kuinka voin auttaa tänään?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "Hybridihaku",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"ID": "",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "",
|
||||
"page": "",
|
||||
"Password": "Salasana",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "PDF-tiedosto (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF-tiedoston kuvien erottelu (OCR)",
|
||||
"pending": "odottaa",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Lataa \"{{searchValue}}\" Ollama.comista",
|
||||
"Pull a model from Ollama.com": "Lataa malli Ollama.comista",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "Kyselyparametrit",
|
||||
"RAG Template": "RAG-malline",
|
||||
"Rating": "",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "Hae malleja",
|
||||
"Search options": "",
|
||||
"Search Prompts": "Hae kehotteita",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Result Count": "Hakutulosten määrä",
|
||||
"Search the web": "",
|
||||
"Search Tools": "",
|
||||
@ -851,6 +863,8 @@
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
|
||||
"Thorough explanation": "Perusteellinen selitys",
|
||||
"Tika": "",
|
||||
@ -967,6 +981,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Un modèle de tâche est utilisé lors de l’exécution de tâches telles que la génération de titres pour les conversations et les requêtes de recherche sur le web.",
|
||||
"a user": "un utilisateur",
|
||||
"About": "À propos",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "Compte",
|
||||
"Account Activation Pending": "Activation du compte en attente",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "Paramètres avancés",
|
||||
"All chats": "",
|
||||
"All Documents": "Tous les documents",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "Autoriser la suppression de l'historique de chat",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "Autoriser l'interruption vocale pendant un appel",
|
||||
"Already have an account?": "Avez-vous déjà un compte ?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "un assistant",
|
||||
"and": "et",
|
||||
"and {{COUNT}} more": "",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "L'URL de base {AUTOMATIC1111} est requise.",
|
||||
"Available list": "",
|
||||
"available!": "disponible !",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "",
|
||||
"Azure Region": "",
|
||||
"Back": "Retour en arrière",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "Clé API Brave Search",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "Bypasser la vérification SSL pour les sites web",
|
||||
"Call": "Appeler",
|
||||
"Call feature is not supported when using Web STT engine": "La fonction d'appel n'est pas prise en charge lors de l'utilisation du moteur Web STT",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "Modèle actuel amélioré",
|
||||
"Current Password": "Mot de passe actuel",
|
||||
"Custom": "Sur mesure",
|
||||
"Customize models for a specific purpose": "Personnaliser les modèles pour une fonction spécifique",
|
||||
"Dark": "Obscur",
|
||||
"Database": "Base de données",
|
||||
"December": "Décembre",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "Supprimer",
|
||||
"Delete a model": "Supprimer un modèle",
|
||||
"Delete All Chats": "Supprimer toutes les conversations",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "Supprimer la conversation",
|
||||
"Delete Chat": "Supprimer la Conversation",
|
||||
"Delete chat?": "Supprimer la conversation ?",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "Supprimer le compte d'utilisateur",
|
||||
"Deleted {{deleteModelTag}}": "Supprimé {{deleteModelTag}}",
|
||||
"Deleted {{name}}": "Supprimé {{name}}",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "Description",
|
||||
"Didn't fully follow instructions": "N'a pas entièrement respecté les instructions",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "Afficher les emojis pendant l'appel",
|
||||
"Display the username instead of You in the Chat": "Afficher le nom d'utilisateur à la place de \"Vous\" dans le Chat",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "Modèle d'embedding",
|
||||
"Embedding Model Engine": "Moteur de modèle d'encodage",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Modèle d'encodage défini sur « {{embedding_model}} »",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "Activer le partage communautaire",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "Activer les nouvelles inscriptions",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "Activer la recherche sur le Web",
|
||||
"Enable Web Search Query Generation": "",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "Cacher",
|
||||
"Host": "",
|
||||
"How can I help you today?": "Comment puis-je vous être utile aujourd'hui ?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "Recherche hybride",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"ID": "",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "",
|
||||
"page": "",
|
||||
"Password": "Mot de passe",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "Document au format PDF (.pdf)",
|
||||
"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
|
||||
"pending": "en attente",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Récupérer « {{searchValue}} » depuis Ollama.com",
|
||||
"Pull a model from Ollama.com": "Télécharger un modèle depuis Ollama.com",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "Paramètres de requête",
|
||||
"RAG Template": "Modèle RAG",
|
||||
"Rating": "",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "Rechercher des modèles",
|
||||
"Search options": "",
|
||||
"Search Prompts": "Recherche de prompts",
|
||||
"Search Query Generation Prompt": "Génération d'interrogation de recherche",
|
||||
"Search Result Count": "Nombre de résultats de recherche",
|
||||
"Search the web": "",
|
||||
"Search Tools": "Outils de recherche",
|
||||
@ -852,6 +864,8 @@
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "Cela supprimera",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
|
||||
"Thorough explanation": "Explication approfondie",
|
||||
"Tika": "Tika",
|
||||
@ -968,6 +982,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "Whisper (local)",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "Mode Grand Écran",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Un modèle de tâche est utilisé lors de l’exécution de tâches telles que la génération de titres pour les conversations et les requêtes de recherche sur le web.",
|
||||
"a user": "un utilisateur",
|
||||
"About": "À propos",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "Compte",
|
||||
"Account Activation Pending": "Activation du compte en attente",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "Paramètres avancés",
|
||||
"All chats": "Toutes les conversations",
|
||||
"All Documents": "Tous les documents",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "Autoriser la suppression de l'historique de chat",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "Autoriser l'interruption vocale pendant un appel",
|
||||
"Already have an account?": "Avez-vous déjà un compte ?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "un assistant",
|
||||
"and": "et",
|
||||
"and {{COUNT}} more": "et {{COUNT}} autres",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "L'URL de base {AUTOMATIC1111} est requise.",
|
||||
"Available list": "Liste disponible",
|
||||
"available!": "disponible !",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "Azure AI Speech",
|
||||
"Azure Region": "Région Azure",
|
||||
"Back": "Retour en arrière",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "Clé API Brave Search",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "Bypasser la vérification SSL pour les sites web",
|
||||
"Call": "Appeler",
|
||||
"Call feature is not supported when using Web STT engine": "La fonction d'appel n'est pas prise en charge lors de l'utilisation du moteur Web STT",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "Modèle actuel",
|
||||
"Current Password": "Mot de passe actuel",
|
||||
"Custom": "Sur mesure",
|
||||
"Customize models for a specific purpose": "Personnaliser les modèles pour un usage spécifique",
|
||||
"Dark": "Sombre",
|
||||
"Database": "Base de données",
|
||||
"December": "Décembre",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "Supprimer",
|
||||
"Delete a model": "Supprimer un modèle",
|
||||
"Delete All Chats": "Supprimer toutes les conversations",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "Supprimer la conversation",
|
||||
"Delete Chat": "Supprimer la Conversation",
|
||||
"Delete chat?": "Supprimer la conversation ?",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "Supprimer le compte d'utilisateur",
|
||||
"Deleted {{deleteModelTag}}": "Supprimé {{deleteModelTag}}",
|
||||
"Deleted {{name}}": "Supprimé {{name}}",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "Description",
|
||||
"Didn't fully follow instructions": "N'a pas entièrement respecté les instructions",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "Afficher les emojis pendant l'appel",
|
||||
"Display the username instead of You in the Chat": "Afficher le nom d'utilisateur à la place de \"Vous\" dans le chat",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "N'installez pas de fonctions provenant de sources auxquelles vous ne faites pas entièrement confiance.",
|
||||
"Do not install tools from sources you do not fully trust.": "N'installez pas d'outils provenant de sources auxquelles vous ne faites pas entièrement confiance.",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "Modèle d'embedding",
|
||||
"Embedding Model Engine": "Moteur de modèle d'embedding",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Modèle d'embedding défini sur « {{embedding_model}} »",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "Activer le partage communautaire",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "Activer l'évaluation des messages",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "Activer les nouvelles inscriptions",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "Activer la recherche Web",
|
||||
"Enable Web Search Query Generation": "Activer la génération de requêtes de recherche Web",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "Cacher",
|
||||
"Host": "",
|
||||
"How can I help you today?": "Comment puis-je vous aider aujourd'hui ?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "Recherche hybride",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Je reconnais avoir lu et compris les implications de mes actions. Je suis conscient des risques associés à l'exécution d'un code arbitraire et j'ai vérifié la fiabilité de la source.",
|
||||
"ID": "ID",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "Aperçu",
|
||||
"page": "page",
|
||||
"Password": "Mot de passe",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "Document au format PDF (.pdf)",
|
||||
"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
|
||||
"pending": "en attente",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Récupérer « {{searchValue}} » depuis Ollama.com",
|
||||
"Pull a model from Ollama.com": "Télécharger un modèle depuis Ollama.com",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "Paramètres de requête",
|
||||
"RAG Template": "Modèle RAG",
|
||||
"Rating": "Note",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "Rechercher des modèles",
|
||||
"Search options": "",
|
||||
"Search Prompts": "Rechercher des prompts",
|
||||
"Search Query Generation Prompt": "Rechercher des prompts de génération de requête",
|
||||
"Search Result Count": "Nombre de résultats de recherche",
|
||||
"Search the web": "",
|
||||
"Search Tools": "Rechercher des outils",
|
||||
@ -852,6 +864,8 @@
|
||||
"This response was generated by \"{{model}}\"": "Cette réponse a été générée par \"{{model}}\"",
|
||||
"This will delete": "Cela supprimera",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "Cela supprimera <strong>{{NAME}}</strong> et <strong>tout son contenu</strong>.",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Cela réinitialisera la base de connaissances et synchronisera tous les fichiers. Souhaitez-vous continuer ?",
|
||||
"Thorough explanation": "Explication approfondie",
|
||||
"Tika": "Tika",
|
||||
@ -968,6 +982,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "Whisper (local)",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "Mode grand écran",
|
||||
"Won": "Gagné",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "מודל משימה משמש בעת ביצוע משימות כגון יצירת כותרות עבור צ'אטים ושאילתות חיפוש באינטרנט",
|
||||
"a user": "משתמש",
|
||||
"About": "אודות",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "חשבון",
|
||||
"Account Activation Pending": "",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "פרמטרים מתקדמים",
|
||||
"All chats": "",
|
||||
"All Documents": "כל המסמכים",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "אפשר מחיקת צ'אט",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"Already have an account?": "כבר יש לך חשבון?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "עוזר",
|
||||
"and": "וגם",
|
||||
"and {{COUNT}} more": "",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "נדרשת כתובת URL בסיסית של AUTOMATIC1111",
|
||||
"Available list": "",
|
||||
"available!": "זמין!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "",
|
||||
"Azure Region": "",
|
||||
"Back": "חזור",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "מפתח API של חיפוש אמיץ",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "עקוף אימות SSL עבור אתרים",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "המודל הנוכחי",
|
||||
"Current Password": "הסיסמה הנוכחית",
|
||||
"Custom": "מותאם אישית",
|
||||
"Customize models for a specific purpose": "התאמה אישית של מודלים למטרה ספציפית",
|
||||
"Dark": "כהה",
|
||||
"Database": "מסד נתונים",
|
||||
"December": "דצמבר",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "מחק",
|
||||
"Delete a model": "מחק מודל",
|
||||
"Delete All Chats": "מחק את כל הצ'אטים",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "מחק צ'אט",
|
||||
"Delete Chat": "מחק צ'אט",
|
||||
"Delete chat?": "",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "מחק משתמש",
|
||||
"Deleted {{deleteModelTag}}": "נמחק {{deleteModelTag}}",
|
||||
"Deleted {{name}}": "נמחק {{name}}",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "תיאור",
|
||||
"Didn't fully follow instructions": "לא עקב אחרי ההוראות באופן מלא",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "הצג את שם המשתמש במקום 'אתה' בצ'אט",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "מודל הטמעה",
|
||||
"Embedding Model Engine": "מנוע מודל הטמעה",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "מודל ההטמעה הוגדר ל-\"{{embedding_model}}\"",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "הפיכת שיתוף קהילה לזמין",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "אפשר הרשמות חדשות",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "הפיכת חיפוש באינטרנט לזמין",
|
||||
"Enable Web Search Query Generation": "",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "הסתר",
|
||||
"Host": "",
|
||||
"How can I help you today?": "כיצד אוכל לעזור לך היום?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "חיפוש היברידי",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"ID": "",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "",
|
||||
"page": "",
|
||||
"Password": "סיסמה",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "מסמך PDF (.pdf)",
|
||||
"PDF Extract Images (OCR)": "חילוץ תמונות מ-PDF (OCR)",
|
||||
"pending": "ממתין",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "משוך \"{{searchValue}}\" מ-Ollama.com",
|
||||
"Pull a model from Ollama.com": "משוך מודל מ-Ollama.com",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "פרמטרי שאילתה",
|
||||
"RAG Template": "תבנית RAG",
|
||||
"Rating": "",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "חיפוש מודלים",
|
||||
"Search options": "",
|
||||
"Search Prompts": "חפש פקודות",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Result Count": "ספירת תוצאות חיפוש",
|
||||
"Search the web": "",
|
||||
"Search Tools": "",
|
||||
@ -852,6 +864,8 @@
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
|
||||
"Thorough explanation": "תיאור מפורט",
|
||||
"Tika": "",
|
||||
@ -968,6 +982,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "चैट और वेब खोज क्वेरी के लिए शीर्षक उत्पन्न करने जैसे कार्य करते समय कार्य मॉडल का उपयोग किया जाता है",
|
||||
"a user": "एक उपयोगकर्ता",
|
||||
"About": "हमारे बारे में",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "खाता",
|
||||
"Account Activation Pending": "",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "उन्नत परम",
|
||||
"All chats": "",
|
||||
"All Documents": "सभी डॉक्यूमेंट्स",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "चैट हटाने की अनुमति दें",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"Already have an account?": "क्या आपके पास पहले से एक खाता मौजूद है?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "एक सहायक",
|
||||
"and": "और",
|
||||
"and {{COUNT}} more": "",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 का बेस यूआरएल आवश्यक है।",
|
||||
"Available list": "",
|
||||
"available!": "उपलब्ध!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "",
|
||||
"Azure Region": "",
|
||||
"Back": "पीछे",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "Brave सर्च एपीआई कुंजी",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "वेबसाइटों के लिए SSL सुनिश्चिती को छोड़ें",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "वर्तमान मॉडल",
|
||||
"Current Password": "वर्तमान पासवर्ड",
|
||||
"Custom": "कस्टम संस्करण",
|
||||
"Customize models for a specific purpose": "एक विशिष्ट उद्देश्य के लिए मॉडल अनुकूलित करें",
|
||||
"Dark": "डार्क",
|
||||
"Database": "डेटाबेस",
|
||||
"December": "डिसेंबर",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "डिलीट",
|
||||
"Delete a model": "एक मॉडल हटाएँ",
|
||||
"Delete All Chats": "सभी चैट हटाएं",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "चैट हटाएं",
|
||||
"Delete Chat": "चैट हटाएं",
|
||||
"Delete chat?": "",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "उपभोक्ता मिटायें",
|
||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} हटा दिया गया",
|
||||
"Deleted {{name}}": "{{name}} हटा दिया गया",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "विवरण",
|
||||
"Didn't fully follow instructions": "निर्देशों का पूरी तरह से पालन नहीं किया",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "चैट में 'आप' के स्थान पर उपयोगकर्ता नाम प्रदर्शित करें",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "मॉडेल अनुकूलन",
|
||||
"Embedding Model Engine": "एंबेडिंग मॉडल इंजन",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "एम्बेडिंग मॉडल को \"{{embedding_model}}\" पर सेट किया गया",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "समुदाय साझाकरण सक्षम करें",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "नए साइन अप सक्रिय करें",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "वेब खोज सक्षम करें",
|
||||
"Enable Web Search Query Generation": "",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "छुपाएं",
|
||||
"Host": "",
|
||||
"How can I help you today?": "आज मैं आपकी कैसे मदद कर सकता हूँ?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "हाइब्रिड खोज",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"ID": "",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "",
|
||||
"page": "",
|
||||
"Password": "पासवर्ड",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "PDF दस्तावेज़ (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF छवियाँ निकालें (OCR)",
|
||||
"pending": "लंबित",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "\"{{searchValue}}\" को Ollama.com से खींचें",
|
||||
"Pull a model from Ollama.com": "Ollama.com से एक मॉडल खींचें",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "क्वेरी पैरामीटर",
|
||||
"RAG Template": "RAG टेम्पलेट",
|
||||
"Rating": "",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "मॉडल खोजें",
|
||||
"Search options": "",
|
||||
"Search Prompts": "प्रॉम्प्ट खोजें",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Result Count": "खोज परिणामों की संख्या",
|
||||
"Search the web": "",
|
||||
"Search Tools": "",
|
||||
@ -851,6 +863,8 @@
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
|
||||
"Thorough explanation": "विस्तृत व्याख्या",
|
||||
"Tika": "",
|
||||
@ -967,6 +981,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Model zadatka koristi se pri izvođenju zadataka kao što su generiranje naslova za razgovore i upite za pretraživanje weba",
|
||||
"a user": "korisnik",
|
||||
"About": "O aplikaciji",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "Račun",
|
||||
"Account Activation Pending": "",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "Napredni parametri",
|
||||
"All chats": "",
|
||||
"All Documents": "Svi dokumenti",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "Dopusti brisanje razgovora",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"Already have an account?": "Već imate račun?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "asistent",
|
||||
"and": "i",
|
||||
"and {{COUNT}} more": "",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "Potreban je AUTOMATIC1111 osnovni URL.",
|
||||
"Available list": "",
|
||||
"available!": "dostupno!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "",
|
||||
"Azure Region": "",
|
||||
"Back": "Natrag",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "Brave tražilica - API ključ",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "Zaobiđi SSL provjeru za web stranice",
|
||||
"Call": "Poziv",
|
||||
"Call feature is not supported when using Web STT engine": "Značajka poziva nije podržana kada se koristi Web STT mehanizam",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "Trenutni model",
|
||||
"Current Password": "Trenutna lozinka",
|
||||
"Custom": "Prilagođeno",
|
||||
"Customize models for a specific purpose": "Prilagodba modela za određenu svrhu",
|
||||
"Dark": "Tamno",
|
||||
"Database": "Baza podataka",
|
||||
"December": "Prosinac",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "Izbriši",
|
||||
"Delete a model": "Izbriši model",
|
||||
"Delete All Chats": "Izbriši sve razgovore",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "Izbriši razgovor",
|
||||
"Delete Chat": "Izbriši razgovor",
|
||||
"Delete chat?": "",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "Izbriši korisnika",
|
||||
"Deleted {{deleteModelTag}}": "Izbrisan {{deleteModelTag}}",
|
||||
"Deleted {{name}}": "Izbrisano {{name}}",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "Opis",
|
||||
"Didn't fully follow instructions": "Nije u potpunosti slijedio upute",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Prikaži korisničko ime umjesto Vas u razgovoru",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "Embedding model",
|
||||
"Embedding Model Engine": "Embedding model pogon",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Embedding model postavljen na \"{{embedding_model}}\"",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "Omogući zajedničko korištenje zajednice",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "Omogući nove prijave",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "Omogući pretraživanje weba",
|
||||
"Enable Web Search Query Generation": "",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "Sakrij",
|
||||
"Host": "",
|
||||
"How can I help you today?": "Kako vam mogu pomoći danas?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "Hibridna pretraga",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"ID": "",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "",
|
||||
"page": "",
|
||||
"Password": "Lozinka",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "PDF dokument (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF izdvajanje slika (OCR)",
|
||||
"pending": "u tijeku",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Povucite \"{{searchValue}}\" s Ollama.com",
|
||||
"Pull a model from Ollama.com": "Povucite model s Ollama.com",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "Parametri upita",
|
||||
"RAG Template": "RAG predložak",
|
||||
"Rating": "",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "Pretražite modele",
|
||||
"Search options": "",
|
||||
"Search Prompts": "Pretraga prompta",
|
||||
"Search Query Generation Prompt": "Upit za generiranje upita za pretraživanje",
|
||||
"Search Result Count": "Broj rezultata pretraživanja",
|
||||
"Search the web": "",
|
||||
"Search Tools": "Alati za pretraživanje",
|
||||
@ -852,6 +864,8 @@
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
|
||||
"Thorough explanation": "Detaljno objašnjenje",
|
||||
"Tika": "",
|
||||
@ -968,6 +982,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "Whisper (lokalno)",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "Mod širokog zaslona",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "A feladat modell olyan feladatokhoz használatos, mint a beszélgetések címeinek generálása és webes keresési lekérdezések",
|
||||
"a user": "egy felhasználó",
|
||||
"About": "Névjegy",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "Fiók",
|
||||
"Account Activation Pending": "Fiók aktiválása folyamatban",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "Haladó paraméterek",
|
||||
"All chats": "Minden beszélgetés",
|
||||
"All Documents": "Minden dokumentum",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "Beszélgetések törlésének engedélyezése",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "Hang megszakítás engedélyezése hívás közben",
|
||||
"Already have an account?": "Már van fiókod?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "egy asszisztens",
|
||||
"and": "és",
|
||||
"and {{COUNT}} more": "és még {{COUNT}} db",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 alap URL szükséges.",
|
||||
"Available list": "Elérhető lista",
|
||||
"available!": "elérhető!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "Azure AI beszéd",
|
||||
"Azure Region": "Azure régió",
|
||||
"Back": "Vissza",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "Brave Search API kulcs",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "SSL ellenőrzés kihagyása weboldalakhoz",
|
||||
"Call": "Hívás",
|
||||
"Call feature is not supported when using Web STT engine": "A hívás funkció nem támogatott Web STT motor használatakor",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "Jelenlegi modell",
|
||||
"Current Password": "Jelenlegi jelszó",
|
||||
"Custom": "Egyéni",
|
||||
"Customize models for a specific purpose": "Modellek testreszabása specifikus célra",
|
||||
"Dark": "Sötét",
|
||||
"Database": "Adatbázis",
|
||||
"December": "December",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "Törlés",
|
||||
"Delete a model": "Modell törlése",
|
||||
"Delete All Chats": "Minden beszélgetés törlése",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "Beszélgetés törlése",
|
||||
"Delete Chat": "Beszélgetés törlése",
|
||||
"Delete chat?": "Törli a beszélgetést?",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "Felhasználó törlése",
|
||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} törölve",
|
||||
"Deleted {{name}}": "{{name}} törölve",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "Leírás",
|
||||
"Didn't fully follow instructions": "Nem követte teljesen az utasításokat",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "Emoji megjelenítése hívásban",
|
||||
"Display the username instead of You in the Chat": "Felhasználónév megjelenítése a 'Te' helyett a beszélgetésben",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "Ne telepíts funkciókat olyan forrásokból, amelyekben nem bízol teljesen.",
|
||||
"Do not install tools from sources you do not fully trust.": "Ne telepíts eszközöket olyan forrásokból, amelyekben nem bízol teljesen.",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "Beágyazási modell",
|
||||
"Embedding Model Engine": "Beágyazási modell motor",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Beágyazási modell beállítva: \"{{embedding_model}}\"",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "Közösségi megosztás engedélyezése",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "Üzenet értékelés engedélyezése",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "Új regisztrációk engedélyezése",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "Webes keresés engedélyezése",
|
||||
"Enable Web Search Query Generation": "Webes keresési lekérdezés generálás engedélyezése",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "Elrejtés",
|
||||
"Host": "",
|
||||
"How can I help you today?": "Hogyan segíthetek ma?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "Hibrid keresés",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Elismerem, hogy elolvastam és megértem a cselekedetem következményeit. Tisztában vagyok a tetszőleges kód végrehajtásával járó kockázatokkal, és ellenőriztem a forrás megbízhatóságát.",
|
||||
"ID": "Azonosító",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "Áttekintés",
|
||||
"page": "oldal",
|
||||
"Password": "Jelszó",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "PDF dokumentum (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF képek kinyerése (OCR)",
|
||||
"pending": "függőben",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "\"{{searchValue}}\" letöltése az Ollama.com-ról",
|
||||
"Pull a model from Ollama.com": "Modell letöltése az Ollama.com-ról",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "Lekérdezési paraméterek",
|
||||
"RAG Template": "RAG sablon",
|
||||
"Rating": "Értékelés",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "Modellek keresése",
|
||||
"Search options": "",
|
||||
"Search Prompts": "Promptok keresése",
|
||||
"Search Query Generation Prompt": "Keresési lekérdezés generálási prompt",
|
||||
"Search Result Count": "Keresési találatok száma",
|
||||
"Search the web": "",
|
||||
"Search Tools": "Eszközök keresése",
|
||||
@ -851,6 +863,8 @@
|
||||
"This response was generated by \"{{model}}\"": "Ezt a választ a \"{{model}}\" generálta",
|
||||
"This will delete": "Ez törölni fogja",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "Ez törölni fogja a <strong>{{NAME}}</strong>-t és <strong>minden tartalmát</strong>.",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Ez visszaállítja a tudásbázist és szinkronizálja az összes fájlt. Szeretné folytatni?",
|
||||
"Thorough explanation": "Alapos magyarázat",
|
||||
"Tika": "Tika",
|
||||
@ -967,6 +981,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "Whisper (helyi)",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "Szélesvásznú mód",
|
||||
"Won": "Nyert",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Model tugas digunakan saat melakukan tugas seperti membuat judul untuk obrolan dan kueri penelusuran web",
|
||||
"a user": "seorang pengguna",
|
||||
"About": "Tentang",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "Akun",
|
||||
"Account Activation Pending": "Aktivasi Akun Tertunda",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "Parameter Lanjutan",
|
||||
"All chats": "",
|
||||
"All Documents": "Semua Dokumen",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "Izinkan Penghapusan Obrolan",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "Izinkan Gangguan Suara dalam Panggilan",
|
||||
"Already have an account?": "Sudah memiliki akun?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "asisten",
|
||||
"and": "dan",
|
||||
"and {{COUNT}} more": "",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 URL Dasar diperlukan.",
|
||||
"Available list": "",
|
||||
"available!": "tersedia!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "",
|
||||
"Azure Region": "",
|
||||
"Back": "Kembali",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "Kunci API Pencarian Berani",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "Lewati verifikasi SSL untuk Situs Web",
|
||||
"Call": "Panggilan",
|
||||
"Call feature is not supported when using Web STT engine": "Fitur panggilan tidak didukung saat menggunakan mesin Web STT",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "Model Saat Ini",
|
||||
"Current Password": "Kata Sandi Saat Ini",
|
||||
"Custom": "Kustom",
|
||||
"Customize models for a specific purpose": "Menyesuaikan model untuk tujuan tertentu",
|
||||
"Dark": "Gelap",
|
||||
"Database": "Basis data",
|
||||
"December": "Desember",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "Menghapus",
|
||||
"Delete a model": "Menghapus model",
|
||||
"Delete All Chats": "Menghapus Semua Obrolan",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "Menghapus obrolan",
|
||||
"Delete Chat": "Menghapus Obrolan",
|
||||
"Delete chat?": "Menghapus obrolan?",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "Menghapus Pengguna",
|
||||
"Deleted {{deleteModelTag}}": "Menghapus {{deleteModelTag}}",
|
||||
"Deleted {{name}}": "Menghapus {{name}}",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "Deskripsi",
|
||||
"Didn't fully follow instructions": "Tidak sepenuhnya mengikuti instruksi",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "Menampilkan Emoji dalam Panggilan",
|
||||
"Display the username instead of You in the Chat": "Menampilkan nama pengguna, bukan Anda di Obrolan",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "Model Penyematan",
|
||||
"Embedding Model Engine": "Mesin Model Penyematan",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Model penyematan diatur ke \"{{embedding_model}}\"",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "Aktifkan Berbagi Komunitas",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "Aktifkan Pendaftaran Baru",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "Aktifkan Pencarian Web",
|
||||
"Enable Web Search Query Generation": "",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "Sembunyikan",
|
||||
"Host": "",
|
||||
"How can I help you today?": "Ada yang bisa saya bantu hari ini?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "Pencarian Hibrida",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"ID": "",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "",
|
||||
"page": "",
|
||||
"Password": "Kata sandi",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "Dokumen PDF (.pdf)",
|
||||
"PDF Extract Images (OCR)": "Ekstrak Gambar PDF (OCR)",
|
||||
"pending": "tertunda",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Tarik \"{{searchValue}}\" dari Ollama.com",
|
||||
"Pull a model from Ollama.com": "Tarik model dari Ollama.com",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "Parameter Kueri",
|
||||
"RAG Template": "Templat RAG",
|
||||
"Rating": "",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "Cari Model",
|
||||
"Search options": "",
|
||||
"Search Prompts": "Perintah Pencarian",
|
||||
"Search Query Generation Prompt": "Permintaan Pembuatan Kueri Pencarian",
|
||||
"Search Result Count": "Jumlah Hasil Pencarian",
|
||||
"Search the web": "",
|
||||
"Search Tools": "Alat Pencarian",
|
||||
@ -851,6 +863,8 @@
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "Ini akan menghapus",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
|
||||
"Thorough explanation": "Penjelasan menyeluruh",
|
||||
"Tika": "",
|
||||
@ -967,6 +981,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "Bisikan (Lokal)",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "Mode Layar Lebar",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Úsáidtear samhail tasc agus tascanna á ndéanamh agat mar theidil a ghiniúint do chomhráite agus ceisteanna cuardaigh gréasáin",
|
||||
"a user": "úsáideoir",
|
||||
"About": "Maidir",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "Cuntas",
|
||||
"Account Activation Pending": "Gníomhachtaithe Cuntas",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "Paraiméid Casta",
|
||||
"All chats": "Gach comhrá",
|
||||
"All Documents": "Gach Doiciméad",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "Cead Scriosadh Comhrá",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "Ceadaigh Briseadh Guth i nGlao",
|
||||
"Already have an account?": "Tá cuntas agat cheana féin?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "cúntóir",
|
||||
"and": "agus",
|
||||
"and {{COUNT}} more": "agus {{COUNT}} eile",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "Tá URL bonn UATHOMATIC1111 ag teastáil.",
|
||||
"Available list": "Liosta atá ar fáil",
|
||||
"available!": "ar fáil!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "Óráid Azure AI",
|
||||
"Azure Region": "Réigiún Azure",
|
||||
"Back": "Ar ais",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "Eochair API Cuardaigh Brave",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "Seachbhachtar fíorú SSL do Láithreáin",
|
||||
"Call": "Glaoigh",
|
||||
"Call feature is not supported when using Web STT engine": "Ní thacaítear le gné glaonna agus inneall Web STT á úsáid",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "Samhail Reatha",
|
||||
"Current Password": "Pasfhocal Reatha",
|
||||
"Custom": "Saincheaptha",
|
||||
"Customize models for a specific purpose": "Múnla a shaincheapadh chun críche ar leith",
|
||||
"Dark": "Dorcha",
|
||||
"Database": "Bunachar Sonraí",
|
||||
"December": "Nollaig",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "Scrios",
|
||||
"Delete a model": "Scrios samhail",
|
||||
"Delete All Chats": "Scrios Gach Comhrá",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "Scrios comhrá",
|
||||
"Delete Chat": "Scrios Comhrá",
|
||||
"Delete chat?": "Scrios comhrá?",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "Scrios Úsáideoir",
|
||||
"Deleted {{deleteModelTag}}": "Scriosta {{deleteModelTag}}",
|
||||
"Deleted {{name}}": "Scriosta {{name}}",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "Cur síos",
|
||||
"Didn't fully follow instructions": "Níor lean sé treoracha go hiomlán",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "Taispeáin Emoji i nGlao",
|
||||
"Display the username instead of You in the Chat": "Taispeáin an t-ainm úsáideora in ionad Tú sa Comhrá",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "Ná suiteáil feidhmeanna ó fhoinsí nach bhfuil muinín iomlán agat.",
|
||||
"Do not install tools from sources you do not fully trust.": "Ná suiteáil uirlisí ó fhoinsí nach bhfuil muinín iomlán agat.",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "Múnla Leabháilte",
|
||||
"Embedding Model Engine": "Inneall Múnla Ionchorprú",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Samhail leabaithe atá socraithe go \"{{embedding_model}}\"",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "Cumasaigh Comhroinnt Pobail",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "Cumasaigh Rátáil Teachtai",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "Cumasaigh Clárúcháin Nua",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "Cumasaigh Cuardach Gréasáin",
|
||||
"Enable Web Search Query Generation": "Cumasaigh Giniúint Ceist Cuardaigh Gréasáin",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "Folaigh",
|
||||
"Host": "",
|
||||
"How can I help you today?": "Conas is féidir liom cabhrú leat inniu?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "Cuardach Hibrideach",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Admhaím gur léigh mé agus tuigim impleachtaí mo ghníomhaíochta. Táim ar an eolas faoi na rioscaí a bhaineann le cód treallach a fhorghníomhú agus tá iontaofacht na foinse fíoraithe agam.",
|
||||
"ID": "ID",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "Forbhreathnú",
|
||||
"page": "leathanach",
|
||||
"Password": "Pasfhocal",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "Doiciméad PDF (.pdf)",
|
||||
"PDF Extract Images (OCR)": "Íomhánna Sliocht PDF (OCR)",
|
||||
"pending": "ar feitheamh",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Tarraing \"{{searchValue}}\" ó Ollama.com",
|
||||
"Pull a model from Ollama.com": "Tarraing múnla ó Ollama.com",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "Fiosrúcháin Params",
|
||||
"RAG Template": "Teimpléad RAG",
|
||||
"Rating": "Rátáil",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "Múnlaí Cuardaigh",
|
||||
"Search options": "",
|
||||
"Search Prompts": "Leideanna Cuardaigh",
|
||||
"Search Query Generation Prompt": "Pras Giniúint Ceist Cuardaigh",
|
||||
"Search Result Count": "Líon Torthaí Cuardaigh",
|
||||
"Search the web": "",
|
||||
"Search Tools": "Uirlisí Cuardaigh",
|
||||
@ -851,6 +863,8 @@
|
||||
"This response was generated by \"{{model}}\"": "Gin an freagra seo ag \"{{model}}\"",
|
||||
"This will delete": "Scriosfaidh sé seo",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "Scriosfaidh sé seo <strong>{{NAME}}</strong> agus <strong>a bhfuil ann go léir</strong>.",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Déanfaidh sé seo an bonn eolais a athshocrú agus gach comhad a shioncronú. Ar mhaith leat leanúint ar aghaidh?",
|
||||
"Thorough explanation": "Míniú críochnúil",
|
||||
"Tika": "Tika",
|
||||
@ -967,6 +981,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "Whisper (Áitiúil)",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "Mód Leathanscáileán",
|
||||
"Won": "Bhuaigh",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Un modello di attività viene utilizzato durante l'esecuzione di attività come la generazione di titoli per chat e query di ricerca Web",
|
||||
"a user": "un utente",
|
||||
"About": "Informazioni",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "Account",
|
||||
"Account Activation Pending": "",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "Parametri avanzati",
|
||||
"All chats": "",
|
||||
"All Documents": "Tutti i documenti",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "Consenti l'eliminazione della chat",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"Already have an account?": "Hai già un account?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "un assistente",
|
||||
"and": "e",
|
||||
"and {{COUNT}} more": "",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "L'URL base AUTOMATIC1111 è obbligatorio.",
|
||||
"Available list": "",
|
||||
"available!": "disponibile!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "",
|
||||
"Azure Region": "",
|
||||
"Back": "Indietro",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "Chiave API di ricerca Brave",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "Aggira la verifica SSL per i siti web",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "Modello corrente",
|
||||
"Current Password": "Password corrente",
|
||||
"Custom": "Personalizzato",
|
||||
"Customize models for a specific purpose": "Personalizza i modelli per uno scopo specifico",
|
||||
"Dark": "Scuro",
|
||||
"Database": "Database",
|
||||
"December": "Dicembre",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "Elimina",
|
||||
"Delete a model": "Elimina un modello",
|
||||
"Delete All Chats": "Elimina tutte le chat",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "Elimina chat",
|
||||
"Delete Chat": "Elimina chat",
|
||||
"Delete chat?": "",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "Elimina utente",
|
||||
"Deleted {{deleteModelTag}}": "Eliminato {{deleteModelTag}}",
|
||||
"Deleted {{name}}": "Eliminato {{name}}",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "Descrizione",
|
||||
"Didn't fully follow instructions": "Non ha seguito completamente le istruzioni",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Visualizza il nome utente invece di Tu nella chat",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "Modello di embedding",
|
||||
"Embedding Model Engine": "Motore del modello di embedding",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Modello di embedding impostato su \"{{embedding_model}}\"",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "Abilita la condivisione della community",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "Abilita nuove iscrizioni",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "Abilita ricerca Web",
|
||||
"Enable Web Search Query Generation": "",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "Nascondi",
|
||||
"Host": "",
|
||||
"How can I help you today?": "Come posso aiutarti oggi?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "Ricerca ibrida",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"ID": "",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "",
|
||||
"page": "",
|
||||
"Password": "Password",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "Documento PDF (.pdf)",
|
||||
"PDF Extract Images (OCR)": "Estrazione immagini PDF (OCR)",
|
||||
"pending": "in sospeso",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Estrai \"{{searchValue}}\" da Ollama.com",
|
||||
"Pull a model from Ollama.com": "Estrai un modello da Ollama.com",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "Parametri query",
|
||||
"RAG Template": "Modello RAG",
|
||||
"Rating": "",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "Cerca modelli",
|
||||
"Search options": "",
|
||||
"Search Prompts": "Cerca prompt",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Result Count": "Conteggio dei risultati della ricerca",
|
||||
"Search the web": "",
|
||||
"Search Tools": "",
|
||||
@ -852,6 +864,8 @@
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
|
||||
"Thorough explanation": "Spiegazione dettagliata",
|
||||
"Tika": "",
|
||||
@ -968,6 +982,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "タスクモデルは、チャットやウェブ検索クエリのタイトルの生成などのタスクを実行するときに使用されます",
|
||||
"a user": "ユーザー",
|
||||
"About": "概要",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "アカウント",
|
||||
"Account Activation Pending": "アカウント承認待ち",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "高度なパラメータ",
|
||||
"All chats": "",
|
||||
"All Documents": "全てのドキュメント",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "チャットの削除を許可",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "通話中に音声の割り込みを許可",
|
||||
"Already have an account?": "すでにアカウントをお持ちですか?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "アシスタント",
|
||||
"and": "および",
|
||||
"and {{COUNT}} more": "",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 ベース URL が必要です。",
|
||||
"Available list": "利用可能リスト",
|
||||
"available!": "利用可能!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "AzureAIスピーチ",
|
||||
"Azure Region": "Azureリージョン",
|
||||
"Back": "戻る",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "Brave Search APIキー",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "SSL 検証をバイパスする",
|
||||
"Call": "コール",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "現在のモデル",
|
||||
"Current Password": "現在のパスワード",
|
||||
"Custom": "カスタム",
|
||||
"Customize models for a specific purpose": "特定の目的に合わせてモデルをカスタマイズする",
|
||||
"Dark": "ダーク",
|
||||
"Database": "データベース",
|
||||
"December": "12月",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "削除",
|
||||
"Delete a model": "モデルを削除",
|
||||
"Delete All Chats": "すべてのチャットを削除",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "チャットを削除",
|
||||
"Delete Chat": "チャットを削除",
|
||||
"Delete chat?": "チャットを削除しますか?",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "ユーザーを削除",
|
||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} を削除しました",
|
||||
"Deleted {{name}}": "{{name}}を削除しました",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "説明",
|
||||
"Didn't fully follow instructions": "説明に沿って操作していませんでした",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "コールで絵文字を表示",
|
||||
"Display the username instead of You in the Chat": "チャットで「あなた」の代わりにユーザー名を表示",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "信頼できないソースからFunctionをインストールしないでください。",
|
||||
"Do not install tools from sources you do not fully trust.": "信頼出来ないソースからツールをインストールしないでください。",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "埋め込みモデル",
|
||||
"Embedding Model Engine": "埋め込みモデルエンジン",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "埋め込みモデルを\"{{embedding_model}}\"に設定しました",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "コミュニティ共有を有効にする",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "メッセージ評価を有効にする",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "新規登録を有効にする",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "ウェブ検索を有効にする",
|
||||
"Enable Web Search Query Generation": "ウェブ検索クエリ生成を有効にする",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "非表示",
|
||||
"Host": "",
|
||||
"How can I help you today?": "今日はどのようにお手伝いしましょうか?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "ブリッジ検索",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"ID": "",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "",
|
||||
"page": "",
|
||||
"Password": "パスワード",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "PDF ドキュメント (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF 画像抽出 (OCR)",
|
||||
"pending": "保留中",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Ollama.com から \"{{searchValue}}\" をプル",
|
||||
"Pull a model from Ollama.com": "Ollama.com からモデルをプル",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "クエリパラメーター",
|
||||
"RAG Template": "RAG テンプレート",
|
||||
"Rating": "",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "モデル検索",
|
||||
"Search options": "",
|
||||
"Search Prompts": "プロンプトを検索",
|
||||
"Search Query Generation Prompt": "検索クエリ生成プロンプト",
|
||||
"Search Result Count": "検索結果数",
|
||||
"Search the web": "",
|
||||
"Search Tools": "ツールの検索",
|
||||
@ -850,6 +862,8 @@
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
|
||||
"Thorough explanation": "詳細な説明",
|
||||
"Tika": "",
|
||||
@ -966,6 +980,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "ワイドスクリーンモード",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
@ -11,6 +11,8 @@
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "დავალების მოდელი გამოიყენება ისეთი ამოცანების შესრულებისას, როგორიცაა ჩეთების სათაურების გენერირება და ვებ – ძიების მოთხოვნები",
|
||||
"a user": "მომხმარებელი",
|
||||
"About": "შესახებ",
|
||||
"Access": "",
|
||||
"Access Control": "",
|
||||
"Accessible to all users": "",
|
||||
"Account": "ანგარიში",
|
||||
"Account Activation Pending": "",
|
||||
@ -46,6 +48,7 @@
|
||||
"Advanced Params": "მოწინავე პარამები",
|
||||
"All chats": "",
|
||||
"All Documents": "ყველა დოკუმენტი",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Delete": "",
|
||||
"Allow Chat Deletion": "მიმოწერის წაშლის დაშვება",
|
||||
"Allow Chat Edit": "",
|
||||
@ -56,6 +59,7 @@
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"Already have an account?": "უკვე გაქვს ანგარიში?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "ასისტენტი",
|
||||
"and": "და",
|
||||
"and {{COUNT}} more": "",
|
||||
@ -92,6 +96,7 @@
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 საბაზისო მისამართი აუცილებელია",
|
||||
"Available list": "",
|
||||
"available!": "ხელმისაწვდომია!",
|
||||
"Awful": "",
|
||||
"Azure AI Speech": "",
|
||||
"Azure Region": "",
|
||||
"Back": "უკან",
|
||||
@ -104,6 +109,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Brave Search API Key": "Brave Search API გასაღები",
|
||||
"By {{name}}": "",
|
||||
"Bypass SSL verification for Websites": "SSL-ის ვერიფიკაციის გააუქმება ვებსაიტებზე",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
@ -201,7 +207,6 @@
|
||||
"Current Model": "მიმდინარე მოდელი",
|
||||
"Current Password": "მიმდინარე პაროლი",
|
||||
"Custom": "საკუთარი",
|
||||
"Customize models for a specific purpose": "მოდელების მორგება კონკრეტული მიზნისთვის",
|
||||
"Dark": "მუქი",
|
||||
"Database": "მონაცემთა ბაზა",
|
||||
"December": "დეკემბერი",
|
||||
@ -219,6 +224,7 @@
|
||||
"Delete": "წაშლა",
|
||||
"Delete a model": "მოდელის წაშლა",
|
||||
"Delete All Chats": "ყველა ჩატის წაშლა",
|
||||
"Delete All Models": "",
|
||||
"Delete chat": "შეტყობინების წაშლა",
|
||||
"Delete Chat": "შეტყობინების წაშლა",
|
||||
"Delete chat?": "",
|
||||
@ -230,6 +236,7 @@
|
||||
"Delete User": "მომხმარებლის წაშლა",
|
||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} წაშლილია",
|
||||
"Deleted {{name}}": "Deleted {{name}}",
|
||||
"Deleted User": "",
|
||||
"Describe your knowledge base and objectives": "",
|
||||
"Description": "აღწერა",
|
||||
"Didn't fully follow instructions": "ვერ ყველა ინფორმაციისთვის ვერ ხელახლა ჩაწერე",
|
||||
@ -247,6 +254,7 @@
|
||||
"Display": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "ჩატში აჩვენე მომხმარებლის სახელი თქვენს ნაცვლად",
|
||||
"Displays citations in the response": "",
|
||||
"Dive into knowledge": "",
|
||||
"Do not install functions from sources you do not fully trust.": "",
|
||||
"Do not install tools from sources you do not fully trust.": "",
|
||||
@ -286,12 +294,14 @@
|
||||
"Embedding Model": "ჩასმის ძირითადი პროგრამა",
|
||||
"Embedding Model Engine": "ჩასმის ძირითადი პროგრამა",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "ჩასმის ძირითადი პროგრამა ჩართულია \"{{embedding_model}}\"",
|
||||
"Enable API Key Auth": "",
|
||||
"Enable Community Sharing": "საზოგადოების გაზიარების ჩართვა",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable New Sign Ups": "ახალი რეგისტრაციების ჩართვა",
|
||||
"Enable Retrieval Query Generation": "",
|
||||
"Enable Tags Generation": "",
|
||||
"Enable Web Search": "ვებ ძიების ჩართვა",
|
||||
"Enable Web Search Query Generation": "",
|
||||
@ -442,6 +452,7 @@
|
||||
"Hide": "დამალვა",
|
||||
"Host": "",
|
||||
"How can I help you today?": "როგორ შემიძლია დაგეხმარო დღეს?",
|
||||
"How would you rate this response?": "",
|
||||
"Hybrid Search": "ჰიბრიდური ძებნა",
|
||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
||||
"ID": "",
|
||||
@ -629,6 +640,7 @@
|
||||
"Overview": "",
|
||||
"page": "",
|
||||
"Password": "პაროლი",
|
||||
"Paste Large Text as File": "",
|
||||
"PDF document (.pdf)": "PDF დოკუმენტი (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF იდან ამოღებული სურათები (OCR)",
|
||||
"pending": "ლოდინის რეჟიმშია",
|
||||
@ -667,6 +679,7 @@
|
||||
"Prompts Access": "",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "ჩაიამოვეთ \"{{searchValue}}\" Ollama.com-იდან",
|
||||
"Pull a model from Ollama.com": "Ollama.com იდან მოდელის გადაწერა ",
|
||||
"Query Generation Prompt": "",
|
||||
"Query Params": "პარამეტრების ძიება",
|
||||
"RAG Template": "RAG შაბლონი",
|
||||
"Rating": "",
|
||||
@ -723,7 +736,6 @@
|
||||
"Search Models": "საძიებო მოდელები",
|
||||
"Search options": "",
|
||||
"Search Prompts": "მოთხოვნების ძიება",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Result Count": "ძიების შედეგების რაოდენობა",
|
||||
"Search the web": "",
|
||||
"Search Tools": "",
|
||||
@ -851,6 +863,8 @@
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
|
||||
"This will delete all models including custom models": "",
|
||||
"This will delete all models including custom models and cannot be undone.": "",
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
|
||||
"Thorough explanation": "ვრცლად აღწერა",
|
||||
"Tika": "",
|
||||
@ -967,6 +981,7 @@
|
||||
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
|
||||
"wherever you are": "",
|
||||
"Whisper (Local)": "",
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user