Merge pull request #6413 from open-webui/dev

0.3.34
This commit is contained in:
Timothy Jaeryang Baek 2024-10-26 00:44:16 -07:00 committed by GitHub
commit f10c729e3d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
73 changed files with 1039 additions and 366 deletions

View File

@ -5,6 +5,28 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.3.34] - 2024-10-26
### Added
- **🔧 Feedback Export Enhancements**: Feedback history data can now be exported to JSON, allowing for seamless integration in RLHF processing and further analysis.
- **🗂️ Embedding Model Lazy Loading**: Search functionality for leaderboard reranking is now more efficient, as embedding models are lazy-loaded only when needed, optimizing performance.
- **🎨 Rich Text Input Toggle**: Users can now switch back to legacy textarea input for chat if they prefer simpler text input, though rich text is still the default until deprecation.
- **🛠️ Improved Tool Calling Mechanism**: Enhanced method for parsing and calling tools, improving the reliability and robustness of tool function calls.
- **🌐 Globalization Enhancements**: Updates to internationalization (i18n) support, further refining multi-language compatibility and accuracy.
### Fixed
- **🖥️ Folder Rename Fix for Firefox**: Addressed a persistent issue where users could not rename folders by pressing enter in Firefox, now ensuring seamless folder management across browsers.
- **🔠 Tiktoken Model Text Splitter Issue**: Resolved an issue where the tiktoken text splitter wasnt working in Docker installations, restoring full functionality for tokenized text editing.
- **💼 S3 File Upload Issue**: Fixed a problem affecting S3 file uploads, ensuring smooth operations for those who store files on cloud storage.
- **🔒 Strict-Transport-Security Crash**: Resolved a crash when setting the Strict-Transport-Security (HSTS) header, improving stability and security enhancements.
- **📂 Firefox Folder Rename Persistence**: Fixed the bug in Firefox where folder renaming was not saved upon pressing enter, ensuring consistent user experience.
- **🚫 OIDC Boolean Access Fix**: Addressed an issue with boolean values not being accessed correctly during OIDC logins, ensuring login reliability.
- **⚙️ Rich Text Paste Behavior**: Refined paste behavior in rich text input to make it smoother and more intuitive when pasting various content types.
- **🔨 Model Exclusion for Arena Fix**: Corrected the filter function that was not properly excluding models from the arena, improving model management.
- **🏷️ "Tags Generation Prompt" Fix**: Addressed an issue preventing custom "tags generation prompts" from registering properly, ensuring custom prompt work seamlessly.
## [0.3.33] - 2024-10-24
### Added

View File

@ -77,7 +77,7 @@ ENV RAG_EMBEDDING_MODEL="$USE_EMBEDDING_MODEL_DOCKER" \
SENTENCE_TRANSFORMERS_HOME="/app/backend/data/cache/embedding/models"
## Tiktoken model settings ##
ENV TIKTOKEN_ENCODING_NAME="$USE_TIKTOKEN_ENCODING_NAME" \
ENV TIKTOKEN_ENCODING_NAME="cl100k_base" \
TIKTOKEN_CACHE_DIR="/app/backend/data/cache/tiktoken"
## Hugging Face download cache ##

View File

@ -522,7 +522,8 @@ def transcription(
else:
data = transcribe(file_path)
return data
file_path = file_path.split("/")[-1]
return {**data, "filename": file_path}
except Exception as e:
log.exception(e)
raise HTTPException(

View File

@ -739,7 +739,7 @@ class GenerateChatCompletionForm(BaseModel):
format: Optional[str] = None
options: Optional[dict] = None
template: Optional[str] = None
stream: Optional[bool] = None
stream: Optional[bool] = True
keep_alive: Optional[Union[int, str]] = None

View File

@ -14,6 +14,7 @@ from typing import Iterator, Optional, Sequence, Union
from fastapi import Depends, FastAPI, File, Form, HTTPException, UploadFile, status
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
import tiktoken
from open_webui.storage.provider import Storage
@ -666,8 +667,13 @@ def save_docs_to_vector_db(
add_start_index=True,
)
elif app.state.config.TEXT_SPLITTER == "token":
log.info(
f"Using token text splitter: {app.state.config.TIKTOKEN_ENCODING_NAME}"
)
tiktoken.get_encoding(str(app.state.config.TIKTOKEN_ENCODING_NAME))
text_splitter = TokenTextSplitter(
encoding_name=app.state.config.TIKTOKEN_ENCODING_NAME,
encoding_name=str(app.state.config.TIKTOKEN_ENCODING_NAME),
chunk_size=app.state.config.CHUNK_SIZE,
chunk_overlap=app.state.config.CHUNK_OVERLAP,
add_start_index=True,

View File

@ -5,6 +5,7 @@ from pydantic import BaseModel
from open_webui.apps.webui.models.users import Users, UserModel
from open_webui.apps.webui.models.feedbacks import (
FeedbackModel,
FeedbackResponse,
FeedbackForm,
Feedbacks,
)
@ -55,27 +56,15 @@ async def update_config(
}
@router.get("/feedbacks", response_model=list[FeedbackModel])
async def get_feedbacks(user=Depends(get_verified_user)):
feedbacks = Feedbacks.get_feedbacks_by_user_id(user.id)
return feedbacks
@router.delete("/feedbacks", response_model=bool)
async def delete_feedbacks(user=Depends(get_verified_user)):
success = Feedbacks.delete_feedbacks_by_user_id(user.id)
return success
class FeedbackUserModel(FeedbackModel):
class FeedbackUserResponse(FeedbackResponse):
user: Optional[UserModel] = None
@router.get("/feedbacks/all", response_model=list[FeedbackUserModel])
@router.get("/feedbacks/all", response_model=list[FeedbackUserResponse])
async def get_all_feedbacks(user=Depends(get_admin_user)):
feedbacks = Feedbacks.get_all_feedbacks()
return [
FeedbackUserModel(
FeedbackUserResponse(
**feedback.model_dump(), user=Users.get_user_by_id(feedback.user_id)
)
for feedback in feedbacks
@ -88,6 +77,29 @@ async def delete_all_feedbacks(user=Depends(get_admin_user)):
return success
@router.get("/feedbacks/all/export", response_model=list[FeedbackModel])
async def get_all_feedbacks(user=Depends(get_admin_user)):
feedbacks = Feedbacks.get_all_feedbacks()
return [
FeedbackModel(
**feedback.model_dump(), user=Users.get_user_by_id(feedback.user_id)
)
for feedback in feedbacks
]
@router.get("/feedbacks/user", response_model=list[FeedbackUserResponse])
async def get_feedbacks(user=Depends(get_verified_user)):
feedbacks = Feedbacks.get_feedbacks_by_user_id(user.id)
return feedbacks
@router.delete("/feedbacks", response_model=bool)
async def delete_feedbacks(user=Depends(get_verified_user)):
success = Feedbacks.delete_feedbacks_by_user_id(user.id)
return success
@router.post("/feedback", response_model=FeedbackModel)
async def create_feedback(
request: Request,

View File

@ -47,15 +47,40 @@ async def get_knowledge_items(
detail=ERROR_MESSAGES.NOT_FOUND,
)
else:
return [
KnowledgeResponse(
**knowledge.model_dump(),
files=Files.get_file_metadatas_by_ids(
knowledge.data.get("file_ids", []) if knowledge.data else []
),
knowledge_bases = []
for knowledge in Knowledges.get_knowledge_items():
files = Files.get_file_metadatas_by_ids(
knowledge.data.get("file_ids", []) if knowledge.data else []
)
for knowledge in Knowledges.get_knowledge_items()
]
# Check if all files exist
if len(files) != len(knowledge.data.get("file_ids", [])):
missing_files = list(
set(knowledge.data.get("file_ids", []))
- set([file.id for file in files])
)
if missing_files:
data = knowledge.data or {}
file_ids = data.get("file_ids", [])
for missing_file in missing_files:
file_ids.remove(missing_file)
data["file_ids"] = file_ids
Knowledges.update_knowledge_by_id(
id=knowledge.id, form_data=KnowledgeUpdateForm(data=data)
)
files = Files.get_file_metadatas_by_ids(file_ids)
knowledge_bases.append(
KnowledgeResponse(
**knowledge.model_dump(),
files=files,
)
)
return knowledge_bases
############################

View File

@ -439,9 +439,13 @@ async def chat_completion_tools_handler(
tool_function_params = result.get("parameters", {})
try:
tool_output = await tools[tool_function_name]["callable"](
**tool_function_params
)
tool_function = tools[tool_function_name]["callable"]
sig = inspect.signature(tool_function)
tool_function_params = {
k: v for k, v in tool_function_params.items() if k in sig.parameters
}
tool_output = await tool_function(**tool_function_params)
except Exception as e:
tool_output = str(e)

View File

@ -44,14 +44,14 @@ class StorageProvider:
)
self.bucket_name = S3_BUCKET_NAME
def _upload_to_s3(self, file: BinaryIO, filename: str) -> Tuple[bytes, str]:
def _upload_to_s3(self, file_path: str, filename: str) -> Tuple[bytes, str]:
"""Handles uploading of the file to S3 storage."""
if not self.s3_client:
raise RuntimeError("S3 Client is not initialized.")
try:
self.s3_client.upload_fileobj(file, self.bucket_name, filename)
return file.read(), f"s3://{self.bucket_name}/{filename}"
self.s3_client.upload_file(file_path, self.bucket_name, filename)
return open(file_path, "rb").read(), file_path
except ClientError as e:
raise RuntimeError(f"Error uploading file to S3: {e}")
@ -132,10 +132,11 @@ class StorageProvider:
contents = file.read()
if not contents:
raise ValueError(ERROR_MESSAGES.EMPTY_CONTENT)
contents, file_path = self._upload_to_local(contents, filename)
if self.storage_provider == "s3":
return self._upload_to_s3(file, filename)
return self._upload_to_local(contents, filename)
return self._upload_to_s3(file_path, filename)
return contents, file_path
def get_file(self, file_path: str) -> str:
"""Downloads a file either from S3 or the local file system and returns the file path."""

View File

@ -162,7 +162,7 @@ class OAuthManager:
if not user:
# If the user does not exist, check if merging is enabled
if auth_manager_config.OAUTH_MERGE_ACCOUNTS_BY_EMAIL.value:
if auth_manager_config.OAUTH_MERGE_ACCOUNTS_BY_EMAIL:
# Check if the user exists by email
user = Users.get_user_by_email(email)
if user:
@ -176,7 +176,7 @@ class OAuthManager:
if not user:
# If the user does not exist, check if signups are enabled
if auth_manager_config.ENABLE_OAUTH_SIGNUP.value:
if auth_manager_config.ENABLE_OAUTH_SIGNUP:
# Check if an existing user with the same email already exists
existing_user = Users.get_user_by_email(
user_data.get("email", "").lower()

View File

@ -60,7 +60,7 @@ def set_hsts(value: str):
pattern = r"^max-age=(\d+)(;includeSubDomains)?(;preload)?$"
match = re.match(pattern, value, re.IGNORECASE)
if not match:
return "max-age=31536000;includeSubDomains"
value = "max-age=31536000;includeSubDomains"
return {"Strict-Transport-Security": value}

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{
"name": "open-webui",
"version": "0.3.33",
"version": "0.3.34",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "open-webui",
"version": "0.3.33",
"version": "0.3.34",
"dependencies": {
"@codemirror/lang-javascript": "^6.2.2",
"@codemirror/lang-python": "^6.1.6",

View File

@ -1,6 +1,6 @@
{
"name": "open-webui",
"version": "0.3.33",
"version": "0.3.34",
"private": true,
"scripts": {
"dev": "npm run pyodide:fetch && vite dev --host",

View File

@ -189,7 +189,7 @@ input[type='number'] {
}
.ProseMirror {
@apply h-full min-h-fit max-h-full;
@apply h-full min-h-fit max-h-full whitespace-pre-wrap;
}
.ProseMirror:focus {

View File

@ -93,6 +93,37 @@ export const getAllFeedbacks = async (token: string = '') => {
return res;
};
export const exportAllFeedbacks = async (token: string = '') => {
let error = null;
const res = await fetch(`${WEBUI_API_BASE_URL}/evaluations/feedbacks/all/export`, {
method: 'GET',
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.detail;
console.log(err);
return null;
});
if (error) {
throw error;
}
return res;
};
export const createNewFeedback = async (token: string, feedback: object) => {
let error = null;

View File

@ -1,4 +1,7 @@
<script lang="ts">
import fileSaver from 'file-saver';
const { saveAs } = fileSaver;
import { onMount, getContext } from 'svelte';
import dayjs from 'dayjs';
import relativeTime from 'dayjs/plugin/relativeTime';
@ -12,7 +15,7 @@
let model = null;
import { models } from '$lib/stores';
import { deleteFeedbackById, getAllFeedbacks } from '$lib/apis/evaluations';
import { deleteFeedbackById, exportAllFeedbacks, getAllFeedbacks } from '$lib/apis/evaluations';
import FeedbackMenu from './Evaluations/FeedbackMenu.svelte';
import EllipsisHorizontal from '../icons/EllipsisHorizontal.svelte';
@ -23,6 +26,10 @@
import Share from '../icons/Share.svelte';
import CloudArrowUp from '../icons/CloudArrowUp.svelte';
import { toast } from 'svelte-sonner';
import Spinner from '../common/Spinner.svelte';
import DocumentArrowUpSolid from '../icons/DocumentArrowUpSolid.svelte';
import DocumentArrowDown from '../icons/DocumentArrowDown.svelte';
import ArrowDownTray from '../icons/ArrowDownTray.svelte';
const i18n = getContext('i18n');
@ -35,6 +42,7 @@
let tagEmbeddings = new Map();
let loaded = false;
let loadingLeaderboard = true;
let debounceTimer;
$: paginatedFeedbacks = feedbacks.slice((page - 1) * 10, page * 10);
@ -91,6 +99,8 @@
if (a.rating !== '-' && b.rating !== '-') return b.rating - a.rating;
return a.name.localeCompare(b.name);
});
loadingLeaderboard = false;
};
function calculateModelStats(
@ -227,6 +237,8 @@
};
const debouncedQueryHandler = async () => {
loadingLeaderboard = true;
if (query.trim() === '') {
rankHandler();
return;
@ -294,10 +306,21 @@
window.addEventListener('message', messageHandler, false);
};
onMount(async () => {
feedbacks = await getAllFeedbacks(localStorage.token);
loaded = true;
const exportHandler = async () => {
const _feedbacks = await exportAllFeedbacks(localStorage.token).catch((err) => {
toast.error(err);
return null;
});
if (_feedbacks) {
let blob = new Blob([JSON.stringify(_feedbacks)], {
type: 'application/json'
});
saveAs(blob, `feedback-history-export-${Date.now()}.json`);
}
};
const loadEmbeddingModel = async () => {
// Check if the tokenizer and model are already loaded and stored in the window object
if (!window.tokenizer) {
window.tokenizer = await AutoTokenizer.from_pretrained(EMBEDDING_MODEL);
@ -314,6 +337,11 @@
// Pre-compute embeddings for all unique tags
const allTags = new Set(feedbacks.flatMap((feedback) => feedback.data.tags || []));
await getTagEmbeddings(Array.from(allTags));
};
onMount(async () => {
feedbacks = await getAllFeedbacks(localStorage.token);
loaded = true;
rankHandler();
});
@ -343,6 +371,9 @@
class=" w-full text-sm pr-4 py-1 rounded-r-xl outline-none bg-transparent"
bind:value={query}
placeholder={$i18n.t('Search')}
on:focus={() => {
loadEmbeddingModel();
}}
/>
</div>
</Tooltip>
@ -352,13 +383,22 @@
<div
class="scrollbar-hidden relative whitespace-nowrap overflow-x-auto max-w-full rounded pt-0.5"
>
{#if loadingLeaderboard}
<div class=" absolute top-0 bottom-0 left-0 right-0 flex">
<div class="m-auto">
<Spinner />
</div>
</div>
{/if}
{#if (rankedModels ?? []).length === 0}
<div class="text-center text-xs text-gray-500 dark:text-gray-400 py-1">
{$i18n.t('No models found')}
</div>
{:else}
<table
class="w-full text-sm text-left text-gray-500 dark:text-gray-400 table-auto max-w-full rounded"
class="w-full text-sm text-left text-gray-500 dark:text-gray-400 table-auto max-w-full rounded {loadingLeaderboard
? 'opacity-20'
: ''}"
>
<thead
class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-850 dark:text-gray-400 -translate-y-0.5"
@ -463,6 +503,21 @@
<span class="text-lg font-medium text-gray-500 dark:text-gray-300">{feedbacks.length}</span>
</div>
<div>
<div>
<Tooltip content={$i18n.t('Export')}>
<button
class=" p-2 rounded-xl hover:bg-gray-100 dark:bg-gray-900 dark:hover:bg-gray-850 transition font-medium text-sm flex items-center space-x-1"
on:click={() => {
exportHandler();
}}
>
<ArrowDownTray className="size-3" />
</button>
</Tooltip>
</div>
</div>
</div>
<div
@ -606,18 +661,7 @@
</div>
<div class=" self-center">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="w-3.5 h-3.5"
>
<path
fill-rule="evenodd"
d="M4 2a1.5 1.5 0 0 0-1.5 1.5v9A1.5 1.5 0 0 0 4 14h8a1.5 1.5 0 0 0 1.5-1.5V6.621a1.5 1.5 0 0 0-.44-1.06L9.94 2.439A1.5 1.5 0 0 0 8.878 2H4Zm4 9.5a.75.75 0 0 1-.75-.75V8.06l-.72.72a.75.75 0 0 1-1.06-1.06l2-2a.75.75 0 0 1 1.06 0l2 2a.75.75 0 1 1-1.06 1.06l-.72-.72v2.69a.75.75 0 0 1-.75.75Z"
clip-rule="evenodd"
/>
</svg>
<CloudArrowUp className="size-3" strokeWidth="3" />
</div>
</button>
</Tooltip>

View File

@ -24,7 +24,7 @@
TASK_MODEL: '',
TASK_MODEL_EXTERNAL: '',
TITLE_GENERATION_PROMPT_TEMPLATE: '',
TAG_GENERATION_PROMPT_TEMPLATE: '',
TAGS_GENERATION_PROMPT_TEMPLATE: '',
ENABLE_SEARCH_QUERY: true,
SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE: ''
};
@ -141,7 +141,7 @@
placement="top-start"
>
<Textarea
bind:value={taskConfig.TAG_GENERATION_PROMPT_TEMPLATE}
bind:value={taskConfig.TAGS_GENERATION_PROMPT_TEMPLATE}
placeholder={$i18n.t('Leave empty to use the default prompt, or enter a custom prompt')}
/>
</Tooltip>

View File

@ -361,8 +361,8 @@
document.getElementById('chat-input')?.focus();
}}
on:confirm={async (e) => {
const response = e.detail;
prompt = `${prompt}${response} `;
const { text, filename } = e.detail;
prompt = `${prompt}${text} `;
recording = false;
@ -509,54 +509,202 @@
</InputMenu>
</div>
<div
bind:this={chatInputContainerElement}
id="chat-input-container"
class="scrollbar-hidden text-left bg-gray-50 dark:bg-gray-850 dark:text-gray-100 outline-none w-full py-2.5 px-1 rounded-xl resize-none h-[48px] overflow-auto"
>
<RichTextInput
bind:this={chatInputElement}
{#if $settings?.richTextInput ?? true}
<div
bind:this={chatInputContainerElement}
id="chat-input-container"
class="scrollbar-hidden text-left bg-gray-50 dark:bg-gray-850 dark:text-gray-100 outline-none w-full py-2.5 px-1 rounded-xl resize-none h-[48px] overflow-auto"
>
<RichTextInput
bind:this={chatInputElement}
id="chat-input"
trim={true}
placeholder={placeholder ? placeholder : $i18n.t('Send a Message')}
bind:value={prompt}
shiftEnter={!$mobile ||
!(
'ontouchstart' in window ||
navigator.maxTouchPoints > 0 ||
navigator.msMaxTouchPoints > 0
)}
on:enter={async (e) => {
if (prompt !== '') {
dispatch('submit', prompt);
}
}}
on:input={async (e) => {
if (chatInputContainerElement) {
chatInputContainerElement.style.height = '';
chatInputContainerElement.style.height =
Math.min(chatInputContainerElement.scrollHeight, 200) + 'px';
}
}}
on:focus={async (e) => {
if (chatInputContainerElement) {
chatInputContainerElement.style.height = '';
chatInputContainerElement.style.height =
Math.min(chatInputContainerElement.scrollHeight, 200) + 'px';
}
}}
on:keypress={(e) => {
e = e.detail.event;
}}
on:keydown={async (e) => {
e = e.detail.event;
if (chatInputContainerElement) {
chatInputContainerElement.style.height = '';
chatInputContainerElement.style.height =
Math.min(chatInputContainerElement.scrollHeight, 200) + 'px';
}
const isCtrlPressed = e.ctrlKey || e.metaKey; // metaKey is for Cmd key on Mac
const commandsContainerElement =
document.getElementById('commands-container');
// Command/Ctrl + Shift + Enter to submit a message pair
if (isCtrlPressed && e.key === 'Enter' && e.shiftKey) {
e.preventDefault();
createMessagePair(prompt);
}
// Check if Ctrl + R is pressed
if (prompt === '' && isCtrlPressed && e.key.toLowerCase() === 'r') {
e.preventDefault();
console.log('regenerate');
const regenerateButton = [
...document.getElementsByClassName('regenerate-response-button')
]?.at(-1);
regenerateButton?.click();
}
if (prompt === '' && e.key == 'ArrowUp') {
e.preventDefault();
const userMessageElement = [
...document.getElementsByClassName('user-message')
]?.at(-1);
const editButton = [
...document.getElementsByClassName('edit-user-message-button')
]?.at(-1);
console.log(userMessageElement);
userMessageElement.scrollIntoView({ block: 'center' });
editButton?.click();
}
if (commandsContainerElement && e.key === 'ArrowUp') {
e.preventDefault();
commandsElement.selectUp();
const commandOptionButton = [
...document.getElementsByClassName('selected-command-option-button')
]?.at(-1);
commandOptionButton.scrollIntoView({ block: 'center' });
}
if (commandsContainerElement && e.key === 'ArrowDown') {
e.preventDefault();
commandsElement.selectDown();
const commandOptionButton = [
...document.getElementsByClassName('selected-command-option-button')
]?.at(-1);
commandOptionButton.scrollIntoView({ block: 'center' });
}
if (commandsContainerElement && e.key === 'Enter') {
e.preventDefault();
const commandOptionButton = [
...document.getElementsByClassName('selected-command-option-button')
]?.at(-1);
if (e.shiftKey) {
prompt = `${prompt}\n`;
} else if (commandOptionButton) {
commandOptionButton?.click();
} else {
document.getElementById('send-message-button')?.click();
}
}
if (commandsContainerElement && e.key === 'Tab') {
e.preventDefault();
const commandOptionButton = [
...document.getElementsByClassName('selected-command-option-button')
]?.at(-1);
commandOptionButton?.click();
}
if (e.key === 'Escape') {
console.log('Escape');
atSelectedModel = undefined;
}
}}
on:paste={async (e) => {
e = e.detail.event;
console.log(e);
const clipboardData = e.clipboardData || window.clipboardData;
if (clipboardData && clipboardData.items) {
for (const item of clipboardData.items) {
if (item.type.indexOf('image') !== -1) {
const blob = item.getAsFile();
const reader = new FileReader();
reader.onload = function (e) {
files = [
...files,
{
type: 'image',
url: `${e.target.result}`
}
];
};
reader.readAsDataURL(blob);
}
}
}
}}
/>
</div>
{:else}
<textarea
id="chat-input"
trim={true}
bind:this={chatInputElement}
class="scrollbar-hidden bg-gray-50 dark:bg-gray-850 dark:text-gray-100 outline-none w-full py-3 px-1 rounded-xl resize-none h-[48px]"
placeholder={placeholder ? placeholder : $i18n.t('Send a Message')}
bind:value={prompt}
shiftEnter={!$mobile ||
!(
'ontouchstart' in window ||
navigator.maxTouchPoints > 0 ||
navigator.msMaxTouchPoints > 0
)}
on:enter={async (e) => {
if (prompt !== '') {
dispatch('submit', prompt);
}
}}
on:input={async (e) => {
if (chatInputContainerElement) {
chatInputContainerElement.style.height = '';
chatInputContainerElement.style.height =
Math.min(chatInputContainerElement.scrollHeight, 200) + 'px';
}
}}
on:focus={async (e) => {
if (chatInputContainerElement) {
chatInputContainerElement.style.height = '';
chatInputContainerElement.style.height =
Math.min(chatInputContainerElement.scrollHeight, 200) + 'px';
}
}}
on:keypress={(e) => {
e = e.detail.event;
if (
!$mobile ||
!(
'ontouchstart' in window ||
navigator.maxTouchPoints > 0 ||
navigator.msMaxTouchPoints > 0
)
) {
// Prevent Enter key from creating a new line
if (e.key === 'Enter' && !e.shiftKey) {
e.preventDefault();
}
// Submit the prompt when Enter key is pressed
if (prompt !== '' && e.key === 'Enter' && !e.shiftKey) {
dispatch('submit', prompt);
}
}
}}
on:keydown={async (e) => {
e = e.detail.event;
if (chatInputContainerElement) {
chatInputContainerElement.style.height = '';
chatInputContainerElement.style.height =
Math.min(chatInputContainerElement.scrollHeight, 200) + 'px';
}
const isCtrlPressed = e.ctrlKey || e.metaKey; // metaKey is for Cmd key on Mac
const commandsContainerElement =
document.getElementById('commands-container');
@ -640,6 +788,26 @@
]?.at(-1);
commandOptionButton?.click();
} else if (e.key === 'Tab') {
const words = findWordIndices(prompt);
if (words.length > 0) {
const word = words.at(0);
const fullPrompt = prompt;
prompt = prompt.substring(0, word?.endIndex + 1);
await tick();
e.target.scrollTop = e.target.scrollHeight;
prompt = fullPrompt;
await tick();
e.preventDefault();
e.target.setSelectionRange(word?.startIndex, word.endIndex + 1);
}
e.target.style.height = '';
e.target.style.height = Math.min(e.target.scrollHeight, 200) + 'px';
}
if (e.key === 'Escape') {
@ -647,10 +815,17 @@
atSelectedModel = undefined;
}
}}
rows="1"
on:input={async (e) => {
e.target.style.height = '';
e.target.style.height = Math.min(e.target.scrollHeight, 200) + 'px';
user = null;
}}
on:focus={async (e) => {
e.target.style.height = '';
e.target.style.height = Math.min(e.target.scrollHeight, 200) + 'px';
}}
on:paste={async (e) => {
e = e.detail.event;
console.log(e);
const clipboardData = e.clipboardData || window.clipboardData;
if (clipboardData && clipboardData.items) {
@ -675,7 +850,7 @@
}
}}
/>
</div>
{/if}
<div class="self-end mb-2 flex space-x-1 mr-1">
{#if !history?.currentId || history.messages[history.currentId]?.done == true}

View File

@ -1,5 +1,5 @@
<script lang="ts">
import { prompts } from '$lib/stores';
import { prompts, user } from '$lib/stores';
import {
findWordIndices,
getUserPosition,
@ -78,6 +78,12 @@
text = text.replaceAll('{{USER_LOCATION}}', String(location));
}
if (command.content.includes('{{USER_NAME}}')) {
console.log($user);
const name = $user.name || 'User';
text = text.replaceAll('{{USER_NAME}}', name);
}
if (command.content.includes('{{USER_LANGUAGE}}')) {
const language = localStorage.getItem('locale') || 'en-US';
text = text.replaceAll('{{USER_LANGUAGE}}', language);
@ -114,13 +120,16 @@
const chatInputElement = document.getElementById('chat-input');
await tick();
if (chatInputContainerElement) {
chatInputContainerElement.style.height = '';
chatInputContainerElement.style.height =
Math.min(chatInputContainerElement.scrollHeight, 200) + 'px';
}
chatInputElement?.focus();
await tick();
if (chatInputElement) {
chatInputElement.focus();
chatInputElement.dispatchEvent(new Event('input'));
}
};
</script>

View File

@ -1,6 +1,6 @@
<script lang="ts">
import { toast } from 'svelte-sonner';
import { createEventDispatcher, tick, getContext } from 'svelte';
import { createEventDispatcher, tick, getContext, onMount, onDestroy } from 'svelte';
import { config, settings } from '$lib/stores';
import { blobToFile, calculateSHA256, findWordIndices } from '$lib/utils';
@ -52,7 +52,7 @@
let audioChunks = [];
const MIN_DECIBELS = -45;
const VISUALIZER_BUFFER_LENGTH = 300;
let VISUALIZER_BUFFER_LENGTH = 300;
let visualizerData = Array(VISUALIZER_BUFFER_LENGTH).fill(0);
@ -142,8 +142,8 @@
});
if (res) {
console.log(res.text);
dispatch('confirm', res.text);
console.log(res);
dispatch('confirm', res);
}
};
@ -278,12 +278,40 @@
stream = null;
};
let resizeObserver;
let containerWidth;
let maxVisibleItems = 300;
$: maxVisibleItems = Math.floor(containerWidth / 5); // 2px width + 0.5px gap
onMount(() => {
// listen to width changes
resizeObserver = new ResizeObserver(() => {
VISUALIZER_BUFFER_LENGTH = Math.floor(window.innerWidth / 4);
if (visualizerData.length > VISUALIZER_BUFFER_LENGTH) {
visualizerData = visualizerData.slice(visualizerData.length - VISUALIZER_BUFFER_LENGTH);
} else {
visualizerData = Array(VISUALIZER_BUFFER_LENGTH - visualizerData.length)
.fill(0)
.concat(visualizerData);
}
});
resizeObserver.observe(document.body);
});
onDestroy(() => {
// remove resize observer
resizeObserver.disconnect();
});
</script>
<div
bind:clientWidth={containerWidth}
class="{loading
? ' bg-gray-100/50 dark:bg-gray-850/50'
: 'bg-indigo-300/10 dark:bg-indigo-500/10 '} rounded-full flex {className}"
: 'bg-indigo-300/10 dark:bg-indigo-500/10 '} rounded-full flex justify-between {className}"
>
<div class="flex items-center mr-1">
<button
@ -318,146 +346,152 @@
class="flex flex-1 self-center items-center justify-between ml-2 mx-1 overflow-hidden h-6"
dir="rtl"
>
<div class="flex-1 flex items-center gap-0.5 h-6">
<div
class="flex items-center gap-0.5 h-6 w-full max-w-full overflow-hidden overflow-x-hidden flex-wrap"
>
{#each visualizerData.slice().reverse() as rms}
<div
class="w-[2px]
<div class="flex items-center h-full">
<div
class="w-[2px] flex-shrink-0
{loading
? ' bg-gray-500 dark:bg-gray-400 '
: 'bg-indigo-500 dark:bg-indigo-400 '}
? ' bg-gray-500 dark:bg-gray-400 '
: 'bg-indigo-500 dark:bg-indigo-400 '}
inline-block h-full"
style="height: {Math.min(100, Math.max(14, rms * 100))}%;"
/>
style="height: {Math.min(100, Math.max(14, rms * 100))}%;"
/>
</div>
{/each}
</div>
</div>
<div class=" mx-1.5 pr-1 flex justify-center items-center">
<div
class="text-sm
<div class="flex">
<div class=" mx-1.5 pr-1 flex justify-center items-center">
<div
class="text-sm
{loading ? ' text-gray-500 dark:text-gray-400 ' : ' text-indigo-400 '}
font-medium flex-1 mx-auto text-center"
>
{formatSeconds(durationSeconds)}
</div>
</div>
<div class="flex items-center mr-1">
{#if loading}
<div class=" text-gray-500 rounded-full cursor-not-allowed">
<svg
width="24"
height="24"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
fill="currentColor"
><style>
.spinner_OSmW {
transform-origin: center;
animation: spinner_T6mA 0.75s step-end infinite;
}
@keyframes spinner_T6mA {
8.3% {
transform: rotate(30deg);
}
16.6% {
transform: rotate(60deg);
}
25% {
transform: rotate(90deg);
}
33.3% {
transform: rotate(120deg);
}
41.6% {
transform: rotate(150deg);
}
50% {
transform: rotate(180deg);
}
58.3% {
transform: rotate(210deg);
}
66.6% {
transform: rotate(240deg);
}
75% {
transform: rotate(270deg);
}
83.3% {
transform: rotate(300deg);
}
91.6% {
transform: rotate(330deg);
}
100% {
transform: rotate(360deg);
}
}
</style><g class="spinner_OSmW"
><rect x="11" y="1" width="2" height="5" opacity=".14" /><rect
x="11"
y="1"
width="2"
height="5"
transform="rotate(30 12 12)"
opacity=".29"
/><rect
x="11"
y="1"
width="2"
height="5"
transform="rotate(60 12 12)"
opacity=".43"
/><rect
x="11"
y="1"
width="2"
height="5"
transform="rotate(90 12 12)"
opacity=".57"
/><rect
x="11"
y="1"
width="2"
height="5"
transform="rotate(120 12 12)"
opacity=".71"
/><rect
x="11"
y="1"
width="2"
height="5"
transform="rotate(150 12 12)"
opacity=".86"
/><rect x="11" y="1" width="2" height="5" transform="rotate(180 12 12)" /></g
></svg
>
</div>
{:else}
<button
type="button"
class="p-1.5 bg-indigo-500 text-white dark:bg-indigo-500 dark:text-blue-950 rounded-full"
on:click={async () => {
await confirmRecording();
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="2.5"
stroke="currentColor"
class="size-4"
{formatSeconds(durationSeconds)}
</div>
</div>
<div class="flex items-center">
{#if loading}
<div class=" text-gray-500 rounded-full cursor-not-allowed">
<svg
width="24"
height="24"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
fill="currentColor"
><style>
.spinner_OSmW {
transform-origin: center;
animation: spinner_T6mA 0.75s step-end infinite;
}
@keyframes spinner_T6mA {
8.3% {
transform: rotate(30deg);
}
16.6% {
transform: rotate(60deg);
}
25% {
transform: rotate(90deg);
}
33.3% {
transform: rotate(120deg);
}
41.6% {
transform: rotate(150deg);
}
50% {
transform: rotate(180deg);
}
58.3% {
transform: rotate(210deg);
}
66.6% {
transform: rotate(240deg);
}
75% {
transform: rotate(270deg);
}
83.3% {
transform: rotate(300deg);
}
91.6% {
transform: rotate(330deg);
}
100% {
transform: rotate(360deg);
}
}
</style><g class="spinner_OSmW"
><rect x="11" y="1" width="2" height="5" opacity=".14" /><rect
x="11"
y="1"
width="2"
height="5"
transform="rotate(30 12 12)"
opacity=".29"
/><rect
x="11"
y="1"
width="2"
height="5"
transform="rotate(60 12 12)"
opacity=".43"
/><rect
x="11"
y="1"
width="2"
height="5"
transform="rotate(90 12 12)"
opacity=".57"
/><rect
x="11"
y="1"
width="2"
height="5"
transform="rotate(120 12 12)"
opacity=".71"
/><rect
x="11"
y="1"
width="2"
height="5"
transform="rotate(150 12 12)"
opacity=".86"
/><rect x="11" y="1" width="2" height="5" transform="rotate(180 12 12)" /></g
></svg
>
</div>
{:else}
<button
type="button"
class="p-1.5 bg-indigo-500 text-white dark:bg-indigo-500 dark:text-blue-950 rounded-full"
on:click={async () => {
await confirmRecording();
}}
>
<path stroke-linecap="round" stroke-linejoin="round" d="m4.5 12.75 6 6 9-13.5" />
</svg>
</button>
{/if}
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="2.5"
stroke="currentColor"
class="size-4"
>
<path stroke-linecap="round" stroke-linejoin="round" d="m4.5 12.75 6 6 9-13.5" />
</svg>
</button>
{/if}
</div>
</div>
</div>

View File

@ -58,13 +58,18 @@
await tick();
const chatInputContainerElement = document.getElementById('chat-input-container');
const chatInputElement = document.getElementById('chat-input');
if (chatInputContainerElement) {
chatInputContainerElement.style.height = '';
chatInputContainerElement.style.height =
Math.min(chatInputContainerElement.scrollHeight, 200) + 'px';
}
const chatInputElement = document.getElementById('chat-input');
chatInputElement?.focus();
await tick();
if (chatInputElement) {
chatInputElement.focus();
chatInputElement.dispatchEvent(new Event('input'));
}
await tick();

View File

@ -30,6 +30,7 @@
// Interface
let defaultModelId = '';
let showUsername = false;
let richTextInput = true;
let landingPageMode = '';
let chatBubble = true;
@ -125,6 +126,11 @@
saveSettings({ autoTags });
};
const toggleRichTextInput = async () => {
richTextInput = !richTextInput;
saveSettings({ richTextInput });
};
const toggleResponseAutoCopy = async () => {
const permission = await navigator.clipboard
.readText()
@ -172,6 +178,7 @@
showEmojiInCall = $settings.showEmojiInCall ?? false;
voiceInterruption = $settings.voiceInterruption ?? false;
richTextInput = $settings.richTextInput ?? true;
landingPageMode = $settings.landingPageMode ?? '';
chatBubble = $settings.chatBubble ?? true;
widescreenMode = $settings.widescreenMode ?? false;
@ -422,6 +429,28 @@
</div>
</div>
<div>
<div class=" py-0.5 flex w-full justify-between">
<div class=" self-center text-xs">
{$i18n.t('Rich Text Input for Chat')}
</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
on:click={() => {
toggleRichTextInput();
}}
type="button"
>
{#if richTextInput === 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">

View File

@ -288,6 +288,12 @@
return false;
}
// Replace tabs with four spaces
function handleTabIndentation(text: string): string {
// Replace each tab character with four spaces
return text.replace(/\t/g, ' ');
}
onMount(() => {
const initialDoc = markdownToProseMirrorDoc(value || ''); // Convert the initial content
@ -403,6 +409,22 @@
},
paste: (view, event) => {
if (event.clipboardData) {
// Extract plain text from clipboard and paste it without formatting
const plainText = event.clipboardData.getData('text/plain');
if (plainText) {
const modifiedText = handleTabIndentation(plainText);
console.log(modifiedText);
// Replace the current selection with the plain text content
const tr = view.state.tr.replaceSelectionWith(
view.state.schema.text(modifiedText),
false
);
view.dispatch(tr.scrollIntoView());
event.preventDefault(); // Prevent the default paste behavior
return true;
}
// Check if the pasted content contains image files
const hasImageFile = Array.from(event.clipboardData.files).some((file) =>
file.type.startsWith('image/')

View File

@ -0,0 +1,19 @@
<script lang="ts">
export let className = 'size-4';
export let strokeWidth = '1.5';
</script>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width={strokeWidth}
stroke="currentColor"
class={className}
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m.75 12 3 3m0 0 3-3m-3 3v-6m-1.5-9H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z"
/>
</svg>

View File

@ -0,0 +1,12 @@
<script lang="ts">
export let className = 'w-4 h-4';
export let strokeWidth = '1.5';
</script>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class={className}>
<path
fill-rule="evenodd"
d="M9 4.5a.75.75 0 0 1 .721.544l.813 2.846a3.75 3.75 0 0 0 2.576 2.576l2.846.813a.75.75 0 0 1 0 1.442l-2.846.813a3.75 3.75 0 0 0-2.576 2.576l-.813 2.846a.75.75 0 0 1-1.442 0l-.813-2.846a3.75 3.75 0 0 0-2.576-2.576l-2.846-.813a.75.75 0 0 1 0-1.442l2.846-.813A3.75 3.75 0 0 0 7.466 7.89l.813-2.846A.75.75 0 0 1 9 4.5ZM18 1.5a.75.75 0 0 1 .728.568l.258 1.036c.236.94.97 1.674 1.91 1.91l1.036.258a.75.75 0 0 1 0 1.456l-1.036.258c-.94.236-1.674.97-1.91 1.91l-.258 1.036a.75.75 0 0 1-1.456 0l-.258-1.036a2.625 2.625 0 0 0-1.91-1.91l-1.036-.258a.75.75 0 0 1 0-1.456l1.036-.258a2.625 2.625 0 0 0 1.91-1.91l.258-1.036A.75.75 0 0 1 18 1.5ZM16.5 15a.75.75 0 0 1 .712.513l.394 1.183c.15.447.5.799.948.948l1.183.395a.75.75 0 0 1 0 1.422l-1.183.395c-.447.15-.799.5-.948.948l-.395 1.183a.75.75 0 0 1-1.422 0l-.395-1.183a1.5 1.5 0 0 0-.948-.948l-1.183-.395a.75.75 0 0 1 0-1.422l1.183-.395c.447-.15.799-.5.948-.948l.395-1.183A.75.75 0 0 1 16.5 15Z"
clip-rule="evenodd"
/>
</svg>

View File

@ -396,6 +396,7 @@
}}
on:keydown={(e) => {
if (e.key === 'Enter') {
nameUpdateHandler();
edit = false;
}
}}

View File

@ -0,0 +1,121 @@
<script>
import { getContext } from 'svelte';
const i18n = getContext('i18n');
import RichTextInput from '../common/RichTextInput.svelte';
import Spinner from '../common/Spinner.svelte';
import Sparkles from '../icons/Sparkles.svelte';
import SparklesSolid from '../icons/SparklesSolid.svelte';
import Mic from '../icons/Mic.svelte';
import VoiceRecording from '../chat/MessageInput/VoiceRecording.svelte';
import Tooltip from '../common/Tooltip.svelte';
import { toast } from 'svelte-sonner';
let name = '';
let content = '';
let voiceInput = false;
let loading = false;
</script>
<div class="relative flex-1 w-full h-full flex justify-center overflow-auto px-5 py-1">
{#if loading}
<div class=" absolute top-0 bottom-0 left-0 right-0 flex">
<div class="m-auto">
<Spinner />
</div>
</div>
{/if}
<div class=" w-full flex flex-col gap-2 {loading ? 'opacity-20' : ''}">
<div class="flex-shrink-0 w-full flex justify-between items-center">
<div class="w-full">
<input
class="w-full text-2xl font-medium bg-transparent outline-none"
type="text"
bind:value={name}
placeholder={$i18n.t('Title')}
required
/>
</div>
</div>
<div class=" flex-1 w-full h-full">
<RichTextInput
className=" input-prose-sm"
bind:value={content}
placeholder={$i18n.t('Write something...')}
/>
</div>
</div>
<div class="absolute bottom-0 left-0 right-0 p-5 max-w-full flex justify-end">
<div class="flex gap-0.5 justify-end w-full">
{#if voiceInput}
<div class="flex-1 w-full">
<VoiceRecording
bind:recording={voiceInput}
className="p-1 w-full max-w-full"
on:cancel={() => {
voiceInput = false;
}}
on:confirm={(e) => {
const { text, filename } = e.detail;
// url is hostname + /cache/audio/transcription/ + filename
const url = `${window.location.origin}/cache/audio/transcription/${filename}`;
// Open in new tab
if (content.trim() !== '') {
content = `${content}\n\n${text}\n\nRecording: ${url}\n\n`;
} else {
content = `${content}${text}\n\nRecording: ${url}\n\n`;
}
voiceInput = false;
}}
/>
</div>
{:else}
<Tooltip content={$i18n.t('Voice Input')}>
<button
class="cursor-pointer p-2.5 flex rounded-full hover:bg-gray-100 dark:hover:bg-gray-850 transition shadow-xl"
type="button"
on:click={async () => {
try {
let stream = await navigator.mediaDevices
.getUserMedia({ audio: true })
.catch(function (err) {
toast.error(
$i18n.t(`Permission denied when accessing microphone: {{error}}`, {
error: err
})
);
return null;
});
if (stream) {
voiceInput = true;
const tracks = stream.getTracks();
tracks.forEach((track) => track.stop());
}
stream = null;
} catch {
toast.error($i18n.t('Permission denied when accessing microphone'));
}
}}
>
<Mic className="size-4" />
</button>
</Tooltip>
{/if}
<!-- <button
class="cursor-pointer p-2.5 flex rounded-full hover:bg-gray-100 dark:hover:bg-gray-850 transition shadow-xl"
>
<SparklesSolid className="size-4" />
</button> -->
</div>
</div>
</div>

View File

@ -85,8 +85,8 @@
voiceInput = false;
}}
on:confirm={(e) => {
const response = e.detail;
content = `${content}${response} `;
const { text, filename } = e.detail;
content = `${content}${text} `;
voiceInput = false;
}}

View File

@ -490,6 +490,7 @@
"Not factually correct": "ليس صحيحا من حيث الواقع",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "ملاحظة: إذا قمت بتعيين الحد الأدنى من النقاط، فلن يؤدي البحث إلا إلى إرجاع المستندات التي لها نقاط أكبر من أو تساوي الحد الأدنى من النقاط.",
"Notes": "",
"Notifications": "إشعارات",
"November": "نوفمبر",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "منصب",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Не е фактологически правилно",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Забележка: Ако зададете минимален резултат, търсенето ще върне само документи с резултат, по-голям или равен на минималния резултат.",
"Notes": "",
"Notifications": "Десктоп Известия",
"November": "Ноември",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Роля",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "তথ্যগত দিক থেকে সঠিক নয়",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "দ্রষ্টব্য: আপনি যদি ন্যূনতম স্কোর সেট করেন তবে অনুসন্ধানটি কেবলমাত্র ন্যূনতম স্কোরের চেয়ে বেশি বা সমান স্কোর সহ নথিগুলি ফেরত দেবে।",
"Notes": "",
"Notifications": "নোটিফিকেশনসমূহ",
"November": "নভেম্বর",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "পদবি",
"Rosé Pine": "রোজ পাইন",

View File

@ -490,6 +490,7 @@
"Not factually correct": "No és clarament correcte",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Si s'estableix una puntuació mínima, la cerca només retornarà documents amb una puntuació major o igual a la puntuació mínima.",
"Notes": "",
"Notifications": "Notificacions",
"November": "Novembre",
"num_gpu (Ollama)": "num_gpu (Ollama)",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Les notifications de resposta no es poden activar perquè els permisos del lloc web han estat rebutjats. Comprova les preferències del navegador per donar l'accés necessari.",
"Response splitting": "Divisió de la resposta",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Rol",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
"Notes": "",
"Notifications": "Mga pahibalo sa desktop",
"November": "",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Papel",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Ikke faktuelt korrekt",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Bemærk: Hvis du angiver en minimumscore, returnerer søgningen kun dokumenter med en score, der er større end eller lig med minimumscoren.",
"Notes": "",
"Notifications": "Notifikationer",
"November": "November",
"num_gpu (Ollama)": "num_gpu (Ollama)",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Svarnotifikationer kan ikke aktiveres, da webstedets tilladelser er blevet nægtet. Besøg dine browserindstillinger for at give den nødvendige adgang.",
"Response splitting": "Svaropdeling",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Rolle",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Nicht sachlich korrekt",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Hinweis: Wenn Sie eine Mindestpunktzahl festlegen, werden in der Suche nur Dokumente mit einer Punktzahl größer oder gleich der Mindestpunktzahl zurückgegeben.",
"Notes": "",
"Notifications": "Benachrichtigungen",
"November": "November",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Benachrichtigungen können nicht aktiviert werden, da die Website-Berechtigungen abgelehnt wurden. Bitte besuchen Sie Ihre Browser-Einstellungen, um den erforderlichen Zugriff zu gewähren.",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Rolle",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
"Notes": "",
"Notifications": "Notifications",
"November": "",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Role",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
"Notes": "",
"Notifications": "",
"November": "",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "",
"Rosé Pine": "",

View File

@ -490,6 +490,7 @@
"Not factually correct": "",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
"Notes": "",
"Notifications": "",
"November": "",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "",
"Rosé Pine": "",

View File

@ -490,6 +490,7 @@
"Not factually correct": "No es correcto en todos los aspectos",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Si estableces una puntuación mínima, la búsqueda sólo devolverá documentos con una puntuación mayor o igual a la puntuación mínima.",
"Notes": "",
"Notifications": "Notificaciones",
"November": "Noviembre",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Las notificaciones de respuesta no pueden activarse debido a que los permisos del sitio web han sido denegados. Por favor, visite las configuraciones de su navegador para otorgar el acceso necesario.",
"Response splitting": "División de respuestas",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Rol",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "اشتباهی فکری نیست",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "توجه: اگر حداقل نمره را تعیین کنید، جستجو تنها اسنادی را با نمره بیشتر یا برابر با حداقل نمره باز می گرداند.",
"Notes": "",
"Notifications": "اعلان",
"November": "نوامبر",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "نقش",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Ei faktisesti oikein",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Huom: Jos asetat vähimmäispisteet, haku palauttaa vain asiakirjat, joiden pisteet ovat suurempia tai yhtä suuria kuin vähimmäispistemäärä.",
"Notes": "",
"Notifications": "Ilmoitukset",
"November": "marraskuu",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Rooli",
"Rosé Pine": "Rosee-mänty",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Non factuellement correct",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Note : Si vous définissez un score minimum, seuls les documents ayant un score supérieur ou égal à ce score minimum seront retournés par la recherche.",
"Notes": "",
"Notifications": "Notifications",
"November": "Novembre",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Les notifications de réponse ne peuvent pas être activées car les autorisations du site web ont été refusées. Veuillez visiter les paramètres de votre navigateur pour accorder l'accès nécessaire.",
"Response splitting": "Fractionnement de la réponse",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Rôle",
"Rosé Pine": "Pin rosé",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Non factuellement correct",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Note : Si vous définissez un score minimum, seuls les documents ayant un score supérieur ou égal à ce score minimum seront retournés par la recherche.",
"Notes": "",
"Notifications": "Notifications",
"November": "Novembre",
"num_gpu (Ollama)": "num_gpu (Ollama)",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Les notifications de réponse ne peuvent pas être activées car les autorisations du site web ont été refusées. Veuillez vérifier les paramètres de votre navigateur pour accorder l'accès nécessaire.",
"Response splitting": "Fractionnement de la réponse",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Rôle",
"Rosé Pine": "Pin rosé",

View File

@ -490,6 +490,7 @@
"Not factually correct": "לא נכון מבחינה עובדתית",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "הערה: אם תקבע ציון מינימלי, החיפוש יחזיר רק מסמכים עם ציון שגבוה או שווה לציון המינימלי.",
"Notes": "",
"Notifications": "התראות",
"November": "נובמבר",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "תפקיד",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "तथ्यात्मक रूप से सही नहीं है",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "ध्यान दें: यदि आप न्यूनतम स्कोर निर्धारित करते हैं, तो खोज केवल न्यूनतम स्कोर से अधिक या उसके बराबर स्कोर वाले दस्तावेज़ वापस लाएगी।",
"Notes": "",
"Notifications": "सूचनाएं",
"November": "नवंबर",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "भूमिका",
"Rosé Pine": "रोसे पिन",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Nije činjenično točno",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Napomena: Ako postavite minimalnu ocjenu, pretraga će vratiti samo dokumente s ocjenom većom ili jednakom minimalnoj ocjeni.",
"Notes": "",
"Notifications": "Obavijesti",
"November": "Studeni",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Uloga",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Tidak benar secara faktual",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Catatan: Jika Anda menetapkan skor minimum, pencarian hanya akan mengembalikan dokumen dengan skor yang lebih besar atau sama dengan skor minimum.",
"Notes": "",
"Notifications": "Pemberitahuan",
"November": "November",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Notifikasi respons tidak dapat diaktifkan karena izin situs web telah ditolak. Silakan kunjungi pengaturan browser Anda untuk memberikan akses yang diperlukan.",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Peran",
"Rosé Pine": "Pinus Rosé",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Níl sé ceart go fírineach",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nóta: Má shocraíonn tú íosscór, ní thabharfaidh an cuardach ach doiciméid a bhfuil scór níos mó ná nó cothrom leis an scór íosta ar ais.",
"Notes": "",
"Notifications": "Fógraí",
"November": "Samhain",
"num_gpu (Ollama)": "num_gpu (Ollama)",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Ní féidir fógraí freagartha a ghníomhachtú toisc gur diúltaíodh ceadanna an tsuímh Ghréasáin. Tabhair cuairt ar do shocruithe brabhsálaí chun an rochtain riachtanach a dheonú.",
"Response splitting": "Scoilt freagartha",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Ról",
"Rosé Pine": "Pine Rosé",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Non corretto dal punto di vista fattuale",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: se imposti un punteggio minimo, la ricerca restituirà solo i documenti con un punteggio maggiore o uguale al punteggio minimo.",
"Notes": "",
"Notifications": "Notifiche desktop",
"November": "Novembre",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Ruolo",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "実事上正しくない",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "注意:最小スコアを設定した場合、検索は最小スコア以上のスコアを持つドキュメントのみを返します。",
"Notes": "",
"Notifications": "デスクトップ通知",
"November": "11月",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "応答の分割",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "役割",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "არ ვეთანხმები პირდაპირ ვერც ვეთანხმები",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "შენიშვნა: თუ თქვენ დააყენებთ მინიმალურ ქულას, ძებნა დააბრუნებს მხოლოდ დოკუმენტებს მინიმალური ქულის მეტი ან ტოლი ქულით.",
"Notes": "",
"Notifications": "შეტყობინება",
"November": "ნოემბერი",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "როლი",
"Rosé Pine": "ვარდისფერი ფიჭვის ხე",

View File

@ -490,6 +490,7 @@
"Not factually correct": "사실상 맞지 않음",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "참고: 최소 점수를 설정하면, 검색 결과로 최소 점수 이상의 점수를 가진 문서만 반환합니다.",
"Notes": "",
"Notifications": "알림",
"November": "11월",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "역할",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Faktiškai netikslu",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Jei turite minimalų įvertį, paieška gražins tik tą informaciją, kuri viršyje šį įvertį",
"Notes": "",
"Notifications": "Pranešimai",
"November": "lapkritis",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Naršyklė neleidžia siųsti pranešimų",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Rolė",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Tidak tepat secara fakta",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Jika anda menetapkan skor minimum, carian hanya akan mengembalikan dokumen dengan skor lebih besar daripada atau sama dengan skor minimum.",
"Notes": "",
"Notifications": "Pemberitahuan",
"November": "November",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Pemberitahuan respons tidak boleh diaktifkan kerana kebenaran tapak web tidak diberi. Sila lawati tetapan pelayar web anda untuk memberikan akses yang diperlukan.",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Peranan",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Uriktig informasjon",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Merk: Hvis du setter en minimums poengsum, vil søket kun returnere dokumenter med en poengsum som er større enn eller lik minimums poengsummen.",
"Notes": "",
"Notifications": "Varsler",
"November": "november",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Respons-varsler kan ikke aktiveres da nettstedsrettighetene er nektet. Vennligst se nettleserinnstillingene dine for å gi nødvendig tilgang.",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Rolle",
"Rosé Pine": "Rosé Pine",

View File

@ -15,23 +15,23 @@
"Account": "Account",
"Account Activation Pending": "",
"Accurate information": "Accurate informatie",
"Actions": "",
"Active Users": "",
"Actions": "Acties",
"Active Users": "Actieve Gebruikers",
"Add": "Toevoegen",
"Add a model id": "Een model-id toevoegen",
"Add a short description about what this model does": "Voeg een korte beschrijving toe over wat dit model doet",
"Add a short title for this prompt": "Voeg een korte titel toe voor deze prompt",
"Add a tag": "Voeg een tag toe",
"Add Arena Model": "",
"Add Content": "",
"Add content here": "",
"Add Arena Model": "Voeg Arena Model toe",
"Add Content": "Voeg Content toe",
"Add content here": "Voeg hier content toe",
"Add custom prompt": "Voeg een aangepaste prompt toe",
"Add Files": "Voege Bestanden toe",
"Add Memory": "Voeg Geheugen toe",
"Add Model": "Voeg Model toe",
"Add Tag": "",
"Add Tags": "voeg tags toe",
"Add text content": "",
"Add Tag": "Voeg Tag toe",
"Add Tags": "Voeg Tags toe",
"Add text content": "Voeg Text inhoud toe",
"Add User": "Voeg Gebruiker toe",
"Adjusting these settings will apply changes universally to all users.": "Het aanpassen van deze instellingen zal universeel worden toegepast op alle gebruikers.",
"admin": "admin",
@ -41,14 +41,14 @@
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Geavanceerde Parameters",
"Advanced Params": "Geavanceerde parameters",
"All chats": "",
"All chats": "Alle chats",
"All Documents": "Alle Documenten",
"Allow Chat Deletion": "Sta Chat Verwijdering toe",
"Allow Chat Editing": "",
"Allow non-local voices": "",
"Allow Temporary Chat": "",
"Allow User Location": "",
"Allow Voice Interruption in Call": "",
"Allow Chat Editing": "Chatbewerking toestaan",
"Allow non-local voices": "Niet-lokale stemmen toestaan",
"Allow Temporary Chat": "Tijdelijke chat toestaan",
"Allow User Location": "Gebruikerslocatie toestaan",
"Allow Voice Interruption in Call": "Stemonderbreking tijdens gesprek toestaan",
"alphanumeric characters and hyphens": "alfanumerieke karakters en streepjes",
"Already have an account?": "Heb je al een account?",
"an assistant": "een assistent",
@ -65,10 +65,10 @@
"Archived Chats": "chatrecord",
"are allowed - Activate this command by typing": "zijn toegestaan - Activeer deze commando door te typen",
"Are you sure?": "Zeker weten?",
"Arena Models": "",
"Arena Models": "Arena Modellen",
"Artifacts": "",
"Ask a question": "",
"Assistant": "",
"Ask a question": "Stel een vraag",
"Assistant": "Assistent",
"Attach file": "Voeg een bestand toe",
"Attention to detail": "Attention to detail",
"Audio": "Audio",
@ -78,10 +78,10 @@
"AUTOMATIC1111 Api Auth String": "",
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Base URL",
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Basis URL is verplicht",
"Available list": "",
"Available list": "Beschikbare lijst",
"available!": "beschikbaar!",
"Azure AI Speech": "",
"Azure Region": "",
"Azure Region": "Azure Regio",
"Back": "Terug",
"Bad Response": "Ongeldig antwoord",
"Banners": "Banners",
@ -91,7 +91,7 @@
"Being lazy": "Lustig zijn",
"Brave Search API Key": "Brave Search API-sleutel",
"Bypass SSL verification for Websites": "SSL-verificatie omzeilen voor websites",
"Call": "",
"Call": "Oproep",
"Call feature is not supported when using Web STT engine": "",
"Camera": "",
"Cancel": "Annuleren",
@ -103,7 +103,7 @@
"Chat Bubble UI": "Chat Bubble UI",
"Chat Controls": "",
"Chat direction": "Chat Richting",
"Chat Overview": "",
"Chat Overview": "Chat Overzicht",
"Chat Tags Auto-Generation": "",
"Chats": "Chats",
"Check Again": "Controleer Opnieuw",
@ -114,15 +114,15 @@
"Chunk Params": "Chunk Params",
"Chunk Size": "Chunk Grootte",
"Citation": "Citaat",
"Clear memory": "",
"Clear memory": "Geheugen wissen",
"Click here for help.": "Klik hier voor hulp.",
"Click here to": "Klik hier om",
"Click here to download user import template file.": "",
"Click here to learn more about faster-whisper and see the available models.": "",
"Click here to download user import template file.": "Klik hier om het sjabloonbestand voor gebruikersimport te downloaden.",
"Click here to learn more about faster-whisper and see the available models.": "Klik hier om meer te leren over faster-whisper en de beschikbare modellen te bekijken.",
"Click here to select": "Klik hier om te selecteren",
"Click here to select a csv file.": "Klik hier om een csv file te selecteren.",
"Click here to select a py file.": "",
"Click here to upload a workflow.json file.": "",
"Click here to select a py file.": "Klik hier om een py-bestand te selecteren.",
"Click here to upload a workflow.json file.": "Klik hier om een workflow.json-bestand te uploaden.",
"click here.": "klik hier.",
"Click on the user role button to change a user's role.": "Klik op de gebruikersrol knop om de rol van een gebruiker te wijzigen.",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
@ -139,11 +139,11 @@
"Command": "Commando",
"Completions": "",
"Concurrent Requests": "Gelijktijdige verzoeken",
"Confirm": "",
"Confirm": "Bevestigen",
"Confirm Password": "Bevestig Wachtwoord",
"Confirm your action": "",
"Confirm your action": "Bevestig uw actie",
"Connections": "Verbindingen",
"Contact Admin for WebUI Access": "",
"Contact Admin for WebUI Access": "Neem contact op met de beheerder voor WebUI-toegang",
"Content": "Inhoud",
"Content Extraction": "",
"Context Length": "Context Lengte",
@ -151,23 +151,23 @@
"Continue with {{provider}}": "",
"Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "",
"Controls": "",
"Copied": "",
"Copied": "Gekopieerd",
"Copied shared chat URL to clipboard!": "URL van gedeelde gesprekspagina gekopieerd naar klembord!",
"Copied to clipboard": "",
"Copied to clipboard": "Gekopieerd naar klembord",
"Copy": "Kopieer",
"Copy last code block": "Kopieer laatste code blok",
"Copy last response": "Kopieer laatste antwoord",
"Copy Link": "Kopieer Link",
"Copy to clipboard": "",
"Copy to clipboard": "Kopier naar klembord",
"Copying to clipboard was successful!": "Kopiëren naar klembord was succesvol!",
"Create a model": "Een model maken",
"Create Account": "Maak Account",
"Create Knowledge": "",
"Create Knowledge": "Creër kennis",
"Create new key": "Maak nieuwe sleutel",
"Create new secret key": "Maak nieuwe geheim sleutel",
"Created at": "Gemaakt op",
"Created At": "Gemaakt op",
"Created by": "",
"Created by": "Gemaakt door",
"CSV Import": "",
"Current Model": "Huidig Model",
"Current Password": "Huidig Wachtwoord",
@ -189,49 +189,49 @@
"Delete All Chats": "Verwijder alle chats",
"Delete chat": "Verwijder chat",
"Delete Chat": "Verwijder Chat",
"Delete chat?": "",
"Delete folder?": "",
"Delete function?": "",
"Delete prompt?": "",
"Delete chat?": "Verwijder chat?",
"Delete folder?": "Verwijder map?",
"Delete function?": "Verwijder functie?",
"Delete prompt?": "Verwijder prompt?",
"delete this link": "verwijder deze link",
"Delete tool?": "",
"Delete tool?": "Verwijder tool?",
"Delete User": "Verwijder Gebruiker",
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} is verwijderd",
"Deleted {{name}}": "{{name}} verwijderd",
"Description": "Beschrijving",
"Didn't fully follow instructions": "Ik heb niet alle instructies volgt",
"Disabled": "",
"Discover a function": "",
"Disabled": "Uitgeschakeld",
"Discover a function": "Ontdek een functie",
"Discover a model": "Ontdek een model",
"Discover a prompt": "Ontdek een prompt",
"Discover a tool": "",
"Discover a tool": "Ontdek een tool",
"Discover, download, and explore custom functions": "",
"Discover, download, and explore custom prompts": "Ontdek, download en verken aangepaste prompts",
"Discover, download, and explore custom tools": "",
"Discover, download, and explore model presets": "Ontdek, download en verken model presets",
"Dismissible": "",
"Display Emoji in Call": "",
"Dismissible": "Afwijsbaar",
"Display Emoji in Call": "Emoji weergeven tijdens gesprek",
"Display the username instead of You in the Chat": "Toon de gebruikersnaam in plaats van Jij in de Chat",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Do not install functions from sources you do not fully trust.": "Installeer geen functies vanuit bronnen die je niet volledig vertrouwt",
"Do not install tools from sources you do not fully trust.": "Installeer geen tools vanuit bronnen die je niet volledig vertrouwt.",
"Document": "Document",
"Documentation": "",
"Documentation": "Documentatie",
"Documents": "Documenten",
"does not make any external connections, and your data stays securely on your locally hosted server.": "maakt geen externe verbindingen, en je gegevens blijven veilig op je lokaal gehoste server.",
"Don't have an account?": "Heb je geen account?",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "Je vindt het stijl niet?",
"Done": "",
"Done": "Voltooid",
"Download": "Download",
"Download canceled": "Download geannuleerd",
"Download Database": "Download Database",
"Draw": "",
"Draw": "Teken",
"Drop any files here to add to the conversation": "Sleep bestanden hier om toe te voegen aan het gesprek",
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "bijv. '30s', '10m'. Geldige tijdseenheden zijn 's', 'm', 'h'.",
"Edit": "Wijzig",
"Edit Arena Model": "",
"Edit Memory": "",
"Edit Arena Model": "Bewerk Arena Model",
"Edit Memory": "Bewerk Geheugen",
"Edit User": "Wijzig Gebruiker",
"ElevenLabs": "",
"Email": "Email",
@ -244,7 +244,7 @@
"Enable New Sign Ups": "Schakel Nieuwe Registraties in",
"Enable Web Search": "Zoeken op het web inschakelen",
"Enable Web Search Query Generation": "",
"Enabled": "",
"Enabled": "Ingeschakeld",
"Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Zorg ervoor dat uw CSV-bestand de volgende vier kolommen in deze volgorde bevat: Naam, E-mail, Wachtwoord, Rol.",
"Enter {{role}} message here": "Voeg {{role}} bericht hier toe",
@ -254,7 +254,7 @@
"Enter CFG Scale (e.g. 7.0)": "",
"Enter Chunk Overlap": "Voeg Chunk Overlap toe",
"Enter Chunk Size": "Voeg Chunk Size toe",
"Enter description": "",
"Enter description": "Voer beschrijving in",
"Enter Github Raw URL": "Voer de Github Raw-URL in",
"Enter Google PSE API Key": "Voer de Google PSE API-sleutel in",
"Enter Google PSE Engine Id": "Voer Google PSE Engine-ID in",
@ -281,7 +281,7 @@
"Enter URL (e.g. http://localhost:11434)": "Zet URL (Bijv. http://localhost:11434)",
"Enter Your Email": "Voer je Email in",
"Enter Your Full Name": "Voer je Volledige Naam in",
"Enter your message": "",
"Enter your message": "Voer je bericht in",
"Enter Your Password": "Voer je Wachtwoord in",
"Enter Your Role": "Voer je Rol in",
"Error": "Fout",
@ -300,24 +300,24 @@
"Export Prompts": "Exporteer Prompts",
"Export Tools": "",
"External Models": "",
"Failed to add file.": "",
"Failed to add file.": "Het is niet gelukt om het bestand toe te voegen.",
"Failed to create API Key.": "Kan API Key niet aanmaken.",
"Failed to read clipboard contents": "Kan klembord inhoud niet lezen",
"Failed to update settings": "",
"Failed to upload file.": "",
"February": "Februarij",
"Failed to update settings": "Instellingen konden niet worden bijgewerkt.",
"Failed to upload file.": "Bestand kon niet worden geüpload.",
"February": "Februari",
"Feedback History": "",
"Feel free to add specific details": "Voeg specifieke details toe",
"File": "",
"File added successfully.": "",
"File content updated successfully.": "",
"File": "Bestand",
"File added successfully.": "Bestand succesvol toegevoegd.",
"File content updated successfully.": "Bestandsinhoud succesvol bijgewerkt.",
"File Mode": "Bestandsmodus",
"File not found.": "Bestand niet gevonden.",
"File removed successfully.": "",
"File size should not exceed {{maxSize}} MB.": "",
"Files": "",
"Filter is now globally disabled": "",
"Filter is now globally enabled": "",
"File removed successfully.": "Bestand succesvol verwijderd.",
"File size should not exceed {{maxSize}} MB.": "Bestandsgrootte mag niet groter zijn dan {{maxSize}} MB.",
"Files": "Bestanden",
"Filter is now globally disabled": "Filter is nu globaal uitgeschakeld",
"Filter is now globally enabled": "Filter is nu globaal ingeschakeld",
"Filters": "",
"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Vingerafdruk spoofing gedetecteerd: kan initialen niet gebruiken als avatar. Standaardprofielafbeelding wordt gebruikt.",
"Fluidly stream large external response chunks": "Stream vloeiend grote externe responsbrokken",
@ -457,7 +457,7 @@
"Model created successfully!": "",
"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Model filesystem path gedetecteerd. Model shortname is vereist voor update, kan niet doorgaan.",
"Model ID": "Model-ID",
"Model Name": "",
"Model Name": "Model naam",
"Model not selected": "Model niet geselecteerd",
"Model Params": "Model Params",
"Model updated successfully": "",
@ -465,23 +465,23 @@
"Model(s) Whitelisted": "Model(len) zijn ge-whitelist",
"Modelfile Content": "Modelfile Inhoud",
"Models": "Modellen",
"more": "",
"more": "Meer",
"More": "Meer",
"Move to Top": "",
"Move to Top": "Verplaats naar boven",
"Name": "Naam",
"Name your model": "Geef uw model een naam",
"New Chat": "Nieuwe Chat",
"New folder": "",
"New folder": "Nieuwe map",
"New Password": "Nieuw Wachtwoord",
"No content found": "",
"No content to speak": "",
"No content found": "Geen content gevonden",
"No content to speak": "Geen inhoud om over te spreken",
"No distance available": "",
"No feedbacks found": "",
"No file selected": "",
"No files found.": "",
"No file selected": "Geen bestand geselecteerd",
"No files found.": "Geen bestanden gevonden",
"No HTML, CSS, or JavaScript content found.": "",
"No knowledge found": "",
"No models found": "",
"No models found": "Geen modellen gevonden",
"No results found": "Geen resultaten gevonden",
"No search query generated": "Geen zoekopdracht gegenereerd",
"No source available": "Geen bron beschikbaar",
@ -490,6 +490,7 @@
"Not factually correct": "Feitelijk niet juist",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Opmerking: Als u een minimumscore instelt, levert de zoekopdracht alleen documenten op met een score groter dan of gelijk aan de minimumscore.",
"Notes": "",
"Notifications": "Desktop Notificaties",
"November": "November",
"num_gpu (Ollama)": "",
@ -512,7 +513,7 @@
"Oops! There are files still uploading. Please wait for the upload to complete.": "",
"Oops! There was an error in the previous response.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! Je gebruikt een niet-ondersteunde methode (alleen frontend). Serveer de WebUI vanuit de backend.",
"Open file": "",
"Open file": "Open bestand",
"Open in full screen": "",
"Open new chat": "Open nieuwe chat",
"Open WebUI uses faster-whisper internally.": "",
@ -526,8 +527,8 @@
"Other": "Andere",
"OUTPUT": "",
"Output format": "",
"Overview": "",
"page": "",
"Overview": "Overzicht",
"page": "Pagina",
"Password": "Wachtwoord",
"PDF document (.pdf)": "PDF document (.pdf)",
"PDF Extract Images (OCR)": "PDF Extract Afbeeldingen (OCR)",
@ -561,8 +562,8 @@
"Pull a model from Ollama.com": "Haal een model van Ollama.com",
"Query Params": "Query Params",
"RAG Template": "RAG Template",
"Rating": "",
"Re-rank models by topic similarity": "",
"Rating": "Beoordeling",
"Re-rank models by topic similarity": "Herordeneer modellen op basis van onderwerpsovereenkomst",
"Read Aloud": "Voorlezen",
"Record voice": "Neem stem op",
"Redirecting you to OpenWebUI Community": "Je wordt doorgestuurd naar OpenWebUI Community",
@ -571,10 +572,10 @@
"Refused when it shouldn't have": "Geweigerd terwijl het niet had moeten",
"Regenerate": "Regenereren",
"Release Notes": "Release Notes",
"Relevance": "",
"Relevance": "Relevantie",
"Remove": "Verwijderen",
"Remove Model": "Verwijder Model",
"Rename": "Hervatten",
"Rename": "Hernoemen",
"Repeat Last N": "Herhaal Laatste N",
"Request Mode": "Request Modus",
"Reranking Model": "Reranking Model",
@ -585,8 +586,9 @@
"Reset Vector Storage/Knowledge": "",
"Response AutoCopy to Clipboard": "Antwoord Automatisch Kopiëren naar Klembord",
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Response splitting": "Antwoord splitsing",
"Result": "Resultaat",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Rol",
"Rosé Pine": "Rosé Pine",
@ -598,9 +600,9 @@
"Save": "Opslaan",
"Save & Create": "Opslaan & Creëren",
"Save & Update": "Opslaan & Bijwerken",
"Save As Copy": "",
"Save Tag": "",
"Saved": "",
"Save As Copy": "Bewaar als kopie",
"Save Tag": "Bewaar Tag",
"Saved": "Opgeslagen",
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Chat logs direct opslaan in de opslag van je browser wordt niet langer ondersteund. Neem even de tijd om je chat logs te downloaden en te verwijderen door op de knop hieronder te klikken. Maak je geen zorgen, je kunt je chat logs eenvoudig opnieuw importeren naar de backend via",
"Scroll to bottom when switching between branches": "",
"Search": "Zoeken",
@ -626,16 +628,16 @@
"See what's new": "Zie wat er nieuw is",
"Seed": "Seed",
"Select a base model": "Selecteer een basismodel",
"Select a engine": "",
"Select a engine": "Selecteer een engine",
"Select a file to view or drag and drop a file to upload": "",
"Select a function": "",
"Select a function": "Selecteer een functie",
"Select a model": "Selecteer een model",
"Select a pipeline": "Selecteer een pijplijn",
"Select a pipeline url": "Selecteer een pijplijn-URL",
"Select a tool": "",
"Select a tool": "Selecteer een tool",
"Select an Ollama instance": "Selecteer een Ollama instantie",
"Select Engine": "",
"Select Knowledge": "",
"Select Engine": "Selecteer Engine",
"Select Knowledge": "Selecteer Kennis",
"Select model": "Selecteer een model",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "Geselecteerde modellen ondersteunen geen beeldinvoer",
@ -692,20 +694,20 @@
"Success": "Succes",
"Successfully updated.": "Succesvol bijgewerkt.",
"Suggested": "Suggestie",
"Support": "",
"Support this plugin:": "",
"Sync directory": "",
"Support": "Ondersteuning",
"Support this plugin:": "ondersteun deze plugin",
"Sync directory": "Synchroniseer map",
"System": "Systeem",
"System Instructions": "",
"System Instructions": "Systeem instructies",
"System Prompt": "Systeem Prompt",
"Tags": "Tags",
"Tags Generation Prompt": "",
"Tap to interrupt": "",
"Tags Generation Prompt": "Prompt voor taggeneratie",
"Tap to interrupt": "Tik om te onderbreken",
"Tavily API Key": "",
"Tell us more:": "Vertel ons meer:",
"Temperature": "Temperatuur",
"Template": "Template",
"Temporary Chat": "",
"Temporary Chat": "Tijdelijke chat",
"Text Splitter": "",
"Text-to-Speech Engine": "Tekst-naar-Spraak Engine",
"Tfs Z": "Tfs Z",
@ -718,14 +720,14 @@
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Het score moet een waarde zijn tussen 0.0 (0%) en 1.0 (100%).",
"Theme": "Thema",
"Thinking...": "",
"This action cannot be undone. Do you wish to continue?": "",
"This action cannot be undone. Do you wish to continue?": "Deze actie kan niet ongedaan worden gemaakt. Wilt u doorgaan?",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dit zorgt ervoor dat je waardevolle gesprekken veilig worden opgeslagen in je backend database. Dank je wel!",
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
"This option will delete all existing files in the collection and replace them with newly uploaded files.": "",
"This response was generated by \"{{model}}\"": "",
"This will delete": "",
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Dit is een experimentele functie, het kan functioneren zoals verwacht en kan op elk moment veranderen.",
"This option will delete all existing files in the collection and replace them with newly uploaded files.": "Deze optie verwijdert alle bestaande bestanden in de collectie en vervangt ze door nieuw geüploade bestanden.",
"This response was generated by \"{{model}}\"": "Dit antwoord is gegenereerd door \"{{model}}\"",
"This will delete": "Dit zal verwijderen",
"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "Dit zal <strong>{{NAME}}</strong> verwijderen en <strong>al zijn inhoud</strong>.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Dit zal de kennisdatabase resetten en alle bestanden synchroniseren. Wilt u doorgaan?",
"Thorough explanation": "Gevorderde uitleg",
"Tika": "",
"Tika Server URL required.": "",
@ -738,7 +740,7 @@
"Title Generation Prompt": "Titel Generatie Prompt",
"To access the available model names for downloading,": "Om de beschikbare modelnamen voor downloaden te openen,",
"To access the GGUF models available for downloading,": "Om toegang te krijgen tot de GGUF modellen die beschikbaar zijn voor downloaden,",
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Om toegang te krijgen tot de WebUI, neem contact op met de administrator. Beheerders kunnen de gebruikersstatussen beheren vanuit het Beheerderspaneel.",
"To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "",
"to chat input.": "naar chat input.",
"To protect your privacy, only ratings, model IDs, tags, and metadata are shared from your feedback—your chat logs remain private and are not included.": "",
@ -785,23 +787,23 @@
"Updated At": "",
"Upload": "",
"Upload a GGUF model": "Upload een GGUF model",
"Upload directory": "",
"Upload files": "",
"Upload directory": "Upload map",
"Upload files": "Bestanden uploaden",
"Upload Files": "Bestanden uploaden",
"Upload Pipeline": "",
"Upload Progress": "Upload Voortgang",
"URL Mode": "URL Modus",
"Use '#' in the prompt input to load and include your knowledge.": "",
"Use '#' in the prompt input to load and include your knowledge.": "Gebruik '#' in de promptinvoer om je kennis te laden en op te nemen.",
"Use Gravatar": "Gebruik Gravatar",
"Use Initials": "Gebruik Initials",
"use_mlock (Ollama)": "use_mlock (Ollama)",
"use_mmap (Ollama)": "use_mmap (Ollama)",
"user": "user",
"User": "",
"User": "User",
"User location successfully retrieved.": "",
"User Permissions": "Gebruikers Rechten",
"Users": "Gebruikers",
"Using the default arena model with all models. Click the plus button to add custom models.": "",
"Using the default arena model with all models. Click the plus button to add custom models.": "Het standaard arena-model gebruiken met alle modellen. Klik op de plusknop om aangepaste modellen toe te voegen.",
"Utilize": "Utilize",
"Valid time units:": "Geldige tijdseenheden:",
"Valves": "",
@ -811,10 +813,10 @@
"variable to have them replaced with clipboard content.": "variabele om ze te laten vervangen door klembord inhoud.",
"Version": "Versie",
"Version {{selectedVersion}} of {{totalVersions}}": "",
"Voice": "",
"Voice Input": "",
"Voice": "Stem",
"Voice Input": "Steminvoer",
"Warning": "Waarschuwing",
"Warning:": "",
"Warning:": "Waarschuwing",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Warning: Als je de embedding model bijwerkt of wijzigt, moet je alle documenten opnieuw importeren.",
"Web": "Web",
"Web API": "",
@ -827,17 +829,17 @@
"Whats New in": "Wat is nieuw in",
"Whisper (Local)": "",
"Widescreen Mode": "",
"Won": "",
"Won": "Gewonnen",
"Workspace": "Werkruimte",
"Write a prompt suggestion (e.g. Who are you?)": "Schrijf een prompt suggestie (bijv. Wie ben je?)",
"Write a summary in 50 words that summarizes [topic or keyword].": "Schrijf een samenvatting in 50 woorden die [onderwerp of trefwoord] samenvat.",
"Write something...": "",
"Write something...": "Schrijf iets...",
"Yesterday": "gisteren",
"You": "U",
"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "",
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Je kunt slechts met maximaal {{maxCount}} bestand(en) tegelijk chatten",
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Je kunt je interacties met LLM's personaliseren door herinneringen toe te voegen via de 'Beheer'-knop hieronder, waardoor ze nuttiger en op maat gemaakt voor jou worden.",
"You cannot clone a base model": "U kunt een basismodel niet klonen",
"You cannot upload an empty file.": "",
"You cannot upload an empty file.": "Je kunt een leeg bestand niet uploaden.",
"You have no archived conversations.": "U heeft geen gearchiveerde gesprekken.",
"You have shared this chat": "U heeft dit gesprek gedeeld",
"You're a helpful assistant.": "Jij bent een behulpzame assistent.",

View File

@ -490,6 +490,7 @@
"Not factually correct": "ਤੱਥਕ ਰੂਪ ਵਿੱਚ ਸਹੀ ਨਹੀਂ",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "ਨੋਟ: ਜੇ ਤੁਸੀਂ ਘੱਟੋ-ਘੱਟ ਸਕੋਰ ਸੈੱਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਖੋਜ ਸਿਰਫ਼ ਉਹੀ ਡਾਕੂਮੈਂਟ ਵਾਪਸ ਕਰੇਗੀ ਜਿਨ੍ਹਾਂ ਦਾ ਸਕੋਰ ਘੱਟੋ-ਘੱਟ ਸਕੋਰ ਦੇ ਬਰਾਬਰ ਜਾਂ ਵੱਧ ਹੋਵੇ।",
"Notes": "",
"Notifications": "ਸੂਚਨਾਵਾਂ",
"November": "ਨਵੰਬਰ",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "ਭੂਮਿਕਾ",
"Rosé Pine": "ਰੋਜ਼ ਪਾਈਨ",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Nie zgodne z faktami",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Uwaga: Jeśli ustawisz minimalny wynik, szukanie zwróci jedynie dokumenty z wynikiem większym lub równym minimalnemu.",
"Notes": "",
"Notifications": "Powiadomienia",
"November": "Listopad",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Rola",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Não está factualmente correto",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Se você definir uma pontuação mínima, a pesquisa retornará apenas documentos com pontuação igual ou superior à pontuação mínima.",
"Notes": "",
"Notifications": "Notificações",
"November": "Novembro",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Notificações de resposta não podem ser ativadas pois as permissões do site foram negadas. Por favor, visite as configurações do seu navegador para conceder o acesso necessário.",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Função",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Não é correto em termos factuais",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Se você definir uma pontuação mínima, a pesquisa só retornará documentos com uma pontuação maior ou igual à pontuação mínima.",
"Notes": "",
"Notifications": "Notificações da Área de Trabalho",
"November": "Novembro",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Função",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Nu este corect din punct de vedere factual",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Notă: Dacă setați un scor minim, căutarea va returna doar documente cu un scor mai mare sau egal cu scorul minim.",
"Notes": "",
"Notifications": "Notificări",
"November": "Noiembrie",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Notificările de răspuns nu pot fi activate deoarece permisiunile site-ului au fost refuzate. Vă rugăm să vizitați setările browserului pentru a acorda accesul necesar.",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Rol",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Не соответствует действительности",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Обратите внимание: Если вы установите минимальный балл, поиск будет возвращать только документы с баллом больше или равным минимальному баллу.",
"Notes": "",
"Notifications": "Уведомления",
"November": "Ноябрь",
"num_gpu (Ollama)": "num_gpu (Ollama)",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Уведомления об ответах не могут быть активированы, поскольку доступ к веб-сайту был заблокирован. Пожалуйста, перейдите к настройкам своего браузера, чтобы предоставить необходимый доступ.",
"Response splitting": "Разделение ответов",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Роль",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Није чињенично тачно",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Напомена: ако подесите најмањи резултат, претрага ће вратити само документе са резултатом већим или једнаким најмањем резултату.",
"Notes": "",
"Notifications": "Обавештења",
"November": "Новембар",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Улога",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Inte faktiskt korrekt",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Obs: Om du anger en tröskel kommer sökningen endast att returnera dokument med ett betyg som är större än eller lika med tröskeln.",
"Notes": "",
"Notifications": "Notifikationer",
"November": "november",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Roll",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "ไม่ถูกต้องตามข้อเท็จจริง",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "หมายเหตุ: หากคุณตั้งค่าคะแนนขั้นต่ำ การค้นหาจะคืนเอกสารที่มีคะแนนมากกว่าหรือเท่ากับคะแนนขั้นต่ำเท่านั้น",
"Notes": "",
"Notifications": "การแจ้งเตือน",
"November": "พฤศจิกายน",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "ไม่สามารถเปิดการแจ้งเตือนการตอบสนองได้เนื่องจากเว็บไซต์ปฏิเสธ กรุณาเข้าการตั้งค่าเบราว์เซอร์ของคุณเพื่อให้สิทธิ์การเข้าถึงที่จำเป็น",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "บทบาท",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
"Notes": "",
"Notifications": "",
"November": "",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "",
"Rosé Pine": "",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Gerçeklere göre doğru değil",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Not: Minimum bir skor belirlerseniz, arama yalnızca minimum skora eşit veya daha yüksek bir skora sahip belgeleri getirecektir.",
"Notes": "",
"Notifications": "Bildirimler",
"November": "Kasım",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Web sitesi izinleri reddedildiğinden yanıt bildirimleri etkinleştirilemiyor. Gerekli erişimi sağlamak için lütfen tarayıcı ayarlarınızı ziyaret edin.",
"Response splitting": "Yanıt bölme",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Rol",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Не відповідає дійсності",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Примітка: Якщо ви встановите мінімальну кількість балів, пошук поверне лише документи з кількістю балів, більшою або рівною мінімальній кількості балів.",
"Notes": "",
"Notifications": "Сповіщення",
"November": "Листопад",
"num_gpu (Ollama)": "num_gpu (Ollama)",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Сповіщення про відповіді не можуть бути активовані, оскільки вам було відмовлено в доступі до веб-сайту. Будь ласка, відвідайте налаштування вашого браузера, щоб надати необхідний доступ.",
"Response splitting": "Розбиття відповіді",
"Result": "Результат",
"Rich Text Input for Chat": "",
"RK": "RK",
"Role": "Роль",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "Không chính xác so với thực tế",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Lưu ý: Nếu bạn đặt điểm (Score) tối thiểu thì tìm kiếm sẽ chỉ trả về những tài liệu có điểm lớn hơn hoặc bằng điểm tối thiểu.",
"Notes": "",
"Notifications": "Thông báo trên máy tính (Notification)",
"November": "Tháng 11",
"num_gpu (Ollama)": "",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Không thể kích hoạt thông báo vì trang web không cấp quyền. Vui lòng truy cập cài đặt trình duyệt của bạn để cấp quyền cần thiết.",
"Response splitting": "",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "Vai trò",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "事实并非如此",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "注意:如果设置了最低分数,搜索只会返回分数大于或等于最低分数的文档。",
"Notes": "",
"Notifications": "桌面通知",
"November": "十一月",
"num_gpu (Ollama)": "num_gpu (Ollama)",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "无法激活回复时发送通知。请检查浏览器设置,并授予必要的访问权限。",
"Response splitting": "拆分回复",
"Result": "结果",
"Rich Text Input for Chat": "",
"RK": "排名",
"Role": "权限组",
"Rosé Pine": "Rosé Pine",

View File

@ -490,6 +490,7 @@
"Not factually correct": "與事實不符",
"Not helpful": "",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "注意:如果您設定了最低分數,則搜尋只會回傳分數大於或等於最低分數的文件。",
"Notes": "",
"Notifications": "通知",
"November": "11 月",
"num_gpu (Ollama)": "num_gpu (Ollama)",
@ -587,6 +588,7 @@
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "無法啟用回應通知,因為網站權限已遭拒。請前往瀏覽器設定以授予必要存取權限。",
"Response splitting": "回應分割",
"Result": "",
"Rich Text Input for Chat": "",
"RK": "",
"Role": "角色",
"Rosé Pine": "玫瑰松",

View File

@ -51,6 +51,15 @@
href="/playground">{$i18n.t('Chat')}</a
>
<a
class="min-w-fit rounded-full p-1.5 px-3 {$page.url.pathname.includes(
'/playground/notes'
)
? 'bg-gray-50 dark:bg-gray-850'
: ''} transition"
href="/playground/notes">{$i18n.t('Notes')}</a
>
<a
class="min-w-fit rounded-full p-1.5 px-3 {$page.url.pathname.includes(
'/playground/completions'

View File

@ -0,0 +1,5 @@
<script>
import Notes from '$lib/components/playground/Notes.svelte';
</script>
<Notes />